Browse Source

qcacmn: Add infrastructure to log roam events in DPTRACE

Add infrastructure to log all roam related commands and
events in DPTRACE.

Change-Id: I66773fc23dfeacf3a63688819e099bf44676d95b
CRs-Fixed: 1081851
Himanshu Agarwal 8 years ago
parent
commit
c0b7145916
3 changed files with 86 additions and 0 deletions
  1. 8 0
      qdf/inc/qdf_nbuf.h
  2. 18 0
      qdf/inc/qdf_trace.h
  3. 60 0
      qdf/linux/src/qdf_trace.c

+ 8 - 0
qdf/inc/qdf_nbuf.h

@@ -205,12 +205,14 @@ struct mon_rx_status {
  * @QDF_PROTO_TYPE_EAPOL - EAPOL
  * @QDF_PROTO_TYPE_ARP - ARP
  * @QDF_PROTO_TYPE_MGMT - MGMT
+ * QDF_PROTO_TYPE_EVENT - EVENT
  */
 enum qdf_proto_type {
 	QDF_PROTO_TYPE_DHCP,
 	QDF_PROTO_TYPE_EAPOL,
 	QDF_PROTO_TYPE_ARP,
 	QDF_PROTO_TYPE_MGMT,
+	QDF_PROTO_TYPE_EVENT,
 	QDF_PROTO_TYPE_MAX
 };
 
@@ -242,6 +244,9 @@ enum qdf_proto_type {
  * @QDF_PROTO_MGMT_DISASSOC - disassoc
  * @QDF_PROTO_MGMT_AUTH - auth
  * @QDF_PROTO_MGMT_DEAUTH - deauth
+ * QDF_ROAM_SYNCH - roam synch indication from fw
+ * QDF_ROAM_COMPLETE - roam complete cmd to fw
+ * QDF_ROAM_EVENTID - roam eventid from fw
  */
 enum qdf_proto_subtype {
 	QDF_PROTO_INVALID,
@@ -271,6 +276,9 @@ enum qdf_proto_subtype {
 	QDF_PROTO_MGMT_DISASSOC,
 	QDF_PROTO_MGMT_AUTH,
 	QDF_PROTO_MGMT_DEAUTH,
+	QDF_ROAM_SYNCH,
+	QDF_ROAM_COMPLETE,
+	QDF_ROAM_EVENTID,
 	QDF_PROTO_SUBTYPE_MAX
 };
 

+ 18 - 0
qdf/inc/qdf_trace.h

@@ -180,6 +180,7 @@ typedef struct s_qdf_trace_data {
  * @QDF_DP_TRACE_DHCP_PACKET_RECORD - record DHCP packet
  * @QDF_DP_TRACE_ARP_PACKET_RECORD - record ARP packet
  * @QDF_DP_TRACE_MGMT_PACKET_RECORD - record MGMT pacekt
+ * QDF_DP_TRACE_EVENT_RECORD - record events
  * @QDF_DP_TRACE_DEFAULT_VERBOSITY - below this are part of default verbosity
  * @QDF_DP_TRACE_HDD_TX_TIMEOUT - HDD tx timeout
  * @QDF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT- SOFTAP HDD tx timeout
@@ -209,6 +210,7 @@ enum  QDF_DP_TRACE_ID {
 	QDF_DP_TRACE_DHCP_PACKET_RECORD,
 	QDF_DP_TRACE_ARP_PACKET_RECORD,
 	QDF_DP_TRACE_MGMT_PACKET_RECORD,
+	QDF_DP_TRACE_EVENT_RECORD,
 	QDF_DP_TRACE_DEFAULT_VERBOSITY,
 	QDF_DP_TRACE_HDD_TX_TIMEOUT,
 	QDF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT,
@@ -287,6 +289,18 @@ struct qdf_dp_trace_mgmt_buf {
 	uint8_t subtype;
 };
 
+/**
+ * struct qdf_dp_trace_event_buf - event buffer
+ * @vdev_id : vdev id
+ * @type: packet type
+ * @subtype: packet subtype
+ */
+struct qdf_dp_trace_event_buf {
+	uint8_t vdev_id;
+	uint8_t type;
+	uint8_t subtype;
+};
+
 /**
  * struct qdf_dp_trace_record_s - Describes a record in DP trace
  * @time: time when it got stored
@@ -410,6 +424,10 @@ void qdf_dp_trace_mgmt_pkt(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
 		enum qdf_proto_type type, enum qdf_proto_subtype subtype);
 void qdf_dp_display_mgmt_pkt(struct qdf_dp_trace_record_s *record,
 			      uint16_t index);
+void qdf_dp_display_event_record(struct qdf_dp_trace_record_s *record,
+			      uint16_t index);
+void qdf_dp_trace_record_event(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
+		enum qdf_proto_type type, enum qdf_proto_subtype subtype);
 #else
 static inline
 void qdf_dp_trace_log_pkt(uint8_t session_id, struct sk_buff *skb,

+ 60 - 0
qdf/linux/src/qdf_trace.c

@@ -821,6 +821,8 @@ void qdf_dp_trace_init(void)
 						qdf_dp_display_proto_pkt;
 	qdf_dp_trace_cb_table[QDF_DP_TRACE_MGMT_PACKET_RECORD] =
 					qdf_dp_display_mgmt_pkt;
+	qdf_dp_trace_cb_table[QDF_DP_TRACE_EVENT_RECORD] =
+					qdf_dp_display_event_record;
 
 	qdf_dp_trace_cb_table[QDF_DP_TRACE_MAX] = qdf_dp_unused;
 }
@@ -967,6 +969,8 @@ const char *qdf_dp_code_to_string(enum QDF_DP_TRACE_ID code)
 		return "ARP:";
 	case QDF_DP_TRACE_MGMT_PACKET_RECORD:
 		return "MGMT:";
+	case QDF_DP_TRACE_EVENT_RECORD:
+		return "EVENT:";
 	case QDF_DP_TRACE_HDD_TX_PACKET_PTR_RECORD:
 		return "HDD: TX: PTR:";
 	case QDF_DP_TRACE_HDD_TX_PACKET_RECORD:
@@ -1041,6 +1045,8 @@ static const char *qdf_dp_type_to_str(enum qdf_proto_type type)
 		return "ARP";
 	case QDF_PROTO_TYPE_MGMT:
 		return "MGMT";
+	case QDF_PROTO_TYPE_EVENT:
+		return "EVENT";
 	default:
 		return "invalid";
 	}
@@ -1091,6 +1097,12 @@ static const char *qdf_dp_subtype_to_str(enum qdf_proto_subtype subtype)
 		return "AUTH";
 	case QDF_PROTO_MGMT_DEAUTH:
 		return "DEAUTH";
+	case QDF_ROAM_SYNCH:
+		return "ROAM SYNCH";
+	case QDF_ROAM_COMPLETE:
+		return "ROAM COMPLETE";
+	case QDF_ROAM_EVENTID:
+		return "ROAM EVENTID";
 	default:
 		return "invalid";
 	}
@@ -1353,6 +1365,54 @@ void qdf_dp_trace_mgmt_pkt(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
 }
 EXPORT_SYMBOL(qdf_dp_trace_mgmt_pkt);
 
+/**
+ * qdf_dp_display_event_record() - display event records
+ * @record: dptrace record
+ * @index: index
+ *
+ * Return: none
+ */
+void qdf_dp_display_event_record(struct qdf_dp_trace_record_s *record,
+			      uint16_t index)
+{
+	struct qdf_dp_trace_event_buf *buf =
+		(struct qdf_dp_trace_event_buf *)record->data;
+
+	qdf_print("DPT: %04d: %012llu: %s vdev_id %d", index,
+		record->time, qdf_dp_code_to_string(record->code),
+		buf->vdev_id);
+	qdf_print("DPT: Type %s Subtype %s", qdf_dp_type_to_str(buf->type),
+		qdf_dp_subtype_to_str(buf->subtype));
+}
+EXPORT_SYMBOL(qdf_dp_display_event_record);
+
+/**
+ * qdf_dp_trace_record_event() - record events
+ * @code: dptrace code
+ * @vdev_id: vdev id
+ * @type: proto type
+ * @subtype: proto subtype
+ *
+ * Return: none
+ */
+void qdf_dp_trace_record_event(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
+		enum qdf_proto_type type, enum qdf_proto_subtype subtype)
+{
+	struct qdf_dp_trace_event_buf buf;
+	int buf_size = sizeof(struct qdf_dp_trace_event_buf);
+
+	if (qdf_dp_enable_check(NULL, code, QDF_NA) == false)
+		return;
+
+	if (buf_size > QDF_DP_TRACE_RECORD_SIZE)
+		QDF_BUG(0);
+
+	buf.type = type;
+	buf.subtype = subtype;
+	buf.vdev_id = vdev_id;
+	qdf_dp_add_record(code, (uint8_t *)&buf, buf_size, true);
+}
+EXPORT_SYMBOL(qdf_dp_trace_record_event);
 
 /**
  * qdf_dp_display_proto_pkt() - display proto packet