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 */ };