wlan-ap-Telecominfraproject/feeds/ipq95xx/mac80211/patches/qca/088-ath11k-add-htt-stats.patch
John Crispin 144c5d00f4 ipq95xx/mac80211: update to ATH12.3-CS
Signed-off-by: John Crispin <john@phrozen.org>
2024-02-28 18:56:21 +01:00

559 lines
22 KiB
Diff

--- 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