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