Sfoglia il codice sorgente

qcacmn: Add credit tracking for HL Data Path

Add credit tracking for HL Data Path in DPTRACE.

Change-Id: I6e2971209940c16a13a8ca7f1f0a3d7c1a26e305
CRs-Fixed: 2574057
Nirav Shah 5 anni fa
parent
commit
8f44a7e494
3 ha cambiato i file con 214 aggiunte e 11 eliminazioni
  1. 1 0
      qdf/inc/qdf_nbuf.h
  2. 83 8
      qdf/inc/qdf_trace.h
  3. 130 3
      qdf/linux/src/qdf_trace.c

+ 1 - 0
qdf/inc/qdf_nbuf.h

@@ -38,6 +38,7 @@
 #define QDF_NBUF_PKT_TRAC_TYPE_ARP		0x10
 #define QDF_NBUF_PKT_TRAC_TYPE_ICMP		0x20
 #define QDF_NBUF_PKT_TRAC_TYPE_ICMPv6		0x40
+#define QDF_HL_CREDIT_TRACKING			0x80
 
 #define QDF_NBUF_PKT_TRAC_MAX_STRING		12
 #define QDF_NBUF_PKT_TRAC_PROTO_STRING		4

+ 83 - 8
qdf/inc/qdf_trace.h

