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