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