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