wifi: ath12k: Support pdev CCA Stats

Add support to request CCA stats for physical devices from firmware
through HTT stats type 19. These stats give information about
channel number, number of records, counters' bitmap, collection
interval and different CCA counters.

Sample output:
-------------
echo 19 > /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_PDEV_CCA_STATS_HIST_TLV (1s):
chan_num = 5955
num_records = 10
valid_cca_counters_bitmap = 0xff
collection_interval = 1000

HTT_PDEV_STATS_CCA_COUNTERS_TLV:(in usec)
tx_frame_usec = 0
rx_frame_usec = 0
rx_clear_usec = 999955
my_rx_frame_usec = 0
usec_cnt = 999955
med_rx_idle_usec = 0
med_tx_idle_global_usec = 0
cca_obss_usec = 999955
.....

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-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>
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
Link: https://patch.msgid.link/20241005101816.3314728-5-quic_rdevanat@quicinc.com
Signed-off-by: Jeff Johnson <quic_jjohnson@quicinc.com>
This commit is contained in:
Dinesh Karthikeyan
2024-10-05 15:48:16 +05:30
committed by Jeff Johnson
parent 6f27b59af1
commit 3f5ecfc450
2 changed files with 90 additions and 0 deletions
@@ -2378,6 +2378,65 @@ ath12k_htt_print_tx_pdev_mu_mimo_mpdu_stats_tlv(const void *tag_buf, u16 tag_len
stats_req->buf_len = len;
}
static void
ath12k_htt_print_pdev_cca_stats_hist_tlv(const void *tag_buf, u16 tag_len,
struct debug_htt_stats_req *stats_req)
{
const struct ath12k_htt_pdev_cca_stats_hist_v1_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;
if (tag_len < sizeof(*htt_stats_buf))
return;
len += scnprintf(buf + len, buf_len - len, "HTT_PDEV_CCA_STATS_HIST_TLV :\n");
len += scnprintf(buf + len, buf_len - len, "chan_num = %u\n",
le32_to_cpu(htt_stats_buf->chan_num));
len += scnprintf(buf + len, buf_len - len, "num_records = %u\n",
le32_to_cpu(htt_stats_buf->num_records));
len += scnprintf(buf + len, buf_len - len, "valid_cca_counters_bitmap = 0x%x\n",
le32_to_cpu(htt_stats_buf->valid_cca_counters_bitmap));
len += scnprintf(buf + len, buf_len - len, "collection_interval = %u\n\n",
le32_to_cpu(htt_stats_buf->collection_interval));
stats_req->buf_len = len;
}
static void
ath12k_htt_print_pdev_stats_cca_counters_tlv(const void *tag_buf, u16 tag_len,
struct debug_htt_stats_req *stats_req)
{
const struct ath12k_htt_pdev_stats_cca_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;
if (tag_len < sizeof(*htt_stats_buf))
return;
len += scnprintf(buf + len, buf_len - len,
"HTT_PDEV_STATS_CCA_COUNTERS_TLV:(in usec)\n");
len += scnprintf(buf + len, buf_len - len, "tx_frame_usec = %u\n",
le32_to_cpu(htt_stats_buf->tx_frame_usec));
len += scnprintf(buf + len, buf_len - len, "rx_frame_usec = %u\n",
le32_to_cpu(htt_stats_buf->rx_frame_usec));
len += scnprintf(buf + len, buf_len - len, "rx_clear_usec = %u\n",
le32_to_cpu(htt_stats_buf->rx_clear_usec));
len += scnprintf(buf + len, buf_len - len, "my_rx_frame_usec = %u\n",
le32_to_cpu(htt_stats_buf->my_rx_frame_usec));
len += scnprintf(buf + len, buf_len - len, "usec_cnt = %u\n",
le32_to_cpu(htt_stats_buf->usec_cnt));
len += scnprintf(buf + len, buf_len - len, "med_rx_idle_usec = %u\n",
le32_to_cpu(htt_stats_buf->med_rx_idle_usec));
len += scnprintf(buf + len, buf_len - len, "med_tx_idle_global_usec = %u\n",
le32_to_cpu(htt_stats_buf->med_tx_idle_global_usec));
len += scnprintf(buf + len, buf_len - len, "cca_obss_usec = %u\n\n",
le32_to_cpu(htt_stats_buf->cca_obss_usec));
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)
@@ -2540,6 +2599,14 @@ static int ath12k_dbg_htt_ext_stats_parse(struct ath12k_base *ab,
case HTT_STATS_TX_PDEV_MPDU_STATS_TAG:
ath12k_htt_print_tx_pdev_mu_mimo_mpdu_stats_tlv(tag_buf, len, stats_req);
break;
case HTT_STATS_PDEV_CCA_1SEC_HIST_TAG:
case HTT_STATS_PDEV_CCA_100MSEC_HIST_TAG:
case HTT_STATS_PDEV_CCA_STAT_CUMULATIVE_TAG:
ath12k_htt_print_pdev_cca_stats_hist_tlv(tag_buf, len, stats_req);
break;
case HTT_STATS_PDEV_CCA_COUNTERS_TAG:
ath12k_htt_print_pdev_stats_cca_counters_tlv(tag_buf, len, stats_req);
break;
default:
break;
}
@@ -133,6 +133,7 @@ enum ath12k_dbg_htt_ext_stats_type {
ATH12K_DBG_HTT_EXT_STATS_SRNG_INFO = 15,
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,
/* keep this last */
ATH12K_DBG_HTT_NUM_EXT_STATS,
@@ -176,6 +177,10 @@ enum ath12k_dbg_htt_tlv_tag {
HTT_STATS_TX_DE_COMPL_STATS_TAG = 65,
HTT_STATS_WHAL_TX_TAG = 66,
HTT_STATS_TX_PDEV_SIFS_HIST_TAG = 67,
HTT_STATS_PDEV_CCA_1SEC_HIST_TAG = 70,
HTT_STATS_PDEV_CCA_100MSEC_HIST_TAG = 71,
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_SCHED_TXQ_SCHED_ORDER_SU_TAG = 86,
HTT_STATS_SCHED_TXQ_SCHED_INELIGIBILITY_TAG = 87,
@@ -1001,4 +1006,22 @@ struct ath12k_htt_tx_pdev_mpdu_stats_tlv {
__le32 tx_sched_mode;
} __packed;
struct ath12k_htt_pdev_stats_cca_counters_tlv {
__le32 tx_frame_usec;
__le32 rx_frame_usec;
__le32 rx_clear_usec;
__le32 my_rx_frame_usec;
__le32 usec_cnt;
__le32 med_rx_idle_usec;
__le32 med_tx_idle_global_usec;
__le32 cca_obss_usec;
} __packed;
struct ath12k_htt_pdev_cca_stats_hist_v1_tlv {
__le32 chan_num;
__le32 num_records;
__le32 valid_cca_counters_bitmap;
__le32 collection_interval;
} __packed;
#endif