xref: /wlan-dirver/qca-wifi-host-cmn/dp/wifi3.0/dp_stats.c (revision dd4dc88b837a295134aa9869114a2efee0f4894b)
1 /*
2  * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for
5  * any purpose with or without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 #include "qdf_types.h"
19 #include "dp_peer.h"
20 #include "dp_types.h"
21 #include "dp_internal.h"
22 #include "htt_stats.h"
23 #include "htt_ppdu_stats.h"
24 #include "dp_htt.h"
25 
26 #define DP_MAX_STRING_LEN 500
27 
28 #define DP_HTT_HW_INTR_NAME_LEN  HTT_STATS_MAX_HW_INTR_NAME_LEN
29 #define DP_HTT_HW_MODULE_NAME_LEN  HTT_STATS_MAX_HW_MODULE_NAME_LEN
30 #define DP_HTT_COUNTER_NAME_LEN  HTT_MAX_COUNTER_NAME
31 #define DP_HTT_LOW_WM_HIT_COUNT_LEN  HTT_STATS_LOW_WM_BINS
32 #define DP_HTT_HIGH_WM_HIT_COUNT_LEN  HTT_STATS_HIGH_WM_BINS
33 #define DP_HTT_TX_MCS_LEN  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS
34 #define DP_HTT_TX_SU_MCS_LEN  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS
35 #define DP_HTT_TX_MU_MCS_LEN  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS
36 #define DP_HTT_TX_NSS_LEN  HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS
37 #define DP_HTT_TX_BW_LEN  HTT_TX_PDEV_STATS_NUM_BW_COUNTERS
38 #define DP_HTT_TX_PREAM_LEN  HTT_TX_PDEV_STATS_NUM_PREAMBLE_TYPES
39 #define DP_HTT_TX_PDEV_GI_LEN  HTT_TX_PDEV_STATS_NUM_GI_COUNTERS
40 #define DP_HTT_TX_DCM_LEN  HTT_TX_PDEV_STATS_NUM_DCM_COUNTERS
41 #define DP_HTT_RX_MCS_LEN  HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS
42 #define DP_HTT_RX_NSS_LEN  HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS
43 #define DP_HTT_RX_DCM_LEN  HTT_RX_PDEV_STATS_NUM_DCM_COUNTERS
44 #define DP_HTT_RX_BW_LEN  HTT_RX_PDEV_STATS_NUM_BW_COUNTERS
45 #define DP_HTT_RX_PREAM_LEN  HTT_RX_PDEV_STATS_NUM_PREAMBLE_TYPES
46 #define DP_HTT_RSSI_CHAIN_LEN  HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS
47 #define DP_HTT_RX_GI_LEN  HTT_RX_PDEV_STATS_NUM_GI_COUNTERS
48 #define DP_HTT_FW_RING_MGMT_SUBTYPE_LEN  HTT_STATS_SUBTYPE_MAX
49 #define DP_HTT_FW_RING_CTRL_SUBTYPE_LEN  HTT_STATS_SUBTYPE_MAX
50 #define DP_HTT_FW_RING_MPDU_ERR_LEN  HTT_RX_STATS_RXDMA_MAX_ERR
51 #define DP_HTT_TID_NAME_LEN  MAX_HTT_TID_NAME
52 #define DP_HTT_PEER_NUM_SS HTT_RX_PEER_STATS_NUM_SPATIAL_STREAMS
53 #define DP_HTT_PDEV_TX_GI_LEN HTT_TX_PDEV_STATS_NUM_GI_COUNTERS
54 
55 #define DP_MAX_INT_CONTEXTS_STRING_LENGTH (6 * WLAN_CFG_INT_NUM_CONTEXTS)
56 #define DP_NSS_LENGTH (6 * SS_COUNT)
57 #define DP_MU_GROUP_LENGTH (6 * DP_MU_GROUP_SHOW)
58 #define DP_MU_GROUP_SHOW 16
59 #define DP_MAX_MCS_STRING_LEN 30
60 #define DP_RXDMA_ERR_LENGTH (6 * HAL_RXDMA_ERR_MAX)
61 #define DP_REO_ERR_LENGTH (6 * HAL_REO_ERR_MAX)
62 #define STATS_PROC_TIMEOUT        (HZ / 1000)
63 
64 #define MCS_VALID 1
65 #define MCS_INVALID 0
66 
67 /*
68  * struct dp_rate_debug
69  *
70  * @mcs_type: print string for a given mcs
71  * @valid: valid mcs rate?
72  */
73 struct dp_rate_debug {
74 	char mcs_type[DP_MAX_MCS_STRING_LEN];
75 	uint8_t valid;
76 };
77 
78 static const struct dp_rate_debug dp_rate_string[DOT11_MAX][MAX_MCS] = {
79 	{
80 		{"OFDM 48 Mbps", MCS_VALID},
81 		{"OFDM 24 Mbps", MCS_VALID},
82 		{"OFDM 12 Mbps", MCS_VALID},
83 		{"OFDM 6 Mbps ", MCS_VALID},
84 		{"OFDM 54 Mbps", MCS_VALID},
85 		{"OFDM 36 Mbps", MCS_VALID},
86 		{"OFDM 18 Mbps", MCS_VALID},
87 		{"OFDM 9 Mbps ", MCS_VALID},
88 		{"INVALID ", MCS_INVALID},
89 		{"INVALID ", MCS_INVALID},
90 		{"INVALID ", MCS_INVALID},
91 		{"INVALID ", MCS_INVALID},
92 		{"INVALID ", MCS_VALID},
93 	},
94 	{
95 		{"CCK 11 Mbps Long  ", MCS_VALID},
96 		{"CCK 5.5 Mbps Long ", MCS_VALID},
97 		{"CCK 2 Mbps Long   ", MCS_VALID},
98 		{"CCK 1 Mbps Long   ", MCS_VALID},
99 		{"CCK 11 Mbps Short ", MCS_VALID},
100 		{"CCK 5.5 Mbps Short", MCS_VALID},
101 		{"CCK 2 Mbps Short  ", MCS_VALID},
102 		{"INVALID ", MCS_INVALID},
103 		{"INVALID ", MCS_INVALID},
104 		{"INVALID ", MCS_INVALID},
105 		{"INVALID ", MCS_INVALID},
106 		{"INVALID ", MCS_INVALID},
107 		{"INVALID ", MCS_VALID},
108 	},
109 	{
110 		{"HT MCS 0 (BPSK 1/2)  ", MCS_VALID},
111 		{"HT MCS 1 (QPSK 1/2)  ", MCS_VALID},
112 		{"HT MCS 2 (QPSK 3/4)  ", MCS_VALID},
113 		{"HT MCS 3 (16-QAM 1/2)", MCS_VALID},
114 		{"HT MCS 4 (16-QAM 3/4)", MCS_VALID},
115 		{"HT MCS 5 (64-QAM 2/3)", MCS_VALID},
116 		{"HT MCS 6 (64-QAM 3/4)", MCS_VALID},
117 		{"HT MCS 7 (64-QAM 5/6)", MCS_VALID},
118 		{"INVALID ", MCS_INVALID},
119 		{"INVALID ", MCS_INVALID},
120 		{"INVALID ", MCS_INVALID},
121 		{"INVALID ", MCS_INVALID},
122 		{"INVALID ", MCS_VALID},
123 	},
124 	{
125 		{"VHT MCS 0 (BPSK 1/2)     ", MCS_VALID},
126 		{"VHT MCS 1 (QPSK 1/2)     ", MCS_VALID},
127 		{"VHT MCS 2 (QPSK 3/4)     ", MCS_VALID},
128 		{"VHT MCS 3 (16-QAM 1/2)   ", MCS_VALID},
129 		{"VHT MCS 4 (16-QAM 3/4)   ", MCS_VALID},
130 		{"VHT MCS 5 (64-QAM 2/3)   ", MCS_VALID},
131 		{"VHT MCS 6 (64-QAM 3/4)   ", MCS_VALID},
132 		{"VHT MCS 7 (64-QAM 5/6)   ", MCS_VALID},
133 		{"VHT MCS 8 (256-QAM 3/4)  ", MCS_VALID},
134 		{"VHT MCS 9 (256-QAM 5/6)  ", MCS_VALID},
135 		{"VHT MCS 10 (1024-QAM 3/4)", MCS_VALID},
136 		{"VHT MCS 11 (1024-QAM 5/6)", MCS_VALID},
137 		{"INVALID ", MCS_VALID},
138 	},
139 	{
140 		{"HE MCS 0 (BPSK 1/2)     ", MCS_VALID},
141 		{"HE MCS 1 (QPSK 1/2)     ", MCS_VALID},
142 		{"HE MCS 2 (QPSK 3/4)     ", MCS_VALID},
143 		{"HE MCS 3 (16-QAM 1/2)   ", MCS_VALID},
144 		{"HE MCS 4 (16-QAM 3/4)   ", MCS_VALID},
145 		{"HE MCS 5 (64-QAM 2/3)   ", MCS_VALID},
146 		{"HE MCS 6 (64-QAM 3/4)   ", MCS_VALID},
147 		{"HE MCS 7 (64-QAM 5/6)   ", MCS_VALID},
148 		{"HE MCS 8 (256-QAM 3/4)  ", MCS_VALID},
149 		{"HE MCS 9 (256-QAM 5/6)  ", MCS_VALID},
150 		{"HE MCS 10 (1024-QAM 3/4)", MCS_VALID},
151 		{"HE MCS 11 (1024-QAM 5/6)", MCS_VALID},
152 		{"INVALID ", MCS_VALID},
153 	}
154 };
155 
156 #ifdef CONFIG_WIN
157 const char *fw_to_hw_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = {
158 	"0 to 10 ms", "11 to 20 ms",
159 	"21 to 30 ms", "31 to 40 ms",
160 	"41 to 50 ms", "51 to 60 ms",
161 	"61 to 70 ms", "71 to 80 ms",
162 	"81 to 90 ms", "91 to 100 ms",
163 	"101 to 250 ms", "251 to 500 ms", "500+ ms"
164 };
165 
166 const char *sw_enq_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = {
167 	"0 to 1 ms", "1 to 2 ms",
168 	"2 to 3 ms", "3 to 4 ms",
169 	"4 to 5 ms", "5 to 6 ms",
170 	"6 to 7 ms", "7 to 8 ms",
171 	"8 to 9 ms", "9 to 10 ms",
172 	"10 to 11 ms", "11 to 12 ms", "12+ ms"
173 };
174 
175 const char *intfrm_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = {
176 	"0 to 5 ms", "6 to 10 ms",
177 	"11 to 15 ms", "16 to 20 ms",
178 	"21 to 25 ms", "26 to 30 ms",
179 	"31 to 35 ms", "36 to 40 ms",
180 	"41 to 45 ms", "46 to 50 ms",
181 	"51 to 55 ms", "56 to 60 ms", "60+ ms"
182 };
183 #endif
184 
185 #ifdef WLAN_TX_PKT_CAPTURE_ENH
186 #include "dp_tx_capture.h"
187 #endif
188 
189 /*
190  * dp_print_stats_string_tlv: display htt_stats_string_tlv
191  * @tag_buf: buffer containing the tlv htt_stats_string_tlv
192  *
193  * return:void
194  */
195 static inline void dp_print_stats_string_tlv(uint32_t *tag_buf)
196 {
197 	htt_stats_string_tlv *dp_stats_buf =
198 		(htt_stats_string_tlv *)tag_buf;
199 	uint8_t i;
200 	uint16_t index = 0;
201 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
202 	char *data = qdf_mem_malloc(DP_MAX_STRING_LEN);
203 
204 	if (!data) {
205 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
206 			  FL("Output buffer not allocated"));
207 		return;
208 	}
209 
210 	DP_PRINT_STATS("HTT_STATS_STRING_TLV:");
211 	for (i = 0; i <  tag_len; i++) {
212 		index += qdf_snprint(&data[index],
213 				DP_MAX_STRING_LEN - index,
214 				" %u:%u,", i, dp_stats_buf->data[i]);
215 	}
216 	DP_PRINT_STATS("data = %s\n", data);
217 	qdf_mem_free(data);
218 }
219 
220 /*
221  * dp_print_tx_pdev_stats_cmn_tlv: display htt_tx_pdev_stats_cmn_tlv
222  * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_cmn_tlv
223  *
224  * return:void
225  */
226 static inline void dp_print_tx_pdev_stats_cmn_tlv(uint32_t *tag_buf)
227 {
228 	htt_tx_pdev_stats_cmn_tlv *dp_stats_buf =
229 		(htt_tx_pdev_stats_cmn_tlv *)tag_buf;
230 
231 	DP_PRINT_STATS("HTT_TX_PDEV_STATS_CMN_TLV:");
232 	DP_PRINT_STATS("mac_id__word = %u",
233 		       dp_stats_buf->mac_id__word);
234 	DP_PRINT_STATS("hw_queued = %u",
235 		       dp_stats_buf->hw_queued);
236 	DP_PRINT_STATS("hw_reaped = %u",
237 		       dp_stats_buf->hw_reaped);
238 	DP_PRINT_STATS("underrun = %u",
239 		       dp_stats_buf->underrun);
240 	DP_PRINT_STATS("hw_paused = %u",
241 		       dp_stats_buf->hw_paused);
242 	DP_PRINT_STATS("hw_flush = %u",
243 		       dp_stats_buf->hw_flush);
244 	DP_PRINT_STATS("hw_filt = %u",
245 		       dp_stats_buf->hw_filt);
246 	DP_PRINT_STATS("tx_abort = %u",
247 		       dp_stats_buf->tx_abort);
248 	DP_PRINT_STATS("mpdu_requeued = %u",
249 		       dp_stats_buf->mpdu_requed);
250 	DP_PRINT_STATS("tx_xretry = %u",
251 		       dp_stats_buf->tx_xretry);
252 	DP_PRINT_STATS("data_rc = %u",
253 		       dp_stats_buf->data_rc);
254 	DP_PRINT_STATS("mpdu_dropped_xretry = %u",
255 		       dp_stats_buf->mpdu_dropped_xretry);
256 	DP_PRINT_STATS("illegal_rate_phy_err = %u",
257 		       dp_stats_buf->illgl_rate_phy_err);
258 	DP_PRINT_STATS("cont_xretry = %u",
259 		       dp_stats_buf->cont_xretry);
260 	DP_PRINT_STATS("tx_timeout = %u",
261 		       dp_stats_buf->tx_timeout);
262 	DP_PRINT_STATS("pdev_resets = %u",
263 		       dp_stats_buf->pdev_resets);
264 	DP_PRINT_STATS("phy_underrun = %u",
265 		       dp_stats_buf->phy_underrun);
266 	DP_PRINT_STATS("txop_ovf = %u",
267 		       dp_stats_buf->txop_ovf);
268 	DP_PRINT_STATS("seq_posted = %u",
269 		       dp_stats_buf->seq_posted);
270 	DP_PRINT_STATS("seq_failed_queueing = %u",
271 		       dp_stats_buf->seq_failed_queueing);
272 	DP_PRINT_STATS("seq_completed = %u",
273 		       dp_stats_buf->seq_completed);
274 	DP_PRINT_STATS("seq_restarted = %u",
275 		       dp_stats_buf->seq_restarted);
276 	DP_PRINT_STATS("mu_seq_posted = %u",
277 		       dp_stats_buf->mu_seq_posted);
278 	DP_PRINT_STATS("seq_switch_hw_paused = %u",
279 		       dp_stats_buf->seq_switch_hw_paused);
280 	DP_PRINT_STATS("next_seq_posted_dsr = %u",
281 		       dp_stats_buf->next_seq_posted_dsr);
282 	DP_PRINT_STATS("seq_posted_isr = %u",
283 		       dp_stats_buf->seq_posted_isr);
284 	DP_PRINT_STATS("seq_ctrl_cached = %u",
285 		       dp_stats_buf->seq_ctrl_cached);
286 	DP_PRINT_STATS("mpdu_count_tqm = %u",
287 		       dp_stats_buf->mpdu_count_tqm);
288 	DP_PRINT_STATS("msdu_count_tqm = %u",
289 		       dp_stats_buf->msdu_count_tqm);
290 	DP_PRINT_STATS("mpdu_removed_tqm = %u",
291 		       dp_stats_buf->mpdu_removed_tqm);
292 	DP_PRINT_STATS("msdu_removed_tqm = %u",
293 		       dp_stats_buf->msdu_removed_tqm);
294 	DP_PRINT_STATS("mpdus_sw_flush = %u",
295 		       dp_stats_buf->mpdus_sw_flush);
296 	DP_PRINT_STATS("mpdus_hw_filter = %u",
297 		       dp_stats_buf->mpdus_hw_filter);
298 	DP_PRINT_STATS("mpdus_truncated = %u",
299 		       dp_stats_buf->mpdus_truncated);
300 	DP_PRINT_STATS("mpdus_ack_failed = %u",
301 		       dp_stats_buf->mpdus_ack_failed);
302 	DP_PRINT_STATS("mpdus_expired = %u",
303 		       dp_stats_buf->mpdus_expired);
304 	DP_PRINT_STATS("mpdus_seq_hw_retry = %u",
305 		       dp_stats_buf->mpdus_seq_hw_retry);
306 	DP_PRINT_STATS("ack_tlv_proc = %u",
307 		       dp_stats_buf->ack_tlv_proc);
308 	DP_PRINT_STATS("coex_abort_mpdu_cnt_valid = %u",
309 		       dp_stats_buf->coex_abort_mpdu_cnt_valid);
310 	DP_PRINT_STATS("coex_abort_mpdu_cnt = %u\n",
311 		       dp_stats_buf->coex_abort_mpdu_cnt);
312 }
313 
314 /*
315  * dp_print_tx_pdev_stats_urrn_tlv_v: display htt_tx_pdev_stats_urrn_tlv_v
316  * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_urrn_tlv_v
317  *
318  * return:void
319  */
320 static inline void dp_print_tx_pdev_stats_urrn_tlv_v(uint32_t *tag_buf)
321 {
322 	htt_tx_pdev_stats_urrn_tlv_v *dp_stats_buf =
323 		(htt_tx_pdev_stats_urrn_tlv_v *)tag_buf;
324 	uint8_t i;
325 	uint16_t index = 0;
326 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
327 	char *urrn_stats = qdf_mem_malloc(DP_MAX_STRING_LEN);
328 
329 	if (!urrn_stats) {
330 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
331 			  FL("Output buffer not allocated"));
332 		return;
333 	}
334 
335 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_URRN_STATS);
336 	DP_PRINT_STATS("HTT_TX_PDEV_STATS_URRN_TLV_V:");
337 	for (i = 0; i <  tag_len; i++) {
338 		index += qdf_snprint(&urrn_stats[index],
339 				DP_MAX_STRING_LEN - index,
340 				" %u:%u,", i, dp_stats_buf->urrn_stats[i]);
341 	}
342 	DP_PRINT_STATS("urrn_stats = %s\n", urrn_stats);
343 	qdf_mem_free(urrn_stats);
344 }
345 
346 /*
347  * dp_print_tx_pdev_stats_flush_tlv_v: display htt_tx_pdev_stats_flush_tlv_v
348  * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_flush_tlv_v
349  *
350  * return:void
351  */
352 static inline void dp_print_tx_pdev_stats_flush_tlv_v(uint32_t *tag_buf)
353 {
354 	htt_tx_pdev_stats_flush_tlv_v *dp_stats_buf =
355 		(htt_tx_pdev_stats_flush_tlv_v *)tag_buf;
356 	uint8_t i;
357 	uint16_t index = 0;
358 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
359 	char *flush_errs = qdf_mem_malloc(DP_MAX_STRING_LEN);
360 
361 	if (!flush_errs) {
362 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
363 			  FL("Output buffer not allocated"));
364 		return;
365 	}
366 
367 	tag_len = qdf_min(tag_len,
368 			(uint32_t)HTT_TX_PDEV_MAX_FLUSH_REASON_STATS);
369 
370 	DP_PRINT_STATS("HTT_TX_PDEV_STATS_FLUSH_TLV_V:");
371 	for (i = 0; i <  tag_len; i++) {
372 		index += qdf_snprint(&flush_errs[index],
373 				DP_MAX_STRING_LEN - index,
374 				" %u:%u,", i, dp_stats_buf->flush_errs[i]);
375 	}
376 	DP_PRINT_STATS("flush_errs = %s\n", flush_errs);
377 	qdf_mem_free(flush_errs);
378 }
379 
380 /*
381  * dp_print_tx_pdev_stats_sifs_tlv_v: display htt_tx_pdev_stats_sifs_tlv_v
382  * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_sifs_tlv_v
383  *
384  * return:void
385  */
386 static inline void dp_print_tx_pdev_stats_sifs_tlv_v(uint32_t *tag_buf)
387 {
388 	htt_tx_pdev_stats_sifs_tlv_v *dp_stats_buf =
389 		(htt_tx_pdev_stats_sifs_tlv_v *)tag_buf;
390 	uint8_t i;
391 	uint16_t index = 0;
392 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
393 	char *sifs_status = qdf_mem_malloc(DP_MAX_STRING_LEN);
394 
395 	if (!sifs_status) {
396 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
397 			  FL("Output buffer not allocated"));
398 		return;
399 	}
400 
401 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_SIFS_BURST_STATS);
402 
403 	DP_PRINT_STATS("HTT_TX_PDEV_STATS_SIFS_TLV_V:");
404 	for (i = 0; i <  tag_len; i++) {
405 		index += qdf_snprint(&sifs_status[index],
406 				DP_MAX_STRING_LEN - index,
407 				" %u:%u,", i, dp_stats_buf->sifs_status[i]);
408 	}
409 	DP_PRINT_STATS("sifs_status = %s\n", sifs_status);
410 	qdf_mem_free(sifs_status);
411 }
412 
413 /*
414  * dp_print_tx_pdev_stats_phy_err_tlv_v: display htt_tx_pdev_stats_phy_err_tlv_v
415  * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_phy_err_tlv_v
416  *
417  * return:void
418  */
419 static inline void dp_print_tx_pdev_stats_phy_err_tlv_v(uint32_t *tag_buf)
420 {
421 	htt_tx_pdev_stats_phy_err_tlv_v *dp_stats_buf =
422 		(htt_tx_pdev_stats_phy_err_tlv_v *)tag_buf;
423 	uint8_t i;
424 	uint16_t index = 0;
425 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
426 	char *phy_errs = qdf_mem_malloc(DP_MAX_STRING_LEN);
427 
428 	if (!phy_errs) {
429 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
430 			  FL("Output buffer not allocated"));
431 		return;
432 	}
433 
434 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_PHY_ERR_STATS);
435 
436 	DP_PRINT_STATS("HTT_TX_PDEV_STATS_PHY_ERR_TLV_V:");
437 	for (i = 0; i <  tag_len; i++) {
438 		index += qdf_snprint(&phy_errs[index],
439 				DP_MAX_STRING_LEN - index,
440 				" %u:%u,", i, dp_stats_buf->phy_errs[i]);
441 	}
442 	DP_PRINT_STATS("phy_errs = %s\n", phy_errs);
443 	qdf_mem_free(phy_errs);
444 }
445 
446 /*
447  * dp_print_hw_stats_intr_misc_tlv: display htt_hw_stats_intr_misc_tlv
448  * @tag_buf: buffer containing the tlv htt_hw_stats_intr_misc_tlv
449  *
450  * return:void
451  */
452 static inline void dp_print_hw_stats_intr_misc_tlv(uint32_t *tag_buf)
453 {
454 	htt_hw_stats_intr_misc_tlv *dp_stats_buf =
455 		(htt_hw_stats_intr_misc_tlv *)tag_buf;
456 	uint8_t i;
457 	uint16_t index = 0;
458 	char *hw_intr_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
459 
460 	if (!hw_intr_name) {
461 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
462 			  FL("Output buffer not allocated"));
463 		return;
464 	}
465 
466 	DP_PRINT_STATS("HTT_HW_STATS_INTR_MISC_TLV:");
467 	for (i = 0; i <  DP_HTT_HW_INTR_NAME_LEN; i++) {
468 		index += qdf_snprint(&hw_intr_name[index],
469 				DP_MAX_STRING_LEN - index,
470 				" %u:%u,", i, dp_stats_buf->hw_intr_name[i]);
471 	}
472 	DP_PRINT_STATS("hw_intr_name = %s ", hw_intr_name);
473 	DP_PRINT_STATS("mask = %u",
474 		       dp_stats_buf->mask);
475 	DP_PRINT_STATS("count = %u\n",
476 		       dp_stats_buf->count);
477 	qdf_mem_free(hw_intr_name);
478 }
479 
480 /*
481  * dp_print_hw_stats_wd_timeout_tlv: display htt_hw_stats_wd_timeout_tlv
482  * @tag_buf: buffer containing the tlv htt_hw_stats_wd_timeout_tlv
483  *
484  * return:void
485  */
486 static inline void dp_print_hw_stats_wd_timeout_tlv(uint32_t *tag_buf)
487 {
488 	htt_hw_stats_wd_timeout_tlv *dp_stats_buf =
489 		(htt_hw_stats_wd_timeout_tlv *)tag_buf;
490 	uint8_t i;
491 	uint16_t index = 0;
492 	char *hw_module_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
493 
494 	if (!hw_module_name) {
495 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
496 			  FL("Output buffer not allocated"));
497 		return;
498 	}
499 
500 	DP_PRINT_STATS("HTT_HW_STATS_WD_TIMEOUT_TLV:");
501 	for (i = 0; i <  DP_HTT_HW_MODULE_NAME_LEN; i++) {
502 		index += qdf_snprint(&hw_module_name[index],
503 				DP_MAX_STRING_LEN - index,
504 				" %u:%u,", i, dp_stats_buf->hw_module_name[i]);
505 	}
506 	DP_PRINT_STATS("hw_module_name = %s ", hw_module_name);
507 	DP_PRINT_STATS("count = %u",
508 		       dp_stats_buf->count);
509 	qdf_mem_free(hw_module_name);
510 }
511 
512 /*
513  * dp_print_hw_stats_pdev_errs_tlv: display htt_hw_stats_pdev_errs_tlv
514  * @tag_buf: buffer containing the tlv htt_hw_stats_pdev_errs_tlv
515  *
516  * return:void
517  */
518 static inline void dp_print_hw_stats_pdev_errs_tlv(uint32_t *tag_buf)
519 {
520 	htt_hw_stats_pdev_errs_tlv *dp_stats_buf =
521 		(htt_hw_stats_pdev_errs_tlv *)tag_buf;
522 
523 	DP_PRINT_STATS("HTT_HW_STATS_PDEV_ERRS_TLV:");
524 	DP_PRINT_STATS("mac_id__word = %u",
525 		       dp_stats_buf->mac_id__word);
526 	DP_PRINT_STATS("tx_abort = %u",
527 		       dp_stats_buf->tx_abort);
528 	DP_PRINT_STATS("tx_abort_fail_count = %u",
529 		       dp_stats_buf->tx_abort_fail_count);
530 	DP_PRINT_STATS("rx_abort = %u",
531 		       dp_stats_buf->rx_abort);
532 	DP_PRINT_STATS("rx_abort_fail_count = %u",
533 		       dp_stats_buf->rx_abort_fail_count);
534 	DP_PRINT_STATS("warm_reset = %u",
535 		       dp_stats_buf->warm_reset);
536 	DP_PRINT_STATS("cold_reset = %u",
537 		       dp_stats_buf->cold_reset);
538 	DP_PRINT_STATS("tx_flush = %u",
539 		       dp_stats_buf->tx_flush);
540 	DP_PRINT_STATS("tx_glb_reset = %u",
541 		       dp_stats_buf->tx_glb_reset);
542 	DP_PRINT_STATS("tx_txq_reset = %u",
543 		       dp_stats_buf->tx_txq_reset);
544 	DP_PRINT_STATS("rx_timeout_reset = %u\n",
545 		       dp_stats_buf->rx_timeout_reset);
546 }
547 
548 /*
549  * dp_print_msdu_flow_stats_tlv: display htt_msdu_flow_stats_tlv
550  * @tag_buf: buffer containing the tlv htt_msdu_flow_stats_tlv
551  *
552  * return:void
553  */
554 static inline void dp_print_msdu_flow_stats_tlv(uint32_t *tag_buf)
555 {
556 	htt_msdu_flow_stats_tlv *dp_stats_buf =
557 		(htt_msdu_flow_stats_tlv *)tag_buf;
558 
559 	DP_PRINT_STATS("HTT_MSDU_FLOW_STATS_TLV:");
560 	DP_PRINT_STATS("last_update_timestamp = %u",
561 		       dp_stats_buf->last_update_timestamp);
562 	DP_PRINT_STATS("last_add_timestamp = %u",
563 		       dp_stats_buf->last_add_timestamp);
564 	DP_PRINT_STATS("last_remove_timestamp = %u",
565 		       dp_stats_buf->last_remove_timestamp);
566 	DP_PRINT_STATS("total_processed_msdu_count = %u",
567 		       dp_stats_buf->total_processed_msdu_count);
568 	DP_PRINT_STATS("cur_msdu_count_in_flowq = %u",
569 		       dp_stats_buf->cur_msdu_count_in_flowq);
570 	DP_PRINT_STATS("sw_peer_id = %u",
571 		       dp_stats_buf->sw_peer_id);
572 	DP_PRINT_STATS("tx_flow_no__tid_num__drop_rule = %u\n",
573 		       dp_stats_buf->tx_flow_no__tid_num__drop_rule);
574 }
575 
576 /*
577  * dp_print_tx_tid_stats_tlv: display htt_tx_tid_stats_tlv
578  * @tag_buf: buffer containing the tlv htt_tx_tid_stats_tlv
579  *
580  * return:void
581  */
582 static inline void dp_print_tx_tid_stats_tlv(uint32_t *tag_buf)
583 {
584 	htt_tx_tid_stats_tlv *dp_stats_buf =
585 		(htt_tx_tid_stats_tlv *)tag_buf;
586 	uint8_t i;
587 	uint16_t index = 0;
588 	char *tid_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
589 
590 	if (!tid_name) {
591 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
592 			  FL("Output buffer not allocated"));
593 		return;
594 	}
595 
596 	DP_PRINT_STATS("HTT_TX_TID_STATS_TLV:");
597 	for (i = 0; i <  DP_HTT_TID_NAME_LEN; i++) {
598 		index += qdf_snprint(&tid_name[index],
599 				DP_MAX_STRING_LEN - index,
600 				" %u:%u,", i, dp_stats_buf->tid_name[i]);
601 	}
602 	DP_PRINT_STATS("tid_name = %s ", tid_name);
603 	DP_PRINT_STATS("sw_peer_id__tid_num = %u",
604 		       dp_stats_buf->sw_peer_id__tid_num);
605 	DP_PRINT_STATS("num_sched_pending__num_ppdu_in_hwq = %u",
606 		       dp_stats_buf->num_sched_pending__num_ppdu_in_hwq);
607 	DP_PRINT_STATS("tid_flags = %u",
608 		       dp_stats_buf->tid_flags);
609 	DP_PRINT_STATS("hw_queued = %u",
610 		       dp_stats_buf->hw_queued);
611 	DP_PRINT_STATS("hw_reaped = %u",
612 		       dp_stats_buf->hw_reaped);
613 	DP_PRINT_STATS("mpdus_hw_filter = %u",
614 		       dp_stats_buf->mpdus_hw_filter);
615 	DP_PRINT_STATS("qdepth_bytes = %u",
616 		       dp_stats_buf->qdepth_bytes);
617 	DP_PRINT_STATS("qdepth_num_msdu = %u",
618 		       dp_stats_buf->qdepth_num_msdu);
619 	DP_PRINT_STATS("qdepth_num_mpdu = %u",
620 		       dp_stats_buf->qdepth_num_mpdu);
621 	DP_PRINT_STATS("last_scheduled_tsmp = %u",
622 		       dp_stats_buf->last_scheduled_tsmp);
623 	DP_PRINT_STATS("pause_module_id = %u",
624 		       dp_stats_buf->pause_module_id);
625 	DP_PRINT_STATS("block_module_id = %u\n",
626 		       dp_stats_buf->block_module_id);
627 	DP_PRINT_STATS("tid_tx_airtime = %u\n",
628 		       dp_stats_buf->tid_tx_airtime);
629 	qdf_mem_free(tid_name);
630 }
631 
632 /*
633  * dp_print_tx_tid_stats_v1_tlv: display htt_tx_tid_stats_v1_tlv
634  * @tag_buf: buffer containing the tlv htt_tx_tid_stats_v1_tlv
635  *
636  * return:void
637  */
638 static inline void dp_print_tx_tid_stats_v1_tlv(uint32_t *tag_buf)
639 {
640 	htt_tx_tid_stats_v1_tlv *dp_stats_buf =
641 		(htt_tx_tid_stats_v1_tlv *)tag_buf;
642 	uint8_t i;
643 	uint16_t index = 0;
644 	char *tid_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
645 
646 	if (!tid_name) {
647 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
648 			  FL("Output buffer not allocated"));
649 		return;
650 	}
651 
652 	DP_PRINT_STATS("HTT_TX_TID_STATS_V1_TLV:");
653 	for (i = 0; i <  DP_HTT_TID_NAME_LEN; i++) {
654 		index += qdf_snprint(&tid_name[index],
655 				DP_MAX_STRING_LEN - index,
656 				" %u:%u,", i, dp_stats_buf->tid_name[i]);
657 	}
658 	DP_PRINT_STATS("tid_name = %s ", tid_name);
659 	DP_PRINT_STATS("sw_peer_id__tid_num = %u",
660 		       dp_stats_buf->sw_peer_id__tid_num);
661 	DP_PRINT_STATS("num_sched_pending__num_ppdu_in_hwq = %u",
662 		       dp_stats_buf->num_sched_pending__num_ppdu_in_hwq);
663 	DP_PRINT_STATS("tid_flags = %u",
664 		       dp_stats_buf->tid_flags);
665 	DP_PRINT_STATS("max_qdepth_bytes = %u",
666 		       dp_stats_buf->max_qdepth_bytes);
667 	DP_PRINT_STATS("max_qdepth_n_msdus = %u",
668 		       dp_stats_buf->max_qdepth_n_msdus);
669 	DP_PRINT_STATS("rsvd = %u",
670 		       dp_stats_buf->rsvd);
671 	DP_PRINT_STATS("qdepth_bytes = %u",
672 		       dp_stats_buf->qdepth_bytes);
673 	DP_PRINT_STATS("qdepth_num_msdu = %u",
674 		       dp_stats_buf->qdepth_num_msdu);
675 	DP_PRINT_STATS("qdepth_num_mpdu = %u",
676 		       dp_stats_buf->qdepth_num_mpdu);
677 	DP_PRINT_STATS("last_scheduled_tsmp = %u",
678 		       dp_stats_buf->last_scheduled_tsmp);
679 	DP_PRINT_STATS("pause_module_id = %u",
680 		       dp_stats_buf->pause_module_id);
681 	DP_PRINT_STATS("block_module_id = %u\n",
682 		       dp_stats_buf->block_module_id);
683 	DP_PRINT_STATS("tid_tx_airtime = %u\n",
684 		       dp_stats_buf->tid_tx_airtime);
685 	qdf_mem_free(tid_name);
686 }
687 
688 /*
689  * dp_print_rx_tid_stats_tlv: display htt_rx_tid_stats_tlv
690  * @tag_buf: buffer containing the tlv htt_rx_tid_stats_tlv
691  *
692  * return:void
693  */
694 static inline void dp_print_rx_tid_stats_tlv(uint32_t *tag_buf)
695 {
696 	htt_rx_tid_stats_tlv *dp_stats_buf =
697 		(htt_rx_tid_stats_tlv *)tag_buf;
698 	uint8_t i;
699 	uint16_t index = 0;
700 	char *tid_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
701 
702 	if (!tid_name) {
703 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
704 			  FL("Output buffer not allocated"));
705 		return;
706 	}
707 
708 	DP_PRINT_STATS("HTT_RX_TID_STATS_TLV:");
709 	DP_PRINT_STATS("sw_peer_id__tid_num = %u",
710 		       dp_stats_buf->sw_peer_id__tid_num);
711 	for (i = 0; i <  DP_HTT_TID_NAME_LEN; i++) {
712 		index += qdf_snprint(&tid_name[index],
713 				DP_MAX_STRING_LEN - index,
714 				" %u:%u,", i, dp_stats_buf->tid_name[i]);
715 	}
716 	DP_PRINT_STATS("tid_name = %s ", tid_name);
717 	DP_PRINT_STATS("dup_in_reorder = %u",
718 		       dp_stats_buf->dup_in_reorder);
719 	DP_PRINT_STATS("dup_past_outside_window = %u",
720 		       dp_stats_buf->dup_past_outside_window);
721 	DP_PRINT_STATS("dup_past_within_window = %u",
722 		       dp_stats_buf->dup_past_within_window);
723 	DP_PRINT_STATS("rxdesc_err_decrypt = %u\n",
724 		       dp_stats_buf->rxdesc_err_decrypt);
725 	qdf_mem_free(tid_name);
726 }
727 
728 /*
729  * dp_print_counter_tlv: display htt_counter_tlv
730  * @tag_buf: buffer containing the tlv htt_counter_tlv
731  *
732  * return:void
733  */
734 static inline void dp_print_counter_tlv(uint32_t *tag_buf)
735 {
736 	htt_counter_tlv *dp_stats_buf =
737 		(htt_counter_tlv *)tag_buf;
738 	uint8_t i;
739 	uint16_t index = 0;
740 	char *counter_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
741 
742 	if (!counter_name) {
743 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
744 			  FL("Output buffer not allocated"));
745 		return;
746 	}
747 
748 	DP_PRINT_STATS("HTT_COUNTER_TLV:");
749 	for (i = 0; i <  DP_HTT_COUNTER_NAME_LEN; i++) {
750 		index += qdf_snprint(&counter_name[index],
751 				DP_MAX_STRING_LEN - index,
752 				" %u:%u,", i, dp_stats_buf->counter_name[i]);
753 	}
754 	DP_PRINT_STATS("counter_name = %s ", counter_name);
755 	DP_PRINT_STATS("count = %u\n",
756 		       dp_stats_buf->count);
757 	qdf_mem_free(counter_name);
758 }
759 
760 /*
761  * dp_print_peer_stats_cmn_tlv: display htt_peer_stats_cmn_tlv
762  * @tag_buf: buffer containing the tlv htt_peer_stats_cmn_tlv
763  *
764  * return:void
765  */
766 static inline void dp_print_peer_stats_cmn_tlv(uint32_t *tag_buf)
767 {
768 	htt_peer_stats_cmn_tlv *dp_stats_buf =
769 		(htt_peer_stats_cmn_tlv *)tag_buf;
770 
771 	DP_PRINT_STATS("HTT_PEER_STATS_CMN_TLV:");
772 	DP_PRINT_STATS("ppdu_cnt = %u",
773 		       dp_stats_buf->ppdu_cnt);
774 	DP_PRINT_STATS("mpdu_cnt = %u",
775 		       dp_stats_buf->mpdu_cnt);
776 	DP_PRINT_STATS("msdu_cnt = %u",
777 		       dp_stats_buf->msdu_cnt);
778 	DP_PRINT_STATS("pause_bitmap = %u",
779 		       dp_stats_buf->pause_bitmap);
780 	DP_PRINT_STATS("block_bitmap = %u",
781 		       dp_stats_buf->block_bitmap);
782 	DP_PRINT_STATS("current_timestamp = %u\n",
783 		       dp_stats_buf->current_timestamp);
784 	DP_PRINT_STATS("inactive_time = %u",
785 		       dp_stats_buf->inactive_time);
786 }
787 
788 /*
789  * dp_print_peer_details_tlv: display htt_peer_details_tlv
790  * @tag_buf: buffer containing the tlv htt_peer_details_tlv
791  *
792  * return:void
793  */
794 static inline void dp_print_peer_details_tlv(uint32_t *tag_buf)
795 {
796 	htt_peer_details_tlv *dp_stats_buf =
797 		(htt_peer_details_tlv *)tag_buf;
798 
799 	DP_PRINT_STATS("HTT_PEER_DETAILS_TLV:");
800 	DP_PRINT_STATS("peer_type = %u",
801 		       dp_stats_buf->peer_type);
802 	DP_PRINT_STATS("sw_peer_id = %u",
803 		       dp_stats_buf->sw_peer_id);
804 	DP_PRINT_STATS("vdev_pdev_ast_idx = %u",
805 		       dp_stats_buf->vdev_pdev_ast_idx);
806 	DP_PRINT_STATS("mac_addr(upper 4 bytes) = %u",
807 		       dp_stats_buf->mac_addr.mac_addr31to0);
808 	DP_PRINT_STATS("mac_addr(lower 2 bytes) = %u",
809 		       dp_stats_buf->mac_addr.mac_addr47to32);
810 	DP_PRINT_STATS("peer_flags = %u",
811 		       dp_stats_buf->peer_flags);
812 	DP_PRINT_STATS("qpeer_flags = %u\n",
813 		       dp_stats_buf->qpeer_flags);
814 }
815 
816 /*
817  * dp_print_tx_peer_rate_stats_tlv: display htt_tx_peer_rate_stats_tlv
818  * @tag_buf: buffer containing the tlv htt_tx_peer_rate_stats_tlv
819  *
820  * return:void
821  */
822 static inline void dp_print_tx_peer_rate_stats_tlv(uint32_t *tag_buf)
823 {
824 	htt_tx_peer_rate_stats_tlv *dp_stats_buf =
825 		(htt_tx_peer_rate_stats_tlv *)tag_buf;
826 	uint8_t i, j;
827 	uint16_t index = 0;
828 	char *tx_gi[HTT_TX_PEER_STATS_NUM_GI_COUNTERS];
829 	char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
830 
831 	if (!str_buf) {
832 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
833 			  FL("Output buffer not allocated"));
834 		return;
835 	}
836 
837 	for (i = 0; i < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; i++)
838 		tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
839 
840 	DP_PRINT_STATS("HTT_TX_PEER_RATE_STATS_TLV:");
841 	DP_PRINT_STATS("tx_ldpc = %u",
842 		       dp_stats_buf->tx_ldpc);
843 	DP_PRINT_STATS("rts_cnt = %u",
844 		       dp_stats_buf->rts_cnt);
845 	DP_PRINT_STATS("ack_rssi = %u",
846 		       dp_stats_buf->ack_rssi);
847 
848 	index = 0;
849 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
850 	for (i = 0; i <  DP_HTT_TX_MCS_LEN; i++) {
851 		index += qdf_snprint(&str_buf[index],
852 				DP_MAX_STRING_LEN - index,
853 				" %u:%u,", i, dp_stats_buf->tx_mcs[i]);
854 	}
855 	DP_PRINT_STATS("tx_mcs = %s ", str_buf);
856 
857 	index = 0;
858 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
859 	for (i = 0; i <  DP_HTT_TX_SU_MCS_LEN; i++) {
860 		index += qdf_snprint(&str_buf[index],
861 				DP_MAX_STRING_LEN - index,
862 				" %u:%u,", i, dp_stats_buf->tx_su_mcs[i]);
863 	}
864 	DP_PRINT_STATS("tx_su_mcs = %s ", str_buf);
865 	index = 0;
866 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
867 	for (i = 0; i <  DP_HTT_TX_MU_MCS_LEN; i++) {
868 		index += qdf_snprint(&str_buf[index],
869 				DP_MAX_STRING_LEN - index,
870 				" %u:%u,", i, dp_stats_buf->tx_mu_mcs[i]);
871 	}
872 	DP_PRINT_STATS("tx_mu_mcs = %s ", str_buf);
873 	index = 0;
874 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
875 	for (i = 0; i <  DP_HTT_TX_NSS_LEN; i++) {
876 		/* 0 stands for NSS 1, 1 stands for NSS 2, etc. */
877 		index += qdf_snprint(&str_buf[index],
878 				DP_MAX_STRING_LEN - index,
879 				" %u:%u,", (i + 1),
880 				dp_stats_buf->tx_nss[i]);
881 	}
882 	DP_PRINT_STATS("tx_nss = %s ", str_buf);
883 	index = 0;
884 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
885 	for (i = 0; i <  DP_HTT_TX_BW_LEN; i++) {
886 		index += qdf_snprint(&str_buf[index],
887 				DP_MAX_STRING_LEN - index,
888 				" %u:%u,", i, dp_stats_buf->tx_bw[i]);
889 	}
890 	DP_PRINT_STATS("tx_bw = %s ", str_buf);
891 	index = 0;
892 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
893 	for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
894 		index += qdf_snprint(&str_buf[index],
895 				DP_MAX_STRING_LEN - index,
896 				" %u:%u,", i, dp_stats_buf->tx_stbc[i]);
897 	}
898 	DP_PRINT_STATS("tx_stbc = %s ", str_buf);
899 	index = 0;
900 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
901 
902 	for (i = 0; i <  DP_HTT_TX_PREAM_LEN; i++) {
903 		index += qdf_snprint(&str_buf[index],
904 				DP_MAX_STRING_LEN - index,
905 				" %u:%u,", i, dp_stats_buf->tx_pream[i]);
906 	}
907 	DP_PRINT_STATS("tx_pream = %s ", str_buf);
908 
909 	for (j = 0; j < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; j++) {
910 		index = 0;
911 		for (i = 0; i <  HTT_TX_PEER_STATS_NUM_MCS_COUNTERS; i++) {
912 			index += qdf_snprint(&tx_gi[j][index],
913 					DP_MAX_STRING_LEN - index,
914 					" %u:%u,", i,
915 					dp_stats_buf->tx_gi[j][i]);
916 		}
917 		DP_PRINT_STATS("tx_gi[%u] = %s ", j, tx_gi[j]);
918 	}
919 
920 	index = 0;
921 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
922 	for (i = 0; i <  DP_HTT_TX_DCM_LEN; i++) {
923 		index += qdf_snprint(&str_buf[index],
924 				DP_MAX_STRING_LEN - index,
925 				" %u:%u,", i, dp_stats_buf->tx_dcm[i]);
926 	}
927 	DP_PRINT_STATS("tx_dcm = %s\n", str_buf);
928 	for (i = 0; i < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; i++)
929 		qdf_mem_free(tx_gi[i]);
930 
931 	qdf_mem_free(str_buf);
932 }
933 
934 /*
935  * dp_print_rx_peer_rate_stats_tlv: display htt_rx_peer_rate_stats_tlv
936  * @tag_buf: buffer containing the tlv htt_rx_peer_rate_stats_tlv
937  *
938  * return:void
939  */
940 static inline void dp_print_rx_peer_rate_stats_tlv(uint32_t *tag_buf)
941 {
942 	htt_rx_peer_rate_stats_tlv *dp_stats_buf =
943 		(htt_rx_peer_rate_stats_tlv *)tag_buf;
944 	uint8_t i, j;
945 	uint16_t index = 0;
946 	char *rssi_chain[DP_HTT_PEER_NUM_SS];
947 	char *rx_gi[HTT_RX_PEER_STATS_NUM_GI_COUNTERS];
948 	char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
949 
950 	if (!str_buf) {
951 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
952 			  FL("Output buffer not allocated"));
953 		return;
954 	}
955 
956 	for (i = 0; i < DP_HTT_PEER_NUM_SS; i++)
957 		rssi_chain[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
958 	for (i = 0; i < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; i++)
959 		rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
960 
961 	DP_PRINT_STATS("HTT_RX_PEER_RATE_STATS_TLV:");
962 	DP_PRINT_STATS("nsts = %u",
963 		       dp_stats_buf->nsts);
964 	DP_PRINT_STATS("rx_ldpc = %u",
965 		       dp_stats_buf->rx_ldpc);
966 	DP_PRINT_STATS("rts_cnt = %u",
967 		       dp_stats_buf->rts_cnt);
968 	DP_PRINT_STATS("rssi_mgmt = %u",
969 		       dp_stats_buf->rssi_mgmt);
970 	DP_PRINT_STATS("rssi_data = %u",
971 		       dp_stats_buf->rssi_data);
972 	DP_PRINT_STATS("rssi_comb = %u",
973 		       dp_stats_buf->rssi_comb);
974 
975 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
976 	for (i = 0; i <  DP_HTT_RX_MCS_LEN; i++) {
977 		index += qdf_snprint(&str_buf[index],
978 				DP_MAX_STRING_LEN - index,
979 				" %u:%u,", i, dp_stats_buf->rx_mcs[i]);
980 	}
981 	DP_PRINT_STATS("rx_mcs = %s ", str_buf);
982 
983 	index = 0;
984 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
985 	for (i = 0; i <  DP_HTT_RX_NSS_LEN; i++) {
986 		/* 0 stands for NSS 1, 1 stands for NSS 2, etc. */
987 		index += qdf_snprint(&str_buf[index],
988 				DP_MAX_STRING_LEN - index,
989 				" %u:%u,", (i + 1),
990 				dp_stats_buf->rx_nss[i]);
991 	}
992 	DP_PRINT_STATS("rx_nss = %s ", str_buf);
993 
994 	index = 0;
995 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
996 	for (i = 0; i <  DP_HTT_RX_DCM_LEN; i++) {
997 		index += qdf_snprint(&str_buf[index],
998 				DP_MAX_STRING_LEN - index,
999 				" %u:%u,", i, dp_stats_buf->rx_dcm[i]);
1000 	}
1001 	DP_PRINT_STATS("rx_dcm = %s ", str_buf);
1002 
1003 	index = 0;
1004 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1005 	for (i = 0; i <  HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
1006 		index += qdf_snprint(&str_buf[index],
1007 				DP_MAX_STRING_LEN - index,
1008 				" %u:%u,", i, dp_stats_buf->rx_stbc[i]);
1009 	}
1010 	DP_PRINT_STATS("rx_stbc = %s ", str_buf);
1011 
1012 	index = 0;
1013 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1014 	for (i = 0; i <  DP_HTT_RX_BW_LEN; i++) {
1015 		index += qdf_snprint(&str_buf[index],
1016 				DP_MAX_STRING_LEN - index,
1017 				" %u:%u,", i, dp_stats_buf->rx_bw[i]);
1018 	}
1019 	DP_PRINT_STATS("rx_bw = %s ", str_buf);
1020 
1021 	for (j = 0; j < DP_HTT_PEER_NUM_SS; j++) {
1022 		qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1023 		index = 0;
1024 		for (i = 0; i <  HTT_RX_PEER_STATS_NUM_BW_COUNTERS; i++) {
1025 			index += qdf_snprint(&rssi_chain[j][index],
1026 					DP_MAX_STRING_LEN - index,
1027 					" %u:%u,", i,
1028 					dp_stats_buf->rssi_chain[j][i]);
1029 		}
1030 		DP_PRINT_STATS("rssi_chain[%u] = %s ", j, rssi_chain[j]);
1031 	}
1032 
1033 	for (j = 0; j < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; j++) {
1034 		index = 0;
1035 		for (i = 0; i <  HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
1036 			index += qdf_snprint(&rx_gi[j][index],
1037 					DP_MAX_STRING_LEN - index,
1038 					" %u:%u,", i,
1039 					dp_stats_buf->rx_gi[j][i]);
1040 		}
1041 		DP_PRINT_STATS("rx_gi[%u] = %s ", j, rx_gi[j]);
1042 	}
1043 	index = 0;
1044 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1045 	for (i = 0; i <  DP_HTT_RX_PREAM_LEN; i++) {
1046 		index += qdf_snprint(&str_buf[index],
1047 				DP_MAX_STRING_LEN - index,
1048 				" %u:%u,", i, dp_stats_buf->rx_pream[i]);
1049 	}
1050 	DP_PRINT_STATS("rx_pream = %s\n", str_buf);
1051 
1052 	for (i = 0; i < DP_HTT_PEER_NUM_SS; i++)
1053 		qdf_mem_free(rssi_chain[i]);
1054 	for (i = 0; i < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; i++)
1055 		qdf_mem_free(rx_gi[i]);
1056 
1057 	qdf_mem_free(str_buf);
1058 }
1059 
1060 /*
1061  * dp_print_tx_hwq_mu_mimo_sch_stats_tlv: display htt_tx_hwq_mu_mimo_sch_stats
1062  * @tag_buf: buffer containing the tlv htt_tx_hwq_mu_mimo_sch_stats_tlv
1063  *
1064  * return:void
1065  */
1066 static inline void dp_print_tx_hwq_mu_mimo_sch_stats_tlv(uint32_t *tag_buf)
1067 {
1068 	htt_tx_hwq_mu_mimo_sch_stats_tlv *dp_stats_buf =
1069 		(htt_tx_hwq_mu_mimo_sch_stats_tlv *)tag_buf;
1070 
1071 	DP_PRINT_STATS("HTT_TX_HWQ_MU_MIMO_SCH_STATS_TLV:");
1072 	DP_PRINT_STATS("mu_mimo_sch_posted = %u",
1073 		       dp_stats_buf->mu_mimo_sch_posted);
1074 	DP_PRINT_STATS("mu_mimo_sch_failed = %u",
1075 		       dp_stats_buf->mu_mimo_sch_failed);
1076 	DP_PRINT_STATS("mu_mimo_ppdu_posted = %u\n",
1077 		       dp_stats_buf->mu_mimo_ppdu_posted);
1078 }
1079 
1080 /*
1081  * dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv: display htt_tx_hwq_mu_mimo_mpdu_stats
1082  * @tag_buf: buffer containing the tlv htt_tx_hwq_mu_mimo_mpdu_stats_tlv
1083  *
1084  * return:void
1085  */
1086 static inline void dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv(uint32_t *tag_buf)
1087 {
1088 	htt_tx_hwq_mu_mimo_mpdu_stats_tlv *dp_stats_buf =
1089 		(htt_tx_hwq_mu_mimo_mpdu_stats_tlv *)tag_buf;
1090 
1091 	DP_PRINT_STATS("HTT_TX_HWQ_MU_MIMO_MPDU_STATS_TLV:");
1092 	DP_PRINT_STATS("mu_mimo_mpdus_queued_usr = %u",
1093 		       dp_stats_buf->mu_mimo_mpdus_queued_usr);
1094 	DP_PRINT_STATS("mu_mimo_mpdus_tried_usr = %u",
1095 		       dp_stats_buf->mu_mimo_mpdus_tried_usr);
1096 	DP_PRINT_STATS("mu_mimo_mpdus_failed_usr = %u",
1097 		       dp_stats_buf->mu_mimo_mpdus_failed_usr);
1098 	DP_PRINT_STATS("mu_mimo_mpdus_requeued_usr = %u",
1099 		       dp_stats_buf->mu_mimo_mpdus_requeued_usr);
1100 	DP_PRINT_STATS("mu_mimo_err_no_ba_usr = %u",
1101 		       dp_stats_buf->mu_mimo_err_no_ba_usr);
1102 	DP_PRINT_STATS("mu_mimo_mpdu_underrun_usr = %u",
1103 		       dp_stats_buf->mu_mimo_mpdu_underrun_usr);
1104 	DP_PRINT_STATS("mu_mimo_ampdu_underrun_usr = %u\n",
1105 		       dp_stats_buf->mu_mimo_ampdu_underrun_usr);
1106 }
1107 
1108 /*
1109  * dp_print_tx_hwq_mu_mimo_cmn_stats_tlv: display htt_tx_hwq_mu_mimo_cmn_stats
1110  * @tag_buf: buffer containing the tlv htt_tx_hwq_mu_mimo_cmn_stats_tlv
1111  *
1112  * return:void
1113  */
1114 static inline void dp_print_tx_hwq_mu_mimo_cmn_stats_tlv(uint32_t *tag_buf)
1115 {
1116 	htt_tx_hwq_mu_mimo_cmn_stats_tlv *dp_stats_buf =
1117 		(htt_tx_hwq_mu_mimo_cmn_stats_tlv *)tag_buf;
1118 
1119 	DP_PRINT_STATS("HTT_TX_HWQ_MU_MIMO_CMN_STATS_TLV:");
1120 	DP_PRINT_STATS("mac_id__hwq_id__word = %u\n",
1121 		       dp_stats_buf->mac_id__hwq_id__word);
1122 }
1123 
1124 /*
1125  * dp_print_tx_hwq_stats_cmn_tlv: display htt_tx_hwq_stats_cmn_tlv
1126  * @tag_buf: buffer containing the tlv htt_tx_hwq_stats_cmn_tlv
1127  *
1128  * return:void
1129  */
1130 static inline void dp_print_tx_hwq_stats_cmn_tlv(uint32_t *tag_buf)
1131 {
1132 	htt_tx_hwq_stats_cmn_tlv *dp_stats_buf =
1133 		(htt_tx_hwq_stats_cmn_tlv *)tag_buf;
1134 
1135 	DP_PRINT_STATS("HTT_TX_HWQ_STATS_CMN_TLV:");
1136 	DP_PRINT_STATS("mac_id__hwq_id__word = %u",
1137 		       dp_stats_buf->mac_id__hwq_id__word);
1138 	DP_PRINT_STATS("xretry = %u",
1139 		       dp_stats_buf->xretry);
1140 	DP_PRINT_STATS("underrun_cnt = %u",
1141 		       dp_stats_buf->underrun_cnt);
1142 	DP_PRINT_STATS("flush_cnt = %u",
1143 		       dp_stats_buf->flush_cnt);
1144 	DP_PRINT_STATS("filt_cnt = %u",
1145 		       dp_stats_buf->filt_cnt);
1146 	DP_PRINT_STATS("null_mpdu_bmap = %u",
1147 		       dp_stats_buf->null_mpdu_bmap);
1148 	DP_PRINT_STATS("user_ack_failure = %u",
1149 		       dp_stats_buf->user_ack_failure);
1150 	DP_PRINT_STATS("ack_tlv_proc = %u",
1151 		       dp_stats_buf->ack_tlv_proc);
1152 	DP_PRINT_STATS("sched_id_proc = %u",
1153 		       dp_stats_buf->sched_id_proc);
1154 	DP_PRINT_STATS("null_mpdu_tx_count = %u",
1155 		       dp_stats_buf->null_mpdu_tx_count);
1156 	DP_PRINT_STATS("mpdu_bmap_not_recvd = %u",
1157 		       dp_stats_buf->mpdu_bmap_not_recvd);
1158 	DP_PRINT_STATS("num_bar = %u",
1159 		       dp_stats_buf->num_bar);
1160 	DP_PRINT_STATS("rts = %u",
1161 		       dp_stats_buf->rts);
1162 	DP_PRINT_STATS("cts2self = %u",
1163 		       dp_stats_buf->cts2self);
1164 	DP_PRINT_STATS("qos_null = %u",
1165 		       dp_stats_buf->qos_null);
1166 	DP_PRINT_STATS("mpdu_tried_cnt = %u",
1167 		       dp_stats_buf->mpdu_tried_cnt);
1168 	DP_PRINT_STATS("mpdu_queued_cnt = %u",
1169 		       dp_stats_buf->mpdu_queued_cnt);
1170 	DP_PRINT_STATS("mpdu_ack_fail_cnt = %u",
1171 		       dp_stats_buf->mpdu_ack_fail_cnt);
1172 	DP_PRINT_STATS("mpdu_filt_cnt = %u",
1173 		       dp_stats_buf->mpdu_filt_cnt);
1174 	DP_PRINT_STATS("false_mpdu_ack_count = %u\n",
1175 		       dp_stats_buf->false_mpdu_ack_count);
1176 }
1177 
1178 /*
1179  * dp_print_tx_hwq_difs_latency_stats_tlv_v: display
1180  *					htt_tx_hwq_difs_latency_stats_tlv_v
1181  * @tag_buf: buffer containing the tlv htt_tx_hwq_difs_latency_stats_tlv_v
1182  *
1183  *return:void
1184  */
1185 static inline void dp_print_tx_hwq_difs_latency_stats_tlv_v(uint32_t *tag_buf)
1186 {
1187 	htt_tx_hwq_difs_latency_stats_tlv_v *dp_stats_buf =
1188 		(htt_tx_hwq_difs_latency_stats_tlv_v *)tag_buf;
1189 	uint8_t i;
1190 	uint16_t index = 0;
1191 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
1192 	char *difs_latency_hist = qdf_mem_malloc(DP_MAX_STRING_LEN);
1193 
1194 	if (!difs_latency_hist) {
1195 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
1196 			  FL("Output buffer not allocated"));
1197 		return;
1198 	}
1199 
1200 	tag_len = qdf_min(tag_len,
1201 			(uint32_t)HTT_TX_HWQ_MAX_DIFS_LATENCY_BINS);
1202 
1203 	DP_PRINT_STATS("HTT_TX_HWQ_DIFS_LATENCY_STATS_TLV_V:");
1204 	DP_PRINT_STATS("hist_intvl = %u",
1205 		       dp_stats_buf->hist_intvl);
1206 
1207 	for (i = 0; i <  tag_len; i++) {
1208 		index += qdf_snprint(&difs_latency_hist[index],
1209 				DP_MAX_STRING_LEN - index,
1210 				" %u:%u,", i,
1211 				dp_stats_buf->difs_latency_hist[i]);
1212 	}
1213 	DP_PRINT_STATS("difs_latency_hist = %s\n", difs_latency_hist);
1214 	qdf_mem_free(difs_latency_hist);
1215 }
1216 
1217 /*
1218  * dp_print_tx_hwq_cmd_result_stats_tlv_v: display htt_tx_hwq_cmd_result_stats
1219  * @tag_buf: buffer containing the tlv htt_tx_hwq_cmd_result_stats_tlv_v
1220  *
1221  * return:void
1222  */
1223 static inline void dp_print_tx_hwq_cmd_result_stats_tlv_v(uint32_t *tag_buf)
1224 {
1225 	htt_tx_hwq_cmd_result_stats_tlv_v *dp_stats_buf =
1226 		(htt_tx_hwq_cmd_result_stats_tlv_v *)tag_buf;
1227 	uint8_t i;
1228 	uint16_t index = 0;
1229 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
1230 	char *cmd_result = qdf_mem_malloc(DP_MAX_STRING_LEN);
1231 
1232 	if (!cmd_result) {
1233 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
1234 			  FL("Output buffer not allocated"));
1235 		return;
1236 	}
1237 
1238 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_HWQ_MAX_CMD_RESULT_STATS);
1239 
1240 	DP_PRINT_STATS("HTT_TX_HWQ_CMD_RESULT_STATS_TLV_V:");
1241 	for (i = 0; i <  tag_len; i++) {
1242 		index += qdf_snprint(&cmd_result[index],
1243 				DP_MAX_STRING_LEN - index,
1244 				" %u:%u,", i, dp_stats_buf->cmd_result[i]);
1245 	}
1246 	DP_PRINT_STATS("cmd_result = %s ", cmd_result);
1247 	qdf_mem_free(cmd_result);
1248 }
1249 
1250 /*
1251  * dp_print_tx_hwq_cmd_stall_stats_tlv_v: display htt_tx_hwq_cmd_stall_stats_tlv
1252  * @tag_buf: buffer containing the tlv htt_tx_hwq_cmd_stall_stats_tlv_v
1253  *
1254  * return:void
1255  */
1256 static inline void dp_print_tx_hwq_cmd_stall_stats_tlv_v(uint32_t *tag_buf)
1257 {
1258 	htt_tx_hwq_cmd_stall_stats_tlv_v *dp_stats_buf =
1259 		(htt_tx_hwq_cmd_stall_stats_tlv_v *)tag_buf;
1260 	uint8_t i;
1261 	uint16_t index = 0;
1262 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
1263 	char *cmd_stall_status = qdf_mem_malloc(DP_MAX_STRING_LEN);
1264 
1265 	if (!cmd_stall_status) {
1266 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
1267 			  FL("Output buffer not allocated"));
1268 		return;
1269 	}
1270 
1271 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_HWQ_MAX_CMD_STALL_STATS);
1272 
1273 	DP_PRINT_STATS("HTT_TX_HWQ_CMD_STALL_STATS_TLV_V:");
1274 	for (i = 0; i <  tag_len; i++) {
1275 		index += qdf_snprint(&cmd_stall_status[index],
1276 				DP_MAX_STRING_LEN - index,
1277 				" %u:%u,", i,
1278 				dp_stats_buf->cmd_stall_status[i]);
1279 	}
1280 	DP_PRINT_STATS("cmd_stall_status = %s\n", cmd_stall_status);
1281 	qdf_mem_free(cmd_stall_status);
1282 }
1283 
1284 /*
1285  * dp_print_tx_hwq_fes_result_stats_tlv_v: display htt_tx_hwq_fes_result_stats
1286  * @tag_buf: buffer containing the tlv htt_tx_hwq_fes_result_stats_tlv_v
1287  *
1288  * return:void
1289  */
1290 static inline void dp_print_tx_hwq_fes_result_stats_tlv_v(uint32_t *tag_buf)
1291 {
1292 	htt_tx_hwq_fes_result_stats_tlv_v *dp_stats_buf =
1293 		(htt_tx_hwq_fes_result_stats_tlv_v *)tag_buf;
1294 	uint8_t i;
1295 	uint16_t index = 0;
1296 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
1297 	char *fes_result = qdf_mem_malloc(DP_MAX_STRING_LEN);
1298 
1299 	if (!fes_result) {
1300 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
1301 			  FL("Output buffer not allocated"));
1302 		return;
1303 	}
1304 
1305 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_HWQ_MAX_FES_RESULT_STATS);
1306 
1307 	DP_PRINT_STATS("HTT_TX_HWQ_FES_RESULT_STATS_TLV_V:");
1308 	for (i = 0; i <  tag_len; i++) {
1309 		index += qdf_snprint(&fes_result[index],
1310 				DP_MAX_STRING_LEN - index,
1311 				" %u:%u,", i, dp_stats_buf->fes_result[i]);
1312 	}
1313 	DP_PRINT_STATS("fes_result = %s ", fes_result);
1314 	qdf_mem_free(fes_result);
1315 }
1316 
1317 /*
1318  * dp_print_tx_selfgen_cmn_stats_tlv: display htt_tx_selfgen_cmn_stats_tlv
1319  * @tag_buf: buffer containing the tlv htt_tx_selfgen_cmn_stats_tlv
1320  *
1321  * return:void
1322  */
1323 static inline void dp_print_tx_selfgen_cmn_stats_tlv(uint32_t *tag_buf)
1324 {
1325 	htt_tx_selfgen_cmn_stats_tlv *dp_stats_buf =
1326 		(htt_tx_selfgen_cmn_stats_tlv *)tag_buf;
1327 
1328 	DP_PRINT_STATS("HTT_TX_SELFGEN_CMN_STATS_TLV:");
1329 	DP_PRINT_STATS("mac_id__word = %u",
1330 		       dp_stats_buf->mac_id__word);
1331 	DP_PRINT_STATS("su_bar = %u",
1332 		       dp_stats_buf->su_bar);
1333 	DP_PRINT_STATS("rts = %u",
1334 		       dp_stats_buf->rts);
1335 	DP_PRINT_STATS("cts2self = %u",
1336 		       dp_stats_buf->cts2self);
1337 	DP_PRINT_STATS("qos_null = %u",
1338 		       dp_stats_buf->qos_null);
1339 	DP_PRINT_STATS("delayed_bar_1 = %u",
1340 		       dp_stats_buf->delayed_bar_1);
1341 	DP_PRINT_STATS("delayed_bar_2 = %u",
1342 		       dp_stats_buf->delayed_bar_2);
1343 	DP_PRINT_STATS("delayed_bar_3 = %u",
1344 		       dp_stats_buf->delayed_bar_3);
1345 	DP_PRINT_STATS("delayed_bar_4 = %u",
1346 		       dp_stats_buf->delayed_bar_4);
1347 	DP_PRINT_STATS("delayed_bar_5 = %u",
1348 		       dp_stats_buf->delayed_bar_5);
1349 	DP_PRINT_STATS("delayed_bar_6 = %u",
1350 		       dp_stats_buf->delayed_bar_6);
1351 	DP_PRINT_STATS("delayed_bar_7 = %u\n",
1352 		       dp_stats_buf->delayed_bar_7);
1353 }
1354 
1355 /*
1356  * dp_print_tx_selfgen_ac_stats_tlv: display htt_tx_selfgen_ac_stats_tlv
1357  * @tag_buf: buffer containing the tlv htt_tx_selfgen_ac_stats_tlv
1358  *
1359  * return:void
1360  */
1361 static inline void dp_print_tx_selfgen_ac_stats_tlv(uint32_t *tag_buf)
1362 {
1363 	htt_tx_selfgen_ac_stats_tlv *dp_stats_buf =
1364 		(htt_tx_selfgen_ac_stats_tlv *)tag_buf;
1365 
1366 	DP_PRINT_STATS("HTT_TX_SELFGEN_AC_STATS_TLV:");
1367 	DP_PRINT_STATS("ac_su_ndpa = %u",
1368 		       dp_stats_buf->ac_su_ndpa);
1369 	DP_PRINT_STATS("ac_su_ndp = %u",
1370 		       dp_stats_buf->ac_su_ndp);
1371 	DP_PRINT_STATS("ac_mu_mimo_ndpa = %u",
1372 		       dp_stats_buf->ac_mu_mimo_ndpa);
1373 	DP_PRINT_STATS("ac_mu_mimo_ndp = %u",
1374 		       dp_stats_buf->ac_mu_mimo_ndp);
1375 	DP_PRINT_STATS("ac_mu_mimo_brpoll_1 = %u",
1376 		       dp_stats_buf->ac_mu_mimo_brpoll_1);
1377 	DP_PRINT_STATS("ac_mu_mimo_brpoll_2 = %u",
1378 		       dp_stats_buf->ac_mu_mimo_brpoll_2);
1379 	DP_PRINT_STATS("ac_mu_mimo_brpoll_3 = %u\n",
1380 		       dp_stats_buf->ac_mu_mimo_brpoll_3);
1381 }
1382 
1383 /*
1384  * dp_print_tx_selfgen_ax_stats_tlv: display htt_tx_selfgen_ax_stats_tlv
1385  * @tag_buf: buffer containing the tlv htt_tx_selfgen_ax_stats_tlv
1386  *
1387  * return:void
1388  */
1389 static inline void dp_print_tx_selfgen_ax_stats_tlv(uint32_t *tag_buf)
1390 {
1391 	htt_tx_selfgen_ax_stats_tlv *dp_stats_buf =
1392 		(htt_tx_selfgen_ax_stats_tlv *)tag_buf;
1393 
1394 	DP_PRINT_STATS("HTT_TX_SELFGEN_AX_STATS_TLV:");
1395 	DP_PRINT_STATS("ax_su_ndpa = %u",
1396 		       dp_stats_buf->ax_su_ndpa);
1397 	DP_PRINT_STATS("ax_su_ndp = %u",
1398 		       dp_stats_buf->ax_su_ndp);
1399 	DP_PRINT_STATS("ax_mu_mimo_ndpa = %u",
1400 		       dp_stats_buf->ax_mu_mimo_ndpa);
1401 	DP_PRINT_STATS("ax_mu_mimo_ndp = %u",
1402 		       dp_stats_buf->ax_mu_mimo_ndp);
1403 	DP_PRINT_STATS("ax_mu_mimo_brpoll_1 = %u",
1404 		       dp_stats_buf->ax_mu_mimo_brpoll_1);
1405 	DP_PRINT_STATS("ax_mu_mimo_brpoll_2 = %u",
1406 		       dp_stats_buf->ax_mu_mimo_brpoll_2);
1407 	DP_PRINT_STATS("ax_mu_mimo_brpoll_3 = %u",
1408 		       dp_stats_buf->ax_mu_mimo_brpoll_3);
1409 	DP_PRINT_STATS("ax_mu_mimo_brpoll_4 = %u",
1410 		       dp_stats_buf->ax_mu_mimo_brpoll_4);
1411 	DP_PRINT_STATS("ax_mu_mimo_brpoll_5 = %u",
1412 		       dp_stats_buf->ax_mu_mimo_brpoll_5);
1413 	DP_PRINT_STATS("ax_mu_mimo_brpoll_6 = %u",
1414 		       dp_stats_buf->ax_mu_mimo_brpoll_6);
1415 	DP_PRINT_STATS("ax_mu_mimo_brpoll_7 = %u",
1416 		       dp_stats_buf->ax_mu_mimo_brpoll_7);
1417 	DP_PRINT_STATS("ax_basic_trigger = %u",
1418 		       dp_stats_buf->ax_basic_trigger);
1419 	DP_PRINT_STATS("ax_bsr_trigger = %u",
1420 		       dp_stats_buf->ax_bsr_trigger);
1421 	DP_PRINT_STATS("ax_mu_bar_trigger = %u",
1422 		       dp_stats_buf->ax_mu_bar_trigger);
1423 	DP_PRINT_STATS("ax_mu_rts_trigger = %u\n",
1424 		       dp_stats_buf->ax_mu_rts_trigger);
1425 }
1426 
1427 /*
1428  * dp_print_tx_selfgen_ac_err_stats_tlv: display htt_tx_selfgen_ac_err_stats_tlv
1429  * @tag_buf: buffer containing the tlv htt_tx_selfgen_ac_err_stats_tlv
1430  *
1431  * return:void
1432  */
1433 static inline void dp_print_tx_selfgen_ac_err_stats_tlv(uint32_t *tag_buf)
1434 {
1435 	htt_tx_selfgen_ac_err_stats_tlv *dp_stats_buf =
1436 		(htt_tx_selfgen_ac_err_stats_tlv *)tag_buf;
1437 
1438 	DP_PRINT_STATS("HTT_TX_SELFGEN_AC_ERR_STATS_TLV:");
1439 	DP_PRINT_STATS("ac_su_ndp_err = %u",
1440 		       dp_stats_buf->ac_su_ndp_err);
1441 	DP_PRINT_STATS("ac_su_ndpa_err = %u",
1442 		       dp_stats_buf->ac_su_ndpa_err);
1443 	DP_PRINT_STATS("ac_mu_mimo_ndpa_err = %u",
1444 		       dp_stats_buf->ac_mu_mimo_ndpa_err);
1445 	DP_PRINT_STATS("ac_mu_mimo_ndp_err = %u",
1446 		       dp_stats_buf->ac_mu_mimo_ndp_err);
1447 	DP_PRINT_STATS("ac_mu_mimo_brp1_err = %u",
1448 		       dp_stats_buf->ac_mu_mimo_brp1_err);
1449 	DP_PRINT_STATS("ac_mu_mimo_brp2_err = %u",
1450 		       dp_stats_buf->ac_mu_mimo_brp2_err);
1451 	DP_PRINT_STATS("ac_mu_mimo_brp3_err = %u\n",
1452 		       dp_stats_buf->ac_mu_mimo_brp3_err);
1453 }
1454 
1455 /*
1456  * dp_print_tx_selfgen_ax_err_stats_tlv: display htt_tx_selfgen_ax_err_stats_tlv
1457  * @tag_buf: buffer containing the tlv htt_tx_selfgen_ax_err_stats_tlv
1458  *
1459  * return:void
1460  */
1461 static inline void dp_print_tx_selfgen_ax_err_stats_tlv(uint32_t *tag_buf)
1462 {
1463 	htt_tx_selfgen_ax_err_stats_tlv *dp_stats_buf =
1464 		(htt_tx_selfgen_ax_err_stats_tlv *)tag_buf;
1465 
1466 	DP_PRINT_STATS("HTT_TX_SELFGEN_AX_ERR_STATS_TLV:");
1467 	DP_PRINT_STATS("ax_su_ndp_err = %u",
1468 		       dp_stats_buf->ax_su_ndp_err);
1469 	DP_PRINT_STATS("ax_su_ndpa_err = %u",
1470 		       dp_stats_buf->ax_su_ndpa_err);
1471 	DP_PRINT_STATS("ax_mu_mimo_ndpa_err = %u",
1472 		       dp_stats_buf->ax_mu_mimo_ndpa_err);
1473 	DP_PRINT_STATS("ax_mu_mimo_ndp_err = %u",
1474 		       dp_stats_buf->ax_mu_mimo_ndp_err);
1475 	DP_PRINT_STATS("ax_mu_mimo_brp1_err = %u",
1476 		       dp_stats_buf->ax_mu_mimo_brp1_err);
1477 	DP_PRINT_STATS("ax_mu_mimo_brp2_err = %u",
1478 		       dp_stats_buf->ax_mu_mimo_brp2_err);
1479 	DP_PRINT_STATS("ax_mu_mimo_brp3_err = %u",
1480 		       dp_stats_buf->ax_mu_mimo_brp3_err);
1481 	DP_PRINT_STATS("ax_mu_mimo_brp4_err = %u",
1482 		       dp_stats_buf->ax_mu_mimo_brp4_err);
1483 	DP_PRINT_STATS("ax_mu_mimo_brp5_err = %u",
1484 		       dp_stats_buf->ax_mu_mimo_brp5_err);
1485 	DP_PRINT_STATS("ax_mu_mimo_brp6_err = %u",
1486 		       dp_stats_buf->ax_mu_mimo_brp6_err);
1487 	DP_PRINT_STATS("ax_mu_mimo_brp7_err = %u",
1488 		       dp_stats_buf->ax_mu_mimo_brp7_err);
1489 	DP_PRINT_STATS("ax_basic_trigger_err = %u",
1490 		       dp_stats_buf->ax_basic_trigger_err);
1491 	DP_PRINT_STATS("ax_bsr_trigger_err = %u",
1492 		       dp_stats_buf->ax_bsr_trigger_err);
1493 	DP_PRINT_STATS("ax_mu_bar_trigger_err = %u",
1494 		       dp_stats_buf->ax_mu_bar_trigger_err);
1495 	DP_PRINT_STATS("ax_mu_rts_trigger_err = %u\n",
1496 		       dp_stats_buf->ax_mu_rts_trigger_err);
1497 }
1498 
1499 /*
1500  * dp_print_tx_pdev_mu_mimo_sch_stats_tlv: display htt_tx_pdev_mu_mimo_sch_stats
1501  * @tag_buf: buffer containing the tlv htt_tx_pdev_mu_mimo_sch_stats_tlv
1502  *
1503  * return:void
1504  */
1505 static inline void dp_print_tx_pdev_mu_mimo_sch_stats_tlv(uint32_t *tag_buf)
1506 {
1507 	uint8_t i;
1508 	htt_tx_pdev_mu_mimo_sch_stats_tlv *dp_stats_buf =
1509 		(htt_tx_pdev_mu_mimo_sch_stats_tlv *)tag_buf;
1510 
1511 	DP_PRINT_STATS("HTT_TX_PDEV_MU_MIMO_SCH_STATS_TLV:");
1512 	DP_PRINT_STATS("mu_mimo_sch_posted = %u",
1513 		       dp_stats_buf->mu_mimo_sch_posted);
1514 	DP_PRINT_STATS("mu_mimo_sch_failed = %u",
1515 		       dp_stats_buf->mu_mimo_sch_failed);
1516 	DP_PRINT_STATS("mu_mimo_ppdu_posted = %u\n",
1517 		       dp_stats_buf->mu_mimo_ppdu_posted);
1518 
1519 	DP_PRINT_STATS("11ac MU_MIMO SCH STATS:");
1520 
1521 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS; i++) {
1522 		DP_PRINT_STATS("ac_mu_mimo_sch_nusers_%u = %u", i,
1523 			       dp_stats_buf->ac_mu_mimo_sch_nusers[i]);
1524 	}
1525 
1526 	DP_PRINT_STATS("\n11ax MU_MIMO SCH STATS:");
1527 
1528 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; i++) {
1529 		DP_PRINT_STATS("ax_mu_mimo_sch_nusers_%u = %u", i,
1530 			       dp_stats_buf->ax_mu_mimo_sch_nusers[i]);
1531 	}
1532 
1533 	DP_PRINT_STATS("\n11ax OFDMA SCH STATS:");
1534 
1535 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; i++) {
1536 		DP_PRINT_STATS("ax_ofdma_sch_nusers_%u = %u", i,
1537 			       dp_stats_buf->ax_ofdma_sch_nusers[i]);
1538 	}
1539 }
1540 
1541 /*
1542  * dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv: display
1543  *				htt_tx_pdev_mu_mimo_mpdu_stats_tlv
1544  * @tag_buf: buffer containing the tlv htt_tx_pdev_mu_mimo_mpdu_stats_tlv
1545  *
1546  * return:void
1547  */
1548 static inline void dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv(uint32_t *tag_buf)
1549 {
1550 	htt_tx_pdev_mpdu_stats_tlv *dp_stats_buf =
1551 		(htt_tx_pdev_mpdu_stats_tlv *)tag_buf;
1552 
1553 	if (dp_stats_buf->tx_sched_mode ==
1554 			HTT_STATS_TX_SCHED_MODE_MU_MIMO_AC) {
1555 		if (!dp_stats_buf->user_index)
1556 			DP_PRINT_STATS(
1557 				       "HTT_TX_PDEV_MU_MIMO_AC_MPDU_STATS:\n");
1558 
1559 		if (dp_stats_buf->user_index <
1560 			HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS) {
1561 			DP_PRINT_STATS(
1562 				       "ac_mu_mimo_mpdus_queued_usr_%u = %u",
1563 				       dp_stats_buf->user_index,
1564 				       dp_stats_buf->mpdus_queued_usr);
1565 			DP_PRINT_STATS(
1566 				       "ac_mu_mimo_mpdus_tried_usr_%u = %u",
1567 				       dp_stats_buf->user_index,
1568 				       dp_stats_buf->mpdus_tried_usr);
1569 			DP_PRINT_STATS(
1570 				       "ac_mu_mimo_mpdus_failed_usr_%u = %u",
1571 				       dp_stats_buf->user_index,
1572 				       dp_stats_buf->mpdus_failed_usr);
1573 			DP_PRINT_STATS(
1574 				       "ac_mu_mimo_mpdus_requeued_usr_%u = %u",
1575 				       dp_stats_buf->user_index,
1576 				       dp_stats_buf->mpdus_requeued_usr);
1577 			DP_PRINT_STATS(
1578 				       "ac_mu_mimo_err_no_ba_usr_%u = %u",
1579 				       dp_stats_buf->user_index,
1580 				       dp_stats_buf->err_no_ba_usr);
1581 			DP_PRINT_STATS(
1582 				       "ac_mu_mimo_mpdu_underrun_usr_%u = %u",
1583 				       dp_stats_buf->user_index,
1584 				       dp_stats_buf->mpdu_underrun_usr);
1585 			DP_PRINT_STATS(
1586 				       "ac_mu_mimo_ampdu_underrun_usr_%u = %u\n",
1587 				       dp_stats_buf->user_index,
1588 				       dp_stats_buf->ampdu_underrun_usr);
1589 		}
1590 	}
1591 
1592 	if (dp_stats_buf->tx_sched_mode == HTT_STATS_TX_SCHED_MODE_MU_MIMO_AX) {
1593 		if (!dp_stats_buf->user_index)
1594 			DP_PRINT_STATS(
1595 				       "HTT_TX_PDEV_MU_MIMO_AX_MPDU_STATS:\n");
1596 
1597 		if (dp_stats_buf->user_index <
1598 				HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS) {
1599 			DP_PRINT_STATS(
1600 				       "ax_mu_mimo_mpdus_queued_usr_%u = %u",
1601 				       dp_stats_buf->user_index,
1602 				       dp_stats_buf->mpdus_queued_usr);
1603 			DP_PRINT_STATS(
1604 				       "ax_mu_mimo_mpdus_tried_usr_%u = %u",
1605 				       dp_stats_buf->user_index,
1606 				       dp_stats_buf->mpdus_tried_usr);
1607 			DP_PRINT_STATS(
1608 				       "ax_mu_mimo_mpdus_failed_usr_%u = %u",
1609 				       dp_stats_buf->user_index,
1610 				       dp_stats_buf->mpdus_failed_usr);
1611 			DP_PRINT_STATS(
1612 				       "ax_mu_mimo_mpdus_requeued_usr_%u = %u",
1613 				       dp_stats_buf->user_index,
1614 				       dp_stats_buf->mpdus_requeued_usr);
1615 			DP_PRINT_STATS(
1616 				       "ax_mu_mimo_err_no_ba_usr_%u = %u",
1617 				       dp_stats_buf->user_index,
1618 				       dp_stats_buf->err_no_ba_usr);
1619 			DP_PRINT_STATS(
1620 				       "ax_mu_mimo_mpdu_underrun_usr_%u = %u",
1621 				       dp_stats_buf->user_index,
1622 				       dp_stats_buf->mpdu_underrun_usr);
1623 			DP_PRINT_STATS(
1624 				       "ax_mu_mimo_ampdu_underrun_usr_%u = %u\n",
1625 				       dp_stats_buf->user_index,
1626 				       dp_stats_buf->ampdu_underrun_usr);
1627 		}
1628 	}
1629 
1630 	if (dp_stats_buf->tx_sched_mode ==
1631 			HTT_STATS_TX_SCHED_MODE_MU_OFDMA_AX) {
1632 		if (!dp_stats_buf->user_index)
1633 			DP_PRINT_STATS(
1634 				       "HTT_TX_PDEV_AX_MU_OFDMA_MPDU_STATS:\n");
1635 
1636 		if (dp_stats_buf->user_index <
1637 				HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS) {
1638 			DP_PRINT_STATS(
1639 				       "ax_mu_ofdma_mpdus_queued_usr_%u = %u",
1640 				       dp_stats_buf->user_index,
1641 				       dp_stats_buf->mpdus_queued_usr);
1642 			DP_PRINT_STATS(
1643 				       "ax_mu_ofdma_mpdus_tried_usr_%u = %u",
1644 				       dp_stats_buf->user_index,
1645 				       dp_stats_buf->mpdus_tried_usr);
1646 			DP_PRINT_STATS(
1647 				       "ax_mu_ofdma_mpdus_failed_usr_%u = %u",
1648 				       dp_stats_buf->user_index,
1649 				       dp_stats_buf->mpdus_failed_usr);
1650 			DP_PRINT_STATS(
1651 				       "ax_mu_ofdma_mpdus_requeued_usr_%u = %u",
1652 				       dp_stats_buf->user_index,
1653 				       dp_stats_buf->mpdus_requeued_usr);
1654 			DP_PRINT_STATS(
1655 				       "ax_mu_ofdma_err_no_ba_usr_%u = %u",
1656 				       dp_stats_buf->user_index,
1657 				       dp_stats_buf->err_no_ba_usr);
1658 			DP_PRINT_STATS(
1659 				       "ax_mu_ofdma_mpdu_underrun_usr_%u = %u",
1660 				       dp_stats_buf->user_index,
1661 				       dp_stats_buf->mpdu_underrun_usr);
1662 			DP_PRINT_STATS(
1663 				       "ax_mu_ofdma_ampdu_underrun_usr_%u = %u\n",
1664 				       dp_stats_buf->user_index,
1665 				       dp_stats_buf->ampdu_underrun_usr);
1666 		}
1667 	}
1668 }
1669 
1670 /*
1671  * dp_print_sched_txq_cmd_posted_tlv_v: display htt_sched_txq_cmd_posted_tlv_v
1672  * @tag_buf: buffer containing the tlv htt_sched_txq_cmd_posted_tlv_v
1673  *
1674  * return:void
1675  */
1676 static inline void dp_print_sched_txq_cmd_posted_tlv_v(uint32_t *tag_buf)
1677 {
1678 	htt_sched_txq_cmd_posted_tlv_v *dp_stats_buf =
1679 		(htt_sched_txq_cmd_posted_tlv_v *)tag_buf;
1680 	uint8_t i;
1681 	uint16_t index = 0;
1682 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
1683 	char *sched_cmd_posted = qdf_mem_malloc(DP_MAX_STRING_LEN);
1684 
1685 	if (!sched_cmd_posted) {
1686 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
1687 			  FL("Output buffer not allocated"));
1688 		return;
1689 	}
1690 
1691 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_SCHED_TX_MODE_MAX);
1692 
1693 	DP_PRINT_STATS("HTT_SCHED_TXQ_CMD_POSTED_TLV_V:");
1694 	for (i = 0; i <  tag_len; i++) {
1695 		index += qdf_snprint(&sched_cmd_posted[index],
1696 				DP_MAX_STRING_LEN - index,
1697 				" %u:%u,", i,
1698 				dp_stats_buf->sched_cmd_posted[i]);
1699 	}
1700 	DP_PRINT_STATS("sched_cmd_posted = %s\n", sched_cmd_posted);
1701 	qdf_mem_free(sched_cmd_posted);
1702 }
1703 
1704 /*
1705  * dp_print_sched_txq_cmd_reaped_tlv_v: display htt_sched_txq_cmd_reaped_tlv_v
1706  * @tag_buf: buffer containing the tlv htt_sched_txq_cmd_reaped_tlv_v
1707  *
1708  * return:void
1709  */
1710 static inline void dp_print_sched_txq_cmd_reaped_tlv_v(uint32_t *tag_buf)
1711 {
1712 	htt_sched_txq_cmd_reaped_tlv_v *dp_stats_buf =
1713 		(htt_sched_txq_cmd_reaped_tlv_v *)tag_buf;
1714 	uint8_t i;
1715 	uint16_t index = 0;
1716 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
1717 	char *sched_cmd_reaped = qdf_mem_malloc(DP_MAX_STRING_LEN);
1718 
1719 	if (!sched_cmd_reaped) {
1720 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
1721 			  FL("Output buffer not allocated"));
1722 		return;
1723 	}
1724 
1725 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_SCHED_TX_MODE_MAX);
1726 
1727 	DP_PRINT_STATS("HTT_SCHED_TXQ_CMD_REAPED_TLV_V:");
1728 	for (i = 0; i <  tag_len; i++) {
1729 		index += qdf_snprint(&sched_cmd_reaped[index],
1730 				DP_MAX_STRING_LEN - index,
1731 				" %u:%u,", i,
1732 				dp_stats_buf->sched_cmd_reaped[i]);
1733 	}
1734 	DP_PRINT_STATS("sched_cmd_reaped = %s\n", sched_cmd_reaped);
1735 	qdf_mem_free(sched_cmd_reaped);
1736 }
1737 
1738 /*
1739  * dp_print_tx_pdev_stats_sched_per_txq_tlv: display
1740  *				htt_tx_pdev_stats_sched_per_txq_tlv
1741  * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_sched_per_txq_tlv
1742  *
1743  * return:void
1744  */
1745 static inline void dp_print_tx_pdev_stats_sched_per_txq_tlv(uint32_t *tag_buf)
1746 {
1747 	htt_tx_pdev_stats_sched_per_txq_tlv *dp_stats_buf =
1748 		(htt_tx_pdev_stats_sched_per_txq_tlv *)tag_buf;
1749 
1750 	DP_PRINT_STATS("HTT_TX_PDEV_STATS_SCHED_PER_TXQ_TLV:");
1751 	DP_PRINT_STATS("mac_id__txq_id__word = %u",
1752 		       dp_stats_buf->mac_id__txq_id__word);
1753 	DP_PRINT_STATS("sched_policy = %u",
1754 		       dp_stats_buf->sched_policy);
1755 	DP_PRINT_STATS("last_sched_cmd_posted_timestamp = %u",
1756 		       dp_stats_buf->last_sched_cmd_posted_timestamp);
1757 	DP_PRINT_STATS("last_sched_cmd_compl_timestamp = %u",
1758 		       dp_stats_buf->last_sched_cmd_compl_timestamp);
1759 	DP_PRINT_STATS("sched_2_tac_lwm_count = %u",
1760 		       dp_stats_buf->sched_2_tac_lwm_count);
1761 	DP_PRINT_STATS("sched_2_tac_ring_full = %u",
1762 		       dp_stats_buf->sched_2_tac_ring_full);
1763 	DP_PRINT_STATS("sched_cmd_post_failure = %u",
1764 		       dp_stats_buf->sched_cmd_post_failure);
1765 	DP_PRINT_STATS("num_active_tids = %u",
1766 		       dp_stats_buf->num_active_tids);
1767 	DP_PRINT_STATS("num_ps_schedules = %u",
1768 		       dp_stats_buf->num_ps_schedules);
1769 	DP_PRINT_STATS("sched_cmds_pending = %u",
1770 		       dp_stats_buf->sched_cmds_pending);
1771 	DP_PRINT_STATS("num_tid_register = %u",
1772 		       dp_stats_buf->num_tid_register);
1773 	DP_PRINT_STATS("num_tid_unregister = %u",
1774 		       dp_stats_buf->num_tid_unregister);
1775 	DP_PRINT_STATS("num_qstats_queried = %u",
1776 		       dp_stats_buf->num_qstats_queried);
1777 	DP_PRINT_STATS("qstats_update_pending = %u",
1778 		       dp_stats_buf->qstats_update_pending);
1779 	DP_PRINT_STATS("last_qstats_query_timestamp = %u",
1780 		       dp_stats_buf->last_qstats_query_timestamp);
1781 	DP_PRINT_STATS("num_tqm_cmdq_full = %u",
1782 		       dp_stats_buf->num_tqm_cmdq_full);
1783 	DP_PRINT_STATS("num_de_sched_algo_trigger = %u",
1784 		       dp_stats_buf->num_de_sched_algo_trigger);
1785 	DP_PRINT_STATS("num_rt_sched_algo_trigger = %u",
1786 		       dp_stats_buf->num_rt_sched_algo_trigger);
1787 	DP_PRINT_STATS("num_tqm_sched_algo_trigger = %u",
1788 		       dp_stats_buf->num_tqm_sched_algo_trigger);
1789 	DP_PRINT_STATS("notify_sched = %u\n",
1790 		       dp_stats_buf->notify_sched);
1791 }
1792 
1793 /*
1794  * dp_print_stats_tx_sched_cmn_tlv: display htt_stats_tx_sched_cmn_tlv
1795  * @tag_buf: buffer containing the tlv htt_stats_tx_sched_cmn_tlv
1796  *
1797  * return:void
1798  */
1799 static inline void dp_print_stats_tx_sched_cmn_tlv(uint32_t *tag_buf)
1800 {
1801 	htt_stats_tx_sched_cmn_tlv *dp_stats_buf =
1802 		(htt_stats_tx_sched_cmn_tlv *)tag_buf;
1803 
1804 	DP_PRINT_STATS("HTT_STATS_TX_SCHED_CMN_TLV:");
1805 	DP_PRINT_STATS("mac_id__word = %u",
1806 		       dp_stats_buf->mac_id__word);
1807 	DP_PRINT_STATS("current_timestamp = %u\n",
1808 		       dp_stats_buf->current_timestamp);
1809 }
1810 
1811 /*
1812  * dp_print_tx_tqm_gen_mpdu_stats_tlv_v: display htt_tx_tqm_gen_mpdu_stats_tlv_v
1813  * @tag_buf: buffer containing the tlv htt_tx_tqm_gen_mpdu_stats_tlv_v
1814  *
1815  * return:void
1816  */
1817 static inline void dp_print_tx_tqm_gen_mpdu_stats_tlv_v(uint32_t *tag_buf)
1818 {
1819 	htt_tx_tqm_gen_mpdu_stats_tlv_v *dp_stats_buf =
1820 		(htt_tx_tqm_gen_mpdu_stats_tlv_v *)tag_buf;
1821 	uint8_t i;
1822 	uint16_t index = 0;
1823 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
1824 	char *gen_mpdu_end_reason = qdf_mem_malloc(DP_MAX_STRING_LEN);
1825 
1826 	if (!gen_mpdu_end_reason) {
1827 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
1828 			  FL("Output buffer not allocated"));
1829 		return;
1830 	}
1831 
1832 	tag_len = qdf_min(tag_len,
1833 			(uint32_t)HTT_TX_TQM_MAX_GEN_MPDU_END_REASON);
1834 
1835 	DP_PRINT_STATS("HTT_TX_TQM_GEN_MPDU_STATS_TLV_V:");
1836 	for (i = 0; i <  tag_len; i++) {
1837 		index += qdf_snprint(&gen_mpdu_end_reason[index],
1838 				DP_MAX_STRING_LEN - index,
1839 				" %u:%u,", i,
1840 				dp_stats_buf->gen_mpdu_end_reason[i]);
1841 	}
1842 	DP_PRINT_STATS("gen_mpdu_end_reason = %s\n", gen_mpdu_end_reason);
1843 	qdf_mem_free(gen_mpdu_end_reason);
1844 }
1845 
1846 /*
1847  * dp_print_tx_tqm_list_mpdu_stats_tlv_v: display htt_tx_tqm_list_mpdu_stats_tlv
1848  * @tag_buf: buffer containing the tlv htt_tx_tqm_list_mpdu_stats_tlv_v
1849  *
1850  * return:void
1851  */
1852 static inline void dp_print_tx_tqm_list_mpdu_stats_tlv_v(uint32_t *tag_buf)
1853 {
1854 	htt_tx_tqm_list_mpdu_stats_tlv_v *dp_stats_buf =
1855 		(htt_tx_tqm_list_mpdu_stats_tlv_v *)tag_buf;
1856 	uint8_t i;
1857 	uint16_t index = 0;
1858 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
1859 	char *list_mpdu_end_reason = qdf_mem_malloc(DP_MAX_STRING_LEN);
1860 
1861 	if (!list_mpdu_end_reason) {
1862 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
1863 			  FL("Output buffer not allocated"));
1864 		return;
1865 	}
1866 
1867 	tag_len = qdf_min(tag_len,
1868 			(uint32_t)HTT_TX_TQM_MAX_LIST_MPDU_END_REASON);
1869 
1870 	DP_PRINT_STATS("HTT_TX_TQM_LIST_MPDU_STATS_TLV_V:");
1871 	for (i = 0; i <  tag_len; i++) {
1872 		index += qdf_snprint(&list_mpdu_end_reason[index],
1873 				DP_MAX_STRING_LEN - index,
1874 				" %u:%u,", i,
1875 				dp_stats_buf->list_mpdu_end_reason[i]);
1876 	}
1877 	DP_PRINT_STATS("list_mpdu_end_reason = %s\n",
1878 		       list_mpdu_end_reason);
1879 	qdf_mem_free(list_mpdu_end_reason);
1880 }
1881 
1882 /*
1883  * dp_print_tx_tqm_list_mpdu_cnt_tlv_v: display htt_tx_tqm_list_mpdu_cnt_tlv_v
1884  * @tag_buf: buffer containing the tlv htt_tx_tqm_list_mpdu_cnt_tlv_v
1885  *
1886  * return:void
1887  */
1888 static inline void dp_print_tx_tqm_list_mpdu_cnt_tlv_v(uint32_t *tag_buf)
1889 {
1890 	htt_tx_tqm_list_mpdu_cnt_tlv_v *dp_stats_buf =
1891 		(htt_tx_tqm_list_mpdu_cnt_tlv_v *)tag_buf;
1892 	uint8_t i;
1893 	uint16_t index = 0;
1894 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
1895 	char *list_mpdu_cnt_hist = qdf_mem_malloc(DP_MAX_STRING_LEN);
1896 
1897 	if (!list_mpdu_cnt_hist) {
1898 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
1899 			  FL("Output buffer not allocated"));
1900 		return;
1901 	}
1902 
1903 	tag_len = qdf_min(tag_len,
1904 			(uint32_t)HTT_TX_TQM_MAX_LIST_MPDU_CNT_HISTOGRAM_BINS);
1905 
1906 	DP_PRINT_STATS("HTT_TX_TQM_LIST_MPDU_CNT_TLV_V:");
1907 	for (i = 0; i <  tag_len; i++) {
1908 		index += qdf_snprint(&list_mpdu_cnt_hist[index],
1909 				DP_MAX_STRING_LEN - index,
1910 				" %u:%u,", i,
1911 				dp_stats_buf->list_mpdu_cnt_hist[i]);
1912 	}
1913 	DP_PRINT_STATS("list_mpdu_cnt_hist = %s\n", list_mpdu_cnt_hist);
1914 	qdf_mem_free(list_mpdu_cnt_hist);
1915 }
1916 
1917 /*
1918  * dp_print_tx_tqm_pdev_stats_tlv_v: display htt_tx_tqm_pdev_stats_tlv_v
1919  * @tag_buf: buffer containing the tlv htt_tx_tqm_pdev_stats_tlv_v
1920  *
1921  * return:void
1922  */
1923 static inline void dp_print_tx_tqm_pdev_stats_tlv_v(uint32_t *tag_buf)
1924 {
1925 	htt_tx_tqm_pdev_stats_tlv_v *dp_stats_buf =
1926 		(htt_tx_tqm_pdev_stats_tlv_v *)tag_buf;
1927 
1928 	DP_PRINT_STATS("HTT_TX_TQM_PDEV_STATS_TLV_V:");
1929 	DP_PRINT_STATS("msdu_count = %u",
1930 		       dp_stats_buf->msdu_count);
1931 	DP_PRINT_STATS("mpdu_count = %u",
1932 		       dp_stats_buf->mpdu_count);
1933 	DP_PRINT_STATS("remove_msdu = %u",
1934 		       dp_stats_buf->remove_msdu);
1935 	DP_PRINT_STATS("remove_mpdu = %u",
1936 		       dp_stats_buf->remove_mpdu);
1937 	DP_PRINT_STATS("remove_msdu_ttl = %u",
1938 		       dp_stats_buf->remove_msdu_ttl);
1939 	DP_PRINT_STATS("send_bar = %u",
1940 		       dp_stats_buf->send_bar);
1941 	DP_PRINT_STATS("bar_sync = %u",
1942 		       dp_stats_buf->bar_sync);
1943 	DP_PRINT_STATS("notify_mpdu = %u",
1944 		       dp_stats_buf->notify_mpdu);
1945 	DP_PRINT_STATS("sync_cmd = %u",
1946 		       dp_stats_buf->sync_cmd);
1947 	DP_PRINT_STATS("write_cmd = %u",
1948 		       dp_stats_buf->write_cmd);
1949 	DP_PRINT_STATS("hwsch_trigger = %u",
1950 		       dp_stats_buf->hwsch_trigger);
1951 	DP_PRINT_STATS("ack_tlv_proc = %u",
1952 		       dp_stats_buf->ack_tlv_proc);
1953 	DP_PRINT_STATS("gen_mpdu_cmd = %u",
1954 		       dp_stats_buf->gen_mpdu_cmd);
1955 	DP_PRINT_STATS("gen_list_cmd = %u",
1956 		       dp_stats_buf->gen_list_cmd);
1957 	DP_PRINT_STATS("remove_mpdu_cmd = %u",
1958 		       dp_stats_buf->remove_mpdu_cmd);
1959 	DP_PRINT_STATS("remove_mpdu_tried_cmd = %u",
1960 		       dp_stats_buf->remove_mpdu_tried_cmd);
1961 	DP_PRINT_STATS("mpdu_queue_stats_cmd = %u",
1962 		       dp_stats_buf->mpdu_queue_stats_cmd);
1963 	DP_PRINT_STATS("mpdu_head_info_cmd = %u",
1964 		       dp_stats_buf->mpdu_head_info_cmd);
1965 	DP_PRINT_STATS("msdu_flow_stats_cmd = %u",
1966 		       dp_stats_buf->msdu_flow_stats_cmd);
1967 	DP_PRINT_STATS("remove_msdu_cmd = %u",
1968 		       dp_stats_buf->remove_msdu_cmd);
1969 	DP_PRINT_STATS("remove_msdu_ttl_cmd = %u",
1970 		       dp_stats_buf->remove_msdu_ttl_cmd);
1971 	DP_PRINT_STATS("flush_cache_cmd = %u",
1972 		       dp_stats_buf->flush_cache_cmd);
1973 	DP_PRINT_STATS("update_mpduq_cmd = %u",
1974 		       dp_stats_buf->update_mpduq_cmd);
1975 	DP_PRINT_STATS("enqueue = %u",
1976 		       dp_stats_buf->enqueue);
1977 	DP_PRINT_STATS("enqueue_notify = %u",
1978 		       dp_stats_buf->enqueue_notify);
1979 	DP_PRINT_STATS("notify_mpdu_at_head = %u",
1980 		       dp_stats_buf->notify_mpdu_at_head);
1981 	DP_PRINT_STATS("notify_mpdu_state_valid = %u\n",
1982 		       dp_stats_buf->notify_mpdu_state_valid);
1983 }
1984 
1985 /*
1986  * dp_print_tx_tqm_cmn_stats_tlv: display htt_tx_tqm_cmn_stats_tlv
1987  * @tag_buf: buffer containing the tlv htt_tx_tqm_cmn_stats_tlv
1988  *
1989  * return:void
1990  */
1991 static inline void dp_print_tx_tqm_cmn_stats_tlv(uint32_t *tag_buf)
1992 {
1993 	htt_tx_tqm_cmn_stats_tlv *dp_stats_buf =
1994 		(htt_tx_tqm_cmn_stats_tlv *)tag_buf;
1995 
1996 	DP_PRINT_STATS("HTT_TX_TQM_CMN_STATS_TLV:");
1997 	DP_PRINT_STATS("mac_id__word = %u",
1998 		       dp_stats_buf->mac_id__word);
1999 	DP_PRINT_STATS("max_cmdq_id = %u",
2000 		       dp_stats_buf->max_cmdq_id);
2001 	DP_PRINT_STATS("list_mpdu_cnt_hist_intvl = %u",
2002 		       dp_stats_buf->list_mpdu_cnt_hist_intvl);
2003 	DP_PRINT_STATS("add_msdu = %u",
2004 		       dp_stats_buf->add_msdu);
2005 	DP_PRINT_STATS("q_empty = %u",
2006 		       dp_stats_buf->q_empty);
2007 	DP_PRINT_STATS("q_not_empty = %u",
2008 		       dp_stats_buf->q_not_empty);
2009 	DP_PRINT_STATS("drop_notification = %u",
2010 		       dp_stats_buf->drop_notification);
2011 	DP_PRINT_STATS("desc_threshold = %u\n",
2012 		       dp_stats_buf->desc_threshold);
2013 }
2014 
2015 /*
2016  * dp_print_tx_tqm_error_stats_tlv: display htt_tx_tqm_error_stats_tlv
2017  * @tag_buf: buffer containing the tlv htt_tx_tqm_error_stats_tlv
2018  *
2019  * return:void
2020  */
2021 static inline void dp_print_tx_tqm_error_stats_tlv(uint32_t *tag_buf)
2022 {
2023 	htt_tx_tqm_error_stats_tlv *dp_stats_buf =
2024 		(htt_tx_tqm_error_stats_tlv *)tag_buf;
2025 
2026 	DP_PRINT_STATS("HTT_TX_TQM_ERROR_STATS_TLV:");
2027 	DP_PRINT_STATS("q_empty_failure = %u",
2028 		       dp_stats_buf->q_empty_failure);
2029 	DP_PRINT_STATS("q_not_empty_failure = %u",
2030 		       dp_stats_buf->q_not_empty_failure);
2031 	DP_PRINT_STATS("add_msdu_failure = %u\n",
2032 		       dp_stats_buf->add_msdu_failure);
2033 }
2034 
2035 /*
2036  * dp_print_tx_tqm_cmdq_status_tlv: display htt_tx_tqm_cmdq_status_tlv
2037  * @tag_buf: buffer containing the tlv htt_tx_tqm_cmdq_status_tlv
2038  *
2039  * return:void
2040  */
2041 static inline void dp_print_tx_tqm_cmdq_status_tlv(uint32_t *tag_buf)
2042 {
2043 	htt_tx_tqm_cmdq_status_tlv *dp_stats_buf =
2044 		(htt_tx_tqm_cmdq_status_tlv *)tag_buf;
2045 
2046 	DP_PRINT_STATS("HTT_TX_TQM_CMDQ_STATUS_TLV:");
2047 	DP_PRINT_STATS("mac_id__cmdq_id__word = %u",
2048 		       dp_stats_buf->mac_id__cmdq_id__word);
2049 	DP_PRINT_STATS("sync_cmd = %u",
2050 		       dp_stats_buf->sync_cmd);
2051 	DP_PRINT_STATS("write_cmd = %u",
2052 		       dp_stats_buf->write_cmd);
2053 	DP_PRINT_STATS("gen_mpdu_cmd = %u",
2054 		       dp_stats_buf->gen_mpdu_cmd);
2055 	DP_PRINT_STATS("mpdu_queue_stats_cmd = %u",
2056 		       dp_stats_buf->mpdu_queue_stats_cmd);
2057 	DP_PRINT_STATS("mpdu_head_info_cmd = %u",
2058 		       dp_stats_buf->mpdu_head_info_cmd);
2059 	DP_PRINT_STATS("msdu_flow_stats_cmd = %u",
2060 		       dp_stats_buf->msdu_flow_stats_cmd);
2061 	DP_PRINT_STATS("remove_mpdu_cmd = %u",
2062 		       dp_stats_buf->remove_mpdu_cmd);
2063 	DP_PRINT_STATS("remove_msdu_cmd = %u",
2064 		       dp_stats_buf->remove_msdu_cmd);
2065 	DP_PRINT_STATS("flush_cache_cmd = %u",
2066 		       dp_stats_buf->flush_cache_cmd);
2067 	DP_PRINT_STATS("update_mpduq_cmd = %u",
2068 		       dp_stats_buf->update_mpduq_cmd);
2069 	DP_PRINT_STATS("update_msduq_cmd = %u\n",
2070 		       dp_stats_buf->update_msduq_cmd);
2071 }
2072 
2073 /*
2074  * dp_print_tx_de_eapol_packets_stats_tlv: display htt_tx_de_eapol_packets_stats
2075  * @tag_buf: buffer containing the tlv htt_tx_de_eapol_packets_stats_tlv
2076  *
2077  * return:void
2078  */
2079 static inline void dp_print_tx_de_eapol_packets_stats_tlv(uint32_t *tag_buf)
2080 {
2081 	htt_tx_de_eapol_packets_stats_tlv *dp_stats_buf =
2082 		(htt_tx_de_eapol_packets_stats_tlv *)tag_buf;
2083 
2084 	DP_PRINT_STATS("HTT_TX_DE_EAPOL_PACKETS_STATS_TLV:");
2085 	DP_PRINT_STATS("m1_packets = %u",
2086 		       dp_stats_buf->m1_packets);
2087 	DP_PRINT_STATS("m2_packets = %u",
2088 		       dp_stats_buf->m2_packets);
2089 	DP_PRINT_STATS("m3_packets = %u",
2090 		       dp_stats_buf->m3_packets);
2091 	DP_PRINT_STATS("m4_packets = %u",
2092 		       dp_stats_buf->m4_packets);
2093 	DP_PRINT_STATS("g1_packets = %u",
2094 		       dp_stats_buf->g1_packets);
2095 	DP_PRINT_STATS("g2_packets = %u\n",
2096 		       dp_stats_buf->g2_packets);
2097 }
2098 
2099 /*
2100  * dp_print_tx_de_classify_failed_stats_tlv: display
2101  *				htt_tx_de_classify_failed_stats_tlv
2102  * @tag_buf: buffer containing the tlv htt_tx_de_classify_failed_stats_tlv
2103  *
2104  * return:void
2105  */
2106 static inline void dp_print_tx_de_classify_failed_stats_tlv(uint32_t *tag_buf)
2107 {
2108 	htt_tx_de_classify_failed_stats_tlv *dp_stats_buf =
2109 		(htt_tx_de_classify_failed_stats_tlv *)tag_buf;
2110 
2111 	DP_PRINT_STATS("HTT_TX_DE_CLASSIFY_FAILED_STATS_TLV:");
2112 	DP_PRINT_STATS("ap_bss_peer_not_found = %u",
2113 		       dp_stats_buf->ap_bss_peer_not_found);
2114 	DP_PRINT_STATS("ap_bcast_mcast_no_peer = %u",
2115 		       dp_stats_buf->ap_bcast_mcast_no_peer);
2116 	DP_PRINT_STATS("sta_delete_in_progress = %u",
2117 		       dp_stats_buf->sta_delete_in_progress);
2118 	DP_PRINT_STATS("ibss_no_bss_peer = %u",
2119 		       dp_stats_buf->ibss_no_bss_peer);
2120 	DP_PRINT_STATS("invaild_vdev_type = %u",
2121 		       dp_stats_buf->invaild_vdev_type);
2122 	DP_PRINT_STATS("invalid_ast_peer_entry = %u",
2123 		       dp_stats_buf->invalid_ast_peer_entry);
2124 	DP_PRINT_STATS("peer_entry_invalid = %u",
2125 		       dp_stats_buf->peer_entry_invalid);
2126 	DP_PRINT_STATS("ethertype_not_ip = %u",
2127 		       dp_stats_buf->ethertype_not_ip);
2128 	DP_PRINT_STATS("eapol_lookup_failed = %u",
2129 		       dp_stats_buf->eapol_lookup_failed);
2130 	DP_PRINT_STATS("qpeer_not_allow_data = %u",
2131 		       dp_stats_buf->qpeer_not_allow_data);
2132 	DP_PRINT_STATS("fse_tid_override = %u\n",
2133 		       dp_stats_buf->fse_tid_override);
2134 }
2135 
2136 /*
2137  * dp_print_tx_de_classify_stats_tlv: display htt_tx_de_classify_stats_tlv
2138  * @tag_buf: buffer containing the tlv htt_tx_de_classify_stats_tlv
2139  *
2140  * return:void
2141  */
2142 static inline void dp_print_tx_de_classify_stats_tlv(uint32_t *tag_buf)
2143 {
2144 	htt_tx_de_classify_stats_tlv *dp_stats_buf =
2145 		(htt_tx_de_classify_stats_tlv *)tag_buf;
2146 
2147 	DP_PRINT_STATS("HTT_TX_DE_CLASSIFY_STATS_TLV:");
2148 	DP_PRINT_STATS("arp_packets = %u",
2149 		       dp_stats_buf->arp_packets);
2150 	DP_PRINT_STATS("igmp_packets = %u",
2151 		       dp_stats_buf->igmp_packets);
2152 	DP_PRINT_STATS("dhcp_packets = %u",
2153 		       dp_stats_buf->dhcp_packets);
2154 	DP_PRINT_STATS("host_inspected = %u",
2155 		       dp_stats_buf->host_inspected);
2156 	DP_PRINT_STATS("htt_included = %u",
2157 		       dp_stats_buf->htt_included);
2158 	DP_PRINT_STATS("htt_valid_mcs = %u",
2159 		       dp_stats_buf->htt_valid_mcs);
2160 	DP_PRINT_STATS("htt_valid_nss = %u",
2161 		       dp_stats_buf->htt_valid_nss);
2162 	DP_PRINT_STATS("htt_valid_preamble_type = %u",
2163 		       dp_stats_buf->htt_valid_preamble_type);
2164 	DP_PRINT_STATS("htt_valid_chainmask = %u",
2165 		       dp_stats_buf->htt_valid_chainmask);
2166 	DP_PRINT_STATS("htt_valid_guard_interval = %u",
2167 		       dp_stats_buf->htt_valid_guard_interval);
2168 	DP_PRINT_STATS("htt_valid_retries = %u",
2169 		       dp_stats_buf->htt_valid_retries);
2170 	DP_PRINT_STATS("htt_valid_bw_info = %u",
2171 		       dp_stats_buf->htt_valid_bw_info);
2172 	DP_PRINT_STATS("htt_valid_power = %u",
2173 		       dp_stats_buf->htt_valid_power);
2174 	DP_PRINT_STATS("htt_valid_key_flags = %u",
2175 		       dp_stats_buf->htt_valid_key_flags);
2176 	DP_PRINT_STATS("htt_valid_no_encryption = %u",
2177 		       dp_stats_buf->htt_valid_no_encryption);
2178 	DP_PRINT_STATS("fse_entry_count = %u",
2179 		       dp_stats_buf->fse_entry_count);
2180 	DP_PRINT_STATS("fse_priority_be = %u",
2181 		       dp_stats_buf->fse_priority_be);
2182 	DP_PRINT_STATS("fse_priority_high = %u",
2183 		       dp_stats_buf->fse_priority_high);
2184 	DP_PRINT_STATS("fse_priority_low = %u",
2185 		       dp_stats_buf->fse_priority_low);
2186 	DP_PRINT_STATS("fse_traffic_ptrn_be = %u",
2187 		       dp_stats_buf->fse_traffic_ptrn_be);
2188 	DP_PRINT_STATS("fse_traffic_ptrn_over_sub = %u",
2189 		       dp_stats_buf->fse_traffic_ptrn_over_sub);
2190 	DP_PRINT_STATS("fse_traffic_ptrn_bursty = %u",
2191 		       dp_stats_buf->fse_traffic_ptrn_bursty);
2192 	DP_PRINT_STATS("fse_traffic_ptrn_interactive = %u",
2193 		       dp_stats_buf->fse_traffic_ptrn_interactive);
2194 	DP_PRINT_STATS("fse_traffic_ptrn_periodic = %u",
2195 		       dp_stats_buf->fse_traffic_ptrn_periodic);
2196 	DP_PRINT_STATS("fse_hwqueue_alloc = %u",
2197 		       dp_stats_buf->fse_hwqueue_alloc);
2198 	DP_PRINT_STATS("fse_hwqueue_created = %u",
2199 		       dp_stats_buf->fse_hwqueue_created);
2200 	DP_PRINT_STATS("fse_hwqueue_send_to_host = %u",
2201 		       dp_stats_buf->fse_hwqueue_send_to_host);
2202 	DP_PRINT_STATS("mcast_entry = %u",
2203 		       dp_stats_buf->mcast_entry);
2204 	DP_PRINT_STATS("bcast_entry = %u\n",
2205 		       dp_stats_buf->bcast_entry);
2206 }
2207 
2208 /*
2209  * dp_print_tx_de_classify_status_stats_tlv: display
2210  *				htt_tx_de_classify_status_stats_tlv
2211  * @tag_buf: buffer containing the tlv htt_tx_de_classify_status_stats_tlv
2212  *
2213  * return:void
2214  */
2215 static inline void dp_print_tx_de_classify_status_stats_tlv(uint32_t *tag_buf)
2216 {
2217 	htt_tx_de_classify_status_stats_tlv *dp_stats_buf =
2218 		(htt_tx_de_classify_status_stats_tlv *)tag_buf;
2219 
2220 	DP_PRINT_STATS("HTT_TX_DE_CLASSIFY_STATUS_STATS_TLV:");
2221 	DP_PRINT_STATS("eok = %u",
2222 		       dp_stats_buf->eok);
2223 	DP_PRINT_STATS("classify_done = %u",
2224 		       dp_stats_buf->classify_done);
2225 	DP_PRINT_STATS("lookup_failed = %u",
2226 		       dp_stats_buf->lookup_failed);
2227 	DP_PRINT_STATS("send_host_dhcp = %u",
2228 		       dp_stats_buf->send_host_dhcp);
2229 	DP_PRINT_STATS("send_host_mcast = %u",
2230 		       dp_stats_buf->send_host_mcast);
2231 	DP_PRINT_STATS("send_host_unknown_dest = %u",
2232 		       dp_stats_buf->send_host_unknown_dest);
2233 	DP_PRINT_STATS("send_host = %u",
2234 		       dp_stats_buf->send_host);
2235 	DP_PRINT_STATS("status_invalid = %u\n",
2236 		       dp_stats_buf->status_invalid);
2237 }
2238 
2239 /*
2240  * dp_print_tx_de_enqueue_packets_stats_tlv: display
2241  *				htt_tx_de_enqueue_packets_stats_tlv
2242  * @tag_buf: buffer containing the tlv htt_tx_de_enqueue_packets_stats_tlv
2243  *
2244  * return:void
2245  */
2246 static inline void dp_print_tx_de_enqueue_packets_stats_tlv(uint32_t *tag_buf)
2247 {
2248 	htt_tx_de_enqueue_packets_stats_tlv *dp_stats_buf =
2249 		(htt_tx_de_enqueue_packets_stats_tlv *)tag_buf;
2250 
2251 	DP_PRINT_STATS("HTT_TX_DE_ENQUEUE_PACKETS_STATS_TLV:");
2252 	DP_PRINT_STATS("enqueued_pkts = %u",
2253 		       dp_stats_buf->enqueued_pkts);
2254 	DP_PRINT_STATS("to_tqm = %u",
2255 		       dp_stats_buf->to_tqm);
2256 	DP_PRINT_STATS("to_tqm_bypass = %u\n",
2257 		       dp_stats_buf->to_tqm_bypass);
2258 }
2259 
2260 /*
2261  * dp_print_tx_de_enqueue_discard_stats_tlv: display
2262  *					htt_tx_de_enqueue_discard_stats_tlv
2263  * @tag_buf: buffer containing the tlv htt_tx_de_enqueue_discard_stats_tlv
2264  *
2265  * return:void
2266  */
2267 static inline void dp_print_tx_de_enqueue_discard_stats_tlv(uint32_t *tag_buf)
2268 {
2269 	htt_tx_de_enqueue_discard_stats_tlv *dp_stats_buf =
2270 		(htt_tx_de_enqueue_discard_stats_tlv *)tag_buf;
2271 
2272 	DP_PRINT_STATS("HTT_TX_DE_ENQUEUE_DISCARD_STATS_TLV:");
2273 	DP_PRINT_STATS("discarded_pkts = %u",
2274 		       dp_stats_buf->discarded_pkts);
2275 	DP_PRINT_STATS("local_frames = %u",
2276 		       dp_stats_buf->local_frames);
2277 	DP_PRINT_STATS("is_ext_msdu = %u\n",
2278 		       dp_stats_buf->is_ext_msdu);
2279 }
2280 
2281 /*
2282  * dp_print_tx_de_compl_stats_tlv: display htt_tx_de_compl_stats_tlv
2283  * @tag_buf: buffer containing the tlv htt_tx_de_compl_stats_tlv
2284  *
2285  * return:void
2286  */
2287 static inline void dp_print_tx_de_compl_stats_tlv(uint32_t *tag_buf)
2288 {
2289 	htt_tx_de_compl_stats_tlv *dp_stats_buf =
2290 		(htt_tx_de_compl_stats_tlv *)tag_buf;
2291 
2292 	DP_PRINT_STATS("HTT_TX_DE_COMPL_STATS_TLV:");
2293 	DP_PRINT_STATS("tcl_dummy_frame = %u",
2294 		       dp_stats_buf->tcl_dummy_frame);
2295 	DP_PRINT_STATS("tqm_dummy_frame = %u",
2296 		       dp_stats_buf->tqm_dummy_frame);
2297 	DP_PRINT_STATS("tqm_notify_frame = %u",
2298 		       dp_stats_buf->tqm_notify_frame);
2299 	DP_PRINT_STATS("fw2wbm_enq = %u",
2300 		       dp_stats_buf->fw2wbm_enq);
2301 	DP_PRINT_STATS("tqm_bypass_frame = %u\n",
2302 		       dp_stats_buf->tqm_bypass_frame);
2303 }
2304 
2305 /*
2306  * dp_print_tx_de_cmn_stats_tlv: display htt_tx_de_cmn_stats_tlv
2307  * @tag_buf: buffer containing the tlv htt_tx_de_cmn_stats_tlv
2308  *
2309  * return:void
2310  */
2311 static inline void dp_print_tx_de_cmn_stats_tlv(uint32_t *tag_buf)
2312 {
2313 	htt_tx_de_cmn_stats_tlv *dp_stats_buf =
2314 		(htt_tx_de_cmn_stats_tlv *)tag_buf;
2315 
2316 	DP_PRINT_STATS("HTT_TX_DE_CMN_STATS_TLV:");
2317 	DP_PRINT_STATS("mac_id__word = %u",
2318 		       dp_stats_buf->mac_id__word);
2319 	DP_PRINT_STATS("tcl2fw_entry_count = %u",
2320 		       dp_stats_buf->tcl2fw_entry_count);
2321 	DP_PRINT_STATS("not_to_fw = %u",
2322 		       dp_stats_buf->not_to_fw);
2323 	DP_PRINT_STATS("invalid_pdev_vdev_peer = %u",
2324 		       dp_stats_buf->invalid_pdev_vdev_peer);
2325 	DP_PRINT_STATS("tcl_res_invalid_addrx = %u",
2326 		       dp_stats_buf->tcl_res_invalid_addrx);
2327 	DP_PRINT_STATS("wbm2fw_entry_count = %u",
2328 		       dp_stats_buf->wbm2fw_entry_count);
2329 	DP_PRINT_STATS("invalid_pdev = %u\n",
2330 		       dp_stats_buf->invalid_pdev);
2331 }
2332 
2333 /*
2334  * dp_print_ring_if_stats_tlv: display htt_ring_if_stats_tlv
2335  * @tag_buf: buffer containing the tlv htt_ring_if_stats_tlv
2336  *
2337  * return:void
2338  */
2339 static inline void dp_print_ring_if_stats_tlv(uint32_t *tag_buf)
2340 {
2341 	htt_ring_if_stats_tlv *dp_stats_buf =
2342 		(htt_ring_if_stats_tlv *)tag_buf;
2343 	uint8_t i;
2344 	uint16_t index = 0;
2345 	char *wm_hit_count = qdf_mem_malloc(DP_MAX_STRING_LEN);
2346 
2347 	if (!wm_hit_count) {
2348 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
2349 			  FL("Output buffer not allocated"));
2350 		return;
2351 	}
2352 
2353 	DP_PRINT_STATS("HTT_RING_IF_STATS_TLV:");
2354 	DP_PRINT_STATS("base_addr = %u",
2355 		       dp_stats_buf->base_addr);
2356 	DP_PRINT_STATS("elem_size = %u",
2357 		       dp_stats_buf->elem_size);
2358 	DP_PRINT_STATS("num_elems__prefetch_tail_idx = %u",
2359 		       dp_stats_buf->num_elems__prefetch_tail_idx);
2360 	DP_PRINT_STATS("head_idx__tail_idx = %u",
2361 		       dp_stats_buf->head_idx__tail_idx);
2362 	DP_PRINT_STATS("shadow_head_idx__shadow_tail_idx = %u",
2363 		       dp_stats_buf->shadow_head_idx__shadow_tail_idx);
2364 	DP_PRINT_STATS("num_tail_incr = %u",
2365 		       dp_stats_buf->num_tail_incr);
2366 	DP_PRINT_STATS("lwm_thresh__hwm_thresh = %u",
2367 		       dp_stats_buf->lwm_thresh__hwm_thresh);
2368 	DP_PRINT_STATS("overrun_hit_count = %u",
2369 		       dp_stats_buf->overrun_hit_count);
2370 	DP_PRINT_STATS("underrun_hit_count = %u",
2371 		       dp_stats_buf->underrun_hit_count);
2372 	DP_PRINT_STATS("prod_blockwait_count = %u",
2373 		       dp_stats_buf->prod_blockwait_count);
2374 	DP_PRINT_STATS("cons_blockwait_count = %u",
2375 		       dp_stats_buf->cons_blockwait_count);
2376 
2377 	for (i = 0; i <  DP_HTT_LOW_WM_HIT_COUNT_LEN; i++) {
2378 		index += qdf_snprint(&wm_hit_count[index],
2379 				DP_MAX_STRING_LEN - index,
2380 				" %u:%u,", i,
2381 				dp_stats_buf->low_wm_hit_count[i]);
2382 	}
2383 	DP_PRINT_STATS("low_wm_hit_count = %s ", wm_hit_count);
2384 
2385 	qdf_mem_zero(wm_hit_count, DP_MAX_STRING_LEN);
2386 
2387 	index = 0;
2388 	for (i = 0; i <  DP_HTT_HIGH_WM_HIT_COUNT_LEN; i++) {
2389 		index += qdf_snprint(&wm_hit_count[index],
2390 				DP_MAX_STRING_LEN - index,
2391 				" %u:%u,", i,
2392 				dp_stats_buf->high_wm_hit_count[i]);
2393 	}
2394 	DP_PRINT_STATS("high_wm_hit_count = %s\n", wm_hit_count);
2395 }
2396 
2397 /*
2398  * dp_print_ring_if_cmn_tlv: display htt_ring_if_cmn_tlv
2399  * @tag_buf: buffer containing the tlv htt_ring_if_cmn_tlv
2400  *
2401  * return:void
2402  */
2403 static inline void dp_print_ring_if_cmn_tlv(uint32_t *tag_buf)
2404 {
2405 	htt_ring_if_cmn_tlv *dp_stats_buf =
2406 		(htt_ring_if_cmn_tlv *)tag_buf;
2407 
2408 	DP_PRINT_STATS("HTT_RING_IF_CMN_TLV:");
2409 	DP_PRINT_STATS("mac_id__word = %u",
2410 		       dp_stats_buf->mac_id__word);
2411 	DP_PRINT_STATS("num_records = %u\n",
2412 		       dp_stats_buf->num_records);
2413 }
2414 
2415 /*
2416  * dp_print_sfm_client_user_tlv_v: display htt_sfm_client_user_tlv_v
2417  * @tag_buf: buffer containing the tlv htt_sfm_client_user_tlv_v
2418  *
2419  * return:void
2420  */
2421 static inline void dp_print_sfm_client_user_tlv_v(uint32_t *tag_buf)
2422 {
2423 	htt_sfm_client_user_tlv_v *dp_stats_buf =
2424 		(htt_sfm_client_user_tlv_v *)tag_buf;
2425 	uint8_t i;
2426 	uint16_t index = 0;
2427 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
2428 	char *dwords_used_by_user_n = qdf_mem_malloc(DP_MAX_STRING_LEN);
2429 
2430 	if (!dwords_used_by_user_n) {
2431 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
2432 			  FL("Output buffer not allocated"));
2433 		return;
2434 	}
2435 
2436 	DP_PRINT_STATS("HTT_SFM_CLIENT_USER_TLV_V:");
2437 	for (i = 0; i <  tag_len; i++) {
2438 		index += qdf_snprint(&dwords_used_by_user_n[index],
2439 				DP_MAX_STRING_LEN - index,
2440 				" %u:%u,", i,
2441 				dp_stats_buf->dwords_used_by_user_n[i]);
2442 	}
2443 	DP_PRINT_STATS("dwords_used_by_user_n = %s\n",
2444 		       dwords_used_by_user_n);
2445 	qdf_mem_free(dwords_used_by_user_n);
2446 }
2447 
2448 /*
2449  * dp_print_sfm_client_tlv: display htt_sfm_client_tlv
2450  * @tag_buf: buffer containing the tlv htt_sfm_client_tlv
2451  *
2452  * return:void
2453  */
2454 static inline void dp_print_sfm_client_tlv(uint32_t *tag_buf)
2455 {
2456 	htt_sfm_client_tlv *dp_stats_buf =
2457 		(htt_sfm_client_tlv *)tag_buf;
2458 
2459 	DP_PRINT_STATS("HTT_SFM_CLIENT_TLV:");
2460 	DP_PRINT_STATS("client_id = %u",
2461 		       dp_stats_buf->client_id);
2462 	DP_PRINT_STATS("buf_min = %u",
2463 		       dp_stats_buf->buf_min);
2464 	DP_PRINT_STATS("buf_max = %u",
2465 		       dp_stats_buf->buf_max);
2466 	DP_PRINT_STATS("buf_busy = %u",
2467 		       dp_stats_buf->buf_busy);
2468 	DP_PRINT_STATS("buf_alloc = %u",
2469 		       dp_stats_buf->buf_alloc);
2470 	DP_PRINT_STATS("buf_avail = %u",
2471 		       dp_stats_buf->buf_avail);
2472 	DP_PRINT_STATS("num_users = %u\n",
2473 		       dp_stats_buf->num_users);
2474 }
2475 
2476 /*
2477  * dp_print_sfm_cmn_tlv: display htt_sfm_cmn_tlv
2478  * @tag_buf: buffer containing the tlv htt_sfm_cmn_tlv
2479  *
2480  * return:void
2481  */
2482 static inline void dp_print_sfm_cmn_tlv(uint32_t *tag_buf)
2483 {
2484 	htt_sfm_cmn_tlv *dp_stats_buf =
2485 		(htt_sfm_cmn_tlv *)tag_buf;
2486 
2487 	DP_PRINT_STATS("HTT_SFM_CMN_TLV:");
2488 	DP_PRINT_STATS("mac_id__word = %u",
2489 		       dp_stats_buf->mac_id__word);
2490 	DP_PRINT_STATS("buf_total = %u",
2491 		       dp_stats_buf->buf_total);
2492 	DP_PRINT_STATS("mem_empty = %u",
2493 		       dp_stats_buf->mem_empty);
2494 	DP_PRINT_STATS("deallocate_bufs = %u",
2495 		       dp_stats_buf->deallocate_bufs);
2496 	DP_PRINT_STATS("num_records = %u\n",
2497 		       dp_stats_buf->num_records);
2498 }
2499 
2500 /*
2501  * dp_print_sring_stats_tlv: display htt_sring_stats_tlv
2502  * @tag_buf: buffer containing the tlv htt_sring_stats_tlv
2503  *
2504  * return:void
2505  */
2506 static inline void dp_print_sring_stats_tlv(uint32_t *tag_buf)
2507 {
2508 	htt_sring_stats_tlv *dp_stats_buf =
2509 		(htt_sring_stats_tlv *)tag_buf;
2510 
2511 	DP_PRINT_STATS("HTT_SRING_STATS_TLV:");
2512 	DP_PRINT_STATS("mac_id__ring_id__arena__ep = %u",
2513 		       dp_stats_buf->mac_id__ring_id__arena__ep);
2514 	DP_PRINT_STATS("base_addr_lsb = %u",
2515 		       dp_stats_buf->base_addr_lsb);
2516 	DP_PRINT_STATS("base_addr_msb = %u",
2517 		       dp_stats_buf->base_addr_msb);
2518 	DP_PRINT_STATS("ring_size = %u",
2519 		       dp_stats_buf->ring_size);
2520 	DP_PRINT_STATS("elem_size = %u",
2521 		       dp_stats_buf->elem_size);
2522 	DP_PRINT_STATS("num_avail_words__num_valid_words = %u",
2523 		       dp_stats_buf->num_avail_words__num_valid_words);
2524 	DP_PRINT_STATS("head_ptr__tail_ptr = %u",
2525 		       dp_stats_buf->head_ptr__tail_ptr);
2526 	DP_PRINT_STATS("consumer_empty__producer_full = %u",
2527 		       dp_stats_buf->consumer_empty__producer_full);
2528 	DP_PRINT_STATS("prefetch_count__internal_tail_ptr = %u\n",
2529 		       dp_stats_buf->prefetch_count__internal_tail_ptr);
2530 }
2531 
2532 /*
2533  * dp_print_sring_cmn_tlv: display htt_sring_cmn_tlv
2534  * @tag_buf: buffer containing the tlv htt_sring_cmn_tlv
2535  *
2536  * return:void
2537  */
2538 static inline void dp_print_sring_cmn_tlv(uint32_t *tag_buf)
2539 {
2540 	htt_sring_cmn_tlv *dp_stats_buf =
2541 		(htt_sring_cmn_tlv *)tag_buf;
2542 
2543 	DP_PRINT_STATS("HTT_SRING_CMN_TLV:");
2544 	DP_PRINT_STATS("num_records = %u\n",
2545 		       dp_stats_buf->num_records);
2546 }
2547 
2548 /*
2549  * dp_print_tx_pdev_rate_stats_tlv: display htt_tx_pdev_rate_stats_tlv
2550  * @tag_buf: buffer containing the tlv htt_tx_pdev_rate_stats_tlv
2551  *
2552  * return:void
2553  */
2554 static void dp_print_tx_pdev_rate_stats_tlv(uint32_t *tag_buf)
2555 {
2556 	htt_tx_pdev_rate_stats_tlv *dp_stats_buf =
2557 		(htt_tx_pdev_rate_stats_tlv *)tag_buf;
2558 	uint8_t i, j;
2559 	uint16_t index = 0;
2560 	char *tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS];
2561 	char *ac_mu_mimo_tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS];
2562 	char *ax_mu_mimo_tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS];
2563 	char *ofdma_tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS];
2564 	char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
2565 
2566 	if (!str_buf) {
2567 		dp_err("Output buffer not allocated");
2568 		return;
2569 	}
2570 
2571 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
2572 		tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
2573 		if (!tx_gi[i]) {
2574 			dp_err("Unable to allocate buffer for tx_gi");
2575 			goto fail1;
2576 		}
2577 		ac_mu_mimo_tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
2578 		if (!ac_mu_mimo_tx_gi[i]) {
2579 			dp_err("Unable to allocate buffer for ac_mu_mimo_tx_gi");
2580 			goto fail2;
2581 		}
2582 		ax_mu_mimo_tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
2583 		if (!ax_mu_mimo_tx_gi[i]) {
2584 			dp_err("Unable to allocate buffer for ax_mu_mimo_tx_gi");
2585 			goto fail3;
2586 		}
2587 		ofdma_tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
2588 		if (!ofdma_tx_gi[i]) {
2589 			dp_err("Unable to allocate buffer for ofdma_tx_gi");
2590 			goto fail4;
2591 		}
2592 	}
2593 
2594 	DP_PRINT_STATS("HTT_TX_PDEV_RATE_STATS_TLV:");
2595 	DP_PRINT_STATS("mac_id__word = %u",
2596 		       dp_stats_buf->mac_id__word);
2597 	DP_PRINT_STATS("tx_ldpc = %u",
2598 		       dp_stats_buf->tx_ldpc);
2599 	DP_PRINT_STATS("rts_cnt = %u",
2600 		       dp_stats_buf->rts_cnt);
2601 	DP_PRINT_STATS("rts_success = %u",
2602 		       dp_stats_buf->rts_success);
2603 
2604 	DP_PRINT_STATS("ack_rssi = %u",
2605 		       dp_stats_buf->ack_rssi);
2606 
2607 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2608 	for (i = 0; i <  DP_HTT_TX_MCS_LEN; i++) {
2609 		index += qdf_snprint(&str_buf[index],
2610 				DP_MAX_STRING_LEN - index,
2611 				" %u:%u,", i, dp_stats_buf->tx_mcs[i]);
2612 	}
2613 	DP_PRINT_STATS("tx_mcs = %s ", str_buf);
2614 
2615 	index = 0;
2616 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2617 	for (i = 0; i <  DP_HTT_TX_SU_MCS_LEN; i++) {
2618 		index += qdf_snprint(&str_buf[index],
2619 				DP_MAX_STRING_LEN - index,
2620 				" %u:%u,", i, dp_stats_buf->tx_su_mcs[i]);
2621 	}
2622 	DP_PRINT_STATS("tx_su_mcs = %s ", str_buf);
2623 
2624 	index = 0;
2625 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2626 	for (i = 0; i <  DP_HTT_TX_MU_MCS_LEN; i++) {
2627 		index += qdf_snprint(&str_buf[index],
2628 				DP_MAX_STRING_LEN - index,
2629 				" %u:%u,", i, dp_stats_buf->tx_mu_mcs[i]);
2630 	}
2631 	DP_PRINT_STATS("tx_mu_mcs = %s ", str_buf);
2632 
2633 	index = 0;
2634 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2635 	for (i = 0; i <  DP_HTT_TX_NSS_LEN; i++) {
2636 		/* 0 stands for NSS 1, 1 stands for NSS 2, etc. */
2637 		index += qdf_snprint(&str_buf[index],
2638 				DP_MAX_STRING_LEN - index,
2639 				" %u:%u,", (i + 1),
2640 				dp_stats_buf->tx_nss[i]);
2641 	}
2642 	DP_PRINT_STATS("tx_nss = %s ", str_buf);
2643 
2644 	index = 0;
2645 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2646 	for (i = 0; i <  DP_HTT_TX_BW_LEN; i++) {
2647 		index += qdf_snprint(&str_buf[index],
2648 				DP_MAX_STRING_LEN - index,
2649 				" %u:%u,", i, dp_stats_buf->tx_bw[i]);
2650 	}
2651 	DP_PRINT_STATS("tx_bw = %s ", str_buf);
2652 
2653 	index = 0;
2654 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2655 	for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
2656 		index += qdf_snprint(&str_buf[index],
2657 				DP_MAX_STRING_LEN - index,
2658 				" %u:%u,", i, dp_stats_buf->tx_stbc[i]);
2659 	}
2660 	DP_PRINT_STATS("tx_stbc = %s ", str_buf);
2661 
2662 	index = 0;
2663 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2664 	for (i = 0; i <  DP_HTT_TX_PREAM_LEN; i++) {
2665 		index += qdf_snprint(&str_buf[index],
2666 				DP_MAX_STRING_LEN - index,
2667 				" %u:%u,", i, dp_stats_buf->tx_pream[i]);
2668 	}
2669 	DP_PRINT_STATS("tx_pream = %s ", str_buf);
2670 
2671 	for (j = 0; j < DP_HTT_PDEV_TX_GI_LEN; j++) {
2672 		index = 0;
2673 		qdf_mem_zero(tx_gi[j], DP_MAX_STRING_LEN);
2674 		for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
2675 			index += qdf_snprint(&tx_gi[j][index],
2676 					DP_MAX_STRING_LEN - index,
2677 					" %u:%u,", i,
2678 					dp_stats_buf->tx_gi[j][i]);
2679 		}
2680 		DP_PRINT_STATS("tx_gi[%u] = %s ", j, tx_gi[j]);
2681 	}
2682 
2683 	index = 0;
2684 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2685 	for (i = 0; i <  DP_HTT_TX_DCM_LEN; i++) {
2686 		index += qdf_snprint(&str_buf[index],
2687 				DP_MAX_STRING_LEN - index,
2688 				" %u:%u,", i, dp_stats_buf->tx_dcm[i]);
2689 	}
2690 	DP_PRINT_STATS("tx_dcm = %s\n", str_buf);
2691 
2692 	DP_PRINT_STATS("rts_success = %u",
2693 		       dp_stats_buf->rts_success);
2694 	DP_PRINT_STATS("ac_mu_mimo_tx_ldpc = %u",
2695 		       dp_stats_buf->ac_mu_mimo_tx_ldpc);
2696 	DP_PRINT_STATS("ax_mu_mimo_tx_ldpc = %u",
2697 		       dp_stats_buf->ax_mu_mimo_tx_ldpc);
2698 	DP_PRINT_STATS("ofdma_tx_ldpc = %u",
2699 		       dp_stats_buf->ofdma_tx_ldpc);
2700 
2701 	index = 0;
2702 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2703 	for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_LEGACY_CCK_STATS; i++) {
2704 		index += qdf_snprint(&str_buf[index],
2705 				     DP_MAX_STRING_LEN - index,
2706 				     " %u:%u,",
2707 				     i, dp_stats_buf->tx_legacy_cck_rate[i]);
2708 	}
2709 	DP_PRINT_STATS("tx_legacy_cck_rate = %s ", str_buf);
2710 
2711 	index = 0;
2712 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2713 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_LEGACY_OFDM_STATS; i++) {
2714 		index += qdf_snprint(&str_buf[index],
2715 				     DP_MAX_STRING_LEN - index,
2716 				     " %u:%u,", i,
2717 				     dp_stats_buf->tx_legacy_ofdm_rate[i]);
2718 	}
2719 	DP_PRINT_STATS("tx_legacy_ofdm_rate = %s ", str_buf);
2720 
2721 	index = 0;
2722 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2723 	for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_LTF; i++) {
2724 		index += qdf_snprint(&str_buf[index],
2725 				     DP_MAX_STRING_LEN - index,
2726 				     " %u:%u,",
2727 				     i, dp_stats_buf->tx_he_ltf[i]);
2728 	}
2729 	DP_PRINT_STATS("tx_he_ltf = %s ", str_buf);
2730 
2731 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2732 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
2733 		index += qdf_snprint(&str_buf[index],
2734 				     DP_MAX_STRING_LEN - index,
2735 				     " %u:%u,",
2736 				     i, dp_stats_buf->ofdma_tx_mcs[i]);
2737 	}
2738 	DP_PRINT_STATS("ofdma_tx_mcs = %s ", str_buf);
2739 
2740 	index = 0;
2741 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2742 	for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
2743 		index += qdf_snprint(&str_buf[index],
2744 				     DP_MAX_STRING_LEN - index,
2745 				     " %u:%u,",
2746 				     i, dp_stats_buf->ac_mu_mimo_tx_mcs[i]);
2747 	}
2748 	DP_PRINT_STATS("ac_mu_mimo_tx_mcs = %s ", str_buf);
2749 
2750 	index = 0;
2751 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2752 	for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
2753 		index += qdf_snprint(&str_buf[index],
2754 				     DP_MAX_STRING_LEN - index,
2755 				     " %u:%u,",
2756 				     i, dp_stats_buf->ax_mu_mimo_tx_mcs[i]);
2757 	}
2758 	DP_PRINT_STATS("ax_mu_mimo_tx_mcs = %s ", str_buf);
2759 
2760 	index = 0;
2761 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2762 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
2763 		index += qdf_snprint(&str_buf[index],
2764 				     DP_MAX_STRING_LEN - index,
2765 				     " %u:%u,",
2766 				     i, dp_stats_buf->ofdma_tx_mcs[i]);
2767 	}
2768 	DP_PRINT_STATS("ofdma_tx_mcs = %s ", str_buf);
2769 
2770 	index = 0;
2771 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2772 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) {
2773 		index += qdf_snprint(&str_buf[index],
2774 				     DP_MAX_STRING_LEN - index,
2775 				     " %u:%u,",
2776 				     i, dp_stats_buf->ac_mu_mimo_tx_nss[i]);
2777 	}
2778 	DP_PRINT_STATS("ac_mu_mimo_tx_nss = %s ", str_buf);
2779 
2780 	index = 0;
2781 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2782 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) {
2783 		index += qdf_snprint(&str_buf[index],
2784 				     DP_MAX_STRING_LEN - index,
2785 				     " %u:%u,",
2786 				     i, dp_stats_buf->ax_mu_mimo_tx_nss[i]);
2787 	}
2788 	DP_PRINT_STATS("ax_mu_mimo_tx_nss = %s ", str_buf);
2789 
2790 	index = 0;
2791 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2792 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) {
2793 		index += qdf_snprint(&str_buf[index],
2794 				     DP_MAX_STRING_LEN - index,
2795 				     " %u:%u,",
2796 				     i, dp_stats_buf->ofdma_tx_nss[i]);
2797 	}
2798 	DP_PRINT_STATS("ofdma_tx_nss = %s ", str_buf);
2799 
2800 	index = 0;
2801 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2802 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
2803 		index += qdf_snprint(&str_buf[index],
2804 				     DP_MAX_STRING_LEN - index,
2805 				     " %u:%u,",
2806 				     i, dp_stats_buf->ac_mu_mimo_tx_bw[i]);
2807 	}
2808 	DP_PRINT_STATS("ac_mu_mimo_tx_bw = %s ", str_buf);
2809 
2810 	index = 0;
2811 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2812 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
2813 		index += qdf_snprint(&str_buf[index],
2814 				     DP_MAX_STRING_LEN - index,
2815 				     " %u:%u,",
2816 				     i, dp_stats_buf->ax_mu_mimo_tx_bw[i]);
2817 	}
2818 	DP_PRINT_STATS("ax_mu_mimo_tx_bw = %s ", str_buf);
2819 
2820 	index = 0;
2821 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2822 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
2823 		index += qdf_snprint(&str_buf[index],
2824 				     DP_MAX_STRING_LEN - index,
2825 				     " %u:%u,",
2826 				     i, dp_stats_buf->ofdma_tx_bw[i]);
2827 	}
2828 
2829 	DP_PRINT_STATS("ofdma_tx_bw = %s ", str_buf);
2830 
2831 	for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
2832 		index = 0;
2833 		qdf_mem_zero(ac_mu_mimo_tx_gi[j], DP_MAX_STRING_LEN);
2834 		for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
2835 			index += qdf_snprint(&ac_mu_mimo_tx_gi[j][index],
2836 					     DP_MAX_STRING_LEN - index,
2837 					     " %u:%u,", i,
2838 					     dp_stats_buf->
2839 					     ac_mu_mimo_tx_gi[j][i]);
2840 		}
2841 		DP_PRINT_STATS("ac_mu_mimo_tx_gi[%u] = %s ",
2842 			       j, ac_mu_mimo_tx_gi[j]);
2843 	}
2844 
2845 	for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
2846 		index = 0;
2847 		qdf_mem_zero(ax_mu_mimo_tx_gi[j], DP_MAX_STRING_LEN);
2848 		for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
2849 			index += qdf_snprint(&ax_mu_mimo_tx_gi[j][index],
2850 					DP_MAX_STRING_LEN - index,
2851 					" %u:%u,", i,
2852 					dp_stats_buf->ax_mu_mimo_tx_gi[j][i]);
2853 		}
2854 		DP_PRINT_STATS("ax_mu_mimo_tx_gi[%u] = %s ",
2855 			       j, ax_mu_mimo_tx_gi[j]);
2856 	}
2857 
2858 	for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
2859 		index = 0;
2860 		qdf_mem_zero(ofdma_tx_gi[j], DP_MAX_STRING_LEN);
2861 		for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
2862 			index += qdf_snprint(&ofdma_tx_gi[j][index],
2863 					DP_MAX_STRING_LEN - index,
2864 					" %u:%u,", i,
2865 					dp_stats_buf->ofdma_tx_gi[j][i]);
2866 		}
2867 		DP_PRINT_STATS("ofdma_tx_gi[%u] = %s ",
2868 			       j, ofdma_tx_gi[j]);
2869 	}
2870 
2871 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++)
2872 		qdf_mem_free(ofdma_tx_gi[i]);
2873 
2874 fail4:
2875 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++)
2876 		qdf_mem_free(ax_mu_mimo_tx_gi[i]);
2877 fail3:
2878 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++)
2879 		qdf_mem_free(ac_mu_mimo_tx_gi[i]);
2880 fail2:
2881 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++)
2882 		qdf_mem_free(tx_gi[i]);
2883 
2884 fail1:
2885 	qdf_mem_free(str_buf);
2886 }
2887 
2888 /*
2889  * dp_print_rx_pdev_rate_stats_tlv: display htt_rx_pdev_rate_stats_tlv
2890  * @tag_buf: buffer containing the tlv htt_rx_pdev_rate_stats_tlv
2891  *
2892  * return:void
2893  */
2894 static inline void dp_print_rx_pdev_rate_stats_tlv(uint32_t *tag_buf)
2895 {
2896 	htt_rx_pdev_rate_stats_tlv *dp_stats_buf =
2897 		(htt_rx_pdev_rate_stats_tlv *)tag_buf;
2898 	uint8_t i, j;
2899 	uint16_t index = 0;
2900 	char *rssi_chain[DP_HTT_RSSI_CHAIN_LEN];
2901 	char *rx_gi[HTT_RX_PDEV_STATS_NUM_GI_COUNTERS];
2902 	char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
2903 	char *ul_ofdma_rx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS];
2904 
2905 	if (!str_buf) {
2906 		dp_err("Output buffer not allocated");
2907 		return;
2908 	}
2909 
2910 	for (i = 0; i < DP_HTT_RSSI_CHAIN_LEN; i++) {
2911 		rssi_chain[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
2912 		if (!rssi_chain[i]) {
2913 			dp_err("Unable to allocate buffer for rssi_chain");
2914 			goto fail1;
2915 		}
2916 	}
2917 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
2918 		rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
2919 		if (!rx_gi[i]) {
2920 			dp_err("Unable to allocate buffer for rx_gi");
2921 			goto fail2;
2922 		}
2923 	}
2924 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
2925 		ul_ofdma_rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
2926 		if (!ul_ofdma_rx_gi[i]) {
2927 			dp_err("Unable to allocate buffer for ul_ofdma_rx_gi");
2928 			goto fail3;
2929 		}
2930 	}
2931 
2932 	DP_PRINT_STATS("HTT_RX_PDEV_RATE_STATS_TLV:");
2933 	DP_PRINT_STATS("mac_id__word = %u",
2934 		       dp_stats_buf->mac_id__word);
2935 	DP_PRINT_STATS("nsts = %u",
2936 		       dp_stats_buf->nsts);
2937 	DP_PRINT_STATS("rx_ldpc = %u",
2938 		       dp_stats_buf->rx_ldpc);
2939 	DP_PRINT_STATS("rts_cnt = %u",
2940 		       dp_stats_buf->rts_cnt);
2941 	DP_PRINT_STATS("rssi_mgmt = %u",
2942 		       dp_stats_buf->rssi_mgmt);
2943 	DP_PRINT_STATS("rssi_data = %u",
2944 		       dp_stats_buf->rssi_data);
2945 	DP_PRINT_STATS("rssi_comb = %u",
2946 		       dp_stats_buf->rssi_comb);
2947 	DP_PRINT_STATS("rx_in_dbm = %u",
2948 		       dp_stats_buf->rssi_in_dbm);
2949 	DP_PRINT_STATS("rx_11ax_su_ext = %u",
2950 		       dp_stats_buf->rx_11ax_su_ext);
2951 	DP_PRINT_STATS("rx_11ac_mumimo = %u",
2952 		       dp_stats_buf->rx_11ac_mumimo);
2953 	DP_PRINT_STATS("rx_11ax_mumimo = %u",
2954 		       dp_stats_buf->rx_11ax_mumimo);
2955 	DP_PRINT_STATS("rx_11ax_ofdma = %u",
2956 		       dp_stats_buf->rx_11ax_ofdma);
2957 	DP_PRINT_STATS("txbf = %u",
2958 		       dp_stats_buf->txbf);
2959 
2960 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2961 	for (i = 0; i <  DP_HTT_RX_MCS_LEN; i++) {
2962 		index += qdf_snprint(&str_buf[index],
2963 				DP_MAX_STRING_LEN - index,
2964 				" %u:%u,", i, dp_stats_buf->rx_mcs[i]);
2965 	}
2966 	DP_PRINT_STATS("rx_mcs = %s ", str_buf);
2967 
2968 	index = 0;
2969 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2970 	for (i = 0; i <  DP_HTT_RX_NSS_LEN; i++) {
2971 		/* 0 stands for NSS 1, 1 stands for NSS 2, etc. */
2972 		index += qdf_snprint(&str_buf[index],
2973 				DP_MAX_STRING_LEN - index,
2974 				" %u:%u,", (i + 1),
2975 				dp_stats_buf->rx_nss[i]);
2976 	}
2977 	DP_PRINT_STATS("rx_nss = %s ", str_buf);
2978 
2979 	index = 0;
2980 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2981 	for (i = 0; i <  DP_HTT_RX_DCM_LEN; i++) {
2982 		index += qdf_snprint(&str_buf[index],
2983 				DP_MAX_STRING_LEN - index,
2984 				" %u:%u,", i, dp_stats_buf->rx_dcm[i]);
2985 	}
2986 	DP_PRINT_STATS("rx_dcm = %s ", str_buf);
2987 
2988 	index = 0;
2989 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2990 	for (i = 0; i <  HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
2991 		index += qdf_snprint(&str_buf[index],
2992 				DP_MAX_STRING_LEN - index,
2993 				" %u:%u,", i, dp_stats_buf->rx_stbc[i]);
2994 	}
2995 	DP_PRINT_STATS("rx_stbc = %s ", str_buf);
2996 
2997 	index = 0;
2998 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2999 	for (i = 0; i <  DP_HTT_RX_BW_LEN; i++) {
3000 		index += qdf_snprint(&str_buf[index],
3001 				DP_MAX_STRING_LEN - index,
3002 				" %u:%u,", i, dp_stats_buf->rx_bw[i]);
3003 	}
3004 	DP_PRINT_STATS("rx_bw = %s ", str_buf);
3005 
3006 	for (j = 0; j < DP_HTT_RSSI_CHAIN_LEN; j++) {
3007 		index = 0;
3008 		for (i = 0; i <  HTT_RX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
3009 			index += qdf_snprint(&rssi_chain[j][index],
3010 					DP_MAX_STRING_LEN - index,
3011 					" %u:%u,", i,
3012 					dp_stats_buf->rssi_chain[j][i]);
3013 		}
3014 		DP_PRINT_STATS("rssi_chain[%u] = %s ", j, rssi_chain[j]);
3015 	}
3016 
3017 	for (j = 0; j < DP_HTT_RX_GI_LEN; j++) {
3018 		index = 0;
3019 		qdf_mem_zero(rx_gi[j], DP_MAX_STRING_LEN);
3020 		for (i = 0; i <  HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3021 			index += qdf_snprint(&rx_gi[j][index],
3022 					DP_MAX_STRING_LEN - index,
3023 					" %u:%u,", i,
3024 					dp_stats_buf->rx_gi[j][i]);
3025 		}
3026 		DP_PRINT_STATS("rx_gi[%u] = %s ", j, rx_gi[j]);
3027 	}
3028 
3029 	index = 0;
3030 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3031 	for (i = 0; i <  DP_HTT_RX_PREAM_LEN; i++) {
3032 		index += qdf_snprint(&str_buf[index],
3033 				     DP_MAX_STRING_LEN - index,
3034 				     " %u:%u,",
3035 				     i,
3036 				     dp_stats_buf->rx_pream[i]);
3037 	}
3038 	DP_PRINT_STATS("rx_pream = %s", str_buf);
3039 
3040 	index = 0;
3041 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3042 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_LEGACY_CCK_STATS; i++) {
3043 		index += qdf_snprint(&str_buf[index],
3044 				     DP_MAX_STRING_LEN - index,
3045 				     " %u:%u,",
3046 				     i,
3047 				     dp_stats_buf->rx_legacy_cck_rate[i]);
3048 	}
3049 	DP_PRINT_STATS("rx_legacy_cck_rate = %s", str_buf);
3050 
3051 	index = 0;
3052 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3053 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_LEGACY_OFDM_STATS; i++) {
3054 		index += qdf_snprint(&str_buf[index],
3055 				     DP_MAX_STRING_LEN - index,
3056 				     " %u:%u,",
3057 				     i,
3058 				     dp_stats_buf->rx_legacy_ofdm_rate[i]);
3059 	}
3060 	DP_PRINT_STATS("rx_legacy_ofdm_rate = %s", str_buf);
3061 
3062 	index = 0;
3063 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3064 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3065 		index += qdf_snprint(&str_buf[index],
3066 				     DP_MAX_STRING_LEN - index,
3067 				     " %u:%u,",
3068 				     i, dp_stats_buf->ul_ofdma_rx_mcs[i]);
3069 	}
3070 	DP_PRINT_STATS("ul_ofdma_rx_mcs = %s", str_buf);
3071 
3072 	DP_PRINT_STATS("rx_11ax_ul_ofdma = %u",
3073 		       dp_stats_buf->rx_11ax_ul_ofdma);
3074 
3075 	for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
3076 		index = 0;
3077 		qdf_mem_zero(ul_ofdma_rx_gi[j], DP_MAX_STRING_LEN);
3078 		for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3079 			index += qdf_snprint(&ul_ofdma_rx_gi[j][index],
3080 					     DP_MAX_STRING_LEN - index,
3081 					     " %u:%u,", i,
3082 					     dp_stats_buf->
3083 					     ul_ofdma_rx_gi[j][i]);
3084 		}
3085 		DP_PRINT_STATS("ul_ofdma_rx_gi[%u] = %s ",
3086 			       j, ul_ofdma_rx_gi[j]);
3087 	}
3088 
3089 	index = 0;
3090 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3091 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) {
3092 		index += qdf_snprint(&str_buf[index],
3093 				DP_MAX_STRING_LEN - index,
3094 				" %u:%u,", i, dp_stats_buf->ul_ofdma_rx_nss[i]);
3095 	}
3096 	DP_PRINT_STATS("ul_ofdma_rx_nss = %s", str_buf);
3097 
3098 	index = 0;
3099 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3100 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
3101 		index += qdf_snprint(&str_buf[index],
3102 				DP_MAX_STRING_LEN - index,
3103 				" %u:%u,", i, dp_stats_buf->ul_ofdma_rx_bw[i]);
3104 	}
3105 	DP_PRINT_STATS("ul_ofdma_rx_bw = %s", str_buf);
3106 	DP_PRINT_STATS("ul_ofdma_rx_stbc = %u",
3107 		       dp_stats_buf->ul_ofdma_rx_stbc);
3108 	DP_PRINT_STATS("ul_ofdma_rx_ldpc = %u",
3109 		       dp_stats_buf->ul_ofdma_rx_ldpc);
3110 
3111 	index = 0;
3112 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3113 	for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) {
3114 		index += qdf_snprint(&str_buf[index],
3115 				     DP_MAX_STRING_LEN - index,
3116 				     " %u:%u,", i,
3117 				     dp_stats_buf->rx_ulofdma_non_data_ppdu[i]);
3118 	}
3119 	DP_PRINT_STATS("rx_ulofdma_non_data_ppdu = %s", str_buf);
3120 
3121 	index = 0;
3122 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3123 	for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) {
3124 		index += qdf_snprint(&str_buf[index],
3125 				     DP_MAX_STRING_LEN - index,
3126 				     " %u:%u,",
3127 				     i, dp_stats_buf->rx_ulofdma_data_ppdu[i]);
3128 	}
3129 	DP_PRINT_STATS("rx_ulofdma_data_ppdu = %s", str_buf);
3130 
3131 	index = 0;
3132 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3133 	for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) {
3134 		index += qdf_snprint(&str_buf[index],
3135 				     DP_MAX_STRING_LEN - index,
3136 				     " %u:%u,",
3137 				     i, dp_stats_buf->rx_ulofdma_mpdu_ok[i]);
3138 	}
3139 	DP_PRINT_STATS("rx_ulofdma_mpdu_ok = %s", str_buf);
3140 
3141 	index = 0;
3142 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3143 	for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) {
3144 		index += qdf_snprint(&str_buf[index],
3145 				     DP_MAX_STRING_LEN - index,
3146 				     " %u:%u,",
3147 				     i, dp_stats_buf->rx_ulofdma_mpdu_fail[i]);
3148 	}
3149 	DP_PRINT_STATS("rx_ulofdma_mpdu_fail = %s", str_buf);
3150 
3151 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++)
3152 		qdf_mem_free(ul_ofdma_rx_gi[i]);
3153 
3154 fail3:
3155 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++)
3156 		qdf_mem_free(rx_gi[i]);
3157 fail2:
3158 	for (i = 0; i < DP_HTT_RSSI_CHAIN_LEN; i++)
3159 		qdf_mem_free(rssi_chain[i]);
3160 fail1:
3161 	qdf_mem_free(str_buf);
3162 
3163 }
3164 
3165 /*
3166  * dp_print_rx_soc_fw_stats_tlv: display htt_rx_soc_fw_stats_tlv
3167  * @tag_buf: buffer containing the tlv htt_rx_soc_fw_stats_tlv
3168  *
3169  * return:void
3170  */
3171 static inline void dp_print_rx_soc_fw_stats_tlv(uint32_t *tag_buf)
3172 {
3173 	htt_rx_soc_fw_stats_tlv *dp_stats_buf =
3174 		(htt_rx_soc_fw_stats_tlv *)tag_buf;
3175 
3176 	DP_PRINT_STATS("HTT_RX_SOC_FW_STATS_TLV:");
3177 	DP_PRINT_STATS("fw_reo_ring_data_msdu = %u",
3178 		       dp_stats_buf->fw_reo_ring_data_msdu);
3179 	DP_PRINT_STATS("fw_to_host_data_msdu_bcmc = %u",
3180 		       dp_stats_buf->fw_to_host_data_msdu_bcmc);
3181 	DP_PRINT_STATS("fw_to_host_data_msdu_uc = %u",
3182 		       dp_stats_buf->fw_to_host_data_msdu_uc);
3183 	DP_PRINT_STATS("ofld_remote_data_buf_recycle_cnt = %u",
3184 		       dp_stats_buf->ofld_remote_data_buf_recycle_cnt);
3185 	DP_PRINT_STATS("ofld_remote_free_buf_indication_cnt = %u",
3186 		       dp_stats_buf->ofld_remote_free_buf_indication_cnt);
3187 	DP_PRINT_STATS("ofld_buf_to_host_data_msdu_uc = %u ",
3188 		       dp_stats_buf->ofld_buf_to_host_data_msdu_uc);
3189 	DP_PRINT_STATS("reo_fw_ring_to_host_data_msdu_uc = %u ",
3190 		       dp_stats_buf->reo_fw_ring_to_host_data_msdu_uc);
3191 	DP_PRINT_STATS("wbm_sw_ring_reap = %u ",
3192 		       dp_stats_buf->wbm_sw_ring_reap);
3193 	DP_PRINT_STATS("wbm_forward_to_host_cnt = %u ",
3194 		       dp_stats_buf->wbm_forward_to_host_cnt);
3195 	DP_PRINT_STATS("wbm_target_recycle_cnt = %u ",
3196 		       dp_stats_buf->wbm_target_recycle_cnt);
3197 	DP_PRINT_STATS("target_refill_ring_recycle_cnt = %u",
3198 		       dp_stats_buf->target_refill_ring_recycle_cnt);
3199 
3200 }
3201 
3202 /*
3203  * dp_print_rx_soc_fw_refill_ring_empty_tlv_v: display
3204  *					htt_rx_soc_fw_refill_ring_empty_tlv_v
3205  * @tag_buf: buffer containing the tlv htt_rx_soc_fw_refill_ring_empty_tlv_v
3206  *
3207  * return:void
3208  */
3209 static inline void dp_print_rx_soc_fw_refill_ring_empty_tlv_v(uint32_t *tag_buf)
3210 {
3211 	htt_rx_soc_fw_refill_ring_empty_tlv_v *dp_stats_buf =
3212 		(htt_rx_soc_fw_refill_ring_empty_tlv_v *)tag_buf;
3213 	uint8_t i;
3214 	uint16_t index = 0;
3215 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
3216 	char *refill_ring_empty_cnt = qdf_mem_malloc(DP_MAX_STRING_LEN);
3217 
3218 	if (!refill_ring_empty_cnt) {
3219 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
3220 			  FL("Output buffer not allocated"));
3221 		return;
3222 	}
3223 
3224 	tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_STATS_REFILL_MAX_RING);
3225 
3226 	DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_EMPTY_TLV_V:");
3227 	for (i = 0; i <  tag_len; i++) {
3228 		index += qdf_snprint(&refill_ring_empty_cnt[index],
3229 				DP_MAX_STRING_LEN - index,
3230 				" %u:%u,", i,
3231 				dp_stats_buf->refill_ring_empty_cnt[i]);
3232 	}
3233 	DP_PRINT_STATS("refill_ring_empty_cnt = %s\n",
3234 		       refill_ring_empty_cnt);
3235 	qdf_mem_free(refill_ring_empty_cnt);
3236 }
3237 
3238 /*
3239  * dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v: display
3240  *				htt_rx_soc_fw_refill_ring_num_refill_tlv_v
3241  * @tag_buf: buffer containing the tlv htt_rx_soc_fw_refill_ring_num_refill_tlv
3242  *
3243  * return:void
3244  */
3245 static inline void dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v(
3246 		uint32_t *tag_buf)
3247 {
3248 	htt_rx_soc_fw_refill_ring_num_refill_tlv_v *dp_stats_buf =
3249 		(htt_rx_soc_fw_refill_ring_num_refill_tlv_v *)tag_buf;
3250 	uint8_t i;
3251 	uint16_t index = 0;
3252 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
3253 	char *refill_ring_num_refill = qdf_mem_malloc(DP_MAX_STRING_LEN);
3254 
3255 	if (!refill_ring_num_refill) {
3256 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
3257 			  FL("Output buffer not allocated"));
3258 		return;
3259 	}
3260 
3261 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_URRN_STATS);
3262 
3263 	DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_REFILL_TLV_V:");
3264 	for (i = 0; i <  tag_len; i++) {
3265 		index += qdf_snprint(&refill_ring_num_refill[index],
3266 				DP_MAX_STRING_LEN - index,
3267 				" %u:%u,", i,
3268 				dp_stats_buf->refill_ring_num_refill[i]);
3269 	}
3270 	DP_PRINT_STATS("refill_ring_num_refill = %s\n",
3271 		       refill_ring_num_refill);
3272 	qdf_mem_free(refill_ring_num_refill);
3273 }
3274 
3275 /*
3276  * dp_print_rx_pdev_fw_stats_tlv: display htt_rx_pdev_fw_stats_tlv
3277  * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_stats_tlv
3278  *
3279  * return:void
3280  */
3281 static inline void dp_print_rx_pdev_fw_stats_tlv(uint32_t *tag_buf)
3282 {
3283 	htt_rx_pdev_fw_stats_tlv *dp_stats_buf =
3284 		(htt_rx_pdev_fw_stats_tlv *)tag_buf;
3285 	uint8_t i;
3286 	uint16_t index = 0;
3287 	char fw_ring_mgmt_subtype[DP_MAX_STRING_LEN];
3288 	char fw_ring_ctrl_subtype[DP_MAX_STRING_LEN];
3289 
3290 	DP_PRINT_STATS("HTT_RX_PDEV_FW_STATS_TLV:");
3291 	DP_PRINT_STATS("mac_id__word = %u",
3292 		       dp_stats_buf->mac_id__word);
3293 	DP_PRINT_STATS("ppdu_recvd = %u",
3294 		       dp_stats_buf->ppdu_recvd);
3295 	DP_PRINT_STATS("mpdu_cnt_fcs_ok = %u",
3296 		       dp_stats_buf->mpdu_cnt_fcs_ok);
3297 	DP_PRINT_STATS("mpdu_cnt_fcs_err = %u",
3298 		       dp_stats_buf->mpdu_cnt_fcs_err);
3299 	DP_PRINT_STATS("tcp_msdu_cnt = %u",
3300 		       dp_stats_buf->tcp_msdu_cnt);
3301 	DP_PRINT_STATS("tcp_ack_msdu_cnt = %u",
3302 		       dp_stats_buf->tcp_ack_msdu_cnt);
3303 	DP_PRINT_STATS("udp_msdu_cnt = %u",
3304 		       dp_stats_buf->udp_msdu_cnt);
3305 	DP_PRINT_STATS("other_msdu_cnt = %u",
3306 		       dp_stats_buf->other_msdu_cnt);
3307 	DP_PRINT_STATS("fw_ring_mpdu_ind = %u",
3308 		       dp_stats_buf->fw_ring_mpdu_ind);
3309 
3310 	for (i = 0; i <  DP_HTT_FW_RING_MGMT_SUBTYPE_LEN; i++) {
3311 		index += qdf_snprint(&fw_ring_mgmt_subtype[index],
3312 				DP_MAX_STRING_LEN - index,
3313 				" %u:%u,", i,
3314 				dp_stats_buf->fw_ring_mgmt_subtype[i]);
3315 	}
3316 	DP_PRINT_STATS("fw_ring_mgmt_subtype = %s ", fw_ring_mgmt_subtype);
3317 
3318 	index = 0;
3319 	for (i = 0; i <  DP_HTT_FW_RING_CTRL_SUBTYPE_LEN; i++) {
3320 		index += qdf_snprint(&fw_ring_ctrl_subtype[index],
3321 				DP_MAX_STRING_LEN - index,
3322 				" %u:%u,", i,
3323 				dp_stats_buf->fw_ring_ctrl_subtype[i]);
3324 	}
3325 	DP_PRINT_STATS("fw_ring_ctrl_subtype = %s ", fw_ring_ctrl_subtype);
3326 	DP_PRINT_STATS("fw_ring_mcast_data_msdu = %u",
3327 		       dp_stats_buf->fw_ring_mcast_data_msdu);
3328 	DP_PRINT_STATS("fw_ring_bcast_data_msdu = %u",
3329 		       dp_stats_buf->fw_ring_bcast_data_msdu);
3330 	DP_PRINT_STATS("fw_ring_ucast_data_msdu = %u",
3331 		       dp_stats_buf->fw_ring_ucast_data_msdu);
3332 	DP_PRINT_STATS("fw_ring_null_data_msdu = %u",
3333 		       dp_stats_buf->fw_ring_null_data_msdu);
3334 	DP_PRINT_STATS("fw_ring_mpdu_drop = %u",
3335 		       dp_stats_buf->fw_ring_mpdu_drop);
3336 	DP_PRINT_STATS("ofld_local_data_ind_cnt = %u",
3337 		       dp_stats_buf->ofld_local_data_ind_cnt);
3338 	DP_PRINT_STATS("ofld_local_data_buf_recycle_cnt = %u",
3339 		       dp_stats_buf->ofld_local_data_buf_recycle_cnt);
3340 	DP_PRINT_STATS("drx_local_data_ind_cnt = %u",
3341 		       dp_stats_buf->drx_local_data_ind_cnt);
3342 	DP_PRINT_STATS("drx_local_data_buf_recycle_cnt = %u",
3343 		       dp_stats_buf->drx_local_data_buf_recycle_cnt);
3344 	DP_PRINT_STATS("local_nondata_ind_cnt = %u",
3345 		       dp_stats_buf->local_nondata_ind_cnt);
3346 	DP_PRINT_STATS("local_nondata_buf_recycle_cnt = %u",
3347 		       dp_stats_buf->local_nondata_buf_recycle_cnt);
3348 	DP_PRINT_STATS("fw_status_buf_ring_refill_cnt = %u",
3349 		       dp_stats_buf->fw_status_buf_ring_refill_cnt);
3350 	DP_PRINT_STATS("fw_status_buf_ring_empty_cnt = %u",
3351 		       dp_stats_buf->fw_status_buf_ring_empty_cnt);
3352 	DP_PRINT_STATS("fw_pkt_buf_ring_refill_cnt = %u",
3353 		       dp_stats_buf->fw_pkt_buf_ring_refill_cnt);
3354 	DP_PRINT_STATS("fw_pkt_buf_ring_empty_cnt = %u",
3355 		       dp_stats_buf->fw_pkt_buf_ring_empty_cnt);
3356 	DP_PRINT_STATS("fw_link_buf_ring_refill_cnt = %u",
3357 		       dp_stats_buf->fw_link_buf_ring_refill_cnt);
3358 	DP_PRINT_STATS("fw_link_buf_ring_empty_cnt = %u",
3359 		       dp_stats_buf->fw_link_buf_ring_empty_cnt);
3360 	DP_PRINT_STATS("host_pkt_buf_ring_refill_cnt = %u",
3361 		       dp_stats_buf->host_pkt_buf_ring_refill_cnt);
3362 	DP_PRINT_STATS("host_pkt_buf_ring_empty_cnt = %u",
3363 		       dp_stats_buf->host_pkt_buf_ring_empty_cnt);
3364 	DP_PRINT_STATS("mon_pkt_buf_ring_refill_cnt = %u",
3365 		       dp_stats_buf->mon_pkt_buf_ring_refill_cnt);
3366 	DP_PRINT_STATS("mon_pkt_buf_ring_empty_cnt = %u",
3367 		       dp_stats_buf->mon_pkt_buf_ring_empty_cnt);
3368 	DP_PRINT_STATS("mon_status_buf_ring_refill_cnt = %u",
3369 		       dp_stats_buf->mon_status_buf_ring_refill_cnt);
3370 	DP_PRINT_STATS("mon_status_buf_ring_empty_cnt = %u",
3371 		       dp_stats_buf->mon_status_buf_ring_empty_cnt);
3372 	DP_PRINT_STATS("mon_desc_buf_ring_refill_cnt = %u",
3373 		       dp_stats_buf->mon_desc_buf_ring_refill_cnt);
3374 	DP_PRINT_STATS("mon_desc_buf_ring_empty_cnt = %u",
3375 		       dp_stats_buf->mon_desc_buf_ring_empty_cnt);
3376 	DP_PRINT_STATS("mon_dest_ring_update_cnt = %u",
3377 		       dp_stats_buf->mon_dest_ring_update_cnt);
3378 	DP_PRINT_STATS("mon_dest_ring_full_cnt = %u",
3379 		       dp_stats_buf->mon_dest_ring_full_cnt);
3380 	DP_PRINT_STATS("rx_suspend_cnt = %u",
3381 		       dp_stats_buf->rx_suspend_cnt);
3382 	DP_PRINT_STATS("rx_suspend_fail_cnt = %u",
3383 		       dp_stats_buf->rx_suspend_fail_cnt);
3384 	DP_PRINT_STATS("rx_resume_cnt = %u",
3385 		       dp_stats_buf->rx_resume_cnt);
3386 	DP_PRINT_STATS("rx_resume_fail_cnt = %u",
3387 		       dp_stats_buf->rx_resume_fail_cnt);
3388 	DP_PRINT_STATS("rx_ring_switch_cnt = %u",
3389 		       dp_stats_buf->rx_ring_switch_cnt);
3390 	DP_PRINT_STATS("rx_ring_restore_cnt = %u",
3391 		       dp_stats_buf->rx_ring_restore_cnt);
3392 	DP_PRINT_STATS("rx_flush_cnt = %u\n",
3393 		       dp_stats_buf->rx_flush_cnt);
3394 }
3395 
3396 /*
3397  * dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v: display
3398  *				htt_rx_pdev_fw_ring_mpdu_err_tlv_v
3399  * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_ring_mpdu_err_tlv_v
3400  *
3401  * return:void
3402  */
3403 static inline void dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v(uint32_t *tag_buf)
3404 {
3405 	htt_rx_pdev_fw_ring_mpdu_err_tlv_v *dp_stats_buf =
3406 		(htt_rx_pdev_fw_ring_mpdu_err_tlv_v *)tag_buf;
3407 	uint8_t i;
3408 	uint16_t index = 0;
3409 	char *fw_ring_mpdu_err = qdf_mem_malloc(DP_MAX_STRING_LEN);
3410 
3411 	if (!fw_ring_mpdu_err) {
3412 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
3413 			  FL("Output buffer not allocated"));
3414 		return;
3415 	}
3416 
3417 	DP_PRINT_STATS("HTT_RX_PDEV_FW_RING_MPDU_ERR_TLV_V:");
3418 	for (i = 0; i <  DP_HTT_FW_RING_MPDU_ERR_LEN; i++) {
3419 		index += qdf_snprint(&fw_ring_mpdu_err[index],
3420 				DP_MAX_STRING_LEN - index,
3421 				" %u:%u,", i,
3422 				dp_stats_buf->fw_ring_mpdu_err[i]);
3423 	}
3424 	DP_PRINT_STATS("fw_ring_mpdu_err = %s\n", fw_ring_mpdu_err);
3425 	qdf_mem_free(fw_ring_mpdu_err);
3426 }
3427 
3428 /*
3429  * dp_print_rx_pdev_fw_mpdu_drop_tlv_v: display htt_rx_pdev_fw_mpdu_drop_tlv_v
3430  * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_mpdu_drop_tlv_v
3431  *
3432  * return:void
3433  */
3434 static inline void dp_print_rx_pdev_fw_mpdu_drop_tlv_v(uint32_t *tag_buf)
3435 {
3436 	htt_rx_pdev_fw_mpdu_drop_tlv_v *dp_stats_buf =
3437 		(htt_rx_pdev_fw_mpdu_drop_tlv_v *)tag_buf;
3438 	uint8_t i;
3439 	uint16_t index = 0;
3440 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
3441 	char *fw_mpdu_drop = qdf_mem_malloc(DP_MAX_STRING_LEN);
3442 
3443 	if (!fw_mpdu_drop) {
3444 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
3445 			  FL("Output buffer not allocated"));
3446 		return;
3447 	}
3448 
3449 	tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_STATS_FW_DROP_REASON_MAX);
3450 
3451 	DP_PRINT_STATS("HTT_RX_PDEV_FW_MPDU_DROP_TLV_V:");
3452 	for (i = 0; i <  tag_len; i++) {
3453 		index += qdf_snprint(&fw_mpdu_drop[index],
3454 				DP_MAX_STRING_LEN - index,
3455 				" %u:%u,", i, dp_stats_buf->fw_mpdu_drop[i]);
3456 	}
3457 	DP_PRINT_STATS("fw_mpdu_drop = %s\n", fw_mpdu_drop);
3458 	qdf_mem_free(fw_mpdu_drop);
3459 }
3460 
3461 /*
3462  * dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv() - Accounts for rxdma error
3463  * packets
3464  *
3465  * tag_buf - Buffer
3466  * Return - NULL
3467  */
3468 static inline void dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv(uint32_t *tag_buf)
3469 {
3470 	htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v *dp_stats_buf =
3471 		(htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v *)tag_buf;
3472 
3473 	uint8_t i;
3474 	uint16_t index = 0;
3475 	char rxdma_err_cnt[DP_MAX_STRING_LEN];
3476 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
3477 
3478 	tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_RXDMA_MAX_ERR_CODE);
3479 
3480 	DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_RXDMA_ERR_TLV_V");
3481 
3482 	for (i = 0; i <  tag_len; i++) {
3483 		index += snprintf(&rxdma_err_cnt[index],
3484 				DP_MAX_STRING_LEN - index,
3485 				" %u:%u,", i,
3486 				dp_stats_buf->rxdma_err[i]);
3487 	}
3488 
3489 	DP_PRINT_STATS("rxdma_err = %s\n", rxdma_err_cnt);
3490 }
3491 
3492 /*
3493  * dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv() - Accounts for reo error
3494  * packets
3495  *
3496  * tag_buf - Buffer
3497  * Return - NULL
3498  */
3499 static inline void dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv(uint32_t *tag_buf)
3500 {
3501 	htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v *dp_stats_buf =
3502 		(htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v *)tag_buf;
3503 
3504 	uint8_t i;
3505 	uint16_t index = 0;
3506 	char reo_err_cnt[DP_MAX_STRING_LEN];
3507 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
3508 
3509 	tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_REO_MAX_ERR_CODE);
3510 
3511 	DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_REO_ERR_TLV_V");
3512 
3513 	for (i = 0; i <  tag_len; i++) {
3514 		index += snprintf(&reo_err_cnt[index],
3515 				DP_MAX_STRING_LEN - index,
3516 				" %u:%u,", i,
3517 				dp_stats_buf->reo_err[i]);
3518 	}
3519 
3520 	DP_PRINT_STATS("reo_err = %s\n", reo_err_cnt);
3521 }
3522 
3523 /*
3524  * dp_print_rx_reo_debug_stats_tlv() - REO Statistics
3525  *
3526  * tag_buf - Buffer
3527  * Return - NULL
3528  */
3529 static inline void dp_print_rx_reo_debug_stats_tlv(uint32_t *tag_buf)
3530 {
3531 	htt_rx_reo_resource_stats_tlv_v *dp_stats_buf =
3532 			(htt_rx_reo_resource_stats_tlv_v *)tag_buf;
3533 
3534 	DP_PRINT_STATS("HTT_RX_REO_RESOURCE_STATS_TLV");
3535 
3536 	DP_PRINT_STATS("sample_id: %u ",
3537 		       dp_stats_buf->sample_id);
3538 	DP_PRINT_STATS("total_max: %u ",
3539 		       dp_stats_buf->total_max);
3540 	DP_PRINT_STATS("total_avg: %u ",
3541 		       dp_stats_buf->total_avg);
3542 	DP_PRINT_STATS("total_sample: %u ",
3543 		       dp_stats_buf->total_sample);
3544 	DP_PRINT_STATS("non_zeros_avg: %u ",
3545 		       dp_stats_buf->non_zeros_avg);
3546 	DP_PRINT_STATS("non_zeros_sample: %u ",
3547 		       dp_stats_buf->non_zeros_sample);
3548 	DP_PRINT_STATS("last_non_zeros_max: %u ",
3549 		       dp_stats_buf->last_non_zeros_max);
3550 	DP_PRINT_STATS("last_non_zeros_min: %u ",
3551 		       dp_stats_buf->last_non_zeros_min);
3552 	DP_PRINT_STATS("last_non_zeros_avg: %u ",
3553 		       dp_stats_buf->last_non_zeros_avg);
3554 	DP_PRINT_STATS("last_non_zeros_sample: %u\n ",
3555 		       dp_stats_buf->last_non_zeros_sample);
3556 }
3557 
3558 /*
3559  * dp_print_rx_pdev_fw_stats_phy_err_tlv() - Accounts for phy errors
3560  *
3561  * tag_buf - Buffer
3562  * Return - NULL
3563  */
3564 static inline void dp_print_rx_pdev_fw_stats_phy_err_tlv(uint32_t *tag_buf)
3565 {
3566 	htt_rx_pdev_fw_stats_phy_err_tlv *dp_stats_buf =
3567 		(htt_rx_pdev_fw_stats_phy_err_tlv *)tag_buf;
3568 
3569 	uint8_t i = 0;
3570 	uint16_t index = 0;
3571 	char phy_errs[DP_MAX_STRING_LEN];
3572 
3573 	DP_PRINT_STATS("HTT_RX_PDEV_FW_STATS_PHY_ERR_TLV");
3574 
3575 	DP_PRINT_STATS("mac_id_word: %u",
3576 		       dp_stats_buf->mac_id__word);
3577 	DP_PRINT_STATS("total_phy_err_cnt: %u",
3578 		       dp_stats_buf->total_phy_err_cnt);
3579 
3580 	for (i = 0; i < HTT_STATS_PHY_ERR_MAX; i++) {
3581 		index += snprintf(&phy_errs[index],
3582 				DP_MAX_STRING_LEN - index,
3583 				" %u:%u,", i, dp_stats_buf->phy_err[i]);
3584 	}
3585 
3586 	DP_PRINT_STATS("phy_errs: %s\n",  phy_errs);
3587 }
3588 
3589 /*
3590  * dp_htt_stats_print_tag: function to select the tag type and
3591  * print the corresponding tag structure
3592  * @tag_type: tag type that is to be printed
3593  * @tag_buf: pointer to the tag structure
3594  *
3595  * return: void
3596  */
3597 void dp_htt_stats_print_tag(uint8_t tag_type, uint32_t *tag_buf)
3598 {
3599 	switch (tag_type) {
3600 	case HTT_STATS_TX_PDEV_CMN_TAG:
3601 		dp_print_tx_pdev_stats_cmn_tlv(tag_buf);
3602 		break;
3603 	case HTT_STATS_TX_PDEV_UNDERRUN_TAG:
3604 		dp_print_tx_pdev_stats_urrn_tlv_v(tag_buf);
3605 		break;
3606 	case HTT_STATS_TX_PDEV_SIFS_TAG:
3607 		dp_print_tx_pdev_stats_sifs_tlv_v(tag_buf);
3608 		break;
3609 	case HTT_STATS_TX_PDEV_FLUSH_TAG:
3610 		dp_print_tx_pdev_stats_flush_tlv_v(tag_buf);
3611 		break;
3612 
3613 	case HTT_STATS_TX_PDEV_PHY_ERR_TAG:
3614 		dp_print_tx_pdev_stats_phy_err_tlv_v(tag_buf);
3615 		break;
3616 
3617 	case HTT_STATS_STRING_TAG:
3618 		dp_print_stats_string_tlv(tag_buf);
3619 		break;
3620 
3621 	case HTT_STATS_TX_HWQ_CMN_TAG:
3622 		dp_print_tx_hwq_stats_cmn_tlv(tag_buf);
3623 		break;
3624 
3625 	case HTT_STATS_TX_HWQ_DIFS_LATENCY_TAG:
3626 		dp_print_tx_hwq_difs_latency_stats_tlv_v(tag_buf);
3627 		break;
3628 
3629 	case HTT_STATS_TX_HWQ_CMD_RESULT_TAG:
3630 		dp_print_tx_hwq_cmd_result_stats_tlv_v(tag_buf);
3631 		break;
3632 
3633 	case HTT_STATS_TX_HWQ_CMD_STALL_TAG:
3634 		dp_print_tx_hwq_cmd_stall_stats_tlv_v(tag_buf);
3635 		break;
3636 
3637 	case HTT_STATS_TX_HWQ_FES_STATUS_TAG:
3638 		dp_print_tx_hwq_fes_result_stats_tlv_v(tag_buf);
3639 		break;
3640 
3641 	case HTT_STATS_TX_TQM_GEN_MPDU_TAG:
3642 		dp_print_tx_tqm_gen_mpdu_stats_tlv_v(tag_buf);
3643 		break;
3644 
3645 	case HTT_STATS_TX_TQM_LIST_MPDU_TAG:
3646 		dp_print_tx_tqm_list_mpdu_stats_tlv_v(tag_buf);
3647 		break;
3648 
3649 	case HTT_STATS_TX_TQM_LIST_MPDU_CNT_TAG:
3650 		dp_print_tx_tqm_list_mpdu_cnt_tlv_v(tag_buf);
3651 		break;
3652 
3653 	case HTT_STATS_TX_TQM_CMN_TAG:
3654 		dp_print_tx_tqm_cmn_stats_tlv(tag_buf);
3655 		break;
3656 
3657 	case HTT_STATS_TX_TQM_PDEV_TAG:
3658 		dp_print_tx_tqm_pdev_stats_tlv_v(tag_buf);
3659 		break;
3660 
3661 	case HTT_STATS_TX_TQM_CMDQ_STATUS_TAG:
3662 		dp_print_tx_tqm_cmdq_status_tlv(tag_buf);
3663 		break;
3664 
3665 	case HTT_STATS_TX_DE_EAPOL_PACKETS_TAG:
3666 		dp_print_tx_de_eapol_packets_stats_tlv(tag_buf);
3667 		break;
3668 
3669 	case HTT_STATS_TX_DE_CLASSIFY_FAILED_TAG:
3670 		dp_print_tx_de_classify_failed_stats_tlv(tag_buf);
3671 		break;
3672 
3673 	case HTT_STATS_TX_DE_CLASSIFY_STATS_TAG:
3674 		dp_print_tx_de_classify_stats_tlv(tag_buf);
3675 		break;
3676 
3677 	case HTT_STATS_TX_DE_CLASSIFY_STATUS_TAG:
3678 		dp_print_tx_de_classify_status_stats_tlv(tag_buf);
3679 		break;
3680 
3681 	case HTT_STATS_TX_DE_ENQUEUE_PACKETS_TAG:
3682 		dp_print_tx_de_enqueue_packets_stats_tlv(tag_buf);
3683 		break;
3684 
3685 	case HTT_STATS_TX_DE_ENQUEUE_DISCARD_TAG:
3686 		dp_print_tx_de_enqueue_discard_stats_tlv(tag_buf);
3687 		break;
3688 
3689 	case HTT_STATS_TX_DE_CMN_TAG:
3690 		dp_print_tx_de_cmn_stats_tlv(tag_buf);
3691 		break;
3692 
3693 	case HTT_STATS_RING_IF_TAG:
3694 		dp_print_ring_if_stats_tlv(tag_buf);
3695 		break;
3696 
3697 	case HTT_STATS_TX_PDEV_MU_MIMO_STATS_TAG:
3698 		dp_print_tx_pdev_mu_mimo_sch_stats_tlv(tag_buf);
3699 		break;
3700 
3701 	case HTT_STATS_SFM_CMN_TAG:
3702 		dp_print_sfm_cmn_tlv(tag_buf);
3703 		break;
3704 
3705 	case HTT_STATS_SRING_STATS_TAG:
3706 		dp_print_sring_stats_tlv(tag_buf);
3707 		break;
3708 
3709 	case HTT_STATS_RX_PDEV_FW_STATS_TAG:
3710 		dp_print_rx_pdev_fw_stats_tlv(tag_buf);
3711 		break;
3712 
3713 	case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG:
3714 		dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v(tag_buf);
3715 		break;
3716 
3717 	case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG:
3718 		dp_print_rx_pdev_fw_mpdu_drop_tlv_v(tag_buf);
3719 		break;
3720 
3721 	case HTT_STATS_RX_SOC_FW_STATS_TAG:
3722 		dp_print_rx_soc_fw_stats_tlv(tag_buf);
3723 		break;
3724 
3725 	case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG:
3726 		dp_print_rx_soc_fw_refill_ring_empty_tlv_v(tag_buf);
3727 		break;
3728 
3729 	case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG:
3730 		dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v(
3731 				tag_buf);
3732 		break;
3733 
3734 	case HTT_STATS_TX_PDEV_RATE_STATS_TAG:
3735 		dp_print_tx_pdev_rate_stats_tlv(tag_buf);
3736 		break;
3737 
3738 	case HTT_STATS_RX_PDEV_RATE_STATS_TAG:
3739 		dp_print_rx_pdev_rate_stats_tlv(tag_buf);
3740 		break;
3741 
3742 	case HTT_STATS_TX_PDEV_SCHEDULER_TXQ_STATS_TAG:
3743 		dp_print_tx_pdev_stats_sched_per_txq_tlv(tag_buf);
3744 		break;
3745 
3746 	case HTT_STATS_TX_SCHED_CMN_TAG:
3747 		dp_print_stats_tx_sched_cmn_tlv(tag_buf);
3748 		break;
3749 
3750 	case HTT_STATS_TX_PDEV_MPDU_STATS_TAG:
3751 		dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv(tag_buf);
3752 		break;
3753 
3754 	case HTT_STATS_SCHED_TXQ_CMD_POSTED_TAG:
3755 		dp_print_sched_txq_cmd_posted_tlv_v(tag_buf);
3756 		break;
3757 
3758 	case HTT_STATS_RING_IF_CMN_TAG:
3759 		dp_print_ring_if_cmn_tlv(tag_buf);
3760 		break;
3761 
3762 	case HTT_STATS_SFM_CLIENT_USER_TAG:
3763 		dp_print_sfm_client_user_tlv_v(tag_buf);
3764 		break;
3765 
3766 	case HTT_STATS_SFM_CLIENT_TAG:
3767 		dp_print_sfm_client_tlv(tag_buf);
3768 		break;
3769 
3770 	case HTT_STATS_TX_TQM_ERROR_STATS_TAG:
3771 		dp_print_tx_tqm_error_stats_tlv(tag_buf);
3772 		break;
3773 
3774 	case HTT_STATS_SCHED_TXQ_CMD_REAPED_TAG:
3775 		dp_print_sched_txq_cmd_reaped_tlv_v(tag_buf);
3776 		break;
3777 
3778 	case HTT_STATS_SRING_CMN_TAG:
3779 		dp_print_sring_cmn_tlv(tag_buf);
3780 		break;
3781 
3782 	case HTT_STATS_TX_SELFGEN_AC_ERR_STATS_TAG:
3783 		dp_print_tx_selfgen_ac_err_stats_tlv(tag_buf);
3784 		break;
3785 
3786 	case HTT_STATS_TX_SELFGEN_CMN_STATS_TAG:
3787 		dp_print_tx_selfgen_cmn_stats_tlv(tag_buf);
3788 		break;
3789 
3790 	case HTT_STATS_TX_SELFGEN_AC_STATS_TAG:
3791 		dp_print_tx_selfgen_ac_stats_tlv(tag_buf);
3792 		break;
3793 
3794 	case HTT_STATS_TX_SELFGEN_AX_STATS_TAG:
3795 		dp_print_tx_selfgen_ax_stats_tlv(tag_buf);
3796 		break;
3797 
3798 	case HTT_STATS_TX_SELFGEN_AX_ERR_STATS_TAG:
3799 		dp_print_tx_selfgen_ax_err_stats_tlv(tag_buf);
3800 		break;
3801 
3802 	case HTT_STATS_TX_HWQ_MUMIMO_SCH_STATS_TAG:
3803 		dp_print_tx_hwq_mu_mimo_sch_stats_tlv(tag_buf);
3804 		break;
3805 
3806 	case HTT_STATS_TX_HWQ_MUMIMO_MPDU_STATS_TAG:
3807 		dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv(tag_buf);
3808 		break;
3809 
3810 	case HTT_STATS_TX_HWQ_MUMIMO_CMN_STATS_TAG:
3811 		dp_print_tx_hwq_mu_mimo_cmn_stats_tlv(tag_buf);
3812 		break;
3813 
3814 	case HTT_STATS_HW_INTR_MISC_TAG:
3815 		dp_print_hw_stats_intr_misc_tlv(tag_buf);
3816 		break;
3817 
3818 	case HTT_STATS_HW_WD_TIMEOUT_TAG:
3819 		dp_print_hw_stats_wd_timeout_tlv(tag_buf);
3820 		break;
3821 
3822 	case HTT_STATS_HW_PDEV_ERRS_TAG:
3823 		dp_print_hw_stats_pdev_errs_tlv(tag_buf);
3824 		break;
3825 
3826 	case HTT_STATS_COUNTER_NAME_TAG:
3827 		dp_print_counter_tlv(tag_buf);
3828 		break;
3829 
3830 	case HTT_STATS_TX_TID_DETAILS_TAG:
3831 		dp_print_tx_tid_stats_tlv(tag_buf);
3832 		break;
3833 
3834 #ifdef CONFIG_WIN
3835 	case HTT_STATS_TX_TID_DETAILS_V1_TAG:
3836 		dp_print_tx_tid_stats_v1_tlv(tag_buf);
3837 		break;
3838 #endif
3839 
3840 	case HTT_STATS_RX_TID_DETAILS_TAG:
3841 		dp_print_rx_tid_stats_tlv(tag_buf);
3842 		break;
3843 
3844 	case HTT_STATS_PEER_STATS_CMN_TAG:
3845 		dp_print_peer_stats_cmn_tlv(tag_buf);
3846 		break;
3847 
3848 	case HTT_STATS_PEER_DETAILS_TAG:
3849 		dp_print_peer_details_tlv(tag_buf);
3850 		break;
3851 
3852 	case HTT_STATS_PEER_MSDU_FLOWQ_TAG:
3853 		dp_print_msdu_flow_stats_tlv(tag_buf);
3854 		break;
3855 
3856 	case HTT_STATS_PEER_TX_RATE_STATS_TAG:
3857 		dp_print_tx_peer_rate_stats_tlv(tag_buf);
3858 		break;
3859 
3860 	case HTT_STATS_PEER_RX_RATE_STATS_TAG:
3861 		dp_print_rx_peer_rate_stats_tlv(tag_buf);
3862 		break;
3863 
3864 	case HTT_STATS_TX_DE_COMPL_STATS_TAG:
3865 		dp_print_tx_de_compl_stats_tlv(tag_buf);
3866 		break;
3867 
3868 	case HTT_STATS_RX_REFILL_RXDMA_ERR_TAG:
3869 		dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv(tag_buf);
3870 		break;
3871 
3872 	case HTT_STATS_RX_REFILL_REO_ERR_TAG:
3873 		dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv(tag_buf);
3874 		break;
3875 
3876 	case HTT_STATS_RX_REO_RESOURCE_STATS_TAG:
3877 		dp_print_rx_reo_debug_stats_tlv(tag_buf);
3878 		break;
3879 
3880 	case HTT_STATS_RX_PDEV_FW_STATS_PHY_ERR_TAG:
3881 		dp_print_rx_pdev_fw_stats_phy_err_tlv(tag_buf);
3882 		break;
3883 
3884 	default:
3885 		break;
3886 	}
3887 }
3888 
3889 /*
3890  * dp_htt_stats_copy_tag: function to select the tag type and
3891  * copy the corresponding tag structure
3892  * @pdev: DP_PDEV handle
3893  * @tag_type: tag type that is to be printed
3894  * @tag_buf: pointer to the tag structure
3895  *
3896  * return: void
3897  */
3898 void dp_htt_stats_copy_tag(struct dp_pdev *pdev, uint8_t tag_type, uint32_t *tag_buf)
3899 {
3900 	void *dest_ptr = NULL;
3901 	uint32_t size = 0;
3902 
3903 	switch (tag_type) {
3904 	case HTT_STATS_TX_PDEV_CMN_TAG:
3905 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.cmn_tlv;
3906 		size = sizeof(htt_tx_pdev_stats_cmn_tlv);
3907 		break;
3908 	case HTT_STATS_TX_PDEV_UNDERRUN_TAG:
3909 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.underrun_tlv;
3910 		size = sizeof(htt_tx_pdev_stats_urrn_tlv_v);
3911 		break;
3912 	case HTT_STATS_TX_PDEV_SIFS_TAG:
3913 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.sifs_tlv;
3914 		size = sizeof(htt_tx_pdev_stats_sifs_tlv_v);
3915 		break;
3916 	case HTT_STATS_TX_PDEV_FLUSH_TAG:
3917 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.flush_tlv;
3918 		size = sizeof(htt_tx_pdev_stats_flush_tlv_v);
3919 		break;
3920 	case HTT_STATS_TX_PDEV_PHY_ERR_TAG:
3921 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.phy_err_tlv;
3922 		size = sizeof(htt_tx_pdev_stats_phy_err_tlv_v);
3923 		break;
3924 	case HTT_STATS_RX_PDEV_FW_STATS_TAG:
3925 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_stats_tlv;
3926 		size = sizeof(htt_rx_pdev_fw_stats_tlv);
3927 		break;
3928 	case HTT_STATS_RX_SOC_FW_STATS_TAG:
3929 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_tlv;
3930 		size = sizeof(htt_rx_soc_fw_stats_tlv);
3931 		break;
3932 	case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG:
3933 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_refill_ring_empty_tlv;
3934 		size = sizeof(htt_rx_soc_fw_refill_ring_empty_tlv_v);
3935 		break;
3936 	case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG:
3937 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_refill_ring_num_refill_tlv;
3938 		size = sizeof(htt_rx_soc_fw_refill_ring_num_refill_tlv_v);
3939 		break;
3940 	case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG:
3941 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_ring_mpdu_err_tlv;
3942 		size = sizeof(htt_rx_pdev_fw_ring_mpdu_err_tlv_v);
3943 		break;
3944 	case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG:
3945 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_ring_mpdu_drop;
3946 		size = sizeof(htt_rx_pdev_fw_mpdu_drop_tlv_v);
3947 		break;
3948 	default:
3949 		break;
3950 	}
3951 
3952 	if (dest_ptr)
3953 		qdf_mem_copy(dest_ptr, tag_buf, size);
3954 }
3955 QDF_STATUS dp_peer_stats_notify(struct dp_peer *peer)
3956 {
3957 	struct dp_pdev *dp_pdev;
3958 	struct cdp_interface_peer_stats peer_stats_intf;
3959 	struct cdp_peer_stats *peer_stats = &peer->stats;
3960 
3961 	if (!peer->vdev)
3962 		return QDF_STATUS_E_FAULT;
3963 
3964 	dp_pdev = peer->vdev->pdev;
3965 	qdf_mem_zero(&peer_stats_intf, sizeof(peer_stats_intf));
3966 	if (peer_stats->rx.last_rssi != peer_stats->rx.rssi)
3967 		peer_stats_intf.rssi_changed = true;
3968 
3969 	if ((peer_stats->rx.rssi && peer_stats_intf.rssi_changed) ||
3970 	    (peer_stats->tx.tx_rate &&
3971 	     peer_stats->tx.tx_rate != peer_stats->tx.last_tx_rate)) {
3972 		peer_stats_intf.peer_hdl = peer->ctrl_peer;
3973 		peer_stats_intf.last_peer_tx_rate = peer_stats->tx.last_tx_rate;
3974 		peer_stats_intf.peer_tx_rate = peer_stats->tx.tx_rate;
3975 		peer_stats_intf.peer_rssi = peer_stats->rx.rssi;
3976 		peer_stats_intf.tx_packet_count = peer_stats->tx.ucast.num;
3977 		peer_stats_intf.rx_packet_count = peer_stats->rx.to_stack.num;
3978 		peer_stats_intf.tx_byte_count = peer_stats->tx.tx_success.bytes;
3979 		peer_stats_intf.rx_byte_count = peer_stats->rx.to_stack.bytes;
3980 		peer_stats_intf.per = peer_stats->tx.last_per;
3981 		peer_stats_intf.ack_rssi = peer_stats->tx.last_ack_rssi;
3982 		dp_wdi_event_handler(WDI_EVENT_PEER_STATS, dp_pdev->soc,
3983 				     (void *)&peer_stats_intf, 0,
3984 				     WDI_NO_VAL, dp_pdev->pdev_id);
3985 	}
3986 
3987 	return QDF_STATUS_SUCCESS;
3988 }
3989 
3990 #ifdef CONFIG_WIN
3991 /**
3992  * dp_vow_str_fw_to_hw_delay() - Return string for a delay
3993  * @index: Index of delay
3994  *
3995  * Return: char const pointer
3996  */
3997 static inline const char *dp_vow_str_fw_to_hw_delay(uint8_t index)
3998 {
3999 	if (index > CDP_DELAY_BUCKET_MAX) {
4000 		return "Invalid index";
4001 	}
4002 	return fw_to_hw_delay_bucket[index];
4003 }
4004 
4005 /**
4006  * dp_vow_str_sw_enq_delay() - Return string for a delay
4007  * @index: Index of delay
4008  *
4009  * Return: char const pointer
4010  */
4011 static inline const char *dp_vow_str_sw_enq_delay(uint8_t index)
4012 {
4013 	if (index > CDP_DELAY_BUCKET_MAX) {
4014 		return "Invalid index";
4015 	}
4016 	return sw_enq_delay_bucket[index];
4017 }
4018 
4019 /**
4020  * dp_vow_str_intfrm_delay() - Return string for a delay
4021  * @index: Index of delay
4022  *
4023  * Return: char const pointer
4024  */
4025 static inline const char *dp_vow_str_intfrm_delay(uint8_t index)
4026 {
4027 	if (index > CDP_DELAY_BUCKET_MAX) {
4028 		return "Invalid index";
4029 	}
4030 	return intfrm_delay_bucket[index];
4031 }
4032 
4033 void dp_pdev_print_tid_stats(struct dp_pdev *pdev)
4034 {
4035 	struct cdp_tid_stats *tid_stats;
4036 	struct cdp_tid_tx_stats *txstats;
4037 	struct cdp_tid_rx_stats *rxstats;
4038 	struct dp_soc *soc = pdev->soc;
4039 	uint8_t tid;
4040 
4041 	if (!soc)
4042 		return;
4043 	tid = 0;
4044 	rxstats = NULL;
4045 	txstats = NULL;
4046 	tid_stats = &pdev->stats.tid_stats;
4047 
4048 	DP_PRINT_STATS("Packets received in hardstart: %llu ",
4049 		       tid_stats->ingress_stack);
4050 	DP_PRINT_STATS("Packets dropped in osif layer: %llu ",
4051 		       tid_stats->osif_drop);
4052 	DP_PRINT_STATS("Per TID Video Stats:\n");
4053 
4054 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
4055 		txstats = &tid_stats->tid_tx_stats[tid];
4056 		rxstats = &tid_stats->tid_rx_stats[tid];
4057 		DP_PRINT_STATS("----TID: %d----", tid);
4058 		DP_PRINT_STATS("Tx Success Count: %llu", txstats->success_cnt);
4059 		DP_PRINT_STATS("Tx Complete Count: %llu",
4060 			       txstats->complete_cnt);
4061 		DP_PRINT_STATS("Tx Firmware Drop Count: %llu",
4062 			       txstats->comp_fail_cnt);
4063 		DP_PRINT_STATS("Tx Hardware Drop Count: %llu",
4064 			       txstats->swdrop_cnt[TX_HW_ENQUEUE]);
4065 		DP_PRINT_STATS("Tx Software Drop Count: %llu",
4066 			       txstats->swdrop_cnt[TX_SW_ENQUEUE]);
4067 		DP_PRINT_STATS("Tx Descriptor Error Count: %llu",
4068 			       txstats->swdrop_cnt[TX_DESC_ERR]);
4069 		DP_PRINT_STATS("Tx HAL Ring Error Count: %llu",
4070 			       txstats->swdrop_cnt[TX_HAL_RING_ACCESS_ERR]);
4071 		DP_PRINT_STATS("Tx Dma Map Error Count: %llu",
4072 			       txstats->swdrop_cnt[TX_DMA_MAP_ERR]);
4073 		DP_PRINT_STATS("Rx Delievered Count: %llu",
4074 			       rxstats->delivered_to_stack);
4075 		DP_PRINT_STATS("Rx Software Enqueue Drop Count: %llu",
4076 			       rxstats->fail_cnt[ENQUEUE_DROP]);
4077 		DP_PRINT_STATS("Rx Intrabss Drop Count: %llu",
4078 			       rxstats->fail_cnt[INTRABSS_DROP]);
4079 		DP_PRINT_STATS("Rx Msdu Done Failure Count: %llu",
4080 			       rxstats->fail_cnt[MSDU_DONE_FAILURE]);
4081 		DP_PRINT_STATS("Rx Invalid Peer Count: %llu",
4082 			       rxstats->fail_cnt[INVALID_PEER_VDEV]);
4083 		DP_PRINT_STATS("Rx Policy Check Drop Count: %llu",
4084 			       rxstats->fail_cnt[POLICY_CHECK_DROP]);
4085 		DP_PRINT_STATS("Rx Mec Drop Count: %llu",
4086 			       rxstats->fail_cnt[MEC_DROP]);
4087 		DP_PRINT_STATS("Rx Nawds Mcast Drop Count: %llu",
4088 			       rxstats->fail_cnt[NAWDS_MCAST_DROP]);
4089 		DP_PRINT_STATS("Rx Mesh Filter Drop Count: %llu",
4090 			       rxstats->fail_cnt[MESH_FILTER_DROP]);
4091 		DP_PRINT_STATS("Rx Intra Bss Deliver Count: %llu",
4092 			       rxstats->intrabss_cnt);
4093 		DP_PRINT_STATS("Rx MSDU Count: %llu", rxstats->msdu_cnt);
4094 		DP_PRINT_STATS("Rx Multicast MSDU Count: %llu",
4095 			       rxstats->mcast_msdu_cnt);
4096 		DP_PRINT_STATS("Rx Broadcast MSDU Count: %llu\n",
4097 			       rxstats->bcast_msdu_cnt);
4098 	}
4099 }
4100 
4101 void dp_pdev_print_delay_stats(struct dp_pdev *pdev)
4102 {
4103 	struct dp_soc *soc = pdev->soc;
4104 	struct cdp_tid_tx_stats *txstats = NULL;
4105 	struct cdp_tid_rx_stats *rxstats;
4106 	uint8_t tid, index;
4107 	uint64_t count = 0;
4108 
4109 	if (!soc)
4110 		return;
4111 
4112 	tid = 0;
4113 	index = 0;
4114 	rxstats = NULL;
4115 
4116 	DP_PRINT_STATS("Per TID Delay Non-Zero Stats:\n");
4117 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
4118 		DP_PRINT_STATS("----TID: %d----", tid);
4119 		txstats = &pdev->stats.tid_stats.tid_tx_stats[tid];
4120 		rxstats = &pdev->stats.tid_stats.tid_rx_stats[tid];
4121 
4122 		DP_PRINT_STATS("Software Enqueue Delay:");
4123 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
4124 			count = txstats->swq_delay.delay_bucket[index];
4125 			if (count) {
4126 				DP_PRINT_STATS("%s:  Packets = %llu",
4127 					       dp_vow_str_sw_enq_delay(index),
4128 					       count);
4129 			}
4130 		}
4131 
4132 		DP_PRINT_STATS("Min = %u", txstats->swq_delay.min_delay);
4133 		DP_PRINT_STATS("Max = %u", txstats->swq_delay.max_delay);
4134 		DP_PRINT_STATS("Avg = %u\n", txstats->swq_delay.avg_delay);
4135 
4136 		DP_PRINT_STATS("Hardware Transmission Delay:");
4137 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
4138 			count = txstats->hwtx_delay.delay_bucket[index];
4139 			if (count) {
4140 				DP_PRINT_STATS("%s:  Packets = %llu",
4141 					       dp_vow_str_fw_to_hw_delay(index),
4142 					       count);
4143 			}
4144 		}
4145 		DP_PRINT_STATS("Min = %u", txstats->hwtx_delay.min_delay);
4146 		DP_PRINT_STATS("Max = %u", txstats->hwtx_delay.max_delay);
4147 		DP_PRINT_STATS("Avg = %u\n", txstats->hwtx_delay.avg_delay);
4148 
4149 		DP_PRINT_STATS("Tx Interframe Delay:");
4150 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
4151 			count = txstats->intfrm_delay.delay_bucket[index];
4152 			if (count) {
4153 				DP_PRINT_STATS("%s:  Packets = %llu",
4154 					       dp_vow_str_intfrm_delay(index),
4155 					       count);
4156 			}
4157 		}
4158 		DP_PRINT_STATS("Min = %u", txstats->intfrm_delay.min_delay);
4159 		DP_PRINT_STATS("Max = %u", txstats->intfrm_delay.max_delay);
4160 		DP_PRINT_STATS("Avg = %u\n", txstats->intfrm_delay.avg_delay);
4161 
4162 		DP_PRINT_STATS("Rx Interframe Delay:");
4163 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
4164 			count = rxstats->intfrm_delay.delay_bucket[index];
4165 			if (count) {
4166 				DP_PRINT_STATS("%s:  Packets = %llu",
4167 					       dp_vow_str_intfrm_delay(index),
4168 					       count);
4169 			}
4170 		}
4171 		DP_PRINT_STATS("Min = %u", rxstats->intfrm_delay.min_delay);
4172 		DP_PRINT_STATS("Max = %u", rxstats->intfrm_delay.max_delay);
4173 		DP_PRINT_STATS("Avg = %u\n", rxstats->intfrm_delay.avg_delay);
4174 
4175 		DP_PRINT_STATS("Rx Reap to Stack Delay:");
4176 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
4177 			count = rxstats->to_stack_delay.delay_bucket[index];
4178 			if (count) {
4179 				DP_PRINT_STATS("%s:  Packets = %llu",
4180 					       dp_vow_str_intfrm_delay(index),
4181 					       count);
4182 			}
4183 		}
4184 
4185 		DP_PRINT_STATS("Min = %u", rxstats->to_stack_delay.min_delay);
4186 		DP_PRINT_STATS("Max = %u", rxstats->to_stack_delay.max_delay);
4187 		DP_PRINT_STATS("Avg = %u\n", rxstats->to_stack_delay.avg_delay);
4188 	}
4189 }
4190 #endif
4191 
4192 void dp_print_soc_cfg_params(struct dp_soc *soc)
4193 {
4194 	struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx;
4195 	uint8_t index = 0, i = 0;
4196 	char ring_mask[DP_MAX_INT_CONTEXTS_STRING_LENGTH];
4197 	int num_of_int_contexts;
4198 
4199 	if (!soc) {
4200 		dp_err("Context is null");
4201 		return;
4202 	}
4203 
4204 	soc_cfg_ctx = soc->wlan_cfg_ctx;
4205 
4206 	if (!soc_cfg_ctx) {
4207 		dp_err("Context is null");
4208 		return;
4209 	}
4210 
4211 	num_of_int_contexts =
4212 			wlan_cfg_get_num_contexts(soc_cfg_ctx);
4213 
4214 	DP_PRINT_STATS("No. of interrupt contexts: %u",
4215 		       soc_cfg_ctx->num_int_ctxts);
4216 	DP_PRINT_STATS("Max clients: %u",
4217 		       soc_cfg_ctx->max_clients);
4218 	DP_PRINT_STATS("Max alloc size: %u ",
4219 		       soc_cfg_ctx->max_alloc_size);
4220 	DP_PRINT_STATS("Per pdev tx ring: %u ",
4221 		       soc_cfg_ctx->per_pdev_tx_ring);
4222 	DP_PRINT_STATS("Num tcl data rings: %u ",
4223 		       soc_cfg_ctx->num_tcl_data_rings);
4224 	DP_PRINT_STATS("Per pdev rx ring: %u ",
4225 		       soc_cfg_ctx->per_pdev_rx_ring);
4226 	DP_PRINT_STATS("Per pdev lmac ring: %u ",
4227 		       soc_cfg_ctx->per_pdev_lmac_ring);
4228 	DP_PRINT_STATS("Num of reo dest rings: %u ",
4229 		       soc_cfg_ctx->num_reo_dest_rings);
4230 	DP_PRINT_STATS("Num tx desc pool: %u ",
4231 		       soc_cfg_ctx->num_tx_desc_pool);
4232 	DP_PRINT_STATS("Num tx ext desc pool: %u ",
4233 		       soc_cfg_ctx->num_tx_ext_desc_pool);
4234 	DP_PRINT_STATS("Num tx desc: %u ",
4235 		       soc_cfg_ctx->num_tx_desc);
4236 	DP_PRINT_STATS("Num tx ext desc: %u ",
4237 		       soc_cfg_ctx->num_tx_ext_desc);
4238 	DP_PRINT_STATS("Htt packet type: %u ",
4239 		       soc_cfg_ctx->htt_packet_type);
4240 	DP_PRINT_STATS("Max peer_ids: %u ",
4241 		       soc_cfg_ctx->max_peer_id);
4242 	DP_PRINT_STATS("Tx ring size: %u ",
4243 		       soc_cfg_ctx->tx_ring_size);
4244 	DP_PRINT_STATS("Tx comp ring size: %u ",
4245 		       soc_cfg_ctx->tx_comp_ring_size);
4246 	DP_PRINT_STATS("Tx comp ring size nss: %u ",
4247 		       soc_cfg_ctx->tx_comp_ring_size_nss);
4248 	DP_PRINT_STATS("Int batch threshold tx: %u ",
4249 		       soc_cfg_ctx->int_batch_threshold_tx);
4250 	DP_PRINT_STATS("Int timer threshold tx: %u ",
4251 		       soc_cfg_ctx->int_timer_threshold_tx);
4252 	DP_PRINT_STATS("Int batch threshold rx: %u ",
4253 		       soc_cfg_ctx->int_batch_threshold_rx);
4254 	DP_PRINT_STATS("Int timer threshold rx: %u ",
4255 		       soc_cfg_ctx->int_timer_threshold_rx);
4256 	DP_PRINT_STATS("Int batch threshold other: %u ",
4257 		       soc_cfg_ctx->int_batch_threshold_other);
4258 	DP_PRINT_STATS("Int timer threshold other: %u ",
4259 		       soc_cfg_ctx->int_timer_threshold_other);
4260 
4261 	for (i = 0; i < num_of_int_contexts; i++) {
4262 		index += qdf_snprint(&ring_mask[index],
4263 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
4264 				     " %d",
4265 				     soc_cfg_ctx->int_tx_ring_mask[i]);
4266 	}
4267 
4268 	DP_PRINT_STATS("Tx ring mask (0-%d):%s",
4269 		       num_of_int_contexts, ring_mask);
4270 
4271 	index = 0;
4272 	for (i = 0; i < num_of_int_contexts; i++) {
4273 		index += qdf_snprint(&ring_mask[index],
4274 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
4275 				     " %d",
4276 				     soc_cfg_ctx->int_rx_ring_mask[i]);
4277 	}
4278 
4279 	DP_PRINT_STATS("Rx ring mask (0-%d):%s",
4280 		       num_of_int_contexts, ring_mask);
4281 
4282 	index = 0;
4283 	for (i = 0; i < num_of_int_contexts; i++) {
4284 		index += qdf_snprint(&ring_mask[index],
4285 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
4286 				     " %d",
4287 				     soc_cfg_ctx->int_rx_mon_ring_mask[i]);
4288 	}
4289 
4290 	DP_PRINT_STATS("Rx mon ring mask (0-%d):%s",
4291 		       num_of_int_contexts, ring_mask);
4292 
4293 	index = 0;
4294 	for (i = 0; i < num_of_int_contexts; i++) {
4295 		index += qdf_snprint(&ring_mask[index],
4296 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
4297 				     " %d",
4298 				     soc_cfg_ctx->int_rx_err_ring_mask[i]);
4299 	}
4300 
4301 	DP_PRINT_STATS("Rx err ring mask (0-%d):%s",
4302 		       num_of_int_contexts, ring_mask);
4303 
4304 	index = 0;
4305 	for (i = 0; i < num_of_int_contexts; i++) {
4306 		index += qdf_snprint(&ring_mask[index],
4307 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
4308 				     " %d",
4309 				     soc_cfg_ctx->int_rx_wbm_rel_ring_mask[i]);
4310 	}
4311 
4312 	DP_PRINT_STATS("Rx wbm rel ring mask (0-%d):%s",
4313 		       num_of_int_contexts, ring_mask);
4314 
4315 	index = 0;
4316 	for (i = 0; i < num_of_int_contexts; i++) {
4317 		index += qdf_snprint(&ring_mask[index],
4318 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
4319 				     " %d",
4320 				     soc_cfg_ctx->int_reo_status_ring_mask[i]);
4321 	}
4322 
4323 	DP_PRINT_STATS("Reo ring mask (0-%d):%s",
4324 		       num_of_int_contexts, ring_mask);
4325 
4326 	index = 0;
4327 	for (i = 0; i < num_of_int_contexts; i++) {
4328 		index += qdf_snprint(&ring_mask[index],
4329 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
4330 				     " %d",
4331 				     soc_cfg_ctx->int_rxdma2host_ring_mask[i]);
4332 	}
4333 
4334 	DP_PRINT_STATS("Rxdma2host ring mask (0-%d):%s",
4335 		       num_of_int_contexts, ring_mask);
4336 
4337 	index = 0;
4338 	for (i = 0; i < num_of_int_contexts; i++) {
4339 		index += qdf_snprint(&ring_mask[index],
4340 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
4341 				     " %d",
4342 				     soc_cfg_ctx->int_host2rxdma_ring_mask[i]);
4343 	}
4344 
4345 	DP_PRINT_STATS("Host2rxdma ring mask (0-%d):%s",
4346 		       num_of_int_contexts, ring_mask);
4347 
4348 	DP_PRINT_STATS("Rx hash: %u ",
4349 		       soc_cfg_ctx->rx_hash);
4350 	DP_PRINT_STATS("Tso enabled: %u ",
4351 		       soc_cfg_ctx->tso_enabled);
4352 	DP_PRINT_STATS("Lro enabled: %u ",
4353 		       soc_cfg_ctx->lro_enabled);
4354 	DP_PRINT_STATS("Sg enabled: %u ",
4355 		       soc_cfg_ctx->sg_enabled);
4356 	DP_PRINT_STATS("Gro enabled: %u ",
4357 		       soc_cfg_ctx->gro_enabled);
4358 	DP_PRINT_STATS("rawmode enabled: %u ",
4359 		       soc_cfg_ctx->rawmode_enabled);
4360 	DP_PRINT_STATS("peer flow ctrl enabled: %u ",
4361 		       soc_cfg_ctx->peer_flow_ctrl_enabled);
4362 	DP_PRINT_STATS("napi enabled: %u ",
4363 		       soc_cfg_ctx->napi_enabled);
4364 	DP_PRINT_STATS("Tcp Udp checksum offload: %u ",
4365 		       soc_cfg_ctx->tcp_udp_checksumoffload);
4366 	DP_PRINT_STATS("Defrag timeout check: %u ",
4367 		       soc_cfg_ctx->defrag_timeout_check);
4368 	DP_PRINT_STATS("Rx defrag min timeout: %u ",
4369 		       soc_cfg_ctx->rx_defrag_min_timeout);
4370 	DP_PRINT_STATS("WBM release ring: %u ",
4371 		       soc_cfg_ctx->wbm_release_ring);
4372 	DP_PRINT_STATS("TCL CMD ring: %u ",
4373 		       soc_cfg_ctx->tcl_cmd_ring);
4374 	DP_PRINT_STATS("TCL Status ring: %u ",
4375 		       soc_cfg_ctx->tcl_status_ring);
4376 	DP_PRINT_STATS("REO Reinject ring: %u ",
4377 		       soc_cfg_ctx->reo_reinject_ring);
4378 	DP_PRINT_STATS("RX release ring: %u ",
4379 		       soc_cfg_ctx->rx_release_ring);
4380 	DP_PRINT_STATS("REO Exception ring: %u ",
4381 		       soc_cfg_ctx->reo_exception_ring);
4382 	DP_PRINT_STATS("REO CMD ring: %u ",
4383 		       soc_cfg_ctx->reo_cmd_ring);
4384 	DP_PRINT_STATS("REO STATUS ring: %u ",
4385 		       soc_cfg_ctx->reo_status_ring);
4386 	DP_PRINT_STATS("RXDMA refill ring: %u ",
4387 		       soc_cfg_ctx->rxdma_refill_ring);
4388 	DP_PRINT_STATS("RXDMA err dst ring: %u ",
4389 		       soc_cfg_ctx->rxdma_err_dst_ring);
4390 }
4391 
4392 void
4393 dp_print_pdev_cfg_params(struct dp_pdev *pdev)
4394 {
4395 	struct wlan_cfg_dp_pdev_ctxt *pdev_cfg_ctx;
4396 
4397 	if (!pdev) {
4398 		dp_err("Context is null");
4399 		return;
4400 	}
4401 
4402 	pdev_cfg_ctx = pdev->wlan_cfg_ctx;
4403 
4404 	if (!pdev_cfg_ctx) {
4405 		dp_err("Context is null");
4406 		return;
4407 	}
4408 
4409 	DP_PRINT_STATS("Rx dma buf ring size: %d ",
4410 		       pdev_cfg_ctx->rx_dma_buf_ring_size);
4411 	DP_PRINT_STATS("DMA Mon buf ring size: %d ",
4412 		       pdev_cfg_ctx->dma_mon_buf_ring_size);
4413 	DP_PRINT_STATS("DMA Mon dest ring size: %d ",
4414 		       pdev_cfg_ctx->dma_mon_dest_ring_size);
4415 	DP_PRINT_STATS("DMA Mon status ring size: %d ",
4416 		       pdev_cfg_ctx->dma_mon_status_ring_size);
4417 	DP_PRINT_STATS("Rxdma monitor desc ring: %d",
4418 		       pdev_cfg_ctx->rxdma_monitor_desc_ring);
4419 	DP_PRINT_STATS("Num mac rings: %d ",
4420 		       pdev_cfg_ctx->num_mac_rings);
4421 }
4422 
4423 /**
4424  * dp_print_ring_stat_from_hal(): Print hal level ring stats
4425  * @soc: DP_SOC handle
4426  * @srng: DP_SRNG handle
4427  * @ring_name: SRNG name
4428  * @ring_type: srng src/dst ring
4429  *
4430  * Return: void
4431  */
4432 static void
4433 dp_print_ring_stat_from_hal(struct dp_soc *soc,  struct dp_srng *srng,
4434 			    enum hal_ring_type ring_type)
4435 {
4436 	uint32_t tailp;
4437 	uint32_t headp;
4438 	int32_t hw_headp = -1;
4439 	int32_t hw_tailp = -1;
4440 	const char *ring_name;
4441 	struct hal_soc *hal_soc;
4442 
4443 	if (soc && srng && srng->hal_srng) {
4444 		hal_soc = (struct hal_soc *)soc->hal_soc;
4445 		ring_name = dp_srng_get_str_from_hal_ring_type(ring_type);
4446 
4447 		hal_get_sw_hptp(soc->hal_soc, srng->hal_srng, &tailp, &headp);
4448 
4449 		DP_PRINT_STATS("%s:SW:Head pointer = %d Tail Pointer = %d\n",
4450 			       ring_name, headp, tailp);
4451 
4452 		hal_get_hw_hptp(soc->hal_soc, srng->hal_srng, &hw_headp,
4453 				&hw_tailp, ring_type);
4454 
4455 		DP_PRINT_STATS("%s:HW:Head pointer = %d Tail Pointer = %d\n",
4456 			       ring_name, hw_headp, hw_tailp);
4457 	}
4458 }
4459 
4460 /**
4461  * dp_print_mon_ring_stats_from_hal() - Print stat for monitor rings based
4462  *					on target
4463  * @pdev: physical device handle
4464  * @mac_id: mac id
4465  *
4466  * Return: void
4467  */
4468 static inline
4469 void dp_print_mon_ring_stat_from_hal(struct dp_pdev *pdev, uint8_t mac_id)
4470 {
4471 	if (pdev->soc->wlan_cfg_ctx->rxdma1_enable) {
4472 		dp_print_ring_stat_from_hal(pdev->soc,
4473 					    &pdev->rxdma_mon_buf_ring[mac_id],
4474 					    RXDMA_MONITOR_BUF);
4475 		dp_print_ring_stat_from_hal(pdev->soc,
4476 					    &pdev->rxdma_mon_dst_ring[mac_id],
4477 					    RXDMA_MONITOR_DST);
4478 		dp_print_ring_stat_from_hal(pdev->soc,
4479 					    &pdev->rxdma_mon_desc_ring[mac_id],
4480 					    RXDMA_MONITOR_DESC);
4481 	}
4482 
4483 	dp_print_ring_stat_from_hal(pdev->soc,
4484 				    &pdev->rxdma_mon_status_ring[mac_id],
4485 				    RXDMA_MONITOR_STATUS);
4486 }
4487 
4488 void
4489 dp_print_ring_stats(struct dp_pdev *pdev)
4490 {
4491 	uint32_t i;
4492 	int mac_id;
4493 
4494 	dp_print_ring_stat_from_hal(pdev->soc,
4495 				    &pdev->soc->reo_exception_ring,
4496 				    REO_EXCEPTION);
4497 	dp_print_ring_stat_from_hal(pdev->soc,
4498 				    &pdev->soc->reo_reinject_ring,
4499 				    REO_REINJECT);
4500 	dp_print_ring_stat_from_hal(pdev->soc,
4501 				    &pdev->soc->reo_cmd_ring,
4502 				    REO_CMD);
4503 	dp_print_ring_stat_from_hal(pdev->soc,
4504 				    &pdev->soc->reo_status_ring,
4505 				    REO_STATUS);
4506 	dp_print_ring_stat_from_hal(pdev->soc,
4507 				    &pdev->soc->rx_rel_ring,
4508 				    WBM2SW_RELEASE);
4509 	dp_print_ring_stat_from_hal(pdev->soc,
4510 				    &pdev->soc->tcl_cmd_ring,
4511 				    TCL_CMD);
4512 	dp_print_ring_stat_from_hal(pdev->soc,
4513 				    &pdev->soc->tcl_status_ring,
4514 				    TCL_STATUS);
4515 	dp_print_ring_stat_from_hal(pdev->soc,
4516 				    &pdev->soc->wbm_desc_rel_ring,
4517 				    SW2WBM_RELEASE);
4518 	for (i = 0; i < MAX_REO_DEST_RINGS; i++)
4519 		dp_print_ring_stat_from_hal(pdev->soc,
4520 					    &pdev->soc->reo_dest_ring[i],
4521 					    REO_DST);
4522 
4523 	for (i = 0; i < pdev->soc->num_tcl_data_rings; i++)
4524 		dp_print_ring_stat_from_hal(pdev->soc,
4525 					    &pdev->soc->tcl_data_ring[i],
4526 					    TCL_DATA);
4527 	for (i = 0; i < MAX_TCL_DATA_RINGS; i++)
4528 		dp_print_ring_stat_from_hal(pdev->soc,
4529 					    &pdev->soc->tx_comp_ring[i],
4530 					    WBM2SW_RELEASE);
4531 
4532 	dp_print_ring_stat_from_hal(pdev->soc,
4533 				    &pdev->rx_refill_buf_ring,
4534 				    RXDMA_BUF);
4535 
4536 	dp_print_ring_stat_from_hal(pdev->soc,
4537 				    &pdev->rx_refill_buf_ring2,
4538 				    RXDMA_BUF);
4539 
4540 	for (i = 0; i < MAX_RX_MAC_RINGS; i++)
4541 		dp_print_ring_stat_from_hal(pdev->soc,
4542 					    &pdev->rx_mac_buf_ring[i],
4543 					    RXDMA_BUF);
4544 
4545 	for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++)
4546 		dp_print_mon_ring_stat_from_hal(pdev, mac_id);
4547 
4548 	for (i = 0; i < NUM_RXDMA_RINGS_PER_PDEV; i++)
4549 		dp_print_ring_stat_from_hal(pdev->soc,
4550 					    &pdev->rxdma_err_dst_ring[i],
4551 					    RXDMA_DST);
4552 }
4553 
4554 /**
4555  * dp_print_common_rates_info(): Print common rate for tx or rx
4556  * @pkt_type_array: rate type array contains rate info
4557  *
4558  * Return:void
4559  */
4560 static inline void
4561 dp_print_common_rates_info(struct cdp_pkt_type *pkt_type_array)
4562 {
4563 	uint8_t mcs, pkt_type;
4564 
4565 	for (pkt_type = 0; pkt_type < DOT11_MAX; pkt_type++) {
4566 		for (mcs = 0; mcs < MAX_MCS; mcs++) {
4567 			if (!dp_rate_string[pkt_type][mcs].valid)
4568 				continue;
4569 
4570 			DP_PRINT_STATS("	%s = %d",
4571 				       dp_rate_string[pkt_type][mcs].mcs_type,
4572 				       pkt_type_array[pkt_type].mcs_count[mcs]);
4573 		}
4574 
4575 		DP_PRINT_STATS("\n");
4576 	}
4577 }
4578 
4579 void dp_print_rx_rates(struct dp_vdev *vdev)
4580 {
4581 	struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev;
4582 	uint8_t i;
4583 	uint8_t index = 0;
4584 	char nss[DP_NSS_LENGTH];
4585 
4586 	DP_PRINT_STATS("Rx Rate Info:\n");
4587 	dp_print_common_rates_info(pdev->stats.rx.pkt_type);
4588 
4589 	index = 0;
4590 	for (i = 0; i < SS_COUNT; i++) {
4591 		index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index,
4592 				     " %d", pdev->stats.rx.nss[i]);
4593 	}
4594 	DP_PRINT_STATS("NSS(1-8) = %s",
4595 		       nss);
4596 
4597 	DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
4598 		       pdev->stats.rx.sgi_count[0],
4599 		       pdev->stats.rx.sgi_count[1],
4600 		       pdev->stats.rx.sgi_count[2],
4601 		       pdev->stats.rx.sgi_count[3]);
4602 	DP_PRINT_STATS("BW Counts = 20MHZ %d, 40MHZ %d, 80MHZ %d, 160MHZ %d",
4603 		       pdev->stats.rx.bw[0], pdev->stats.rx.bw[1],
4604 		       pdev->stats.rx.bw[2], pdev->stats.rx.bw[3]);
4605 	DP_PRINT_STATS("Reception Type ="
4606 		       "SU: %d MU_MIMO:%d MU_OFDMA:%d MU_OFDMA_MIMO:%d",
4607 		       pdev->stats.rx.reception_type[0],
4608 		       pdev->stats.rx.reception_type[1],
4609 		       pdev->stats.rx.reception_type[2],
4610 		       pdev->stats.rx.reception_type[3]);
4611 	DP_PRINT_STATS("Aggregation:\n");
4612 	DP_PRINT_STATS("Number of Msdu's Part of Ampdus = %d",
4613 		       pdev->stats.rx.ampdu_cnt);
4614 	DP_PRINT_STATS("Number of Msdu's With No Mpdu Level Aggregation : %d",
4615 		       pdev->stats.rx.non_ampdu_cnt);
4616 	DP_PRINT_STATS("Number of Msdu's Part of Amsdu: %d",
4617 		       pdev->stats.rx.amsdu_cnt);
4618 	DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation: %d",
4619 		       pdev->stats.rx.non_amsdu_cnt);
4620 }
4621 
4622 void dp_print_tx_rates(struct dp_vdev *vdev)
4623 {
4624 	struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev;
4625 
4626 	DP_PRINT_STATS("Tx Rate Info:\n");
4627 	dp_print_common_rates_info(pdev->stats.tx.pkt_type);
4628 
4629 	DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
4630 		       pdev->stats.tx.sgi_count[0],
4631 		       pdev->stats.tx.sgi_count[1],
4632 		       pdev->stats.tx.sgi_count[2],
4633 		       pdev->stats.tx.sgi_count[3]);
4634 
4635 	DP_PRINT_STATS("BW Counts = 20MHZ %d, 40MHZ %d, 80MHZ %d, 160MHZ %d",
4636 		       pdev->stats.tx.bw[0], pdev->stats.tx.bw[1],
4637 		       pdev->stats.tx.bw[2], pdev->stats.tx.bw[3]);
4638 
4639 	DP_PRINT_STATS("OFDMA = %d", pdev->stats.tx.ofdma);
4640 	DP_PRINT_STATS("STBC = %d", pdev->stats.tx.stbc);
4641 	DP_PRINT_STATS("LDPC = %d", pdev->stats.tx.ldpc);
4642 	DP_PRINT_STATS("Retries = %d", pdev->stats.tx.retries);
4643 	DP_PRINT_STATS("Last ack rssi = %d\n", pdev->stats.tx.last_ack_rssi);
4644 
4645 	DP_PRINT_STATS("Aggregation:\n");
4646 	DP_PRINT_STATS("Number of Msdu's Part of Ampdus = %d",
4647 		       pdev->stats.tx.ampdu_cnt);
4648 	DP_PRINT_STATS("Number of Msdu's With No Mpdu Level Aggregation : %d",
4649 		       pdev->stats.tx.non_ampdu_cnt);
4650 	DP_PRINT_STATS("Number of Msdu's Part of Amsdu = %d",
4651 		       pdev->stats.tx.amsdu_cnt);
4652 	DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation = %d",
4653 		       pdev->stats.tx.non_amsdu_cnt);
4654 }
4655 
4656 void dp_print_peer_stats(struct dp_peer *peer)
4657 {
4658 	uint8_t i;
4659 	uint32_t index;
4660 	uint32_t j;
4661 	char nss[DP_NSS_LENGTH];
4662 	char mu_group_id[DP_MU_GROUP_LENGTH];
4663 
4664 	DP_PRINT_STATS("Node Tx Stats:\n");
4665 	DP_PRINT_STATS("Total Packet Completions = %d",
4666 		       peer->stats.tx.comp_pkt.num);
4667 	DP_PRINT_STATS("Total Bytes Completions = %llu",
4668 		       peer->stats.tx.comp_pkt.bytes);
4669 	DP_PRINT_STATS("Success Packets = %d",
4670 		       peer->stats.tx.tx_success.num);
4671 	DP_PRINT_STATS("Success Bytes = %llu",
4672 		       peer->stats.tx.tx_success.bytes);
4673 	DP_PRINT_STATS("Unicast Success Packets = %d",
4674 		       peer->stats.tx.ucast.num);
4675 	DP_PRINT_STATS("Unicast Success Bytes = %llu",
4676 		       peer->stats.tx.ucast.bytes);
4677 	DP_PRINT_STATS("Multicast Success Packets = %d",
4678 		       peer->stats.tx.mcast.num);
4679 	DP_PRINT_STATS("Multicast Success Bytes = %llu",
4680 		       peer->stats.tx.mcast.bytes);
4681 	DP_PRINT_STATS("Broadcast Success Packets = %d",
4682 		       peer->stats.tx.bcast.num);
4683 	DP_PRINT_STATS("Broadcast Success Bytes = %llu",
4684 		       peer->stats.tx.bcast.bytes);
4685 	DP_PRINT_STATS("Packets Failed = %d",
4686 		       peer->stats.tx.tx_failed);
4687 	DP_PRINT_STATS("Packets In OFDMA = %d",
4688 		       peer->stats.tx.ofdma);
4689 	DP_PRINT_STATS("Packets In STBC = %d",
4690 		       peer->stats.tx.stbc);
4691 	DP_PRINT_STATS("Packets In LDPC = %d",
4692 		       peer->stats.tx.ldpc);
4693 	DP_PRINT_STATS("Packet Retries = %d",
4694 		       peer->stats.tx.retries);
4695 	DP_PRINT_STATS("MSDU's Part of AMSDU = %d",
4696 		       peer->stats.tx.amsdu_cnt);
4697 	DP_PRINT_STATS("Msdu's As Part of Ampdu = %d",
4698 		       peer->stats.tx.non_ampdu_cnt);
4699 	DP_PRINT_STATS("Msdu's As Ampdu = %d",
4700 		       peer->stats.tx.ampdu_cnt);
4701 	DP_PRINT_STATS("Last Packet RSSI = %d",
4702 		       peer->stats.tx.last_ack_rssi);
4703 	DP_PRINT_STATS("Dropped At FW: Removed Pkts = %u",
4704 		       peer->stats.tx.dropped.fw_rem.num);
4705 	DP_PRINT_STATS("Dropped At FW: Removed bytes = %llu",
4706 		       peer->stats.tx.dropped.fw_rem.bytes);
4707 	DP_PRINT_STATS("Dropped At FW: Removed transmitted = %d",
4708 		       peer->stats.tx.dropped.fw_rem_tx);
4709 	DP_PRINT_STATS("Dropped At FW: Removed Untransmitted = %d",
4710 		       peer->stats.tx.dropped.fw_rem_notx);
4711 	DP_PRINT_STATS("Dropped : Age Out = %d",
4712 		       peer->stats.tx.dropped.age_out);
4713 	DP_PRINT_STATS("NAWDS : ");
4714 	DP_PRINT_STATS("Nawds multicast Drop Tx Packet = %d",
4715 		       peer->stats.tx.nawds_mcast_drop);
4716 	DP_PRINT_STATS("	Nawds multicast  Tx Packet Count = %d",
4717 		       peer->stats.tx.nawds_mcast.num);
4718 	DP_PRINT_STATS("	Nawds multicast  Tx Packet Bytes = %llu",
4719 		       peer->stats.tx.nawds_mcast.bytes);
4720 
4721 	DP_PRINT_STATS("Rate Info:");
4722 	dp_print_common_rates_info(peer->stats.tx.pkt_type);
4723 
4724 	DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
4725 		       peer->stats.tx.sgi_count[0],
4726 		       peer->stats.tx.sgi_count[1],
4727 		       peer->stats.tx.sgi_count[2],
4728 		       peer->stats.tx.sgi_count[3]);
4729 	DP_PRINT_STATS("Excess Retries per AC ");
4730 	DP_PRINT_STATS("	 Best effort = %d",
4731 		       peer->stats.tx.excess_retries_per_ac[0]);
4732 	DP_PRINT_STATS("	 Background= %d",
4733 		       peer->stats.tx.excess_retries_per_ac[1]);
4734 	DP_PRINT_STATS("	 Video = %d",
4735 		       peer->stats.tx.excess_retries_per_ac[2]);
4736 	DP_PRINT_STATS("	 Voice = %d",
4737 		       peer->stats.tx.excess_retries_per_ac[3]);
4738 	DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d\n",
4739 		       peer->stats.tx.bw[0], peer->stats.tx.bw[1],
4740 		       peer->stats.tx.bw[2], peer->stats.tx.bw[3]);
4741 
4742 	index = 0;
4743 	for (i = 0; i < SS_COUNT; i++) {
4744 		index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index,
4745 				" %d", peer->stats.tx.nss[i]);
4746 	}
4747 	DP_PRINT_STATS("NSS(1-8) = %s", nss);
4748 
4749 	DP_PRINT_STATS("Transmit Type :");
4750 	DP_PRINT_STATS("SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d",
4751 		       peer->stats.tx.transmit_type[0],
4752 		       peer->stats.tx.transmit_type[1],
4753 		       peer->stats.tx.transmit_type[2],
4754 		       peer->stats.tx.transmit_type[3]);
4755 
4756 	for (i = 0; i < MAX_MU_GROUP_ID;) {
4757 		index = 0;
4758 		for (j = 0; j < DP_MU_GROUP_SHOW && i < MAX_MU_GROUP_ID;
4759 		     j++) {
4760 			index += qdf_snprint(&mu_group_id[index],
4761 					     DP_MU_GROUP_LENGTH - index,
4762 					     " %d",
4763 					     peer->stats.tx.mu_group_id[i]);
4764 			i++;
4765 		}
4766 
4767 		DP_PRINT_STATS("User position list for GID %02d->%d: [%s]",
4768 			       i - DP_MU_GROUP_SHOW, i - 1, mu_group_id);
4769 	}
4770 
4771 	DP_PRINT_STATS("Last Packet RU index [%d], Size [%d]",
4772 		       peer->stats.tx.ru_start, peer->stats.tx.ru_tones);
4773 	DP_PRINT_STATS("RU Locations RU[26 52 106 242 484 996]:");
4774 	DP_PRINT_STATS("RU_26: %d", peer->stats.tx.ru_loc[0]);
4775 	DP_PRINT_STATS("RU 52: %d", peer->stats.tx.ru_loc[1]);
4776 	DP_PRINT_STATS("RU 106: %d", peer->stats.tx.ru_loc[2]);
4777 	DP_PRINT_STATS("RU 242: %d", peer->stats.tx.ru_loc[3]);
4778 	DP_PRINT_STATS("RU 484: %d", peer->stats.tx.ru_loc[4]);
4779 	DP_PRINT_STATS("RU 996: %d", peer->stats.tx.ru_loc[5]);
4780 
4781 	DP_PRINT_STATS("Aggregation:");
4782 	DP_PRINT_STATS("Number of Msdu's Part of Amsdu = %d",
4783 		       peer->stats.tx.amsdu_cnt);
4784 	DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation = %d",
4785 		       peer->stats.tx.non_amsdu_cnt);
4786 
4787 	DP_PRINT_STATS("Bytes and Packets transmitted  in last one sec:");
4788 	DP_PRINT_STATS("	Bytes transmitted in last sec: %d",
4789 		       peer->stats.tx.tx_byte_rate);
4790 	DP_PRINT_STATS("	Data transmitted in last sec: %d",
4791 		       peer->stats.tx.tx_data_rate);
4792 
4793 	DP_PRINT_STATS("Node Rx Stats:");
4794 	DP_PRINT_STATS("Packets Sent To Stack = %d",
4795 		       peer->stats.rx.to_stack.num);
4796 	DP_PRINT_STATS("Bytes Sent To Stack = %llu",
4797 		       peer->stats.rx.to_stack.bytes);
4798 	for (i = 0; i <  CDP_MAX_RX_RINGS; i++) {
4799 		DP_PRINT_STATS("Ring Id = %d", i);
4800 		DP_PRINT_STATS("	Packets Received = %d",
4801 			       peer->stats.rx.rcvd_reo[i].num);
4802 		DP_PRINT_STATS("	Bytes Received = %llu",
4803 			       peer->stats.rx.rcvd_reo[i].bytes);
4804 	}
4805 	DP_PRINT_STATS("Multicast Packets Received = %d",
4806 		       peer->stats.rx.multicast.num);
4807 	DP_PRINT_STATS("Multicast Bytes Received = %llu",
4808 		       peer->stats.rx.multicast.bytes);
4809 	DP_PRINT_STATS("Broadcast Packets Received = %d",
4810 		       peer->stats.rx.bcast.num);
4811 	DP_PRINT_STATS("Broadcast Bytes Received = %llu",
4812 		       peer->stats.rx.bcast.bytes);
4813 	DP_PRINT_STATS("Intra BSS Packets Received = %d",
4814 		       peer->stats.rx.intra_bss.pkts.num);
4815 	DP_PRINT_STATS("Intra BSS Bytes Received = %llu",
4816 		       peer->stats.rx.intra_bss.pkts.bytes);
4817 	DP_PRINT_STATS("Raw Packets Received = %d",
4818 		       peer->stats.rx.raw.num);
4819 	DP_PRINT_STATS("Raw Bytes Received = %llu",
4820 		       peer->stats.rx.raw.bytes);
4821 	DP_PRINT_STATS("Errors: MIC Errors = %d",
4822 		       peer->stats.rx.err.mic_err);
4823 	DP_PRINT_STATS("Erros: Decryption Errors = %d",
4824 		       peer->stats.rx.err.decrypt_err);
4825 	DP_PRINT_STATS("Msdu's Received As Part of Ampdu = %d",
4826 		       peer->stats.rx.non_ampdu_cnt);
4827 	DP_PRINT_STATS("Msdu's Recived As Ampdu = %d",
4828 		       peer->stats.rx.ampdu_cnt);
4829 	DP_PRINT_STATS("Msdu's Received Not Part of Amsdu's = %d",
4830 		       peer->stats.rx.non_amsdu_cnt);
4831 	DP_PRINT_STATS("MSDUs Received As Part of Amsdu = %d",
4832 		       peer->stats.rx.amsdu_cnt);
4833 	DP_PRINT_STATS("NAWDS : ");
4834 	DP_PRINT_STATS("	Nawds multicast Drop Rx Packet = %d",
4835 		       peer->stats.rx.nawds_mcast_drop);
4836 	DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
4837 		       peer->stats.rx.sgi_count[0],
4838 		       peer->stats.rx.sgi_count[1],
4839 		       peer->stats.rx.sgi_count[2],
4840 		       peer->stats.rx.sgi_count[3]);
4841 	DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d",
4842 		       peer->stats.rx.bw[0], peer->stats.rx.bw[1],
4843 		       peer->stats.rx.bw[2], peer->stats.rx.bw[3]);
4844 	DP_PRINT_STATS("Reception Type = SU %d MU_MIMO %d MU_OFDMA %d MU_OFDMA_MIMO %d",
4845 		       peer->stats.rx.reception_type[0],
4846 		       peer->stats.rx.reception_type[1],
4847 		       peer->stats.rx.reception_type[2],
4848 		       peer->stats.rx.reception_type[3]);
4849 
4850 	dp_print_common_rates_info(peer->stats.rx.pkt_type);
4851 
4852 	index = 0;
4853 	for (i = 0; i < SS_COUNT; i++) {
4854 		index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index,
4855 				     " %d", peer->stats.rx.nss[i]);
4856 	}
4857 	DP_PRINT_STATS("NSS(1-8) = %s",
4858 		       nss);
4859 
4860 	DP_PRINT_STATS("Aggregation:");
4861 	DP_PRINT_STATS("	Msdu's Part of Ampdu = %d",
4862 		       peer->stats.rx.ampdu_cnt);
4863 	DP_PRINT_STATS("	Msdu's With No Mpdu Level Aggregation = %d",
4864 		       peer->stats.rx.non_ampdu_cnt);
4865 	DP_PRINT_STATS("	Msdu's Part of Amsdu = %d",
4866 		       peer->stats.rx.amsdu_cnt);
4867 	DP_PRINT_STATS("	Msdu's With No Msdu Level Aggregation = %d",
4868 		       peer->stats.rx.non_amsdu_cnt);
4869 
4870 	DP_PRINT_STATS("Bytes and Packets received in last one sec:");
4871 	DP_PRINT_STATS("	Bytes received in last sec: %d",
4872 		       peer->stats.rx.rx_byte_rate);
4873 	DP_PRINT_STATS("	Data received in last sec: %d",
4874 		       peer->stats.rx.rx_data_rate);
4875 }
4876 
4877 void dp_print_per_ring_stats(struct dp_soc *soc)
4878 {
4879 	uint8_t ring;
4880 	uint16_t core;
4881 	uint64_t total_packets;
4882 
4883 	DP_PRINT_STATS("Reo packets per ring:");
4884 	for (ring = 0; ring < MAX_REO_DEST_RINGS; ring++) {
4885 		total_packets = 0;
4886 		DP_PRINT_STATS("Packets on ring %u:", ring);
4887 		for (core = 0; core < num_possible_cpus(); core++) {
4888 			DP_PRINT_STATS("Packets arriving on core %u: %llu",
4889 				       core,
4890 				       soc->stats.rx.ring_packets[core][ring]);
4891 			total_packets += soc->stats.rx.ring_packets[core][ring];
4892 		}
4893 		DP_PRINT_STATS("Total packets on ring %u: %llu",
4894 			       ring, total_packets);
4895 	}
4896 }
4897 
4898 void dp_txrx_path_stats(struct dp_soc *soc)
4899 {
4900 	uint8_t error_code;
4901 	uint8_t loop_pdev;
4902 	struct dp_pdev *pdev;
4903 	uint8_t i;
4904 
4905 	if (!soc) {
4906 		dp_err("%s: Invalid access",  __func__);
4907 		return;
4908 	}
4909 
4910 	for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) {
4911 		pdev = soc->pdev_list[loop_pdev];
4912 		dp_aggregate_pdev_stats(pdev);
4913 		DP_PRINT_STATS("Tx path Statistics:");
4914 		DP_PRINT_STATS("from stack: %u msdus (%llu bytes)",
4915 			       pdev->stats.tx_i.rcvd.num,
4916 			       pdev->stats.tx_i.rcvd.bytes);
4917 		DP_PRINT_STATS("processed from host: %u msdus (%llu bytes)",
4918 			       pdev->stats.tx_i.processed.num,
4919 			       pdev->stats.tx_i.processed.bytes);
4920 		DP_PRINT_STATS("successfully transmitted: %u msdus (%llu bytes)",
4921 			       pdev->stats.tx.tx_success.num,
4922 			       pdev->stats.tx.tx_success.bytes);
4923 
4924 		DP_PRINT_STATS("Dropped in host:");
4925 		DP_PRINT_STATS("Total packets dropped: %u,",
4926 			       pdev->stats.tx_i.dropped.dropped_pkt.num);
4927 		DP_PRINT_STATS("Descriptor not available: %u",
4928 			       pdev->stats.tx_i.dropped.desc_na.num);
4929 		DP_PRINT_STATS("Ring full: %u",
4930 			       pdev->stats.tx_i.dropped.ring_full);
4931 		DP_PRINT_STATS("Enqueue fail: %u",
4932 			       pdev->stats.tx_i.dropped.enqueue_fail);
4933 		DP_PRINT_STATS("DMA Error: %u",
4934 			       pdev->stats.tx_i.dropped.dma_error);
4935 
4936 		DP_PRINT_STATS("Dropped in hardware:");
4937 		DP_PRINT_STATS("total packets dropped: %u",
4938 			       pdev->stats.tx.tx_failed);
4939 		DP_PRINT_STATS("mpdu age out: %u",
4940 			       pdev->stats.tx.dropped.age_out);
4941 		DP_PRINT_STATS("firmware removed packets: %u (%llu bytes)",
4942 			       pdev->stats.tx.dropped.fw_rem.num,
4943 			       pdev->stats.tx.dropped.fw_rem.bytes);
4944 		DP_PRINT_STATS("firmware removed tx: %u",
4945 			       pdev->stats.tx.dropped.fw_rem_tx);
4946 		DP_PRINT_STATS("firmware removed notx %u",
4947 			       pdev->stats.tx.dropped.fw_rem_notx);
4948 		DP_PRINT_STATS("Invalid peer on tx path: %u",
4949 			       pdev->soc->stats.tx.tx_invalid_peer.num);
4950 
4951 		DP_PRINT_STATS("Tx packets sent per interrupt:");
4952 		DP_PRINT_STATS("Single Packet: %u",
4953 			       pdev->stats.tx_comp_histogram.pkts_1);
4954 		DP_PRINT_STATS("2-20 Packets:  %u",
4955 			       pdev->stats.tx_comp_histogram.pkts_2_20);
4956 		DP_PRINT_STATS("21-40 Packets: %u",
4957 			       pdev->stats.tx_comp_histogram.pkts_21_40);
4958 		DP_PRINT_STATS("41-60 Packets: %u",
4959 			       pdev->stats.tx_comp_histogram.pkts_41_60);
4960 		DP_PRINT_STATS("61-80 Packets: %u",
4961 			       pdev->stats.tx_comp_histogram.pkts_61_80);
4962 		DP_PRINT_STATS("81-100 Packets: %u",
4963 			       pdev->stats.tx_comp_histogram.pkts_81_100);
4964 		DP_PRINT_STATS("101-200 Packets: %u",
4965 			       pdev->stats.tx_comp_histogram.pkts_101_200);
4966 		DP_PRINT_STATS("    201+ Packets: %u",
4967 			       pdev->stats.tx_comp_histogram.pkts_201_plus);
4968 
4969 		DP_PRINT_STATS("Rx path statistics");
4970 
4971 		DP_PRINT_STATS("delivered %u msdus ( %llu bytes),",
4972 			       pdev->stats.rx.to_stack.num,
4973 			       pdev->stats.rx.to_stack.bytes);
4974 		for (i = 0; i <  CDP_MAX_RX_RINGS; i++)
4975 			DP_PRINT_STATS(
4976 				       "received on reo[%d] %u msdus( %llu bytes),",
4977 				       i, pdev->stats.rx.rcvd_reo[i].num,
4978 				       pdev->stats.rx.rcvd_reo[i].bytes);
4979 		DP_PRINT_STATS("intra-bss packets %u msdus ( %llu bytes),",
4980 			       pdev->stats.rx.intra_bss.pkts.num,
4981 			       pdev->stats.rx.intra_bss.pkts.bytes);
4982 		DP_PRINT_STATS("intra-bss fails %u msdus ( %llu bytes),",
4983 			       pdev->stats.rx.intra_bss.fail.num,
4984 			       pdev->stats.rx.intra_bss.fail.bytes);
4985 		DP_PRINT_STATS("raw packets %u msdus ( %llu bytes),",
4986 			       pdev->stats.rx.raw.num,
4987 			       pdev->stats.rx.raw.bytes);
4988 		DP_PRINT_STATS("mic errors %u",
4989 			       pdev->stats.rx.err.mic_err);
4990 		DP_PRINT_STATS("Invalid peer on rx path: %u",
4991 			       pdev->soc->stats.rx.err.rx_invalid_peer.num);
4992 		DP_PRINT_STATS("sw_peer_id invalid %u",
4993 			       pdev->soc->stats.rx.err.rx_invalid_peer_id.num);
4994 		DP_PRINT_STATS("packet_len invalid %u",
4995 			       pdev->soc->stats.rx.err.rx_invalid_pkt_len.num);
4996 
4997 		DP_PRINT_STATS("Reo Statistics");
4998 		DP_PRINT_STATS("rbm error: %u msdus",
4999 			       pdev->soc->stats.rx.err.invalid_rbm);
5000 		DP_PRINT_STATS("hal ring access fail: %u msdus",
5001 			       pdev->soc->stats.rx.err.hal_ring_access_fail);
5002 
5003 		for (error_code = 0; error_code < HAL_REO_ERR_MAX;
5004 				error_code++) {
5005 			if (!pdev->soc->stats.rx.err.reo_error[error_code])
5006 				continue;
5007 			DP_PRINT_STATS("Reo error number (%u): %u msdus",
5008 				       error_code,
5009 				       pdev->soc->stats.rx.err
5010 				       .reo_error[error_code]);
5011 		}
5012 
5013 		for (error_code = 0; error_code < HAL_RXDMA_ERR_MAX;
5014 				error_code++) {
5015 			if (!pdev->soc->stats.rx.err.rxdma_error[error_code])
5016 				continue;
5017 			DP_PRINT_STATS("Rxdma error number (%u): %u msdus",
5018 				       error_code,
5019 				       pdev->soc->stats.rx.err
5020 				       .rxdma_error[error_code]);
5021 		}
5022 
5023 		DP_PRINT_STATS("Rx packets reaped per interrupt:");
5024 		DP_PRINT_STATS("Single Packet: %u",
5025 			       pdev->stats.rx_ind_histogram.pkts_1);
5026 		DP_PRINT_STATS("2-20 Packets:  %u",
5027 			       pdev->stats.rx_ind_histogram.pkts_2_20);
5028 		DP_PRINT_STATS("21-40 Packets: %u",
5029 			       pdev->stats.rx_ind_histogram.pkts_21_40);
5030 		DP_PRINT_STATS("41-60 Packets: %u",
5031 			       pdev->stats.rx_ind_histogram.pkts_41_60);
5032 		DP_PRINT_STATS("61-80 Packets: %u",
5033 			       pdev->stats.rx_ind_histogram.pkts_61_80);
5034 		DP_PRINT_STATS("81-100 Packets: %u",
5035 			       pdev->stats.rx_ind_histogram.pkts_81_100);
5036 		DP_PRINT_STATS("101-200 Packets: %u",
5037 			       pdev->stats.rx_ind_histogram.pkts_101_200);
5038 		DP_PRINT_STATS("   201+ Packets: %u",
5039 			       pdev->stats.rx_ind_histogram.pkts_201_plus);
5040 
5041 		DP_PRINT_STATS("%s: tso_enable: %u lro_enable: %u rx_hash: %u napi_enable: %u",
5042 			       __func__,
5043 			       pdev->soc->wlan_cfg_ctx
5044 			       ->tso_enabled,
5045 			       pdev->soc->wlan_cfg_ctx
5046 			       ->lro_enabled,
5047 			       pdev->soc->wlan_cfg_ctx
5048 			       ->rx_hash,
5049 			       pdev->soc->wlan_cfg_ctx
5050 			       ->napi_enabled);
5051 #ifdef QCA_LL_TX_FLOW_CONTROL_V2
5052 		DP_PRINT_STATS("%s: Tx flow stop queue: %u tx flow start queue offset: %u",
5053 			       __func__,
5054 			       pdev->soc->wlan_cfg_ctx
5055 			       ->tx_flow_stop_queue_threshold,
5056 			       pdev->soc->wlan_cfg_ctx
5057 			       ->tx_flow_start_queue_offset);
5058 #endif
5059 	}
5060 }
5061 
5062 /*
5063  * dp_aggregate_pdev_ctrl_frames_stats()- function to agreegate peer stats
5064  * Current scope is bar received count
5065  *
5066  * @pdev_handle: DP_PDEV handle
5067  *
5068  * Return: void
5069  */
5070 static void
5071 dp_aggregate_pdev_ctrl_frames_stats(struct dp_pdev *pdev)
5072 {
5073 	struct dp_vdev *vdev;
5074 	struct dp_peer *peer;
5075 	uint32_t waitcnt;
5076 
5077 	TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem) {
5078 		TAILQ_FOREACH(peer, &vdev->peer_list, peer_list_elem) {
5079 			if (!peer) {
5080 				dp_err("DP Invalid Peer refernce");
5081 				return;
5082 			}
5083 
5084 			if (peer->delete_in_progress) {
5085 				dp_err("DP Peer deletion in progress");
5086 				continue;
5087 			}
5088 			qdf_atomic_inc(&peer->ref_cnt);
5089 			waitcnt = 0;
5090 			dp_peer_rxtid_stats(peer, dp_rx_bar_stats_cb, pdev);
5091 			while (!(qdf_atomic_read(&pdev->stats_cmd_complete)) &&
5092 			       waitcnt < 10) {
5093 				schedule_timeout_interruptible(
5094 						STATS_PROC_TIMEOUT);
5095 				waitcnt++;
5096 			}
5097 			qdf_atomic_set(&pdev->stats_cmd_complete, 0);
5098 			dp_peer_unref_delete(peer);
5099 		}
5100 	}
5101 }
5102 
5103 void
5104 dp_print_pdev_tx_stats(struct dp_pdev *pdev)
5105 {
5106 	uint8_t i = 0, index = 0;
5107 
5108 	DP_PRINT_STATS("PDEV Tx Stats:\n");
5109 	DP_PRINT_STATS("Received From Stack:");
5110 	DP_PRINT_STATS("	Packets = %d",
5111 		       pdev->stats.tx_i.rcvd.num);
5112 	DP_PRINT_STATS("	Bytes = %llu",
5113 		       pdev->stats.tx_i.rcvd.bytes);
5114 	DP_PRINT_STATS("Processed:");
5115 	DP_PRINT_STATS("	Packets = %d",
5116 		       pdev->stats.tx_i.processed.num);
5117 	DP_PRINT_STATS("	Bytes = %llu",
5118 		       pdev->stats.tx_i.processed.bytes);
5119 	DP_PRINT_STATS("Total Completions:");
5120 	DP_PRINT_STATS("	Packets = %u",
5121 		       pdev->stats.tx.comp_pkt.num);
5122 	DP_PRINT_STATS("	Bytes = %llu",
5123 		       pdev->stats.tx.comp_pkt.bytes);
5124 	DP_PRINT_STATS("Successful Completions:");
5125 	DP_PRINT_STATS("	Packets = %u",
5126 		       pdev->stats.tx.tx_success.num);
5127 	DP_PRINT_STATS("	Bytes = %llu",
5128 		       pdev->stats.tx.tx_success.bytes);
5129 	DP_PRINT_STATS("Dropped:");
5130 	DP_PRINT_STATS("	Total = %d",
5131 		       pdev->stats.tx_i.dropped.dropped_pkt.num);
5132 	DP_PRINT_STATS("	Dma_map_error = %d",
5133 		       pdev->stats.tx_i.dropped.dma_error);
5134 	DP_PRINT_STATS("	Ring Full = %d",
5135 		       pdev->stats.tx_i.dropped.ring_full);
5136 	DP_PRINT_STATS("	Descriptor Not available = %d",
5137 		       pdev->stats.tx_i.dropped.desc_na.num);
5138 	DP_PRINT_STATS("	HW enqueue failed= %d",
5139 		       pdev->stats.tx_i.dropped.enqueue_fail);
5140 	DP_PRINT_STATS("	Resources Full = %d",
5141 		       pdev->stats.tx_i.dropped.res_full);
5142 	DP_PRINT_STATS("	FW removed Pkts = %u",
5143 		       pdev->stats.tx.dropped.fw_rem.num);
5144 	DP_PRINT_STATS("	FW removed bytes= %llu",
5145 		       pdev->stats.tx.dropped.fw_rem.bytes);
5146 	DP_PRINT_STATS("	FW removed transmitted = %d",
5147 		       pdev->stats.tx.dropped.fw_rem_tx);
5148 	DP_PRINT_STATS("	FW removed untransmitted = %d",
5149 		       pdev->stats.tx.dropped.fw_rem_notx);
5150 	DP_PRINT_STATS("	FW removed untransmitted fw_reason1 = %d",
5151 		       pdev->stats.tx.dropped.fw_reason1);
5152 	DP_PRINT_STATS("	FW removed untransmitted fw_reason2 = %d",
5153 		       pdev->stats.tx.dropped.fw_reason2);
5154 	DP_PRINT_STATS("	FW removed untransmitted fw_reason3 = %d",
5155 		       pdev->stats.tx.dropped.fw_reason3);
5156 	DP_PRINT_STATS("	Aged Out from msdu/mpdu queues = %d",
5157 		       pdev->stats.tx.dropped.age_out);
5158 	DP_PRINT_STATS("	headroom insufficient = %d",
5159 		       pdev->stats.tx_i.dropped.headroom_insufficient);
5160 	DP_PRINT_STATS("	Multicast:");
5161 	DP_PRINT_STATS("	Packets: %u",
5162 		       pdev->stats.tx.mcast.num);
5163 	DP_PRINT_STATS("	Bytes: %llu",
5164 		       pdev->stats.tx.mcast.bytes);
5165 	DP_PRINT_STATS("Scatter Gather:");
5166 	DP_PRINT_STATS("	Packets = %d",
5167 		       pdev->stats.tx_i.sg.sg_pkt.num);
5168 	DP_PRINT_STATS("	Bytes = %llu",
5169 		       pdev->stats.tx_i.sg.sg_pkt.bytes);
5170 	DP_PRINT_STATS("	Dropped By Host = %d",
5171 		       pdev->stats.tx_i.sg.dropped_host.num);
5172 	DP_PRINT_STATS("	Dropped By Target = %d",
5173 		       pdev->stats.tx_i.sg.dropped_target);
5174 	DP_PRINT_STATS("TSO:");
5175 	DP_PRINT_STATS("	Number of Segments = %d",
5176 		       pdev->stats.tx_i.tso.num_seg);
5177 	DP_PRINT_STATS("	Packets = %d",
5178 		       pdev->stats.tx_i.tso.tso_pkt.num);
5179 	DP_PRINT_STATS("	Bytes = %llu",
5180 		       pdev->stats.tx_i.tso.tso_pkt.bytes);
5181 	DP_PRINT_STATS("	Dropped By Host = %d",
5182 		       pdev->stats.tx_i.tso.dropped_host.num);
5183 	DP_PRINT_STATS("Mcast Enhancement:");
5184 	DP_PRINT_STATS("	Packets = %d",
5185 		       pdev->stats.tx_i.mcast_en.mcast_pkt.num);
5186 	DP_PRINT_STATS("	Bytes = %llu",
5187 		       pdev->stats.tx_i.mcast_en.mcast_pkt.bytes);
5188 	DP_PRINT_STATS("	Dropped: Map Errors = %d",
5189 		       pdev->stats.tx_i.mcast_en.dropped_map_error);
5190 	DP_PRINT_STATS("	Dropped: Self Mac = %d",
5191 		       pdev->stats.tx_i.mcast_en.dropped_self_mac);
5192 	DP_PRINT_STATS("	Dropped: Send Fail = %d",
5193 		       pdev->stats.tx_i.mcast_en.dropped_send_fail);
5194 	DP_PRINT_STATS("	Unicast sent = %d",
5195 		       pdev->stats.tx_i.mcast_en.ucast);
5196 	DP_PRINT_STATS("Raw:");
5197 	DP_PRINT_STATS("	Packets = %d",
5198 		       pdev->stats.tx_i.raw.raw_pkt.num);
5199 	DP_PRINT_STATS("	Bytes = %llu",
5200 		       pdev->stats.tx_i.raw.raw_pkt.bytes);
5201 	DP_PRINT_STATS("	DMA map error = %d",
5202 		       pdev->stats.tx_i.raw.dma_map_error);
5203 	DP_PRINT_STATS("Reinjected:");
5204 	DP_PRINT_STATS("	Packets = %d",
5205 		       pdev->stats.tx_i.reinject_pkts.num);
5206 	DP_PRINT_STATS("	Bytes = %llu\n",
5207 		       pdev->stats.tx_i.reinject_pkts.bytes);
5208 	DP_PRINT_STATS("Inspected:");
5209 	DP_PRINT_STATS("	Packets = %d",
5210 		       pdev->stats.tx_i.inspect_pkts.num);
5211 	DP_PRINT_STATS("	Bytes = %llu",
5212 		       pdev->stats.tx_i.inspect_pkts.bytes);
5213 	DP_PRINT_STATS("Nawds Multicast:");
5214 	DP_PRINT_STATS("	Packets = %d",
5215 		       pdev->stats.tx_i.nawds_mcast.num);
5216 	DP_PRINT_STATS("	Bytes = %llu",
5217 		       pdev->stats.tx_i.nawds_mcast.bytes);
5218 	DP_PRINT_STATS("CCE Classified:");
5219 	DP_PRINT_STATS("	CCE Classified Packets: %u",
5220 		       pdev->stats.tx_i.cce_classified);
5221 	DP_PRINT_STATS("	RAW CCE Classified Packets: %u",
5222 		       pdev->stats.tx_i.cce_classified_raw);
5223 	DP_PRINT_STATS("Mesh stats:");
5224 	DP_PRINT_STATS("	frames to firmware: %u",
5225 		       pdev->stats.tx_i.mesh.exception_fw);
5226 	DP_PRINT_STATS("	completions from fw: %u",
5227 		       pdev->stats.tx_i.mesh.completion_fw);
5228 	DP_PRINT_STATS("PPDU stats counter");
5229 	for (index = 0; index < CDP_PPDU_STATS_MAX_TAG; index++) {
5230 		DP_PRINT_STATS("	Tag[%d] = %llu", index,
5231 			       pdev->stats.ppdu_stats_counter[index]);
5232 	}
5233 	DP_PRINT_STATS("tx_ppdu_proc: %llu\n",
5234 		       pdev->tx_ppdu_proc);
5235 
5236 	for (i = 0; i < CDP_WDI_NUM_EVENTS; i++) {
5237 		if (!pdev->stats.wdi_event[i])
5238 			DP_PRINT_STATS("Wdi msgs received from fw[%d]:%d",
5239 				       i, pdev->stats.wdi_event[i]);
5240 	}
5241 }
5242 
5243 void
5244 dp_print_pdev_rx_stats(struct dp_pdev *pdev)
5245 {
5246 	DP_PRINT_STATS("PDEV Rx Stats:\n");
5247 	DP_PRINT_STATS("Received From HW (Per Rx Ring):");
5248 	DP_PRINT_STATS("	Packets = %d %d %d %d",
5249 		       pdev->stats.rx.rcvd_reo[0].num,
5250 		       pdev->stats.rx.rcvd_reo[1].num,
5251 		       pdev->stats.rx.rcvd_reo[2].num,
5252 		       pdev->stats.rx.rcvd_reo[3].num);
5253 	DP_PRINT_STATS("	Bytes = %llu %llu %llu %llu",
5254 		       pdev->stats.rx.rcvd_reo[0].bytes,
5255 		       pdev->stats.rx.rcvd_reo[1].bytes,
5256 		       pdev->stats.rx.rcvd_reo[2].bytes,
5257 		       pdev->stats.rx.rcvd_reo[3].bytes);
5258 	DP_PRINT_STATS("Replenished:");
5259 	DP_PRINT_STATS("	Packets = %d",
5260 		       pdev->stats.replenish.pkts.num);
5261 	DP_PRINT_STATS("	Bytes = %llu",
5262 		       pdev->stats.replenish.pkts.bytes);
5263 	DP_PRINT_STATS("	Buffers Added To Freelist = %d",
5264 		       pdev->stats.buf_freelist);
5265 	DP_PRINT_STATS("	Low threshold intr = %d",
5266 		       pdev->stats.replenish.low_thresh_intrs);
5267 	DP_PRINT_STATS("Dropped:");
5268 	DP_PRINT_STATS("	msdu_not_done = %d",
5269 		       pdev->stats.dropped.msdu_not_done);
5270 	DP_PRINT_STATS("        wifi parse = %d",
5271 		       pdev->stats.dropped.wifi_parse);
5272 	DP_PRINT_STATS("        mon_rx_drop = %d",
5273 		       pdev->stats.dropped.mon_rx_drop);
5274 	DP_PRINT_STATS("        mec_drop = %d",
5275 		       pdev->stats.rx.mec_drop.num);
5276 	DP_PRINT_STATS("	Bytes = %llu",
5277 		       pdev->stats.rx.mec_drop.bytes);
5278 	DP_PRINT_STATS("Sent To Stack:");
5279 	DP_PRINT_STATS("	Packets = %d",
5280 		       pdev->stats.rx.to_stack.num);
5281 	DP_PRINT_STATS("	Bytes = %llu",
5282 		       pdev->stats.rx.to_stack.bytes);
5283 	DP_PRINT_STATS("        vlan_tag_stp_cnt = %d",
5284 		       pdev->stats.vlan_tag_stp_cnt);
5285 	DP_PRINT_STATS("Multicast/Broadcast:");
5286 	DP_PRINT_STATS("	Packets = %d",
5287 		       pdev->stats.rx.multicast.num);
5288 	DP_PRINT_STATS("	Bytes = %llu",
5289 		       pdev->stats.rx.multicast.bytes);
5290 	DP_PRINT_STATS("Errors:");
5291 	DP_PRINT_STATS("	Rxdma Ring Un-inititalized = %d",
5292 		       pdev->stats.replenish.rxdma_err);
5293 	DP_PRINT_STATS("	Desc Alloc Failed: = %d",
5294 		       pdev->stats.err.desc_alloc_fail);
5295 	DP_PRINT_STATS("	IP checksum error = %d",
5296 		       pdev->stats.err.ip_csum_err);
5297 	DP_PRINT_STATS("	TCP/UDP checksum error = %d",
5298 		       pdev->stats.err.tcp_udp_csum_err);
5299 
5300 	/* Get bar_recv_cnt */
5301 	dp_aggregate_pdev_ctrl_frames_stats(pdev);
5302 	DP_PRINT_STATS("BAR Received Count: = %d",
5303 		       pdev->stats.rx.bar_recv_cnt);
5304 }
5305 
5306 void
5307 dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev)
5308 {
5309 	struct cdp_pdev_mon_stats *rx_mon_stats;
5310 	uint32_t *stat_ring_ppdu_ids;
5311 	uint32_t *dest_ring_ppdu_ids;
5312 	int i, idx;
5313 
5314 	rx_mon_stats = &pdev->rx_mon_stats;
5315 
5316 	DP_PRINT_STATS("PDEV Rx Monitor Stats:\n");
5317 
5318 	DP_PRINT_STATS("status_ppdu_compl_cnt = %d",
5319 		       rx_mon_stats->status_ppdu_compl);
5320 	DP_PRINT_STATS("status_ppdu_start_cnt = %d",
5321 		       rx_mon_stats->status_ppdu_start);
5322 	DP_PRINT_STATS("status_ppdu_end_cnt = %d",
5323 		       rx_mon_stats->status_ppdu_end);
5324 	DP_PRINT_STATS("status_ppdu_start_mis_cnt = %d",
5325 		       rx_mon_stats->status_ppdu_start_mis);
5326 	DP_PRINT_STATS("status_ppdu_end_mis_cnt = %d",
5327 		       rx_mon_stats->status_ppdu_end_mis);
5328 	DP_PRINT_STATS("status_ppdu_done_cnt = %d",
5329 		       rx_mon_stats->status_ppdu_done);
5330 	DP_PRINT_STATS("dest_ppdu_done_cnt = %d",
5331 		       rx_mon_stats->dest_ppdu_done);
5332 	DP_PRINT_STATS("dest_mpdu_done_cnt = %d",
5333 		       rx_mon_stats->dest_mpdu_done);
5334 	DP_PRINT_STATS("dest_mpdu_drop_cnt = %d",
5335 		       rx_mon_stats->dest_mpdu_drop);
5336 	DP_PRINT_STATS("dup_mon_linkdesc_cnt = %d",
5337 		       rx_mon_stats->dup_mon_linkdesc_cnt);
5338 	DP_PRINT_STATS("dup_mon_buf_cnt = %d",
5339 		       rx_mon_stats->dup_mon_buf_cnt);
5340 	stat_ring_ppdu_ids =
5341 		(uint32_t *)qdf_mem_malloc(sizeof(uint32_t) * MAX_PPDU_ID_HIST);
5342 	dest_ring_ppdu_ids =
5343 		(uint32_t *)qdf_mem_malloc(sizeof(uint32_t) * MAX_PPDU_ID_HIST);
5344 
5345 	if (!stat_ring_ppdu_ids || !dest_ring_ppdu_ids)
5346 		DP_PRINT_STATS("Unable to allocate ppdu id hist mem\n");
5347 
5348 	qdf_spin_lock_bh(&pdev->mon_lock);
5349 	idx = rx_mon_stats->ppdu_id_hist_idx;
5350 	qdf_mem_copy(stat_ring_ppdu_ids,
5351 		     rx_mon_stats->stat_ring_ppdu_id_hist,
5352 		     sizeof(uint32_t) * MAX_PPDU_ID_HIST);
5353 	qdf_mem_copy(dest_ring_ppdu_ids,
5354 		     rx_mon_stats->dest_ring_ppdu_id_hist,
5355 		     sizeof(uint32_t) * MAX_PPDU_ID_HIST);
5356 	qdf_spin_unlock_bh(&pdev->mon_lock);
5357 
5358 	DP_PRINT_STATS("PPDU Id history:");
5359 	DP_PRINT_STATS("stat_ring_ppdu_ids\t dest_ring_ppdu_ids");
5360 	for (i = 0; i < MAX_PPDU_ID_HIST; i++) {
5361 		idx = (idx + 1) & (MAX_PPDU_ID_HIST - 1);
5362 		DP_PRINT_STATS("%*u\t%*u", 16,
5363 			       rx_mon_stats->stat_ring_ppdu_id_hist[idx], 16,
5364 			       rx_mon_stats->dest_ring_ppdu_id_hist[idx]);
5365 	}
5366 	qdf_mem_free(stat_ring_ppdu_ids);
5367 	qdf_mem_free(dest_ring_ppdu_ids);
5368 }
5369 
5370 void
5371 dp_print_soc_tx_stats(struct dp_soc *soc)
5372 {
5373 	uint8_t desc_pool_id;
5374 
5375 	soc->stats.tx.desc_in_use = 0;
5376 
5377 	DP_PRINT_STATS("SOC Tx Stats:\n");
5378 
5379 	for (desc_pool_id = 0;
5380 	     desc_pool_id < wlan_cfg_get_num_tx_desc_pool(soc->wlan_cfg_ctx);
5381 	     desc_pool_id++)
5382 		soc->stats.tx.desc_in_use +=
5383 			soc->tx_desc[desc_pool_id].num_allocated;
5384 
5385 	DP_PRINT_STATS("Tx Descriptors In Use = %d",
5386 		       soc->stats.tx.desc_in_use);
5387 	DP_PRINT_STATS("Tx Invalid peer:");
5388 	DP_PRINT_STATS("	Packets = %d",
5389 		       soc->stats.tx.tx_invalid_peer.num);
5390 	DP_PRINT_STATS("	Bytes = %llu",
5391 		       soc->stats.tx.tx_invalid_peer.bytes);
5392 	DP_PRINT_STATS("Packets dropped due to TCL ring full = %d %d %d",
5393 		       soc->stats.tx.tcl_ring_full[0],
5394 		       soc->stats.tx.tcl_ring_full[1],
5395 		       soc->stats.tx.tcl_ring_full[2]);
5396 	DP_PRINT_STATS("Tx invalid completion release = %d",
5397 		       soc->stats.tx.invalid_release_source);
5398 	DP_PRINT_STATS("Tx comp loop pkt limit hit = %d",
5399 		       soc->stats.tx.tx_comp_loop_pkt_limit_hit);
5400 	DP_PRINT_STATS("Tx comp HP out of sync2 = %d",
5401 		       soc->stats.tx.hp_oos2);
5402 }
5403 
5404 void dp_print_soc_interrupt_stats(struct dp_soc *soc)
5405 {
5406 	int i = 0;
5407 	struct dp_intr_stats *intr_stats;
5408 
5409 	DP_PRINT_STATS("INT:     Total  |txComps|reo[0] |reo[1] |reo[2] |reo[3] |mon    |rx_err | wbm   |reo_sta|rxdm2hst|hst2rxdm|");
5410 	for (i = 0; i < WLAN_CFG_INT_NUM_CONTEXTS; i++) {
5411 		intr_stats = &soc->intr_ctx[i].intr_stats;
5412 		DP_PRINT_STATS("%3u[%d]: %7u %7u %7u %7u %7u %7u %7u %7u %7u %7u %8u %8u",
5413 			       i,
5414 			       hif_get_int_ctx_irq_num(soc->hif_handle, i),
5415 			       intr_stats->num_masks,
5416 			       intr_stats->num_tx_ring_masks[0],
5417 			       intr_stats->num_rx_ring_masks[0],
5418 			       intr_stats->num_rx_ring_masks[1],
5419 			       intr_stats->num_rx_ring_masks[2],
5420 			       intr_stats->num_rx_ring_masks[3],
5421 			       intr_stats->num_rx_mon_ring_masks,
5422 			       intr_stats->num_rx_err_ring_masks,
5423 			       intr_stats->num_rx_wbm_rel_ring_masks,
5424 			       intr_stats->num_reo_status_ring_masks,
5425 			       intr_stats->num_rxdma2host_ring_masks,
5426 			       intr_stats->num_host2rxdma_ring_masks);
5427 		}
5428 }
5429 
5430 void
5431 dp_print_soc_rx_stats(struct dp_soc *soc)
5432 {
5433 	uint32_t i;
5434 	char reo_error[DP_REO_ERR_LENGTH];
5435 	char rxdma_error[DP_RXDMA_ERR_LENGTH];
5436 	uint8_t index = 0;
5437 
5438 	DP_PRINT_STATS("No of AST Entries = %d", soc->num_ast_entries);
5439 	DP_PRINT_STATS("SOC Rx Stats:\n");
5440 	DP_PRINT_STATS("Fragmented packets: %u",
5441 		       soc->stats.rx.rx_frags);
5442 	DP_PRINT_STATS("Reo reinjected packets: %u",
5443 		       soc->stats.rx.reo_reinject);
5444 	DP_PRINT_STATS("Errors:\n");
5445 	DP_PRINT_STATS("Rx Decrypt Errors = %d",
5446 		       (soc->stats.rx.err.rxdma_error[HAL_RXDMA_ERR_DECRYPT] +
5447 		       soc->stats.rx.err.rxdma_error[HAL_RXDMA_ERR_TKIP_MIC]));
5448 	DP_PRINT_STATS("Invalid RBM = %d",
5449 		       soc->stats.rx.err.invalid_rbm);
5450 	DP_PRINT_STATS("Invalid Vdev = %d",
5451 		       soc->stats.rx.err.invalid_vdev);
5452 	DP_PRINT_STATS("Invalid sa_idx or da_idx = %d",
5453 		       soc->stats.rx.err.invalid_sa_da_idx);
5454 	DP_PRINT_STATS("Invalid Pdev = %d",
5455 		       soc->stats.rx.err.invalid_pdev);
5456 	DP_PRINT_STATS("Invalid Peer = %d",
5457 		       soc->stats.rx.err.rx_invalid_peer.num);
5458 	DP_PRINT_STATS("HAL Ring Access Fail = %d",
5459 		       soc->stats.rx.err.hal_ring_access_fail);
5460 	DP_PRINT_STATS("MSDU Done failures = %d",
5461 		       soc->stats.rx.err.msdu_done_fail);
5462 	DP_PRINT_STATS("RX frags: %d", soc->stats.rx.rx_frags);
5463 	DP_PRINT_STATS("RX frag wait: %d", soc->stats.rx.rx_frag_wait);
5464 	DP_PRINT_STATS("RX frag err: %d", soc->stats.rx.rx_frag_err);
5465 
5466 	DP_PRINT_STATS("RX HP out_of_sync: %d", soc->stats.rx.hp_oos2);
5467 	DP_PRINT_STATS("RX Reap Loop Pkt Limit Hit: %d",
5468 		       soc->stats.rx.reap_loop_pkt_limit_hit);
5469 	DP_PRINT_STATS("RX DESC invalid magic: %u",
5470 		       soc->stats.rx.err.rx_desc_invalid_magic);
5471 	DP_PRINT_STATS("RX DUP DESC: %d",
5472 		       soc->stats.rx.err.hal_reo_dest_dup);
5473 	DP_PRINT_STATS("RX REL DUP DESC: %d",
5474 		       soc->stats.rx.err.hal_wbm_rel_dup);
5475 
5476 	DP_PRINT_STATS("RXDMA ERR DUP DESC: %d",
5477 		       soc->stats.rx.err.hal_rxdma_err_dup);
5478 
5479 	for (i = 0; i < HAL_RXDMA_ERR_MAX; i++) {
5480 		index += qdf_snprint(&rxdma_error[index],
5481 				DP_RXDMA_ERR_LENGTH - index,
5482 				" %d", soc->stats.rx.err.rxdma_error[i]);
5483 	}
5484 	DP_PRINT_STATS("RXDMA Error (0-31):%s", rxdma_error);
5485 
5486 	index = 0;
5487 	for (i = 0; i < HAL_REO_ERR_MAX; i++) {
5488 		index += qdf_snprint(&reo_error[index],
5489 				DP_REO_ERR_LENGTH - index,
5490 				" %d", soc->stats.rx.err.reo_error[i]);
5491 	}
5492 	DP_PRINT_STATS("REO Error(0-14):%s", reo_error);
5493 }
5494 
5495