xref: /linux/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c (revision 05e810c8cffb3e96f6b967c9a57c34d4a6a6347e)
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 
14 static u32
15 print_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 
45 static u32
46 print_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 
53 static u32
54 print_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 
81 static 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 
103 static 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 
143 static const char*
144 ath12k_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 
154 static void
155 htt_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 
304 static void
305 htt_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 
325 static void
326 htt_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 
346 static void
347 htt_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 
367 static void
368 htt_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 
458 static void
459 htt_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 
479 static void
480 htt_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 
500 static void
501 ath12k_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 
525 static void
526 ath12k_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 
611 static void
612 ath12k_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 
629 static void
630 ath12k_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 
647 static void
648 ath12k_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 
668 static void
669 ath12k_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 
689 static void
690 ath12k_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 
710 static void
711 ath12k_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 
860 static void
861 ath12k_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 
883 static void
884 ath12k_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 
928 static void
929 ath12k_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 
960 static void
961 ath12k_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 
1026 static void
1027 ath12k_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 
1098 static void
1099 ath12k_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 
1116 static void
1117 ath12k_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 
1134 static void
1135 ath12k_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 
1152 static void
1153 ath12k_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 
1231 static void
1232 ath12k_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 
1273 static void
1274 ath12k_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 
1313 static void
1314 ath12k_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 
1396 static void
1397 ath12k_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 
1452 static void
1453 ath12k_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 
1486 static void
1487 ath12k_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 
1510 static void
1511 ath12k_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 
1534 static void
1535 ath12k_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 
1561 static void
1562 ath12k_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 
1605 static void
1606 ath12k_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 
1634 static void
1635 ath12k_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 
1672 static void
1673 ath12k_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 
1726 static void
1727 ath12k_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 
1757 static void
1758 ath12k_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 
1796 static void
1797 ath12k_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 
1853 static void
1854 ath12k_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 
1896 static void
1897 ath12k_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 
1957 static void
1958 ath12k_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 
2018 static void
2019 ath12k_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 
2046 static void
2047 ath12k_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 
2111 static void
2112 ath12k_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 
2141 static void
2142 ath12k_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 
2172 static void
2173 ath12k_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 
2190 static void
2191 ath12k_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 
2307 static void
2308 ath12k_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 
2354 static void
2355 ath12k_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 
2485 static void
2486 ath12k_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 
2510 static void
2511 ath12k_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 
2544 static void
2545 ath12k_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 
2806 static void
2807 ath12k_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 
2871 static void
2872 ath12k_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 
2898 static void
2899 ath12k_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 
2917 static void
2918 ath12k_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 
2956 static void
2957 ath12k_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 
3041 static void
3042 ath12k_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 
3081 static void
3082 ath12k_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 
3205 static void
3206 ath12k_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 
3293 static void
3294 ath12k_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 
3385 static void
3386 ath12k_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 
3435 static void
3436 ath12k_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 
3485 static void
3486 ath12k_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 
3542 static void
3543 ath12k_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 
3593 static void
3594 ath12k_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 
3619 static 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 
3635 static void
3636 ath12k_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 
3701 static void
3702 ath12k_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 
3731 static void
3732 ath12k_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 
3777 static void
3778 ath12k_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 
3852 static void
3853 ath12k_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 
3883 static void
3884 ath12k_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 
3934 static void
3935 ath12k_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 
3957 static void
3958 ath12k_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 
4186 static void
4187 ath12k_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 
4239 static const char*
4240 ath12k_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 
4252 static const char*
4253 ath12k_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 
4271 static const char*
4272 ath12k_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 
4292 static void
4293 ath12k_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 
4337 static void
4338 ath12k_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 
4374 static void
4375 ath12k_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 
4438 static void
4439 ath12k_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 
4490 static void
4491 ath12k_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 
4529 static inline void
4530 ath12k_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 
4730 static void
4731 ath12k_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 
4761 static inline void
4762 ath12k_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 
4980 static inline void
4981 ath12k_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 
5051 static void
5052 ath12k_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 
5087 static void
5088 ath12k_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 
5112 static void
5113 ath12k_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 
5138 static void
5139 ath12k_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 
5277 static void
5278 ath12k_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 
5399 static void
5400 ath12k_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 
5443 static void
5444 ath12k_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 
5485 static void
5486 ath12k_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 
5542 static void
5543 ath12k_htt_print_rx_pdev_fw_stats_tlv(const void *tag_buf, u16 tag_len,
5544 				      struct debug_htt_stats_req *stats_req)
5545 {
5546 	const struct htt_rx_pdev_fw_stats_tlv *htt_stats_buf = tag_buf;
5547 	u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
5548 	u32 len = stats_req->buf_len;
5549 	u8 *buf = stats_req->buf;
5550 
5551 	if (tag_len < sizeof(*htt_stats_buf))
5552 		return;
5553 
5554 	len += scnprintf(buf + len, buf_len - len, "HTT_RX_PDEV_FW_STATS_TLV:\n");
5555 	len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",
5556 			le32_to_cpu(htt_stats_buf->mac_id__word) & 0xFF);
5557 	len += scnprintf(buf + len, buf_len - len, "ppdu_recvd = %u\n",
5558 			le32_to_cpu(htt_stats_buf->ppdu_recvd));
5559 	len += scnprintf(buf + len, buf_len - len, "mpdu_cnt_fcs_ok = %u\n",
5560 			le32_to_cpu(htt_stats_buf->mpdu_cnt_fcs_ok));
5561 	len += scnprintf(buf + len, buf_len - len, "mpdu_cnt_fcs_err = %u\n",
5562 			le32_to_cpu(htt_stats_buf->mpdu_cnt_fcs_err));
5563 	len += scnprintf(buf + len, buf_len - len, "tcp_msdu_cnt = %u\n",
5564 			le32_to_cpu(htt_stats_buf->tcp_msdu_cnt));
5565 	len += scnprintf(buf + len, buf_len - len, "tcp_ack_msdu_cnt = %u\n",
5566 			le32_to_cpu(htt_stats_buf->tcp_ack_msdu_cnt));
5567 	len += scnprintf(buf + len, buf_len - len, "udp_msdu_cnt = %u\n",
5568 			le32_to_cpu(htt_stats_buf->udp_msdu_cnt));
5569 	len += scnprintf(buf + len, buf_len - len, "other_msdu_cnt = %u\n",
5570 			le32_to_cpu(htt_stats_buf->other_msdu_cnt));
5571 	len += scnprintf(buf + len, buf_len - len, "fw_ring_mpdu_ind = %u\n",
5572 			le32_to_cpu(htt_stats_buf->fw_ring_mpdu_ind));
5573 	len += print_array_to_buf(buf, len, "fw_ring_mgmt_subtype",
5574 			htt_stats_buf->fw_ring_mgmt_subtype,
5575 			ATH12K_HTT_STATS_SUBTYPE_MAX, "\n");
5576 	len += print_array_to_buf(buf, len, "fw_ring_ctrl_subtype",
5577 			htt_stats_buf->fw_ring_ctrl_subtype,
5578 			ATH12K_HTT_STATS_SUBTYPE_MAX, "\n");
5579 	len += scnprintf(buf + len, buf_len - len, "fw_ring_mcast_data_msdu = %u\n",
5580 			le32_to_cpu(htt_stats_buf->fw_ring_mcast_data_msdu));
5581 	len += scnprintf(buf + len, buf_len - len, "fw_ring_bcast_data_msdu = %u\n",
5582 			le32_to_cpu(htt_stats_buf->fw_ring_bcast_data_msdu));
5583 	len += scnprintf(buf + len, buf_len - len, "fw_ring_ucast_data_msdu = %u\n",
5584 			le32_to_cpu(htt_stats_buf->fw_ring_ucast_data_msdu));
5585 	len += scnprintf(buf + len, buf_len - len, "fw_ring_null_data_msdu = %u\n",
5586 			le32_to_cpu(htt_stats_buf->fw_ring_null_data_msdu));
5587 	len += scnprintf(buf + len, buf_len - len, "fw_ring_mpdu_drop = %u\n",
5588 			le32_to_cpu(htt_stats_buf->fw_ring_mpdu_drop));
5589 	len += scnprintf(buf + len, buf_len - len, "ofld_local_data_ind_cnt = %u\n",
5590 			le32_to_cpu(htt_stats_buf->ofld_local_data_ind_cnt));
5591 	len += scnprintf(buf + len, buf_len - len,
5592 			"ofld_local_data_buf_recycle_cnt = %u\n",
5593 			le32_to_cpu(htt_stats_buf->ofld_local_data_buf_recycle_cnt));
5594 	len += scnprintf(buf + len, buf_len - len, "drx_local_data_ind_cnt = %u\n",
5595 			le32_to_cpu(htt_stats_buf->drx_local_data_ind_cnt));
5596 	len += scnprintf(buf + len, buf_len - len,
5597 			"drx_local_data_buf_recycle_cnt = %u\n",
5598 			le32_to_cpu(htt_stats_buf->drx_local_data_buf_recycle_cnt));
5599 	len += scnprintf(buf + len, buf_len - len, "local_nondata_ind_cnt = %u\n",
5600 			le32_to_cpu(htt_stats_buf->local_nondata_ind_cnt));
5601 	len += scnprintf(buf + len, buf_len - len, "local_nondata_buf_recycle_cnt = %u\n",
5602 			le32_to_cpu(htt_stats_buf->local_nondata_buf_recycle_cnt));
5603 	len += scnprintf(buf + len, buf_len - len, "fw_status_buf_ring_refill_cnt = %u\n",
5604 			le32_to_cpu(htt_stats_buf->fw_status_buf_ring_refill_cnt));
5605 	len += scnprintf(buf + len, buf_len - len, "fw_status_buf_ring_empty_cnt = %u\n",
5606 			le32_to_cpu(htt_stats_buf->fw_status_buf_ring_empty_cnt));
5607 	len += scnprintf(buf + len, buf_len - len, "fw_pkt_buf_ring_refill_cnt = %u\n",
5608 			le32_to_cpu(htt_stats_buf->fw_pkt_buf_ring_refill_cnt));
5609 	len += scnprintf(buf + len, buf_len - len, "fw_pkt_buf_ring_empty_cnt = %u\n",
5610 			le32_to_cpu(htt_stats_buf->fw_pkt_buf_ring_empty_cnt));
5611 	len += scnprintf(buf + len, buf_len - len, "fw_link_buf_ring_refill_cnt = %u\n",
5612 			le32_to_cpu(htt_stats_buf->fw_link_buf_ring_refill_cnt));
5613 	len += scnprintf(buf + len, buf_len - len, "fw_link_buf_ring_empty_cnt = %u\n",
5614 			le32_to_cpu(htt_stats_buf->fw_link_buf_ring_empty_cnt));
5615 	len += scnprintf(buf + len, buf_len - len, "host_pkt_buf_ring_refill_cnt = %u\n",
5616 			le32_to_cpu(htt_stats_buf->host_pkt_buf_ring_refill_cnt));
5617 	len += scnprintf(buf + len, buf_len - len, "host_pkt_buf_ring_empty_cnt = %u\n",
5618 			le32_to_cpu(htt_stats_buf->host_pkt_buf_ring_empty_cnt));
5619 	len += scnprintf(buf + len, buf_len - len, "mon_pkt_buf_ring_refill_cnt = %u\n",
5620 			le32_to_cpu(htt_stats_buf->mon_pkt_buf_ring_refill_cnt));
5621 	len += scnprintf(buf + len, buf_len - len, "mon_pkt_buf_ring_empty_cnt = %u\n",
5622 			le32_to_cpu(htt_stats_buf->mon_pkt_buf_ring_empty_cnt));
5623 	len += scnprintf(buf + len, buf_len - len,
5624 			"mon_status_buf_ring_refill_cnt = %u\n",
5625 			le32_to_cpu(htt_stats_buf->mon_status_buf_ring_refill_cnt));
5626 	len += scnprintf(buf + len, buf_len - len, "mon_status_buf_ring_empty_cnt = %u\n",
5627 			le32_to_cpu(htt_stats_buf->mon_status_buf_ring_empty_cnt));
5628 	len += scnprintf(buf + len, buf_len - len, "mon_desc_buf_ring_refill_cnt = %u\n",
5629 			le32_to_cpu(htt_stats_buf->mon_desc_buf_ring_refill_cnt));
5630 	len += scnprintf(buf + len, buf_len - len, "mon_desc_buf_ring_empty_cnt = %u\n",
5631 			le32_to_cpu(htt_stats_buf->mon_desc_buf_ring_empty_cnt));
5632 	len += scnprintf(buf + len, buf_len - len, "mon_dest_ring_update_cnt = %u\n",
5633 			le32_to_cpu(htt_stats_buf->mon_dest_ring_update_cnt));
5634 	len += scnprintf(buf + len, buf_len - len, "mon_dest_ring_full_cnt = %u\n",
5635 			le32_to_cpu(htt_stats_buf->mon_dest_ring_full_cnt));
5636 	len += scnprintf(buf + len, buf_len - len, "rx_suspend_cnt = %u\n",
5637 			le32_to_cpu(htt_stats_buf->rx_suspend_cnt));
5638 	len += scnprintf(buf + len, buf_len - len, "rx_suspend_fail_cnt = %u\n",
5639 			le32_to_cpu(htt_stats_buf->rx_suspend_fail_cnt));
5640 	len += scnprintf(buf + len, buf_len - len, "rx_resume_cnt = %u\n",
5641 			le32_to_cpu(htt_stats_buf->rx_resume_cnt));
5642 	len += scnprintf(buf + len, buf_len - len, "rx_resume_fail_cnt = %u\n",
5643 			le32_to_cpu(htt_stats_buf->rx_resume_fail_cnt));
5644 	len += scnprintf(buf + len, buf_len - len, "rx_ring_switch_cnt = %u\n",
5645 			le32_to_cpu(htt_stats_buf->rx_ring_switch_cnt));
5646 	len += scnprintf(buf + len, buf_len - len, "rx_ring_restore_cnt = %u\n",
5647 			le32_to_cpu(htt_stats_buf->rx_ring_restore_cnt));
5648 	len += scnprintf(buf + len, buf_len - len, "rx_flush_cnt = %u\n",
5649 			le32_to_cpu(htt_stats_buf->rx_flush_cnt));
5650 	len += scnprintf(buf + len, buf_len - len, "rx_recovery_reset_cnt = %u\n",
5651 			le32_to_cpu(htt_stats_buf->rx_recovery_reset_cnt));
5652 	len += scnprintf(buf + len, buf_len - len, "rx_lwm_prom_filter_dis = %u\n",
5653 			le32_to_cpu(htt_stats_buf->rx_lwm_prom_filter_dis));
5654 	len += scnprintf(buf + len, buf_len - len, "rx_hwm_prom_filter_en = %u\n",
5655 			le32_to_cpu(htt_stats_buf->rx_hwm_prom_filter_en));
5656 	len += scnprintf(buf + len, buf_len - len, "bytes_received_low_32 = %u\n",
5657 			le32_to_cpu(htt_stats_buf->bytes_received_low_32));
5658 	len += scnprintf(buf + len, buf_len - len, "bytes_received_high_32 = %u\n",
5659 			le32_to_cpu(htt_stats_buf->bytes_received_high_32));
5660 
5661 	stats_req->buf_len = len;
5662 }
5663 
5664 static void
5665 ath12k_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 
5725 static 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 
6034 void 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);
6089 exit:
6090 	rcu_read_unlock();
6091 }
6092 
6093 static 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 
6111 static 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 
6153 static 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 
6161 static 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 
6207 static 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;
6257 out:
6258 	kfree(stats_req);
6259 	ar->debug.htt_stats.stats_req = NULL;
6260 err_unlock:
6261 	wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy);
6262 
6263 	return ret;
6264 }
6265 
6266 static 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 
6279 static 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 
6292 static 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 
6300 static 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 
6354 static 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 
6361 void 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 }
6370