Browse Source

qcacmn: PPDU stats debug enhancement

1. Assert if length received from FW is not equal to
   the expected length
2. Count the number of PPDU stats received by host and
   print in "iwpriv athX txrx_stats 260"
3. Optimize the PPDU stats tag mask sent to FW for
   enhanced stats enabling

Change-Id: I60019de93bb3914955a03546504efc820c960746
CRs-Fixed: 2170704
Soumya Bhat 7 years ago
parent
commit
0d6245c0ac
4 changed files with 69 additions and 12 deletions
  1. 7 0
      dp/inc/cdp_txrx_stats_struct.h
  2. 22 0
      dp/wifi3.0/dp_htt.c
  3. 37 12
      dp/wifi3.0/dp_main.c
  4. 3 0
      dp/wifi3.0/dp_types.h

+ 7 - 0
dp/inc/cdp_txrx_stats_struct.h

@@ -70,6 +70,12 @@
 
 #define CDP_MAX_RX_RINGS 4
 
+/*
+ * Number of TLVs sent by FW. Needs to reflect
+ * HTT_PPDU_STATS_MAX_TAG declared in FW
+ */
+#define CDP_PPDU_STATS_MAX_TAG 14
+
 /* Different Packet Types */
 enum cdp_packet_type {
 	DOT11_A = 0,
@@ -407,6 +413,7 @@ struct cdp_pdev_stats {
 	struct cdp_hist_tx_comp tx_comp_histogram;
 	/* Number of Rx ring descriptors reaped per interrupt */
 	struct cdp_hist_rx_ind rx_ind_histogram;
+	uint64_t ppdu_stats_counter[CDP_PPDU_STATS_MAX_TAG];
 };
 
 #ifndef BIG_ENDIAN_HOST

+ 22 - 0
dp/wifi3.0/dp_htt.c

@@ -2172,9 +2172,13 @@ static void dp_process_ppdu_tag(struct dp_pdev *pdev, uint32_t *tag_buf,
 	uint32_t tlv_type = HTT_STATS_TLV_TAG_GET(*tag_buf);
 	switch (tlv_type) {
 	case HTT_PPDU_STATS_COMMON_TLV:
+		qdf_assert_always(tlv_len ==
+				sizeof(htt_ppdu_stats_common_tlv));
 		dp_process_ppdu_stats_common_tlv(pdev, tag_buf);
 		break;
 	case HTT_PPDU_STATS_USR_COMMON_TLV:
+		qdf_assert_always(tlv_len ==
+				sizeof(htt_ppdu_stats_user_common_tlv));
 		dp_process_ppdu_stats_user_common_tlv(pdev, tag_buf);
 		break;
 	case HTT_PPDU_STATS_USR_RATE_TLV:
@@ -2183,31 +2187,47 @@ static void dp_process_ppdu_tag(struct dp_pdev *pdev, uint32_t *tag_buf,
 		dp_process_ppdu_stats_user_rate_tlv(pdev, tag_buf);
 		break;
 	case HTT_PPDU_STATS_USR_MPDU_ENQ_BITMAP_64_TLV:
+		qdf_assert_always(tlv_len ==
+				sizeof(htt_ppdu_stats_enq_mpdu_bitmap_64_tlv));
 		dp_process_ppdu_stats_enq_mpdu_bitmap_64_tlv(pdev, tag_buf);
 		break;
 	case HTT_PPDU_STATS_USR_MPDU_ENQ_BITMAP_256_TLV:
+		qdf_assert_always(tlv_len ==
+				sizeof(htt_ppdu_stats_enq_mpdu_bitmap_256_tlv));
 		dp_process_ppdu_stats_enq_mpdu_bitmap_256_tlv(pdev, tag_buf);
 		break;
 	case HTT_PPDU_STATS_USR_COMPLTN_COMMON_TLV:
+		qdf_assert_always(tlv_len ==
+				sizeof(htt_ppdu_stats_user_cmpltn_common_tlv));
 		dp_process_ppdu_stats_user_cmpltn_common_tlv(pdev, tag_buf);
 		break;
 	case HTT_PPDU_STATS_USR_COMPLTN_BA_BITMAP_64_TLV:
+		qdf_assert_always(tlv_len ==
+			sizeof(htt_ppdu_stats_user_compltn_ba_bitmap_64_tlv));
 		dp_process_ppdu_stats_user_compltn_ba_bitmap_64_tlv(pdev,
 								tag_buf);
 		break;
 	case HTT_PPDU_STATS_USR_COMPLTN_BA_BITMAP_256_TLV:
+		qdf_assert_always(tlv_len ==
+			sizeof(htt_ppdu_stats_user_compltn_ba_bitmap_256_tlv));
 		dp_process_ppdu_stats_user_compltn_ba_bitmap_256_tlv(pdev,
 								tag_buf);
 		break;
 	case HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV:
+		qdf_assert_always(tlv_len ==
+			sizeof(htt_ppdu_stats_user_compltn_ack_ba_status_tlv));
 		dp_process_ppdu_stats_user_compltn_ack_ba_status_tlv(pdev,
 								tag_buf);
 		break;
 	case HTT_PPDU_STATS_USR_COMMON_ARRAY_TLV:
+		qdf_assert_always(tlv_len ==
+			sizeof(htt_ppdu_stats_usr_common_array_tlv_v));
 		dp_process_ppdu_stats_user_common_array_tlv(pdev,
 							tag_buf);
 		break;
 	case HTT_PPDU_STATS_USR_COMPLTN_FLUSH_TLV:
+		qdf_assert_always(tlv_len ==
+			sizeof(htt_ppdu_stats_flush_tlv));
 		dp_process_ppdu_stats_user_compltn_flush_tlv(pdev,
 								tag_buf);
 		break;
@@ -2242,6 +2262,8 @@ static QDF_STATUS dp_htt_process_tlv(struct dp_pdev *pdev,
 		tlv_buf = (uint8_t *)msg_word;
 		tlv_type = HTT_STATS_TLV_TAG_GET(*msg_word);
 		tlv_length = HTT_STATS_TLV_LENGTH_GET(*msg_word);
+		if (qdf_likely(tlv_type < CDP_PPDU_STATS_MAX_TAG))
+			pdev->stats.ppdu_stats_counter[tlv_type]++;
 
 		if (tlv_length == 0)
 			break;

+ 37 - 12
dp/wifi3.0/dp_main.c

@@ -86,7 +86,12 @@ qdf_declare_param(rx_hash, bool);
 
 #define STR_MAXLEN	64
 
-#define DP_PPDU_STATS_CFG_ALL 0xffff
+#define DP_PPDU_STATS_CFG_ALL 0xFFFF
+
+/* PPDU stats mask sent to FW to enable enhanced stats */
+#define DP_PPDU_STATS_CFG_ENH_STATS 0xE67
+/* PPDU stats mask sent to FW to support debug sniffer feature */
+#define DP_PPDU_STATS_CFG_SNIFFER 0x2FFF
 /**
  * default_dscp_tid_map - Default DSCP-TID mapping
  *
@@ -4373,6 +4378,7 @@ static inline void dp_aggregate_pdev_stats(struct dp_pdev *pdev)
 static inline void
 dp_print_pdev_tx_stats(struct dp_pdev *pdev)
 {
+	uint8_t index = 0;
 	DP_PRINT_STATS("PDEV Tx Stats:\n");
 	DP_PRINT_STATS("Received From Stack:");
 	DP_PRINT_STATS("	Packets = %d",
@@ -4473,6 +4479,11 @@ dp_print_pdev_tx_stats(struct dp_pdev *pdev)
 			pdev->stats.tx_i.mesh.exception_fw);
 	DP_PRINT_STATS("	completions from fw: %u",
 			pdev->stats.tx_i.mesh.completion_fw);
+	DP_PRINT_STATS("PPDU stats counter");
+	for (index = 0; index < CDP_PPDU_STATS_MAX_TAG; index++) {
+		DP_PRINT_STATS("	Tag[%d] = %llu", index,
+				pdev->stats.ppdu_stats_counter[index]);
+	}
 }
 
 /**
@@ -5257,9 +5268,12 @@ dp_config_debug_sniffer(struct cdp_pdev *pdev_handle, int val)
 		pdev->tx_sniffer_enable = 0;
 		pdev->mcopy_mode = 0;
 
-		if (!pdev->enhanced_stats_en) {
+		if (!pdev->pktlog_ppdu_stats && !pdev->enhanced_stats_en) {
 			dp_h2t_cfg_stats_msg_send(pdev, 0, pdev->pdev_id);
 			dp_ppdu_ring_reset(pdev);
+		} else if (pdev->enhanced_stats_en) {
+			dp_h2t_cfg_stats_msg_send(pdev,
+				DP_PPDU_STATS_CFG_ENH_STATS, pdev->pdev_id);
 		}
 		break;
 
@@ -5267,18 +5281,19 @@ dp_config_debug_sniffer(struct cdp_pdev *pdev_handle, int val)
 		pdev->tx_sniffer_enable = 1;
 		pdev->mcopy_mode = 0;
 
-		if (!pdev->enhanced_stats_en)
+		if (!pdev->pktlog_ppdu_stats)
 			dp_h2t_cfg_stats_msg_send(pdev,
-				DP_PPDU_STATS_CFG_ALL, pdev->pdev_id);
+				DP_PPDU_STATS_CFG_SNIFFER, pdev->pdev_id);
 		break;
 	case 2:
 		pdev->mcopy_mode = 1;
 		pdev->tx_sniffer_enable = 0;
-		if (!pdev->enhanced_stats_en) {
+		if (!pdev->enhanced_stats_en)
 			dp_ppdu_ring_cfg(pdev);
+
+		if (!pdev->pktlog_ppdu_stats)
 			dp_h2t_cfg_stats_msg_send(pdev,
-				DP_PPDU_STATS_CFG_ALL, pdev->pdev_id);
-		}
+				DP_PPDU_STATS_CFG_SNIFFER, pdev->pdev_id);
 		break;
 	default:
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
@@ -5302,8 +5317,8 @@ dp_enable_enhanced_stats(struct cdp_pdev *pdev_handle)
 	if (!pdev->mcopy_mode)
 		dp_ppdu_ring_cfg(pdev);
 
-	if (!pdev->tx_sniffer_enable && !pdev->mcopy_mode)
-		dp_h2t_cfg_stats_msg_send(pdev, 0xffff, pdev->pdev_id);
+	if (!pdev->pktlog_ppdu_stats && !pdev->tx_sniffer_enable && !pdev->mcopy_mode)
+		dp_h2t_cfg_stats_msg_send(pdev, DP_PPDU_STATS_CFG_ENH_STATS, pdev->pdev_id);
 }
 
 /*
@@ -5319,7 +5334,7 @@ dp_disable_enhanced_stats(struct cdp_pdev *pdev_handle)
 
 	pdev->enhanced_stats_en = 0;
 
-	if (!pdev->tx_sniffer_enable && !pdev->mcopy_mode)
+	if (!pdev->pktlog_ppdu_stats && !pdev->tx_sniffer_enable && !pdev->mcopy_mode)
 		dp_h2t_cfg_stats_msg_send(pdev, 0, pdev->pdev_id);
 
 	if (!pdev->mcopy_mode)
@@ -6739,6 +6754,7 @@ int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event,
 			 * in htt header file will use proper macros
 			*/
 			for (mac_id = 0; mac_id < max_mac_rings; mac_id++) {
+				pdev->pktlog_ppdu_stats = true;
 				dp_h2t_cfg_stats_msg_send(pdev, 0xffff,
 						pdev->pdev_id + mac_id);
 			}
@@ -6788,8 +6804,17 @@ int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event,
 			 * header file will use proper macros
 			*/
 			for (mac_id = 0; mac_id < max_mac_rings; mac_id++) {
-				dp_h2t_cfg_stats_msg_send(pdev, 0,
-						pdev->pdev_id + mac_id);
+				pdev->pktlog_ppdu_stats = false;
+				if (!pdev->enhanced_stats_en && !pdev->tx_sniffer_enable && !pdev->mcopy_mode) {
+					dp_h2t_cfg_stats_msg_send(pdev, 0,
+							pdev->pdev_id + mac_id);
+				} else if (pdev->tx_sniffer_enable || pdev->mcopy_mode) {
+					dp_h2t_cfg_stats_msg_send(pdev, DP_PPDU_STATS_CFG_SNIFFER,
+							pdev->pdev_id + mac_id);
+				} else if (pdev->enhanced_stats_en) {
+					dp_h2t_cfg_stats_msg_send(pdev, DP_PPDU_STATS_CFG_ENH_STATS,
+							pdev->pdev_id + mac_id);
+				}
 			}
 
 			break;

+ 3 - 0
dp/wifi3.0/dp_types.h

@@ -1106,6 +1106,9 @@ struct dp_pdev {
 		uint16_t rx_ppdu_id;
 	} am_copy_id;
 
+	/* To check if PPDU Tx stats are enabled for Pktlog */
+	bool pktlog_ppdu_stats;
+
 	void *dp_txrx_handle; /* Advanced data path handle */
 };