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