wifi: ath12k: Support Sounding Stats

Add support to request sounding stats from firmware through HTT stats
type 22. These stats give sounding information of different Wi-Fi
standards, channel vector upload status and correlation details.

Sample output:
-------------
echo 22 > /sys/kernel/debug/ath12k/pci-0000\:06\:00.0/mac0/htt_stats_type
cat /sys/kernel/debug/ath12k/pci-0000\:06\:00.0/mac0/htt_stats
HTT_TX_AC_SOUNDING_STATS_TLV:
ac_cbf_20 = IBF: 0, SU_SIFS: 0, SU_RBO: 0, MU_SIFS: 0, MU_RBO: 0
ac_cbf_40 = IBF: 0, SU_SIFS: 0, SU_RBO: 0, MU_SIFS: 0, MU_RBO: 0
.....
Sounding User_0 = 20MHz: 0, 40MHz: 0, 80MHz: 0, 160MHz: 0
Sounding User_1 = 20MHz: 0, 40MHz: 0, 80MHz: 0, 160MHz: 0
.....

HTT_TX_AX_SOUNDING_STATS_TLV:
ax_cbf_20 = IBF: 0, SU_SIFS: 0, SU_RBO: 0, MU_SIFS: 0, MU_RBO: 0
ax_cbf_40 = IBF: 0, SU_SIFS: 0, SU_RBO: 0, MU_SIFS: 0, MU_RBO: 0
.....
Sounding User_0 = 20MHz: 0, 40MHz: 0, 80MHz: 0, 160MHz: 0
Sounding User_1 = 20MHz: 0, 40MHz: 0, 80MHz: 0, 160MHz: 0
.....

HTT_TX_BE_SOUNDING_STATS_TLV:
be_cbf_20 = IBF: 0, SU_SIFS: 0, SU_RBO: 0, MU_SIFS: 0, MU_RBO: 0
be_cbf_40 = IBF: 0, SU_SIFS: 0, SU_RBO: 0, MU_SIFS: 0, MU_RBO: 0
.....
Sounding User_0 = 20MHz: 0, 40MHz: 0, 80MHz: 0, 160MHz: 0, 320MHz: 0
Sounding User_1 = 20MHz: 0, 40MHz: 0, 80MHz: 0, 160MHz: 0, 320MHz: 0
.....

CV UPLOAD HANDLER STATS:
cv_nc_mismatch_err = 0
cv_fcs_err = 0
cv_frag_idx_mismatch = 0
cv_invalid_peer_id = 0
.....

CV QUERY STATS:
cv_total_query = 0
cv_total_pattern_query = 0
cv_total_bw_query = 0
cv_invalid_bw_coding = 0
.....

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00199-QCAHKSWPL_SILICONZ-1
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0-03427-QCAHMTSWPL_V1.0_V2.0_SILICONZ-1.15378.4

Signed-off-by: Dinesh Karthikeyan <quic_dinek@quicinc.com>
Signed-off-by: Roopni Devanathan <quic_rdevanat@quicinc.com>
Link: https://patch.msgid.link/20250204064417.3671928-2-quic_rdevanat@quicinc.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
This commit is contained in:
Dinesh Karthikeyan 2025-02-04 12:14:13 +05:30 committed by Jeff Johnson
parent 4f4bd1f8a5
commit 5c1963119b
2 changed files with 343 additions and 0 deletions

View File

