drivers/net/wireless/ath/ath11k/debugfs.h | 6 +- drivers/net/wireless/ath/ath11k/debugfs_htt_stats.c | 463 ++++++++++++++++++++++ drivers/net/wireless/ath/ath11k/debugfs_htt_stats.h | 108 +++++ 3 files changed, 576 insertions(+), 1 deletion(-) --- a/drivers/net/wireless/ath/ath11k/debugfs.h +++ b/drivers/net/wireless/ath/ath11k/debugfs.h @@ -36,8 +36,12 @@ enum ath11k_dbg_htt_ext_stats_type { ATH11K_DBG_HTT_EXT_STATS_TWT_SESSIONS = 20, ATH11K_DBG_HTT_EXT_STATS_REO_RESOURCE_STATS = 21, ATH11K_DBG_HTT_EXT_STATS_TX_SOUNDING_INFO = 22, - ATH11K_DBG_HTT_EXT_STATS_PDEV_OBSS_PD_STATS = 23, + 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, /* keep this last */ ATH11K_DBG_HTT_NUM_EXT_STATS, --- a/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.c +++ b/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.c @@ -3907,6 +3907,445 @@ static inline void htt_print_backpressur } } +static inline void htt_print_latency_prof_stats_tlv_v(const u32 *tag_buf, u8 *data) +{ + struct debug_htt_stats_req *stats_req = + (struct debug_htt_stats_req *)data; + struct htt_latency_prof_stats_tlv *htt_stats_buf = + (struct htt_latency_prof_stats_tlv *) 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 += HTT_DBG_OUT(buf + len, buf_len - len, + "HTT_STATS_LATENCY_PROF_TLV:"); + len += HTT_DBG_OUT(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|"); + } + + len += HTT_DBG_OUT(buf + len, buf_len - len, + "|%s| %8u| %8u| %8u| %8u| %8u| %8u| %8u| %4u:%4u:%4u|", + 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]); + if (len >= buf_len) { + buf[buf_len - 1] = 0; + stats_req->buf_len = buf_len - 1; + } + else { + buf[len] = 0; + stats_req->buf_len = len;; + } +} + +static inline void htt_print_latency_prof_ctx_tlv(const u32 *tag_buf, + struct debug_htt_stats_req *stats_req) +{ + struct htt_latency_prof_ctx_tlv *htt_stats_buf = + (struct htt_latency_prof_ctx_tlv *) tag_buf; + u8 *buf = stats_req->buf; + u32 len = stats_req->buf_len; + u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE; + + len += HTT_DBG_OUT(buf + len, buf_len - len, "HTT_STATS_LATENCY_CTX_TLV:"); + len += HTT_DBG_OUT(buf + len, buf_len - len,"duration= %u", + htt_stats_buf->duration); + len += HTT_DBG_OUT(buf + len, buf_len - len, + "tx_msdu_cnt = %u", htt_stats_buf->tx_msdu_cnt); + len += HTT_DBG_OUT(buf + len, buf_len - len, + "tx_mpdu_cnt = %u", htt_stats_buf->tx_mpdu_cnt); + len += HTT_DBG_OUT(buf + len, buf_len - len, + "rx_msdu_cnt = %u", htt_stats_buf->rx_msdu_cnt); + len += HTT_DBG_OUT(buf + len, buf_len - len, + "rx_mpdu_cnt = %u", htt_stats_buf->rx_mpdu_cnt); + + if (len >= buf_len) { + buf[buf_len - 1] = 0; + stats_req->buf_len = buf_len - 1; + } + else { + buf[len] = 0; + stats_req->buf_len = len;; + } +} + +static inline void htt_print_latency_prof_cnt(const u32 *tag_buf, + struct debug_htt_stats_req *stats_req) +{ + struct htt_latency_prof_cnt_tlv *htt_stats_buf = + (struct htt_latency_prof_cnt_tlv *)tag_buf; + u8 *buf = stats_req->buf; + u32 len = stats_req->buf_len; + u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE; + + len += HTT_DBG_OUT(buf + len, buf_len - len, "prof_enable_cnt = %u", + htt_stats_buf->prof_enable_cnt); + + if (len >= buf_len) { + buf[buf_len - 1] = 0; + stats_req->buf_len = buf_len - 1; + } + else { + buf[len] = 0; + stats_req->buf_len = len;; + } +} + +static inline void htt_print_ul_mumimo_trig_stats(const u32 *tag_buf, + struct debug_htt_stats_req *stats_req) +{ + struct htt_rx_pdev_ul_mumimo_trig_stats_tlv *htt_ul_mumimo_trig_stats_buf = + (struct htt_rx_pdev_ul_mumimo_trig_stats_tlv *)tag_buf; + u8 *buf = stats_req->buf; + u32 len = stats_req->buf_len; + u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE; + u8 str_buf[HTT_MAX_STRING_LEN]; + u8 j; + + len += HTT_DBG_OUT(buf + len, buf_len - len, + "HTT_RX_PDEV_UL_MUMIMO_TRIG_STATS_TLV:"); + len += HTT_DBG_OUT(buf + len, buf_len - len, "mac_id = %u", + htt_ul_mumimo_trig_stats_buf->mac_id__word & 0xFF); + + len += HTT_DBG_OUT(buf + len, buf_len - len, + "rx_11ax_ul_mumimo = %u", + htt_ul_mumimo_trig_stats_buf->rx_11ax_ul_mumimo); + + memset(str_buf, 0x0, HTT_MAX_STRING_LEN); + ARRAY_TO_STRING(str_buf, htt_ul_mumimo_trig_stats_buf->ul_mumimo_rx_mcs, + HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS); + len += HTT_DBG_OUT(buf + len, buf_len - len, "ul_mumimo_rx_mcs = %s ", str_buf); + memset(str_buf, 0x0, HTT_MAX_STRING_LEN); + ARRAY_TO_STRING(str_buf, htt_ul_mumimo_trig_stats_buf->ul_mumimo_rx_mcs_ext, + HTT_RX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS); + len += HTT_DBG_OUT(buf + len, buf_len - len, "ul_mumimo_ext_rx_mcs = %s ", str_buf); + + for (j = 0; j < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) { + memset(str_buf, 0x0, HTT_MAX_STRING_LEN); + ARRAY_TO_STRING(str_buf, htt_ul_mumimo_trig_stats_buf->ul_mumimo_rx_gi[j], + HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS); + len += HTT_DBG_OUT(buf + len, buf_len - len, "ul_mumimo_rx_gi[%u] = %s ", + j, str_buf); + memset(str_buf, 0x0, HTT_MAX_STRING_LEN); + ARRAY_TO_STRING(str_buf, htt_ul_mumimo_trig_stats_buf->ul_mumimo_rx_gi_ext[j], + HTT_RX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS); + len += HTT_DBG_OUT(buf + len, buf_len - len, "ul_mumimo_rx_gi_ext[%u] = %s ", + j, str_buf); + } + + memset(str_buf, 0x0, HTT_MAX_STRING_LEN); + ARRAY_TO_STRING(str_buf, htt_ul_mumimo_trig_stats_buf->ul_mumimo_rx_nss, + HTT_RX_PDEV_STATS_ULNUM_SPATIAL_STREAMS); + len += HTT_DBG_OUT(buf + len, buf_len - len, "ul_mumimo_rx_nss = %s ", str_buf); + + memset(str_buf, 0x0, HTT_MAX_STRING_LEN); + ARRAY_TO_STRING(str_buf, htt_ul_mumimo_trig_stats_buf->ul_mumimo_rx_bw, + HTT_RX_PDEV_STATS_NUM_BW_COUNTERS); + len += HTT_DBG_OUT(buf + len, buf_len - len, "ul_mumimo_rx_bw = %s ", str_buf); + + len += HTT_DBG_OUT(buf + len, buf_len - len, "ul_mumimo_rx_stbc = %u", + htt_ul_mumimo_trig_stats_buf->ul_mumimo_rx_stbc); + len += HTT_DBG_OUT(buf + len, buf_len - len, "ul_mumimo_rx_ldpc = %u", + htt_ul_mumimo_trig_stats_buf->ul_mumimo_rx_ldpc); + len += HTT_DBG_OUT(buf + len, buf_len - len, "\n"); + + if (len >= buf_len) { + buf[buf_len - 1] = 0; + stats_req->buf_len = buf_len - 1; + } + else { + buf[len] = 0; + stats_req->buf_len = len;; + } +} + +static inline void htt_print_ul_mimo_user_stats(const u32 *tag_buf, + struct debug_htt_stats_req *stats_req) +{ + struct htt_rx_pdev_ul_mimo_user_stats_tlv *htt_ul_user_stats_buf = + (struct htt_rx_pdev_ul_mimo_user_stats_tlv *)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 += HTT_DBG_OUT(buf + len, buf_len - len, + "HTT_STATS_RX_PDEV_UL_MIMO_USER_STATS_TLV"); + } + + len += HTT_DBG_OUT(buf + len, buf_len - len, + "rx_ulmumimo_non_data_ppdu_%u = %u ", + htt_ul_user_stats_buf->user_index, + htt_ul_user_stats_buf->rx_ulmumimo_non_data_ppdu); + + len += HTT_DBG_OUT(buf + len, buf_len - len, + "rx_ulmumimo_data_ppdu_%u = %u ", + htt_ul_user_stats_buf->user_index, + htt_ul_user_stats_buf->rx_ulmumimo_data_ppdu); + + len += HTT_DBG_OUT(buf + len, buf_len - len, + "rx_ulmumimo_mpdu_ok_%u = %u ", + htt_ul_user_stats_buf->user_index, + htt_ul_user_stats_buf->rx_ulmumimo_mpdu_ok); + + len += HTT_DBG_OUT(buf + len, buf_len - len, + "rx_ulmumimo_mpdu_fail_%u = %u", + htt_ul_user_stats_buf->user_index, + htt_ul_user_stats_buf->rx_ulmumimo_mpdu_fail); + } + + if (len >= buf_len) { + buf[buf_len - 1] = 0; + stats_req->buf_len = buf_len - 1; + } + else { + buf[len] = 0; + stats_req->buf_len = len;; + } +} + +static inline void htt_print_ul_ofdma_user_stats(const u32 *tag_buf, + struct debug_htt_stats_req *stats_req) +{ + struct htt_rx_pdev_ul_ofdma_user_stats_tlv *htt_ul_user_stats_buf = + (struct htt_rx_pdev_ul_ofdma_user_stats_tlv *)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 += HTT_DBG_OUT(buf + len, buf_len - len, + "HTT_RX_PDEV_UL_OFDMA_USER_STAS_TLV"); + } + + len += HTT_DBG_OUT(buf + len, buf_len - len, + "rx_ulofdma_non_data_ppdu_%u = %u ", + htt_ul_user_stats_buf->user_index, + htt_ul_user_stats_buf->rx_ulofdma_non_data_ppdu); + len += HTT_DBG_OUT(buf + len, buf_len - len, + "rx_ulofdma_data_ppdu_%u = %u ", + htt_ul_user_stats_buf->user_index, + htt_ul_user_stats_buf->rx_ulofdma_data_ppdu); + len += HTT_DBG_OUT(buf + len, buf_len - len, + "rx_ulofdma_mpdu_ok_%u = %u ", + htt_ul_user_stats_buf->user_index, + htt_ul_user_stats_buf->rx_ulofdma_mpdu_ok); + len += HTT_DBG_OUT(buf + len, buf_len - len, + "rx_ulofdma_mpdu_fail_%u = %u", + htt_ul_user_stats_buf->user_index, + htt_ul_user_stats_buf->rx_ulofdma_mpdu_fail); + len += HTT_DBG_OUT(buf + len, buf_len - len, + "rx_ulofdma_non_data_nusers_%u = %u", + htt_ul_user_stats_buf->user_index, + htt_ul_user_stats_buf->rx_ulofdma_non_data_nusers); + len += HTT_DBG_OUT(buf + len, buf_len - len, + "rx_ulofdma_data_nusers_%u = %u", + htt_ul_user_stats_buf->user_index, + htt_ul_user_stats_buf->rx_ulofdma_data_nusers); + + if (len >= buf_len) { + buf[buf_len - 1] = 0; + stats_req->buf_len = buf_len - 1; + } + else { + buf[len] = 0; + stats_req->buf_len = len;; + } +} + +/* + * htt_print_rx_pdev_ul_ofdma_stats_tlv: display htt_rx_pdev_ul_ofdma_stats_tlv + * @tag_buf: buffer containing the tlv htt_rx_pdev_ul_ofdma_stats_tlv + * + * return:void + */ +static inline void htt_print_ul_ofdma_trigger_stats(const u32 *tag_buf, + struct debug_htt_stats_req *stats_req) +{ + + struct htt_rx_pdev_ul_trigger_stats_tlv *htt_trigger_stats_buf = + (struct htt_rx_pdev_ul_trigger_stats_tlv *)tag_buf; + u8 *buf = stats_req->buf; + u32 len = stats_req->buf_len; + u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE; + u8 str_buf[HTT_MAX_STRING_LEN]; + u8 j; + + len += HTT_DBG_OUT(buf + len, buf_len - len, + "HTT_RX_PDEV_UL_TRIGGER_STATS_TLV:"); + len += HTT_DBG_OUT(buf + len, buf_len - len, "mac_id = %u", + htt_trigger_stats_buf->mac_id__word & 0xFF); + len += HTT_DBG_OUT(buf + len, buf_len - len, "rx_11ax_ul_ofdma =%u", + htt_trigger_stats_buf->rx_11ax_ul_ofdma); + + memset(str_buf, 0x0, HTT_MAX_STRING_LEN); + ARRAY_TO_STRING(str_buf, htt_trigger_stats_buf->ul_ofdma_rx_mcs, + HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS); + len += HTT_DBG_OUT(buf + len, buf_len - len, "ul_ofdma_rx_mcs = %s ", str_buf); + memset(str_buf, 0x0, HTT_MAX_STRING_LEN); + ARRAY_TO_STRING(str_buf, htt_trigger_stats_buf->ul_ofdma_rx_mcs_ext, + HTT_RX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS); + len += HTT_DBG_OUT(buf + len, buf_len - len, "ul_ofdma_rx_mcs_ext = %s ", str_buf); + + + for (j = 0; j < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) { + memset(str_buf, 0x0, HTT_MAX_STRING_LEN); + ARRAY_TO_STRING(str_buf, htt_trigger_stats_buf->ul_ofdma_rx_gi[j], + HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS); + len += HTT_DBG_OUT(buf + len, buf_len - len, "ul_ofdma_rx_gi[%u] = %s ", + j, str_buf); + memset(str_buf, 0x0, HTT_MAX_STRING_LEN); + ARRAY_TO_STRING(str_buf, htt_trigger_stats_buf->ul_ofdma_rx_gi_ext[j], + HTT_RX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS); + len += HTT_DBG_OUT(buf + len, buf_len - len, "ul_ofdma_rx_gi_ext[%u] = %s ", + j, str_buf); + } + + memset(str_buf, 0x0, HTT_MAX_STRING_LEN); + ARRAY_TO_STRING(str_buf, htt_trigger_stats_buf->ul_ofdma_rx_nss, + HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS); + + len += HTT_DBG_OUT(buf + len, buf_len - len, "ul_ofdma_rx_nss = %s ", str_buf); + + memset(str_buf, 0x0, HTT_MAX_STRING_LEN); + ARRAY_TO_STRING(str_buf, htt_trigger_stats_buf->ul_ofdma_rx_bw, + HTT_RX_PDEV_STATS_NUM_BW_COUNTERS); + len += HTT_DBG_OUT(buf + len, buf_len - len, "ul_ofdma_rx_bw = %s ", str_buf); + + len += HTT_DBG_OUT(buf + len, buf_len - len, "ul_ofdma_rx_stbc = %u", + htt_trigger_stats_buf->ul_ofdma_rx_stbc); + len += HTT_DBG_OUT(buf + len, buf_len - len, "ul_ofdma_rx_ldpc = %u", + htt_trigger_stats_buf->ul_ofdma_rx_ldpc); + + memset(str_buf, 0x0, HTT_MAX_STRING_LEN); + ARRAY_TO_STRING(str_buf, htt_trigger_stats_buf->rx_ulofdma_data_ru_size_ppdu, + HTT_RX_PDEV_STATS_NUM_RU_SIZE_COUNTERS); + len += HTT_DBG_OUT(buf + len, buf_len - len, + "rx_ulofdma_non_data_ru_size_ppdu = %s ", str_buf); + memset(str_buf, 0x0, HTT_MAX_STRING_LEN); + ARRAY_TO_STRING(str_buf, htt_trigger_stats_buf->rx_ulofdma_non_data_ru_size_ppdu, + HTT_RX_PDEV_STATS_NUM_RU_SIZE_COUNTERS); + + len += HTT_DBG_OUT(buf + len, buf_len - len, + "rx_ulofdma_data_ru_size_ppdu = %s ", str_buf); + + len += HTT_DBG_OUT(buf + len, buf_len - len, "\n"); + + if (len >= buf_len) { + buf[buf_len - 1] = 0; + stats_req->buf_len = buf_len - 1; + } + else { + buf[len] = 0; + stats_req->buf_len = len;; + } +} + +static inline void htt_print_rx_fse_stats_tlv(const u32 *tag_buf, + struct debug_htt_stats_req *stats_req) +{ + struct htt_rx_fse_stats_tlv *htt_stats_buf = + (struct htt_rx_fse_stats_tlv *)tag_buf; + u8 *buf = stats_req->buf; + u32 len = stats_req->buf_len; + u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE; + + len += HTT_DBG_OUT(buf + len, buf_len - len, "HTT_STATS_RX_FSE_STATS_TLV: \n"); + len += HTT_DBG_OUT(buf + len, buf_len - len, "=== Software RX FSE STATS ===\n"); + len += HTT_DBG_OUT(buf + len, buf_len - len, + "Enable count = %u", htt_stats_buf->fse_enable_cnt); + len += HTT_DBG_OUT(buf + len, buf_len - len, + "Disable count = %u\n", htt_stats_buf->fse_disable_cnt); + len += HTT_DBG_OUT(buf + len, buf_len - len, + "Cache Invalidate Entry Count = %u\n", + htt_stats_buf->fse_cache_invalidate_entry_cnt); + len += HTT_DBG_OUT(buf + len, buf_len - len, + "Full Cache Invalidate Count = %u\n", + htt_stats_buf->fse_full_cache_invalidate_cnt); + len += HTT_DBG_OUT(buf + len, buf_len - len, + "=== Hardware RX FSE STATS ===\n"); + len += HTT_DBG_OUT(buf + len, buf_len - len, "Cache hits Count = %u\n", + htt_stats_buf->fse_num_cache_hits_cnt); + len += HTT_DBG_OUT(buf + len, buf_len - len, "Cache No. of searches = %u\n", + htt_stats_buf->fse_num_searches_cnt); + len += HTT_DBG_OUT(buf + len, buf_len - len, "Cache occupancy Peak Count: \n"); + len += HTT_DBG_OUT(buf + len, buf_len - len, + " [0] = %u [1-16] = %u [17-32] = %u " + "[33-48] = %u [49-64] = %u [65-80] = %u " + "[81-96] = %u [97-112] = %u [113-127] = %u " + "[128] = %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], + 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], + 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 += HTT_DBG_OUT(buf + len, buf_len - len, + "Cache occupancy Current Count: \n"); + len += HTT_DBG_OUT(buf + len, buf_len - len, + " [0] = %u [1-16] = %u [17-32] = %u " + "[33-48] = %u [49-64] = %u [65-80] = %u " + "[81-96] = %u [97-112] = %u [113-127] = %u " + "[128] = %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], + 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], + 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 += HTT_DBG_OUT(buf + len, buf_len - len,"Cache search Square Count: \n"); + len += HTT_DBG_OUT(buf + len, buf_len - len, + " [0] = %u [1-50] = %u [51-100] = %u " + "[101-200] = %u [201-255] = %u [256] = %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], + 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 += HTT_DBG_OUT(buf + len, buf_len - len, + "Cache search Peak Pending Count: \n"); + len += HTT_DBG_OUT(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 += HTT_DBG_OUT(buf + len, buf_len - len, + "Cache search Number of Pending Count: \n"); + len += HTT_DBG_OUT(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]); + + if (len >= buf_len) { + buf[buf_len - 1] = 0; + stats_req->buf_len = buf_len - 1; + } + else { + buf[len] = 0; + stats_req->buf_len = len;; + } +} + static int ath11k_dbg_htt_ext_stats_parse(struct ath11k_base *ab, u16 tag, u16 len, const void *tag_buf, void *user_data) @@ -4258,6 +4697,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, user_data); + 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; default: break; } --- a/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.h +++ b/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.h @@ -102,6 +102,15 @@ 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_SCHED_STATS_TAG = 99, HTT_STATS_MAX_TAG, }; @@ -1228,13 +1237,18 @@ 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_EXTRA_MCS_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 struct htt_rx_pdev_rate_stats_tlv { u32 mac_id__word; @@ -1721,4 +1735,98 @@ static inline int ath11k_debugfs_htt_sta #endif /* CPTCFG_ATH11K_DEBUGFS */ +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_EXTRA_MCS_COUNTERS]; + u32 ul_mumimo_rx_gi_ext[HTT_RX_PDEV_STATS_NUM_GI_COUNTERS][HTT_RX_PDEV_STATS_NUM_EXTRA_MCS_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; +}; + +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_EXTRA_MCS_COUNTERS]; + u32 ul_ofdma_rx_gi_ext[HTT_RX_PDEV_STATS_NUM_GI_COUNTERS][HTT_RX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS]; +}; + +#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; +}; + +#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]; +}; + #endif