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