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