Message ID | 20240510050806.514126-6-quic_rgnanase@quicinc.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Kalle Valo |
Headers | show |
Series | wifi: ath12k: Add support to enable debugfs_htt_stats | expand |
On 5/9/2024 10:08 PM, Ramya Gnanasekar wrote: > Support to dump additional Tx PDEV stats through HTT stats debugfs. > Following stats dump are supported: > 1. PDEV control path stat to dump Tx management frame count > 2. Tx PDEV SIFS histogram stats > 3. Tx MU MIMO PPDU stats for 802.11ac, 802.11ax and 802.11be > > Sample Output: > -------------- > echo 1 > /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_PDEV_STATS_CMN_TLV: > mac_id = 0 > comp_delivered = 0 > self_triggers = 13 > ...... > ...... > HTT_TX_PDEV_STATS_CTRL_PATH_TX_STATS: > fw_tx_mgmt_subtype = 0:1, 1:0, 2:0, 3:0, 4:38, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:1, 12:0, 13:7, 14:0, 15:0, > > HTT_TX_PDEV_STATS_SIFS_HIST_TLV: > sifs_hist_status = 0:237, 1:185, 2:1, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > > HTT_TX_PDEV_MU_PPDU_DISTRIBUTION_STATS: > ac_mu_mimo_num_seq_posted_nr4 = 0 > ac_mu_mimo_num_ppdu_posted_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > ac_mu_mimo_num_ppdu_completed_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > ac_mu_mimo_num_seq_term_status_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, > > ac_mu_mimo_num_seq_posted_nr8 = 0 > ac_mu_mimo_num_ppdu_posted_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > ac_mu_mimo_num_ppdu_completed_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > ac_mu_mimo_num_seq_term_status_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, > > ax_mu_mimo_num_seq_posted_nr4 = 0 > ax_mu_mimo_num_ppdu_posted_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > ax_mu_mimo_num_ppdu_completed_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > ax_mu_mimo_num_seq_term_status_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, > > ax_mu_mimo_num_seq_posted_nr8 = 0 > ax_mu_mimo_num_ppdu_posted_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > ax_mu_mimo_num_ppdu_completed_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > ax_mu_mimo_num_seq_term_status_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, > > be_mu_mimo_num_seq_posted_nr4 = 0 > be_mu_mimo_num_ppdu_posted_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > be_mu_mimo_num_ppdu_completed_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > be_mu_mimo_num_seq_term_status_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, > > be_mu_mimo_num_seq_posted_nr8 = 0 > be_mu_mimo_num_ppdu_posted_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > be_mu_mimo_num_ppdu_completed_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > be_mu_mimo_num_seq_term_status_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, > > 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.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3 > > Signed-off-by: Ramya Gnanasekar <quic_rgnanase@quicinc.com> Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
Ramya Gnanasekar <quic_rgnanase@quicinc.com> writes: > Support to dump additional Tx PDEV stats through HTT stats debugfs. > Following stats dump are supported: > 1. PDEV control path stat to dump Tx management frame count > 2. Tx PDEV SIFS histogram stats > 3. Tx MU MIMO PPDU stats for 802.11ac, 802.11ax and 802.11be > > Sample Output: > -------------- > echo 1 > /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_PDEV_STATS_CMN_TLV: > mac_id = 0 > comp_delivered = 0 > self_triggers = 13 > ...... > ...... > HTT_TX_PDEV_STATS_CTRL_PATH_TX_STATS: > fw_tx_mgmt_subtype = 0:1, 1:0, 2:0, 3:0, 4:38, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:1, 12:0, 13:7, 14:0, 15:0, > > HTT_TX_PDEV_STATS_SIFS_HIST_TLV: > sifs_hist_status = 0:237, 1:185, 2:1, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > > HTT_TX_PDEV_MU_PPDU_DISTRIBUTION_STATS: > ac_mu_mimo_num_seq_posted_nr4 = 0 > ac_mu_mimo_num_ppdu_posted_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > ac_mu_mimo_num_ppdu_completed_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > ac_mu_mimo_num_seq_term_status_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, > > ac_mu_mimo_num_seq_posted_nr8 = 0 > ac_mu_mimo_num_ppdu_posted_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > ac_mu_mimo_num_ppdu_completed_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > ac_mu_mimo_num_seq_term_status_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, > > ax_mu_mimo_num_seq_posted_nr4 = 0 > ax_mu_mimo_num_ppdu_posted_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > ax_mu_mimo_num_ppdu_completed_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > ax_mu_mimo_num_seq_term_status_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, > > ax_mu_mimo_num_seq_posted_nr8 = 0 > ax_mu_mimo_num_ppdu_posted_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > ax_mu_mimo_num_ppdu_completed_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > ax_mu_mimo_num_seq_term_status_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, > > be_mu_mimo_num_seq_posted_nr4 = 0 > be_mu_mimo_num_ppdu_posted_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > be_mu_mimo_num_ppdu_completed_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > be_mu_mimo_num_seq_term_status_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, > > be_mu_mimo_num_seq_posted_nr8 = 0 > be_mu_mimo_num_ppdu_posted_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > be_mu_mimo_num_ppdu_completed_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > be_mu_mimo_num_seq_term_status_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, > > 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.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3 > > Signed-off-by: Ramya Gnanasekar <quic_rgnanase@quicinc.com> [...] > +static inline void > +ath12k_htt_print_tx_pdev_mu_ppdu_dist_stats_tlv(const void *tag_buf, > + struct debug_htt_stats_req *stats_req) > +{ > + const struct ath12k_htt_tx_pdev_mu_ppdu_dist_stats_tlv *htt_stats_buf = tag_buf; > + char *mode; > + u8 j, hw_mode, i, str_buf_len; > + u8 *buf = stats_req->buf; > + u32 len = stats_req->buf_len; > + u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; > + u32 stats_value; > + u8 max_ppdu = ATH12K_HTT_STATS_MAX_NUM_MU_PPDU_PER_BURST; > + u8 max_sched = ATH12K_HTT_STATS_MAX_NUM_SCHED_STATUS; > + char str_buf[ATH12K_HTT_MAX_STRING_LEN]; > + > + hw_mode = le32_to_cpu(htt_stats_buf->hw_mode); > + > + switch (hw_mode) { > + case ATH12K_HTT_STATS_HWMODE_AC: > + len += scnprintf(buf + len, buf_len - len, > + "HTT_TX_PDEV_MU_PPDU_DISTRIBUTION_STATS:\n"); > + mode = "ac"; > + break; > + case ATH12K_HTT_STATS_HWMODE_AX: > + mode = "ax"; > + break; > + case ATH12K_HTT_STATS_HWMODE_BE: > + mode = "be"; > + break; > + default: > + return; > + } Why are we not adding "HTT_TX_PDEV_MU_PPDU_DISTRIBUTION_STATS:\n" with ax and be modes?
On 5/21/2024 1:30 PM, Kalle Valo wrote: > Ramya Gnanasekar <quic_rgnanase@quicinc.com> writes: > >> Support to dump additional Tx PDEV stats through HTT stats debugfs. >> Following stats dump are supported: >> 1. PDEV control path stat to dump Tx management frame count >> 2. Tx PDEV SIFS histogram stats >> 3. Tx MU MIMO PPDU stats for 802.11ac, 802.11ax and 802.11be >> >> Sample Output: >> -------------- >> echo 1 > /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_PDEV_STATS_CMN_TLV: >> mac_id = 0 >> comp_delivered = 0 >> self_triggers = 13 >> ...... >> ...... >> HTT_TX_PDEV_STATS_CTRL_PATH_TX_STATS: >> fw_tx_mgmt_subtype = 0:1, 1:0, 2:0, 3:0, 4:38, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:1, 12:0, 13:7, 14:0, 15:0, >> >> HTT_TX_PDEV_STATS_SIFS_HIST_TLV: >> sifs_hist_status = 0:237, 1:185, 2:1, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, >> >> HTT_TX_PDEV_MU_PPDU_DISTRIBUTION_STATS: >> ac_mu_mimo_num_seq_posted_nr4 = 0 >> ac_mu_mimo_num_ppdu_posted_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, >> ac_mu_mimo_num_ppdu_completed_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, >> ac_mu_mimo_num_seq_term_status_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, >> >> ac_mu_mimo_num_seq_posted_nr8 = 0 >> ac_mu_mimo_num_ppdu_posted_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, >> ac_mu_mimo_num_ppdu_completed_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, >> ac_mu_mimo_num_seq_term_status_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, >> >> ax_mu_mimo_num_seq_posted_nr4 = 0 >> ax_mu_mimo_num_ppdu_posted_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, >> ax_mu_mimo_num_ppdu_completed_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, >> ax_mu_mimo_num_seq_term_status_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, >> >> ax_mu_mimo_num_seq_posted_nr8 = 0 >> ax_mu_mimo_num_ppdu_posted_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, >> ax_mu_mimo_num_ppdu_completed_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, >> ax_mu_mimo_num_seq_term_status_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, >> >> be_mu_mimo_num_seq_posted_nr4 = 0 >> be_mu_mimo_num_ppdu_posted_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, >> be_mu_mimo_num_ppdu_completed_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, >> be_mu_mimo_num_seq_term_status_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, >> >> be_mu_mimo_num_seq_posted_nr8 = 0 >> be_mu_mimo_num_ppdu_posted_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, >> be_mu_mimo_num_ppdu_completed_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, >> be_mu_mimo_num_seq_term_status_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, >> >> 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.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3 >> >> Signed-off-by: Ramya Gnanasekar <quic_rgnanase@quicinc.com> > > [...] > >> +static inline void >> +ath12k_htt_print_tx_pdev_mu_ppdu_dist_stats_tlv(const void *tag_buf, >> + struct debug_htt_stats_req *stats_req) >> +{ >> + const struct ath12k_htt_tx_pdev_mu_ppdu_dist_stats_tlv *htt_stats_buf = tag_buf; >> + char *mode; >> + u8 j, hw_mode, i, str_buf_len; >> + u8 *buf = stats_req->buf; >> + u32 len = stats_req->buf_len; >> + u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; >> + u32 stats_value; >> + u8 max_ppdu = ATH12K_HTT_STATS_MAX_NUM_MU_PPDU_PER_BURST; >> + u8 max_sched = ATH12K_HTT_STATS_MAX_NUM_SCHED_STATUS; >> + char str_buf[ATH12K_HTT_MAX_STRING_LEN]; >> + >> + hw_mode = le32_to_cpu(htt_stats_buf->hw_mode); >> + >> + switch (hw_mode) { >> + case ATH12K_HTT_STATS_HWMODE_AC: >> + len += scnprintf(buf + len, buf_len - len, >> + "HTT_TX_PDEV_MU_PPDU_DISTRIBUTION_STATS:\n"); >> + mode = "ac"; >> + break; >> + case ATH12K_HTT_STATS_HWMODE_AX: >> + mode = "ax"; >> + break; >> + case ATH12K_HTT_STATS_HWMODE_BE: >> + mode = "be"; >> + break; >> + default: >> + return; >> + } > > Why are we not adding "HTT_TX_PDEV_MU_PPDU_DISTRIBUTION_STATS:\n" with > ax and be modes? > Sorry for the delayed response. I was on OoO for a week. We will receive this TLV for each hw modes. Since "HTT_TX_PDEV_MU_PPDU_DISTRIBUTION_STATS:\n" is header and it would be suffice to print it once, hence added it inside hw mode ac which will be the first hw mode integrated inside the TLV.
Ramya Gnanasekar <quic_rgnanase@quicinc.com> writes: >>> +static inline void >>> +ath12k_htt_print_tx_pdev_mu_ppdu_dist_stats_tlv(const void *tag_buf, >>> + struct debug_htt_stats_req *stats_req) >>> +{ >>> + const struct ath12k_htt_tx_pdev_mu_ppdu_dist_stats_tlv >>> *htt_stats_buf = tag_buf; >>> + char *mode; >>> + u8 j, hw_mode, i, str_buf_len; >>> + u8 *buf = stats_req->buf; >>> + u32 len = stats_req->buf_len; >>> + u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; >>> + u32 stats_value; >>> + u8 max_ppdu = ATH12K_HTT_STATS_MAX_NUM_MU_PPDU_PER_BURST; >>> + u8 max_sched = ATH12K_HTT_STATS_MAX_NUM_SCHED_STATUS; >>> + char str_buf[ATH12K_HTT_MAX_STRING_LEN]; >>> + >>> + hw_mode = le32_to_cpu(htt_stats_buf->hw_mode); >>> + >>> + switch (hw_mode) { >>> + case ATH12K_HTT_STATS_HWMODE_AC: >>> + len += scnprintf(buf + len, buf_len - len, >>> + "HTT_TX_PDEV_MU_PPDU_DISTRIBUTION_STATS:\n"); >>> + mode = "ac"; >>> + break; >>> + case ATH12K_HTT_STATS_HWMODE_AX: >>> + mode = "ax"; >>> + break; >>> + case ATH12K_HTT_STATS_HWMODE_BE: >>> + mode = "be"; >>> + break; >>> + default: >>> + return; >>> + } >> >> Why are we not adding "HTT_TX_PDEV_MU_PPDU_DISTRIBUTION_STATS:\n" with >> ax and be modes? >> > Sorry for the delayed response. I was on OoO for a week. No worries. > We will receive this TLV for each hw modes. Since > "HTT_TX_PDEV_MU_PPDU_DISTRIBUTION_STATS:\n" is header and it would be > suffice to print it once, hence added it inside hw mode ac which will be > the first hw mode integrated inside the TLV. I would have expected that we print that outside of ath12k_htt_print_tx_pdev_mu_ppdu_dist_stats_tlv(), before the function is called at all.
On 5/28/2024 4:36 PM, Kalle Valo wrote: > Ramya Gnanasekar <quic_rgnanase@quicinc.com> writes: > >>>> +static inline void >>>> +ath12k_htt_print_tx_pdev_mu_ppdu_dist_stats_tlv(const void *tag_buf, >>>> + struct debug_htt_stats_req *stats_req) >>>> +{ >>>> + const struct ath12k_htt_tx_pdev_mu_ppdu_dist_stats_tlv >>>> *htt_stats_buf = tag_buf; >>>> + char *mode; >>>> + u8 j, hw_mode, i, str_buf_len; >>>> + u8 *buf = stats_req->buf; >>>> + u32 len = stats_req->buf_len; >>>> + u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; >>>> + u32 stats_value; >>>> + u8 max_ppdu = ATH12K_HTT_STATS_MAX_NUM_MU_PPDU_PER_BURST; >>>> + u8 max_sched = ATH12K_HTT_STATS_MAX_NUM_SCHED_STATUS; >>>> + char str_buf[ATH12K_HTT_MAX_STRING_LEN]; >>>> + >>>> + hw_mode = le32_to_cpu(htt_stats_buf->hw_mode); >>>> + >>>> + switch (hw_mode) { >>>> + case ATH12K_HTT_STATS_HWMODE_AC: >>>> + len += scnprintf(buf + len, buf_len - len, >>>> + "HTT_TX_PDEV_MU_PPDU_DISTRIBUTION_STATS:\n"); >>>> + mode = "ac"; >>>> + break; >>>> + case ATH12K_HTT_STATS_HWMODE_AX: >>>> + mode = "ax"; >>>> + break; >>>> + case ATH12K_HTT_STATS_HWMODE_BE: >>>> + mode = "be"; >>>> + break; >>>> + default: >>>> + return; >>>> + } >>> >>> Why are we not adding "HTT_TX_PDEV_MU_PPDU_DISTRIBUTION_STATS:\n" with >>> ax and be modes? >>> >> Sorry for the delayed response. I was on OoO for a week. > > No worries. > >> We will receive this TLV for each hw modes. Since >> "HTT_TX_PDEV_MU_PPDU_DISTRIBUTION_STATS:\n" is header and it would be >> suffice to print it once, hence added it inside hw mode ac which will be >> the first hw mode integrated inside the TLV. > > I would have expected that we print that outside of > ath12k_htt_print_tx_pdev_mu_ppdu_dist_stats_tlv(), before the function > is called at all. > Function itself will be called more than once. The overall HTT TLV will be integrated with tag HTT_STATS_MU_PPDU_DIST_TAG (129) for all the hw modes separately.
Ramya Gnanasekar <quic_rgnanase@quicinc.com> writes: > On 5/28/2024 4:36 PM, Kalle Valo wrote: >> Ramya Gnanasekar <quic_rgnanase@quicinc.com> writes: >> >>>>> +static inline void >>>>> +ath12k_htt_print_tx_pdev_mu_ppdu_dist_stats_tlv(const void *tag_buf, >>>>> + struct debug_htt_stats_req *stats_req) >>>>> +{ >>>>> + const struct ath12k_htt_tx_pdev_mu_ppdu_dist_stats_tlv >>>>> *htt_stats_buf = tag_buf; >>>>> + char *mode; >>>>> + u8 j, hw_mode, i, str_buf_len; >>>>> + u8 *buf = stats_req->buf; >>>>> + u32 len = stats_req->buf_len; >>>>> + u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; >>>>> + u32 stats_value; >>>>> + u8 max_ppdu = ATH12K_HTT_STATS_MAX_NUM_MU_PPDU_PER_BURST; >>>>> + u8 max_sched = ATH12K_HTT_STATS_MAX_NUM_SCHED_STATUS; >>>>> + char str_buf[ATH12K_HTT_MAX_STRING_LEN]; >>>>> + >>>>> + hw_mode = le32_to_cpu(htt_stats_buf->hw_mode); >>>>> + >>>>> + switch (hw_mode) { >>>>> + case ATH12K_HTT_STATS_HWMODE_AC: >>>>> + len += scnprintf(buf + len, buf_len - len, >>>>> + "HTT_TX_PDEV_MU_PPDU_DISTRIBUTION_STATS:\n"); >>>>> + mode = "ac"; >>>>> + break; >>>>> + case ATH12K_HTT_STATS_HWMODE_AX: >>>>> + mode = "ax"; >>>>> + break; >>>>> + case ATH12K_HTT_STATS_HWMODE_BE: >>>>> + mode = "be"; >>>>> + break; >>>>> + default: >>>>> + return; >>>>> + } >>>> >>>> Why are we not adding "HTT_TX_PDEV_MU_PPDU_DISTRIBUTION_STATS:\n" with >>>> ax and be modes? >>>> >>> Sorry for the delayed response. I was on OoO for a week. >> >> No worries. >> >>> We will receive this TLV for each hw modes. Since >>> "HTT_TX_PDEV_MU_PPDU_DISTRIBUTION_STATS:\n" is header and it would be >>> suffice to print it once, hence added it inside hw mode ac which will be >>> the first hw mode integrated inside the TLV. >> >> I would have expected that we print that outside of >> ath12k_htt_print_tx_pdev_mu_ppdu_dist_stats_tlv(), before the function >> is called at all. >> > > Function itself will be called more than once. Sure, I got that. But I still think it is not really good design to print it like that. Maybe the output could be something like below? Or print the mode separate in the first line? HTT_TX_PDEV_MU_PPDU_DISTRIBUTION_STATS: ac_mu_mimo_num_seq_posted_nr4 = 0 ac_mu_mimo_num_ppdu_posted_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, ac_mu_mimo_num_ppdu_completed_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, ac_mu_mimo_num_seq_term_status_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, .... HTT_TX_PDEV_MU_PPDU_DISTRIBUTION_STATS: ax_mu_mimo_num_seq_posted_nr4 = 0 ax_mu_mimo_num_ppdu_posted_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, ax_mu_mimo_num_ppdu_completed_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, ax_mu_mimo_num_seq_term_status_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, ax_mu_mimo_num_seq_posted_nr8 = 0 ax_mu_mimo_num_ppdu_posted_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, ax_mu_mimo_num_ppdu_completed_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, ax_mu_mimo_num_seq_term_status_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0,
On 5/31/2024 11:30 PM, Kalle Valo wrote: > Ramya Gnanasekar <quic_rgnanase@quicinc.com> writes: > >> On 5/28/2024 4:36 PM, Kalle Valo wrote: >>> Ramya Gnanasekar <quic_rgnanase@quicinc.com> writes: >>> >>>>>> +static inline void >>>>>> +ath12k_htt_print_tx_pdev_mu_ppdu_dist_stats_tlv(const void *tag_buf, >>>>>> + struct debug_htt_stats_req *stats_req) >>>>>> +{ >>>>>> + const struct ath12k_htt_tx_pdev_mu_ppdu_dist_stats_tlv >>>>>> *htt_stats_buf = tag_buf; >>>>>> + char *mode; >>>>>> + u8 j, hw_mode, i, str_buf_len; >>>>>> + u8 *buf = stats_req->buf; >>>>>> + u32 len = stats_req->buf_len; >>>>>> + u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; >>>>>> + u32 stats_value; >>>>>> + u8 max_ppdu = ATH12K_HTT_STATS_MAX_NUM_MU_PPDU_PER_BURST; >>>>>> + u8 max_sched = ATH12K_HTT_STATS_MAX_NUM_SCHED_STATUS; >>>>>> + char str_buf[ATH12K_HTT_MAX_STRING_LEN]; >>>>>> + >>>>>> + hw_mode = le32_to_cpu(htt_stats_buf->hw_mode); >>>>>> + >>>>>> + switch (hw_mode) { >>>>>> + case ATH12K_HTT_STATS_HWMODE_AC: >>>>>> + len += scnprintf(buf + len, buf_len - len, >>>>>> + "HTT_TX_PDEV_MU_PPDU_DISTRIBUTION_STATS:\n"); >>>>>> + mode = "ac"; >>>>>> + break; >>>>>> + case ATH12K_HTT_STATS_HWMODE_AX: >>>>>> + mode = "ax"; >>>>>> + break; >>>>>> + case ATH12K_HTT_STATS_HWMODE_BE: >>>>>> + mode = "be"; >>>>>> + break; >>>>>> + default: >>>>>> + return; >>>>>> + } >>>>> >>>>> Why are we not adding "HTT_TX_PDEV_MU_PPDU_DISTRIBUTION_STATS:\n" with >>>>> ax and be modes? >>>>> >>>> Sorry for the delayed response. I was on OoO for a week. >>> >>> No worries. >>> >>>> We will receive this TLV for each hw modes. Since >>>> "HTT_TX_PDEV_MU_PPDU_DISTRIBUTION_STATS:\n" is header and it would be >>>> suffice to print it once, hence added it inside hw mode ac which will be >>>> the first hw mode integrated inside the TLV. >>> >>> I would have expected that we print that outside of >>> ath12k_htt_print_tx_pdev_mu_ppdu_dist_stats_tlv(), before the function >>> is called at all. >>> >> >> Function itself will be called more than once. > > Sure, I got that. But I still think it is not really good design to > print it like that. > > Maybe the output could be something like below? Or print the mode > separate in the first line? > > HTT_TX_PDEV_MU_PPDU_DISTRIBUTION_STATS: > > ac_mu_mimo_num_seq_posted_nr4 = 0 > ac_mu_mimo_num_ppdu_posted_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > ac_mu_mimo_num_ppdu_completed_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > ac_mu_mimo_num_seq_term_status_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, > > .... > > HTT_TX_PDEV_MU_PPDU_DISTRIBUTION_STATS: > > ax_mu_mimo_num_seq_posted_nr4 = 0 > ax_mu_mimo_num_ppdu_posted_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > ax_mu_mimo_num_ppdu_completed_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > ax_mu_mimo_num_seq_term_status_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, > > ax_mu_mimo_num_seq_posted_nr8 = 0 > ax_mu_mimo_num_ppdu_posted_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > ax_mu_mimo_num_ppdu_completed_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, > ax_mu_mimo_num_seq_term_status_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, > Sure Kalle. I understand. Will change like below and re-spin with all the comments addressed: HTT_TX_PDEV_AC_MU_PPDU_DISTRIBUTION_STATS: ac_mu_mimo_num_seq_posted_nr4 = 0 ac_mu_mimo_num_ppdu_posted_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, ac_mu_mimo_num_ppdu_completed_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, ac_mu_mimo_num_seq_term_status_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, ...... ...... HTT_TX_PDEV_AX_MU_PPDU_DISTRIBUTION_STATS: ax_mu_mimo_num_seq_posted_nr4 = 0 ax_mu_mimo_num_ppdu_posted_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, ax_mu_mimo_num_ppdu_completed_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, ax_mu_mimo_num_seq_term_status_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, ...... ......
diff --git a/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c b/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c index 0be20e4f4097..b4b58e49c33b 100644 --- a/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c +++ b/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c @@ -242,6 +242,123 @@ htt_print_tx_pdev_stats_sifs_tlv(const void *tag_buf, stats_req->buf_len = len; } +static inline void +ath12k_htt_print_tx_pdev_mu_ppdu_dist_stats_tlv(const void *tag_buf, + struct debug_htt_stats_req *stats_req) +{ + const struct ath12k_htt_tx_pdev_mu_ppdu_dist_stats_tlv *htt_stats_buf = tag_buf; + char *mode; + u8 j, hw_mode, i, str_buf_len; + u8 *buf = stats_req->buf; + u32 len = stats_req->buf_len; + u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; + u32 stats_value; + u8 max_ppdu = ATH12K_HTT_STATS_MAX_NUM_MU_PPDU_PER_BURST; + u8 max_sched = ATH12K_HTT_STATS_MAX_NUM_SCHED_STATUS; + char str_buf[ATH12K_HTT_MAX_STRING_LEN]; + + hw_mode = le32_to_cpu(htt_stats_buf->hw_mode); + + switch (hw_mode) { + case ATH12K_HTT_STATS_HWMODE_AC: + len += scnprintf(buf + len, buf_len - len, + "HTT_TX_PDEV_MU_PPDU_DISTRIBUTION_STATS:\n"); + mode = "ac"; + break; + case ATH12K_HTT_STATS_HWMODE_AX: + mode = "ax"; + break; + case ATH12K_HTT_STATS_HWMODE_BE: + mode = "be"; + break; + default: + return; + } + + for (i = 0; i < ATH12K_HTT_STATS_NUM_NR_BINS ; i++) { + len += scnprintf(buf + len, buf_len - len, + "%s_mu_mimo_num_seq_posted_nr%u = %u\n", mode, + ((i + 1) * 4), htt_stats_buf->num_seq_posted[i]); + str_buf_len = 0; + memset(str_buf, 0x0, sizeof(str_buf)); + for (j = 0; j < ATH12K_HTT_STATS_MAX_NUM_MU_PPDU_PER_BURST ; j++) { + stats_value = le32_to_cpu(htt_stats_buf->num_ppdu_posted_per_burst + [i * max_ppdu + j]); + str_buf_len += scnprintf(&str_buf[str_buf_len], + ATH12K_HTT_MAX_STRING_LEN - str_buf_len, + " %u:%u,", j, stats_value); + } + len += scnprintf(buf + len, buf_len - len, + "%s_mu_mimo_num_ppdu_posted_per_burst_nr%u = %s\n", + mode, ((i + 1) * 4), str_buf); + str_buf_len = 0; + memset(str_buf, 0x0, sizeof(str_buf)); + for (j = 0; j < ATH12K_HTT_STATS_MAX_NUM_MU_PPDU_PER_BURST ; j++) { + stats_value = le32_to_cpu(htt_stats_buf->num_ppdu_cmpl_per_burst + [i * max_ppdu + j]); + str_buf_len += scnprintf(&str_buf[str_buf_len], + ATH12K_HTT_MAX_STRING_LEN - str_buf_len, + " %u:%u,", j, stats_value); + } + len += scnprintf(buf + len, buf_len - len, + "%s_mu_mimo_num_ppdu_completed_per_burst_nr%u = %s\n", + mode, ((i + 1) * 4), str_buf); + str_buf_len = 0; + memset(str_buf, 0x0, sizeof(str_buf)); + for (j = 0; j < ATH12K_HTT_STATS_MAX_NUM_SCHED_STATUS ; j++) { + stats_value = le32_to_cpu(htt_stats_buf->num_seq_term_status + [i * max_sched + j]); + str_buf_len += scnprintf(&str_buf[str_buf_len], + ATH12K_HTT_MAX_STRING_LEN - str_buf_len, + " %u:%u,", j, stats_value); + } + len += scnprintf(buf + len, buf_len - len, + "%s_mu_mimo_num_seq_term_status_nr%u = %s\n\n", + mode, ((i + 1) * 4), str_buf); + } + + stats_req->buf_len = len; +} + +static inline void +ath12k_htt_print_tx_pdev_stats_sifs_hist_tlv(const void *tag_buf, + u16 tag_len, + struct debug_htt_stats_req *stats_req) +{ + const struct ath12k_htt_tx_pdev_stats_sifs_hist_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), + ATH12K_HTT_TX_PDEV_MAX_SIFS_BURST_HIST_STATS); + + len += scnprintf(buf + len, buf_len - len, + "HTT_TX_PDEV_STATS_SIFS_HIST_TLV:\n"); + + len += print_array_to_buf(buf, len, "sifs_hist_status", + htt_stats_buf->sifs_hist_status, num_elems); + + stats_req->buf_len = len; +} + +static inline void +ath12k_htt_print_pdev_ctrl_path_tx_stats_tlv(const void *tag_buf, + struct debug_htt_stats_req *stats_req) +{ + const struct ath12k_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_TX_PDEV_STATS_CTRL_PATH_TX_STATS:\n"); + len += print_array_to_buf(buf, len, "fw_tx_mgmt_subtype", + htt_stats_buf->fw_tx_mgmt_subtype, + ATH12K_HTT_STATS_SUBTYPE_MAX); + + 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) @@ -261,6 +378,15 @@ static int ath12k_dbg_htt_ext_stats_parse(struct ath12k_base *ab, case HTT_STATS_TX_PDEV_FLUSH_TAG: htt_print_tx_pdev_stats_flush_tlv(tag_buf, len, stats_req); break; + case HTT_STATS_TX_PDEV_SIFS_HIST_TAG: + ath12k_htt_print_tx_pdev_stats_sifs_hist_tlv(tag_buf, len, stats_req); + break; + case HTT_STATS_PDEV_CTRL_PATH_TX_STATS_TAG: + ath12k_htt_print_pdev_ctrl_path_tx_stats_tlv(tag_buf, stats_req); + break; + case HTT_STATS_MU_PPDU_DIST_TAG: + ath12k_htt_print_tx_pdev_mu_ppdu_dist_stats_tlv(tag_buf, stats_req); + break; default: break; } diff --git a/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.h b/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.h index 477ae75f8175..885630fdcb37 100644 --- a/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.h +++ b/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.h @@ -11,6 +11,8 @@ #define ATH12K_HTT_STATS_COOKIE_LSB GENMASK_ULL(31, 0) #define ATH12K_HTT_STATS_COOKIE_MSB GENMASK_ULL(63, 32) #define ATH12K_HTT_STATS_MAGIC_VALUE 0xF0F0F0F0 +#define ATH12K_HTT_STATS_SUBTYPE_MAX 16 +#define ATH12K_HTT_MAX_STRING_LEN 256 #define ATH12K_HTT_STATS_RESET_BITMAP32_OFFSET(_idx) ((_idx) & 0x1f) #define ATH12K_HTT_STATS_RESET_BITMAP64_OFFSET(_idx) ((_idx) & 0x3f) @@ -133,6 +135,9 @@ enum ath12k_dbg_htt_tlv_tag { HTT_STATS_TX_PDEV_UNDERRUN_TAG = 1, HTT_STATS_TX_PDEV_SIFS_TAG = 2, HTT_STATS_TX_PDEV_FLUSH_TAG = 3, + HTT_STATS_TX_PDEV_SIFS_HIST_TAG = 67, + HTT_STATS_PDEV_CTRL_PATH_TX_STATS_TAG = 102, + HTT_STATS_MU_PPDU_DIST_TAG = 129, HTT_STATS_MAX_TAG, }; @@ -142,6 +147,18 @@ enum ath12k_dbg_htt_tlv_tag { #define ATH12K_HTT_TX_PDEV_MAX_SIFS_BURST_STATS 9 #define ATH12K_HTT_TX_PDEV_MAX_FLUSH_REASON_STATS 150 +/* MU MIMO distribution stats is a 2-dimensional array + * with dimension one denoting stats for nr4[0] or nr8[1] + */ +#define ATH12K_HTT_STATS_NUM_NR_BINS 2 +#define ATH12K_HTT_STATS_MAX_NUM_MU_PPDU_PER_BURST 10 +#define ATH12K_HTT_TX_PDEV_MAX_SIFS_BURST_HIST_STATS 10 +#define ATH12K_HTT_STATS_MAX_NUM_SCHED_STATUS 9 +#define ATH12K_HTT_STATS_NUM_SCHED_STATUS_WORDS \ + (ATH12K_HTT_STATS_NUM_NR_BINS * ATH12K_HTT_STATS_MAX_NUM_SCHED_STATUS) +#define ATH12K_HTT_STATS_MU_PPDU_PER_BURST_WORDS \ + (ATH12K_HTT_STATS_NUM_NR_BINS * ATH12K_HTT_STATS_MAX_NUM_MU_PPDU_PER_BURST) + enum ath12k_htt_tx_pdev_underrun_enum { HTT_STATS_TX_PDEV_NO_DATA_UNDERRUN = 0, HTT_STATS_TX_PDEV_DATA_UNDERRUN_BETWEEN_MPDU = 1, @@ -258,4 +275,26 @@ struct ath12k_htt_tx_pdev_stats_sifs_tlv { DECLARE_FLEX_ARRAY(__le32, sifs_status); } __packed; +struct ath12k_htt_pdev_ctrl_path_tx_stats_tlv { + __le32 fw_tx_mgmt_subtype[ATH12K_HTT_STATS_SUBTYPE_MAX]; +} __packed; + +struct ath12k_htt_tx_pdev_stats_sifs_hist_tlv { + DECLARE_FLEX_ARRAY(__le32, sifs_hist_status); +} __packed; + +enum ath12k_htt_stats_hw_mode { + ATH12K_HTT_STATS_HWMODE_AC = 0, + ATH12K_HTT_STATS_HWMODE_AX = 1, + ATH12K_HTT_STATS_HWMODE_BE = 2, +}; + +struct ath12k_htt_tx_pdev_mu_ppdu_dist_stats_tlv { + __le32 hw_mode; + __le32 num_seq_term_status[ATH12K_HTT_STATS_NUM_SCHED_STATUS_WORDS]; + __le32 num_ppdu_cmpl_per_burst[ATH12K_HTT_STATS_MU_PPDU_PER_BURST_WORDS]; + __le32 num_seq_posted[ATH12K_HTT_STATS_NUM_NR_BINS]; + __le32 num_ppdu_posted_per_burst[ATH12K_HTT_STATS_MU_PPDU_PER_BURST_WORDS]; +} __packed; + #endif
Support to dump additional Tx PDEV stats through HTT stats debugfs. Following stats dump are supported: 1. PDEV control path stat to dump Tx management frame count 2. Tx PDEV SIFS histogram stats 3. Tx MU MIMO PPDU stats for 802.11ac, 802.11ax and 802.11be Sample Output: -------------- echo 1 > /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_PDEV_STATS_CMN_TLV: mac_id = 0 comp_delivered = 0 self_triggers = 13 ...... ...... HTT_TX_PDEV_STATS_CTRL_PATH_TX_STATS: fw_tx_mgmt_subtype = 0:1, 1:0, 2:0, 3:0, 4:38, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:1, 12:0, 13:7, 14:0, 15:0, HTT_TX_PDEV_STATS_SIFS_HIST_TLV: sifs_hist_status = 0:237, 1:185, 2:1, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, HTT_TX_PDEV_MU_PPDU_DISTRIBUTION_STATS: ac_mu_mimo_num_seq_posted_nr4 = 0 ac_mu_mimo_num_ppdu_posted_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, ac_mu_mimo_num_ppdu_completed_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, ac_mu_mimo_num_seq_term_status_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, ac_mu_mimo_num_seq_posted_nr8 = 0 ac_mu_mimo_num_ppdu_posted_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, ac_mu_mimo_num_ppdu_completed_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, ac_mu_mimo_num_seq_term_status_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, ax_mu_mimo_num_seq_posted_nr4 = 0 ax_mu_mimo_num_ppdu_posted_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, ax_mu_mimo_num_ppdu_completed_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, ax_mu_mimo_num_seq_term_status_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, ax_mu_mimo_num_seq_posted_nr8 = 0 ax_mu_mimo_num_ppdu_posted_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, ax_mu_mimo_num_ppdu_completed_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, ax_mu_mimo_num_seq_term_status_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, be_mu_mimo_num_seq_posted_nr4 = 0 be_mu_mimo_num_ppdu_posted_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, be_mu_mimo_num_ppdu_completed_per_burst_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, be_mu_mimo_num_seq_term_status_nr4 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, be_mu_mimo_num_seq_posted_nr8 = 0 be_mu_mimo_num_ppdu_posted_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, be_mu_mimo_num_ppdu_completed_per_burst_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, be_mu_mimo_num_seq_term_status_nr8 = 0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 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.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3 Signed-off-by: Ramya Gnanasekar <quic_rgnanase@quicinc.com> --- .../wireless/ath/ath12k/debugfs_htt_stats.c | 126 ++++++++++++++++++ .../wireless/ath/ath12k/debugfs_htt_stats.h | 39 ++++++ 2 files changed, 165 insertions(+)