@@ -195,6 +195,7 @@ typedef struct s_qdf_trace_data {
  * @QDF_DP_TRACE_ICMPv6_PACKET_RECORD - record ICMPv6 packet
  * @QDF_DP_TRACE_HDD_TX_TIMEOUT - HDD tx timeout
  * @QDF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT- SOFTAP HDD tx timeout
+ * @QDF_DP_TRACE_TX_CREDIT_RECORD - credit update record
  * @QDF_DP_TRACE_ULTRA_LOW_VERBOSITY - Below this is not logged for >4PPS
  * @QDF_DP_TRACE_TX_PACKET_RECORD - record 32 bytes of tx pkt at any layer
  * @QDF_DP_TRACE_RX_PACKET_RECORD - record 32 bytes of rx pkt at any layer
@@ -241,6 +242,7 @@ enum  QDF_DP_TRACE_ID {
 	QDF_DP_TRACE_ICMPv6_PACKET_RECORD,
 	QDF_DP_TRACE_HDD_TX_TIMEOUT,
 	QDF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT,
+	QDF_DP_TRACE_TX_CREDIT_RECORD,
 	QDF_DP_TRACE_ULTRA_LOW_VERBOSITY,
 	QDF_DP_TRACE_TX_PACKET_RECORD,
 	QDF_DP_TRACE_RX_PACKET_RECORD,
@@ -285,6 +287,36 @@ enum qdf_proto_dir {
 	QDF_NA
 };
 
+/**
+ * QDF_CREDIT_UPDATE_SOURCE - source of credit record
+ * @QDF_TX_SCHED: Tx scheduler
+ * @QDF_TX_COMP: TX completion
+ * @QDF_TX_CREDIT_UPDATE: credit update indication
+ * @QDF_HTT_ATTACH: HTT attach
+ * @QDF_TX_HTT_MSG: HTT TX message
+ */
+enum QDF_CREDIT_UPDATE_SOURCE {
+	QDF_TX_SCHED,
+	QDF_TX_COMP,
+	QDF_TX_CREDIT_UPDATE,
+	QDF_HTT_ATTACH,
+	QDF_TX_HTT_MSG
+};
+
+/**
+ * QDF_CREDIT_OPERATION - operation on credit
+ * @QDF_CREDIT_INC: credit increment
+ * @QDF_CREDIT_DEC: credit decrement
+ * @QDF_CREDIT_ABS: Abosolute credit
+ * @QDF_OP_NA: Not applicable
+ */
+enum QDF_CREDIT_OPERATION {
+	QDF_CREDIT_INC,
+	QDF_CREDIT_DEC,
+	QDF_CREDIT_ABS,
+	QDF_OP_NA
+};
+
 /**
  * struct qdf_dp_trace_ptr_buf - pointer record buffer
  * @cookie: cookie value
@@ -327,6 +359,24 @@ struct qdf_dp_trace_mgmt_buf {
 	uint8_t subtype;
 };
 
+/**
+ * struct qdf_dp_trace_credit_record - tx credit record
+ * @source: credit record source
+ * @operation: credit operation
+ * @delta: delta of credit
+ * @total_credits: total credit
+ * @g0_credit: group 0 credit
+ * @g1_credit: group 1 credit
+ */
+struct qdf_dp_trace_credit_record {
+	enum QDF_CREDIT_UPDATE_SOURCE source;
+	enum QDF_CREDIT_OPERATION operation;
+	int delta;
+	int total_credits;
+	int g0_credit;
+	int g1_credit;
+};
+
 /**
  * struct qdf_dp_trace_event_buf - event buffer
  * @vdev_id : vdev id
@@ -414,7 +464,7 @@ struct s_qdf_dp_trace_data {
 	uint32_t head;
 	uint32_t tail;
 	uint32_t num;
-	uint8_t proto_bitmap;
+	uint32_t proto_bitmap;
 	uint8_t no_of_record;
 	uint16_t num_records_to_dump;
 	uint16_t dump_counter;
@@ -608,11 +658,11 @@ bool qdf_dp_trace_log_pkt(uint8_t vdev_id, struct sk_buff *skb,
 
 void qdf_dp_trace_init(bool live_mode_config, uint8_t thresh,
 				uint16_t time_limit, uint8_t verbosity,
-				uint8_t proto_bitmap);
+				uint32_t proto_bitmap);
 void qdf_dp_trace_deinit(void);
 void qdf_dp_trace_spin_lock_init(void);
-void qdf_dp_trace_set_value(uint8_t proto_bitmap, uint8_t no_of_records,
-			 uint8_t verbosity);
+void qdf_dp_trace_set_value(uint32_t proto_bitmap, uint8_t no_of_records,
+			    uint8_t verbosity);
 void qdf_dp_trace_set_track(qdf_nbuf_t nbuf, enum qdf_proto_dir dir);
 void qdf_dp_trace(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code, uint8_t pdev_id,
 			uint8_t *data, uint8_t size, enum qdf_proto_dir dir);
@@ -737,7 +787,7 @@ void qdf_dp_trace_data_pkt(qdf_nbuf_t nbuf, uint8_t pdev_id,
 			   enum QDF_DP_TRACE_ID code, uint16_t msdu_id,
 			   enum qdf_proto_dir dir);
 
-uint8_t qdf_dp_get_proto_bitmap(void);
+uint32_t qdf_dp_get_proto_bitmap(void);
 uint8_t qdf_dp_get_verbosity(void);
 uint8_t qdf_dp_get_no_of_record(void);
 
@@ -778,6 +828,20 @@ void qdf_dp_trace_mgmt_pkt(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
 			   uint8_t pdev_id, enum qdf_proto_type type,
 			   enum qdf_proto_subtype subtype);
 
+/**
+ * qdf_dp_trace_credit_record() - record credit update
+ * @source: source of record
+ * @operation: credit operation
+ * @delta: credit delta
+ * @total_credits: total credit
+ * @g0_credit: group 0 credit
+ * @g1_credit: group 1 credit
+ */
+void qdf_dp_trace_credit_record(enum QDF_CREDIT_UPDATE_SOURCE source,
+				enum QDF_CREDIT_OPERATION operation,
+				int delta, int total_credits,
+				int g0_credit, int g1_credit);
+
 /**
  * qdf_dp_display_mgmt_pkt() - display proto packet
  * @record: dptrace record
@@ -790,6 +854,17 @@ void qdf_dp_trace_mgmt_pkt(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
 void qdf_dp_display_mgmt_pkt(struct qdf_dp_trace_record_s *record,
 			     uint16_t index, uint8_t pdev_id, uint8_t info);
 
+/**
+ * qdf_dp_display_credit_record() - display credit record
+ * @record: dptrace record
+ * @index: index
+ * @pdev_id: pdev id
+ * @info: metadeta info
+ */
+void qdf_dp_display_credit_record(struct qdf_dp_trace_record_s *record,
+				  uint16_t index, uint8_t pdev_id,
+				  uint8_t info);
+
 /**
  * qdf_dp_display_event_record() - display event records
  * @record: dptrace record
@@ -815,7 +890,7 @@ bool qdf_dp_trace_log_pkt(uint8_t vdev_id, struct sk_buff *skb,
 static inline
 void qdf_dp_trace_init(bool live_mode_config, uint8_t thresh,
 				uint16_t time_limit, uint8_t verbosity,
-				uint8_t proto_bitmap)
+				uint32_t proto_bitmap)
 {
 }
 
@@ -829,8 +904,8 @@ void qdf_dp_trace_set_track(qdf_nbuf_t nbuf, enum qdf_proto_dir dir)
 {
 }
 static inline
-void qdf_dp_trace_set_value(uint8_t proto_bitmap, uint8_t no_of_records,
-			 uint8_t verbosity)
+void qdf_dp_trace_set_value(uint32_t proto_bitmap, uint8_t no_of_records,
+			    uint8_t verbosity)
 {
 }
 

+ 130 - 3
qdf/linux/src/qdf_trace.c

@@ -692,7 +692,7 @@ static void qdf_dp_unused(struct qdf_dp_trace_record_s *record,
  */
 void qdf_dp_trace_init(bool live_mode_config, uint8_t thresh,
 				uint16_t time_limit, uint8_t verbosity,
-				uint8_t proto_bitmap)
+				uint32_t proto_bitmap)
 {
 	uint8_t i;
 
@@ -739,6 +739,8 @@ void qdf_dp_trace_init(bool live_mode_config, uint8_t thresh,
 						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_TX_CREDIT_RECORD] =
+					qdf_dp_display_credit_record;
 	qdf_dp_trace_cb_table[QDF_DP_TRACE_EVENT_RECORD] =
 					qdf_dp_display_event_record;
 
@@ -765,7 +767,7 @@ void qdf_dp_trace_deinit(void)
  *
  * Return: None
  */
-void qdf_dp_trace_set_value(uint8_t proto_bitmap, uint8_t no_of_record,
+void qdf_dp_trace_set_value(uint32_t proto_bitmap, uint8_t no_of_record,
 			    uint8_t verbosity)
 {
 	g_qdf_dp_trace_data.proto_bitmap = proto_bitmap;
@@ -879,7 +881,7 @@ static bool qdf_dp_trace_verbosity_check(enum QDF_DP_TRACE_ID code)
  *
  * Return: proto bitmap
  */
-uint8_t qdf_dp_get_proto_bitmap(void)
+uint32_t qdf_dp_get_proto_bitmap(void)
 {
 	if (g_qdf_dp_trace_data.enable)
 		return g_qdf_dp_trace_data.proto_bitmap;
@@ -980,6 +982,8 @@ const char *qdf_dp_code_to_string(enum QDF_DP_TRACE_ID code)
 		return "ICMPv6:";
 	case QDF_DP_TRACE_MGMT_PACKET_RECORD:
 		return "MGMT:";
+	case QDF_DP_TRACE_TX_CREDIT_RECORD:
+		return "CREDIT:";
 	case QDF_DP_TRACE_EVENT_RECORD:
 		return "EVENT:";
 	case QDF_DP_TRACE_HDD_TX_PACKET_PTR_RECORD:
@@ -1056,6 +1060,39 @@ static const char *qdf_dp_dir_to_str(enum qdf_proto_dir dir)
 	}
 }
 
+static const char *qdf_dp_credit_source_to_str(
+		enum QDF_CREDIT_UPDATE_SOURCE source)
+{
+	switch (source) {
+	case QDF_TX_SCHED:
+		return "TX SCHED";
+	case QDF_TX_COMP:
+		return "TX COMP";
+	case QDF_TX_CREDIT_UPDATE:
+		return "CREDIT UP";
+	case QDF_TX_HTT_MSG:
+		return "HTT TX MSG";
+	case QDF_HTT_ATTACH:
+		return "HTT ATTACH";
+	default:
+		return "invalid";
+	}
+}
+
+static const char *qdf_dp_operation_to_str(enum QDF_CREDIT_OPERATION op)
+{
+	switch (op) {
+	case QDF_CREDIT_INC:
+		return "+";
+	case QDF_CREDIT_DEC:
+		return "-";
+	case QDF_CREDIT_ABS:
+		return "ABS";
+	default:
+		return "invalid";
+	}
+}
+
 /**
  * qdf_dp_type_to_str() - convert packet type to string
  * @type: type
@@ -1696,6 +1733,91 @@ void qdf_dp_trace_mgmt_pkt(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
 }
 qdf_export_symbol(qdf_dp_trace_mgmt_pkt);
 
+static void
+qdf_dpt_display_credit_record_debugfs(qdf_debugfs_file_t file,
+				      struct qdf_dp_trace_record_s *record,
+				      uint32_t index)
+{
+	int loc;
+	char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE];
+	struct qdf_dp_trace_credit_record *buf =
+		(struct qdf_dp_trace_credit_record *)record->data;
+
+	loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
+					 index, 0, record);
+	if (buf->operation == QDF_OP_NA)
+		qdf_debugfs_printf(file, "%s [%s] [T: %d G0: %d G1: %d]\n",
+				   prepend_str,
+				   qdf_dp_credit_source_to_str(buf->source),
+				   buf->total_credits, buf->g0_credit,
+				   buf->g1_credit);
+	else
+		qdf_debugfs_printf(file,
+				   "%s [%s] [T: %d G0: %d G1: %d] [%s %d]\n",
+				   prepend_str,
+				   qdf_dp_credit_source_to_str(buf->source),
+				   buf->total_credits, buf->g0_credit,
+				   buf->g1_credit,
+				   qdf_dp_operation_to_str(buf->operation),
+				   buf->delta);
+}
+
+void qdf_dp_display_credit_record(struct qdf_dp_trace_record_s *record,
+				  uint16_t index, uint8_t pdev_id, uint8_t info)
+{
+	int loc;
+	char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE];
+	struct qdf_dp_trace_credit_record *buf =
+		(struct qdf_dp_trace_credit_record *)record->data;
+
+	loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
+					 index, info, record);
+	if (buf->operation == QDF_OP_NA)
+		DPTRACE_PRINT("%s [%s] [T: %d G0: %d G1: %d]",
+			      prepend_str,
+			      qdf_dp_credit_source_to_str(buf->source),
+			      buf->total_credits, buf->g0_credit,
+			      buf->g1_credit);
+	else
+		DPTRACE_PRINT("%s [%s] [T: %d G0: %d G1: %d] [%s %d]",
+			      prepend_str,
+			      qdf_dp_credit_source_to_str(buf->source),
+			      buf->total_credits, buf->g0_credit,
+			      buf->g1_credit,
+			      qdf_dp_operation_to_str(buf->operation),
+			      buf->delta);
+}
+
+void qdf_dp_trace_credit_record(enum QDF_CREDIT_UPDATE_SOURCE source,
+				enum QDF_CREDIT_OPERATION operation,
+				int delta, int total_credits,
+				int g0_credit, int g1_credit)
+{
+	struct qdf_dp_trace_credit_record buf;
+	int buf_size = sizeof(struct qdf_dp_trace_credit_record);
+	enum QDF_DP_TRACE_ID code = QDF_DP_TRACE_TX_CREDIT_RECORD;
+
+	if (qdf_dp_enable_check(NULL, code, QDF_NA) == false)
+		return;
+
+	if (!(qdf_dp_get_proto_bitmap() & QDF_HL_CREDIT_TRACKING))
+		return;
+
+	if (buf_size > QDF_DP_TRACE_RECORD_SIZE)
+		QDF_BUG(0);
+
+	buf.source = source;
+	buf.operation = operation;
+	buf.delta = delta;
+	buf.total_credits = total_credits;
+	buf.g0_credit = g0_credit;
+	buf.g1_credit = g1_credit;
+
+	qdf_dp_add_record(code, QDF_TRACE_DEFAULT_PDEV_ID, (uint8_t *)&buf,
+			  buf_size, NULL, 0, false);
+}
+qdf_export_symbol(qdf_dp_trace_credit_record);
+
 void qdf_dp_display_event_record(struct qdf_dp_trace_record_s *record,
 			      uint16_t index, uint8_t pdev_id, uint8_t info)
 {
@@ -2350,6 +2472,11 @@ QDF_STATUS qdf_dpt_dump_stats_debugfs(qdf_debugfs_file_t file,
 			qdf_dpt_display_proto_pkt_debugfs(file, &p_record, i);
 			break;
 
+		case QDF_DP_TRACE_TX_CREDIT_RECORD:
+			qdf_dpt_display_credit_record_debugfs(file, &p_record,
+							      i);
+			break;
+
 		case QDF_DP_TRACE_MGMT_PACKET_RECORD:
 			qdf_dpt_display_mgmt_pkt_debugfs(file, &p_record, i);
 			break;