--- a/drivers/net/wireless/ath/ath11k/debugfs.h +++ b/drivers/net/wireless/ath/ath11k/debugfs.h @@ -38,6 +38,10 @@ enum ath11k_dbg_htt_ext_stats_type { ATH11K_DBG_HTT_EXT_STATS_TX_SOUNDING_INFO = 22, ATH11K_DBG_HTT_EXT_STATS_PDEV_OBSS_PD_STATS = 23, ATH11K_DBG_HTT_EXT_STATS_RING_BACKPRESSURE_STATS = 24, + ATH11K_DBG_HTT_EXT_STATS_LATENCY_PROF_STATS = 25, + ATH11K_DBG_HTT_EXT_STATS_PDEV_UL_TRIG_STATS = 26, + ATH11K_DBG_HTT_EXT_STATS_PDEV_UL_MUMIMO_TRIG_STATS = 27, + ATH11K_DBG_HTT_EXT_STATS_FSE_RX = 28, ATH11K_DBG_HTT_EXT_STATS_PEER_CTRL_PATH_TXRX_STATS = 29, ATH11K_DBG_HTT_EXT_STATS_PDEV_TX_RATE_TXBF_STATS = 31, ATH11K_DBG_HTT_EXT_STATS_TXBF_OFDMA = 32, --- a/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.c +++ b/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.c @@ -3725,6 +3725,370 @@ static inline void htt_print_backpressur } } +static inline void htt_print_latency_prof_stats_tlv_v(const void *tag_buf, + struct debug_htt_stats_req *stats_req) +{ + const struct htt_latency_prof_stats_tlv *htt_stats_buf = tag_buf; + u8 *buf = stats_req->buf; + u32 len = stats_req->buf_len; + u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE; + + if (htt_stats_buf->print_header == 1) { + len += scnprintf(buf + len, buf_len - len, + "HTT_STATS_LATENCY_PROF_TLV:\n"); + len += scnprintf(buf + len, buf_len - len, + "| prof_name\t| cnt\t| min\t| max\t| last\t| tot\t| avg\t| hist_intvl\t| hist\t|\n"); + } + + len += scnprintf(buf + len, buf_len - len, + "|%s| %8u| %8u| %8u| %8u| %8u| %8u| %8u| %4u:%4u:%4u|\n", + htt_stats_buf->latency_prof_name, htt_stats_buf->cnt, + htt_stats_buf->min, htt_stats_buf->max, htt_stats_buf->last, + htt_stats_buf->tot, htt_stats_buf->avg, + htt_stats_buf->hist_intvl, htt_stats_buf->hist[0], + htt_stats_buf->hist[1], htt_stats_buf->hist[2]); +} + +static inline void htt_print_latency_prof_ctx_tlv(const void *tag_buf, + struct debug_htt_stats_req *stats_req) +{ + const struct htt_latency_prof_ctx_tlv *htt_stats_buf = tag_buf; + u8 *buf = stats_req->buf; + u32 len = stats_req->buf_len; + u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE; + + len += scnprintf(buf + len, buf_len - len, "HTT_STATS_LATENCY_CTX_TLV:\n"); + len += scnprintf(buf + len, buf_len - len, "duration= %u\n", + htt_stats_buf->duration); + len += scnprintf(buf + len, buf_len - len, + "tx_msdu_cnt = %u\n", htt_stats_buf->tx_msdu_cnt); + len += scnprintf(buf + len, buf_len - len, + "tx_mpdu_cnt = %u\n", htt_stats_buf->tx_mpdu_cnt); + len += scnprintf(buf + len, buf_len - len, + "rx_msdu_cnt = %u\n", htt_stats_buf->rx_msdu_cnt); + len += scnprintf(buf + len, buf_len - len, + "rx_mpdu_cnt = %u\n", htt_stats_buf->rx_mpdu_cnt); + + stats_req->buf_len = len; +} + +static inline void htt_print_latency_prof_cnt(const void *tag_buf, + struct debug_htt_stats_req *stats_req) +{ + const struct htt_latency_prof_cnt_tlv *htt_stats_buf = tag_buf; + u8 *buf = stats_req->buf; + u32 len = stats_req->buf_len; + u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE; + + len += scnprintf(buf + len, buf_len - len, "prof_enable_cnt = %u\n", + htt_stats_buf->prof_enable_cnt); + + stats_req->buf_len = len; +} + +static inline void htt_print_ul_ofdma_user_stats(const void *tag_buf, + struct debug_htt_stats_req *stats_req) +{ + const struct htt_rx_pdev_ul_ofdma_user_stats_tlv *htt_ul_user_stats_buf = tag_buf; + u8 *buf = stats_req->buf; + u32 len = stats_req->buf_len; + u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE; + + if (htt_ul_user_stats_buf->user_index == 0) { + len += scnprintf(buf + len, buf_len - len, + "HTT_RX_PDEV_UL_OFDMA_USER_STAS_TLV\n"); + } + + len += scnprintf(buf + len, buf_len - len, + "rx_ulofdma_non_data_ppdu_%u = %u\n", + htt_ul_user_stats_buf->user_index, + htt_ul_user_stats_buf->rx_ulofdma_non_data_ppdu); + len += scnprintf(buf + len, buf_len - len, + "rx_ulofdma_data_ppdu_%u = %u\n", + htt_ul_user_stats_buf->user_index, + htt_ul_user_stats_buf->rx_ulofdma_data_ppdu); + len += scnprintf(buf + len, buf_len - len, + "rx_ulofdma_mpdu_ok_%u = %u\n", + htt_ul_user_stats_buf->user_index, + htt_ul_user_stats_buf->rx_ulofdma_mpdu_ok); + len += scnprintf(buf + len, buf_len - len, + "rx_ulofdma_mpdu_fail_%u = %u\n", + htt_ul_user_stats_buf->user_index, + htt_ul_user_stats_buf->rx_ulofdma_mpdu_fail); + len += scnprintf(buf + len, buf_len - len, + "rx_ulofdma_non_data_nusers_%u = %u\n", + htt_ul_user_stats_buf->user_index, + htt_ul_user_stats_buf->rx_ulofdma_non_data_nusers); + len += scnprintf(buf + len, buf_len - len, + "rx_ulofdma_data_nusers_%u = %u\n", + htt_ul_user_stats_buf->user_index, + htt_ul_user_stats_buf->rx_ulofdma_data_nusers); + + stats_req->buf_len = len; +} + +static inline void htt_print_ul_ofdma_trigger_stats(const void *tag_buf, + struct debug_htt_stats_req *stats_req) +{ + const struct htt_rx_pdev_ul_trigger_stats_tlv *htt_trigger_stats_buf = tag_buf; + u8 *buf = stats_req->buf; + u32 len = stats_req->buf_len; + u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE; + u8 j; + + len += scnprintf(buf + len, buf_len - len, + "HTT_RX_PDEV_UL_TRIGGER_STATS_TLV:\n"); + len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n", + FIELD_GET(HTT_STATS_MAC_ID, + htt_trigger_stats_buf->mac_id__word)); + len += scnprintf(buf + len, buf_len - len, "rx_11ax_ul_ofdma = %u\n", + htt_trigger_stats_buf->rx_11ax_ul_ofdma); + + PRINT_ARRAY_TO_BUF(buf, len, htt_trigger_stats_buf->ul_ofdma_rx_mcs, + "ul_ofdma_rx_mcs", + HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n"); + PRINT_ARRAY_TO_BUF(buf, len, htt_trigger_stats_buf->ul_ofdma_rx_mcs_ext, + "ul_ofdma_rx_mcs_ext", + HTT_RX_PDEV_STATS_NUM_EMCS_COUNTERS, "\n"); + + for (j = 0; j < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) { + len += scnprintf(buf + len, buf_len - len, + "ul_ofdma_rx_gi[%u] = ", j); + PRINT_ARRAY_TO_BUF(buf, len, + htt_trigger_stats_buf->ul_ofdma_rx_gi[j], + NULL, HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, + "\n"); + + len += scnprintf(buf + len, buf_len - len, + "ul_ofdma_rx_gi_ext[%u] = ", j); + PRINT_ARRAY_TO_BUF(buf, len, + htt_trigger_stats_buf->ul_ofdma_rx_gie[j], + NULL, HTT_RX_PDEV_STATS_NUM_EMCS_COUNTERS, + "\n"); + } + + PRINT_ARRAY_TO_BUF(buf, len, htt_trigger_stats_buf->ul_ofdma_rx_nss, + "ul_ofdma_rx_nss", + HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS, "\n"); + + PRINT_ARRAY_TO_BUF(buf, len, htt_trigger_stats_buf->ul_ofdma_rx_bw, + "ul_ofdma_rx_bw", HTT_RX_PDEV_STATS_NUM_BW_COUNTERS, + "\n"); + + len += scnprintf(buf + len, buf_len - len, "ul_ofdma_rx_stbc = %u\n", + htt_trigger_stats_buf->ul_ofdma_rx_stbc); + len += scnprintf(buf + len, buf_len - len, "ul_ofdma_rx_ldpc = %u\n", + htt_trigger_stats_buf->ul_ofdma_rx_ldpc); + + PRINT_ARRAY_TO_BUF(buf, len, + htt_trigger_stats_buf->rx_ulofdma_data_ru_size_ppdu, + "rx_ulofdma_non_data_ru_size_ppdu", + HTT_RX_PDEV_STATS_NUM_RU_SIZE_COUNTERS, "\n"); + PRINT_ARRAY_TO_BUF(buf, len, + htt_trigger_stats_buf->rx_ulofdma_non_data_ru_size_ppdu, + "rx_ulofdma_data_ru_size_ppdu", + HTT_RX_PDEV_STATS_NUM_RU_SIZE_COUNTERS, "\n"); + + len += scnprintf(buf + len, buf_len - len, "\n\n"); + + stats_req->buf_len = len; +} + +static inline void htt_print_ul_mumimo_trig_stats(const void *tag_buf, + struct debug_htt_stats_req *stats_req) +{ + const struct htt_rx_pdev_ul_mumimo_trig_stats_tlv *htt_ul_mumimo_trig_stats_buf = + tag_buf; + u8 *buf = stats_req->buf; + u32 len = stats_req->buf_len; + u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE; + u8 j; + + len += scnprintf(buf + len, buf_len - len, + "HTT_RX_PDEV_UL_MUMIMO_TRIG_STATS_TLV:\n"); + len += scnprintf(buf + len, buf_len - len, "mac_id = %lu\n", + FIELD_GET(HTT_STATS_MAC_ID, + htt_ul_mumimo_trig_stats_buf->mac_id__word)); + + len += scnprintf(buf + len, buf_len - len, + "rx_11ax_ul_mumimo = %u\n", + htt_ul_mumimo_trig_stats_buf->rx_11ax_ul_mumimo); + + PRINT_ARRAY_TO_BUF(buf, len, + htt_ul_mumimo_trig_stats_buf->ul_mumimo_rx_mcs, + "ul_mumimo_rx_mcs", + HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, "\n"); + PRINT_ARRAY_TO_BUF(buf, len, + htt_ul_mumimo_trig_stats_buf->ul_mumimo_rx_mcs_ext, + "ul_mumimo_ext_rx_mcs", + HTT_RX_PDEV_STATS_NUM_EMCS_COUNTERS, "\n"); + + for (j = 0; j < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) { + len += scnprintf(buf + len, buf_len - len, + "ul_mumimo_rx_gi[%u] = ", j); + PRINT_ARRAY_TO_BUF(buf, len, + htt_ul_mumimo_trig_stats_buf->ul_mumimo_rx_gi[j], + NULL, HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, + "\n"); + + len += scnprintf(buf + len, buf_len - len, + "ul_mumimo_rx_gi_ext[%u] = ", j); + PRINT_ARRAY_TO_BUF(buf, len, + htt_ul_mumimo_trig_stats_buf->ul_mumimo_rx_gie[j], + NULL, HTT_RX_PDEV_STATS_NUM_EMCS_COUNTERS, + "\n"); + } + + PRINT_ARRAY_TO_BUF(buf, len, + htt_ul_mumimo_trig_stats_buf->ul_mumimo_rx_nss, + "ul_mumimo_rx_nss", + HTT_RX_PDEV_STATS_ULNUM_SPATIAL_STREAMS, "\n"); + + PRINT_ARRAY_TO_BUF(buf, len, + htt_ul_mumimo_trig_stats_buf->ul_mumimo_rx_bw, + "ul_mumimo_rx_bw", + HTT_RX_PDEV_STATS_NUM_BW_COUNTERS, "\n"); + + len += scnprintf(buf + len, buf_len - len, "ul_mumimo_rx_stbc = %u\n", + htt_ul_mumimo_trig_stats_buf->ul_mumimo_rx_stbc); + len += scnprintf(buf + len, buf_len - len, "ul_mumimo_rx_ldpc = %u\n", + htt_ul_mumimo_trig_stats_buf->ul_mumimo_rx_ldpc); + len += scnprintf(buf + len, buf_len - len, "\n\n"); + + stats_req->buf_len = len; +} + +static inline void htt_print_ul_mimo_user_stats(const void *tag_buf, + struct debug_htt_stats_req *stats_req) +{ + const struct htt_rx_pdev_ul_mimo_user_stats_tlv *htt_ul_user_stats_buf = tag_buf; + u8 *buf = stats_req->buf; + u32 len = stats_req->buf_len; + u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE; + + if (htt_ul_user_stats_buf->user_index > HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER) { + if (htt_ul_user_stats_buf->user_index == 0) { + len += scnprintf(buf + len, buf_len - len, + "HTT_STATS_RX_PDEV_UL_MIMO_USER_STATS_TLV\n"); + } + + len += scnprintf(buf + len, buf_len - len, + "rx_ulmumimo_non_data_ppdu_%u = %u\n", + htt_ul_user_stats_buf->user_index, + htt_ul_user_stats_buf->rx_ulmumimo_non_data_ppdu); + + len += scnprintf(buf + len, buf_len - len, + "rx_ulmumimo_data_ppdu_%u = %u\n", + htt_ul_user_stats_buf->user_index, + htt_ul_user_stats_buf->rx_ulmumimo_data_ppdu); + + len += scnprintf(buf + len, buf_len - len, + "rx_ulmumimo_mpdu_ok_%u = %u\n", + htt_ul_user_stats_buf->user_index, + htt_ul_user_stats_buf->rx_ulmumimo_mpdu_ok); + + len += scnprintf(buf + len, buf_len - len, + "rx_ulmumimo_mpdu_fail_%u = %u\n", + htt_ul_user_stats_buf->user_index, + htt_ul_user_stats_buf->rx_ulmumimo_mpdu_fail); + } + + stats_req->buf_len = len; +} + +static inline void htt_print_rx_fse_stats_tlv(const void *tag_buf, + struct debug_htt_stats_req *stats_req) +{ + const struct htt_rx_fse_stats_tlv *htt_stats_buf = tag_buf; + u8 *buf = stats_req->buf; + u32 len = stats_req->buf_len; + u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE; + + len += scnprintf(buf + len, buf_len - len, "HTT_STATS_RX_FSE_STATS_TLV:\n"); + len += scnprintf(buf + len, buf_len - len, "=== Software RX FSE STATS ===\n"); + len += scnprintf(buf + len, buf_len - len, + "Enable count = %u\n", htt_stats_buf->fse_enable_cnt); + len += scnprintf(buf + len, buf_len - len, + "Disable count = %u\n", htt_stats_buf->fse_disable_cnt); + len += scnprintf(buf + len, buf_len - len, + "Cache Invalidate Entry Count = %u\n", + htt_stats_buf->fse_cache_invalidate_entry_cnt); + len += scnprintf(buf + len, buf_len - len, + "Full Cache Invalidate Count = %u\n", + htt_stats_buf->fse_full_cache_invalidate_cnt); + len += scnprintf(buf + len, buf_len - len, + "=== Hardware RX FSE STATS ===\n"); + len += scnprintf(buf + len, buf_len - len, "Cache hits Count = %u\n", + htt_stats_buf->fse_num_cache_hits_cnt); + len += scnprintf(buf + len, buf_len - len, "Cache No. of searches = %u\n", + htt_stats_buf->fse_num_searches_cnt); + len += scnprintf(buf + len, buf_len - len, "Cache occupancy Peak Count:\n"); + len += scnprintf(buf + len, buf_len - len, + " [0] = %u [1-16] = %u [17-32] = %u\n", + htt_stats_buf->fse_cache_occupancy_peak_cnt[0], + htt_stats_buf->fse_cache_occupancy_peak_cnt[1], + htt_stats_buf->fse_cache_occupancy_peak_cnt[2]); + len += scnprintf(buf + len, buf_len - len, + "[33-48] = %u [49-64] = %u [65-80] = %u\n", + htt_stats_buf->fse_cache_occupancy_peak_cnt[3], + htt_stats_buf->fse_cache_occupancy_peak_cnt[4], + htt_stats_buf->fse_cache_occupancy_peak_cnt[5]); + len += scnprintf(buf + len, buf_len - len, + "[81-96] = %u [97-112] = %u [113-127] = %u [128] = %u\n", + htt_stats_buf->fse_cache_occupancy_peak_cnt[6], + htt_stats_buf->fse_cache_occupancy_peak_cnt[7], + htt_stats_buf->fse_cache_occupancy_peak_cnt[8], + htt_stats_buf->fse_cache_occupancy_peak_cnt[9]); + len += scnprintf(buf + len, buf_len - len, + "Cache occupancy Current Count:\n"); + len += scnprintf(buf + len, buf_len - len, + " [0] = %u [1-16] = %u [17-32] = %u\n", + htt_stats_buf->fse_cache_occupancy_curr_cnt[0], + htt_stats_buf->fse_cache_occupancy_curr_cnt[1], + htt_stats_buf->fse_cache_occupancy_curr_cnt[2]); + len += scnprintf(buf + len, buf_len - len, + "[33-48] = %u [49-64] = %u [65-80] = %u\n", + htt_stats_buf->fse_cache_occupancy_curr_cnt[3], + htt_stats_buf->fse_cache_occupancy_curr_cnt[4], + htt_stats_buf->fse_cache_occupancy_curr_cnt[5]); + len += scnprintf(buf + len, buf_len - len, + "[81-96] = %u [97-112] = %u [113-127] = %u [128] = %u\n", + htt_stats_buf->fse_cache_occupancy_curr_cnt[6], + htt_stats_buf->fse_cache_occupancy_curr_cnt[7], + htt_stats_buf->fse_cache_occupancy_curr_cnt[8], + htt_stats_buf->fse_cache_occupancy_curr_cnt[9]); + len += scnprintf(buf + len, buf_len - len, "Cache search Square Count:\n"); + len += scnprintf(buf + len, buf_len - len, + " [0] = %u [1-50] = %u [51-100] = %u\n", + htt_stats_buf->fse_search_stat_square_cnt[0], + htt_stats_buf->fse_search_stat_square_cnt[1], + htt_stats_buf->fse_search_stat_square_cnt[2]); + len += scnprintf(buf + len, buf_len - len, + "[101-200] = %u [201-255] = %u [256] = %u\n\n", + htt_stats_buf->fse_search_stat_square_cnt[3], + htt_stats_buf->fse_search_stat_square_cnt[4], + htt_stats_buf->fse_search_stat_square_cnt[5]); + + len += scnprintf(buf + len, buf_len - len, + "Cache search Peak Pending Count:\n"); + len += scnprintf(buf + len, buf_len - len, + " [0] = %u [1-2] = %u [3-4] = %u [Greater/Equal to 5] = %u\n", + htt_stats_buf->fse_search_stat_peak_cnt[0], + htt_stats_buf->fse_search_stat_peak_cnt[1], + htt_stats_buf->fse_search_stat_peak_cnt[2], + htt_stats_buf->fse_search_stat_peak_cnt[3]); + len += scnprintf(buf + len, buf_len - len, + "Cache search Number of Pending Count:\n"); + len += scnprintf(buf + len, buf_len - len, + "[0] = %u [1-2] = %u [3-4] = %u [Greater/Equal to 5] = %u\n", + htt_stats_buf->fse_search_stat_search_pending_cnt[0], + htt_stats_buf->fse_search_stat_search_pending_cnt[1], + htt_stats_buf->fse_search_stat_search_pending_cnt[2], + htt_stats_buf->fse_search_stat_search_pending_cnt[3]); + + stats_req->buf_len = len; +} + static inline void htt_print_pdev_tx_rate_txbf_stats_tlv(const void *tag_buf, struct debug_htt_stats_req *stats_req) @@ -4404,6 +4768,30 @@ static int ath11k_dbg_htt_ext_stats_pars case HTT_STATS_RING_BACKPRESSURE_STATS_TAG: htt_print_backpressure_stats_tlv_v(tag_buf, user_data); break; + case HTT_STATS_LATENCY_PROF_STATS_TAG: + htt_print_latency_prof_stats_tlv_v(tag_buf, stats_req); + break; + case HTT_STATS_LATENCY_CTX_TAG: + htt_print_latency_prof_ctx_tlv(tag_buf, stats_req); + break; + case HTT_STATS_LATENCY_CNT_TAG: + htt_print_latency_prof_cnt(tag_buf, stats_req); + break; + case HTT_STATS_RX_PDEV_UL_TRIG_STATS_TAG: + htt_print_ul_ofdma_trigger_stats(tag_buf, stats_req); + break; + case HTT_STATS_RX_PDEV_UL_OFDMA_USER_STATS_TAG: + htt_print_ul_ofdma_user_stats(tag_buf, stats_req); + break; + case HTT_STATS_RX_PDEV_UL_MIMO_USER_STATS_TAG: + htt_print_ul_mimo_user_stats(tag_buf, stats_req); + break; + case HTT_STATS_RX_PDEV_UL_MUMIMO_TRIG_STATS_TAG: + htt_print_ul_mumimo_trig_stats(tag_buf, stats_req); + break; + case HTT_STATS_RX_FSE_STATS_TAG: + htt_print_rx_fse_stats_tlv(tag_buf, stats_req); + break; case HTT_STATS_PDEV_TX_RATE_TXBF_STATS_TAG: htt_print_pdev_tx_rate_txbf_stats_tlv(tag_buf, stats_req); break; --- a/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.h +++ b/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.h @@ -103,6 +103,14 @@ enum htt_tlv_tag_t { HTT_STATS_PDEV_OBSS_PD_TAG = 88, HTT_STATS_HW_WAR_TAG = 89, HTT_STATS_RING_BACKPRESSURE_STATS_TAG = 90, + HTT_STATS_LATENCY_PROF_STATS_TAG = 91, + HTT_STATS_LATENCY_CTX_TAG = 92, + HTT_STATS_LATENCY_CNT_TAG = 93, + HTT_STATS_RX_PDEV_UL_TRIG_STATS_TAG = 94, + HTT_STATS_RX_PDEV_UL_OFDMA_USER_STATS_TAG = 95, + HTT_STATS_RX_PDEV_UL_MIMO_USER_STATS_TAG = 96, + HTT_STATS_RX_PDEV_UL_MUMIMO_TRIG_STATS_TAG = 97, + HTT_STATS_RX_FSE_STATS_TAG = 98, HTT_STATS_PEER_CTRL_PATH_TXRX_STATS_TAG = 101, HTT_STATS_PDEV_TX_RATE_TXBF_STATS_TAG = 108, HTT_STATS_TXBF_OFDMA_NDPA_STATS_TAG = 113, @@ -1312,13 +1320,17 @@ struct htt_tx_pdev_rate_stats_tlv { #define HTT_RX_PDEV_STATS_NUM_LEGACY_CCK_STATS 4 #define HTT_RX_PDEV_STATS_NUM_LEGACY_OFDM_STATS 8 #define HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS 12 +#define HTT_RX_PDEV_STATS_NUM_EMCS_COUNTERS 2 #define HTT_RX_PDEV_STATS_NUM_GI_COUNTERS 4 #define HTT_RX_PDEV_STATS_NUM_DCM_COUNTERS 5 #define HTT_RX_PDEV_STATS_NUM_BW_COUNTERS 4 #define HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS 8 +#define HTT_RX_PDEV_STATS_ULNUM_SPATIAL_STREAMS 8 #define HTT_RX_PDEV_STATS_NUM_PREAMBLE_TYPES HTT_STATS_PREAM_COUNT #define HTT_RX_PDEV_MAX_OFDMA_NUM_USER 8 +#define HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER 8 #define HTT_RX_PDEV_STATS_RXEVM_MAX_PILOTS_PER_NSS 16 +#define HTT_RX_PDEV_STATS_NUM_RU_SIZE_160MHZ_CNTRS 7 #define HTT_RX_PDEV_STATS_NUM_RU_SIZE_COUNTERS 6 #define HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER 8 @@ -1797,6 +1809,105 @@ struct htt_ring_backpressure_stats_tlv { u32 backpressure_hist[5]; }; +#define HTT_LATENCY_PROFILE_MAX_HIST 3 +#define HTT_STATS_MAX_PROF_STATS_NAME_LEN 32 + +struct htt_latency_prof_stats_tlv { + u32 print_header; + u8 latency_prof_name[HTT_STATS_MAX_PROF_STATS_NAME_LEN]; + u32 cnt; + u32 min; + u32 max; + u32 last; + u32 tot; + u32 avg; + u32 hist_intvl; + u32 hist[HTT_LATENCY_PROFILE_MAX_HIST]; +}; + +struct htt_latency_prof_ctx_tlv { + u32 duration; + u32 tx_msdu_cnt; + u32 tx_mpdu_cnt; + u32 tx_ppdu_cnt; + u32 rx_msdu_cnt; + u32 rx_mpdu_cnt; +}; + +struct htt_latency_prof_cnt_tlv { + u32 prof_enable_cnt; +}; + +struct htt_rx_pdev_ul_ofdma_user_stats_tlv { + u32 user_index; + u32 rx_ulofdma_non_data_ppdu; + u32 rx_ulofdma_data_ppdu; + u32 rx_ulofdma_mpdu_ok; + u32 rx_ulofdma_mpdu_fail; + u32 rx_ulofdma_non_data_nusers; + u32 rx_ulofdma_data_nusers; +}; + +struct htt_rx_pdev_ul_trigger_stats_tlv { + u32 mac_id__word; + u32 rx_11ax_ul_ofdma; + u32 ul_ofdma_rx_mcs[HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS]; + u32 ul_ofdma_rx_gi[HTT_RX_PDEV_STATS_NUM_GI_COUNTERS] + [HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS]; + u32 ul_ofdma_rx_nss[HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS]; + u32 ul_ofdma_rx_bw[HTT_RX_PDEV_STATS_NUM_BW_COUNTERS]; + u32 ul_ofdma_rx_stbc; + u32 ul_ofdma_rx_ldpc; + u32 rx_ulofdma_data_ru_size_ppdu[HTT_RX_PDEV_STATS_NUM_RU_SIZE_160MHZ_CNTRS]; + u32 rx_ulofdma_non_data_ru_size_ppdu[HTT_RX_PDEV_STATS_NUM_RU_SIZE_160MHZ_CNTRS]; + u32 ul_ofdma_rx_mcs_ext[HTT_RX_PDEV_STATS_NUM_EMCS_COUNTERS]; + u32 ul_ofdma_rx_gie[HTT_RX_PDEV_STATS_NUM_GI_COUNTERS] + [HTT_RX_PDEV_STATS_NUM_EMCS_COUNTERS]; +}; + +struct htt_rx_pdev_ul_mumimo_trig_stats_tlv { + u32 mac_id__word; + u32 rx_11ax_ul_mumimo; + u32 ul_mumimo_rx_mcs[HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS]; + u32 ul_mumimo_rx_gi[HTT_RX_PDEV_STATS_NUM_GI_COUNTERS] + [HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS]; + u32 ul_mumimo_rx_nss[HTT_RX_PDEV_STATS_ULNUM_SPATIAL_STREAMS]; + u32 ul_mumimo_rx_bw[HTT_RX_PDEV_STATS_NUM_BW_COUNTERS]; + u32 ul_mumimo_rx_stbc; + u32 ul_mumimo_rx_ldpc; + u32 ul_mumimo_rx_mcs_ext[HTT_RX_PDEV_STATS_NUM_EMCS_COUNTERS]; + u32 ul_mumimo_rx_gie[HTT_RX_PDEV_STATS_NUM_GI_COUNTERS] + [HTT_RX_PDEV_STATS_NUM_EMCS_COUNTERS]; +}; + +struct htt_rx_pdev_ul_mimo_user_stats_tlv { + u32 user_index; + u32 rx_ulmumimo_non_data_ppdu; + u32 rx_ulmumimo_data_ppdu; + u32 rx_ulmumimo_mpdu_ok; + u32 rx_ulmumimo_mpdu_fail; +}; + +#define HTT_RX_MAX_PEAK_OCCUPANCY_INDEX 10 +#define HTT_RX_MAX_CURRENT_OCCUPANCY_INDEX 10 +#define HTT_RX_SQUARE_INDEX 6 +#define HTT_RX_MAX_PEAK_SEARCH_INDEX 4 +#define HTT_RX_MAX_PENDING_SEARCH_INDEX 4 + +struct htt_rx_fse_stats_tlv { + u32 fse_enable_cnt; + u32 fse_disable_cnt; + u32 fse_cache_invalidate_entry_cnt; + u32 fse_full_cache_invalidate_cnt; + u32 fse_num_cache_hits_cnt; + u32 fse_num_searches_cnt; + u32 fse_cache_occupancy_peak_cnt[HTT_RX_MAX_PEAK_OCCUPANCY_INDEX]; + u32 fse_cache_occupancy_curr_cnt[HTT_RX_MAX_CURRENT_OCCUPANCY_INDEX]; + u32 fse_search_stat_square_cnt[HTT_RX_SQUARE_INDEX]; + u32 fse_search_stat_peak_cnt[HTT_RX_MAX_PEAK_SEARCH_INDEX]; + u32 fse_search_stat_search_pending_cnt[HTT_RX_MAX_PENDING_SEARCH_INDEX]; +}; + #define HTT_TX_TXBF_RATE_STATS_NUM_MCS_COUNTERS 14 #define HTT_TX_TXBF_RATE_STATS_NUM_BW_COUNTERS 5 #define HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS 8