From 0d6245c0ac89caa43749e45a35a6d8345f49b76e Mon Sep 17 00:00:00 2001 From: Soumya Bhat Date: Thu, 8 Feb 2018 21:02:57 +0530 Subject: [PATCH] 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 --- dp/inc/cdp_txrx_stats_struct.h | 7 +++++ dp/wifi3.0/dp_htt.c | 22 +++++++++++++++ dp/wifi3.0/dp_main.c | 49 +++++++++++++++++++++++++--------- dp/wifi3.0/dp_types.h | 3 +++ 4 files changed, 69 insertions(+), 12 deletions(-) diff --git a/dp/inc/cdp_txrx_stats_struct.h b/dp/inc/cdp_txrx_stats_struct.h index fdf53e2e75..b22b9556e7 100644 --- a/dp/inc/cdp_txrx_stats_struct.h +++ b/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 diff --git a/dp/wifi3.0/dp_htt.c b/dp/wifi3.0/dp_htt.c index b9a8e69f2a..17c3a1eed9 100644 --- a/dp/wifi3.0/dp_htt.c +++ b/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; diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 796976d35e..430daa2cc6 100644 --- a/dp/wifi3.0/dp_main.c +++ b/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; diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index d292ea5ae7..4d65a7e5a6 100644 --- a/dp/wifi3.0/dp_types.h +++ b/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 */ };