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