wlan-ap-Telecominfraproject/feeds/ipq95xx/mac80211/patches/qca/630-ath12k-Add-additional-debugfs_htt_stats.patch
John Crispin b9b03a6e38 ipq95xx: add Qualcomm wifi-7 support
Signed-off-by: John Crispin <john@phrozen.org>
2023-04-10 14:25:48 +02:00

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