Skip to content

Commit 17ab72d

Browse files
Aaradhana Sahumiaoqing-quic
authored andcommitted
UPSTREAM: wifi: ath12k: Add support RX PDEV stats
Add support to request and receive RX pdev firmware stats using HTT stats type 2. This stats type reports PPDU and MPDU counters, firmware ring and buffer statistics, and RX suspend and resume counts. Note: Currently, firmware on mobile-centric chipsets do not maintain these statistics, so a query will not return any information. Sample output: ------------- echo 2 >/sys/kernel/debug/ath12k/pci-0000\:58\:00.0/mac0/htt_stats_type cat /sys/kernel/debug/ath12k/pci-0000\:58\:00.0/mac0/htt_stats HTT_RX_PDEV_FW_STATS_TLV: mac_id = 0 ppdu_recvd = 1522 mpdu_cnt_fcs_ok = 1522 mpdu_cnt_fcs_err = 0 ... fw_ring_mpdu_ind = 1522 fw_ring_mgmt_subtype = 0:0, 1:0, 2:0, 3:0, 4:21, 5:0, 6:0, 7:0, 8:1501, 9:0, 10:0, 11:0, 12:0, 13:0, 14:0, 15:0 fw_ring_ctrl_subtype = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0, 13:0, 14:0, 15:0 fw_ring_mcast_data_msdu = 0 fw_pkt_buf_ring_refill_cnt = 1567 fw_pkt_buf_ring_empty_cnt = 1 ... rx_suspend_cnt = 4 rx_suspend_fail_cnt = 0 rx_resume_cnt = 4 rx_resume_fail_cnt = 0 rx_ring_switch_cnt = 0 rx_ring_restore_cnt = 0 Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.5-01651-QCAHKSWPL_SILICONZ-1 Signed-off-by: Aaradhana Sahu <aaradhana.sahu@oss.qualcomm.com> Reviewed-by: Baochen Qiang <baochen.qiang@oss.qualcomm.com> Link: https://patch.msgid.link/20260123071253.2202644-3-aaradhana.sahu@oss.qualcomm.com Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com> Signed-off-by: Miaoqing Pan <miaoqing.pan@oss.qualcomm.com>
1 parent 2e8db98 commit 17ab72d

2 files changed

Lines changed: 180 additions & 0 deletions

File tree

drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5539,6 +5539,128 @@ ath12k_htt_print_pdev_rtt_tbr_cmd_res_stats_tlv(const void *tag_buf, u16 tag_len
55395539
stats_req->buf_len = len;
55405540
}
55415541

