xref: /wlan-dirver/qca-wifi-host-cmn/dp/wifi3.0/dp_stats.c (revision f28396d060cff5c6519f883cb28ae0116ce479f1)
1 /*
2  * Copyright (c) 2017-2020 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for
5  * any purpose with or without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 #include "qdf_types.h"
19 #include "dp_peer.h"
20 #include "dp_types.h"
21 #include "dp_internal.h"
22 #include "htt_stats.h"
23 #include "htt_ppdu_stats.h"
24 #include "dp_htt.h"
25 
26 #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 #ifdef VDEV_PEER_PROTOCOL_COUNT
4045 #ifdef VDEV_PEER_PROTOCOL_COUNT_TESTING
4046 static QDF_STATUS dp_peer_stats_update_protocol_test_cnt(struct dp_vdev *vdev,
4047 							 bool is_egress,
4048 							 bool is_rx)
4049 {
4050 	int mask;
4051 
4052 	if (is_egress)
4053 		if (is_rx)
4054 			mask = VDEV_PEER_PROTOCOL_RX_EGRESS_MASK;
4055 		else
4056 			mask = VDEV_PEER_PROTOCOL_TX_EGRESS_MASK;
4057 	else
4058 		if (is_rx)
4059 			mask = VDEV_PEER_PROTOCOL_RX_INGRESS_MASK;
4060 		else
4061 			mask = VDEV_PEER_PROTOCOL_TX_INGRESS_MASK;
4062 
4063 	if (qdf_unlikely(vdev->peer_protocol_count_dropmask & mask)) {
4064 		dp_info("drop mask set %x", vdev->peer_protocol_count_dropmask);
4065 		return QDF_STATUS_SUCCESS;
4066 	}
4067 	return QDF_STATUS_E_FAILURE;
4068 }
4069 
4070 #else
4071 static QDF_STATUS dp_peer_stats_update_protocol_test_cnt(struct dp_vdev *vdev,
4072 							 bool is_egress,
4073 							 bool is_rx)
4074 {
4075 	return QDF_STATUS_E_FAILURE;
4076 }
4077 #endif
4078 
4079 void dp_vdev_peer_stats_update_protocol_cnt(struct dp_vdev *vdev,
4080 					    qdf_nbuf_t nbuf,
4081 					    struct dp_peer *peer,
4082 					    bool is_egress,
4083 					    bool is_rx)
4084 {
4085 	struct cdp_peer_stats *peer_stats;
4086 	struct protocol_trace_count *protocol_trace_cnt;
4087 	enum cdp_protocol_trace prot;
4088 	struct dp_soc *soc;
4089 	struct ether_header *eh;
4090 	char *mac;
4091 	bool new_peer_ref = false;
4092 
4093 	if (qdf_likely(!vdev->peer_protocol_count_track))
4094 		return;
4095 	if (qdf_unlikely(dp_peer_stats_update_protocol_test_cnt(vdev,
4096 								is_egress,
4097 								is_rx) ==
4098 					       QDF_STATUS_SUCCESS))
4099 		return;
4100 
4101 	soc = vdev->pdev->soc;
4102 	eh = (struct ether_header *)qdf_nbuf_data(nbuf);
4103 	if (is_rx)
4104 		mac = eh->ether_shost;
4105 	else
4106 		mac = eh->ether_dhost;
4107 
4108 	if (!peer) {
4109 		peer = dp_peer_find_hash_find(soc, mac, 0, vdev->vdev_id);
4110 		new_peer_ref = true;
4111 		if (!peer)
4112 			return;
4113 	}
4114 	peer_stats = &peer->stats;
4115 
4116 	if (qdf_nbuf_is_icmp_pkt(nbuf) == true)
4117 		prot = CDP_TRACE_ICMP;
4118 	else if (qdf_nbuf_is_ipv4_arp_pkt(nbuf) == true)
4119 		prot = CDP_TRACE_ARP;
4120 	else if (qdf_nbuf_is_ipv4_eapol_pkt(nbuf) == true)
4121 		prot = CDP_TRACE_EAP;
4122 	else
4123 		goto dp_vdev_peer_stats_update_protocol_cnt_free_peer;
4124 
4125 	if (is_rx)
4126 		protocol_trace_cnt = peer_stats->rx.protocol_trace_cnt;
4127 	else
4128 		protocol_trace_cnt = peer_stats->tx.protocol_trace_cnt;
4129 
4130 	if (is_egress)
4131 		protocol_trace_cnt[prot].egress_cnt++;
4132 	else
4133 		protocol_trace_cnt[prot].ingress_cnt++;
4134 dp_vdev_peer_stats_update_protocol_cnt_free_peer:
4135 	if (new_peer_ref)
4136 		dp_peer_unref_delete(peer);
4137 }
4138 
4139 void dp_peer_stats_update_protocol_cnt(struct cdp_soc_t *soc,
4140 				       int8_t vdev_id,
4141 				       qdf_nbuf_t nbuf,
4142 				       bool is_egress,
4143 				       bool is_rx)
4144 {
4145 	struct dp_vdev *vdev;
4146 
4147 	vdev = dp_get_vdev_from_soc_vdev_id_wifi3((struct dp_soc *)soc,
4148 						  vdev_id);
4149 	if (qdf_likely(!vdev->peer_protocol_count_track))
4150 		return;
4151 	dp_vdev_peer_stats_update_protocol_cnt(vdev, nbuf, NULL, is_egress,
4152 					       is_rx);
4153 }
4154 #endif
4155 
4156 QDF_STATUS dp_peer_stats_notify(struct dp_pdev *dp_pdev, struct dp_peer *peer)
4157 {
4158 	struct cdp_interface_peer_stats peer_stats_intf;
4159 	struct cdp_peer_stats *peer_stats = &peer->stats;
4160 
4161 	if (!peer->vdev)
4162 		return QDF_STATUS_E_FAULT;
4163 
4164 	qdf_mem_zero(&peer_stats_intf, sizeof(peer_stats_intf));
4165 	if (peer_stats->rx.last_rssi != peer_stats->rx.rssi)
4166 		peer_stats_intf.rssi_changed = true;
4167 
4168 	if ((peer_stats->rx.rssi && peer_stats_intf.rssi_changed) ||
4169 	    (peer_stats->tx.tx_rate &&
4170 	     peer_stats->tx.tx_rate != peer_stats->tx.last_tx_rate)) {
4171 		qdf_mem_copy(peer_stats_intf.peer_mac, peer->mac_addr.raw,
4172 			     QDF_MAC_ADDR_SIZE);
4173 		peer_stats_intf.vdev_id = peer->vdev->vdev_id;
4174 		peer_stats_intf.last_peer_tx_rate = peer_stats->tx.last_tx_rate;
4175 		peer_stats_intf.peer_tx_rate = peer_stats->tx.tx_rate;
4176 		peer_stats_intf.peer_rssi = peer_stats->rx.rssi;
4177 		peer_stats_intf.tx_packet_count = peer_stats->tx.ucast.num;
4178 		peer_stats_intf.rx_packet_count = peer_stats->rx.to_stack.num;
4179 		peer_stats_intf.tx_byte_count = peer_stats->tx.tx_success.bytes;
4180 		peer_stats_intf.rx_byte_count = peer_stats->rx.to_stack.bytes;
4181 		peer_stats_intf.per = peer_stats->tx.last_per;
4182 		peer_stats_intf.ack_rssi = peer_stats->tx.last_ack_rssi;
4183 		dp_wdi_event_handler(WDI_EVENT_PEER_STATS, dp_pdev->soc,
4184 				     (void *)&peer_stats_intf, 0,
4185 				     WDI_NO_VAL, dp_pdev->pdev_id);
4186 	}
4187 
4188 	return QDF_STATUS_SUCCESS;
4189 }
4190 
4191 #ifdef QCA_ENH_V3_STATS_SUPPORT
4192 /**
4193  * dp_vow_str_fw_to_hw_delay() - Return string for a delay
4194  * @index: Index of delay
4195  *
4196  * Return: char const pointer
4197  */
4198 static inline const char *dp_vow_str_fw_to_hw_delay(uint8_t index)
4199 {
4200 	if (index > CDP_DELAY_BUCKET_MAX) {
4201 		return "Invalid index";
4202 	}
4203 	return fw_to_hw_delay_bucket[index];
4204 }
4205 
4206 /**
4207  * dp_vow_str_sw_enq_delay() - Return string for a delay
4208  * @index: Index of delay
4209  *
4210  * Return: char const pointer
4211  */
4212 static inline const char *dp_vow_str_sw_enq_delay(uint8_t index)
4213 {
4214 	if (index > CDP_DELAY_BUCKET_MAX) {
4215 		return "Invalid index";
4216 	}
4217 	return sw_enq_delay_bucket[index];
4218 }
4219 
4220 /**
4221  * dp_vow_str_intfrm_delay() - Return string for a delay
4222  * @index: Index of delay
4223  *
4224  * Return: char const pointer
4225  */
4226 static inline const char *dp_vow_str_intfrm_delay(uint8_t index)
4227 {
4228 	if (index > CDP_DELAY_BUCKET_MAX) {
4229 		return "Invalid index";
4230 	}
4231 	return intfrm_delay_bucket[index];
4232 }
4233 
4234 /**
4235  * dp_accumulate_delay_stats() - Update delay stats members
4236  * @total: Update stats total structure
4237  * @per_ring: per ring structures from where stats need to be accumulated
4238  *
4239  * Return: void
4240  */
4241 static void
4242 dp_accumulate_delay_stats(struct cdp_delay_stats *total,
4243 			  struct cdp_delay_stats *per_ring)
4244 {
4245 	uint8_t index;
4246 
4247 	for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++)
4248 		total->delay_bucket[index] += per_ring->delay_bucket[index];
4249 	total->min_delay = QDF_MIN(total->min_delay, per_ring->min_delay);
4250 	total->max_delay = QDF_MAX(total->max_delay, per_ring->max_delay);
4251 	total->avg_delay = (total->avg_delay + per_ring->avg_delay) / 2;
4252 }
4253 
4254 /**
4255  * dp_accumulate_tid_stats() - Accumulate TID stats from each ring
4256  * @pdev: pdev handle
4257  * @tid: traffic ID
4258  * @total_tx: fill this tx structure to get stats from all wbm rings
4259  * @total_rx: fill this rx structure to get stats from all reo rings
4260  * @type: delay stats or regular frame counters
4261  *
4262  * Return: void
4263  */
4264 static void
4265 dp_accumulate_tid_stats(struct dp_pdev *pdev, uint8_t tid,
4266 			struct cdp_tid_tx_stats *total_tx,
4267 			struct cdp_tid_rx_stats *total_rx, uint8_t type)
4268 {
4269 	uint8_t ring_id = 0, drop = 0, tqm_status_idx = 0, htt_status_idx = 0;
4270 	struct cdp_tid_stats *tid_stats = &pdev->stats.tid_stats;
4271 	struct cdp_tid_tx_stats *per_ring_tx = NULL;
4272 	struct cdp_tid_rx_stats *per_ring_rx = NULL;
4273 
4274 	if (wlan_cfg_get_dp_soc_nss_cfg(pdev->soc->wlan_cfg_ctx)) {
4275 		qdf_mem_copy(total_tx, &tid_stats->tid_tx_stats[0][tid],
4276 			     sizeof(struct cdp_tid_tx_stats));
4277 		qdf_mem_copy(total_rx, &tid_stats->tid_rx_stats[0][tid],
4278 			     sizeof(struct cdp_tid_rx_stats));
4279 		return;
4280 	} else {
4281 		qdf_mem_zero(total_tx, sizeof(struct cdp_tid_tx_stats));
4282 		qdf_mem_zero(total_rx, sizeof(struct cdp_tid_rx_stats));
4283 	}
4284 
4285 	switch (type) {
4286 	case TID_COUNTER_STATS:
4287 	{
4288 		for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) {
4289 			per_ring_tx = &tid_stats->tid_tx_stats[ring_id][tid];
4290 			total_tx->success_cnt += per_ring_tx->success_cnt;
4291 			for (tqm_status_idx = 0; tqm_status_idx < CDP_MAX_TX_TQM_STATUS; tqm_status_idx++) {
4292 				total_tx->tqm_status_cnt[tqm_status_idx] +=
4293 					per_ring_tx->tqm_status_cnt[tqm_status_idx];
4294 			}
4295 
4296 			for (htt_status_idx = 0; htt_status_idx < CDP_MAX_TX_HTT_STATUS; htt_status_idx++) {
4297 				total_tx->htt_status_cnt[htt_status_idx] +=
4298 					per_ring_tx->htt_status_cnt[htt_status_idx];
4299 			}
4300 
4301 			for (drop = 0; drop < TX_MAX_DROP; drop++)
4302 				total_tx->swdrop_cnt[drop] +=
4303 					per_ring_tx->swdrop_cnt[drop];
4304 		}
4305 		for (ring_id = 0; ring_id < CDP_MAX_RX_RINGS; ring_id++) {
4306 			per_ring_rx = &tid_stats->tid_rx_stats[ring_id][tid];
4307 			total_rx->delivered_to_stack +=
4308 				per_ring_rx->delivered_to_stack;
4309 			total_rx->intrabss_cnt += per_ring_rx->intrabss_cnt;
4310 			total_rx->msdu_cnt += per_ring_rx->msdu_cnt;
4311 			total_rx->mcast_msdu_cnt += per_ring_rx->mcast_msdu_cnt;
4312 			total_rx->bcast_msdu_cnt += per_ring_rx->bcast_msdu_cnt;
4313 			for (drop = 0; drop < RX_MAX_DROP; drop++)
4314 				total_rx->fail_cnt[drop] +=
4315 					per_ring_rx->fail_cnt[drop];
4316 		}
4317 		break;
4318 	}
4319 
4320 	case TID_DELAY_STATS:
4321 	{
4322 		for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) {
4323 			per_ring_tx = &tid_stats->tid_tx_stats[ring_id][tid];
4324 			dp_accumulate_delay_stats(&total_tx->swq_delay,
4325 						  &per_ring_tx->swq_delay);
4326 			dp_accumulate_delay_stats(&total_tx->hwtx_delay,
4327 						  &per_ring_tx->hwtx_delay);
4328 			dp_accumulate_delay_stats(&total_tx->intfrm_delay,
4329 						  &per_ring_tx->intfrm_delay);
4330 		}
4331 		for (ring_id = 0; ring_id < CDP_MAX_RX_RINGS; ring_id++) {
4332 			per_ring_rx = &tid_stats->tid_rx_stats[ring_id][tid];
4333 			dp_accumulate_delay_stats(&total_rx->intfrm_delay,
4334 						  &per_ring_rx->intfrm_delay);
4335 			dp_accumulate_delay_stats(&total_rx->to_stack_delay,
4336 						  &per_ring_rx->to_stack_delay);
4337 		}
4338 		break;
4339 	}
4340 
4341 	default:
4342 		qdf_err("Invalid stats type");
4343 		break;
4344 	}
4345 }
4346 
4347 void dp_pdev_print_tid_stats(struct dp_pdev *pdev)
4348 {
4349 	struct cdp_tid_tx_stats total_tx;
4350 	struct cdp_tid_rx_stats total_rx;
4351 	uint8_t tid, tqm_status_idx, htt_status_idx;
4352 
4353 	DP_PRINT_STATS("Packets received in hardstart: %llu ",
4354 			pdev->stats.tid_stats.ingress_stack);
4355 	DP_PRINT_STATS("Packets dropped in osif layer: %llu ",
4356 			pdev->stats.tid_stats.osif_drop);
4357 	DP_PRINT_STATS("Per TID Video Stats:\n");
4358 
4359 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
4360 		dp_accumulate_tid_stats(pdev, tid, &total_tx, &total_rx,
4361 					TID_COUNTER_STATS);
4362 		DP_PRINT_STATS("----TID: %d----", tid);
4363 		DP_PRINT_STATS("Tx TQM Success Count: %llu",
4364 				total_tx.tqm_status_cnt[HAL_TX_TQM_RR_FRAME_ACKED]);
4365 		DP_PRINT_STATS("Tx HTT Success Count: %llu",
4366 				total_tx.htt_status_cnt[HTT_TX_FW2WBM_TX_STATUS_OK]);
4367 		for (tqm_status_idx = 1; tqm_status_idx < CDP_MAX_TX_TQM_STATUS; tqm_status_idx++) {
4368 			if (total_tx.tqm_status_cnt[tqm_status_idx]) {
4369 				DP_PRINT_STATS("Tx TQM Drop Count[%d]: %llu",
4370 						tqm_status_idx, total_tx.tqm_status_cnt[tqm_status_idx]);
4371 			}
4372 		}
4373 
4374 		for (htt_status_idx = 1; htt_status_idx < CDP_MAX_TX_HTT_STATUS; htt_status_idx++) {
4375 			if (total_tx.htt_status_cnt[htt_status_idx]) {
4376 				DP_PRINT_STATS("Tx HTT Drop Count[%d]: %llu",
4377 						htt_status_idx, total_tx.htt_status_cnt[htt_status_idx]);
4378 			}
4379 		}
4380 
4381 		DP_PRINT_STATS("Tx Hardware Drop Count: %llu",
4382 			       total_tx.swdrop_cnt[TX_HW_ENQUEUE]);
4383 		DP_PRINT_STATS("Tx Software Drop Count: %llu",
4384 			       total_tx.swdrop_cnt[TX_SW_ENQUEUE]);
4385 		DP_PRINT_STATS("Tx Descriptor Error Count: %llu",
4386 			       total_tx.swdrop_cnt[TX_DESC_ERR]);
4387 		DP_PRINT_STATS("Tx HAL Ring Error Count: %llu",
4388 			       total_tx.swdrop_cnt[TX_HAL_RING_ACCESS_ERR]);
4389 		DP_PRINT_STATS("Tx Dma Map Error Count: %llu",
4390 			       total_tx.swdrop_cnt[TX_DMA_MAP_ERR]);
4391 		DP_PRINT_STATS("Rx Delievered Count: %llu",
4392 			       total_rx.delivered_to_stack);
4393 		DP_PRINT_STATS("Rx Software Enqueue Drop Count: %llu",
4394 			       total_rx.fail_cnt[ENQUEUE_DROP]);
4395 		DP_PRINT_STATS("Rx Intrabss Drop Count: %llu",
4396 			       total_rx.fail_cnt[INTRABSS_DROP]);
4397 		DP_PRINT_STATS("Rx Msdu Done Failure Count: %llu",
4398 			       total_rx.fail_cnt[MSDU_DONE_FAILURE]);
4399 		DP_PRINT_STATS("Rx Invalid Peer Count: %llu",
4400 			       total_rx.fail_cnt[INVALID_PEER_VDEV]);
4401 		DP_PRINT_STATS("Rx Policy Check Drop Count: %llu",
4402 			       total_rx.fail_cnt[POLICY_CHECK_DROP]);
4403 		DP_PRINT_STATS("Rx Mec Drop Count: %llu",
4404 			       total_rx.fail_cnt[MEC_DROP]);
4405 		DP_PRINT_STATS("Rx Nawds Mcast Drop Count: %llu",
4406 			       total_rx.fail_cnt[NAWDS_MCAST_DROP]);
4407 		DP_PRINT_STATS("Rx Mesh Filter Drop Count: %llu",
4408 			       total_rx.fail_cnt[MESH_FILTER_DROP]);
4409 		DP_PRINT_STATS("Rx Intra Bss Deliver Count: %llu",
4410 			       total_rx.intrabss_cnt);
4411 		DP_PRINT_STATS("Rx MSDU Count: %llu", total_rx.msdu_cnt);
4412 		DP_PRINT_STATS("Rx Multicast MSDU Count: %llu",
4413 			       total_rx.mcast_msdu_cnt);
4414 		DP_PRINT_STATS("Rx Broadcast MSDU Count: %llu\n",
4415 			       total_rx.bcast_msdu_cnt);
4416 	}
4417 }
4418 
4419 void dp_pdev_print_delay_stats(struct dp_pdev *pdev)
4420 {
4421 	struct dp_soc *soc = pdev->soc;
4422 	struct cdp_tid_tx_stats total_tx;
4423 	struct cdp_tid_rx_stats total_rx;
4424 	struct cdp_tid_stats *tid_stats;
4425 
4426 	uint8_t tid, index;
4427 	uint64_t count = 0;
4428 
4429 	if (!soc)
4430 		return;
4431 
4432 	tid = 0;
4433 	index = 0;
4434 	tid_stats = &pdev->stats.tid_stats;
4435 
4436 	DP_PRINT_STATS("Per TID Delay Non-Zero Stats:\n");
4437 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
4438 		dp_accumulate_tid_stats(pdev, tid, &total_tx, &total_rx,
4439 					TID_DELAY_STATS);
4440 		DP_PRINT_STATS("----TID: %d----", tid);
4441 
4442 		DP_PRINT_STATS("Software Enqueue Delay:");
4443 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
4444 			count = total_tx.swq_delay.delay_bucket[index];
4445 			if (count) {
4446 				DP_PRINT_STATS("%s:  Packets = %llu",
4447 					       dp_vow_str_sw_enq_delay(index),
4448 					       count);
4449 			}
4450 		}
4451 
4452 		DP_PRINT_STATS("Min = %u", total_tx.swq_delay.min_delay);
4453 		DP_PRINT_STATS("Max = %u", total_tx.swq_delay.max_delay);
4454 		DP_PRINT_STATS("Avg = %u\n", total_tx.swq_delay.avg_delay);
4455 
4456 		DP_PRINT_STATS("Hardware Transmission Delay:");
4457 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
4458 			count = total_tx.hwtx_delay.delay_bucket[index];
4459 			if (count) {
4460 				DP_PRINT_STATS("%s:  Packets = %llu",
4461 					       dp_vow_str_fw_to_hw_delay(index),
4462 					       count);
4463 			}
4464 		}
4465 		DP_PRINT_STATS("Min = %u", total_tx.hwtx_delay.min_delay);
4466 		DP_PRINT_STATS("Max = %u", total_tx.hwtx_delay.max_delay);
4467 		DP_PRINT_STATS("Avg = %u\n", total_tx.hwtx_delay.avg_delay);
4468 
4469 		DP_PRINT_STATS("Tx Interframe Delay:");
4470 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
4471 			count = total_tx.intfrm_delay.delay_bucket[index];
4472 			if (count) {
4473 				DP_PRINT_STATS("%s:  Packets = %llu",
4474 					       dp_vow_str_intfrm_delay(index),
4475 					       count);
4476 			}
4477 		}
4478 		DP_PRINT_STATS("Min = %u", total_tx.intfrm_delay.min_delay);
4479 		DP_PRINT_STATS("Max = %u", total_tx.intfrm_delay.max_delay);
4480 		DP_PRINT_STATS("Avg = %u\n", total_tx.intfrm_delay.avg_delay);
4481 
4482 		DP_PRINT_STATS("Rx Interframe Delay:");
4483 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
4484 			count = total_rx.intfrm_delay.delay_bucket[index];
4485 			if (count) {
4486 				DP_PRINT_STATS("%s:  Packets = %llu",
4487 					       dp_vow_str_intfrm_delay(index),
4488 					       count);
4489 			}
4490 		}
4491 		DP_PRINT_STATS("Min = %u", total_rx.intfrm_delay.min_delay);
4492 		DP_PRINT_STATS("Max = %u", total_rx.intfrm_delay.max_delay);
4493 		DP_PRINT_STATS("Avg = %u\n", total_rx.intfrm_delay.avg_delay);
4494 
4495 		DP_PRINT_STATS("Rx Reap to Stack Delay:");
4496 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
4497 			count = total_rx.to_stack_delay.delay_bucket[index];
4498 			if (count) {
4499 				DP_PRINT_STATS("%s:  Packets = %llu",
4500 					       dp_vow_str_intfrm_delay(index),
4501 					       count);
4502 			}
4503 		}
4504 
4505 		DP_PRINT_STATS("Min = %u", total_rx.to_stack_delay.min_delay);
4506 		DP_PRINT_STATS("Max = %u", total_rx.to_stack_delay.max_delay);
4507 		DP_PRINT_STATS("Avg = %u\n", total_rx.to_stack_delay.avg_delay);
4508 	}
4509 }
4510 #endif
4511 
4512 void dp_print_soc_cfg_params(struct dp_soc *soc)
4513 {
4514 	struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx;
4515 	uint8_t index = 0, i = 0;
4516 	char ring_mask[DP_MAX_INT_CONTEXTS_STRING_LENGTH];
4517 	int num_of_int_contexts;
4518 
4519 	if (!soc) {
4520 		dp_err("Context is null");
4521 		return;
4522 	}
4523 
4524 	soc_cfg_ctx = soc->wlan_cfg_ctx;
4525 
4526 	if (!soc_cfg_ctx) {
4527 		dp_err("Context is null");
4528 		return;
4529 	}
4530 
4531 	num_of_int_contexts =
4532 			wlan_cfg_get_num_contexts(soc_cfg_ctx);
4533 
4534 	DP_PRINT_STATS("No. of interrupt contexts: %u",
4535 		       soc_cfg_ctx->num_int_ctxts);
4536 	DP_PRINT_STATS("Max clients: %u",
4537 		       soc_cfg_ctx->max_clients);
4538 	DP_PRINT_STATS("Max alloc size: %u ",
4539 		       soc_cfg_ctx->max_alloc_size);
4540 	DP_PRINT_STATS("Per pdev tx ring: %u ",
4541 		       soc_cfg_ctx->per_pdev_tx_ring);
4542 	DP_PRINT_STATS("Num tcl data rings: %u ",
4543 		       soc_cfg_ctx->num_tcl_data_rings);
4544 	DP_PRINT_STATS("Per pdev rx ring: %u ",
4545 		       soc_cfg_ctx->per_pdev_rx_ring);
4546 	DP_PRINT_STATS("Per pdev lmac ring: %u ",
4547 		       soc_cfg_ctx->per_pdev_lmac_ring);
4548 	DP_PRINT_STATS("Num of reo dest rings: %u ",
4549 		       soc_cfg_ctx->num_reo_dest_rings);
4550 	DP_PRINT_STATS("Num tx desc pool: %u ",
4551 		       soc_cfg_ctx->num_tx_desc_pool);
4552 	DP_PRINT_STATS("Num tx ext desc pool: %u ",
4553 		       soc_cfg_ctx->num_tx_ext_desc_pool);
4554 	DP_PRINT_STATS("Num tx desc: %u ",
4555 		       soc_cfg_ctx->num_tx_desc);
4556 	DP_PRINT_STATS("Num tx ext desc: %u ",
4557 		       soc_cfg_ctx->num_tx_ext_desc);
4558 	DP_PRINT_STATS("Htt packet type: %u ",
4559 		       soc_cfg_ctx->htt_packet_type);
4560 	DP_PRINT_STATS("Max peer_ids: %u ",
4561 		       soc_cfg_ctx->max_peer_id);
4562 	DP_PRINT_STATS("Tx ring size: %u ",
4563 		       soc_cfg_ctx->tx_ring_size);
4564 	DP_PRINT_STATS("Tx comp ring size: %u ",
4565 		       soc_cfg_ctx->tx_comp_ring_size);
4566 	DP_PRINT_STATS("Tx comp ring size nss: %u ",
4567 		       soc_cfg_ctx->tx_comp_ring_size_nss);
4568 	DP_PRINT_STATS("Int batch threshold tx: %u ",
4569 		       soc_cfg_ctx->int_batch_threshold_tx);
4570 	DP_PRINT_STATS("Int timer threshold tx: %u ",
4571 		       soc_cfg_ctx->int_timer_threshold_tx);
4572 	DP_PRINT_STATS("Int batch threshold rx: %u ",
4573 		       soc_cfg_ctx->int_batch_threshold_rx);
4574 	DP_PRINT_STATS("Int timer threshold rx: %u ",
4575 		       soc_cfg_ctx->int_timer_threshold_rx);
4576 	DP_PRINT_STATS("Int batch threshold other: %u ",
4577 		       soc_cfg_ctx->int_batch_threshold_other);
4578 	DP_PRINT_STATS("Int timer threshold other: %u ",
4579 		       soc_cfg_ctx->int_timer_threshold_other);
4580 
4581 	for (i = 0; i < num_of_int_contexts; i++) {
4582 		index += qdf_snprint(&ring_mask[index],
4583 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
4584 				     " %d",
4585 				     soc_cfg_ctx->int_tx_ring_mask[i]);
4586 	}
4587 
4588 	DP_PRINT_STATS("Tx ring mask (0-%d):%s",
4589 		       num_of_int_contexts, ring_mask);
4590 
4591 	index = 0;
4592 	for (i = 0; i < num_of_int_contexts; i++) {
4593 		index += qdf_snprint(&ring_mask[index],
4594 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
4595 				     " %d",
4596 				     soc_cfg_ctx->int_rx_ring_mask[i]);
4597 	}
4598 
4599 	DP_PRINT_STATS("Rx ring mask (0-%d):%s",
4600 		       num_of_int_contexts, ring_mask);
4601 
4602 	index = 0;
4603 	for (i = 0; i < num_of_int_contexts; i++) {
4604 		index += qdf_snprint(&ring_mask[index],
4605 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
4606 				     " %d",
4607 				     soc_cfg_ctx->int_rx_mon_ring_mask[i]);
4608 	}
4609 
4610 	DP_PRINT_STATS("Rx mon ring mask (0-%d):%s",
4611 		       num_of_int_contexts, ring_mask);
4612 
4613 	index = 0;
4614 	for (i = 0; i < num_of_int_contexts; i++) {
4615 		index += qdf_snprint(&ring_mask[index],
4616 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
4617 				     " %d",
4618 				     soc_cfg_ctx->int_rx_err_ring_mask[i]);
4619 	}
4620 
4621 	DP_PRINT_STATS("Rx err ring mask (0-%d):%s",
4622 		       num_of_int_contexts, ring_mask);
4623 
4624 	index = 0;
4625 	for (i = 0; i < num_of_int_contexts; i++) {
4626 		index += qdf_snprint(&ring_mask[index],
4627 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
4628 				     " %d",
4629 				     soc_cfg_ctx->int_rx_wbm_rel_ring_mask[i]);
4630 	}
4631 
4632 	DP_PRINT_STATS("Rx wbm rel ring mask (0-%d):%s",
4633 		       num_of_int_contexts, ring_mask);
4634 
4635 	index = 0;
4636 	for (i = 0; i < num_of_int_contexts; i++) {
4637 		index += qdf_snprint(&ring_mask[index],
4638 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
4639 				     " %d",
4640 				     soc_cfg_ctx->int_reo_status_ring_mask[i]);
4641 	}
4642 
4643 	DP_PRINT_STATS("Reo ring mask (0-%d):%s",
4644 		       num_of_int_contexts, ring_mask);
4645 
4646 	index = 0;
4647 	for (i = 0; i < num_of_int_contexts; i++) {
4648 		index += qdf_snprint(&ring_mask[index],
4649 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
4650 				     " %d",
4651 				     soc_cfg_ctx->int_rxdma2host_ring_mask[i]);
4652 	}
4653 
4654 	DP_PRINT_STATS("Rxdma2host ring mask (0-%d):%s",
4655 		       num_of_int_contexts, ring_mask);
4656 
4657 	index = 0;
4658 	for (i = 0; i < num_of_int_contexts; i++) {
4659 		index += qdf_snprint(&ring_mask[index],
4660 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
4661 				     " %d",
4662 				     soc_cfg_ctx->int_host2rxdma_ring_mask[i]);
4663 	}
4664 
4665 	DP_PRINT_STATS("Host2rxdma ring mask (0-%d):%s",
4666 		       num_of_int_contexts, ring_mask);
4667 
4668 	DP_PRINT_STATS("Rx hash: %u ",
4669 		       soc_cfg_ctx->rx_hash);
4670 	DP_PRINT_STATS("Tso enabled: %u ",
4671 		       soc_cfg_ctx->tso_enabled);
4672 	DP_PRINT_STATS("Lro enabled: %u ",
4673 		       soc_cfg_ctx->lro_enabled);
4674 	DP_PRINT_STATS("Sg enabled: %u ",
4675 		       soc_cfg_ctx->sg_enabled);
4676 	DP_PRINT_STATS("Gro enabled: %u ",
4677 		       soc_cfg_ctx->gro_enabled);
4678 	DP_PRINT_STATS("rawmode enabled: %u ",
4679 		       soc_cfg_ctx->rawmode_enabled);
4680 	DP_PRINT_STATS("peer flow ctrl enabled: %u ",
4681 		       soc_cfg_ctx->peer_flow_ctrl_enabled);
4682 	DP_PRINT_STATS("napi enabled: %u ",
4683 		       soc_cfg_ctx->napi_enabled);
4684 	DP_PRINT_STATS("Tcp Udp checksum offload: %u ",
4685 		       soc_cfg_ctx->tcp_udp_checksumoffload);
4686 	DP_PRINT_STATS("Defrag timeout check: %u ",
4687 		       soc_cfg_ctx->defrag_timeout_check);
4688 	DP_PRINT_STATS("Rx defrag min timeout: %u ",
4689 		       soc_cfg_ctx->rx_defrag_min_timeout);
4690 	DP_PRINT_STATS("WBM release ring: %u ",
4691 		       soc_cfg_ctx->wbm_release_ring);
4692 	DP_PRINT_STATS("TCL CMD ring: %u ",
4693 		       soc_cfg_ctx->tcl_cmd_ring);
4694 	DP_PRINT_STATS("TCL Status ring: %u ",
4695 		       soc_cfg_ctx->tcl_status_ring);
4696 	DP_PRINT_STATS("REO Reinject ring: %u ",
4697 		       soc_cfg_ctx->reo_reinject_ring);
4698 	DP_PRINT_STATS("RX release ring: %u ",
4699 		       soc_cfg_ctx->rx_release_ring);
4700 	DP_PRINT_STATS("REO Exception ring: %u ",
4701 		       soc_cfg_ctx->reo_exception_ring);
4702 	DP_PRINT_STATS("REO CMD ring: %u ",
4703 		       soc_cfg_ctx->reo_cmd_ring);
4704 	DP_PRINT_STATS("REO STATUS ring: %u ",
4705 		       soc_cfg_ctx->reo_status_ring);
4706 	DP_PRINT_STATS("RXDMA refill ring: %u ",
4707 		       soc_cfg_ctx->rxdma_refill_ring);
4708 	DP_PRINT_STATS("TX_desc limit_0: %u ",
4709 		       soc_cfg_ctx->tx_desc_limit_0);
4710 	DP_PRINT_STATS("TX_desc limit_1: %u ",
4711 		       soc_cfg_ctx->tx_desc_limit_1);
4712 	DP_PRINT_STATS("TX_desc limit_2: %u ",
4713 		       soc_cfg_ctx->tx_desc_limit_2);
4714 	DP_PRINT_STATS("TX device limit: %u ",
4715 		       soc_cfg_ctx->tx_device_limit);
4716 	DP_PRINT_STATS("TX sw internode queue: %u ",
4717 		       soc_cfg_ctx->tx_sw_internode_queue);
4718 	DP_PRINT_STATS("RXDMA err dst ring: %u ",
4719 		       soc_cfg_ctx->rxdma_err_dst_ring);
4720 	DP_PRINT_STATS("RX Flow Tag Enabled: %u ",
4721 		       soc_cfg_ctx->is_rx_flow_tag_enabled);
4722 	DP_PRINT_STATS("RX Flow Search Table Size (# of entries): %u ",
4723 		       soc_cfg_ctx->rx_flow_search_table_size);
4724 	DP_PRINT_STATS("RX Flow Search Table Per PDev : %u ",
4725 		       soc_cfg_ctx->is_rx_flow_search_table_per_pdev);
4726 }
4727 
4728 void
4729 dp_print_pdev_cfg_params(struct dp_pdev *pdev)
4730 {
4731 	struct wlan_cfg_dp_pdev_ctxt *pdev_cfg_ctx;
4732 
4733 	if (!pdev) {
4734 		dp_err("Context is null");
4735 		return;
4736 	}
4737 
4738 	pdev_cfg_ctx = pdev->wlan_cfg_ctx;
4739 
4740 	if (!pdev_cfg_ctx) {
4741 		dp_err("Context is null");
4742 		return;
4743 	}
4744 
4745 	DP_PRINT_STATS("Rx dma buf ring size: %d ",
4746 		       pdev_cfg_ctx->rx_dma_buf_ring_size);
4747 	DP_PRINT_STATS("DMA Mon buf ring size: %d ",
4748 		       pdev_cfg_ctx->dma_mon_buf_ring_size);
4749 	DP_PRINT_STATS("DMA Mon dest ring size: %d ",
4750 		       pdev_cfg_ctx->dma_mon_dest_ring_size);
4751 	DP_PRINT_STATS("DMA Mon status ring size: %d ",
4752 		       pdev_cfg_ctx->dma_mon_status_ring_size);
4753 	DP_PRINT_STATS("Rxdma monitor desc ring: %d",
4754 		       pdev_cfg_ctx->rxdma_monitor_desc_ring);
4755 	DP_PRINT_STATS("Num mac rings: %d ",
4756 		       pdev_cfg_ctx->num_mac_rings);
4757 }
4758 
4759 /**
4760  * dp_print_ring_stat_from_hal(): Print hal level ring stats
4761  * @soc: DP_SOC handle
4762  * @srng: DP_SRNG handle
4763  * @ring_name: SRNG name
4764  * @ring_type: srng src/dst ring
4765  *
4766  * Return: void
4767  */
4768 static void
4769 dp_print_ring_stat_from_hal(struct dp_soc *soc,  struct dp_srng *srng,
4770 			    enum hal_ring_type ring_type)
4771 {
4772 	uint32_t tailp;
4773 	uint32_t headp;
4774 	int32_t hw_headp = -1;
4775 	int32_t hw_tailp = -1;
4776 	const char *ring_name;
4777 	struct hal_soc *hal_soc;
4778 
4779 	if (soc && srng && srng->hal_srng) {
4780 		hal_soc = (struct hal_soc *)soc->hal_soc;
4781 		ring_name = dp_srng_get_str_from_hal_ring_type(ring_type);
4782 
4783 		hal_get_sw_hptp(soc->hal_soc, srng->hal_srng, &tailp, &headp);
4784 
4785 		DP_PRINT_STATS("%s:SW:Head pointer = %d Tail Pointer = %d\n",
4786 			       ring_name, headp, tailp);
4787 
4788 		hal_get_hw_hptp(soc->hal_soc, srng->hal_srng, &hw_headp,
4789 				&hw_tailp, ring_type);
4790 
4791 		DP_PRINT_STATS("%s:HW:Head pointer = %d Tail Pointer = %d\n",
4792 			       ring_name, hw_headp, hw_tailp);
4793 	}
4794 }
4795 
4796 #ifdef FEATURE_TSO_STATS
4797 /**
4798  * dp_print_tso_seg_stats - tso segment stats
4799  * @pdev: pdev handle
4800  * @id: tso packet id
4801  *
4802  * Return: None
4803  */
4804 static void dp_print_tso_seg_stats(struct dp_pdev *pdev, uint32_t id)
4805 {
4806 	uint8_t num_seg;
4807 	uint32_t segid;
4808 
4809 	/* TSO LEVEL 2 - SEGMENT INFO */
4810 	num_seg = pdev->stats.tso_stats.tso_info.tso_packet_info[id].num_seg;
4811 	for (segid = 0; segid < CDP_MAX_TSO_SEGMENTS && segid < num_seg; segid++) {
4812 		DP_PRINT_STATS(
4813 			  "Segment id:[%u] fragments: %u | Segment Length %u | TCP Seq no.: %u | ip_id: %u",
4814 			  segid,
4815 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
4816 			  .tso_seg[segid].num_frags,
4817 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
4818 			  .tso_seg[segid].total_len,
4819 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
4820 			  .tso_seg[segid].tso_flags.tcp_seq_num,
4821 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
4822 			  .tso_seg[segid].tso_flags.ip_id);
4823 		DP_PRINT_STATS(
4824 			  "fin: %u syn: %u rst: %u psh: %u ack: %u urg: %u ece: %u cwr: %u ns: %u",
4825 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
4826 			  .tso_seg[segid].tso_flags.fin,
4827 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
4828 			  .tso_seg[segid].tso_flags.syn,
4829 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
4830 			  .tso_seg[segid].tso_flags.rst,
4831 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
4832 			  .tso_seg[segid].tso_flags.psh,
4833 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
4834 			  .tso_seg[segid].tso_flags.ack,
4835 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
4836 			  .tso_seg[segid].tso_flags.urg,
4837 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
4838 			  .tso_seg[segid].tso_flags.ece,
4839 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
4840 			  .tso_seg[segid].tso_flags.cwr,
4841 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
4842 			  .tso_seg[segid].tso_flags.ns);
4843 	}
4844 }
4845 #else
4846 static inline
4847 void dp_print_tso_seg_stats(struct dp_pdev *pdev, uint32_t id)
4848 {
4849 }
4850 #endif /* FEATURE_TSO_STATS */
4851 
4852 /**
4853  * dp_print_mon_ring_stats_from_hal() - Print stat for monitor rings based
4854  *					on target
4855  * @pdev: physical device handle
4856  * @mac_id: mac id
4857  *
4858  * Return: void
4859  */
4860 static inline
4861 void dp_print_mon_ring_stat_from_hal(struct dp_pdev *pdev, uint8_t mac_id)
4862 {
4863 	if (pdev->soc->wlan_cfg_ctx->rxdma1_enable) {
4864 		dp_print_ring_stat_from_hal(pdev->soc,
4865 			&pdev->soc->rxdma_mon_buf_ring[mac_id],
4866 			RXDMA_MONITOR_BUF);
4867 		dp_print_ring_stat_from_hal(pdev->soc,
4868 			&pdev->soc->rxdma_mon_dst_ring[mac_id],
4869 			RXDMA_MONITOR_DST);
4870 		dp_print_ring_stat_from_hal(pdev->soc,
4871 			&pdev->soc->rxdma_mon_desc_ring[mac_id],
4872 			RXDMA_MONITOR_DESC);
4873 	}
4874 
4875 	dp_print_ring_stat_from_hal(pdev->soc,
4876 				    &pdev->soc->rxdma_mon_status_ring[mac_id],
4877 					RXDMA_MONITOR_STATUS);
4878 }
4879 
4880 void
4881 dp_print_ring_stats(struct dp_pdev *pdev)
4882 {
4883 	uint32_t i;
4884 	int mac_id;
4885 	int lmac_id;
4886 
4887 	if (hif_pm_runtime_get_sync(pdev->soc->hif_handle))
4888 		return;
4889 
4890 	dp_print_ring_stat_from_hal(pdev->soc,
4891 				    &pdev->soc->reo_exception_ring,
4892 				    REO_EXCEPTION);
4893 	dp_print_ring_stat_from_hal(pdev->soc,
4894 				    &pdev->soc->reo_reinject_ring,
4895 				    REO_REINJECT);
4896 	dp_print_ring_stat_from_hal(pdev->soc,
4897 				    &pdev->soc->reo_cmd_ring,
4898 				    REO_CMD);
4899 	dp_print_ring_stat_from_hal(pdev->soc,
4900 				    &pdev->soc->reo_status_ring,
4901 				    REO_STATUS);
4902 	dp_print_ring_stat_from_hal(pdev->soc,
4903 				    &pdev->soc->rx_rel_ring,
4904 				    WBM2SW_RELEASE);
4905 	dp_print_ring_stat_from_hal(pdev->soc,
4906 				    &pdev->soc->tcl_cmd_ring,
4907 				    TCL_CMD);
4908 	dp_print_ring_stat_from_hal(pdev->soc,
4909 				    &pdev->soc->tcl_status_ring,
4910 				    TCL_STATUS);
4911 	dp_print_ring_stat_from_hal(pdev->soc,
4912 				    &pdev->soc->wbm_desc_rel_ring,
4913 				    SW2WBM_RELEASE);
4914 	for (i = 0; i < MAX_REO_DEST_RINGS; i++)
4915 		dp_print_ring_stat_from_hal(pdev->soc,
4916 					    &pdev->soc->reo_dest_ring[i],
4917 					    REO_DST);
4918 
4919 	for (i = 0; i < pdev->soc->num_tcl_data_rings; i++)
4920 		dp_print_ring_stat_from_hal(pdev->soc,
4921 					    &pdev->soc->tcl_data_ring[i],
4922 					    TCL_DATA);
4923 	for (i = 0; i < MAX_TCL_DATA_RINGS; i++)
4924 		dp_print_ring_stat_from_hal(pdev->soc,
4925 					    &pdev->soc->tx_comp_ring[i],
4926 					    WBM2SW_RELEASE);
4927 
4928 	lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc, 0, pdev->pdev_id);
4929 	dp_print_ring_stat_from_hal(pdev->soc,
4930 				&pdev->soc->rx_refill_buf_ring[lmac_id],
4931 				RXDMA_BUF);
4932 
4933 	dp_print_ring_stat_from_hal(pdev->soc,
4934 				    &pdev->rx_refill_buf_ring2,
4935 				    RXDMA_BUF);
4936 
4937 	for (i = 0; i < MAX_RX_MAC_RINGS; i++)
4938 		dp_print_ring_stat_from_hal(pdev->soc,
4939 					    &pdev->rx_mac_buf_ring[i],
4940 					    RXDMA_BUF);
4941 
4942 	for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) {
4943 		lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc,
4944 						     mac_id, pdev->pdev_id);
4945 
4946 		dp_print_mon_ring_stat_from_hal(pdev, lmac_id);
4947 	}
4948 
4949 	for (i = 0; i < NUM_RXDMA_RINGS_PER_PDEV; i++)	{
4950 		lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc,
4951 						     i, pdev->pdev_id);
4952 
4953 		dp_print_ring_stat_from_hal(pdev->soc,
4954 					    &pdev->soc->rxdma_err_dst_ring
4955 					    [lmac_id],
4956 					    RXDMA_DST);
4957 	}
4958 	hif_pm_runtime_put(pdev->soc->hif_handle);
4959 }
4960 
4961 /**
4962  * dp_print_common_rates_info(): Print common rate for tx or rx
4963  * @pkt_type_array: rate type array contains rate info
4964  *
4965  * Return:void
4966  */
4967 static inline void
4968 dp_print_common_rates_info(struct cdp_pkt_type *pkt_type_array)
4969 {
4970 	uint8_t mcs, pkt_type;
4971 
4972 	DP_PRINT_STATS("MSDU Count");
4973 	for (pkt_type = 0; pkt_type < DOT11_MAX; pkt_type++) {
4974 		for (mcs = 0; mcs < MAX_MCS; mcs++) {
4975 			if (!dp_rate_string[pkt_type][mcs].valid)
4976 				continue;
4977 
4978 			DP_PRINT_STATS("	%s = %d",
4979 				       dp_rate_string[pkt_type][mcs].mcs_type,
4980 				       pkt_type_array[pkt_type].mcs_count[mcs]);
4981 		}
4982 
4983 		DP_PRINT_STATS("\n");
4984 	}
4985 }
4986 
4987 /**
4988  * dp_print_common_ppdu_rates_info(): Print common rate for tx or rx
4989  * @pkt_type_array: rate type array contains rate info
4990  *
4991  * Return:void
4992  */
4993 static inline void
4994 dp_print_common_ppdu_rates_info(struct cdp_pkt_type *pkt_type_array)
4995 {
4996 	uint8_t mcs;
4997 
4998 	DP_PRINT_STATS("PPDU Count");
4999 	for (mcs = 0; mcs < MAX_MCS; mcs++) {
5000 		if (!dp_ppdu_rate_string[0][mcs].valid)
5001 			continue;
5002 
5003 		DP_PRINT_STATS("	%s = %d",
5004 			       dp_ppdu_rate_string[0][mcs].mcs_type,
5005 			       pkt_type_array->mcs_count[mcs]);
5006 	}
5007 
5008 	DP_PRINT_STATS("\n");
5009 }
5010 
5011 /**
5012  * dp_print_mu_ppdu_rates_info(): Print mu rate for tx or rx
5013  * @rx_mu: rx MU stats array
5014  *
5015  * Return:void
5016  */
5017 static inline void
5018 dp_print_mu_ppdu_rates_info(struct cdp_rx_mu *rx_mu)
5019 {
5020 	uint8_t mcs, pkt_type;
5021 
5022 	DP_PRINT_STATS("PPDU Count");
5023 	for (pkt_type = 0; pkt_type < RX_TYPE_MU_MAX; pkt_type++) {
5024 		for (mcs = 0; mcs < MAX_MCS; mcs++) {
5025 			if (!dp_mu_rate_string[pkt_type][mcs].valid)
5026 				continue;
5027 
5028 			DP_PRINT_STATS("	%s = %d",
5029 				dp_mu_rate_string[pkt_type][mcs].mcs_type,
5030 				rx_mu[pkt_type].ppdu.mcs_count[mcs]);
5031 		}
5032 
5033 		DP_PRINT_STATS("\n");
5034 	}
5035 }
5036 
5037 void dp_print_rx_rates(struct dp_vdev *vdev)
5038 {
5039 	struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev;
5040 	uint8_t i;
5041 	uint8_t index = 0;
5042 	char nss[DP_NSS_LENGTH];
5043 
5044 	DP_PRINT_STATS("Rx Rate Info:\n");
5045 	dp_print_common_rates_info(pdev->stats.rx.pkt_type);
5046 
5047 	index = 0;
5048 	for (i = 0; i < SS_COUNT; i++) {
5049 		index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index,
5050 				     " %d", pdev->stats.rx.nss[i]);
5051 	}
5052 	DP_PRINT_STATS("NSS(1-8) = %s",
5053 		       nss);
5054 
5055 	DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
5056 		       pdev->stats.rx.sgi_count[0],
5057 		       pdev->stats.rx.sgi_count[1],
5058 		       pdev->stats.rx.sgi_count[2],
5059 		       pdev->stats.rx.sgi_count[3]);
5060 	DP_PRINT_STATS("BW Counts = 20MHZ %d, 40MHZ %d, 80MHZ %d, 160MHZ %d",
5061 		       pdev->stats.rx.bw[0], pdev->stats.rx.bw[1],
5062 		       pdev->stats.rx.bw[2], pdev->stats.rx.bw[3]);
5063 	DP_PRINT_STATS("Reception Type ="
5064 		       "SU: %d MU_MIMO:%d MU_OFDMA:%d MU_OFDMA_MIMO:%d",
5065 		       pdev->stats.rx.reception_type[0],
5066 		       pdev->stats.rx.reception_type[1],
5067 		       pdev->stats.rx.reception_type[2],
5068 		       pdev->stats.rx.reception_type[3]);
5069 	DP_PRINT_STATS("Aggregation:\n");
5070 	DP_PRINT_STATS("Number of Msdu's Part of Ampdus = %d",
5071 		       pdev->stats.rx.ampdu_cnt);
5072 	DP_PRINT_STATS("Number of Msdu's With No Mpdu Level Aggregation : %d",
5073 		       pdev->stats.rx.non_ampdu_cnt);
5074 	DP_PRINT_STATS("Number of Msdu's Part of Amsdu: %d",
5075 		       pdev->stats.rx.amsdu_cnt);
5076 	DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation: %d",
5077 		       pdev->stats.rx.non_amsdu_cnt);
5078 }
5079 
5080 void dp_print_tx_rates(struct dp_vdev *vdev)
5081 {
5082 	struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev;
5083 
5084 	DP_PRINT_STATS("Tx Rate Info:\n");
5085 	dp_print_common_rates_info(pdev->stats.tx.pkt_type);
5086 
5087 	DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
5088 		       pdev->stats.tx.sgi_count[0],
5089 		       pdev->stats.tx.sgi_count[1],
5090 		       pdev->stats.tx.sgi_count[2],
5091 		       pdev->stats.tx.sgi_count[3]);
5092 
5093 	DP_PRINT_STATS("BW Counts = 20MHZ %d, 40MHZ %d, 80MHZ %d, 160MHZ %d",
5094 		       pdev->stats.tx.bw[0], pdev->stats.tx.bw[1],
5095 		       pdev->stats.tx.bw[2], pdev->stats.tx.bw[3]);
5096 
5097 	DP_PRINT_STATS("OFDMA = %d", pdev->stats.tx.ofdma);
5098 	DP_PRINT_STATS("STBC = %d", pdev->stats.tx.stbc);
5099 	DP_PRINT_STATS("LDPC = %d", pdev->stats.tx.ldpc);
5100 	DP_PRINT_STATS("Retries = %d", pdev->stats.tx.retries);
5101 	DP_PRINT_STATS("Last ack rssi = %d\n", pdev->stats.tx.last_ack_rssi);
5102 
5103 	DP_PRINT_STATS("Aggregation:\n");
5104 	DP_PRINT_STATS("Number of Msdu's Part of Ampdus = %d",
5105 		       pdev->stats.tx.ampdu_cnt);
5106 	DP_PRINT_STATS("Number of Msdu's With No Mpdu Level Aggregation : %d",
5107 		       pdev->stats.tx.non_ampdu_cnt);
5108 	DP_PRINT_STATS("Number of Msdu's Part of Amsdu = %d",
5109 		       pdev->stats.tx.amsdu_cnt);
5110 	DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation = %d",
5111 		       pdev->stats.tx.non_amsdu_cnt);
5112 }
5113 
5114 /**
5115  * dp_print_nss(): Print nss count
5116  * @nss: printable nss count array
5117  * @pnss: nss count array
5118  * @ss_count: number of nss
5119  *
5120  * Return:void
5121  */
5122 static void dp_print_nss(char *nss, uint32_t *pnss, uint32_t ss_count)
5123 {
5124 	uint32_t index;
5125 	uint8_t i;
5126 
5127 	index = 0;
5128 	for (i = 0; i < ss_count; i++) {
5129 		index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index,
5130 				     " %d", *(pnss + i));
5131 	}
5132 }
5133 
5134 void dp_print_peer_stats(struct dp_peer *peer)
5135 {
5136 	uint8_t i;
5137 	uint32_t index;
5138 	uint32_t j;
5139 	char nss[DP_NSS_LENGTH];
5140 	char mu_group_id[DP_MU_GROUP_LENGTH];
5141 	struct dp_pdev *pdev;
5142 	uint32_t *pnss;
5143 	enum cdp_mu_packet_type rx_mu_type;
5144 	struct cdp_rx_mu *rx_mu;
5145 
5146 	pdev = peer->vdev->pdev;
5147 
5148 	DP_PRINT_STATS("Node Tx Stats:\n");
5149 	DP_PRINT_STATS("Total Packet Completions = %d",
5150 		       peer->stats.tx.comp_pkt.num);
5151 	DP_PRINT_STATS("Total Bytes Completions = %llu",
5152 		       peer->stats.tx.comp_pkt.bytes);
5153 	DP_PRINT_STATS("Success Packets = %d",
5154 		       peer->stats.tx.tx_success.num);
5155 	DP_PRINT_STATS("Success Bytes = %llu",
5156 		       peer->stats.tx.tx_success.bytes);
5157 	DP_PRINT_STATS("Unicast Success Packets = %d",
5158 		       peer->stats.tx.ucast.num);
5159 	DP_PRINT_STATS("Unicast Success Bytes = %llu",
5160 		       peer->stats.tx.ucast.bytes);
5161 	DP_PRINT_STATS("Multicast Success Packets = %d",
5162 		       peer->stats.tx.mcast.num);
5163 	DP_PRINT_STATS("Multicast Success Bytes = %llu",
5164 		       peer->stats.tx.mcast.bytes);
5165 	DP_PRINT_STATS("Broadcast Success Packets = %d",
5166 		       peer->stats.tx.bcast.num);
5167 	DP_PRINT_STATS("Broadcast Success Bytes = %llu",
5168 		       peer->stats.tx.bcast.bytes);
5169 	DP_PRINT_STATS("Packets Failed = %d",
5170 		       peer->stats.tx.tx_failed);
5171 	DP_PRINT_STATS("Packets In OFDMA = %d",
5172 		       peer->stats.tx.ofdma);
5173 	DP_PRINT_STATS("Packets In STBC = %d",
5174 		       peer->stats.tx.stbc);
5175 	DP_PRINT_STATS("Packets In LDPC = %d",
5176 		       peer->stats.tx.ldpc);
5177 	DP_PRINT_STATS("Packet Retries = %d",
5178 		       peer->stats.tx.retries);
5179 	DP_PRINT_STATS("MSDU's Part of AMSDU = %d",
5180 		       peer->stats.tx.amsdu_cnt);
5181 	DP_PRINT_STATS("Msdu's As Part of Ampdu = %d",
5182 		       peer->stats.tx.non_ampdu_cnt);
5183 	DP_PRINT_STATS("Msdu's As Ampdu = %d",
5184 		       peer->stats.tx.ampdu_cnt);
5185 	DP_PRINT_STATS("Last Packet RSSI = %d",
5186 		       peer->stats.tx.last_ack_rssi);
5187 	DP_PRINT_STATS("Dropped At FW: Removed Pkts = %u",
5188 		       peer->stats.tx.dropped.fw_rem.num);
5189 	if (pdev && !wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) {
5190 		DP_PRINT_STATS("Dropped At FW: Removed bytes = %llu",
5191 			peer->stats.tx.dropped.fw_rem.bytes);
5192 	}
5193 	DP_PRINT_STATS("Dropped At FW: Removed transmitted = %d",
5194 		       peer->stats.tx.dropped.fw_rem_tx);
5195 	DP_PRINT_STATS("Dropped At FW: Removed Untransmitted = %d",
5196 		       peer->stats.tx.dropped.fw_rem_notx);
5197 	DP_PRINT_STATS("Dropped : Age Out = %d",
5198 		       peer->stats.tx.dropped.age_out);
5199 	DP_PRINT_STATS("NAWDS : ");
5200 	DP_PRINT_STATS("Nawds multicast Drop Tx Packet = %d",
5201 		       peer->stats.tx.nawds_mcast_drop);
5202 	DP_PRINT_STATS("	Nawds multicast  Tx Packet Count = %d",
5203 		       peer->stats.tx.nawds_mcast.num);
5204 	DP_PRINT_STATS("	Nawds multicast  Tx Packet Bytes = %llu",
5205 		       peer->stats.tx.nawds_mcast.bytes);
5206 
5207 	DP_PRINT_STATS("Rate Info:");
5208 	dp_print_common_rates_info(peer->stats.tx.pkt_type);
5209 
5210 	DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
5211 		       peer->stats.tx.sgi_count[0],
5212 		       peer->stats.tx.sgi_count[1],
5213 		       peer->stats.tx.sgi_count[2],
5214 		       peer->stats.tx.sgi_count[3]);
5215 	DP_PRINT_STATS("Excess Retries per AC ");
5216 	DP_PRINT_STATS("	 Best effort = %d",
5217 		       peer->stats.tx.excess_retries_per_ac[0]);
5218 	DP_PRINT_STATS("	 Background= %d",
5219 		       peer->stats.tx.excess_retries_per_ac[1]);
5220 	DP_PRINT_STATS("	 Video = %d",
5221 		       peer->stats.tx.excess_retries_per_ac[2]);
5222 	DP_PRINT_STATS("	 Voice = %d",
5223 		       peer->stats.tx.excess_retries_per_ac[3]);
5224 	DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d\n",
5225 		       peer->stats.tx.bw[0], peer->stats.tx.bw[1],
5226 		       peer->stats.tx.bw[2], peer->stats.tx.bw[3]);
5227 
5228 	pnss = &peer->stats.tx.nss[0];
5229 	dp_print_nss(nss, pnss, SS_COUNT);
5230 
5231 	DP_PRINT_STATS("NSS(1-8) = %s", nss);
5232 
5233 	DP_PRINT_STATS("Transmit Type :");
5234 	DP_PRINT_STATS("SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d",
5235 		       peer->stats.tx.transmit_type[SU].num_msdu,
5236 		       peer->stats.tx.transmit_type[MU_MIMO].num_msdu,
5237 		       peer->stats.tx.transmit_type[MU_OFDMA].num_msdu,
5238 		       peer->stats.tx.transmit_type[MU_MIMO_OFDMA].num_msdu);
5239 
5240 	for (i = 0; i < MAX_MU_GROUP_ID;) {
5241 		index = 0;
5242 		for (j = 0; j < DP_MU_GROUP_SHOW && i < MAX_MU_GROUP_ID;
5243 		     j++) {
5244 			index += qdf_snprint(&mu_group_id[index],
5245 					     DP_MU_GROUP_LENGTH - index,
5246 					     " %d",
5247 					     peer->stats.tx.mu_group_id[i]);
5248 			i++;
5249 		}
5250 
5251 		DP_PRINT_STATS("User position list for GID %02d->%d: [%s]",
5252 			       i - DP_MU_GROUP_SHOW, i - 1, mu_group_id);
5253 	}
5254 
5255 	DP_PRINT_STATS("Last Packet RU index [%d], Size [%d]",
5256 		       peer->stats.tx.ru_start, peer->stats.tx.ru_tones);
5257 	DP_PRINT_STATS("RU Locations RU[26 52 106 242 484 996]:");
5258 	DP_PRINT_STATS("RU_26:  %d",
5259 		       peer->stats.tx.ru_loc[RU_26_INDEX].num_msdu);
5260 	DP_PRINT_STATS("RU 52:  %d",
5261 		       peer->stats.tx.ru_loc[RU_52_INDEX].num_msdu);
5262 	DP_PRINT_STATS("RU 106: %d",
5263 		       peer->stats.tx.ru_loc[RU_106_INDEX].num_msdu);
5264 	DP_PRINT_STATS("RU 242: %d",
5265 		       peer->stats.tx.ru_loc[RU_242_INDEX].num_msdu);
5266 	DP_PRINT_STATS("RU 484: %d",
5267 		       peer->stats.tx.ru_loc[RU_484_INDEX].num_msdu);
5268 	DP_PRINT_STATS("RU 996: %d",
5269 		       peer->stats.tx.ru_loc[RU_996_INDEX].num_msdu);
5270 
5271 	DP_PRINT_STATS("Aggregation:");
5272 	DP_PRINT_STATS("Number of Msdu's Part of Amsdu = %d",
5273 		       peer->stats.tx.amsdu_cnt);
5274 	DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation = %d",
5275 		       peer->stats.tx.non_amsdu_cnt);
5276 
5277 	DP_PRINT_STATS("Bytes and Packets transmitted  in last one sec:");
5278 	DP_PRINT_STATS("	Bytes transmitted in last sec: %d",
5279 		       peer->stats.tx.tx_byte_rate);
5280 	DP_PRINT_STATS("	Data transmitted in last sec: %d",
5281 		       peer->stats.tx.tx_data_rate);
5282 
5283 	DP_PRINT_STATS("Node Rx Stats:");
5284 	DP_PRINT_STATS("Packets Sent To Stack = %d",
5285 		       peer->stats.rx.to_stack.num);
5286 	DP_PRINT_STATS("Bytes Sent To Stack = %llu",
5287 		       peer->stats.rx.to_stack.bytes);
5288 	for (i = 0; i <  CDP_MAX_RX_RINGS; i++) {
5289 		DP_PRINT_STATS("Ring Id = %d", i);
5290 		DP_PRINT_STATS("	Packets Received = %d",
5291 			       peer->stats.rx.rcvd_reo[i].num);
5292 		DP_PRINT_STATS("	Bytes Received = %llu",
5293 			       peer->stats.rx.rcvd_reo[i].bytes);
5294 	}
5295 	DP_PRINT_STATS("Multicast Packets Received = %d",
5296 		       peer->stats.rx.multicast.num);
5297 	DP_PRINT_STATS("Multicast Bytes Received = %llu",
5298 		       peer->stats.rx.multicast.bytes);
5299 	DP_PRINT_STATS("Broadcast Packets Received = %d",
5300 		       peer->stats.rx.bcast.num);
5301 	DP_PRINT_STATS("Broadcast Bytes Received = %llu",
5302 		       peer->stats.rx.bcast.bytes);
5303 	DP_PRINT_STATS("Intra BSS Packets Received = %d",
5304 		       peer->stats.rx.intra_bss.pkts.num);
5305 	DP_PRINT_STATS("Intra BSS Bytes Received = %llu",
5306 		       peer->stats.rx.intra_bss.pkts.bytes);
5307 	DP_PRINT_STATS("Raw Packets Received = %d",
5308 		       peer->stats.rx.raw.num);
5309 	DP_PRINT_STATS("Raw Bytes Received = %llu",
5310 		       peer->stats.rx.raw.bytes);
5311 	DP_PRINT_STATS("Errors: MIC Errors = %d",
5312 		       peer->stats.rx.err.mic_err);
5313 	DP_PRINT_STATS("Erros: Decryption Errors = %d",
5314 		       peer->stats.rx.err.decrypt_err);
5315 	DP_PRINT_STATS("Msdu's Received As Part of Ampdu = %d",
5316 		       peer->stats.rx.non_ampdu_cnt);
5317 	DP_PRINT_STATS("Msdu's Recived As Ampdu = %d",
5318 		       peer->stats.rx.ampdu_cnt);
5319 	DP_PRINT_STATS("Msdu's Received Not Part of Amsdu's = %d",
5320 		       peer->stats.rx.non_amsdu_cnt);
5321 	DP_PRINT_STATS("MSDUs Received As Part of Amsdu = %d",
5322 		       peer->stats.rx.amsdu_cnt);
5323 	DP_PRINT_STATS("NAWDS : ");
5324 	DP_PRINT_STATS("	Nawds multicast Drop Rx Packet = %d",
5325 		       peer->stats.rx.nawds_mcast_drop);
5326 	DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
5327 		       peer->stats.rx.sgi_count[0],
5328 		       peer->stats.rx.sgi_count[1],
5329 		       peer->stats.rx.sgi_count[2],
5330 		       peer->stats.rx.sgi_count[3]);
5331 	DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d",
5332 		       peer->stats.rx.bw[0], peer->stats.rx.bw[1],
5333 		       peer->stats.rx.bw[2], peer->stats.rx.bw[3]);
5334 	DP_PRINT_STATS("MSDU Reception Type");
5335 	DP_PRINT_STATS("SU %d MU_MIMO %d MU_OFDMA %d MU_OFDMA_MIMO %d",
5336 		       peer->stats.rx.reception_type[0],
5337 		       peer->stats.rx.reception_type[1],
5338 		       peer->stats.rx.reception_type[2],
5339 		       peer->stats.rx.reception_type[3]);
5340 	DP_PRINT_STATS("PPDU Reception Type");
5341 	DP_PRINT_STATS("SU %d MU_MIMO %d MU_OFDMA %d MU_OFDMA_MIMO %d",
5342 		       peer->stats.rx.ppdu_cnt[0],
5343 		       peer->stats.rx.ppdu_cnt[1],
5344 		       peer->stats.rx.ppdu_cnt[2],
5345 		       peer->stats.rx.ppdu_cnt[3]);
5346 
5347 	dp_print_common_rates_info(peer->stats.rx.pkt_type);
5348 	dp_print_common_ppdu_rates_info(&peer->stats.rx.su_ax_ppdu_cnt);
5349 	dp_print_mu_ppdu_rates_info(&peer->stats.rx.rx_mu[0]);
5350 
5351 	pnss = &peer->stats.rx.nss[0];
5352 	dp_print_nss(nss, pnss, SS_COUNT);
5353 	DP_PRINT_STATS("MSDU Count");
5354 	DP_PRINT_STATS("	NSS(1-8) = %s", nss);
5355 
5356 	DP_PRINT_STATS("reception mode SU");
5357 	pnss = &peer->stats.rx.ppdu_nss[0];
5358 	dp_print_nss(nss, pnss, SS_COUNT);
5359 
5360 	DP_PRINT_STATS("	PPDU Count");
5361 	DP_PRINT_STATS("	NSS(1-8) = %s", nss);
5362 
5363 	DP_PRINT_STATS("	MPDU OK = %d, MPDU Fail = %d",
5364 		       peer->stats.rx.mpdu_cnt_fcs_ok,
5365 		       peer->stats.rx.mpdu_cnt_fcs_err);
5366 
5367 	for (rx_mu_type = 0; rx_mu_type < RX_TYPE_MU_MAX; rx_mu_type++) {
5368 		DP_PRINT_STATS("reception mode %s",
5369 			       mu_reception_mode[rx_mu_type]);
5370 		rx_mu = &peer->stats.rx.rx_mu[rx_mu_type];
5371 
5372 		pnss = &rx_mu->ppdu_nss[0];
5373 		dp_print_nss(nss, pnss, SS_COUNT);
5374 		DP_PRINT_STATS("	PPDU Count");
5375 		DP_PRINT_STATS("	NSS(1-8) = %s", nss);
5376 
5377 		DP_PRINT_STATS("	MPDU OK = %d, MPDU Fail = %d",
5378 			       rx_mu->mpdu_cnt_fcs_ok,
5379 			       rx_mu->mpdu_cnt_fcs_err);
5380 	}
5381 
5382 	DP_PRINT_STATS("Aggregation:");
5383 	DP_PRINT_STATS("	Msdu's Part of Ampdu = %d",
5384 		       peer->stats.rx.ampdu_cnt);
5385 	DP_PRINT_STATS("	Msdu's With No Mpdu Level Aggregation = %d",
5386 		       peer->stats.rx.non_ampdu_cnt);
5387 	DP_PRINT_STATS("	Msdu's Part of Amsdu = %d",
5388 		       peer->stats.rx.amsdu_cnt);
5389 	DP_PRINT_STATS("	Msdu's With No Msdu Level Aggregation = %d",
5390 		       peer->stats.rx.non_amsdu_cnt);
5391 
5392 	DP_PRINT_STATS("Bytes and Packets received in last one sec:");
5393 	DP_PRINT_STATS("	Bytes received in last sec: %d",
5394 		       peer->stats.rx.rx_byte_rate);
5395 	DP_PRINT_STATS("	Data received in last sec: %d",
5396 		       peer->stats.rx.rx_data_rate);
5397 	DP_PRINT_STATS("Multipass Rx Packet Drop = %d",
5398 		       peer->stats.rx.multipass_rx_pkt_drop);
5399 }
5400 
5401 void dp_print_per_ring_stats(struct dp_soc *soc)
5402 {
5403 	uint8_t ring;
5404 	uint16_t core;
5405 	uint64_t total_packets;
5406 
5407 	DP_PRINT_STATS("Reo packets per ring:");
5408 	for (ring = 0; ring < MAX_REO_DEST_RINGS; ring++) {
5409 		total_packets = 0;
5410 		DP_PRINT_STATS("Packets on ring %u:", ring);
5411 		for (core = 0; core < num_possible_cpus(); core++) {
5412 			if (!soc->stats.rx.ring_packets[core][ring])
5413 				continue;
5414 			DP_PRINT_STATS("Packets arriving on core %u: %llu",
5415 				       core,
5416 				       soc->stats.rx.ring_packets[core][ring]);
5417 			total_packets += soc->stats.rx.ring_packets[core][ring];
5418 		}
5419 		DP_PRINT_STATS("Total packets on ring %u: %llu",
5420 			       ring, total_packets);
5421 	}
5422 }
5423 
5424 void dp_txrx_path_stats(struct dp_soc *soc)
5425 {
5426 	uint8_t error_code;
5427 	uint8_t loop_pdev;
5428 	struct dp_pdev *pdev;
5429 	uint8_t i;
5430 
5431 	if (!soc) {
5432 		dp_err("%s: Invalid access",  __func__);
5433 		return;
5434 	}
5435 
5436 	for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) {
5437 		pdev = soc->pdev_list[loop_pdev];
5438 		dp_aggregate_pdev_stats(pdev);
5439 		DP_PRINT_STATS("Tx path Statistics:");
5440 		DP_PRINT_STATS("from stack: %u msdus (%llu bytes)",
5441 			       pdev->stats.tx_i.rcvd.num,
5442 			       pdev->stats.tx_i.rcvd.bytes);
5443 		DP_PRINT_STATS("processed from host: %u msdus (%llu bytes)",
5444 			       pdev->stats.tx_i.processed.num,
5445 			       pdev->stats.tx_i.processed.bytes);
5446 		DP_PRINT_STATS("successfully transmitted: %u msdus (%llu bytes)",
5447 			       pdev->stats.tx.tx_success.num,
5448 			       pdev->stats.tx.tx_success.bytes);
5449 
5450 		DP_PRINT_STATS("Dropped in host:");
5451 		DP_PRINT_STATS("Total packets dropped: %u,",
5452 			       pdev->stats.tx_i.dropped.dropped_pkt.num);
5453 		DP_PRINT_STATS("Descriptor not available: %u",
5454 			       pdev->stats.tx_i.dropped.desc_na.num);
5455 		DP_PRINT_STATS("Ring full: %u",
5456 			       pdev->stats.tx_i.dropped.ring_full);
5457 		DP_PRINT_STATS("Enqueue fail: %u",
5458 			       pdev->stats.tx_i.dropped.enqueue_fail);
5459 		DP_PRINT_STATS("DMA Error: %u",
5460 			       pdev->stats.tx_i.dropped.dma_error);
5461 
5462 		DP_PRINT_STATS("Dropped in hardware:");
5463 		DP_PRINT_STATS("total packets dropped: %u",
5464 			       pdev->stats.tx.tx_failed);
5465 		DP_PRINT_STATS("mpdu age out: %u",
5466 			       pdev->stats.tx.dropped.age_out);
5467 		DP_PRINT_STATS("firmware removed packets: %u (%llu bytes)",
5468 			       pdev->stats.tx.dropped.fw_rem.num,
5469 			       pdev->stats.tx.dropped.fw_rem.bytes);
5470 		DP_PRINT_STATS("firmware removed tx: %u",
5471 			       pdev->stats.tx.dropped.fw_rem_tx);
5472 		DP_PRINT_STATS("firmware removed notx %u",
5473 			       pdev->stats.tx.dropped.fw_rem_notx);
5474 		DP_PRINT_STATS("Invalid peer on tx path: %u",
5475 			       pdev->soc->stats.tx.tx_invalid_peer.num);
5476 
5477 		DP_PRINT_STATS("Tx packets sent per interrupt:");
5478 		DP_PRINT_STATS("Single Packet: %u",
5479 			       pdev->stats.tx_comp_histogram.pkts_1);
5480 		DP_PRINT_STATS("2-20 Packets:  %u",
5481 			       pdev->stats.tx_comp_histogram.pkts_2_20);
5482 		DP_PRINT_STATS("21-40 Packets: %u",
5483 			       pdev->stats.tx_comp_histogram.pkts_21_40);
5484 		DP_PRINT_STATS("41-60 Packets: %u",
5485 			       pdev->stats.tx_comp_histogram.pkts_41_60);
5486 		DP_PRINT_STATS("61-80 Packets: %u",
5487 			       pdev->stats.tx_comp_histogram.pkts_61_80);
5488 		DP_PRINT_STATS("81-100 Packets: %u",
5489 			       pdev->stats.tx_comp_histogram.pkts_81_100);
5490 		DP_PRINT_STATS("101-200 Packets: %u",
5491 			       pdev->stats.tx_comp_histogram.pkts_101_200);
5492 		DP_PRINT_STATS("    201+ Packets: %u",
5493 			       pdev->stats.tx_comp_histogram.pkts_201_plus);
5494 
5495 		DP_PRINT_STATS("Rx path statistics");
5496 
5497 		DP_PRINT_STATS("delivered %u msdus ( %llu bytes),",
5498 			       pdev->stats.rx.to_stack.num,
5499 			       pdev->stats.rx.to_stack.bytes);
5500 		for (i = 0; i <  CDP_MAX_RX_RINGS; i++) {
5501 			if (!pdev->stats.rx.rcvd_reo[i].num)
5502 				continue;
5503 			DP_PRINT_STATS(
5504 				       "received on reo[%d] %u msdus( %llu bytes),",
5505 				       i, pdev->stats.rx.rcvd_reo[i].num,
5506 				       pdev->stats.rx.rcvd_reo[i].bytes);
5507 		}
5508 		DP_PRINT_STATS("intra-bss packets %u msdus ( %llu bytes),",
5509 			       pdev->stats.rx.intra_bss.pkts.num,
5510 			       pdev->stats.rx.intra_bss.pkts.bytes);
5511 		DP_PRINT_STATS("intra-bss fails %u msdus ( %llu bytes),",
5512 			       pdev->stats.rx.intra_bss.fail.num,
5513 			       pdev->stats.rx.intra_bss.fail.bytes);
5514 		DP_PRINT_STATS("intra-bss no mdns fwds %u msdus",
5515 			       pdev->stats.rx.intra_bss.mdns_no_fwd);
5516 
5517 		DP_PRINT_STATS("raw packets %u msdus ( %llu bytes),",
5518 			       pdev->stats.rx.raw.num,
5519 			       pdev->stats.rx.raw.bytes);
5520 		DP_PRINT_STATS("mic errors %u",
5521 			       pdev->stats.rx.err.mic_err);
5522 		DP_PRINT_STATS("Invalid peer on rx path: %u",
5523 			       pdev->soc->stats.rx.err.rx_invalid_peer.num);
5524 		DP_PRINT_STATS("sw_peer_id invalid %u",
5525 			       pdev->soc->stats.rx.err.rx_invalid_peer_id.num);
5526 		DP_PRINT_STATS("packet_len invalid %u",
5527 			       pdev->soc->stats.rx.err.rx_invalid_pkt_len.num);
5528 		DP_PRINT_STATS("sa or da idx invalid %u",
5529 			       pdev->soc->stats.rx.err.invalid_sa_da_idx);
5530 		DP_PRINT_STATS("defrag peer uninit %u",
5531 			       pdev->soc->stats.rx.err.defrag_peer_uninit);
5532 		DP_PRINT_STATS("pkts delivered no peer %u",
5533 			       pdev->soc->stats.rx.err.pkt_delivered_no_peer);
5534 
5535 		DP_PRINT_STATS("Reo Statistics");
5536 		DP_PRINT_STATS("near_full: %u ", soc->stats.rx.near_full);
5537 		DP_PRINT_STATS("rbm error: %u msdus",
5538 			       pdev->soc->stats.rx.err.invalid_rbm);
5539 		DP_PRINT_STATS("hal ring access fail: %u msdus",
5540 			       pdev->soc->stats.rx.err.hal_ring_access_fail);
5541 
5542 		for (error_code = 0; error_code < HAL_REO_ERR_MAX;
5543 				error_code++) {
5544 			if (!pdev->soc->stats.rx.err.reo_error[error_code])
5545 				continue;
5546 			DP_PRINT_STATS("Reo error number (%u): %u msdus",
5547 				       error_code,
5548 				       pdev->soc->stats.rx.err
5549 				       .reo_error[error_code]);
5550 		}
5551 
5552 		for (error_code = 0; error_code < HAL_RXDMA_ERR_MAX;
5553 				error_code++) {
5554 			if (!pdev->soc->stats.rx.err.rxdma_error[error_code])
5555 				continue;
5556 			DP_PRINT_STATS("Rxdma error number (%u): %u msdus",
5557 				       error_code,
5558 				       pdev->soc->stats.rx.err
5559 				       .rxdma_error[error_code]);
5560 		}
5561 
5562 		DP_PRINT_STATS("Rx packets reaped per interrupt:");
5563 		DP_PRINT_STATS("Single Packet: %u",
5564 			       pdev->stats.rx_ind_histogram.pkts_1);
5565 		DP_PRINT_STATS("2-20 Packets:  %u",
5566 			       pdev->stats.rx_ind_histogram.pkts_2_20);
5567 		DP_PRINT_STATS("21-40 Packets: %u",
5568 			       pdev->stats.rx_ind_histogram.pkts_21_40);
5569 		DP_PRINT_STATS("41-60 Packets: %u",
5570 			       pdev->stats.rx_ind_histogram.pkts_41_60);
5571 		DP_PRINT_STATS("61-80 Packets: %u",
5572 			       pdev->stats.rx_ind_histogram.pkts_61_80);
5573 		DP_PRINT_STATS("81-100 Packets: %u",
5574 			       pdev->stats.rx_ind_histogram.pkts_81_100);
5575 		DP_PRINT_STATS("101-200 Packets: %u",
5576 			       pdev->stats.rx_ind_histogram.pkts_101_200);
5577 		DP_PRINT_STATS("   201+ Packets: %u",
5578 			       pdev->stats.rx_ind_histogram.pkts_201_plus);
5579 
5580 		DP_PRINT_STATS("%s: tso_enable: %u lro_enable: %u rx_hash: %u napi_enable: %u",
5581 			       __func__,
5582 			       pdev->soc->wlan_cfg_ctx
5583 			       ->tso_enabled,
5584 			       pdev->soc->wlan_cfg_ctx
5585 			       ->lro_enabled,
5586 			       pdev->soc->wlan_cfg_ctx
5587 			       ->rx_hash,
5588 			       pdev->soc->wlan_cfg_ctx
5589 			       ->napi_enabled);
5590 #ifdef QCA_LL_TX_FLOW_CONTROL_V2
5591 		DP_PRINT_STATS("%s: Tx flow stop queue: %u tx flow start queue offset: %u",
5592 			       __func__,
5593 			       pdev->soc->wlan_cfg_ctx
5594 			       ->tx_flow_stop_queue_threshold,
5595 			       pdev->soc->wlan_cfg_ctx
5596 			       ->tx_flow_start_queue_offset);
5597 #endif
5598 	}
5599 }
5600 
5601 /*
5602  * dp_aggregate_pdev_ctrl_frames_stats()- function to agreegate peer stats
5603  * Current scope is bar received count
5604  *
5605  * @pdev_handle: DP_PDEV handle
5606  *
5607  * Return: void
5608  */
5609 static void
5610 dp_aggregate_pdev_ctrl_frames_stats(struct dp_pdev *pdev)
5611 {
5612 	struct dp_vdev *vdev;
5613 	struct dp_peer *peer;
5614 	uint32_t waitcnt;
5615 
5616 	TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem) {
5617 		TAILQ_FOREACH(peer, &vdev->peer_list, peer_list_elem) {
5618 			if (!peer) {
5619 				dp_err("DP Invalid Peer refernce");
5620 				return;
5621 			}
5622 
5623 			if (peer->delete_in_progress) {
5624 				dp_err("DP Peer deletion in progress");
5625 				continue;
5626 			}
5627 			qdf_atomic_inc(&peer->ref_cnt);
5628 			waitcnt = 0;
5629 			dp_peer_rxtid_stats(peer, dp_rx_bar_stats_cb, pdev);
5630 			while (!(qdf_atomic_read(&pdev->stats_cmd_complete)) &&
5631 			       waitcnt < 10) {
5632 				schedule_timeout_interruptible(
5633 						STATS_PROC_TIMEOUT);
5634 				waitcnt++;
5635 			}
5636 			qdf_atomic_set(&pdev->stats_cmd_complete, 0);
5637 			dp_peer_unref_delete(peer);
5638 		}
5639 	}
5640 }
5641 
5642 void
5643 dp_print_pdev_tx_stats(struct dp_pdev *pdev)
5644 {
5645 	uint8_t i = 0, index = 0;
5646 
5647 	DP_PRINT_STATS("PDEV Tx Stats:\n");
5648 	DP_PRINT_STATS("Received From Stack:");
5649 	DP_PRINT_STATS("	Packets = %d",
5650 		       pdev->stats.tx_i.rcvd.num);
5651 	DP_PRINT_STATS("	Bytes = %llu",
5652 		       pdev->stats.tx_i.rcvd.bytes);
5653 	DP_PRINT_STATS("Processed:");
5654 	DP_PRINT_STATS("	Packets = %d",
5655 		       pdev->stats.tx_i.processed.num);
5656 	DP_PRINT_STATS("	Bytes = %llu",
5657 		       pdev->stats.tx_i.processed.bytes);
5658 	DP_PRINT_STATS("Total Completions:");
5659 	DP_PRINT_STATS("	Packets = %u",
5660 		       pdev->stats.tx.comp_pkt.num);
5661 	DP_PRINT_STATS("	Bytes = %llu",
5662 		       pdev->stats.tx.comp_pkt.bytes);
5663 	DP_PRINT_STATS("Successful Completions:");
5664 	DP_PRINT_STATS("	Packets = %u",
5665 		       pdev->stats.tx.tx_success.num);
5666 	DP_PRINT_STATS("	Bytes = %llu",
5667 		       pdev->stats.tx.tx_success.bytes);
5668 	DP_PRINT_STATS("Dropped:");
5669 	DP_PRINT_STATS("	Total = %d",
5670 		       pdev->stats.tx_i.dropped.dropped_pkt.num);
5671 	DP_PRINT_STATS("	Dma_map_error = %d",
5672 		       pdev->stats.tx_i.dropped.dma_error);
5673 	DP_PRINT_STATS("	Ring Full = %d",
5674 		       pdev->stats.tx_i.dropped.ring_full);
5675 	DP_PRINT_STATS("	Descriptor Not available = %d",
5676 		       pdev->stats.tx_i.dropped.desc_na.num);
5677 	DP_PRINT_STATS("	HW enqueue failed= %d",
5678 		       pdev->stats.tx_i.dropped.enqueue_fail);
5679 	DP_PRINT_STATS("	Resources Full = %d",
5680 		       pdev->stats.tx_i.dropped.res_full);
5681 	DP_PRINT_STATS("	FW removed Pkts = %u",
5682 		       pdev->stats.tx.dropped.fw_rem.num);
5683 	DP_PRINT_STATS("	FW removed bytes= %llu",
5684 		       pdev->stats.tx.dropped.fw_rem.bytes);
5685 	DP_PRINT_STATS("	FW removed transmitted = %d",
5686 		       pdev->stats.tx.dropped.fw_rem_tx);
5687 	DP_PRINT_STATS("	FW removed untransmitted = %d",
5688 		       pdev->stats.tx.dropped.fw_rem_notx);
5689 	DP_PRINT_STATS("	FW removed untransmitted fw_reason1 = %d",
5690 		       pdev->stats.tx.dropped.fw_reason1);
5691 	DP_PRINT_STATS("	FW removed untransmitted fw_reason2 = %d",
5692 		       pdev->stats.tx.dropped.fw_reason2);
5693 	DP_PRINT_STATS("	FW removed untransmitted fw_reason3 = %d",
5694 		       pdev->stats.tx.dropped.fw_reason3);
5695 	DP_PRINT_STATS("	Aged Out from msdu/mpdu queues = %d",
5696 		       pdev->stats.tx.dropped.age_out);
5697 	DP_PRINT_STATS("	headroom insufficient = %d",
5698 		       pdev->stats.tx_i.dropped.headroom_insufficient);
5699 	DP_PRINT_STATS("Multicast:");
5700 	DP_PRINT_STATS("	Packets: %u",
5701 		       pdev->stats.tx.mcast.num);
5702 	DP_PRINT_STATS("	Bytes: %llu",
5703 		       pdev->stats.tx.mcast.bytes);
5704 	DP_PRINT_STATS("Scatter Gather:");
5705 	DP_PRINT_STATS("	Packets = %d",
5706 		       pdev->stats.tx_i.sg.sg_pkt.num);
5707 	DP_PRINT_STATS("	Bytes = %llu",
5708 		       pdev->stats.tx_i.sg.sg_pkt.bytes);
5709 	DP_PRINT_STATS("	Dropped By Host = %d",
5710 		       pdev->stats.tx_i.sg.dropped_host.num);
5711 	DP_PRINT_STATS("	Dropped By Target = %d",
5712 		       pdev->stats.tx_i.sg.dropped_target);
5713 	DP_PRINT_STATS("Mcast Enhancement:");
5714 	DP_PRINT_STATS("	Packets = %d",
5715 		       pdev->stats.tx_i.mcast_en.mcast_pkt.num);
5716 	DP_PRINT_STATS("	Bytes = %llu",
5717 		       pdev->stats.tx_i.mcast_en.mcast_pkt.bytes);
5718 	DP_PRINT_STATS("	Dropped: Map Errors = %d",
5719 		       pdev->stats.tx_i.mcast_en.dropped_map_error);
5720 	DP_PRINT_STATS("	Dropped: Self Mac = %d",
5721 		       pdev->stats.tx_i.mcast_en.dropped_self_mac);
5722 	DP_PRINT_STATS("	Dropped: Send Fail = %d",
5723 		       pdev->stats.tx_i.mcast_en.dropped_send_fail);
5724 	DP_PRINT_STATS("	Unicast sent = %d",
5725 		       pdev->stats.tx_i.mcast_en.ucast);
5726 	DP_PRINT_STATS("Raw:");
5727 	DP_PRINT_STATS("	Packets = %d",
5728 		       pdev->stats.tx_i.raw.raw_pkt.num);
5729 	DP_PRINT_STATS("	Bytes = %llu",
5730 		       pdev->stats.tx_i.raw.raw_pkt.bytes);
5731 	DP_PRINT_STATS("	DMA map error = %d",
5732 		       pdev->stats.tx_i.raw.dma_map_error);
5733 	DP_PRINT_STATS("        RAW pkt type[!data] error = %d",
5734 		       pdev->stats.tx_i.raw.invalid_raw_pkt_datatype);
5735 	DP_PRINT_STATS("Reinjected:");
5736 	DP_PRINT_STATS("	Packets = %d",
5737 		       pdev->stats.tx_i.reinject_pkts.num);
5738 	DP_PRINT_STATS("	Bytes = %llu\n",
5739 		       pdev->stats.tx_i.reinject_pkts.bytes);
5740 	DP_PRINT_STATS("Inspected:");
5741 	DP_PRINT_STATS("	Packets = %d",
5742 		       pdev->stats.tx_i.inspect_pkts.num);
5743 	DP_PRINT_STATS("	Bytes = %llu",
5744 		       pdev->stats.tx_i.inspect_pkts.bytes);
5745 	DP_PRINT_STATS("Nawds Multicast:");
5746 	DP_PRINT_STATS("	Packets = %d",
5747 		       pdev->stats.tx_i.nawds_mcast.num);
5748 	DP_PRINT_STATS("	Bytes = %llu",
5749 		       pdev->stats.tx_i.nawds_mcast.bytes);
5750 	DP_PRINT_STATS("CCE Classified:");
5751 	DP_PRINT_STATS("	CCE Classified Packets: %u",
5752 		       pdev->stats.tx_i.cce_classified);
5753 	DP_PRINT_STATS("	RAW CCE Classified Packets: %u",
5754 		       pdev->stats.tx_i.cce_classified_raw);
5755 	DP_PRINT_STATS("Mesh stats:");
5756 	DP_PRINT_STATS("	frames to firmware: %u",
5757 		       pdev->stats.tx_i.mesh.exception_fw);
5758 	DP_PRINT_STATS("	completions from fw: %u",
5759 		       pdev->stats.tx_i.mesh.completion_fw);
5760 	DP_PRINT_STATS("PPDU stats counter");
5761 	for (index = 0; index < CDP_PPDU_STATS_MAX_TAG; index++) {
5762 		DP_PRINT_STATS("	Tag[%d] = %llu", index,
5763 			       pdev->stats.ppdu_stats_counter[index]);
5764 	}
5765 	DP_PRINT_STATS("BA not received for delayed_ba: %d",
5766 		       pdev->stats.cdp_delayed_ba_not_recev);
5767 	DP_PRINT_STATS("tx_ppdu_proc: %llu\n",
5768 		       pdev->tx_ppdu_proc);
5769 
5770 	for (i = 0; i < CDP_WDI_NUM_EVENTS; i++) {
5771 		if (!pdev->stats.wdi_event[i])
5772 			DP_PRINT_STATS("Wdi msgs received from fw[%d]:%d",
5773 				       i, pdev->stats.wdi_event[i]);
5774 	}
5775 
5776 	dp_print_pdev_tx_capture_stats(pdev);
5777 }
5778 
5779 void
5780 dp_print_pdev_rx_stats(struct dp_pdev *pdev)
5781 {
5782 	DP_PRINT_STATS("PDEV Rx Stats:\n");
5783 	DP_PRINT_STATS("Received From HW (Per Rx Ring):");
5784 	DP_PRINT_STATS("	Packets = %d %d %d %d",
5785 		       pdev->stats.rx.rcvd_reo[0].num,
5786 		       pdev->stats.rx.rcvd_reo[1].num,
5787 		       pdev->stats.rx.rcvd_reo[2].num,
5788 		       pdev->stats.rx.rcvd_reo[3].num);
5789 	DP_PRINT_STATS("	Bytes = %llu %llu %llu %llu",
5790 		       pdev->stats.rx.rcvd_reo[0].bytes,
5791 		       pdev->stats.rx.rcvd_reo[1].bytes,
5792 		       pdev->stats.rx.rcvd_reo[2].bytes,
5793 		       pdev->stats.rx.rcvd_reo[3].bytes);
5794 	DP_PRINT_STATS("Replenished:");
5795 	DP_PRINT_STATS("	Packets = %d",
5796 		       pdev->stats.replenish.pkts.num);
5797 	DP_PRINT_STATS("	Buffers Added To Freelist = %d",
5798 		       pdev->stats.buf_freelist);
5799 	DP_PRINT_STATS("	Low threshold intr = %d",
5800 		       pdev->stats.replenish.low_thresh_intrs);
5801 	DP_PRINT_STATS("Dropped:");
5802 	DP_PRINT_STATS("	msdu_not_done = %d",
5803 		       pdev->stats.dropped.msdu_not_done);
5804 	DP_PRINT_STATS("        wifi parse = %d",
5805 		       pdev->stats.dropped.wifi_parse);
5806 	DP_PRINT_STATS("        mon_rx_drop = %d",
5807 		       pdev->stats.dropped.mon_rx_drop);
5808 	DP_PRINT_STATS("        mon_radiotap_update_err = %d",
5809 		       pdev->stats.dropped.mon_radiotap_update_err);
5810 	DP_PRINT_STATS("        mec_drop = %d",
5811 		       pdev->stats.rx.mec_drop.num);
5812 	DP_PRINT_STATS("	Bytes = %llu",
5813 		       pdev->stats.rx.mec_drop.bytes);
5814 	DP_PRINT_STATS("Sent To Stack:");
5815 	DP_PRINT_STATS("	Packets = %d",
5816 		       pdev->stats.rx.to_stack.num);
5817 	DP_PRINT_STATS("	Bytes = %llu",
5818 		       pdev->stats.rx.to_stack.bytes);
5819 	DP_PRINT_STATS("        vlan_tag_stp_cnt = %d",
5820 		       pdev->stats.vlan_tag_stp_cnt);
5821 	DP_PRINT_STATS("Multicast/Broadcast:");
5822 	DP_PRINT_STATS("	Packets = %d",
5823 		       pdev->stats.rx.multicast.num);
5824 	DP_PRINT_STATS("	Bytes = %llu",
5825 		       pdev->stats.rx.multicast.bytes);
5826 	DP_PRINT_STATS("Errors:");
5827 	DP_PRINT_STATS("	Rxdma Ring Un-inititalized = %d",
5828 		       pdev->stats.replenish.rxdma_err);
5829 	DP_PRINT_STATS("	Desc Alloc Failed: = %d",
5830 		       pdev->stats.err.desc_alloc_fail);
5831 	DP_PRINT_STATS("	IP checksum error = %d",
5832 		       pdev->stats.err.ip_csum_err);
5833 	DP_PRINT_STATS("	TCP/UDP checksum error = %d",
5834 		       pdev->stats.err.tcp_udp_csum_err);
5835 
5836 	/* Get bar_recv_cnt */
5837 	dp_aggregate_pdev_ctrl_frames_stats(pdev);
5838 	DP_PRINT_STATS("BAR Received Count: = %d",
5839 		       pdev->stats.rx.bar_recv_cnt);
5840 }
5841 
5842 void
5843 dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev)
5844 {
5845 	struct cdp_pdev_mon_stats *rx_mon_stats;
5846 	uint32_t *stat_ring_ppdu_ids;
5847 	uint32_t *dest_ring_ppdu_ids;
5848 	int i, idx;
5849 
5850 	rx_mon_stats = &pdev->rx_mon_stats;
5851 
5852 	DP_PRINT_STATS("PDEV Rx Monitor Stats:\n");
5853 
5854 	DP_PRINT_STATS("status_ppdu_compl_cnt = %d",
5855 		       rx_mon_stats->status_ppdu_compl);
5856 	DP_PRINT_STATS("status_ppdu_start_cnt = %d",
5857 		       rx_mon_stats->status_ppdu_start);
5858 	DP_PRINT_STATS("status_ppdu_end_cnt = %d",
5859 		       rx_mon_stats->status_ppdu_end);
5860 	DP_PRINT_STATS("status_ppdu_start_mis_cnt = %d",
5861 		       rx_mon_stats->status_ppdu_start_mis);
5862 	DP_PRINT_STATS("status_ppdu_end_mis_cnt = %d",
5863 		       rx_mon_stats->status_ppdu_end_mis);
5864 	DP_PRINT_STATS("status_ppdu_done_cnt = %d",
5865 		       rx_mon_stats->status_ppdu_done);
5866 	DP_PRINT_STATS("dest_ppdu_done_cnt = %d",
5867 		       rx_mon_stats->dest_ppdu_done);
5868 	DP_PRINT_STATS("dest_mpdu_done_cnt = %d",
5869 		       rx_mon_stats->dest_mpdu_done);
5870 	DP_PRINT_STATS("tlv_tag_status_err_cnt = %u",
5871 		       rx_mon_stats->tlv_tag_status_err);
5872 	DP_PRINT_STATS("dest_mpdu_drop_cnt = %d",
5873 		       rx_mon_stats->dest_mpdu_drop);
5874 	DP_PRINT_STATS("dup_mon_linkdesc_cnt = %d",
5875 		       rx_mon_stats->dup_mon_linkdesc_cnt);
5876 	DP_PRINT_STATS("dup_mon_buf_cnt = %d",
5877 		       rx_mon_stats->dup_mon_buf_cnt);
5878 	stat_ring_ppdu_ids =
5879 		(uint32_t *)qdf_mem_malloc(sizeof(uint32_t) * MAX_PPDU_ID_HIST);
5880 	dest_ring_ppdu_ids =
5881 		(uint32_t *)qdf_mem_malloc(sizeof(uint32_t) * MAX_PPDU_ID_HIST);
5882 
5883 	if (!stat_ring_ppdu_ids || !dest_ring_ppdu_ids)
5884 		DP_PRINT_STATS("Unable to allocate ppdu id hist mem\n");
5885 
5886 	qdf_spin_lock_bh(&pdev->mon_lock);
5887 	idx = rx_mon_stats->ppdu_id_hist_idx;
5888 	qdf_mem_copy(stat_ring_ppdu_ids,
5889 		     rx_mon_stats->stat_ring_ppdu_id_hist,
5890 		     sizeof(uint32_t) * MAX_PPDU_ID_HIST);
5891 	qdf_mem_copy(dest_ring_ppdu_ids,
5892 		     rx_mon_stats->dest_ring_ppdu_id_hist,
5893 		     sizeof(uint32_t) * MAX_PPDU_ID_HIST);
5894 	qdf_spin_unlock_bh(&pdev->mon_lock);
5895 
5896 	DP_PRINT_STATS("PPDU Id history:");
5897 	DP_PRINT_STATS("stat_ring_ppdu_ids\t dest_ring_ppdu_ids");
5898 	for (i = 0; i < MAX_PPDU_ID_HIST; i++) {
5899 		idx = (idx + 1) & (MAX_PPDU_ID_HIST - 1);
5900 		DP_PRINT_STATS("%*u\t%*u", 16,
5901 			       rx_mon_stats->stat_ring_ppdu_id_hist[idx], 16,
5902 			       rx_mon_stats->dest_ring_ppdu_id_hist[idx]);
5903 	}
5904 	qdf_mem_free(stat_ring_ppdu_ids);
5905 	qdf_mem_free(dest_ring_ppdu_ids);
5906 	DP_PRINT_STATS("mon_rx_dest_stuck = %d",
5907 		       rx_mon_stats->mon_rx_dest_stuck);
5908 }
5909 
5910 void
5911 dp_print_soc_tx_stats(struct dp_soc *soc)
5912 {
5913 	uint8_t desc_pool_id;
5914 
5915 	soc->stats.tx.desc_in_use = 0;
5916 
5917 	DP_PRINT_STATS("SOC Tx Stats:\n");
5918 
5919 	for (desc_pool_id = 0;
5920 	     desc_pool_id < wlan_cfg_get_num_tx_desc_pool(soc->wlan_cfg_ctx);
5921 	     desc_pool_id++)
5922 		soc->stats.tx.desc_in_use +=
5923 			soc->tx_desc[desc_pool_id].num_allocated;
5924 
5925 	DP_PRINT_STATS("Tx Descriptors In Use = %d",
5926 		       soc->stats.tx.desc_in_use);
5927 	DP_PRINT_STATS("Tx Invalid peer:");
5928 	DP_PRINT_STATS("	Packets = %d",
5929 		       soc->stats.tx.tx_invalid_peer.num);
5930 	DP_PRINT_STATS("	Bytes = %llu",
5931 		       soc->stats.tx.tx_invalid_peer.bytes);
5932 	DP_PRINT_STATS("Packets dropped due to TCL ring full = %d %d %d",
5933 		       soc->stats.tx.tcl_ring_full[0],
5934 		       soc->stats.tx.tcl_ring_full[1],
5935 		       soc->stats.tx.tcl_ring_full[2]);
5936 	DP_PRINT_STATS("Tx invalid completion release = %d",
5937 		       soc->stats.tx.invalid_release_source);
5938 	DP_PRINT_STATS("Tx comp wbm internal error = %d : [%d %d %d %d]",
5939 		       soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_ALL],
5940 		       soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_BUFFER],
5941 		       soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_LINK_DESC],
5942 		       soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_MSDU_BUFF],
5943 		       soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_BUFF_REAPED]);
5944 	DP_PRINT_STATS("Tx comp non wbm internal error = %d",
5945 		       soc->stats.tx.non_wbm_internal_err);
5946 	DP_PRINT_STATS("Tx comp loop pkt limit hit = %d",
5947 		       soc->stats.tx.tx_comp_loop_pkt_limit_hit);
5948 	DP_PRINT_STATS("Tx comp HP out of sync2 = %d",
5949 		       soc->stats.tx.hp_oos2);
5950 }
5951 
5952 void dp_print_soc_interrupt_stats(struct dp_soc *soc)
5953 {
5954 	int i = 0;
5955 	struct dp_intr_stats *intr_stats;
5956 
5957 	DP_PRINT_STATS("INT:     Total  |txComps|reo[0] |reo[1] |reo[2] |reo[3] |mon    |rx_err | wbm   |reo_sta|rxdm2hst|hst2rxdm|");
5958 	for (i = 0; i < WLAN_CFG_INT_NUM_CONTEXTS; i++) {
5959 		intr_stats = &soc->intr_ctx[i].intr_stats;
5960 		DP_PRINT_STATS("%3u[%3d]: %7u %7u %7u %7u %7u %7u %7u %7u %7u %7u %8u %8u",
5961 			       i,
5962 			       hif_get_int_ctx_irq_num(soc->hif_handle, i),
5963 			       intr_stats->num_masks,
5964 			       intr_stats->num_tx_ring_masks[0],
5965 			       intr_stats->num_rx_ring_masks[0],
5966 			       intr_stats->num_rx_ring_masks[1],
5967 			       intr_stats->num_rx_ring_masks[2],
5968 			       intr_stats->num_rx_ring_masks[3],
5969 			       intr_stats->num_rx_mon_ring_masks,
5970 			       intr_stats->num_rx_err_ring_masks,
5971 			       intr_stats->num_rx_wbm_rel_ring_masks,
5972 			       intr_stats->num_reo_status_ring_masks,
5973 			       intr_stats->num_rxdma2host_ring_masks,
5974 			       intr_stats->num_host2rxdma_ring_masks);
5975 		}
5976 }
5977 
5978 void
5979 dp_print_soc_rx_stats(struct dp_soc *soc)
5980 {
5981 	uint32_t i;
5982 	char reo_error[DP_REO_ERR_LENGTH];
5983 	char rxdma_error[DP_RXDMA_ERR_LENGTH];
5984 	uint8_t index = 0;
5985 
5986 	DP_PRINT_STATS("No of AST Entries = %d", soc->num_ast_entries);
5987 	DP_PRINT_STATS("SOC Rx Stats:\n");
5988 	DP_PRINT_STATS("Fragmented packets: %u",
5989 		       soc->stats.rx.rx_frags);
5990 	DP_PRINT_STATS("Reo reinjected packets: %u",
5991 		       soc->stats.rx.reo_reinject);
5992 	DP_PRINT_STATS("Errors:\n");
5993 	DP_PRINT_STATS("Rx Decrypt Errors = %d",
5994 		       (soc->stats.rx.err.rxdma_error[HAL_RXDMA_ERR_DECRYPT] +
5995 		       soc->stats.rx.err.rxdma_error[HAL_RXDMA_ERR_TKIP_MIC]));
5996 	DP_PRINT_STATS("Invalid RBM = %d",
5997 		       soc->stats.rx.err.invalid_rbm);
5998 	DP_PRINT_STATS("Invalid Vdev = %d",
5999 		       soc->stats.rx.err.invalid_vdev);
6000 	DP_PRINT_STATS("Invalid sa_idx or da_idx = %d",
6001 		       soc->stats.rx.err.invalid_sa_da_idx);
6002 	DP_PRINT_STATS("Defrag peer uninit = %d",
6003 		       soc->stats.rx.err.defrag_peer_uninit);
6004 	DP_PRINT_STATS("Pkts delivered no peer = %d",
6005 		       soc->stats.rx.err.pkt_delivered_no_peer);
6006 	DP_PRINT_STATS("Invalid Pdev = %d",
6007 		       soc->stats.rx.err.invalid_pdev);
6008 	DP_PRINT_STATS("Invalid Peer = %d",
6009 		       soc->stats.rx.err.rx_invalid_peer.num);
6010 	DP_PRINT_STATS("HAL Ring Access Fail = %d",
6011 		       soc->stats.rx.err.hal_ring_access_fail);
6012 	DP_PRINT_STATS("MSDU Done failures = %d",
6013 		       soc->stats.rx.err.msdu_done_fail);
6014 	DP_PRINT_STATS("RX frags: %d", soc->stats.rx.rx_frags);
6015 	DP_PRINT_STATS("RX frag wait: %d", soc->stats.rx.rx_frag_wait);
6016 	DP_PRINT_STATS("RX frag err: %d", soc->stats.rx.rx_frag_err);
6017 
6018 	DP_PRINT_STATS("RX HP out_of_sync: %d", soc->stats.rx.hp_oos2);
6019 	DP_PRINT_STATS("RX Ring Near Full: %d", soc->stats.rx.near_full);
6020 
6021 	DP_PRINT_STATS("RX Reap Loop Pkt Limit Hit: %d",
6022 		       soc->stats.rx.reap_loop_pkt_limit_hit);
6023 	DP_PRINT_STATS("RX DESC invalid magic: %u",
6024 		       soc->stats.rx.err.rx_desc_invalid_magic);
6025 	DP_PRINT_STATS("RX DUP DESC: %d",
6026 		       soc->stats.rx.err.hal_reo_dest_dup);
6027 	DP_PRINT_STATS("RX REL DUP DESC: %d",
6028 		       soc->stats.rx.err.hal_wbm_rel_dup);
6029 
6030 	DP_PRINT_STATS("RXDMA ERR DUP DESC: %d",
6031 		       soc->stats.rx.err.hal_rxdma_err_dup);
6032 
6033 	DP_PRINT_STATS("RX scatter msdu: %d",
6034 		       soc->stats.rx.err.scatter_msdu);
6035 
6036 	DP_PRINT_STATS("RX wait completed msdu break: %d",
6037 		       soc->stats.rx.msdu_scatter_wait_break);
6038 
6039 	for (i = 0; i < HAL_RXDMA_ERR_MAX; i++) {
6040 		index += qdf_snprint(&rxdma_error[index],
6041 				DP_RXDMA_ERR_LENGTH - index,
6042 				" %d", soc->stats.rx.err.rxdma_error[i]);
6043 	}
6044 	DP_PRINT_STATS("RXDMA Error (0-31):%s", rxdma_error);
6045 
6046 	index = 0;
6047 	for (i = 0; i < HAL_REO_ERR_MAX; i++) {
6048 		index += qdf_snprint(&reo_error[index],
6049 				DP_REO_ERR_LENGTH - index,
6050 				" %d", soc->stats.rx.err.reo_error[i]);
6051 	}
6052 	DP_PRINT_STATS("REO Error(0-14):%s", reo_error);
6053 	DP_PRINT_STATS("REO CMD SEND FAIL: %d",
6054 		       soc->stats.rx.err.reo_cmd_send_fail);
6055 }
6056 
6057 #ifdef FEATURE_TSO_STATS
6058 void dp_print_tso_stats(struct dp_soc *soc,
6059 			enum qdf_stats_verbosity_level level)
6060 {
6061 	uint8_t loop_pdev;
6062 	uint32_t id;
6063 	struct dp_pdev *pdev;
6064 
6065 	for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) {
6066 		pdev = soc->pdev_list[loop_pdev];
6067 		DP_PRINT_STATS("TSO Statistics\n");
6068 		DP_PRINT_STATS(
6069 			  "From stack: %d | Successful completions: %d | TSO Packets: %d | TSO Completions: %d",
6070 			  pdev->stats.tx_i.rcvd.num,
6071 			  pdev->stats.tx.tx_success.num,
6072 			  pdev->stats.tso_stats.num_tso_pkts.num,
6073 			  pdev->stats.tso_stats.tso_comp);
6074 
6075 		for (id = 0; id < CDP_MAX_TSO_PACKETS; id++) {
6076 			/* TSO LEVEL 1 - PACKET INFO */
6077 			DP_PRINT_STATS(
6078 				  "Packet_Id:[%u]: Packet Length %zu | No. of segments: %u",
6079 				  id,
6080 				  pdev->stats.tso_stats.tso_info
6081 				  .tso_packet_info[id].tso_packet_len,
6082 				  pdev->stats.tso_stats.tso_info
6083 				  .tso_packet_info[id].num_seg);
6084 			/* TSO LEVEL 2 */
6085 			if (level == QDF_STATS_VERBOSITY_LEVEL_HIGH)
6086 				dp_print_tso_seg_stats(pdev, id);
6087 		}
6088 
6089 		DP_PRINT_STATS(
6090 			  "TSO Histogram: Single: %llu | 2-5 segs: %llu | 6-10: %llu segs | 11-15 segs: %llu | 16-20 segs: %llu | 20+ segs: %llu",
6091 			  pdev->stats.tso_stats.seg_histogram.segs_1,
6092 			  pdev->stats.tso_stats.seg_histogram.segs_2_5,
6093 			  pdev->stats.tso_stats.seg_histogram.segs_6_10,
6094 			  pdev->stats.tso_stats.seg_histogram.segs_11_15,
6095 			  pdev->stats.tso_stats.seg_histogram.segs_16_20,
6096 			  pdev->stats.tso_stats.seg_histogram.segs_20_plus);
6097 	}
6098 }
6099 
6100 void dp_stats_tso_segment_histogram_update(struct dp_pdev *pdev,
6101 					   uint8_t _p_cntrs)
6102 {
6103 	if (_p_cntrs == 1) {
6104 		DP_STATS_INC(pdev,
6105 			     tso_stats.seg_histogram.segs_1, 1);
6106 	} else if (_p_cntrs >= 2 && _p_cntrs <= 5) {
6107 		DP_STATS_INC(pdev,
6108 			     tso_stats.seg_histogram.segs_2_5, 1);
6109 	} else if (_p_cntrs > 5 && _p_cntrs <= 10) {
6110 		DP_STATS_INC(pdev,
6111 			     tso_stats.seg_histogram.segs_6_10, 1);
6112 	} else if (_p_cntrs > 10 && _p_cntrs <= 15) {
6113 		DP_STATS_INC(pdev,
6114 			     tso_stats.seg_histogram.segs_11_15, 1);
6115 	} else if (_p_cntrs > 15 && _p_cntrs <= 20) {
6116 		DP_STATS_INC(pdev,
6117 			     tso_stats.seg_histogram.segs_16_20, 1);
6118 	} else if (_p_cntrs > 20) {
6119 		DP_STATS_INC(pdev,
6120 			     tso_stats.seg_histogram.segs_20_plus, 1);
6121 	}
6122 }
6123 
6124 void dp_tso_segment_update(struct dp_pdev *pdev,
6125 			   uint32_t stats_idx,
6126 			   uint8_t idx,
6127 			   struct qdf_tso_seg_t seg)
6128 {
6129 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
6130 		     .tso_seg[idx].num_frags,
6131 		     seg.num_frags);
6132 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
6133 		     .tso_seg[idx].total_len,
6134 		     seg.total_len);
6135 
6136 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
6137 		     .tso_seg[idx].tso_flags.tso_enable,
6138 		     seg.tso_flags.tso_enable);
6139 
6140 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
6141 		     .tso_seg[idx].tso_flags.fin,
6142 		     seg.tso_flags.fin);
6143 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
6144 		     .tso_seg[idx].tso_flags.syn,
6145 		     seg.tso_flags.syn);
6146 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
6147 		     .tso_seg[idx].tso_flags.rst,
6148 		     seg.tso_flags.rst);
6149 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
6150 		     .tso_seg[idx].tso_flags.psh,
6151 		     seg.tso_flags.psh);
6152 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
6153 		     .tso_seg[idx].tso_flags.ack,
6154 		     seg.tso_flags.ack);
6155 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
6156 		     .tso_seg[idx].tso_flags.urg,
6157 		     seg.tso_flags.urg);
6158 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
6159 		     .tso_seg[idx].tso_flags.ece,
6160 		     seg.tso_flags.ece);
6161 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
6162 		     .tso_seg[idx].tso_flags.cwr,
6163 		     seg.tso_flags.cwr);
6164 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
6165 		     .tso_seg[idx].tso_flags.ns,
6166 		     seg.tso_flags.ns);
6167 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
6168 		     .tso_seg[idx].tso_flags.tcp_seq_num,
6169 		     seg.tso_flags.tcp_seq_num);
6170 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
6171 		     .tso_seg[idx].tso_flags.ip_id,
6172 		     seg.tso_flags.ip_id);
6173 }
6174 
6175 void dp_tso_packet_update(struct dp_pdev *pdev, uint32_t stats_idx,
6176 			  qdf_nbuf_t msdu, uint16_t num_segs)
6177 {
6178 	DP_STATS_UPD(pdev,
6179 		     tso_stats.tso_info.tso_packet_info[stats_idx]
6180 		     .num_seg,
6181 		     num_segs);
6182 
6183 	DP_STATS_UPD(pdev,
6184 		     tso_stats.tso_info.tso_packet_info[stats_idx]
6185 		     .tso_packet_len,
6186 		     qdf_nbuf_get_tcp_payload_len(msdu));
6187 }
6188 
6189 void dp_tso_segment_stats_update(struct dp_pdev *pdev,
6190 				 struct qdf_tso_seg_elem_t *stats_seg,
6191 				 uint32_t stats_idx)
6192 {
6193 	uint8_t tso_seg_idx = 0;
6194 
6195 	while (stats_seg  && (tso_seg_idx < CDP_MAX_TSO_SEGMENTS)) {
6196 		dp_tso_segment_update(pdev, stats_idx,
6197 				      tso_seg_idx,
6198 				      stats_seg->seg);
6199 		++tso_seg_idx;
6200 		stats_seg = stats_seg->next;
6201 	}
6202 }
6203 
6204 void dp_txrx_clear_tso_stats(struct dp_soc *soc)
6205 {
6206 	uint8_t loop_pdev;
6207 	struct dp_pdev *pdev;
6208 
6209 	for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) {
6210 		pdev = soc->pdev_list[loop_pdev];
6211 		dp_init_tso_stats(pdev);
6212 	}
6213 }
6214 #endif /* FEATURE_TSO_STATS */
6215