xref: /wlan-dirver/qca-wifi-host-cmn/dp/wifi3.0/dp_stats.c (revision 8ddef7dd9a290d4a9b1efd5d3efacf51d78a1a0d)
1 /*
2  * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for
5  * any purpose with or without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 #include "qdf_types.h"
19 #include "htt_stats.h"
20 #include "dp_types.h"
21 #include "dp_internal.h"
22 
23 #define DP_MAX_STRING_LEN 500
24 
25 #define DP_HTT_HW_INTR_NAME_LEN  HTT_STATS_MAX_HW_INTR_NAME_LEN
26 #define DP_HTT_HW_MODULE_NAME_LEN  HTT_STATS_MAX_HW_MODULE_NAME_LEN
27 #define DP_HTT_COUNTER_NAME_LEN  HTT_MAX_COUNTER_NAME
28 #define DP_HTT_LOW_WM_HIT_COUNT_LEN  HTT_STATS_LOW_WM_BINS
29 #define DP_HTT_HIGH_WM_HIT_COUNT_LEN  HTT_STATS_HIGH_WM_BINS
30 #define DP_HTT_TX_MCS_LEN  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS
31 #define DP_HTT_TX_SU_MCS_LEN  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS
32 #define DP_HTT_TX_MU_MCS_LEN  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS
33 #define DP_HTT_TX_NSS_LEN  HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS
34 #define DP_HTT_TX_BW_LEN  HTT_TX_PDEV_STATS_NUM_BW_COUNTERS
35 #define DP_HTT_TX_PREAM_LEN  HTT_TX_PDEV_STATS_NUM_PREAMBLE_TYPES
36 #define DP_HTT_TX_PDEV_GI_LEN  HTT_TX_PDEV_STATS_NUM_GI_COUNTERS
37 #define DP_HTT_TX_DCM_LEN  HTT_TX_PDEV_STATS_NUM_DCM_COUNTERS
38 #define DP_HTT_RX_MCS_LEN  HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS
39 #define DP_HTT_RX_NSS_LEN  HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS
40 #define DP_HTT_RX_DCM_LEN  HTT_RX_PDEV_STATS_NUM_DCM_COUNTERS
41 #define DP_HTT_RX_BW_LEN  HTT_RX_PDEV_STATS_NUM_BW_COUNTERS
42 #define DP_HTT_RX_PREAM_LEN  HTT_RX_PDEV_STATS_NUM_PREAMBLE_TYPES
43 #define DP_HTT_RSSI_CHAIN_LEN  HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS
44 #define DP_HTT_RX_GI_LEN  HTT_RX_PDEV_STATS_NUM_GI_COUNTERS
45 #define DP_HTT_FW_RING_MGMT_SUBTYPE_LEN  HTT_STATS_SUBTYPE_MAX
46 #define DP_HTT_FW_RING_CTRL_SUBTYPE_LEN  HTT_STATS_SUBTYPE_MAX
47 #define DP_HTT_FW_RING_MPDU_ERR_LEN  HTT_RX_STATS_RXDMA_MAX_ERR
48 #define DP_HTT_TID_NAME_LEN  MAX_HTT_TID_NAME
49 #define DP_HTT_PEER_NUM_SS HTT_RX_PEER_STATS_NUM_SPATIAL_STREAMS
50 #define DP_HTT_PDEV_TX_GI_LEN HTT_TX_PDEV_STATS_NUM_GI_COUNTERS
51 
52 /*
53  * dp_print_stats_string_tlv: display htt_stats_string_tlv
54  * @tag_buf: buffer containing the tlv htt_stats_string_tlv
55  *
56  * return:void
57  */
58 static inline void dp_print_stats_string_tlv(uint32_t *tag_buf)
59 {
60 	htt_stats_string_tlv *dp_stats_buf =
61 		(htt_stats_string_tlv *)tag_buf;
62 	uint8_t i;
63 	uint16_t index = 0;
64 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
65 	char *data = qdf_mem_malloc(DP_MAX_STRING_LEN);
66 
67 	if (!data) {
68 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
69 			  FL("Output buffer not allocated"));
70 		return;
71 	}
72 
73 	DP_TRACE_STATS(FATAL, "HTT_STATS_STRING_TLV:");
74 	for (i = 0; i <  tag_len; i++) {
75 		index += qdf_snprint(&data[index],
76 				DP_MAX_STRING_LEN - index,
77 				" %u:%u,", i, dp_stats_buf->data[i]);
78 	}
79 	DP_TRACE_STATS(FATAL, "data = %s\n", data);
80 	qdf_mem_free(data);
81 }
82 
83 /*
84  * dp_print_tx_pdev_stats_cmn_tlv: display htt_tx_pdev_stats_cmn_tlv
85  * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_cmn_tlv
86  *
87  * return:void
88  */
89 static inline void dp_print_tx_pdev_stats_cmn_tlv(uint32_t *tag_buf)
90 {
91 	htt_tx_pdev_stats_cmn_tlv *dp_stats_buf =
92 		(htt_tx_pdev_stats_cmn_tlv *)tag_buf;
93 
94 	DP_TRACE_STATS(FATAL, "HTT_TX_PDEV_STATS_CMN_TLV:");
95 	DP_TRACE_STATS(FATAL, "mac_id__word = %u",
96 			dp_stats_buf->mac_id__word);
97 	DP_TRACE_STATS(FATAL, "hw_queued = %u",
98 			dp_stats_buf->hw_queued);
99 	DP_TRACE_STATS(FATAL, "hw_reaped = %u",
100 			dp_stats_buf->hw_reaped);
101 	DP_TRACE_STATS(FATAL, "underrun = %u",
102 			dp_stats_buf->underrun);
103 	DP_TRACE_STATS(FATAL, "hw_paused = %u",
104 			dp_stats_buf->hw_paused);
105 	DP_TRACE_STATS(FATAL, "hw_flush = %u",
106 			dp_stats_buf->hw_flush);
107 	DP_TRACE_STATS(FATAL, "hw_filt = %u",
108 			dp_stats_buf->hw_filt);
109 	DP_TRACE_STATS(FATAL, "tx_abort = %u",
110 			dp_stats_buf->tx_abort);
111 	DP_TRACE_STATS(FATAL, "mpdu_requeued = %u",
112 			dp_stats_buf->mpdu_requed);
113 	DP_TRACE_STATS(FATAL, "tx_xretry = %u",
114 			dp_stats_buf->tx_xretry);
115 	DP_TRACE_STATS(FATAL, "data_rc = %u",
116 			dp_stats_buf->data_rc);
117 	DP_TRACE_STATS(FATAL, "mpdu_dropped_xretry = %u",
118 			dp_stats_buf->mpdu_dropped_xretry);
119 	DP_TRACE_STATS(FATAL, "illegal_rate_phy_err = %u",
120 			dp_stats_buf->illgl_rate_phy_err);
121 	DP_TRACE_STATS(FATAL, "cont_xretry = %u",
122 			dp_stats_buf->cont_xretry);
123 	DP_TRACE_STATS(FATAL, "tx_timeout = %u",
124 			dp_stats_buf->tx_timeout);
125 	DP_TRACE_STATS(FATAL, "pdev_resets = %u",
126 			dp_stats_buf->pdev_resets);
127 	DP_TRACE_STATS(FATAL, "phy_underrun = %u",
128 			dp_stats_buf->phy_underrun);
129 	DP_TRACE_STATS(FATAL, "txop_ovf = %u",
130 			dp_stats_buf->txop_ovf);
131 	DP_TRACE_STATS(FATAL, "seq_posted = %u",
132 			dp_stats_buf->seq_posted);
133 	DP_TRACE_STATS(FATAL, "seq_failed_queueing = %u",
134 			dp_stats_buf->seq_failed_queueing);
135 	DP_TRACE_STATS(FATAL, "seq_completed = %u",
136 			dp_stats_buf->seq_completed);
137 	DP_TRACE_STATS(FATAL, "seq_restarted = %u",
138 			dp_stats_buf->seq_restarted);
139 	DP_TRACE_STATS(FATAL, "mu_seq_posted = %u",
140 			dp_stats_buf->mu_seq_posted);
141 	DP_TRACE_STATS(FATAL, "seq_switch_hw_paused = %u",
142 			dp_stats_buf->seq_switch_hw_paused);
143 	DP_TRACE_STATS(FATAL, "next_seq_posted_dsr = %u",
144 			dp_stats_buf->next_seq_posted_dsr);
145 	DP_TRACE_STATS(FATAL, "seq_posted_isr = %u",
146 			dp_stats_buf->seq_posted_isr);
147 	DP_TRACE_STATS(FATAL, "seq_ctrl_cached = %u",
148 			dp_stats_buf->seq_ctrl_cached);
149 	DP_TRACE_STATS(FATAL, "mpdu_count_tqm = %u",
150 			dp_stats_buf->mpdu_count_tqm);
151 	DP_TRACE_STATS(FATAL, "msdu_count_tqm = %u",
152 			dp_stats_buf->msdu_count_tqm);
153 	DP_TRACE_STATS(FATAL, "mpdu_removed_tqm = %u",
154 			dp_stats_buf->mpdu_removed_tqm);
155 	DP_TRACE_STATS(FATAL, "msdu_removed_tqm = %u",
156 			dp_stats_buf->msdu_removed_tqm);
157 	DP_TRACE_STATS(FATAL, "mpdus_sw_flush = %u",
158 			dp_stats_buf->mpdus_sw_flush);
159 	DP_TRACE_STATS(FATAL, "mpdus_hw_filter = %u",
160 			dp_stats_buf->mpdus_hw_filter);
161 	DP_TRACE_STATS(FATAL, "mpdus_truncated = %u",
162 			dp_stats_buf->mpdus_truncated);
163 	DP_TRACE_STATS(FATAL, "mpdus_ack_failed = %u",
164 			dp_stats_buf->mpdus_ack_failed);
165 	DP_TRACE_STATS(FATAL, "mpdus_expired = %u",
166 			dp_stats_buf->mpdus_expired);
167 	DP_TRACE_STATS(FATAL, "mpdus_seq_hw_retry = %u",
168 			dp_stats_buf->mpdus_seq_hw_retry);
169 	DP_TRACE_STATS(FATAL, "ack_tlv_proc = %u",
170 			dp_stats_buf->ack_tlv_proc);
171 	DP_TRACE_STATS(FATAL, "coex_abort_mpdu_cnt_valid = %u",
172 			dp_stats_buf->coex_abort_mpdu_cnt_valid);
173 	DP_TRACE_STATS(FATAL, "coex_abort_mpdu_cnt = %u\n",
174 			dp_stats_buf->coex_abort_mpdu_cnt);
175 }
176 
177 /*
178  * dp_print_tx_pdev_stats_urrn_tlv_v: display htt_tx_pdev_stats_urrn_tlv_v
179  * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_urrn_tlv_v
180  *
181  * return:void
182  */
183 static inline void dp_print_tx_pdev_stats_urrn_tlv_v(uint32_t *tag_buf)
184 {
185 	htt_tx_pdev_stats_urrn_tlv_v *dp_stats_buf =
186 		(htt_tx_pdev_stats_urrn_tlv_v *)tag_buf;
187 	uint8_t i;
188 	uint16_t index = 0;
189 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
190 	char *urrn_stats = qdf_mem_malloc(DP_MAX_STRING_LEN);
191 
192 	if (!urrn_stats) {
193 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
194 			  FL("Output buffer not allocated"));
195 		return;
196 	}
197 
198 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_URRN_STATS);
199 	DP_TRACE_STATS(FATAL, "HTT_TX_PDEV_STATS_URRN_TLV_V:");
200 	for (i = 0; i <  tag_len; i++) {
201 		index += qdf_snprint(&urrn_stats[index],
202 				DP_MAX_STRING_LEN - index,
203 				" %u:%u,", i, dp_stats_buf->urrn_stats[i]);
204 	}
205 	DP_TRACE_STATS(FATAL, "urrn_stats = %s\n", urrn_stats);
206 	qdf_mem_free(urrn_stats);
207 }
208 
209 /*
210  * dp_print_tx_pdev_stats_flush_tlv_v: display htt_tx_pdev_stats_flush_tlv_v
211  * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_flush_tlv_v
212  *
213  * return:void
214  */
215 static inline void dp_print_tx_pdev_stats_flush_tlv_v(uint32_t *tag_buf)
216 {
217 	htt_tx_pdev_stats_flush_tlv_v *dp_stats_buf =
218 		(htt_tx_pdev_stats_flush_tlv_v *)tag_buf;
219 	uint8_t i;
220 	uint16_t index = 0;
221 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
222 	char *flush_errs = qdf_mem_malloc(DP_MAX_STRING_LEN);
223 
224 	if (!flush_errs) {
225 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
226 			  FL("Output buffer not allocated"));
227 		return;
228 	}
229 
230 	tag_len = qdf_min(tag_len,
231 			(uint32_t)HTT_TX_PDEV_MAX_FLUSH_REASON_STATS);
232 
233 	DP_TRACE_STATS(FATAL, "HTT_TX_PDEV_STATS_FLUSH_TLV_V:");
234 	for (i = 0; i <  tag_len; i++) {
235 		index += qdf_snprint(&flush_errs[index],
236 				DP_MAX_STRING_LEN - index,
237 				" %u:%u,", i, dp_stats_buf->flush_errs[i]);
238 	}
239 	DP_TRACE_STATS(FATAL, "flush_errs = %s\n", flush_errs);
240 	qdf_mem_free(flush_errs);
241 }
242 
243 /*
244  * dp_print_tx_pdev_stats_sifs_tlv_v: display htt_tx_pdev_stats_sifs_tlv_v
245  * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_sifs_tlv_v
246  *
247  * return:void
248  */
249 static inline void dp_print_tx_pdev_stats_sifs_tlv_v(uint32_t *tag_buf)
250 {
251 	htt_tx_pdev_stats_sifs_tlv_v *dp_stats_buf =
252 		(htt_tx_pdev_stats_sifs_tlv_v *)tag_buf;
253 	uint8_t i;
254 	uint16_t index = 0;
255 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
256 	char *sifs_status = qdf_mem_malloc(DP_MAX_STRING_LEN);
257 
258 	if (!sifs_status) {
259 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
260 			  FL("Output buffer not allocated"));
261 		return;
262 	}
263 
264 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_SIFS_BURST_STATS);
265 
266 	DP_TRACE_STATS(FATAL, "HTT_TX_PDEV_STATS_SIFS_TLV_V:");
267 	for (i = 0; i <  tag_len; i++) {
268 		index += qdf_snprint(&sifs_status[index],
269 				DP_MAX_STRING_LEN - index,
270 				" %u:%u,", i, dp_stats_buf->sifs_status[i]);
271 	}
272 	DP_TRACE_STATS(FATAL, "sifs_status = %s\n", sifs_status);
273 	qdf_mem_free(sifs_status);
274 }
275 
276 /*
277  * dp_print_tx_pdev_stats_phy_err_tlv_v: display htt_tx_pdev_stats_phy_err_tlv_v
278  * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_phy_err_tlv_v
279  *
280  * return:void
281  */
282 static inline void dp_print_tx_pdev_stats_phy_err_tlv_v(uint32_t *tag_buf)
283 {
284 	htt_tx_pdev_stats_phy_err_tlv_v *dp_stats_buf =
285 		(htt_tx_pdev_stats_phy_err_tlv_v *)tag_buf;
286 	uint8_t i;
287 	uint16_t index = 0;
288 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
289 	char *phy_errs = qdf_mem_malloc(DP_MAX_STRING_LEN);
290 
291 	if (!phy_errs) {
292 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
293 			  FL("Output buffer not allocated"));
294 		return;
295 	}
296 
297 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_PHY_ERR_STATS);
298 
299 	DP_TRACE_STATS(FATAL, "HTT_TX_PDEV_STATS_PHY_ERR_TLV_V:");
300 	for (i = 0; i <  tag_len; i++) {
301 		index += qdf_snprint(&phy_errs[index],
302 				DP_MAX_STRING_LEN - index,
303 				" %u:%u,", i, dp_stats_buf->phy_errs[i]);
304 	}
305 	DP_TRACE_STATS(FATAL, "phy_errs = %s\n", phy_errs);
306 	qdf_mem_free(phy_errs);
307 }
308 
309 /*
310  * dp_print_hw_stats_intr_misc_tlv: display htt_hw_stats_intr_misc_tlv
311  * @tag_buf: buffer containing the tlv htt_hw_stats_intr_misc_tlv
312  *
313  * return:void
314  */
315 static inline void dp_print_hw_stats_intr_misc_tlv(uint32_t *tag_buf)
316 {
317 	htt_hw_stats_intr_misc_tlv *dp_stats_buf =
318 		(htt_hw_stats_intr_misc_tlv *)tag_buf;
319 	uint8_t i;
320 	uint16_t index = 0;
321 	char *hw_intr_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
322 
323 	if (!hw_intr_name) {
324 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
325 			  FL("Output buffer not allocated"));
326 		return;
327 	}
328 
329 	DP_TRACE_STATS(FATAL, "HTT_HW_STATS_INTR_MISC_TLV:");
330 	for (i = 0; i <  DP_HTT_HW_INTR_NAME_LEN; i++) {
331 		index += qdf_snprint(&hw_intr_name[index],
332 				DP_MAX_STRING_LEN - index,
333 				" %u:%u,", i, dp_stats_buf->hw_intr_name[i]);
334 	}
335 	DP_TRACE_STATS(FATAL, "hw_intr_name = %s ", hw_intr_name);
336 	DP_TRACE_STATS(FATAL, "mask = %u",
337 			dp_stats_buf->mask);
338 	DP_TRACE_STATS(FATAL, "count = %u\n",
339 			dp_stats_buf->count);
340 	qdf_mem_free(hw_intr_name);
341 }
342 
343 /*
344  * dp_print_hw_stats_wd_timeout_tlv: display htt_hw_stats_wd_timeout_tlv
345  * @tag_buf: buffer containing the tlv htt_hw_stats_wd_timeout_tlv
346  *
347  * return:void
348  */
349 static inline void dp_print_hw_stats_wd_timeout_tlv(uint32_t *tag_buf)
350 {
351 	htt_hw_stats_wd_timeout_tlv *dp_stats_buf =
352 		(htt_hw_stats_wd_timeout_tlv *)tag_buf;
353 	uint8_t i;
354 	uint16_t index = 0;
355 	char *hw_module_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
356 
357 	if (!hw_module_name) {
358 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
359 			  FL("Output buffer not allocated"));
360 		return;
361 	}
362 
363 	DP_TRACE_STATS(FATAL, "HTT_HW_STATS_WD_TIMEOUT_TLV:");
364 	for (i = 0; i <  DP_HTT_HW_MODULE_NAME_LEN; i++) {
365 		index += qdf_snprint(&hw_module_name[index],
366 				DP_MAX_STRING_LEN - index,
367 				" %u:%u,", i, dp_stats_buf->hw_module_name[i]);
368 	}
369 	DP_TRACE_STATS(FATAL, "hw_module_name = %s ", hw_module_name);
370 	DP_TRACE_STATS(FATAL, "count = %u",
371 			dp_stats_buf->count);
372 	qdf_mem_free(hw_module_name);
373 }
374 
375 /*
376  * dp_print_hw_stats_pdev_errs_tlv: display htt_hw_stats_pdev_errs_tlv
377  * @tag_buf: buffer containing the tlv htt_hw_stats_pdev_errs_tlv
378  *
379  * return:void
380  */
381 static inline void dp_print_hw_stats_pdev_errs_tlv(uint32_t *tag_buf)
382 {
383 	htt_hw_stats_pdev_errs_tlv *dp_stats_buf =
384 		(htt_hw_stats_pdev_errs_tlv *)tag_buf;
385 
386 	DP_TRACE_STATS(FATAL, "HTT_HW_STATS_PDEV_ERRS_TLV:");
387 	DP_TRACE_STATS(FATAL, "mac_id__word = %u",
388 			dp_stats_buf->mac_id__word);
389 	DP_TRACE_STATS(FATAL, "tx_abort = %u",
390 			dp_stats_buf->tx_abort);
391 	DP_TRACE_STATS(FATAL, "tx_abort_fail_count = %u",
392 			dp_stats_buf->tx_abort_fail_count);
393 	DP_TRACE_STATS(FATAL, "rx_abort = %u",
394 			dp_stats_buf->rx_abort);
395 	DP_TRACE_STATS(FATAL, "rx_abort_fail_count = %u",
396 			dp_stats_buf->rx_abort_fail_count);
397 	DP_TRACE_STATS(FATAL, "warm_reset = %u",
398 			dp_stats_buf->warm_reset);
399 	DP_TRACE_STATS(FATAL, "cold_reset = %u",
400 			dp_stats_buf->cold_reset);
401 	DP_TRACE_STATS(FATAL, "tx_flush = %u",
402 			dp_stats_buf->tx_flush);
403 	DP_TRACE_STATS(FATAL, "tx_glb_reset = %u",
404 			dp_stats_buf->tx_glb_reset);
405 	DP_TRACE_STATS(FATAL, "tx_txq_reset = %u",
406 			dp_stats_buf->tx_txq_reset);
407 	DP_TRACE_STATS(FATAL, "rx_timeout_reset = %u\n",
408 			dp_stats_buf->rx_timeout_reset);
409 }
410 
411 /*
412  * dp_print_msdu_flow_stats_tlv: display htt_msdu_flow_stats_tlv
413  * @tag_buf: buffer containing the tlv htt_msdu_flow_stats_tlv
414  *
415  * return:void
416  */
417 static inline void dp_print_msdu_flow_stats_tlv(uint32_t *tag_buf)
418 {
419 	htt_msdu_flow_stats_tlv *dp_stats_buf =
420 		(htt_msdu_flow_stats_tlv *)tag_buf;
421 
422 	DP_TRACE_STATS(FATAL, "HTT_MSDU_FLOW_STATS_TLV:");
423 	DP_TRACE_STATS(FATAL, "last_update_timestamp = %u",
424 			dp_stats_buf->last_update_timestamp);
425 	DP_TRACE_STATS(FATAL, "last_add_timestamp = %u",
426 			dp_stats_buf->last_add_timestamp);
427 	DP_TRACE_STATS(FATAL, "last_remove_timestamp = %u",
428 			dp_stats_buf->last_remove_timestamp);
429 	DP_TRACE_STATS(FATAL, "total_processed_msdu_count = %u",
430 			dp_stats_buf->total_processed_msdu_count);
431 	DP_TRACE_STATS(FATAL, "cur_msdu_count_in_flowq = %u",
432 			dp_stats_buf->cur_msdu_count_in_flowq);
433 	DP_TRACE_STATS(FATAL, "sw_peer_id = %u",
434 			dp_stats_buf->sw_peer_id);
435 	DP_TRACE_STATS(FATAL, "tx_flow_no__tid_num__drop_rule = %u\n",
436 			dp_stats_buf->tx_flow_no__tid_num__drop_rule);
437 }
438 
439 /*
440  * dp_print_tx_tid_stats_tlv: display htt_tx_tid_stats_tlv
441  * @tag_buf: buffer containing the tlv htt_tx_tid_stats_tlv
442  *
443  * return:void
444  */
445 static inline void dp_print_tx_tid_stats_tlv(uint32_t *tag_buf)
446 {
447 	htt_tx_tid_stats_tlv *dp_stats_buf =
448 		(htt_tx_tid_stats_tlv *)tag_buf;
449 	uint8_t i;
450 	uint16_t index = 0;
451 	char *tid_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
452 
453 	if (!tid_name) {
454 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
455 			  FL("Output buffer not allocated"));
456 		return;
457 	}
458 
459 	DP_TRACE_STATS(FATAL, "HTT_TX_TID_STATS_TLV:");
460 	for (i = 0; i <  DP_HTT_TID_NAME_LEN; i++) {
461 		index += qdf_snprint(&tid_name[index],
462 				DP_MAX_STRING_LEN - index,
463 				" %u:%u,", i, dp_stats_buf->tid_name[i]);
464 	}
465 	DP_TRACE_STATS(FATAL, "tid_name = %s ", tid_name);
466 	DP_TRACE_STATS(FATAL, "sw_peer_id__tid_num = %u",
467 			dp_stats_buf->sw_peer_id__tid_num);
468 	DP_TRACE_STATS(FATAL, "num_sched_pending__num_ppdu_in_hwq = %u",
469 			dp_stats_buf->num_sched_pending__num_ppdu_in_hwq);
470 	DP_TRACE_STATS(FATAL, "tid_flags = %u",
471 			dp_stats_buf->tid_flags);
472 	DP_TRACE_STATS(FATAL, "hw_queued = %u",
473 			dp_stats_buf->hw_queued);
474 	DP_TRACE_STATS(FATAL, "hw_reaped = %u",
475 			dp_stats_buf->hw_reaped);
476 	DP_TRACE_STATS(FATAL, "mpdus_hw_filter = %u",
477 			dp_stats_buf->mpdus_hw_filter);
478 	DP_TRACE_STATS(FATAL, "qdepth_bytes = %u",
479 			dp_stats_buf->qdepth_bytes);
480 	DP_TRACE_STATS(FATAL, "qdepth_num_msdu = %u",
481 			dp_stats_buf->qdepth_num_msdu);
482 	DP_TRACE_STATS(FATAL, "qdepth_num_mpdu = %u",
483 			dp_stats_buf->qdepth_num_mpdu);
484 	DP_TRACE_STATS(FATAL, "last_scheduled_tsmp = %u",
485 			dp_stats_buf->last_scheduled_tsmp);
486 	DP_TRACE_STATS(FATAL, "pause_module_id = %u",
487 			dp_stats_buf->pause_module_id);
488 	DP_TRACE_STATS(FATAL, "block_module_id = %u\n",
489 			dp_stats_buf->block_module_id);
490 	DP_TRACE_STATS(FATAL, "tid_tx_airtime = %u\n",
491 			dp_stats_buf->tid_tx_airtime);
492 	qdf_mem_free(tid_name);
493 }
494 
495 #ifdef CONFIG_WIN
496 /*
497  * dp_print_tx_tid_stats_v1_tlv: display htt_tx_tid_stats_v1_tlv
498  * @tag_buf: buffer containing the tlv htt_tx_tid_stats_v1_tlv
499  *
500  * return:void
501  */
502 static inline void dp_print_tx_tid_stats_v1_tlv(uint32_t *tag_buf)
503 {
504 	htt_tx_tid_stats_v1_tlv *dp_stats_buf =
505 		(htt_tx_tid_stats_v1_tlv *)tag_buf;
506 	uint8_t i;
507 	uint16_t index = 0;
508 	char *tid_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
509 
510 	if (!tid_name) {
511 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
512 			  FL("Output buffer not allocated"));
513 		return;
514 	}
515 
516 	DP_TRACE_STATS(FATAL, "HTT_TX_TID_STATS_V1_TLV:");
517 	for (i = 0; i <  DP_HTT_TID_NAME_LEN; i++) {
518 		index += qdf_snprint(&tid_name[index],
519 				DP_MAX_STRING_LEN - index,
520 				" %u:%u,", i, dp_stats_buf->tid_name[i]);
521 	}
522 	DP_TRACE_STATS(FATAL, "tid_name = %s ", tid_name);
523 	DP_TRACE_STATS(FATAL, "sw_peer_id__tid_num = %u",
524 			dp_stats_buf->sw_peer_id__tid_num);
525 	DP_TRACE_STATS(FATAL, "num_sched_pending__num_ppdu_in_hwq = %u",
526 			dp_stats_buf->num_sched_pending__num_ppdu_in_hwq);
527 	DP_TRACE_STATS(FATAL, "tid_flags = %u",
528 			dp_stats_buf->tid_flags);
529 	DP_TRACE_STATS(FATAL, "max_qdepth_bytes = %u",
530 			dp_stats_buf->max_qdepth_bytes);
531 	DP_TRACE_STATS(FATAL, "max_qdepth_n_msdus = %u",
532 			dp_stats_buf->max_qdepth_n_msdus);
533 	DP_TRACE_STATS(FATAL, "rsvd = %u",
534 			dp_stats_buf->rsvd);
535 	DP_TRACE_STATS(FATAL, "qdepth_bytes = %u",
536 			dp_stats_buf->qdepth_bytes);
537 	DP_TRACE_STATS(FATAL, "qdepth_num_msdu = %u",
538 			dp_stats_buf->qdepth_num_msdu);
539 	DP_TRACE_STATS(FATAL, "qdepth_num_mpdu = %u",
540 			dp_stats_buf->qdepth_num_mpdu);
541 	DP_TRACE_STATS(FATAL, "last_scheduled_tsmp = %u",
542 			dp_stats_buf->last_scheduled_tsmp);
543 	DP_TRACE_STATS(FATAL, "pause_module_id = %u",
544 			dp_stats_buf->pause_module_id);
545 	DP_TRACE_STATS(FATAL, "block_module_id = %u\n",
546 			dp_stats_buf->block_module_id);
547 	DP_TRACE_STATS(FATAL, "tid_tx_airtime = %u\n",
548 			dp_stats_buf->tid_tx_airtime);
549 	qdf_mem_free(tid_name);
550 }
551 #endif
552 
553 /*
554  * dp_print_rx_tid_stats_tlv: display htt_rx_tid_stats_tlv
555  * @tag_buf: buffer containing the tlv htt_rx_tid_stats_tlv
556  *
557  * return:void
558  */
559 static inline void dp_print_rx_tid_stats_tlv(uint32_t *tag_buf)
560 {
561 	htt_rx_tid_stats_tlv *dp_stats_buf =
562 		(htt_rx_tid_stats_tlv *)tag_buf;
563 	uint8_t i;
564 	uint16_t index = 0;
565 	char *tid_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
566 
567 	if (!tid_name) {
568 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
569 			  FL("Output buffer not allocated"));
570 		return;
571 	}
572 
573 	DP_TRACE_STATS(FATAL, "HTT_RX_TID_STATS_TLV:");
574 	DP_TRACE_STATS(FATAL, "sw_peer_id__tid_num = %u",
575 			dp_stats_buf->sw_peer_id__tid_num);
576 	for (i = 0; i <  DP_HTT_TID_NAME_LEN; i++) {
577 		index += qdf_snprint(&tid_name[index],
578 				DP_MAX_STRING_LEN - index,
579 				" %u:%u,", i, dp_stats_buf->tid_name[i]);
580 	}
581 	DP_TRACE_STATS(FATAL, "tid_name = %s ", tid_name);
582 	DP_TRACE_STATS(FATAL, "dup_in_reorder = %u",
583 			dp_stats_buf->dup_in_reorder);
584 	DP_TRACE_STATS(FATAL, "dup_past_outside_window = %u",
585 			dp_stats_buf->dup_past_outside_window);
586 	DP_TRACE_STATS(FATAL, "dup_past_within_window = %u",
587 			dp_stats_buf->dup_past_within_window);
588 	DP_TRACE_STATS(FATAL, "rxdesc_err_decrypt = %u\n",
589 			dp_stats_buf->rxdesc_err_decrypt);
590 	qdf_mem_free(tid_name);
591 }
592 
593 /*
594  * dp_print_counter_tlv: display htt_counter_tlv
595  * @tag_buf: buffer containing the tlv htt_counter_tlv
596  *
597  * return:void
598  */
599 static inline void dp_print_counter_tlv(uint32_t *tag_buf)
600 {
601 	htt_counter_tlv *dp_stats_buf =
602 		(htt_counter_tlv *)tag_buf;
603 	uint8_t i;
604 	uint16_t index = 0;
605 	char *counter_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
606 
607 	if (!counter_name) {
608 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
609 			  FL("Output buffer not allocated"));
610 		return;
611 	}
612 
613 	DP_TRACE_STATS(FATAL, "HTT_COUNTER_TLV:");
614 	for (i = 0; i <  DP_HTT_COUNTER_NAME_LEN; i++) {
615 		index += qdf_snprint(&counter_name[index],
616 				DP_MAX_STRING_LEN - index,
617 				" %u:%u,", i, dp_stats_buf->counter_name[i]);
618 	}
619 	DP_TRACE_STATS(FATAL, "counter_name = %s ", counter_name);
620 	DP_TRACE_STATS(FATAL, "count = %u\n",
621 			dp_stats_buf->count);
622 	qdf_mem_free(counter_name);
623 }
624 
625 /*
626  * dp_print_peer_stats_cmn_tlv: display htt_peer_stats_cmn_tlv
627  * @tag_buf: buffer containing the tlv htt_peer_stats_cmn_tlv
628  *
629  * return:void
630  */
631 static inline void dp_print_peer_stats_cmn_tlv(uint32_t *tag_buf)
632 {
633 	htt_peer_stats_cmn_tlv *dp_stats_buf =
634 		(htt_peer_stats_cmn_tlv *)tag_buf;
635 
636 	DP_TRACE_STATS(FATAL, "HTT_PEER_STATS_CMN_TLV:");
637 	DP_TRACE_STATS(FATAL, "ppdu_cnt = %u",
638 			dp_stats_buf->ppdu_cnt);
639 	DP_TRACE_STATS(FATAL, "mpdu_cnt = %u",
640 			dp_stats_buf->mpdu_cnt);
641 	DP_TRACE_STATS(FATAL, "msdu_cnt = %u",
642 			dp_stats_buf->msdu_cnt);
643 	DP_TRACE_STATS(FATAL, "pause_bitmap = %u",
644 			dp_stats_buf->pause_bitmap);
645 	DP_TRACE_STATS(FATAL, "block_bitmap = %u",
646 			dp_stats_buf->block_bitmap);
647 	DP_TRACE_STATS(FATAL, "current_timestamp = %u\n",
648 			dp_stats_buf->current_timestamp);
649 	DP_TRACE_STATS(FATAL, "inactive_time = %u",
650 		       dp_stats_buf->inactive_time);
651 }
652 
653 /*
654  * dp_print_peer_details_tlv: display htt_peer_details_tlv
655  * @tag_buf: buffer containing the tlv htt_peer_details_tlv
656  *
657  * return:void
658  */
659 static inline void dp_print_peer_details_tlv(uint32_t *tag_buf)
660 {
661 	htt_peer_details_tlv *dp_stats_buf =
662 		(htt_peer_details_tlv *)tag_buf;
663 
664 	DP_TRACE_STATS(FATAL, "HTT_PEER_DETAILS_TLV:");
665 	DP_TRACE_STATS(FATAL, "peer_type = %u",
666 			dp_stats_buf->peer_type);
667 	DP_TRACE_STATS(FATAL, "sw_peer_id = %u",
668 			dp_stats_buf->sw_peer_id);
669 	DP_TRACE_STATS(FATAL, "vdev_pdev_ast_idx = %u",
670 			dp_stats_buf->vdev_pdev_ast_idx);
671 	DP_TRACE_STATS(FATAL, "mac_addr(upper 4 bytes) = %u",
672 			dp_stats_buf->mac_addr.mac_addr31to0);
673 	DP_TRACE_STATS(FATAL, "mac_addr(lower 2 bytes) = %u",
674 			dp_stats_buf->mac_addr.mac_addr47to32);
675 	DP_TRACE_STATS(FATAL, "peer_flags = %u",
676 			dp_stats_buf->peer_flags);
677 	DP_TRACE_STATS(FATAL, "qpeer_flags = %u\n",
678 			dp_stats_buf->qpeer_flags);
679 }
680 
681 /*
682  * dp_print_tx_peer_rate_stats_tlv: display htt_tx_peer_rate_stats_tlv
683  * @tag_buf: buffer containing the tlv htt_tx_peer_rate_stats_tlv
684  *
685  * return:void
686  */
687 static inline void dp_print_tx_peer_rate_stats_tlv(uint32_t *tag_buf)
688 {
689 	htt_tx_peer_rate_stats_tlv *dp_stats_buf =
690 		(htt_tx_peer_rate_stats_tlv *)tag_buf;
691 	uint8_t i, j;
692 	uint16_t index = 0;
693 	char *tx_gi[HTT_TX_PEER_STATS_NUM_GI_COUNTERS];
694 	char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
695 
696 	if (!str_buf) {
697 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
698 			  FL("Output buffer not allocated"));
699 		return;
700 	}
701 
702 	for (i = 0; i < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; i++)
703 		tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
704 
705 	DP_TRACE_STATS(FATAL, "HTT_TX_PEER_RATE_STATS_TLV:");
706 	DP_TRACE_STATS(FATAL, "tx_ldpc = %u",
707 			dp_stats_buf->tx_ldpc);
708 	DP_TRACE_STATS(FATAL, "rts_cnt = %u",
709 			dp_stats_buf->rts_cnt);
710 	DP_TRACE_STATS(FATAL, "ack_rssi = %u",
711 			dp_stats_buf->ack_rssi);
712 
713 	index = 0;
714 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
715 	for (i = 0; i <  DP_HTT_TX_MCS_LEN; i++) {
716 		index += qdf_snprint(&str_buf[index],
717 				DP_MAX_STRING_LEN - index,
718 				" %u:%u,", i, dp_stats_buf->tx_mcs[i]);
719 	}
720 	DP_TRACE_STATS(FATAL, "tx_mcs = %s ", str_buf);
721 
722 	index = 0;
723 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
724 	for (i = 0; i <  DP_HTT_TX_SU_MCS_LEN; i++) {
725 		index += qdf_snprint(&str_buf[index],
726 				DP_MAX_STRING_LEN - index,
727 				" %u:%u,", i, dp_stats_buf->tx_su_mcs[i]);
728 	}
729 	DP_TRACE_STATS(FATAL, "tx_su_mcs = %s ", str_buf);
730 	index = 0;
731 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
732 	for (i = 0; i <  DP_HTT_TX_MU_MCS_LEN; i++) {
733 		index += qdf_snprint(&str_buf[index],
734 				DP_MAX_STRING_LEN - index,
735 				" %u:%u,", i, dp_stats_buf->tx_mu_mcs[i]);
736 	}
737 	DP_TRACE_STATS(FATAL, "tx_mu_mcs = %s ", str_buf);
738 	index = 0;
739 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
740 	for (i = 0; i <  DP_HTT_TX_NSS_LEN; i++) {
741 		/* 0 stands for NSS 1, 1 stands for NSS 2, etc. */
742 		index += qdf_snprint(&str_buf[index],
743 				DP_MAX_STRING_LEN - index,
744 				" %u:%u,", (i + 1),
745 				dp_stats_buf->tx_nss[i]);
746 	}
747 	DP_TRACE_STATS(FATAL, "tx_nss = %s ", str_buf);
748 	index = 0;
749 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
750 	for (i = 0; i <  DP_HTT_TX_BW_LEN; i++) {
751 		index += qdf_snprint(&str_buf[index],
752 				DP_MAX_STRING_LEN - index,
753 				" %u:%u,", i, dp_stats_buf->tx_bw[i]);
754 	}
755 	DP_TRACE_STATS(FATAL, "tx_bw = %s ", str_buf);
756 	index = 0;
757 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
758 	for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
759 		index += qdf_snprint(&str_buf[index],
760 				DP_MAX_STRING_LEN - index,
761 				" %u:%u,", i, dp_stats_buf->tx_stbc[i]);
762 	}
763 	DP_TRACE_STATS(FATAL, "tx_stbc = %s ", str_buf);
764 	index = 0;
765 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
766 
767 	for (i = 0; i <  DP_HTT_TX_PREAM_LEN; i++) {
768 		index += qdf_snprint(&str_buf[index],
769 				DP_MAX_STRING_LEN - index,
770 				" %u:%u,", i, dp_stats_buf->tx_pream[i]);
771 	}
772 	DP_TRACE_STATS(FATAL, "tx_pream = %s ", str_buf);
773 
774 	for (j = 0; j < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; j++) {
775 		index = 0;
776 		for (i = 0; i <  HTT_TX_PEER_STATS_NUM_MCS_COUNTERS; i++) {
777 			index += qdf_snprint(&tx_gi[j][index],
778 					DP_MAX_STRING_LEN - index,
779 					" %u:%u,", i,
780 					dp_stats_buf->tx_gi[j][i]);
781 		}
782 		DP_TRACE_STATS(FATAL, "tx_gi[%u] = %s ", j, tx_gi[j]);
783 	}
784 
785 	index = 0;
786 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
787 	for (i = 0; i <  DP_HTT_TX_DCM_LEN; i++) {
788 		index += qdf_snprint(&str_buf[index],
789 				DP_MAX_STRING_LEN - index,
790 				" %u:%u,", i, dp_stats_buf->tx_dcm[i]);
791 	}
792 	DP_TRACE_STATS(FATAL, "tx_dcm = %s\n", str_buf);
793 	for (i = 0; i < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; i++)
794 		qdf_mem_free(tx_gi[i]);
795 
796 	qdf_mem_free(str_buf);
797 }
798 
799 /*
800  * dp_print_rx_peer_rate_stats_tlv: display htt_rx_peer_rate_stats_tlv
801  * @tag_buf: buffer containing the tlv htt_rx_peer_rate_stats_tlv
802  *
803  * return:void
804  */
805 static inline void dp_print_rx_peer_rate_stats_tlv(uint32_t *tag_buf)
806 {
807 	htt_rx_peer_rate_stats_tlv *dp_stats_buf =
808 		(htt_rx_peer_rate_stats_tlv *)tag_buf;
809 	uint8_t i, j;
810 	uint16_t index = 0;
811 	char *rssi_chain[DP_HTT_PEER_NUM_SS];
812 	char *rx_gi[HTT_RX_PEER_STATS_NUM_GI_COUNTERS];
813 	char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
814 
815 	if (!str_buf) {
816 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
817 			  FL("Output buffer not allocated"));
818 		return;
819 	}
820 
821 	for (i = 0; i < DP_HTT_PEER_NUM_SS; i++)
822 		rssi_chain[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
823 	for (i = 0; i < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; i++)
824 		rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
825 
826 	DP_TRACE_STATS(FATAL, "HTT_RX_PEER_RATE_STATS_TLV:");
827 	DP_TRACE_STATS(FATAL, "nsts = %u",
828 			dp_stats_buf->nsts);
829 	DP_TRACE_STATS(FATAL, "rx_ldpc = %u",
830 			dp_stats_buf->rx_ldpc);
831 	DP_TRACE_STATS(FATAL, "rts_cnt = %u",
832 			dp_stats_buf->rts_cnt);
833 	DP_TRACE_STATS(FATAL, "rssi_mgmt = %u",
834 			dp_stats_buf->rssi_mgmt);
835 	DP_TRACE_STATS(FATAL, "rssi_data = %u",
836 			dp_stats_buf->rssi_data);
837 	DP_TRACE_STATS(FATAL, "rssi_comb = %u",
838 			dp_stats_buf->rssi_comb);
839 
840 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
841 	for (i = 0; i <  DP_HTT_RX_MCS_LEN; i++) {
842 		index += qdf_snprint(&str_buf[index],
843 				DP_MAX_STRING_LEN - index,
844 				" %u:%u,", i, dp_stats_buf->rx_mcs[i]);
845 	}
846 	DP_TRACE_STATS(FATAL, "rx_mcs = %s ", str_buf);
847 
848 	index = 0;
849 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
850 	for (i = 0; i <  DP_HTT_RX_NSS_LEN; i++) {
851 		/* 0 stands for NSS 1, 1 stands for NSS 2, etc. */
852 		index += qdf_snprint(&str_buf[index],
853 				DP_MAX_STRING_LEN - index,
854 				" %u:%u,", (i + 1),
855 				dp_stats_buf->rx_nss[i]);
856 	}
857 	DP_TRACE_STATS(FATAL, "rx_nss = %s ", str_buf);
858 
859 	index = 0;
860 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
861 	for (i = 0; i <  DP_HTT_RX_DCM_LEN; i++) {
862 		index += qdf_snprint(&str_buf[index],
863 				DP_MAX_STRING_LEN - index,
864 				" %u:%u,", i, dp_stats_buf->rx_dcm[i]);
865 	}
866 	DP_TRACE_STATS(FATAL, "rx_dcm = %s ", str_buf);
867 
868 	index = 0;
869 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
870 	for (i = 0; i <  HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
871 		index += qdf_snprint(&str_buf[index],
872 				DP_MAX_STRING_LEN - index,
873 				" %u:%u,", i, dp_stats_buf->rx_stbc[i]);
874 	}
875 	DP_TRACE_STATS(FATAL, "rx_stbc = %s ", str_buf);
876 
877 	index = 0;
878 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
879 	for (i = 0; i <  DP_HTT_RX_BW_LEN; i++) {
880 		index += qdf_snprint(&str_buf[index],
881 				DP_MAX_STRING_LEN - index,
882 				" %u:%u,", i, dp_stats_buf->rx_bw[i]);
883 	}
884 	DP_TRACE_STATS(FATAL, "rx_bw = %s ", str_buf);
885 
886 	for (j = 0; j < DP_HTT_PEER_NUM_SS; j++) {
887 		qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
888 		index = 0;
889 		for (i = 0; i <  HTT_RX_PEER_STATS_NUM_BW_COUNTERS; i++) {
890 			index += qdf_snprint(&rssi_chain[j][index],
891 					DP_MAX_STRING_LEN - index,
892 					" %u:%u,", i,
893 					dp_stats_buf->rssi_chain[j][i]);
894 		}
895 		DP_TRACE_STATS(FATAL, "rssi_chain[%u] = %s ", j, rssi_chain[j]);
896 	}
897 
898 	for (j = 0; j < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; j++) {
899 		index = 0;
900 		for (i = 0; i <  HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
901 			index += qdf_snprint(&rx_gi[j][index],
902 					DP_MAX_STRING_LEN - index,
903 					" %u:%u,", i,
904 					dp_stats_buf->rx_gi[j][i]);
905 		}
906 		DP_TRACE_STATS(FATAL, "rx_gi[%u] = %s ", j, rx_gi[j]);
907 	}
908 	index = 0;
909 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
910 	for (i = 0; i <  DP_HTT_RX_PREAM_LEN; i++) {
911 		index += qdf_snprint(&str_buf[index],
912 				DP_MAX_STRING_LEN - index,
913 				" %u:%u,", i, dp_stats_buf->rx_pream[i]);
914 	}
915 	DP_TRACE_STATS(FATAL, "rx_pream = %s\n", str_buf);
916 
917 	for (i = 0; i < DP_HTT_PEER_NUM_SS; i++)
918 		qdf_mem_free(rssi_chain[i]);
919 	for (i = 0; i < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; i++)
920 		qdf_mem_free(rx_gi[i]);
921 
922 	qdf_mem_free(str_buf);
923 }
924 
925 /*
926  * dp_print_tx_hwq_mu_mimo_sch_stats_tlv: display htt_tx_hwq_mu_mimo_sch_stats
927  * @tag_buf: buffer containing the tlv htt_tx_hwq_mu_mimo_sch_stats_tlv
928  *
929  * return:void
930  */
931 static inline void dp_print_tx_hwq_mu_mimo_sch_stats_tlv(uint32_t *tag_buf)
932 {
933 	htt_tx_hwq_mu_mimo_sch_stats_tlv *dp_stats_buf =
934 		(htt_tx_hwq_mu_mimo_sch_stats_tlv *)tag_buf;
935 
936 	DP_TRACE_STATS(FATAL, "HTT_TX_HWQ_MU_MIMO_SCH_STATS_TLV:");
937 	DP_TRACE_STATS(FATAL, "mu_mimo_sch_posted = %u",
938 			dp_stats_buf->mu_mimo_sch_posted);
939 	DP_TRACE_STATS(FATAL, "mu_mimo_sch_failed = %u",
940 			dp_stats_buf->mu_mimo_sch_failed);
941 	DP_TRACE_STATS(FATAL, "mu_mimo_ppdu_posted = %u\n",
942 			dp_stats_buf->mu_mimo_ppdu_posted);
943 }
944 
945 /*
946  * dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv: display htt_tx_hwq_mu_mimo_mpdu_stats
947  * @tag_buf: buffer containing the tlv htt_tx_hwq_mu_mimo_mpdu_stats_tlv
948  *
949  * return:void
950  */
951 static inline void dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv(uint32_t *tag_buf)
952 {
953 	htt_tx_hwq_mu_mimo_mpdu_stats_tlv *dp_stats_buf =
954 		(htt_tx_hwq_mu_mimo_mpdu_stats_tlv *)tag_buf;
955 
956 	DP_TRACE_STATS(FATAL, "HTT_TX_HWQ_MU_MIMO_MPDU_STATS_TLV:");
957 	DP_TRACE_STATS(FATAL, "mu_mimo_mpdus_queued_usr = %u",
958 			dp_stats_buf->mu_mimo_mpdus_queued_usr);
959 	DP_TRACE_STATS(FATAL, "mu_mimo_mpdus_tried_usr = %u",
960 			dp_stats_buf->mu_mimo_mpdus_tried_usr);
961 	DP_TRACE_STATS(FATAL, "mu_mimo_mpdus_failed_usr = %u",
962 			dp_stats_buf->mu_mimo_mpdus_failed_usr);
963 	DP_TRACE_STATS(FATAL, "mu_mimo_mpdus_requeued_usr = %u",
964 			dp_stats_buf->mu_mimo_mpdus_requeued_usr);
965 	DP_TRACE_STATS(FATAL, "mu_mimo_err_no_ba_usr = %u",
966 			dp_stats_buf->mu_mimo_err_no_ba_usr);
967 	DP_TRACE_STATS(FATAL, "mu_mimo_mpdu_underrun_usr = %u",
968 			dp_stats_buf->mu_mimo_mpdu_underrun_usr);
969 	DP_TRACE_STATS(FATAL, "mu_mimo_ampdu_underrun_usr = %u\n",
970 			dp_stats_buf->mu_mimo_ampdu_underrun_usr);
971 }
972 
973 /*
974  * dp_print_tx_hwq_mu_mimo_cmn_stats_tlv: display htt_tx_hwq_mu_mimo_cmn_stats
975  * @tag_buf: buffer containing the tlv htt_tx_hwq_mu_mimo_cmn_stats_tlv
976  *
977  * return:void
978  */
979 static inline void dp_print_tx_hwq_mu_mimo_cmn_stats_tlv(uint32_t *tag_buf)
980 {
981 	htt_tx_hwq_mu_mimo_cmn_stats_tlv *dp_stats_buf =
982 		(htt_tx_hwq_mu_mimo_cmn_stats_tlv *)tag_buf;
983 
984 	DP_TRACE_STATS(FATAL, "HTT_TX_HWQ_MU_MIMO_CMN_STATS_TLV:");
985 	DP_TRACE_STATS(FATAL, "mac_id__hwq_id__word = %u\n",
986 			dp_stats_buf->mac_id__hwq_id__word);
987 }
988 
989 /*
990  * dp_print_tx_hwq_stats_cmn_tlv: display htt_tx_hwq_stats_cmn_tlv
991  * @tag_buf: buffer containing the tlv htt_tx_hwq_stats_cmn_tlv
992  *
993  * return:void
994  */
995 static inline void dp_print_tx_hwq_stats_cmn_tlv(uint32_t *tag_buf)
996 {
997 	htt_tx_hwq_stats_cmn_tlv *dp_stats_buf =
998 		(htt_tx_hwq_stats_cmn_tlv *)tag_buf;
999 
1000 	DP_TRACE_STATS(FATAL, "HTT_TX_HWQ_STATS_CMN_TLV:");
1001 	DP_TRACE_STATS(FATAL, "mac_id__hwq_id__word = %u",
1002 			dp_stats_buf->mac_id__hwq_id__word);
1003 	DP_TRACE_STATS(FATAL, "xretry = %u",
1004 			dp_stats_buf->xretry);
1005 	DP_TRACE_STATS(FATAL, "underrun_cnt = %u",
1006 			dp_stats_buf->underrun_cnt);
1007 	DP_TRACE_STATS(FATAL, "flush_cnt = %u",
1008 			dp_stats_buf->flush_cnt);
1009 	DP_TRACE_STATS(FATAL, "filt_cnt = %u",
1010 			dp_stats_buf->filt_cnt);
1011 	DP_TRACE_STATS(FATAL, "null_mpdu_bmap = %u",
1012 			dp_stats_buf->null_mpdu_bmap);
1013 	DP_TRACE_STATS(FATAL, "user_ack_failure = %u",
1014 			dp_stats_buf->user_ack_failure);
1015 	DP_TRACE_STATS(FATAL, "ack_tlv_proc = %u",
1016 			dp_stats_buf->ack_tlv_proc);
1017 	DP_TRACE_STATS(FATAL, "sched_id_proc = %u",
1018 			dp_stats_buf->sched_id_proc);
1019 	DP_TRACE_STATS(FATAL, "null_mpdu_tx_count = %u",
1020 			dp_stats_buf->null_mpdu_tx_count);
1021 	DP_TRACE_STATS(FATAL, "mpdu_bmap_not_recvd = %u",
1022 			dp_stats_buf->mpdu_bmap_not_recvd);
1023 	DP_TRACE_STATS(FATAL, "num_bar = %u",
1024 			dp_stats_buf->num_bar);
1025 	DP_TRACE_STATS(FATAL, "rts = %u",
1026 			dp_stats_buf->rts);
1027 	DP_TRACE_STATS(FATAL, "cts2self = %u",
1028 			dp_stats_buf->cts2self);
1029 	DP_TRACE_STATS(FATAL, "qos_null = %u",
1030 			dp_stats_buf->qos_null);
1031 	DP_TRACE_STATS(FATAL, "mpdu_tried_cnt = %u",
1032 			dp_stats_buf->mpdu_tried_cnt);
1033 	DP_TRACE_STATS(FATAL, "mpdu_queued_cnt = %u",
1034 			dp_stats_buf->mpdu_queued_cnt);
1035 	DP_TRACE_STATS(FATAL, "mpdu_ack_fail_cnt = %u",
1036 			dp_stats_buf->mpdu_ack_fail_cnt);
1037 	DP_TRACE_STATS(FATAL, "mpdu_filt_cnt = %u",
1038 			dp_stats_buf->mpdu_filt_cnt);
1039 	DP_TRACE_STATS(FATAL, "false_mpdu_ack_count = %u\n",
1040 			dp_stats_buf->false_mpdu_ack_count);
1041 }
1042 
1043 /*
1044  * dp_print_tx_hwq_difs_latency_stats_tlv_v: display
1045  *					htt_tx_hwq_difs_latency_stats_tlv_v
1046  * @tag_buf: buffer containing the tlv htt_tx_hwq_difs_latency_stats_tlv_v
1047  *
1048  *return:void
1049  */
1050 static inline void dp_print_tx_hwq_difs_latency_stats_tlv_v(uint32_t *tag_buf)
1051 {
1052 	htt_tx_hwq_difs_latency_stats_tlv_v *dp_stats_buf =
1053 		(htt_tx_hwq_difs_latency_stats_tlv_v *)tag_buf;
1054 	uint8_t i;
1055 	uint16_t index = 0;
1056 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
1057 	char *difs_latency_hist = qdf_mem_malloc(DP_MAX_STRING_LEN);
1058 
1059 	if (!difs_latency_hist) {
1060 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
1061 			  FL("Output buffer not allocated"));
1062 		return;
1063 	}
1064 
1065 	tag_len = qdf_min(tag_len,
1066 			(uint32_t)HTT_TX_HWQ_MAX_DIFS_LATENCY_BINS);
1067 
1068 	DP_TRACE_STATS(FATAL, "HTT_TX_HWQ_DIFS_LATENCY_STATS_TLV_V:");
1069 	DP_TRACE_STATS(FATAL, "hist_intvl = %u",
1070 			dp_stats_buf->hist_intvl);
1071 
1072 	for (i = 0; i <  tag_len; i++) {
1073 		index += qdf_snprint(&difs_latency_hist[index],
1074 				DP_MAX_STRING_LEN - index,
1075 				" %u:%u,", i,
1076 				dp_stats_buf->difs_latency_hist[i]);
1077 	}
1078 	DP_TRACE_STATS(FATAL, "difs_latency_hist = %s\n", difs_latency_hist);
1079 	qdf_mem_free(difs_latency_hist);
1080 }
1081 
1082 /*
1083  * dp_print_tx_hwq_cmd_result_stats_tlv_v: display htt_tx_hwq_cmd_result_stats
1084  * @tag_buf: buffer containing the tlv htt_tx_hwq_cmd_result_stats_tlv_v
1085  *
1086  * return:void
1087  */
1088 static inline void dp_print_tx_hwq_cmd_result_stats_tlv_v(uint32_t *tag_buf)
1089 {
1090 	htt_tx_hwq_cmd_result_stats_tlv_v *dp_stats_buf =
1091 		(htt_tx_hwq_cmd_result_stats_tlv_v *)tag_buf;
1092 	uint8_t i;
1093 	uint16_t index = 0;
1094 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
1095 	char *cmd_result = qdf_mem_malloc(DP_MAX_STRING_LEN);
1096 
1097 	if (!cmd_result) {
1098 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
1099 			  FL("Output buffer not allocated"));
1100 		return;
1101 	}
1102 
1103 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_HWQ_MAX_CMD_RESULT_STATS);
1104 
1105 	DP_TRACE_STATS(FATAL, "HTT_TX_HWQ_CMD_RESULT_STATS_TLV_V:");
1106 	for (i = 0; i <  tag_len; i++) {
1107 		index += qdf_snprint(&cmd_result[index],
1108 				DP_MAX_STRING_LEN - index,
1109 				" %u:%u,", i, dp_stats_buf->cmd_result[i]);
1110 	}
1111 	DP_TRACE_STATS(FATAL, "cmd_result = %s ", cmd_result);
1112 	qdf_mem_free(cmd_result);
1113 }
1114 
1115 /*
1116  * dp_print_tx_hwq_cmd_stall_stats_tlv_v: display htt_tx_hwq_cmd_stall_stats_tlv
1117  * @tag_buf: buffer containing the tlv htt_tx_hwq_cmd_stall_stats_tlv_v
1118  *
1119  * return:void
1120  */
1121 static inline void dp_print_tx_hwq_cmd_stall_stats_tlv_v(uint32_t *tag_buf)
1122 {
1123 	htt_tx_hwq_cmd_stall_stats_tlv_v *dp_stats_buf =
1124 		(htt_tx_hwq_cmd_stall_stats_tlv_v *)tag_buf;
1125 	uint8_t i;
1126 	uint16_t index = 0;
1127 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
1128 	char *cmd_stall_status = qdf_mem_malloc(DP_MAX_STRING_LEN);
1129 
1130 	if (!cmd_stall_status) {
1131 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
1132 			  FL("Output buffer not allocated"));
1133 		return;
1134 	}
1135 
1136 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_HWQ_MAX_CMD_STALL_STATS);
1137 
1138 	DP_TRACE_STATS(FATAL, "HTT_TX_HWQ_CMD_STALL_STATS_TLV_V:");
1139 	for (i = 0; i <  tag_len; i++) {
1140 		index += qdf_snprint(&cmd_stall_status[index],
1141 				DP_MAX_STRING_LEN - index,
1142 				" %u:%u,", i,
1143 				dp_stats_buf->cmd_stall_status[i]);
1144 	}
1145 	DP_TRACE_STATS(FATAL, "cmd_stall_status = %s\n", cmd_stall_status);
1146 	qdf_mem_free(cmd_stall_status);
1147 }
1148 
1149 /*
1150  * dp_print_tx_hwq_fes_result_stats_tlv_v: display htt_tx_hwq_fes_result_stats
1151  * @tag_buf: buffer containing the tlv htt_tx_hwq_fes_result_stats_tlv_v
1152  *
1153  * return:void
1154  */
1155 static inline void dp_print_tx_hwq_fes_result_stats_tlv_v(uint32_t *tag_buf)
1156 {
1157 	htt_tx_hwq_fes_result_stats_tlv_v *dp_stats_buf =
1158 		(htt_tx_hwq_fes_result_stats_tlv_v *)tag_buf;
1159 	uint8_t i;
1160 	uint16_t index = 0;
1161 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
1162 	char *fes_result = qdf_mem_malloc(DP_MAX_STRING_LEN);
1163 
1164 	if (!fes_result) {
1165 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
1166 			  FL("Output buffer not allocated"));
1167 		return;
1168 	}
1169 
1170 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_HWQ_MAX_FES_RESULT_STATS);
1171 
1172 	DP_TRACE_STATS(FATAL, "HTT_TX_HWQ_FES_RESULT_STATS_TLV_V:");
1173 	for (i = 0; i <  tag_len; i++) {
1174 		index += qdf_snprint(&fes_result[index],
1175 				DP_MAX_STRING_LEN - index,
1176 				" %u:%u,", i, dp_stats_buf->fes_result[i]);
1177 	}
1178 	DP_TRACE_STATS(FATAL, "fes_result = %s ", fes_result);
1179 	qdf_mem_free(fes_result);
1180 }
1181 
1182 /*
1183  * dp_print_tx_selfgen_cmn_stats_tlv: display htt_tx_selfgen_cmn_stats_tlv
1184  * @tag_buf: buffer containing the tlv htt_tx_selfgen_cmn_stats_tlv
1185  *
1186  * return:void
1187  */
1188 static inline void dp_print_tx_selfgen_cmn_stats_tlv(uint32_t *tag_buf)
1189 {
1190 	htt_tx_selfgen_cmn_stats_tlv *dp_stats_buf =
1191 		(htt_tx_selfgen_cmn_stats_tlv *)tag_buf;
1192 
1193 	DP_TRACE_STATS(FATAL, "HTT_TX_SELFGEN_CMN_STATS_TLV:");
1194 	DP_TRACE_STATS(FATAL, "mac_id__word = %u",
1195 			dp_stats_buf->mac_id__word);
1196 	DP_TRACE_STATS(FATAL, "su_bar = %u",
1197 			dp_stats_buf->su_bar);
1198 	DP_TRACE_STATS(FATAL, "rts = %u",
1199 			dp_stats_buf->rts);
1200 	DP_TRACE_STATS(FATAL, "cts2self = %u",
1201 			dp_stats_buf->cts2self);
1202 	DP_TRACE_STATS(FATAL, "qos_null = %u",
1203 			dp_stats_buf->qos_null);
1204 	DP_TRACE_STATS(FATAL, "delayed_bar_1 = %u",
1205 			dp_stats_buf->delayed_bar_1);
1206 	DP_TRACE_STATS(FATAL, "delayed_bar_2 = %u",
1207 			dp_stats_buf->delayed_bar_2);
1208 	DP_TRACE_STATS(FATAL, "delayed_bar_3 = %u",
1209 			dp_stats_buf->delayed_bar_3);
1210 	DP_TRACE_STATS(FATAL, "delayed_bar_4 = %u",
1211 			dp_stats_buf->delayed_bar_4);
1212 	DP_TRACE_STATS(FATAL, "delayed_bar_5 = %u",
1213 			dp_stats_buf->delayed_bar_5);
1214 	DP_TRACE_STATS(FATAL, "delayed_bar_6 = %u",
1215 			dp_stats_buf->delayed_bar_6);
1216 	DP_TRACE_STATS(FATAL, "delayed_bar_7 = %u\n",
1217 			dp_stats_buf->delayed_bar_7);
1218 }
1219 
1220 /*
1221  * dp_print_tx_selfgen_ac_stats_tlv: display htt_tx_selfgen_ac_stats_tlv
1222  * @tag_buf: buffer containing the tlv htt_tx_selfgen_ac_stats_tlv
1223  *
1224  * return:void
1225  */
1226 static inline void dp_print_tx_selfgen_ac_stats_tlv(uint32_t *tag_buf)
1227 {
1228 	htt_tx_selfgen_ac_stats_tlv *dp_stats_buf =
1229 		(htt_tx_selfgen_ac_stats_tlv *)tag_buf;
1230 
1231 	DP_TRACE_STATS(FATAL, "HTT_TX_SELFGEN_AC_STATS_TLV:");
1232 	DP_TRACE_STATS(FATAL, "ac_su_ndpa = %u",
1233 			dp_stats_buf->ac_su_ndpa);
1234 	DP_TRACE_STATS(FATAL, "ac_su_ndp = %u",
1235 			dp_stats_buf->ac_su_ndp);
1236 	DP_TRACE_STATS(FATAL, "ac_mu_mimo_ndpa = %u",
1237 			dp_stats_buf->ac_mu_mimo_ndpa);
1238 	DP_TRACE_STATS(FATAL, "ac_mu_mimo_ndp = %u",
1239 			dp_stats_buf->ac_mu_mimo_ndp);
1240 	DP_TRACE_STATS(FATAL, "ac_mu_mimo_brpoll_1 = %u",
1241 			dp_stats_buf->ac_mu_mimo_brpoll_1);
1242 	DP_TRACE_STATS(FATAL, "ac_mu_mimo_brpoll_2 = %u",
1243 			dp_stats_buf->ac_mu_mimo_brpoll_2);
1244 	DP_TRACE_STATS(FATAL, "ac_mu_mimo_brpoll_3 = %u\n",
1245 			dp_stats_buf->ac_mu_mimo_brpoll_3);
1246 }
1247 
1248 /*
1249  * dp_print_tx_selfgen_ax_stats_tlv: display htt_tx_selfgen_ax_stats_tlv
1250  * @tag_buf: buffer containing the tlv htt_tx_selfgen_ax_stats_tlv
1251  *
1252  * return:void
1253  */
1254 static inline void dp_print_tx_selfgen_ax_stats_tlv(uint32_t *tag_buf)
1255 {
1256 	htt_tx_selfgen_ax_stats_tlv *dp_stats_buf =
1257 		(htt_tx_selfgen_ax_stats_tlv *)tag_buf;
1258 
1259 	DP_TRACE_STATS(FATAL, "HTT_TX_SELFGEN_AX_STATS_TLV:");
1260 	DP_TRACE_STATS(FATAL, "ax_su_ndpa = %u",
1261 			dp_stats_buf->ax_su_ndpa);
1262 	DP_TRACE_STATS(FATAL, "ax_su_ndp = %u",
1263 			dp_stats_buf->ax_su_ndp);
1264 	DP_TRACE_STATS(FATAL, "ax_mu_mimo_ndpa = %u",
1265 			dp_stats_buf->ax_mu_mimo_ndpa);
1266 	DP_TRACE_STATS(FATAL, "ax_mu_mimo_ndp = %u",
1267 			dp_stats_buf->ax_mu_mimo_ndp);
1268 	DP_TRACE_STATS(FATAL, "ax_mu_mimo_brpoll_1 = %u",
1269 			dp_stats_buf->ax_mu_mimo_brpoll_1);
1270 	DP_TRACE_STATS(FATAL, "ax_mu_mimo_brpoll_2 = %u",
1271 			dp_stats_buf->ax_mu_mimo_brpoll_2);
1272 	DP_TRACE_STATS(FATAL, "ax_mu_mimo_brpoll_3 = %u",
1273 			dp_stats_buf->ax_mu_mimo_brpoll_3);
1274 	DP_TRACE_STATS(FATAL, "ax_mu_mimo_brpoll_4 = %u",
1275 			dp_stats_buf->ax_mu_mimo_brpoll_4);
1276 	DP_TRACE_STATS(FATAL, "ax_mu_mimo_brpoll_5 = %u",
1277 			dp_stats_buf->ax_mu_mimo_brpoll_5);
1278 	DP_TRACE_STATS(FATAL, "ax_mu_mimo_brpoll_6 = %u",
1279 			dp_stats_buf->ax_mu_mimo_brpoll_6);
1280 	DP_TRACE_STATS(FATAL, "ax_mu_mimo_brpoll_7 = %u",
1281 			dp_stats_buf->ax_mu_mimo_brpoll_7);
1282 	DP_TRACE_STATS(FATAL, "ax_basic_trigger = %u",
1283 			dp_stats_buf->ax_basic_trigger);
1284 	DP_TRACE_STATS(FATAL, "ax_bsr_trigger = %u",
1285 			dp_stats_buf->ax_bsr_trigger);
1286 	DP_TRACE_STATS(FATAL, "ax_mu_bar_trigger = %u",
1287 			dp_stats_buf->ax_mu_bar_trigger);
1288 	DP_TRACE_STATS(FATAL, "ax_mu_rts_trigger = %u\n",
1289 			dp_stats_buf->ax_mu_rts_trigger);
1290 }
1291 
1292 /*
1293  * dp_print_tx_selfgen_ac_err_stats_tlv: display htt_tx_selfgen_ac_err_stats_tlv
1294  * @tag_buf: buffer containing the tlv htt_tx_selfgen_ac_err_stats_tlv
1295  *
1296  * return:void
1297  */
1298 static inline void dp_print_tx_selfgen_ac_err_stats_tlv(uint32_t *tag_buf)
1299 {
1300 	htt_tx_selfgen_ac_err_stats_tlv *dp_stats_buf =
1301 		(htt_tx_selfgen_ac_err_stats_tlv *)tag_buf;
1302 
1303 	DP_TRACE_STATS(FATAL, "HTT_TX_SELFGEN_AC_ERR_STATS_TLV:");
1304 	DP_TRACE_STATS(FATAL, "ac_su_ndp_err = %u",
1305 			dp_stats_buf->ac_su_ndp_err);
1306 	DP_TRACE_STATS(FATAL, "ac_su_ndpa_err = %u",
1307 			dp_stats_buf->ac_su_ndpa_err);
1308 	DP_TRACE_STATS(FATAL, "ac_mu_mimo_ndpa_err = %u",
1309 			dp_stats_buf->ac_mu_mimo_ndpa_err);
1310 	DP_TRACE_STATS(FATAL, "ac_mu_mimo_ndp_err = %u",
1311 			dp_stats_buf->ac_mu_mimo_ndp_err);
1312 	DP_TRACE_STATS(FATAL, "ac_mu_mimo_brp1_err = %u",
1313 			dp_stats_buf->ac_mu_mimo_brp1_err);
1314 	DP_TRACE_STATS(FATAL, "ac_mu_mimo_brp2_err = %u",
1315 			dp_stats_buf->ac_mu_mimo_brp2_err);
1316 	DP_TRACE_STATS(FATAL, "ac_mu_mimo_brp3_err = %u\n",
1317 			dp_stats_buf->ac_mu_mimo_brp3_err);
1318 }
1319 
1320 /*
1321  * dp_print_tx_selfgen_ax_err_stats_tlv: display htt_tx_selfgen_ax_err_stats_tlv
1322  * @tag_buf: buffer containing the tlv htt_tx_selfgen_ax_err_stats_tlv
1323  *
1324  * return:void
1325  */
1326 static inline void dp_print_tx_selfgen_ax_err_stats_tlv(uint32_t *tag_buf)
1327 {
1328 	htt_tx_selfgen_ax_err_stats_tlv *dp_stats_buf =
1329 		(htt_tx_selfgen_ax_err_stats_tlv *)tag_buf;
1330 
1331 	DP_TRACE_STATS(FATAL, "HTT_TX_SELFGEN_AX_ERR_STATS_TLV:");
1332 	DP_TRACE_STATS(FATAL, "ax_su_ndp_err = %u",
1333 			dp_stats_buf->ax_su_ndp_err);
1334 	DP_TRACE_STATS(FATAL, "ax_su_ndpa_err = %u",
1335 			dp_stats_buf->ax_su_ndpa_err);
1336 	DP_TRACE_STATS(FATAL, "ax_mu_mimo_ndpa_err = %u",
1337 			dp_stats_buf->ax_mu_mimo_ndpa_err);
1338 	DP_TRACE_STATS(FATAL, "ax_mu_mimo_ndp_err = %u",
1339 			dp_stats_buf->ax_mu_mimo_ndp_err);
1340 	DP_TRACE_STATS(FATAL, "ax_mu_mimo_brp1_err = %u",
1341 			dp_stats_buf->ax_mu_mimo_brp1_err);
1342 	DP_TRACE_STATS(FATAL, "ax_mu_mimo_brp2_err = %u",
1343 			dp_stats_buf->ax_mu_mimo_brp2_err);
1344 	DP_TRACE_STATS(FATAL, "ax_mu_mimo_brp3_err = %u",
1345 			dp_stats_buf->ax_mu_mimo_brp3_err);
1346 	DP_TRACE_STATS(FATAL, "ax_mu_mimo_brp4_err = %u",
1347 			dp_stats_buf->ax_mu_mimo_brp4_err);
1348 	DP_TRACE_STATS(FATAL, "ax_mu_mimo_brp5_err = %u",
1349 			dp_stats_buf->ax_mu_mimo_brp5_err);
1350 	DP_TRACE_STATS(FATAL, "ax_mu_mimo_brp6_err = %u",
1351 			dp_stats_buf->ax_mu_mimo_brp6_err);
1352 	DP_TRACE_STATS(FATAL, "ax_mu_mimo_brp7_err = %u",
1353 			dp_stats_buf->ax_mu_mimo_brp7_err);
1354 	DP_TRACE_STATS(FATAL, "ax_basic_trigger_err = %u",
1355 			dp_stats_buf->ax_basic_trigger_err);
1356 	DP_TRACE_STATS(FATAL, "ax_bsr_trigger_err = %u",
1357 			dp_stats_buf->ax_bsr_trigger_err);
1358 	DP_TRACE_STATS(FATAL, "ax_mu_bar_trigger_err = %u",
1359 			dp_stats_buf->ax_mu_bar_trigger_err);
1360 	DP_TRACE_STATS(FATAL, "ax_mu_rts_trigger_err = %u\n",
1361 			dp_stats_buf->ax_mu_rts_trigger_err);
1362 }
1363 
1364 /*
1365  * dp_print_tx_pdev_mu_mimo_sch_stats_tlv: display htt_tx_pdev_mu_mimo_sch_stats
1366  * @tag_buf: buffer containing the tlv htt_tx_pdev_mu_mimo_sch_stats_tlv
1367  *
1368  * return:void
1369  */
1370 static inline void dp_print_tx_pdev_mu_mimo_sch_stats_tlv(uint32_t *tag_buf)
1371 {
1372 	uint8_t i;
1373 	htt_tx_pdev_mu_mimo_sch_stats_tlv *dp_stats_buf =
1374 		(htt_tx_pdev_mu_mimo_sch_stats_tlv *)tag_buf;
1375 
1376 	DP_TRACE_STATS(FATAL, "HTT_TX_PDEV_MU_MIMO_SCH_STATS_TLV:");
1377 	DP_TRACE_STATS(FATAL, "mu_mimo_sch_posted = %u",
1378 			dp_stats_buf->mu_mimo_sch_posted);
1379 	DP_TRACE_STATS(FATAL, "mu_mimo_sch_failed = %u",
1380 			dp_stats_buf->mu_mimo_sch_failed);
1381 	DP_TRACE_STATS(FATAL, "mu_mimo_ppdu_posted = %u\n",
1382 			dp_stats_buf->mu_mimo_ppdu_posted);
1383 
1384 	DP_TRACE_STATS(FATAL, "11ac MU_MIMO SCH STATS:");
1385 
1386 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS; i++) {
1387 		DP_TRACE_STATS(FATAL, "ac_mu_mimo_sch_nusers_%u = %u", i,
1388 			       dp_stats_buf->ac_mu_mimo_sch_nusers[i]);
1389 	}
1390 
1391 	DP_TRACE_STATS(FATAL, "\n11ax MU_MIMO SCH STATS:");
1392 
1393 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; i++) {
1394 		DP_TRACE_STATS(FATAL, "ax_mu_mimo_sch_nusers_%u = %u", i,
1395 			       dp_stats_buf->ax_mu_mimo_sch_nusers[i]);
1396 	}
1397 
1398 	DP_TRACE_STATS(FATAL, "\n11ax OFDMA SCH STATS:");
1399 
1400 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; i++) {
1401 		DP_TRACE_STATS(FATAL, "ax_ofdma_sch_nusers_%u = %u", i,
1402 			       dp_stats_buf->ax_ofdma_sch_nusers[i]);
1403 	}
1404 }
1405 
1406 /*
1407  * dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv: display
1408  *				htt_tx_pdev_mu_mimo_mpdu_stats_tlv
1409  * @tag_buf: buffer containing the tlv htt_tx_pdev_mu_mimo_mpdu_stats_tlv
1410  *
1411  * return:void
1412  */
1413 static inline void dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv(uint32_t *tag_buf)
1414 {
1415 	htt_tx_pdev_mpdu_stats_tlv *dp_stats_buf =
1416 		(htt_tx_pdev_mpdu_stats_tlv *)tag_buf;
1417 
1418 	if (dp_stats_buf->tx_sched_mode ==
1419 			HTT_STATS_TX_SCHED_MODE_MU_MIMO_AC) {
1420 		if (!dp_stats_buf->user_index)
1421 			DP_TRACE_STATS(FATAL,
1422 				       "HTT_TX_PDEV_MU_MIMO_AC_MPDU_STATS:\n");
1423 
1424 		if (dp_stats_buf->user_index <
1425 			HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS) {
1426 			DP_TRACE_STATS(FATAL,
1427 				       "ac_mu_mimo_mpdus_queued_usr_%u = %u",
1428 				       dp_stats_buf->user_index,
1429 				       dp_stats_buf->mpdus_queued_usr);
1430 			DP_TRACE_STATS(FATAL,
1431 				       "ac_mu_mimo_mpdus_tried_usr_%u = %u",
1432 				       dp_stats_buf->user_index,
1433 				       dp_stats_buf->mpdus_tried_usr);
1434 			DP_TRACE_STATS(FATAL,
1435 				       "ac_mu_mimo_mpdus_failed_usr_%u = %u",
1436 				       dp_stats_buf->user_index,
1437 				       dp_stats_buf->mpdus_failed_usr);
1438 			DP_TRACE_STATS(FATAL,
1439 				       "ac_mu_mimo_mpdus_requeued_usr_%u = %u",
1440 				       dp_stats_buf->user_index,
1441 				       dp_stats_buf->mpdus_requeued_usr);
1442 			DP_TRACE_STATS(FATAL,
1443 				       "ac_mu_mimo_err_no_ba_usr_%u = %u",
1444 				       dp_stats_buf->user_index,
1445 				       dp_stats_buf->err_no_ba_usr);
1446 			DP_TRACE_STATS(FATAL,
1447 				       "ac_mu_mimo_mpdu_underrun_usr_%u = %u",
1448 				       dp_stats_buf->user_index,
1449 				       dp_stats_buf->mpdu_underrun_usr);
1450 			DP_TRACE_STATS(FATAL,
1451 				       "ac_mu_mimo_ampdu_underrun_usr_%u = %u\n",
1452 				       dp_stats_buf->user_index,
1453 				       dp_stats_buf->ampdu_underrun_usr);
1454 		}
1455 	}
1456 
1457 	if (dp_stats_buf->tx_sched_mode == HTT_STATS_TX_SCHED_MODE_MU_MIMO_AX) {
1458 		if (!dp_stats_buf->user_index)
1459 			DP_TRACE_STATS(FATAL,
1460 				       "HTT_TX_PDEV_MU_MIMO_AX_MPDU_STATS:\n");
1461 
1462 		if (dp_stats_buf->user_index <
1463 				HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS) {
1464 			DP_TRACE_STATS(FATAL,
1465 				       "ax_mu_mimo_mpdus_queued_usr_%u = %u",
1466 				       dp_stats_buf->user_index,
1467 				       dp_stats_buf->mpdus_queued_usr);
1468 			DP_TRACE_STATS(FATAL,
1469 				       "ax_mu_mimo_mpdus_tried_usr_%u = %u",
1470 				       dp_stats_buf->user_index,
1471 				       dp_stats_buf->mpdus_tried_usr);
1472 			DP_TRACE_STATS(FATAL,
1473 				       "ax_mu_mimo_mpdus_failed_usr_%u = %u",
1474 				       dp_stats_buf->user_index,
1475 				       dp_stats_buf->mpdus_failed_usr);
1476 			DP_TRACE_STATS(FATAL,
1477 				       "ax_mu_mimo_mpdus_requeued_usr_%u = %u",
1478 				       dp_stats_buf->user_index,
1479 				       dp_stats_buf->mpdus_requeued_usr);
1480 			DP_TRACE_STATS(FATAL,
1481 				       "ax_mu_mimo_err_no_ba_usr_%u = %u",
1482 				       dp_stats_buf->user_index,
1483 				       dp_stats_buf->err_no_ba_usr);
1484 			DP_TRACE_STATS(FATAL,
1485 				       "ax_mu_mimo_mpdu_underrun_usr_%u = %u",
1486 				       dp_stats_buf->user_index,
1487 				       dp_stats_buf->mpdu_underrun_usr);
1488 			DP_TRACE_STATS(FATAL,
1489 				       "ax_mu_mimo_ampdu_underrun_usr_%u = %u\n",
1490 				       dp_stats_buf->user_index,
1491 				       dp_stats_buf->ampdu_underrun_usr);
1492 		}
1493 	}
1494 
1495 	if (dp_stats_buf->tx_sched_mode ==
1496 			HTT_STATS_TX_SCHED_MODE_MU_OFDMA_AX) {
1497 		if (!dp_stats_buf->user_index)
1498 			DP_TRACE_STATS(FATAL,
1499 				       "HTT_TX_PDEV_AX_MU_OFDMA_MPDU_STATS:\n");
1500 
1501 		if (dp_stats_buf->user_index <
1502 				HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS) {
1503 			DP_TRACE_STATS(FATAL,
1504 				       "ax_mu_ofdma_mpdus_queued_usr_%u = %u",
1505 				       dp_stats_buf->user_index,
1506 				       dp_stats_buf->mpdus_queued_usr);
1507 			DP_TRACE_STATS(FATAL,
1508 				       "ax_mu_ofdma_mpdus_tried_usr_%u = %u",
1509 				       dp_stats_buf->user_index,
1510 				       dp_stats_buf->mpdus_tried_usr);
1511 			DP_TRACE_STATS(FATAL,
1512 				       "ax_mu_ofdma_mpdus_failed_usr_%u = %u",
1513 				       dp_stats_buf->user_index,
1514 				       dp_stats_buf->mpdus_failed_usr);
1515 			DP_TRACE_STATS(FATAL,
1516 				       "ax_mu_ofdma_mpdus_requeued_usr_%u = %u",
1517 				       dp_stats_buf->user_index,
1518 				       dp_stats_buf->mpdus_requeued_usr);
1519 			DP_TRACE_STATS(FATAL,
1520 				       "ax_mu_ofdma_err_no_ba_usr_%u = %u",
1521 				       dp_stats_buf->user_index,
1522 				       dp_stats_buf->err_no_ba_usr);
1523 			DP_TRACE_STATS(FATAL,
1524 				       "ax_mu_ofdma_mpdu_underrun_usr_%u = %u",
1525 				       dp_stats_buf->user_index,
1526 				       dp_stats_buf->mpdu_underrun_usr);
1527 			DP_TRACE_STATS(FATAL,
1528 				       "ax_mu_ofdma_ampdu_underrun_usr_%u = %u\n",
1529 				       dp_stats_buf->user_index,
1530 				       dp_stats_buf->ampdu_underrun_usr);
1531 		}
1532 	}
1533 }
1534 
1535 /*
1536  * dp_print_sched_txq_cmd_posted_tlv_v: display htt_sched_txq_cmd_posted_tlv_v
1537  * @tag_buf: buffer containing the tlv htt_sched_txq_cmd_posted_tlv_v
1538  *
1539  * return:void
1540  */
1541 static inline void dp_print_sched_txq_cmd_posted_tlv_v(uint32_t *tag_buf)
1542 {
1543 	htt_sched_txq_cmd_posted_tlv_v *dp_stats_buf =
1544 		(htt_sched_txq_cmd_posted_tlv_v *)tag_buf;
1545 	uint8_t i;
1546 	uint16_t index = 0;
1547 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
1548 	char *sched_cmd_posted = qdf_mem_malloc(DP_MAX_STRING_LEN);
1549 
1550 	if (!sched_cmd_posted) {
1551 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
1552 			  FL("Output buffer not allocated"));
1553 		return;
1554 	}
1555 
1556 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_SCHED_TX_MODE_MAX);
1557 
1558 	DP_TRACE_STATS(FATAL, "HTT_SCHED_TXQ_CMD_POSTED_TLV_V:");
1559 	for (i = 0; i <  tag_len; i++) {
1560 		index += qdf_snprint(&sched_cmd_posted[index],
1561 				DP_MAX_STRING_LEN - index,
1562 				" %u:%u,", i,
1563 				dp_stats_buf->sched_cmd_posted[i]);
1564 	}
1565 	DP_TRACE_STATS(FATAL, "sched_cmd_posted = %s\n", sched_cmd_posted);
1566 	qdf_mem_free(sched_cmd_posted);
1567 }
1568 
1569 /*
1570  * dp_print_sched_txq_cmd_reaped_tlv_v: display htt_sched_txq_cmd_reaped_tlv_v
1571  * @tag_buf: buffer containing the tlv htt_sched_txq_cmd_reaped_tlv_v
1572  *
1573  * return:void
1574  */
1575 static inline void dp_print_sched_txq_cmd_reaped_tlv_v(uint32_t *tag_buf)
1576 {
1577 	htt_sched_txq_cmd_reaped_tlv_v *dp_stats_buf =
1578 		(htt_sched_txq_cmd_reaped_tlv_v *)tag_buf;
1579 	uint8_t i;
1580 	uint16_t index = 0;
1581 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
1582 	char *sched_cmd_reaped = qdf_mem_malloc(DP_MAX_STRING_LEN);
1583 
1584 	if (!sched_cmd_reaped) {
1585 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
1586 			  FL("Output buffer not allocated"));
1587 		return;
1588 	}
1589 
1590 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_SCHED_TX_MODE_MAX);
1591 
1592 	DP_TRACE_STATS(FATAL, "HTT_SCHED_TXQ_CMD_REAPED_TLV_V:");
1593 	for (i = 0; i <  tag_len; i++) {
1594 		index += qdf_snprint(&sched_cmd_reaped[index],
1595 				DP_MAX_STRING_LEN - index,
1596 				" %u:%u,", i,
1597 				dp_stats_buf->sched_cmd_reaped[i]);
1598 	}
1599 	DP_TRACE_STATS(FATAL, "sched_cmd_reaped = %s\n", sched_cmd_reaped);
1600 	qdf_mem_free(sched_cmd_reaped);
1601 }
1602 
1603 /*
1604  * dp_print_tx_pdev_stats_sched_per_txq_tlv: display
1605  *				htt_tx_pdev_stats_sched_per_txq_tlv
1606  * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_sched_per_txq_tlv
1607  *
1608  * return:void
1609  */
1610 static inline void dp_print_tx_pdev_stats_sched_per_txq_tlv(uint32_t *tag_buf)
1611 {
1612 	htt_tx_pdev_stats_sched_per_txq_tlv *dp_stats_buf =
1613 		(htt_tx_pdev_stats_sched_per_txq_tlv *)tag_buf;
1614 
1615 	DP_TRACE_STATS(FATAL, "HTT_TX_PDEV_STATS_SCHED_PER_TXQ_TLV:");
1616 	DP_TRACE_STATS(FATAL, "mac_id__txq_id__word = %u",
1617 			dp_stats_buf->mac_id__txq_id__word);
1618 	DP_TRACE_STATS(FATAL, "sched_policy = %u",
1619 			dp_stats_buf->sched_policy);
1620 	DP_TRACE_STATS(FATAL, "last_sched_cmd_posted_timestamp = %u",
1621 			dp_stats_buf->last_sched_cmd_posted_timestamp);
1622 	DP_TRACE_STATS(FATAL, "last_sched_cmd_compl_timestamp = %u",
1623 			dp_stats_buf->last_sched_cmd_compl_timestamp);
1624 	DP_TRACE_STATS(FATAL, "sched_2_tac_lwm_count = %u",
1625 			dp_stats_buf->sched_2_tac_lwm_count);
1626 	DP_TRACE_STATS(FATAL, "sched_2_tac_ring_full = %u",
1627 			dp_stats_buf->sched_2_tac_ring_full);
1628 	DP_TRACE_STATS(FATAL, "sched_cmd_post_failure = %u",
1629 			dp_stats_buf->sched_cmd_post_failure);
1630 	DP_TRACE_STATS(FATAL, "num_active_tids = %u",
1631 			dp_stats_buf->num_active_tids);
1632 	DP_TRACE_STATS(FATAL, "num_ps_schedules = %u",
1633 			dp_stats_buf->num_ps_schedules);
1634 	DP_TRACE_STATS(FATAL, "sched_cmds_pending = %u",
1635 			dp_stats_buf->sched_cmds_pending);
1636 	DP_TRACE_STATS(FATAL, "num_tid_register = %u",
1637 			dp_stats_buf->num_tid_register);
1638 	DP_TRACE_STATS(FATAL, "num_tid_unregister = %u",
1639 			dp_stats_buf->num_tid_unregister);
1640 	DP_TRACE_STATS(FATAL, "num_qstats_queried = %u",
1641 			dp_stats_buf->num_qstats_queried);
1642 	DP_TRACE_STATS(FATAL, "qstats_update_pending = %u",
1643 			dp_stats_buf->qstats_update_pending);
1644 	DP_TRACE_STATS(FATAL, "last_qstats_query_timestamp = %u",
1645 			dp_stats_buf->last_qstats_query_timestamp);
1646 	DP_TRACE_STATS(FATAL, "num_tqm_cmdq_full = %u",
1647 			dp_stats_buf->num_tqm_cmdq_full);
1648 	DP_TRACE_STATS(FATAL, "num_de_sched_algo_trigger = %u",
1649 			dp_stats_buf->num_de_sched_algo_trigger);
1650 	DP_TRACE_STATS(FATAL, "num_rt_sched_algo_trigger = %u",
1651 			dp_stats_buf->num_rt_sched_algo_trigger);
1652 	DP_TRACE_STATS(FATAL, "num_tqm_sched_algo_trigger = %u",
1653 			dp_stats_buf->num_tqm_sched_algo_trigger);
1654 	DP_TRACE_STATS(FATAL, "notify_sched = %u\n",
1655 			dp_stats_buf->notify_sched);
1656 }
1657 
1658 /*
1659  * dp_print_stats_tx_sched_cmn_tlv: display htt_stats_tx_sched_cmn_tlv
1660  * @tag_buf: buffer containing the tlv htt_stats_tx_sched_cmn_tlv
1661  *
1662  * return:void
1663  */
1664 static inline void dp_print_stats_tx_sched_cmn_tlv(uint32_t *tag_buf)
1665 {
1666 	htt_stats_tx_sched_cmn_tlv *dp_stats_buf =
1667 		(htt_stats_tx_sched_cmn_tlv *)tag_buf;
1668 
1669 	DP_TRACE_STATS(FATAL, "HTT_STATS_TX_SCHED_CMN_TLV:");
1670 	DP_TRACE_STATS(FATAL, "mac_id__word = %u",
1671 			dp_stats_buf->mac_id__word);
1672 	DP_TRACE_STATS(FATAL, "current_timestamp = %u\n",
1673 			dp_stats_buf->current_timestamp);
1674 }
1675 
1676 /*
1677  * dp_print_tx_tqm_gen_mpdu_stats_tlv_v: display htt_tx_tqm_gen_mpdu_stats_tlv_v
1678  * @tag_buf: buffer containing the tlv htt_tx_tqm_gen_mpdu_stats_tlv_v
1679  *
1680  * return:void
1681  */
1682 static inline void dp_print_tx_tqm_gen_mpdu_stats_tlv_v(uint32_t *tag_buf)
1683 {
1684 	htt_tx_tqm_gen_mpdu_stats_tlv_v *dp_stats_buf =
1685 		(htt_tx_tqm_gen_mpdu_stats_tlv_v *)tag_buf;
1686 	uint8_t i;
1687 	uint16_t index = 0;
1688 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
1689 	char *gen_mpdu_end_reason = qdf_mem_malloc(DP_MAX_STRING_LEN);
1690 
1691 	if (!gen_mpdu_end_reason) {
1692 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
1693 			  FL("Output buffer not allocated"));
1694 		return;
1695 	}
1696 
1697 	tag_len = qdf_min(tag_len,
1698 			(uint32_t)HTT_TX_TQM_MAX_GEN_MPDU_END_REASON);
1699 
1700 	DP_TRACE_STATS(FATAL, "HTT_TX_TQM_GEN_MPDU_STATS_TLV_V:");
1701 	for (i = 0; i <  tag_len; i++) {
1702 		index += qdf_snprint(&gen_mpdu_end_reason[index],
1703 				DP_MAX_STRING_LEN - index,
1704 				" %u:%u,", i,
1705 				dp_stats_buf->gen_mpdu_end_reason[i]);
1706 	}
1707 	DP_TRACE_STATS(FATAL, "gen_mpdu_end_reason = %s\n", gen_mpdu_end_reason);
1708 	qdf_mem_free(gen_mpdu_end_reason);
1709 }
1710 
1711 /*
1712  * dp_print_tx_tqm_list_mpdu_stats_tlv_v: display htt_tx_tqm_list_mpdu_stats_tlv
1713  * @tag_buf: buffer containing the tlv htt_tx_tqm_list_mpdu_stats_tlv_v
1714  *
1715  * return:void
1716  */
1717 static inline void dp_print_tx_tqm_list_mpdu_stats_tlv_v(uint32_t *tag_buf)
1718 {
1719 	htt_tx_tqm_list_mpdu_stats_tlv_v *dp_stats_buf =
1720 		(htt_tx_tqm_list_mpdu_stats_tlv_v *)tag_buf;
1721 	uint8_t i;
1722 	uint16_t index = 0;
1723 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
1724 	char *list_mpdu_end_reason = qdf_mem_malloc(DP_MAX_STRING_LEN);
1725 
1726 	if (!list_mpdu_end_reason) {
1727 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
1728 			  FL("Output buffer not allocated"));
1729 		return;
1730 	}
1731 
1732 	tag_len = qdf_min(tag_len,
1733 			(uint32_t)HTT_TX_TQM_MAX_LIST_MPDU_END_REASON);
1734 
1735 	DP_TRACE_STATS(FATAL, "HTT_TX_TQM_LIST_MPDU_STATS_TLV_V:");
1736 	for (i = 0; i <  tag_len; i++) {
1737 		index += qdf_snprint(&list_mpdu_end_reason[index],
1738 				DP_MAX_STRING_LEN - index,
1739 				" %u:%u,", i,
1740 				dp_stats_buf->list_mpdu_end_reason[i]);
1741 	}
1742 	DP_TRACE_STATS(FATAL, "list_mpdu_end_reason = %s\n",
1743 			list_mpdu_end_reason);
1744 	qdf_mem_free(list_mpdu_end_reason);
1745 }
1746 
1747 /*
1748  * dp_print_tx_tqm_list_mpdu_cnt_tlv_v: display htt_tx_tqm_list_mpdu_cnt_tlv_v
1749  * @tag_buf: buffer containing the tlv htt_tx_tqm_list_mpdu_cnt_tlv_v
1750  *
1751  * return:void
1752  */
1753 static inline void dp_print_tx_tqm_list_mpdu_cnt_tlv_v(uint32_t *tag_buf)
1754 {
1755 	htt_tx_tqm_list_mpdu_cnt_tlv_v *dp_stats_buf =
1756 		(htt_tx_tqm_list_mpdu_cnt_tlv_v *)tag_buf;
1757 	uint8_t i;
1758 	uint16_t index = 0;
1759 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
1760 	char *list_mpdu_cnt_hist = qdf_mem_malloc(DP_MAX_STRING_LEN);
1761 
1762 	if (!list_mpdu_cnt_hist) {
1763 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
1764 			  FL("Output buffer not allocated"));
1765 		return;
1766 	}
1767 
1768 	tag_len = qdf_min(tag_len,
1769 			(uint32_t)HTT_TX_TQM_MAX_LIST_MPDU_CNT_HISTOGRAM_BINS);
1770 
1771 	DP_TRACE_STATS(FATAL, "HTT_TX_TQM_LIST_MPDU_CNT_TLV_V:");
1772 	for (i = 0; i <  tag_len; i++) {
1773 		index += qdf_snprint(&list_mpdu_cnt_hist[index],
1774 				DP_MAX_STRING_LEN - index,
1775 				" %u:%u,", i,
1776 				dp_stats_buf->list_mpdu_cnt_hist[i]);
1777 	}
1778 	DP_TRACE_STATS(FATAL, "list_mpdu_cnt_hist = %s\n", list_mpdu_cnt_hist);
1779 	qdf_mem_free(list_mpdu_cnt_hist);
1780 }
1781 
1782 /*
1783  * dp_print_tx_tqm_pdev_stats_tlv_v: display htt_tx_tqm_pdev_stats_tlv_v
1784  * @tag_buf: buffer containing the tlv htt_tx_tqm_pdev_stats_tlv_v
1785  *
1786  * return:void
1787  */
1788 static inline void dp_print_tx_tqm_pdev_stats_tlv_v(uint32_t *tag_buf)
1789 {
1790 	htt_tx_tqm_pdev_stats_tlv_v *dp_stats_buf =
1791 		(htt_tx_tqm_pdev_stats_tlv_v *)tag_buf;
1792 
1793 	DP_TRACE_STATS(FATAL, "HTT_TX_TQM_PDEV_STATS_TLV_V:");
1794 	DP_TRACE_STATS(FATAL, "msdu_count = %u",
1795 			dp_stats_buf->msdu_count);
1796 	DP_TRACE_STATS(FATAL, "mpdu_count = %u",
1797 			dp_stats_buf->mpdu_count);
1798 	DP_TRACE_STATS(FATAL, "remove_msdu = %u",
1799 			dp_stats_buf->remove_msdu);
1800 	DP_TRACE_STATS(FATAL, "remove_mpdu = %u",
1801 			dp_stats_buf->remove_mpdu);
1802 	DP_TRACE_STATS(FATAL, "remove_msdu_ttl = %u",
1803 			dp_stats_buf->remove_msdu_ttl);
1804 	DP_TRACE_STATS(FATAL, "send_bar = %u",
1805 			dp_stats_buf->send_bar);
1806 	DP_TRACE_STATS(FATAL, "bar_sync = %u",
1807 			dp_stats_buf->bar_sync);
1808 	DP_TRACE_STATS(FATAL, "notify_mpdu = %u",
1809 			dp_stats_buf->notify_mpdu);
1810 	DP_TRACE_STATS(FATAL, "sync_cmd = %u",
1811 			dp_stats_buf->sync_cmd);
1812 	DP_TRACE_STATS(FATAL, "write_cmd = %u",
1813 			dp_stats_buf->write_cmd);
1814 	DP_TRACE_STATS(FATAL, "hwsch_trigger = %u",
1815 			dp_stats_buf->hwsch_trigger);
1816 	DP_TRACE_STATS(FATAL, "ack_tlv_proc = %u",
1817 			dp_stats_buf->ack_tlv_proc);
1818 	DP_TRACE_STATS(FATAL, "gen_mpdu_cmd = %u",
1819 			dp_stats_buf->gen_mpdu_cmd);
1820 	DP_TRACE_STATS(FATAL, "gen_list_cmd = %u",
1821 			dp_stats_buf->gen_list_cmd);
1822 	DP_TRACE_STATS(FATAL, "remove_mpdu_cmd = %u",
1823 			dp_stats_buf->remove_mpdu_cmd);
1824 	DP_TRACE_STATS(FATAL, "remove_mpdu_tried_cmd = %u",
1825 			dp_stats_buf->remove_mpdu_tried_cmd);
1826 	DP_TRACE_STATS(FATAL, "mpdu_queue_stats_cmd = %u",
1827 			dp_stats_buf->mpdu_queue_stats_cmd);
1828 	DP_TRACE_STATS(FATAL, "mpdu_head_info_cmd = %u",
1829 			dp_stats_buf->mpdu_head_info_cmd);
1830 	DP_TRACE_STATS(FATAL, "msdu_flow_stats_cmd = %u",
1831 			dp_stats_buf->msdu_flow_stats_cmd);
1832 	DP_TRACE_STATS(FATAL, "remove_msdu_cmd = %u",
1833 			dp_stats_buf->remove_msdu_cmd);
1834 	DP_TRACE_STATS(FATAL, "remove_msdu_ttl_cmd = %u",
1835 			dp_stats_buf->remove_msdu_ttl_cmd);
1836 	DP_TRACE_STATS(FATAL, "flush_cache_cmd = %u",
1837 			dp_stats_buf->flush_cache_cmd);
1838 	DP_TRACE_STATS(FATAL, "update_mpduq_cmd = %u",
1839 			dp_stats_buf->update_mpduq_cmd);
1840 	DP_TRACE_STATS(FATAL, "enqueue = %u",
1841 			dp_stats_buf->enqueue);
1842 	DP_TRACE_STATS(FATAL, "enqueue_notify = %u",
1843 			dp_stats_buf->enqueue_notify);
1844 	DP_TRACE_STATS(FATAL, "notify_mpdu_at_head = %u",
1845 			dp_stats_buf->notify_mpdu_at_head);
1846 	DP_TRACE_STATS(FATAL, "notify_mpdu_state_valid = %u\n",
1847 			dp_stats_buf->notify_mpdu_state_valid);
1848 }
1849 
1850 /*
1851  * dp_print_tx_tqm_cmn_stats_tlv: display htt_tx_tqm_cmn_stats_tlv
1852  * @tag_buf: buffer containing the tlv htt_tx_tqm_cmn_stats_tlv
1853  *
1854  * return:void
1855  */
1856 static inline void dp_print_tx_tqm_cmn_stats_tlv(uint32_t *tag_buf)
1857 {
1858 	htt_tx_tqm_cmn_stats_tlv *dp_stats_buf =
1859 		(htt_tx_tqm_cmn_stats_tlv *)tag_buf;
1860 
1861 	DP_TRACE_STATS(FATAL, "HTT_TX_TQM_CMN_STATS_TLV:");
1862 	DP_TRACE_STATS(FATAL, "mac_id__word = %u",
1863 			dp_stats_buf->mac_id__word);
1864 	DP_TRACE_STATS(FATAL, "max_cmdq_id = %u",
1865 			dp_stats_buf->max_cmdq_id);
1866 	DP_TRACE_STATS(FATAL, "list_mpdu_cnt_hist_intvl = %u",
1867 			dp_stats_buf->list_mpdu_cnt_hist_intvl);
1868 	DP_TRACE_STATS(FATAL, "add_msdu = %u",
1869 			dp_stats_buf->add_msdu);
1870 	DP_TRACE_STATS(FATAL, "q_empty = %u",
1871 			dp_stats_buf->q_empty);
1872 	DP_TRACE_STATS(FATAL, "q_not_empty = %u",
1873 			dp_stats_buf->q_not_empty);
1874 	DP_TRACE_STATS(FATAL, "drop_notification = %u",
1875 			dp_stats_buf->drop_notification);
1876 	DP_TRACE_STATS(FATAL, "desc_threshold = %u\n",
1877 			dp_stats_buf->desc_threshold);
1878 }
1879 
1880 /*
1881  * dp_print_tx_tqm_error_stats_tlv: display htt_tx_tqm_error_stats_tlv
1882  * @tag_buf: buffer containing the tlv htt_tx_tqm_error_stats_tlv
1883  *
1884  * return:void
1885  */
1886 static inline void dp_print_tx_tqm_error_stats_tlv(uint32_t *tag_buf)
1887 {
1888 	htt_tx_tqm_error_stats_tlv *dp_stats_buf =
1889 		(htt_tx_tqm_error_stats_tlv *)tag_buf;
1890 
1891 	DP_TRACE_STATS(FATAL, "HTT_TX_TQM_ERROR_STATS_TLV:");
1892 	DP_TRACE_STATS(FATAL, "q_empty_failure = %u",
1893 			dp_stats_buf->q_empty_failure);
1894 	DP_TRACE_STATS(FATAL, "q_not_empty_failure = %u",
1895 			dp_stats_buf->q_not_empty_failure);
1896 	DP_TRACE_STATS(FATAL, "add_msdu_failure = %u\n",
1897 			dp_stats_buf->add_msdu_failure);
1898 }
1899 
1900 /*
1901  * dp_print_tx_tqm_cmdq_status_tlv: display htt_tx_tqm_cmdq_status_tlv
1902  * @tag_buf: buffer containing the tlv htt_tx_tqm_cmdq_status_tlv
1903  *
1904  * return:void
1905  */
1906 static inline void dp_print_tx_tqm_cmdq_status_tlv(uint32_t *tag_buf)
1907 {
1908 	htt_tx_tqm_cmdq_status_tlv *dp_stats_buf =
1909 		(htt_tx_tqm_cmdq_status_tlv *)tag_buf;
1910 
1911 	DP_TRACE_STATS(FATAL, "HTT_TX_TQM_CMDQ_STATUS_TLV:");
1912 	DP_TRACE_STATS(FATAL, "mac_id__cmdq_id__word = %u",
1913 			dp_stats_buf->mac_id__cmdq_id__word);
1914 	DP_TRACE_STATS(FATAL, "sync_cmd = %u",
1915 			dp_stats_buf->sync_cmd);
1916 	DP_TRACE_STATS(FATAL, "write_cmd = %u",
1917 			dp_stats_buf->write_cmd);
1918 	DP_TRACE_STATS(FATAL, "gen_mpdu_cmd = %u",
1919 			dp_stats_buf->gen_mpdu_cmd);
1920 	DP_TRACE_STATS(FATAL, "mpdu_queue_stats_cmd = %u",
1921 			dp_stats_buf->mpdu_queue_stats_cmd);
1922 	DP_TRACE_STATS(FATAL, "mpdu_head_info_cmd = %u",
1923 			dp_stats_buf->mpdu_head_info_cmd);
1924 	DP_TRACE_STATS(FATAL, "msdu_flow_stats_cmd = %u",
1925 			dp_stats_buf->msdu_flow_stats_cmd);
1926 	DP_TRACE_STATS(FATAL, "remove_mpdu_cmd = %u",
1927 			dp_stats_buf->remove_mpdu_cmd);
1928 	DP_TRACE_STATS(FATAL, "remove_msdu_cmd = %u",
1929 			dp_stats_buf->remove_msdu_cmd);
1930 	DP_TRACE_STATS(FATAL, "flush_cache_cmd = %u",
1931 			dp_stats_buf->flush_cache_cmd);
1932 	DP_TRACE_STATS(FATAL, "update_mpduq_cmd = %u",
1933 			dp_stats_buf->update_mpduq_cmd);
1934 	DP_TRACE_STATS(FATAL, "update_msduq_cmd = %u\n",
1935 			dp_stats_buf->update_msduq_cmd);
1936 }
1937 
1938 /*
1939  * dp_print_tx_de_eapol_packets_stats_tlv: display htt_tx_de_eapol_packets_stats
1940  * @tag_buf: buffer containing the tlv htt_tx_de_eapol_packets_stats_tlv
1941  *
1942  * return:void
1943  */
1944 static inline void dp_print_tx_de_eapol_packets_stats_tlv(uint32_t *tag_buf)
1945 {
1946 	htt_tx_de_eapol_packets_stats_tlv *dp_stats_buf =
1947 		(htt_tx_de_eapol_packets_stats_tlv *)tag_buf;
1948 
1949 	DP_TRACE_STATS(FATAL, "HTT_TX_DE_EAPOL_PACKETS_STATS_TLV:");
1950 	DP_TRACE_STATS(FATAL, "m1_packets = %u",
1951 			dp_stats_buf->m1_packets);
1952 	DP_TRACE_STATS(FATAL, "m2_packets = %u",
1953 			dp_stats_buf->m2_packets);
1954 	DP_TRACE_STATS(FATAL, "m3_packets = %u",
1955 			dp_stats_buf->m3_packets);
1956 	DP_TRACE_STATS(FATAL, "m4_packets = %u",
1957 			dp_stats_buf->m4_packets);
1958 	DP_TRACE_STATS(FATAL, "g1_packets = %u",
1959 			dp_stats_buf->g1_packets);
1960 	DP_TRACE_STATS(FATAL, "g2_packets = %u\n",
1961 			dp_stats_buf->g2_packets);
1962 }
1963 
1964 /*
1965  * dp_print_tx_de_classify_failed_stats_tlv: display
1966  *				htt_tx_de_classify_failed_stats_tlv
1967  * @tag_buf: buffer containing the tlv htt_tx_de_classify_failed_stats_tlv
1968  *
1969  * return:void
1970  */
1971 static inline void dp_print_tx_de_classify_failed_stats_tlv(uint32_t *tag_buf)
1972 {
1973 	htt_tx_de_classify_failed_stats_tlv *dp_stats_buf =
1974 		(htt_tx_de_classify_failed_stats_tlv *)tag_buf;
1975 
1976 	DP_TRACE_STATS(FATAL, "HTT_TX_DE_CLASSIFY_FAILED_STATS_TLV:");
1977 	DP_TRACE_STATS(FATAL, "ap_bss_peer_not_found = %u",
1978 			dp_stats_buf->ap_bss_peer_not_found);
1979 	DP_TRACE_STATS(FATAL, "ap_bcast_mcast_no_peer = %u",
1980 			dp_stats_buf->ap_bcast_mcast_no_peer);
1981 	DP_TRACE_STATS(FATAL, "sta_delete_in_progress = %u",
1982 			dp_stats_buf->sta_delete_in_progress);
1983 	DP_TRACE_STATS(FATAL, "ibss_no_bss_peer = %u",
1984 			dp_stats_buf->ibss_no_bss_peer);
1985 	DP_TRACE_STATS(FATAL, "invaild_vdev_type = %u",
1986 			dp_stats_buf->invaild_vdev_type);
1987 	DP_TRACE_STATS(FATAL, "invalid_ast_peer_entry = %u",
1988 			dp_stats_buf->invalid_ast_peer_entry);
1989 	DP_TRACE_STATS(FATAL, "peer_entry_invalid = %u",
1990 			dp_stats_buf->peer_entry_invalid);
1991 	DP_TRACE_STATS(FATAL, "ethertype_not_ip = %u",
1992 			dp_stats_buf->ethertype_not_ip);
1993 	DP_TRACE_STATS(FATAL, "eapol_lookup_failed = %u",
1994 			dp_stats_buf->eapol_lookup_failed);
1995 	DP_TRACE_STATS(FATAL, "qpeer_not_allow_data = %u",
1996 			dp_stats_buf->qpeer_not_allow_data);
1997 	DP_TRACE_STATS(FATAL, "fse_tid_override = %u\n",
1998 			dp_stats_buf->fse_tid_override);
1999 }
2000 
2001 /*
2002  * dp_print_tx_de_classify_stats_tlv: display htt_tx_de_classify_stats_tlv
2003  * @tag_buf: buffer containing the tlv htt_tx_de_classify_stats_tlv
2004  *
2005  * return:void
2006  */
2007 static inline void dp_print_tx_de_classify_stats_tlv(uint32_t *tag_buf)
2008 {
2009 	htt_tx_de_classify_stats_tlv *dp_stats_buf =
2010 		(htt_tx_de_classify_stats_tlv *)tag_buf;
2011 
2012 	DP_TRACE_STATS(FATAL, "HTT_TX_DE_CLASSIFY_STATS_TLV:");
2013 	DP_TRACE_STATS(FATAL, "arp_packets = %u",
2014 			dp_stats_buf->arp_packets);
2015 	DP_TRACE_STATS(FATAL, "igmp_packets = %u",
2016 			dp_stats_buf->igmp_packets);
2017 	DP_TRACE_STATS(FATAL, "dhcp_packets = %u",
2018 			dp_stats_buf->dhcp_packets);
2019 	DP_TRACE_STATS(FATAL, "host_inspected = %u",
2020 			dp_stats_buf->host_inspected);
2021 	DP_TRACE_STATS(FATAL, "htt_included = %u",
2022 			dp_stats_buf->htt_included);
2023 	DP_TRACE_STATS(FATAL, "htt_valid_mcs = %u",
2024 			dp_stats_buf->htt_valid_mcs);
2025 	DP_TRACE_STATS(FATAL, "htt_valid_nss = %u",
2026 			dp_stats_buf->htt_valid_nss);
2027 	DP_TRACE_STATS(FATAL, "htt_valid_preamble_type = %u",
2028 			dp_stats_buf->htt_valid_preamble_type);
2029 	DP_TRACE_STATS(FATAL, "htt_valid_chainmask = %u",
2030 			dp_stats_buf->htt_valid_chainmask);
2031 	DP_TRACE_STATS(FATAL, "htt_valid_guard_interval = %u",
2032 			dp_stats_buf->htt_valid_guard_interval);
2033 	DP_TRACE_STATS(FATAL, "htt_valid_retries = %u",
2034 			dp_stats_buf->htt_valid_retries);
2035 	DP_TRACE_STATS(FATAL, "htt_valid_bw_info = %u",
2036 			dp_stats_buf->htt_valid_bw_info);
2037 	DP_TRACE_STATS(FATAL, "htt_valid_power = %u",
2038 			dp_stats_buf->htt_valid_power);
2039 	DP_TRACE_STATS(FATAL, "htt_valid_key_flags = %u",
2040 			dp_stats_buf->htt_valid_key_flags);
2041 	DP_TRACE_STATS(FATAL, "htt_valid_no_encryption = %u",
2042 			dp_stats_buf->htt_valid_no_encryption);
2043 	DP_TRACE_STATS(FATAL, "fse_entry_count = %u",
2044 			dp_stats_buf->fse_entry_count);
2045 	DP_TRACE_STATS(FATAL, "fse_priority_be = %u",
2046 			dp_stats_buf->fse_priority_be);
2047 	DP_TRACE_STATS(FATAL, "fse_priority_high = %u",
2048 			dp_stats_buf->fse_priority_high);
2049 	DP_TRACE_STATS(FATAL, "fse_priority_low = %u",
2050 			dp_stats_buf->fse_priority_low);
2051 	DP_TRACE_STATS(FATAL, "fse_traffic_ptrn_be = %u",
2052 			dp_stats_buf->fse_traffic_ptrn_be);
2053 	DP_TRACE_STATS(FATAL, "fse_traffic_ptrn_over_sub = %u",
2054 			dp_stats_buf->fse_traffic_ptrn_over_sub);
2055 	DP_TRACE_STATS(FATAL, "fse_traffic_ptrn_bursty = %u",
2056 			dp_stats_buf->fse_traffic_ptrn_bursty);
2057 	DP_TRACE_STATS(FATAL, "fse_traffic_ptrn_interactive = %u",
2058 			dp_stats_buf->fse_traffic_ptrn_interactive);
2059 	DP_TRACE_STATS(FATAL, "fse_traffic_ptrn_periodic = %u",
2060 			dp_stats_buf->fse_traffic_ptrn_periodic);
2061 	DP_TRACE_STATS(FATAL, "fse_hwqueue_alloc = %u",
2062 			dp_stats_buf->fse_hwqueue_alloc);
2063 	DP_TRACE_STATS(FATAL, "fse_hwqueue_created = %u",
2064 			dp_stats_buf->fse_hwqueue_created);
2065 	DP_TRACE_STATS(FATAL, "fse_hwqueue_send_to_host = %u",
2066 			dp_stats_buf->fse_hwqueue_send_to_host);
2067 	DP_TRACE_STATS(FATAL, "mcast_entry = %u",
2068 			dp_stats_buf->mcast_entry);
2069 	DP_TRACE_STATS(FATAL, "bcast_entry = %u\n",
2070 			dp_stats_buf->bcast_entry);
2071 }
2072 
2073 /*
2074  * dp_print_tx_de_classify_status_stats_tlv: display
2075  *				htt_tx_de_classify_status_stats_tlv
2076  * @tag_buf: buffer containing the tlv htt_tx_de_classify_status_stats_tlv
2077  *
2078  * return:void
2079  */
2080 static inline void dp_print_tx_de_classify_status_stats_tlv(uint32_t *tag_buf)
2081 {
2082 	htt_tx_de_classify_status_stats_tlv *dp_stats_buf =
2083 		(htt_tx_de_classify_status_stats_tlv *)tag_buf;
2084 
2085 	DP_TRACE_STATS(FATAL, "HTT_TX_DE_CLASSIFY_STATUS_STATS_TLV:");
2086 	DP_TRACE_STATS(FATAL, "eok = %u",
2087 			dp_stats_buf->eok);
2088 	DP_TRACE_STATS(FATAL, "classify_done = %u",
2089 			dp_stats_buf->classify_done);
2090 	DP_TRACE_STATS(FATAL, "lookup_failed = %u",
2091 			dp_stats_buf->lookup_failed);
2092 	DP_TRACE_STATS(FATAL, "send_host_dhcp = %u",
2093 			dp_stats_buf->send_host_dhcp);
2094 	DP_TRACE_STATS(FATAL, "send_host_mcast = %u",
2095 			dp_stats_buf->send_host_mcast);
2096 	DP_TRACE_STATS(FATAL, "send_host_unknown_dest = %u",
2097 			dp_stats_buf->send_host_unknown_dest);
2098 	DP_TRACE_STATS(FATAL, "send_host = %u",
2099 			dp_stats_buf->send_host);
2100 	DP_TRACE_STATS(FATAL, "status_invalid = %u\n",
2101 			dp_stats_buf->status_invalid);
2102 }
2103 
2104 /*
2105  * dp_print_tx_de_enqueue_packets_stats_tlv: display
2106  *				htt_tx_de_enqueue_packets_stats_tlv
2107  * @tag_buf: buffer containing the tlv htt_tx_de_enqueue_packets_stats_tlv
2108  *
2109  * return:void
2110  */
2111 static inline void dp_print_tx_de_enqueue_packets_stats_tlv(uint32_t *tag_buf)
2112 {
2113 	htt_tx_de_enqueue_packets_stats_tlv *dp_stats_buf =
2114 		(htt_tx_de_enqueue_packets_stats_tlv *)tag_buf;
2115 
2116 	DP_TRACE_STATS(FATAL, "HTT_TX_DE_ENQUEUE_PACKETS_STATS_TLV:");
2117 	DP_TRACE_STATS(FATAL, "enqueued_pkts = %u",
2118 			dp_stats_buf->enqueued_pkts);
2119 	DP_TRACE_STATS(FATAL, "to_tqm = %u",
2120 			dp_stats_buf->to_tqm);
2121 	DP_TRACE_STATS(FATAL, "to_tqm_bypass = %u\n",
2122 			dp_stats_buf->to_tqm_bypass);
2123 }
2124 
2125 /*
2126  * dp_print_tx_de_enqueue_discard_stats_tlv: display
2127  *					htt_tx_de_enqueue_discard_stats_tlv
2128  * @tag_buf: buffer containing the tlv htt_tx_de_enqueue_discard_stats_tlv
2129  *
2130  * return:void
2131  */
2132 static inline void dp_print_tx_de_enqueue_discard_stats_tlv(uint32_t *tag_buf)
2133 {
2134 	htt_tx_de_enqueue_discard_stats_tlv *dp_stats_buf =
2135 		(htt_tx_de_enqueue_discard_stats_tlv *)tag_buf;
2136 
2137 	DP_TRACE_STATS(FATAL, "HTT_TX_DE_ENQUEUE_DISCARD_STATS_TLV:");
2138 	DP_TRACE_STATS(FATAL, "discarded_pkts = %u",
2139 			dp_stats_buf->discarded_pkts);
2140 	DP_TRACE_STATS(FATAL, "local_frames = %u",
2141 			dp_stats_buf->local_frames);
2142 	DP_TRACE_STATS(FATAL, "is_ext_msdu = %u\n",
2143 			dp_stats_buf->is_ext_msdu);
2144 }
2145 
2146 /*
2147  * dp_print_tx_de_compl_stats_tlv: display htt_tx_de_compl_stats_tlv
2148  * @tag_buf: buffer containing the tlv htt_tx_de_compl_stats_tlv
2149  *
2150  * return:void
2151  */
2152 static inline void dp_print_tx_de_compl_stats_tlv(uint32_t *tag_buf)
2153 {
2154 	htt_tx_de_compl_stats_tlv *dp_stats_buf =
2155 		(htt_tx_de_compl_stats_tlv *)tag_buf;
2156 
2157 	DP_TRACE_STATS(FATAL, "HTT_TX_DE_COMPL_STATS_TLV:");
2158 	DP_TRACE_STATS(FATAL, "tcl_dummy_frame = %u",
2159 			dp_stats_buf->tcl_dummy_frame);
2160 	DP_TRACE_STATS(FATAL, "tqm_dummy_frame = %u",
2161 			dp_stats_buf->tqm_dummy_frame);
2162 	DP_TRACE_STATS(FATAL, "tqm_notify_frame = %u",
2163 			dp_stats_buf->tqm_notify_frame);
2164 	DP_TRACE_STATS(FATAL, "fw2wbm_enq = %u",
2165 			dp_stats_buf->fw2wbm_enq);
2166 	DP_TRACE_STATS(FATAL, "tqm_bypass_frame = %u\n",
2167 			dp_stats_buf->tqm_bypass_frame);
2168 }
2169 
2170 /*
2171  * dp_print_tx_de_cmn_stats_tlv: display htt_tx_de_cmn_stats_tlv
2172  * @tag_buf: buffer containing the tlv htt_tx_de_cmn_stats_tlv
2173  *
2174  * return:void
2175  */
2176 static inline void dp_print_tx_de_cmn_stats_tlv(uint32_t *tag_buf)
2177 {
2178 	htt_tx_de_cmn_stats_tlv *dp_stats_buf =
2179 		(htt_tx_de_cmn_stats_tlv *)tag_buf;
2180 
2181 	DP_TRACE_STATS(FATAL, "HTT_TX_DE_CMN_STATS_TLV:");
2182 	DP_TRACE_STATS(FATAL, "mac_id__word = %u",
2183 			dp_stats_buf->mac_id__word);
2184 	DP_TRACE_STATS(FATAL, "tcl2fw_entry_count = %u",
2185 			dp_stats_buf->tcl2fw_entry_count);
2186 	DP_TRACE_STATS(FATAL, "not_to_fw = %u",
2187 			dp_stats_buf->not_to_fw);
2188 	DP_TRACE_STATS(FATAL, "invalid_pdev_vdev_peer = %u",
2189 			dp_stats_buf->invalid_pdev_vdev_peer);
2190 	DP_TRACE_STATS(FATAL, "tcl_res_invalid_addrx = %u",
2191 			dp_stats_buf->tcl_res_invalid_addrx);
2192 	DP_TRACE_STATS(FATAL, "wbm2fw_entry_count = %u",
2193 			dp_stats_buf->wbm2fw_entry_count);
2194 	DP_TRACE_STATS(FATAL, "invalid_pdev = %u\n",
2195 			dp_stats_buf->invalid_pdev);
2196 }
2197 
2198 /*
2199  * dp_print_ring_if_stats_tlv: display htt_ring_if_stats_tlv
2200  * @tag_buf: buffer containing the tlv htt_ring_if_stats_tlv
2201  *
2202  * return:void
2203  */
2204 static inline void dp_print_ring_if_stats_tlv(uint32_t *tag_buf)
2205 {
2206 	htt_ring_if_stats_tlv *dp_stats_buf =
2207 		(htt_ring_if_stats_tlv *)tag_buf;
2208 	uint8_t i;
2209 	uint16_t index = 0;
2210 	char *wm_hit_count = qdf_mem_malloc(DP_MAX_STRING_LEN);
2211 
2212 	if (!wm_hit_count) {
2213 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
2214 			  FL("Output buffer not allocated"));
2215 		return;
2216 	}
2217 
2218 	DP_TRACE_STATS(FATAL, "HTT_RING_IF_STATS_TLV:");
2219 	DP_TRACE_STATS(FATAL, "base_addr = %u",
2220 			dp_stats_buf->base_addr);
2221 	DP_TRACE_STATS(FATAL, "elem_size = %u",
2222 			dp_stats_buf->elem_size);
2223 	DP_TRACE_STATS(FATAL, "num_elems__prefetch_tail_idx = %u",
2224 			dp_stats_buf->num_elems__prefetch_tail_idx);
2225 	DP_TRACE_STATS(FATAL, "head_idx__tail_idx = %u",
2226 			dp_stats_buf->head_idx__tail_idx);
2227 	DP_TRACE_STATS(FATAL, "shadow_head_idx__shadow_tail_idx = %u",
2228 			dp_stats_buf->shadow_head_idx__shadow_tail_idx);
2229 	DP_TRACE_STATS(FATAL, "num_tail_incr = %u",
2230 			dp_stats_buf->num_tail_incr);
2231 	DP_TRACE_STATS(FATAL, "lwm_thresh__hwm_thresh = %u",
2232 			dp_stats_buf->lwm_thresh__hwm_thresh);
2233 	DP_TRACE_STATS(FATAL, "overrun_hit_count = %u",
2234 			dp_stats_buf->overrun_hit_count);
2235 	DP_TRACE_STATS(FATAL, "underrun_hit_count = %u",
2236 			dp_stats_buf->underrun_hit_count);
2237 	DP_TRACE_STATS(FATAL, "prod_blockwait_count = %u",
2238 			dp_stats_buf->prod_blockwait_count);
2239 	DP_TRACE_STATS(FATAL, "cons_blockwait_count = %u",
2240 			dp_stats_buf->cons_blockwait_count);
2241 
2242 	for (i = 0; i <  DP_HTT_LOW_WM_HIT_COUNT_LEN; i++) {
2243 		index += qdf_snprint(&wm_hit_count[index],
2244 				DP_MAX_STRING_LEN - index,
2245 				" %u:%u,", i,
2246 				dp_stats_buf->low_wm_hit_count[i]);
2247 	}
2248 	DP_TRACE_STATS(FATAL, "low_wm_hit_count = %s ", wm_hit_count);
2249 
2250 	qdf_mem_zero(wm_hit_count, DP_MAX_STRING_LEN);
2251 
2252 	index = 0;
2253 	for (i = 0; i <  DP_HTT_HIGH_WM_HIT_COUNT_LEN; i++) {
2254 		index += qdf_snprint(&wm_hit_count[index],
2255 				DP_MAX_STRING_LEN - index,
2256 				" %u:%u,", i,
2257 				dp_stats_buf->high_wm_hit_count[i]);
2258 	}
2259 	DP_TRACE_STATS(FATAL, "high_wm_hit_count = %s\n", wm_hit_count);
2260 }
2261 
2262 /*
2263  * dp_print_ring_if_cmn_tlv: display htt_ring_if_cmn_tlv
2264  * @tag_buf: buffer containing the tlv htt_ring_if_cmn_tlv
2265  *
2266  * return:void
2267  */
2268 static inline void dp_print_ring_if_cmn_tlv(uint32_t *tag_buf)
2269 {
2270 	htt_ring_if_cmn_tlv *dp_stats_buf =
2271 		(htt_ring_if_cmn_tlv *)tag_buf;
2272 
2273 	DP_TRACE_STATS(FATAL, "HTT_RING_IF_CMN_TLV:");
2274 	DP_TRACE_STATS(FATAL, "mac_id__word = %u",
2275 			dp_stats_buf->mac_id__word);
2276 	DP_TRACE_STATS(FATAL, "num_records = %u\n",
2277 			dp_stats_buf->num_records);
2278 }
2279 
2280 /*
2281  * dp_print_sfm_client_user_tlv_v: display htt_sfm_client_user_tlv_v
2282  * @tag_buf: buffer containing the tlv htt_sfm_client_user_tlv_v
2283  *
2284  * return:void
2285  */
2286 static inline void dp_print_sfm_client_user_tlv_v(uint32_t *tag_buf)
2287 {
2288 	htt_sfm_client_user_tlv_v *dp_stats_buf =
2289 		(htt_sfm_client_user_tlv_v *)tag_buf;
2290 	uint8_t i;
2291 	uint16_t index = 0;
2292 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
2293 	char *dwords_used_by_user_n = qdf_mem_malloc(DP_MAX_STRING_LEN);
2294 
2295 	if (!dwords_used_by_user_n) {
2296 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
2297 			  FL("Output buffer not allocated"));
2298 		return;
2299 	}
2300 
2301 	DP_TRACE_STATS(FATAL, "HTT_SFM_CLIENT_USER_TLV_V:");
2302 	for (i = 0; i <  tag_len; i++) {
2303 		index += qdf_snprint(&dwords_used_by_user_n[index],
2304 				DP_MAX_STRING_LEN - index,
2305 				" %u:%u,", i,
2306 				dp_stats_buf->dwords_used_by_user_n[i]);
2307 	}
2308 	DP_TRACE_STATS(FATAL, "dwords_used_by_user_n = %s\n",
2309 			dwords_used_by_user_n);
2310 	qdf_mem_free(dwords_used_by_user_n);
2311 }
2312 
2313 /*
2314  * dp_print_sfm_client_tlv: display htt_sfm_client_tlv
2315  * @tag_buf: buffer containing the tlv htt_sfm_client_tlv
2316  *
2317  * return:void
2318  */
2319 static inline void dp_print_sfm_client_tlv(uint32_t *tag_buf)
2320 {
2321 	htt_sfm_client_tlv *dp_stats_buf =
2322 		(htt_sfm_client_tlv *)tag_buf;
2323 
2324 	DP_TRACE_STATS(FATAL, "HTT_SFM_CLIENT_TLV:");
2325 	DP_TRACE_STATS(FATAL, "client_id = %u",
2326 			dp_stats_buf->client_id);
2327 	DP_TRACE_STATS(FATAL, "buf_min = %u",
2328 			dp_stats_buf->buf_min);
2329 	DP_TRACE_STATS(FATAL, "buf_max = %u",
2330 			dp_stats_buf->buf_max);
2331 	DP_TRACE_STATS(FATAL, "buf_busy = %u",
2332 			dp_stats_buf->buf_busy);
2333 	DP_TRACE_STATS(FATAL, "buf_alloc = %u",
2334 			dp_stats_buf->buf_alloc);
2335 	DP_TRACE_STATS(FATAL, "buf_avail = %u",
2336 			dp_stats_buf->buf_avail);
2337 	DP_TRACE_STATS(FATAL, "num_users = %u\n",
2338 			dp_stats_buf->num_users);
2339 }
2340 
2341 /*
2342  * dp_print_sfm_cmn_tlv: display htt_sfm_cmn_tlv
2343  * @tag_buf: buffer containing the tlv htt_sfm_cmn_tlv
2344  *
2345  * return:void
2346  */
2347 static inline void dp_print_sfm_cmn_tlv(uint32_t *tag_buf)
2348 {
2349 	htt_sfm_cmn_tlv *dp_stats_buf =
2350 		(htt_sfm_cmn_tlv *)tag_buf;
2351 
2352 	DP_TRACE_STATS(FATAL, "HTT_SFM_CMN_TLV:");
2353 	DP_TRACE_STATS(FATAL, "mac_id__word = %u",
2354 			dp_stats_buf->mac_id__word);
2355 	DP_TRACE_STATS(FATAL, "buf_total = %u",
2356 			dp_stats_buf->buf_total);
2357 	DP_TRACE_STATS(FATAL, "mem_empty = %u",
2358 			dp_stats_buf->mem_empty);
2359 	DP_TRACE_STATS(FATAL, "deallocate_bufs = %u",
2360 			dp_stats_buf->deallocate_bufs);
2361 	DP_TRACE_STATS(FATAL, "num_records = %u\n",
2362 			dp_stats_buf->num_records);
2363 }
2364 
2365 /*
2366  * dp_print_sring_stats_tlv: display htt_sring_stats_tlv
2367  * @tag_buf: buffer containing the tlv htt_sring_stats_tlv
2368  *
2369  * return:void
2370  */
2371 static inline void dp_print_sring_stats_tlv(uint32_t *tag_buf)
2372 {
2373 	htt_sring_stats_tlv *dp_stats_buf =
2374 		(htt_sring_stats_tlv *)tag_buf;
2375 
2376 	DP_TRACE_STATS(FATAL, "HTT_SRING_STATS_TLV:");
2377 	DP_TRACE_STATS(FATAL, "mac_id__ring_id__arena__ep = %u",
2378 			dp_stats_buf->mac_id__ring_id__arena__ep);
2379 	DP_TRACE_STATS(FATAL, "base_addr_lsb = %u",
2380 			dp_stats_buf->base_addr_lsb);
2381 	DP_TRACE_STATS(FATAL, "base_addr_msb = %u",
2382 			dp_stats_buf->base_addr_msb);
2383 	DP_TRACE_STATS(FATAL, "ring_size = %u",
2384 			dp_stats_buf->ring_size);
2385 	DP_TRACE_STATS(FATAL, "elem_size = %u",
2386 			dp_stats_buf->elem_size);
2387 	DP_TRACE_STATS(FATAL, "num_avail_words__num_valid_words = %u",
2388 			dp_stats_buf->num_avail_words__num_valid_words);
2389 	DP_TRACE_STATS(FATAL, "head_ptr__tail_ptr = %u",
2390 			dp_stats_buf->head_ptr__tail_ptr);
2391 	DP_TRACE_STATS(FATAL, "consumer_empty__producer_full = %u",
2392 			dp_stats_buf->consumer_empty__producer_full);
2393 	DP_TRACE_STATS(FATAL, "prefetch_count__internal_tail_ptr = %u\n",
2394 			dp_stats_buf->prefetch_count__internal_tail_ptr);
2395 }
2396 
2397 /*
2398  * dp_print_sring_cmn_tlv: display htt_sring_cmn_tlv
2399  * @tag_buf: buffer containing the tlv htt_sring_cmn_tlv
2400  *
2401  * return:void
2402  */
2403 static inline void dp_print_sring_cmn_tlv(uint32_t *tag_buf)
2404 {
2405 	htt_sring_cmn_tlv *dp_stats_buf =
2406 		(htt_sring_cmn_tlv *)tag_buf;
2407 
2408 	DP_TRACE_STATS(FATAL, "HTT_SRING_CMN_TLV:");
2409 	DP_TRACE_STATS(FATAL, "num_records = %u\n",
2410 			dp_stats_buf->num_records);
2411 }
2412 
2413 /*
2414  * dp_print_tx_pdev_rate_stats_tlv: display htt_tx_pdev_rate_stats_tlv
2415  * @tag_buf: buffer containing the tlv htt_tx_pdev_rate_stats_tlv
2416  *
2417  * return:void
2418  */
2419 static inline void dp_print_tx_pdev_rate_stats_tlv(uint32_t *tag_buf)
2420 {
2421 	htt_tx_pdev_rate_stats_tlv *dp_stats_buf =
2422 		(htt_tx_pdev_rate_stats_tlv *)tag_buf;
2423 	uint8_t i, j;
2424 	uint16_t index = 0;
2425 	char *tx_gi[HTT_TX_PEER_STATS_NUM_GI_COUNTERS];
2426 	char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
2427 
2428 	if (!str_buf) {
2429 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
2430 			  FL("Output buffer not allocated"));
2431 		return;
2432 	}
2433 
2434 	for (i = 0; i < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; i++) {
2435 		tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
2436 	}
2437 
2438 	DP_TRACE_STATS(FATAL, "HTT_TX_PDEV_RATE_STATS_TLV:");
2439 	DP_TRACE_STATS(FATAL, "mac_id__word = %u",
2440 			dp_stats_buf->mac_id__word);
2441 	DP_TRACE_STATS(FATAL, "tx_ldpc = %u",
2442 			dp_stats_buf->tx_ldpc);
2443 	DP_TRACE_STATS(FATAL, "rts_cnt = %u",
2444 			dp_stats_buf->rts_cnt);
2445 	DP_TRACE_STATS(FATAL, "rts_success = %u",
2446 			dp_stats_buf->rts_success);
2447 
2448 	DP_TRACE_STATS(FATAL, "ack_rssi = %u",
2449 			dp_stats_buf->ack_rssi);
2450 
2451 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2452 	for (i = 0; i <  DP_HTT_TX_MCS_LEN; i++) {
2453 		index += qdf_snprint(&str_buf[index],
2454 				DP_MAX_STRING_LEN - index,
2455 				" %u:%u,", i, dp_stats_buf->tx_mcs[i]);
2456 	}
2457 	DP_TRACE_STATS(FATAL, "tx_mcs = %s ", str_buf);
2458 
2459 	index = 0;
2460 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2461 	for (i = 0; i <  DP_HTT_TX_SU_MCS_LEN; i++) {
2462 		index += qdf_snprint(&str_buf[index],
2463 				DP_MAX_STRING_LEN - index,
2464 				" %u:%u,", i, dp_stats_buf->tx_su_mcs[i]);
2465 	}
2466 	DP_TRACE_STATS(FATAL, "tx_su_mcs = %s ", str_buf);
2467 
2468 	index = 0;
2469 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2470 	for (i = 0; i <  DP_HTT_TX_MU_MCS_LEN; i++) {
2471 		index += qdf_snprint(&str_buf[index],
2472 				DP_MAX_STRING_LEN - index,
2473 				" %u:%u,", i, dp_stats_buf->tx_mu_mcs[i]);
2474 	}
2475 	DP_TRACE_STATS(FATAL, "tx_mu_mcs = %s ", str_buf);
2476 
2477 	index = 0;
2478 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2479 	for (i = 0; i <  DP_HTT_TX_NSS_LEN; i++) {
2480 		/* 0 stands for NSS 1, 1 stands for NSS 2, etc. */
2481 		index += qdf_snprint(&str_buf[index],
2482 				DP_MAX_STRING_LEN - index,
2483 				" %u:%u,", (i + 1),
2484 				dp_stats_buf->tx_nss[i]);
2485 	}
2486 	DP_TRACE_STATS(FATAL, "tx_nss = %s ", str_buf);
2487 
2488 	index = 0;
2489 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2490 	for (i = 0; i <  DP_HTT_TX_BW_LEN; i++) {
2491 		index += qdf_snprint(&str_buf[index],
2492 				DP_MAX_STRING_LEN - index,
2493 				" %u:%u,", i, dp_stats_buf->tx_bw[i]);
2494 	}
2495 	DP_TRACE_STATS(FATAL, "tx_bw = %s ", str_buf);
2496 
2497 	index = 0;
2498 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2499 	for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
2500 		index += qdf_snprint(&str_buf[index],
2501 				DP_MAX_STRING_LEN - index,
2502 				" %u:%u,", i, dp_stats_buf->tx_stbc[i]);
2503 	}
2504 	DP_TRACE_STATS(FATAL, "tx_stbc = %s ", str_buf);
2505 
2506 	index = 0;
2507 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2508 	for (i = 0; i <  DP_HTT_TX_PREAM_LEN; i++) {
2509 		index += qdf_snprint(&str_buf[index],
2510 				DP_MAX_STRING_LEN - index,
2511 				" %u:%u,", i, dp_stats_buf->tx_pream[i]);
2512 	}
2513 	DP_TRACE_STATS(FATAL, "tx_pream = %s ", str_buf);
2514 
2515 	for (j = 0; j < DP_HTT_PDEV_TX_GI_LEN; j++) {
2516 		index = 0;
2517 		for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
2518 			index += qdf_snprint(&tx_gi[j][index],
2519 					DP_MAX_STRING_LEN - index,
2520 					" %u:%u,", i,
2521 					dp_stats_buf->tx_gi[j][i]);
2522 		}
2523 		DP_TRACE_STATS(FATAL, "tx_gi[%u] = %s ", j, tx_gi[j]);
2524 	}
2525 
2526 	index = 0;
2527 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2528 	for (i = 0; i <  DP_HTT_TX_DCM_LEN; i++) {
2529 		index += qdf_snprint(&str_buf[index],
2530 				DP_MAX_STRING_LEN - index,
2531 				" %u:%u,", i, dp_stats_buf->tx_dcm[i]);
2532 	}
2533 	DP_TRACE_STATS(FATAL, "tx_dcm = %s\n", str_buf);
2534 
2535 	for (i = 0; i < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; i++)
2536 		qdf_mem_free(tx_gi[i]);
2537 
2538 	qdf_mem_free(str_buf);
2539 }
2540 
2541 /*
2542  * dp_print_rx_pdev_rate_stats_tlv: display htt_rx_pdev_rate_stats_tlv
2543  * @tag_buf: buffer containing the tlv htt_rx_pdev_rate_stats_tlv
2544  *
2545  * return:void
2546  */
2547 static inline void dp_print_rx_pdev_rate_stats_tlv(uint32_t *tag_buf)
2548 {
2549 	htt_rx_pdev_rate_stats_tlv *dp_stats_buf =
2550 		(htt_rx_pdev_rate_stats_tlv *)tag_buf;
2551 	uint8_t i, j;
2552 	uint16_t index = 0;
2553 	char *rssi_chain[DP_HTT_RSSI_CHAIN_LEN];
2554 	char *rx_gi[HTT_RX_PDEV_STATS_NUM_GI_COUNTERS];
2555 	char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
2556 
2557 	if (!str_buf) {
2558 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
2559 			  FL("Output buffer not allocated"));
2560 		return;
2561 	}
2562 
2563 	for (i = 0; i < DP_HTT_RSSI_CHAIN_LEN; i++)
2564 		rssi_chain[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
2565 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++)
2566 		rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
2567 
2568 	DP_TRACE_STATS(FATAL, "HTT_RX_PDEV_RATE_STATS_TLV:");
2569 	DP_TRACE_STATS(FATAL, "mac_id__word = %u",
2570 			dp_stats_buf->mac_id__word);
2571 	DP_TRACE_STATS(FATAL, "nsts = %u",
2572 			dp_stats_buf->nsts);
2573 	DP_TRACE_STATS(FATAL, "rx_ldpc = %u",
2574 			dp_stats_buf->rx_ldpc);
2575 	DP_TRACE_STATS(FATAL, "rts_cnt = %u",
2576 			dp_stats_buf->rts_cnt);
2577 	DP_TRACE_STATS(FATAL, "rssi_mgmt = %u",
2578 			dp_stats_buf->rssi_mgmt);
2579 	DP_TRACE_STATS(FATAL, "rssi_data = %u",
2580 			dp_stats_buf->rssi_data);
2581 	DP_TRACE_STATS(FATAL, "rssi_comb = %u",
2582 			dp_stats_buf->rssi_comb);
2583 
2584 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2585 	for (i = 0; i <  DP_HTT_RX_MCS_LEN; i++) {
2586 		index += qdf_snprint(&str_buf[index],
2587 				DP_MAX_STRING_LEN - index,
2588 				" %u:%u,", i, dp_stats_buf->rx_mcs[i]);
2589 	}
2590 	DP_TRACE_STATS(FATAL, "rx_mcs = %s ", str_buf);
2591 
2592 	index = 0;
2593 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2594 	for (i = 0; i <  DP_HTT_RX_NSS_LEN; i++) {
2595 		/* 0 stands for NSS 1, 1 stands for NSS 2, etc. */
2596 		index += qdf_snprint(&str_buf[index],
2597 				DP_MAX_STRING_LEN - index,
2598 				" %u:%u,", (i + 1),
2599 				dp_stats_buf->rx_nss[i]);
2600 	}
2601 	DP_TRACE_STATS(FATAL, "rx_nss = %s ", str_buf);
2602 
2603 	index = 0;
2604 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2605 	for (i = 0; i <  DP_HTT_RX_DCM_LEN; i++) {
2606 		index += qdf_snprint(&str_buf[index],
2607 				DP_MAX_STRING_LEN - index,
2608 				" %u:%u,", i, dp_stats_buf->rx_dcm[i]);
2609 	}
2610 	DP_TRACE_STATS(FATAL, "rx_dcm = %s ", str_buf);
2611 
2612 	index = 0;
2613 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2614 	for (i = 0; i <  HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
2615 		index += qdf_snprint(&str_buf[index],
2616 				DP_MAX_STRING_LEN - index,
2617 				" %u:%u,", i, dp_stats_buf->rx_stbc[i]);
2618 	}
2619 	DP_TRACE_STATS(FATAL, "rx_stbc = %s ", str_buf);
2620 
2621 	index = 0;
2622 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2623 	for (i = 0; i <  DP_HTT_RX_BW_LEN; i++) {
2624 		index += qdf_snprint(&str_buf[index],
2625 				DP_MAX_STRING_LEN - index,
2626 				" %u:%u,", i, dp_stats_buf->rx_bw[i]);
2627 	}
2628 	DP_TRACE_STATS(FATAL, "rx_bw = %s ", str_buf);
2629 
2630 	for (j = 0; j < DP_HTT_RSSI_CHAIN_LEN; j++) {
2631 		index = 0;
2632 		for (i = 0; i <  HTT_RX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
2633 			index += qdf_snprint(&rssi_chain[j][index],
2634 					DP_MAX_STRING_LEN - index,
2635 					" %u:%u,", i,
2636 					dp_stats_buf->rssi_chain[j][i]);
2637 		}
2638 		DP_TRACE_STATS(FATAL, "rssi_chain[%u] = %s ", j, rssi_chain[j]);
2639 	}
2640 
2641 	for (j = 0; j < DP_HTT_RX_GI_LEN; j++) {
2642 		index = 0;
2643 		for (i = 0; i <  HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
2644 			index += qdf_snprint(&rx_gi[j][index],
2645 					DP_MAX_STRING_LEN - index,
2646 					" %u:%u,", i,
2647 					dp_stats_buf->rx_gi[j][i]);
2648 		}
2649 		DP_TRACE_STATS(FATAL, "rx_gi[%u] = %s ", j, rx_gi[j]);
2650 	}
2651 
2652 	index = 0;
2653 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
2654 	for (i = 0; i <  DP_HTT_RX_PREAM_LEN; i++) {
2655 		index += qdf_snprint(&str_buf[index],
2656 				DP_MAX_STRING_LEN - index,
2657 				" %u:%u,", i, dp_stats_buf->rx_pream[i]);
2658 	}
2659 	DP_TRACE_STATS(FATAL, "rx_pream = %s\n", str_buf);
2660 	for (i = 0; i < DP_HTT_RSSI_CHAIN_LEN; i++)
2661 		qdf_mem_free(rssi_chain[i]);
2662 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++)
2663 		qdf_mem_free(rx_gi[i]);
2664 
2665 	qdf_mem_free(str_buf);
2666 }
2667 
2668 /*
2669  * dp_print_rx_soc_fw_stats_tlv: display htt_rx_soc_fw_stats_tlv
2670  * @tag_buf: buffer containing the tlv htt_rx_soc_fw_stats_tlv
2671  *
2672  * return:void
2673  */
2674 static inline void dp_print_rx_soc_fw_stats_tlv(uint32_t *tag_buf)
2675 {
2676 	htt_rx_soc_fw_stats_tlv *dp_stats_buf =
2677 		(htt_rx_soc_fw_stats_tlv *)tag_buf;
2678 
2679 	DP_TRACE_STATS(FATAL, "HTT_RX_SOC_FW_STATS_TLV:");
2680 	DP_TRACE_STATS(FATAL, "fw_reo_ring_data_msdu = %u",
2681 		      dp_stats_buf->fw_reo_ring_data_msdu);
2682 	DP_TRACE_STATS(FATAL, "fw_to_host_data_msdu_bcmc = %u",
2683 		      dp_stats_buf->fw_to_host_data_msdu_bcmc);
2684 	DP_TRACE_STATS(FATAL, "fw_to_host_data_msdu_uc = %u",
2685 		      dp_stats_buf->fw_to_host_data_msdu_uc);
2686 	DP_TRACE_STATS(FATAL, "ofld_remote_data_buf_recycle_cnt = %u",
2687 		      dp_stats_buf->ofld_remote_data_buf_recycle_cnt);
2688 	DP_TRACE_STATS(FATAL, "ofld_remote_free_buf_indication_cnt = %u",
2689 		      dp_stats_buf->ofld_remote_free_buf_indication_cnt);
2690 	DP_TRACE_STATS(FATAL, "ofld_buf_to_host_data_msdu_uc = %u ",
2691 		      dp_stats_buf->ofld_buf_to_host_data_msdu_uc);
2692 	DP_TRACE_STATS(FATAL, "reo_fw_ring_to_host_data_msdu_uc = %u ",
2693 		      dp_stats_buf->reo_fw_ring_to_host_data_msdu_uc);
2694 	DP_TRACE_STATS(FATAL, "wbm_sw_ring_reap = %u ",
2695 		      dp_stats_buf->wbm_sw_ring_reap);
2696 	DP_TRACE_STATS(FATAL, "wbm_forward_to_host_cnt = %u ",
2697 		      dp_stats_buf->wbm_forward_to_host_cnt);
2698 	DP_TRACE_STATS(FATAL, "wbm_target_recycle_cnt = %u ",
2699 		      dp_stats_buf->wbm_target_recycle_cnt);
2700 	DP_TRACE_STATS(FATAL, "target_refill_ring_recycle_cnt = %u",
2701 		      dp_stats_buf->target_refill_ring_recycle_cnt);
2702 
2703 }
2704 
2705 /*
2706  * dp_print_rx_soc_fw_refill_ring_empty_tlv_v: display
2707  *					htt_rx_soc_fw_refill_ring_empty_tlv_v
2708  * @tag_buf: buffer containing the tlv htt_rx_soc_fw_refill_ring_empty_tlv_v
2709  *
2710  * return:void
2711  */
2712 static inline void dp_print_rx_soc_fw_refill_ring_empty_tlv_v(uint32_t *tag_buf)
2713 {
2714 	htt_rx_soc_fw_refill_ring_empty_tlv_v *dp_stats_buf =
2715 		(htt_rx_soc_fw_refill_ring_empty_tlv_v *)tag_buf;
2716 	uint8_t i;
2717 	uint16_t index = 0;
2718 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
2719 	char *refill_ring_empty_cnt = qdf_mem_malloc(DP_MAX_STRING_LEN);
2720 
2721 	if (!refill_ring_empty_cnt) {
2722 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
2723 			  FL("Output buffer not allocated"));
2724 		return;
2725 	}
2726 
2727 	tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_STATS_REFILL_MAX_RING);
2728 
2729 	DP_TRACE_STATS(FATAL, "HTT_RX_SOC_FW_REFILL_RING_EMPTY_TLV_V:");
2730 	for (i = 0; i <  tag_len; i++) {
2731 		index += qdf_snprint(&refill_ring_empty_cnt[index],
2732 				DP_MAX_STRING_LEN - index,
2733 				" %u:%u,", i,
2734 				dp_stats_buf->refill_ring_empty_cnt[i]);
2735 	}
2736 	DP_TRACE_STATS(FATAL, "refill_ring_empty_cnt = %s\n",
2737 			refill_ring_empty_cnt);
2738 	qdf_mem_free(refill_ring_empty_cnt);
2739 }
2740 
2741 /*
2742  * dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v: display
2743  *				htt_rx_soc_fw_refill_ring_num_refill_tlv_v
2744  * @tag_buf: buffer containing the tlv htt_rx_soc_fw_refill_ring_num_refill_tlv
2745  *
2746  * return:void
2747  */
2748 static inline void dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v(
2749 		uint32_t *tag_buf)
2750 {
2751 	htt_rx_soc_fw_refill_ring_num_refill_tlv_v *dp_stats_buf =
2752 		(htt_rx_soc_fw_refill_ring_num_refill_tlv_v *)tag_buf;
2753 	uint8_t i;
2754 	uint16_t index = 0;
2755 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
2756 	char *refill_ring_num_refill = qdf_mem_malloc(DP_MAX_STRING_LEN);
2757 
2758 	if (!refill_ring_num_refill) {
2759 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
2760 			  FL("Output buffer not allocated"));
2761 		return;
2762 	}
2763 
2764 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_URRN_STATS);
2765 
2766 	DP_TRACE_STATS(FATAL, "HTT_RX_SOC_FW_REFILL_RING_NUM_REFILL_TLV_V:");
2767 	for (i = 0; i <  tag_len; i++) {
2768 		index += qdf_snprint(&refill_ring_num_refill[index],
2769 				DP_MAX_STRING_LEN - index,
2770 				" %u:%u,", i,
2771 				dp_stats_buf->refill_ring_num_refill[i]);
2772 	}
2773 	DP_TRACE_STATS(FATAL, "refill_ring_num_refill = %s\n",
2774 			refill_ring_num_refill);
2775 	qdf_mem_free(refill_ring_num_refill);
2776 }
2777 
2778 /*
2779  * dp_print_rx_pdev_fw_stats_tlv: display htt_rx_pdev_fw_stats_tlv
2780  * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_stats_tlv
2781  *
2782  * return:void
2783  */
2784 static inline void dp_print_rx_pdev_fw_stats_tlv(uint32_t *tag_buf)
2785 {
2786 	htt_rx_pdev_fw_stats_tlv *dp_stats_buf =
2787 		(htt_rx_pdev_fw_stats_tlv *)tag_buf;
2788 	uint8_t i;
2789 	uint16_t index = 0;
2790 	char fw_ring_mgmt_subtype[DP_MAX_STRING_LEN];
2791 	char fw_ring_ctrl_subtype[DP_MAX_STRING_LEN];
2792 
2793 	DP_TRACE_STATS(FATAL, "HTT_RX_PDEV_FW_STATS_TLV:");
2794 	DP_TRACE_STATS(FATAL, "mac_id__word = %u",
2795 			dp_stats_buf->mac_id__word);
2796 	DP_TRACE_STATS(FATAL, "ppdu_recvd = %u",
2797 			dp_stats_buf->ppdu_recvd);
2798 	DP_TRACE_STATS(FATAL, "mpdu_cnt_fcs_ok = %u",
2799 			dp_stats_buf->mpdu_cnt_fcs_ok);
2800 	DP_TRACE_STATS(FATAL, "mpdu_cnt_fcs_err = %u",
2801 			dp_stats_buf->mpdu_cnt_fcs_err);
2802 	DP_TRACE_STATS(FATAL, "tcp_msdu_cnt = %u",
2803 			dp_stats_buf->tcp_msdu_cnt);
2804 	DP_TRACE_STATS(FATAL, "tcp_ack_msdu_cnt = %u",
2805 			dp_stats_buf->tcp_ack_msdu_cnt);
2806 	DP_TRACE_STATS(FATAL, "udp_msdu_cnt = %u",
2807 			dp_stats_buf->udp_msdu_cnt);
2808 	DP_TRACE_STATS(FATAL, "other_msdu_cnt = %u",
2809 			dp_stats_buf->other_msdu_cnt);
2810 	DP_TRACE_STATS(FATAL, "fw_ring_mpdu_ind = %u",
2811 			dp_stats_buf->fw_ring_mpdu_ind);
2812 
2813 	for (i = 0; i <  DP_HTT_FW_RING_MGMT_SUBTYPE_LEN; i++) {
2814 		index += qdf_snprint(&fw_ring_mgmt_subtype[index],
2815 				DP_MAX_STRING_LEN - index,
2816 				" %u:%u,", i,
2817 				dp_stats_buf->fw_ring_mgmt_subtype[i]);
2818 	}
2819 	DP_TRACE_STATS(FATAL, "fw_ring_mgmt_subtype = %s ", fw_ring_mgmt_subtype);
2820 
2821 	index = 0;
2822 	for (i = 0; i <  DP_HTT_FW_RING_CTRL_SUBTYPE_LEN; i++) {
2823 		index += qdf_snprint(&fw_ring_ctrl_subtype[index],
2824 				DP_MAX_STRING_LEN - index,
2825 				" %u:%u,", i,
2826 				dp_stats_buf->fw_ring_ctrl_subtype[i]);
2827 	}
2828 	DP_TRACE_STATS(FATAL, "fw_ring_ctrl_subtype = %s ", fw_ring_ctrl_subtype);
2829 	DP_TRACE_STATS(FATAL, "fw_ring_mcast_data_msdu = %u",
2830 			dp_stats_buf->fw_ring_mcast_data_msdu);
2831 	DP_TRACE_STATS(FATAL, "fw_ring_bcast_data_msdu = %u",
2832 			dp_stats_buf->fw_ring_bcast_data_msdu);
2833 	DP_TRACE_STATS(FATAL, "fw_ring_ucast_data_msdu = %u",
2834 			dp_stats_buf->fw_ring_ucast_data_msdu);
2835 	DP_TRACE_STATS(FATAL, "fw_ring_null_data_msdu = %u",
2836 			dp_stats_buf->fw_ring_null_data_msdu);
2837 	DP_TRACE_STATS(FATAL, "fw_ring_mpdu_drop = %u",
2838 			dp_stats_buf->fw_ring_mpdu_drop);
2839 	DP_TRACE_STATS(FATAL, "ofld_local_data_ind_cnt = %u",
2840 			dp_stats_buf->ofld_local_data_ind_cnt);
2841 	DP_TRACE_STATS(FATAL, "ofld_local_data_buf_recycle_cnt = %u",
2842 			dp_stats_buf->ofld_local_data_buf_recycle_cnt);
2843 	DP_TRACE_STATS(FATAL, "drx_local_data_ind_cnt = %u",
2844 			dp_stats_buf->drx_local_data_ind_cnt);
2845 	DP_TRACE_STATS(FATAL, "drx_local_data_buf_recycle_cnt = %u",
2846 			dp_stats_buf->drx_local_data_buf_recycle_cnt);
2847 	DP_TRACE_STATS(FATAL, "local_nondata_ind_cnt = %u",
2848 			dp_stats_buf->local_nondata_ind_cnt);
2849 	DP_TRACE_STATS(FATAL, "local_nondata_buf_recycle_cnt = %u",
2850 			dp_stats_buf->local_nondata_buf_recycle_cnt);
2851 	DP_TRACE_STATS(FATAL, "fw_status_buf_ring_refill_cnt = %u",
2852 			dp_stats_buf->fw_status_buf_ring_refill_cnt);
2853 	DP_TRACE_STATS(FATAL, "fw_status_buf_ring_empty_cnt = %u",
2854 			dp_stats_buf->fw_status_buf_ring_empty_cnt);
2855 	DP_TRACE_STATS(FATAL, "fw_pkt_buf_ring_refill_cnt = %u",
2856 			dp_stats_buf->fw_pkt_buf_ring_refill_cnt);
2857 	DP_TRACE_STATS(FATAL, "fw_pkt_buf_ring_empty_cnt = %u",
2858 			dp_stats_buf->fw_pkt_buf_ring_empty_cnt);
2859 	DP_TRACE_STATS(FATAL, "fw_link_buf_ring_refill_cnt = %u",
2860 			dp_stats_buf->fw_link_buf_ring_refill_cnt);
2861 	DP_TRACE_STATS(FATAL, "fw_link_buf_ring_empty_cnt = %u",
2862 			dp_stats_buf->fw_link_buf_ring_empty_cnt);
2863 	DP_TRACE_STATS(FATAL, "host_pkt_buf_ring_refill_cnt = %u",
2864 			dp_stats_buf->host_pkt_buf_ring_refill_cnt);
2865 	DP_TRACE_STATS(FATAL, "host_pkt_buf_ring_empty_cnt = %u",
2866 			dp_stats_buf->host_pkt_buf_ring_empty_cnt);
2867 	DP_TRACE_STATS(FATAL, "mon_pkt_buf_ring_refill_cnt = %u",
2868 			dp_stats_buf->mon_pkt_buf_ring_refill_cnt);
2869 	DP_TRACE_STATS(FATAL, "mon_pkt_buf_ring_empty_cnt = %u",
2870 			dp_stats_buf->mon_pkt_buf_ring_empty_cnt);
2871 	DP_TRACE_STATS(FATAL, "mon_status_buf_ring_refill_cnt = %u",
2872 			dp_stats_buf->mon_status_buf_ring_refill_cnt);
2873 	DP_TRACE_STATS(FATAL, "mon_status_buf_ring_empty_cnt = %u",
2874 			dp_stats_buf->mon_status_buf_ring_empty_cnt);
2875 	DP_TRACE_STATS(FATAL, "mon_desc_buf_ring_refill_cnt = %u",
2876 			dp_stats_buf->mon_desc_buf_ring_refill_cnt);
2877 	DP_TRACE_STATS(FATAL, "mon_desc_buf_ring_empty_cnt = %u",
2878 			dp_stats_buf->mon_desc_buf_ring_empty_cnt);
2879 	DP_TRACE_STATS(FATAL, "mon_dest_ring_update_cnt = %u",
2880 			dp_stats_buf->mon_dest_ring_update_cnt);
2881 	DP_TRACE_STATS(FATAL, "mon_dest_ring_full_cnt = %u",
2882 			dp_stats_buf->mon_dest_ring_full_cnt);
2883 	DP_TRACE_STATS(FATAL, "rx_suspend_cnt = %u",
2884 			dp_stats_buf->rx_suspend_cnt);
2885 	DP_TRACE_STATS(FATAL, "rx_suspend_fail_cnt = %u",
2886 			dp_stats_buf->rx_suspend_fail_cnt);
2887 	DP_TRACE_STATS(FATAL, "rx_resume_cnt = %u",
2888 			dp_stats_buf->rx_resume_cnt);
2889 	DP_TRACE_STATS(FATAL, "rx_resume_fail_cnt = %u",
2890 			dp_stats_buf->rx_resume_fail_cnt);
2891 	DP_TRACE_STATS(FATAL, "rx_ring_switch_cnt = %u",
2892 			dp_stats_buf->rx_ring_switch_cnt);
2893 	DP_TRACE_STATS(FATAL, "rx_ring_restore_cnt = %u",
2894 			dp_stats_buf->rx_ring_restore_cnt);
2895 	DP_TRACE_STATS(FATAL, "rx_flush_cnt = %u\n",
2896 			dp_stats_buf->rx_flush_cnt);
2897 }
2898 
2899 /*
2900  * dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v: display
2901  *				htt_rx_pdev_fw_ring_mpdu_err_tlv_v
2902  * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_ring_mpdu_err_tlv_v
2903  *
2904  * return:void
2905  */
2906 static inline void dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v(uint32_t *tag_buf)
2907 {
2908 	htt_rx_pdev_fw_ring_mpdu_err_tlv_v *dp_stats_buf =
2909 		(htt_rx_pdev_fw_ring_mpdu_err_tlv_v *)tag_buf;
2910 	uint8_t i;
2911 	uint16_t index = 0;
2912 	char *fw_ring_mpdu_err = qdf_mem_malloc(DP_MAX_STRING_LEN);
2913 
2914 	if (!fw_ring_mpdu_err) {
2915 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
2916 			  FL("Output buffer not allocated"));
2917 		return;
2918 	}
2919 
2920 	DP_TRACE_STATS(FATAL, "HTT_RX_PDEV_FW_RING_MPDU_ERR_TLV_V:");
2921 	for (i = 0; i <  DP_HTT_FW_RING_MPDU_ERR_LEN; i++) {
2922 		index += qdf_snprint(&fw_ring_mpdu_err[index],
2923 				DP_MAX_STRING_LEN - index,
2924 				" %u:%u,", i,
2925 				dp_stats_buf->fw_ring_mpdu_err[i]);
2926 	}
2927 	DP_TRACE_STATS(FATAL, "fw_ring_mpdu_err = %s\n", fw_ring_mpdu_err);
2928 	qdf_mem_free(fw_ring_mpdu_err);
2929 }
2930 
2931 /*
2932  * dp_print_rx_pdev_fw_mpdu_drop_tlv_v: display htt_rx_pdev_fw_mpdu_drop_tlv_v
2933  * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_mpdu_drop_tlv_v
2934  *
2935  * return:void
2936  */
2937 static inline void dp_print_rx_pdev_fw_mpdu_drop_tlv_v(uint32_t *tag_buf)
2938 {
2939 	htt_rx_pdev_fw_mpdu_drop_tlv_v *dp_stats_buf =
2940 		(htt_rx_pdev_fw_mpdu_drop_tlv_v *)tag_buf;
2941 	uint8_t i;
2942 	uint16_t index = 0;
2943 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
2944 	char *fw_mpdu_drop = qdf_mem_malloc(DP_MAX_STRING_LEN);
2945 
2946 	if (!fw_mpdu_drop) {
2947 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
2948 			  FL("Output buffer not allocated"));
2949 		return;
2950 	}
2951 
2952 	tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_STATS_FW_DROP_REASON_MAX);
2953 
2954 	DP_TRACE_STATS(FATAL, "HTT_RX_PDEV_FW_MPDU_DROP_TLV_V:");
2955 	for (i = 0; i <  tag_len; i++) {
2956 		index += qdf_snprint(&fw_mpdu_drop[index],
2957 				DP_MAX_STRING_LEN - index,
2958 				" %u:%u,", i, dp_stats_buf->fw_mpdu_drop[i]);
2959 	}
2960 	DP_TRACE_STATS(FATAL, "fw_mpdu_drop = %s\n", fw_mpdu_drop);
2961 	qdf_mem_free(fw_mpdu_drop);
2962 }
2963 
2964 /*
2965  * dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv() - Accounts for rxdma error
2966  * packets
2967  *
2968  * tag_buf - Buffer
2969  * Return - NULL
2970  */
2971 static inline void dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv(uint32_t *tag_buf)
2972 {
2973 	htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v *dp_stats_buf =
2974 		(htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v *)tag_buf;
2975 
2976 	uint8_t i;
2977 	uint16_t index = 0;
2978 	char rxdma_err_cnt[DP_MAX_STRING_LEN];
2979 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
2980 
2981 	tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_RXDMA_MAX_ERR_CODE);
2982 
2983 	DP_TRACE_STATS(FATAL, "HTT_RX_SOC_FW_REFILL_RING_NUM_RXDMA_ERR_TLV_V");
2984 
2985 	for (i = 0; i <  tag_len; i++) {
2986 		index += snprintf(&rxdma_err_cnt[index],
2987 				DP_MAX_STRING_LEN - index,
2988 				" %u:%u,", i,
2989 				dp_stats_buf->rxdma_err[i]);
2990 	}
2991 
2992 	DP_TRACE_STATS(FATAL, "rxdma_err = %s\n", rxdma_err_cnt);
2993 }
2994 
2995 /*
2996  * dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv() - Accounts for reo error
2997  * packets
2998  *
2999  * tag_buf - Buffer
3000  * Return - NULL
3001  */
3002 static inline void dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv(uint32_t *tag_buf)
3003 {
3004 	htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v *dp_stats_buf =
3005 		(htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v *)tag_buf;
3006 
3007 	uint8_t i;
3008 	uint16_t index = 0;
3009 	char reo_err_cnt[DP_MAX_STRING_LEN];
3010 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
3011 
3012 	tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_REO_MAX_ERR_CODE);
3013 
3014 	DP_TRACE_STATS(FATAL, "HTT_RX_SOC_FW_REFILL_RING_NUM_REO_ERR_TLV_V");
3015 
3016 	for (i = 0; i <  tag_len; i++) {
3017 		index += snprintf(&reo_err_cnt[index],
3018 				DP_MAX_STRING_LEN - index,
3019 				" %u:%u,", i,
3020 				dp_stats_buf->reo_err[i]);
3021 	}
3022 
3023 	DP_TRACE_STATS(FATAL, "reo_err = %s\n", reo_err_cnt);
3024 }
3025 
3026 /*
3027  * dp_print_rx_reo_debug_stats_tlv() - REO Statistics
3028  *
3029  * tag_buf - Buffer
3030  * Return - NULL
3031  */
3032 static inline void dp_print_rx_reo_debug_stats_tlv(uint32_t *tag_buf)
3033 {
3034 	htt_rx_reo_resource_stats_tlv_v *dp_stats_buf =
3035 			(htt_rx_reo_resource_stats_tlv_v *)tag_buf;
3036 
3037 	DP_TRACE_STATS(FATAL, "HTT_RX_REO_RESOURCE_STATS_TLV");
3038 
3039 	DP_TRACE_STATS(FATAL, "sample_id: %u ",
3040 		      dp_stats_buf->sample_id);
3041 	DP_TRACE_STATS(FATAL, "total_max: %u ",
3042 		      dp_stats_buf->total_max);
3043 	DP_TRACE_STATS(FATAL, "total_avg: %u ",
3044 		      dp_stats_buf->total_avg);
3045 	DP_TRACE_STATS(FATAL, "total_sample: %u ",
3046 		      dp_stats_buf->total_sample);
3047 	DP_TRACE_STATS(FATAL, "non_zeros_avg: %u ",
3048 		      dp_stats_buf->non_zeros_avg);
3049 	DP_TRACE_STATS(FATAL, "non_zeros_sample: %u ",
3050 		      dp_stats_buf->non_zeros_sample);
3051 	DP_TRACE_STATS(FATAL, "last_non_zeros_max: %u ",
3052 		      dp_stats_buf->last_non_zeros_max);
3053 	DP_TRACE_STATS(FATAL, "last_non_zeros_min: %u ",
3054 		      dp_stats_buf->last_non_zeros_min);
3055 	DP_TRACE_STATS(FATAL, "last_non_zeros_avg: %u ",
3056 		      dp_stats_buf->last_non_zeros_avg);
3057 	DP_TRACE_STATS(FATAL, "last_non_zeros_sample: %u\n ",
3058 		      dp_stats_buf->last_non_zeros_sample);
3059 }
3060 
3061 /*
3062  * dp_print_rx_pdev_fw_stats_phy_err_tlv() - Accounts for phy errors
3063  *
3064  * tag_buf - Buffer
3065  * Return - NULL
3066  */
3067 static inline void dp_print_rx_pdev_fw_stats_phy_err_tlv(uint32_t *tag_buf)
3068 {
3069 	htt_rx_pdev_fw_stats_phy_err_tlv *dp_stats_buf =
3070 		(htt_rx_pdev_fw_stats_phy_err_tlv *)tag_buf;
3071 
3072 	uint8_t i = 0;
3073 	uint16_t index = 0;
3074 	char phy_errs[DP_MAX_STRING_LEN];
3075 
3076 	DP_TRACE_STATS(FATAL, "HTT_RX_PDEV_FW_STATS_PHY_ERR_TLV");
3077 
3078 	DP_TRACE_STATS(FATAL, "mac_id_word: %u",
3079 		      dp_stats_buf->mac_id__word);
3080 	DP_TRACE_STATS(FATAL, "total_phy_err_cnt: %u",
3081 		      dp_stats_buf->total_phy_err_cnt);
3082 
3083 	for (i = 0; i < HTT_STATS_PHY_ERR_MAX; i++) {
3084 		index += snprintf(&phy_errs[index],
3085 				DP_MAX_STRING_LEN - index,
3086 				" %u:%u,", i, dp_stats_buf->phy_err[i]);
3087 	}
3088 
3089 	DP_TRACE_STATS(FATAL, "phy_errs: %s\n",  phy_errs);
3090 }
3091 
3092 /*
3093  * dp_htt_stats_print_tag: function to select the tag type and
3094  * print the corresponding tag structure
3095  * @tag_type: tag type that is to be printed
3096  * @tag_buf: pointer to the tag structure
3097  *
3098  * return: void
3099  */
3100 void dp_htt_stats_print_tag(uint8_t tag_type, uint32_t *tag_buf)
3101 {
3102 	switch (tag_type) {
3103 	case HTT_STATS_TX_PDEV_CMN_TAG:
3104 		dp_print_tx_pdev_stats_cmn_tlv(tag_buf);
3105 		break;
3106 	case HTT_STATS_TX_PDEV_UNDERRUN_TAG:
3107 		dp_print_tx_pdev_stats_urrn_tlv_v(tag_buf);
3108 		break;
3109 	case HTT_STATS_TX_PDEV_SIFS_TAG:
3110 		dp_print_tx_pdev_stats_sifs_tlv_v(tag_buf);
3111 		break;
3112 	case HTT_STATS_TX_PDEV_FLUSH_TAG:
3113 		dp_print_tx_pdev_stats_flush_tlv_v(tag_buf);
3114 		break;
3115 
3116 	case HTT_STATS_TX_PDEV_PHY_ERR_TAG:
3117 		dp_print_tx_pdev_stats_phy_err_tlv_v(tag_buf);
3118 		break;
3119 
3120 	case HTT_STATS_STRING_TAG:
3121 		dp_print_stats_string_tlv(tag_buf);
3122 		break;
3123 
3124 	case HTT_STATS_TX_HWQ_CMN_TAG:
3125 		dp_print_tx_hwq_stats_cmn_tlv(tag_buf);
3126 		break;
3127 
3128 	case HTT_STATS_TX_HWQ_DIFS_LATENCY_TAG:
3129 		dp_print_tx_hwq_difs_latency_stats_tlv_v(tag_buf);
3130 		break;
3131 
3132 	case HTT_STATS_TX_HWQ_CMD_RESULT_TAG:
3133 		dp_print_tx_hwq_cmd_result_stats_tlv_v(tag_buf);
3134 		break;
3135 
3136 	case HTT_STATS_TX_HWQ_CMD_STALL_TAG:
3137 		dp_print_tx_hwq_cmd_stall_stats_tlv_v(tag_buf);
3138 		break;
3139 
3140 	case HTT_STATS_TX_HWQ_FES_STATUS_TAG:
3141 		dp_print_tx_hwq_fes_result_stats_tlv_v(tag_buf);
3142 		break;
3143 
3144 	case HTT_STATS_TX_TQM_GEN_MPDU_TAG:
3145 		dp_print_tx_tqm_gen_mpdu_stats_tlv_v(tag_buf);
3146 		break;
3147 
3148 	case HTT_STATS_TX_TQM_LIST_MPDU_TAG:
3149 		dp_print_tx_tqm_list_mpdu_stats_tlv_v(tag_buf);
3150 		break;
3151 
3152 	case HTT_STATS_TX_TQM_LIST_MPDU_CNT_TAG:
3153 		dp_print_tx_tqm_list_mpdu_cnt_tlv_v(tag_buf);
3154 		break;
3155 
3156 	case HTT_STATS_TX_TQM_CMN_TAG:
3157 		dp_print_tx_tqm_cmn_stats_tlv(tag_buf);
3158 		break;
3159 
3160 	case HTT_STATS_TX_TQM_PDEV_TAG:
3161 		dp_print_tx_tqm_pdev_stats_tlv_v(tag_buf);
3162 		break;
3163 
3164 	case HTT_STATS_TX_TQM_CMDQ_STATUS_TAG:
3165 		dp_print_tx_tqm_cmdq_status_tlv(tag_buf);
3166 		break;
3167 
3168 	case HTT_STATS_TX_DE_EAPOL_PACKETS_TAG:
3169 		dp_print_tx_de_eapol_packets_stats_tlv(tag_buf);
3170 		break;
3171 
3172 	case HTT_STATS_TX_DE_CLASSIFY_FAILED_TAG:
3173 		dp_print_tx_de_classify_failed_stats_tlv(tag_buf);
3174 		break;
3175 
3176 	case HTT_STATS_TX_DE_CLASSIFY_STATS_TAG:
3177 		dp_print_tx_de_classify_stats_tlv(tag_buf);
3178 		break;
3179 
3180 	case HTT_STATS_TX_DE_CLASSIFY_STATUS_TAG:
3181 		dp_print_tx_de_classify_status_stats_tlv(tag_buf);
3182 		break;
3183 
3184 	case HTT_STATS_TX_DE_ENQUEUE_PACKETS_TAG:
3185 		dp_print_tx_de_enqueue_packets_stats_tlv(tag_buf);
3186 		break;
3187 
3188 	case HTT_STATS_TX_DE_ENQUEUE_DISCARD_TAG:
3189 		dp_print_tx_de_enqueue_discard_stats_tlv(tag_buf);
3190 		break;
3191 
3192 	case HTT_STATS_TX_DE_CMN_TAG:
3193 		dp_print_tx_de_cmn_stats_tlv(tag_buf);
3194 		break;
3195 
3196 	case HTT_STATS_RING_IF_TAG:
3197 		dp_print_ring_if_stats_tlv(tag_buf);
3198 		break;
3199 
3200 	case HTT_STATS_TX_PDEV_MU_MIMO_STATS_TAG:
3201 		dp_print_tx_pdev_mu_mimo_sch_stats_tlv(tag_buf);
3202 		break;
3203 
3204 	case HTT_STATS_SFM_CMN_TAG:
3205 		dp_print_sfm_cmn_tlv(tag_buf);
3206 		break;
3207 
3208 	case HTT_STATS_SRING_STATS_TAG:
3209 		dp_print_sring_stats_tlv(tag_buf);
3210 		break;
3211 
3212 	case HTT_STATS_RX_PDEV_FW_STATS_TAG:
3213 		dp_print_rx_pdev_fw_stats_tlv(tag_buf);
3214 		break;
3215 
3216 	case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG:
3217 		dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v(tag_buf);
3218 		break;
3219 
3220 	case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG:
3221 		dp_print_rx_pdev_fw_mpdu_drop_tlv_v(tag_buf);
3222 		break;
3223 
3224 	case HTT_STATS_RX_SOC_FW_STATS_TAG:
3225 		dp_print_rx_soc_fw_stats_tlv(tag_buf);
3226 		break;
3227 
3228 	case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG:
3229 		dp_print_rx_soc_fw_refill_ring_empty_tlv_v(tag_buf);
3230 		break;
3231 
3232 	case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG:
3233 		dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v(
3234 				tag_buf);
3235 		break;
3236 
3237 	case HTT_STATS_TX_PDEV_RATE_STATS_TAG:
3238 		dp_print_tx_pdev_rate_stats_tlv(tag_buf);
3239 		break;
3240 
3241 	case HTT_STATS_RX_PDEV_RATE_STATS_TAG:
3242 		dp_print_rx_pdev_rate_stats_tlv(tag_buf);
3243 		break;
3244 
3245 	case HTT_STATS_TX_PDEV_SCHEDULER_TXQ_STATS_TAG:
3246 		dp_print_tx_pdev_stats_sched_per_txq_tlv(tag_buf);
3247 		break;
3248 
3249 	case HTT_STATS_TX_SCHED_CMN_TAG:
3250 		dp_print_stats_tx_sched_cmn_tlv(tag_buf);
3251 		break;
3252 
3253 	case HTT_STATS_TX_PDEV_MPDU_STATS_TAG:
3254 		dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv(tag_buf);
3255 		break;
3256 
3257 	case HTT_STATS_SCHED_TXQ_CMD_POSTED_TAG:
3258 		dp_print_sched_txq_cmd_posted_tlv_v(tag_buf);
3259 		break;
3260 
3261 	case HTT_STATS_RING_IF_CMN_TAG:
3262 		dp_print_ring_if_cmn_tlv(tag_buf);
3263 		break;
3264 
3265 	case HTT_STATS_SFM_CLIENT_USER_TAG:
3266 		dp_print_sfm_client_user_tlv_v(tag_buf);
3267 		break;
3268 
3269 	case HTT_STATS_SFM_CLIENT_TAG:
3270 		dp_print_sfm_client_tlv(tag_buf);
3271 		break;
3272 
3273 	case HTT_STATS_TX_TQM_ERROR_STATS_TAG:
3274 		dp_print_tx_tqm_error_stats_tlv(tag_buf);
3275 		break;
3276 
3277 	case HTT_STATS_SCHED_TXQ_CMD_REAPED_TAG:
3278 		dp_print_sched_txq_cmd_reaped_tlv_v(tag_buf);
3279 		break;
3280 
3281 	case HTT_STATS_SRING_CMN_TAG:
3282 		dp_print_sring_cmn_tlv(tag_buf);
3283 		break;
3284 
3285 	case HTT_STATS_TX_SELFGEN_AC_ERR_STATS_TAG:
3286 		dp_print_tx_selfgen_ac_err_stats_tlv(tag_buf);
3287 		break;
3288 
3289 	case HTT_STATS_TX_SELFGEN_CMN_STATS_TAG:
3290 		dp_print_tx_selfgen_cmn_stats_tlv(tag_buf);
3291 		break;
3292 
3293 	case HTT_STATS_TX_SELFGEN_AC_STATS_TAG:
3294 		dp_print_tx_selfgen_ac_stats_tlv(tag_buf);
3295 		break;
3296 
3297 	case HTT_STATS_TX_SELFGEN_AX_STATS_TAG:
3298 		dp_print_tx_selfgen_ax_stats_tlv(tag_buf);
3299 		break;
3300 
3301 	case HTT_STATS_TX_SELFGEN_AX_ERR_STATS_TAG:
3302 		dp_print_tx_selfgen_ax_err_stats_tlv(tag_buf);
3303 		break;
3304 
3305 	case HTT_STATS_TX_HWQ_MUMIMO_SCH_STATS_TAG:
3306 		dp_print_tx_hwq_mu_mimo_sch_stats_tlv(tag_buf);
3307 		break;
3308 
3309 	case HTT_STATS_TX_HWQ_MUMIMO_MPDU_STATS_TAG:
3310 		dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv(tag_buf);
3311 		break;
3312 
3313 	case HTT_STATS_TX_HWQ_MUMIMO_CMN_STATS_TAG:
3314 		dp_print_tx_hwq_mu_mimo_cmn_stats_tlv(tag_buf);
3315 		break;
3316 
3317 	case HTT_STATS_HW_INTR_MISC_TAG:
3318 		dp_print_hw_stats_intr_misc_tlv(tag_buf);
3319 		break;
3320 
3321 	case HTT_STATS_HW_WD_TIMEOUT_TAG:
3322 		dp_print_hw_stats_wd_timeout_tlv(tag_buf);
3323 		break;
3324 
3325 	case HTT_STATS_HW_PDEV_ERRS_TAG:
3326 		dp_print_hw_stats_pdev_errs_tlv(tag_buf);
3327 		break;
3328 
3329 	case HTT_STATS_COUNTER_NAME_TAG:
3330 		dp_print_counter_tlv(tag_buf);
3331 		break;
3332 
3333 	case HTT_STATS_TX_TID_DETAILS_TAG:
3334 		dp_print_tx_tid_stats_tlv(tag_buf);
3335 		break;
3336 
3337 #ifdef CONFIG_WIN
3338 	case HTT_STATS_TX_TID_DETAILS_V1_TAG:
3339 		dp_print_tx_tid_stats_v1_tlv(tag_buf);
3340 		break;
3341 #endif
3342 
3343 	case HTT_STATS_RX_TID_DETAILS_TAG:
3344 		dp_print_rx_tid_stats_tlv(tag_buf);
3345 		break;
3346 
3347 	case HTT_STATS_PEER_STATS_CMN_TAG:
3348 		dp_print_peer_stats_cmn_tlv(tag_buf);
3349 		break;
3350 
3351 	case HTT_STATS_PEER_DETAILS_TAG:
3352 		dp_print_peer_details_tlv(tag_buf);
3353 		break;
3354 
3355 	case HTT_STATS_PEER_MSDU_FLOWQ_TAG:
3356 		dp_print_msdu_flow_stats_tlv(tag_buf);
3357 		break;
3358 
3359 	case HTT_STATS_PEER_TX_RATE_STATS_TAG:
3360 		dp_print_tx_peer_rate_stats_tlv(tag_buf);
3361 		break;
3362 
3363 	case HTT_STATS_PEER_RX_RATE_STATS_TAG:
3364 		dp_print_rx_peer_rate_stats_tlv(tag_buf);
3365 		break;
3366 
3367 	case HTT_STATS_TX_DE_COMPL_STATS_TAG:
3368 		dp_print_tx_de_compl_stats_tlv(tag_buf);
3369 		break;
3370 
3371 	case HTT_STATS_RX_REFILL_RXDMA_ERR_TAG:
3372 		dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv(tag_buf);
3373 		break;
3374 
3375 	case HTT_STATS_RX_REFILL_REO_ERR_TAG:
3376 		dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv(tag_buf);
3377 		break;
3378 
3379 	case HTT_STATS_RX_REO_RESOURCE_STATS_TAG:
3380 		dp_print_rx_reo_debug_stats_tlv(tag_buf);
3381 		break;
3382 
3383 	case HTT_STATS_RX_PDEV_FW_STATS_PHY_ERR_TAG:
3384 		dp_print_rx_pdev_fw_stats_phy_err_tlv(tag_buf);
3385 		break;
3386 
3387 	default:
3388 		break;
3389 	}
3390 }
3391 
3392 /*
3393  * dp_htt_stats_copy_tag: function to select the tag type and
3394  * copy the corresponding tag structure
3395  * @pdev: DP_PDEV handle
3396  * @tag_type: tag type that is to be printed
3397  * @tag_buf: pointer to the tag structure
3398  *
3399  * return: void
3400  */
3401 void dp_htt_stats_copy_tag(struct dp_pdev *pdev, uint8_t tag_type, uint32_t *tag_buf)
3402 {
3403 	void *dest_ptr = NULL;
3404 	uint32_t size = 0;
3405 
3406 	switch (tag_type) {
3407 	case HTT_STATS_TX_PDEV_CMN_TAG:
3408 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.cmn_tlv;
3409 		size = sizeof(htt_tx_pdev_stats_cmn_tlv);
3410 		break;
3411 	case HTT_STATS_TX_PDEV_UNDERRUN_TAG:
3412 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.underrun_tlv;
3413 		size = sizeof(htt_tx_pdev_stats_urrn_tlv_v);
3414 		break;
3415 	case HTT_STATS_TX_PDEV_SIFS_TAG:
3416 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.sifs_tlv;
3417 		size = sizeof(htt_tx_pdev_stats_sifs_tlv_v);
3418 		break;
3419 	case HTT_STATS_TX_PDEV_FLUSH_TAG:
3420 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.flush_tlv;
3421 		size = sizeof(htt_tx_pdev_stats_flush_tlv_v);
3422 		break;
3423 	case HTT_STATS_TX_PDEV_PHY_ERR_TAG:
3424 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.phy_err_tlv;
3425 		size = sizeof(htt_tx_pdev_stats_phy_err_tlv_v);
3426 		break;
3427 	case HTT_STATS_RX_PDEV_FW_STATS_TAG:
3428 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_stats_tlv;
3429 		size = sizeof(htt_rx_pdev_fw_stats_tlv);
3430 		break;
3431 	case HTT_STATS_RX_SOC_FW_STATS_TAG:
3432 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_tlv;
3433 		size = sizeof(htt_rx_soc_fw_stats_tlv);
3434 		break;
3435 	case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG:
3436 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_refill_ring_empty_tlv;
3437 		size = sizeof(htt_rx_soc_fw_refill_ring_empty_tlv_v);
3438 		break;
3439 	case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG:
3440 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_refill_ring_num_refill_tlv;
3441 		size = sizeof(htt_rx_soc_fw_refill_ring_num_refill_tlv_v);
3442 		break;
3443 	case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG:
3444 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_ring_mpdu_err_tlv;
3445 		size = sizeof(htt_rx_pdev_fw_ring_mpdu_err_tlv_v);
3446 		break;
3447 	case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG:
3448 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_ring_mpdu_drop;
3449 		size = sizeof(htt_rx_pdev_fw_mpdu_drop_tlv_v);
3450 		break;
3451 	default:
3452 		break;
3453 	}
3454 
3455 	if (dest_ptr)
3456 		qdf_mem_copy(dest_ptr, tag_buf, size);
3457 }
3458 
3459 #if defined(CONFIG_WIN) && WDI_EVENT_ENABLE
3460 QDF_STATUS dp_peer_stats_notify(struct dp_peer *peer)
3461 {
3462 	struct dp_pdev *dp_pdev;
3463 	struct cdp_interface_peer_stats peer_stats_intf;
3464 	struct cdp_peer_stats *peer_stats = &peer->stats;
3465 
3466 	if (!peer->vdev)
3467 		return QDF_STATUS_E_FAULT;
3468 
3469 	dp_pdev = peer->vdev->pdev;
3470 	qdf_mem_zero(&peer_stats_intf, sizeof(peer_stats_intf));
3471 	if (peer_stats->rx.last_rssi != peer_stats->rx.rssi)
3472 		peer_stats_intf.rssi_changed = true;
3473 
3474 	if ((peer_stats->rx.rssi && peer_stats_intf.rssi_changed) ||
3475 	    (peer_stats->tx.tx_rate &&
3476 	     peer_stats->tx.tx_rate != peer_stats->tx.last_tx_rate)) {
3477 		peer_stats_intf.peer_hdl = peer->ctrl_peer;
3478 		peer_stats_intf.last_peer_tx_rate = peer_stats->tx.last_tx_rate;
3479 		peer_stats_intf.peer_tx_rate = peer_stats->tx.tx_rate;
3480 		peer_stats_intf.peer_rssi = peer_stats->rx.rssi;
3481 		peer_stats_intf.tx_packet_count = peer_stats->tx.ucast.num;
3482 		peer_stats_intf.rx_packet_count = peer_stats->rx.to_stack.num;
3483 		peer_stats_intf.tx_byte_count = peer_stats->tx.tx_success.bytes;
3484 		peer_stats_intf.rx_byte_count = peer_stats->rx.to_stack.bytes;
3485 		peer_stats_intf.per = peer_stats->tx.last_per;
3486 		peer_stats_intf.ack_rssi = peer_stats->tx.last_ack_rssi;
3487 		dp_wdi_event_handler(WDI_EVENT_PEER_STATS, dp_pdev->soc,
3488 				     (void *)&peer_stats_intf, 0,
3489 				     WDI_NO_VAL, dp_pdev->pdev_id);
3490 	}
3491 
3492 	return QDF_STATUS_SUCCESS;
3493 }
3494 #endif
3495