1// SPDX-License-Identifier: BSD-3-Clause-Clear
2/*
3 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
4 * Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved.
5 */
6
7#include <linux/vmalloc.h>
8#include "core.h"
9#include "debug.h"
10#include "debugfs_htt_stats.h"
11#include "dp_tx.h"
12#include "dp_rx.h"
13
14static u32
15print_array_to_buf_index(u8 *buf, u32 offset, const char *header, u32 stats_index,
16 const __le32 *array, u32 array_len, const char *footer)
17{
18 int index = 0;
19 u8 i;
20
21 if (header) {
22 index += scnprintf(buf: buf + offset,
23 ATH12K_HTT_STATS_BUF_SIZE - offset,
24 fmt: "%s = ", header);
25 }
26 for (i = 0; i < array_len; i++) {
27 index += scnprintf(buf: buf + offset + index,
28 size: (ATH12K_HTT_STATS_BUF_SIZE - offset) - index,
29 fmt: " %u:%u,", stats_index++, le32_to_cpu(array[i]));
30 }
31 /* To overwrite the last trailing comma */
32 index--;
33 *(buf + offset + index) = '\0';
34
35 if (footer) {
36 index += scnprintf(buf: buf + offset + index,
37 size: (ATH12K_HTT_STATS_BUF_SIZE - offset) - index,
38 fmt: "%s", footer);
39 }
40 return index;
41}
42
43static u32
44print_array_to_buf(u8 *buf, u32 offset, const char *header,
45 const __le32 *array, u32 array_len, const char *footer)
46{
47 return print_array_to_buf_index(buf, offset, header, stats_index: 0, array, array_len,
48 footer);
49}
50
51static u32
52print_array_to_buf_s8(u8 *buf, u32 offset, const char *header, u32 stats_index,
53 const s8 *array, u32 array_len, const char *footer)
54{
55 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
56 int index = 0;
57 u8 i;
58
59 if (header)
60 index += scnprintf(buf: buf + offset, size: buf_len - offset, fmt: "%s = ", header);
61
62 for (i = 0; i < array_len; i++) {
63 index += scnprintf(buf: buf + offset + index, size: (buf_len - offset) - index,
64 fmt: " %u:%d,", stats_index++, array[i]);
65 }
66
67 index--;
68 if ((offset + index) < buf_len)
69 buf[offset + index] = '\0';
70
71 if (footer) {
72 index += scnprintf(buf: buf + offset + index, size: (buf_len - offset) - index,
73 fmt: "%s", footer);
74 }
75
76 return index;
77}
78
79static const char *ath12k_htt_ax_tx_rx_ru_size_to_str(u8 ru_size)
80{
81 switch (ru_size) {
82 case ATH12K_HTT_TX_RX_PDEV_STATS_AX_RU_SIZE_26:
83 return "26";
84 case ATH12K_HTT_TX_RX_PDEV_STATS_AX_RU_SIZE_52:
85 return "52";
86 case ATH12K_HTT_TX_RX_PDEV_STATS_AX_RU_SIZE_106:
87 return "106";
88 case ATH12K_HTT_TX_RX_PDEV_STATS_AX_RU_SIZE_242:
89 return "242";
90 case ATH12K_HTT_TX_RX_PDEV_STATS_AX_RU_SIZE_484:
91 return "484";
92 case ATH12K_HTT_TX_RX_PDEV_STATS_AX_RU_SIZE_996:
93 return "996";
94 case ATH12K_HTT_TX_RX_PDEV_STATS_AX_RU_SIZE_996x2:
95 return "996x2";
96 default:
97 return "unknown";
98 }
99}
100
101static const char *ath12k_htt_be_tx_rx_ru_size_to_str(u8 ru_size)
102{
103 switch (ru_size) {
104 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_26:
105 return "26";
106 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_52:
107 return "52";
108 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_52_26:
109 return "52+26";
110 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_106:
111 return "106";
112 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_106_26:
113 return "106+26";
114 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_242:
115 return "242";
116 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_484:
117 return "484";
118 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_484_242:
119 return "484+242";
120 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_996:
121 return "996";
122 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_996_484:
123 return "996+484";
124 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_996_484_242:
125 return "996+484+242";
126 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_996x2:
127 return "996x2";
128 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_996x2_484:
129 return "996x2+484";
130 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_996x3:
131 return "996x3";
132 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_996x3_484:
133 return "996x3+484";
134 case ATH12K_HTT_TX_RX_PDEV_STATS_BE_RU_SIZE_996x4:
135 return "996x4";
136 default:
137 return "unknown";
138 }
139}
140
141static const char*
142ath12k_tx_ru_size_to_str(enum ath12k_htt_stats_ru_type ru_type, u8 ru_size)
143{
144 if (ru_type == ATH12K_HTT_STATS_RU_TYPE_SINGLE_RU_ONLY)
145 return ath12k_htt_ax_tx_rx_ru_size_to_str(ru_size);
146 else if (ru_type == ATH12K_HTT_STATS_RU_TYPE_SINGLE_AND_MULTI_RU)
147 return ath12k_htt_be_tx_rx_ru_size_to_str(ru_size);
148 else
149 return "unknown";
150}
151
152static void
153htt_print_tx_pdev_stats_cmn_tlv(const void *tag_buf, u16 tag_len,
154 struct debug_htt_stats_req *stats_req)
155{
156 const struct ath12k_htt_tx_pdev_stats_cmn_tlv *htt_stats_buf = tag_buf;
157 u8 *buf = stats_req->buf;
158 u32 len = stats_req->buf_len;
159 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
160 u32 mac_id_word;
161
162 if (tag_len < sizeof(*htt_stats_buf))
163 return;
164
165 mac_id_word = le32_to_cpu(htt_stats_buf->mac_id__word);
166
167 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_TX_PDEV_STATS_CMN_TLV:\n");
168 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mac_id = %u\n",
169 u32_get_bits(v: mac_id_word, ATH12K_HTT_STATS_MAC_ID));
170 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "comp_delivered = %u\n",
171 le32_to_cpu(htt_stats_buf->comp_delivered));
172 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "self_triggers = %u\n",
173 le32_to_cpu(htt_stats_buf->self_triggers));
174 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "hw_queued = %u\n",
175 le32_to_cpu(htt_stats_buf->hw_queued));
176 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "hw_reaped = %u\n",
177 le32_to_cpu(htt_stats_buf->hw_reaped));
178 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "underrun = %u\n",
179 le32_to_cpu(htt_stats_buf->underrun));
180 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "hw_paused = %u\n",
181 le32_to_cpu(htt_stats_buf->hw_paused));
182 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "hw_flush = %u\n",
183 le32_to_cpu(htt_stats_buf->hw_flush));
184 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "hw_filt = %u\n",
185 le32_to_cpu(htt_stats_buf->hw_filt));
186 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_abort = %u\n",
187 le32_to_cpu(htt_stats_buf->tx_abort));
188 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ppdu_ok = %u\n",
189 le32_to_cpu(htt_stats_buf->ppdu_ok));
190 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mpdu_requeued = %u\n",
191 le32_to_cpu(htt_stats_buf->mpdu_requed));
192 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_xretry = %u\n",
193 le32_to_cpu(htt_stats_buf->tx_xretry));
194 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "data_rc = %u\n",
195 le32_to_cpu(htt_stats_buf->data_rc));
196 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mpdu_dropped_xretry = %u\n",
197 le32_to_cpu(htt_stats_buf->mpdu_dropped_xretry));
198 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "illegal_rate_phy_err = %u\n",
199 le32_to_cpu(htt_stats_buf->illgl_rate_phy_err));
200 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cont_xretry = %u\n",
201 le32_to_cpu(htt_stats_buf->cont_xretry));
202 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_timeout = %u\n",
203 le32_to_cpu(htt_stats_buf->tx_timeout));
204 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_time_dur_data = %u\n",
205 le32_to_cpu(htt_stats_buf->tx_time_dur_data));
206 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "pdev_resets = %u\n",
207 le32_to_cpu(htt_stats_buf->pdev_resets));
208 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "phy_underrun = %u\n",
209 le32_to_cpu(htt_stats_buf->phy_underrun));
210 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "txop_ovf = %u\n",
211 le32_to_cpu(htt_stats_buf->txop_ovf));
212 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "seq_posted = %u\n",
213 le32_to_cpu(htt_stats_buf->seq_posted));
214 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "seq_failed_queueing = %u\n",
215 le32_to_cpu(htt_stats_buf->seq_failed_queueing));
216 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "seq_completed = %u\n",
217 le32_to_cpu(htt_stats_buf->seq_completed));
218 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "seq_restarted = %u\n",
219 le32_to_cpu(htt_stats_buf->seq_restarted));
220 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "seq_txop_repost_stop = %u\n",
221 le32_to_cpu(htt_stats_buf->seq_txop_repost_stop));
222 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "next_seq_cancel = %u\n",
223 le32_to_cpu(htt_stats_buf->next_seq_cancel));
224 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "dl_mu_mimo_seq_posted = %u\n",
225 le32_to_cpu(htt_stats_buf->mu_seq_posted));
226 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "dl_mu_ofdma_seq_posted = %u\n",
227 le32_to_cpu(htt_stats_buf->mu_ofdma_seq_posted));
228 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ul_mu_mimo_seq_posted = %u\n",
229 le32_to_cpu(htt_stats_buf->ul_mumimo_seq_posted));
230 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ul_mu_ofdma_seq_posted = %u\n",
231 le32_to_cpu(htt_stats_buf->ul_ofdma_seq_posted));
232 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mu_mimo_peer_blacklisted = %u\n",
233 le32_to_cpu(htt_stats_buf->num_mu_peer_blacklisted));
234 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "seq_qdepth_repost_stop = %u\n",
235 le32_to_cpu(htt_stats_buf->seq_qdepth_repost_stop));
236 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "seq_min_msdu_repost_stop = %u\n",
237 le32_to_cpu(htt_stats_buf->seq_min_msdu_repost_stop));
238 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mu_seq_min_msdu_repost_stop = %u\n",
239 le32_to_cpu(htt_stats_buf->mu_seq_min_msdu_repost_stop));
240 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "seq_switch_hw_paused = %u\n",
241 le32_to_cpu(htt_stats_buf->seq_switch_hw_paused));
242 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "next_seq_posted_dsr = %u\n",
243 le32_to_cpu(htt_stats_buf->next_seq_posted_dsr));
244 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "seq_posted_isr = %u\n",
245 le32_to_cpu(htt_stats_buf->seq_posted_isr));
246 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "seq_ctrl_cached = %u\n",
247 le32_to_cpu(htt_stats_buf->seq_ctrl_cached));
248 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mpdu_count_tqm = %u\n",
249 le32_to_cpu(htt_stats_buf->mpdu_count_tqm));
250 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "msdu_count_tqm = %u\n",
251 le32_to_cpu(htt_stats_buf->msdu_count_tqm));
252 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mpdu_removed_tqm = %u\n",
253 le32_to_cpu(htt_stats_buf->mpdu_removed_tqm));
254 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "msdu_removed_tqm = %u\n",
255 le32_to_cpu(htt_stats_buf->msdu_removed_tqm));
256 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "remove_mpdus_max_retries = %u\n",
257 le32_to_cpu(htt_stats_buf->remove_mpdus_max_retries));
258 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mpdus_sw_flush = %u\n",
259 le32_to_cpu(htt_stats_buf->mpdus_sw_flush));
260 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mpdus_hw_filter = %u\n",
261 le32_to_cpu(htt_stats_buf->mpdus_hw_filter));
262 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mpdus_truncated = %u\n",
263 le32_to_cpu(htt_stats_buf->mpdus_truncated));
264 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mpdus_ack_failed = %u\n",
265 le32_to_cpu(htt_stats_buf->mpdus_ack_failed));
266 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mpdus_expired = %u\n",
267 le32_to_cpu(htt_stats_buf->mpdus_expired));
268 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mpdus_seq_hw_retry = %u\n",
269 le32_to_cpu(htt_stats_buf->mpdus_seq_hw_retry));
270 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ack_tlv_proc = %u\n",
271 le32_to_cpu(htt_stats_buf->ack_tlv_proc));
272 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "coex_abort_mpdu_cnt_valid = %u\n",
273 le32_to_cpu(htt_stats_buf->coex_abort_mpdu_cnt_valid));
274 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "coex_abort_mpdu_cnt = %u\n",
275 le32_to_cpu(htt_stats_buf->coex_abort_mpdu_cnt));
276 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_total_ppdus_tried_ota = %u\n",
277 le32_to_cpu(htt_stats_buf->num_total_ppdus_tried_ota));
278 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_data_ppdus_tried_ota = %u\n",
279 le32_to_cpu(htt_stats_buf->num_data_ppdus_tried_ota));
280 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "local_ctrl_mgmt_enqued = %u\n",
281 le32_to_cpu(htt_stats_buf->local_ctrl_mgmt_enqued));
282 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "local_ctrl_mgmt_freed = %u\n",
283 le32_to_cpu(htt_stats_buf->local_ctrl_mgmt_freed));
284 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "local_data_enqued = %u\n",
285 le32_to_cpu(htt_stats_buf->local_data_enqued));
286 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "local_data_freed = %u\n",
287 le32_to_cpu(htt_stats_buf->local_data_freed));
288 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mpdu_tried = %u\n",
289 le32_to_cpu(htt_stats_buf->mpdu_tried));
290 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "isr_wait_seq_posted = %u\n",
291 le32_to_cpu(htt_stats_buf->isr_wait_seq_posted));
292 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_active_dur_us_low = %u\n",
293 le32_to_cpu(htt_stats_buf->tx_active_dur_us_low));
294 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_active_dur_us_high = %u\n",
295 le32_to_cpu(htt_stats_buf->tx_active_dur_us_high));
296 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "fes_offsets_err_cnt = %u\n\n",
297 le32_to_cpu(htt_stats_buf->fes_offsets_err_cnt));
298
299 stats_req->buf_len = len;
300}
301
302static void
303htt_print_tx_pdev_stats_urrn_tlv(const void *tag_buf,
304 u16 tag_len,
305 struct debug_htt_stats_req *stats_req)
306{
307 const struct ath12k_htt_tx_pdev_stats_urrn_tlv *htt_stats_buf = tag_buf;
308 u8 *buf = stats_req->buf;
309 u32 len = stats_req->buf_len;
310 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
311 u16 num_elems = min_t(u16, (tag_len >> 2),
312 HTT_TX_PDEV_MAX_URRN_STATS);
313
314 len += scnprintf(buf: buf + len, size: buf_len - len,
315 fmt: "HTT_TX_PDEV_STATS_URRN_TLV:\n");
316
317 len += print_array_to_buf(buf, offset: len, header: "urrn_stats", array: htt_stats_buf->urrn_stats,
318 array_len: num_elems, footer: "\n\n");
319
320 stats_req->buf_len = len;
321}
322
323static void
324htt_print_tx_pdev_stats_flush_tlv(const void *tag_buf,
325 u16 tag_len,
326 struct debug_htt_stats_req *stats_req)
327{
328 const struct ath12k_htt_tx_pdev_stats_flush_tlv *htt_stats_buf = tag_buf;
329 u8 *buf = stats_req->buf;
330 u32 len = stats_req->buf_len;
331 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
332 u16 num_elems = min_t(u16, (tag_len >> 2),
333 ATH12K_HTT_TX_PDEV_MAX_FLUSH_REASON_STATS);
334
335 len += scnprintf(buf: buf + len, size: buf_len - len,
336 fmt: "HTT_TX_PDEV_STATS_FLUSH_TLV:\n");
337
338 len += print_array_to_buf(buf, offset: len, header: "flush_errs", array: htt_stats_buf->flush_errs,
339 array_len: num_elems, footer: "\n\n");
340
341 stats_req->buf_len = len;
342}
343
344static void
345htt_print_tx_pdev_stats_sifs_tlv(const void *tag_buf,
346 u16 tag_len,
347 struct debug_htt_stats_req *stats_req)
348{
349 const struct ath12k_htt_tx_pdev_stats_sifs_tlv *htt_stats_buf = tag_buf;
350 u8 *buf = stats_req->buf;
351 u32 len = stats_req->buf_len;
352 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
353 u16 num_elems = min_t(u16, (tag_len >> 2),
354 ATH12K_HTT_TX_PDEV_MAX_SIFS_BURST_STATS);
355
356 len += scnprintf(buf: buf + len, size: buf_len - len,
357 fmt: "HTT_TX_PDEV_STATS_SIFS_TLV:\n");
358
359 len += print_array_to_buf(buf, offset: len, header: "sifs_status", array: htt_stats_buf->sifs_status,
360 array_len: num_elems, footer: "\n\n");
361
362 stats_req->buf_len = len;
363}
364
365static void
366htt_print_tx_pdev_mu_ppdu_dist_stats_tlv(const void *tag_buf, u16 tag_len,
367 struct debug_htt_stats_req *stats_req)
368{
369 const struct ath12k_htt_tx_pdev_mu_ppdu_dist_stats_tlv *htt_stats_buf = tag_buf;
370 char *mode;
371 u8 j, hw_mode, i, str_buf_len;
372 u8 *buf = stats_req->buf;
373 u32 len = stats_req->buf_len;
374 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
375 u32 stats_value;
376 u8 max_ppdu = ATH12K_HTT_STATS_MAX_NUM_MU_PPDU_PER_BURST;
377 u8 max_sched = ATH12K_HTT_STATS_MAX_NUM_SCHED_STATUS;
378 char str_buf[ATH12K_HTT_MAX_STRING_LEN];
379
380 if (tag_len < sizeof(*htt_stats_buf))
381 return;
382
383 hw_mode = le32_to_cpu(htt_stats_buf->hw_mode);
384
385 switch (hw_mode) {
386 case ATH12K_HTT_STATS_HWMODE_AC:
387 len += scnprintf(buf: buf + len, size: buf_len - len,
388 fmt: "HTT_TX_PDEV_AC_MU_PPDU_DISTRIBUTION_STATS:\n");
389 mode = "ac";
390 break;
391 case ATH12K_HTT_STATS_HWMODE_AX:
392 len += scnprintf(buf: buf + len, size: buf_len - len,
393 fmt: "HTT_TX_PDEV_AX_MU_PPDU_DISTRIBUTION_STATS:\n");
394 mode = "ax";
395 break;
396 case ATH12K_HTT_STATS_HWMODE_BE:
397 len += scnprintf(buf: buf + len, size: buf_len - len,
398 fmt: "HTT_TX_PDEV_BE_MU_PPDU_DISTRIBUTION_STATS:\n");
399 mode = "be";
400 break;
401 default:
402 return;
403 }
404
405 for (i = 0; i < ATH12K_HTT_STATS_NUM_NR_BINS ; i++) {
406 len += scnprintf(buf: buf + len, size: buf_len - len,
407 fmt: "%s_mu_mimo_num_seq_posted_nr%u = %u\n", mode,
408 ((i + 1) * 4), htt_stats_buf->num_seq_posted[i]);
409 str_buf_len = 0;
410 memset(str_buf, 0x0, sizeof(str_buf));
411 for (j = 0; j < ATH12K_HTT_STATS_MAX_NUM_MU_PPDU_PER_BURST ; j++) {
412 stats_value = le32_to_cpu(htt_stats_buf->num_ppdu_posted_per_burst
413 [i * max_ppdu + j]);
414 str_buf_len += scnprintf(buf: &str_buf[str_buf_len],
415 ATH12K_HTT_MAX_STRING_LEN - str_buf_len,
416 fmt: " %u:%u,", j, stats_value);
417 }
418 /* To overwrite the last trailing comma */
419 str_buf[str_buf_len - 1] = '\0';
420 len += scnprintf(buf: buf + len, size: buf_len - len,
421 fmt: "%s_mu_mimo_num_ppdu_posted_per_burst_nr%u = %s\n",
422 mode, ((i + 1) * 4), str_buf);
423 str_buf_len = 0;
424 memset(str_buf, 0x0, sizeof(str_buf));
425 for (j = 0; j < ATH12K_HTT_STATS_MAX_NUM_MU_PPDU_PER_BURST ; j++) {
426 stats_value = le32_to_cpu(htt_stats_buf->num_ppdu_cmpl_per_burst
427 [i * max_ppdu + j]);
428 str_buf_len += scnprintf(buf: &str_buf[str_buf_len],
429 ATH12K_HTT_MAX_STRING_LEN - str_buf_len,
430 fmt: " %u:%u,", j, stats_value);
431 }
432 /* To overwrite the last trailing comma */
433 str_buf[str_buf_len - 1] = '\0';
434 len += scnprintf(buf: buf + len, size: buf_len - len,
435 fmt: "%s_mu_mimo_num_ppdu_completed_per_burst_nr%u = %s\n",
436 mode, ((i + 1) * 4), str_buf);
437 str_buf_len = 0;
438 memset(str_buf, 0x0, sizeof(str_buf));
439 for (j = 0; j < ATH12K_HTT_STATS_MAX_NUM_SCHED_STATUS ; j++) {
440 stats_value = le32_to_cpu(htt_stats_buf->num_seq_term_status
441 [i * max_sched + j]);
442 str_buf_len += scnprintf(buf: &str_buf[str_buf_len],
443 ATH12K_HTT_MAX_STRING_LEN - str_buf_len,
444 fmt: " %u:%u,", j, stats_value);
445 }
446 /* To overwrite the last trailing comma */
447 str_buf[str_buf_len - 1] = '\0';
448 len += scnprintf(buf: buf + len, size: buf_len - len,
449 fmt: "%s_mu_mimo_num_seq_term_status_nr%u = %s\n\n",
450 mode, ((i + 1) * 4), str_buf);
451 }
452
453 stats_req->buf_len = len;
454}
455
456static void
457htt_print_tx_pdev_stats_sifs_hist_tlv(const void *tag_buf,
458 u16 tag_len,
459 struct debug_htt_stats_req *stats_req)
460{
461 const struct ath12k_htt_tx_pdev_stats_sifs_hist_tlv *htt_stats_buf = tag_buf;
462 u8 *buf = stats_req->buf;
463 u32 len = stats_req->buf_len;
464 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
465 u16 num_elems = min_t(u16, (tag_len >> 2),
466 ATH12K_HTT_TX_PDEV_MAX_SIFS_BURST_HIST_STATS);
467
468 len += scnprintf(buf: buf + len, size: buf_len - len,
469 fmt: "HTT_TX_PDEV_STATS_SIFS_HIST_TLV:\n");
470
471 len += print_array_to_buf(buf, offset: len, header: "sifs_hist_status",
472 array: htt_stats_buf->sifs_hist_status, array_len: num_elems, footer: "\n\n");
473
474 stats_req->buf_len = len;
475}
476
477static void
478htt_print_pdev_ctrl_path_tx_stats_tlv(const void *tag_buf, u16 tag_len,
479 struct debug_htt_stats_req *stats_req)
480{
481 const struct ath12k_htt_pdev_ctrl_path_tx_stats_tlv *htt_stats_buf = tag_buf;
482 u8 *buf = stats_req->buf;
483 u32 len = stats_req->buf_len;
484 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
485
486 if (len < sizeof(*htt_stats_buf))
487 return;
488
489 len += scnprintf(buf: buf + len, size: buf_len - len,
490 fmt: "HTT_TX_PDEV_STATS_CTRL_PATH_TX_STATS:\n");
491 len += print_array_to_buf(buf, offset: len, header: "fw_tx_mgmt_subtype",
492 array: htt_stats_buf->fw_tx_mgmt_subtype,
493 ATH12K_HTT_STATS_SUBTYPE_MAX, footer: "\n\n");
494
495 stats_req->buf_len = len;
496}
497
498static void
499ath12k_htt_print_stats_tx_sched_cmn_tlv(const void *tag_buf,
500 u16 tag_len,
501 struct debug_htt_stats_req *stats_req)
502{
503 const struct ath12k_htt_stats_tx_sched_cmn_tlv *htt_stats_buf = tag_buf;
504 u8 *buf = stats_req->buf;
505 u32 len = stats_req->buf_len;
506 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
507 u32 mac_id_word;
508
509 if (tag_len < sizeof(*htt_stats_buf))
510 return;
511
512 mac_id_word = __le32_to_cpu(htt_stats_buf->mac_id__word);
513
514 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_STATS_TX_SCHED_CMN_TLV:\n");
515 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mac_id = %u\n",
516 u32_get_bits(v: mac_id_word, ATH12K_HTT_STATS_MAC_ID));
517 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "current_timestamp = %u\n\n",
518 le32_to_cpu(htt_stats_buf->current_timestamp));
519
520 stats_req->buf_len = len;
521}
522
523static void
524ath12k_htt_print_tx_pdev_stats_sched_per_txq_tlv(const void *tag_buf,
525 u16 tag_len,
526 struct debug_htt_stats_req *stats_req)
527{
528 const struct ath12k_htt_tx_pdev_stats_sched_per_txq_tlv *htt_stats_buf = tag_buf;
529 u8 *buf = stats_req->buf;
530 u32 len = stats_req->buf_len;
531 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
532 u32 mac_id_word;
533
534 if (tag_len < sizeof(*htt_stats_buf))
535 return;
536
537 mac_id_word = __le32_to_cpu(htt_stats_buf->mac_id__word);
538
539 len += scnprintf(buf: buf + len, size: buf_len - len,
540 fmt: "HTT_TX_PDEV_STATS_SCHED_PER_TXQ_TLV:\n");
541 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mac_id = %u\n",
542 u32_get_bits(v: mac_id_word,
543 ATH12K_HTT_TX_PDEV_STATS_SCHED_PER_TXQ_MAC_ID));
544 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "txq_id = %u\n",
545 u32_get_bits(v: mac_id_word,
546 ATH12K_HTT_TX_PDEV_STATS_SCHED_PER_TXQ_ID));
547 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "sched_policy = %u\n",
548 le32_to_cpu(htt_stats_buf->sched_policy));
549 len += scnprintf(buf: buf + len, size: buf_len - len,
550 fmt: "last_sched_cmd_posted_timestamp = %u\n",
551 le32_to_cpu(htt_stats_buf->last_sched_cmd_posted_timestamp));
552 len += scnprintf(buf: buf + len, size: buf_len - len,
553 fmt: "last_sched_cmd_compl_timestamp = %u\n",
554 le32_to_cpu(htt_stats_buf->last_sched_cmd_compl_timestamp));
555 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "sched_2_tac_lwm_count = %u\n",
556 le32_to_cpu(htt_stats_buf->sched_2_tac_lwm_count));
557 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "sched_2_tac_ring_full = %u\n",
558 le32_to_cpu(htt_stats_buf->sched_2_tac_ring_full));
559 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "sched_cmd_post_failure = %u\n",
560 le32_to_cpu(htt_stats_buf->sched_cmd_post_failure));
561 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_active_tids = %u\n",
562 le32_to_cpu(htt_stats_buf->num_active_tids));
563 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_ps_schedules = %u\n",
564 le32_to_cpu(htt_stats_buf->num_ps_schedules));
565 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "sched_cmds_pending = %u\n",
566 le32_to_cpu(htt_stats_buf->sched_cmds_pending));
567 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_tid_register = %u\n",
568 le32_to_cpu(htt_stats_buf->num_tid_register));
569 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_tid_unregister = %u\n",
570 le32_to_cpu(htt_stats_buf->num_tid_unregister));
571 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_qstats_queried = %u\n",
572 le32_to_cpu(htt_stats_buf->num_qstats_queried));
573 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "qstats_update_pending = %u\n",
574 le32_to_cpu(htt_stats_buf->qstats_update_pending));
575 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "last_qstats_query_timestamp = %u\n",
576 le32_to_cpu(htt_stats_buf->last_qstats_query_timestamp));
577 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_tqm_cmdq_full = %u\n",
578 le32_to_cpu(htt_stats_buf->num_tqm_cmdq_full));
579 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_de_sched_algo_trigger = %u\n",
580 le32_to_cpu(htt_stats_buf->num_de_sched_algo_trigger));
581 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_rt_sched_algo_trigger = %u\n",
582 le32_to_cpu(htt_stats_buf->num_rt_sched_algo_trigger));
583 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_tqm_sched_algo_trigger = %u\n",
584 le32_to_cpu(htt_stats_buf->num_tqm_sched_algo_trigger));
585 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "notify_sched = %u\n",
586 le32_to_cpu(htt_stats_buf->notify_sched));
587 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "dur_based_sendn_term = %u\n",
588 le32_to_cpu(htt_stats_buf->dur_based_sendn_term));
589 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "su_notify2_sched = %u\n",
590 le32_to_cpu(htt_stats_buf->su_notify2_sched));
591 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "su_optimal_queued_msdus_sched = %u\n",
592 le32_to_cpu(htt_stats_buf->su_optimal_queued_msdus_sched));
593 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "su_delay_timeout_sched = %u\n",
594 le32_to_cpu(htt_stats_buf->su_delay_timeout_sched));
595 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "su_min_txtime_sched_delay = %u\n",
596 le32_to_cpu(htt_stats_buf->su_min_txtime_sched_delay));
597 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "su_no_delay = %u\n",
598 le32_to_cpu(htt_stats_buf->su_no_delay));
599 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_supercycles = %u\n",
600 le32_to_cpu(htt_stats_buf->num_supercycles));
601 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_subcycles_with_sort = %u\n",
602 le32_to_cpu(htt_stats_buf->num_subcycles_with_sort));
603 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_subcycles_no_sort = %u\n\n",
604 le32_to_cpu(htt_stats_buf->num_subcycles_no_sort));
605
606 stats_req->buf_len = len;
607}
608
609static void
610ath12k_htt_print_sched_txq_cmd_posted_tlv(const void *tag_buf,
611 u16 tag_len,
612 struct debug_htt_stats_req *stats_req)
613{
614 const struct ath12k_htt_sched_txq_cmd_posted_tlv *htt_stats_buf = tag_buf;
615 u8 *buf = stats_req->buf;
616 u32 len = stats_req->buf_len;
617 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
618 u16 num_elements = tag_len >> 2;
619
620 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_SCHED_TXQ_CMD_POSTED_TLV:\n");
621 len += print_array_to_buf(buf, offset: len, header: "sched_cmd_posted",
622 array: htt_stats_buf->sched_cmd_posted, array_len: num_elements, footer: "\n\n");
623
624 stats_req->buf_len = len;
625}
626
627static void
628ath12k_htt_print_sched_txq_cmd_reaped_tlv(const void *tag_buf,
629 u16 tag_len,
630 struct debug_htt_stats_req *stats_req)
631{
632 const struct ath12k_htt_sched_txq_cmd_reaped_tlv *htt_stats_buf = tag_buf;
633 u8 *buf = stats_req->buf;
634 u32 len = stats_req->buf_len;
635 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
636 u16 num_elements = tag_len >> 2;
637
638 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_SCHED_TXQ_CMD_REAPED_TLV:\n");
639 len += print_array_to_buf(buf, offset: len, header: "sched_cmd_reaped",
640 array: htt_stats_buf->sched_cmd_reaped, array_len: num_elements, footer: "\n\n");
641
642 stats_req->buf_len = len;
643}
644
645static void
646ath12k_htt_print_sched_txq_sched_order_su_tlv(const void *tag_buf,
647 u16 tag_len,
648 struct debug_htt_stats_req *stats_req)
649{
650 const struct ath12k_htt_sched_txq_sched_order_su_tlv *htt_stats_buf = tag_buf;
651 u8 *buf = stats_req->buf;
652 u32 len = stats_req->buf_len;
653 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
654 u32 sched_order_su_num_entries = min_t(u32, (tag_len >> 2),
655 ATH12K_HTT_TX_PDEV_NUM_SCHED_ORDER_LOG);
656
657 len += scnprintf(buf: buf + len, size: buf_len - len,
658 fmt: "HTT_SCHED_TXQ_SCHED_ORDER_SU_TLV:\n");
659 len += print_array_to_buf(buf, offset: len, header: "sched_order_su",
660 array: htt_stats_buf->sched_order_su,
661 array_len: sched_order_su_num_entries, footer: "\n\n");
662
663 stats_req->buf_len = len;
664}
665
666static void
667ath12k_htt_print_sched_txq_sched_ineligibility_tlv(const void *tag_buf,
668 u16 tag_len,
669 struct debug_htt_stats_req *stats_req)
670{
671 const struct ath12k_htt_sched_txq_sched_ineligibility_tlv *htt_stats_buf =
672 tag_buf;
673 u8 *buf = stats_req->buf;
674 u32 len = stats_req->buf_len;
675 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
676 u32 sched_ineligibility_num_entries = tag_len >> 2;
677
678 len += scnprintf(buf: buf + len, size: buf_len - len,
679 fmt: "HTT_SCHED_TXQ_SCHED_INELIGIBILITY:\n");
680 len += print_array_to_buf(buf, offset: len, header: "sched_ineligibility",
681 array: htt_stats_buf->sched_ineligibility,
682 array_len: sched_ineligibility_num_entries, footer: "\n\n");
683
684 stats_req->buf_len = len;
685}
686
687static void
688ath12k_htt_print_sched_txq_supercycle_trigger_tlv(const void *tag_buf,
689 u16 tag_len,
690 struct debug_htt_stats_req *stats_req)
691{
692 const struct ath12k_htt_sched_txq_supercycle_triggers_tlv *htt_stats_buf =
693 tag_buf;
694 u8 *buf = stats_req->buf;
695 u32 len = stats_req->buf_len;
696 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
697 u16 num_elems = min_t(u16, (tag_len >> 2),
698 ATH12K_HTT_SCHED_SUPERCYCLE_TRIGGER_MAX);
699
700 len += scnprintf(buf: buf + len, size: buf_len - len,
701 fmt: "HTT_SCHED_TXQ_SUPERCYCLE_TRIGGER:\n");
702 len += print_array_to_buf(buf, offset: len, header: "supercycle_triggers",
703 array: htt_stats_buf->supercycle_triggers, array_len: num_elems, footer: "\n\n");
704
705 stats_req->buf_len = len;
706}
707
708static void
709ath12k_htt_print_hw_stats_pdev_errs_tlv(const void *tag_buf, u16 tag_len,
710 struct debug_htt_stats_req *stats_req)
711{
712 const struct ath12k_htt_hw_stats_pdev_errs_tlv *htt_buf = tag_buf;
713 u8 *buf = stats_req->buf;
714 u32 len = stats_req->buf_len;
715 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
716 u32 mac_id_word;
717
718 if (tag_len < sizeof(*htt_buf))
719 return;
720
721 mac_id_word = le32_to_cpu(htt_buf->mac_id__word);
722
723 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_HW_STATS_PDEV_ERRS_TLV:\n");
724 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mac_id = %u\n",
725 u32_get_bits(v: mac_id_word, ATH12K_HTT_STATS_MAC_ID));
726 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_abort = %u\n",
727 le32_to_cpu(htt_buf->tx_abort));
728 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_abort_fail_count = %u\n",
729 le32_to_cpu(htt_buf->tx_abort_fail_count));
730 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_abort = %u\n",
731 le32_to_cpu(htt_buf->rx_abort));
732 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_abort_fail_count = %u\n",
733 le32_to_cpu(htt_buf->rx_abort_fail_count));
734 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_flush_cnt = %u\n",
735 le32_to_cpu(htt_buf->rx_flush_cnt));
736 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "warm_reset = %u\n",
737 le32_to_cpu(htt_buf->warm_reset));
738 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cold_reset = %u\n",
739 le32_to_cpu(htt_buf->cold_reset));
740 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mac_cold_reset_restore_cal = %u\n",
741 le32_to_cpu(htt_buf->mac_cold_reset_restore_cal));
742 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mac_cold_reset = %u\n",
743 le32_to_cpu(htt_buf->mac_cold_reset));
744 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mac_warm_reset = %u\n",
745 le32_to_cpu(htt_buf->mac_warm_reset));
746 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mac_only_reset = %u\n",
747 le32_to_cpu(htt_buf->mac_only_reset));
748 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "phy_warm_reset = %u\n",
749 le32_to_cpu(htt_buf->phy_warm_reset));
750 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "phy_warm_reset_ucode_trig = %u\n",
751 le32_to_cpu(htt_buf->phy_warm_reset_ucode_trig));
752 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mac_warm_reset_restore_cal = %u\n",
753 le32_to_cpu(htt_buf->mac_warm_reset_restore_cal));
754 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mac_sfm_reset = %u\n",
755 le32_to_cpu(htt_buf->mac_sfm_reset));
756 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "phy_warm_reset_m3_ssr = %u\n",
757 le32_to_cpu(htt_buf->phy_warm_reset_m3_ssr));
758 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "fw_rx_rings_reset = %u\n",
759 le32_to_cpu(htt_buf->fw_rx_rings_reset));
760 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_flush = %u\n",
761 le32_to_cpu(htt_buf->tx_flush));
762 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_glb_reset = %u\n",
763 le32_to_cpu(htt_buf->tx_glb_reset));
764 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_txq_reset = %u\n",
765 le32_to_cpu(htt_buf->tx_txq_reset));
766 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_timeout_reset = %u\n\n",
767 le32_to_cpu(htt_buf->rx_timeout_reset));
768
769 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "PDEV_PHY_WARM_RESET_REASONS:\n");
770 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "phy_warm_reset_reason_phy_m3 = %u\n",
771 le32_to_cpu(htt_buf->phy_warm_reset_reason_phy_m3));
772 len += scnprintf(buf: buf + len, size: buf_len - len,
773 fmt: "phy_warm_reset_reason_tx_hw_stuck = %u\n",
774 le32_to_cpu(htt_buf->phy_warm_reset_reason_tx_hw_stuck));
775 len += scnprintf(buf: buf + len, size: buf_len - len,
776 fmt: "phy_warm_reset_reason_num_cca_rx_frame_stuck = %u\n",
777 le32_to_cpu(htt_buf->phy_warm_reset_reason_num_rx_frame_stuck));
778 len += scnprintf(buf: buf + len, size: buf_len - len,
779 fmt: "phy_warm_reset_reason_wal_rx_recovery_rst_rx_busy = %u\n",
780 le32_to_cpu(htt_buf->phy_warm_reset_reason_wal_rx_rec_rx_busy));
781 len += scnprintf(buf: buf + len, size: buf_len - len,
782 fmt: "phy_warm_reset_reason_wal_rx_recovery_rst_mac_hang = %u\n",
783 le32_to_cpu(htt_buf->phy_warm_reset_reason_wal_rx_rec_mac_hng));
784 len += scnprintf(buf: buf + len, size: buf_len - len,
785 fmt: "phy_warm_reset_reason_mac_reset_converted_phy_reset = %u\n",
786 le32_to_cpu(htt_buf->phy_warm_reset_reason_mac_conv_phy_reset));
787 len += scnprintf(buf: buf + len, size: buf_len - len,
788 fmt: "phy_warm_reset_reason_tx_lifetime_expiry_cca_stuck = %u\n",
789 le32_to_cpu(htt_buf->phy_warm_reset_reason_tx_exp_cca_stuck));
790 len += scnprintf(buf: buf + len, size: buf_len - len,
791 fmt: "phy_warm_reset_reason_tx_consecutive_flush9_war = %u\n",
792 le32_to_cpu(htt_buf->phy_warm_reset_reason_tx_consec_flsh_war));
793 len += scnprintf(buf: buf + len, size: buf_len - len,
794 fmt: "phy_warm_reset_reason_tx_hwsch_reset_war = %u\n",
795 le32_to_cpu(htt_buf->phy_warm_reset_reason_tx_hwsch_reset_war));
796 len += scnprintf(buf: buf + len, size: buf_len - len,
797 fmt: "phy_warm_reset_reason_hwsch_wdog_or_cca_wdog_war = %u\n\n",
798 le32_to_cpu(htt_buf->phy_warm_reset_reason_hwsch_cca_wdog_war));
799
800 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "WAL_RX_RECOVERY_STATS:\n");
801 len += scnprintf(buf: buf + len, size: buf_len - len,
802 fmt: "wal_rx_recovery_rst_mac_hang_count = %u\n",
803 le32_to_cpu(htt_buf->wal_rx_recovery_rst_mac_hang_cnt));
804 len += scnprintf(buf: buf + len, size: buf_len - len,
805 fmt: "wal_rx_recovery_rst_known_sig_count = %u\n",
806 le32_to_cpu(htt_buf->wal_rx_recovery_rst_known_sig_cnt));
807 len += scnprintf(buf: buf + len, size: buf_len - len,
808 fmt: "wal_rx_recovery_rst_no_rx_count = %u\n",
809 le32_to_cpu(htt_buf->wal_rx_recovery_rst_no_rx_cnt));
810 len += scnprintf(buf: buf + len, size: buf_len - len,
811 fmt: "wal_rx_recovery_rst_no_rx_consecutive_count = %u\n",
812 le32_to_cpu(htt_buf->wal_rx_recovery_rst_no_rx_consec_cnt));
813 len += scnprintf(buf: buf + len, size: buf_len - len,
814 fmt: "wal_rx_recovery_rst_rx_busy_count = %u\n",
815 le32_to_cpu(htt_buf->wal_rx_recovery_rst_rx_busy_cnt));
816 len += scnprintf(buf: buf + len, size: buf_len - len,
817 fmt: "wal_rx_recovery_rst_phy_mac_hang_count = %u\n\n",
818 le32_to_cpu(htt_buf->wal_rx_recovery_rst_phy_mac_hang_cnt));
819
820 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_RX_DEST_DRAIN_STATS:\n");
821 len += scnprintf(buf: buf + len, size: buf_len - len,
822 fmt: "rx_dest_drain_rx_descs_leak_prevention_done = %u\n",
823 le32_to_cpu(htt_buf->rx_dest_drain_rx_descs_leak_prevented));
824 len += scnprintf(buf: buf + len, size: buf_len - len,
825 fmt: "rx_dest_drain_rx_descs_saved_cnt = %u\n",
826 le32_to_cpu(htt_buf->rx_dest_drain_rx_descs_saved_cnt));
827 len += scnprintf(buf: buf + len, size: buf_len - len,
828 fmt: "rx_dest_drain_rxdma2reo_leak_detected = %u\n",
829 le32_to_cpu(htt_buf->rx_dest_drain_rxdma2reo_leak_detected));
830 len += scnprintf(buf: buf + len, size: buf_len - len,
831 fmt: "rx_dest_drain_rxdma2fw_leak_detected = %u\n",
832 le32_to_cpu(htt_buf->rx_dest_drain_rxdma2fw_leak_detected));
833 len += scnprintf(buf: buf + len, size: buf_len - len,
834 fmt: "rx_dest_drain_rxdma2wbm_leak_detected = %u\n",
835 le32_to_cpu(htt_buf->rx_dest_drain_rxdma2wbm_leak_detected));
836 len += scnprintf(buf: buf + len, size: buf_len - len,
837 fmt: "rx_dest_drain_rxdma1_2sw_leak_detected = %u\n",
838 le32_to_cpu(htt_buf->rx_dest_drain_rxdma1_2sw_leak_detected));
839 len += scnprintf(buf: buf + len, size: buf_len - len,
840 fmt: "rx_dest_drain_rx_drain_ok_mac_idle = %u\n",
841 le32_to_cpu(htt_buf->rx_dest_drain_rx_drain_ok_mac_idle));
842 len += scnprintf(buf: buf + len, size: buf_len - len,
843 fmt: "rx_dest_drain_ok_mac_not_idle = %u\n",
844 le32_to_cpu(htt_buf->rx_dest_drain_ok_mac_not_idle));
845 len += scnprintf(buf: buf + len, size: buf_len - len,
846 fmt: "rx_dest_drain_prerequisite_invld = %u\n",
847 le32_to_cpu(htt_buf->rx_dest_drain_prerequisite_invld));
848 len += scnprintf(buf: buf + len, size: buf_len - len,
849 fmt: "rx_dest_drain_skip_for_non_lmac_reset = %u\n",
850 le32_to_cpu(htt_buf->rx_dest_drain_skip_non_lmac_reset));
851 len += scnprintf(buf: buf + len, size: buf_len - len,
852 fmt: "rx_dest_drain_hw_fifo_not_empty_post_drain_wait = %u\n\n",
853 le32_to_cpu(htt_buf->rx_dest_drain_hw_fifo_notempty_post_wait));
854
855 stats_req->buf_len = len;
856}
857
858static void
859ath12k_htt_print_hw_stats_intr_misc_tlv(const void *tag_buf, u16 tag_len,
860 struct debug_htt_stats_req *stats_req)
861{
862 const struct ath12k_htt_hw_stats_intr_misc_tlv *htt_stats_buf = tag_buf;
863 u8 *buf = stats_req->buf;
864 u32 len = stats_req->buf_len;
865 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
866
867 if (tag_len < sizeof(*htt_stats_buf))
868 return;
869
870 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_HW_STATS_INTR_MISC_TLV:\n");
871 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "hw_intr_name = %s\n",
872 htt_stats_buf->hw_intr_name);
873 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mask = %u\n",
874 le32_to_cpu(htt_stats_buf->mask));
875 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "count = %u\n\n",
876 le32_to_cpu(htt_stats_buf->count));
877
878 stats_req->buf_len = len;
879}
880
881static void
882ath12k_htt_print_hw_stats_whal_tx_tlv(const void *tag_buf, u16 tag_len,
883 struct debug_htt_stats_req *stats_req)
884{
885 const struct ath12k_htt_hw_stats_whal_tx_tlv *htt_stats_buf = tag_buf;
886 u8 *buf = stats_req->buf;
887 u32 len = stats_req->buf_len;
888 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
889 u32 mac_id_word;
890
891 if (tag_len < sizeof(*htt_stats_buf))
892 return;
893
894 mac_id_word = __le32_to_cpu(htt_stats_buf->mac_id__word);
895
896 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_HW_STATS_WHAL_TX_TLV:\n");
897 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mac_id = %u\n",
898 u32_get_bits(v: mac_id_word, ATH12K_HTT_STATS_MAC_ID));
899 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "last_unpause_ppdu_id = %u\n",
900 le32_to_cpu(htt_stats_buf->last_unpause_ppdu_id));
901 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "hwsch_unpause_wait_tqm_write = %u\n",
902 le32_to_cpu(htt_stats_buf->hwsch_unpause_wait_tqm_write));
903 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "hwsch_dummy_tlv_skipped = %u\n",
904 le32_to_cpu(htt_stats_buf->hwsch_dummy_tlv_skipped));
905 len += scnprintf(buf: buf + len, size: buf_len - len,
906 fmt: "hwsch_misaligned_offset_received = %u\n",
907 le32_to_cpu(htt_stats_buf->hwsch_misaligned_offset_received));
908 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "hwsch_reset_count = %u\n",
909 le32_to_cpu(htt_stats_buf->hwsch_reset_count));
910 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "hwsch_dev_reset_war = %u\n",
911 le32_to_cpu(htt_stats_buf->hwsch_dev_reset_war));
912 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "hwsch_delayed_pause = %u\n",
913 le32_to_cpu(htt_stats_buf->hwsch_delayed_pause));
914 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "hwsch_long_delayed_pause = %u\n",
915 le32_to_cpu(htt_stats_buf->hwsch_long_delayed_pause));
916 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "sch_rx_ppdu_no_response = %u\n",
917 le32_to_cpu(htt_stats_buf->sch_rx_ppdu_no_response));
918 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "sch_selfgen_response = %u\n",
919 le32_to_cpu(htt_stats_buf->sch_selfgen_response));
920 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "sch_rx_sifs_resp_trigger= %u\n\n",
921 le32_to_cpu(htt_stats_buf->sch_rx_sifs_resp_trigger));
922
923 stats_req->buf_len = len;
924}
925
926static void
927ath12k_htt_print_hw_war_tlv(const void *tag_buf, u16 tag_len,
928 struct debug_htt_stats_req *stats_req)
929{
930 const struct ath12k_htt_hw_war_stats_tlv *htt_stats_buf = tag_buf;
931 u8 *buf = stats_req->buf;
932 u32 len = stats_req->buf_len;
933 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
934 u16 fixed_len, array_len;
935 u8 i, array_words;
936 u32 mac_id;
937
938 if (tag_len < sizeof(*htt_stats_buf))
939 return;
940
941 mac_id = __le32_to_cpu(htt_stats_buf->mac_id__word);
942 fixed_len = sizeof(*htt_stats_buf);
943 array_len = tag_len - fixed_len;
944 array_words = array_len >> 2;
945
946 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_HW_WAR_STATS_TLV:\n");
947 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mac_id = %u\n",
948 u32_get_bits(v: mac_id, ATH12K_HTT_STATS_MAC_ID));
949
950 for (i = 0; i < array_words; i++) {
951 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "hw_war %u = %u\n\n",
952 i, le32_to_cpu(htt_stats_buf->hw_wars[i]));
953 }
954
955 stats_req->buf_len = len;
956}
957
958static void
959ath12k_htt_print_tx_tqm_cmn_stats_tlv(const void *tag_buf, u16 tag_len,
960 struct debug_htt_stats_req *stats_req)
961{
962 const struct ath12k_htt_tx_tqm_cmn_stats_tlv *htt_stats_buf = tag_buf;
963 u8 *buf = stats_req->buf;
964 u32 len = stats_req->buf_len;
965 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
966 u32 mac_id_word;
967
968 if (tag_len < sizeof(*htt_stats_buf))
969 return;
970
971 mac_id_word = __le32_to_cpu(htt_stats_buf->mac_id__word);
972
973 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_TX_TQM_CMN_STATS_TLV:\n");
974 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mac_id = %u\n",
975 u32_get_bits(v: mac_id_word, ATH12K_HTT_STATS_MAC_ID));
976 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "max_cmdq_id = %u\n",
977 le32_to_cpu(htt_stats_buf->max_cmdq_id));
978 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "list_mpdu_cnt_hist_intvl = %u\n",
979 le32_to_cpu(htt_stats_buf->list_mpdu_cnt_hist_intvl));
980 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "add_msdu = %u\n",
981 le32_to_cpu(htt_stats_buf->add_msdu));
982 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "q_empty = %u\n",
983 le32_to_cpu(htt_stats_buf->q_empty));
984 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "q_not_empty = %u\n",
985 le32_to_cpu(htt_stats_buf->q_not_empty));
986 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "drop_notification = %u\n",
987 le32_to_cpu(htt_stats_buf->drop_notification));
988 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "desc_threshold = %u\n",
989 le32_to_cpu(htt_stats_buf->desc_threshold));
990 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "hwsch_tqm_invalid_status = %u\n",
991 le32_to_cpu(htt_stats_buf->hwsch_tqm_invalid_status));
992 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "missed_tqm_gen_mpdus = %u\n",
993 le32_to_cpu(htt_stats_buf->missed_tqm_gen_mpdus));
994 len += scnprintf(buf: buf + len, size: buf_len - len,
995 fmt: "total_msduq_timestamp_updates = %u\n",
996 le32_to_cpu(htt_stats_buf->msduq_timestamp_updates));
997 len += scnprintf(buf: buf + len, size: buf_len - len,
998 fmt: "total_msduq_timestamp_updates_by_get_mpdu_head_info_cmd = %u\n",
999 le32_to_cpu(htt_stats_buf->msduq_updates_mpdu_head_info_cmd));
1000 len += scnprintf(buf: buf + len, size: buf_len - len,
1001 fmt: "total_msduq_timestamp_updates_by_emp_to_nonemp_status = %u\n",
1002 le32_to_cpu(htt_stats_buf->msduq_updates_emp_to_nonemp_status));
1003 len += scnprintf(buf: buf + len, size: buf_len - len,
1004 fmt: "total_get_mpdu_head_info_cmds_by_sched_algo_la_query = %u\n",
1005 le32_to_cpu(htt_stats_buf->get_mpdu_head_info_cmds_by_query));
1006 len += scnprintf(buf: buf + len, size: buf_len - len,
1007 fmt: "total_get_mpdu_head_info_cmds_by_tac = %u\n",
1008 le32_to_cpu(htt_stats_buf->get_mpdu_head_info_cmds_by_tac));
1009 len += scnprintf(buf: buf + len, size: buf_len - len,
1010 fmt: "total_gen_mpdu_cmds_by_sched_algo_la_query = %u\n",
1011 le32_to_cpu(htt_stats_buf->gen_mpdu_cmds_by_query));
1012 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "active_tqm_tids = %u\n",
1013 le32_to_cpu(htt_stats_buf->tqm_active_tids));
1014 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "inactive_tqm_tids = %u\n",
1015 le32_to_cpu(htt_stats_buf->tqm_inactive_tids));
1016 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tqm_active_msduq_flows = %u\n",
1017 le32_to_cpu(htt_stats_buf->tqm_active_msduq_flows));
1018 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "hi_prio_q_not_empty = %u\n\n",
1019 le32_to_cpu(htt_stats_buf->high_prio_q_not_empty));
1020
1021 stats_req->buf_len = len;
1022}
1023
1024static void
1025ath12k_htt_print_tx_tqm_error_stats_tlv(const void *tag_buf, u16 tag_len,
1026 struct debug_htt_stats_req *stats_req)
1027{
1028 const struct ath12k_htt_tx_tqm_error_stats_tlv *htt_stats_buf = tag_buf;
1029 u8 *buf = stats_req->buf;
1030 u32 len = stats_req->buf_len;
1031 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
1032
1033 if (tag_len < sizeof(*htt_stats_buf))
1034 return;
1035
1036 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_TX_TQM_ERROR_STATS_TLV:\n");
1037 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "q_empty_failure = %u\n",
1038 le32_to_cpu(htt_stats_buf->q_empty_failure));
1039 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "q_not_empty_failure = %u\n",
1040 le32_to_cpu(htt_stats_buf->q_not_empty_failure));
1041 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "add_msdu_failure = %u\n\n",
1042 le32_to_cpu(htt_stats_buf->add_msdu_failure));
1043
1044 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "TQM_ERROR_RESET_STATS:\n");
1045 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tqm_cache_ctl_err = %u\n",
1046 le32_to_cpu(htt_stats_buf->tqm_cache_ctl_err));
1047 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tqm_soft_reset = %u\n",
1048 le32_to_cpu(htt_stats_buf->tqm_soft_reset));
1049 len += scnprintf(buf: buf + len, size: buf_len - len,
1050 fmt: "tqm_reset_total_num_in_use_link_descs = %u\n",
1051 le32_to_cpu(htt_stats_buf->tqm_reset_num_in_use_link_descs));
1052 len += scnprintf(buf: buf + len, size: buf_len - len,
1053 fmt: "tqm_reset_worst_case_num_lost_link_descs = %u\n",
1054 le32_to_cpu(htt_stats_buf->tqm_reset_num_lost_link_descs));
1055 len += scnprintf(buf: buf + len, size: buf_len - len,
1056 fmt: "tqm_reset_worst_case_num_lost_host_tx_bufs_count = %u\n",
1057 le32_to_cpu(htt_stats_buf->tqm_reset_num_lost_host_tx_buf_cnt));
1058 len += scnprintf(buf: buf + len, size: buf_len - len,
1059 fmt: "tqm_reset_num_in_use_link_descs_internal_tqm = %u\n",
1060 le32_to_cpu(htt_stats_buf->tqm_reset_num_in_use_internal_tqm));
1061 len += scnprintf(buf: buf + len, size: buf_len - len,
1062 fmt: "tqm_reset_num_in_use_link_descs_wbm_idle_link_ring = %u\n",
1063 le32_to_cpu(htt_stats_buf->tqm_reset_num_in_use_idle_link_rng));
1064 len += scnprintf(buf: buf + len, size: buf_len - len,
1065 fmt: "tqm_reset_time_to_tqm_hang_delta_ms = %u\n",
1066 le32_to_cpu(htt_stats_buf->tqm_reset_time_to_tqm_hang_delta_ms));
1067 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tqm_reset_recovery_time_ms = %u\n",
1068 le32_to_cpu(htt_stats_buf->tqm_reset_recovery_time_ms));
1069 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tqm_reset_num_peers_hdl = %u\n",
1070 le32_to_cpu(htt_stats_buf->tqm_reset_num_peers_hdl));
1071 len += scnprintf(buf: buf + len, size: buf_len - len,
1072 fmt: "tqm_reset_cumm_dirty_hw_mpduq_proc_cnt = %u\n",
1073 le32_to_cpu(htt_stats_buf->tqm_reset_cumm_dirty_hw_mpduq_cnt));
1074 len += scnprintf(buf: buf + len, size: buf_len - len,
1075 fmt: "tqm_reset_cumm_dirty_hw_msduq_proc = %u\n",
1076 le32_to_cpu(htt_stats_buf->tqm_reset_cumm_dirty_hw_msduq_proc));
1077 len += scnprintf(buf: buf + len, size: buf_len - len,
1078 fmt: "tqm_reset_flush_cache_cmd_su_cnt = %u\n",
1079 le32_to_cpu(htt_stats_buf->tqm_reset_flush_cache_cmd_su_cnt));
1080 len += scnprintf(buf: buf + len, size: buf_len - len,
1081 fmt: "tqm_reset_flush_cache_cmd_other_cnt = %u\n",
1082 le32_to_cpu(htt_stats_buf->tqm_reset_flush_cache_cmd_other_cnt));
1083 len += scnprintf(buf: buf + len, size: buf_len - len,
1084 fmt: "tqm_reset_flush_cache_cmd_trig_type = %u\n",
1085 le32_to_cpu(htt_stats_buf->tqm_reset_flush_cache_cmd_trig_type));
1086 len += scnprintf(buf: buf + len, size: buf_len - len,
1087 fmt: "tqm_reset_flush_cache_cmd_trig_cfg = %u\n",
1088 le32_to_cpu(htt_stats_buf->tqm_reset_flush_cache_cmd_trig_cfg));
1089 len += scnprintf(buf: buf + len, size: buf_len - len,
1090 fmt: "tqm_reset_flush_cache_cmd_skip_cmd_status_null = %u\n\n",
1091 le32_to_cpu(htt_stats_buf->tqm_reset_flush_cmd_skp_status_null));
1092
1093 stats_req->buf_len = len;
1094}
1095
1096static void
1097ath12k_htt_print_tx_tqm_gen_mpdu_stats_tlv(const void *tag_buf, u16 tag_len,
1098 struct debug_htt_stats_req *stats_req)
1099{
1100 const struct ath12k_htt_tx_tqm_gen_mpdu_stats_tlv *htt_stats_buf = tag_buf;
1101 u8 *buf = stats_req->buf;
1102 u32 len = stats_req->buf_len;
1103 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
1104 u16 num_elements = tag_len >> 2;
1105
1106 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_TX_TQM_GEN_MPDU_STATS_TLV:\n");
1107 len += print_array_to_buf(buf, offset: len, header: "gen_mpdu_end_reason",
1108 array: htt_stats_buf->gen_mpdu_end_reason, array_len: num_elements,
1109 footer: "\n\n");
1110
1111 stats_req->buf_len = len;
1112}
1113
1114static void
1115ath12k_htt_print_tx_tqm_list_mpdu_stats_tlv(const void *tag_buf, u16 tag_len,
1116 struct debug_htt_stats_req *stats_req)
1117{
1118 const struct ath12k_htt_tx_tqm_list_mpdu_stats_tlv *htt_stats_buf = tag_buf;
1119 u8 *buf = stats_req->buf;
1120 u32 len = stats_req->buf_len;
1121 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
1122 u16 num_elems = min_t(u16, (tag_len >> 2),
1123 ATH12K_HTT_TX_TQM_MAX_LIST_MPDU_END_REASON);
1124
1125 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_TX_TQM_LIST_MPDU_STATS_TLV:\n");
1126 len += print_array_to_buf(buf, offset: len, header: "list_mpdu_end_reason",
1127 array: htt_stats_buf->list_mpdu_end_reason, array_len: num_elems, footer: "\n\n");
1128
1129 stats_req->buf_len = len;
1130}
1131
1132static void
1133ath12k_htt_print_tx_tqm_list_mpdu_cnt_tlv(const void *tag_buf, u16 tag_len,
1134 struct debug_htt_stats_req *stats_req)
1135{
1136 const struct ath12k_htt_tx_tqm_list_mpdu_cnt_tlv *htt_stats_buf = tag_buf;
1137 u8 *buf = stats_req->buf;
1138 u32 len = stats_req->buf_len;
1139 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
1140 u16 num_elems = min_t(u16, (tag_len >> 2),
1141 ATH12K_HTT_TX_TQM_MAX_LIST_MPDU_CNT_HISTOGRAM_BINS);
1142
1143 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_TX_TQM_LIST_MPDU_CNT_TLV_V:\n");
1144 len += print_array_to_buf(buf, offset: len, header: "list_mpdu_cnt_hist",
1145 array: htt_stats_buf->list_mpdu_cnt_hist, array_len: num_elems, footer: "\n\n");
1146
1147 stats_req->buf_len = len;
1148}
1149
1150static void
1151ath12k_htt_print_tx_tqm_pdev_stats_tlv(const void *tag_buf, u16 tag_len,
1152 struct debug_htt_stats_req *stats_req)
1153{
1154 const struct ath12k_htt_tx_tqm_pdev_stats_tlv *htt_stats_buf = tag_buf;
1155 u8 *buf = stats_req->buf;
1156 u32 len = stats_req->buf_len;
1157 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
1158
1159 if (tag_len < sizeof(*htt_stats_buf))
1160 return;
1161
1162 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_TX_TQM_PDEV_STATS_TLV_V:\n");
1163 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "msdu_count = %u\n",
1164 le32_to_cpu(htt_stats_buf->msdu_count));
1165 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mpdu_count = %u\n",
1166 le32_to_cpu(htt_stats_buf->mpdu_count));
1167 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "remove_msdu = %u\n",
1168 le32_to_cpu(htt_stats_buf->remove_msdu));
1169 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "remove_mpdu = %u\n",
1170 le32_to_cpu(htt_stats_buf->remove_mpdu));
1171 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "remove_msdu_ttl = %u\n",
1172 le32_to_cpu(htt_stats_buf->remove_msdu_ttl));
1173 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "send_bar = %u\n",
1174 le32_to_cpu(htt_stats_buf->send_bar));
1175 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "bar_sync = %u\n",
1176 le32_to_cpu(htt_stats_buf->bar_sync));
1177 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "notify_mpdu = %u\n",
1178 le32_to_cpu(htt_stats_buf->notify_mpdu));
1179 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "sync_cmd = %u\n",
1180 le32_to_cpu(htt_stats_buf->sync_cmd));
1181 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "write_cmd = %u\n",
1182 le32_to_cpu(htt_stats_buf->write_cmd));
1183 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "hwsch_trigger = %u\n",
1184 le32_to_cpu(htt_stats_buf->hwsch_trigger));
1185 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ack_tlv_proc = %u\n",
1186 le32_to_cpu(htt_stats_buf->ack_tlv_proc));
1187 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "gen_mpdu_cmd = %u\n",
1188 le32_to_cpu(htt_stats_buf->gen_mpdu_cmd));
1189 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "gen_list_cmd = %u\n",
1190 le32_to_cpu(htt_stats_buf->gen_list_cmd));
1191 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "remove_mpdu_cmd = %u\n",
1192 le32_to_cpu(htt_stats_buf->remove_mpdu_cmd));
1193 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "remove_mpdu_tried_cmd = %u\n",
1194 le32_to_cpu(htt_stats_buf->remove_mpdu_tried_cmd));
1195 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mpdu_queue_stats_cmd = %u\n",
1196 le32_to_cpu(htt_stats_buf->mpdu_queue_stats_cmd));
1197 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mpdu_head_info_cmd = %u\n",
1198 le32_to_cpu(htt_stats_buf->mpdu_head_info_cmd));
1199 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "msdu_flow_stats_cmd = %u\n",
1200 le32_to_cpu(htt_stats_buf->msdu_flow_stats_cmd));
1201 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "remove_msdu_cmd = %u\n",
1202 le32_to_cpu(htt_stats_buf->remove_msdu_cmd));
1203 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "remove_msdu_ttl_cmd = %u\n",
1204 le32_to_cpu(htt_stats_buf->remove_msdu_ttl_cmd));
1205 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "flush_cache_cmd = %u\n",
1206 le32_to_cpu(htt_stats_buf->flush_cache_cmd));
1207 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "update_mpduq_cmd = %u\n",
1208 le32_to_cpu(htt_stats_buf->update_mpduq_cmd));
1209 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "enqueue = %u\n",
1210 le32_to_cpu(htt_stats_buf->enqueue));
1211 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "enqueue_notify = %u\n",
1212 le32_to_cpu(htt_stats_buf->enqueue_notify));
1213 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "notify_mpdu_at_head = %u\n",
1214 le32_to_cpu(htt_stats_buf->notify_mpdu_at_head));
1215 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "notify_mpdu_state_valid = %u\n",
1216 le32_to_cpu(htt_stats_buf->notify_mpdu_state_valid));
1217 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "sched_udp_notify1 = %u\n",
1218 le32_to_cpu(htt_stats_buf->sched_udp_notify1));
1219 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "sched_udp_notify2 = %u\n",
1220 le32_to_cpu(htt_stats_buf->sched_udp_notify2));
1221 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "sched_nonudp_notify1 = %u\n",
1222 le32_to_cpu(htt_stats_buf->sched_nonudp_notify1));
1223 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "sched_nonudp_notify2 = %u\n\n",
1224 le32_to_cpu(htt_stats_buf->sched_nonudp_notify2));
1225
1226 stats_req->buf_len = len;
1227}
1228
1229static void
1230ath12k_htt_print_tx_de_cmn_stats_tlv(const void *tag_buf, u16 tag_len,
1231 struct debug_htt_stats_req *stats_req)
1232{
1233 const struct ath12k_htt_tx_de_cmn_stats_tlv *htt_stats_buf = tag_buf;
1234 u8 *buf = stats_req->buf;
1235 u32 len = stats_req->buf_len;
1236 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
1237 u32 mac_id_word;
1238
1239 if (tag_len < sizeof(*htt_stats_buf))
1240 return;
1241
1242 mac_id_word = __le32_to_cpu(htt_stats_buf->mac_id__word);
1243
1244 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_TX_DE_CMN_STATS_TLV:\n");
1245 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mac_id = %u\n",
1246 u32_get_bits(v: mac_id_word, ATH12K_HTT_STATS_MAC_ID));
1247 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tcl2fw_entry_count = %u\n",
1248 le32_to_cpu(htt_stats_buf->tcl2fw_entry_count));
1249 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "not_to_fw = %u\n",
1250 le32_to_cpu(htt_stats_buf->not_to_fw));
1251 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "invalid_pdev_vdev_peer = %u\n",
1252 le32_to_cpu(htt_stats_buf->invalid_pdev_vdev_peer));
1253 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tcl_res_invalid_addrx = %u\n",
1254 le32_to_cpu(htt_stats_buf->tcl_res_invalid_addrx));
1255 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "wbm2fw_entry_count = %u\n",
1256 le32_to_cpu(htt_stats_buf->wbm2fw_entry_count));
1257 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "invalid_pdev = %u\n",
1258 le32_to_cpu(htt_stats_buf->invalid_pdev));
1259 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tcl_res_addrx_timeout = %u\n",
1260 le32_to_cpu(htt_stats_buf->tcl_res_addrx_timeout));
1261 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "invalid_vdev = %u\n",
1262 le32_to_cpu(htt_stats_buf->invalid_vdev));
1263 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "invalid_tcl_exp_frame_desc = %u\n",
1264 le32_to_cpu(htt_stats_buf->invalid_tcl_exp_frame_desc));
1265 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "vdev_id_mismatch_count = %u\n\n",
1266 le32_to_cpu(htt_stats_buf->vdev_id_mismatch_cnt));
1267
1268 stats_req->buf_len = len;
1269}
1270
1271static void
1272ath12k_htt_print_tx_de_eapol_packets_stats_tlv(const void *tag_buf, u16 tag_len,
1273 struct debug_htt_stats_req *stats_req)
1274{
1275 const struct ath12k_htt_tx_de_eapol_packets_stats_tlv *htt_stats_buf = tag_buf;
1276 u8 *buf = stats_req->buf;
1277 u32 len = stats_req->buf_len;
1278 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
1279
1280 if (tag_len < sizeof(*htt_stats_buf))
1281 return;
1282
1283 len += scnprintf(buf: buf + len, size: buf_len - len,
1284 fmt: "HTT_TX_DE_EAPOL_PACKETS_STATS_TLV:\n");
1285 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "m1_packets = %u\n",
1286 le32_to_cpu(htt_stats_buf->m1_packets));
1287 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "m2_packets = %u\n",
1288 le32_to_cpu(htt_stats_buf->m2_packets));
1289 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "m3_packets = %u\n",
1290 le32_to_cpu(htt_stats_buf->m3_packets));
1291 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "m4_packets = %u\n",
1292 le32_to_cpu(htt_stats_buf->m4_packets));
1293 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "g1_packets = %u\n",
1294 le32_to_cpu(htt_stats_buf->g1_packets));
1295 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "g2_packets = %u\n",
1296 le32_to_cpu(htt_stats_buf->g2_packets));
1297 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rc4_packets = %u\n",
1298 le32_to_cpu(htt_stats_buf->rc4_packets));
1299 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "eap_packets = %u\n",
1300 le32_to_cpu(htt_stats_buf->eap_packets));
1301 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "eapol_start_packets = %u\n",
1302 le32_to_cpu(htt_stats_buf->eapol_start_packets));
1303 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "eapol_logoff_packets = %u\n",
1304 le32_to_cpu(htt_stats_buf->eapol_logoff_packets));
1305 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "eapol_encap_asf_packets = %u\n\n",
1306 le32_to_cpu(htt_stats_buf->eapol_encap_asf_packets));
1307
1308 stats_req->buf_len = len;
1309}
1310
1311static void
1312ath12k_htt_print_tx_de_classify_stats_tlv(const void *tag_buf, u16 tag_len,
1313 struct debug_htt_stats_req *stats_req)
1314{
1315 const struct ath12k_htt_tx_de_classify_stats_tlv *htt_stats_buf = tag_buf;
1316 u8 *buf = stats_req->buf;
1317 u32 len = stats_req->buf_len;
1318 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
1319
1320 if (tag_len < sizeof(*htt_stats_buf))
1321 return;
1322
1323 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_TX_DE_CLASSIFY_STATS_TLV:\n");
1324 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "arp_packets = %u\n",
1325 le32_to_cpu(htt_stats_buf->arp_packets));
1326 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "igmp_packets = %u\n",
1327 le32_to_cpu(htt_stats_buf->igmp_packets));
1328 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "dhcp_packets = %u\n",
1329 le32_to_cpu(htt_stats_buf->dhcp_packets));
1330 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "host_inspected = %u\n",
1331 le32_to_cpu(htt_stats_buf->host_inspected));
1332 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "htt_included = %u\n",
1333 le32_to_cpu(htt_stats_buf->htt_included));
1334 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "htt_valid_mcs = %u\n",
1335 le32_to_cpu(htt_stats_buf->htt_valid_mcs));
1336 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "htt_valid_nss = %u\n",
1337 le32_to_cpu(htt_stats_buf->htt_valid_nss));
1338 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "htt_valid_preamble_type = %u\n",
1339 le32_to_cpu(htt_stats_buf->htt_valid_preamble_type));
1340 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "htt_valid_chainmask = %u\n",
1341 le32_to_cpu(htt_stats_buf->htt_valid_chainmask));
1342 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "htt_valid_guard_interval = %u\n",
1343 le32_to_cpu(htt_stats_buf->htt_valid_guard_interval));
1344 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "htt_valid_retries = %u\n",
1345 le32_to_cpu(htt_stats_buf->htt_valid_retries));
1346 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "htt_valid_bw_info = %u\n",
1347 le32_to_cpu(htt_stats_buf->htt_valid_bw_info));
1348 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "htt_valid_power = %u\n",
1349 le32_to_cpu(htt_stats_buf->htt_valid_power));
1350 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "htt_valid_key_flags = 0x%x\n",
1351 le32_to_cpu(htt_stats_buf->htt_valid_key_flags));
1352 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "htt_valid_no_encryption = %u\n",
1353 le32_to_cpu(htt_stats_buf->htt_valid_no_encryption));
1354 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "fse_entry_count = %u\n",
1355 le32_to_cpu(htt_stats_buf->fse_entry_count));
1356 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "fse_priority_be = %u\n",
1357 le32_to_cpu(htt_stats_buf->fse_priority_be));
1358 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "fse_priority_high = %u\n",
1359 le32_to_cpu(htt_stats_buf->fse_priority_high));
1360 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "fse_priority_low = %u\n",
1361 le32_to_cpu(htt_stats_buf->fse_priority_low));
1362 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "fse_traffic_ptrn_be = %u\n",
1363 le32_to_cpu(htt_stats_buf->fse_traffic_ptrn_be));
1364 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "fse_traffic_ptrn_over_sub = %u\n",
1365 le32_to_cpu(htt_stats_buf->fse_traffic_ptrn_over_sub));
1366 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "fse_traffic_ptrn_bursty = %u\n",
1367 le32_to_cpu(htt_stats_buf->fse_traffic_ptrn_bursty));
1368 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "fse_traffic_ptrn_interactive = %u\n",
1369 le32_to_cpu(htt_stats_buf->fse_traffic_ptrn_interactive));
1370 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "fse_traffic_ptrn_periodic = %u\n",
1371 le32_to_cpu(htt_stats_buf->fse_traffic_ptrn_periodic));
1372 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "fse_hwqueue_alloc = %u\n",
1373 le32_to_cpu(htt_stats_buf->fse_hwqueue_alloc));
1374 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "fse_hwqueue_created = %u\n",
1375 le32_to_cpu(htt_stats_buf->fse_hwqueue_created));
1376 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "fse_hwqueue_send_to_host = %u\n",
1377 le32_to_cpu(htt_stats_buf->fse_hwqueue_send_to_host));
1378 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mcast_entry = %u\n",
1379 le32_to_cpu(htt_stats_buf->mcast_entry));
1380 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "bcast_entry = %u\n",
1381 le32_to_cpu(htt_stats_buf->bcast_entry));
1382 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "htt_update_peer_cache = %u\n",
1383 le32_to_cpu(htt_stats_buf->htt_update_peer_cache));
1384 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "htt_learning_frame = %u\n",
1385 le32_to_cpu(htt_stats_buf->htt_learning_frame));
1386 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "fse_invalid_peer = %u\n",
1387 le32_to_cpu(htt_stats_buf->fse_invalid_peer));
1388 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mec_notify = %u\n\n",
1389 le32_to_cpu(htt_stats_buf->mec_notify));
1390
1391 stats_req->buf_len = len;
1392}
1393
1394static void
1395ath12k_htt_print_tx_de_classify_failed_stats_tlv(const void *tag_buf, u16 tag_len,
1396 struct debug_htt_stats_req *stats_req)
1397{
1398 const struct ath12k_htt_tx_de_classify_failed_stats_tlv *htt_stats_buf = tag_buf;
1399 u8 *buf = stats_req->buf;
1400 u32 len = stats_req->buf_len;
1401 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
1402
1403 if (tag_len < sizeof(*htt_stats_buf))
1404 return;
1405
1406 len += scnprintf(buf: buf + len, size: buf_len - len,
1407 fmt: "HTT_TX_DE_CLASSIFY_FAILED_STATS_TLV:\n");
1408 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ap_bss_peer_not_found = %u\n",
1409 le32_to_cpu(htt_stats_buf->ap_bss_peer_not_found));
1410 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ap_bcast_mcast_no_peer = %u\n",
1411 le32_to_cpu(htt_stats_buf->ap_bcast_mcast_no_peer));
1412 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "sta_delete_in_progress = %u\n",
1413 le32_to_cpu(htt_stats_buf->sta_delete_in_progress));
1414 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ibss_no_bss_peer = %u\n",
1415 le32_to_cpu(htt_stats_buf->ibss_no_bss_peer));
1416 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "invalid_vdev_type = %u\n",
1417 le32_to_cpu(htt_stats_buf->invalid_vdev_type));
1418 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "invalid_ast_peer_entry = %u\n",
1419 le32_to_cpu(htt_stats_buf->invalid_ast_peer_entry));
1420 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "peer_entry_invalid = %u\n",
1421 le32_to_cpu(htt_stats_buf->peer_entry_invalid));
1422 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ethertype_not_ip = %u\n",
1423 le32_to_cpu(htt_stats_buf->ethertype_not_ip));
1424 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "eapol_lookup_failed = %u\n",
1425 le32_to_cpu(htt_stats_buf->eapol_lookup_failed));
1426 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "qpeer_not_allow_data = %u\n",
1427 le32_to_cpu(htt_stats_buf->qpeer_not_allow_data));
1428 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "fse_tid_override = %u\n",
1429 le32_to_cpu(htt_stats_buf->fse_tid_override));
1430 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ipv6_jumbogram_zero_length = %u\n",
1431 le32_to_cpu(htt_stats_buf->ipv6_jumbogram_zero_length));
1432 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "qos_to_non_qos_in_prog = %u\n",
1433 le32_to_cpu(htt_stats_buf->qos_to_non_qos_in_prog));
1434 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ap_bcast_mcast_eapol = %u\n",
1435 le32_to_cpu(htt_stats_buf->ap_bcast_mcast_eapol));
1436 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "unicast_on_ap_bss_peer = %u\n",
1437 le32_to_cpu(htt_stats_buf->unicast_on_ap_bss_peer));
1438 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ap_vdev_invalid = %u\n",
1439 le32_to_cpu(htt_stats_buf->ap_vdev_invalid));
1440 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "incomplete_llc = %u\n",
1441 le32_to_cpu(htt_stats_buf->incomplete_llc));
1442 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "eapol_duplicate_m3 = %u\n",
1443 le32_to_cpu(htt_stats_buf->eapol_duplicate_m3));
1444 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "eapol_duplicate_m4 = %u\n\n",
1445 le32_to_cpu(htt_stats_buf->eapol_duplicate_m4));
1446
1447 stats_req->buf_len = len;
1448}
1449
1450static void
1451ath12k_htt_print_tx_de_classify_status_stats_tlv(const void *tag_buf, u16 tag_len,
1452 struct debug_htt_stats_req *stats_req)
1453{
1454 const struct ath12k_htt_tx_de_classify_status_stats_tlv *htt_stats_buf = tag_buf;
1455 u8 *buf = stats_req->buf;
1456 u32 len = stats_req->buf_len;
1457 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
1458
1459 if (tag_len < sizeof(*htt_stats_buf))
1460 return;
1461
1462 len += scnprintf(buf: buf + len, size: buf_len - len,
1463 fmt: "HTT_TX_DE_CLASSIFY_STATUS_STATS_TLV:\n");
1464 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "eok = %u\n",
1465 le32_to_cpu(htt_stats_buf->eok));
1466 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "classify_done = %u\n",
1467 le32_to_cpu(htt_stats_buf->classify_done));
1468 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "lookup_failed = %u\n",
1469 le32_to_cpu(htt_stats_buf->lookup_failed));
1470 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "send_host_dhcp = %u\n",
1471 le32_to_cpu(htt_stats_buf->send_host_dhcp));
1472 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "send_host_mcast = %u\n",
1473 le32_to_cpu(htt_stats_buf->send_host_mcast));
1474 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "send_host_unknown_dest = %u\n",
1475 le32_to_cpu(htt_stats_buf->send_host_unknown_dest));
1476 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "send_host = %u\n",
1477 le32_to_cpu(htt_stats_buf->send_host));
1478 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "status_invalid = %u\n\n",
1479 le32_to_cpu(htt_stats_buf->status_invalid));
1480
1481 stats_req->buf_len = len;
1482}
1483
1484static void
1485ath12k_htt_print_tx_de_enqueue_packets_stats_tlv(const void *tag_buf, u16 tag_len,
1486 struct debug_htt_stats_req *stats_req)
1487{
1488 const struct ath12k_htt_tx_de_enqueue_packets_stats_tlv *htt_stats_buf = tag_buf;
1489 u8 *buf = stats_req->buf;
1490 u32 len = stats_req->buf_len;
1491 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
1492
1493 if (tag_len < sizeof(*htt_stats_buf))
1494 return;
1495
1496 len += scnprintf(buf: buf + len, size: buf_len - len,
1497 fmt: "HTT_TX_DE_ENQUEUE_PACKETS_STATS_TLV:\n");
1498 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "enqueued_pkts = %u\n",
1499 le32_to_cpu(htt_stats_buf->enqueued_pkts));
1500 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "to_tqm = %u\n",
1501 le32_to_cpu(htt_stats_buf->to_tqm));
1502 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "to_tqm_bypass = %u\n\n",
1503 le32_to_cpu(htt_stats_buf->to_tqm_bypass));
1504
1505 stats_req->buf_len = len;
1506}
1507
1508static void
1509ath12k_htt_print_tx_de_enqueue_discard_stats_tlv(const void *tag_buf, u16 tag_len,
1510 struct debug_htt_stats_req *stats_req)
1511{
1512 const struct ath12k_htt_tx_de_enqueue_discard_stats_tlv *htt_stats_buf = tag_buf;
1513 u8 *buf = stats_req->buf;
1514 u32 len = stats_req->buf_len;
1515 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
1516
1517 if (tag_len < sizeof(*htt_stats_buf))
1518 return;
1519
1520 len += scnprintf(buf: buf + len, size: buf_len - len,
1521 fmt: "HTT_TX_DE_ENQUEUE_DISCARD_STATS_TLV:\n");
1522 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "discarded_pkts = %u\n",
1523 le32_to_cpu(htt_stats_buf->discarded_pkts));
1524 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "local_frames = %u\n",
1525 le32_to_cpu(htt_stats_buf->local_frames));
1526 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "is_ext_msdu = %u\n\n",
1527 le32_to_cpu(htt_stats_buf->is_ext_msdu));
1528
1529 stats_req->buf_len = len;
1530}
1531
1532static void
1533ath12k_htt_print_tx_de_compl_stats_tlv(const void *tag_buf, u16 tag_len,
1534 struct debug_htt_stats_req *stats_req)
1535{
1536 const struct ath12k_htt_tx_de_compl_stats_tlv *htt_stats_buf = tag_buf;
1537 u8 *buf = stats_req->buf;
1538 u32 len = stats_req->buf_len;
1539 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
1540
1541 if (tag_len < sizeof(*htt_stats_buf))
1542 return;
1543
1544 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_TX_DE_COMPL_STATS_TLV:\n");
1545 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tcl_dummy_frame = %u\n",
1546 le32_to_cpu(htt_stats_buf->tcl_dummy_frame));
1547 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tqm_dummy_frame = %u\n",
1548 le32_to_cpu(htt_stats_buf->tqm_dummy_frame));
1549 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tqm_notify_frame = %u\n",
1550 le32_to_cpu(htt_stats_buf->tqm_notify_frame));
1551 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "fw2wbm_enq = %u\n",
1552 le32_to_cpu(htt_stats_buf->fw2wbm_enq));
1553 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tqm_bypass_frame = %u\n\n",
1554 le32_to_cpu(htt_stats_buf->tqm_bypass_frame));
1555
1556 stats_req->buf_len = len;
1557}
1558
1559static void
1560ath12k_htt_print_tx_selfgen_cmn_stats_tlv(const void *tag_buf, u16 tag_len,
1561 struct debug_htt_stats_req *stats_req)
1562{
1563 const struct ath12k_htt_tx_selfgen_cmn_stats_tlv *htt_stats_buf = tag_buf;
1564 u8 *buf = stats_req->buf;
1565 u32 len = stats_req->buf_len;
1566 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
1567 u32 mac_id_word;
1568
1569 if (tag_len < sizeof(*htt_stats_buf))
1570 return;
1571
1572 mac_id_word = __le32_to_cpu(htt_stats_buf->mac_id__word);
1573
1574 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_TX_SELFGEN_CMN_STATS_TLV:\n");
1575 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mac_id = %u\n",
1576 u32_get_bits(v: mac_id_word, ATH12K_HTT_STATS_MAC_ID));
1577 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "su_bar = %u\n",
1578 le32_to_cpu(htt_stats_buf->su_bar));
1579 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rts = %u\n",
1580 le32_to_cpu(htt_stats_buf->rts));
1581 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cts2self = %u\n",
1582 le32_to_cpu(htt_stats_buf->cts2self));
1583 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "qos_null = %u\n",
1584 le32_to_cpu(htt_stats_buf->qos_null));
1585 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "delayed_bar_1 = %u\n",
1586 le32_to_cpu(htt_stats_buf->delayed_bar_1));
1587 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "delayed_bar_2 = %u\n",
1588 le32_to_cpu(htt_stats_buf->delayed_bar_2));
1589 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "delayed_bar_3 = %u\n",
1590 le32_to_cpu(htt_stats_buf->delayed_bar_3));
1591 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "delayed_bar_4 = %u\n",
1592 le32_to_cpu(htt_stats_buf->delayed_bar_4));
1593 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "delayed_bar_5 = %u\n",
1594 le32_to_cpu(htt_stats_buf->delayed_bar_5));
1595 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "delayed_bar_6 = %u\n",
1596 le32_to_cpu(htt_stats_buf->delayed_bar_6));
1597 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "delayed_bar_7 = %u\n\n",
1598 le32_to_cpu(htt_stats_buf->delayed_bar_7));
1599
1600 stats_req->buf_len = len;
1601}
1602
1603static void
1604ath12k_htt_print_tx_selfgen_ac_stats_tlv(const void *tag_buf, u16 tag_len,
1605 struct debug_htt_stats_req *stats_req)
1606{
1607 const struct ath12k_htt_tx_selfgen_ac_stats_tlv *htt_stats_buf = tag_buf;
1608 u8 *buf = stats_req->buf;
1609 u32 len = stats_req->buf_len;
1610 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
1611
1612 if (tag_len < sizeof(*htt_stats_buf))
1613 return;
1614
1615 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_TX_SELFGEN_AC_STATS_TLV:\n");
1616 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ac_su_ndpa_tried = %u\n",
1617 le32_to_cpu(htt_stats_buf->ac_su_ndpa));
1618 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ac_su_ndp_tried = %u\n",
1619 le32_to_cpu(htt_stats_buf->ac_su_ndp));
1620 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ac_mu_mimo_ndpa_tried = %u\n",
1621 le32_to_cpu(htt_stats_buf->ac_mu_mimo_ndpa));
1622 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ac_mu_mimo_ndp_tried = %u\n",
1623 le32_to_cpu(htt_stats_buf->ac_mu_mimo_ndp));
1624 len += print_array_to_buf_index(buf, offset: len, header: "ac_mu_mimo_brpollX_tried = ", stats_index: 1,
1625 array: htt_stats_buf->ac_mu_mimo_brpoll,
1626 ATH12K_HTT_TX_NUM_AC_MUMIMO_USER_STATS - 1,
1627 footer: "\n\n");
1628
1629 stats_req->buf_len = len;
1630}
1631
1632static void
1633ath12k_htt_print_tx_selfgen_ax_stats_tlv(const void *tag_buf, u16 tag_len,
1634 struct debug_htt_stats_req *stats_req)
1635{
1636 const struct ath12k_htt_tx_selfgen_ax_stats_tlv *htt_stats_buf = tag_buf;
1637 u8 *buf = stats_req->buf;
1638 u32 len = stats_req->buf_len;
1639 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
1640
1641 if (tag_len < sizeof(*htt_stats_buf))
1642 return;
1643
1644 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_TX_SELFGEN_AX_STATS_TLV:\n");
1645 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ax_su_ndpa_tried = %u\n",
1646 le32_to_cpu(htt_stats_buf->ax_su_ndpa));
1647 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ax_su_ndp_tried = %u\n",
1648 le32_to_cpu(htt_stats_buf->ax_su_ndp));
1649 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ax_mu_mimo_ndpa_tried = %u\n",
1650 le32_to_cpu(htt_stats_buf->ax_mu_mimo_ndpa));
1651 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ax_mu_mimo_ndp_tried = %u\n",
1652 le32_to_cpu(htt_stats_buf->ax_mu_mimo_ndp));
1653 len += print_array_to_buf_index(buf, offset: len, header: "ax_mu_mimo_brpollX_tried = ", stats_index: 1,
1654 array: htt_stats_buf->ax_mu_mimo_brpoll,
1655 ATH12K_HTT_TX_NUM_AX_MUMIMO_USER_STATS - 1, footer: "\n");
1656 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ax_basic_trigger = %u\n",
1657 le32_to_cpu(htt_stats_buf->ax_basic_trigger));
1658 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ax_ulmumimo_total_trigger = %u\n",
1659 le32_to_cpu(htt_stats_buf->ax_ulmumimo_trigger));
1660 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ax_bsr_trigger = %u\n",
1661 le32_to_cpu(htt_stats_buf->ax_bsr_trigger));
1662 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ax_mu_bar_trigger = %u\n",
1663 le32_to_cpu(htt_stats_buf->ax_mu_bar_trigger));
1664 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ax_mu_rts_trigger = %u\n\n",
1665 le32_to_cpu(htt_stats_buf->ax_mu_rts_trigger));
1666
1667 stats_req->buf_len = len;
1668}
1669
1670static void
1671ath12k_htt_print_tx_selfgen_be_stats_tlv(const void *tag_buf, u16 tag_len,
1672 struct debug_htt_stats_req *stats_req)
1673{
1674 const struct ath12k_htt_tx_selfgen_be_stats_tlv *htt_stats_buf = tag_buf;
1675 u8 *buf = stats_req->buf;
1676 u32 len = stats_req->buf_len;
1677 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
1678
1679 if (tag_len < sizeof(*htt_stats_buf))
1680 return;
1681
1682 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_TX_SELFGEN_BE_STATS_TLV:\n");
1683 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_su_ndpa_queued = %u\n",
1684 le32_to_cpu(htt_stats_buf->be_su_ndpa_queued));
1685 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_su_ndpa_tried = %u\n",
1686 le32_to_cpu(htt_stats_buf->be_su_ndpa));
1687 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_su_ndp_queued = %u\n",
1688 le32_to_cpu(htt_stats_buf->be_su_ndp_queued));
1689 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_su_ndp_tried = %u\n",
1690 le32_to_cpu(htt_stats_buf->be_su_ndp));
1691 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_mu_mimo_ndpa_queued = %u\n",
1692 le32_to_cpu(htt_stats_buf->be_mu_mimo_ndpa_queued));
1693 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_mu_mimo_ndpa_tried = %u\n",
1694 le32_to_cpu(htt_stats_buf->be_mu_mimo_ndpa));
1695 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_mu_mimo_ndp_queued = %u\n",
1696 le32_to_cpu(htt_stats_buf->be_mu_mimo_ndp_queued));
1697 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_mu_mimo_ndp_tried = %u\n",
1698 le32_to_cpu(htt_stats_buf->be_mu_mimo_ndp));
1699 len += print_array_to_buf_index(buf, offset: len, header: "be_mu_mimo_brpollX_queued = ", stats_index: 1,
1700 array: htt_stats_buf->be_mu_mimo_brpoll_queued,
1701 ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS - 1,
1702 footer: "\n");
1703 len += print_array_to_buf_index(buf, offset: len, header: "be_mu_mimo_brpollX_tried = ", stats_index: 1,
1704 array: htt_stats_buf->be_mu_mimo_brpoll,
1705 ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS - 1,
1706 footer: "\n");
1707 len += print_array_to_buf(buf, offset: len, header: "be_ul_mumimo_trigger = ",
1708 array: htt_stats_buf->be_ul_mumimo_trigger,
1709 ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS, footer: "\n");
1710 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_basic_trigger = %u\n",
1711 le32_to_cpu(htt_stats_buf->be_basic_trigger));
1712 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_ulmumimo_total_trigger = %u\n",
1713 le32_to_cpu(htt_stats_buf->be_ulmumimo_trigger));
1714 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_bsr_trigger = %u\n",
1715 le32_to_cpu(htt_stats_buf->be_bsr_trigger));
1716 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_mu_bar_trigger = %u\n",
1717 le32_to_cpu(htt_stats_buf->be_mu_bar_trigger));
1718 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_mu_rts_trigger = %u\n\n",
1719 le32_to_cpu(htt_stats_buf->be_mu_rts_trigger));
1720
1721 stats_req->buf_len = len;
1722}
1723
1724static void
1725ath12k_htt_print_tx_selfgen_ac_err_stats_tlv(const void *tag_buf, u16 tag_len,
1726 struct debug_htt_stats_req *stats_req)
1727{
1728 const struct ath12k_htt_tx_selfgen_ac_err_stats_tlv *htt_stats_buf = tag_buf;
1729 u8 *buf = stats_req->buf;
1730 u32 len = stats_req->buf_len;
1731 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
1732
1733 if (tag_len < sizeof(*htt_stats_buf))
1734 return;
1735
1736 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_TX_SELFGEN_AC_ERR_STATS_TLV:\n");
1737 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ac_su_ndp_err = %u\n",
1738 le32_to_cpu(htt_stats_buf->ac_su_ndp_err));
1739 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ac_su_ndpa_err = %u\n",
1740 le32_to_cpu(htt_stats_buf->ac_su_ndpa_err));
1741 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ac_mu_mimo_ndpa_err = %u\n",
1742 le32_to_cpu(htt_stats_buf->ac_mu_mimo_ndpa_err));
1743 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ac_mu_mimo_ndp_err = %u\n",
1744 le32_to_cpu(htt_stats_buf->ac_mu_mimo_ndp_err));
1745 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ac_mu_mimo_brp1_err = %u\n",
1746 le32_to_cpu(htt_stats_buf->ac_mu_mimo_brp1_err));
1747 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ac_mu_mimo_brp2_err = %u\n",
1748 le32_to_cpu(htt_stats_buf->ac_mu_mimo_brp2_err));
1749 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ac_mu_mimo_brp3_err = %u\n\n",
1750 le32_to_cpu(htt_stats_buf->ac_mu_mimo_brp3_err));
1751
1752 stats_req->buf_len = len;
1753}
1754
1755static void
1756ath12k_htt_print_tx_selfgen_ax_err_stats_tlv(const void *tag_buf, u16 tag_len,
1757 struct debug_htt_stats_req *stats_req)
1758{
1759 const struct ath12k_htt_tx_selfgen_ax_err_stats_tlv *htt_stats_buf = tag_buf;
1760 u8 *buf = stats_req->buf;
1761 u32 len = stats_req->buf_len;
1762 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
1763
1764 if (tag_len < sizeof(*htt_stats_buf))
1765 return;
1766
1767 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_TX_SELFGEN_AX_ERR_STATS_TLV:\n");
1768 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ax_su_ndp_err = %u\n",
1769 le32_to_cpu(htt_stats_buf->ax_su_ndp_err));
1770 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ax_su_ndpa_err = %u\n",
1771 le32_to_cpu(htt_stats_buf->ax_su_ndpa_err));
1772 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ax_mu_mimo_ndpa_err = %u\n",
1773 le32_to_cpu(htt_stats_buf->ax_mu_mimo_ndpa_err));
1774 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ax_mu_mimo_ndp_err = %u\n",
1775 le32_to_cpu(htt_stats_buf->ax_mu_mimo_ndp_err));
1776 len += print_array_to_buf_index(buf, offset: len, header: "ax_mu_mimo_brpX_err", stats_index: 1,
1777 array: htt_stats_buf->ax_mu_mimo_brp_err,
1778 ATH12K_HTT_TX_NUM_AX_MUMIMO_USER_STATS - 1,
1779 footer: "\n");
1780 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ax_basic_trigger_err = %u\n",
1781 le32_to_cpu(htt_stats_buf->ax_basic_trigger_err));
1782 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ax_ulmumimo_total_trigger_err = %u\n",
1783 le32_to_cpu(htt_stats_buf->ax_ulmumimo_trigger_err));
1784 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ax_bsr_trigger_err = %u\n",
1785 le32_to_cpu(htt_stats_buf->ax_bsr_trigger_err));
1786 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ax_mu_bar_trigger_err = %u\n",
1787 le32_to_cpu(htt_stats_buf->ax_mu_bar_trigger_err));
1788 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ax_mu_rts_trigger_err = %u\n\n",
1789 le32_to_cpu(htt_stats_buf->ax_mu_rts_trigger_err));
1790
1791 stats_req->buf_len = len;
1792}
1793
1794static void
1795ath12k_htt_print_tx_selfgen_be_err_stats_tlv(const void *tag_buf, u16 tag_len,
1796 struct debug_htt_stats_req *stats_req)
1797{
1798 const struct ath12k_htt_tx_selfgen_be_err_stats_tlv *htt_stats_buf = tag_buf;
1799 u8 *buf = stats_req->buf;
1800 u32 len = stats_req->buf_len;
1801 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
1802
1803 if (tag_len < sizeof(*htt_stats_buf))
1804 return;
1805
1806 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_TX_SELFGEN_BE_ERR_STATS_TLV:\n");
1807 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_su_ndp_err = %u\n",
1808 le32_to_cpu(htt_stats_buf->be_su_ndp_err));
1809 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_su_ndp_flushed = %u\n",
1810 le32_to_cpu(htt_stats_buf->be_su_ndp_flushed));
1811 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_su_ndpa_err = %u\n",
1812 le32_to_cpu(htt_stats_buf->be_su_ndpa_err));
1813 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_su_ndpa_flushed = %u\n",
1814 le32_to_cpu(htt_stats_buf->be_su_ndpa_flushed));
1815 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_mu_mimo_ndpa_err = %u\n",
1816 le32_to_cpu(htt_stats_buf->be_mu_mimo_ndpa_err));
1817 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_mu_mimo_ndpa_flushed = %u\n",
1818 le32_to_cpu(htt_stats_buf->be_mu_mimo_ndpa_flushed));
1819 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_mu_mimo_ndp_err = %u\n",
1820 le32_to_cpu(htt_stats_buf->be_mu_mimo_ndp_err));
1821 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_mu_mimo_ndp_flushed = %u\n",
1822 le32_to_cpu(htt_stats_buf->be_mu_mimo_ndp_flushed));
1823 len += print_array_to_buf_index(buf, offset: len, header: "be_mu_mimo_brpX_err", stats_index: 1,
1824 array: htt_stats_buf->be_mu_mimo_brp_err,
1825 ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS - 1,
1826 footer: "\n");
1827 len += print_array_to_buf_index(buf, offset: len, header: "be_mu_mimo_brpollX_flushed", stats_index: 1,
1828 array: htt_stats_buf->be_mu_mimo_brpoll_flushed,
1829 ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS - 1,
1830 footer: "\n");
1831 len += print_array_to_buf(buf, offset: len, header: "be_mu_mimo_num_cbf_rcvd_on_brp_err",
1832 array: htt_stats_buf->be_mu_mimo_brp_err_num_cbf_rxd,
1833 ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS, footer: "\n");
1834 len += print_array_to_buf(buf, offset: len, header: "be_ul_mumimo_trigger_err",
1835 array: htt_stats_buf->be_ul_mumimo_trigger_err,
1836 ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS, footer: "\n");
1837 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_basic_trigger_err = %u\n",
1838 le32_to_cpu(htt_stats_buf->be_basic_trigger_err));
1839 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_ulmumimo_total_trig_err = %u\n",
1840 le32_to_cpu(htt_stats_buf->be_ulmumimo_trigger_err));
1841 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_bsr_trigger_err = %u\n",
1842 le32_to_cpu(htt_stats_buf->be_bsr_trigger_err));
1843 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_mu_bar_trigger_err = %u\n",
1844 le32_to_cpu(htt_stats_buf->be_mu_bar_trigger_err));
1845 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_mu_rts_trigger_err = %u\n\n",
1846 le32_to_cpu(htt_stats_buf->be_mu_rts_trigger_err));
1847
1848 stats_req->buf_len = len;
1849}
1850
1851static void
1852ath12k_htt_print_tx_selfgen_ac_sched_status_stats_tlv(const void *tag_buf, u16 tag_len,
1853 struct debug_htt_stats_req *stats)
1854{
1855 const struct ath12k_htt_tx_selfgen_ac_sched_status_stats_tlv *htt_stats_buf =
1856 tag_buf;
1857 u8 *buf = stats->buf;
1858 u32 len = stats->buf_len;
1859 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
1860
1861 if (tag_len < sizeof(*htt_stats_buf))
1862 return;
1863
1864 len += scnprintf(buf: buf + len, size: buf_len - len,
1865 fmt: "HTT_TX_SELFGEN_AC_SCHED_STATUS_STATS_TLV:\n");
1866 len += print_array_to_buf(buf, offset: len, header: "ac_su_ndpa_sch_status",
1867 array: htt_stats_buf->ac_su_ndpa_sch_status,
1868 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, footer: "\n");
1869 len += print_array_to_buf(buf, offset: len, header: "ac_su_ndp_sch_status",
1870 array: htt_stats_buf->ac_su_ndp_sch_status,
1871 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, footer: "\n");
1872 len += print_array_to_buf(buf, offset: len, header: "ac_mu_mimo_ndpa_sch_status",
1873 array: htt_stats_buf->ac_mu_mimo_ndpa_sch_status,
1874 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, footer: "\n");
1875 len += print_array_to_buf(buf, offset: len, header: "ac_mu_mimo_ndp_sch_status",
1876 array: htt_stats_buf->ac_mu_mimo_ndp_sch_status,
1877 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, footer: "\n");
1878 len += print_array_to_buf(buf, offset: len, header: "ac_mu_mimo_brp_sch_status",
1879 array: htt_stats_buf->ac_mu_mimo_brp_sch_status,
1880 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, footer: "\n");
1881 len += print_array_to_buf(buf, offset: len, header: "ac_su_ndp_sch_flag_err",
1882 array: htt_stats_buf->ac_su_ndp_sch_flag_err,
1883 array_len: ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, footer: "\n");
1884 len += print_array_to_buf(buf, offset: len, header: "ac_mu_mimo_ndp_sch_flag_err",
1885 array: htt_stats_buf->ac_mu_mimo_ndp_sch_flag_err,
1886 array_len: ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, footer: "\n");
1887 len += print_array_to_buf(buf, offset: len, header: "ac_mu_mimo_brp_sch_flag_err",
1888 array: htt_stats_buf->ac_mu_mimo_brp_sch_flag_err,
1889 array_len: ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, footer: "\n\n");
1890
1891 stats->buf_len = len;
1892}
1893
1894static void
1895ath12k_htt_print_tx_selfgen_ax_sched_status_stats_tlv(const void *tag_buf, u16 tag_len,
1896 struct debug_htt_stats_req *stats)
1897{
1898 const struct ath12k_htt_tx_selfgen_ax_sched_status_stats_tlv *htt_stats_buf =
1899 tag_buf;
1900 u8 *buf = stats->buf;
1901 u32 len = stats->buf_len;
1902 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
1903
1904 if (tag_len < sizeof(*htt_stats_buf))
1905 return;
1906
1907 len += scnprintf(buf: buf + len, size: buf_len - len,
1908 fmt: "HTT_TX_SELFGEN_AX_SCHED_STATUS_STATS_TLV:\n");
1909 len += print_array_to_buf(buf, offset: len, header: "ax_su_ndpa_sch_status",
1910 array: htt_stats_buf->ax_su_ndpa_sch_status,
1911 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, footer: "\n");
1912 len += print_array_to_buf(buf, offset: len, header: "ax_su_ndp_sch_status",
1913 array: htt_stats_buf->ax_su_ndp_sch_status,
1914 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, footer: "\n");
1915 len += print_array_to_buf(buf, offset: len, header: "ax_mu_mimo_ndpa_sch_status",
1916 array: htt_stats_buf->ax_mu_mimo_ndpa_sch_status,
1917 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, footer: "\n");
1918 len += print_array_to_buf(buf, offset: len, header: "ax_mu_mimo_ndp_sch_status",
1919 array: htt_stats_buf->ax_mu_mimo_ndp_sch_status,
1920 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, footer: "\n");
1921 len += print_array_to_buf(buf, offset: len, header: "ax_mu_brp_sch_status",
1922 array: htt_stats_buf->ax_mu_brp_sch_status,
1923 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, footer: "\n");
1924 len += print_array_to_buf(buf, offset: len, header: "ax_mu_bar_sch_status",
1925 array: htt_stats_buf->ax_mu_bar_sch_status,
1926 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, footer: "\n");
1927 len += print_array_to_buf(buf, offset: len, header: "ax_basic_trig_sch_status",
1928 array: htt_stats_buf->ax_basic_trig_sch_status,
1929 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, footer: "\n");
1930 len += print_array_to_buf(buf, offset: len, header: "ax_su_ndp_sch_flag_err",
1931 array: htt_stats_buf->ax_su_ndp_sch_flag_err,
1932 array_len: ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, footer: "\n");
1933 len += print_array_to_buf(buf, offset: len, header: "ax_mu_mimo_ndp_sch_flag_err",
1934 array: htt_stats_buf->ax_mu_mimo_ndp_sch_flag_err,
1935 array_len: ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, footer: "\n");
1936 len += print_array_to_buf(buf, offset: len, header: "ax_mu_brp_sch_flag_err",
1937 array: htt_stats_buf->ax_mu_brp_sch_flag_err,
1938 array_len: ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, footer: "\n");
1939 len += print_array_to_buf(buf, offset: len, header: "ax_mu_bar_sch_flag_err",
1940 array: htt_stats_buf->ax_mu_bar_sch_flag_err,
1941 array_len: ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, footer: "\n");
1942 len += print_array_to_buf(buf, offset: len, header: "ax_basic_trig_sch_flag_err",
1943 array: htt_stats_buf->ax_basic_trig_sch_flag_err,
1944 array_len: ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, footer: "\n");
1945 len += print_array_to_buf(buf, offset: len, header: "ax_ulmumimo_trig_sch_status",
1946 array: htt_stats_buf->ax_ulmumimo_trig_sch_status,
1947 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, footer: "\n");
1948 len += print_array_to_buf(buf, offset: len, header: "ax_ulmumimo_trig_sch_flag_err",
1949 array: htt_stats_buf->ax_ulmumimo_trig_sch_flag_err,
1950 array_len: ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, footer: "\n\n");
1951
1952 stats->buf_len = len;
1953}
1954
1955static void
1956ath12k_htt_print_tx_selfgen_be_sched_status_stats_tlv(const void *tag_buf, u16 tag_len,
1957 struct debug_htt_stats_req *stats)
1958{
1959 const struct ath12k_htt_tx_selfgen_be_sched_status_stats_tlv *htt_stats_buf =
1960 tag_buf;
1961 u8 *buf = stats->buf;
1962 u32 len = stats->buf_len;
1963 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
1964
1965 if (tag_len < sizeof(*htt_stats_buf))
1966 return;
1967
1968 len += scnprintf(buf: buf + len, size: buf_len - len,
1969 fmt: "HTT_TX_SELFGEN_BE_SCHED_STATUS_STATS_TLV:\n");
1970 len += print_array_to_buf(buf, offset: len, header: "be_su_ndpa_sch_status",
1971 array: htt_stats_buf->be_su_ndpa_sch_status,
1972 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, footer: "\n");
1973 len += print_array_to_buf(buf, offset: len, header: "be_su_ndp_sch_status",
1974 array: htt_stats_buf->be_su_ndp_sch_status,
1975 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, footer: "\n");
1976 len += print_array_to_buf(buf, offset: len, header: "be_mu_mimo_ndpa_sch_status",
1977 array: htt_stats_buf->be_mu_mimo_ndpa_sch_status,
1978 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, footer: "\n");
1979 len += print_array_to_buf(buf, offset: len, header: "be_mu_mimo_ndp_sch_status",
1980 array: htt_stats_buf->be_mu_mimo_ndp_sch_status,
1981 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, footer: "\n");
1982 len += print_array_to_buf(buf, offset: len, header: "be_mu_brp_sch_status",
1983 array: htt_stats_buf->be_mu_brp_sch_status,
1984 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, footer: "\n");
1985 len += print_array_to_buf(buf, offset: len, header: "be_mu_bar_sch_status",
1986 array: htt_stats_buf->be_mu_bar_sch_status,
1987 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, footer: "\n");
1988 len += print_array_to_buf(buf, offset: len, header: "be_basic_trig_sch_status",
1989 array: htt_stats_buf->be_basic_trig_sch_status,
1990 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, footer: "\n");
1991 len += print_array_to_buf(buf, offset: len, header: "be_su_ndp_sch_flag_err",
1992 array: htt_stats_buf->be_su_ndp_sch_flag_err,
1993 array_len: ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, footer: "\n");
1994 len += print_array_to_buf(buf, offset: len, header: "be_mu_mimo_ndp_sch_flag_err",
1995 array: htt_stats_buf->be_mu_mimo_ndp_sch_flag_err,
1996 array_len: ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, footer: "\n");
1997 len += print_array_to_buf(buf, offset: len, header: "be_mu_brp_sch_flag_err",
1998 array: htt_stats_buf->be_mu_brp_sch_flag_err,
1999 array_len: ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, footer: "\n");
2000 len += print_array_to_buf(buf, offset: len, header: "be_mu_bar_sch_flag_err",
2001 array: htt_stats_buf->be_mu_bar_sch_flag_err,
2002 array_len: ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, footer: "\n");
2003 len += print_array_to_buf(buf, offset: len, header: "be_basic_trig_sch_flag_err",
2004 array: htt_stats_buf->be_basic_trig_sch_flag_err,
2005 array_len: ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, footer: "\n");
2006 len += print_array_to_buf(buf, offset: len, header: "be_basic_trig_sch_flag_err",
2007 array: htt_stats_buf->be_basic_trig_sch_flag_err,
2008 ATH12K_HTT_TX_PDEV_STATS_NUM_TX_ERR_STATUS, footer: "\n");
2009 len += print_array_to_buf(buf, offset: len, header: "be_ulmumimo_trig_sch_flag_err",
2010 array: htt_stats_buf->be_ulmumimo_trig_sch_flag_err,
2011 array_len: ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS, footer: "\n\n");
2012
2013 stats->buf_len = len;
2014}
2015
2016static void
2017ath12k_htt_print_stats_string_tlv(const void *tag_buf, u16 tag_len,
2018 struct debug_htt_stats_req *stats_req)
2019{
2020 const struct ath12k_htt_stats_string_tlv *htt_stats_buf = tag_buf;
2021 u8 *buf = stats_req->buf;
2022 u32 len = stats_req->buf_len;
2023 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
2024 u8 i;
2025 u16 index = 0;
2026 u32 datum;
2027 char data[ATH12K_HTT_MAX_STRING_LEN] = {};
2028
2029 tag_len = tag_len >> 2;
2030
2031 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_STATS_STRING_TLV:\n");
2032 for (i = 0; i < tag_len; i++) {
2033 datum = __le32_to_cpu(htt_stats_buf->data[i]);
2034 index += scnprintf(buf: &data[index], ATH12K_HTT_MAX_STRING_LEN - index,
2035 fmt: "%.*s", 4, (char *)&datum);
2036 if (index >= ATH12K_HTT_MAX_STRING_LEN)
2037 break;
2038 }
2039 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "data = %s\n\n", data);
2040
2041 stats_req->buf_len = len;
2042}
2043
2044static void
2045ath12k_htt_print_sring_stats_tlv(const void *tag_buf, u16 tag_len,
2046 struct debug_htt_stats_req *stats_req)
2047{
2048 const struct ath12k_htt_sring_stats_tlv *htt_stats_buf = tag_buf;
2049 u8 *buf = stats_req->buf;
2050 u32 len = stats_req->buf_len;
2051 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
2052 u32 mac_id_word;
2053 u32 avail_words;
2054 u32 head_tail_ptr;
2055 u32 sring_stat;
2056 u32 tail_ptr;
2057
2058 if (tag_len < sizeof(*htt_stats_buf))
2059 return;
2060
2061 mac_id_word = __le32_to_cpu(htt_stats_buf->mac_id__ring_id__arena__ep);
2062 avail_words = __le32_to_cpu(htt_stats_buf->num_avail_words__num_valid_words);
2063 head_tail_ptr = __le32_to_cpu(htt_stats_buf->head_ptr__tail_ptr);
2064 sring_stat = __le32_to_cpu(htt_stats_buf->consumer_empty__producer_full);
2065 tail_ptr = __le32_to_cpu(htt_stats_buf->prefetch_count__internal_tail_ptr);
2066
2067 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_SRING_STATS_TLV:\n");
2068 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mac_id = %u\n",
2069 u32_get_bits(v: mac_id_word, ATH12K_HTT_SRING_STATS_MAC_ID));
2070 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ring_id = %u\n",
2071 u32_get_bits(v: mac_id_word, ATH12K_HTT_SRING_STATS_RING_ID));
2072 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "arena = %u\n",
2073 u32_get_bits(v: mac_id_word, ATH12K_HTT_SRING_STATS_ARENA));
2074 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ep = %u\n",
2075 u32_get_bits(v: mac_id_word, ATH12K_HTT_SRING_STATS_EP));
2076 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "base_addr_lsb = 0x%x\n",
2077 le32_to_cpu(htt_stats_buf->base_addr_lsb));
2078 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "base_addr_msb = 0x%x\n",
2079 le32_to_cpu(htt_stats_buf->base_addr_msb));
2080 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ring_size = %u\n",
2081 le32_to_cpu(htt_stats_buf->ring_size));
2082 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "elem_size = %u\n",
2083 le32_to_cpu(htt_stats_buf->elem_size));
2084 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_avail_words = %u\n",
2085 u32_get_bits(v: avail_words,
2086 ATH12K_HTT_SRING_STATS_NUM_AVAIL_WORDS));
2087 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_valid_words = %u\n",
2088 u32_get_bits(v: avail_words,
2089 ATH12K_HTT_SRING_STATS_NUM_VALID_WORDS));
2090 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "head_ptr = %u\n",
2091 u32_get_bits(v: head_tail_ptr, ATH12K_HTT_SRING_STATS_HEAD_PTR));
2092 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tail_ptr = %u\n",
2093 u32_get_bits(v: head_tail_ptr, ATH12K_HTT_SRING_STATS_TAIL_PTR));
2094 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "consumer_empty = %u\n",
2095 u32_get_bits(v: sring_stat,
2096 ATH12K_HTT_SRING_STATS_CONSUMER_EMPTY));
2097 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "producer_full = %u\n",
2098 u32_get_bits(v: head_tail_ptr,
2099 ATH12K_HTT_SRING_STATS_PRODUCER_FULL));
2100 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "prefetch_count = %u\n",
2101 u32_get_bits(v: tail_ptr, ATH12K_HTT_SRING_STATS_PREFETCH_COUNT));
2102 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "internal_tail_ptr = %u\n\n",
2103 u32_get_bits(v: tail_ptr,
2104 ATH12K_HTT_SRING_STATS_INTERNAL_TAIL_PTR));
2105
2106 stats_req->buf_len = len;
2107}
2108
2109static void
2110ath12k_htt_print_sfm_cmn_tlv(const void *tag_buf, u16 tag_len,
2111 struct debug_htt_stats_req *stats_req)
2112{
2113 const struct ath12k_htt_sfm_cmn_tlv *htt_stats_buf = tag_buf;
2114 u8 *buf = stats_req->buf;
2115 u32 len = stats_req->buf_len;
2116 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
2117 u32 mac_id_word;
2118
2119 if (tag_len < sizeof(*htt_stats_buf))
2120 return;
2121
2122 mac_id_word = __le32_to_cpu(htt_stats_buf->mac_id__word);
2123
2124 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_SFM_CMN_TLV:\n");
2125 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mac_id = %u\n",
2126 u32_get_bits(v: mac_id_word, ATH12K_HTT_STATS_MAC_ID));
2127 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "buf_total = %u\n",
2128 le32_to_cpu(htt_stats_buf->buf_total));
2129 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mem_empty = %u\n",
2130 le32_to_cpu(htt_stats_buf->mem_empty));
2131 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "deallocate_bufs = %u\n",
2132 le32_to_cpu(htt_stats_buf->deallocate_bufs));
2133 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_records = %u\n\n",
2134 le32_to_cpu(htt_stats_buf->num_records));
2135
2136 stats_req->buf_len = len;
2137}
2138
2139static void
2140ath12k_htt_print_sfm_client_tlv(const void *tag_buf, u16 tag_len,
2141 struct debug_htt_stats_req *stats_req)
2142{
2143 const struct ath12k_htt_sfm_client_tlv *htt_stats_buf = tag_buf;
2144 u8 *buf = stats_req->buf;
2145 u32 len = stats_req->buf_len;
2146 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
2147
2148 if (tag_len < sizeof(*htt_stats_buf))
2149 return;
2150
2151 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_SFM_CLIENT_TLV:\n");
2152 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "client_id = %u\n",
2153 le32_to_cpu(htt_stats_buf->client_id));
2154 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "buf_min = %u\n",
2155 le32_to_cpu(htt_stats_buf->buf_min));
2156 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "buf_max = %u\n",
2157 le32_to_cpu(htt_stats_buf->buf_max));
2158 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "buf_busy = %u\n",
2159 le32_to_cpu(htt_stats_buf->buf_busy));
2160 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "buf_alloc = %u\n",
2161 le32_to_cpu(htt_stats_buf->buf_alloc));
2162 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "buf_avail = %u\n",
2163 le32_to_cpu(htt_stats_buf->buf_avail));
2164 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_users = %u\n\n",
2165 le32_to_cpu(htt_stats_buf->num_users));
2166
2167 stats_req->buf_len = len;
2168}
2169
2170static void
2171ath12k_htt_print_sfm_client_user_tlv(const void *tag_buf, u16 tag_len,
2172 struct debug_htt_stats_req *stats_req)
2173{
2174 const struct ath12k_htt_sfm_client_user_tlv *htt_stats_buf = tag_buf;
2175 u8 *buf = stats_req->buf;
2176 u32 len = stats_req->buf_len;
2177 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
2178 u16 num_elems = tag_len >> 2;
2179
2180 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_SFM_CLIENT_USER_TLV:\n");
2181 len += print_array_to_buf(buf, offset: len, header: "dwords_used_by_user_n",
2182 array: htt_stats_buf->dwords_used_by_user_n,
2183 array_len: num_elems, footer: "\n\n");
2184
2185 stats_req->buf_len = len;
2186}
2187
2188static void
2189ath12k_htt_print_tx_pdev_mu_mimo_sch_stats_tlv(const void *tag_buf, u16 tag_len,
2190 struct debug_htt_stats_req *stats_req)
2191{
2192 const struct ath12k_htt_tx_pdev_mu_mimo_sch_stats_tlv *htt_stats_buf = tag_buf;
2193 u8 *buf = stats_req->buf;
2194 u32 len = stats_req->buf_len;
2195 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
2196 u8 i;
2197
2198 if (tag_len < sizeof(*htt_stats_buf))
2199 return;
2200
2201 len += scnprintf(buf: buf + len, size: buf_len - len,
2202 fmt: "HTT_TX_PDEV_MU_MIMO_SCH_STATS_TLV:\n");
2203 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mu_mimo_sch_posted = %u\n",
2204 le32_to_cpu(htt_stats_buf->mu_mimo_sch_posted));
2205 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mu_mimo_sch_failed = %u\n",
2206 le32_to_cpu(htt_stats_buf->mu_mimo_sch_failed));
2207 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mu_mimo_ppdu_posted = %u\n",
2208 le32_to_cpu(htt_stats_buf->mu_mimo_ppdu_posted));
2209 len += scnprintf(buf: buf + len, size: buf_len - len,
2210 fmt: "\nac_mu_mimo_sch_posted_per_group_index %u (SU) = %u\n", 0,
2211 le32_to_cpu(htt_stats_buf->ac_mu_mimo_per_grp_sz[0]));
2212 for (i = 1; i < ATH12K_HTT_TX_NUM_AC_MUMIMO_USER_STATS; i++) {
2213 len += scnprintf(buf: buf + len, size: buf_len - len,
2214 fmt: "ac_mu_mimo_sch_posted_per_group_index %u ", i);
2215 len += scnprintf(buf: buf + len, size: buf_len - len,
2216 fmt: "(TOTAL STREAMS = %u) = %u\n", i + 1,
2217 le32_to_cpu(htt_stats_buf->ac_mu_mimo_per_grp_sz[i]));
2218 }
2219
2220 for (i = 0; i < ATH12K_HTT_TX_NUM_AC_MUMIMO_USER_STATS; i++) {
2221 len += scnprintf(buf: buf + len, size: buf_len - len,
2222 fmt: "ac_mu_mimo_sch_posted_per_group_index %u ",
2223 i + ATH12K_HTT_TX_NUM_AC_MUMIMO_USER_STATS);
2224 len += scnprintf(buf: buf + len, size: buf_len - len,
2225 fmt: "(TOTAL STREAMS = %u) = %u\n",
2226 i + ATH12K_HTT_TX_NUM_AC_MUMIMO_USER_STATS + 1,
2227 le32_to_cpu(htt_stats_buf->ac_mu_mimo_grp_sz_ext[i]));
2228 }
2229
2230 len += scnprintf(buf: buf + len, size: buf_len - len,
2231 fmt: "\nax_mu_mimo_sch_posted_per_group_index %u (SU) = %u\n", 0,
2232 le32_to_cpu(htt_stats_buf->ax_mu_mimo_per_grp_sz[0]));
2233 for (i = 1; i < ATH12K_HTT_TX_NUM_AX_MUMIMO_USER_STATS; i++) {
2234 len += scnprintf(buf: buf + len, size: buf_len - len,
2235 fmt: "ax_mu_mimo_sch_posted_per_group_index %u ", i);
2236 len += scnprintf(buf: buf + len, size: buf_len - len,
2237 fmt: "(TOTAL STREAMS = %u) = %u\n", i + 1,
2238 le32_to_cpu(htt_stats_buf->ax_mu_mimo_per_grp_sz[i]));
2239 }
2240
2241 len += scnprintf(buf: buf + len, size: buf_len - len,
2242 fmt: "\nbe_mu_mimo_sch_posted_per_group_index %u (SU) = %u\n", 0,
2243 le32_to_cpu(htt_stats_buf->be_mu_mimo_per_grp_sz[0]));
2244 for (i = 1; i < ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS; i++) {
2245 len += scnprintf(buf: buf + len, size: buf_len - len,
2246 fmt: "be_mu_mimo_sch_posted_per_group_index %u ", i);
2247 len += scnprintf(buf: buf + len, size: buf_len - len,
2248 fmt: "(TOTAL STREAMS = %u) = %u\n", i + 1,
2249 le32_to_cpu(htt_stats_buf->be_mu_mimo_per_grp_sz[i]));
2250 }
2251
2252 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n11ac MU_MIMO SCH STATS:\n");
2253 for (i = 0; i < ATH12K_HTT_TX_NUM_AC_MUMIMO_USER_STATS; i++) {
2254 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ac_mu_mimo_sch_nusers_");
2255 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "%u = %u\n", i,
2256 le32_to_cpu(htt_stats_buf->ac_mu_mimo_sch_nusers[i]));
2257 }
2258
2259 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n11ax MU_MIMO SCH STATS:\n");
2260 for (i = 0; i < ATH12K_HTT_TX_NUM_AX_MUMIMO_USER_STATS; i++) {
2261 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ax_mu_mimo_sch_nusers_");
2262 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "%u = %u\n", i,
2263 le32_to_cpu(htt_stats_buf->ax_mu_mimo_sch_nusers[i]));
2264 }
2265
2266 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n11be MU_MIMO SCH STATS:\n");
2267 for (i = 0; i < ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS; i++) {
2268 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_mu_mimo_sch_nusers_");
2269 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "%u = %u\n", i,
2270 le32_to_cpu(htt_stats_buf->be_mu_mimo_sch_nusers[i]));
2271 }
2272
2273 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n11ax OFDMA SCH STATS:\n");
2274 for (i = 0; i < ATH12K_HTT_TX_NUM_OFDMA_USER_STATS; i++) {
2275 len += scnprintf(buf: buf + len, size: buf_len - len,
2276 fmt: "ax_ofdma_sch_nusers_%u = %u\n", i,
2277 le32_to_cpu(htt_stats_buf->ax_ofdma_sch_nusers[i]));
2278 len += scnprintf(buf: buf + len, size: buf_len - len,
2279 fmt: "ax_ul_ofdma_basic_sch_nusers_%u = %u\n", i,
2280 le32_to_cpu(htt_stats_buf->ax_ul_ofdma_nusers[i]));
2281 len += scnprintf(buf: buf + len, size: buf_len - len,
2282 fmt: "ax_ul_ofdma_bsr_sch_nusers_%u = %u\n", i,
2283 le32_to_cpu(htt_stats_buf->ax_ul_ofdma_bsr_nusers[i]));
2284 len += scnprintf(buf: buf + len, size: buf_len - len,
2285 fmt: "ax_ul_ofdma_bar_sch_nusers_%u = %u\n", i,
2286 le32_to_cpu(htt_stats_buf->ax_ul_ofdma_bar_nusers[i]));
2287 len += scnprintf(buf: buf + len, size: buf_len - len,
2288 fmt: "ax_ul_ofdma_brp_sch_nusers_%u = %u\n\n", i,
2289 le32_to_cpu(htt_stats_buf->ax_ul_ofdma_brp_nusers[i]));
2290 }
2291
2292 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "11ax UL MUMIMO SCH STATS:\n");
2293 for (i = 0; i < ATH12K_HTT_TX_NUM_UL_MUMIMO_USER_STATS; i++) {
2294 len += scnprintf(buf: buf + len, size: buf_len - len,
2295 fmt: "ax_ul_mumimo_basic_sch_nusers_%u = %u\n", i,
2296 le32_to_cpu(htt_stats_buf->ax_ul_mumimo_nusers[i]));
2297 len += scnprintf(buf: buf + len, size: buf_len - len,
2298 fmt: "ax_ul_mumimo_brp_sch_nusers_%u = %u\n\n", i,
2299 le32_to_cpu(htt_stats_buf->ax_ul_mumimo_brp_nusers[i]));
2300 }
2301
2302 stats_req->buf_len = len;
2303}
2304
2305static void
2306ath12k_htt_print_tx_pdev_mumimo_grp_stats_tlv(const void *tag_buf, u16 tag_len,
2307 struct debug_htt_stats_req *stats_req)
2308{
2309 const struct ath12k_htt_tx_pdev_mumimo_grp_stats_tlv *htt_stats_buf = tag_buf;
2310 u8 *buf = stats_req->buf;
2311 u32 len = stats_req->buf_len;
2312 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
2313 int j;
2314
2315 if (tag_len < sizeof(*htt_stats_buf))
2316 return;
2317
2318 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_TX_PDEV_MUMIMO_GRP_STATS:\n");
2319 len += print_array_to_buf(buf, offset: len,
2320 header: "dl_mumimo_grp_tputs_observed (per bin = 300 mbps)",
2321 array: htt_stats_buf->dl_mumimo_grp_tputs,
2322 ATH12K_HTT_STATS_MUMIMO_TPUT_NUM_BINS, footer: "\n");
2323 len += print_array_to_buf(buf, offset: len, header: "dl_mumimo_grp eligible",
2324 array: htt_stats_buf->dl_mumimo_grp_eligible,
2325 ATH12K_HTT_STATS_NUM_MAX_MUMIMO_SZ, footer: "\n");
2326 len += print_array_to_buf(buf, offset: len, header: "dl_mumimo_grp_ineligible",
2327 array: htt_stats_buf->dl_mumimo_grp_ineligible,
2328 ATH12K_HTT_STATS_NUM_MAX_MUMIMO_SZ, footer: "\n");
2329 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "dl_mumimo_grp_invalid:\n");
2330 for (j = 0; j < ATH12K_HTT_STATS_NUM_MAX_MUMIMO_SZ; j++) {
2331 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "grp_id = %u", j);
2332 len += print_array_to_buf(buf, offset: len, header: "",
2333 array: htt_stats_buf->dl_mumimo_grp_invalid,
2334 ATH12K_HTT_STATS_MAX_INVALID_REASON_CODE,
2335 footer: "\n");
2336 }
2337
2338 len += print_array_to_buf(buf, offset: len, header: "ul_mumimo_grp_best_grp_size",
2339 array: htt_stats_buf->ul_mumimo_grp_best_grp_size,
2340 ATH12K_HTT_STATS_NUM_MAX_MUMIMO_SZ, footer: "\n");
2341 len += print_array_to_buf(buf, offset: len, header: "ul_mumimo_grp_best_num_usrs = ",
2342 array: htt_stats_buf->ul_mumimo_grp_best_usrs,
2343 ATH12K_HTT_TX_NUM_AX_MUMIMO_USER_STATS, footer: "\n");
2344 len += print_array_to_buf(buf, offset: len,
2345 header: "ul_mumimo_grp_tputs_observed (per bin = 300 mbps)",
2346 array: htt_stats_buf->ul_mumimo_grp_tputs,
2347 ATH12K_HTT_STATS_MUMIMO_TPUT_NUM_BINS, footer: "\n\n");
2348
2349 stats_req->buf_len = len;
2350}
2351
2352static void
2353ath12k_htt_print_tx_pdev_mu_mimo_mpdu_stats_tlv(const void *tag_buf, u16 tag_len,
2354 struct debug_htt_stats_req *stats_req)
2355{
2356 const struct ath12k_htt_tx_pdev_mpdu_stats_tlv *htt_stats_buf = tag_buf;
2357 u8 *buf = stats_req->buf;
2358 u32 len = stats_req->buf_len;
2359 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
2360 u32 user_index;
2361 u32 tx_sched_mode;
2362
2363 if (tag_len < sizeof(*htt_stats_buf))
2364 return;
2365
2366 user_index = __le32_to_cpu(htt_stats_buf->user_index);
2367 tx_sched_mode = __le32_to_cpu(htt_stats_buf->tx_sched_mode);
2368
2369 if (tx_sched_mode == ATH12K_HTT_STATS_TX_SCHED_MODE_MU_MIMO_AC) {
2370 if (!user_index)
2371 len += scnprintf(buf: buf + len, size: buf_len - len,
2372 fmt: "HTT_TX_PDEV_MU_MIMO_AC_MPDU_STATS:\n");
2373
2374 if (user_index < ATH12K_HTT_TX_NUM_AC_MUMIMO_USER_STATS) {
2375 len += scnprintf(buf: buf + len, size: buf_len - len,
2376 fmt: "ac_mu_mimo_mpdus_queued_usr_%u = %u\n",
2377 user_index,
2378 le32_to_cpu(htt_stats_buf->mpdus_queued_usr));
2379 len += scnprintf(buf: buf + len, size: buf_len - len,
2380 fmt: "ac_mu_mimo_mpdus_tried_usr_%u = %u\n",
2381 user_index,
2382 le32_to_cpu(htt_stats_buf->mpdus_tried_usr));
2383 len += scnprintf(buf: buf + len, size: buf_len - len,
2384 fmt: "ac_mu_mimo_mpdus_failed_usr_%u = %u\n",
2385 user_index,
2386 le32_to_cpu(htt_stats_buf->mpdus_failed_usr));
2387 len += scnprintf(buf: buf + len, size: buf_len - len,
2388 fmt: "ac_mu_mimo_mpdus_requeued_usr_%u = %u\n",
2389 user_index,
2390 le32_to_cpu(htt_stats_buf->mpdus_requeued_usr));
2391 len += scnprintf(buf: buf + len, size: buf_len - len,
2392 fmt: "ac_mu_mimo_err_no_ba_usr_%u = %u\n",
2393 user_index,
2394 le32_to_cpu(htt_stats_buf->err_no_ba_usr));
2395 len += scnprintf(buf: buf + len, size: buf_len - len,
2396 fmt: "ac_mu_mimo_mpdu_underrun_usr_%u = %u\n",
2397 user_index,
2398 le32_to_cpu(htt_stats_buf->mpdu_underrun_usr));
2399 len += scnprintf(buf: buf + len, size: buf_len - len,
2400 fmt: "ac_mu_mimo_ampdu_underrun_usr_%u = %u\n\n",
2401 user_index,
2402 le32_to_cpu(htt_stats_buf->ampdu_underrun_usr));
2403 }
2404 }
2405
2406 if (tx_sched_mode == ATH12K_HTT_STATS_TX_SCHED_MODE_MU_MIMO_AX) {
2407 if (!user_index)
2408 len += scnprintf(buf: buf + len, size: buf_len - len,
2409 fmt: "HTT_TX_PDEV_MU_MIMO_AX_MPDU_STATS:\n");
2410
2411 if (user_index < ATH12K_HTT_TX_NUM_AX_MUMIMO_USER_STATS) {
2412 len += scnprintf(buf: buf + len, size: buf_len - len,
2413 fmt: "ax_mu_mimo_mpdus_queued_usr_%u = %u\n",
2414 user_index,
2415 le32_to_cpu(htt_stats_buf->mpdus_queued_usr));
2416 len += scnprintf(buf: buf + len, size: buf_len - len,
2417 fmt: "ax_mu_mimo_mpdus_tried_usr_%u = %u\n",
2418 user_index,
2419 le32_to_cpu(htt_stats_buf->mpdus_tried_usr));
2420 len += scnprintf(buf: buf + len, size: buf_len - len,
2421 fmt: "ax_mu_mimo_mpdus_failed_usr_%u = %u\n",
2422 user_index,
2423 le32_to_cpu(htt_stats_buf->mpdus_failed_usr));
2424 len += scnprintf(buf: buf + len, size: buf_len - len,
2425 fmt: "ax_mu_mimo_mpdus_requeued_usr_%u = %u\n",
2426 user_index,
2427 le32_to_cpu(htt_stats_buf->mpdus_requeued_usr));
2428 len += scnprintf(buf: buf + len, size: buf_len - len,
2429 fmt: "ax_mu_mimo_err_no_ba_usr_%u = %u\n",
2430 user_index,
2431 le32_to_cpu(htt_stats_buf->err_no_ba_usr));
2432 len += scnprintf(buf: buf + len, size: buf_len - len,
2433 fmt: "ax_mu_mimo_mpdu_underrun_usr_%u = %u\n",
2434 user_index,
2435 le32_to_cpu(htt_stats_buf->mpdu_underrun_usr));
2436 len += scnprintf(buf: buf + len, size: buf_len - len,
2437 fmt: "ax_mu_mimo_ampdu_underrun_usr_%u = %u\n\n",
2438 user_index,
2439 le32_to_cpu(htt_stats_buf->ampdu_underrun_usr));
2440 }
2441 }
2442
2443 if (tx_sched_mode == ATH12K_HTT_STATS_TX_SCHED_MODE_MU_OFDMA_AX) {
2444 if (!user_index)
2445 len += scnprintf(buf: buf + len, size: buf_len - len,
2446 fmt: "HTT_TX_PDEV_AX_MU_OFDMA_MPDU_STATS:\n");
2447
2448 if (user_index < ATH12K_HTT_TX_NUM_OFDMA_USER_STATS) {
2449 len += scnprintf(buf: buf + len, size: buf_len - len,
2450 fmt: "ax_mu_ofdma_mpdus_queued_usr_%u = %u\n",
2451 user_index,
2452 le32_to_cpu(htt_stats_buf->mpdus_queued_usr));
2453 len += scnprintf(buf: buf + len, size: buf_len - len,
2454 fmt: "ax_mu_ofdma_mpdus_tried_usr_%u = %u\n",
2455 user_index,
2456 le32_to_cpu(htt_stats_buf->mpdus_tried_usr));
2457 len += scnprintf(buf: buf + len, size: buf_len - len,
2458 fmt: "ax_mu_ofdma_mpdus_failed_usr_%u = %u\n",
2459 user_index,
2460 le32_to_cpu(htt_stats_buf->mpdus_failed_usr));
2461 len += scnprintf(buf: buf + len, size: buf_len - len,
2462 fmt: "ax_mu_ofdma_mpdus_requeued_usr_%u = %u\n",
2463 user_index,
2464 le32_to_cpu(htt_stats_buf->mpdus_requeued_usr));
2465 len += scnprintf(buf: buf + len, size: buf_len - len,
2466 fmt: "ax_mu_ofdma_err_no_ba_usr_%u = %u\n",
2467 user_index,
2468 le32_to_cpu(htt_stats_buf->err_no_ba_usr));
2469 len += scnprintf(buf: buf + len, size: buf_len - len,
2470 fmt: "ax_mu_ofdma_mpdu_underrun_usr_%u = %u\n",
2471 user_index,
2472 le32_to_cpu(htt_stats_buf->mpdu_underrun_usr));
2473 len += scnprintf(buf: buf + len, size: buf_len - len,
2474 fmt: "ax_mu_ofdma_ampdu_underrun_usr_%u = %u\n\n",
2475 user_index,
2476 le32_to_cpu(htt_stats_buf->ampdu_underrun_usr));
2477 }
2478 }
2479
2480 stats_req->buf_len = len;
2481}
2482
2483static void
2484ath12k_htt_print_pdev_cca_stats_hist_tlv(const void *tag_buf, u16 tag_len,
2485 struct debug_htt_stats_req *stats_req)
2486{
2487 const struct ath12k_htt_pdev_cca_stats_hist_v1_tlv *htt_stats_buf = tag_buf;
2488 u8 *buf = stats_req->buf;
2489 u32 len = stats_req->buf_len;
2490 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
2491
2492 if (tag_len < sizeof(*htt_stats_buf))
2493 return;
2494
2495 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_PDEV_CCA_STATS_HIST_TLV :\n");
2496 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "chan_num = %u\n",
2497 le32_to_cpu(htt_stats_buf->chan_num));
2498 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_records = %u\n",
2499 le32_to_cpu(htt_stats_buf->num_records));
2500 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "valid_cca_counters_bitmap = 0x%x\n",
2501 le32_to_cpu(htt_stats_buf->valid_cca_counters_bitmap));
2502 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "collection_interval = %u\n\n",
2503 le32_to_cpu(htt_stats_buf->collection_interval));
2504
2505 stats_req->buf_len = len;
2506}
2507
2508static void
2509ath12k_htt_print_pdev_stats_cca_counters_tlv(const void *tag_buf, u16 tag_len,
2510 struct debug_htt_stats_req *stats_req)
2511{
2512 const struct ath12k_htt_pdev_stats_cca_counters_tlv *htt_stats_buf = tag_buf;
2513 u8 *buf = stats_req->buf;
2514 u32 len = stats_req->buf_len;
2515 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
2516
2517 if (tag_len < sizeof(*htt_stats_buf))
2518 return;
2519
2520 len += scnprintf(buf: buf + len, size: buf_len - len,
2521 fmt: "HTT_PDEV_STATS_CCA_COUNTERS_TLV:(in usec)\n");
2522 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_frame_usec = %u\n",
2523 le32_to_cpu(htt_stats_buf->tx_frame_usec));
2524 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_frame_usec = %u\n",
2525 le32_to_cpu(htt_stats_buf->rx_frame_usec));
2526 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_clear_usec = %u\n",
2527 le32_to_cpu(htt_stats_buf->rx_clear_usec));
2528 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "my_rx_frame_usec = %u\n",
2529 le32_to_cpu(htt_stats_buf->my_rx_frame_usec));
2530 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "usec_cnt = %u\n",
2531 le32_to_cpu(htt_stats_buf->usec_cnt));
2532 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "med_rx_idle_usec = %u\n",
2533 le32_to_cpu(htt_stats_buf->med_rx_idle_usec));
2534 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "med_tx_idle_global_usec = %u\n",
2535 le32_to_cpu(htt_stats_buf->med_tx_idle_global_usec));
2536 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cca_obss_usec = %u\n\n",
2537 le32_to_cpu(htt_stats_buf->cca_obss_usec));
2538
2539 stats_req->buf_len = len;
2540}
2541
2542static void
2543ath12k_htt_print_tx_sounding_stats_tlv(const void *tag_buf, u16 tag_len,
2544 struct debug_htt_stats_req *stats_req)
2545{
2546 const struct ath12k_htt_tx_sounding_stats_tlv *htt_stats_buf = tag_buf;
2547 const __le32 *cbf_20, *cbf_40, *cbf_80, *cbf_160, *cbf_320;
2548 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
2549 u32 len = stats_req->buf_len;
2550 u8 *buf = stats_req->buf;
2551 u32 tx_sounding_mode;
2552 u8 i, u;
2553
2554 if (tag_len < sizeof(*htt_stats_buf))
2555 return;
2556
2557 cbf_20 = htt_stats_buf->cbf_20;
2558 cbf_40 = htt_stats_buf->cbf_40;
2559 cbf_80 = htt_stats_buf->cbf_80;
2560 cbf_160 = htt_stats_buf->cbf_160;
2561 cbf_320 = htt_stats_buf->cbf_320;
2562 tx_sounding_mode = le32_to_cpu(htt_stats_buf->tx_sounding_mode);
2563
2564 if (tx_sounding_mode == ATH12K_HTT_TX_AC_SOUNDING_MODE) {
2565 len += scnprintf(buf: buf + len, size: buf_len - len,
2566 fmt: "HTT_TX_AC_SOUNDING_STATS_TLV:\n");
2567 len += scnprintf(buf: buf + len, size: buf_len - len,
2568 fmt: "ac_cbf_20 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",
2569 le32_to_cpu(cbf_20[ATH12K_HTT_IMPL_STEER_STATS]),
2570 le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),
2571 le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));
2572 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "MU_SIFS: %u, MU_RBO: %u\n",
2573 le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),
2574 le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));
2575 len += scnprintf(buf: buf + len, size: buf_len - len,
2576 fmt: "ac_cbf_40 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",
2577 le32_to_cpu(cbf_40[ATH12K_HTT_IMPL_STEER_STATS]),
2578 le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),
2579 le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));
2580 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "MU_SIFS: %u, MU_RBO: %u\n",
2581 le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),
2582 le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));
2583 len += scnprintf(buf: buf + len, size: buf_len - len,
2584 fmt: "ac_cbf_80 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",
2585 le32_to_cpu(cbf_80[ATH12K_HTT_IMPL_STEER_STATS]),
2586 le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),
2587 le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));
2588 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "MU_SIFS: %u, MU_RBO: %u\n",
2589 le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),
2590 le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));
2591 len += scnprintf(buf: buf + len, size: buf_len - len,
2592 fmt: "ac_cbf_160 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",
2593 le32_to_cpu(cbf_160[ATH12K_HTT_IMPL_STEER_STATS]),
2594 le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),
2595 le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));
2596 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "MU_SIFS: %u, MU_RBO: %u\n",
2597 le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),
2598 le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));
2599
2600 for (u = 0, i = 0; u < ATH12K_HTT_TX_NUM_AC_MUMIMO_USER_STATS; u++) {
2601 len += scnprintf(buf: buf + len, size: buf_len - len,
2602 fmt: "Sounding User_%u = 20MHz: %u, ", u,
2603 le32_to_cpu(htt_stats_buf->sounding[i++]));
2604 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "40MHz: %u, ",
2605 le32_to_cpu(htt_stats_buf->sounding[i++]));
2606 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "80MHz: %u, ",
2607 le32_to_cpu(htt_stats_buf->sounding[i++]));
2608 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "160MHz: %u\n",
2609 le32_to_cpu(htt_stats_buf->sounding[i++]));
2610 }
2611 } else if (tx_sounding_mode == ATH12K_HTT_TX_AX_SOUNDING_MODE) {
2612 len += scnprintf(buf: buf + len, size: buf_len - len,
2613 fmt: "\nHTT_TX_AX_SOUNDING_STATS_TLV:\n");
2614 len += scnprintf(buf: buf + len, size: buf_len - len,
2615 fmt: "ax_cbf_20 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",
2616 le32_to_cpu(cbf_20[ATH12K_HTT_IMPL_STEER_STATS]),
2617 le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),
2618 le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));
2619 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "MU_SIFS: %u, MU_RBO: %u\n",
2620 le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),
2621 le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));
2622 len += scnprintf(buf: buf + len, size: buf_len - len,
2623 fmt: "ax_cbf_40 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",
2624 le32_to_cpu(cbf_40[ATH12K_HTT_IMPL_STEER_STATS]),
2625 le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),
2626 le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));
2627 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "MU_SIFS: %u, MU_RBO: %u\n",
2628 le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),
2629 le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));
2630 len += scnprintf(buf: buf + len, size: buf_len - len,
2631 fmt: "ax_cbf_80 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",
2632 le32_to_cpu(cbf_80[ATH12K_HTT_IMPL_STEER_STATS]),
2633 le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),
2634 le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));
2635 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "MU_SIFS: %u, MU_RBO: %u\n",
2636 le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),
2637 le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));
2638 len += scnprintf(buf: buf + len, size: buf_len - len,
2639 fmt: "ax_cbf_160 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",
2640 le32_to_cpu(cbf_160[ATH12K_HTT_IMPL_STEER_STATS]),
2641 le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),
2642 le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));
2643 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "MU_SIFS: %u, MU_RBO: %u\n",
2644 le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),
2645 le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));
2646
2647 for (u = 0, i = 0; u < ATH12K_HTT_TX_NUM_AX_MUMIMO_USER_STATS; u++) {
2648 len += scnprintf(buf: buf + len, size: buf_len - len,
2649 fmt: "Sounding User_%u = 20MHz: %u, ", u,
2650 le32_to_cpu(htt_stats_buf->sounding[i++]));
2651 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "40MHz: %u, ",
2652 le32_to_cpu(htt_stats_buf->sounding[i++]));
2653 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "80MHz: %u, ",
2654 le32_to_cpu(htt_stats_buf->sounding[i++]));
2655 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "160MHz: %u\n",
2656 le32_to_cpu(htt_stats_buf->sounding[i++]));
2657 }
2658 } else if (tx_sounding_mode == ATH12K_HTT_TX_BE_SOUNDING_MODE) {
2659 len += scnprintf(buf: buf + len, size: buf_len - len,
2660 fmt: "\nHTT_TX_BE_SOUNDING_STATS_TLV:\n");
2661 len += scnprintf(buf: buf + len, size: buf_len - len,
2662 fmt: "be_cbf_20 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",
2663 le32_to_cpu(cbf_20[ATH12K_HTT_IMPL_STEER_STATS]),
2664 le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),
2665 le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));
2666 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "MU_SIFS: %u, MU_RBO: %u\n",
2667 le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),
2668 le32_to_cpu(cbf_20[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));
2669 len += scnprintf(buf: buf + len, size: buf_len - len,
2670 fmt: "be_cbf_40 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",
2671 le32_to_cpu(cbf_40[ATH12K_HTT_IMPL_STEER_STATS]),
2672 le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),
2673 le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));
2674 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "MU_SIFS: %u, MU_RBO: %u\n",
2675 le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),
2676 le32_to_cpu(cbf_40[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));
2677 len += scnprintf(buf: buf + len, size: buf_len - len,
2678 fmt: "be_cbf_80 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",
2679 le32_to_cpu(cbf_80[ATH12K_HTT_IMPL_STEER_STATS]),
2680 le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),
2681 le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));
2682 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "MU_SIFS: %u, MU_RBO: %u\n",
2683 le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),
2684 le32_to_cpu(cbf_80[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));
2685 len += scnprintf(buf: buf + len, size: buf_len - len,
2686 fmt: "be_cbf_160 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",
2687 le32_to_cpu(cbf_160[ATH12K_HTT_IMPL_STEER_STATS]),
2688 le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),
2689 le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));
2690 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "MU_SIFS: %u, MU_RBO: %u\n",
2691 le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),
2692 le32_to_cpu(cbf_160[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));
2693 len += scnprintf(buf: buf + len, size: buf_len - len,
2694 fmt: "be_cbf_320 = IBF: %u, SU_SIFS: %u, SU_RBO: %u, ",
2695 le32_to_cpu(cbf_320[ATH12K_HTT_IMPL_STEER_STATS]),
2696 le32_to_cpu(cbf_320[ATH12K_HTT_EXPL_SUSIFS_STEER_STATS]),
2697 le32_to_cpu(cbf_320[ATH12K_HTT_EXPL_SURBO_STEER_STATS]));
2698 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "MU_SIFS: %u, MU_RBO: %u\n",
2699 le32_to_cpu(cbf_320[ATH12K_HTT_EXPL_MUSIFS_STEER_STATS]),
2700 le32_to_cpu(cbf_320[ATH12K_HTT_EXPL_MURBO_STEER_STATS]));
2701 for (u = 0, i = 0; u < ATH12K_HTT_TX_NUM_BE_MUMIMO_USER_STATS; u++) {
2702 len += scnprintf(buf: buf + len, size: buf_len - len,
2703 fmt: "Sounding User_%u = 20MHz: %u, ", u,
2704 le32_to_cpu(htt_stats_buf->sounding[i++]));
2705 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "40MHz: %u, ",
2706 le32_to_cpu(htt_stats_buf->sounding[i++]));
2707 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "80MHz: %u, ",
2708 le32_to_cpu(htt_stats_buf->sounding[i++]));
2709 len += scnprintf(buf: buf + len, size: buf_len - len,
2710 fmt: "160MHz: %u, 320MHz: %u\n",
2711 le32_to_cpu(htt_stats_buf->sounding[i++]),
2712 le32_to_cpu(htt_stats_buf->sounding_320[u]));
2713 }
2714 } else if (tx_sounding_mode == ATH12K_HTT_TX_CMN_SOUNDING_MODE) {
2715 len += scnprintf(buf: buf + len, size: buf_len - len,
2716 fmt: "\nCV UPLOAD HANDLER STATS:\n");
2717 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_nc_mismatch_err = %u\n",
2718 le32_to_cpu(htt_stats_buf->cv_nc_mismatch_err));
2719 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_fcs_err = %u\n",
2720 le32_to_cpu(htt_stats_buf->cv_fcs_err));
2721 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_frag_idx_mismatch = %u\n",
2722 le32_to_cpu(htt_stats_buf->cv_frag_idx_mismatch));
2723 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_invalid_peer_id = %u\n",
2724 le32_to_cpu(htt_stats_buf->cv_invalid_peer_id));
2725 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_no_txbf_setup = %u\n",
2726 le32_to_cpu(htt_stats_buf->cv_no_txbf_setup));
2727 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_expiry_in_update = %u\n",
2728 le32_to_cpu(htt_stats_buf->cv_expiry_in_update));
2729 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_pkt_bw_exceed = %u\n",
2730 le32_to_cpu(htt_stats_buf->cv_pkt_bw_exceed));
2731 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_dma_not_done_err = %u\n",
2732 le32_to_cpu(htt_stats_buf->cv_dma_not_done_err));
2733 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_update_failed = %u\n",
2734 le32_to_cpu(htt_stats_buf->cv_update_failed));
2735 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_dma_timeout_error = %u\n",
2736 le32_to_cpu(htt_stats_buf->cv_dma_timeout_error));
2737 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_buf_ibf_uploads = %u\n",
2738 le32_to_cpu(htt_stats_buf->cv_buf_ibf_uploads));
2739 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_buf_ebf_uploads = %u\n",
2740 le32_to_cpu(htt_stats_buf->cv_buf_ebf_uploads));
2741 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_buf_received = %u\n",
2742 le32_to_cpu(htt_stats_buf->cv_buf_received));
2743 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_buf_fed_back = %u\n\n",
2744 le32_to_cpu(htt_stats_buf->cv_buf_fed_back));
2745
2746 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "CV QUERY STATS:\n");
2747 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_total_query = %u\n",
2748 le32_to_cpu(htt_stats_buf->cv_total_query));
2749 len += scnprintf(buf: buf + len, size: buf_len - len,
2750 fmt: "cv_total_pattern_query = %u\n",
2751 le32_to_cpu(htt_stats_buf->cv_total_pattern_query));
2752 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_total_bw_query = %u\n",
2753 le32_to_cpu(htt_stats_buf->cv_total_bw_query));
2754 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_invalid_bw_coding = %u\n",
2755 le32_to_cpu(htt_stats_buf->cv_invalid_bw_coding));
2756 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_forced_sounding = %u\n",
2757 le32_to_cpu(htt_stats_buf->cv_forced_sounding));
2758 len += scnprintf(buf: buf + len, size: buf_len - len,
2759 fmt: "cv_standalone_sounding = %u\n",
2760 le32_to_cpu(htt_stats_buf->cv_standalone_sounding));
2761 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_nc_mismatch = %u\n",
2762 le32_to_cpu(htt_stats_buf->cv_nc_mismatch));
2763 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_fb_type_mismatch = %u\n",
2764 le32_to_cpu(htt_stats_buf->cv_fb_type_mismatch));
2765 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_ofdma_bw_mismatch = %u\n",
2766 le32_to_cpu(htt_stats_buf->cv_ofdma_bw_mismatch));
2767 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_bw_mismatch = %u\n",
2768 le32_to_cpu(htt_stats_buf->cv_bw_mismatch));
2769 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_pattern_mismatch = %u\n",
2770 le32_to_cpu(htt_stats_buf->cv_pattern_mismatch));
2771 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_preamble_mismatch = %u\n",
2772 le32_to_cpu(htt_stats_buf->cv_preamble_mismatch));
2773 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_nr_mismatch = %u\n",
2774 le32_to_cpu(htt_stats_buf->cv_nr_mismatch));
2775 len += scnprintf(buf: buf + len, size: buf_len - len,
2776 fmt: "cv_in_use_cnt_exceeded = %u\n",
2777 le32_to_cpu(htt_stats_buf->cv_in_use_cnt_exceeded));
2778 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_ntbr_sounding = %u\n",
2779 le32_to_cpu(htt_stats_buf->cv_ntbr_sounding));
2780 len += scnprintf(buf: buf + len, size: buf_len - len,
2781 fmt: "cv_found_upload_in_progress = %u\n",
2782 le32_to_cpu(htt_stats_buf->cv_found_upload_in_progress));
2783 len += scnprintf(buf: buf + len, size: buf_len - len,
2784 fmt: "cv_expired_during_query = %u\n",
2785 le32_to_cpu(htt_stats_buf->cv_expired_during_query));
2786 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_found = %u\n",
2787 le32_to_cpu(htt_stats_buf->cv_found));
2788 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_not_found = %u\n",
2789 le32_to_cpu(htt_stats_buf->cv_not_found));
2790 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_total_query_ibf = %u\n",
2791 le32_to_cpu(htt_stats_buf->cv_total_query_ibf));
2792 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_found_ibf = %u\n",
2793 le32_to_cpu(htt_stats_buf->cv_found_ibf));
2794 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cv_not_found_ibf = %u\n",
2795 le32_to_cpu(htt_stats_buf->cv_not_found_ibf));
2796 len += scnprintf(buf: buf + len, size: buf_len - len,
2797 fmt: "cv_expired_during_query_ibf = %u\n\n",
2798 le32_to_cpu(htt_stats_buf->cv_expired_during_query_ibf));
2799 }
2800
2801 stats_req->buf_len = len;
2802}
2803
2804static void
2805ath12k_htt_print_pdev_obss_pd_stats_tlv(const void *tag_buf, u16 tag_len,
2806 struct debug_htt_stats_req *stats_req)
2807{
2808 const struct ath12k_htt_pdev_obss_pd_stats_tlv *htt_stats_buf = tag_buf;
2809 u8 *buf = stats_req->buf;
2810 u32 len = stats_req->buf_len;
2811 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
2812 u8 i;
2813 static const char *access_cat_names[ATH12K_HTT_NUM_AC_WMM] = {"best effort",
2814 "background",
2815 "video", "voice"};
2816
2817 if (tag_len < sizeof(*htt_stats_buf))
2818 return;
2819
2820 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_PDEV_OBSS_PD_STATS_TLV:\n");
2821 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_spatial_reuse_tx = %u\n",
2822 le32_to_cpu(htt_stats_buf->num_sr_tx_transmissions));
2823 len += scnprintf(buf: buf + len, size: buf_len - len,
2824 fmt: "num_spatial_reuse_opportunities = %u\n",
2825 le32_to_cpu(htt_stats_buf->num_spatial_reuse_opportunities));
2826 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_non_srg_opportunities = %u\n",
2827 le32_to_cpu(htt_stats_buf->num_non_srg_opportunities));
2828 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_non_srg_ppdu_tried = %u\n",
2829 le32_to_cpu(htt_stats_buf->num_non_srg_ppdu_tried));
2830 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_non_srg_ppdu_success = %u\n",
2831 le32_to_cpu(htt_stats_buf->num_non_srg_ppdu_success));
2832 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_srg_opportunities = %u\n",
2833 le32_to_cpu(htt_stats_buf->num_srg_opportunities));
2834 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_srg_ppdu_tried = %u\n",
2835 le32_to_cpu(htt_stats_buf->num_srg_ppdu_tried));
2836 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_srg_ppdu_success = %u\n",
2837 le32_to_cpu(htt_stats_buf->num_srg_ppdu_success));
2838 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_psr_opportunities = %u\n",
2839 le32_to_cpu(htt_stats_buf->num_psr_opportunities));
2840 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_psr_ppdu_tried = %u\n",
2841 le32_to_cpu(htt_stats_buf->num_psr_ppdu_tried));
2842 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_psr_ppdu_success = %u\n",
2843 le32_to_cpu(htt_stats_buf->num_psr_ppdu_success));
2844 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "min_duration_check_flush_cnt = %u\n",
2845 le32_to_cpu(htt_stats_buf->num_obss_min_dur_check_flush_cnt));
2846 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "sr_ppdu_abort_flush_cnt = %u\n\n",
2847 le32_to_cpu(htt_stats_buf->num_sr_ppdu_abort_flush_cnt));
2848
2849 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_PDEV_OBSS_PD_PER_AC_STATS:\n");
2850 for (i = 0; i < ATH12K_HTT_NUM_AC_WMM; i++) {
2851 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "Access Category %u (%s)\n",
2852 i, access_cat_names[i]);
2853 len += scnprintf(buf: buf + len, size: buf_len - len,
2854 fmt: "num_non_srg_ppdu_tried = %u\n",
2855 le32_to_cpu(htt_stats_buf->num_non_srg_tried_per_ac[i]));
2856 len += scnprintf(buf: buf + len, size: buf_len - len,
2857 fmt: "num_non_srg_ppdu_success = %u\n",
2858 le32_to_cpu(htt_stats_buf->num_non_srg_success_ac[i]));
2859 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_srg_ppdu_tried = %u\n",
2860 le32_to_cpu(htt_stats_buf->num_srg_tried_per_ac[i]));
2861 len += scnprintf(buf: buf + len, size: buf_len - len,
2862 fmt: "num_srg_ppdu_success = %u\n\n",
2863 le32_to_cpu(htt_stats_buf->num_srg_success_per_ac[i]));
2864 }
2865
2866 stats_req->buf_len = len;
2867}
2868
2869static void
2870ath12k_htt_print_latency_prof_ctx_tlv(const void *tag_buf, u16 tag_len,
2871 struct debug_htt_stats_req *stats_req)
2872{
2873 const struct ath12k_htt_latency_prof_ctx_tlv *htt_stats_buf = tag_buf;
2874 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
2875 u32 len = stats_req->buf_len;
2876 u8 *buf = stats_req->buf;
2877
2878 if (tag_len < sizeof(*htt_stats_buf))
2879 return;
2880
2881 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_STATS_LATENCY_CTX_TLV:\n");
2882 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "duration = %u\n",
2883 le32_to_cpu(htt_stats_buf->duration));
2884 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_msdu_cnt = %u\n",
2885 le32_to_cpu(htt_stats_buf->tx_msdu_cnt));
2886 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_mpdu_cnt = %u\n",
2887 le32_to_cpu(htt_stats_buf->tx_mpdu_cnt));
2888 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_msdu_cnt = %u\n",
2889 le32_to_cpu(htt_stats_buf->rx_msdu_cnt));
2890 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_mpdu_cnt = %u\n\n",
2891 le32_to_cpu(htt_stats_buf->rx_mpdu_cnt));
2892
2893 stats_req->buf_len = len;
2894}
2895
2896static void
2897ath12k_htt_print_latency_prof_cnt(const void *tag_buf, u16 tag_len,
2898 struct debug_htt_stats_req *stats_req)
2899{
2900 const struct ath12k_htt_latency_prof_cnt_tlv *htt_stats_buf = tag_buf;
2901 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
2902 u32 len = stats_req->buf_len;
2903 u8 *buf = stats_req->buf;
2904
2905 if (tag_len < sizeof(*htt_stats_buf))
2906 return;
2907
2908 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_STATS_LATENCY_CNT_TLV:\n");
2909 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "prof_enable_cnt = %u\n\n",
2910 le32_to_cpu(htt_stats_buf->prof_enable_cnt));
2911
2912 stats_req->buf_len = len;
2913}
2914
2915static void
2916ath12k_htt_print_latency_prof_stats_tlv(const void *tag_buf, u16 tag_len,
2917 struct debug_htt_stats_req *stats_req)
2918{
2919 const struct ath12k_htt_latency_prof_stats_tlv *htt_stats_buf = tag_buf;
2920 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
2921 u32 len = stats_req->buf_len;
2922 u8 *buf = stats_req->buf;
2923
2924 if (tag_len < sizeof(*htt_stats_buf))
2925 return;
2926
2927 if (le32_to_cpu(htt_stats_buf->print_header) == 1) {
2928 len += scnprintf(buf: buf + len, size: buf_len - len,
2929 fmt: "HTT_STATS_LATENCY_PROF_TLV:\n");
2930 }
2931
2932 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "Latency name = %s\n",
2933 htt_stats_buf->latency_prof_name);
2934 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "count = %u\n",
2935 le32_to_cpu(htt_stats_buf->cnt));
2936 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "minimum = %u\n",
2937 le32_to_cpu(htt_stats_buf->min));
2938 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "maximum = %u\n",
2939 le32_to_cpu(htt_stats_buf->max));
2940 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "last = %u\n",
2941 le32_to_cpu(htt_stats_buf->last));
2942 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "total = %u\n",
2943 le32_to_cpu(htt_stats_buf->tot));
2944 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "average = %u\n",
2945 le32_to_cpu(htt_stats_buf->avg));
2946 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "histogram interval = %u\n",
2947 le32_to_cpu(htt_stats_buf->hist_intvl));
2948 len += print_array_to_buf(buf, offset: len, header: "histogram", array: htt_stats_buf->hist,
2949 ATH12K_HTT_LATENCY_PROFILE_NUM_MAX_HIST, footer: "\n\n");
2950
2951 stats_req->buf_len = len;
2952}
2953
2954static void
2955ath12k_htt_print_ul_ofdma_trigger_stats(const void *tag_buf, u16 tag_len,
2956 struct debug_htt_stats_req *stats_req)
2957{
2958 const struct ath12k_htt_rx_pdev_ul_trigger_stats_tlv *htt_stats_buf = tag_buf;
2959 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
2960 u32 len = stats_req->buf_len;
2961 u8 *buf = stats_req->buf;
2962 u32 mac_id;
2963 u8 j;
2964
2965 if (tag_len < sizeof(*htt_stats_buf))
2966 return;
2967
2968 mac_id = __le32_to_cpu(htt_stats_buf->mac_id__word);
2969
2970 len += scnprintf(buf: buf + len, size: buf_len - len,
2971 fmt: "HTT_RX_PDEV_UL_TRIGGER_STATS_TLV:\n");
2972 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mac_id = %u\n",
2973 u32_get_bits(v: mac_id, ATH12K_HTT_STATS_MAC_ID));
2974 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_11ax_ul_ofdma = %u\n",
2975 le32_to_cpu(htt_stats_buf->rx_11ax_ul_ofdma));
2976 len += print_array_to_buf(buf, offset: len, header: "ul_ofdma_rx_mcs",
2977 array: htt_stats_buf->ul_ofdma_rx_mcs,
2978 ATH12K_HTT_RX_NUM_MCS_CNTRS, footer: "\n");
2979 for (j = 0; j < ATH12K_HTT_RX_NUM_GI_CNTRS; j++) {
2980 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ul_ofdma_rx_gi[%u]", j);
2981 len += print_array_to_buf(buf, offset: len, header: "",
2982 array: htt_stats_buf->ul_ofdma_rx_gi[j],
2983 ATH12K_HTT_RX_NUM_MCS_CNTRS, footer: "\n");
2984 }
2985
2986 len += print_array_to_buf_index(buf, offset: len, header: "ul_ofdma_rx_nss", stats_index: 1,
2987 array: htt_stats_buf->ul_ofdma_rx_nss,
2988 ATH12K_HTT_RX_NUM_SPATIAL_STREAMS, footer: "\n");
2989 len += print_array_to_buf(buf, offset: len, header: "ul_ofdma_rx_bw",
2990 array: htt_stats_buf->ul_ofdma_rx_bw,
2991 ATH12K_HTT_RX_NUM_BW_CNTRS, footer: "\n");
2992
2993 for (j = 0; j < ATH12K_HTT_RX_NUM_REDUCED_CHAN_TYPES; j++) {
2994 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: j == 0 ?
2995 "half_ul_ofdma_rx_bw" :
2996 "quarter_ul_ofdma_rx_bw");
2997 len += print_array_to_buf(buf, offset: len, header: "", array: htt_stats_buf->red_bw[j],
2998 ATH12K_HTT_RX_NUM_BW_CNTRS, footer: "\n");
2999 }
3000 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ul_ofdma_rx_stbc = %u\n",
3001 le32_to_cpu(htt_stats_buf->ul_ofdma_rx_stbc));
3002 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ul_ofdma_rx_ldpc = %u\n",
3003 le32_to_cpu(htt_stats_buf->ul_ofdma_rx_ldpc));
3004
3005 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_ulofdma_data_ru_size_ppdu = ");
3006 for (j = 0; j < ATH12K_HTT_RX_NUM_RU_SIZE_CNTRS; j++)
3007 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %s:%u ",
3008 ath12k_htt_ax_tx_rx_ru_size_to_str(ru_size: j),
3009 le32_to_cpu(htt_stats_buf->data_ru_size_ppdu[j]));
3010 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
3011
3012 len += scnprintf(buf: buf + len, size: buf_len - len,
3013 fmt: "rx_ulofdma_non_data_ru_size_ppdu = ");
3014 for (j = 0; j < ATH12K_HTT_RX_NUM_RU_SIZE_CNTRS; j++)
3015 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %s:%u ",
3016 ath12k_htt_ax_tx_rx_ru_size_to_str(ru_size: j),
3017 le32_to_cpu(htt_stats_buf->non_data_ru_size_ppdu[j]));
3018 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
3019
3020 len += print_array_to_buf(buf, offset: len, header: "rx_rssi_track_sta_aid",
3021 array: htt_stats_buf->uplink_sta_aid,
3022 ATH12K_HTT_RX_UL_MAX_UPLINK_RSSI_TRACK, footer: "\n");
3023 len += print_array_to_buf(buf, offset: len, header: "rx_sta_target_rssi",
3024 array: htt_stats_buf->uplink_sta_target_rssi,
3025 ATH12K_HTT_RX_UL_MAX_UPLINK_RSSI_TRACK, footer: "\n");
3026 len += print_array_to_buf(buf, offset: len, header: "rx_sta_fd_rssi",
3027 array: htt_stats_buf->uplink_sta_fd_rssi,
3028 ATH12K_HTT_RX_UL_MAX_UPLINK_RSSI_TRACK, footer: "\n");
3029 len += print_array_to_buf(buf, offset: len, header: "rx_sta_power_headroom",
3030 array: htt_stats_buf->uplink_sta_power_headroom,
3031 ATH12K_HTT_RX_UL_MAX_UPLINK_RSSI_TRACK, footer: "\n");
3032 len += scnprintf(buf: buf + len, size: buf_len - len,
3033 fmt: "ul_ofdma_basic_trigger_rx_qos_null_only = %u\n\n",
3034 le32_to_cpu(htt_stats_buf->ul_ofdma_bsc_trig_rx_qos_null_only));
3035
3036 stats_req->buf_len = len;
3037}
3038
3039static void
3040ath12k_htt_print_ul_ofdma_user_stats(const void *tag_buf, u16 tag_len,
3041 struct debug_htt_stats_req *stats_req)
3042{
3043 const struct ath12k_htt_rx_pdev_ul_ofdma_user_stats_tlv *htt_stats_buf = tag_buf;
3044 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
3045 u32 len = stats_req->buf_len;
3046 u8 *buf = stats_req->buf;
3047 u32 user_index;
3048
3049 if (tag_len < sizeof(*htt_stats_buf))
3050 return;
3051
3052 user_index = __le32_to_cpu(htt_stats_buf->user_index);
3053
3054 if (!user_index)
3055 len += scnprintf(buf: buf + len, size: buf_len - len,
3056 fmt: "HTT_RX_PDEV_UL_OFDMA_USER_STAS_TLV:\n");
3057 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_ulofdma_non_data_ppdu_%u = %u\n",
3058 user_index,
3059 le32_to_cpu(htt_stats_buf->rx_ulofdma_non_data_ppdu));
3060 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_ulofdma_data_ppdu_%u = %u\n",
3061 user_index,
3062 le32_to_cpu(htt_stats_buf->rx_ulofdma_data_ppdu));
3063 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_ulofdma_mpdu_ok_%u = %u\n",
3064 user_index,
3065 le32_to_cpu(htt_stats_buf->rx_ulofdma_mpdu_ok));
3066 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_ulofdma_mpdu_fail_%u = %u\n",
3067 user_index,
3068 le32_to_cpu(htt_stats_buf->rx_ulofdma_mpdu_fail));
3069 len += scnprintf(buf: buf + len, size: buf_len - len,
3070 fmt: "rx_ulofdma_non_data_nusers_%u = %u\n", user_index,
3071 le32_to_cpu(htt_stats_buf->rx_ulofdma_non_data_nusers));
3072 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_ulofdma_data_nusers_%u = %u\n\n",
3073 user_index,
3074 le32_to_cpu(htt_stats_buf->rx_ulofdma_data_nusers));
3075
3076 stats_req->buf_len = len;
3077}
3078
3079static void
3080ath12k_htt_print_ul_mumimo_trig_stats(const void *tag_buf, u16 tag_len,
3081 struct debug_htt_stats_req *stats_req)
3082{
3083 const struct ath12k_htt_rx_ul_mumimo_trig_stats_tlv *htt_stats_buf = tag_buf;
3084 char str_buf[ATH12K_HTT_MAX_STRING_LEN] = {};
3085 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
3086 u32 len = stats_req->buf_len;
3087 u8 *buf = stats_req->buf;
3088 u32 mac_id;
3089 u16 index;
3090 u8 i, j;
3091
3092 if (tag_len < sizeof(*htt_stats_buf))
3093 return;
3094
3095 mac_id = __le32_to_cpu(htt_stats_buf->mac_id__word);
3096
3097 len += scnprintf(buf: buf + len, size: buf_len - len,
3098 fmt: "HTT_RX_PDEV_UL_MUMIMO_TRIG_STATS_TLV:\n");
3099 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mac_id = %u\n",
3100 u32_get_bits(v: mac_id, ATH12K_HTT_STATS_MAC_ID));
3101 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_11ax_ul_mumimo = %u\n",
3102 le32_to_cpu(htt_stats_buf->rx_11ax_ul_mumimo));
3103 index = 0;
3104 memset(str_buf, 0x0, ATH12K_HTT_MAX_STRING_LEN);
3105 for (i = 0; i < ATH12K_HTT_RX_NUM_MCS_CNTRS; i++)
3106 index += scnprintf(buf: &str_buf[index], ATH12K_HTT_MAX_STRING_LEN - index,
3107 fmt: " %u:%u,", i,
3108 le32_to_cpu(htt_stats_buf->ul_mumimo_rx_mcs[i]));
3109
3110 for (i = 0; i < ATH12K_HTT_RX_NUM_EXTRA_MCS_CNTRS; i++)
3111 index += scnprintf(buf: &str_buf[index], ATH12K_HTT_MAX_STRING_LEN - index,
3112 fmt: " %u:%u,", i + ATH12K_HTT_RX_NUM_MCS_CNTRS,
3113 le32_to_cpu(htt_stats_buf->ul_mumimo_rx_mcs_ext[i]));
3114 str_buf[--index] = '\0';
3115 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ul_mumimo_rx_mcs = %s\n", str_buf);
3116
3117 for (j = 0; j < ATH12K_HTT_RX_NUM_GI_CNTRS; j++) {
3118 index = 0;
3119 memset(&str_buf[index], 0x0, ATH12K_HTT_MAX_STRING_LEN);
3120 for (i = 0; i < ATH12K_HTT_RX_NUM_MCS_CNTRS; i++)
3121 index += scnprintf(buf: &str_buf[index],
3122 ATH12K_HTT_MAX_STRING_LEN - index,
3123 fmt: " %u:%u,", i,
3124 le32_to_cpu(htt_stats_buf->ul_rx_gi[j][i]));
3125
3126 for (i = 0; i < ATH12K_HTT_RX_NUM_EXTRA_MCS_CNTRS; i++)
3127 index += scnprintf(buf: &str_buf[index],
3128 ATH12K_HTT_MAX_STRING_LEN - index,
3129 fmt: " %u:%u,", i + ATH12K_HTT_RX_NUM_MCS_CNTRS,
3130 le32_to_cpu(htt_stats_buf->ul_gi_ext[j][i]));
3131 str_buf[--index] = '\0';
3132 len += scnprintf(buf: buf + len, size: buf_len - len,
3133 fmt: "ul_mumimo_rx_gi_%u = %s\n", j, str_buf);
3134 }
3135
3136 index = 0;
3137 memset(str_buf, 0x0, ATH12K_HTT_MAX_STRING_LEN);
3138 len += print_array_to_buf_index(buf, offset: len, header: "ul_mumimo_rx_nss", stats_index: 1,
3139 array: htt_stats_buf->ul_mumimo_rx_nss,
3140 ATH12K_HTT_RX_NUM_SPATIAL_STREAMS, footer: "\n");
3141
3142 len += print_array_to_buf(buf, offset: len, header: "ul_mumimo_rx_bw",
3143 array: htt_stats_buf->ul_mumimo_rx_bw,
3144 ATH12K_HTT_RX_NUM_BW_CNTRS, footer: "\n");
3145 for (i = 0; i < ATH12K_HTT_RX_NUM_REDUCED_CHAN_TYPES; i++) {
3146 index = 0;
3147 memset(str_buf, 0x0, ATH12K_HTT_MAX_STRING_LEN);
3148 for (j = 0; j < ATH12K_HTT_RX_NUM_BW_CNTRS; j++)
3149 index += scnprintf(buf: &str_buf[index],
3150 ATH12K_HTT_MAX_STRING_LEN - index,
3151 fmt: " %u:%u,", j,
3152 le32_to_cpu(htt_stats_buf->red_bw[i][j]));
3153 str_buf[--index] = '\0';
3154 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "%s = %s\n",
3155 i == 0 ? "half_ul_mumimo_rx_bw" :
3156 "quarter_ul_mumimo_rx_bw", str_buf);
3157 }
3158
3159 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ul_mumimo_rx_stbc = %u\n",
3160 le32_to_cpu(htt_stats_buf->ul_mumimo_rx_stbc));
3161 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ul_mumimo_rx_ldpc = %u\n",
3162 le32_to_cpu(htt_stats_buf->ul_mumimo_rx_ldpc));
3163
3164 for (j = 0; j < ATH12K_HTT_RX_NUM_SPATIAL_STREAMS; j++) {
3165 len += scnprintf(buf: buf + len, size: buf_len - len,
3166 fmt: "rx_ul_mumimo_rssi_in_dbm: chain%u ", j);
3167 len += print_array_to_buf_s8(buf, offset: len, header: "", stats_index: 0,
3168 array: htt_stats_buf->ul_rssi[j],
3169 ATH12K_HTT_RX_NUM_BW_CNTRS, footer: "\n");
3170 }
3171
3172 for (j = 0; j < ATH12K_HTT_TX_UL_MUMIMO_USER_STATS; j++) {
3173 len += scnprintf(buf: buf + len, size: buf_len - len,
3174 fmt: "rx_ul_mumimo_target_rssi: user_%u ", j);
3175 len += print_array_to_buf_s8(buf, offset: len, header: "", stats_index: 0,
3176 array: htt_stats_buf->tgt_rssi[j],
3177 ATH12K_HTT_RX_NUM_BW_CNTRS, footer: "\n");
3178 }
3179
3180 for (j = 0; j < ATH12K_HTT_TX_UL_MUMIMO_USER_STATS; j++) {
3181 len += scnprintf(buf: buf + len, size: buf_len - len,
3182 fmt: "rx_ul_mumimo_fd_rssi: user_%u ", j);
3183 len += print_array_to_buf_s8(buf, offset: len, header: "", stats_index: 0,
3184 array: htt_stats_buf->fd[j],
3185 ATH12K_HTT_RX_NUM_SPATIAL_STREAMS, footer: "\n");
3186 }
3187
3188 for (j = 0; j < ATH12K_HTT_TX_UL_MUMIMO_USER_STATS; j++) {
3189 len += scnprintf(buf: buf + len, size: buf_len - len,
3190 fmt: "rx_ulmumimo_pilot_evm_db_mean: user_%u ", j);
3191 len += print_array_to_buf_s8(buf, offset: len, header: "", stats_index: 0,
3192 array: htt_stats_buf->db[j],
3193 ATH12K_HTT_RX_NUM_SPATIAL_STREAMS, footer: "\n");
3194 }
3195
3196 len += scnprintf(buf: buf + len, size: buf_len - len,
3197 fmt: "ul_mumimo_basic_trigger_rx_qos_null_only = %u\n\n",
3198 le32_to_cpu(htt_stats_buf->mumimo_bsc_trig_rx_qos_null_only));
3199
3200 stats_req->buf_len = len;
3201}
3202
3203static void
3204ath12k_htt_print_rx_fse_stats_tlv(const void *tag_buf, u16 tag_len,
3205 struct debug_htt_stats_req *stats_req)
3206{
3207 const struct ath12k_htt_rx_fse_stats_tlv *htt_stats_buf = tag_buf;
3208 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
3209 u32 len = stats_req->buf_len;
3210 u8 *buf = stats_req->buf;
3211
3212 if (tag_len < sizeof(*htt_stats_buf))
3213 return;
3214
3215 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_STATS_RX_FSE_STATS_TLV:\n");
3216 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "=== Software RX FSE STATS ===\n");
3217 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "Enable count = %u\n",
3218 le32_to_cpu(htt_stats_buf->fse_enable_cnt));
3219 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "Disable count = %u\n",
3220 le32_to_cpu(htt_stats_buf->fse_disable_cnt));
3221 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "Cache invalidate entry count = %u\n",
3222 le32_to_cpu(htt_stats_buf->fse_cache_invalidate_entry_cnt));
3223 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "Full cache invalidate count = %u\n",
3224 le32_to_cpu(htt_stats_buf->fse_full_cache_invalidate_cnt));
3225
3226 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n=== Hardware RX FSE STATS ===\n");
3227 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "Cache hits count = %u\n",
3228 le32_to_cpu(htt_stats_buf->fse_num_cache_hits_cnt));
3229 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "Cache no. of searches = %u\n",
3230 le32_to_cpu(htt_stats_buf->fse_num_searches_cnt));
3231 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "Cache occupancy peak count:\n");
3232 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "[0] = %u [1-16] = %u [17-32] = %u ",
3233 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[0]),
3234 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[1]),
3235 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[2]));
3236 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "[33-48] = %u [49-64] = %u ",
3237 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[3]),
3238 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[4]));
3239 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "[65-80] = %u [81-96] = %u ",
3240 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[5]),
3241 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[6]));
3242 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "[97-112] = %u [113-127] = %u ",
3243 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[7]),
3244 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[8]));
3245 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "[128] = %u\n",
3246 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_peak_cnt[9]));
3247 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "Cache occupancy current count:\n");
3248 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "[0] = %u [1-16] = %u [17-32] = %u ",
3249 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[0]),
3250 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[1]),
3251 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[2]));
3252 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "[33-48] = %u [49-64] = %u ",
3253 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[3]),
3254 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[4]));
3255 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "[65-80] = %u [81-96] = %u ",
3256 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[5]),
3257 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[6]));
3258 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "[97-112] = %u [113-127] = %u ",
3259 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[7]),
3260 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[8]));
3261 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "[128] = %u\n",
3262 le32_to_cpu(htt_stats_buf->fse_cache_occupancy_curr_cnt[9]));
3263 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "Cache search square count:\n");
3264 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "[0] = %u [1-50] = %u [51-100] = %u ",
3265 le32_to_cpu(htt_stats_buf->fse_search_stat_square_cnt[0]),
3266 le32_to_cpu(htt_stats_buf->fse_search_stat_square_cnt[1]),
3267 le32_to_cpu(htt_stats_buf->fse_search_stat_square_cnt[2]));
3268 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "[101-200] = %u [201-255] = %u ",
3269 le32_to_cpu(htt_stats_buf->fse_search_stat_square_cnt[3]),
3270 le32_to_cpu(htt_stats_buf->fse_search_stat_square_cnt[4]));
3271 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "[256] = %u\n",
3272 le32_to_cpu(htt_stats_buf->fse_search_stat_square_cnt[5]));
3273 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "Cache search peak pending count:\n");
3274 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "[0] = %u [1-2] = %u [3-4] = %u ",
3275 le32_to_cpu(htt_stats_buf->fse_search_stat_peak_cnt[0]),
3276 le32_to_cpu(htt_stats_buf->fse_search_stat_peak_cnt[1]),
3277 le32_to_cpu(htt_stats_buf->fse_search_stat_peak_cnt[2]));
3278 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "[Greater/Equal to 5] = %u\n",
3279 le32_to_cpu(htt_stats_buf->fse_search_stat_peak_cnt[3]));
3280 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "Cache search tot pending count:\n");
3281 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "[0] = %u [1-2] = %u [3-4] = %u ",
3282 le32_to_cpu(htt_stats_buf->fse_search_stat_pending_cnt[0]),
3283 le32_to_cpu(htt_stats_buf->fse_search_stat_pending_cnt[1]),
3284 le32_to_cpu(htt_stats_buf->fse_search_stat_pending_cnt[2]));
3285 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "[Greater/Equal to 5] = %u\n\n",
3286 le32_to_cpu(htt_stats_buf->fse_search_stat_pending_cnt[3]));
3287
3288 stats_req->buf_len = len;
3289}
3290
3291static void
3292ath12k_htt_print_pdev_tx_rate_txbf_stats_tlv(const void *tag_buf, u16 tag_len,
3293 struct debug_htt_stats_req *stats_req)
3294{
3295 const struct ath12k_htt_pdev_txrate_txbf_stats_tlv *htt_stats_buf = tag_buf;
3296 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
3297 u32 len = stats_req->buf_len;
3298 u8 *buf = stats_req->buf;
3299 u8 i;
3300
3301 if (tag_len < sizeof(*htt_stats_buf))
3302 return;
3303
3304 len += scnprintf(buf: buf + len, size: buf_len - len,
3305 fmt: "HTT_STATS_PDEV_TX_RATE_TXBF_STATS:\n");
3306 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "Legacy OFDM Rates: 6 Mbps: %u, ",
3307 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[0]));
3308 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "9 Mbps: %u, 12 Mbps: %u, ",
3309 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[1]),
3310 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[2]));
3311 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "18 Mbps: %u\n",
3312 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[3]));
3313 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "24 Mbps: %u, 36 Mbps: %u, ",
3314 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[4]),
3315 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[5]));
3316 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "48 Mbps: %u, 54 Mbps: %u\n",
3317 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[6]),
3318 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[7]));
3319
3320 len += print_array_to_buf(buf, offset: len, header: "tx_ol_mcs", array: htt_stats_buf->tx_su_ol_mcs,
3321 ATH12K_HTT_TX_BF_RATE_STATS_NUM_MCS_COUNTERS, footer: "\n");
3322 len += print_array_to_buf(buf, offset: len, header: "tx_ibf_mcs", array: htt_stats_buf->tx_su_ibf_mcs,
3323 ATH12K_HTT_TX_BF_RATE_STATS_NUM_MCS_COUNTERS, footer: "\n");
3324 len += print_array_to_buf(buf, offset: len, header: "tx_txbf_mcs", array: htt_stats_buf->tx_su_txbf_mcs,
3325 ATH12K_HTT_TX_BF_RATE_STATS_NUM_MCS_COUNTERS, footer: "\n");
3326 len += print_array_to_buf_index(buf, offset: len, header: "tx_ol_nss", stats_index: 1,
3327 array: htt_stats_buf->tx_su_ol_nss,
3328 ATH12K_HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS,
3329 footer: "\n");
3330 len += print_array_to_buf_index(buf, offset: len, header: "tx_ibf_nss", stats_index: 1,
3331 array: htt_stats_buf->tx_su_ibf_nss,
3332 ATH12K_HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS,
3333 footer: "\n");
3334 len += print_array_to_buf_index(buf, offset: len, header: "tx_txbf_nss", stats_index: 1,
3335 array: htt_stats_buf->tx_su_txbf_nss,
3336 ATH12K_HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS,
3337 footer: "\n");
3338 len += print_array_to_buf(buf, offset: len, header: "tx_ol_bw", array: htt_stats_buf->tx_su_ol_bw,
3339 ATH12K_HTT_TXBF_NUM_BW_CNTRS, footer: "\n");
3340 for (i = 0; i < ATH12K_HTT_TXBF_NUM_REDUCED_CHAN_TYPES; i++)
3341 len += print_array_to_buf(buf, offset: len, header: i ? "quarter_tx_ol_bw" :
3342 "half_tx_ol_bw",
3343 array: htt_stats_buf->ol[i],
3344 ATH12K_HTT_TXBF_NUM_BW_CNTRS,
3345 footer: "\n");
3346
3347 len += print_array_to_buf(buf, offset: len, header: "tx_ibf_bw", array: htt_stats_buf->tx_su_ibf_bw,
3348 ATH12K_HTT_TXBF_NUM_BW_CNTRS, footer: "\n");
3349 for (i = 0; i < ATH12K_HTT_TXBF_NUM_REDUCED_CHAN_TYPES; i++)
3350 len += print_array_to_buf(buf, offset: len, header: i ? "quarter_tx_ibf_bw" :
3351 "half_tx_ibf_bw",
3352 array: htt_stats_buf->ibf[i],
3353 ATH12K_HTT_TXBF_NUM_BW_CNTRS,
3354 footer: "\n");
3355
3356 len += print_array_to_buf(buf, offset: len, header: "tx_txbf_bw", array: htt_stats_buf->tx_su_txbf_bw,
3357 ATH12K_HTT_TXBF_NUM_BW_CNTRS, footer: "\n");
3358 for (i = 0; i < ATH12K_HTT_TXBF_NUM_REDUCED_CHAN_TYPES; i++)
3359 len += print_array_to_buf(buf, offset: len, header: i ? "quarter_tx_txbf_bw" :
3360 "half_tx_txbf_bw",
3361 array: htt_stats_buf->txbf[i],
3362 ATH12K_HTT_TXBF_NUM_BW_CNTRS,
3363 footer: "\n");
3364 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
3365
3366 len += scnprintf(buf: buf + len, size: buf_len - len,
3367 fmt: "HTT_STATS_PDEV_TXBF_FLAG_RETURN_STATS:\n");
3368 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "TXBF_reason_code_stats: 0:%u, 1:%u,",
3369 le32_to_cpu(htt_stats_buf->txbf_flag_set_mu_mode),
3370 le32_to_cpu(htt_stats_buf->txbf_flag_set_final_status));
3371 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " 2:%u, 3:%u, 4:%u, 5:%u, ",
3372 le32_to_cpu(htt_stats_buf->txbf_flag_not_set_verified_txbf_mode),
3373 le32_to_cpu(htt_stats_buf->txbf_flag_not_set_disable_p2p_access),
3374 le32_to_cpu(htt_stats_buf->txbf_flag_not_set_max_nss_in_he160),
3375 le32_to_cpu(htt_stats_buf->txbf_flag_not_set_disable_uldlofdma));
3376 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "6:%u, 7:%u\n\n",
3377 le32_to_cpu(htt_stats_buf->txbf_flag_not_set_mcs_threshold_val),
3378 le32_to_cpu(htt_stats_buf->txbf_flag_not_set_final_status));
3379
3380 stats_req->buf_len = len;
3381}
3382
3383static void
3384ath12k_htt_print_txbf_ofdma_ax_ndpa_stats_tlv(const void *tag_buf, u16 tag_len,
3385 struct debug_htt_stats_req *stats_req)
3386{
3387 const struct ath12k_htt_txbf_ofdma_ax_ndpa_stats_tlv *stats_buf = tag_buf;
3388 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
3389 u32 len = stats_req->buf_len;
3390 u8 *buf = stats_req->buf;
3391 u32 num_elements;
3392 u8 i;
3393
3394 if (tag_len < sizeof(*stats_buf))
3395 return;
3396
3397 num_elements = le32_to_cpu(stats_buf->num_elems_ax_ndpa_arr);
3398
3399 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_TXBF_OFDMA_AX_NDPA_STATS_TLV:\n");
3400 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ax_ofdma_ndpa_queued =");
3401 for (i = 0; i < num_elements; i++)
3402 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u,", i + 1,
3403 le32_to_cpu(stats_buf->ax_ndpa[i].ax_ofdma_ndpa_queued));
3404 len--;
3405 *(buf + len) = '\0';
3406
3407 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\nax_ofdma_ndpa_tried =");
3408 for (i = 0; i < num_elements; i++)
3409 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u,", i + 1,
3410 le32_to_cpu(stats_buf->ax_ndpa[i].ax_ofdma_ndpa_tried));
3411 len--;
3412 *(buf + len) = '\0';
3413
3414 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\nax_ofdma_ndpa_flushed =");
3415 for (i = 0; i < num_elements; i++)
3416 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u,", i + 1,
3417 le32_to_cpu(stats_buf->ax_ndpa[i].ax_ofdma_ndpa_flush));
3418 len--;
3419 *(buf + len) = '\0';
3420
3421 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\nax_ofdma_ndpa_err =");
3422 for (i = 0; i < num_elements; i++)
3423 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u,", i + 1,
3424 le32_to_cpu(stats_buf->ax_ndpa[i].ax_ofdma_ndpa_err));
3425 len--;
3426 *(buf + len) = '\0';
3427
3428 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n\n");
3429
3430 stats_req->buf_len = len;
3431}
3432
3433static void
3434ath12k_htt_print_txbf_ofdma_ax_ndp_stats_tlv(const void *tag_buf, u16 tag_len,
3435 struct debug_htt_stats_req *stats_req)
3436{
3437 const struct ath12k_htt_txbf_ofdma_ax_ndp_stats_tlv *stats_buf = tag_buf;
3438 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
3439 u32 len = stats_req->buf_len;
3440 u8 *buf = stats_req->buf;
3441 u32 num_elements;
3442 u8 i;
3443
3444 if (tag_len < sizeof(*stats_buf))
3445 return;
3446
3447 num_elements = le32_to_cpu(stats_buf->num_elems_ax_ndp_arr);
3448
3449 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_TXBF_OFDMA_AX_NDP_STATS_TLV:\n");
3450 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ax_ofdma_ndp_queued =");
3451 for (i = 0; i < num_elements; i++)
3452 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u,", i + 1,
3453 le32_to_cpu(stats_buf->ax_ndp[i].ax_ofdma_ndp_queued));
3454 len--;
3455 *(buf + len) = '\0';
3456
3457 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\nax_ofdma_ndp_tried =");
3458 for (i = 0; i < num_elements; i++)
3459 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u,", i + 1,
3460 le32_to_cpu(stats_buf->ax_ndp[i].ax_ofdma_ndp_tried));
3461 len--;
3462 *(buf + len) = '\0';
3463
3464 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\nax_ofdma_ndp_flushed =");
3465 for (i = 0; i < num_elements; i++)
3466 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u,", i + 1,
3467 le32_to_cpu(stats_buf->ax_ndp[i].ax_ofdma_ndp_flush));
3468 len--;
3469 *(buf + len) = '\0';
3470
3471 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\nax_ofdma_ndp_err =");
3472 for (i = 0; i < num_elements; i++)
3473 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u,", i + 1,
3474 le32_to_cpu(stats_buf->ax_ndp[i].ax_ofdma_ndp_err));
3475 len--;
3476 *(buf + len) = '\0';
3477
3478 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n\n");
3479
3480 stats_req->buf_len = len;
3481}
3482
3483static void
3484ath12k_htt_print_txbf_ofdma_ax_brp_stats_tlv(const void *tag_buf, u16 tag_len,
3485 struct debug_htt_stats_req *stats_req)
3486{
3487 const struct ath12k_htt_txbf_ofdma_ax_brp_stats_tlv *stats_buf = tag_buf;
3488 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
3489 u32 len = stats_req->buf_len;
3490 u8 *buf = stats_req->buf;
3491 u32 num_elements;
3492 u8 i;
3493
3494 if (tag_len < sizeof(*stats_buf))
3495 return;
3496
3497 num_elements = le32_to_cpu(stats_buf->num_elems_ax_brp_arr);
3498
3499 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_TXBF_OFDMA_AX_BRP_STATS_TLV:\n");
3500 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ax_ofdma_brpoll_queued =");
3501 for (i = 0; i < num_elements; i++)
3502 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u,", i + 1,
3503 le32_to_cpu(stats_buf->ax_brp[i].ax_ofdma_brp_queued));
3504 len--;
3505 *(buf + len) = '\0';
3506
3507 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\nax_ofdma_brpoll_tied =");
3508 for (i = 0; i < num_elements; i++)
3509 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u,", i + 1,
3510 le32_to_cpu(stats_buf->ax_brp[i].ax_ofdma_brp_tried));
3511 len--;
3512 *(buf + len) = '\0';
3513
3514 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\nax_ofdma_brpoll_flushed =");
3515 for (i = 0; i < num_elements; i++)
3516 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u,", i + 1,
3517 le32_to_cpu(stats_buf->ax_brp[i].ax_ofdma_brp_flushed));
3518 len--;
3519 *(buf + len) = '\0';
3520
3521 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\nax_ofdma_brp_err =");
3522 for (i = 0; i < num_elements; i++)
3523 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u,", i + 1,
3524 le32_to_cpu(stats_buf->ax_brp[i].ax_ofdma_brp_err));
3525 len--;
3526 *(buf + len) = '\0';
3527
3528 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\nax_ofdma_brp_err_num_cbf_rcvd =");
3529 for (i = 0; i < num_elements; i++)
3530 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u,", i + 1,
3531 le32_to_cpu(stats_buf->ax_brp[i].ax_ofdma_num_cbf_rcvd));
3532 len--;
3533 *(buf + len) = '\0';
3534
3535 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n\n");
3536
3537 stats_req->buf_len = len;
3538}
3539
3540static void
3541ath12k_htt_print_txbf_ofdma_ax_steer_stats_tlv(const void *tag_buf, u16 tag_len,
3542 struct debug_htt_stats_req *stats_req)
3543{
3544 const struct ath12k_htt_txbf_ofdma_ax_steer_stats_tlv *stats_buf = tag_buf;
3545 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
3546 u32 len = stats_req->buf_len;
3547 u8 *buf = stats_req->buf;
3548 u32 num_elements;
3549 u8 i;
3550
3551 if (tag_len < sizeof(*stats_buf))
3552 return;
3553
3554 num_elements = le32_to_cpu(stats_buf->num_elems_ax_steer_arr);
3555
3556 len += scnprintf(buf: buf + len, size: buf_len - len,
3557 fmt: "HTT_TXBF_OFDMA_AX_STEER_STATS_TLV:\n");
3558 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ax_ofdma_num_ppdu_steer =");
3559 for (i = 0; i < num_elements; i++)
3560 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u,", i + 1,
3561 le32_to_cpu(stats_buf->ax_steer[i].num_ppdu_steer));
3562 len--;
3563 *(buf + len) = '\0';
3564
3565 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\nax_ofdma_num_usrs_prefetch =");
3566 for (i = 0; i < num_elements; i++)
3567 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u,", i + 1,
3568 le32_to_cpu(stats_buf->ax_steer[i].num_usr_prefetch));
3569 len--;
3570 *(buf + len) = '\0';
3571
3572 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\nax_ofdma_num_usrs_sound =");
3573 for (i = 0; i < num_elements; i++)
3574 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u,", i + 1,
3575 le32_to_cpu(stats_buf->ax_steer[i].num_usr_sound));
3576 len--;
3577 *(buf + len) = '\0';
3578
3579 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\nax_ofdma_num_usrs_force_sound =");
3580 for (i = 0; i < num_elements; i++)
3581 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u,", i + 1,
3582 le32_to_cpu(stats_buf->ax_steer[i].num_usr_force_sound));
3583 len--;
3584 *(buf + len) = '\0';
3585
3586 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n\n");
3587
3588 stats_req->buf_len = len;
3589}
3590
3591static void
3592ath12k_htt_print_txbf_ofdma_ax_steer_mpdu_stats_tlv(const void *tag_buf, u16 tag_len,
3593 struct debug_htt_stats_req *stats_req)
3594{
3595 const struct ath12k_htt_txbf_ofdma_ax_steer_mpdu_stats_tlv *stats_buf = tag_buf;
3596 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
3597 u32 len = stats_req->buf_len;
3598 u8 *buf = stats_req->buf;
3599
3600 if (tag_len < sizeof(*stats_buf))
3601 return;
3602
3603 len += scnprintf(buf: buf + len, size: buf_len - len,
3604 fmt: "HTT_TXBF_OFDMA_AX_STEER_MPDU_STATS_TLV:\n");
3605 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rbo_steer_mpdus_tried = %u\n",
3606 le32_to_cpu(stats_buf->ax_ofdma_rbo_steer_mpdus_tried));
3607 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rbo_steer_mpdus_failed = %u\n",
3608 le32_to_cpu(stats_buf->ax_ofdma_rbo_steer_mpdus_failed));
3609 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "sifs_steer_mpdus_tried = %u\n",
3610 le32_to_cpu(stats_buf->ax_ofdma_sifs_steer_mpdus_tried));
3611 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "sifs_steer_mpdus_failed = %u\n\n",
3612 le32_to_cpu(stats_buf->ax_ofdma_sifs_steer_mpdus_failed));
3613
3614 stats_req->buf_len = len;
3615}
3616
3617static void ath12k_htt_print_dlpager_entry(const struct ath12k_htt_pgs_info *pg_info,
3618 int idx, char *str_buf)
3619{
3620 u64 page_timestamp;
3621 u16 index = 0;
3622
3623 page_timestamp = ath12k_le32hilo_to_u64(hi: pg_info->ts_msb, lo: pg_info->ts_lsb);
3624
3625 index += snprintf(buf: &str_buf[index], ATH12K_HTT_MAX_STRING_LEN - index,
3626 fmt: "Index - %u ; Page Number - %u ; ",
3627 idx, le32_to_cpu(pg_info->page_num));
3628 index += snprintf(buf: &str_buf[index], ATH12K_HTT_MAX_STRING_LEN - index,
3629 fmt: "Num of pages - %u ; Timestamp - %lluus\n",
3630 le32_to_cpu(pg_info->num_pgs), page_timestamp);
3631}
3632
3633static void
3634ath12k_htt_print_dlpager_stats_tlv(const void *tag_buf, u16 tag_len,
3635 struct debug_htt_stats_req *stats_req)
3636{
3637 const struct ath12k_htt_dl_pager_stats_tlv *stat_buf = tag_buf;
3638 u32 len = stats_req->buf_len;
3639 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
3640 u32 dword_lock, dword_unlock;
3641 int i;
3642 u8 *buf = stats_req->buf;
3643 u8 pg_locked;
3644 u8 pg_unlock;
3645 char str_buf[ATH12K_HTT_MAX_STRING_LEN] = {};
3646
3647 if (tag_len < sizeof(*stat_buf))
3648 return;
3649
3650 dword_lock = le32_get_bits(v: stat_buf->info2,
3651 ATH12K_HTT_DLPAGER_TOTAL_LOCK_PAGES_INFO2);
3652 dword_unlock = le32_get_bits(v: stat_buf->info2,
3653 ATH12K_HTT_DLPAGER_TOTAL_FREE_PAGES_INFO2);
3654
3655 pg_locked = ATH12K_HTT_STATS_PAGE_LOCKED;
3656 pg_unlock = ATH12K_HTT_STATS_PAGE_UNLOCKED;
3657
3658 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_DLPAGER_STATS_TLV:\n");
3659 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ASYNC locked pages = %u\n",
3660 le32_get_bits(v: stat_buf->info0,
3661 ATH12K_HTT_DLPAGER_ASYNC_LOCK_PG_CNT_INFO0));
3662 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "SYNC locked pages = %u\n",
3663 le32_get_bits(v: stat_buf->info0,
3664 ATH12K_HTT_DLPAGER_SYNC_LOCK_PG_CNT_INFO0));
3665 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "Total locked pages = %u\n",
3666 le32_get_bits(v: stat_buf->info1,
3667 ATH12K_HTT_DLPAGER_TOTAL_LOCK_PAGES_INFO1));
3668 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "Total free pages = %u\n",
3669 le32_get_bits(v: stat_buf->info1,
3670 ATH12K_HTT_DLPAGER_TOTAL_FREE_PAGES_INFO1));
3671
3672 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\nLOCKED PAGES HISTORY\n");
3673 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "last_locked_page_idx = %u\n",
3674 dword_lock ? dword_lock - 1 : (ATH12K_PAGER_MAX - 1));
3675
3676 for (i = 0; i < ATH12K_PAGER_MAX; i++) {
3677 memset(str_buf, 0x0, ATH12K_HTT_MAX_STRING_LEN);
3678 ath12k_htt_print_dlpager_entry(pg_info: &stat_buf->pgs_info[pg_locked][i],
3679 idx: i, str_buf);
3680 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "%s", str_buf);
3681 }
3682
3683 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\nUNLOCKED PAGES HISTORY\n");
3684 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "last_unlocked_page_idx = %u\n",
3685 dword_unlock ? dword_unlock - 1 : ATH12K_PAGER_MAX - 1);
3686
3687 for (i = 0; i < ATH12K_PAGER_MAX; i++) {
3688 memset(str_buf, 0x0, ATH12K_HTT_MAX_STRING_LEN);
3689 ath12k_htt_print_dlpager_entry(pg_info: &stat_buf->pgs_info[pg_unlock][i],
3690 idx: i, str_buf);
3691 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "%s", str_buf);
3692 }
3693
3694 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
3695
3696 stats_req->buf_len = len;
3697}
3698
3699static void
3700ath12k_htt_print_phy_stats_tlv(const void *tag_buf, u16 tag_len,
3701 struct debug_htt_stats_req *stats_req)
3702{
3703 const struct ath12k_htt_phy_stats_tlv *htt_stats_buf = tag_buf;
3704 u32 len = stats_req->buf_len;
3705 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
3706 u8 *buf = stats_req->buf, i;
3707
3708 if (tag_len < sizeof(*htt_stats_buf))
3709 return;
3710
3711 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_PHY_STATS_TLV:\n");
3712 for (i = 0; i < ATH12K_HTT_STATS_MAX_CHAINS; i++)
3713 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "bdf_nf_chain[%d] = %d\n",
3714 i, a_sle32_to_cpu(val: htt_stats_buf->nf_chain[i]));
3715 for (i = 0; i < ATH12K_HTT_STATS_MAX_CHAINS; i++)
3716 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "runtime_nf_chain[%d] = %d\n",
3717 i, a_sle32_to_cpu(val: htt_stats_buf->runtime_nf_chain[i]));
3718 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "false_radar_cnt = %u / %u (mins)\n",
3719 le32_to_cpu(htt_stats_buf->false_radar_cnt),
3720 le32_to_cpu(htt_stats_buf->fw_run_time));
3721 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "radar_cs_cnt = %u\n",
3722 le32_to_cpu(htt_stats_buf->radar_cs_cnt));
3723 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ani_level = %d\n\n",
3724 a_sle32_to_cpu(val: htt_stats_buf->ani_level));
3725
3726 stats_req->buf_len = len;
3727}
3728
3729static void
3730ath12k_htt_print_phy_counters_tlv(const void *tag_buf, u16 tag_len,
3731 struct debug_htt_stats_req *stats_req)
3732{
3733 const struct ath12k_htt_phy_counters_tlv *htt_stats_buf = tag_buf;
3734 u32 len = stats_req->buf_len;
3735 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
3736 u8 *buf = stats_req->buf;
3737
3738 if (tag_len < sizeof(*htt_stats_buf))
3739 return;
3740
3741 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_PHY_COUNTERS_TLV:\n");
3742 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_ofdma_timing_err_cnt = %u\n",
3743 le32_to_cpu(htt_stats_buf->rx_ofdma_timing_err_cnt));
3744 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_cck_fail_cnt = %u\n",
3745 le32_to_cpu(htt_stats_buf->rx_cck_fail_cnt));
3746 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mactx_abort_cnt = %u\n",
3747 le32_to_cpu(htt_stats_buf->mactx_abort_cnt));
3748 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "macrx_abort_cnt = %u\n",
3749 le32_to_cpu(htt_stats_buf->macrx_abort_cnt));
3750 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "phytx_abort_cnt = %u\n",
3751 le32_to_cpu(htt_stats_buf->phytx_abort_cnt));
3752 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "phyrx_abort_cnt = %u\n",
3753 le32_to_cpu(htt_stats_buf->phyrx_abort_cnt));
3754 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "phyrx_defer_abort_cnt = %u\n",
3755 le32_to_cpu(htt_stats_buf->phyrx_defer_abort_cnt));
3756 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_gain_adj_lstf_event_cnt = %u\n",
3757 le32_to_cpu(htt_stats_buf->rx_gain_adj_lstf_event_cnt));
3758 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_gain_adj_non_legacy_cnt = %u\n",
3759 le32_to_cpu(htt_stats_buf->rx_gain_adj_non_legacy_cnt));
3760 len += print_array_to_buf(buf, offset: len, header: "rx_pkt_cnt", array: htt_stats_buf->rx_pkt_cnt,
3761 ATH12K_HTT_MAX_RX_PKT_CNT, footer: "\n");
3762 len += print_array_to_buf(buf, offset: len, header: "rx_pkt_crc_pass_cnt",
3763 array: htt_stats_buf->rx_pkt_crc_pass_cnt,
3764 ATH12K_HTT_MAX_RX_PKT_CRC_PASS_CNT, footer: "\n");
3765 len += print_array_to_buf(buf, offset: len, header: "per_blk_err_cnt",
3766 array: htt_stats_buf->per_blk_err_cnt,
3767 ATH12K_HTT_MAX_PER_BLK_ERR_CNT, footer: "\n");
3768 len += print_array_to_buf(buf, offset: len, header: "rx_ota_err_cnt",
3769 array: htt_stats_buf->rx_ota_err_cnt,
3770 ATH12K_HTT_MAX_RX_OTA_ERR_CNT, footer: "\n\n");
3771
3772 stats_req->buf_len = len;
3773}
3774
3775static void
3776ath12k_htt_print_phy_reset_stats_tlv(const void *tag_buf, u16 tag_len,
3777 struct debug_htt_stats_req *stats_req)
3778{
3779 const struct ath12k_htt_phy_reset_stats_tlv *htt_stats_buf = tag_buf;
3780 u32 len = stats_req->buf_len;
3781 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
3782 u8 *buf = stats_req->buf;
3783
3784 if (tag_len < sizeof(*htt_stats_buf))
3785 return;
3786
3787 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_PHY_RESET_STATS_TLV:\n");
3788 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "pdev_id = %u\n",
3789 le32_to_cpu(htt_stats_buf->pdev_id));
3790 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "chan_mhz = %u\n",
3791 le32_to_cpu(htt_stats_buf->chan_mhz));
3792 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "chan_band_center_freq1 = %u\n",
3793 le32_to_cpu(htt_stats_buf->chan_band_center_freq1));
3794 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "chan_band_center_freq2 = %u\n",
3795 le32_to_cpu(htt_stats_buf->chan_band_center_freq2));
3796 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "chan_phy_mode = %u\n",
3797 le32_to_cpu(htt_stats_buf->chan_phy_mode));
3798 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "chan_flags = 0x%0x\n",
3799 le32_to_cpu(htt_stats_buf->chan_flags));
3800 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "chan_num = %u\n",
3801 le32_to_cpu(htt_stats_buf->chan_num));
3802 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "reset_cause = 0x%0x\n",
3803 le32_to_cpu(htt_stats_buf->reset_cause));
3804 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "prev_reset_cause = 0x%0x\n",
3805 le32_to_cpu(htt_stats_buf->prev_reset_cause));
3806 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "phy_warm_reset_src = 0x%0x\n",
3807 le32_to_cpu(htt_stats_buf->phy_warm_reset_src));
3808 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_gain_tbl_mode = %d\n",
3809 le32_to_cpu(htt_stats_buf->rx_gain_tbl_mode));
3810 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "xbar_val = 0x%0x\n",
3811 le32_to_cpu(htt_stats_buf->xbar_val));
3812 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "force_calibration = %u\n",
3813 le32_to_cpu(htt_stats_buf->force_calibration));
3814 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "phyrf_mode = %u\n",
3815 le32_to_cpu(htt_stats_buf->phyrf_mode));
3816 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "phy_homechan = %u\n",
3817 le32_to_cpu(htt_stats_buf->phy_homechan));
3818 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "phy_tx_ch_mask = 0x%0x\n",
3819 le32_to_cpu(htt_stats_buf->phy_tx_ch_mask));
3820 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "phy_rx_ch_mask = 0x%0x\n",
3821 le32_to_cpu(htt_stats_buf->phy_rx_ch_mask));
3822 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "phybb_ini_mask = 0x%0x\n",
3823 le32_to_cpu(htt_stats_buf->phybb_ini_mask));
3824 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "phyrf_ini_mask = 0x%0x\n",
3825 le32_to_cpu(htt_stats_buf->phyrf_ini_mask));
3826 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "phy_dfs_en_mask = 0x%0x\n",
3827 le32_to_cpu(htt_stats_buf->phy_dfs_en_mask));
3828 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "phy_sscan_en_mask = 0x%0x\n",
3829 le32_to_cpu(htt_stats_buf->phy_sscan_en_mask));
3830 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "phy_synth_sel_mask = 0x%0x\n",
3831 le32_to_cpu(htt_stats_buf->phy_synth_sel_mask));
3832 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "phy_adfs_freq = %u\n",
3833 le32_to_cpu(htt_stats_buf->phy_adfs_freq));
3834 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cck_fir_settings = 0x%0x\n",
3835 le32_to_cpu(htt_stats_buf->cck_fir_settings));
3836 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "phy_dyn_pri_chan = %u\n",
3837 le32_to_cpu(htt_stats_buf->phy_dyn_pri_chan));
3838 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cca_thresh = 0x%0x\n",
3839 le32_to_cpu(htt_stats_buf->cca_thresh));
3840 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "dyn_cca_status = %u\n",
3841 le32_to_cpu(htt_stats_buf->dyn_cca_status));
3842 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rxdesense_thresh_hw = 0x%x\n",
3843 le32_to_cpu(htt_stats_buf->rxdesense_thresh_hw));
3844 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rxdesense_thresh_sw = 0x%x\n\n",
3845 le32_to_cpu(htt_stats_buf->rxdesense_thresh_sw));
3846
3847 stats_req->buf_len = len;
3848}
3849
3850static void
3851ath12k_htt_print_phy_reset_counters_tlv(const void *tag_buf, u16 tag_len,
3852 struct debug_htt_stats_req *stats_req)
3853{
3854 const struct ath12k_htt_phy_reset_counters_tlv *htt_stats_buf = tag_buf;
3855 u32 len = stats_req->buf_len;
3856 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
3857 u8 *buf = stats_req->buf;
3858
3859 if (tag_len < sizeof(*htt_stats_buf))
3860 return;
3861
3862 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_PHY_RESET_COUNTERS_TLV:\n");
3863 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "pdev_id = %u\n",
3864 le32_to_cpu(htt_stats_buf->pdev_id));
3865 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cf_active_low_fail_cnt = %u\n",
3866 le32_to_cpu(htt_stats_buf->cf_active_low_fail_cnt));
3867 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "cf_active_low_pass_cnt = %u\n",
3868 le32_to_cpu(htt_stats_buf->cf_active_low_pass_cnt));
3869 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "phy_off_through_vreg_cnt = %u\n",
3870 le32_to_cpu(htt_stats_buf->phy_off_through_vreg_cnt));
3871 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "force_calibration_cnt = %u\n",
3872 le32_to_cpu(htt_stats_buf->force_calibration_cnt));
3873 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rf_mode_switch_phy_off_cnt = %u\n",
3874 le32_to_cpu(htt_stats_buf->rf_mode_switch_phy_off_cnt));
3875 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "temperature_recal_cnt = %u\n\n",
3876 le32_to_cpu(htt_stats_buf->temperature_recal_cnt));
3877
3878 stats_req->buf_len = len;
3879}
3880
3881static void
3882ath12k_htt_print_phy_tpc_stats_tlv(const void *tag_buf, u16 tag_len,
3883 struct debug_htt_stats_req *stats_req)
3884{
3885 const struct ath12k_htt_phy_tpc_stats_tlv *htt_stats_buf = tag_buf;
3886 u32 len = stats_req->buf_len;
3887 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
3888 u8 *buf = stats_req->buf;
3889
3890 if (tag_len < sizeof(*htt_stats_buf))
3891 return;
3892
3893 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_PHY_TPC_STATS_TLV:\n");
3894 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "pdev_id = %u\n",
3895 le32_to_cpu(htt_stats_buf->pdev_id));
3896 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_power_scale = %u\n",
3897 le32_to_cpu(htt_stats_buf->tx_power_scale));
3898 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_power_scale_db = %u\n",
3899 le32_to_cpu(htt_stats_buf->tx_power_scale_db));
3900 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "min_negative_tx_power = %d\n",
3901 le32_to_cpu(htt_stats_buf->min_negative_tx_power));
3902 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "reg_ctl_domain = %u\n",
3903 le32_to_cpu(htt_stats_buf->reg_ctl_domain));
3904 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "twice_max_rd_power = %u\n",
3905 le32_to_cpu(htt_stats_buf->twice_max_rd_power));
3906 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "max_tx_power = %u\n",
3907 le32_to_cpu(htt_stats_buf->max_tx_power));
3908 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "home_max_tx_power = %u\n",
3909 le32_to_cpu(htt_stats_buf->home_max_tx_power));
3910 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "psd_power = %d\n",
3911 le32_to_cpu(htt_stats_buf->psd_power));
3912 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "eirp_power = %u\n",
3913 le32_to_cpu(htt_stats_buf->eirp_power));
3914 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "power_type_6ghz = %u\n",
3915 le32_to_cpu(htt_stats_buf->power_type_6ghz));
3916 len += print_array_to_buf(buf, offset: len, header: "max_reg_allowed_power",
3917 array: htt_stats_buf->max_reg_allowed_power,
3918 ATH12K_HTT_STATS_MAX_CHAINS, footer: "\n");
3919 len += print_array_to_buf(buf, offset: len, header: "max_reg_allowed_power_6ghz",
3920 array: htt_stats_buf->max_reg_allowed_power_6ghz,
3921 ATH12K_HTT_STATS_MAX_CHAINS, footer: "\n");
3922 len += print_array_to_buf(buf, offset: len, header: "sub_band_cfreq",
3923 array: htt_stats_buf->sub_band_cfreq,
3924 ATH12K_HTT_MAX_CH_PWR_INFO_SIZE, footer: "\n");
3925 len += print_array_to_buf(buf, offset: len, header: "sub_band_txpower",
3926 array: htt_stats_buf->sub_band_txpower,
3927 ATH12K_HTT_MAX_CH_PWR_INFO_SIZE, footer: "\n\n");
3928
3929 stats_req->buf_len = len;
3930}
3931
3932static void
3933ath12k_htt_print_soc_txrx_stats_common_tlv(const void *tag_buf, u16 tag_len,
3934 struct debug_htt_stats_req *stats_req)
3935{
3936 const struct ath12k_htt_t2h_soc_txrx_stats_common_tlv *htt_stats_buf = tag_buf;
3937 u64 drop_count;
3938 u32 len = stats_req->buf_len;
3939 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
3940 u8 *buf = stats_req->buf;
3941
3942 if (tag_len < sizeof(*htt_stats_buf))
3943 return;
3944
3945 drop_count = ath12k_le32hilo_to_u64(hi: htt_stats_buf->inv_peers_msdu_drop_count_hi,
3946 lo: htt_stats_buf->inv_peers_msdu_drop_count_lo);
3947
3948 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_SOC_COMMON_STATS_TLV:\n");
3949 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "soc_drop_count = %llu\n\n",
3950 drop_count);
3951
3952 stats_req->buf_len = len;
3953}
3954
3955static void
3956ath12k_htt_print_tx_per_rate_stats_tlv(const void *tag_buf, u16 tag_len,
3957 struct debug_htt_stats_req *stats_req)
3958{
3959 const struct ath12k_htt_tx_per_rate_stats_tlv *stats_buf = tag_buf;
3960 u32 len = stats_req->buf_len;
3961 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
3962 u32 ru_size_cnt = 0;
3963 u32 rc_mode, ru_type;
3964 u8 *buf = stats_req->buf, i;
3965 const char *mode_prefix;
3966
3967 if (tag_len < sizeof(*stats_buf))
3968 return;
3969
3970 rc_mode = le32_to_cpu(stats_buf->rc_mode);
3971 ru_type = le32_to_cpu(stats_buf->ru_type);
3972
3973 switch (rc_mode) {
3974 case ATH12K_HTT_STATS_RC_MODE_DLSU:
3975 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_TX_PER_STATS:\n");
3976 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\nPER_STATS_SU:\n");
3977 mode_prefix = "su";
3978 break;
3979 case ATH12K_HTT_STATS_RC_MODE_DLMUMIMO:
3980 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\nPER_STATS_DL_MUMIMO:\n");
3981 mode_prefix = "mu";
3982 break;
3983 case ATH12K_HTT_STATS_RC_MODE_DLOFDMA:
3984 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\nPER_STATS_DL_OFDMA:\n");
3985 mode_prefix = "ofdma";
3986 if (ru_type == ATH12K_HTT_STATS_RU_TYPE_SINGLE_RU_ONLY)
3987 ru_size_cnt = ATH12K_HTT_TX_RX_PDEV_STATS_NUM_AX_RU_SIZE_CNTRS;
3988 else if (ru_type == ATH12K_HTT_STATS_RU_TYPE_SINGLE_AND_MULTI_RU)
3989 ru_size_cnt = ATH12K_HTT_TX_RX_PDEV_NUM_BE_RU_SIZE_CNTRS;
3990 break;
3991 case ATH12K_HTT_STATS_RC_MODE_ULMUMIMO:
3992 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_RX_PER_STATS:\n");
3993 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\nPER_STATS_UL_MUMIMO:\n");
3994 mode_prefix = "ulmu";
3995 break;
3996 case ATH12K_HTT_STATS_RC_MODE_ULOFDMA:
3997 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\nPER_STATS_UL_OFDMA:\n");
3998 mode_prefix = "ulofdma";
3999 if (ru_type == ATH12K_HTT_STATS_RU_TYPE_SINGLE_RU_ONLY)
4000 ru_size_cnt = ATH12K_HTT_TX_RX_PDEV_STATS_NUM_AX_RU_SIZE_CNTRS;
4001 else if (ru_type == ATH12K_HTT_STATS_RU_TYPE_SINGLE_AND_MULTI_RU)
4002 ru_size_cnt = ATH12K_HTT_TX_RX_PDEV_NUM_BE_RU_SIZE_CNTRS;
4003 break;
4004 default:
4005 return;
4006 }
4007
4008 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\nPER per BW:\n");
4009 if (rc_mode == ATH12K_HTT_STATS_RC_MODE_ULOFDMA ||
4010 rc_mode == ATH12K_HTT_STATS_RC_MODE_ULMUMIMO)
4011 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "data_ppdus_%s = ",
4012 mode_prefix);
4013 else
4014 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ppdus_tried_%s = ",
4015 mode_prefix);
4016 for (i = 0; i < ATH12K_HTT_TX_PDEV_STATS_NUM_BW_CNTRS; i++)
4017 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u ", i,
4018 le32_to_cpu(stats_buf->per_bw[i].ppdus_tried));
4019 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u\n", i,
4020 le32_to_cpu(stats_buf->per_bw320.ppdus_tried));
4021
4022 if (rc_mode == ATH12K_HTT_STATS_RC_MODE_ULOFDMA ||
4023 rc_mode == ATH12K_HTT_STATS_RC_MODE_ULMUMIMO)
4024 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "non_data_ppdus_%s = ",
4025 mode_prefix);
4026 else
4027 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ppdus_ack_failed_%s = ",
4028 mode_prefix);
4029 for (i = 0; i < ATH12K_HTT_TX_PDEV_STATS_NUM_BW_CNTRS; i++)
4030 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u ", i,
4031 le32_to_cpu(stats_buf->per_bw[i].ppdus_ack_failed));
4032 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u\n", i,
4033 le32_to_cpu(stats_buf->per_bw320.ppdus_ack_failed));
4034
4035 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mpdus_tried_%s = ", mode_prefix);
4036 for (i = 0; i < ATH12K_HTT_TX_PDEV_STATS_NUM_BW_CNTRS; i++)
4037 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u ", i,
4038 le32_to_cpu(stats_buf->per_bw[i].mpdus_tried));
4039 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u\n", i,
4040 le32_to_cpu(stats_buf->per_bw320.mpdus_tried));
4041
4042 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mpdus_failed_%s = ", mode_prefix);
4043 for (i = 0; i < ATH12K_HTT_TX_PDEV_STATS_NUM_BW_CNTRS; i++)
4044 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u", i,
4045 le32_to_cpu(stats_buf->per_bw[i].mpdus_failed));
4046 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u\n", i,
4047 le32_to_cpu(stats_buf->per_bw320.mpdus_failed));
4048
4049 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\nPER per NSS:\n");
4050 if (rc_mode == ATH12K_HTT_STATS_RC_MODE_ULOFDMA ||
4051 rc_mode == ATH12K_HTT_STATS_RC_MODE_ULMUMIMO)
4052 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "data_ppdus_%s = ",
4053 mode_prefix);
4054 else
4055 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ppdus_tried_%s = ",
4056 mode_prefix);
4057 for (i = 0; i < ATH12K_HTT_PDEV_STAT_NUM_SPATIAL_STREAMS; i++)
4058 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u ", i + 1,
4059 le32_to_cpu(stats_buf->per_nss[i].ppdus_tried));
4060 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4061
4062 if (rc_mode == ATH12K_HTT_STATS_RC_MODE_ULOFDMA ||
4063 rc_mode == ATH12K_HTT_STATS_RC_MODE_ULMUMIMO)
4064 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "non_data_ppdus_%s = ",
4065 mode_prefix);
4066 else
4067 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ppdus_ack_failed_%s = ",
4068 mode_prefix);
4069 for (i = 0; i < ATH12K_HTT_PDEV_STAT_NUM_SPATIAL_STREAMS; i++)
4070 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u ", i + 1,
4071 le32_to_cpu(stats_buf->per_nss[i].ppdus_ack_failed));
4072 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4073
4074 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mpdus_tried_%s = ", mode_prefix);
4075 for (i = 0; i < ATH12K_HTT_PDEV_STAT_NUM_SPATIAL_STREAMS; i++)
4076 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u ", i + 1,
4077 le32_to_cpu(stats_buf->per_nss[i].mpdus_tried));
4078 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4079
4080 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mpdus_failed_%s = ", mode_prefix);
4081 for (i = 0; i < ATH12K_HTT_PDEV_STAT_NUM_SPATIAL_STREAMS; i++)
4082 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u ", i + 1,
4083 le32_to_cpu(stats_buf->per_nss[i].mpdus_failed));
4084 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4085
4086 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\nPER per MCS:\n");
4087 if (rc_mode == ATH12K_HTT_STATS_RC_MODE_ULOFDMA ||
4088 rc_mode == ATH12K_HTT_STATS_RC_MODE_ULMUMIMO)
4089 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "data_ppdus_%s = ",
4090 mode_prefix);
4091 else
4092 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ppdus_tried_%s = ",
4093 mode_prefix);
4094 for (i = 0; i < ATH12K_HTT_TXBF_RATE_STAT_NUM_MCS_CNTRS; i++)
4095 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u ", i,
4096 le32_to_cpu(stats_buf->per_mcs[i].ppdus_tried));
4097 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4098
4099 if (rc_mode == ATH12K_HTT_STATS_RC_MODE_ULOFDMA ||
4100 rc_mode == ATH12K_HTT_STATS_RC_MODE_ULMUMIMO)
4101 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "non_data_ppdus_%s = ",
4102 mode_prefix);
4103 else
4104 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ppdus_ack_failed_%s = ",
4105 mode_prefix);
4106 for (i = 0; i < ATH12K_HTT_TXBF_RATE_STAT_NUM_MCS_CNTRS; i++)
4107 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u ", i,
4108 le32_to_cpu(stats_buf->per_mcs[i].ppdus_ack_failed));
4109 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4110
4111 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mpdus_tried_%s = ", mode_prefix);
4112 for (i = 0; i < ATH12K_HTT_TXBF_RATE_STAT_NUM_MCS_CNTRS; i++)
4113 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u ", i,
4114 le32_to_cpu(stats_buf->per_mcs[i].mpdus_tried));
4115 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4116
4117 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mpdus_failed_%s = ", mode_prefix);
4118 for (i = 0; i < ATH12K_HTT_TXBF_RATE_STAT_NUM_MCS_CNTRS; i++)
4119 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u ", i,
4120 le32_to_cpu(stats_buf->per_mcs[i].mpdus_failed));
4121 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4122
4123 if ((rc_mode == ATH12K_HTT_STATS_RC_MODE_DLOFDMA ||
4124 rc_mode == ATH12K_HTT_STATS_RC_MODE_ULOFDMA) &&
4125 ru_type != ATH12K_HTT_STATS_RU_TYPE_INVALID) {
4126 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\nPER per RU:\n");
4127
4128 if (rc_mode == ATH12K_HTT_STATS_RC_MODE_ULOFDMA)
4129 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "data_ppdus_%s = ",
4130 mode_prefix);
4131 else
4132 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ppdus_tried_%s = ",
4133 mode_prefix);
4134 for (i = 0; i < ru_size_cnt; i++)
4135 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %s:%u ",
4136 ath12k_tx_ru_size_to_str(ru_type, ru_size: i),
4137 le32_to_cpu(stats_buf->ru[i].ppdus_tried));
4138 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4139
4140 if (rc_mode == ATH12K_HTT_STATS_RC_MODE_ULOFDMA)
4141 len += scnprintf(buf: buf + len, size: buf_len - len,
4142 fmt: "non_data_ppdus_%s = ", mode_prefix);
4143 else
4144 len += scnprintf(buf: buf + len, size: buf_len - len,
4145 fmt: "ppdus_ack_failed_%s = ", mode_prefix);
4146 for (i = 0; i < ru_size_cnt; i++)
4147 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %s:%u ",
4148 ath12k_tx_ru_size_to_str(ru_type, ru_size: i),
4149 le32_to_cpu(stats_buf->ru[i].ppdus_ack_failed));
4150 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4151
4152 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mpdus_tried_%s = ",
4153 mode_prefix);
4154 for (i = 0; i < ru_size_cnt; i++)
4155 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %s:%u ",
4156 ath12k_tx_ru_size_to_str(ru_type, ru_size: i),
4157 le32_to_cpu(stats_buf->ru[i].mpdus_tried));
4158 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4159
4160 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mpdus_failed_%s = ",
4161 mode_prefix);
4162 for (i = 0; i < ru_size_cnt; i++)
4163 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %s:%u ",
4164 ath12k_tx_ru_size_to_str(ru_type, ru_size: i),
4165 le32_to_cpu(stats_buf->ru[i].mpdus_failed));
4166 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n\n");
4167 }
4168
4169 if (rc_mode == ATH12K_HTT_STATS_RC_MODE_DLMUMIMO) {
4170 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\nlast_probed_bw = %u\n",
4171 le32_to_cpu(stats_buf->last_probed_bw));
4172 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "last_probed_nss = %u\n",
4173 le32_to_cpu(stats_buf->last_probed_nss));
4174 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "last_probed_mcs = %u\n",
4175 le32_to_cpu(stats_buf->last_probed_mcs));
4176 len += print_array_to_buf(buf, offset: len, header: "MU Probe count per RC MODE",
4177 array: stats_buf->probe_cnt,
4178 array_len: ATH12K_HTT_RC_MODE_2D_COUNT, footer: "\n\n");
4179 }
4180
4181 stats_req->buf_len = len;
4182}
4183
4184static void
4185ath12k_htt_print_ast_entry_tlv(const void *tag_buf, u16 tag_len,
4186 struct debug_htt_stats_req *stats_req)
4187{
4188 const struct ath12k_htt_ast_entry_tlv *htt_stats_buf = tag_buf;
4189 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
4190 u32 len = stats_req->buf_len;
4191 u8 *buf = stats_req->buf;
4192 u32 mac_addr_l32;
4193 u32 mac_addr_h16;
4194 u32 ast_info;
4195
4196 if (tag_len < sizeof(*htt_stats_buf))
4197 return;
4198
4199 mac_addr_l32 = le32_to_cpu(htt_stats_buf->mac_addr.mac_addr_l32);
4200 mac_addr_h16 = le32_to_cpu(htt_stats_buf->mac_addr.mac_addr_h16);
4201 ast_info = le32_to_cpu(htt_stats_buf->info);
4202
4203 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_AST_ENTRY_TLV:\n");
4204 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ast_index = %u\n",
4205 le32_to_cpu(htt_stats_buf->ast_index));
4206 len += scnprintf(buf: buf + len, size: buf_len - len,
4207 fmt: "mac_addr = %02x:%02x:%02x:%02x:%02x:%02x\n",
4208 u32_get_bits(v: mac_addr_l32, ATH12K_HTT_MAC_ADDR_L32_0),
4209 u32_get_bits(v: mac_addr_l32, ATH12K_HTT_MAC_ADDR_L32_1),
4210 u32_get_bits(v: mac_addr_l32, ATH12K_HTT_MAC_ADDR_L32_2),
4211 u32_get_bits(v: mac_addr_l32, ATH12K_HTT_MAC_ADDR_L32_3),
4212 u32_get_bits(v: mac_addr_h16, ATH12K_HTT_MAC_ADDR_H16_0),
4213 u32_get_bits(v: mac_addr_h16, ATH12K_HTT_MAC_ADDR_H16_1));
4214
4215 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "sw_peer_id = %u\n",
4216 le32_to_cpu(htt_stats_buf->sw_peer_id));
4217 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "pdev_id = %u\n",
4218 u32_get_bits(v: ast_info, ATH12K_HTT_AST_PDEV_ID_INFO));
4219 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "vdev_id = %u\n",
4220 u32_get_bits(v: ast_info, ATH12K_HTT_AST_VDEV_ID_INFO));
4221 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "next_hop = %u\n",
4222 u32_get_bits(v: ast_info, ATH12K_HTT_AST_NEXT_HOP_INFO));
4223 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mcast = %u\n",
4224 u32_get_bits(v: ast_info, ATH12K_HTT_AST_MCAST_INFO));
4225 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "monitor_direct = %u\n",
4226 u32_get_bits(v: ast_info, ATH12K_HTT_AST_MONITOR_DIRECT_INFO));
4227 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mesh_sta = %u\n",
4228 u32_get_bits(v: ast_info, ATH12K_HTT_AST_MESH_STA_INFO));
4229 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mec = %u\n",
4230 u32_get_bits(v: ast_info, ATH12K_HTT_AST_MEC_INFO));
4231 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "intra_bss = %u\n\n",
4232 u32_get_bits(v: ast_info, ATH12K_HTT_AST_INTRA_BSS_INFO));
4233
4234 stats_req->buf_len = len;
4235}
4236
4237static const char*
4238ath12k_htt_get_punct_dir_type_str(enum ath12k_htt_stats_direction direction)
4239{
4240 switch (direction) {
4241 case ATH12K_HTT_STATS_DIRECTION_TX:
4242 return "tx";
4243 case ATH12K_HTT_STATS_DIRECTION_RX:
4244 return "rx";
4245 default:
4246 return "unknown";
4247 }
4248}
4249
4250static const char*
4251ath12k_htt_get_punct_ppdu_type_str(enum ath12k_htt_stats_ppdu_type ppdu_type)
4252{
4253 switch (ppdu_type) {
4254 case ATH12K_HTT_STATS_PPDU_TYPE_MODE_SU:
4255 return "su";
4256 case ATH12K_HTT_STATS_PPDU_TYPE_DL_MU_MIMO:
4257 return "dl_mu_mimo";
4258 case ATH12K_HTT_STATS_PPDU_TYPE_UL_MU_MIMO:
4259 return "ul_mu_mimo";
4260 case ATH12K_HTT_STATS_PPDU_TYPE_DL_MU_OFDMA:
4261 return "dl_mu_ofdma";
4262 case ATH12K_HTT_STATS_PPDU_TYPE_UL_MU_OFDMA:
4263 return "ul_mu_ofdma";
4264 default:
4265 return "unknown";
4266 }
4267}
4268
4269static const char*
4270ath12k_htt_get_punct_pream_type_str(enum ath12k_htt_stats_param_type pream_type)
4271{
4272 switch (pream_type) {
4273 case ATH12K_HTT_STATS_PREAM_OFDM:
4274 return "ofdm";
4275 case ATH12K_HTT_STATS_PREAM_CCK:
4276 return "cck";
4277 case ATH12K_HTT_STATS_PREAM_HT:
4278 return "ht";
4279 case ATH12K_HTT_STATS_PREAM_VHT:
4280 return "ac";
4281 case ATH12K_HTT_STATS_PREAM_HE:
4282 return "ax";
4283 case ATH12K_HTT_STATS_PREAM_EHT:
4284 return "be";
4285 default:
4286 return "unknown";
4287 }
4288}
4289
4290static void
4291ath12k_htt_print_puncture_stats_tlv(const void *tag_buf, u16 tag_len,
4292 struct debug_htt_stats_req *stats_req)
4293{
4294 const struct ath12k_htt_pdev_puncture_stats_tlv *stats_buf = tag_buf;
4295 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
4296 u32 len = stats_req->buf_len;
4297 u8 *buf = stats_req->buf;
4298 const char *direction;
4299 const char *ppdu_type;
4300 const char *preamble;
4301 u32 mac_id__word;
4302 u32 subband_limit;
4303 u8 i;
4304
4305 if (tag_len < sizeof(*stats_buf))
4306 return;
4307
4308 mac_id__word = le32_to_cpu(stats_buf->mac_id__word);
4309 subband_limit = min(le32_to_cpu(stats_buf->subband_cnt),
4310 ATH12K_HTT_PUNCT_STATS_MAX_SUBBAND_CNT);
4311
4312 direction = ath12k_htt_get_punct_dir_type_str(le32_to_cpu(stats_buf->direction));
4313 ppdu_type = ath12k_htt_get_punct_ppdu_type_str(le32_to_cpu(stats_buf->ppdu_type));
4314 preamble = ath12k_htt_get_punct_pream_type_str(le32_to_cpu(stats_buf->preamble));
4315
4316 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_PDEV_PUNCTURE_STATS_TLV:\n");
4317 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mac_id = %u\n",
4318 u32_get_bits(v: mac_id__word, ATH12K_HTT_STATS_MAC_ID));
4319 len += scnprintf(buf: buf + len, size: buf_len - len,
4320 fmt: "%s_%s_%s_last_used_pattern_mask = 0x%08x\n",
4321 direction, preamble, ppdu_type,
4322 le32_to_cpu(stats_buf->last_used_pattern_mask));
4323
4324 for (i = 0; i < subband_limit; i++) {
4325 len += scnprintf(buf: buf + len, size: buf_len - len,
4326 fmt: "%s_%s_%s_num_subbands_used_cnt_%02d = %u\n",
4327 direction, preamble, ppdu_type, i + 1,
4328 le32_to_cpu(stats_buf->num_subbands_used_cnt[i]));
4329 }
4330 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4331
4332 stats_req->buf_len = len;
4333}
4334
4335static void
4336ath12k_htt_print_dmac_reset_stats_tlv(const void *tag_buf, u16 tag_len,
4337 struct debug_htt_stats_req *stats_req)
4338{
4339 const struct ath12k_htt_dmac_reset_stats_tlv *htt_stats_buf = tag_buf;
4340 u8 *buf = stats_req->buf;
4341 u32 len = stats_req->buf_len;
4342 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
4343 u64 time;
4344
4345 if (tag_len < sizeof(*htt_stats_buf))
4346 return;
4347
4348 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_DMAC_RESET_STATS_TLV:\n");
4349 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "reset_count = %u\n",
4350 le32_to_cpu(htt_stats_buf->reset_count));
4351 time = ath12k_le32hilo_to_u64(hi: htt_stats_buf->reset_time_hi_ms,
4352 lo: htt_stats_buf->reset_time_lo_ms);
4353 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "reset_time_ms = %llu\n", time);
4354 time = ath12k_le32hilo_to_u64(hi: htt_stats_buf->disengage_time_hi_ms,
4355 lo: htt_stats_buf->disengage_time_lo_ms);
4356 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "disengage_time_ms = %llu\n", time);
4357
4358 time = ath12k_le32hilo_to_u64(hi: htt_stats_buf->engage_time_hi_ms,
4359 lo: htt_stats_buf->engage_time_lo_ms);
4360 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "engage_time_ms = %llu\n", time);
4361
4362 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "disengage_count = %u\n",
4363 le32_to_cpu(htt_stats_buf->disengage_count));
4364 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "engage_count = %u\n",
4365 le32_to_cpu(htt_stats_buf->engage_count));
4366 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "drain_dest_ring_mask = 0x%x\n\n",
4367 le32_to_cpu(htt_stats_buf->drain_dest_ring_mask));
4368
4369 stats_req->buf_len = len;
4370}
4371
4372static void
4373ath12k_htt_print_pdev_sched_algo_ofdma_stats_tlv(const void *tag_buf, u16 tag_len,
4374 struct debug_htt_stats_req *stats_req)
4375{
4376 const struct ath12k_htt_pdev_sched_algo_ofdma_stats_tlv *htt_stats_buf = tag_buf;
4377 u8 *buf = stats_req->buf;
4378 u32 len = stats_req->buf_len;
4379 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
4380 u32 mac_id_word;
4381
4382 if (tag_len < sizeof(*htt_stats_buf))
4383 return;
4384
4385 mac_id_word = le32_to_cpu(htt_stats_buf->mac_id__word);
4386
4387 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_PDEV_SCHED_ALGO_TLV:\n");
4388 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mac_id = %u\n",
4389 u32_get_bits(v: mac_id_word, ATH12K_HTT_STATS_MAC_ID));
4390 len += print_array_to_buf(buf, offset: len, header: "rate_based_dlofdma_enabled_count",
4391 array: htt_stats_buf->rate_based_dlofdma_enabled_cnt,
4392 ATH12K_HTT_NUM_AC_WMM, footer: "\n");
4393 len += print_array_to_buf(buf, offset: len, header: "rate_based_dlofdma_disabled_count",
4394 array: htt_stats_buf->rate_based_dlofdma_disabled_cnt,
4395 ATH12K_HTT_NUM_AC_WMM, footer: "\n");
4396 len += print_array_to_buf(buf, offset: len, header: "rate_based_dlofdma_probing_count",
4397 array: htt_stats_buf->rate_based_dlofdma_disabled_cnt,
4398 ATH12K_HTT_NUM_AC_WMM, footer: "\n");
4399 len += print_array_to_buf(buf, offset: len, header: "rate_based_dlofdma_monitoring_count",
4400 array: htt_stats_buf->rate_based_dlofdma_monitor_cnt,
4401 ATH12K_HTT_NUM_AC_WMM, footer: "\n");
4402 len += print_array_to_buf(buf, offset: len, header: "chan_acc_lat_based_dlofdma_enabled_count",
4403 array: htt_stats_buf->chan_acc_lat_based_dlofdma_enabled_cnt,
4404 ATH12K_HTT_NUM_AC_WMM, footer: "\n");
4405 len += print_array_to_buf(buf, offset: len, header: "chan_acc_lat_based_dlofdma_disabled_count",
4406 array: htt_stats_buf->chan_acc_lat_based_dlofdma_disabled_cnt,
4407 ATH12K_HTT_NUM_AC_WMM, footer: "\n");
4408 len += print_array_to_buf(buf, offset: len, header: "chan_acc_lat_based_dlofdma_monitoring_count",
4409 array: htt_stats_buf->chan_acc_lat_based_dlofdma_monitor_cnt,
4410 ATH12K_HTT_NUM_AC_WMM, footer: "\n");
4411 len += print_array_to_buf(buf, offset: len, header: "downgrade_to_dl_su_ru_alloc_fail",
4412 array: htt_stats_buf->downgrade_to_dl_su_ru_alloc_fail,
4413 ATH12K_HTT_NUM_AC_WMM, footer: "\n");
4414 len += print_array_to_buf(buf, offset: len, header: "candidate_list_single_user_disable_ofdma",
4415 array: htt_stats_buf->candidate_list_single_user_disable_ofdma,
4416 ATH12K_HTT_NUM_AC_WMM, footer: "\n");
4417 len += print_array_to_buf(buf, offset: len, header: "dl_cand_list_dropped_high_ul_qos_weight",
4418 array: htt_stats_buf->dl_cand_list_dropped_high_ul_qos_weight,
4419 ATH12K_HTT_NUM_AC_WMM, footer: "\n");
4420 len += print_array_to_buf(buf, offset: len, header: "ax_dlofdma_disabled_due_to_pipelining",
4421 array: htt_stats_buf->ax_dlofdma_disabled_due_to_pipelining,
4422 ATH12K_HTT_NUM_AC_WMM, footer: "\n");
4423 len += print_array_to_buf(buf, offset: len, header: "dlofdma_disabled_su_only_eligible",
4424 array: htt_stats_buf->dlofdma_disabled_su_only_eligible,
4425 ATH12K_HTT_NUM_AC_WMM, footer: "\n");
4426 len += print_array_to_buf(buf, offset: len, header: "dlofdma_disabled_consec_no_mpdus_tried",
4427 array: htt_stats_buf->dlofdma_disabled_consec_no_mpdus_tried,
4428 ATH12K_HTT_NUM_AC_WMM, footer: "\n");
4429 len += print_array_to_buf(buf, offset: len, header: "dlofdma_disabled_consec_no_mpdus_success",
4430 array: htt_stats_buf->dlofdma_disabled_consec_no_mpdus_success,
4431 ATH12K_HTT_NUM_AC_WMM, footer: "\n\n");
4432
4433 stats_req->buf_len = len;
4434}
4435
4436static void
4437ath12k_htt_print_tx_pdev_rate_stats_be_ofdma_tlv(const void *tag_buf, u16 tag_len,
4438 struct debug_htt_stats_req *stats_req)
4439{
4440 const struct ath12k_htt_tx_pdev_rate_stats_be_ofdma_tlv *htt_stats_buf = tag_buf;
4441 u8 *buf = stats_req->buf;
4442 u32 len = stats_req->buf_len;
4443 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
4444 u32 mac_id_word;
4445 u8 i;
4446
4447 if (tag_len < sizeof(*htt_stats_buf))
4448 return;
4449
4450 mac_id_word = le32_to_cpu(htt_stats_buf->mac_id__word);
4451
4452 len += scnprintf(buf: buf + len, size: buf_len - len,
4453 fmt: "HTT_TX_PDEV_RATE_STATS_BE_OFDMA_TLV:\n");
4454 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mac_id = %u\n",
4455 u32_get_bits(v: mac_id_word, ATH12K_HTT_STATS_MAC_ID));
4456 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_ofdma_tx_ldpc = %u\n",
4457 le32_to_cpu(htt_stats_buf->be_ofdma_tx_ldpc));
4458 len += print_array_to_buf(buf, offset: len, header: "be_ofdma_tx_mcs",
4459 array: htt_stats_buf->be_ofdma_tx_mcs,
4460 ATH12K_HTT_TX_PDEV_NUM_BE_MCS_CNTRS, footer: "\n");
4461 len += print_array_to_buf(buf, offset: len, header: "be_ofdma_eht_sig_mcs",
4462 array: htt_stats_buf->be_ofdma_eht_sig_mcs,
4463 ATH12K_HTT_TX_PDEV_NUM_EHT_SIG_MCS_CNTRS, footer: "\n");
4464 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "be_ofdma_tx_ru_size = ");
4465 for (i = 0; i < ATH12K_HTT_TX_RX_PDEV_NUM_BE_RU_SIZE_CNTRS; i++)
4466 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %s:%u ",
4467 ath12k_htt_be_tx_rx_ru_size_to_str(ru_size: i),
4468 le32_to_cpu(htt_stats_buf->be_ofdma_tx_ru_size[i]));
4469 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4470 len += print_array_to_buf_index(buf, offset: len, header: "be_ofdma_tx_nss = ", stats_index: 1,
4471 array: htt_stats_buf->be_ofdma_tx_nss,
4472 ATH12K_HTT_PDEV_STAT_NUM_SPATIAL_STREAMS,
4473 footer: "\n");
4474 len += print_array_to_buf(buf, offset: len, header: "be_ofdma_tx_bw",
4475 array: htt_stats_buf->be_ofdma_tx_bw,
4476 ATH12K_HTT_TX_PDEV_NUM_BE_BW_CNTRS, footer: "\n");
4477 for (i = 0; i < ATH12K_HTT_TX_PDEV_NUM_GI_CNTRS; i++) {
4478 len += scnprintf(buf: buf + len, size: buf_len - len,
4479 fmt: "be_ofdma_tx_gi[%u]", i);
4480 len += print_array_to_buf(buf, offset: len, header: "", array: htt_stats_buf->gi[i],
4481 ATH12K_HTT_TX_PDEV_NUM_BE_MCS_CNTRS, footer: "\n");
4482 }
4483 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4484
4485 stats_req->buf_len = len;
4486}
4487
4488static void
4489ath12k_htt_print_pdev_mbssid_ctrl_frame_stats_tlv(const void *tag_buf, u16 tag_len,
4490 struct debug_htt_stats_req *stats_req)
4491{
4492 const struct ath12k_htt_pdev_mbssid_ctrl_frame_tlv *htt_stats_buf = tag_buf;
4493 u8 *buf = stats_req->buf;
4494 u32 len = stats_req->buf_len;
4495 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
4496 u32 mac_id_word;
4497
4498 if (tag_len < sizeof(*htt_stats_buf))
4499 return;
4500
4501 mac_id_word = le32_to_cpu(htt_stats_buf->mac_id__word);
4502
4503 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_MBSSID_CTRL_FRAME_STATS_TLV:\n");
4504 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mac_id = %u\n",
4505 u32_get_bits(v: mac_id_word, ATH12K_HTT_STATS_MAC_ID));
4506 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "basic_trigger_across_bss = %u\n",
4507 le32_to_cpu(htt_stats_buf->basic_trigger_across_bss));
4508 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "basic_trigger_within_bss = %u\n",
4509 le32_to_cpu(htt_stats_buf->basic_trigger_within_bss));
4510 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "bsr_trigger_across_bss = %u\n",
4511 le32_to_cpu(htt_stats_buf->bsr_trigger_across_bss));
4512 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "bsr_trigger_within_bss = %u\n",
4513 le32_to_cpu(htt_stats_buf->bsr_trigger_within_bss));
4514 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mu_rts_across_bss = %u\n",
4515 le32_to_cpu(htt_stats_buf->mu_rts_across_bss));
4516 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mu_rts_within_bss = %u\n",
4517 le32_to_cpu(htt_stats_buf->mu_rts_within_bss));
4518 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ul_mumimo_trigger_across_bss = %u\n",
4519 le32_to_cpu(htt_stats_buf->ul_mumimo_trigger_across_bss));
4520 len += scnprintf(buf: buf + len, size: buf_len - len,
4521 fmt: "ul_mumimo_trigger_within_bss = %u\n\n",
4522 le32_to_cpu(htt_stats_buf->ul_mumimo_trigger_within_bss));
4523
4524 stats_req->buf_len = len;
4525}
4526
4527static inline void
4528ath12k_htt_print_tx_pdev_rate_stats_tlv(const void *tag_buf, u16 tag_len,
4529 struct debug_htt_stats_req *stats_req)
4530{
4531 const struct ath12k_htt_tx_pdev_rate_stats_tlv *htt_stats_buf = tag_buf;
4532 u8 *buf = stats_req->buf;
4533 u32 len = stats_req->buf_len;
4534 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
4535 u8 i, j;
4536 u32 mac_id_word;
4537
4538 if (tag_len < sizeof(*htt_stats_buf))
4539 return;
4540
4541 mac_id_word = le32_to_cpu(htt_stats_buf->mac_id_word);
4542
4543 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_TX_PDEV_RATE_STATS_TLV:\n");
4544 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mac_id = %u\n",
4545 u32_get_bits(v: mac_id_word, ATH12K_HTT_STATS_MAC_ID));
4546 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_ldpc = %u\n",
4547 le32_to_cpu(htt_stats_buf->tx_ldpc));
4548 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ac_mu_mimo_tx_ldpc = %u\n",
4549 le32_to_cpu(htt_stats_buf->ac_mu_mimo_tx_ldpc));
4550 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ax_mu_mimo_tx_ldpc = %u\n",
4551 le32_to_cpu(htt_stats_buf->ax_mu_mimo_tx_ldpc));
4552 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ofdma_tx_ldpc = %u\n",
4553 le32_to_cpu(htt_stats_buf->ofdma_tx_ldpc));
4554 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rts_cnt = %u\n",
4555 le32_to_cpu(htt_stats_buf->rts_cnt));
4556 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rts_success = %u\n",
4557 le32_to_cpu(htt_stats_buf->rts_success));
4558 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ack_rssi = %u\n",
4559 le32_to_cpu(htt_stats_buf->ack_rssi));
4560 len += scnprintf(buf: buf + len, size: buf_len - len,
4561 fmt: "Legacy CCK Rates: 1 Mbps: %u, 2 Mbps: %u, 5.5 Mbps: %u, 12 Mbps: %u\n",
4562 le32_to_cpu(htt_stats_buf->tx_legacy_cck_rate[0]),
4563 le32_to_cpu(htt_stats_buf->tx_legacy_cck_rate[1]),
4564 le32_to_cpu(htt_stats_buf->tx_legacy_cck_rate[2]),
4565 le32_to_cpu(htt_stats_buf->tx_legacy_cck_rate[3]));
4566 len += scnprintf(buf: buf + len, size: buf_len - len,
4567 fmt: "Legacy OFDM Rates: 6 Mbps: %u, 9 Mbps: %u, 12 Mbps: %u, 18 Mbps: %u\n"
4568 " 24 Mbps: %u, 36 Mbps: %u, 48 Mbps: %u, 54 Mbps: %u\n",
4569 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[0]),
4570 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[1]),
4571 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[2]),
4572 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[3]),
4573 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[4]),
4574 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[5]),
4575 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[6]),
4576 le32_to_cpu(htt_stats_buf->tx_legacy_ofdm_rate[7]));
4577 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HE LTF: 1x: %u, 2x: %u, 4x: %u\n",
4578 le32_to_cpu(htt_stats_buf->tx_he_ltf[1]),
4579 le32_to_cpu(htt_stats_buf->tx_he_ltf[2]),
4580 le32_to_cpu(htt_stats_buf->tx_he_ltf[3]));
4581
4582 len += print_array_to_buf(buf, offset: len, header: "tx_mcs", array: htt_stats_buf->tx_mcs,
4583 ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, NULL);
4584 for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; j++)
4585 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: ", %u:%u",
4586 j + ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,
4587 le32_to_cpu(htt_stats_buf->tx_mcs_ext[j]));
4588 for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA2_MCS_COUNTERS; j++)
4589 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: ", %u:%u",
4590 j + ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS +
4591 ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA2_MCS_COUNTERS,
4592 le32_to_cpu(htt_stats_buf->tx_mcs_ext_2[j]));
4593 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4594
4595 len += print_array_to_buf(buf, offset: len, header: "ax_mu_mimo_tx_mcs",
4596 array: htt_stats_buf->ax_mu_mimo_tx_mcs,
4597 ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, NULL);
4598 for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; j++)
4599 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: ", %u:%u",
4600 j + ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,
4601 le32_to_cpu(htt_stats_buf->ax_mu_mimo_tx_mcs_ext[j]));
4602 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4603
4604 len += print_array_to_buf(buf, offset: len, header: "ofdma_tx_mcs",
4605 array: htt_stats_buf->ofdma_tx_mcs,
4606 ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, NULL);
4607 for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; j++)
4608 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: ", %u:%u",
4609 j + ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,
4610 le32_to_cpu(htt_stats_buf->ofdma_tx_mcs_ext[j]));
4611 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4612
4613 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_nss =");
4614 for (j = 1; j <= ATH12K_HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++)
4615 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u,",
4616 j, le32_to_cpu(htt_stats_buf->tx_nss[j - 1]));
4617 len--;
4618 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4619
4620 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ac_mu_mimo_tx_nss =");
4621 for (j = 1; j <= ATH12K_HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++)
4622 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u,",
4623 j, le32_to_cpu(htt_stats_buf->ac_mu_mimo_tx_nss[j - 1]));
4624 len--;
4625 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4626
4627 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ax_mu_mimo_tx_nss =");
4628 for (j = 1; j <= ATH12K_HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++)
4629 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u,",
4630 j, le32_to_cpu(htt_stats_buf->ax_mu_mimo_tx_nss[j - 1]));
4631 len--;
4632 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4633
4634 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ofdma_tx_nss =");
4635 for (j = 1; j <= ATH12K_HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++)
4636 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: " %u:%u,",
4637 j, le32_to_cpu(htt_stats_buf->ofdma_tx_nss[j - 1]));
4638 len--;
4639 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4640
4641 len += print_array_to_buf(buf, offset: len, header: "tx_bw", array: htt_stats_buf->tx_bw,
4642 ATH12K_HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, NULL);
4643 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: ", %u:%u\n",
4644 ATH12K_HTT_TX_PDEV_STATS_NUM_BW_COUNTERS,
4645 le32_to_cpu(htt_stats_buf->tx_bw_320mhz));
4646
4647 len += print_array_to_buf(buf, offset: len, header: "tx_stbc",
4648 array: htt_stats_buf->tx_stbc,
4649 ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, NULL);
4650 for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; j++)
4651 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: ", %u:%u",
4652 j + ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,
4653 le32_to_cpu(htt_stats_buf->tx_stbc_ext[j]));
4654 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4655
4656 for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
4657 len += scnprintf(buf: buf + len, size: (buf_len - len),
4658 fmt: "tx_gi[%u] =", j);
4659 len += print_array_to_buf(buf, offset: len, NULL, array: htt_stats_buf->tx_gi[j],
4660 ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,
4661 NULL);
4662 for (i = 0; i < ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++)
4663 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: ", %u:%u",
4664 i + ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,
4665 le32_to_cpu(htt_stats_buf->tx_gi_ext[j][i]));
4666 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4667 }
4668
4669 for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
4670 len += scnprintf(buf: buf + len, size: (buf_len - len),
4671 fmt: "ac_mu_mimo_tx_gi[%u] =", j);
4672 len += print_array_to_buf(buf, offset: len, NULL,
4673 array: htt_stats_buf->ac_mu_mimo_tx_gi[j],
4674 ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,
4675 footer: "\n");
4676 }
4677
4678 for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
4679 len += scnprintf(buf: buf + len, size: (buf_len - len),
4680 fmt: "ax_mu_mimo_tx_gi[%u] =", j);
4681 len += print_array_to_buf(buf, offset: len, NULL, array: htt_stats_buf->ax_mimo_tx_gi[j],
4682 ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,
4683 NULL);
4684 for (i = 0; i < ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++)
4685 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: ", %u:%u",
4686 i + ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,
4687 le32_to_cpu(htt_stats_buf->ax_tx_gi_ext[j][i]));
4688 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4689 }
4690
4691 for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
4692 len += scnprintf(buf: buf + len, size: (buf_len - len),
4693 fmt: "ofdma_tx_gi[%u] = ", j);
4694 len += print_array_to_buf(buf, offset: len, NULL, array: htt_stats_buf->ofdma_tx_gi[j],
4695 ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,
4696 NULL);
4697 for (i = 0; i < ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++)
4698 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: ", %u:%u",
4699 i + ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,
4700 le32_to_cpu(htt_stats_buf->ofd_tx_gi_ext[j][i]));
4701 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4702 }
4703
4704 len += print_array_to_buf(buf, offset: len, header: "tx_su_mcs", array: htt_stats_buf->tx_su_mcs,
4705 ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, footer: "\n");
4706 len += print_array_to_buf(buf, offset: len, header: "tx_mu_mcs", array: htt_stats_buf->tx_mu_mcs,
4707 ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, footer: "\n");
4708 len += print_array_to_buf(buf, offset: len, header: "ac_mu_mimo_tx_mcs",
4709 array: htt_stats_buf->ac_mu_mimo_tx_mcs,
4710 ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, footer: "\n");
4711 len += print_array_to_buf(buf, offset: len, header: "ac_mu_mimo_tx_bw",
4712 array: htt_stats_buf->ac_mu_mimo_tx_bw,
4713 ATH12K_HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, footer: "\n");
4714 len += print_array_to_buf(buf, offset: len, header: "ax_mu_mimo_tx_bw",
4715 array: htt_stats_buf->ax_mu_mimo_tx_bw,
4716 ATH12K_HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, footer: "\n");
4717 len += print_array_to_buf(buf, offset: len, header: "ofdma_tx_bw",
4718 array: htt_stats_buf->ofdma_tx_bw,
4719 ATH12K_HTT_TX_PDEV_STATS_NUM_BW_COUNTERS, footer: "\n");
4720 len += print_array_to_buf(buf, offset: len, header: "tx_pream", array: htt_stats_buf->tx_pream,
4721 ATH12K_HTT_TX_PDEV_STATS_NUM_PREAMBLE_TYPES, footer: "\n");
4722 len += print_array_to_buf(buf, offset: len, header: "tx_dcm", array: htt_stats_buf->tx_dcm,
4723 ATH12K_HTT_TX_PDEV_STATS_NUM_DCM_COUNTERS, footer: "\n\n");
4724
4725 stats_req->buf_len = len;
4726}
4727
4728static void
4729ath12k_htt_print_histogram_stats_tlv(const void *tag_buf, u16 tag_len,
4730 struct debug_htt_stats_req *stats_req)
4731{
4732 const struct ath12k_htt_tx_histogram_stats_tlv *stats_buf = tag_buf;
4733 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
4734 u32 len = stats_req->buf_len;
4735 u8 *buf = stats_req->buf;
4736
4737 if (tag_len < sizeof(*stats_buf))
4738 return;
4739
4740 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "low_latency_rate_cnt = %u\n",
4741 le32_to_cpu(stats_buf->low_latency_rate_cnt));
4742 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "su_burst_rate_drop_cnt = %u\n",
4743 le32_to_cpu(stats_buf->su_burst_rate_drop_cnt));
4744 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "su_burst_rate_drop_fail_cnt = %u\n",
4745 le32_to_cpu(stats_buf->su_burst_rate_drop_fail_cnt));
4746 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rate_retry_mcs_drop_cnt = %u\n",
4747 le32_to_cpu(stats_buf->rate_retry_mcs_drop_cnt));
4748
4749 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\nPER_HISTOGRAM_STATS\n");
4750 len += print_array_to_buf(buf, offset: len, header: "mcs_drop_rate", array: stats_buf->mcs_drop_rate,
4751 ATH12K_HTT_TX_PDEV_STATS_NUM_MCS_DROP_COUNTERS, footer: "\n");
4752 len += print_array_to_buf(buf, offset: len, header: "per_histogram_count",
4753 array: stats_buf->per_histogram_cnt,
4754 ATH12K_HTT_TX_PDEV_STATS_NUM_PER_COUNTERS, footer: "\n\n");
4755
4756 stats_req->buf_len = len;
4757}
4758
4759static inline void
4760ath12k_htt_print_rx_pdev_rate_stats_tlv(const void *tag_buf, u16 tag_len,
4761 struct debug_htt_stats_req *stats_req)
4762{
4763 const struct ath12k_htt_rx_pdev_rate_stats_tlv *htt_stats_buf = tag_buf;
4764 u8 *buf = stats_req->buf;
4765 u32 len = stats_req->buf_len;
4766 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
4767 u8 i, j;
4768 u32 mac_id_word;
4769
4770 if (tag_len < sizeof(*htt_stats_buf))
4771 return;
4772
4773 mac_id_word = le32_to_cpu(htt_stats_buf->mac_id_word);
4774
4775 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_RX_PDEV_RATE_STATS_TLV:\n");
4776 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mac_id = %u\n",
4777 u32_get_bits(v: mac_id_word, ATH12K_HTT_STATS_MAC_ID));
4778 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "nsts = %u\n",
4779 le32_to_cpu(htt_stats_buf->nsts));
4780 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_ldpc = %u\n",
4781 le32_to_cpu(htt_stats_buf->rx_ldpc));
4782 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rts_cnt = %u\n",
4783 le32_to_cpu(htt_stats_buf->rts_cnt));
4784 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rssi_mgmt = %u\n",
4785 le32_to_cpu(htt_stats_buf->rssi_mgmt));
4786 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rssi_data = %u\n",
4787 le32_to_cpu(htt_stats_buf->rssi_data));
4788 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rssi_comb = %u\n",
4789 le32_to_cpu(htt_stats_buf->rssi_comb));
4790 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rssi_in_dbm = %d\n",
4791 le32_to_cpu(htt_stats_buf->rssi_in_dbm));
4792 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_evm_nss_count = %u\n",
4793 le32_to_cpu(htt_stats_buf->nss_count));
4794 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_evm_pilot_count = %u\n",
4795 le32_to_cpu(htt_stats_buf->pilot_count));
4796 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_11ax_su_ext = %u\n",
4797 le32_to_cpu(htt_stats_buf->rx_11ax_su_ext));
4798 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_11ac_mumimo = %u\n",
4799 le32_to_cpu(htt_stats_buf->rx_11ac_mumimo));
4800 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_11ax_mumimo = %u\n",
4801 le32_to_cpu(htt_stats_buf->rx_11ax_mumimo));
4802 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_11ax_ofdma = %u\n",
4803 le32_to_cpu(htt_stats_buf->rx_11ax_ofdma));
4804 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "txbf = %u\n",
4805 le32_to_cpu(htt_stats_buf->txbf));
4806 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_su_ndpa = %u\n",
4807 le32_to_cpu(htt_stats_buf->rx_su_ndpa));
4808 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_mu_ndpa = %u\n",
4809 le32_to_cpu(htt_stats_buf->rx_mu_ndpa));
4810 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_br_poll = %u\n",
4811 le32_to_cpu(htt_stats_buf->rx_br_poll));
4812 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_active_dur_us_low = %u\n",
4813 le32_to_cpu(htt_stats_buf->rx_active_dur_us_low));
4814 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_active_dur_us_high = %u\n",
4815 le32_to_cpu(htt_stats_buf->rx_active_dur_us_high));
4816 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_11ax_ul_ofdma = %u\n",
4817 le32_to_cpu(htt_stats_buf->rx_11ax_ul_ofdma));
4818 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ul_ofdma_rx_stbc = %u\n",
4819 le32_to_cpu(htt_stats_buf->ul_ofdma_rx_stbc));
4820 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ul_ofdma_rx_ldpc = %u\n",
4821 le32_to_cpu(htt_stats_buf->ul_ofdma_rx_ldpc));
4822 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "per_chain_rssi_pkt_type = %#x\n",
4823 le32_to_cpu(htt_stats_buf->per_chain_rssi_pkt_type));
4824
4825 len += print_array_to_buf(buf, offset: len, header: "rx_nss", array: htt_stats_buf->rx_nss,
4826 ATH12K_HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS, footer: "\n");
4827 len += print_array_to_buf(buf, offset: len, header: "rx_dcm", array: htt_stats_buf->rx_dcm,
4828 ATH12K_HTT_RX_PDEV_STATS_NUM_DCM_COUNTERS, footer: "\n");
4829 len += print_array_to_buf(buf, offset: len, header: "rx_stbc", array: htt_stats_buf->rx_stbc,
4830 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, footer: "\n");
4831 len += print_array_to_buf(buf, offset: len, header: "rx_bw", array: htt_stats_buf->rx_bw,
4832 ATH12K_HTT_RX_PDEV_STATS_NUM_BW_COUNTERS, footer: "\n");
4833 len += print_array_to_buf(buf, offset: len, header: "rx_pream", array: htt_stats_buf->rx_pream,
4834 ATH12K_HTT_RX_PDEV_STATS_NUM_PREAMBLE_TYPES, footer: "\n");
4835 len += print_array_to_buf(buf, offset: len, header: "rx_11ax_su_txbf_mcs",
4836 array: htt_stats_buf->rx_11ax_su_txbf_mcs,
4837 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, footer: "\n");
4838 len += print_array_to_buf(buf, offset: len, header: "rx_11ax_mu_txbf_mcs",
4839 array: htt_stats_buf->rx_11ax_mu_txbf_mcs,
4840 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, footer: "\n");
4841 len += print_array_to_buf(buf, offset: len, header: "rx_legacy_cck_rate",
4842 array: htt_stats_buf->rx_legacy_cck_rate,
4843 ATH12K_HTT_RX_PDEV_STATS_NUM_LEGACY_CCK_STATS, footer: "\n");
4844 len += print_array_to_buf(buf, offset: len, header: "rx_legacy_ofdm_rate",
4845 array: htt_stats_buf->rx_legacy_ofdm_rate,
4846 ATH12K_HTT_RX_PDEV_STATS_NUM_LEGACY_OFDM_STATS, footer: "\n");
4847 len += print_array_to_buf(buf, offset: len, header: "ul_ofdma_rx_mcs",
4848 array: htt_stats_buf->ul_ofdma_rx_mcs,
4849 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, footer: "\n");
4850 len += print_array_to_buf(buf, offset: len, header: "ul_ofdma_rx_nss",
4851 array: htt_stats_buf->ul_ofdma_rx_nss,
4852 ATH12K_HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS, footer: "\n");
4853 len += print_array_to_buf(buf, offset: len, header: "ul_ofdma_rx_bw",
4854 array: htt_stats_buf->ul_ofdma_rx_bw,
4855 ATH12K_HTT_RX_PDEV_STATS_NUM_BW_COUNTERS, footer: "\n");
4856 len += print_array_to_buf(buf, offset: len, header: "rx_ulofdma_non_data_ppdu",
4857 array: htt_stats_buf->rx_ulofdma_non_data_ppdu,
4858 ATH12K_HTT_RX_PDEV_MAX_OFDMA_NUM_USER, footer: "\n");
4859 len += print_array_to_buf(buf, offset: len, header: "rx_ulofdma_data_ppdu",
4860 array: htt_stats_buf->rx_ulofdma_data_ppdu,
4861 ATH12K_HTT_RX_PDEV_MAX_OFDMA_NUM_USER, footer: "\n");
4862 len += print_array_to_buf(buf, offset: len, header: "rx_ulofdma_mpdu_ok",
4863 array: htt_stats_buf->rx_ulofdma_mpdu_ok,
4864 ATH12K_HTT_RX_PDEV_MAX_OFDMA_NUM_USER, footer: "\n");
4865 len += print_array_to_buf(buf, offset: len, header: "rx_ulofdma_mpdu_fail",
4866 array: htt_stats_buf->rx_ulofdma_mpdu_fail,
4867 ATH12K_HTT_RX_PDEV_MAX_OFDMA_NUM_USER, footer: "\n");
4868 len += print_array_to_buf(buf, offset: len, header: "rx_ulofdma_non_data_nusers",
4869 array: htt_stats_buf->rx_ulofdma_non_data_nusers,
4870 ATH12K_HTT_RX_PDEV_MAX_OFDMA_NUM_USER, footer: "\n");
4871 len += print_array_to_buf(buf, offset: len, header: "rx_ulofdma_data_nusers",
4872 array: htt_stats_buf->rx_ulofdma_data_nusers,
4873 ATH12K_HTT_RX_PDEV_MAX_OFDMA_NUM_USER, footer: "\n");
4874 len += print_array_to_buf(buf, offset: len, header: "rx_11ax_dl_ofdma_mcs",
4875 array: htt_stats_buf->rx_11ax_dl_ofdma_mcs,
4876 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, footer: "\n");
4877 len += print_array_to_buf(buf, offset: len, header: "rx_11ax_dl_ofdma_ru",
4878 array: htt_stats_buf->rx_11ax_dl_ofdma_ru,
4879 ATH12K_HTT_RX_PDEV_STATS_NUM_RU_SIZE_COUNTERS, footer: "\n");
4880 len += print_array_to_buf(buf, offset: len, header: "rx_ulmumimo_non_data_ppdu",
4881 array: htt_stats_buf->rx_ulmumimo_non_data_ppdu,
4882 ATH12K_HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER, footer: "\n");
4883 len += print_array_to_buf(buf, offset: len, header: "rx_ulmumimo_data_ppdu",
4884 array: htt_stats_buf->rx_ulmumimo_data_ppdu,
4885 ATH12K_HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER, footer: "\n");
4886 len += print_array_to_buf(buf, offset: len, header: "rx_ulmumimo_mpdu_ok",
4887 array: htt_stats_buf->rx_ulmumimo_mpdu_ok,
4888 ATH12K_HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER, footer: "\n");
4889 len += print_array_to_buf(buf, offset: len, header: "rx_ulmumimo_mpdu_fail",
4890 array: htt_stats_buf->rx_ulmumimo_mpdu_fail,
4891 ATH12K_HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER, footer: "\n");
4892
4893 len += print_array_to_buf(buf, offset: len, header: "rx_mcs",
4894 array: htt_stats_buf->rx_mcs,
4895 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, NULL);
4896 for (j = 0; j < ATH12K_HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; j++)
4897 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: ", %u:%u",
4898 j + ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS,
4899 le32_to_cpu(htt_stats_buf->rx_mcs_ext[j]));
4900 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4901
4902 for (j = 0; j < ATH12K_HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {
4903 len += scnprintf(buf: buf + len, size: buf_len - len,
4904 fmt: "pilot_evm_db[%u] =", j);
4905 len += print_array_to_buf(buf, offset: len, NULL,
4906 array: htt_stats_buf->rx_pil_evm_db[j],
4907 ATH12K_HTT_RX_PDEV_STATS_RXEVM_MAX_PILOTS_NSS,
4908 footer: "\n");
4909 }
4910
4911 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "pilot_evm_db_mean =");
4912 for (i = 0; i < ATH12K_HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++)
4913 len += scnprintf(buf: buf + len,
4914 size: buf_len - len,
4915 fmt: " %u:%d,", i,
4916 le32_to_cpu(htt_stats_buf->rx_pilot_evm_db_mean[i]));
4917 len--;
4918 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4919
4920 for (j = 0; j < ATH12K_HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {
4921 len += scnprintf(buf: buf + len, size: buf_len - len,
4922 fmt: "rssi_chain_in_db[%u] = ", j);
4923 for (i = 0; i < ATH12K_HTT_RX_PDEV_STATS_NUM_BW_COUNTERS; i++)
4924 len += scnprintf(buf: buf + len,
4925 size: buf_len - len,
4926 fmt: " %u: %d,", i,
4927 htt_stats_buf->rssi_chain_in_db[j][i]);
4928 len--;
4929 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4930 }
4931
4932 for (j = 0; j < ATH12K_HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
4933 len += scnprintf(buf: buf + len, size: buf_len - len,
4934 fmt: "rx_gi[%u] = ", j);
4935 len += print_array_to_buf(buf, offset: len, NULL,
4936 array: htt_stats_buf->rx_gi[j],
4937 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS,
4938 footer: "\n");
4939 }
4940
4941 for (j = 0; j < ATH12K_HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
4942 len += scnprintf(buf: buf + len, size: buf_len - len,
4943 fmt: "ul_ofdma_rx_gi[%u] = ", j);
4944 len += print_array_to_buf(buf, offset: len, NULL,
4945 array: htt_stats_buf->ul_ofdma_rx_gi[j],
4946 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS,
4947 footer: "\n");
4948 }
4949
4950 for (j = 0; j < ATH12K_HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {
4951 len += scnprintf(buf: buf + len, size: buf_len - len,
4952 fmt: "rx_ul_fd_rssi: nss[%u] = ", j);
4953 for (i = 0; i < ATH12K_HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++)
4954 len += scnprintf(buf: buf + len,
4955 size: buf_len - len,
4956 fmt: " %u:%d,",
4957 i, htt_stats_buf->rx_ul_fd_rssi[j][i]);
4958 len--;
4959 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4960 }
4961
4962 for (j = 0; j < ATH12K_HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS; j++) {
4963 len += scnprintf(buf: buf + len, size: buf_len - len,
4964 fmt: "rx_per_chain_rssi_in_dbm[%u] =", j);
4965 for (i = 0; i < ATH12K_HTT_RX_PDEV_STATS_NUM_BW_COUNTERS; i++)
4966 len += scnprintf(buf: buf + len,
4967 size: buf_len - len,
4968 fmt: " %u:%d,",
4969 i,
4970 htt_stats_buf->rx_per_chain_rssi_in_dbm[j][i]);
4971 len--;
4972 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
4973 }
4974
4975 stats_req->buf_len = len;
4976}
4977
4978static inline void
4979ath12k_htt_print_rx_pdev_rate_ext_stats_tlv(const void *tag_buf, u16 tag_len,
4980 struct debug_htt_stats_req *stats_req)
4981{
4982 const struct ath12k_htt_rx_pdev_rate_ext_stats_tlv *htt_stats_buf = tag_buf;
4983 u8 *buf = stats_req->buf;
4984 u32 len = stats_req->buf_len;
4985 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
4986 u8 j;
4987
4988 if (tag_len < sizeof(*htt_stats_buf))
4989 return;
4990
4991 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_RX_PDEV_RATE_EXT_STATS_TLV:\n");
4992 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rssi_mgmt_in_dbm = %d\n",
4993 le32_to_cpu(htt_stats_buf->rssi_mgmt_in_dbm));
4994
4995 len += print_array_to_buf(buf, offset: len, header: "rx_stbc_ext",
4996 array: htt_stats_buf->rx_stbc_ext,
4997 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT, footer: "\n");
4998 len += print_array_to_buf(buf, offset: len, header: "ul_ofdma_rx_mcs_ext",
4999 array: htt_stats_buf->ul_ofdma_rx_mcs_ext,
5000 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT, footer: "\n");
5001 len += print_array_to_buf(buf, offset: len, header: "rx_11ax_su_txbf_mcs_ext",
5002 array: htt_stats_buf->rx_11ax_su_txbf_mcs_ext,
5003 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT, footer: "\n");
5004 len += print_array_to_buf(buf, offset: len, header: "rx_11ax_mu_txbf_mcs_ext",
5005 array: htt_stats_buf->rx_11ax_mu_txbf_mcs_ext,
5006 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT, footer: "\n");
5007 len += print_array_to_buf(buf, offset: len, header: "rx_11ax_dl_ofdma_mcs_ext",
5008 array: htt_stats_buf->rx_11ax_dl_ofdma_mcs_ext,
5009 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT, footer: "\n");
5010 len += print_array_to_buf(buf, offset: len, header: "rx_bw_ext",
5011 array: htt_stats_buf->rx_bw_ext,
5012 ATH12K_HTT_RX_PDEV_STATS_NUM_BW_EXT2_COUNTERS, footer: "\n");
5013 len += print_array_to_buf(buf, offset: len, header: "rx_su_punctured_mode",
5014 array: htt_stats_buf->rx_su_punctured_mode,
5015 ATH12K_HTT_RX_PDEV_STATS_NUM_PUNCTURED_MODE_COUNTERS,
5016 footer: "\n");
5017
5018 len += print_array_to_buf(buf, offset: len, header: "rx_mcs_ext",
5019 array: htt_stats_buf->rx_mcs_ext,
5020 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT,
5021 NULL);
5022 for (j = 0; j < ATH12K_HTT_RX_PDEV_STATS_NUM_EXTRA2_MCS_COUNTERS; j++)
5023 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: ", %u:%u",
5024 j + ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT,
5025 le32_to_cpu(htt_stats_buf->rx_mcs_ext_2[j]));
5026 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
5027
5028 for (j = 0; j < ATH12K_HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
5029 len += scnprintf(buf: buf + len, size: buf_len - len,
5030 fmt: "rx_gi_ext[%u] = ", j);
5031 len += print_array_to_buf(buf, offset: len, NULL,
5032 array: htt_stats_buf->rx_gi_ext[j],
5033 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT,
5034 footer: "\n");
5035 }
5036
5037 for (j = 0; j < ATH12K_HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
5038 len += scnprintf(buf: buf + len, size: buf_len - len,
5039 fmt: "ul_ofdma_rx_gi_ext[%u] = ", j);
5040 len += print_array_to_buf(buf, offset: len, NULL,
5041 array: htt_stats_buf->ul_ofdma_rx_gi_ext[j],
5042 ATH12K_HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT,
5043 footer: "\n");
5044 }
5045
5046 stats_req->buf_len = len;
5047}
5048
5049static void
5050ath12k_htt_print_pdev_tdma_stats_tlv(const void *tag_buf, u16 tag_len,
5051 struct debug_htt_stats_req *stats_req)
5052{
5053 const struct ath12k_htt_pdev_tdma_stats_tlv *htt_stats_buf = tag_buf;
5054 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
5055 u32 len = stats_req->buf_len;
5056 u8 *buf = stats_req->buf;
5057 u32 mac_id_word;
5058
5059 if (tag_len < sizeof(*htt_stats_buf))
5060 return;
5061
5062 mac_id_word = le32_to_cpu(htt_stats_buf->mac_id__word);
5063
5064 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_PDEV_TDMA_STATS_TLV:\n");
5065 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mac_id = %u\n",
5066 u32_get_bits(v: mac_id_word, ATH12K_HTT_STATS_MAC_ID));
5067 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_tdma_active_schedules = %u\n",
5068 le32_to_cpu(htt_stats_buf->num_tdma_active_schedules));
5069 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_tdma_reserved_schedules = %u\n",
5070 le32_to_cpu(htt_stats_buf->num_tdma_reserved_schedules));
5071 len += scnprintf(buf: buf + len, size: buf_len - len,
5072 fmt: "num_tdma_restricted_schedules = %u\n",
5073 le32_to_cpu(htt_stats_buf->num_tdma_restricted_schedules));
5074 len += scnprintf(buf: buf + len, size: buf_len - len,
5075 fmt: "num_tdma_unconfigured_schedules = %u\n",
5076 le32_to_cpu(htt_stats_buf->num_tdma_unconfigured_schedules));
5077 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_tdma_slot_switches = %u\n",
5078 le32_to_cpu(htt_stats_buf->num_tdma_slot_switches));
5079 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_tdma_edca_switches = %u\n\n",
5080 le32_to_cpu(htt_stats_buf->num_tdma_edca_switches));
5081
5082 stats_req->buf_len = len;
5083}
5084
5085static void
5086ath12k_htt_print_mlo_sched_stats_tlv(const void *tag_buf, u16 tag_len,
5087 struct debug_htt_stats_req *stats_req)
5088{
5089 const struct ath12k_htt_mlo_sched_stats_tlv *stats_buf = tag_buf;
5090 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
5091 u32 len = stats_req->buf_len;
5092 u8 *buf = stats_req->buf;
5093
5094 if (tag_len < sizeof(*stats_buf))
5095 return;
5096
5097 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_STATS_MLO_SCHED_STATS:\n");
5098 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_sec_link_sched = %u\n",
5099 le32_to_cpu(stats_buf->pref_link_num_sec_link_sched));
5100 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_pref_link_timeout = %u\n",
5101 le32_to_cpu(stats_buf->pref_link_num_pref_link_timeout));
5102 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_pref_link_sch_delay_ipc = %u\n",
5103 le32_to_cpu(stats_buf->pref_link_num_pref_link_sch_delay_ipc));
5104 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_pref_link_timeout_ipc = %u\n\n",
5105 le32_to_cpu(stats_buf->pref_link_num_pref_link_timeout_ipc));
5106
5107 stats_req->buf_len = len;
5108}
5109
5110static void
5111ath12k_htt_print_mlo_ipc_stats_tlv(const void *tag_buf, u16 tag_len,
5112 struct debug_htt_stats_req *stats_req)
5113{
5114 const struct ath12k_htt_pdev_mlo_ipc_stats_tlv *stats_buf = tag_buf;
5115 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
5116 u32 len = stats_req->buf_len;
5117 u8 *buf = stats_req->buf;
5118 u8 i, j;
5119
5120 if (tag_len < sizeof(*stats_buf))
5121 return;
5122
5123 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_STATS_MLO_IPC_STATS:\n");
5124 for (i = 0; i < ATH12K_HTT_HWMLO_MAX_LINKS; i++) {
5125 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "src_link: %u\n", i);
5126 for (j = 0; j < ATH12K_HTT_MLO_MAX_IPC_RINGS; j++)
5127 len += scnprintf(buf: buf + len, size: buf_len - len,
5128 fmt: "mlo_ipc_ring_full_cnt[%u]: %u\n", j,
5129 le32_to_cpu(stats_buf->mlo_ipc_ring_cnt[i][j]));
5130 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "\n");
5131 }
5132
5133 stats_req->buf_len = len;
5134}
5135
5136static void
5137ath12k_htt_print_pdev_rtt_resp_stats_tlv(const void *tag_buf, u16 tag_len,
5138 struct debug_htt_stats_req *stats_req)
5139{
5140 const struct ath12k_htt_stats_pdev_rtt_resp_stats_tlv *sbuf = tag_buf;
5141 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
5142 u32 len = stats_req->buf_len;
5143 u8 *buf = stats_req->buf;
5144
5145 if (tag_len < sizeof(*sbuf))
5146 return;
5147
5148 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_PDEV_RTT_RESP_STATS_TLV:\n");
5149 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "pdev_id = %u\n",
5150 le32_to_cpu(sbuf->pdev_id));
5151 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_11mc_ftm_suc = %u\n",
5152 le32_to_cpu(sbuf->tx_11mc_ftm_suc));
5153 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_11mc_ftm_suc_retry = %u\n",
5154 le32_to_cpu(sbuf->tx_11mc_ftm_suc_retry));
5155 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_11mc_ftm_fail = %u\n",
5156 le32_to_cpu(sbuf->tx_11mc_ftm_fail));
5157 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_11mc_ftmr_cnt = %u\n",
5158 le32_to_cpu(sbuf->rx_11mc_ftmr_cnt));
5159 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_11mc_ftmr_dup_cnt = %u\n",
5160 le32_to_cpu(sbuf->rx_11mc_ftmr_dup_cnt));
5161 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_11mc_iftmr_cnt = %u\n",
5162 le32_to_cpu(sbuf->rx_11mc_iftmr_cnt));
5163 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_11mc_iftmr_dup_cnt = %u\n",
5164 le32_to_cpu(sbuf->rx_11mc_iftmr_dup_cnt));
5165 len += scnprintf(buf: buf + len, size: buf_len - len,
5166 fmt: "ftmr_drop_11mc_resp_role_not_enabled_cnt = %u\n",
5167 le32_to_cpu(sbuf->ftmr_drop_11mc_resp_role_not_enabled_cnt));
5168 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_11az_ftm_successful = %u\n",
5169 le32_to_cpu(sbuf->tx_11az_ftm_successful));
5170 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_11az_ftm_failed = %u\n",
5171 le32_to_cpu(sbuf->tx_11az_ftm_failed));
5172 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_11az_ftmr_cnt = %u\n",
5173 le32_to_cpu(sbuf->rx_11az_ftmr_cnt));
5174 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_11az_ftmr_dup_cnt = %u\n",
5175 le32_to_cpu(sbuf->rx_11az_ftmr_dup_cnt));
5176 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_11az_iftmr_dup_cnt = %u\n",
5177 le32_to_cpu(sbuf->rx_11az_iftmr_dup_cnt));
5178 len += scnprintf(buf: buf + len, size: buf_len - len,
5179 fmt: "initiator_active_responder_rejected_cnt = %u\n",
5180 le32_to_cpu(sbuf->initiator_active_responder_rejected_cnt));
5181 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "malformed_ftmr = %u\n",
5182 le32_to_cpu(sbuf->malformed_ftmr));
5183 len += scnprintf(buf: buf + len, size: buf_len - len,
5184 fmt: "ftmr_drop_ntb_resp_role_not_enabled_cnt = %u\n",
5185 le32_to_cpu(sbuf->ftmr_drop_ntb_resp_role_not_enabled_cnt));
5186 len += scnprintf(buf: buf + len, size: buf_len - len,
5187 fmt: "ftmr_drop_tb_resp_role_not_enabled_cnt = %u\n",
5188 le32_to_cpu(sbuf->ftmr_drop_tb_resp_role_not_enabled_cnt));
5189 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "responder_alloc_cnt = %u\n",
5190 le32_to_cpu(sbuf->responder_alloc_cnt));
5191 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "responder_alloc_failure = %u\n",
5192 le32_to_cpu(sbuf->responder_alloc_failure));
5193 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "responder_terminate_cnt = %u\n",
5194 le32_to_cpu(sbuf->responder_terminate_cnt));
5195 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "active_rsta_open = %u\n",
5196 le32_to_cpu(sbuf->active_rsta_open));
5197 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "active_rsta_mac = %u\n",
5198 le32_to_cpu(sbuf->active_rsta_mac));
5199 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "active_rsta_mac_phy = %u\n",
5200 le32_to_cpu(sbuf->active_rsta_mac_phy));
5201 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "pn_check_failure_cnt = %u\n",
5202 le32_to_cpu(sbuf->pn_check_failure_cnt));
5203 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_assoc_ranging_peers = %u\n",
5204 le32_to_cpu(sbuf->num_assoc_ranging_peers));
5205 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_unassoc_ranging_peers = %u\n",
5206 le32_to_cpu(sbuf->num_unassoc_ranging_peers));
5207 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "pasn_m1_auth_recv_cnt = %u\n",
5208 le32_to_cpu(sbuf->pasn_m1_auth_recv_cnt));
5209 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "pasn_m1_auth_drop_cnt = %u\n",
5210 le32_to_cpu(sbuf->pasn_m1_auth_drop_cnt));
5211 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "pasn_m2_auth_recv_cnt = %u\n",
5212 le32_to_cpu(sbuf->pasn_m2_auth_recv_cnt));
5213 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "pasn_m2_auth_tx_fail_cnt = %u\n",
5214 le32_to_cpu(sbuf->pasn_m2_auth_tx_fail_cnt));
5215 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "pasn_m3_auth_recv_cnt = %u\n",
5216 le32_to_cpu(sbuf->pasn_m3_auth_recv_cnt));
5217 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "pasn_m3_auth_drop_cnt = %u\n",
5218 le32_to_cpu(sbuf->pasn_m3_auth_drop_cnt));
5219 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "pasn_peer_create_request_cnt = %u\n",
5220 le32_to_cpu(sbuf->pasn_peer_create_request_cnt));
5221 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "pasn_peer_created_cnt = %u\n",
5222 le32_to_cpu(sbuf->pasn_peer_created_cnt));
5223 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "pasn_peer_create_timeout_cnt = %u\n",
5224 le32_to_cpu(sbuf->pasn_peer_create_timeout_cnt));
5225 len += scnprintf(buf: buf + len, size: buf_len - len,
5226 fmt: "sec_ranging_not_supported_mfp_not_setup = %u\n",
5227 le32_to_cpu(sbuf->sec_ranging_not_supported_mfp_not_setup));
5228 len += scnprintf(buf: buf + len, size: buf_len - len,
5229 fmt: "non_sec_ranging_discarded_for_assoc_peer_with_mfpr_set = %u\n",
5230 le32_to_cpu(sbuf->non_sec_ranging_discarded_for_assoc_peer));
5231 len += scnprintf(buf: buf + len, size: buf_len - len,
5232 fmt: "open_ranging_discarded_with_URNM_MFPR_set_for_pasn_peer = %u\n",
5233 le32_to_cpu(sbuf->open_ranging_discarded_set_for_pasn_peer));
5234 len += scnprintf(buf: buf + len, size: buf_len - len,
5235 fmt: "unassoc_non_pasn_ranging_not_supported_with_URNM_MFPR = %u\n",
5236 le32_to_cpu(sbuf->unassoc_non_pasn_ranging_not_supported));
5237 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "invalid_ftm_request_params = %u\n",
5238 le32_to_cpu(sbuf->invalid_ftm_request_params));
5239 len += scnprintf(buf: buf + len, size: buf_len - len,
5240 fmt: "requested_bw_format_not_supported = %u\n",
5241 le32_to_cpu(sbuf->requested_bw_format_not_supported));
5242 len += scnprintf(buf: buf + len, size: buf_len - len,
5243 fmt: "ntb_unsec_unassoc_mode_ranging_peer_alloc_failed = %u\n",
5244 le32_to_cpu(sbuf->ntb_unsec_unassoc_ranging_peer_alloc_failed));
5245 len += scnprintf(buf: buf + len, size: buf_len - len,
5246 fmt: "tb_unassoc_unsec_mode_pasn_peer_creation_failed = %u\n",
5247 le32_to_cpu(sbuf->tb_unassoc_unsec_pasn_peer_creation_failed));
5248 len += scnprintf(buf: buf + len, size: buf_len - len,
5249 fmt: "num_ranging_sequences_processed = %u\n",
5250 le32_to_cpu(sbuf->num_ranging_sequences_processed));
5251 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ndp_rx_cnt = %u\n",
5252 le32_to_cpu(sbuf->ndp_rx_cnt));
5253 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_req_bw_20_MHz = %u\n",
5254 le32_to_cpu(sbuf->num_req_bw_20_mhz));
5255 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_req_bw_40_MHz = %u\n",
5256 le32_to_cpu(sbuf->num_req_bw_40_mhz));
5257 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_req_bw_80_MHz = %u\n",
5258 le32_to_cpu(sbuf->num_req_bw_80_mhz));
5259 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_req_bw_160_MHz = %u\n",
5260 le32_to_cpu(sbuf->num_req_bw_160_mhz));
5261 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ntb_tx_ndp = %u\n",
5262 le32_to_cpu(sbuf->ntb_tx_ndp));
5263 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_ntb_ranging_NDPAs_recv = %u\n",
5264 le32_to_cpu(sbuf->num_ntb_ranging_ndpas_recv));
5265 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "recv_lmr = %u\n",
5266 le32_to_cpu(sbuf->recv_lmr));
5267 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "invalid_ftmr_cnt = %u\n",
5268 le32_to_cpu(sbuf->invalid_ftmr_cnt));
5269 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "max_time_bw_meas_exp_cnt = %u\n\n",
5270 le32_to_cpu(sbuf->max_time_bw_meas_exp_cnt));
5271
5272 stats_req->buf_len = len;
5273}
5274
5275static void
5276ath12k_htt_print_pdev_rtt_init_stats_tlv(const void *tag_buf, u16 tag_len,
5277 struct debug_htt_stats_req *stats_req)
5278{
5279 const struct ath12k_htt_stats_pdev_rtt_init_stats_tlv *htt_stats_buf = tag_buf;
5280 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
5281 u32 len = stats_req->buf_len;
5282 u8 *buf = stats_req->buf, i;
5283 __le32 sch_fail;
5284
5285 if (tag_len < sizeof(*htt_stats_buf))
5286 return;
5287
5288 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_PDEV_RTT_INIT_STATS_TLV:\n");
5289 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "pdev_id = %u\n",
5290 le32_to_cpu(htt_stats_buf->pdev_id));
5291 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_11mc_ftmr_cnt = %u\n",
5292 le32_to_cpu(htt_stats_buf->tx_11mc_ftmr_cnt));
5293 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_11mc_ftmr_fail = %u\n",
5294 le32_to_cpu(htt_stats_buf->tx_11mc_ftmr_fail));
5295 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_11mc_ftmr_suc_retry = %u\n",
5296 le32_to_cpu(htt_stats_buf->tx_11mc_ftmr_suc_retry));
5297 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_11mc_ftm_cnt = %u\n",
5298 le32_to_cpu(htt_stats_buf->rx_11mc_ftm_cnt));
5299 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rx_11az_ftm_cnt = %u\n",
5300 le32_to_cpu(htt_stats_buf->rx_11az_ftm_cnt));
5301 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "initiator_terminate_cnt = %u\n",
5302 le32_to_cpu(htt_stats_buf->initiator_terminate_cnt));
5303 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_meas_req_count = %u\n",
5304 le32_to_cpu(htt_stats_buf->tx_meas_req_count));
5305 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_11az_ftmr_start = %u\n",
5306 le32_to_cpu(htt_stats_buf->tx_11az_ftmr_start));
5307 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_11az_ftmr_stop = %u\n",
5308 le32_to_cpu(htt_stats_buf->tx_11az_ftmr_stop));
5309 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tx_11az_ftmr_fail = %u\n",
5310 le32_to_cpu(htt_stats_buf->tx_11az_ftmr_fail));
5311 len += scnprintf(buf: buf + len, size: buf_len - len,
5312 fmt: "ftmr_tx_failed_null_11az_peer = %u\n",
5313 le32_to_cpu(htt_stats_buf->ftmr_tx_failed_null_11az_peer));
5314 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ftmr_retry_timeout = %u\n",
5315 le32_to_cpu(htt_stats_buf->ftmr_retry_timeout));
5316 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ftm_parse_failure = %u\n",
5317 le32_to_cpu(htt_stats_buf->ftm_parse_failure));
5318 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "incompatible_ftm_params = %u\n",
5319 le32_to_cpu(htt_stats_buf->incompatible_ftm_params));
5320 len += scnprintf(buf: buf + len, size: buf_len - len,
5321 fmt: "ranging_negotiation_successful_cnt = %u\n",
5322 le32_to_cpu(htt_stats_buf->ranging_negotiation_successful_cnt));
5323 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "active_ista = %u\n",
5324 le32_to_cpu(htt_stats_buf->active_ista));
5325 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "init_role_not_enabled = %u\n",
5326 le32_to_cpu(htt_stats_buf->init_role_not_enabled));
5327 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "invalid_preamble = %u\n",
5328 le32_to_cpu(htt_stats_buf->invalid_preamble));
5329 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "invalid_chan_bw_format = %u\n",
5330 le32_to_cpu(htt_stats_buf->invalid_chan_bw_format));
5331 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "mgmt_buff_alloc_fail_cnt = %u\n",
5332 le32_to_cpu(htt_stats_buf->mgmt_buff_alloc_fail_cnt));
5333 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "sec_ranging_req_in_open_mode = %u\n",
5334 le32_to_cpu(htt_stats_buf->sec_ranging_req_in_open_mode));
5335 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "max_time_bw_meas_exp_cnt = %u\n",
5336 le32_to_cpu(htt_stats_buf->max_time_bw_meas_exp_cnt));
5337 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_tb_ranging_requests = %u\n",
5338 le32_to_cpu(htt_stats_buf->num_tb_ranging_requests));
5339 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tb_meas_duration_expiry_cnt = %u\n",
5340 le32_to_cpu(htt_stats_buf->tb_meas_duration_expiry_cnt));
5341 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ntbr_triggered_successfully = %u\n",
5342 le32_to_cpu(htt_stats_buf->ntbr_triggered_successfully));
5343 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ntbr_trigger_failed = %u\n",
5344 le32_to_cpu(htt_stats_buf->ntbr_trigger_failed));
5345 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "invalid_or_no_vreg_idx = %u\n",
5346 le32_to_cpu(htt_stats_buf->invalid_or_no_vreg_idx));
5347 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "set_vreg_params_failed = %u\n",
5348 le32_to_cpu(htt_stats_buf->set_vreg_params_failed));
5349 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "sac_mismatch = %u\n",
5350 le32_to_cpu(htt_stats_buf->sac_mismatch));
5351 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "pasn_m1_auth_recv_cnt = %u\n",
5352 le32_to_cpu(htt_stats_buf->pasn_m1_auth_recv_cnt));
5353 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "pasn_m1_auth_tx_fail_cnt = %u\n",
5354 le32_to_cpu(htt_stats_buf->pasn_m1_auth_tx_fail_cnt));
5355 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "pasn_m2_auth_recv_cnt = %u\n",
5356 le32_to_cpu(htt_stats_buf->pasn_m2_auth_recv_cnt));
5357 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "pasn_m2_auth_drop_cnt = %u\n",
5358 le32_to_cpu(htt_stats_buf->pasn_m2_auth_drop_cnt));
5359 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "pasn_m3_auth_recv_cnt = %u\n",
5360 le32_to_cpu(htt_stats_buf->pasn_m3_auth_recv_cnt));
5361 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "pasn_m3_auth_tx_fail_cnt = %u\n",
5362 le32_to_cpu(htt_stats_buf->pasn_m3_auth_tx_fail_cnt));
5363 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "pasn_peer_create_request_cnt = %u\n",
5364 le32_to_cpu(htt_stats_buf->pasn_peer_create_request_cnt));
5365 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "pasn_peer_created_cnt = %u\n",
5366 le32_to_cpu(htt_stats_buf->pasn_peer_created_cnt));
5367 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "pasn_peer_create_timeout_cnt = %u\n",
5368 le32_to_cpu(htt_stats_buf->pasn_peer_create_timeout_cnt));
5369 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ntbr_ndpa_failed = %u\n",
5370 le32_to_cpu(htt_stats_buf->ntbr_ndpa_failed));
5371 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ntbr_sequence_successful = %u\n",
5372 le32_to_cpu(htt_stats_buf->ntbr_sequence_successful));
5373 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ntbr_ndp_failed = %u\n",
5374 le32_to_cpu(htt_stats_buf->ntbr_ndp_failed));
5375 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_tb_ranging_NDPAs_recv = %u\n",
5376 le32_to_cpu(htt_stats_buf->num_tb_ranging_ndpas_recv));
5377 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ndp_rx_cnt = %u\n",
5378 le32_to_cpu(htt_stats_buf->ndp_rx_cnt));
5379 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_trigger_frames_received = %u\n",
5380 le32_to_cpu(htt_stats_buf->num_trigger_frames_received));
5381 for (i = 0; i < (ATH12K_HTT_SCH_CMD_STATUS_CNT - 1); i++)
5382 len += scnprintf(buf: buf + len, size: buf_len - len,
5383 fmt: "num_sch_cmd_status_%d = %u\n", i,
5384 le32_to_cpu(htt_stats_buf->sch_cmd_status_cnts[i]));
5385 sch_fail = htt_stats_buf->sch_cmd_status_cnts[ATH12K_HTT_SCH_CMD_STATUS_CNT - 1];
5386 len += scnprintf(buf: buf + len, size: buf_len - len,
5387 fmt: "num_sch_cmd_status_other_failure = %u\n",
5388 le32_to_cpu(sch_fail));
5389 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "lmr_timeout = %u\n",
5390 le32_to_cpu(htt_stats_buf->lmr_timeout));
5391 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "lmr_recv = %u\n\n",
5392 le32_to_cpu(htt_stats_buf->lmr_recv));
5393
5394 stats_req->buf_len = len;
5395}
5396
5397static void
5398ath12k_htt_print_pdev_rtt_hw_stats_tlv(const void *tag_buf, u16 tag_len,
5399 struct debug_htt_stats_req *stats_req)
5400{
5401 const struct ath12k_htt_stats_pdev_rtt_hw_stats_tlv *htt_stats_buf = tag_buf;
5402 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
5403 u32 len = stats_req->buf_len;
5404 u8 *buf = stats_req->buf;
5405
5406 if (tag_len < sizeof(*htt_stats_buf))
5407 return;
5408
5409 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "HTT_STATS_PDEV_RTT_HW_STATS_TAG:\n");
5410 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ista_ranging_ndpa_cnt = %u\n",
5411 le32_to_cpu(htt_stats_buf->ista_ranging_ndpa_cnt));
5412 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ista_ranging_ndp_cnt = %u\n",
5413 le32_to_cpu(htt_stats_buf->ista_ranging_ndp_cnt));
5414 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "ista_ranging_i2r_lmr_cnt = %u\n",
5415 le32_to_cpu(htt_stats_buf->ista_ranging_i2r_lmr_cnt));
5416 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rtsa_ranging_resp_cnt = %u\n",
5417 le32_to_cpu(htt_stats_buf->rtsa_ranging_resp_cnt));
5418 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rtsa_ranging_ndp_cnt = %u\n",
5419 le32_to_cpu(htt_stats_buf->rtsa_ranging_ndp_cnt));
5420 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "rsta_ranging_lmr_cnt = %u\n",
5421 le32_to_cpu(htt_stats_buf->rsta_ranging_lmr_cnt));
5422 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tb_ranging_cts2s_rcvd_cnt = %u\n",
5423 le32_to_cpu(htt_stats_buf->tb_ranging_cts2s_rcvd_cnt));
5424 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tb_ranging_ndp_rcvd_cnt = %u\n",
5425 le32_to_cpu(htt_stats_buf->tb_ranging_ndp_rcvd_cnt));
5426 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "tb_ranging_lmr_rcvd_cnt = %u\n",
5427 le32_to_cpu(htt_stats_buf->tb_ranging_lmr_rcvd_cnt));
5428 len += scnprintf(buf: buf + len, size: buf_len - len,
5429 fmt: "tb_ranging_tf_poll_resp_sent_cnt = %u\n",
5430 le32_to_cpu(htt_stats_buf->tb_ranging_tf_poll_resp_sent_cnt));
5431 len += scnprintf(buf: buf + len, size: buf_len - len,
5432 fmt: "tb_ranging_tf_sound_resp_sent_cnt = %u\n",
5433 le32_to_cpu(htt_stats_buf->tb_ranging_tf_sound_resp_sent_cnt));
5434 len += scnprintf(buf: buf + len, size: buf_len - len,
5435 fmt: "tb_ranging_tf_report_resp_sent_cnt = %u\n\n",
5436 le32_to_cpu(htt_stats_buf->tb_ranging_tf_report_resp_sent_cnt));
5437
5438 stats_req->buf_len = len;
5439}
5440
5441static void
5442ath12k_htt_print_pdev_rtt_tbr_selfgen_queued_stats_tlv(const void *tag_buf, u16 tag_len,
5443 struct debug_htt_stats_req *req)
5444{
5445 const struct ath12k_htt_stats_pdev_rtt_tbr_tlv *sbuf = tag_buf;
5446 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
5447 u32 len = req->buf_len;
5448 u8 *buf = req->buf;
5449
5450 if (tag_len < sizeof(*sbuf))
5451 return;
5452
5453 len += scnprintf(buf: buf + len, size: buf_len - len,
5454 fmt: "HTT_STATS_PDEV_RTT_TBR_SELFGEN_QUEUED_STATS_TAG:\n");
5455 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "SU poll = %u\n",
5456 le32_to_cpu(sbuf->su_ftype[ATH12K_HTT_FTYPE_TF_POLL]));
5457 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "SU sound = %u\n",
5458 le32_to_cpu(sbuf->su_ftype[ATH12K_HTT_FTYPE_TF_SOUND]));
5459 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "SU NDPA = %u\n",
5460 le32_to_cpu(sbuf->su_ftype[ATH12K_HTT_FTYPE_TBR_NDPA]));
5461 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "SU NDP = %u\n",
5462 le32_to_cpu(sbuf->su_ftype[ATH12K_HTT_FTYPE_TBR_NDP]));
5463 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "SU LMR = %u\n",
5464 le32_to_cpu(sbuf->su_ftype[ATH12K_HTT_FTYPE_TBR_LMR]));
5465 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "SU TF_REPORT = %u\n",
5466 le32_to_cpu(sbuf->su_ftype[ATH12K_HTT_FTYPE_TF_RPRT]));
5467 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "MU poll = %u\n",
5468 le32_to_cpu(sbuf->mu_ftype[ATH12K_HTT_FTYPE_TF_POLL]));
5469 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "MU sound = %u\n",
5470 le32_to_cpu(sbuf->mu_ftype[ATH12K_HTT_FTYPE_TF_SOUND]));
5471 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "MU NDPA = %u\n",
5472 le32_to_cpu(sbuf->mu_ftype[ATH12K_HTT_FTYPE_TBR_NDPA]));
5473 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "MU NDP = %u\n",
5474 le32_to_cpu(sbuf->mu_ftype[ATH12K_HTT_FTYPE_TBR_NDP]));
5475 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "MU LMR = %u\n",
5476 le32_to_cpu(sbuf->mu_ftype[ATH12K_HTT_FTYPE_TBR_LMR]));
5477 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "MU TF_REPORT = %u\n\n",
5478 le32_to_cpu(sbuf->mu_ftype[ATH12K_HTT_FTYPE_TF_RPRT]));
5479
5480 req->buf_len = len;
5481}
5482
5483static void
5484ath12k_htt_print_pdev_rtt_tbr_cmd_res_stats_tlv(const void *tag_buf, u16 tag_len,
5485 struct debug_htt_stats_req *stats_req)
5486{
5487 const struct ath12k_htt_stats_pdev_rtt_tbr_cmd_result_stats_tlv *sbuf = tag_buf;
5488 u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
5489 u32 len = stats_req->buf_len;
5490 u8 *buf = stats_req->buf, i;
5491
5492 if (tag_len < sizeof(*sbuf))
5493 return;
5494
5495 len += scnprintf(buf: buf + len, size: buf_len - len,
5496 fmt: "HTT_STATS_PDEV_RTT_TBR_CMD_RESULT_STATS_TAG:\n");
5497 for (i = 0; i < le32_to_cpu(sbuf->tbr_num_sch_cmd_result_buckets); i++) {
5498 len += scnprintf(buf: buf + len, size: buf_len - len, fmt: "num_sch_cmd_status_%u:\n", i);
5499 len += scnprintf(buf: buf + len, size: buf_len - len,
5500 fmt: "SU frame_SGEN_TF_POLL = %u\n",
5501 le32_to_cpu(sbuf->su_res[ATH12K_HTT_FTYPE_TF_POLL][i]));
5502 len += scnprintf(buf: buf + len, size: buf_len - len,
5503 fmt: "SU frame_SGEN_TF_SOUND = %u\n",
5504 le32_to_cpu(sbuf->su_res[ATH12K_HTT_FTYPE_TF_SOUND][i]));
5505 len += scnprintf(buf: buf + len, size: buf_len - len,
5506 fmt: "SU frame_SGEN_TBR_NDPA = %u\n",
5507 le32_to_cpu(sbuf->su_res[ATH12K_HTT_FTYPE_TBR_NDPA][i]));
5508 len += scnprintf(buf: buf + len, size: buf_len - len,
5509 fmt: "SU frame_SGEN_TBR_NDP = %u\n",
5510 le32_to_cpu(sbuf->su_res[ATH12K_HTT_FTYPE_TBR_NDP][i]));
5511 len += scnprintf(buf: buf + len, size: buf_len - len,
5512 fmt: "SU frame_SGEN_TBR_LMR = %u\n",
5513 le32_to_cpu(sbuf->su_res[ATH12K_HTT_FTYPE_TBR_LMR][i]));
5514 len += scnprintf(buf: buf + len, size: buf_len - len,
5515 fmt: "SU frame_SGEN_TF_REPORT = %u\n",
5516 le32_to_cpu(sbuf->su_res[ATH12K_HTT_FTYPE_TF_RPRT][i]));
5517 len += scnprintf(buf: buf + len, size: buf_len - len,
5518 fmt: "MU frame_SGEN_TF_POLL = %u\n",
5519 le32_to_cpu(sbuf->mu_res[ATH12K_HTT_FTYPE_TF_POLL][i]));
5520 len += scnprintf(buf: buf + len, size: buf_len - len,
5521 fmt: "MU frame_SGEN_TF_SOUND = %u\n",
5522 le32_to_cpu(sbuf->mu_res[ATH12K_HTT_FTYPE_TF_SOUND][i]));
5523 len += scnprintf(buf: buf + len, size: buf_len - len,
5524 fmt: "MU frame_SGEN_TBR_NDPA = %u\n",
5525 le32_to_cpu(sbuf->mu_res[ATH12K_HTT_FTYPE_TBR_NDPA][i]));
5526 len += scnprintf(buf: buf + len, size: buf_len - len,
5527 fmt: "MU frame_SGEN_TBR_NDP = %u\n",
5528 le32_to_cpu(sbuf->mu_res[ATH12K_HTT_FTYPE_TBR_NDP][i]));
5529 len += scnprintf(buf: buf + len, size: buf_len - len,
5530 fmt: "MU frame_SGEN_TBR_LMR = %u\n",
5531 le32_to_cpu(sbuf->mu_res[ATH12K_HTT_FTYPE_TBR_LMR][i]));
5532 len += scnprintf(buf: buf + len, size: buf_len - len,
5533 fmt: "MU frame_SGEN_TF_REPORT = %u\n\n",
5534 le32_to_cpu(sbuf->mu_res[ATH12K_HTT_FTYPE_TF_RPRT][i]));
5535 }
5536
5537 stats_req->buf_len = len;
5538}
5539
5540static int ath12k_dbg_htt_ext_stats_parse(struct ath12k_base *ab,
5541 u16 tag, u16 len, const void *tag_buf,
5542 void *user_data)
5543{
5544 struct debug_htt_stats_req *stats_req = user_data;
5545
5546 switch (tag) {
5547 case HTT_STATS_TX_PDEV_CMN_TAG:
5548 htt_print_tx_pdev_stats_cmn_tlv(tag_buf, tag_len: len, stats_req);
5549 break;
5550 case HTT_STATS_TX_PDEV_UNDERRUN_TAG:
5551 htt_print_tx_pdev_stats_urrn_tlv(tag_buf, tag_len: len, stats_req);
5552 break;
5553 case HTT_STATS_TX_PDEV_SIFS_TAG:
5554 htt_print_tx_pdev_stats_sifs_tlv(tag_buf, tag_len: len, stats_req);
5555 break;
5556 case HTT_STATS_TX_PDEV_FLUSH_TAG:
5557 htt_print_tx_pdev_stats_flush_tlv(tag_buf, tag_len: len, stats_req);
5558 break;
5559 case HTT_STATS_TX_PDEV_SIFS_HIST_TAG:
5560 htt_print_tx_pdev_stats_sifs_hist_tlv(tag_buf, tag_len: len, stats_req);
5561 break;
5562 case HTT_STATS_PDEV_CTRL_PATH_TX_STATS_TAG:
5563 htt_print_pdev_ctrl_path_tx_stats_tlv(tag_buf, tag_len: len, stats_req);
5564 break;
5565 case HTT_STATS_MU_PPDU_DIST_TAG:
5566 htt_print_tx_pdev_mu_ppdu_dist_stats_tlv(tag_buf, tag_len: len, stats_req);
5567 break;
5568 case HTT_STATS_TX_SCHED_CMN_TAG:
5569 ath12k_htt_print_stats_tx_sched_cmn_tlv(tag_buf, tag_len: len, stats_req);
5570 break;
5571 case HTT_STATS_TX_PDEV_SCHEDULER_TXQ_STATS_TAG:
5572 ath12k_htt_print_tx_pdev_stats_sched_per_txq_tlv(tag_buf, tag_len: len, stats_req);
5573 break;
5574 case HTT_STATS_SCHED_TXQ_CMD_POSTED_TAG:
5575 ath12k_htt_print_sched_txq_cmd_posted_tlv(tag_buf, tag_len: len, stats_req);
5576 break;
5577 case HTT_STATS_SCHED_TXQ_CMD_REAPED_TAG:
5578 ath12k_htt_print_sched_txq_cmd_reaped_tlv(tag_buf, tag_len: len, stats_req);
5579 break;
5580 case HTT_STATS_SCHED_TXQ_SCHED_ORDER_SU_TAG:
5581 ath12k_htt_print_sched_txq_sched_order_su_tlv(tag_buf, tag_len: len, stats_req);
5582 break;
5583 case HTT_STATS_SCHED_TXQ_SCHED_INELIGIBILITY_TAG:
5584 ath12k_htt_print_sched_txq_sched_ineligibility_tlv(tag_buf, tag_len: len,
5585 stats_req);
5586 break;
5587 case HTT_STATS_SCHED_TXQ_SUPERCYCLE_TRIGGER_TAG:
5588 ath12k_htt_print_sched_txq_supercycle_trigger_tlv(tag_buf, tag_len: len,
5589 stats_req);
5590 break;
5591 case HTT_STATS_HW_PDEV_ERRS_TAG:
5592 ath12k_htt_print_hw_stats_pdev_errs_tlv(tag_buf, tag_len: len, stats_req);
5593 break;
5594 case HTT_STATS_HW_INTR_MISC_TAG:
5595 ath12k_htt_print_hw_stats_intr_misc_tlv(tag_buf, tag_len: len, stats_req);
5596 break;
5597 case HTT_STATS_WHAL_TX_TAG:
5598 ath12k_htt_print_hw_stats_whal_tx_tlv(tag_buf, tag_len: len, stats_req);
5599 break;
5600 case HTT_STATS_HW_WAR_TAG:
5601 ath12k_htt_print_hw_war_tlv(tag_buf, tag_len: len, stats_req);
5602 break;
5603 case HTT_STATS_TX_TQM_CMN_TAG:
5604 ath12k_htt_print_tx_tqm_cmn_stats_tlv(tag_buf, tag_len: len, stats_req);
5605 break;
5606 case HTT_STATS_TX_TQM_ERROR_STATS_TAG:
5607 ath12k_htt_print_tx_tqm_error_stats_tlv(tag_buf, tag_len: len, stats_req);
5608 break;
5609 case HTT_STATS_TX_TQM_GEN_MPDU_TAG:
5610 ath12k_htt_print_tx_tqm_gen_mpdu_stats_tlv(tag_buf, tag_len: len, stats_req);
5611 break;
5612 case HTT_STATS_TX_TQM_LIST_MPDU_TAG:
5613 ath12k_htt_print_tx_tqm_list_mpdu_stats_tlv(tag_buf, tag_len: len, stats_req);
5614 break;
5615 case HTT_STATS_TX_TQM_LIST_MPDU_CNT_TAG:
5616 ath12k_htt_print_tx_tqm_list_mpdu_cnt_tlv(tag_buf, tag_len: len, stats_req);
5617 break;
5618 case HTT_STATS_TX_TQM_PDEV_TAG:
5619 ath12k_htt_print_tx_tqm_pdev_stats_tlv(tag_buf, tag_len: len, stats_req);
5620 break;
5621 case HTT_STATS_TX_DE_CMN_TAG:
5622 ath12k_htt_print_tx_de_cmn_stats_tlv(tag_buf, tag_len: len, stats_req);
5623 break;
5624 case HTT_STATS_TX_DE_EAPOL_PACKETS_TAG:
5625 ath12k_htt_print_tx_de_eapol_packets_stats_tlv(tag_buf, tag_len: len, stats_req);
5626 break;
5627 case HTT_STATS_TX_DE_CLASSIFY_STATS_TAG:
5628 ath12k_htt_print_tx_de_classify_stats_tlv(tag_buf, tag_len: len, stats_req);
5629 break;
5630 case HTT_STATS_TX_DE_CLASSIFY_FAILED_TAG:
5631 ath12k_htt_print_tx_de_classify_failed_stats_tlv(tag_buf, tag_len: len, stats_req);
5632 break;
5633 case HTT_STATS_TX_DE_CLASSIFY_STATUS_TAG:
5634 ath12k_htt_print_tx_de_classify_status_stats_tlv(tag_buf, tag_len: len, stats_req);
5635 break;
5636 case HTT_STATS_TX_DE_ENQUEUE_PACKETS_TAG:
5637 ath12k_htt_print_tx_de_enqueue_packets_stats_tlv(tag_buf, tag_len: len, stats_req);
5638 break;
5639 case HTT_STATS_TX_DE_ENQUEUE_DISCARD_TAG:
5640 ath12k_htt_print_tx_de_enqueue_discard_stats_tlv(tag_buf, tag_len: len, stats_req);
5641 break;
5642 case HTT_STATS_TX_DE_COMPL_STATS_TAG:
5643 ath12k_htt_print_tx_de_compl_stats_tlv(tag_buf, tag_len: len, stats_req);
5644 break;
5645 case HTT_STATS_TX_SELFGEN_CMN_STATS_TAG:
5646 ath12k_htt_print_tx_selfgen_cmn_stats_tlv(tag_buf, tag_len: len, stats_req);
5647 break;
5648 case HTT_STATS_TX_SELFGEN_AC_STATS_TAG:
5649 ath12k_htt_print_tx_selfgen_ac_stats_tlv(tag_buf, tag_len: len, stats_req);
5650 break;
5651 case HTT_STATS_TX_SELFGEN_AX_STATS_TAG:
5652 ath12k_htt_print_tx_selfgen_ax_stats_tlv(tag_buf, tag_len: len, stats_req);
5653 break;
5654 case HTT_STATS_TX_SELFGEN_BE_STATS_TAG:
5655 ath12k_htt_print_tx_selfgen_be_stats_tlv(tag_buf, tag_len: len, stats_req);
5656 break;
5657 case HTT_STATS_TX_SELFGEN_AC_ERR_STATS_TAG:
5658 ath12k_htt_print_tx_selfgen_ac_err_stats_tlv(tag_buf, tag_len: len, stats_req);
5659 break;
5660 case HTT_STATS_TX_SELFGEN_AX_ERR_STATS_TAG:
5661 ath12k_htt_print_tx_selfgen_ax_err_stats_tlv(tag_buf, tag_len: len, stats_req);
5662 break;
5663 case HTT_STATS_TX_SELFGEN_BE_ERR_STATS_TAG:
5664 ath12k_htt_print_tx_selfgen_be_err_stats_tlv(tag_buf, tag_len: len, stats_req);
5665 break;
5666 case HTT_STATS_TX_SELFGEN_AC_SCHED_STATUS_STATS_TAG:
5667 ath12k_htt_print_tx_selfgen_ac_sched_status_stats_tlv(tag_buf, tag_len: len,
5668 stats: stats_req);
5669 break;
5670 case HTT_STATS_TX_SELFGEN_AX_SCHED_STATUS_STATS_TAG:
5671 ath12k_htt_print_tx_selfgen_ax_sched_status_stats_tlv(tag_buf, tag_len: len,
5672 stats: stats_req);
5673 break;
5674 case HTT_STATS_TX_SELFGEN_BE_SCHED_STATUS_STATS_TAG:
5675 ath12k_htt_print_tx_selfgen_be_sched_status_stats_tlv(tag_buf, tag_len: len,
5676 stats: stats_req);
5677 break;
5678 case HTT_STATS_STRING_TAG:
5679 ath12k_htt_print_stats_string_tlv(tag_buf, tag_len: len, stats_req);
5680 break;
5681 case HTT_STATS_SRING_STATS_TAG:
5682 ath12k_htt_print_sring_stats_tlv(tag_buf, tag_len: len, stats_req);
5683 break;
5684 case HTT_STATS_SFM_CMN_TAG:
5685 ath12k_htt_print_sfm_cmn_tlv(tag_buf, tag_len: len, stats_req);
5686 break;
5687 case HTT_STATS_SFM_CLIENT_TAG:
5688 ath12k_htt_print_sfm_client_tlv(tag_buf, tag_len: len, stats_req);
5689 break;
5690 case HTT_STATS_SFM_CLIENT_USER_TAG:
5691 ath12k_htt_print_sfm_client_user_tlv(tag_buf, tag_len: len, stats_req);
5692 break;
5693 case HTT_STATS_TX_PDEV_MU_MIMO_STATS_TAG:
5694 ath12k_htt_print_tx_pdev_mu_mimo_sch_stats_tlv(tag_buf, tag_len: len, stats_req);
5695 break;
5696 case HTT_STATS_TX_PDEV_MUMIMO_GRP_STATS_TAG:
5697 ath12k_htt_print_tx_pdev_mumimo_grp_stats_tlv(tag_buf, tag_len: len, stats_req);
5698 break;
5699 case HTT_STATS_TX_PDEV_MPDU_STATS_TAG:
5700 ath12k_htt_print_tx_pdev_mu_mimo_mpdu_stats_tlv(tag_buf, tag_len: len, stats_req);
5701 break;
5702 case HTT_STATS_PDEV_CCA_1SEC_HIST_TAG:
5703 case HTT_STATS_PDEV_CCA_100MSEC_HIST_TAG:
5704 case HTT_STATS_PDEV_CCA_STAT_CUMULATIVE_TAG:
5705 ath12k_htt_print_pdev_cca_stats_hist_tlv(tag_buf, tag_len: len, stats_req);
5706 break;
5707 case HTT_STATS_PDEV_CCA_COUNTERS_TAG:
5708 ath12k_htt_print_pdev_stats_cca_counters_tlv(tag_buf, tag_len: len, stats_req);
5709 break;
5710 case HTT_STATS_TX_SOUNDING_STATS_TAG:
5711 ath12k_htt_print_tx_sounding_stats_tlv(tag_buf, tag_len: len, stats_req);
5712 break;
5713 case HTT_STATS_PDEV_OBSS_PD_TAG:
5714 ath12k_htt_print_pdev_obss_pd_stats_tlv(tag_buf, tag_len: len, stats_req);
5715 break;
5716 case HTT_STATS_LATENCY_CTX_TAG:
5717 ath12k_htt_print_latency_prof_ctx_tlv(tag_buf, tag_len: len, stats_req);
5718 break;
5719 case HTT_STATS_LATENCY_CNT_TAG:
5720 ath12k_htt_print_latency_prof_cnt(tag_buf, tag_len: len, stats_req);
5721 break;
5722 case HTT_STATS_LATENCY_PROF_STATS_TAG:
5723 ath12k_htt_print_latency_prof_stats_tlv(tag_buf, tag_len: len, stats_req);
5724 break;
5725 case HTT_STATS_RX_PDEV_UL_TRIG_STATS_TAG:
5726 ath12k_htt_print_ul_ofdma_trigger_stats(tag_buf, tag_len: len, stats_req);
5727 break;
5728 case HTT_STATS_RX_PDEV_UL_OFDMA_USER_STATS_TAG:
5729 ath12k_htt_print_ul_ofdma_user_stats(tag_buf, tag_len: len, stats_req);
5730 break;
5731 case HTT_STATS_RX_PDEV_UL_MUMIMO_TRIG_STATS_TAG:
5732 ath12k_htt_print_ul_mumimo_trig_stats(tag_buf, tag_len: len, stats_req);
5733 break;
5734 case HTT_STATS_RX_FSE_STATS_TAG:
5735 ath12k_htt_print_rx_fse_stats_tlv(tag_buf, tag_len: len, stats_req);
5736 break;
5737 case HTT_STATS_PDEV_TX_RATE_TXBF_STATS_TAG:
5738 ath12k_htt_print_pdev_tx_rate_txbf_stats_tlv(tag_buf, tag_len: len, stats_req);
5739 break;
5740 case HTT_STATS_TXBF_OFDMA_AX_NDPA_STATS_TAG:
5741 ath12k_htt_print_txbf_ofdma_ax_ndpa_stats_tlv(tag_buf, tag_len: len, stats_req);
5742 break;
5743 case HTT_STATS_TXBF_OFDMA_AX_NDP_STATS_TAG:
5744 ath12k_htt_print_txbf_ofdma_ax_ndp_stats_tlv(tag_buf, tag_len: len, stats_req);
5745 break;
5746 case HTT_STATS_TXBF_OFDMA_AX_BRP_STATS_TAG:
5747 ath12k_htt_print_txbf_ofdma_ax_brp_stats_tlv(tag_buf, tag_len: len, stats_req);
5748 break;
5749 case HTT_STATS_TXBF_OFDMA_AX_STEER_STATS_TAG:
5750 ath12k_htt_print_txbf_ofdma_ax_steer_stats_tlv(tag_buf, tag_len: len, stats_req);
5751 break;
5752 case HTT_STATS_TXBF_OFDMA_AX_STEER_MPDU_STATS_TAG:
5753 ath12k_htt_print_txbf_ofdma_ax_steer_mpdu_stats_tlv(tag_buf, tag_len: len,
5754 stats_req);
5755 break;
5756 case HTT_STATS_DLPAGER_STATS_TAG:
5757 ath12k_htt_print_dlpager_stats_tlv(tag_buf, tag_len: len, stats_req);
5758 break;
5759 case HTT_STATS_PHY_STATS_TAG:
5760 ath12k_htt_print_phy_stats_tlv(tag_buf, tag_len: len, stats_req);
5761 break;
5762 case HTT_STATS_PHY_COUNTERS_TAG:
5763 ath12k_htt_print_phy_counters_tlv(tag_buf, tag_len: len, stats_req);
5764 break;
5765 case HTT_STATS_PHY_RESET_STATS_TAG:
5766 ath12k_htt_print_phy_reset_stats_tlv(tag_buf, tag_len: len, stats_req);
5767 break;
5768 case HTT_STATS_PHY_RESET_COUNTERS_TAG:
5769 ath12k_htt_print_phy_reset_counters_tlv(tag_buf, tag_len: len, stats_req);
5770 break;
5771 case HTT_STATS_PHY_TPC_STATS_TAG:
5772 ath12k_htt_print_phy_tpc_stats_tlv(tag_buf, tag_len: len, stats_req);
5773 break;
5774 case HTT_STATS_SOC_TXRX_STATS_COMMON_TAG:
5775 ath12k_htt_print_soc_txrx_stats_common_tlv(tag_buf, tag_len: len, stats_req);
5776 break;
5777 case HTT_STATS_PER_RATE_STATS_TAG:
5778 ath12k_htt_print_tx_per_rate_stats_tlv(tag_buf, tag_len: len, stats_req);
5779 break;
5780 case HTT_STATS_AST_ENTRY_TAG:
5781 ath12k_htt_print_ast_entry_tlv(tag_buf, tag_len: len, stats_req);
5782 break;
5783 case HTT_STATS_PDEV_PUNCTURE_STATS_TAG:
5784 ath12k_htt_print_puncture_stats_tlv(tag_buf, tag_len: len, stats_req);
5785 break;
5786 case HTT_STATS_DMAC_RESET_STATS_TAG:
5787 ath12k_htt_print_dmac_reset_stats_tlv(tag_buf, tag_len: len, stats_req);
5788 break;
5789 case HTT_STATS_PDEV_SCHED_ALGO_OFDMA_STATS_TAG:
5790 ath12k_htt_print_pdev_sched_algo_ofdma_stats_tlv(tag_buf, tag_len: len, stats_req);
5791 break;
5792 case HTT_STATS_TX_PDEV_RATE_STATS_BE_OFDMA_TAG:
5793 ath12k_htt_print_tx_pdev_rate_stats_be_ofdma_tlv(tag_buf, tag_len: len, stats_req);
5794 break;
5795 case HTT_STATS_PDEV_MBSSID_CTRL_FRAME_STATS_TAG:
5796 ath12k_htt_print_pdev_mbssid_ctrl_frame_stats_tlv(tag_buf, tag_len: len,
5797 stats_req);
5798 break;
5799 case HTT_STATS_TX_PDEV_RATE_STATS_TAG:
5800 ath12k_htt_print_tx_pdev_rate_stats_tlv(tag_buf, tag_len: len, stats_req);
5801 break;
5802 case HTT_STATS_TX_PDEV_HISTOGRAM_STATS_TAG:
5803 ath12k_htt_print_histogram_stats_tlv(tag_buf, tag_len: len, stats_req);
5804 break;
5805 case HTT_STATS_RX_PDEV_RATE_STATS_TAG:
5806 ath12k_htt_print_rx_pdev_rate_stats_tlv(tag_buf, tag_len: len, stats_req);
5807 break;
5808 case HTT_STATS_RX_PDEV_RATE_EXT_STATS_TAG:
5809 ath12k_htt_print_rx_pdev_rate_ext_stats_tlv(tag_buf, tag_len: len, stats_req);
5810 break;
5811 case HTT_STATS_PDEV_TDMA_TAG:
5812 ath12k_htt_print_pdev_tdma_stats_tlv(tag_buf, tag_len: len, stats_req);
5813 break;
5814 case HTT_STATS_MLO_SCHED_STATS_TAG:
5815 ath12k_htt_print_mlo_sched_stats_tlv(tag_buf, tag_len: len, stats_req);
5816 break;
5817 case HTT_STATS_PDEV_MLO_IPC_STATS_TAG:
5818 ath12k_htt_print_mlo_ipc_stats_tlv(tag_buf, tag_len: len, stats_req);
5819 break;
5820 case HTT_STATS_PDEV_RTT_RESP_STATS_TAG:
5821 ath12k_htt_print_pdev_rtt_resp_stats_tlv(tag_buf, tag_len: len, stats_req);
5822 break;
5823 case HTT_STATS_PDEV_RTT_INIT_STATS_TAG:
5824 ath12k_htt_print_pdev_rtt_init_stats_tlv(tag_buf, tag_len: len, stats_req);
5825 break;
5826 case HTT_STATS_PDEV_RTT_HW_STATS_TAG:
5827 ath12k_htt_print_pdev_rtt_hw_stats_tlv(tag_buf, tag_len: len, stats_req);
5828 break;
5829 case HTT_STATS_PDEV_RTT_TBR_SELFGEN_QUEUED_STATS_TAG:
5830 ath12k_htt_print_pdev_rtt_tbr_selfgen_queued_stats_tlv(tag_buf, tag_len: len,
5831 req: stats_req);
5832 break;
5833 case HTT_STATS_PDEV_RTT_TBR_CMD_RESULT_STATS_TAG:
5834 ath12k_htt_print_pdev_rtt_tbr_cmd_res_stats_tlv(tag_buf, tag_len: len, stats_req);
5835 break;
5836 default:
5837 break;
5838 }
5839
5840 return 0;
5841}
5842
5843void ath12k_debugfs_htt_ext_stats_handler(struct ath12k_base *ab,
5844 struct sk_buff *skb)
5845{
5846 struct ath12k_htt_extd_stats_msg *msg;
5847 struct debug_htt_stats_req *stats_req;
5848 struct ath12k *ar;
5849 u32 len, pdev_id, stats_info;
5850 u64 cookie;
5851 int ret;
5852 bool send_completion = false;
5853
5854 msg = (struct ath12k_htt_extd_stats_msg *)skb->data;
5855 cookie = le64_to_cpu(msg->cookie);
5856
5857 if (u64_get_bits(v: cookie, ATH12K_HTT_STATS_COOKIE_MSB) !=
5858 ATH12K_HTT_STATS_MAGIC_VALUE) {
5859 ath12k_warn(ab, "received invalid htt ext stats event\n");
5860 return;
5861 }
5862
5863 pdev_id = u64_get_bits(v: cookie, ATH12K_HTT_STATS_COOKIE_LSB);
5864 rcu_read_lock();
5865 ar = ath12k_mac_get_ar_by_pdev_id(ab, pdev_id);
5866 if (!ar) {
5867 ath12k_warn(ab, "failed to get ar for pdev_id %d\n", pdev_id);
5868 goto exit;
5869 }
5870
5871 stats_req = ar->debug.htt_stats.stats_req;
5872 if (!stats_req)
5873 goto exit;
5874
5875 spin_lock_bh(lock: &ar->data_lock);
5876
5877 stats_info = le32_to_cpu(msg->info1);
5878 stats_req->done = u32_get_bits(v: stats_info, ATH12K_HTT_T2H_EXT_STATS_INFO1_DONE);
5879 if (stats_req->done)
5880 send_completion = true;
5881
5882 spin_unlock_bh(lock: &ar->data_lock);
5883
5884 len = u32_get_bits(v: stats_info, ATH12K_HTT_T2H_EXT_STATS_INFO1_LENGTH);
5885 if (len > skb->len) {
5886 ath12k_warn(ab, "invalid length %d for HTT stats", len);
5887 goto exit;
5888 }
5889
5890 ret = ath12k_dp_htt_tlv_iter(ab, ptr: msg->data, len,
5891 iter: ath12k_dbg_htt_ext_stats_parse,
5892 data: stats_req);
5893 if (ret)
5894 ath12k_warn(ab, "Failed to parse tlv %d\n", ret);
5895
5896 if (send_completion)
5897 complete(&stats_req->htt_stats_rcvd);
5898exit:
5899 rcu_read_unlock();
5900}
5901
5902static ssize_t ath12k_read_htt_stats_type(struct file *file,
5903 char __user *user_buf,
5904 size_t count, loff_t *ppos)
5905{
5906 struct ath12k *ar = file->private_data;
5907 enum ath12k_dbg_htt_ext_stats_type type;
5908 char buf[32];
5909 size_t len;
5910
5911 wiphy_lock(wiphy: ath12k_ar_to_hw(ar)->wiphy);
5912 type = ar->debug.htt_stats.type;
5913 wiphy_unlock(wiphy: ath12k_ar_to_hw(ar)->wiphy);
5914
5915 len = scnprintf(buf, size: sizeof(buf), fmt: "%u\n", type);
5916
5917 return simple_read_from_buffer(to: user_buf, count, ppos, from: buf, available: len);
5918}
5919
5920static ssize_t ath12k_write_htt_stats_type(struct file *file,
5921 const char __user *user_buf,
5922 size_t count, loff_t *ppos)
5923{
5924 struct ath12k *ar = file->private_data;
5925 enum ath12k_dbg_htt_ext_stats_type type;
5926 unsigned int cfg_param[4] = {};
5927 const int size = 32;
5928 int num_args;
5929
5930 if (count > size)
5931 return -EINVAL;
5932
5933 char *buf __free(kfree) = kzalloc(size, GFP_KERNEL);
5934 if (!buf)
5935 return -ENOMEM;
5936
5937 if (copy_from_user(to: buf, from: user_buf, n: count))
5938 return -EFAULT;
5939
5940 num_args = sscanf(buf, "%u %u %u %u %u\n", &type, &cfg_param[0],
5941 &cfg_param[1], &cfg_param[2], &cfg_param[3]);
5942 if (!num_args || num_args > 5)
5943 return -EINVAL;
5944
5945 if (type == ATH12K_DBG_HTT_EXT_STATS_RESET ||
5946 type >= ATH12K_DBG_HTT_NUM_EXT_STATS)
5947 return -EINVAL;
5948
5949 wiphy_lock(wiphy: ath12k_ar_to_hw(ar)->wiphy);
5950
5951 ar->debug.htt_stats.type = type;
5952 ar->debug.htt_stats.cfg_param[0] = cfg_param[0];
5953 ar->debug.htt_stats.cfg_param[1] = cfg_param[1];
5954 ar->debug.htt_stats.cfg_param[2] = cfg_param[2];
5955 ar->debug.htt_stats.cfg_param[3] = cfg_param[3];
5956
5957 wiphy_unlock(wiphy: ath12k_ar_to_hw(ar)->wiphy);
5958
5959 return count;
5960}
5961
5962static const struct file_operations fops_htt_stats_type = {
5963 .read = ath12k_read_htt_stats_type,
5964 .write = ath12k_write_htt_stats_type,
5965 .open = simple_open,
5966 .owner = THIS_MODULE,
5967 .llseek = default_llseek,
5968};
5969
5970static int ath12k_debugfs_htt_stats_req(struct ath12k *ar)
5971{
5972 struct debug_htt_stats_req *stats_req = ar->debug.htt_stats.stats_req;
5973 enum ath12k_dbg_htt_ext_stats_type type = stats_req->type;
5974 u64 cookie;
5975 int ret, pdev_id;
5976 struct htt_ext_stats_cfg_params cfg_params = {};
5977
5978 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5979
5980 init_completion(x: &stats_req->htt_stats_rcvd);
5981
5982 pdev_id = ath12k_mac_get_target_pdev_id(ar);
5983 stats_req->done = false;
5984 stats_req->pdev_id = pdev_id;
5985
5986 cookie = u64_encode_bits(ATH12K_HTT_STATS_MAGIC_VALUE,
5987 ATH12K_HTT_STATS_COOKIE_MSB);
5988 cookie |= u64_encode_bits(v: pdev_id, ATH12K_HTT_STATS_COOKIE_LSB);
5989
5990 if (stats_req->override_cfg_param) {
5991 cfg_params.cfg0 = stats_req->cfg_param[0];
5992 cfg_params.cfg1 = stats_req->cfg_param[1];
5993 cfg_params.cfg2 = stats_req->cfg_param[2];
5994 cfg_params.cfg3 = stats_req->cfg_param[3];
5995 }
5996
5997 ret = ath12k_dp_tx_htt_h2t_ext_stats_req(ar, type, cfg_params: &cfg_params, cookie);
5998 if (ret) {
5999 ath12k_warn(ar->ab, "failed to send htt stats request: %d\n", ret);
6000 return ret;
6001 }
6002 if (!wait_for_completion_timeout(x: &stats_req->htt_stats_rcvd, timeout: 3 * HZ)) {
6003 spin_lock_bh(lock: &ar->data_lock);
6004 if (!stats_req->done) {
6005 stats_req->done = true;
6006 spin_unlock_bh(lock: &ar->data_lock);
6007 ath12k_warn(ar->ab, "stats request timed out\n");
6008 return -ETIMEDOUT;
6009 }
6010 spin_unlock_bh(lock: &ar->data_lock);
6011 }
6012
6013 return 0;
6014}
6015
6016static int ath12k_open_htt_stats(struct inode *inode,
6017 struct file *file)
6018{
6019 struct ath12k *ar = inode->i_private;
6020 struct debug_htt_stats_req *stats_req;
6021 enum ath12k_dbg_htt_ext_stats_type type = ar->debug.htt_stats.type;
6022 struct ath12k_hw *ah = ath12k_ar_to_ah(ar);
6023 int ret;
6024
6025 if (type == ATH12K_DBG_HTT_EXT_STATS_RESET)
6026 return -EPERM;
6027
6028 wiphy_lock(wiphy: ath12k_ar_to_hw(ar)->wiphy);
6029
6030 if (ah->state != ATH12K_HW_STATE_ON) {
6031 ret = -ENETDOWN;
6032 goto err_unlock;
6033 }
6034
6035 if (ar->debug.htt_stats.stats_req) {
6036 ret = -EAGAIN;
6037 goto err_unlock;
6038 }
6039
6040 stats_req = kzalloc(sizeof(*stats_req) + ATH12K_HTT_STATS_BUF_SIZE, GFP_KERNEL);
6041 if (!stats_req) {
6042 ret = -ENOMEM;
6043 goto err_unlock;
6044 }
6045
6046 ar->debug.htt_stats.stats_req = stats_req;
6047 stats_req->type = type;
6048 stats_req->cfg_param[0] = ar->debug.htt_stats.cfg_param[0];
6049 stats_req->cfg_param[1] = ar->debug.htt_stats.cfg_param[1];
6050 stats_req->cfg_param[2] = ar->debug.htt_stats.cfg_param[2];
6051 stats_req->cfg_param[3] = ar->debug.htt_stats.cfg_param[3];
6052 stats_req->override_cfg_param = !!stats_req->cfg_param[0] ||
6053 !!stats_req->cfg_param[1] ||
6054 !!stats_req->cfg_param[2] ||
6055 !!stats_req->cfg_param[3];
6056
6057 ret = ath12k_debugfs_htt_stats_req(ar);
6058 if (ret < 0)
6059 goto out;
6060
6061 file->private_data = stats_req;
6062
6063 wiphy_unlock(wiphy: ath12k_ar_to_hw(ar)->wiphy);
6064
6065 return 0;
6066out:
6067 kfree(objp: stats_req);
6068 ar->debug.htt_stats.stats_req = NULL;
6069err_unlock:
6070 wiphy_unlock(wiphy: ath12k_ar_to_hw(ar)->wiphy);
6071
6072 return ret;
6073}
6074
6075static int ath12k_release_htt_stats(struct inode *inode,
6076 struct file *file)
6077{
6078 struct ath12k *ar = inode->i_private;
6079
6080 wiphy_lock(wiphy: ath12k_ar_to_hw(ar)->wiphy);
6081 kfree(objp: file->private_data);
6082 ar->debug.htt_stats.stats_req = NULL;
6083 wiphy_unlock(wiphy: ath12k_ar_to_hw(ar)->wiphy);
6084
6085 return 0;
6086}
6087
6088static ssize_t ath12k_read_htt_stats(struct file *file,
6089 char __user *user_buf,
6090 size_t count, loff_t *ppos)
6091{
6092 struct debug_htt_stats_req *stats_req = file->private_data;
6093 char *buf;
6094 u32 length;
6095
6096 buf = stats_req->buf;
6097 length = min_t(u32, stats_req->buf_len, ATH12K_HTT_STATS_BUF_SIZE);
6098 return simple_read_from_buffer(to: user_buf, count, ppos, from: buf, available: length);
6099}
6100
6101static const struct file_operations fops_dump_htt_stats = {
6102 .open = ath12k_open_htt_stats,
6103 .release = ath12k_release_htt_stats,
6104 .read = ath12k_read_htt_stats,
6105 .owner = THIS_MODULE,
6106 .llseek = default_llseek,
6107};
6108
6109static ssize_t ath12k_write_htt_stats_reset(struct file *file,
6110 const char __user *user_buf,
6111 size_t count, loff_t *ppos)
6112{
6113 struct ath12k *ar = file->private_data;
6114 enum ath12k_dbg_htt_ext_stats_type type;
6115 struct htt_ext_stats_cfg_params cfg_params = {};
6116 u8 param_pos;
6117 int ret;
6118
6119 ret = kstrtou32_from_user(s: user_buf, count, base: 0, res: &type);
6120 if (ret)
6121 return ret;
6122
6123 if (type >= ATH12K_DBG_HTT_NUM_EXT_STATS ||
6124 type == ATH12K_DBG_HTT_EXT_STATS_RESET)
6125 return -E2BIG;
6126
6127 wiphy_lock(wiphy: ath12k_ar_to_hw(ar)->wiphy);
6128 cfg_params.cfg0 = HTT_STAT_DEFAULT_RESET_START_OFFSET;
6129 param_pos = (type >> 5) + 1;
6130
6131 switch (param_pos) {
6132 case ATH12K_HTT_STATS_RESET_PARAM_CFG_32_BYTES:
6133 cfg_params.cfg1 = 1 << (cfg_params.cfg0 + type);
6134 break;
6135 case ATH12K_HTT_STATS_RESET_PARAM_CFG_64_BYTES:
6136 cfg_params.cfg2 = ATH12K_HTT_STATS_RESET_BITMAP32_BIT(cfg_params.cfg0 +
6137 type);
6138 break;
6139 case ATH12K_HTT_STATS_RESET_PARAM_CFG_128_BYTES:
6140 cfg_params.cfg3 = ATH12K_HTT_STATS_RESET_BITMAP64_BIT(cfg_params.cfg0 +
6141 type);
6142 break;
6143 default:
6144 break;
6145 }
6146
6147 ret = ath12k_dp_tx_htt_h2t_ext_stats_req(ar,
6148 type: ATH12K_DBG_HTT_EXT_STATS_RESET,
6149 cfg_params: &cfg_params,
6150 cookie: 0ULL);
6151 if (ret) {
6152 ath12k_warn(ar->ab, "failed to send htt stats request: %d\n", ret);
6153 wiphy_unlock(wiphy: ath12k_ar_to_hw(ar)->wiphy);
6154 return ret;
6155 }
6156
6157 ar->debug.htt_stats.reset = type;
6158 wiphy_unlock(wiphy: ath12k_ar_to_hw(ar)->wiphy);
6159
6160 return count;
6161}
6162
6163static const struct file_operations fops_htt_stats_reset = {
6164 .write = ath12k_write_htt_stats_reset,
6165 .open = simple_open,
6166 .owner = THIS_MODULE,
6167 .llseek = default_llseek,
6168};
6169
6170void ath12k_debugfs_htt_stats_register(struct ath12k *ar)
6171{
6172 debugfs_create_file("htt_stats_type", 0600, ar->debug.debugfs_pdev,
6173 ar, &fops_htt_stats_type);
6174 debugfs_create_file("htt_stats", 0400, ar->debug.debugfs_pdev,
6175 ar, &fops_dump_htt_stats);
6176 debugfs_create_file("htt_stats_reset", 0200, ar->debug.debugfs_pdev,
6177 ar, &fops_htt_stats_reset);
6178}
6179

source code of linux/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c