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