@ -2511,6 +2511,268 @@ ath12k_htt_print_pdev_stats_cca_counters_tlv(const void *tag_buf, u16 tag_len,
stats_req->buf_len = len;
}
static void
ath12k_htt_print_tx_sounding_stats_tlv(const void *tag_buf, u16 tag_len,
struct debug_htt_stats_req *stats_req)
{
const struct ath12k_htt_tx_sounding_stats_tlv *htt_stats_buf = tag_buf;
const __le32 *cbf_20, *cbf_40, *cbf_80, *cbf_160, *cbf_320;
u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
u32 len = stats_req->buf_len;
u8 *buf = stats_req->buf;
u32 tx_sounding_mode;
u8 i, u;
if (tag_len < sizeof(*htt_stats_buf))
return;
cbf_20 = htt_stats_buf->cbf_20;
cbf_40 = htt_stats_buf->cbf_40;
cbf_80 = htt_stats_buf->cbf_80;
cbf_160 = htt_stats_buf->cbf_160;
cbf_320 = htt_stats_buf->cbf_320;
tx_sounding_mode = le32_to_cpu(htt_stats_buf->tx_sounding_mode);
if (tx_sounding_mode == ATH12K_HTT_TX_AC_SOUNDING_MODE) {
len += scnprintf(buf + len, buf_len - len,
"HTT_TX_AC_SOUNDING_STATS_TLV:\n");
len += scnprintf(buf + len, buf_len - len,
"ac_cbf_20 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",
le32_to_cpu(cbf_20[ATH12K_HTT_IMPL_STEER_STATS]),
le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),
le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));
len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n",
le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),
le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));
len += scnprintf(buf + len, buf_len - len,
"ac_cbf_40 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",
le32_to_cpu(cbf_40[ATH12K_HTT_IMPL_STEER_STATS]),
le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),
le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));
len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n",
le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),
le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));
len += scnprintf(buf + len, buf_len - len,
"ac_cbf_80 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",
le32_to_cpu(cbf_80[ATH12K_HTT_IMPL_STEER_STATS]),
le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),
le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));
len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n",
le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),
le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));
len += scnprintf(buf + len, buf_len - len,
"ac_cbf_160 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",
le32_to_cpu(cbf_160[ATH12K_HTT_IMPL_STEER_STATS]),
le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),
le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));
len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n",
le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),
le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));
for (u = 0, i = 0; u < ATH12K_HTT_TX_NUM_AC_MUMIMO_USER_STATS; u++) {
len += scnprintf(buf + len, buf_len - len,
"Sounding User_%u = 20MHz: %u, ", u,
le32_to_cpu(htt_stats_buf->sounding[i++]));
len += scnprintf(buf + len, buf_len - len, "40MHz: %u, ",
le32_to_cpu(htt_stats_buf->sounding[i++]));
len += scnprintf(buf + len, buf_len - len, "80MHz: %u, ",
le32_to_cpu(htt_stats_buf->sounding[i++]));
len += scnprintf(buf + len, buf_len - len, "160MHz: %u\n",
le32_to_cpu(htt_stats_buf->sounding[i++]));
}
} else if (tx_sounding_mode == ATH12K_HTT_TX_AX_SOUNDING_MODE) {
len += scnprintf(buf + len, buf_len - len,
"\nHTT_TX_AX_SOUNDING_STATS_TLV:\n");
len += scnprintf(buf + len, buf_len - len,
"ax_cbf_20 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",
le32_to_cpu(cbf_20[ATH12K_HTT_IMPL_STEER_STATS]),
le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),
le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));
len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n",
le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),
le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));
len += scnprintf(buf + len, buf_len - len,
"ax_cbf_40 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",
le32_to_cpu(cbf_40[ATH12K_HTT_IMPL_STEER_STATS]),
le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),
le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));
len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n",
le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),
le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));
len += scnprintf(buf + len, buf_len - len,
"ax_cbf_80 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",
le32_to_cpu(cbf_80[ATH12K_HTT_IMPL_STEER_STATS]),
le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),
le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));
len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n",
le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),
le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));
len += scnprintf(buf + len, buf_len - len,
"ax_cbf_160 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",
le32_to_cpu(cbf_160[ATH12K_HTT_IMPL_STEER_STATS]),
le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),
le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));
len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n",
le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),
le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));
for (u = 0, i = 0; u < ATH12K_HTT_TX_NUM_AX_MUMIMO_USER_STATS; u++) {
len += scnprintf(buf + len, buf_len - len,
"Sounding User_%u = 20MHz: %u, ", u,
le32_to_cpu(htt_stats_buf->sounding[i++]));
len += scnprintf(buf + len, buf_len - len, "40MHz: %u, ",
le32_to_cpu(htt_stats_buf->sounding[i++]));
len += scnprintf(buf + len, buf_len - len, "80MHz: %u, ",
le32_to_cpu(htt_stats_buf->sounding[i++]));
len += scnprintf(buf + len, buf_len - len, "160MHz: %u\n",
le32_to_cpu(htt_stats_buf->sounding[i++]));
}
} else if (tx_sounding_mode == ATH12K_HTT_TX_BE_SOUNDING_MODE) {
len += scnprintf(buf + len, buf_len - len,
"\nHTT_TX_BE_SOUNDING_STATS_TLV:\n");
len += scnprintf(buf + len, buf_len - len,
"be_cbf_20 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",
le32_to_cpu(cbf_20[ATH12K_HTT_IMPL_STEER_STATS]),
le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),
le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));
len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n",
le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),
le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));
len += scnprintf(buf + len, buf_len - len,
"be_cbf_40 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",
le32_to_cpu(cbf_40[ATH12K_HTT_IMPL_STEER_STATS]),
le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),
le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));
len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n",
le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),
le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));
len += scnprintf(buf + len, buf_len - len,
"be_cbf_80 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",
le32_to_cpu(cbf_80[ATH12K_HTT_IMPL_STEER_STATS]),
le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),
le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));
len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n",
le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),
le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));
len += scnprintf(buf + len, buf_len - len,
"be_cbf_160 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",
le32_to_cpu(cbf_160[ATH12K_HTT_IMPL_STEER_STATS]),
le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),
le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));
len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n",
le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),
le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));
len += scnprintf(buf + len, buf_len - len,
"be_cbf_320 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",
le32_to_cpu(cbf_320[ATH12K_HTT_IMPL_STEER_STATS]),
le32_to_cpu(cbf_320[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),
le32_to_cpu(cbf_320[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));
len += scnprintf(buf + len, buf_len - len, "MU_SIFS: %u, MU_RBO: %u\n",
le32_to_cpu(cbf_320[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),
le32_to_cpu(cbf_320[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));
for (u = 0, i = 0; u < ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS; u++) {
len += scnprintf(buf + len, buf_len - len,
"Sounding User_%u = 20MHz: %u, ", u,
le32_to_cpu(htt_stats_buf->sounding[i++]));
len += scnprintf(buf + len, buf_len - len, "40MHz: %u, ",
le32_to_cpu(htt_stats_buf->sounding[i++]));
len += scnprintf(buf + len, buf_len - len, "80MHz: %u, ",
le32_to_cpu(htt_stats_buf->sounding[i++]));
len += scnprintf(buf + len, buf_len - len,
"160MHz: %u, 320MHz: %u\n",
le32_to_cpu(htt_stats_buf->sounding[i++]),
le32_to_cpu(htt_stats_buf->sounding_320[u]));
}
} else if (tx_sounding_mode == ATH12K_HTT_TX_CMN_SOUNDING_MODE) {
len += scnprintf(buf + len, buf_len - len,
"\nCV UPLOAD HANDLER STATS:\n");
len += scnprintf(buf + len, buf_len - len, "cv_nc_mismatch_err = %u\n",
le32_to_cpu(htt_stats_buf->cv_nc_mismatch_err));
len += scnprintf(buf + len, buf_len - len, "cv_fcs_err = %u\n",
le32_to_cpu(htt_stats_buf->cv_fcs_err));
len += scnprintf(buf + len, buf_len - len, "cv_frag_idx_mismatch = %u\n",
le32_to_cpu(htt_stats_buf->cv_frag_idx_mismatch));
len += scnprintf(buf + len, buf_len - len, "cv_invalid_peer_id = %u\n",
le32_to_cpu(htt_stats_buf->cv_invalid_peer_id));
len += scnprintf(buf + len, buf_len - len, "cv_no_txbf_setup = %u\n",
le32_to_cpu(htt_stats_buf->cv_no_txbf_setup));
len += scnprintf(buf + len, buf_len - len, "cv_expiry_in_update = %u\n",
le32_to_cpu(htt_stats_buf->cv_expiry_in_update));
len += scnprintf(buf + len, buf_len - len, "cv_pkt_bw_exceed = %u\n",
le32_to_cpu(htt_stats_buf->cv_pkt_bw_exceed));
len += scnprintf(buf + len, buf_len - len, "cv_dma_not_done_err = %u\n",
le32_to_cpu(htt_stats_buf->cv_dma_not_done_err));
len += scnprintf(buf + len, buf_len - len, "cv_update_failed = %u\n",
le32_to_cpu(htt_stats_buf->cv_update_failed));
len += scnprintf(buf + len, buf_len - len, "cv_dma_timeout_error = %u\n",
le32_to_cpu(htt_stats_buf->cv_dma_timeout_error));
len += scnprintf(buf + len, buf_len - len, "cv_buf_ibf_uploads = %u\n",
le32_to_cpu(htt_stats_buf->cv_buf_ibf_uploads));
len += scnprintf(buf + len, buf_len - len, "cv_buf_ebf_uploads = %u\n",
le32_to_cpu(htt_stats_buf->cv_buf_ebf_uploads));
len += scnprintf(buf + len, buf_len - len, "cv_buf_received = %u\n",
le32_to_cpu(htt_stats_buf->cv_buf_received));
len += scnprintf(buf + len, buf_len - len, "cv_buf_fed_back = %u\n\n",
le32_to_cpu(htt_stats_buf->cv_buf_fed_back));
len += scnprintf(buf + len, buf_len - len, "CV QUERY STATS:\n");
len += scnprintf(buf + len, buf_len - len, "cv_total_query = %u\n",
le32_to_cpu(htt_stats_buf->cv_total_query));
len += scnprintf(buf + len, buf_len - len,
"cv_total_pattern_query = %u\n",
le32_to_cpu(htt_stats_buf->cv_total_pattern_query));
len += scnprintf(buf + len, buf_len - len, "cv_total_bw_query = %u\n",
le32_to_cpu(htt_stats_buf->cv_total_bw_query));
len += scnprintf(buf + len, buf_len - len, "cv_invalid_bw_coding = %u\n",
le32_to_cpu(htt_stats_buf->cv_invalid_bw_coding));
len += scnprintf(buf + len, buf_len - len, "cv_forced_sounding = %u\n",
le32_to_cpu(htt_stats_buf->cv_forced_sounding));
len += scnprintf(buf + len, buf_len - len,
"cv_standalone_sounding = %u\n",
le32_to_cpu(htt_stats_buf->cv_standalone_sounding));
len += scnprintf(buf + len, buf_len - len, "cv_nc_mismatch = %u\n",
le32_to_cpu(htt_stats_buf->cv_nc_mismatch));
len += scnprintf(buf + len, buf_len - len, "cv_fb_type_mismatch = %u\n",
le32_to_cpu(htt_stats_buf->cv_fb_type_mismatch));
len += scnprintf(buf + len, buf_len - len, "cv_ofdma_bw_mismatch = %u\n",
le32_to_cpu(htt_stats_buf->cv_ofdma_bw_mismatch));
len += scnprintf(buf + len, buf_len - len, "cv_bw_mismatch = %u\n",
le32_to_cpu(htt_stats_buf->cv_bw_mismatch));
len += scnprintf(buf + len, buf_len - len, "cv_pattern_mismatch = %u\n",
le32_to_cpu(htt_stats_buf->cv_pattern_mismatch));
len += scnprintf(buf + len, buf_len - len, "cv_preamble_mismatch = %u\n",
le32_to_cpu(htt_stats_buf->cv_preamble_mismatch));
len += scnprintf(buf + len, buf_len - len, "cv_nr_mismatch = %u\n",
le32_to_cpu(htt_stats_buf->cv_nr_mismatch));
len += scnprintf(buf + len, buf_len - len,
"cv_in_use_cnt_exceeded = %u\n",
le32_to_cpu(htt_stats_buf->cv_in_use_cnt_exceeded));
len += scnprintf(buf + len, buf_len - len, "cv_ntbr_sounding = %u\n",
le32_to_cpu(htt_stats_buf->cv_ntbr_sounding));
len += scnprintf(buf + len, buf_len - len,
"cv_found_upload_in_progress = %u\n",
le32_to_cpu(htt_stats_buf->cv_found_upload_in_progress));
len += scnprintf(buf + len, buf_len - len,
"cv_expired_during_query = %u\n",
le32_to_cpu(htt_stats_buf->cv_expired_during_query));
len += scnprintf(buf + len, buf_len - len, "cv_found = %u\n",
le32_to_cpu(htt_stats_buf->cv_found));
len += scnprintf(buf + len, buf_len - len, "cv_not_found = %u\n",
le32_to_cpu(htt_stats_buf->cv_not_found));
len += scnprintf(buf + len, buf_len - len, "cv_total_query_ibf = %u\n",
le32_to_cpu(htt_stats_buf->cv_total_query_ibf));
len += scnprintf(buf + len, buf_len - len, "cv_found_ibf = %u\n",
le32_to_cpu(htt_stats_buf->cv_found_ibf));
len += scnprintf(buf + len, buf_len - len, "cv_not_found_ibf = %u\n",
le32_to_cpu(htt_stats_buf->cv_not_found_ibf));
len += scnprintf(buf + len, buf_len - len,
"cv_expired_during_query_ibf = %u\n\n",
le32_to_cpu(htt_stats_buf->cv_expired_during_query_ibf));
}
stats_req->buf_len = len;
}
static void
ath12k_htt_print_pdev_obss_pd_stats_tlv(const void *tag_buf, u16 tag_len,
struct debug_htt_stats_req *stats_req)
@ -4473,6 +4735,9 @@ static int ath12k_dbg_htt_ext_stats_parse(struct ath12k_base *ab,
case HTT_STATS_PDEV_CCA_COUNTERS_TAG:
ath12k_htt_print_pdev_stats_cca_counters_tlv(tag_buf, len, stats_req);
break;
case HTT_STATS_TX_SOUNDING_STATS_TAG:
ath12k_htt_print_tx_sounding_stats_tlv(tag_buf, len, stats_req);
break;
case HTT_STATS_PDEV_OBSS_PD_TAG:
ath12k_htt_print_pdev_obss_pd_stats_tlv(tag_buf, len, stats_req);
break;

View File

@ -136,6 +136,7 @@ enum ath12k_dbg_htt_ext_stats_type {
ATH12K_DBG_HTT_EXT_STATS_SFM_INFO = 16,
ATH12K_DBG_HTT_EXT_STATS_PDEV_TX_MU = 17,
ATH12K_DBG_HTT_EXT_STATS_PDEV_CCA_STATS = 19,
ATH12K_DBG_HTT_EXT_STATS_TX_SOUNDING_INFO = 22,
ATH12K_DBG_HTT_EXT_STATS_PDEV_OBSS_PD_STATS = 23,
ATH12K_DBG_HTT_EXT_STATS_PDEV_RX_RATE_EXT = 30,
ATH12K_DBG_HTT_EXT_STATS_PDEV_TX_RATE_TXBF = 31,
@ -200,6 +201,7 @@ enum ath12k_dbg_htt_tlv_tag {
HTT_STATS_PDEV_CCA_STAT_CUMULATIVE_TAG = 72,
HTT_STATS_PDEV_CCA_COUNTERS_TAG = 73,
HTT_STATS_TX_PDEV_MPDU_STATS_TAG = 74,
HTT_STATS_TX_SOUNDING_STATS_TAG = 80,
HTT_STATS_SCHED_TXQ_SCHED_ORDER_SU_TAG = 86,
HTT_STATS_SCHED_TXQ_SCHED_INELIGIBILITY_TAG = 87,
HTT_STATS_PDEV_OBSS_PD_TAG = 88,
@ -1240,6 +1242,82 @@ struct ath12k_htt_pdev_cca_stats_hist_v1_tlv {
__le32 collection_interval;
} __packed;
#define ATH12K_HTT_TX_CV_CORR_MAX_NUM_COLUMNS 8
#define ATH12K_HTT_TX_NUM_AC_MUMIMO_USER_STATS 4
#define ATH12K_HTT_TX_NUM_AX_MUMIMO_USER_STATS 8
#define ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS 8
#define ATH12K_HTT_TX_PDEV_STATS_NUM_BW_COUNTERS 4
#define ATH12K_HTT_TX_NUM_MCS_CNTRS 12
#define ATH12K_HTT_TX_NUM_EXTRA_MCS_CNTRS 2
#define ATH12K_HTT_TX_NUM_OF_SOUNDING_STATS_WORDS \
(ATH12K_HTT_TX_PDEV_STATS_NUM_BW_COUNTERS * \
ATH12K_HTT_TX_NUM_AX_MUMIMO_USER_STATS)
enum ath12k_htt_txbf_sound_steer_modes {
ATH12K_HTT_IMPL_STEER_STATS = 0,
ATH12K_HTT_EXPL_SUSIFS_STEER_STATS = 1,
ATH12K_HTT_EXPL_SURBO_STEER_STATS = 2,
ATH12K_HTT_EXPL_MUSIFS_STEER_STATS = 3,
ATH12K_HTT_EXPL_MURBO_STEER_STATS = 4,
ATH12K_HTT_TXBF_MAX_NUM_OF_MODES = 5
};
enum ath12k_htt_stats_sounding_tx_mode {
ATH12K_HTT_TX_AC_SOUNDING_MODE = 0,
ATH12K_HTT_TX_AX_SOUNDING_MODE = 1,
ATH12K_HTT_TX_BE_SOUNDING_MODE = 2,
ATH12K_HTT_TX_CMN_SOUNDING_MODE = 3,
};
struct ath12k_htt_tx_sounding_stats_tlv {
__le32 tx_sounding_mode;
__le32 cbf_20[ATH12K_HTT_TXBF_MAX_NUM_OF_MODES];
__le32 cbf_40[ATH12K_HTT_TXBF_MAX_NUM_OF_MODES];
__le32 cbf_80[ATH12K_HTT_TXBF_MAX_NUM_OF_MODES];
__le32 cbf_160[ATH12K_HTT_TXBF_MAX_NUM_OF_MODES];
__le32 sounding[ATH12K_HTT_TX_NUM_OF_SOUNDING_STATS_WORDS];
__le32 cv_nc_mismatch_err;
__le32 cv_fcs_err;
__le32 cv_frag_idx_mismatch;
__le32 cv_invalid_peer_id;
__le32 cv_no_txbf_setup;
__le32 cv_expiry_in_update;
__le32 cv_pkt_bw_exceed;
__le32 cv_dma_not_done_err;
__le32 cv_update_failed;
__le32 cv_total_query;
__le32 cv_total_pattern_query;
__le32 cv_total_bw_query;
__le32 cv_invalid_bw_coding;
__le32 cv_forced_sounding;
__le32 cv_standalone_sounding;
__le32 cv_nc_mismatch;
__le32 cv_fb_type_mismatch;
__le32 cv_ofdma_bw_mismatch;
__le32 cv_bw_mismatch;
__le32 cv_pattern_mismatch;
__le32 cv_preamble_mismatch;
__le32 cv_nr_mismatch;
__le32 cv_in_use_cnt_exceeded;
__le32 cv_found;
__le32 cv_not_found;
__le32 sounding_320[ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS];
__le32 cbf_320[ATH12K_HTT_TXBF_MAX_NUM_OF_MODES];
__le32 cv_ntbr_sounding;
__le32 cv_found_upload_in_progress;
__le32 cv_expired_during_query;
__le32 cv_dma_timeout_error;
__le32 cv_buf_ibf_uploads;
__le32 cv_buf_ebf_uploads;
__le32 cv_buf_received;
__le32 cv_buf_fed_back;
__le32 cv_total_query_ibf;
__le32 cv_found_ibf;
__le32 cv_not_found_ibf;
__le32 cv_expired_during_query_ibf;
} __packed;
struct ath12k_htt_pdev_obss_pd_stats_tlv {
__le32 num_obss_tx_ppdu_success;
__le32 num_obss_tx_ppdu_failure;