5542+
static void
5543+
ath12k_htt_print_rx_pdev_fw_stats_tlv(const void *tag_buf, u16 tag_len,
5544+
struct debug_htt_stats_req *stats_req)
5545+
{
5546+
const struct htt_rx_pdev_fw_stats_tlv *htt_stats_buf = tag_buf;
5547+
u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
5548+
u32 len = stats_req->buf_len;
5549+
u8 *buf = stats_req->buf;
5550+
5551+
if (tag_len < sizeof(*htt_stats_buf))
5552+
return;
5553+
5554+
len += scnprintf(buf + len, buf_len - len, "HTT_RX_PDEV_FW_STATS_TLV:\n");
5555+
len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",
5556+
le32_to_cpu(htt_stats_buf->mac_id__word) & 0xFF);
5557+
len += scnprintf(buf + len, buf_len - len, "ppdu_recvd = %u\n",
5558+
le32_to_cpu(htt_stats_buf->ppdu_recvd));
5559+
len += scnprintf(buf + len, buf_len - len, "mpdu_cnt_fcs_ok = %u\n",
5560+
le32_to_cpu(htt_stats_buf->mpdu_cnt_fcs_ok));
5561+
len += scnprintf(buf + len, buf_len - len, "mpdu_cnt_fcs_err = %u\n",
5562+
le32_to_cpu(htt_stats_buf->mpdu_cnt_fcs_err));
5563+
len += scnprintf(buf + len, buf_len - len, "tcp_msdu_cnt = %u\n",
5564+
le32_to_cpu(htt_stats_buf->tcp_msdu_cnt));
5565+
len += scnprintf(buf + len, buf_len - len, "tcp_ack_msdu_cnt = %u\n",
5566+
le32_to_cpu(htt_stats_buf->tcp_ack_msdu_cnt));
5567+
len += scnprintf(buf + len, buf_len - len, "udp_msdu_cnt = %u\n",
5568+
le32_to_cpu(htt_stats_buf->udp_msdu_cnt));
5569+
len += scnprintf(buf + len, buf_len - len, "other_msdu_cnt = %u\n",
5570+
le32_to_cpu(htt_stats_buf->other_msdu_cnt));
5571+
len += scnprintf(buf + len, buf_len - len, "fw_ring_mpdu_ind = %u\n",
5572+
le32_to_cpu(htt_stats_buf->fw_ring_mpdu_ind));
5573+
len += print_array_to_buf(buf, len, "fw_ring_mgmt_subtype",
5574+
htt_stats_buf->fw_ring_mgmt_subtype,
5575+
ATH12K_HTT_STATS_SUBTYPE_MAX, "\n");
5576+
len += print_array_to_buf(buf, len, "fw_ring_ctrl_subtype",
5577+
htt_stats_buf->fw_ring_ctrl_subtype,
5578+
ATH12K_HTT_STATS_SUBTYPE_MAX, "\n");
5579+
len += scnprintf(buf + len, buf_len - len, "fw_ring_mcast_data_msdu = %u\n",
5580+
le32_to_cpu(htt_stats_buf->fw_ring_mcast_data_msdu));
5581+
len += scnprintf(buf + len, buf_len - len, "fw_ring_bcast_data_msdu = %u\n",
5582+
le32_to_cpu(htt_stats_buf->fw_ring_bcast_data_msdu));
5583+
len += scnprintf(buf + len, buf_len - len, "fw_ring_ucast_data_msdu = %u\n",
5584+
le32_to_cpu(htt_stats_buf->fw_ring_ucast_data_msdu));
5585+
len += scnprintf(buf + len, buf_len - len, "fw_ring_null_data_msdu = %u\n",
5586+
le32_to_cpu(htt_stats_buf->fw_ring_null_data_msdu));
5587+
len += scnprintf(buf + len, buf_len - len, "fw_ring_mpdu_drop = %u\n",
5588+
le32_to_cpu(htt_stats_buf->fw_ring_mpdu_drop));
5589+
len += scnprintf(buf + len, buf_len - len, "ofld_local_data_ind_cnt = %u\n",
5590+
le32_to_cpu(htt_stats_buf->ofld_local_data_ind_cnt));
5591+
len += scnprintf(buf + len, buf_len - len,
5592+
"ofld_local_data_buf_recycle_cnt = %u\n",
5593+
le32_to_cpu(htt_stats_buf->ofld_local_data_buf_recycle_cnt));
5594+
len += scnprintf(buf + len, buf_len - len, "drx_local_data_ind_cnt = %u\n",
5595+
le32_to_cpu(htt_stats_buf->drx_local_data_ind_cnt));
5596+
len += scnprintf(buf + len, buf_len - len,
5597+
"drx_local_data_buf_recycle_cnt = %u\n",
5598+
le32_to_cpu(htt_stats_buf->drx_local_data_buf_recycle_cnt));
5599+
len += scnprintf(buf + len, buf_len - len, "local_nondata_ind_cnt = %u\n",
5600+
le32_to_cpu(htt_stats_buf->local_nondata_ind_cnt));
5601+
len += scnprintf(buf + len, buf_len - len, "local_nondata_buf_recycle_cnt = %u\n",
5602+
le32_to_cpu(htt_stats_buf->local_nondata_buf_recycle_cnt));
5603+
len += scnprintf(buf + len, buf_len - len, "fw_status_buf_ring_refill_cnt = %u\n",
5604+
le32_to_cpu(htt_stats_buf->fw_status_buf_ring_refill_cnt));
5605+
len += scnprintf(buf + len, buf_len - len, "fw_status_buf_ring_empty_cnt = %u\n",
5606+
le32_to_cpu(htt_stats_buf->fw_status_buf_ring_empty_cnt));
5607+
len += scnprintf(buf + len, buf_len - len, "fw_pkt_buf_ring_refill_cnt = %u\n",
5608+
le32_to_cpu(htt_stats_buf->fw_pkt_buf_ring_refill_cnt));
5609+
len += scnprintf(buf + len, buf_len - len, "fw_pkt_buf_ring_empty_cnt = %u\n",
5610+
le32_to_cpu(htt_stats_buf->fw_pkt_buf_ring_empty_cnt));
5611+
len += scnprintf(buf + len, buf_len - len, "fw_link_buf_ring_refill_cnt = %u\n",
5612+
le32_to_cpu(htt_stats_buf->fw_link_buf_ring_refill_cnt));
5613+
len += scnprintf(buf + len, buf_len - len, "fw_link_buf_ring_empty_cnt = %u\n",
5614+
le32_to_cpu(htt_stats_buf->fw_link_buf_ring_empty_cnt));
5615+
len += scnprintf(buf + len, buf_len - len, "host_pkt_buf_ring_refill_cnt = %u\n",
5616+
le32_to_cpu(htt_stats_buf->host_pkt_buf_ring_refill_cnt));
5617+
len += scnprintf(buf + len, buf_len - len, "host_pkt_buf_ring_empty_cnt = %u\n",
5618+
le32_to_cpu(htt_stats_buf->host_pkt_buf_ring_empty_cnt));
5619+
len += scnprintf(buf + len, buf_len - len, "mon_pkt_buf_ring_refill_cnt = %u\n",
5620+
le32_to_cpu(htt_stats_buf->mon_pkt_buf_ring_refill_cnt));
5621+
len += scnprintf(buf + len, buf_len - len, "mon_pkt_buf_ring_empty_cnt = %u\n",
5622+
le32_to_cpu(htt_stats_buf->mon_pkt_buf_ring_empty_cnt));
5623+
len += scnprintf(buf + len, buf_len - len,
5624+
"mon_status_buf_ring_refill_cnt = %u\n",
5625+
le32_to_cpu(htt_stats_buf->mon_status_buf_ring_refill_cnt));
5626+
len += scnprintf(buf + len, buf_len - len, "mon_status_buf_ring_empty_cnt = %u\n",
5627+
le32_to_cpu(htt_stats_buf->mon_status_buf_ring_empty_cnt));
5628+
len += scnprintf(buf + len, buf_len - len, "mon_desc_buf_ring_refill_cnt = %u\n",
5629+
le32_to_cpu(htt_stats_buf->mon_desc_buf_ring_refill_cnt));
5630+
len += scnprintf(buf + len, buf_len - len, "mon_desc_buf_ring_empty_cnt = %u\n",
5631+
le32_to_cpu(htt_stats_buf->mon_desc_buf_ring_empty_cnt));
5632+
len += scnprintf(buf + len, buf_len - len, "mon_dest_ring_update_cnt = %u\n",
5633+
le32_to_cpu(htt_stats_buf->mon_dest_ring_update_cnt));
5634+
len += scnprintf(buf + len, buf_len - len, "mon_dest_ring_full_cnt = %u\n",
5635+
le32_to_cpu(htt_stats_buf->mon_dest_ring_full_cnt));
5636+
len += scnprintf(buf + len, buf_len - len, "rx_suspend_cnt = %u\n",
5637+
le32_to_cpu(htt_stats_buf->rx_suspend_cnt));
5638+
len += scnprintf(buf + len, buf_len - len, "rx_suspend_fail_cnt = %u\n",
5639+
le32_to_cpu(htt_stats_buf->rx_suspend_fail_cnt));
5640+
len += scnprintf(buf + len, buf_len - len, "rx_resume_cnt = %u\n",
5641+
le32_to_cpu(htt_stats_buf->rx_resume_cnt));
5642+
len += scnprintf(buf + len, buf_len - len, "rx_resume_fail_cnt = %u\n",
5643+
le32_to_cpu(htt_stats_buf->rx_resume_fail_cnt));
5644+
len += scnprintf(buf + len, buf_len - len, "rx_ring_switch_cnt = %u\n",
5645+
le32_to_cpu(htt_stats_buf->rx_ring_switch_cnt));
5646+
len += scnprintf(buf + len, buf_len - len, "rx_ring_restore_cnt = %u\n",
5647+
le32_to_cpu(htt_stats_buf->rx_ring_restore_cnt));
5648+
len += scnprintf(buf + len, buf_len - len, "rx_flush_cnt = %u\n",
5649+
le32_to_cpu(htt_stats_buf->rx_flush_cnt));
5650+
len += scnprintf(buf + len, buf_len - len, "rx_recovery_reset_cnt = %u\n",
5651+
le32_to_cpu(htt_stats_buf->rx_recovery_reset_cnt));
5652+
len += scnprintf(buf + len, buf_len - len, "rx_lwm_prom_filter_dis = %u\n",
5653+
le32_to_cpu(htt_stats_buf->rx_lwm_prom_filter_dis));
5654+
len += scnprintf(buf + len, buf_len - len, "rx_hwm_prom_filter_en = %u\n",
5655+
le32_to_cpu(htt_stats_buf->rx_hwm_prom_filter_en));
5656+
len += scnprintf(buf + len, buf_len - len, "bytes_received_low_32 = %u\n",
5657+
le32_to_cpu(htt_stats_buf->bytes_received_low_32));
5658+
len += scnprintf(buf + len, buf_len - len, "bytes_received_high_32 = %u\n",
5659+
le32_to_cpu(htt_stats_buf->bytes_received_high_32));
5660+
5661+
stats_req->buf_len = len;
5662+
}
5663+
55425664
static int ath12k_dbg_htt_ext_stats_parse(struct ath12k_base *ab,
55435665
u16 tag, u16 len, const void *tag_buf,
55445666
void *user_data)
@@ -5692,6 +5814,9 @@ static int ath12k_dbg_htt_ext_stats_parse(struct ath12k_base *ab,
56925814
case HTT_STATS_SFM_CLIENT_USER_TAG:
56935815
ath12k_htt_print_sfm_client_user_tlv(tag_buf, len, stats_req);
56945816
break;
5817+
case HTT_STATS_RX_PDEV_FW_STATS_TAG:
5818+
ath12k_htt_print_rx_pdev_fw_stats_tlv(tag_buf, len, stats_req);
5819+
break;
56955820
case HTT_STATS_TX_PDEV_MU_MIMO_STATS_TAG:
56965821
ath12k_htt_print_tx_pdev_mu_mimo_sch_stats_tlv(tag_buf, len, stats_req);
56975822
break;

drivers/net/wireless/ath/ath12k/debugfs_htt_stats.h

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ struct ath12k_htt_extd_stats_msg {
127127
enum ath12k_dbg_htt_ext_stats_type {
128128
ATH12K_DBG_HTT_EXT_STATS_RESET = 0,
129129
ATH12K_DBG_HTT_EXT_STATS_PDEV_TX = 1,
130+
ATH12K_DBG_HTT_EXT_STATS_PDEV_RX = 2,
130131
ATH12K_DBG_HTT_EXT_STATS_PDEV_TX_SCHED = 4,
131132
ATH12K_DBG_HTT_EXT_STATS_PDEV_ERROR = 5,
132133
ATH12K_DBG_HTT_EXT_STATS_PDEV_TQM = 6,
@@ -188,6 +189,7 @@ enum ath12k_dbg_htt_tlv_tag {
188189
HTT_STATS_TX_PDEV_MU_MIMO_STATS_TAG = 25,
189190
HTT_STATS_SFM_CMN_TAG = 26,
190191
HTT_STATS_SRING_STATS_TAG = 27,
192+
HTT_STATS_RX_PDEV_FW_STATS_TAG = 28,
191193
HTT_STATS_TX_PDEV_RATE_STATS_TAG = 34,
192194
HTT_STATS_RX_PDEV_RATE_STATS_TAG = 35,
193195
HTT_STATS_TX_PDEV_SCHEDULER_TXQ_STATS_TAG = 36,
@@ -2075,4 +2077,57 @@ struct ath12k_htt_stats_pdev_rtt_tbr_cmd_result_stats_tlv {
20752077
__le32 mu_res[ATH12K_HTT_FTYPE_MAX][ATH12K_HTT_MAX_SCH_CMD_RESULT];
20762078
} __packed;
20772079

2080+
struct htt_rx_pdev_fw_stats_tlv {
2081+
__le32 mac_id__word;
2082+
__le32 ppdu_recvd;
2083+
__le32 mpdu_cnt_fcs_ok;
2084+
__le32 mpdu_cnt_fcs_err;
2085+
__le32 tcp_msdu_cnt;
2086+
__le32 tcp_ack_msdu_cnt;
2087+
__le32 udp_msdu_cnt;
2088+
__le32 other_msdu_cnt;
2089+
__le32 fw_ring_mpdu_ind;
2090+
__le32 fw_ring_mgmt_subtype[ATH12K_HTT_STATS_SUBTYPE_MAX];
2091+
__le32 fw_ring_ctrl_subtype[ATH12K_HTT_STATS_SUBTYPE_MAX];
2092+
__le32 fw_ring_mcast_data_msdu;
2093+
__le32 fw_ring_bcast_data_msdu;
2094+
__le32 fw_ring_ucast_data_msdu;
2095+
__le32 fw_ring_null_data_msdu;
2096+
__le32 fw_ring_mpdu_drop;
2097+
__le32 ofld_local_data_ind_cnt;
2098+
__le32 ofld_local_data_buf_recycle_cnt;
2099+
__le32 drx_local_data_ind_cnt;
2100+
__le32 drx_local_data_buf_recycle_cnt;
2101+
__le32 local_nondata_ind_cnt;
2102+
__le32 local_nondata_buf_recycle_cnt;
2103+
__le32 fw_status_buf_ring_refill_cnt;
2104+
__le32 fw_status_buf_ring_empty_cnt;
2105+
__le32 fw_pkt_buf_ring_refill_cnt;
2106+
__le32 fw_pkt_buf_ring_empty_cnt;
2107+
__le32 fw_link_buf_ring_refill_cnt;
2108+
__le32 fw_link_buf_ring_empty_cnt;
2109+
__le32 host_pkt_buf_ring_refill_cnt;
2110+
__le32 host_pkt_buf_ring_empty_cnt;
2111+
__le32 mon_pkt_buf_ring_refill_cnt;
2112+
__le32 mon_pkt_buf_ring_empty_cnt;
2113+
__le32 mon_status_buf_ring_refill_cnt;
2114+
__le32 mon_status_buf_ring_empty_cnt;
2115+
__le32 mon_desc_buf_ring_refill_cnt;
2116+
__le32 mon_desc_buf_ring_empty_cnt;
2117+
__le32 mon_dest_ring_update_cnt;
2118+
__le32 mon_dest_ring_full_cnt;
2119+
__le32 rx_suspend_cnt;
2120+
__le32 rx_suspend_fail_cnt;
2121+
__le32 rx_resume_cnt;
2122+
__le32 rx_resume_fail_cnt;
2123+
__le32 rx_ring_switch_cnt;
2124+
__le32 rx_ring_restore_cnt;
2125+
__le32 rx_flush_cnt;
2126+
__le32 rx_recovery_reset_cnt;
2127+
__le32 rx_lwm_prom_filter_dis;
2128+
__le32 rx_hwm_prom_filter_en;
2129+
__le32 bytes_received_low_32;
2130+
__le32 bytes_received_high_32;
2131+
} __packed;
2132+
20782133
#endif

0 commit comments

Comments
 (0)