mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-12-23 20:31:59 +00:00
2177 lines
79 KiB
Diff
2177 lines
79 KiB
Diff
From f79d9cc6433f64a65ad3c868765c8151d056efa6 Mon Sep 17 00:00:00 2001
|
|
From: Dinesh Karthikeyan <quic_dinek@quicinc.com>
|
|
Date: Mon, 18 Apr 2022 17:51:30 +0530
|
|
Subject: [PATCH] ath12k: Add additional debugfs_htt_stats
|
|
|
|
Add support for new htt stats type:
|
|
|
|
ATH12K_DBG_HTT_EXT_STATS_LATENCY_PROF_STATS
|
|
ATH12K_DBG_HTT_EXT_STATS_PDEV_UL_TRIG_STATS
|
|
ATH12K_DBG_HTT_EXT_STATS_PDEV_UL_MUMIMO_TRIG_STATS
|
|
ATH12K_DBG_HTT_EXT_STATS_FSE_RX
|
|
ATH12K_DBG_HTT_EXT_STATS_PEER_CTRL_PATH_TXRX_STATS
|
|
ATH12K_DBG_HTT_EXT_STATS_PDEV_RX_RATE_EXT
|
|
ATH12K_DBG_HTT_EXT_STATS_PDEV_TX_RATE_TXBF_STATS
|
|
ATH12K_DBG_HTT_EXT_STATS_TXBF_OFDMA
|
|
ATH12K_DBG_HTT_EXT_PHY_COUNTERS_AND_PHY_STATS
|
|
|
|
Signed-off-by: Dinesh Karthikeyan <quic_dinek@quicinc.com>
|
|
---
|
|
drivers/net/wireless/ath/ath12k/core.h | 1 +
|
|
drivers/net/wireless/ath/ath12k/debugfs.h | 9 +
|
|
.../net/wireless/ath/ath12k/debugfs_htt_stats.c | 1396 ++++++++++++++++++++
|
|
.../net/wireless/ath/ath12k/debugfs_htt_stats.h | 397 ++++++
|
|
4 files changed, 1803 insertions(+)
|
|
|
|
Index: backports-20220404-5.4.164-f40abb4788/drivers/net/wireless/ath/ath12k/core.h
|
|
===================================================================
|
|
--- backports-20220404-5.4.164-f40abb4788.orig/drivers/net/wireless/ath/ath12k/core.h 2022-05-11 11:33:20.448154325 +0530
|
|
+++ backports-20220404-5.4.164-f40abb4788/drivers/net/wireless/ath/ath12k/core.h 2022-05-11 11:33:20.448154325 +0530
|
|
@@ -298,6 +298,7 @@
|
|
#define HAL_RX_MAX_NUM_LEGACY_RATES 12
|
|
#define ATH12K_RX_RATE_TABLE_11AX_NUM 576
|
|
#define ATH12K_RX_RATE_TABLE_NUM 320
|
|
+#define ATH12K_STATS_MGMT_FRM_TYPE_MAX 16
|
|
|
|
struct ath12k_rx_peer_rate_stats {
|
|
u64 ht_mcs_count[HAL_RX_MAX_MCS_HT + 1];
|
|
Index: backports-20220404-5.4.164-f40abb4788/drivers/net/wireless/ath/ath12k/debugfs.h
|
|
===================================================================
|
|
--- backports-20220404-5.4.164-f40abb4788.orig/drivers/net/wireless/ath/ath12k/debugfs.h 2022-05-11 11:33:20.448154325 +0530
|
|
+++ backports-20220404-5.4.164-f40abb4788/drivers/net/wireless/ath/ath12k/debugfs.h 2022-05-11 11:34:25.823614153 +0530
|
|
@@ -47,6 +47,7 @@
|
|
ATH12K_DBG_HTT_EXT_STATS_PDEV_RX_RATE_EXT = 30,
|
|
ATH12K_DBG_HTT_EXT_STATS_PDEV_TX_RATE_TXBF = 31,
|
|
ATH12K_DBG_HTT_EXT_STATS_TXBF_OFDMA = 32,
|
|
+ ATH12K_DBG_HTT_EXT_PHY_COUNTERS_AND_PHY_STATS = 37,
|
|
|
|
/* keep this last */
|
|
ATH12K_DBG_HTT_NUM_EXT_STATS,
|
|
Index: backports-20220404-5.4.164-f40abb4788/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c
|
|
===================================================================
|
|
--- backports-20220404-5.4.164-f40abb4788.orig/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c 2022-05-11 11:33:20.448154325 +0530
|
|
+++ backports-20220404-5.4.164-f40abb4788/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c 2022-05-11 11:41:44.459988280 +0530
|
|
@@ -3106,21 +3106,70 @@
|
|
struct debug_htt_stats_req *stats_req)
|
|
{
|
|
const struct htt_rx_pdev_rate_ext_stats_tlv *htt_stats_buf = tag_buf;
|
|
- char str_buf[HTT_MAX_STRING_LEN] = {0};
|
|
u8 *buf = stats_req->buf;
|
|
u32 len = stats_req->buf_len;
|
|
u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
|
|
+ u8 j=0;
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "HTT_RX_PDEV_RATE_EXT_STATS_TLV:\n");
|
|
+ len += scnprintf(buf + len, buf_len - len, "rssi_mcast_in_dbm = %d\n",
|
|
+ htt_stats_buf->rssi_mcast_in_dbm);
|
|
+ len += scnprintf(buf + len, buf_len - len, "rssi_mgmt_in_dbm = %d\n",
|
|
+ htt_stats_buf->rssi_mgmt_in_dbm);
|
|
+
|
|
+ for (j = 0; j < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {
|
|
+ len += scnprintf(buf + len, buf_len - len, "\nrssi_chain_ext[%u] = ", j);
|
|
+ PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rssi_chain_ext[j],
|
|
+ NULL, HTT_RX_PDEV_STATS_NUM_BW_EXT_COUNTERS, "\n");
|
|
+ }
|
|
+
|
|
+ for (j = 0; j < HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "\nrx_per_chain_rssi_ext_in_dbm[%u] = ", j);
|
|
+ PRINT_ARRAY_TO_BUF(buf, len,
|
|
+ htt_stats_buf->rx_per_chain_rssi_ext_in_dbm[j],
|
|
+ "NULL", HTT_RX_PDEV_STATS_NUM_BW_EXT_COUNTERS, "\n");
|
|
+ }
|
|
+
|
|
+ PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_mcs_ext,
|
|
+ "rx_mcs_ext", HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT, "\n");
|
|
+
|
|
+ PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_stbc_ext,
|
|
+ "rx_stbc_ext", HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT, "\n");
|
|
+
|
|
+ for (j = 0; j < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
|
|
+ len += scnprintf(buf + len, buf_len - len, "\nrx_gi_ext[%u] = ", j);
|
|
+ PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_gi_ext[j],
|
|
+ NULL, HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT, "\n");
|
|
+ }
|
|
+
|
|
+ PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ul_ofdma_rx_mcs_ext,
|
|
+ "ul_ofdma_rx_mcs_ext",
|
|
+ HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT, "\n");
|
|
+
|
|
+ for (j = 0; j < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "\nul_ofdma_rx_gi_ext[%u] = ", j);
|
|
+ PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->ul_ofdma_rx_gi_ext[j],
|
|
+ NULL, HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT, "\n");
|
|
+ }
|
|
+
|
|
+ PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_11ax_su_txbf_mcs_ext,
|
|
+ "rx_11ax_su_txbf_mcs_ext",
|
|
+ HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT, "\n");
|
|
+
|
|
+ PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_11ax_mu_txbf_mcs_ext,
|
|
+ "rx_11ax_mu_txbf_mcs_ext",
|
|
+ HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT, "\n");
|
|
+
|
|
+ PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_11ax_dl_ofdma_mcs_ext,
|
|
+ "rx_11ax_dl_ofdma_mcs_ext",
|
|
+ HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT, "\n");
|
|
|
|
- memset(str_buf, 0x0, HTT_MAX_STRING_LEN);
|
|
PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->rx_su_punctured_mode,
|
|
"rx_su_punctured_mode",
|
|
HTT_RX_PDEV_STATS_NUM_PUNCTURED_MODE_COUNTERS, "\n\n");
|
|
|
|
- if (len >= buf_len)
|
|
- buf[buf_len - 1] = 0;
|
|
- else
|
|
- buf[len] = 0;
|
|
-
|
|
stats_req->buf_len = len;
|
|
}
|
|
|
|
@@ -4264,182 +4313,1427 @@
|
|
htt_stats_buf->be_mu_rts_trigger_err);
|
|
}
|
|
|
|
-static int ath12k_dbg_htt_ext_stats_parse(struct ath12k_base *ab,
|
|
- u16 tag, u16 len, const void *tag_buf,
|
|
- void *user_data)
|
|
+static inline void htt_print_latency_prof_stats_tlv_v(const u32 *tag_buf, u8 *data)
|
|
{
|
|
- struct debug_htt_stats_req *stats_req = user_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 = ATH12K_HTT_STATS_BUF_SIZE;
|
|
|
|
- switch (tag) {
|
|
- case HTT_STATS_TX_PDEV_CMN_TAG:
|
|
- htt_print_tx_pdev_stats_cmn_tlv(tag_buf, stats_req);
|
|
- break;
|
|
- case HTT_STATS_TX_PDEV_UNDERRUN_TAG:
|
|
- htt_print_tx_pdev_stats_urrn_tlv_v(tag_buf, len, stats_req);
|
|
- break;
|
|
- case HTT_STATS_TX_PDEV_SIFS_TAG:
|
|
- htt_print_tx_pdev_stats_sifs_tlv_v(tag_buf, len, stats_req);
|
|
- break;
|
|
- case HTT_STATS_TX_PDEV_FLUSH_TAG:
|
|
- htt_print_tx_pdev_stats_flush_tlv_v(tag_buf, len, stats_req);
|
|
- break;
|
|
- case HTT_STATS_TX_PDEV_PHY_ERR_TAG:
|
|
- htt_print_tx_pdev_stats_phy_err_tlv_v(tag_buf, len, stats_req);
|
|
- break;
|
|
- case HTT_STATS_TX_PDEV_SIFS_HIST_TAG:
|
|
- htt_print_tx_pdev_stats_sifs_hist_tlv_v(tag_buf, len, stats_req);
|
|
- break;
|
|
+ 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");
|
|
+ }
|
|
|
|
- case HTT_STATS_TX_PDEV_TX_PPDU_STATS_TAG:
|
|
- htt_print_tx_pdev_stats_tx_ppdu_stats_tlv_v(tag_buf, stats_req);
|
|
- break;
|
|
+ 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]);
|
|
|
|
- case HTT_STATS_TX_PDEV_TRIED_MPDU_CNT_HIST_TAG:
|
|
- htt_print_tx_pdev_stats_tried_mpdu_cnt_hist_tlv_v(tag_buf, len,
|
|
- stats_req);
|
|
- break;
|
|
+ stats_req->buf_len = len;
|
|
+}
|
|
|
|
- case HTT_STATS_STRING_TAG:
|
|
- htt_print_stats_string_tlv(tag_buf, len, stats_req);
|
|
- break;
|
|
+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 = ATH12K_HTT_STATS_BUF_SIZE;
|
|
|
|
- case HTT_STATS_TX_HWQ_CMN_TAG:
|
|
- htt_print_tx_hwq_stats_cmn_tlv(tag_buf, stats_req);
|
|
- break;
|
|
+ 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);
|
|
|
|
- case HTT_STATS_TX_HWQ_DIFS_LATENCY_TAG:
|
|
- htt_print_tx_hwq_difs_latency_stats_tlv_v(tag_buf, len, stats_req);
|
|
- break;
|
|
+ stats_req->buf_len = len;
|
|
+}
|
|
|
|
- case HTT_STATS_TX_HWQ_CMD_RESULT_TAG:
|
|
- htt_print_tx_hwq_cmd_result_stats_tlv_v(tag_buf, len, stats_req);
|
|
- break;
|
|
+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 = ATH12K_HTT_STATS_BUF_SIZE;
|
|
|
|
- case HTT_STATS_TX_HWQ_CMD_STALL_TAG:
|
|
- htt_print_tx_hwq_cmd_stall_stats_tlv_v(tag_buf, len, stats_req);
|
|
- break;
|
|
+ len += scnprintf(buf + len, buf_len - len, "prof_enable_cnt = %u\n",
|
|
+ htt_stats_buf->prof_enable_cnt);
|
|
|
|
- case HTT_STATS_TX_HWQ_FES_STATUS_TAG:
|
|
- htt_print_tx_hwq_fes_result_stats_tlv_v(tag_buf, len, stats_req);
|
|
- break;
|
|
+ stats_req->buf_len = len;
|
|
+}
|
|
|
|
- case HTT_STATS_TX_HWQ_TRIED_MPDU_CNT_HIST_TAG:
|
|
- htt_print_tx_hwq_tried_mpdu_cnt_hist_tlv_v(tag_buf, len, stats_req);
|
|
- break;
|
|
+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 = ATH12K_HTT_STATS_BUF_SIZE;
|
|
+ u32 mac_id = __le32_to_cpu(htt_ul_mumimo_trig_stats_buf->mac_id__word);
|
|
+ u8 j;
|
|
|
|
- case HTT_STATS_TX_HWQ_TXOP_USED_CNT_HIST_TAG:
|
|
- htt_print_tx_hwq_txop_used_cnt_hist_tlv_v(tag_buf, len, stats_req);
|
|
- break;
|
|
- case HTT_STATS_TX_TQM_GEN_MPDU_TAG:
|
|
- htt_print_tx_tqm_gen_mpdu_stats_tlv_v(tag_buf, len, stats_req);
|
|
- break;
|
|
+ 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 = %u\n",
|
|
+ u32_get_bits(mac_id, HTT_STATS_MAC_ID));
|
|
|
|
- case HTT_STATS_TX_TQM_LIST_MPDU_TAG:
|
|
- htt_print_tx_tqm_list_mpdu_stats_tlv_v(tag_buf, len, stats_req);
|
|
- break;
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "rx_11ax_ul_mumimo = %u\n",
|
|
+ htt_ul_mumimo_trig_stats_buf->rx_11ax_ul_mumimo);
|
|
|
|
- case HTT_STATS_TX_TQM_LIST_MPDU_CNT_TAG:
|
|
- htt_print_tx_tqm_list_mpdu_cnt_tlv_v(tag_buf, len, stats_req);
|
|
- break;
|
|
+ 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_rx_mcs_ext",
|
|
+ HTT_RX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS, "\n");
|
|
|
|
- case HTT_STATS_TX_TQM_CMN_TAG:
|
|
- htt_print_tx_tqm_cmn_stats_tlv(tag_buf, len, stats_req);
|
|
- break;
|
|
+ for (j = 0; j < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
|
|
+ len += scnprintf(buf + len, buf_len - len, "\nul_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, ", ");
|
|
+ PRINT_ARRAY_TO_BUF(buf, len,
|
|
+ htt_ul_mumimo_trig_stats_buf->ul_mumimo_rx_gi_ext[j],
|
|
+ NULL, HTT_RX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS, "\n");
|
|
+ }
|
|
|
|
- case HTT_STATS_TX_TQM_PDEV_TAG:
|
|
- htt_print_tx_tqm_pdev_stats_tlv_v(tag_buf, stats_req);
|
|
- break;
|
|
+ PRINT_ARRAY_TO_BUF(buf, len, htt_ul_mumimo_trig_stats_buf->ul_mumimo_rx_nss,
|
|
+ "ul_mumimo_rx_nss",
|
|
+ HTT_RX_PDEV_STATS_ULMUMIMO_NUM_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, "\nul_mumimo_rx_stbc = %u",
|
|
+ htt_ul_mumimo_trig_stats_buf->ul_mumimo_rx_stbc);
|
|
+ len += scnprintf(buf + len, buf_len - len, "\nul_mumimo_rx_ldpc = %u",
|
|
+ htt_ul_mumimo_trig_stats_buf->ul_mumimo_rx_ldpc);
|
|
|
|
- case HTT_STATS_TX_TQM_CMDQ_STATUS_TAG:
|
|
- htt_print_tx_tqm_cmdq_status_tlv(tag_buf, stats_req);
|
|
- break;
|
|
+ for (j = 0; j < HTT_RX_PDEV_STATS_ULMUMIMO_NUM_SPATIAL_STREAMS; j++) {
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "\nrx_ul_mumimo_rssi_in_dbm: chain[%u] = ", j);
|
|
+ PRINT_ARRAY_TO_BUF(buf, len,
|
|
+ htt_ul_mumimo_trig_stats_buf->rx_ul_mumimo_chain_rssi_in_dbm[j],
|
|
+ NULL, HTT_RX_PDEV_STATS_TOTAL_BW_COUNTERS, "\n");
|
|
+ }
|
|
|
|
- case HTT_STATS_TX_DE_EAPOL_PACKETS_TAG:
|
|
- htt_print_tx_de_eapol_packets_stats_tlv(tag_buf, stats_req);
|
|
- break;
|
|
+ for (j = 0; j < HTT_TX_PDEV_STATS_NUM_UL_MUMIMO_USER_STATS; j++) {
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "\nrx_ul_mumimo_target_rssi: user[%u] = ", j);
|
|
+ PRINT_ARRAY_TO_BUF(buf, len,
|
|
+ htt_ul_mumimo_trig_stats_buf->rx_ul_mumimo_target_rssi[j],
|
|
+ NULL, HTT_RX_PDEV_STATS_NUM_BW_COUNTERS, "\n");
|
|
+ }
|
|
|
|
- case HTT_STATS_TX_DE_CLASSIFY_FAILED_TAG:
|
|
- htt_print_tx_de_classify_failed_stats_tlv(tag_buf, stats_req);
|
|
- break;
|
|
+ for (j = 0; j < HTT_TX_PDEV_STATS_NUM_UL_MUMIMO_USER_STATS; j++) {
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "\nrx_ul_mumimo_fd_rssi: user[%u] = ", j);
|
|
+ PRINT_ARRAY_TO_BUF(buf, len,
|
|
+ htt_ul_mumimo_trig_stats_buf->rx_ul_mumimo_fd_rssi[j],
|
|
+ NULL, HTT_RX_PDEV_STATS_ULMUMIMO_NUM_SPATIAL_STREAMS,
|
|
+ "\n");
|
|
+ }
|
|
|
|
- case HTT_STATS_TX_DE_CLASSIFY_STATS_TAG:
|
|
- htt_print_tx_de_classify_stats_tlv(tag_buf, stats_req);
|
|
- break;
|
|
+ for (j = 0; j < HTT_TX_PDEV_STATS_NUM_UL_MUMIMO_USER_STATS; j++) {
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "\nrx_ulmumimo_pilot_evm_db_mean: user [%u] = ", j);
|
|
+ PRINT_ARRAY_TO_BUF(buf, len,
|
|
+ htt_ul_mumimo_trig_stats_buf->rx_ulmumimo_pilot_evm_db_mean[j],
|
|
+ NULL, HTT_RX_PDEV_STATS_ULMUMIMO_NUM_SPATIAL_STREAMS,
|
|
+ "\n");
|
|
+ }
|
|
|
|
- case HTT_STATS_TX_DE_CLASSIFY_STATUS_TAG:
|
|
- htt_print_tx_de_classify_status_stats_tlv(tag_buf, stats_req);
|
|
- break;
|
|
+ len += scnprintf(buf + len, buf_len - len, "\n");
|
|
|
|
- case HTT_STATS_TX_DE_ENQUEUE_PACKETS_TAG:
|
|
- htt_print_tx_de_enqueue_packets_stats_tlv(tag_buf, stats_req);
|
|
- break;
|
|
+ stats_req->buf_len = len;
|
|
+}
|
|
|
|
- case HTT_STATS_TX_DE_ENQUEUE_DISCARD_TAG:
|
|
- htt_print_tx_de_enqueue_discard_stats_tlv(tag_buf, stats_req);
|
|
- break;
|
|
+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 = ATH12K_HTT_STATS_BUF_SIZE;
|
|
|
|
- case HTT_STATS_TX_DE_FW2WBM_RING_FULL_HIST_TAG:
|
|
- htt_print_tx_de_fw2wbm_ring_full_hist_tlv(tag_buf, len, stats_req);
|
|
- break;
|
|
+ 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");
|
|
+ }
|
|
|
|
- case HTT_STATS_TX_DE_CMN_TAG:
|
|
- htt_print_tx_de_cmn_stats_tlv(tag_buf, stats_req);
|
|
- break;
|
|
+ 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);
|
|
|
|
- case HTT_STATS_RING_IF_TAG:
|
|
- htt_print_ring_if_stats_tlv(tag_buf, stats_req);
|
|
- break;
|
|
+ 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);
|
|
|
|
- case HTT_STATS_TX_PDEV_MU_MIMO_STATS_TAG:
|
|
- htt_print_tx_pdev_mu_mimo_sch_stats_tlv(tag_buf, stats_req);
|
|
- break;
|
|
+ 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);
|
|
|
|
- case HTT_STATS_SFM_CMN_TAG:
|
|
- htt_print_sfm_cmn_tlv(tag_buf, stats_req);
|
|
- break;
|
|
+ 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);
|
|
+ }
|
|
|
|
- case HTT_STATS_SRING_STATS_TAG:
|
|
- htt_print_sring_stats_tlv(tag_buf, stats_req);
|
|
- break;
|
|
+ stats_req->buf_len = len;
|
|
+}
|
|
|
|
- case HTT_STATS_RX_PDEV_FW_STATS_TAG:
|
|
- htt_print_rx_pdev_fw_stats_tlv(tag_buf, stats_req);
|
|
- break;
|
|
+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 = ATH12K_HTT_STATS_BUF_SIZE;
|
|
|
|
- case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG:
|
|
- htt_print_rx_pdev_fw_ring_mpdu_err_tlv_v(tag_buf, stats_req);
|
|
- break;
|
|
+ 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");
|
|
+ }
|
|
|
|
- case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG:
|
|
- htt_print_rx_pdev_fw_mpdu_drop_tlv_v(tag_buf, len, stats_req);
|
|
- break;
|
|
+ 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);
|
|
|
|
- case HTT_STATS_RX_SOC_FW_STATS_TAG:
|
|
- htt_print_rx_soc_fw_stats_tlv(tag_buf, stats_req);
|
|
- break;
|
|
+ stats_req->buf_len = len;
|
|
+}
|
|
|
|
- case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG:
|
|
- htt_print_rx_soc_fw_refill_ring_empty_tlv_v(tag_buf, len, stats_req);
|
|
- break;
|
|
+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 = ATH12K_HTT_STATS_BUF_SIZE;
|
|
+ u32 mac_id = __le32_to_cpu(htt_trigger_stats_buf->mac_id__word);
|
|
+ u8 j;
|
|
|
|
- case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG:
|
|
- htt_print_rx_soc_fw_refill_ring_num_refill_tlv_v(
|
|
- tag_buf, len, stats_req);
|
|
- break;
|
|
- case HTT_STATS_RX_REFILL_RXDMA_ERR_TAG:
|
|
- htt_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v(
|
|
- tag_buf, len, stats_req);
|
|
- break;
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "HTT_RX_PDEV_UL_TRIGGER_STATS_TLV:\n");
|
|
+ len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",
|
|
+ u32_get_bits(mac_id, HTT_STATS_MAC_ID));
|
|
+ len += scnprintf(buf + len, buf_len - len, "rx_11ax_ul_ofdma =%u\n",
|
|
+ htt_trigger_stats_buf->rx_11ax_ul_ofdma);
|
|
|
|
- case HTT_STATS_RX_REFILL_REO_ERR_TAG:
|
|
- htt_print_rx_soc_fw_refill_ring_num_reo_err_tlv_v(
|
|
- tag_buf, len, stats_req);
|
|
- break;
|
|
+ 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");
|
|
|
|
- case HTT_STATS_RX_REO_RESOURCE_STATS_TAG:
|
|
- htt_print_rx_reo_debug_stats_tlv_v(
|
|
- tag_buf, stats_req);
|
|
- break;
|
|
+ for (j = 0; j < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
|
|
+ len += scnprintf(buf + len, buf_len - len, "\nul_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");
|
|
+ }
|
|
+
|
|
+ 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");
|
|
+
|
|
+ for (j = 0; j < HTT_RX_PDEV_STATS_NUM_REDUCED_CHAN_TYPES; j++) {
|
|
+ len += scnprintf(buf + len, buf_len - len, j == 0 ?
|
|
+ "\nhalf_ul_ofdma_rx_bw = " :
|
|
+ "\nquarter_ul_ofdma_rx_bw = ");
|
|
+ PRINT_ARRAY_TO_BUF(buf, len,
|
|
+ htt_trigger_stats_buf->reduced_ul_ofdma_rx_bw[j],
|
|
+ NULL, HTT_RX_PDEV_STATS_NUM_BW_COUNTERS, "\n");
|
|
+ }
|
|
+ len += scnprintf(buf + len, buf_len - len, "\nul_ofdma_rx_stbc = %u",
|
|
+ htt_trigger_stats_buf->ul_ofdma_rx_stbc);
|
|
+ len += scnprintf(buf + len, buf_len - len, "\nul_ofdma_rx_ldpc = %u",
|
|
+ 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");
|
|
+
|
|
+ PRINT_ARRAY_TO_BUF(buf, len, htt_trigger_stats_buf->uplink_sta_aid,
|
|
+ "rx_rssi_track_sta_aid", HTT_RX_UL_MAX_UPLINK_RSSI_TRACK,
|
|
+ "\n");
|
|
+
|
|
+ PRINT_ARRAY_TO_BUF(buf, len, htt_trigger_stats_buf->uplink_sta_target_rssi,
|
|
+ "rx_sta_target_rssi", HTT_RX_UL_MAX_UPLINK_RSSI_TRACK, "\n");
|
|
+
|
|
+ PRINT_ARRAY_TO_BUF(buf, len, htt_trigger_stats_buf->uplink_sta_fd_rssi,
|
|
+ "rx_sta_fd_rssi", HTT_RX_UL_MAX_UPLINK_RSSI_TRACK, "\n");
|
|
+
|
|
+ PRINT_ARRAY_TO_BUF(buf, len, htt_trigger_stats_buf->uplink_sta_power_headroom,
|
|
+ "rx_sta_power_headroom", HTT_RX_UL_MAX_UPLINK_RSSI_TRACK,
|
|
+ "\n");
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "\n");
|
|
+
|
|
+ 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 = ATH12K_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 "
|
|
+ "[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 += 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 "
|
|
+ "[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 += 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 "
|
|
+ "[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 += 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)
|
|
+{
|
|
+ const struct htt_pdev_txrate_txbf_stats_tlv *htt_stats_buf = tag_buf;
|
|
+ u8 *buf = stats_req->buf;
|
|
+ u32 len = stats_req->buf_len;
|
|
+ u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
|
|
+ int i, j;
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "HTT_STATS_PDEV_TX_RATE_TXBF_STATS:\n");
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "Legacy OFDM Rates: 6 Mbps: %u, 9 Mbps: %u, 12 Mbps: %u, 18 Mbps: %u\n"
|
|
+ " 24 Mbps: %u, 36 Mbps: %u, 48 Mbps: %u, 54 Mbps: %u\n",
|
|
+ htt_stats_buf->tx_legacy_ofdm_rate[0],
|
|
+ htt_stats_buf->tx_legacy_ofdm_rate[1],
|
|
+ htt_stats_buf->tx_legacy_ofdm_rate[2],
|
|
+ htt_stats_buf->tx_legacy_ofdm_rate[3],
|
|
+ htt_stats_buf->tx_legacy_ofdm_rate[4],
|
|
+ htt_stats_buf->tx_legacy_ofdm_rate[5],
|
|
+ htt_stats_buf->tx_legacy_ofdm_rate[6],
|
|
+ htt_stats_buf->tx_legacy_ofdm_rate[7]);
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "tx_ol_mcs = ");
|
|
+ for (i = 0; i < HTT_TX_TXBF_RATE_STATS_NUM_MCS_COUNTERS; i++)
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "%d:%u,", i, htt_stats_buf->tx_su_ol_mcs[i]);
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "\ntx_ibf_mcs = ");
|
|
+ for (i = 0; i < HTT_TX_TXBF_RATE_STATS_NUM_MCS_COUNTERS; i++)
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "%d:%u,", i, htt_stats_buf->tx_su_ibf_mcs[i]);
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "\ntx_txbf_mcs =");
|
|
+ for (i = 0; i < HTT_TX_TXBF_RATE_STATS_NUM_MCS_COUNTERS; i++)
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "%d:%u,", i, htt_stats_buf->tx_su_txbf_mcs[i]);
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "\ntx_ol_nss = ");
|
|
+ for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++)
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "%d:%u,", i, htt_stats_buf->tx_su_ol_nss[i]);
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "\ntx_ibf_nss = ");
|
|
+ for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++)
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "%d:%u,", i, htt_stats_buf->tx_su_ibf_nss[i]);
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "\ntx_txbf_nss = ");
|
|
+ for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++)
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "%d:%u,", i, htt_stats_buf->tx_su_txbf_nss[i]);
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "\ntx_ol_bw = ");
|
|
+ for (i = 0; i < HTT_TX_TXBF_RATE_STATS_NUM_BW_COUNTERS; i++)
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "%d:%u,", i, htt_stats_buf->tx_su_ol_bw[i]);
|
|
+
|
|
+ for (j = 0; j < HTT_TX_TXBF_RATE_STATS_NUM_REDUCED_CHAN_TYPES; j++) {
|
|
+ len += scnprintf(buf + len, buf_len - len, j == 0 ?
|
|
+ "\nhalf_tx_ol_bw = " : "\nquarter_tx_ol_bw = ");
|
|
+ PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->reduced_tx_su_ol_bw[j],
|
|
+ NULL, HTT_TX_TXBF_RATE_STATS_NUM_BW_COUNTERS, "\n");
|
|
+ }
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "\ntx_ibf_bw = ");
|
|
+ for (i = 0; i < HTT_TX_TXBF_RATE_STATS_NUM_BW_COUNTERS; i++)
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "%d:%u,", i, htt_stats_buf->tx_su_ibf_bw[i]);
|
|
+
|
|
+ for (j = 0; j < HTT_TX_TXBF_RATE_STATS_NUM_REDUCED_CHAN_TYPES; j++) {
|
|
+ len += scnprintf(buf + len, buf_len - len, j == 0 ?
|
|
+ "\nhalf_tx_ibf_bw = " : "\nquarter_tx_ibf_bw = ");
|
|
+ PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->reduced_tx_su_ibf_bw[j],
|
|
+ NULL, HTT_TX_TXBF_RATE_STATS_NUM_BW_COUNTERS, "\n");
|
|
+ }
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "\ntx_txbf_bw = ");
|
|
+ for (i = 0; i < HTT_TX_TXBF_RATE_STATS_NUM_BW_COUNTERS; i++)
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "%d:%u,", i, htt_stats_buf->tx_su_txbf_bw[i]);
|
|
+
|
|
+ for (j = 0; j < HTT_TX_TXBF_RATE_STATS_NUM_REDUCED_CHAN_TYPES; j++) {
|
|
+ len += scnprintf(buf + len, buf_len - len, j == 0 ?
|
|
+ "\nhalf_tx_txbf_bw = " : "\nquarter_tx_txbf_bw = ");
|
|
+ PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->reduced_tx_su_txbf_bw[j],
|
|
+ NULL, HTT_TX_TXBF_RATE_STATS_NUM_BW_COUNTERS, "\n");
|
|
+ }
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "\n");
|
|
+
|
|
+ stats_req->buf_len = len;
|
|
+}
|
|
+
|
|
+static
|
|
+inline void htt_print_txbf_ofdma_ndpa_stats_tlv(const void *tag_buf,
|
|
+ struct debug_htt_stats_req *stats_req)
|
|
+{
|
|
+ const struct htt_txbf_ofdma_ndpa_stats_tlv *htt_stats_buf = tag_buf;
|
|
+ u8 *buf = stats_req->buf;
|
|
+ u32 len = stats_req->buf_len;
|
|
+ u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
|
|
+ int i;
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "HTT_TXBF_OFDMA_NDPA_STATS_TLV:\n");
|
|
+ for (i = 0; i < HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS; i++) {
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "ax_ofdma_ndpa_queued_user%d = %u\n",
|
|
+ i, htt_stats_buf->ax_ofdma_ndpa_queued[i]);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "ax_ofdma_ndpa_tried_user%d = %u\n",
|
|
+ i, htt_stats_buf->ax_ofdma_ndpa_tried[i]);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "ax_ofdma_ndpa_flushed_user%d = %u\n",
|
|
+ i, htt_stats_buf->ax_ofdma_ndpa_flushed[i]);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "ax_ofdma_ndpa_err_user%d = %u\n",
|
|
+ i, htt_stats_buf->ax_ofdma_ndpa_err[i]);
|
|
+ len += scnprintf(buf + len, buf_len - len, "\n");
|
|
+ }
|
|
+
|
|
+ stats_req->buf_len = len;
|
|
+}
|
|
+
|
|
+static
|
|
+inline void htt_print_txbf_ofdma_ndp_stats_tlv(const void *tag_buf,
|
|
+ struct debug_htt_stats_req *stats_req)
|
|
+{
|
|
+ const struct htt_txbf_ofdma_ndp_stats_tlv *htt_stats_buf = tag_buf;
|
|
+ u8 *buf = stats_req->buf;
|
|
+ u32 len = stats_req->buf_len;
|
|
+ u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
|
|
+ int i;
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "HTT_TXBF_OFDMA_NDP_STATS_TLV:\n");
|
|
+ for (i = 0; i < HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS; i++) {
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "ax_ofdma_ndp_queued_user%d = %u\n",
|
|
+ i, htt_stats_buf->ax_ofdma_ndp_queued[i]);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "ax_ofdma_ndp_tried_user%d = %u\n",
|
|
+ i, htt_stats_buf->ax_ofdma_ndp_tried[i]);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "ax_ofdma_ndp_flushed_user%d = %u\n",
|
|
+ i, htt_stats_buf->ax_ofdma_ndp_flushed[i]);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "ax_ofdma_ndp_err_user%d = %u\n",
|
|
+ i, htt_stats_buf->ax_ofdma_ndp_err[i]);
|
|
+ len += scnprintf(buf + len, buf_len - len, "\n");
|
|
+ }
|
|
+
|
|
+ stats_req->buf_len = len;
|
|
+}
|
|
+
|
|
+static
|
|
+inline void htt_print_txbf_ofdma_brp_stats_tlv(const void *tag_buf,
|
|
+ struct debug_htt_stats_req *stats_req)
|
|
+{
|
|
+ const struct htt_txbf_ofdma_brp_stats_tlv *htt_stats_buf = tag_buf;
|
|
+ u8 *buf = stats_req->buf;
|
|
+ u32 len = stats_req->buf_len;
|
|
+ u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
|
|
+ int i;
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "HTT_TXBF_OFDMA_BRP_STATS_TLV:\n");
|
|
+ for (i = 0; i < HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS; i++) {
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "ax_ofdma_brpoll_queued_user%d = %u\n",
|
|
+ i, htt_stats_buf->ax_ofdma_brpoll_queued[i]);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "ax_ofdma_brpoll_tried_user%d = %u\n",
|
|
+ i, htt_stats_buf->ax_ofdma_brpoll_tried[i]);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "ax_ofdma_brpoll_flushed_user%d = %u\n",
|
|
+ i, htt_stats_buf->ax_ofdma_brpoll_flushed[i]);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "ax_ofdma_brp_err_user%d = %u\n",
|
|
+ i, htt_stats_buf->ax_ofdma_brp_err[i]);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "ax_ofdma_brp_err_num_cbf_rcvd_user%d = %u\n",
|
|
+ i, htt_stats_buf->ax_ofdma_brp_err_num_cbf_rcvd[i]);
|
|
+ len += scnprintf(buf + len, buf_len - len, "\n");
|
|
+ }
|
|
+
|
|
+ stats_req->buf_len = len;
|
|
+}
|
|
+
|
|
+static
|
|
+inline void htt_print_txbf_ofdma_steer_stats_tlv(const void *tag_buf,
|
|
+ struct debug_htt_stats_req *stats_req)
|
|
+{
|
|
+ const struct htt_txbf_ofdma_steer_stats_tlv *htt_stats_buf = tag_buf;
|
|
+ u8 *buf = stats_req->buf;
|
|
+ u32 len = stats_req->buf_len;
|
|
+ u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
|
|
+ int i;
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "HTT_TXBF_OFDMA_STEER_STATS_TLV:\n");
|
|
+ for (i = 0; i < HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS; i++) {
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "ax_ofdma_num_ppdu_steer_user%d = %u\n",
|
|
+ i, htt_stats_buf->ax_ofdma_num_ppdu_steer[i]);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "ax_ofdma_num_ppdu_ol_user%d = %u\n",
|
|
+ i, htt_stats_buf->ax_ofdma_num_ppdu_ol[i]);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "ax_ofdma_num_usrs_prefetch_user%d = %u\n",
|
|
+ i, htt_stats_buf->ax_ofdma_num_usrs_prefetch[i]);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "ax_ofdma_num_usrs_sound_user%d = %u\n",
|
|
+ i, htt_stats_buf->ax_ofdma_num_usrs_sound[i]);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "ax_ofdma_num_usrs_force_sound_user%d = %u\n",
|
|
+ i, htt_stats_buf->ax_ofdma_num_usrs_force_sound[i]);
|
|
+ len += scnprintf(buf + len, buf_len - len, "\n");
|
|
+ }
|
|
+
|
|
+ stats_req->buf_len = len;
|
|
+}
|
|
+
|
|
+static inline void
|
|
+htt_print_txbf_ofdma_ax_ndpa_stats_tlv(const void *tag_buf,
|
|
+ struct debug_htt_stats_req *stats_req)
|
|
+{
|
|
+ const struct htt_txbf_ofdma_ax_ndpa_stats_tlv *htt_stats_buf = tag_buf;
|
|
+ u8 *buf = stats_req->buf;
|
|
+ u32 len = stats_req->buf_len;
|
|
+ u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
|
|
+ u32 num_elements = htt_stats_buf->num_elems_ax_ndpa_arr;
|
|
+ int i, null_output;
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "HTT_TXBF_OFDMA_AX_NDPA_STATS_TLV:\n");
|
|
+
|
|
+ null_output = 1;
|
|
+ for (i = 0; i < num_elements; i++) {
|
|
+ if (htt_stats_buf->ax_ndpa[i].ax_ofdma_ndpa_queued) {
|
|
+ null_output = 0;
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ " %u:%u, ", i + 1,
|
|
+ htt_stats_buf->ax_ndpa[i].ax_ofdma_ndpa_queued);
|
|
+ }
|
|
+ }
|
|
+ if (null_output)
|
|
+ len += scnprintf(buf + len, buf_len - len, "ax_ofdma_ndpa_queued = %s\n", "NONE");
|
|
+
|
|
+ null_output = 1;
|
|
+ for (i = 0; i < num_elements; i++) {
|
|
+ if (htt_stats_buf->ax_ndpa[i].ax_ofdma_ndpa_tried) {
|
|
+ null_output = 0;
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ " %u:%u, ", i + 1,
|
|
+ htt_stats_buf->ax_ndpa[i].ax_ofdma_ndpa_tried);
|
|
+ }
|
|
+ }
|
|
+ if (null_output)
|
|
+ len += scnprintf(buf + len, buf_len - len, "ax_ofdma_ndpa_tried = %s\n", "NONE");
|
|
+
|
|
+ null_output = 1;
|
|
+ for (i = 0; i < num_elements; i++) {
|
|
+ if (htt_stats_buf->ax_ndpa[i].ax_ofdma_ndpa_flushed) {
|
|
+ null_output = 0;
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ " %u:%u, ", i + 1,
|
|
+ htt_stats_buf->ax_ndpa[i].ax_ofdma_ndpa_flushed);
|
|
+ }
|
|
+ }
|
|
+ if (null_output)
|
|
+ len += scnprintf(buf + len, buf_len - len, "ax_ofdma_ndpa_flushed = %s\n", "NONE");
|
|
+
|
|
+ null_output = 1;
|
|
+ for (i = 0; i < num_elements; i++) {
|
|
+ if (htt_stats_buf->ax_ndpa[i].ax_ofdma_ndpa_err) {
|
|
+ null_output = 0;
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ " %u:%u, ", i + 1,
|
|
+ htt_stats_buf->ax_ndpa[i].ax_ofdma_ndpa_err);
|
|
+ }
|
|
+ }
|
|
+ if (null_output)
|
|
+ len += scnprintf(buf + len, buf_len - len, "ax_ofdma_ndpa_err = %s\n", "NONE");
|
|
+
|
|
+ stats_req->buf_len = len;
|
|
+}
|
|
+
|
|
+static inline void
|
|
+htt_print_txbf_ofdma_ax_ndp_stats_tlv(const void *tag_buf,
|
|
+ struct debug_htt_stats_req *stats_req)
|
|
+{
|
|
+ const struct htt_txbf_ofdma_ax_ndp_stats_tlv *htt_stats_buf = tag_buf;
|
|
+ u8 *buf = stats_req->buf;
|
|
+ u32 len = stats_req->buf_len;
|
|
+ u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
|
|
+ u32 num_elements = htt_stats_buf->num_elems_ax_ndp_arr;
|
|
+ int i, null_output;
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "HTT_TXBF_OFDMA_AX_NDP_STATS_TLV:\n");
|
|
+
|
|
+ null_output = 1;
|
|
+ for (i = 0; i < num_elements; i++) {
|
|
+ if (htt_stats_buf->ax_ndp[i].ax_ofdma_ndp_queued) {
|
|
+ null_output = 0;
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ " %u:%u, ", i + 1,
|
|
+ htt_stats_buf->ax_ndp[i].ax_ofdma_ndp_queued);
|
|
+ }
|
|
+ }
|
|
+ if (null_output)
|
|
+ len += scnprintf(buf + len, buf_len - len, "ax_ofdma_ndp_queued = %s\n", "NONE");
|
|
+
|
|
+ null_output = 1;
|
|
+ for (i = 0; i < num_elements; i++) {
|
|
+ if (htt_stats_buf->ax_ndp[i].ax_ofdma_ndp_tried) {
|
|
+ null_output = 0;
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ " %u:%u, ", i + 1,
|
|
+ htt_stats_buf->ax_ndp[i].ax_ofdma_ndp_tried);
|
|
+ }
|
|
+ }
|
|
+ if (null_output)
|
|
+ len += scnprintf(buf + len, buf_len - len, "ax_ofdma_ndp_tried = %s\n", "NONE");
|
|
+
|
|
+ null_output = 1;
|
|
+ for (i = 0; i < num_elements; i++) {
|
|
+ if (htt_stats_buf->ax_ndp[i].ax_ofdma_ndp_flushed) {
|
|
+ null_output = 0;
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ " %u:%u, ", i + 1,
|
|
+ htt_stats_buf->ax_ndp[i].ax_ofdma_ndp_flushed);
|
|
+ }
|
|
+ }
|
|
+ if (null_output)
|
|
+ len += scnprintf(buf + len, buf_len - len, "ax_ofdma_ndp_flushed = %s\n", "NONE");
|
|
+
|
|
+ null_output = 1;
|
|
+ for (i = 0; i < num_elements; i++) {
|
|
+ if (htt_stats_buf->ax_ndp[i].ax_ofdma_ndp_err) {
|
|
+ null_output = 0;
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ " %u:%u, ", i + 1,
|
|
+ htt_stats_buf->ax_ndp[i].ax_ofdma_ndp_err);
|
|
+ }
|
|
+ }
|
|
+ if (null_output)
|
|
+ len += scnprintf(buf + len, buf_len - len, "ax_ofdma_ndp_err = %s\n", "NONE");
|
|
+
|
|
+ stats_req->buf_len = len;
|
|
+}
|
|
+
|
|
+static inline void
|
|
+htt_print_txbf_ofdma_ax_brp_stats_tlv(const void *tag_buf,
|
|
+ struct debug_htt_stats_req *stats_req)
|
|
+{
|
|
+ const struct htt_txbf_ofdma_ax_brp_stats_tlv *htt_stats_buf = tag_buf;
|
|
+ u8 *buf = stats_req->buf;
|
|
+ u32 len = stats_req->buf_len;
|
|
+ u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
|
|
+ u32 num_elements = htt_stats_buf->num_elems_ax_brp_arr;
|
|
+ int i, null_output;
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "HTT_TXBF_OFDMA_AX_BRP_STATS_TLV:\n");
|
|
+
|
|
+ null_output = 1;
|
|
+ for (i = 0; i < num_elements; i++) {
|
|
+ if (htt_stats_buf->ax_brp[i].ax_ofdma_brpoll_queued) {
|
|
+ null_output = 0;
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ " %u:%u, ", i + 1,
|
|
+ htt_stats_buf->ax_brp[i].ax_ofdma_brpoll_queued);
|
|
+ }
|
|
+ }
|
|
+ if (null_output)
|
|
+ len += scnprintf(buf + len, buf_len - len, "ax_ofdma_brpoll_queued = %s\n", "NONE");
|
|
+
|
|
+ null_output = 1;
|
|
+ for (i = 0; i < num_elements; i++) {
|
|
+ if (htt_stats_buf->ax_brp[i].ax_ofdma_brpoll_tried) {
|
|
+ null_output = 0;
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ " %u:%u, ", i + 1,
|
|
+ htt_stats_buf->ax_brp[i].ax_ofdma_brpoll_tried);
|
|
+ }
|
|
+ }
|
|
+ if (null_output)
|
|
+ len += scnprintf(buf + len, buf_len - len, "ax_ofdma_brpoll_tried = %s\n", "NONE");
|
|
+
|
|
+ null_output = 1;
|
|
+ for (i = 0; i < num_elements; i++) {
|
|
+ if (htt_stats_buf->ax_brp[i].ax_ofdma_brpoll_flushed) {
|
|
+ null_output = 0;
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ " %u:%u, ", i + 1,
|
|
+ htt_stats_buf->ax_brp[i].ax_ofdma_brpoll_flushed);
|
|
+ }
|
|
+ }
|
|
+ if (null_output)
|
|
+ len += scnprintf(buf + len, buf_len - len, "ax_ofdma_brpoll_flushed = %s\n", "NONE");
|
|
+
|
|
+ null_output = 1;
|
|
+ for (i = 0; i < num_elements; i++) {
|
|
+ if (htt_stats_buf->ax_brp[i].ax_ofdma_brp_err) {
|
|
+ null_output = 0;
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ " %u:%u, ", i + 1,
|
|
+ htt_stats_buf->ax_brp[i].ax_ofdma_brp_err);
|
|
+ }
|
|
+ }
|
|
+ if (null_output)
|
|
+ len += scnprintf(buf + len, buf_len - len, "ax_ofdma_brp_err = %s\n", "NONE");
|
|
+
|
|
+ null_output = 1;
|
|
+ for (i = 0; i < num_elements; i++) {
|
|
+ if (htt_stats_buf->ax_brp[i].ax_ofdma_brp_err_num_cbf_rcvd) {
|
|
+ null_output = 0;
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ " %u:%u, ", i + 1,
|
|
+ htt_stats_buf->ax_brp[i].ax_ofdma_brp_err_num_cbf_rcvd);
|
|
+ }
|
|
+ }
|
|
+ if (null_output)
|
|
+ len += scnprintf(buf + len, buf_len - len, "ax_ofdma_brp_err_num_cbf_rcvd = %s\n", "NONE");
|
|
+
|
|
+ stats_req->buf_len = len;
|
|
+}
|
|
+
|
|
+static inline void
|
|
+htt_print_txbf_ofdma_ax_steer_stats_tlv(const void *tag_buf,
|
|
+ struct debug_htt_stats_req *stats_req)
|
|
+{
|
|
+ const struct htt_txbf_ofdma_ax_steer_stats_tlv *htt_stats_buf = tag_buf;
|
|
+ u8 *buf = stats_req->buf;
|
|
+ u32 len = stats_req->buf_len;
|
|
+ u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
|
|
+ u32 num_elements = htt_stats_buf->num_elems_ax_steer_arr;
|
|
+ int i, null_output;
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "HTT_TXBF_OFDMA_AX_STEER_STATS_TLV:\n");
|
|
+
|
|
+ null_output = 1;
|
|
+ for (i = 0; i < num_elements; i++) {
|
|
+ if (htt_stats_buf->ax_steer[i].ax_ofdma_num_ppdu_steer) {
|
|
+ null_output = 0;
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ " %u:%u, ", i + 1,
|
|
+ htt_stats_buf->ax_steer[i].ax_ofdma_num_ppdu_steer);
|
|
+ }
|
|
+ }
|
|
+ if (null_output)
|
|
+ len += scnprintf(buf + len, buf_len - len, "ax_ofdma_num_ppdu_steer = %s\n", "NONE");
|
|
+
|
|
+ null_output = 1;
|
|
+ for (i = 0; i < num_elements; i++) {
|
|
+ if (htt_stats_buf->ax_steer[i].ax_ofdma_num_usrs_prefetch) {
|
|
+ null_output = 0;
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ " %u:%u, ", i + 1,
|
|
+ htt_stats_buf->ax_steer[i].ax_ofdma_num_usrs_prefetch);
|
|
+ }
|
|
+ }
|
|
+ if (null_output)
|
|
+ len += scnprintf(buf + len, buf_len - len, "ax_ofdma_num_usrs_prefetch = %s\n", "NONE");
|
|
+
|
|
+ null_output = 1;
|
|
+ for (i = 0; i < num_elements; i++) {
|
|
+ if (htt_stats_buf->ax_steer[i].ax_ofdma_num_usrs_sound) {
|
|
+ null_output = 0;
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ " %u:%u, ", i + 1,
|
|
+ htt_stats_buf->ax_steer[i].ax_ofdma_num_usrs_sound);
|
|
+ }
|
|
+ }
|
|
+ if (null_output)
|
|
+ len += scnprintf(buf + len, buf_len - len, "ax_ofdma_num_usrs_sound = %s\n", "NONE");
|
|
+
|
|
+ null_output = 1;
|
|
+ for (i = 0; i < num_elements; i++) {
|
|
+ if (htt_stats_buf->ax_steer[i].ax_ofdma_num_usrs_force_sound) {
|
|
+ null_output = 0;
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ " %u:%u, ", i + 1,
|
|
+ htt_stats_buf->ax_steer[i].ax_ofdma_num_usrs_force_sound);
|
|
+ }
|
|
+ }
|
|
+ if (null_output)
|
|
+ len += scnprintf(buf + len, buf_len - len, "ax_ofdma_num_usrs_force_sound = %s\n", "NONE");
|
|
+
|
|
+ stats_req->buf_len = len;
|
|
+}
|
|
+
|
|
+static inline void htt_print_phy_counters_tlv(const void *tag_buf,
|
|
+ struct debug_htt_stats_req *stats_req)
|
|
+{
|
|
+ const struct htt_phy_counters_tlv *htt_stats_buf = tag_buf;
|
|
+ u8 *buf = stats_req->buf;
|
|
+ u32 len = stats_req->buf_len;
|
|
+ u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
|
|
+ int i;
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "HTT_PHY_COUNTERS_TLV:\n");
|
|
+ len += scnprintf(buf + len, buf_len - len, "rx_ofdma_timing_err_cnt = %u\n",
|
|
+ htt_stats_buf->rx_ofdma_timing_err_cnt);
|
|
+ len += scnprintf(buf + len, buf_len - len, "rx_cck_fail_cnt = %u\n",
|
|
+ htt_stats_buf->rx_cck_fail_cnt);
|
|
+ len += scnprintf(buf + len, buf_len - len, "mactx_abort_cnt = %u\n",
|
|
+ htt_stats_buf->mactx_abort_cnt);
|
|
+ len += scnprintf(buf + len, buf_len - len, "macrx_abort_cnt = %u\n",
|
|
+ htt_stats_buf->macrx_abort_cnt);
|
|
+ len += scnprintf(buf + len, buf_len - len, "phytx_abort_cnt = %u\n",
|
|
+ htt_stats_buf->phytx_abort_cnt);
|
|
+ len += scnprintf(buf + len, buf_len - len, "phyrx_abort_cnt = %u\n",
|
|
+ htt_stats_buf->phyrx_abort_cnt);
|
|
+ len += scnprintf(buf + len, buf_len - len, "phyrx_defer_abort_cnt = %u\n",
|
|
+ htt_stats_buf->phyrx_defer_abort_cnt);
|
|
+ len += scnprintf(buf + len, buf_len - len, "rx_gain_adj_lstf_event_cnt = %u\n",
|
|
+ htt_stats_buf->rx_gain_adj_lstf_event_cnt);
|
|
+ len += scnprintf(buf + len, buf_len - len, "rx_gain_adj_non_legacy_cnt = %u\n",
|
|
+ htt_stats_buf->rx_gain_adj_non_legacy_cnt);
|
|
+
|
|
+ for (i = 0; i < HTT_MAX_RX_PKT_CNT; i++)
|
|
+ len += scnprintf(buf + len, buf_len - len, "rx_pkt_cnt[%d] = %u\n",
|
|
+ i, htt_stats_buf->rx_pkt_cnt[i]);
|
|
+
|
|
+ for (i = 0; i < HTT_MAX_RX_PKT_CRC_PASS_CNT; i++)
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "rx_pkt_crc_pass_cnt[%d] = %u\n",
|
|
+ i, htt_stats_buf->rx_pkt_crc_pass_cnt[i]);
|
|
+
|
|
+ for (i = 0; i < HTT_MAX_PER_BLK_ERR_CNT; i++)
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "per_blk_err_cnt[%d] = %u\n",
|
|
+ i, htt_stats_buf->per_blk_err_cnt[i]);
|
|
+
|
|
+ for (i = 0; i < HTT_MAX_RX_OTA_ERR_CNT; i++)
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "rx_ota_err_cnt[%d] = %u\n",
|
|
+ i, htt_stats_buf->rx_ota_err_cnt[i]);
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "=================================================\n");
|
|
+
|
|
+ stats_req->buf_len = len;
|
|
+}
|
|
+
|
|
+static inline void htt_print_phy_stats_tlv(const void *tag_buf,
|
|
+ struct debug_htt_stats_req *stats_req)
|
|
+{
|
|
+ const struct htt_phy_stats_tlv *htt_stats_buf = tag_buf;
|
|
+ u8 *buf = stats_req->buf;
|
|
+ u32 len = stats_req->buf_len;
|
|
+ u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
|
|
+ int i;
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "HTT_PHY_STATS_TLV:\n");
|
|
+ for (i = 0; i < HTT_STATS_MAX_CHAINS; i++)
|
|
+ len += scnprintf(buf + len, buf_len - len, "bdf_nf_chain[%d] = %d\n",
|
|
+ i, htt_stats_buf->nf_chain[i]);
|
|
+
|
|
+ for (i = 0; i < HTT_STATS_MAX_CHAINS; i++)
|
|
+ len += scnprintf(buf + len, buf_len - len, "runtime_nf_chain[%d] = %d\n",
|
|
+ i, htt_stats_buf->runtime_nf_chain[i]);
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "false_radar_cnt = %u / %u (mins)\n",
|
|
+ htt_stats_buf->false_radar_cnt,
|
|
+ htt_stats_buf->fw_run_time);
|
|
+ len += scnprintf(buf + len, buf_len - len, "radar_cs_cnt = %u\n",
|
|
+ htt_stats_buf->radar_cs_cnt);
|
|
+ len += scnprintf(buf + len, buf_len - len, "ani_level = %d\n",
|
|
+ htt_stats_buf->ani_level);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "=================================================\n");
|
|
+
|
|
+ stats_req->buf_len = len;
|
|
+}
|
|
+
|
|
+static inline void htt_print_phy_reset_counters_tlv(const void *tag_buf,
|
|
+ struct debug_htt_stats_req *stats_req)
|
|
+{
|
|
+ const struct htt_phy_reset_counters_tlv *htt_stats_buf = tag_buf;
|
|
+ u8 *buf = stats_req->buf;
|
|
+ u32 len = stats_req->buf_len;
|
|
+ u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "HTT_PHY_RESET_COUNTERS_TLV:\n");
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "reset_counts : pdev_id = %u\n",
|
|
+ htt_stats_buf->pdev_id);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "reset_counts : cf_active_low_fail_cnt = %u\n",
|
|
+ htt_stats_buf->cf_active_low_fail_cnt);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "reset_counts : cf_active_low_pass_cnt = %u\n",
|
|
+ htt_stats_buf->cf_active_low_pass_cnt);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "reset_counts : phy_off_through_vreg_cnt = %u\n",
|
|
+ htt_stats_buf->phy_off_through_vreg_cnt);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "reset_counts : force_calibration_cnt = %u\n",
|
|
+ htt_stats_buf->force_calibration_cnt);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "reset_counts : rf_mode_switch_phy_off_cnt = %u\n",
|
|
+ htt_stats_buf->rf_mode_switch_phy_off_cnt);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "=================================================\n");
|
|
+
|
|
+ stats_req->buf_len = len;
|
|
+}
|
|
+
|
|
+static inline void htt_print_phy_reset_stats_tlv(const void *tag_buf,
|
|
+ struct debug_htt_stats_req *stats_req)
|
|
+{
|
|
+ const struct htt_phy_reset_stats_tlv *htt_stats_buf = tag_buf;
|
|
+ u8 *buf = stats_req->buf;
|
|
+ u32 len = stats_req->buf_len;
|
|
+ u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "HTT_PHY_RESET_STATS_TLV:\n");
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "reset_stats : pdev_id = %u\n",
|
|
+ htt_stats_buf->pdev_id);
|
|
+ len += scnprintf(buf + len, buf_len - len, "reset_stats : chan_mhz = %u\n",
|
|
+ htt_stats_buf->chan_mhz);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "reset_stats : chan_band_center_freq1 = %u\n",
|
|
+ htt_stats_buf->chan_band_center_freq1);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "reset_stats : chan_band_center_freq2 = %u\n",
|
|
+ htt_stats_buf->chan_band_center_freq2);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "reset_stats : chan_phy_mode = %u\n",
|
|
+ htt_stats_buf->chan_phy_mode);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "reset_stats : chan_flags = 0x%0x\n",
|
|
+ htt_stats_buf->chan_flags);
|
|
+ len += scnprintf(buf + len, buf_len - len, "reset_stats : chan_num = %u\n",
|
|
+ htt_stats_buf->chan_num);
|
|
+ len += scnprintf(buf + len, buf_len - len, "reset_stats : reset_cause = 0x%0x\n",
|
|
+ htt_stats_buf->reset_cause);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "reset_stats : prev_reset_cause = 0x%0x\n",
|
|
+ htt_stats_buf->prev_reset_cause);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "reset_stats : phy_warm_reset_src = 0x%0x\n",
|
|
+ htt_stats_buf->phy_warm_reset_src);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "reset_stats : rx_gain_tbl_mode = %d\n",
|
|
+ htt_stats_buf->rx_gain_tbl_mode);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "reset_stats : xbar_val = 0x%0x\n",
|
|
+ htt_stats_buf->xbar_val);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "reset_stats : force_calibration = %u\n",
|
|
+ htt_stats_buf->force_calibration);
|
|
+ len += scnprintf(buf + len, buf_len - len, "reset_stats : phyrf_mode = %u\n",
|
|
+ htt_stats_buf->phyrf_mode);
|
|
+ len += scnprintf(buf + len, buf_len - len, "reset_stats : phy_homechan = %u\n",
|
|
+ htt_stats_buf->phy_homechan);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "reset_stats : phy_tx_ch_mask = 0x%0x\n",
|
|
+ htt_stats_buf->phy_tx_ch_mask);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "reset_stats : phy_rx_ch_mask = 0x%0x\n",
|
|
+ htt_stats_buf->phy_rx_ch_mask);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "reset_stats : phybb_ini_mask = 0x%0x\n",
|
|
+ htt_stats_buf->phybb_ini_mask);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "reset_stats : phyrf_ini_mask = 0x%0x\n",
|
|
+ htt_stats_buf->phyrf_ini_mask);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "reset_stats : phy_dfs_en_mask = 0x%0x\n",
|
|
+ htt_stats_buf->phy_dfs_en_mask);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "reset_stats : phy_sscan_en_mask = 0x%0x\n",
|
|
+ htt_stats_buf->phy_sscan_en_mask);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "reset_stats : phy_synth_sel_mask = 0x%0x\n",
|
|
+ htt_stats_buf->phy_synth_sel_mask);
|
|
+ len += scnprintf(buf + len, buf_len - len, "reset_stats : phy_adfs_freq = %u\n",
|
|
+ htt_stats_buf->phy_adfs_freq);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "reset_stats : cck_fir_settings = 0x%0x\n",
|
|
+ htt_stats_buf->cck_fir_settings);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "reset_stats : phy_dyn_pri_chan = %u\n",
|
|
+ htt_stats_buf->phy_dyn_pri_chan);
|
|
+ len += scnprintf(buf + len, buf_len - len, "reset_stats : cca_thresh = 0x%0x\n",
|
|
+ htt_stats_buf->cca_thresh);
|
|
+ len += scnprintf(buf + len, buf_len - len, "reset_stats : dyn_cca_status = %u\n",
|
|
+ htt_stats_buf->dyn_cca_status);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "reset_stats : rxdesense_thresh_hw = 0x%x\n",
|
|
+ htt_stats_buf->rxdesense_thresh_hw);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "reset_stats : rxdesense_thresh_sw = 0x%x\n",
|
|
+ htt_stats_buf->rxdesense_thresh_sw);
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "=================================================\n");
|
|
+
|
|
+ stats_req->buf_len = len;
|
|
+}
|
|
+
|
|
+static
|
|
+inline void htt_print_peer_ctrl_path_txrx_stats_tlv(const void *tag_buf,
|
|
+ struct debug_htt_stats_req *stats_req)
|
|
+{
|
|
+ const struct htt_peer_ctrl_path_txrx_stats_tlv *htt_stat_buf = tag_buf;
|
|
+ u8 *buf = stats_req->buf;
|
|
+ u32 len = stats_req->buf_len;
|
|
+ u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
|
|
+ int i;
|
|
+ const char *mgmt_frm_type[ATH12K_STATS_MGMT_FRM_TYPE_MAX] = {"ASSOC_REQ",
|
|
+ "ASSOC_RES",
|
|
+ "REASSOC_REQ",
|
|
+ "REASSOC_RES",
|
|
+ "PRB_REQ", "PRB_RES",
|
|
+ "RESV", "RESV",
|
|
+ "BCN", "ATIM",
|
|
+ "DISASSOC", "AUTH",
|
|
+ "DAUTH", "ACTN",
|
|
+ "RESV", "RESV", };
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "HTT_STATS_PEER_CTRL_PATH_TXRX_STATS_TAG:\n");
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "peer_mac_addr = %02x:%02x:%02x:%02x:%02x:%02x\n",
|
|
+ htt_stat_buf->peer_mac_addr[0], htt_stat_buf->peer_mac_addr[1],
|
|
+ htt_stat_buf->peer_mac_addr[2], htt_stat_buf->peer_mac_addr[3],
|
|
+ htt_stat_buf->peer_mac_addr[4], htt_stat_buf->peer_mac_addr[5]
|
|
+ );
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "peer_tx_mgmt_fc_subtype:\n");
|
|
+ for (i = 0; i < ATH12K_STATS_MGMT_FRM_TYPE_MAX; i++)
|
|
+ len += scnprintf(buf + len, buf_len - len, "\t%s[%d]:%u\n",
|
|
+ mgmt_frm_type[i], i,
|
|
+ htt_stat_buf->peer_rx_mgmt_subtype[i]);
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "peer_rx_mgmt_fc_subtype:\n");
|
|
+ for (i = 0; i < ATH12K_STATS_MGMT_FRM_TYPE_MAX; i++)
|
|
+ len += scnprintf(buf + len, buf_len - len, "\t%s[%d]:%u\n",
|
|
+ mgmt_frm_type[i], i,
|
|
+ htt_stat_buf->peer_rx_mgmt_subtype[i]);
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "\n");
|
|
+
|
|
+ stats_req->buf_len = len;
|
|
+}
|
|
+
|
|
+static
|
|
+inline void htt_print_pdev_ctrl_path_tx_stats_tlv(const void *tag_buf,
|
|
+ struct debug_htt_stats_req *stats_req)
|
|
+{
|
|
+ const struct htt_pdev_ctrl_path_tx_stats_tlv *htt_stats_buf = tag_buf;
|
|
+ u8 *buf = stats_req->buf;
|
|
+ u32 len = stats_req->buf_len;
|
|
+ u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "HTT_STATS_PDEV_CTRL_PATH_TX_STATS_TAG:\n");
|
|
+ PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->fw_tx_mgmt_subtype,
|
|
+ "fw_tx_mgmt_subtype", HTT_STATS_SUBTYPE_MAX, "\n");
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "\n");
|
|
+
|
|
+ stats_req->buf_len = len;
|
|
+}
|
|
+
|
|
+static inline void
|
|
+htt_print_sched_txq_supercycle_trigger_tlv(const void *tag_buf, u16 tag_len,
|
|
+ struct debug_htt_stats_req *stats_req)
|
|
+{
|
|
+ const struct htt_sched_txq_supercycle_triggers_tlv *htt_stats_buf = tag_buf;
|
|
+ u8 *buf = stats_req->buf;
|
|
+ u32 len = stats_req->buf_len;
|
|
+ u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
|
|
+ u16 num_elems = min_t(u16, (tag_len >> 2), HTT_SCHED_SUPERCYCLE_TRIGGER_MAX);
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len,
|
|
+ "HTT_SCHED_TXQ_SUPERCYCLE_TRIGGER_V:\n");
|
|
+ PRINT_ARRAY_TO_BUF(buf, len, htt_stats_buf->supercycle_triggers,
|
|
+ "supercycle_triggers", num_elems, "\n");
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "\n");
|
|
+
|
|
+ stats_req->buf_len = len;
|
|
+}
|
|
+
|
|
+static inline void htt_print_hw_war_tlv(const void *tag_buf, u16 tag_len,
|
|
+ struct debug_htt_stats_req *stats_req)
|
|
+{
|
|
+ const struct htt_hw_war_stats_tlv *htt_stats_buf = tag_buf;
|
|
+ u8 *buf = stats_req->buf;
|
|
+ u32 len = stats_req->buf_len;
|
|
+ u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
|
|
+ u8 i;
|
|
+ u32 mac_id = __le32_to_cpu(htt_stats_buf->mac_id__word);
|
|
+ u32 tag_words = tag_len >> 2;
|
|
+
|
|
+ tag_words--; /* first word beyond TLV header is for mac_id */
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "HTT_HW_WAR_STATS_TLV:\n");
|
|
+ len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",
|
|
+ u32_get_bits(mac_id, HTT_STATS_MAC_ID));
|
|
+
|
|
+ for (i = 0; i < tag_words; i++) {
|
|
+ len += scnprintf(buf + len, buf_len - len, "hw_war %u = %u\n",
|
|
+ i, htt_stats_buf->hw_wars[i]);
|
|
+ }
|
|
+
|
|
+ stats_req->buf_len = len;
|
|
+}
|
|
+
|
|
+static inline void htt_print_peer_sched_stats_tlv(const void *tag_buf,
|
|
+ struct debug_htt_stats_req *stats_req)
|
|
+{
|
|
+ const struct htt_peer_sched_stats_tlv *htt_stats_buf = tag_buf;
|
|
+ u8 *buf = stats_req->buf;
|
|
+ u32 len = stats_req->buf_len;
|
|
+ u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
|
|
+
|
|
+ len += scnprintf(buf + len, buf_len - len, "HTT_PEER_SCHED_STATS_TLV:\n");
|
|
+ len += scnprintf(buf + len, buf_len - len, "peer_id = %u\n",
|
|
+ htt_stats_buf->peer_id);
|
|
+ len += scnprintf(buf + len, buf_len - len, "num_sched_dl = %u\n",
|
|
+ htt_stats_buf->num_sched_dl);
|
|
+ len += scnprintf(buf + len, buf_len - len, "num_sched_ul = %u\n",
|
|
+ htt_stats_buf->num_sched_ul);
|
|
+ len += scnprintf(buf + len, buf_len - len, "peer_tx_active_dur_ms = %llu\n",
|
|
+ (div_u64((htt_stats_buf->peer_tx_active_dur_us_low |
|
|
+ ((unsigned long long)htt_stats_buf->peer_tx_active_dur_us_high << 32)),
|
|
+ 1000)));
|
|
+ len += scnprintf(buf + len, buf_len - len, "peer_rx_active_dur_ms = %llu\n",
|
|
+ (div_u64((htt_stats_buf->peer_rx_active_dur_us_low |
|
|
+ ((unsigned long long)htt_stats_buf->peer_rx_active_dur_us_high << 32)),
|
|
+ 1000)));
|
|
+ len += scnprintf(buf + len, buf_len - len, "peer_curr_rate_kbps = %u\n",
|
|
+ htt_stats_buf->peer_curr_rate_kbps);
|
|
+
|
|
+ stats_req->buf_len = len;
|
|
+}
|
|
+
|
|
+static int ath12k_dbg_htt_ext_stats_parse(struct ath12k_base *ab,
|
|
+ u16 tag, u16 len, const void *tag_buf,
|
|
+ void *user_data)
|
|
+{
|
|
+ struct debug_htt_stats_req *stats_req = user_data;
|
|
+
|
|
+ switch (tag) {
|
|
+ case HTT_STATS_TX_PDEV_CMN_TAG:
|
|
+ htt_print_tx_pdev_stats_cmn_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+ case HTT_STATS_TX_PDEV_UNDERRUN_TAG:
|
|
+ htt_print_tx_pdev_stats_urrn_tlv_v(tag_buf, len, stats_req);
|
|
+ break;
|
|
+ case HTT_STATS_TX_PDEV_SIFS_TAG:
|
|
+ htt_print_tx_pdev_stats_sifs_tlv_v(tag_buf, len, stats_req);
|
|
+ break;
|
|
+ case HTT_STATS_TX_PDEV_FLUSH_TAG:
|
|
+ htt_print_tx_pdev_stats_flush_tlv_v(tag_buf, len, stats_req);
|
|
+ break;
|
|
+ case HTT_STATS_TX_PDEV_PHY_ERR_TAG:
|
|
+ htt_print_tx_pdev_stats_phy_err_tlv_v(tag_buf, len, stats_req);
|
|
+ break;
|
|
+ case HTT_STATS_TX_PDEV_SIFS_HIST_TAG:
|
|
+ htt_print_tx_pdev_stats_sifs_hist_tlv_v(tag_buf, len, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_TX_PDEV_TX_PPDU_STATS_TAG:
|
|
+ htt_print_tx_pdev_stats_tx_ppdu_stats_tlv_v(tag_buf, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_TX_PDEV_TRIED_MPDU_CNT_HIST_TAG:
|
|
+ htt_print_tx_pdev_stats_tried_mpdu_cnt_hist_tlv_v(tag_buf, len,
|
|
+ stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_STRING_TAG:
|
|
+ htt_print_stats_string_tlv(tag_buf, len, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_TX_HWQ_CMN_TAG:
|
|
+ htt_print_tx_hwq_stats_cmn_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_TX_HWQ_DIFS_LATENCY_TAG:
|
|
+ htt_print_tx_hwq_difs_latency_stats_tlv_v(tag_buf, len, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_TX_HWQ_CMD_RESULT_TAG:
|
|
+ htt_print_tx_hwq_cmd_result_stats_tlv_v(tag_buf, len, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_TX_HWQ_CMD_STALL_TAG:
|
|
+ htt_print_tx_hwq_cmd_stall_stats_tlv_v(tag_buf, len, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_TX_HWQ_FES_STATUS_TAG:
|
|
+ htt_print_tx_hwq_fes_result_stats_tlv_v(tag_buf, len, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_TX_HWQ_TRIED_MPDU_CNT_HIST_TAG:
|
|
+ htt_print_tx_hwq_tried_mpdu_cnt_hist_tlv_v(tag_buf, len, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_TX_HWQ_TXOP_USED_CNT_HIST_TAG:
|
|
+ htt_print_tx_hwq_txop_used_cnt_hist_tlv_v(tag_buf, len, stats_req);
|
|
+ break;
|
|
+ case HTT_STATS_TX_TQM_GEN_MPDU_TAG:
|
|
+ htt_print_tx_tqm_gen_mpdu_stats_tlv_v(tag_buf, len, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_TX_TQM_LIST_MPDU_TAG:
|
|
+ htt_print_tx_tqm_list_mpdu_stats_tlv_v(tag_buf, len, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_TX_TQM_LIST_MPDU_CNT_TAG:
|
|
+ htt_print_tx_tqm_list_mpdu_cnt_tlv_v(tag_buf, len, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_TX_TQM_CMN_TAG:
|
|
+ htt_print_tx_tqm_cmn_stats_tlv(tag_buf, len, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_TX_TQM_PDEV_TAG:
|
|
+ htt_print_tx_tqm_pdev_stats_tlv_v(tag_buf, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_TX_TQM_CMDQ_STATUS_TAG:
|
|
+ htt_print_tx_tqm_cmdq_status_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_TX_DE_EAPOL_PACKETS_TAG:
|
|
+ htt_print_tx_de_eapol_packets_stats_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_TX_DE_CLASSIFY_FAILED_TAG:
|
|
+ htt_print_tx_de_classify_failed_stats_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_TX_DE_CLASSIFY_STATS_TAG:
|
|
+ htt_print_tx_de_classify_stats_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_TX_DE_CLASSIFY_STATUS_TAG:
|
|
+ htt_print_tx_de_classify_status_stats_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_TX_DE_ENQUEUE_PACKETS_TAG:
|
|
+ htt_print_tx_de_enqueue_packets_stats_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_TX_DE_ENQUEUE_DISCARD_TAG:
|
|
+ htt_print_tx_de_enqueue_discard_stats_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_TX_DE_FW2WBM_RING_FULL_HIST_TAG:
|
|
+ htt_print_tx_de_fw2wbm_ring_full_hist_tlv(tag_buf, len, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_TX_DE_CMN_TAG:
|
|
+ htt_print_tx_de_cmn_stats_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_RING_IF_TAG:
|
|
+ htt_print_ring_if_stats_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_TX_PDEV_MU_MIMO_STATS_TAG:
|
|
+ htt_print_tx_pdev_mu_mimo_sch_stats_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_SFM_CMN_TAG:
|
|
+ htt_print_sfm_cmn_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_SRING_STATS_TAG:
|
|
+ htt_print_sring_stats_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_RX_PDEV_FW_STATS_TAG:
|
|
+ htt_print_rx_pdev_fw_stats_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG:
|
|
+ htt_print_rx_pdev_fw_ring_mpdu_err_tlv_v(tag_buf, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG:
|
|
+ htt_print_rx_pdev_fw_mpdu_drop_tlv_v(tag_buf, len, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_RX_SOC_FW_STATS_TAG:
|
|
+ htt_print_rx_soc_fw_stats_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG:
|
|
+ htt_print_rx_soc_fw_refill_ring_empty_tlv_v(tag_buf, len, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG:
|
|
+ htt_print_rx_soc_fw_refill_ring_num_refill_tlv_v(
|
|
+ tag_buf, len, stats_req);
|
|
+ break;
|
|
+ case HTT_STATS_RX_REFILL_RXDMA_ERR_TAG:
|
|
+ htt_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v(
|
|
+ tag_buf, len, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_RX_REFILL_REO_ERR_TAG:
|
|
+ htt_print_rx_soc_fw_refill_ring_num_reo_err_tlv_v(
|
|
+ tag_buf, len, stats_req);
|
|
+ break;
|
|
+
|
|
+ case HTT_STATS_RX_REO_RESOURCE_STATS_TAG:
|
|
+ htt_print_rx_reo_debug_stats_tlv_v(
|
|
+ tag_buf, stats_req);
|
|
+ break;
|
|
case HTT_STATS_RX_PDEV_FW_STATS_PHY_ERR_TAG:
|
|
htt_print_rx_pdev_fw_stats_phy_err_tlv(tag_buf, stats_req);
|
|
break;
|
|
@@ -4616,6 +5910,9 @@
|
|
case HTT_STATS_PDEV_OBSS_PD_TAG:
|
|
htt_print_pdev_obss_pd_stats_tlv_v(tag_buf, stats_req);
|
|
break;
|
|
+ case HTT_STATS_HW_WAR_TAG:
|
|
+ htt_print_hw_war_tlv(tag_buf, len, stats_req);
|
|
+ break;
|
|
case HTT_STATS_RING_BACKPRESSURE_STATS_TAG:
|
|
htt_print_backpressure_stats_tlv_v(tag_buf, user_data);
|
|
break;
|
|
@@ -4662,6 +5959,81 @@
|
|
case HTT_STATS_TX_PDEV_BE_RATE_STATS_TAG:
|
|
htt_print_tx_pdev_be_rate_stats_tlv(tag_buf, stats_req);
|
|
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;
|
|
+ case HTT_STATS_PEER_SCHED_STATS_TAG:
|
|
+ htt_print_peer_sched_stats_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+ case HTT_STATS_SCHED_TXQ_SUPERCYCLE_TRIGGER_TAG:
|
|
+ htt_print_sched_txq_supercycle_trigger_tlv(tag_buf, len, stats_req);
|
|
+ break;
|
|
+ case HTT_STATS_PDEV_CTRL_PATH_TX_STATS_TAG:
|
|
+ htt_print_pdev_ctrl_path_tx_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;
|
|
+ case HTT_STATS_TXBF_OFDMA_NDPA_STATS_TAG:
|
|
+ htt_print_txbf_ofdma_ndpa_stats_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+ case HTT_STATS_TXBF_OFDMA_NDP_STATS_TAG:
|
|
+ htt_print_txbf_ofdma_ndp_stats_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+ case HTT_STATS_TXBF_OFDMA_BRP_STATS_TAG:
|
|
+ htt_print_txbf_ofdma_brp_stats_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+ case HTT_STATS_TXBF_OFDMA_STEER_STATS_TAG:
|
|
+ htt_print_txbf_ofdma_steer_stats_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+ case HTT_STATS_PHY_COUNTERS_TAG:
|
|
+ htt_print_phy_counters_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+ case HTT_STATS_PHY_STATS_TAG:
|
|
+ htt_print_phy_stats_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+ case HTT_STATS_PHY_RESET_COUNTERS_TAG:
|
|
+ htt_print_phy_reset_counters_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+ case HTT_STATS_PHY_RESET_STATS_TAG:
|
|
+ htt_print_phy_reset_stats_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+ case HTT_STATS_PEER_CTRL_PATH_TXRX_STATS_TAG:
|
|
+ htt_print_peer_ctrl_path_txrx_stats_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+ case HTT_STATS_TXBF_OFDMA_AX_NDPA_STATS_TAG:
|
|
+ htt_print_txbf_ofdma_ax_ndpa_stats_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+ case HTT_STATS_TXBF_OFDMA_AX_NDP_STATS_TAG:
|
|
+ htt_print_txbf_ofdma_ax_ndp_stats_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+ case HTT_STATS_TXBF_OFDMA_AX_BRP_STATS_TAG:
|
|
+ htt_print_txbf_ofdma_ax_brp_stats_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
+ case HTT_STATS_TXBF_OFDMA_AX_STEER_STATS_TAG:
|
|
+ htt_print_txbf_ofdma_ax_steer_stats_tlv(tag_buf, stats_req);
|
|
+ break;
|
|
|
|
default:
|
|
break;
|
|
Index: backports-20220404-5.4.164-f40abb4788/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.h
|
|
===================================================================
|
|
--- backports-20220404-5.4.164-f40abb4788.orig/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.h 2022-05-11 11:33:20.448154325 +0530
|
|
+++ backports-20220404-5.4.164-f40abb4788/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.h 2022-05-11 11:37:02.838316537 +0530
|
|
@@ -116,6 +116,15 @@
|
|
HTT_STATS_PEER_CTRL_PATH_TXRX_STATS_TAG = 101,
|
|
HTT_STATS_PDEV_CTRL_PATH_TX_STATS_TAG = 102,
|
|
HTT_STATS_RX_PDEV_RATE_EXT_STATS_TAG = 103,
|
|
+ HTT_STATS_PDEV_TX_RATE_TXBF_STATS_TAG = 108,
|
|
+ HTT_STATS_TXBF_OFDMA_NDPA_STATS_TAG = 113,
|
|
+ HTT_STATS_TXBF_OFDMA_NDP_STATS_TAG = 114,
|
|
+ HTT_STATS_TXBF_OFDMA_BRP_STATS_TAG = 115,
|
|
+ HTT_STATS_TXBF_OFDMA_STEER_STATS_TAG = 116,
|
|
+ HTT_STATS_PHY_COUNTERS_TAG = 121,
|
|
+ HTT_STATS_PHY_STATS_TAG = 122,
|
|
+ HTT_STATS_PHY_RESET_COUNTERS_TAG = 123,
|
|
+ HTT_STATS_PHY_RESET_STATS_TAG = 124,
|
|
/* 11be stats */
|
|
HTT_STATS_TX_PDEV_BE_RATE_STATS_TAG = 131,
|
|
HTT_STATS_AST_ENTRY_TAG = 132,
|
|
@@ -130,6 +139,10 @@
|
|
HTT_STATS_RX_PDEV_BE_UL_MIMO_USER_STATS_TAG = 141,
|
|
HTT_STATS_RX_RING_STATS_TAG = 142,
|
|
HTT_STATS_RX_PDEV_BE_UL_TRIG_STATS_TAG = 143,
|
|
+ HTT_STATS_TXBF_OFDMA_AX_NDPA_STATS_TAG = 147,
|
|
+ HTT_STATS_TXBF_OFDMA_AX_NDP_STATS_TAG = 148,
|
|
+ HTT_STATS_TXBF_OFDMA_AX_BRP_STATS_TAG = 149,
|
|
+ HTT_STATS_TXBF_OFDMA_AX_STEER_STATS_TAG = 150,
|
|
|
|
HTT_STATS_MAX_TAG,
|
|
};
|
|
@@ -2395,4 +2408,354 @@
|
|
|
|
#endif /* CPTCFG_ATH12K_DEBUGFS */
|
|
|
|
+#define HTT_RX_PDEV_STATS_NUM_REDUCED_CHAN_TYPES 2
|
|
+
|
|
+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_ULMUMIMO_NUM_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];
|
|
+ s8 rx_ul_mumimo_chain_rssi_in_dbm[HTT_RX_PDEV_STATS_ULMUMIMO_NUM_SPATIAL_STREAMS]
|
|
+ [HTT_RX_PDEV_STATS_TOTAL_BW_COUNTERS];
|
|
+ s8 rx_ul_mumimo_target_rssi[HTT_TX_PDEV_STATS_NUM_UL_MUMIMO_USER_STATS]
|
|
+ [HTT_RX_PDEV_STATS_NUM_BW_COUNTERS];
|
|
+ s8 rx_ul_mumimo_fd_rssi[HTT_TX_PDEV_STATS_NUM_UL_MUMIMO_USER_STATS]
|
|
+ [HTT_RX_PDEV_STATS_ULMUMIMO_NUM_SPATIAL_STREAMS];
|
|
+ s8 rx_ulmumimo_pilot_evm_db_mean[HTT_TX_PDEV_STATS_NUM_UL_MUMIMO_USER_STATS]
|
|
+ [HTT_RX_PDEV_STATS_ULMUMIMO_NUM_SPATIAL_STREAMS];
|
|
+ u32 reduced_ul_mumimo_rx_bw[HTT_RX_PDEV_STATS_NUM_REDUCED_CHAN_TYPES]
|
|
+ [HTT_RX_PDEV_STATS_NUM_BW_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;
|
|
+};
|
|
+
|
|
+#define HTT_RX_UL_MAX_UPLINK_RSSI_TRACK 5
|
|
+
|
|
+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 uplink_sta_aid[HTT_RX_UL_MAX_UPLINK_RSSI_TRACK];
|
|
+ u32 uplink_sta_target_rssi[HTT_RX_UL_MAX_UPLINK_RSSI_TRACK];
|
|
+ u32 uplink_sta_fd_rssi[HTT_RX_UL_MAX_UPLINK_RSSI_TRACK];
|
|
+ u32 uplink_sta_power_headroom[HTT_RX_UL_MAX_UPLINK_RSSI_TRACK];
|
|
+ u32 reduced_ul_ofdma_rx_bw[HTT_RX_PDEV_STATS_NUM_REDUCED_CHAN_TYPES]
|
|
+ [HTT_RX_PDEV_STATS_NUM_BW_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];
|
|
+};
|
|
+
|
|
+/* == PDEV RX RATE EXT STATS == */
|
|
+#define HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT 14
|
|
+/* HTT_RX_PEER_STATS_NUM_BW_EXT_COUNTERS:
|
|
+ * bw index 4 (bw ext index 0): rssi_ext80_low20_chain0
|
|
+ * bw index 5 (bw ext index 1): rssi_ext80_low_high20_chain0
|
|
+ * bw index 6 (bw ext index 2): rssi_ext80_high_low20_chain0
|
|
+ * bw index 7 (bw ext index 3): rssi_ext80_high20_chain0
|
|
+ */
|
|
+#define HTT_RX_PEER_STATS_NUM_BW_EXT_COUNTERS 4
|
|
+#define HTT_RX_PDEV_STATS_NUM_BW_EXT_COUNTERS 4
|
|
+#define HTT_TX_TXBF_RATE_STATS_NUM_MCS_COUNTERS 14
|
|
+#define HTT_TX_TXBF_RATE_STATS_NUM_BW_COUNTERS 5
|
|
+
|
|
+#define HTT_TX_TXBF_RATE_STATS_NUM_REDUCED_CHAN_TYPES 2
|
|
+
|
|
+struct htt_pdev_txrate_txbf_stats_tlv {
|
|
+ u32 tx_su_txbf_mcs[HTT_TX_TXBF_RATE_STATS_NUM_MCS_COUNTERS];
|
|
+ u32 tx_su_ibf_mcs[HTT_TX_TXBF_RATE_STATS_NUM_MCS_COUNTERS];
|
|
+ u32 tx_su_ol_mcs[HTT_TX_TXBF_RATE_STATS_NUM_MCS_COUNTERS];
|
|
+ u32 tx_su_txbf_nss[HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS];
|
|
+ u32 tx_su_ibf_nss[HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS];
|
|
+ u32 tx_su_ol_nss[HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS];
|
|
+ u32 tx_su_txbf_bw[HTT_TX_TXBF_RATE_STATS_NUM_BW_COUNTERS];
|
|
+ u32 tx_su_ibf_bw[HTT_TX_TXBF_RATE_STATS_NUM_BW_COUNTERS];
|
|
+ u32 tx_su_ol_bw[HTT_TX_TXBF_RATE_STATS_NUM_BW_COUNTERS];
|
|
+ u32 tx_legacy_ofdm_rate[HTT_TX_PDEV_STATS_NUM_LEGACY_OFDM_STATS];
|
|
+ u32 reduced_tx_su_txbf_bw[HTT_TX_TXBF_RATE_STATS_NUM_REDUCED_CHAN_TYPES]
|
|
+ [HTT_TX_TXBF_RATE_STATS_NUM_BW_COUNTERS];
|
|
+ u32 reduced_tx_su_ibf_bw[HTT_TX_TXBF_RATE_STATS_NUM_REDUCED_CHAN_TYPES]
|
|
+ [HTT_TX_TXBF_RATE_STATS_NUM_BW_COUNTERS];
|
|
+ u32 reduced_tx_su_ol_bw[HTT_TX_TXBF_RATE_STATS_NUM_REDUCED_CHAN_TYPES]
|
|
+ [HTT_TX_TXBF_RATE_STATS_NUM_BW_COUNTERS];
|
|
+};
|
|
+
|
|
+struct htt_txbf_ofdma_ndpa_stats_tlv {
|
|
+ u32 ax_ofdma_ndpa_queued[HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS];
|
|
+ u32 ax_ofdma_ndpa_tried[HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS];
|
|
+ u32 ax_ofdma_ndpa_flushed[HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS];
|
|
+ u32 ax_ofdma_ndpa_err[HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS];
|
|
+};
|
|
+
|
|
+struct htt_txbf_ofdma_ndp_stats_tlv {
|
|
+ u32 ax_ofdma_ndp_queued[HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS];
|
|
+ u32 ax_ofdma_ndp_tried[HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS];
|
|
+ u32 ax_ofdma_ndp_flushed[HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS];
|
|
+ u32 ax_ofdma_ndp_err[HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS];
|
|
+};
|
|
+
|
|
+struct htt_txbf_ofdma_brp_stats_tlv {
|
|
+ u32 ax_ofdma_brpoll_queued[HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS];
|
|
+ u32 ax_ofdma_brpoll_tried[HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS];
|
|
+ u32 ax_ofdma_brpoll_flushed[HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS];
|
|
+ u32 ax_ofdma_brp_err[HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS];
|
|
+ u32 ax_ofdma_brp_err_num_cbf_rcvd[HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS + 1];
|
|
+};
|
|
+
|
|
+struct htt_txbf_ofdma_steer_stats_tlv {
|
|
+ u32 ax_ofdma_num_ppdu_steer[HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS];
|
|
+ u32 ax_ofdma_num_ppdu_ol[HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS];
|
|
+ u32 ax_ofdma_num_usrs_prefetch[HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS];
|
|
+ u32 ax_ofdma_num_usrs_sound[HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS];
|
|
+ u32 ax_ofdma_num_usrs_force_sound[HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS];
|
|
+};
|
|
+
|
|
+struct htt_txbf_ofdma_ax_ndpa_stats_elem_t {
|
|
+ u32 ax_ofdma_ndpa_queued;
|
|
+ u32 ax_ofdma_ndpa_tried;
|
|
+ u32 ax_ofdma_ndpa_flushed;
|
|
+ u32 ax_ofdma_ndpa_err;
|
|
+};
|
|
+
|
|
+struct htt_txbf_ofdma_ax_ndpa_stats_tlv {
|
|
+ u32 num_elems_ax_ndpa_arr;
|
|
+ u32 arr_elem_size_ax_ndpa;
|
|
+ struct htt_txbf_ofdma_ax_ndpa_stats_elem_t ax_ndpa[1];
|
|
+};
|
|
+
|
|
+struct htt_txbf_ofdma_ax_ndp_stats_elem_t {
|
|
+ u32 ax_ofdma_ndp_queued;
|
|
+ u32 ax_ofdma_ndp_tried;
|
|
+ u32 ax_ofdma_ndp_flushed;
|
|
+ u32 ax_ofdma_ndp_err;
|
|
+};
|
|
+
|
|
+struct htt_txbf_ofdma_ax_ndp_stats_tlv {
|
|
+ u32 num_elems_ax_ndp_arr;
|
|
+ u32 arr_elem_size_ax_ndp;
|
|
+ struct htt_txbf_ofdma_ax_ndp_stats_elem_t ax_ndp[1];
|
|
+};
|
|
+
|
|
+struct htt_txbf_ofdma_ax_brp_stats_elem_t {
|
|
+ u32 ax_ofdma_brpoll_queued;
|
|
+ u32 ax_ofdma_brpoll_tried;
|
|
+ u32 ax_ofdma_brpoll_flushed;
|
|
+ u32 ax_ofdma_brp_err;
|
|
+ u32 ax_ofdma_brp_err_num_cbf_rcvd;
|
|
+};
|
|
+
|
|
+struct htt_txbf_ofdma_ax_brp_stats_tlv {
|
|
+ u32 num_elems_ax_brp_arr;
|
|
+ u32 arr_elem_size_ax_brp;
|
|
+ struct htt_txbf_ofdma_ax_brp_stats_elem_t ax_brp[1];
|
|
+};
|
|
+
|
|
+struct htt_txbf_ofdma_ax_steer_stats_elem_t {
|
|
+ u32 ax_ofdma_num_ppdu_steer;
|
|
+ u32 ax_ofdma_num_ppdu_ol;
|
|
+ u32 ax_ofdma_num_usrs_prefetch;
|
|
+ u32 ax_ofdma_num_usrs_sound;
|
|
+ u32 ax_ofdma_num_usrs_force_sound;
|
|
+};
|
|
+
|
|
+struct htt_txbf_ofdma_ax_steer_stats_tlv {
|
|
+ u32 num_elems_ax_steer_arr;
|
|
+ u32 arr_elem_size_ax_steer;
|
|
+ struct htt_txbf_ofdma_ax_steer_stats_elem_t ax_steer[1];
|
|
+};
|
|
+
|
|
+#define HTT_MAX_RX_PKT_CNT 8
|
|
+#define HTT_MAX_RX_PKT_CRC_PASS_CNT 8
|
|
+#define HTT_MAX_PER_BLK_ERR_CNT 20
|
|
+#define HTT_MAX_RX_OTA_ERR_CNT 14
|
|
+#define HTT_STATS_MAX_CHAINS 8
|
|
+
|
|
+struct htt_phy_counters_tlv {
|
|
+ u32 rx_ofdma_timing_err_cnt;
|
|
+ u32 rx_cck_fail_cnt;
|
|
+ u32 mactx_abort_cnt;
|
|
+ u32 macrx_abort_cnt;
|
|
+ u32 phytx_abort_cnt;
|
|
+ u32 phyrx_abort_cnt;
|
|
+ u32 phyrx_defer_abort_cnt;
|
|
+ u32 rx_gain_adj_lstf_event_cnt;
|
|
+ u32 rx_gain_adj_non_legacy_cnt;
|
|
+ u32 rx_pkt_cnt[HTT_MAX_RX_PKT_CNT];
|
|
+ u32 rx_pkt_crc_pass_cnt[HTT_MAX_RX_PKT_CRC_PASS_CNT];
|
|
+ u32 per_blk_err_cnt[HTT_MAX_PER_BLK_ERR_CNT];
|
|
+ u32 rx_ota_err_cnt[HTT_MAX_RX_OTA_ERR_CNT];
|
|
+};
|
|
+
|
|
+struct htt_phy_stats_tlv {
|
|
+ s32 nf_chain[HTT_STATS_MAX_CHAINS];
|
|
+ u32 false_radar_cnt;
|
|
+ u32 radar_cs_cnt;
|
|
+ s32 ani_level;
|
|
+ u32 fw_run_time;
|
|
+ s32 runtime_nf_chain[HTT_STATS_MAX_CHAINS];
|
|
+};
|
|
+
|
|
+struct htt_phy_reset_counters_tlv {
|
|
+ u32 pdev_id;
|
|
+ u32 cf_active_low_fail_cnt;
|
|
+ u32 cf_active_low_pass_cnt;
|
|
+ u32 phy_off_through_vreg_cnt;
|
|
+ u32 force_calibration_cnt;
|
|
+ u32 rf_mode_switch_phy_off_cnt;
|
|
+};
|
|
+
|
|
+struct htt_phy_reset_stats_tlv {
|
|
+ u32 pdev_id;
|
|
+ u32 chan_mhz;
|
|
+ u32 chan_band_center_freq1;
|
|
+ u32 chan_band_center_freq2;
|
|
+ u32 chan_phy_mode;
|
|
+ u32 chan_flags;
|
|
+ u32 chan_num;
|
|
+ u32 reset_cause;
|
|
+ u32 prev_reset_cause;
|
|
+ u32 phy_warm_reset_src;
|
|
+ u32 rx_gain_tbl_mode;
|
|
+ u32 xbar_val;
|
|
+ u32 force_calibration;
|
|
+ u32 phyrf_mode;
|
|
+ u32 phy_homechan;
|
|
+ u32 phy_tx_ch_mask;
|
|
+ u32 phy_rx_ch_mask;
|
|
+ u32 phybb_ini_mask;
|
|
+ u32 phyrf_ini_mask;
|
|
+ u32 phy_dfs_en_mask;
|
|
+ u32 phy_sscan_en_mask;
|
|
+ u32 phy_synth_sel_mask;
|
|
+ u32 phy_adfs_freq;
|
|
+ u32 cck_fir_settings;
|
|
+ u32 phy_dyn_pri_chan;
|
|
+ u32 cca_thresh;
|
|
+ u32 dyn_cca_status;
|
|
+ u32 rxdesense_thresh_hw;
|
|
+ u32 rxdesense_thresh_sw;
|
|
+};
|
|
+
|
|
+struct htt_peer_ctrl_path_txrx_stats_tlv {
|
|
+ u8 peer_mac_addr[6];
|
|
+ u8 rsvd[2];
|
|
+ u32 peer_tx_mgmt_subtype[ATH12K_STATS_MGMT_FRM_TYPE_MAX];
|
|
+ u32 peer_rx_mgmt_subtype[ATH12K_STATS_MGMT_FRM_TYPE_MAX];
|
|
+};
|
|
+
|
|
+struct htt_pdev_ctrl_path_tx_stats_tlv {
|
|
+ /* Num MGMT MPDU transmitted by the target */
|
|
+ u32 fw_tx_mgmt_subtype[HTT_STATS_SUBTYPE_MAX];
|
|
+};
|
|
+
|
|
+enum htt_sched_txq_supercycle_triggers_tlv_enum {
|
|
+ HTT_SCHED_SUPERCYCLE_TRIGGER_NONE = 0,
|
|
+ HTT_SCHED_SUPERCYCLE_TRIGGER_FORCED,
|
|
+ HTT_SCHED_SUPERCYCLE_TRIGGER_LESS_NUM_TIDQ_ENTRIES,
|
|
+ HTT_SCHED_SUPERCYCLE_TRIGGER_LESS_NUM_ACTIVE_TIDS,
|
|
+ HTT_SCHED_SUPERCYCLE_TRIGGER_MAX_ITR_REACHED,
|
|
+ HTT_SCHED_SUPERCYCLE_TRIGGER_DUR_THRESHOLD_REACHED,
|
|
+ HTT_SCHED_SUPERCYCLE_TRIGGER_TWT_TRIGGER,
|
|
+
|
|
+ HTT_SCHED_SUPERCYCLE_TRIGGER_MAX,
|
|
+};
|
|
+
|
|
+/* NOTE: Variable length TLV, use length spec to infer array size */
|
|
+struct htt_sched_txq_supercycle_triggers_tlv {
|
|
+ u32 supercycle_triggers[0]; /*HTT_SCHED_SUPERCYCLE_TRIGGER_MAX*/
|
|
+};
|
|
+
|
|
+struct htt_hw_war_stats_tlv {
|
|
+ u32 mac_id__word;
|
|
+ u32 hw_wars[1];
|
|
+};
|
|
+
|
|
+struct htt_peer_sched_stats_tlv {
|
|
+ u32 peer_id;
|
|
+ u32 num_sched_dl;
|
|
+ u32 num_sched_ul;
|
|
+ u32 peer_tx_active_dur_us_low;
|
|
+ u32 peer_tx_active_dur_us_high;
|
|
+ u32 peer_rx_active_dur_us_low;
|
|
+ u32 peer_rx_active_dur_us_high;
|
|
+ u32 peer_curr_rate_kbps;
|
|
+};
|
|
#endif
|