xref: /wlan-dirver/qca-wifi-host-cmn/dp/wifi3.0/dp_stats.c (revision 8b3dca18206e1a0461492f082fa6e270b092c035)
1 /*
2  * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 #include "qdf_types.h"
20 #include "dp_peer.h"
21 #include "dp_types.h"
22 #include "dp_internal.h"
23 #include "htt_stats.h"
24 #include "htt_ppdu_stats.h"
25 #ifdef QCA_PEER_EXT_STATS
26 #include <cdp_txrx_hist_struct.h>
27 #include "dp_hist.h"
28 #endif
29 #ifdef WIFI_MONITOR_SUPPORT
30 #include "dp_htt.h"
31 #include <dp_mon.h>
32 #endif
33 
34 #define DP_MAX_STRING_LEN 500
35 #define DP_HTT_TX_RX_EXPECTED_TLVS (((uint64_t)1 << HTT_STATS_TX_PDEV_CMN_TAG) |\
36 	((uint64_t)1 << HTT_STATS_TX_PDEV_UNDERRUN_TAG) |\
37 	((uint64_t)1 << HTT_STATS_TX_PDEV_SIFS_TAG) |\
38 	((uint64_t)1 << HTT_STATS_TX_PDEV_FLUSH_TAG) |\
39 	((uint64_t)1 << HTT_STATS_RX_PDEV_FW_STATS_TAG) |\
40 	((uint64_t)1 << HTT_STATS_RX_SOC_FW_STATS_TAG) |\
41 	((uint64_t)1 << HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG) |\
42 	((uint64_t)1 << HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG) |\
43 	((uint64_t)1 << HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG) |\
44 	((uint64_t)1 << HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG))
45 
46 #define DP_HTT_HW_INTR_NAME_LEN  HTT_STATS_MAX_HW_INTR_NAME_LEN
47 #define DP_HTT_HW_MODULE_NAME_LEN  HTT_STATS_MAX_HW_MODULE_NAME_LEN
48 #define DP_HTT_COUNTER_NAME_LEN  HTT_MAX_COUNTER_NAME
49 #define DP_HTT_LOW_WM_HIT_COUNT_LEN  HTT_STATS_LOW_WM_BINS
50 #define DP_HTT_HIGH_WM_HIT_COUNT_LEN  HTT_STATS_HIGH_WM_BINS
51 #define DP_HTT_TX_MCS_LEN  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS
52 #define DP_HTT_TX_MCS_EXT_LEN  HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS
53 #define DP_HTT_TX_MCS_EXT2_LEN  HTT_TX_PDEV_STATS_NUM_EXTRA2_MCS_COUNTERS
54 #define DP_HTT_TX_SU_MCS_LEN  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS
55 #define DP_HTT_TX_SU_MCS_EXT_LEN  HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS
56 #define DP_HTT_TX_MU_MCS_LEN  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS
57 #define DP_HTT_TX_MU_MCS_EXT_LEN  HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS
58 #define DP_HTT_TX_NSS_LEN  HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS
59 #define DP_HTT_TX_BW_LEN  HTT_TX_PDEV_STATS_NUM_BW_COUNTERS
60 #define DP_HTT_TX_PREAM_LEN  HTT_TX_PDEV_STATS_NUM_PREAMBLE_TYPES
61 #define DP_HTT_TX_PDEV_GI_LEN  HTT_TX_PDEV_STATS_NUM_GI_COUNTERS
62 #define DP_HTT_TX_DCM_LEN  HTT_TX_PDEV_STATS_NUM_DCM_COUNTERS
63 #define DP_HTT_RX_MCS_LEN  HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS
64 #define DP_HTT_RX_MCS_EXT_LEN  HTT_RX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS
65 #define DP_HTT_RX_PDEV_MCS_LEN_EXT HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT
66 #define DP_HTT_RX_PDEV_MCS_LEN_EXT2 HTT_RX_PDEV_STATS_NUM_EXTRA2_MCS_COUNTERS
67 #define DP_HTT_RX_NSS_LEN  HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS
68 #define DP_HTT_RX_DCM_LEN  HTT_RX_PDEV_STATS_NUM_DCM_COUNTERS
69 #define DP_HTT_RX_BW_LEN  HTT_RX_PDEV_STATS_NUM_BW_COUNTERS
70 #define DP_HTT_RX_PREAM_LEN  HTT_RX_PDEV_STATS_NUM_PREAMBLE_TYPES
71 #define DP_HTT_RSSI_CHAIN_LEN  HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS
72 #define DP_HTT_RX_GI_LEN  HTT_RX_PDEV_STATS_NUM_GI_COUNTERS
73 #define DP_HTT_FW_RING_MGMT_SUBTYPE_LEN  HTT_STATS_SUBTYPE_MAX
74 #define DP_HTT_FW_RING_CTRL_SUBTYPE_LEN  HTT_STATS_SUBTYPE_MAX
75 #define DP_HTT_FW_RING_MPDU_ERR_LEN  HTT_RX_STATS_RXDMA_MAX_ERR
76 #define DP_HTT_TID_NAME_LEN  MAX_HTT_TID_NAME
77 #define DP_HTT_PEER_NUM_SS HTT_RX_PEER_STATS_NUM_SPATIAL_STREAMS
78 #define DP_HTT_PDEV_TX_GI_LEN HTT_TX_PDEV_STATS_NUM_GI_COUNTERS
79 
80 #define DP_MAX_INT_CONTEXTS_STRING_LENGTH (6 * WLAN_CFG_INT_NUM_CONTEXTS)
81 #define DP_NSS_LENGTH (6 * SS_COUNT)
82 #define DP_MU_GROUP_LENGTH (6 * DP_MU_GROUP_SHOW)
83 #define DP_MU_GROUP_SHOW 16
84 #define DP_RXDMA_ERR_LENGTH (6 * HAL_RXDMA_ERR_MAX)
85 #define DP_REO_ERR_LENGTH (6 * HAL_REO_ERR_MAX)
86 #define STATS_PROC_TIMEOUT        (HZ / 1000)
87 
88 #define dp_stats_alert(params...) QDF_TRACE_FATAL(QDF_MODULE_ID_DP_STATS, params)
89 #define dp_stats_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_DP_STATS, params)
90 #define dp_stats_warn(params...) QDF_TRACE_WARN(QDF_MODULE_ID_DP_STATS, params)
91 #define dp_stats_info(params...) \
92 	__QDF_TRACE_FL(QDF_TRACE_LEVEL_INFO_HIGH, QDF_MODULE_ID_DP_STATS, ## params)
93 #define dp_stats_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_DP_STATS, params)
94 
95 #ifdef WLAN_FEATURE_11BE
96 static const struct cdp_rate_debug dp_ppdu_rate_string[DOT11_MAX][MAX_MCS] = {
97 	{
98 		{"HE MCS 0 (BPSK 1/2)     ", MCS_VALID},
99 		{"HE MCS 1 (QPSK 1/2)     ", MCS_VALID},
100 		{"HE MCS 2 (QPSK 3/4)     ", MCS_VALID},
101 		{"HE MCS 3 (16-QAM 1/2)   ", MCS_VALID},
102 		{"HE MCS 4 (16-QAM 3/4)   ", MCS_VALID},
103 		{"HE MCS 5 (64-QAM 2/3)   ", MCS_VALID},
104 		{"HE MCS 6 (64-QAM 3/4)   ", MCS_VALID},
105 		{"HE MCS 7 (64-QAM 5/6)   ", MCS_VALID},
106 		{"HE MCS 8 (256-QAM 3/4)  ", MCS_VALID},
107 		{"HE MCS 9 (256-QAM 5/6)  ", MCS_VALID},
108 		{"HE MCS 10 (1024-QAM 3/4)", MCS_VALID},
109 		{"HE MCS 11 (1024-QAM 5/6)", MCS_VALID},
110 		{"HE MCS 12 (4096-QAM 3/4)", MCS_VALID},
111 		{"HE MCS 13 (4096-QAM 5/6)", MCS_VALID},
112 		{"INVALID ", MCS_INVALID},
113 		{"INVALID ", MCS_INVALID},
114 		{"INVALID ", MCS_INVALID},
115 	},
116 	{
117 		{"EHT MCS 0 (BPSK 1/2)     ", MCS_VALID},
118 		{"EHT MCS 1 (QPSK 1/2)     ", MCS_VALID},
119 		{"EHT MCS 2 (QPSK 3/4)     ", MCS_VALID},
120 		{"EHT MCS 3 (16-QAM 1/2)   ", MCS_VALID},
121 		{"EHT MCS 4 (16-QAM 3/4)   ", MCS_VALID},
122 		{"EHT MCS 5 (64-QAM 2/3)   ", MCS_VALID},
123 		{"EHT MCS 6 (64-QAM 3/4)   ", MCS_VALID},
124 		{"EHT MCS 7 (64-QAM 5/6)   ", MCS_VALID},
125 		{"EHT MCS 8 (256-QAM 3/4)  ", MCS_VALID},
126 		{"EHT MCS 9 (256-QAM 5/6)  ", MCS_VALID},
127 		{"EHT MCS 10 (1024-QAM 3/4)", MCS_VALID},
128 		{"EHT MCS 11 (1024-QAM 5/6)", MCS_VALID},
129 		{"EHT MCS 12 (4096-QAM 3/4)", MCS_VALID},
130 		{"EHT MCS 13 (4096-QAM 5/6)", MCS_VALID},
131 		{"EHT MCS 14 (BPSK-DCM 1/2)", MCS_VALID},
132 		{"EHT MCS 15 (BPSK-DCM 1/2)", MCS_VALID},
133 		{"INVALID ", MCS_INVALID},
134 	}
135 };
136 #else
137 static const struct cdp_rate_debug dp_ppdu_rate_string[DOT11_MAX][MAX_MCS] = {
138 	{
139 		{"HE MCS 0 (BPSK 1/2)     ", MCS_VALID},
140 		{"HE MCS 1 (QPSK 1/2)     ", MCS_VALID},
141 		{"HE MCS 2 (QPSK 3/4)     ", MCS_VALID},
142 		{"HE MCS 3 (16-QAM 1/2)   ", MCS_VALID},
143 		{"HE MCS 4 (16-QAM 3/4)   ", MCS_VALID},
144 		{"HE MCS 5 (64-QAM 2/3)   ", MCS_VALID},
145 		{"HE MCS 6 (64-QAM 3/4)   ", MCS_VALID},
146 		{"HE MCS 7 (64-QAM 5/6)   ", MCS_VALID},
147 		{"HE MCS 8 (256-QAM 3/4)  ", MCS_VALID},
148 		{"HE MCS 9 (256-QAM 5/6)  ", MCS_VALID},
149 		{"HE MCS 10 (1024-QAM 3/4)", MCS_VALID},
150 		{"HE MCS 11 (1024-QAM 5/6)", MCS_VALID},
151 		{"HE MCS 12 (4096-QAM 3/4)", MCS_VALID},
152 		{"HE MCS 13 (4096-QAM 5/6)", MCS_VALID},
153 		{"INVALID ", MCS_INVALID},
154 	}
155 };
156 #endif
157 
158 #ifdef WLAN_FEATURE_11BE
159 static const struct cdp_rate_debug
160 dp_mu_rate_string[TXRX_TYPE_MU_MAX][MAX_MCS] = {
161 	{
162 		{"HE MU-MIMO MCS 0 (BPSK 1/2)     ", MCS_VALID},
163 		{"HE MU-MIMO MCS 1 (QPSK 1/2)     ", MCS_VALID},
164 		{"HE MU-MIMO MCS 2 (QPSK 3/4)     ", MCS_VALID},
165 		{"HE MU-MIMO MCS 3 (16-QAM 1/2)   ", MCS_VALID},
166 		{"HE MU-MIMO MCS 4 (16-QAM 3/4)   ", MCS_VALID},
167 		{"HE MU-MIMO MCS 5 (64-QAM 2/3)   ", MCS_VALID},
168 		{"HE MU-MIMO MCS 6 (64-QAM 3/4)   ", MCS_VALID},
169 		{"HE MU-MIMO MCS 7 (64-QAM 5/6)   ", MCS_VALID},
170 		{"HE MU-MIMO MCS 8 (256-QAM 3/4)  ", MCS_VALID},
171 		{"HE MU-MIMO MCS 9 (256-QAM 5/6)  ", MCS_VALID},
172 		{"HE MU-MIMO MCS 10 (1024-QAM 3/4)", MCS_VALID},
173 		{"HE MU-MIMO MCS 11 (1024-QAM 5/6)", MCS_VALID},
174 		{"HE MU-MIMO MCS 12 (4096-QAM 3/4)", MCS_VALID},
175 		{"HE MU-MIMO MCS 13 (4096-QAM 5/6)", MCS_VALID},
176 		{"INVALID ", MCS_INVALID},
177 		{"INVALID ", MCS_INVALID},
178 		{"INVALID ", MCS_INVALID},
179 	},
180 	{
181 		{"HE OFDMA MCS 0 (BPSK 1/2)     ", MCS_VALID},
182 		{"HE OFDMA MCS 1 (QPSK 1/2)     ", MCS_VALID},
183 		{"HE OFDMA MCS 2 (QPSK 3/4)     ", MCS_VALID},
184 		{"HE OFDMA MCS 3 (16-QAM 1/2)   ", MCS_VALID},
185 		{"HE OFDMA MCS 4 (16-QAM 3/4)   ", MCS_VALID},
186 		{"HE OFDMA MCS 5 (64-QAM 2/3)   ", MCS_VALID},
187 		{"HE OFDMA MCS 6 (64-QAM 3/4)   ", MCS_VALID},
188 		{"HE OFDMA MCS 7 (64-QAM 5/6)   ", MCS_VALID},
189 		{"HE OFDMA MCS 8 (256-QAM 3/4)  ", MCS_VALID},
190 		{"HE OFDMA MCS 9 (256-QAM 5/6)  ", MCS_VALID},
191 		{"HE OFDMA MCS 10 (1024-QAM 3/4)", MCS_VALID},
192 		{"HE OFDMA MCS 11 (1024-QAM 5/6)", MCS_VALID},
193 		{"HE OFDMA MCS 12 (4096-QAM 3/4)", MCS_VALID},
194 		{"HE OFDMA MCS 13 (4096-QAM 5/6)", MCS_VALID},
195 		{"INVALID ", MCS_INVALID},
196 		{"INVALID ", MCS_INVALID},
197 		{"INVALID ", MCS_INVALID},
198 	}
199 };
200 
201 static const struct cdp_rate_debug
202 dp_mu_be_rate_string[TXRX_TYPE_MU_MAX][MAX_MCS] = {
203 	{
204 		{"EHT MU-MIMO MCS 0 (BPSK 1/2)     ", MCS_VALID},
205 		{"EHT MU-MIMO MCS 1 (QPSK 1/2)     ", MCS_VALID},
206 		{"EHT MU-MIMO MCS 2 (QPSK 3/4)     ", MCS_VALID},
207 		{"EHT MU-MIMO MCS 3 (16-QAM 1/2)   ", MCS_VALID},
208 		{"EHT MU-MIMO MCS 4 (16-QAM 3/4)   ", MCS_VALID},
209 		{"EHT MU-MIMO MCS 5 (64-QAM 2/3)   ", MCS_VALID},
210 		{"EHT MU-MIMO MCS 6 (64-QAM 3/4)   ", MCS_VALID},
211 		{"EHT MU-MIMO MCS 7 (64-QAM 5/6)   ", MCS_VALID},
212 		{"EHT MU-MIMO MCS 8 (256-QAM 3/4)  ", MCS_VALID},
213 		{"EHT MU-MIMO MCS 9 (256-QAM 5/6)  ", MCS_VALID},
214 		{"EHT MU-MIMO MCS 10 (1024-QAM 3/4)", MCS_VALID},
215 		{"EHT MU-MIMO MCS 11 (1024-QAM 5/6)", MCS_VALID},
216 		{"EHT MU-MIMO MCS 12 (4096-QAM 3/4)", MCS_VALID},
217 		{"EHT MU-MIMO MCS 13 (4096-QAM 5/6)", MCS_VALID},
218 		{"EHT MU-MIMO MCS 14 (BPSK-DCM 1/2)", MCS_VALID},
219 		{"EHT MU-MIMO MCS 15 (BPSK-DCM 1/2)", MCS_VALID},
220 		{"INVALID ", MCS_INVALID},
221 	},
222 	{
223 		{"EHT OFDMA MCS 0 (BPSK 1/2)     ", MCS_VALID},
224 		{"EHT OFDMA MCS 1 (QPSK 1/2)     ", MCS_VALID},
225 		{"EHT OFDMA MCS 2 (QPSK 3/4)     ", MCS_VALID},
226 		{"EHT OFDMA MCS 3 (16-QAM 1/2)   ", MCS_VALID},
227 		{"EHT OFDMA MCS 4 (16-QAM 3/4)   ", MCS_VALID},
228 		{"EHT OFDMA MCS 5 (64-QAM 2/3)   ", MCS_VALID},
229 		{"EHT OFDMA MCS 6 (64-QAM 3/4)   ", MCS_VALID},
230 		{"EHT OFDMA MCS 7 (64-QAM 5/6)   ", MCS_VALID},
231 		{"EHT OFDMA MCS 8 (256-QAM 3/4)  ", MCS_VALID},
232 		{"EHT OFDMA MCS 9 (256-QAM 5/6)  ", MCS_VALID},
233 		{"EHT OFDMA MCS 10 (1024-QAM 3/4)", MCS_VALID},
234 		{"EHT OFDMA MCS 11 (1024-QAM 5/6)", MCS_VALID},
235 		{"EHT OFDMA MCS 12 (4096-QAM 3/4)", MCS_VALID},
236 		{"EHT OFDMA MCS 13 (4096-QAM 5/6)", MCS_VALID},
237 		{"EHT OFDMA MCS 14 (BPSK-DCM 1/2)", MCS_VALID},
238 		{"EHT OFDMA MCS 15 (BPSK-DCM 1/2)", MCS_VALID},
239 		{"INVALID ", MCS_INVALID},
240 	}
241 };
242 #else
243 static const struct cdp_rate_debug
244 dp_mu_rate_string[TXRX_TYPE_MU_MAX][MAX_MCS] = {
245 	{
246 		{"HE MU-MIMO MCS 0 (BPSK 1/2)     ", MCS_VALID},
247 		{"HE MU-MIMO MCS 1 (QPSK 1/2)     ", MCS_VALID},
248 		{"HE MU-MIMO MCS 2 (QPSK 3/4)     ", MCS_VALID},
249 		{"HE MU-MIMO MCS 3 (16-QAM 1/2)   ", MCS_VALID},
250 		{"HE MU-MIMO MCS 4 (16-QAM 3/4)   ", MCS_VALID},
251 		{"HE MU-MIMO MCS 5 (64-QAM 2/3)   ", MCS_VALID},
252 		{"HE MU-MIMO MCS 6 (64-QAM 3/4)   ", MCS_VALID},
253 		{"HE MU-MIMO MCS 7 (64-QAM 5/6)   ", MCS_VALID},
254 		{"HE MU-MIMO MCS 8 (256-QAM 3/4)  ", MCS_VALID},
255 		{"HE MU-MIMO MCS 9 (256-QAM 5/6)  ", MCS_VALID},
256 		{"HE MU-MIMO MCS 10 (1024-QAM 3/4)", MCS_VALID},
257 		{"HE MU-MIMO MCS 11 (1024-QAM 5/6)", MCS_VALID},
258 		{"HE MU-MIMO MCS 12 (4096-QAM 3/4)", MCS_VALID},
259 		{"HE MU-MIMO MCS 13 (4096-QAM 5/6)", MCS_VALID},
260 		{"INVALID ", MCS_INVALID},
261 	},
262 	{
263 		{"HE OFDMA MCS 0 (BPSK 1/2)     ", MCS_VALID},
264 		{"HE OFDMA MCS 1 (QPSK 1/2)     ", MCS_VALID},
265 		{"HE OFDMA MCS 2 (QPSK 3/4)     ", MCS_VALID},
266 		{"HE OFDMA MCS 3 (16-QAM 1/2)   ", MCS_VALID},
267 		{"HE OFDMA MCS 4 (16-QAM 3/4)   ", MCS_VALID},
268 		{"HE OFDMA MCS 5 (64-QAM 2/3)   ", MCS_VALID},
269 		{"HE OFDMA MCS 6 (64-QAM 3/4)   ", MCS_VALID},
270 		{"HE OFDMA MCS 7 (64-QAM 5/6)   ", MCS_VALID},
271 		{"HE OFDMA MCS 8 (256-QAM 3/4)  ", MCS_VALID},
272 		{"HE OFDMA MCS 9 (256-QAM 5/6)  ", MCS_VALID},
273 		{"HE OFDMA MCS 10 (1024-QAM 3/4)", MCS_VALID},
274 		{"HE OFDMA MCS 11 (1024-QAM 5/6)", MCS_VALID},
275 		{"HE OFDMA MCS 12 (4096-QAM 3/4)", MCS_VALID},
276 		{"HE OFDMA MCS 13 (4096-QAM 5/6)", MCS_VALID},
277 		{"INVALID ", MCS_INVALID},
278 	}
279 };
280 #endif
281 
282 const char *mu_reception_mode[TXRX_TYPE_MU_MAX] = {
283 	"MU MIMO", "MU OFDMA"
284 };
285 
286 #ifdef QCA_ENH_V3_STATS_SUPPORT
287 #ifndef WLAN_CONFIG_TX_DELAY
288 const char *fw_to_hw_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = {
289 	"0 to 9 ms", "10 to 19 ms",
290 	"20 to 29 ms", "30 to 39 ms",
291 	"40 to 49 ms", "50 to 59 ms",
292 	"60 to 69 ms", "70 to 79 ms",
293 	"80 to 89 ms", "90 to 99 ms",
294 	"101 to 249 ms", "250 to 499 ms", "500+ ms"
295 };
296 #else
297 const char *fw_to_hw_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = {
298 	"0 to 250 us", "250 to 500 us",
299 	"500 to 750 us", "750 to 1000 us",
300 	"1000 to 1500 us", "1500 to 2000 us",
301 	"2000 to 2500 us", "2500 to 5000 us",
302 	"5000 to 6000 us", "6000 to 7000 ms",
303 	"7000 to 8000 us", "8000 to 9000 us", "9000+ us"
304 };
305 #endif
306 #elif defined(HW_TX_DELAY_STATS_ENABLE)
307 const char *fw_to_hw_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = {
308 	"0 to 2 ms", "2 to 4 ms",
309 	"4 to 6 ms", "6 to 8 ms",
310 	"8 to 10 ms", "10 to 20 ms",
311 	"20 to 30 ms", "30 to 40 ms",
312 	"40 to 50 ms", "50 to 100 ms",
313 	"100 to 250 ms", "250 to 500 ms", "500+ ms"
314 };
315 #endif
316 
317 #ifdef QCA_ENH_V3_STATS_SUPPORT
318 #ifndef WLAN_CONFIG_TX_DELAY
319 const char *sw_enq_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = {
320 	"0 to 1 ms", "1 to 2 ms",
321 	"2 to 3 ms", "3 to 4 ms",
322 	"4 to 5 ms", "5 to 6 ms",
323 	"6 to 7 ms", "7 to 8 ms",
324 	"8 to 9 ms", "9 to 10 ms",
325 	"10 to 11 ms", "11 to 12 ms", "12+ ms"
326 };
327 #else
328 const char *sw_enq_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = {
329 	"0 to 250 us", "250 to 500 us",
330 	"500 to 750 us", "750 to 1000 us",
331 	"1000 to 1500 us", "1500 to 2000 us",
332 	"2000 to 2500 us", "2500 to 5000 us",
333 	"5000 to 6000 us", "6000 to 7000 ms",
334 	"7000 to 8000 us", "8000 to 9000 us", "9000+ us"
335 };
336 #endif
337 
338 const char *intfrm_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = {
339 	"0 to 4 ms", "5 to 9 ms",
340 	"10 to 14 ms", "15 to 19 ms",
341 	"20 to 24 ms", "25 to 29 ms",
342 	"30 to 34 ms", "35 to 39 ms",
343 	"40 to 44 ms", "45 to 49 ms",
344 	"50 to 54 ms", "55 to 59 ms", "60+ ms"
345 };
346 #endif
347 
348 #define TID_COUNTER_STATS 1	/* Success/drop stats type */
349 #define TID_DELAY_STATS 2	/* Delay stats type */
350 #define TID_RX_ERROR_STATS 3	/* Rx Error stats type */
351 
352 #ifdef WLAN_SYSFS_DP_STATS
353 void DP_PRINT_STATS(const char *fmt, ...)
354 {
355 	void *soc_void = NULL;
356 	va_list val;
357 	uint16_t buf_written = 0;
358 	uint16_t curr_len = 0;
359 	uint16_t max_len = 0;
360 	struct dp_soc *soc = NULL;
361 
362 	soc_void = cds_get_context(QDF_MODULE_ID_SOC);
363 	if (!soc_void)
364 		return;
365 
366 	soc = cdp_soc_t_to_dp_soc(soc_void);
367 
368 	va_start(val, fmt);
369 	QDF_VTRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH, (char *)fmt, val);
370 	/* writing to the buffer */
371 	if (soc->sysfs_config && soc->sysfs_config->printing_mode == PRINTING_MODE_ENABLED) {
372 		if (soc->sysfs_config->process_id == qdf_get_current_pid()) {
373 			curr_len = soc->sysfs_config->curr_buffer_length;
374 			max_len = soc->sysfs_config->max_buffer_length;
375 			if ((max_len - curr_len) <= 1)
376 				return;
377 
378 			qdf_spinlock_acquire(&soc->sysfs_config->sysfs_write_user_buffer);
379 			if (soc->sysfs_config->buf) {
380 				buf_written = vscnprintf(soc->sysfs_config->buf + curr_len,
381 							 max_len - curr_len, fmt, val);
382 				curr_len += buf_written;
383 				if ((max_len - curr_len) <= 1)
384 					return;
385 
386 				buf_written += scnprintf(soc->sysfs_config->buf + curr_len,
387 							 max_len - curr_len, "\n");
388 				soc->sysfs_config->curr_buffer_length +=  buf_written;
389 			}
390 			qdf_spinlock_release(&soc->sysfs_config->sysfs_write_user_buffer);
391 		}
392 	}
393 	va_end(val);
394 }
395 #endif /* WLAN_SYSFS_DP_STATS */
396 /*
397  * dp_print_stats_string_tlv: display htt_stats_string_tlv
398  * @tag_buf: buffer containing the tlv htt_stats_string_tlv
399  *
400  * return:void
401  */
402 static void dp_print_stats_string_tlv(uint32_t *tag_buf)
403 {
404 	htt_stats_string_tlv *dp_stats_buf =
405 		(htt_stats_string_tlv *)tag_buf;
406 	uint8_t i;
407 	uint16_t index = 0;
408 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
409 	char *data = qdf_mem_malloc(DP_MAX_STRING_LEN);
410 
411 	if (!data) {
412 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
413 			  FL("Output buffer not allocated"));
414 		return;
415 	}
416 
417 	DP_PRINT_STATS("HTT_STATS_STRING_TLV:");
418 	for (i = 0; i <  tag_len; i++) {
419 		index += qdf_snprint(&data[index],
420 				DP_MAX_STRING_LEN - index,
421 				" %u:%u,", i, dp_stats_buf->data[i]);
422 	}
423 	DP_PRINT_STATS("data = %s\n", data);
424 	qdf_mem_free(data);
425 }
426 
427 /*
428  * dp_print_tx_pdev_stats_cmn_tlv: display htt_tx_pdev_stats_cmn_tlv
429  * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_cmn_tlv
430  *
431  * return:void
432  */
433 static void dp_print_tx_pdev_stats_cmn_tlv(uint32_t *tag_buf)
434 {
435 	htt_tx_pdev_stats_cmn_tlv *dp_stats_buf =
436 		(htt_tx_pdev_stats_cmn_tlv *)tag_buf;
437 
438 	DP_PRINT_STATS("HTT_TX_PDEV_STATS_CMN_TLV:");
439 	DP_PRINT_STATS("mac_id__word = %u",
440 		       dp_stats_buf->mac_id__word);
441 	DP_PRINT_STATS("hw_queued = %u",
442 		       dp_stats_buf->hw_queued);
443 	DP_PRINT_STATS("hw_reaped = %u",
444 		       dp_stats_buf->hw_reaped);
445 	DP_PRINT_STATS("underrun = %u",
446 		       dp_stats_buf->underrun);
447 	DP_PRINT_STATS("hw_paused = %u",
448 		       dp_stats_buf->hw_paused);
449 	DP_PRINT_STATS("hw_flush = %u",
450 		       dp_stats_buf->hw_flush);
451 	DP_PRINT_STATS("hw_filt = %u",
452 		       dp_stats_buf->hw_filt);
453 	DP_PRINT_STATS("tx_abort = %u",
454 		       dp_stats_buf->tx_abort);
455 	DP_PRINT_STATS("mpdu_requeued = %u",
456 		       dp_stats_buf->mpdu_requed);
457 	DP_PRINT_STATS("tx_xretry = %u",
458 		       dp_stats_buf->tx_xretry);
459 	DP_PRINT_STATS("data_rc = %u",
460 		       dp_stats_buf->data_rc);
461 	DP_PRINT_STATS("mpdu_dropped_xretry = %u",
462 		       dp_stats_buf->mpdu_dropped_xretry);
463 	DP_PRINT_STATS("illegal_rate_phy_err = %u",
464 		       dp_stats_buf->illgl_rate_phy_err);
465 	DP_PRINT_STATS("cont_xretry = %u",
466 		       dp_stats_buf->cont_xretry);
467 	DP_PRINT_STATS("tx_timeout = %u",
468 		       dp_stats_buf->tx_timeout);
469 	DP_PRINT_STATS("pdev_resets = %u",
470 		       dp_stats_buf->pdev_resets);
471 	DP_PRINT_STATS("phy_underrun = %u",
472 		       dp_stats_buf->phy_underrun);
473 	DP_PRINT_STATS("txop_ovf = %u",
474 		       dp_stats_buf->txop_ovf);
475 	DP_PRINT_STATS("seq_posted = %u",
476 		       dp_stats_buf->seq_posted);
477 	DP_PRINT_STATS("seq_failed_queueing = %u",
478 		       dp_stats_buf->seq_failed_queueing);
479 	DP_PRINT_STATS("seq_completed = %u",
480 		       dp_stats_buf->seq_completed);
481 	DP_PRINT_STATS("seq_restarted = %u",
482 		       dp_stats_buf->seq_restarted);
483 	DP_PRINT_STATS("mu_seq_posted = %u",
484 		       dp_stats_buf->mu_seq_posted);
485 	DP_PRINT_STATS("seq_switch_hw_paused = %u",
486 		       dp_stats_buf->seq_switch_hw_paused);
487 	DP_PRINT_STATS("next_seq_posted_dsr = %u",
488 		       dp_stats_buf->next_seq_posted_dsr);
489 	DP_PRINT_STATS("seq_posted_isr = %u",
490 		       dp_stats_buf->seq_posted_isr);
491 	DP_PRINT_STATS("seq_ctrl_cached = %u",
492 		       dp_stats_buf->seq_ctrl_cached);
493 	DP_PRINT_STATS("mpdu_count_tqm = %u",
494 		       dp_stats_buf->mpdu_count_tqm);
495 	DP_PRINT_STATS("msdu_count_tqm = %u",
496 		       dp_stats_buf->msdu_count_tqm);
497 	DP_PRINT_STATS("mpdu_removed_tqm = %u",
498 		       dp_stats_buf->mpdu_removed_tqm);
499 	DP_PRINT_STATS("msdu_removed_tqm = %u",
500 		       dp_stats_buf->msdu_removed_tqm);
501 	DP_PRINT_STATS("mpdus_sw_flush = %u",
502 		       dp_stats_buf->mpdus_sw_flush);
503 	DP_PRINT_STATS("mpdus_hw_filter = %u",
504 		       dp_stats_buf->mpdus_hw_filter);
505 	DP_PRINT_STATS("mpdus_truncated = %u",
506 		       dp_stats_buf->mpdus_truncated);
507 	DP_PRINT_STATS("mpdus_ack_failed = %u",
508 		       dp_stats_buf->mpdus_ack_failed);
509 	DP_PRINT_STATS("mpdus_expired = %u",
510 		       dp_stats_buf->mpdus_expired);
511 	DP_PRINT_STATS("mpdus_seq_hw_retry = %u",
512 		       dp_stats_buf->mpdus_seq_hw_retry);
513 	DP_PRINT_STATS("ack_tlv_proc = %u",
514 		       dp_stats_buf->ack_tlv_proc);
515 	DP_PRINT_STATS("coex_abort_mpdu_cnt_valid = %u",
516 		       dp_stats_buf->coex_abort_mpdu_cnt_valid);
517 	DP_PRINT_STATS("coex_abort_mpdu_cnt = %u\n",
518 		       dp_stats_buf->coex_abort_mpdu_cnt);
519 }
520 
521 /*
522  * dp_print_tx_pdev_stats_urrn_tlv_v: display htt_tx_pdev_stats_urrn_tlv_v
523  * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_urrn_tlv_v
524  *
525  * return:void
526  */
527 static void dp_print_tx_pdev_stats_urrn_tlv_v(uint32_t *tag_buf)
528 {
529 	htt_tx_pdev_stats_urrn_tlv_v *dp_stats_buf =
530 		(htt_tx_pdev_stats_urrn_tlv_v *)tag_buf;
531 	uint8_t i;
532 	uint16_t index = 0;
533 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
534 	char *urrn_stats = qdf_mem_malloc(DP_MAX_STRING_LEN);
535 
536 	if (!urrn_stats) {
537 		dp_stats_err("Output buffer not allocated");
538 		return;
539 	}
540 
541 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_URRN_STATS);
542 	DP_PRINT_STATS("HTT_TX_PDEV_STATS_URRN_TLV_V:");
543 	for (i = 0; i <  tag_len; i++) {
544 		index += qdf_snprint(&urrn_stats[index],
545 				DP_MAX_STRING_LEN - index,
546 				" %u:%u,", i, dp_stats_buf->urrn_stats[i]);
547 	}
548 	DP_PRINT_STATS("urrn_stats = %s\n", urrn_stats);
549 	qdf_mem_free(urrn_stats);
550 }
551 
552 /*
553  * dp_print_tx_pdev_stats_flush_tlv_v: display htt_tx_pdev_stats_flush_tlv_v
554  * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_flush_tlv_v
555  *
556  * return:void
557  */
558 static void dp_print_tx_pdev_stats_flush_tlv_v(uint32_t *tag_buf)
559 {
560 	htt_tx_pdev_stats_flush_tlv_v *dp_stats_buf =
561 		(htt_tx_pdev_stats_flush_tlv_v *)tag_buf;
562 	uint8_t i;
563 	uint16_t index = 0;
564 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
565 	char *flush_errs = qdf_mem_malloc(DP_MAX_STRING_LEN);
566 
567 	if (!flush_errs) {
568 		dp_stats_err("Output buffer not allocated");
569 		return;
570 	}
571 
572 	tag_len = qdf_min(tag_len,
573 			(uint32_t)HTT_TX_PDEV_MAX_FLUSH_REASON_STATS);
574 
575 	DP_PRINT_STATS("HTT_TX_PDEV_STATS_FLUSH_TLV_V:");
576 	for (i = 0; i <  tag_len; i++) {
577 		index += qdf_snprint(&flush_errs[index],
578 				DP_MAX_STRING_LEN - index,
579 				" %u:%u,", i, dp_stats_buf->flush_errs[i]);
580 	}
581 	DP_PRINT_STATS("flush_errs = %s\n", flush_errs);
582 	qdf_mem_free(flush_errs);
583 }
584 
585 /*
586  * dp_print_tx_pdev_stats_sifs_tlv_v: display htt_tx_pdev_stats_sifs_tlv_v
587  * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_sifs_tlv_v
588  *
589  * return:void
590  */
591 static void dp_print_tx_pdev_stats_sifs_tlv_v(uint32_t *tag_buf)
592 {
593 	htt_tx_pdev_stats_sifs_tlv_v *dp_stats_buf =
594 		(htt_tx_pdev_stats_sifs_tlv_v *)tag_buf;
595 	uint8_t i;
596 	uint16_t index = 0;
597 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
598 	char *sifs_status = qdf_mem_malloc(DP_MAX_STRING_LEN);
599 
600 	if (!sifs_status) {
601 		dp_stats_err("Output buffer not allocated");
602 		return;
603 	}
604 
605 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_SIFS_BURST_STATS);
606 
607 	DP_PRINT_STATS("HTT_TX_PDEV_STATS_SIFS_TLV_V:");
608 	for (i = 0; i <  tag_len; i++) {
609 		index += qdf_snprint(&sifs_status[index],
610 				DP_MAX_STRING_LEN - index,
611 				" %u:%u,", i, dp_stats_buf->sifs_status[i]);
612 	}
613 	DP_PRINT_STATS("sifs_status = %s\n", sifs_status);
614 	qdf_mem_free(sifs_status);
615 }
616 
617 /*
618  * dp_print_tx_pdev_stats_phy_err_tlv_v: display htt_tx_pdev_stats_phy_err_tlv_v
619  * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_phy_err_tlv_v
620  *
621  * return:void
622  */
623 static void dp_print_tx_pdev_stats_phy_err_tlv_v(uint32_t *tag_buf)
624 {
625 	htt_tx_pdev_stats_phy_err_tlv_v *dp_stats_buf =
626 		(htt_tx_pdev_stats_phy_err_tlv_v *)tag_buf;
627 	uint8_t i;
628 	uint16_t index = 0;
629 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
630 	char *phy_errs = qdf_mem_malloc(DP_MAX_STRING_LEN);
631 
632 	if (!phy_errs) {
633 		dp_stats_err("Output buffer not allocated");
634 		return;
635 	}
636 
637 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_PHY_ERR_STATS);
638 
639 	DP_PRINT_STATS("HTT_TX_PDEV_STATS_PHY_ERR_TLV_V:");
640 	for (i = 0; i <  tag_len; i++) {
641 		index += qdf_snprint(&phy_errs[index],
642 				DP_MAX_STRING_LEN - index,
643 				" %u:%u,", i, dp_stats_buf->phy_errs[i]);
644 	}
645 	DP_PRINT_STATS("phy_errs = %s\n", phy_errs);
646 	qdf_mem_free(phy_errs);
647 }
648 
649 /*
650  * dp_print_hw_stats_intr_misc_tlv: display htt_hw_stats_intr_misc_tlv
651  * @tag_buf: buffer containing the tlv htt_hw_stats_intr_misc_tlv
652  *
653  * return:void
654  */
655 static void dp_print_hw_stats_intr_misc_tlv(uint32_t *tag_buf)
656 {
657 	htt_hw_stats_intr_misc_tlv *dp_stats_buf =
658 		(htt_hw_stats_intr_misc_tlv *)tag_buf;
659 	uint8_t i;
660 	uint16_t index = 0;
661 	char *hw_intr_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
662 
663 	if (!hw_intr_name) {
664 		dp_stats_err("Output buffer not allocated");
665 		return;
666 	}
667 
668 	DP_PRINT_STATS("HTT_HW_STATS_INTR_MISC_TLV:");
669 	for (i = 0; i <  DP_HTT_HW_INTR_NAME_LEN; i++) {
670 		index += qdf_snprint(&hw_intr_name[index],
671 				DP_MAX_STRING_LEN - index,
672 				" %u:%u,", i, dp_stats_buf->hw_intr_name[i]);
673 	}
674 	DP_PRINT_STATS("hw_intr_name = %s ", hw_intr_name);
675 	DP_PRINT_STATS("mask = %u",
676 		       dp_stats_buf->mask);
677 	DP_PRINT_STATS("count = %u\n",
678 		       dp_stats_buf->count);
679 	qdf_mem_free(hw_intr_name);
680 }
681 
682 /*
683  * dp_print_hw_stats_wd_timeout_tlv: display htt_hw_stats_wd_timeout_tlv
684  * @tag_buf: buffer containing the tlv htt_hw_stats_wd_timeout_tlv
685  *
686  * return:void
687  */
688 static void dp_print_hw_stats_wd_timeout_tlv(uint32_t *tag_buf)
689 {
690 	htt_hw_stats_wd_timeout_tlv *dp_stats_buf =
691 		(htt_hw_stats_wd_timeout_tlv *)tag_buf;
692 	uint8_t i;
693 	uint16_t index = 0;
694 	char *hw_module_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
695 
696 	if (!hw_module_name) {
697 		dp_stats_err("Output buffer not allocated");
698 		return;
699 	}
700 
701 	DP_PRINT_STATS("HTT_HW_STATS_WD_TIMEOUT_TLV:");
702 	for (i = 0; i <  DP_HTT_HW_MODULE_NAME_LEN; i++) {
703 		index += qdf_snprint(&hw_module_name[index],
704 				DP_MAX_STRING_LEN - index,
705 				" %u:%u,", i, dp_stats_buf->hw_module_name[i]);
706 	}
707 	DP_PRINT_STATS("hw_module_name = %s ", hw_module_name);
708 	DP_PRINT_STATS("count = %u",
709 		       dp_stats_buf->count);
710 	qdf_mem_free(hw_module_name);
711 }
712 
713 /*
714  * dp_print_hw_stats_pdev_errs_tlv: display htt_hw_stats_pdev_errs_tlv
715  * @tag_buf: buffer containing the tlv htt_hw_stats_pdev_errs_tlv
716  *
717  * return:void
718  */
719 static void dp_print_hw_stats_pdev_errs_tlv(uint32_t *tag_buf)
720 {
721 	htt_hw_stats_pdev_errs_tlv *dp_stats_buf =
722 		(htt_hw_stats_pdev_errs_tlv *)tag_buf;
723 
724 	DP_PRINT_STATS("HTT_HW_STATS_PDEV_ERRS_TLV:");
725 	DP_PRINT_STATS("mac_id__word = %u",
726 		       dp_stats_buf->mac_id__word);
727 	DP_PRINT_STATS("tx_abort = %u",
728 		       dp_stats_buf->tx_abort);
729 	DP_PRINT_STATS("tx_abort_fail_count = %u",
730 		       dp_stats_buf->tx_abort_fail_count);
731 	DP_PRINT_STATS("rx_abort = %u",
732 		       dp_stats_buf->rx_abort);
733 	DP_PRINT_STATS("rx_abort_fail_count = %u",
734 		       dp_stats_buf->rx_abort_fail_count);
735 	DP_PRINT_STATS("warm_reset = %u",
736 		       dp_stats_buf->warm_reset);
737 	DP_PRINT_STATS("cold_reset = %u",
738 		       dp_stats_buf->cold_reset);
739 	DP_PRINT_STATS("tx_flush = %u",
740 		       dp_stats_buf->tx_flush);
741 	DP_PRINT_STATS("tx_glb_reset = %u",
742 		       dp_stats_buf->tx_glb_reset);
743 	DP_PRINT_STATS("tx_txq_reset = %u",
744 		       dp_stats_buf->tx_txq_reset);
745 	DP_PRINT_STATS("rx_timeout_reset = %u\n",
746 		       dp_stats_buf->rx_timeout_reset);
747 }
748 
749 /*
750  * dp_print_msdu_flow_stats_tlv: display htt_msdu_flow_stats_tlv
751  * @tag_buf: buffer containing the tlv htt_msdu_flow_stats_tlv
752  *
753  * return:void
754  */
755 static void dp_print_msdu_flow_stats_tlv(uint32_t *tag_buf)
756 {
757 	htt_msdu_flow_stats_tlv *dp_stats_buf =
758 		(htt_msdu_flow_stats_tlv *)tag_buf;
759 
760 	DP_PRINT_STATS("HTT_MSDU_FLOW_STATS_TLV:");
761 	DP_PRINT_STATS("last_update_timestamp = %u",
762 		       dp_stats_buf->last_update_timestamp);
763 	DP_PRINT_STATS("last_add_timestamp = %u",
764 		       dp_stats_buf->last_add_timestamp);
765 	DP_PRINT_STATS("last_remove_timestamp = %u",
766 		       dp_stats_buf->last_remove_timestamp);
767 	DP_PRINT_STATS("total_processed_msdu_count = %u",
768 		       dp_stats_buf->total_processed_msdu_count);
769 	DP_PRINT_STATS("cur_msdu_count_in_flowq = %u",
770 		       dp_stats_buf->cur_msdu_count_in_flowq);
771 	DP_PRINT_STATS("sw_peer_id = %u",
772 		       dp_stats_buf->sw_peer_id);
773 	DP_PRINT_STATS("tx_flow_no__tid_num__drop_rule = %u\n",
774 		       dp_stats_buf->tx_flow_no__tid_num__drop_rule);
775 }
776 
777 /*
778  * dp_print_tx_tid_stats_tlv: display htt_tx_tid_stats_tlv
779  * @tag_buf: buffer containing the tlv htt_tx_tid_stats_tlv
780  *
781  * return:void
782  */
783 static void dp_print_tx_tid_stats_tlv(uint32_t *tag_buf)
784 {
785 	htt_tx_tid_stats_tlv *dp_stats_buf =
786 		(htt_tx_tid_stats_tlv *)tag_buf;
787 	uint8_t i;
788 	uint16_t index = 0;
789 	char *tid_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
790 
791 	if (!tid_name) {
792 		dp_stats_err("Output buffer not allocated");
793 		return;
794 	}
795 
796 	DP_PRINT_STATS("HTT_TX_TID_STATS_TLV:");
797 	for (i = 0; i <  DP_HTT_TID_NAME_LEN; i++) {
798 		index += qdf_snprint(&tid_name[index],
799 				DP_MAX_STRING_LEN - index,
800 				" %u:%u,", i, dp_stats_buf->tid_name[i]);
801 	}
802 	DP_PRINT_STATS("tid_name = %s ", tid_name);
803 	DP_PRINT_STATS("sw_peer_id__tid_num = %u",
804 		       dp_stats_buf->sw_peer_id__tid_num);
805 	DP_PRINT_STATS("num_sched_pending__num_ppdu_in_hwq = %u",
806 		       dp_stats_buf->num_sched_pending__num_ppdu_in_hwq);
807 	DP_PRINT_STATS("tid_flags = %u",
808 		       dp_stats_buf->tid_flags);
809 	DP_PRINT_STATS("hw_queued = %u",
810 		       dp_stats_buf->hw_queued);
811 	DP_PRINT_STATS("hw_reaped = %u",
812 		       dp_stats_buf->hw_reaped);
813 	DP_PRINT_STATS("mpdus_hw_filter = %u",
814 		       dp_stats_buf->mpdus_hw_filter);
815 	DP_PRINT_STATS("qdepth_bytes = %u",
816 		       dp_stats_buf->qdepth_bytes);
817 	DP_PRINT_STATS("qdepth_num_msdu = %u",
818 		       dp_stats_buf->qdepth_num_msdu);
819 	DP_PRINT_STATS("qdepth_num_mpdu = %u",
820 		       dp_stats_buf->qdepth_num_mpdu);
821 	DP_PRINT_STATS("last_scheduled_tsmp = %u",
822 		       dp_stats_buf->last_scheduled_tsmp);
823 	DP_PRINT_STATS("pause_module_id = %u",
824 		       dp_stats_buf->pause_module_id);
825 	DP_PRINT_STATS("block_module_id = %u\n",
826 		       dp_stats_buf->block_module_id);
827 	DP_PRINT_STATS("tid_tx_airtime = %u\n",
828 		       dp_stats_buf->tid_tx_airtime);
829 	qdf_mem_free(tid_name);
830 }
831 
832 /*
833  * dp_print_tx_tid_stats_v1_tlv: display htt_tx_tid_stats_v1_tlv
834  * @tag_buf: buffer containing the tlv htt_tx_tid_stats_v1_tlv
835  *
836  * return:void
837  */
838 static void dp_print_tx_tid_stats_v1_tlv(uint32_t *tag_buf)
839 {
840 	htt_tx_tid_stats_v1_tlv *dp_stats_buf =
841 		(htt_tx_tid_stats_v1_tlv *)tag_buf;
842 	uint8_t i;
843 	uint16_t index = 0;
844 	char *tid_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
845 
846 	if (!tid_name) {
847 		dp_stats_err("Output buffer not allocated");
848 		return;
849 	}
850 
851 	DP_PRINT_STATS("HTT_TX_TID_STATS_V1_TLV:");
852 	for (i = 0; i <  DP_HTT_TID_NAME_LEN; i++) {
853 		index += qdf_snprint(&tid_name[index],
854 				DP_MAX_STRING_LEN - index,
855 				" %u:%u,", i, dp_stats_buf->tid_name[i]);
856 	}
857 	DP_PRINT_STATS("tid_name = %s ", tid_name);
858 	DP_PRINT_STATS("sw_peer_id__tid_num = %u",
859 		       dp_stats_buf->sw_peer_id__tid_num);
860 	DP_PRINT_STATS("num_sched_pending__num_ppdu_in_hwq = %u",
861 		       dp_stats_buf->num_sched_pending__num_ppdu_in_hwq);
862 	DP_PRINT_STATS("tid_flags = %u",
863 		       dp_stats_buf->tid_flags);
864 	DP_PRINT_STATS("max_qdepth_bytes = %u",
865 		       dp_stats_buf->max_qdepth_bytes);
866 	DP_PRINT_STATS("max_qdepth_n_msdus = %u",
867 		       dp_stats_buf->max_qdepth_n_msdus);
868 	DP_PRINT_STATS("rsvd = %u",
869 		       dp_stats_buf->rsvd);
870 	DP_PRINT_STATS("qdepth_bytes = %u",
871 		       dp_stats_buf->qdepth_bytes);
872 	DP_PRINT_STATS("qdepth_num_msdu = %u",
873 		       dp_stats_buf->qdepth_num_msdu);
874 	DP_PRINT_STATS("qdepth_num_mpdu = %u",
875 		       dp_stats_buf->qdepth_num_mpdu);
876 	DP_PRINT_STATS("last_scheduled_tsmp = %u",
877 		       dp_stats_buf->last_scheduled_tsmp);
878 	DP_PRINT_STATS("pause_module_id = %u",
879 		       dp_stats_buf->pause_module_id);
880 	DP_PRINT_STATS("block_module_id = %u\n",
881 		       dp_stats_buf->block_module_id);
882 	DP_PRINT_STATS("tid_tx_airtime = %u\n",
883 		       dp_stats_buf->tid_tx_airtime);
884 	qdf_mem_free(tid_name);
885 }
886 
887 /*
888  * dp_print_rx_tid_stats_tlv: display htt_rx_tid_stats_tlv
889  * @tag_buf: buffer containing the tlv htt_rx_tid_stats_tlv
890  *
891  * return:void
892  */
893 static void dp_print_rx_tid_stats_tlv(uint32_t *tag_buf)
894 {
895 	htt_rx_tid_stats_tlv *dp_stats_buf =
896 		(htt_rx_tid_stats_tlv *)tag_buf;
897 	uint8_t i;
898 	uint16_t index = 0;
899 	char *tid_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
900 
901 	if (!tid_name) {
902 		dp_stats_err("Output buffer not allocated");
903 		return;
904 	}
905 
906 	DP_PRINT_STATS("HTT_RX_TID_STATS_TLV:");
907 	DP_PRINT_STATS("sw_peer_id__tid_num = %u",
908 		       dp_stats_buf->sw_peer_id__tid_num);
909 	for (i = 0; i <  DP_HTT_TID_NAME_LEN; i++) {
910 		index += qdf_snprint(&tid_name[index],
911 				DP_MAX_STRING_LEN - index,
912 				" %u:%u,", i, dp_stats_buf->tid_name[i]);
913 	}
914 	DP_PRINT_STATS("tid_name = %s ", tid_name);
915 	DP_PRINT_STATS("dup_in_reorder = %u",
916 		       dp_stats_buf->dup_in_reorder);
917 	DP_PRINT_STATS("dup_past_outside_window = %u",
918 		       dp_stats_buf->dup_past_outside_window);
919 	DP_PRINT_STATS("dup_past_within_window = %u",
920 		       dp_stats_buf->dup_past_within_window);
921 	DP_PRINT_STATS("rxdesc_err_decrypt = %u\n",
922 		       dp_stats_buf->rxdesc_err_decrypt);
923 	qdf_mem_free(tid_name);
924 }
925 
926 /*
927  * dp_print_counter_tlv: display htt_counter_tlv
928  * @tag_buf: buffer containing the tlv htt_counter_tlv
929  *
930  * return:void
931  */
932 static void dp_print_counter_tlv(uint32_t *tag_buf)
933 {
934 	htt_counter_tlv *dp_stats_buf =
935 		(htt_counter_tlv *)tag_buf;
936 	uint8_t i;
937 	uint16_t index = 0;
938 	char *counter_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
939 
940 	if (!counter_name) {
941 		dp_stats_err("Output buffer not allocated");
942 		return;
943 	}
944 
945 	DP_PRINT_STATS("HTT_COUNTER_TLV:");
946 	for (i = 0; i <  DP_HTT_COUNTER_NAME_LEN; i++) {
947 		index += qdf_snprint(&counter_name[index],
948 				DP_MAX_STRING_LEN - index,
949 				" %u:%u,", i, dp_stats_buf->counter_name[i]);
950 	}
951 	DP_PRINT_STATS("counter_name = %s ", counter_name);
952 	DP_PRINT_STATS("count = %u\n",
953 		       dp_stats_buf->count);
954 	qdf_mem_free(counter_name);
955 }
956 
957 /*
958  * dp_print_peer_stats_cmn_tlv: display htt_peer_stats_cmn_tlv
959  * @tag_buf: buffer containing the tlv htt_peer_stats_cmn_tlv
960  *
961  * return:void
962  */
963 static void dp_print_peer_stats_cmn_tlv(uint32_t *tag_buf)
964 {
965 	htt_peer_stats_cmn_tlv *dp_stats_buf =
966 		(htt_peer_stats_cmn_tlv *)tag_buf;
967 
968 	DP_PRINT_STATS("HTT_PEER_STATS_CMN_TLV:");
969 	DP_PRINT_STATS("ppdu_cnt = %u",
970 		       dp_stats_buf->ppdu_cnt);
971 	DP_PRINT_STATS("mpdu_cnt = %u",
972 		       dp_stats_buf->mpdu_cnt);
973 	DP_PRINT_STATS("msdu_cnt = %u",
974 		       dp_stats_buf->msdu_cnt);
975 	DP_PRINT_STATS("pause_bitmap = %u",
976 		       dp_stats_buf->pause_bitmap);
977 	DP_PRINT_STATS("block_bitmap = %u",
978 		       dp_stats_buf->block_bitmap);
979 	DP_PRINT_STATS("current_timestamp = %u\n",
980 		       dp_stats_buf->current_timestamp);
981 	DP_PRINT_STATS("inactive_time = %u",
982 		       dp_stats_buf->inactive_time);
983 }
984 
985 /*
986  * dp_print_peer_details_tlv: display htt_peer_details_tlv
987  * @tag_buf: buffer containing the tlv htt_peer_details_tlv
988  *
989  * return:void
990  */
991 static void dp_print_peer_details_tlv(uint32_t *tag_buf)
992 {
993 	htt_peer_details_tlv *dp_stats_buf =
994 		(htt_peer_details_tlv *)tag_buf;
995 
996 	DP_PRINT_STATS("HTT_PEER_DETAILS_TLV:");
997 	DP_PRINT_STATS("peer_type = %u",
998 		       dp_stats_buf->peer_type);
999 	DP_PRINT_STATS("sw_peer_id = %u",
1000 		       dp_stats_buf->sw_peer_id);
1001 	DP_PRINT_STATS("vdev_pdev_ast_idx = %u",
1002 		       dp_stats_buf->vdev_pdev_ast_idx);
1003 	DP_PRINT_STATS("mac_addr(upper 4 bytes) = %u",
1004 		       dp_stats_buf->mac_addr.mac_addr31to0);
1005 	DP_PRINT_STATS("mac_addr(lower 2 bytes) = %u",
1006 		       dp_stats_buf->mac_addr.mac_addr47to32);
1007 	DP_PRINT_STATS("peer_flags = %u",
1008 		       dp_stats_buf->peer_flags);
1009 	DP_PRINT_STATS("qpeer_flags = %u\n",
1010 		       dp_stats_buf->qpeer_flags);
1011 }
1012 
1013 /*
1014  * dp_print_tx_peer_rate_stats_tlv: display htt_tx_peer_rate_stats_tlv
1015  * @tag_buf: buffer containing the tlv htt_tx_peer_rate_stats_tlv
1016  *
1017  * return:void
1018  */
1019 static void dp_print_tx_peer_rate_stats_tlv(uint32_t *tag_buf)
1020 {
1021 	htt_tx_peer_rate_stats_tlv *dp_stats_buf =
1022 		(htt_tx_peer_rate_stats_tlv *)tag_buf;
1023 	uint8_t i, j;
1024 	uint16_t index = 0;
1025 	char *tx_gi[HTT_TX_PEER_STATS_NUM_GI_COUNTERS] = {0};
1026 	char *tx_gi_ext[HTT_TX_PEER_STATS_NUM_GI_COUNTERS] = {0};
1027 	char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
1028 
1029 	if (!str_buf) {
1030 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
1031 			  FL("Output buffer not allocated"));
1032 		return;
1033 	}
1034 
1035 	for (i = 0; i < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; i++) {
1036 		tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
1037 		tx_gi_ext[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
1038 		if (!tx_gi[i] || !tx_gi_ext[i]) {
1039 			dp_err("Unable to allocate buffer for tx_gi");
1040 			goto fail1;
1041 		}
1042 	}
1043 
1044 	DP_PRINT_STATS("HTT_TX_PEER_RATE_STATS_TLV:");
1045 	DP_PRINT_STATS("tx_ldpc = %u",
1046 		       dp_stats_buf->tx_ldpc);
1047 	DP_PRINT_STATS("rts_cnt = %u",
1048 		       dp_stats_buf->rts_cnt);
1049 	DP_PRINT_STATS("ack_rssi = %u",
1050 		       dp_stats_buf->ack_rssi);
1051 
1052 	index = 0;
1053 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1054 	for (i = 0; i <  DP_HTT_TX_MCS_LEN; i++) {
1055 		index += qdf_snprint(&str_buf[index],
1056 				DP_MAX_STRING_LEN - index,
1057 				" %u:%u,", i, dp_stats_buf->tx_mcs[i]);
1058 	}
1059 	for (i = 0; i <  DP_HTT_TX_MCS_EXT_LEN; i++) {
1060 		index += qdf_snprint(&str_buf[index],
1061 				DP_MAX_STRING_LEN - index,
1062 				" %u:%u,", i + DP_HTT_TX_MCS_LEN,
1063 				dp_stats_buf->tx_mcs_ext[i]);
1064 	}
1065 	DP_PRINT_STATS("tx_mcs = %s ", str_buf);
1066 
1067 	index = 0;
1068 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1069 	for (i = 0; i <  DP_HTT_TX_SU_MCS_LEN; i++) {
1070 		index += qdf_snprint(&str_buf[index],
1071 				DP_MAX_STRING_LEN - index,
1072 				" %u:%u,", i, dp_stats_buf->tx_su_mcs[i]);
1073 	}
1074 	for (i = 0; i <  DP_HTT_TX_SU_MCS_EXT_LEN; i++) {
1075 		index += qdf_snprint(&str_buf[index],
1076 				DP_MAX_STRING_LEN - index,
1077 				" %u:%u,", i + DP_HTT_TX_SU_MCS_LEN,
1078 				dp_stats_buf->tx_su_mcs_ext[i]);
1079 	}
1080 	DP_PRINT_STATS("tx_su_mcs = %s ", str_buf);
1081 
1082 
1083 	index = 0;
1084 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1085 	for (i = 0; i <  DP_HTT_TX_MU_MCS_LEN; i++) {
1086 		index += qdf_snprint(&str_buf[index],
1087 				DP_MAX_STRING_LEN - index,
1088 				" %u:%u,", i, dp_stats_buf->tx_mu_mcs[i]);
1089 	}
1090 	for (i = 0; i <  DP_HTT_TX_MU_MCS_EXT_LEN; i++) {
1091 		index += qdf_snprint(&str_buf[index],
1092 				DP_MAX_STRING_LEN - index,
1093 				" %u:%u,", i + DP_HTT_TX_MU_MCS_LEN,
1094 				dp_stats_buf->tx_mu_mcs_ext[i]);
1095 	}
1096 	DP_PRINT_STATS("tx_mu_mcs = %s ", str_buf);
1097 
1098 	index = 0;
1099 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1100 	for (i = 0; i <  DP_HTT_TX_NSS_LEN; i++) {
1101 		/* 0 stands for NSS 1, 1 stands for NSS 2, etc. */
1102 		index += qdf_snprint(&str_buf[index],
1103 				DP_MAX_STRING_LEN - index,
1104 				" %u:%u,", (i + 1),
1105 				dp_stats_buf->tx_nss[i]);
1106 	}
1107 	DP_PRINT_STATS("tx_nss = %s ", str_buf);
1108 	index = 0;
1109 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1110 	for (i = 0; i <  DP_HTT_TX_BW_LEN; i++) {
1111 		index += qdf_snprint(&str_buf[index],
1112 				DP_MAX_STRING_LEN - index,
1113 				" %u:%u,", i, dp_stats_buf->tx_bw[i]);
1114 	}
1115 	DP_PRINT_STATS("tx_bw = %s ", str_buf);
1116 
1117 	index = 0;
1118 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1119 	for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
1120 		index += qdf_snprint(&str_buf[index],
1121 				DP_MAX_STRING_LEN - index,
1122 				" %u:%u,", i, dp_stats_buf->tx_stbc[i]);
1123 	}
1124 	for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) {
1125 		index += qdf_snprint(&str_buf[index],
1126 				DP_MAX_STRING_LEN - index,
1127 				" %u:%u,", i +  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,
1128 				dp_stats_buf->tx_stbc_ext[i]);
1129 	}
1130 	DP_PRINT_STATS("tx_stbc = %s ", str_buf);
1131 
1132 
1133 	index = 0;
1134 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1135 
1136 	for (i = 0; i <  DP_HTT_TX_PREAM_LEN; i++) {
1137 		index += qdf_snprint(&str_buf[index],
1138 				DP_MAX_STRING_LEN - index,
1139 				" %u:%u,", i, dp_stats_buf->tx_pream[i]);
1140 	}
1141 	DP_PRINT_STATS("tx_pream = %s ", str_buf);
1142 
1143 	for (j = 0; j < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; j++) {
1144 		index = 0;
1145 		for (i = 0; i <  HTT_TX_PEER_STATS_NUM_MCS_COUNTERS; i++) {
1146 			index += qdf_snprint(&tx_gi[j][index],
1147 					DP_MAX_STRING_LEN - index,
1148 					" %u:%u,", i,
1149 					dp_stats_buf->tx_gi[j][i]);
1150 		}
1151 		DP_PRINT_STATS("tx_gi[%u] = %s ", j, tx_gi[j]);
1152 	}
1153 
1154 	for (j = 0; j < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; j++) {
1155 		index = 0;
1156 		for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) {
1157 			index += qdf_snprint(&tx_gi_ext[j][index],
1158 					DP_MAX_STRING_LEN - index,
1159 					" %u:%u,", i,
1160 					dp_stats_buf->tx_gi_ext[j][i]);
1161 		}
1162 		DP_PRINT_STATS("tx_gi_ext[%u] = %s ", j, tx_gi_ext[j]);
1163 	}
1164 
1165 	index = 0;
1166 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1167 	for (i = 0; i <  DP_HTT_TX_DCM_LEN; i++) {
1168 		index += qdf_snprint(&str_buf[index],
1169 				DP_MAX_STRING_LEN - index,
1170 				" %u:%u,", i, dp_stats_buf->tx_dcm[i]);
1171 	}
1172 	DP_PRINT_STATS("tx_dcm = %s\n", str_buf);
1173 
1174 fail1:
1175 	for (i = 0; i < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; i++) {
1176 		if (tx_gi[i])
1177 			qdf_mem_free(tx_gi[i]);
1178 		if (tx_gi_ext[i])
1179 			qdf_mem_free(tx_gi_ext[i]);
1180 	}
1181 	qdf_mem_free(str_buf);
1182 }
1183 
1184 /*
1185  * dp_print_rx_peer_rate_stats_tlv: display htt_rx_peer_rate_stats_tlv
1186  * @tag_buf: buffer containing the tlv htt_rx_peer_rate_stats_tlv
1187  *
1188  * return:void
1189  */
1190 static void dp_print_rx_peer_rate_stats_tlv(uint32_t *tag_buf)
1191 {
1192 	htt_rx_peer_rate_stats_tlv *dp_stats_buf =
1193 		(htt_rx_peer_rate_stats_tlv *)tag_buf;
1194 	uint8_t i, j;
1195 	uint16_t index = 0;
1196 	char *rssi_chain[DP_HTT_PEER_NUM_SS] = {0};
1197 	char *rx_gi[HTT_RX_PEER_STATS_NUM_GI_COUNTERS] = {0};
1198 	char *rx_gi_ext[HTT_RX_PEER_STATS_NUM_GI_COUNTERS] = {0};
1199 	char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
1200 
1201 	if (!str_buf) {
1202 		dp_stats_err("Output buffer not allocated");
1203 		return;
1204 	}
1205 
1206 	for (i = 0; i < DP_HTT_PEER_NUM_SS; i++) {
1207 		rssi_chain[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
1208 		if (!rssi_chain[i]) {
1209 			dp_err("Unable to allocate buffer for rssi_chain");
1210 			goto fail1;
1211 		}
1212 	}
1213 
1214 	for (i = 0; i < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; i++) {
1215 		rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
1216 		rx_gi_ext[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
1217 		if (!rx_gi[i] || !rx_gi_ext[i]) {
1218 			dp_err("Unable to allocate buffer for rx_gi");
1219 			goto fail1;
1220 		}
1221 	}
1222 
1223 	DP_PRINT_STATS("HTT_RX_PEER_RATE_STATS_TLV:");
1224 	DP_PRINT_STATS("nsts = %u",
1225 		       dp_stats_buf->nsts);
1226 	DP_PRINT_STATS("rx_ldpc = %u",
1227 		       dp_stats_buf->rx_ldpc);
1228 	DP_PRINT_STATS("rts_cnt = %u",
1229 		       dp_stats_buf->rts_cnt);
1230 	DP_PRINT_STATS("rssi_mgmt = %u",
1231 		       dp_stats_buf->rssi_mgmt);
1232 	DP_PRINT_STATS("rssi_data = %u",
1233 		       dp_stats_buf->rssi_data);
1234 	DP_PRINT_STATS("rssi_comb = %u",
1235 		       dp_stats_buf->rssi_comb);
1236 
1237 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1238 	for (i = 0; i <  DP_HTT_RX_MCS_LEN; i++) {
1239 		index += qdf_snprint(&str_buf[index],
1240 				DP_MAX_STRING_LEN - index,
1241 				" %u:%u,", i, dp_stats_buf->rx_mcs[i]);
1242 	}
1243 	for (i = 0; i <  DP_HTT_RX_MCS_EXT_LEN; i++) {
1244 		index += qdf_snprint(&str_buf[index],
1245 				DP_MAX_STRING_LEN - index,
1246 				" %u:%u,", i + DP_HTT_RX_MCS_LEN,
1247 				dp_stats_buf->rx_mcs_ext[i]);
1248 	}
1249 	DP_PRINT_STATS("rx_mcs = %s ", str_buf);
1250 
1251 	index = 0;
1252 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1253 	for (i = 0; i <  DP_HTT_RX_NSS_LEN; i++) {
1254 		/* 0 stands for NSS 1, 1 stands for NSS 2, etc. */
1255 		index += qdf_snprint(&str_buf[index],
1256 				DP_MAX_STRING_LEN - index,
1257 				" %u:%u,", (i + 1),
1258 				dp_stats_buf->rx_nss[i]);
1259 	}
1260 	DP_PRINT_STATS("rx_nss = %s ", str_buf);
1261 
1262 	index = 0;
1263 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1264 	for (i = 0; i <  DP_HTT_RX_DCM_LEN; i++) {
1265 		index += qdf_snprint(&str_buf[index],
1266 				DP_MAX_STRING_LEN - index,
1267 				" %u:%u,", i, dp_stats_buf->rx_dcm[i]);
1268 	}
1269 	DP_PRINT_STATS("rx_dcm = %s ", str_buf);
1270 
1271 	index = 0;
1272 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1273 	for (i = 0; i <  HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
1274 		index += qdf_snprint(&str_buf[index],
1275 				DP_MAX_STRING_LEN - index,
1276 				" %u:%u,", i, dp_stats_buf->rx_stbc[i]);
1277 	}
1278 	for (i = 0; i <  HTT_RX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) {
1279 		index += qdf_snprint(&str_buf[index],
1280 				DP_MAX_STRING_LEN - index,
1281 				" %u:%u,", i + HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS,
1282 				dp_stats_buf->rx_stbc_ext[i]);
1283 	}
1284 	DP_PRINT_STATS("rx_stbc = %s ", str_buf);
1285 
1286 	index = 0;
1287 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1288 	for (i = 0; i <  DP_HTT_RX_BW_LEN; i++) {
1289 		index += qdf_snprint(&str_buf[index],
1290 				DP_MAX_STRING_LEN - index,
1291 				" %u:%u,", i, dp_stats_buf->rx_bw[i]);
1292 	}
1293 	DP_PRINT_STATS("rx_bw = %s ", str_buf);
1294 
1295 	for (j = 0; j < DP_HTT_PEER_NUM_SS; j++) {
1296 		qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1297 		index = 0;
1298 		for (i = 0; i <  HTT_RX_PEER_STATS_NUM_BW_COUNTERS; i++) {
1299 			index += qdf_snprint(&rssi_chain[j][index],
1300 					DP_MAX_STRING_LEN - index,
1301 					" %u:%u,", i,
1302 					dp_stats_buf->rssi_chain[j][i]);
1303 		}
1304 		DP_PRINT_STATS("rssi_chain[%u] = %s ", j, rssi_chain[j]);
1305 	}
1306 
1307 	for (j = 0; j < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; j++) {
1308 		index = 0;
1309 		for (i = 0; i <  HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
1310 			index += qdf_snprint(&rx_gi[j][index],
1311 					DP_MAX_STRING_LEN - index,
1312 					" %u:%u,", i,
1313 					dp_stats_buf->rx_gi[j][i]);
1314 		}
1315 		DP_PRINT_STATS("rx_gi[%u] = %s ", j, rx_gi[j]);
1316 	}
1317 
1318 	for (j = 0; j < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; j++) {
1319 		index = 0;
1320 		for (i = 0; i <  HTT_RX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) {
1321 			index += qdf_snprint(&rx_gi_ext[j][index],
1322 					DP_MAX_STRING_LEN - index,
1323 					" %u:%u,", i,
1324 					dp_stats_buf->rx_gi_ext[j][i]);
1325 		}
1326 		DP_PRINT_STATS("rx_gi_ext[%u] = %s ", j, rx_gi_ext[j]);
1327 	}
1328 
1329 	index = 0;
1330 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1331 	for (i = 0; i <  DP_HTT_RX_PREAM_LEN; i++) {
1332 		index += qdf_snprint(&str_buf[index],
1333 				DP_MAX_STRING_LEN - index,
1334 				" %u:%u,", i, dp_stats_buf->rx_pream[i]);
1335 	}
1336 	DP_PRINT_STATS("rx_pream = %s\n", str_buf);
1337 
1338 fail1:
1339 	for (i = 0; i < DP_HTT_PEER_NUM_SS; i++) {
1340 		if (!rssi_chain[i])
1341 			break;
1342 		qdf_mem_free(rssi_chain[i]);
1343 	}
1344 
1345 	for (i = 0; i < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; i++) {
1346 		if (rx_gi[i])
1347 			qdf_mem_free(rx_gi[i]);
1348 		if (rx_gi_ext[i])
1349 			qdf_mem_free(rx_gi_ext[i]);
1350 	}
1351 	qdf_mem_free(str_buf);
1352 }
1353 
1354 /*
1355  * dp_print_tx_hwq_mu_mimo_sch_stats_tlv: display htt_tx_hwq_mu_mimo_sch_stats
1356  * @tag_buf: buffer containing the tlv htt_tx_hwq_mu_mimo_sch_stats_tlv
1357  *
1358  * return:void
1359  */
1360 static void dp_print_tx_hwq_mu_mimo_sch_stats_tlv(uint32_t *tag_buf)
1361 {
1362 	htt_tx_hwq_mu_mimo_sch_stats_tlv *dp_stats_buf =
1363 		(htt_tx_hwq_mu_mimo_sch_stats_tlv *)tag_buf;
1364 
1365 	DP_PRINT_STATS("HTT_TX_HWQ_MU_MIMO_SCH_STATS_TLV:");
1366 	DP_PRINT_STATS("mu_mimo_sch_posted = %u",
1367 		       dp_stats_buf->mu_mimo_sch_posted);
1368 	DP_PRINT_STATS("mu_mimo_sch_failed = %u",
1369 		       dp_stats_buf->mu_mimo_sch_failed);
1370 	DP_PRINT_STATS("mu_mimo_ppdu_posted = %u\n",
1371 		       dp_stats_buf->mu_mimo_ppdu_posted);
1372 }
1373 
1374 /*
1375  * dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv: display htt_tx_hwq_mu_mimo_mpdu_stats
1376  * @tag_buf: buffer containing the tlv htt_tx_hwq_mu_mimo_mpdu_stats_tlv
1377  *
1378  * return:void
1379  */
1380 static void dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv(uint32_t *tag_buf)
1381 {
1382 	htt_tx_hwq_mu_mimo_mpdu_stats_tlv *dp_stats_buf =
1383 		(htt_tx_hwq_mu_mimo_mpdu_stats_tlv *)tag_buf;
1384 
1385 	DP_PRINT_STATS("HTT_TX_HWQ_MU_MIMO_MPDU_STATS_TLV:");
1386 	DP_PRINT_STATS("mu_mimo_mpdus_queued_usr = %u",
1387 		       dp_stats_buf->mu_mimo_mpdus_queued_usr);
1388 	DP_PRINT_STATS("mu_mimo_mpdus_tried_usr = %u",
1389 		       dp_stats_buf->mu_mimo_mpdus_tried_usr);
1390 	DP_PRINT_STATS("mu_mimo_mpdus_failed_usr = %u",
1391 		       dp_stats_buf->mu_mimo_mpdus_failed_usr);
1392 	DP_PRINT_STATS("mu_mimo_mpdus_requeued_usr = %u",
1393 		       dp_stats_buf->mu_mimo_mpdus_requeued_usr);
1394 	DP_PRINT_STATS("mu_mimo_err_no_ba_usr = %u",
1395 		       dp_stats_buf->mu_mimo_err_no_ba_usr);
1396 	DP_PRINT_STATS("mu_mimo_mpdu_underrun_usr = %u",
1397 		       dp_stats_buf->mu_mimo_mpdu_underrun_usr);
1398 	DP_PRINT_STATS("mu_mimo_ampdu_underrun_usr = %u\n",
1399 		       dp_stats_buf->mu_mimo_ampdu_underrun_usr);
1400 }
1401 
1402 /*
1403  * dp_print_tx_hwq_mu_mimo_cmn_stats_tlv: display htt_tx_hwq_mu_mimo_cmn_stats
1404  * @tag_buf: buffer containing the tlv htt_tx_hwq_mu_mimo_cmn_stats_tlv
1405  *
1406  * return:void
1407  */
1408 static inline void dp_print_tx_hwq_mu_mimo_cmn_stats_tlv(uint32_t *tag_buf)
1409 {
1410 	htt_tx_hwq_mu_mimo_cmn_stats_tlv *dp_stats_buf =
1411 		(htt_tx_hwq_mu_mimo_cmn_stats_tlv *)tag_buf;
1412 
1413 	DP_PRINT_STATS("HTT_TX_HWQ_MU_MIMO_CMN_STATS_TLV:");
1414 	DP_PRINT_STATS("mac_id__hwq_id__word = %u\n",
1415 		       dp_stats_buf->mac_id__hwq_id__word);
1416 }
1417 
1418 /*
1419  * dp_print_tx_hwq_stats_cmn_tlv: display htt_tx_hwq_stats_cmn_tlv
1420  * @tag_buf: buffer containing the tlv htt_tx_hwq_stats_cmn_tlv
1421  *
1422  * return:void
1423  */
1424 static void dp_print_tx_hwq_stats_cmn_tlv(uint32_t *tag_buf)
1425 {
1426 	htt_tx_hwq_stats_cmn_tlv *dp_stats_buf =
1427 		(htt_tx_hwq_stats_cmn_tlv *)tag_buf;
1428 
1429 	DP_PRINT_STATS("HTT_TX_HWQ_STATS_CMN_TLV:");
1430 	DP_PRINT_STATS("mac_id__hwq_id__word = %u",
1431 		       dp_stats_buf->mac_id__hwq_id__word);
1432 	DP_PRINT_STATS("xretry = %u",
1433 		       dp_stats_buf->xretry);
1434 	DP_PRINT_STATS("underrun_cnt = %u",
1435 		       dp_stats_buf->underrun_cnt);
1436 	DP_PRINT_STATS("flush_cnt = %u",
1437 		       dp_stats_buf->flush_cnt);
1438 	DP_PRINT_STATS("filt_cnt = %u",
1439 		       dp_stats_buf->filt_cnt);
1440 	DP_PRINT_STATS("null_mpdu_bmap = %u",
1441 		       dp_stats_buf->null_mpdu_bmap);
1442 	DP_PRINT_STATS("user_ack_failure = %u",
1443 		       dp_stats_buf->user_ack_failure);
1444 	DP_PRINT_STATS("ack_tlv_proc = %u",
1445 		       dp_stats_buf->ack_tlv_proc);
1446 	DP_PRINT_STATS("sched_id_proc = %u",
1447 		       dp_stats_buf->sched_id_proc);
1448 	DP_PRINT_STATS("null_mpdu_tx_count = %u",
1449 		       dp_stats_buf->null_mpdu_tx_count);
1450 	DP_PRINT_STATS("mpdu_bmap_not_recvd = %u",
1451 		       dp_stats_buf->mpdu_bmap_not_recvd);
1452 	DP_PRINT_STATS("num_bar = %u",
1453 		       dp_stats_buf->num_bar);
1454 	DP_PRINT_STATS("rts = %u",
1455 		       dp_stats_buf->rts);
1456 	DP_PRINT_STATS("cts2self = %u",
1457 		       dp_stats_buf->cts2self);
1458 	DP_PRINT_STATS("qos_null = %u",
1459 		       dp_stats_buf->qos_null);
1460 	DP_PRINT_STATS("mpdu_tried_cnt = %u",
1461 		       dp_stats_buf->mpdu_tried_cnt);
1462 	DP_PRINT_STATS("mpdu_queued_cnt = %u",
1463 		       dp_stats_buf->mpdu_queued_cnt);
1464 	DP_PRINT_STATS("mpdu_ack_fail_cnt = %u",
1465 		       dp_stats_buf->mpdu_ack_fail_cnt);
1466 	DP_PRINT_STATS("mpdu_filt_cnt = %u",
1467 		       dp_stats_buf->mpdu_filt_cnt);
1468 	DP_PRINT_STATS("false_mpdu_ack_count = %u\n",
1469 		       dp_stats_buf->false_mpdu_ack_count);
1470 }
1471 
1472 /*
1473  * dp_print_tx_hwq_difs_latency_stats_tlv_v: display
1474  *					htt_tx_hwq_difs_latency_stats_tlv_v
1475  * @tag_buf: buffer containing the tlv htt_tx_hwq_difs_latency_stats_tlv_v
1476  *
1477  *return:void
1478  */
1479 static void dp_print_tx_hwq_difs_latency_stats_tlv_v(uint32_t *tag_buf)
1480 {
1481 	htt_tx_hwq_difs_latency_stats_tlv_v *dp_stats_buf =
1482 		(htt_tx_hwq_difs_latency_stats_tlv_v *)tag_buf;
1483 	uint8_t i;
1484 	uint16_t index = 0;
1485 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
1486 	char *difs_latency_hist = qdf_mem_malloc(DP_MAX_STRING_LEN);
1487 
1488 	if (!difs_latency_hist) {
1489 		dp_stats_err("Output buffer not allocated");
1490 		return;
1491 	}
1492 
1493 	tag_len = qdf_min(tag_len,
1494 			(uint32_t)HTT_TX_HWQ_MAX_DIFS_LATENCY_BINS);
1495 
1496 	DP_PRINT_STATS("HTT_TX_HWQ_DIFS_LATENCY_STATS_TLV_V:");
1497 	DP_PRINT_STATS("hist_intvl = %u",
1498 		       dp_stats_buf->hist_intvl);
1499 
1500 	for (i = 0; i <  tag_len; i++) {
1501 		index += qdf_snprint(&difs_latency_hist[index],
1502 				DP_MAX_STRING_LEN - index,
1503 				" %u:%u,", i,
1504 				dp_stats_buf->difs_latency_hist[i]);
1505 	}
1506 	DP_PRINT_STATS("difs_latency_hist = %s\n", difs_latency_hist);
1507 	qdf_mem_free(difs_latency_hist);
1508 }
1509 
1510 /*
1511  * dp_print_tx_hwq_cmd_result_stats_tlv_v: display htt_tx_hwq_cmd_result_stats
1512  * @tag_buf: buffer containing the tlv htt_tx_hwq_cmd_result_stats_tlv_v
1513  *
1514  * return:void
1515  */
1516 static void dp_print_tx_hwq_cmd_result_stats_tlv_v(uint32_t *tag_buf)
1517 {
1518 	htt_tx_hwq_cmd_result_stats_tlv_v *dp_stats_buf =
1519 		(htt_tx_hwq_cmd_result_stats_tlv_v *)tag_buf;
1520 	uint8_t i;
1521 	uint16_t index = 0;
1522 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
1523 	char *cmd_result = qdf_mem_malloc(DP_MAX_STRING_LEN);
1524 
1525 	if (!cmd_result) {
1526 		dp_stats_err("Output buffer not allocated");
1527 		return;
1528 	}
1529 
1530 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_HWQ_MAX_CMD_RESULT_STATS);
1531 
1532 	DP_PRINT_STATS("HTT_TX_HWQ_CMD_RESULT_STATS_TLV_V:");
1533 	for (i = 0; i <  tag_len; i++) {
1534 		index += qdf_snprint(&cmd_result[index],
1535 				DP_MAX_STRING_LEN - index,
1536 				" %u:%u,", i, dp_stats_buf->cmd_result[i]);
1537 	}
1538 	DP_PRINT_STATS("cmd_result = %s ", cmd_result);
1539 	qdf_mem_free(cmd_result);
1540 }
1541 
1542 /*
1543  * dp_print_tx_hwq_cmd_stall_stats_tlv_v: display htt_tx_hwq_cmd_stall_stats_tlv
1544  * @tag_buf: buffer containing the tlv htt_tx_hwq_cmd_stall_stats_tlv_v
1545  *
1546  * return:void
1547  */
1548 static void dp_print_tx_hwq_cmd_stall_stats_tlv_v(uint32_t *tag_buf)
1549 {
1550 	htt_tx_hwq_cmd_stall_stats_tlv_v *dp_stats_buf =
1551 		(htt_tx_hwq_cmd_stall_stats_tlv_v *)tag_buf;
1552 	uint8_t i;
1553 	uint16_t index = 0;
1554 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
1555 	char *cmd_stall_status = qdf_mem_malloc(DP_MAX_STRING_LEN);
1556 
1557 	if (!cmd_stall_status) {
1558 		dp_stats_err("Output buffer not allocated");
1559 		return;
1560 	}
1561 
1562 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_HWQ_MAX_CMD_STALL_STATS);
1563 
1564 	DP_PRINT_STATS("HTT_TX_HWQ_CMD_STALL_STATS_TLV_V:");
1565 	for (i = 0; i <  tag_len; i++) {
1566 		index += qdf_snprint(&cmd_stall_status[index],
1567 				DP_MAX_STRING_LEN - index,
1568 				" %u:%u,", i,
1569 				dp_stats_buf->cmd_stall_status[i]);
1570 	}
1571 	DP_PRINT_STATS("cmd_stall_status = %s\n", cmd_stall_status);
1572 	qdf_mem_free(cmd_stall_status);
1573 }
1574 
1575 /*
1576  * dp_print_tx_hwq_fes_result_stats_tlv_v: display htt_tx_hwq_fes_result_stats
1577  * @tag_buf: buffer containing the tlv htt_tx_hwq_fes_result_stats_tlv_v
1578  *
1579  * return:void
1580  */
1581 static void dp_print_tx_hwq_fes_result_stats_tlv_v(uint32_t *tag_buf)
1582 {
1583 	htt_tx_hwq_fes_result_stats_tlv_v *dp_stats_buf =
1584 		(htt_tx_hwq_fes_result_stats_tlv_v *)tag_buf;
1585 	uint8_t i;
1586 	uint16_t index = 0;
1587 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
1588 	char *fes_result = qdf_mem_malloc(DP_MAX_STRING_LEN);
1589 
1590 	if (!fes_result) {
1591 		dp_stats_err("Output buffer not allocated");
1592 		return;
1593 	}
1594 
1595 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_HWQ_MAX_FES_RESULT_STATS);
1596 
1597 	DP_PRINT_STATS("HTT_TX_HWQ_FES_RESULT_STATS_TLV_V:");
1598 	for (i = 0; i <  tag_len; i++) {
1599 		index += qdf_snprint(&fes_result[index],
1600 				DP_MAX_STRING_LEN - index,
1601 				" %u:%u,", i, dp_stats_buf->fes_result[i]);
1602 	}
1603 	DP_PRINT_STATS("fes_result = %s ", fes_result);
1604 	qdf_mem_free(fes_result);
1605 }
1606 
1607 /*
1608  * dp_print_tx_selfgen_cmn_stats_tlv: display htt_tx_selfgen_cmn_stats_tlv
1609  * @tag_buf: buffer containing the tlv htt_tx_selfgen_cmn_stats_tlv
1610  *
1611  * return:void
1612  */
1613 static void dp_print_tx_selfgen_cmn_stats_tlv(uint32_t *tag_buf)
1614 {
1615 	htt_tx_selfgen_cmn_stats_tlv *dp_stats_buf =
1616 		(htt_tx_selfgen_cmn_stats_tlv *)tag_buf;
1617 	DP_PRINT_STATS("HTT_TX_SELFGEN_CMN_STATS_TLV:");
1618 	DP_PRINT_STATS("mac_id__word = %u",
1619 		       dp_stats_buf->mac_id__word);
1620 	DP_PRINT_STATS("su_bar = %u",
1621 		       dp_stats_buf->su_bar);
1622 	DP_PRINT_STATS("rts = %u",
1623 		       dp_stats_buf->rts);
1624 	DP_PRINT_STATS("cts2self = %u",
1625 		       dp_stats_buf->cts2self);
1626 	DP_PRINT_STATS("qos_null = %u",
1627 		       dp_stats_buf->qos_null);
1628 	DP_PRINT_STATS("delayed_bar_1 = %u",
1629 		       dp_stats_buf->delayed_bar_1);
1630 	DP_PRINT_STATS("delayed_bar_2 = %u",
1631 		       dp_stats_buf->delayed_bar_2);
1632 	DP_PRINT_STATS("delayed_bar_3 = %u",
1633 		       dp_stats_buf->delayed_bar_3);
1634 	DP_PRINT_STATS("delayed_bar_4 = %u",
1635 		       dp_stats_buf->delayed_bar_4);
1636 	DP_PRINT_STATS("delayed_bar_5 = %u",
1637 		       dp_stats_buf->delayed_bar_5);
1638 	DP_PRINT_STATS("delayed_bar_6 = %u",
1639 		       dp_stats_buf->delayed_bar_6);
1640 	DP_PRINT_STATS("delayed_bar_7 = %u\n",
1641 		       dp_stats_buf->delayed_bar_7);
1642 }
1643 
1644 /*
1645  * dp_print_tx_selfgen_ac_stats_tlv: display htt_tx_selfgen_ac_stats_tlv
1646  * @tag_buf: buffer containing the tlv htt_tx_selfgen_ac_stats_tlv
1647  *
1648  * return:void
1649  */
1650 static void dp_print_tx_selfgen_ac_stats_tlv(uint32_t *tag_buf)
1651 {
1652 	htt_tx_selfgen_ac_stats_tlv *dp_stats_buf =
1653 		(htt_tx_selfgen_ac_stats_tlv *)tag_buf;
1654 
1655 	DP_PRINT_STATS("HTT_TX_SELFGEN_AC_STATS_TLV:");
1656 	DP_PRINT_STATS("ac_su_ndpa = %u",
1657 		       dp_stats_buf->ac_su_ndpa);
1658 	DP_PRINT_STATS("ac_su_ndp = %u",
1659 		       dp_stats_buf->ac_su_ndp);
1660 	DP_PRINT_STATS("ac_mu_mimo_ndpa = %u",
1661 		       dp_stats_buf->ac_mu_mimo_ndpa);
1662 	DP_PRINT_STATS("ac_mu_mimo_ndp = %u",
1663 		       dp_stats_buf->ac_mu_mimo_ndp);
1664 	DP_PRINT_STATS("ac_mu_mimo_brpoll_1 = %u",
1665 		       dp_stats_buf->ac_mu_mimo_brpoll_1);
1666 	DP_PRINT_STATS("ac_mu_mimo_brpoll_2 = %u",
1667 		       dp_stats_buf->ac_mu_mimo_brpoll_2);
1668 	DP_PRINT_STATS("ac_mu_mimo_brpoll_3 = %u\n",
1669 		       dp_stats_buf->ac_mu_mimo_brpoll_3);
1670 }
1671 
1672 /*
1673  * dp_print_tx_selfgen_ax_stats_tlv: display htt_tx_selfgen_ax_stats_tlv
1674  * @tag_buf: buffer containing the tlv htt_tx_selfgen_ax_stats_tlv
1675  *
1676  * return:void
1677  */
1678 static void dp_print_tx_selfgen_ax_stats_tlv(uint32_t *tag_buf)
1679 {
1680 	htt_tx_selfgen_ax_stats_tlv *dp_stats_buf =
1681 		(htt_tx_selfgen_ax_stats_tlv *)tag_buf;
1682 
1683 	DP_PRINT_STATS("HTT_TX_SELFGEN_AX_STATS_TLV:");
1684 	DP_PRINT_STATS("ax_su_ndpa = %u",
1685 		       dp_stats_buf->ax_su_ndpa);
1686 	DP_PRINT_STATS("ax_su_ndp = %u",
1687 		       dp_stats_buf->ax_su_ndp);
1688 	DP_PRINT_STATS("ax_mu_mimo_ndpa = %u",
1689 		       dp_stats_buf->ax_mu_mimo_ndpa);
1690 	DP_PRINT_STATS("ax_mu_mimo_ndp = %u",
1691 		       dp_stats_buf->ax_mu_mimo_ndp);
1692 	DP_PRINT_STATS("ax_mu_mimo_brpoll_1 = %u",
1693 		       dp_stats_buf->ax_mu_mimo_brpoll_1);
1694 	DP_PRINT_STATS("ax_mu_mimo_brpoll_2 = %u",
1695 		       dp_stats_buf->ax_mu_mimo_brpoll_2);
1696 	DP_PRINT_STATS("ax_mu_mimo_brpoll_3 = %u",
1697 		       dp_stats_buf->ax_mu_mimo_brpoll_3);
1698 	DP_PRINT_STATS("ax_mu_mimo_brpoll_4 = %u",
1699 		       dp_stats_buf->ax_mu_mimo_brpoll_4);
1700 	DP_PRINT_STATS("ax_mu_mimo_brpoll_5 = %u",
1701 		       dp_stats_buf->ax_mu_mimo_brpoll_5);
1702 	DP_PRINT_STATS("ax_mu_mimo_brpoll_6 = %u",
1703 		       dp_stats_buf->ax_mu_mimo_brpoll_6);
1704 	DP_PRINT_STATS("ax_mu_mimo_brpoll_7 = %u",
1705 		       dp_stats_buf->ax_mu_mimo_brpoll_7);
1706 	DP_PRINT_STATS("ax_basic_trigger = %u",
1707 		       dp_stats_buf->ax_basic_trigger);
1708 	DP_PRINT_STATS("ax_bsr_trigger = %u",
1709 		       dp_stats_buf->ax_bsr_trigger);
1710 	DP_PRINT_STATS("ax_mu_bar_trigger = %u",
1711 		       dp_stats_buf->ax_mu_bar_trigger);
1712 	DP_PRINT_STATS("ax_mu_rts_trigger = %u\n",
1713 		       dp_stats_buf->ax_mu_rts_trigger);
1714 }
1715 
1716 /*
1717  * dp_print_tx_selfgen_ac_err_stats_tlv: display htt_tx_selfgen_ac_err_stats_tlv
1718  * @tag_buf: buffer containing the tlv htt_tx_selfgen_ac_err_stats_tlv
1719  *
1720  * return:void
1721  */
1722 static void dp_print_tx_selfgen_ac_err_stats_tlv(uint32_t *tag_buf)
1723 {
1724 	htt_tx_selfgen_ac_err_stats_tlv *dp_stats_buf =
1725 		(htt_tx_selfgen_ac_err_stats_tlv *)tag_buf;
1726 
1727 	DP_PRINT_STATS("HTT_TX_SELFGEN_AC_ERR_STATS_TLV:");
1728 	DP_PRINT_STATS("ac_su_ndp_err = %u",
1729 		       dp_stats_buf->ac_su_ndp_err);
1730 	DP_PRINT_STATS("ac_su_ndpa_err = %u",
1731 		       dp_stats_buf->ac_su_ndpa_err);
1732 	DP_PRINT_STATS("ac_mu_mimo_ndpa_err = %u",
1733 		       dp_stats_buf->ac_mu_mimo_ndpa_err);
1734 	DP_PRINT_STATS("ac_mu_mimo_ndp_err = %u",
1735 		       dp_stats_buf->ac_mu_mimo_ndp_err);
1736 	DP_PRINT_STATS("ac_mu_mimo_brp1_err = %u",
1737 		       dp_stats_buf->ac_mu_mimo_brp1_err);
1738 	DP_PRINT_STATS("ac_mu_mimo_brp2_err = %u",
1739 		       dp_stats_buf->ac_mu_mimo_brp2_err);
1740 	DP_PRINT_STATS("ac_mu_mimo_brp3_err = %u\n",
1741 		       dp_stats_buf->ac_mu_mimo_brp3_err);
1742 }
1743 
1744 /* dp_print_tx_selfgen_be_err_stats_tlv: display htt_tx_selfgen_be_err_stats_tlv
1745  * @tag_buf: buffer containing the tlv htt_tx_selfgen_be_err_stats_tlv
1746  *
1747  * return:void
1748  */
1749 static void dp_print_tx_selfgen_be_err_stats_tlv(uint32_t *tag_buf)
1750 {
1751 	htt_tx_selfgen_be_err_stats_tlv *dp_stats_buf =
1752 		(htt_tx_selfgen_be_err_stats_tlv *)tag_buf;
1753 	uint16_t i;
1754 
1755 	DP_PRINT_STATS("HTT_TX_SELFGEN_BE_ERR_STATS_TLV:");
1756 	DP_PRINT_STATS("be_su_ndp_err = %u",
1757 		       dp_stats_buf->be_su_ndp_err);
1758 	DP_PRINT_STATS("be_su_ndpa_err = %u",
1759 		       dp_stats_buf->be_su_ndpa_err);
1760 	DP_PRINT_STATS("be_mu_mimo_ndpa_err = %u",
1761 		       dp_stats_buf->be_mu_mimo_ndpa_err);
1762 	DP_PRINT_STATS("be_mu_mimo_ndp_err = %u",
1763 		       dp_stats_buf->be_mu_mimo_ndp_err);
1764 	for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++)
1765 		DP_PRINT_STATS("be_mu_mimo_brp_err_%d: %u",
1766 			       i, dp_stats_buf->be_mu_mimo_brp_err[i]);
1767 	DP_PRINT_STATS("be_basic_trigger_err = %u",
1768 		       dp_stats_buf->be_basic_trigger_err);
1769 	DP_PRINT_STATS("be_bsr_trigger_err = %u",
1770 		       dp_stats_buf->be_bsr_trigger_err);
1771 	DP_PRINT_STATS("be_mu_bar_trigger_err = %u",
1772 		       dp_stats_buf->be_mu_bar_trigger_err);
1773 	DP_PRINT_STATS("be_mu_rts_trigger_err = %u",
1774 		       dp_stats_buf->be_mu_rts_trigger_err);
1775 	DP_PRINT_STATS("be_ulmumimo_trigger_err = %u",
1776 		       dp_stats_buf->be_ulmumimo_trigger_err);
1777 	for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++)
1778 		DP_PRINT_STATS("be_mu_mimo_brp_err_num_cbf_received _%d: %u", i,
1779 			       dp_stats_buf->be_mu_mimo_brp_err_num_cbf_received[i]);
1780 	DP_PRINT_STATS("be_su_ndpa_flushed = %u",
1781 		       dp_stats_buf->be_su_ndpa_flushed);
1782 	DP_PRINT_STATS("be_su_ndp_flushed = %u",
1783 		       dp_stats_buf->be_su_ndp_flushed);
1784 	DP_PRINT_STATS("be_mu_mimo_ndpa_flushed = %u",
1785 		       dp_stats_buf->be_mu_mimo_ndpa_flushed);
1786 	DP_PRINT_STATS("be_mu_mimo_ndp_flushed = %u",
1787 		       dp_stats_buf->be_mu_mimo_ndp_flushed);
1788 	for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++)
1789 		DP_PRINT_STATS("be_mu_mimo_brpoll_flushed_%d: %u",
1790 			       i, dp_stats_buf->be_mu_mimo_brpoll_flushed[i]);
1791 	for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++)
1792 		DP_PRINT_STATS("be_ul_mumimo_trigger_err_%d: %u",
1793 			       i, dp_stats_buf->be_ul_mumimo_trigger_err[i]);
1794 }
1795 
1796 /*
1797  * dp_print_tx_selfgen_be_stats_tlv: display htt_tx_selfgen_be_stats_tlv
1798  * @tag_buf: buffer containing the tlv htt_tx_selfgen_be_stats_tlv
1799  *
1800  * return:void
1801  */
1802 static void dp_print_tx_selfgen_be_stats_tlv(uint32_t *tag_buf)
1803 {
1804 	htt_tx_selfgen_be_stats_tlv *dp_stats_buf =
1805 		(htt_tx_selfgen_be_stats_tlv *)tag_buf;
1806 	uint16_t i;
1807 
1808 	DP_PRINT_STATS("HTT_TX_SELFGEN_BE_STATS_TLV:");
1809 	DP_PRINT_STATS("be_su_ndpa = %u",
1810 		       dp_stats_buf->be_su_ndpa);
1811 	DP_PRINT_STATS("be_su_ndp = %u",
1812 		       dp_stats_buf->be_su_ndp);
1813 	DP_PRINT_STATS("be_mu_mimo_ndpa = %u",
1814 		       dp_stats_buf->be_mu_mimo_ndpa);
1815 	DP_PRINT_STATS("be_mu_mimo_ndp = %u",
1816 		       dp_stats_buf->be_mu_mimo_ndp);
1817 	for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++)
1818 		DP_PRINT_STATS("be_mu_mimo_brpoll_%d = %u",
1819 			       i, dp_stats_buf->be_mu_mimo_brpoll[i]);
1820 	DP_PRINT_STATS("be_basic_trigger = %u",
1821 		       dp_stats_buf->be_basic_trigger);
1822 	DP_PRINT_STATS("be_bsr_trigger = %u",
1823 		       dp_stats_buf->be_bsr_trigger);
1824 	DP_PRINT_STATS("be_mu_bar_trigger = %u",
1825 		       dp_stats_buf->be_mu_bar_trigger);
1826 	DP_PRINT_STATS("be_mu_rts_trigger = %u",
1827 		       dp_stats_buf->be_mu_rts_trigger);
1828 	DP_PRINT_STATS("be_ulmumimo_trigger = %u",
1829 		       dp_stats_buf->be_ulmumimo_trigger);
1830 	DP_PRINT_STATS("be_su_ndpa_queued = %u",
1831 		       dp_stats_buf->be_su_ndpa_queued);
1832 	DP_PRINT_STATS("be_su_ndp_queued = %u",
1833 		       dp_stats_buf->be_su_ndp_queued);
1834 	DP_PRINT_STATS("be_mu_mimo_ndpa_queued = %u",
1835 		       dp_stats_buf->be_mu_mimo_ndpa_queued);
1836 	DP_PRINT_STATS("be_mu_mimo_ndp_queued = %u",
1837 		       dp_stats_buf->be_mu_mimo_ndp_queued);
1838 	for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++)
1839 		DP_PRINT_STATS("be_mu_mimo_brpoll_queued_%d = %u",
1840 			       i, dp_stats_buf->be_mu_mimo_brpoll_queued[i]);
1841 	for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++)
1842 		DP_PRINT_STATS("be_ul_mumimo_trigger_%d = %u",
1843 			       i, dp_stats_buf->be_ul_mumimo_trigger[i]);
1844 }
1845 
1846 /*
1847  * dp_print_tx_selfgen_ax_err_stats_tlv: display htt_tx_selfgen_ax_err_stats_tlv
1848  * @tag_buf: buffer containing the tlv htt_tx_selfgen_ax_err_stats_tlv
1849  *
1850  * return:void
1851  */
1852 static void dp_print_tx_selfgen_ax_err_stats_tlv(uint32_t *tag_buf)
1853 {
1854 	htt_tx_selfgen_ax_err_stats_tlv *dp_stats_buf =
1855 		(htt_tx_selfgen_ax_err_stats_tlv *)tag_buf;
1856 
1857 	DP_PRINT_STATS("HTT_TX_SELFGEN_AX_ERR_STATS_TLV:");
1858 	DP_PRINT_STATS("ax_su_ndp_err = %u",
1859 		       dp_stats_buf->ax_su_ndp_err);
1860 	DP_PRINT_STATS("ax_su_ndpa_err = %u",
1861 		       dp_stats_buf->ax_su_ndpa_err);
1862 	DP_PRINT_STATS("ax_mu_mimo_ndpa_err = %u",
1863 		       dp_stats_buf->ax_mu_mimo_ndpa_err);
1864 	DP_PRINT_STATS("ax_mu_mimo_ndp_err = %u",
1865 		       dp_stats_buf->ax_mu_mimo_ndp_err);
1866 	DP_PRINT_STATS("ax_mu_mimo_brp1_err = %u",
1867 		       dp_stats_buf->ax_mu_mimo_brp1_err);
1868 	DP_PRINT_STATS("ax_mu_mimo_brp2_err = %u",
1869 		       dp_stats_buf->ax_mu_mimo_brp2_err);
1870 	DP_PRINT_STATS("ax_mu_mimo_brp3_err = %u",
1871 		       dp_stats_buf->ax_mu_mimo_brp3_err);
1872 	DP_PRINT_STATS("ax_mu_mimo_brp4_err = %u",
1873 		       dp_stats_buf->ax_mu_mimo_brp4_err);
1874 	DP_PRINT_STATS("ax_mu_mimo_brp5_err = %u",
1875 		       dp_stats_buf->ax_mu_mimo_brp5_err);
1876 	DP_PRINT_STATS("ax_mu_mimo_brp6_err = %u",
1877 		       dp_stats_buf->ax_mu_mimo_brp6_err);
1878 	DP_PRINT_STATS("ax_mu_mimo_brp7_err = %u",
1879 		       dp_stats_buf->ax_mu_mimo_brp7_err);
1880 	DP_PRINT_STATS("ax_basic_trigger_err = %u",
1881 		       dp_stats_buf->ax_basic_trigger_err);
1882 	DP_PRINT_STATS("ax_bsr_trigger_err = %u",
1883 		       dp_stats_buf->ax_bsr_trigger_err);
1884 	DP_PRINT_STATS("ax_mu_bar_trigger_err = %u",
1885 		       dp_stats_buf->ax_mu_bar_trigger_err);
1886 	DP_PRINT_STATS("ax_mu_rts_trigger_err = %u\n",
1887 		       dp_stats_buf->ax_mu_rts_trigger_err);
1888 }
1889 
1890 /*
1891  * dp_print_tx_sounding_stats_tlv: display htt_tx_sounding_stats_tlv
1892  * @tag_buf: buffer containing the tlv htt_tx_soundig_stats_tlv
1893  *
1894  * return:void
1895  */
1896 static void dp_print_tx_sounding_stats_tlv(uint32_t *tag_buf)
1897 {
1898 	htt_tx_sounding_stats_tlv *dp_stats_buf =
1899 		(htt_tx_sounding_stats_tlv *)tag_buf;
1900 	uint16_t i;
1901 	uint16_t max_bw = HTT_TX_PDEV_STATS_NUM_BW_COUNTERS;
1902 
1903 	switch (dp_stats_buf->tx_sounding_mode) {
1904 	case HTT_TX_AC_SOUNDING_MODE:
1905 		DP_PRINT_STATS("\n HTT_TX_AC_SOUNDING_STATS_TLV: ");
1906 		DP_PRINT_STATS("ac_cbf_20 =  IBF : %d, SU_SIFS : %d, "
1907 			"SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
1908 			dp_stats_buf->cbf_20[0], dp_stats_buf->cbf_20[1],
1909 			dp_stats_buf->cbf_20[2], dp_stats_buf->cbf_20[3],
1910 			dp_stats_buf->cbf_20[4]);
1911 		DP_PRINT_STATS("ac_cbf_40 =  IBF : %d, SU_SIFS : %d, "
1912 			"SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
1913 			dp_stats_buf->cbf_40[0], dp_stats_buf->cbf_40[1],
1914 			dp_stats_buf->cbf_40[2], dp_stats_buf->cbf_40[3],
1915 			dp_stats_buf->cbf_40[4]);
1916 		DP_PRINT_STATS("ac_cbf_80 =  IBF : %d, SU_SIFS : %d, "
1917 			"SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
1918 			dp_stats_buf->cbf_80[0], dp_stats_buf->cbf_80[1],
1919 			dp_stats_buf->cbf_80[2], dp_stats_buf->cbf_80[3],
1920 			dp_stats_buf->cbf_80[4]);
1921 		DP_PRINT_STATS("ac_cbf_160 =  IBF : %d, SU_SIFS : %d, "
1922 			"SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
1923 			dp_stats_buf->cbf_160[0], dp_stats_buf->cbf_160[1],
1924 			dp_stats_buf->cbf_160[2], dp_stats_buf->cbf_160[3],
1925 			dp_stats_buf->cbf_160[4]);
1926 		for (i = 0;
1927 		     i < HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS;
1928 		     i++) {
1929 				DP_PRINT_STATS("Sounding User %d = 20MHz: %d, "
1930 				       "40MHz : %d, 80MHz: %d, 160MHz: %d", i,
1931 				dp_stats_buf->sounding[(i * max_bw) + 0],
1932 				dp_stats_buf->sounding[(i * max_bw) + 1],
1933 				dp_stats_buf->sounding[(i * max_bw) + 2],
1934 				dp_stats_buf->sounding[(i * max_bw) + 3]);
1935 		}
1936 		break;
1937 	case HTT_TX_AX_SOUNDING_MODE:
1938 		DP_PRINT_STATS("\n HTT_TX_AX_SOUNDING_STATS_TLV: ");
1939 		DP_PRINT_STATS("ax_cbf_20 =  IBF : %d, SU_SIFS : %d, "
1940 			"SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
1941 			dp_stats_buf->cbf_20[0], dp_stats_buf->cbf_20[1],
1942 			dp_stats_buf->cbf_20[2], dp_stats_buf->cbf_20[3],
1943 			dp_stats_buf->cbf_20[4]);
1944 		DP_PRINT_STATS("ax_cbf_40 =  IBF : %d, SU_SIFS : %d, "
1945 			"SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
1946 			dp_stats_buf->cbf_40[0], dp_stats_buf->cbf_40[1],
1947 			dp_stats_buf->cbf_40[2], dp_stats_buf->cbf_40[3],
1948 			dp_stats_buf->cbf_40[4]);
1949 		DP_PRINT_STATS("ax_cbf_80 =  IBF : %d, SU_SIFS : %d, "
1950 			"SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
1951 			dp_stats_buf->cbf_80[0], dp_stats_buf->cbf_80[1],
1952 			dp_stats_buf->cbf_80[2], dp_stats_buf->cbf_80[3],
1953 			dp_stats_buf->cbf_80[4]);
1954 		DP_PRINT_STATS("ax_cbf_160 =  IBF : %d, SU_SIFS : %d, "
1955 			"SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
1956 			dp_stats_buf->cbf_160[0], dp_stats_buf->cbf_160[1],
1957 			dp_stats_buf->cbf_160[2], dp_stats_buf->cbf_160[3],
1958 			dp_stats_buf->cbf_160[4]);
1959 		for (i = 0;
1960 		     i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS;
1961 		     i++) {
1962 			DP_PRINT_STATS("Sounding User %d = 20MHz: %d, "
1963 				       "40MHz : %d, 80MHz: %d, 160MHz: %d", i,
1964 				dp_stats_buf->sounding[(i * max_bw) + 0],
1965 				dp_stats_buf->sounding[(i * max_bw) + 1],
1966 				dp_stats_buf->sounding[(i * max_bw) + 2],
1967 				dp_stats_buf->sounding[(i * max_bw) + 3]);
1968 		}
1969 		break;
1970 	case HTT_TX_BE_SOUNDING_MODE:
1971 		DP_PRINT_STATS("\n HTT_TX_BE_SOUNDING_STATS_TLV: ");
1972 		DP_PRINT_STATS("be_cbf_20 =  IBF : %d, SU_SIFS : %d, "
1973 			"SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
1974 			dp_stats_buf->cbf_20[0], dp_stats_buf->cbf_20[1],
1975 			dp_stats_buf->cbf_20[2], dp_stats_buf->cbf_20[3],
1976 			dp_stats_buf->cbf_20[4]);
1977 		DP_PRINT_STATS("be_cbf_40 =  IBF : %d, SU_SIFS : %d, "
1978 			"SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
1979 			dp_stats_buf->cbf_40[0], dp_stats_buf->cbf_40[1],
1980 			dp_stats_buf->cbf_40[2], dp_stats_buf->cbf_40[3],
1981 			dp_stats_buf->cbf_40[4]);
1982 		DP_PRINT_STATS("be_cbf_80 =  IBF : %d, SU_SIFS : %d, "
1983 			"SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
1984 			dp_stats_buf->cbf_80[0], dp_stats_buf->cbf_80[1],
1985 			dp_stats_buf->cbf_80[2], dp_stats_buf->cbf_80[3],
1986 			dp_stats_buf->cbf_80[4]);
1987 		DP_PRINT_STATS("be_cbf_160 =  IBF : %d, SU_SIFS : %d, "
1988 			"SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
1989 			dp_stats_buf->cbf_160[0], dp_stats_buf->cbf_160[1],
1990 			dp_stats_buf->cbf_160[2], dp_stats_buf->cbf_160[3],
1991 			dp_stats_buf->cbf_160[4]);
1992 		DP_PRINT_STATS("be_cbf_320 =  IBF : %d, SU_SIFS : %d, "
1993 			"SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
1994 			dp_stats_buf->cbf_320[0], dp_stats_buf->cbf_320[1],
1995 			dp_stats_buf->cbf_320[2], dp_stats_buf->cbf_320[3],
1996 			dp_stats_buf->cbf_320[4]);
1997 		for (i = 0;
1998 		     i < HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS;
1999 		     i++) {
2000 			DP_PRINT_STATS("Sounding User %d = 20MHz: %d, "
2001 				       "40MHz : %d, 80MHz: %d, 160MHz: %d, "
2002 				       "320MHz: %d", i,
2003 				dp_stats_buf->sounding[(i * max_bw) + 0],
2004 				dp_stats_buf->sounding[(i * max_bw) + 1],
2005 				dp_stats_buf->sounding[(i * max_bw) + 2],
2006 				dp_stats_buf->sounding[(i * max_bw) + 3],
2007 				dp_stats_buf->sounding_320[i]);
2008 		}
2009 		break;
2010 	case HTT_TX_CMN_SOUNDING_MODE:
2011 		DP_PRINT_STATS("\n CV UPLOAD HANDLER STATS:");
2012 		DP_PRINT_STATS("cv_nc_mismatch_err         : %u",
2013 			       dp_stats_buf->cv_nc_mismatch_err);
2014 		DP_PRINT_STATS("cv_fcs_err                 : %u",
2015 			       dp_stats_buf->cv_fcs_err);
2016 		DP_PRINT_STATS("cv_frag_idx_mismatch       : %u",
2017 			       dp_stats_buf->cv_frag_idx_mismatch);
2018 		DP_PRINT_STATS("cv_invalid_peer_id         : %u",
2019 			       dp_stats_buf->cv_invalid_peer_id);
2020 		DP_PRINT_STATS("cv_no_txbf_setup           : %u",
2021 			       dp_stats_buf->cv_no_txbf_setup);
2022 		DP_PRINT_STATS("cv_expiry_in_update        : %u",
2023 			       dp_stats_buf->cv_expiry_in_update);
2024 		DP_PRINT_STATS("cv_pkt_bw_exceed           : %u",
2025 			       dp_stats_buf->cv_pkt_bw_exceed);
2026 		DP_PRINT_STATS("cv_dma_not_done_err        : %u",
2027 			       dp_stats_buf->cv_dma_not_done_err);
2028 		DP_PRINT_STATS("cv_update_failed           : %u\n",
2029 			       dp_stats_buf->cv_update_failed);
2030 
2031 		DP_PRINT_STATS("\n CV QUERY STATS:");
2032 		DP_PRINT_STATS("cv_total_query             : %u",
2033 			       dp_stats_buf->cv_total_query);
2034 		DP_PRINT_STATS("cv_total_pattern_query     : %u",
2035 			       dp_stats_buf->cv_total_pattern_query);
2036 		DP_PRINT_STATS("cv_total_bw_query          : %u",
2037 			       dp_stats_buf->cv_total_bw_query);
2038 		DP_PRINT_STATS("cv_total_query             : %u",
2039 			       dp_stats_buf->cv_total_query);
2040 		DP_PRINT_STATS("cv_invalid_bw_coding       : %u",
2041 			       dp_stats_buf->cv_invalid_bw_coding);
2042 		DP_PRINT_STATS("cv_forced_sounding         : %u",
2043 			       dp_stats_buf->cv_forced_sounding);
2044 		DP_PRINT_STATS("cv_standalone_sounding     : %u",
2045 			       dp_stats_buf->cv_standalone_sounding);
2046 		DP_PRINT_STATS("cv_nc_mismatch             : %u",
2047 			       dp_stats_buf->cv_nc_mismatch);
2048 		DP_PRINT_STATS("cv_fb_type_mismatch        : %u",
2049 			       dp_stats_buf->cv_fb_type_mismatch);
2050 		DP_PRINT_STATS("cv_ofdma_bw_mismatch       : %u",
2051 			       dp_stats_buf->cv_ofdma_bw_mismatch);
2052 		DP_PRINT_STATS("cv_bw_mismatch             : %u",
2053 			       dp_stats_buf->cv_bw_mismatch);
2054 		DP_PRINT_STATS("cv_pattern_mismatch        : %u",
2055 			       dp_stats_buf->cv_pattern_mismatch);
2056 		DP_PRINT_STATS("cv_preamble_mismatch       : %u",
2057 			       dp_stats_buf->cv_preamble_mismatch);
2058 		DP_PRINT_STATS("cv_nr_mismatch             : %u",
2059 			       dp_stats_buf->cv_nr_mismatch);
2060 		DP_PRINT_STATS("cv_in_use_cnt_exceeded     : %u",
2061 			       dp_stats_buf->cv_in_use_cnt_exceeded);
2062 		DP_PRINT_STATS("cv_found                   : %u",
2063 			       dp_stats_buf->cv_found);
2064 		DP_PRINT_STATS("cv_not found               : %u",
2065 			       dp_stats_buf->cv_not_found);
2066 		DP_PRINT_STATS("cv_ntbr_sounding           : %u",
2067 			       dp_stats_buf->cv_ntbr_sounding);
2068 		DP_PRINT_STATS("cv_found_upload_in_progress: %u",
2069 			       dp_stats_buf->cv_found_upload_in_progress);
2070 		DP_PRINT_STATS("cv_expired_during_query    : %u\n",
2071 			       dp_stats_buf->cv_expired_during_query);
2072 		break;
2073 	default:
2074 		break;
2075 
2076 	}
2077 }
2078 
2079 /*
2080  * dp_print_tx_pdev_mu_mimo_sch_stats_tlv: display htt_tx_pdev_mu_mimo_sch_stats
2081  * @tag_buf: buffer containing the tlv htt_tx_pdev_mu_mimo_sch_stats_tlv
2082  *
2083  * return:void
2084  */
2085 static void dp_print_tx_pdev_mu_mimo_sch_stats_tlv(uint32_t *tag_buf)
2086 {
2087 	uint8_t i;
2088 	htt_tx_pdev_mu_mimo_sch_stats_tlv *dp_stats_buf =
2089 		(htt_tx_pdev_mu_mimo_sch_stats_tlv *)tag_buf;
2090 
2091 	DP_PRINT_STATS("HTT_TX_PDEV_MU_MIMO_SCH_STATS_TLV:");
2092 	DP_PRINT_STATS("mu_mimo_sch_posted = %u",
2093 		       dp_stats_buf->mu_mimo_sch_posted);
2094 	DP_PRINT_STATS("mu_mimo_sch_failed = %u",
2095 		       dp_stats_buf->mu_mimo_sch_failed);
2096 	DP_PRINT_STATS("mu_mimo_ppdu_posted = %u\n",
2097 		       dp_stats_buf->mu_mimo_ppdu_posted);
2098 
2099 	DP_PRINT_STATS("11ac MU_MIMO SCH STATS:");
2100 
2101 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS; i++) {
2102 		DP_PRINT_STATS("ac_mu_mimo_sch_nusers_%u = %u", i,
2103 			       dp_stats_buf->ac_mu_mimo_sch_nusers[i]);
2104 	}
2105 
2106 	DP_PRINT_STATS("\n11ax MU_MIMO SCH STATS:");
2107 
2108 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; i++) {
2109 		DP_PRINT_STATS("ax_mu_mimo_sch_nusers_%u = %u", i,
2110 			       dp_stats_buf->ax_mu_mimo_sch_nusers[i]);
2111 	}
2112 
2113 	DP_PRINT_STATS("\n11ax OFDMA SCH STATS:");
2114 
2115 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; i++) {
2116 		DP_PRINT_STATS("ax_ofdma_sch_nusers_%u = %u", i,
2117 			       dp_stats_buf->ax_ofdma_sch_nusers[i]);
2118 	}
2119 }
2120 
2121 /*
2122  * dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv: display
2123  *				htt_tx_pdev_mu_mimo_mpdu_stats_tlv
2124  * @tag_buf: buffer containing the tlv htt_tx_pdev_mu_mimo_mpdu_stats_tlv
2125  *
2126  * return:void
2127  */
2128 static void dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv(uint32_t *tag_buf)
2129 {
2130 	htt_tx_pdev_mpdu_stats_tlv *dp_stats_buf =
2131 		(htt_tx_pdev_mpdu_stats_tlv *)tag_buf;
2132 
2133 	if (dp_stats_buf->tx_sched_mode ==
2134 			HTT_STATS_TX_SCHED_MODE_MU_MIMO_AC) {
2135 		if (!dp_stats_buf->user_index)
2136 			DP_PRINT_STATS(
2137 				       "HTT_TX_PDEV_MU_MIMO_AC_MPDU_STATS:\n");
2138 
2139 		if (dp_stats_buf->user_index <
2140 			HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS) {
2141 			DP_PRINT_STATS(
2142 				       "ac_mu_mimo_mpdus_queued_usr_%u = %u",
2143 				       dp_stats_buf->user_index,
2144 				       dp_stats_buf->mpdus_queued_usr);
2145 			DP_PRINT_STATS(
2146 				       "ac_mu_mimo_mpdus_tried_usr_%u = %u",
2147 				       dp_stats_buf->user_index,
2148 				       dp_stats_buf->mpdus_tried_usr);
2149 			DP_PRINT_STATS(
2150 				       "ac_mu_mimo_mpdus_failed_usr_%u = %u",
2151 				       dp_stats_buf->user_index,
2152 				       dp_stats_buf->mpdus_failed_usr);
2153 			DP_PRINT_STATS(
2154 				       "ac_mu_mimo_mpdus_requeued_usr_%u = %u",
2155 				       dp_stats_buf->user_index,
2156 				       dp_stats_buf->mpdus_requeued_usr);
2157 			DP_PRINT_STATS(
2158 				       "ac_mu_mimo_err_no_ba_usr_%u = %u",
2159 				       dp_stats_buf->user_index,
2160 				       dp_stats_buf->err_no_ba_usr);
2161 			DP_PRINT_STATS(
2162 				       "ac_mu_mimo_mpdu_underrun_usr_%u = %u",
2163 				       dp_stats_buf->user_index,
2164 				       dp_stats_buf->mpdu_underrun_usr);
2165 			DP_PRINT_STATS(
2166 				       "ac_mu_mimo_ampdu_underrun_usr_%u = %u\n",
2167 				       dp_stats_buf->user_index,
2168 				       dp_stats_buf->ampdu_underrun_usr);
2169 		}
2170 	}
2171 
2172 	if (dp_stats_buf->tx_sched_mode == HTT_STATS_TX_SCHED_MODE_MU_MIMO_AX) {
2173 		if (!dp_stats_buf->user_index)
2174 			DP_PRINT_STATS(
2175 				       "HTT_TX_PDEV_MU_MIMO_AX_MPDU_STATS:\n");
2176 
2177 		if (dp_stats_buf->user_index <
2178 				HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS) {
2179 			DP_PRINT_STATS(
2180 				       "ax_mu_mimo_mpdus_queued_usr_%u = %u",
2181 				       dp_stats_buf->user_index,
2182 				       dp_stats_buf->mpdus_queued_usr);
2183 			DP_PRINT_STATS(
2184 				       "ax_mu_mimo_mpdus_tried_usr_%u = %u",
2185 				       dp_stats_buf->user_index,
2186 				       dp_stats_buf->mpdus_tried_usr);
2187 			DP_PRINT_STATS(
2188 				       "ax_mu_mimo_mpdus_failed_usr_%u = %u",
2189 				       dp_stats_buf->user_index,
2190 				       dp_stats_buf->mpdus_failed_usr);
2191 			DP_PRINT_STATS(
2192 				       "ax_mu_mimo_mpdus_requeued_usr_%u = %u",
2193 				       dp_stats_buf->user_index,
2194 				       dp_stats_buf->mpdus_requeued_usr);
2195 			DP_PRINT_STATS(
2196 				       "ax_mu_mimo_err_no_ba_usr_%u = %u",
2197 				       dp_stats_buf->user_index,
2198 				       dp_stats_buf->err_no_ba_usr);
2199 			DP_PRINT_STATS(
2200 				       "ax_mu_mimo_mpdu_underrun_usr_%u = %u",
2201 				       dp_stats_buf->user_index,
2202 				       dp_stats_buf->mpdu_underrun_usr);
2203 			DP_PRINT_STATS(
2204 				       "ax_mu_mimo_ampdu_underrun_usr_%u = %u\n",
2205 				       dp_stats_buf->user_index,
2206 				       dp_stats_buf->ampdu_underrun_usr);
2207 		}
2208 	}
2209 
2210 	if (dp_stats_buf->tx_sched_mode ==
2211 			HTT_STATS_TX_SCHED_MODE_MU_OFDMA_AX) {
2212 		if (!dp_stats_buf->user_index)
2213 			DP_PRINT_STATS(
2214 				       "HTT_TX_PDEV_AX_MU_OFDMA_MPDU_STATS:\n");
2215 
2216 		if (dp_stats_buf->user_index <
2217 				HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS) {
2218 			DP_PRINT_STATS(
2219 				       "ax_mu_ofdma_mpdus_queued_usr_%u = %u",
2220 				       dp_stats_buf->user_index,
2221 				       dp_stats_buf->mpdus_queued_usr);
2222 			DP_PRINT_STATS(
2223 				       "ax_mu_ofdma_mpdus_tried_usr_%u = %u",
2224 				       dp_stats_buf->user_index,
2225 				       dp_stats_buf->mpdus_tried_usr);
2226 			DP_PRINT_STATS(
2227 				       "ax_mu_ofdma_mpdus_failed_usr_%u = %u",
2228 				       dp_stats_buf->user_index,
2229 				       dp_stats_buf->mpdus_failed_usr);
2230 			DP_PRINT_STATS(
2231 				       "ax_mu_ofdma_mpdus_requeued_usr_%u = %u",
2232 				       dp_stats_buf->user_index,
2233 				       dp_stats_buf->mpdus_requeued_usr);
2234 			DP_PRINT_STATS(
2235 				       "ax_mu_ofdma_err_no_ba_usr_%u = %u",
2236 				       dp_stats_buf->user_index,
2237 				       dp_stats_buf->err_no_ba_usr);
2238 			DP_PRINT_STATS(
2239 				       "ax_mu_ofdma_mpdu_underrun_usr_%u = %u",
2240 				       dp_stats_buf->user_index,
2241 				       dp_stats_buf->mpdu_underrun_usr);
2242 			DP_PRINT_STATS(
2243 				       "ax_mu_ofdma_ampdu_underrun_usr_%u = %u\n",
2244 				       dp_stats_buf->user_index,
2245 				       dp_stats_buf->ampdu_underrun_usr);
2246 		}
2247 	}
2248 }
2249 
2250 /*
2251  * dp_print_sched_txq_cmd_posted_tlv_v: display htt_sched_txq_cmd_posted_tlv_v
2252  * @tag_buf: buffer containing the tlv htt_sched_txq_cmd_posted_tlv_v
2253  *
2254  * return:void
2255  */
2256 static void dp_print_sched_txq_cmd_posted_tlv_v(uint32_t *tag_buf)
2257 {
2258 	htt_sched_txq_cmd_posted_tlv_v *dp_stats_buf =
2259 		(htt_sched_txq_cmd_posted_tlv_v *)tag_buf;
2260 	uint8_t i;
2261 	uint16_t index = 0;
2262 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
2263 	char *sched_cmd_posted = qdf_mem_malloc(DP_MAX_STRING_LEN);
2264 
2265 	if (!sched_cmd_posted) {
2266 		dp_stats_err("Output buffer not allocated");
2267 		return;
2268 	}
2269 
2270 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_SCHED_TX_MODE_MAX);
2271 
2272 	DP_PRINT_STATS("HTT_SCHED_TXQ_CMD_POSTED_TLV_V:");
2273 	for (i = 0; i <  tag_len; i++) {
2274 		index += qdf_snprint(&sched_cmd_posted[index],
2275 				DP_MAX_STRING_LEN - index,
2276 				" %u:%u,", i,
2277 				dp_stats_buf->sched_cmd_posted[i]);
2278 	}
2279 	DP_PRINT_STATS("sched_cmd_posted = %s\n", sched_cmd_posted);
2280 	qdf_mem_free(sched_cmd_posted);
2281 }
2282 
2283 /*
2284  * dp_print_sched_txq_cmd_reaped_tlv_v: display htt_sched_txq_cmd_reaped_tlv_v
2285  * @tag_buf: buffer containing the tlv htt_sched_txq_cmd_reaped_tlv_v
2286  *
2287  * return:void
2288  */
2289 static void dp_print_sched_txq_cmd_reaped_tlv_v(uint32_t *tag_buf)
2290 {
2291 	htt_sched_txq_cmd_reaped_tlv_v *dp_stats_buf =
2292 		(htt_sched_txq_cmd_reaped_tlv_v *)tag_buf;
2293 	uint8_t i;
2294 	uint16_t index = 0;
2295 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
2296 	char *sched_cmd_reaped = qdf_mem_malloc(DP_MAX_STRING_LEN);
2297 
2298 	if (!sched_cmd_reaped) {
2299 		dp_stats_err("Output buffer not allocated");
2300 		return;
2301 	}
2302 
2303 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_SCHED_TX_MODE_MAX);
2304 
2305 	DP_PRINT_STATS("HTT_SCHED_TXQ_CMD_REAPED_TLV_V:");
2306 	for (i = 0; i <  tag_len; i++) {
2307 		index += qdf_snprint(&sched_cmd_reaped[index],
2308 				DP_MAX_STRING_LEN - index,
2309 				" %u:%u,", i,
2310 				dp_stats_buf->sched_cmd_reaped[i]);
2311 	}
2312 	DP_PRINT_STATS("sched_cmd_reaped = %s\n", sched_cmd_reaped);
2313 	qdf_mem_free(sched_cmd_reaped);
2314 }
2315 
2316 /*
2317  * dp_print_tx_pdev_stats_sched_per_txq_tlv: display
2318  *				htt_tx_pdev_stats_sched_per_txq_tlv
2319  * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_sched_per_txq_tlv
2320  *
2321  * return:void
2322  */
2323 static void dp_print_tx_pdev_stats_sched_per_txq_tlv(uint32_t *tag_buf)
2324 {
2325 	htt_tx_pdev_stats_sched_per_txq_tlv *dp_stats_buf =
2326 		(htt_tx_pdev_stats_sched_per_txq_tlv *)tag_buf;
2327 
2328 	DP_PRINT_STATS("HTT_TX_PDEV_STATS_SCHED_PER_TXQ_TLV:");
2329 	DP_PRINT_STATS("mac_id__txq_id__word = %u",
2330 		       dp_stats_buf->mac_id__txq_id__word);
2331 	DP_PRINT_STATS("sched_policy = %u",
2332 		       dp_stats_buf->sched_policy);
2333 	DP_PRINT_STATS("last_sched_cmd_posted_timestamp = %u",
2334 		       dp_stats_buf->last_sched_cmd_posted_timestamp);
2335 	DP_PRINT_STATS("last_sched_cmd_compl_timestamp = %u",
2336 		       dp_stats_buf->last_sched_cmd_compl_timestamp);
2337 	DP_PRINT_STATS("sched_2_tac_lwm_count = %u",
2338 		       dp_stats_buf->sched_2_tac_lwm_count);
2339 	DP_PRINT_STATS("sched_2_tac_ring_full = %u",
2340 		       dp_stats_buf->sched_2_tac_ring_full);
2341 	DP_PRINT_STATS("sched_cmd_post_failure = %u",
2342 		       dp_stats_buf->sched_cmd_post_failure);
2343 	DP_PRINT_STATS("num_active_tids = %u",
2344 		       dp_stats_buf->num_active_tids);
2345 	DP_PRINT_STATS("num_ps_schedules = %u",
2346 		       dp_stats_buf->num_ps_schedules);
2347 	DP_PRINT_STATS("sched_cmds_pending = %u",
2348 		       dp_stats_buf->sched_cmds_pending);
2349 	DP_PRINT_STATS("num_tid_register = %u",
2350 		       dp_stats_buf->num_tid_register);
2351 	DP_PRINT_STATS("num_tid_unregister = %u",
2352 		       dp_stats_buf->num_tid_unregister);
2353 	DP_PRINT_STATS("num_qstats_queried = %u",
2354 		       dp_stats_buf->num_qstats_queried);
2355 	DP_PRINT_STATS("qstats_update_pending = %u",
2356 		       dp_stats_buf->qstats_update_pending);
2357 	DP_PRINT_STATS("last_qstats_query_timestamp = %u",
2358 		       dp_stats_buf->last_qstats_query_timestamp);
2359 	DP_PRINT_STATS("num_tqm_cmdq_full = %u",
2360 		       dp_stats_buf->num_tqm_cmdq_full);
2361 	DP_PRINT_STATS("num_de_sched_algo_trigger = %u",
2362 		       dp_stats_buf->num_de_sched_algo_trigger);
2363 	DP_PRINT_STATS("num_rt_sched_algo_trigger = %u",
2364 		       dp_stats_buf->num_rt_sched_algo_trigger);
2365 	DP_PRINT_STATS("num_tqm_sched_algo_trigger = %u",
2366 		       dp_stats_buf->num_tqm_sched_algo_trigger);
2367 	DP_PRINT_STATS("notify_sched = %u\n",
2368 		       dp_stats_buf->notify_sched);
2369 }
2370 
2371 /*
2372  * dp_print_stats_tx_sched_cmn_tlv: display htt_stats_tx_sched_cmn_tlv
2373  * @tag_buf: buffer containing the tlv htt_stats_tx_sched_cmn_tlv
2374  *
2375  * return:void
2376  */
2377 static void dp_print_stats_tx_sched_cmn_tlv(uint32_t *tag_buf)
2378 {
2379 	htt_stats_tx_sched_cmn_tlv *dp_stats_buf =
2380 		(htt_stats_tx_sched_cmn_tlv *)tag_buf;
2381 
2382 	DP_PRINT_STATS("HTT_STATS_TX_SCHED_CMN_TLV:");
2383 	DP_PRINT_STATS("mac_id__word = %u",
2384 		       dp_stats_buf->mac_id__word);
2385 	DP_PRINT_STATS("current_timestamp = %u\n",
2386 		       dp_stats_buf->current_timestamp);
2387 }
2388 
2389 /*
2390  * dp_print_tx_tqm_gen_mpdu_stats_tlv_v: display htt_tx_tqm_gen_mpdu_stats_tlv_v
2391  * @tag_buf: buffer containing the tlv htt_tx_tqm_gen_mpdu_stats_tlv_v
2392  *
2393  * return:void
2394  */
2395 static void dp_print_tx_tqm_gen_mpdu_stats_tlv_v(uint32_t *tag_buf)
2396 {
2397 	htt_tx_tqm_gen_mpdu_stats_tlv_v *dp_stats_buf =
2398 		(htt_tx_tqm_gen_mpdu_stats_tlv_v *)tag_buf;
2399 	uint8_t i;
2400 	uint16_t index = 0;
2401 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
2402 	char *gen_mpdu_end_reason = qdf_mem_malloc(DP_MAX_STRING_LEN);
2403 
2404 	if (!gen_mpdu_end_reason) {
2405 		dp_stats_err("Output buffer not allocated");
2406 		return;
2407 	}
2408 
2409 	tag_len = qdf_min(tag_len,
2410 			(uint32_t)HTT_TX_TQM_MAX_GEN_MPDU_END_REASON);
2411 
2412 	DP_PRINT_STATS("HTT_TX_TQM_GEN_MPDU_STATS_TLV_V:");
2413 	for (i = 0; i <  tag_len; i++) {
2414 		index += qdf_snprint(&gen_mpdu_end_reason[index],
2415 				DP_MAX_STRING_LEN - index,
2416 				" %u:%u,", i,
2417 				dp_stats_buf->gen_mpdu_end_reason[i]);
2418 	}
2419 	DP_PRINT_STATS("gen_mpdu_end_reason = %s\n", gen_mpdu_end_reason);
2420 	qdf_mem_free(gen_mpdu_end_reason);
2421 }
2422 
2423 /*
2424  * dp_print_tx_tqm_list_mpdu_stats_tlv_v: display htt_tx_tqm_list_mpdu_stats_tlv
2425  * @tag_buf: buffer containing the tlv htt_tx_tqm_list_mpdu_stats_tlv_v
2426  *
2427  * return:void
2428  */
2429 static void dp_print_tx_tqm_list_mpdu_stats_tlv_v(uint32_t *tag_buf)
2430 {
2431 	htt_tx_tqm_list_mpdu_stats_tlv_v *dp_stats_buf =
2432 		(htt_tx_tqm_list_mpdu_stats_tlv_v *)tag_buf;
2433 	uint8_t i;
2434 	uint16_t index = 0;
2435 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
2436 	char *list_mpdu_end_reason = qdf_mem_malloc(DP_MAX_STRING_LEN);
2437 
2438 	if (!list_mpdu_end_reason) {
2439 		dp_stats_err("Output buffer not allocated");
2440 		return;
2441 	}
2442 
2443 	tag_len = qdf_min(tag_len,
2444 			(uint32_t)HTT_TX_TQM_MAX_LIST_MPDU_END_REASON);
2445 
2446 	DP_PRINT_STATS("HTT_TX_TQM_LIST_MPDU_STATS_TLV_V:");
2447 	for (i = 0; i <  tag_len; i++) {
2448 		index += qdf_snprint(&list_mpdu_end_reason[index],
2449 				DP_MAX_STRING_LEN - index,
2450 				" %u:%u,", i,
2451 				dp_stats_buf->list_mpdu_end_reason[i]);
2452 	}
2453 	DP_PRINT_STATS("list_mpdu_end_reason = %s\n",
2454 		       list_mpdu_end_reason);
2455 	qdf_mem_free(list_mpdu_end_reason);
2456 }
2457 
2458 /*
2459  * dp_print_tx_tqm_list_mpdu_cnt_tlv_v: display htt_tx_tqm_list_mpdu_cnt_tlv_v
2460  * @tag_buf: buffer containing the tlv htt_tx_tqm_list_mpdu_cnt_tlv_v
2461  *
2462  * return:void
2463  */
2464 static void dp_print_tx_tqm_list_mpdu_cnt_tlv_v(uint32_t *tag_buf)
2465 {
2466 	htt_tx_tqm_list_mpdu_cnt_tlv_v *dp_stats_buf =
2467 		(htt_tx_tqm_list_mpdu_cnt_tlv_v *)tag_buf;
2468 	uint8_t i;
2469 	uint16_t index = 0;
2470 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
2471 	char *list_mpdu_cnt_hist = qdf_mem_malloc(DP_MAX_STRING_LEN);
2472 
2473 	if (!list_mpdu_cnt_hist) {
2474 		dp_stats_err("Output buffer not allocated");
2475 		return;
2476 	}
2477 
2478 	tag_len = qdf_min(tag_len,
2479 			(uint32_t)HTT_TX_TQM_MAX_LIST_MPDU_CNT_HISTOGRAM_BINS);
2480 
2481 	DP_PRINT_STATS("HTT_TX_TQM_LIST_MPDU_CNT_TLV_V:");
2482 	for (i = 0; i <  tag_len; i++) {
2483 		index += qdf_snprint(&list_mpdu_cnt_hist[index],
2484 				DP_MAX_STRING_LEN - index,
2485 				" %u:%u,", i,
2486 				dp_stats_buf->list_mpdu_cnt_hist[i]);
2487 	}
2488 	DP_PRINT_STATS("list_mpdu_cnt_hist = %s\n", list_mpdu_cnt_hist);
2489 	qdf_mem_free(list_mpdu_cnt_hist);
2490 }
2491 
2492 /*
2493  * dp_print_tx_tqm_pdev_stats_tlv_v: display htt_tx_tqm_pdev_stats_tlv_v
2494  * @tag_buf: buffer containing the tlv htt_tx_tqm_pdev_stats_tlv_v
2495  *
2496  * return:void
2497  */
2498 static void dp_print_tx_tqm_pdev_stats_tlv_v(uint32_t *tag_buf)
2499 {
2500 	htt_tx_tqm_pdev_stats_tlv_v *dp_stats_buf =
2501 		(htt_tx_tqm_pdev_stats_tlv_v *)tag_buf;
2502 
2503 	DP_PRINT_STATS("HTT_TX_TQM_PDEV_STATS_TLV_V:");
2504 	DP_PRINT_STATS("msdu_count = %u",
2505 		       dp_stats_buf->msdu_count);
2506 	DP_PRINT_STATS("mpdu_count = %u",
2507 		       dp_stats_buf->mpdu_count);
2508 	DP_PRINT_STATS("remove_msdu = %u",
2509 		       dp_stats_buf->remove_msdu);
2510 	DP_PRINT_STATS("remove_mpdu = %u",
2511 		       dp_stats_buf->remove_mpdu);
2512 	DP_PRINT_STATS("remove_msdu_ttl = %u",
2513 		       dp_stats_buf->remove_msdu_ttl);
2514 	DP_PRINT_STATS("send_bar = %u",
2515 		       dp_stats_buf->send_bar);
2516 	DP_PRINT_STATS("bar_sync = %u",
2517 		       dp_stats_buf->bar_sync);
2518 	DP_PRINT_STATS("notify_mpdu = %u",
2519 		       dp_stats_buf->notify_mpdu);
2520 	DP_PRINT_STATS("sync_cmd = %u",
2521 		       dp_stats_buf->sync_cmd);
2522 	DP_PRINT_STATS("write_cmd = %u",
2523 		       dp_stats_buf->write_cmd);
2524 	DP_PRINT_STATS("hwsch_trigger = %u",
2525 		       dp_stats_buf->hwsch_trigger);
2526 	DP_PRINT_STATS("ack_tlv_proc = %u",
2527 		       dp_stats_buf->ack_tlv_proc);
2528 	DP_PRINT_STATS("gen_mpdu_cmd = %u",
2529 		       dp_stats_buf->gen_mpdu_cmd);
2530 	DP_PRINT_STATS("gen_list_cmd = %u",
2531 		       dp_stats_buf->gen_list_cmd);
2532 	DP_PRINT_STATS("remove_mpdu_cmd = %u",
2533 		       dp_stats_buf->remove_mpdu_cmd);
2534 	DP_PRINT_STATS("remove_mpdu_tried_cmd = %u",
2535 		       dp_stats_buf->remove_mpdu_tried_cmd);
2536 	DP_PRINT_STATS("mpdu_queue_stats_cmd = %u",
2537 		       dp_stats_buf->mpdu_queue_stats_cmd);
2538 	DP_PRINT_STATS("mpdu_head_info_cmd = %u",
2539 		       dp_stats_buf->mpdu_head_info_cmd);
2540 	DP_PRINT_STATS("msdu_flow_stats_cmd = %u",
2541 		       dp_stats_buf->msdu_flow_stats_cmd);
2542 	DP_PRINT_STATS("remove_msdu_cmd = %u",
2543 		       dp_stats_buf->remove_msdu_cmd);
2544 	DP_PRINT_STATS("remove_msdu_ttl_cmd = %u",
2545 		       dp_stats_buf->remove_msdu_ttl_cmd);
2546 	DP_PRINT_STATS("flush_cache_cmd = %u",
2547 		       dp_stats_buf->flush_cache_cmd);
2548 	DP_PRINT_STATS("update_mpduq_cmd = %u",
2549 		       dp_stats_buf->update_mpduq_cmd);
2550 	DP_PRINT_STATS("enqueue = %u",
2551 		       dp_stats_buf->enqueue);
2552 	DP_PRINT_STATS("enqueue_notify = %u",
2553 		       dp_stats_buf->enqueue_notify);
2554 	DP_PRINT_STATS("notify_mpdu_at_head = %u",
2555 		       dp_stats_buf->notify_mpdu_at_head);
2556 	DP_PRINT_STATS("notify_mpdu_state_valid = %u\n",
2557 		       dp_stats_buf->notify_mpdu_state_valid);
2558 }
2559 
2560 /*
2561  * dp_print_tx_tqm_cmn_stats_tlv: display htt_tx_tqm_cmn_stats_tlv
2562  * @tag_buf: buffer containing the tlv htt_tx_tqm_cmn_stats_tlv
2563  *
2564  * return:void
2565  */
2566 static void dp_print_tx_tqm_cmn_stats_tlv(uint32_t *tag_buf)
2567 {
2568 	htt_tx_tqm_cmn_stats_tlv *dp_stats_buf =
2569 		(htt_tx_tqm_cmn_stats_tlv *)tag_buf;
2570 
2571 	DP_PRINT_STATS("HTT_TX_TQM_CMN_STATS_TLV:");
2572 	DP_PRINT_STATS("mac_id__word = %u",
2573 		       dp_stats_buf->mac_id__word);
2574 	DP_PRINT_STATS("max_cmdq_id = %u",
2575 		       dp_stats_buf->max_cmdq_id);
2576 	DP_PRINT_STATS("list_mpdu_cnt_hist_intvl = %u",
2577 		       dp_stats_buf->list_mpdu_cnt_hist_intvl);
2578 	DP_PRINT_STATS("add_msdu = %u",
2579 		       dp_stats_buf->add_msdu);
2580 	DP_PRINT_STATS("q_empty = %u",
2581 		       dp_stats_buf->q_empty);
2582 	DP_PRINT_STATS("q_not_empty = %u",
2583 		       dp_stats_buf->q_not_empty);
2584 	DP_PRINT_STATS("drop_notification = %u",
2585 		       dp_stats_buf->drop_notification);
2586 	DP_PRINT_STATS("desc_threshold = %u\n",
2587 		       dp_stats_buf->desc_threshold);
2588 }
2589 
2590 /*
2591  * dp_print_tx_tqm_error_stats_tlv: display htt_tx_tqm_error_stats_tlv
2592  * @tag_buf: buffer containing the tlv htt_tx_tqm_error_stats_tlv
2593  *
2594  * return:void
2595  */
2596 static void dp_print_tx_tqm_error_stats_tlv(uint32_t *tag_buf)
2597 {
2598 	htt_tx_tqm_error_stats_tlv *dp_stats_buf =
2599 		(htt_tx_tqm_error_stats_tlv *)tag_buf;
2600 
2601 	DP_PRINT_STATS("HTT_TX_TQM_ERROR_STATS_TLV:");
2602 	DP_PRINT_STATS("q_empty_failure = %u",
2603 		       dp_stats_buf->q_empty_failure);
2604 	DP_PRINT_STATS("q_not_empty_failure = %u",
2605 		       dp_stats_buf->q_not_empty_failure);
2606 	DP_PRINT_STATS("add_msdu_failure = %u\n",
2607 		       dp_stats_buf->add_msdu_failure);
2608 }
2609 
2610 /*
2611  * dp_print_tx_tqm_cmdq_status_tlv: display htt_tx_tqm_cmdq_status_tlv
2612  * @tag_buf: buffer containing the tlv htt_tx_tqm_cmdq_status_tlv
2613  *
2614  * return:void
2615  */
2616 static void dp_print_tx_tqm_cmdq_status_tlv(uint32_t *tag_buf)
2617 {
2618 	htt_tx_tqm_cmdq_status_tlv *dp_stats_buf =
2619 		(htt_tx_tqm_cmdq_status_tlv *)tag_buf;
2620 
2621 	DP_PRINT_STATS("HTT_TX_TQM_CMDQ_STATUS_TLV:");
2622 	DP_PRINT_STATS("mac_id__cmdq_id__word = %u",
2623 		       dp_stats_buf->mac_id__cmdq_id__word);
2624 	DP_PRINT_STATS("sync_cmd = %u",
2625 		       dp_stats_buf->sync_cmd);
2626 	DP_PRINT_STATS("write_cmd = %u",
2627 		       dp_stats_buf->write_cmd);
2628 	DP_PRINT_STATS("gen_mpdu_cmd = %u",
2629 		       dp_stats_buf->gen_mpdu_cmd);
2630 	DP_PRINT_STATS("mpdu_queue_stats_cmd = %u",
2631 		       dp_stats_buf->mpdu_queue_stats_cmd);
2632 	DP_PRINT_STATS("mpdu_head_info_cmd = %u",
2633 		       dp_stats_buf->mpdu_head_info_cmd);
2634 	DP_PRINT_STATS("msdu_flow_stats_cmd = %u",
2635 		       dp_stats_buf->msdu_flow_stats_cmd);
2636 	DP_PRINT_STATS("remove_mpdu_cmd = %u",
2637 		       dp_stats_buf->remove_mpdu_cmd);
2638 	DP_PRINT_STATS("remove_msdu_cmd = %u",
2639 		       dp_stats_buf->remove_msdu_cmd);
2640 	DP_PRINT_STATS("flush_cache_cmd = %u",
2641 		       dp_stats_buf->flush_cache_cmd);
2642 	DP_PRINT_STATS("update_mpduq_cmd = %u",
2643 		       dp_stats_buf->update_mpduq_cmd);
2644 	DP_PRINT_STATS("update_msduq_cmd = %u\n",
2645 		       dp_stats_buf->update_msduq_cmd);
2646 }
2647 
2648 /*
2649  * dp_print_tx_de_eapol_packets_stats_tlv: display htt_tx_de_eapol_packets_stats
2650  * @tag_buf: buffer containing the tlv htt_tx_de_eapol_packets_stats_tlv
2651  *
2652  * return:void
2653  */
2654 static void dp_print_tx_de_eapol_packets_stats_tlv(uint32_t *tag_buf)
2655 {
2656 	htt_tx_de_eapol_packets_stats_tlv *dp_stats_buf =
2657 		(htt_tx_de_eapol_packets_stats_tlv *)tag_buf;
2658 
2659 	DP_PRINT_STATS("HTT_TX_DE_EAPOL_PACKETS_STATS_TLV:");
2660 	DP_PRINT_STATS("m1_packets = %u",
2661 		       dp_stats_buf->m1_packets);
2662 	DP_PRINT_STATS("m2_packets = %u",
2663 		       dp_stats_buf->m2_packets);
2664 	DP_PRINT_STATS("m3_packets = %u",
2665 		       dp_stats_buf->m3_packets);
2666 	DP_PRINT_STATS("m4_packets = %u",
2667 		       dp_stats_buf->m4_packets);
2668 	DP_PRINT_STATS("g1_packets = %u",
2669 		       dp_stats_buf->g1_packets);
2670 	DP_PRINT_STATS("g2_packets = %u\n",
2671 		       dp_stats_buf->g2_packets);
2672 }
2673 
2674 /*
2675  * dp_print_tx_de_classify_failed_stats_tlv: display
2676  *				htt_tx_de_classify_failed_stats_tlv
2677  * @tag_buf: buffer containing the tlv htt_tx_de_classify_failed_stats_tlv
2678  *
2679  * return:void
2680  */
2681 static void dp_print_tx_de_classify_failed_stats_tlv(uint32_t *tag_buf)
2682 {
2683 	htt_tx_de_classify_failed_stats_tlv *dp_stats_buf =
2684 		(htt_tx_de_classify_failed_stats_tlv *)tag_buf;
2685 
2686 	DP_PRINT_STATS("HTT_TX_DE_CLASSIFY_FAILED_STATS_TLV:");
2687 	DP_PRINT_STATS("ap_bss_peer_not_found = %u",
2688 		       dp_stats_buf->ap_bss_peer_not_found);
2689 	DP_PRINT_STATS("ap_bcast_mcast_no_peer = %u",
2690 		       dp_stats_buf->ap_bcast_mcast_no_peer);
2691 	DP_PRINT_STATS("sta_delete_in_progress = %u",
2692 		       dp_stats_buf->sta_delete_in_progress);
2693 	DP_PRINT_STATS("ibss_no_bss_peer = %u",
2694 		       dp_stats_buf->ibss_no_bss_peer);
2695 	DP_PRINT_STATS("invaild_vdev_type = %u",
2696 		       dp_stats_buf->invaild_vdev_type);
2697 	DP_PRINT_STATS("invalid_ast_peer_entry = %u",
2698 		       dp_stats_buf->invalid_ast_peer_entry);
2699 	DP_PRINT_STATS("peer_entry_invalid = %u",
2700 		       dp_stats_buf->peer_entry_invalid);
2701 	DP_PRINT_STATS("ethertype_not_ip = %u",
2702 		       dp_stats_buf->ethertype_not_ip);
2703 	DP_PRINT_STATS("eapol_lookup_failed = %u",
2704 		       dp_stats_buf->eapol_lookup_failed);
2705 	DP_PRINT_STATS("qpeer_not_allow_data = %u",
2706 		       dp_stats_buf->qpeer_not_allow_data);
2707 	DP_PRINT_STATS("fse_tid_override = %u\n",
2708 		       dp_stats_buf->fse_tid_override);
2709 }
2710 
2711 /*
2712  * dp_print_tx_de_classify_stats_tlv: display htt_tx_de_classify_stats_tlv
2713  * @tag_buf: buffer containing the tlv htt_tx_de_classify_stats_tlv
2714  *
2715  * return:void
2716  */
2717 static void dp_print_tx_de_classify_stats_tlv(uint32_t *tag_buf)
2718 {
2719 	htt_tx_de_classify_stats_tlv *dp_stats_buf =
2720 		(htt_tx_de_classify_stats_tlv *)tag_buf;
2721 
2722 	DP_PRINT_STATS("HTT_TX_DE_CLASSIFY_STATS_TLV:");
2723 	DP_PRINT_STATS("arp_packets = %u",
2724 		       dp_stats_buf->arp_packets);
2725 	DP_PRINT_STATS("igmp_packets = %u",
2726 		       dp_stats_buf->igmp_packets);
2727 	DP_PRINT_STATS("dhcp_packets = %u",
2728 		       dp_stats_buf->dhcp_packets);
2729 	DP_PRINT_STATS("host_inspected = %u",
2730 		       dp_stats_buf->host_inspected);
2731 	DP_PRINT_STATS("htt_included = %u",
2732 		       dp_stats_buf->htt_included);
2733 	DP_PRINT_STATS("htt_valid_mcs = %u",
2734 		       dp_stats_buf->htt_valid_mcs);
2735 	DP_PRINT_STATS("htt_valid_nss = %u",
2736 		       dp_stats_buf->htt_valid_nss);
2737 	DP_PRINT_STATS("htt_valid_preamble_type = %u",
2738 		       dp_stats_buf->htt_valid_preamble_type);
2739 	DP_PRINT_STATS("htt_valid_chainmask = %u",
2740 		       dp_stats_buf->htt_valid_chainmask);
2741 	DP_PRINT_STATS("htt_valid_guard_interval = %u",
2742 		       dp_stats_buf->htt_valid_guard_interval);
2743 	DP_PRINT_STATS("htt_valid_retries = %u",
2744 		       dp_stats_buf->htt_valid_retries);
2745 	DP_PRINT_STATS("htt_valid_bw_info = %u",
2746 		       dp_stats_buf->htt_valid_bw_info);
2747 	DP_PRINT_STATS("htt_valid_power = %u",
2748 		       dp_stats_buf->htt_valid_power);
2749 	DP_PRINT_STATS("htt_valid_key_flags = %u",
2750 		       dp_stats_buf->htt_valid_key_flags);
2751 	DP_PRINT_STATS("htt_valid_no_encryption = %u",
2752 		       dp_stats_buf->htt_valid_no_encryption);
2753 	DP_PRINT_STATS("fse_entry_count = %u",
2754 		       dp_stats_buf->fse_entry_count);
2755 	DP_PRINT_STATS("fse_priority_be = %u",
2756 		       dp_stats_buf->fse_priority_be);
2757 	DP_PRINT_STATS("fse_priority_high = %u",
2758 		       dp_stats_buf->fse_priority_high);
2759 	DP_PRINT_STATS("fse_priority_low = %u",
2760 		       dp_stats_buf->fse_priority_low);
2761 	DP_PRINT_STATS("fse_traffic_ptrn_be = %u",
2762 		       dp_stats_buf->fse_traffic_ptrn_be);
2763 	DP_PRINT_STATS("fse_traffic_ptrn_over_sub = %u",
2764 		       dp_stats_buf->fse_traffic_ptrn_over_sub);
2765 	DP_PRINT_STATS("fse_traffic_ptrn_bursty = %u",
2766 		       dp_stats_buf->fse_traffic_ptrn_bursty);
2767 	DP_PRINT_STATS("fse_traffic_ptrn_interactive = %u",
2768 		       dp_stats_buf->fse_traffic_ptrn_interactive);
2769 	DP_PRINT_STATS("fse_traffic_ptrn_periodic = %u",
2770 		       dp_stats_buf->fse_traffic_ptrn_periodic);
2771 	DP_PRINT_STATS("fse_hwqueue_alloc = %u",
2772 		       dp_stats_buf->fse_hwqueue_alloc);
2773 	DP_PRINT_STATS("fse_hwqueue_created = %u",
2774 		       dp_stats_buf->fse_hwqueue_created);
2775 	DP_PRINT_STATS("fse_hwqueue_send_to_host = %u",
2776 		       dp_stats_buf->fse_hwqueue_send_to_host);
2777 	DP_PRINT_STATS("mcast_entry = %u",
2778 		       dp_stats_buf->mcast_entry);
2779 	DP_PRINT_STATS("bcast_entry = %u\n",
2780 		       dp_stats_buf->bcast_entry);
2781 }
2782 
2783 /*
2784  * dp_print_tx_de_classify_status_stats_tlv: display
2785  *				htt_tx_de_classify_status_stats_tlv
2786  * @tag_buf: buffer containing the tlv htt_tx_de_classify_status_stats_tlv
2787  *
2788  * return:void
2789  */
2790 static void dp_print_tx_de_classify_status_stats_tlv(uint32_t *tag_buf)
2791 {
2792 	htt_tx_de_classify_status_stats_tlv *dp_stats_buf =
2793 		(htt_tx_de_classify_status_stats_tlv *)tag_buf;
2794 
2795 	DP_PRINT_STATS("HTT_TX_DE_CLASSIFY_STATUS_STATS_TLV:");
2796 	DP_PRINT_STATS("eok = %u",
2797 		       dp_stats_buf->eok);
2798 	DP_PRINT_STATS("classify_done = %u",
2799 		       dp_stats_buf->classify_done);
2800 	DP_PRINT_STATS("lookup_failed = %u",
2801 		       dp_stats_buf->lookup_failed);
2802 	DP_PRINT_STATS("send_host_dhcp = %u",
2803 		       dp_stats_buf->send_host_dhcp);
2804 	DP_PRINT_STATS("send_host_mcast = %u",
2805 		       dp_stats_buf->send_host_mcast);
2806 	DP_PRINT_STATS("send_host_unknown_dest = %u",
2807 		       dp_stats_buf->send_host_unknown_dest);
2808 	DP_PRINT_STATS("send_host = %u",
2809 		       dp_stats_buf->send_host);
2810 	DP_PRINT_STATS("status_invalid = %u\n",
2811 		       dp_stats_buf->status_invalid);
2812 }
2813 
2814 /*
2815  * dp_print_tx_de_enqueue_packets_stats_tlv: display
2816  *				htt_tx_de_enqueue_packets_stats_tlv
2817  * @tag_buf: buffer containing the tlv htt_tx_de_enqueue_packets_stats_tlv
2818  *
2819  * return:void
2820  */
2821 static void dp_print_tx_de_enqueue_packets_stats_tlv(uint32_t *tag_buf)
2822 {
2823 	htt_tx_de_enqueue_packets_stats_tlv *dp_stats_buf =
2824 		(htt_tx_de_enqueue_packets_stats_tlv *)tag_buf;
2825 
2826 	DP_PRINT_STATS("HTT_TX_DE_ENQUEUE_PACKETS_STATS_TLV:");
2827 	DP_PRINT_STATS("enqueued_pkts = %u",
2828 		       dp_stats_buf->enqueued_pkts);
2829 	DP_PRINT_STATS("to_tqm = %u",
2830 		       dp_stats_buf->to_tqm);
2831 	DP_PRINT_STATS("to_tqm_bypass = %u\n",
2832 		       dp_stats_buf->to_tqm_bypass);
2833 }
2834 
2835 /*
2836  * dp_print_tx_de_enqueue_discard_stats_tlv: display
2837  *					htt_tx_de_enqueue_discard_stats_tlv
2838  * @tag_buf: buffer containing the tlv htt_tx_de_enqueue_discard_stats_tlv
2839  *
2840  * return:void
2841  */
2842 static void dp_print_tx_de_enqueue_discard_stats_tlv(uint32_t *tag_buf)
2843 {
2844 	htt_tx_de_enqueue_discard_stats_tlv *dp_stats_buf =
2845 		(htt_tx_de_enqueue_discard_stats_tlv *)tag_buf;
2846 
2847 	DP_PRINT_STATS("HTT_TX_DE_ENQUEUE_DISCARD_STATS_TLV:");
2848 	DP_PRINT_STATS("discarded_pkts = %u",
2849 		       dp_stats_buf->discarded_pkts);
2850 	DP_PRINT_STATS("local_frames = %u",
2851 		       dp_stats_buf->local_frames);
2852 	DP_PRINT_STATS("is_ext_msdu = %u\n",
2853 		       dp_stats_buf->is_ext_msdu);
2854 }
2855 
2856 /*
2857  * dp_print_tx_de_compl_stats_tlv: display htt_tx_de_compl_stats_tlv
2858  * @tag_buf: buffer containing the tlv htt_tx_de_compl_stats_tlv
2859  *
2860  * return:void
2861  */
2862 static void dp_print_tx_de_compl_stats_tlv(uint32_t *tag_buf)
2863 {
2864 	htt_tx_de_compl_stats_tlv *dp_stats_buf =
2865 		(htt_tx_de_compl_stats_tlv *)tag_buf;
2866 
2867 	DP_PRINT_STATS("HTT_TX_DE_COMPL_STATS_TLV:");
2868 	DP_PRINT_STATS("tcl_dummy_frame = %u",
2869 		       dp_stats_buf->tcl_dummy_frame);
2870 	DP_PRINT_STATS("tqm_dummy_frame = %u",
2871 		       dp_stats_buf->tqm_dummy_frame);
2872 	DP_PRINT_STATS("tqm_notify_frame = %u",
2873 		       dp_stats_buf->tqm_notify_frame);
2874 	DP_PRINT_STATS("fw2wbm_enq = %u",
2875 		       dp_stats_buf->fw2wbm_enq);
2876 	DP_PRINT_STATS("tqm_bypass_frame = %u\n",
2877 		       dp_stats_buf->tqm_bypass_frame);
2878 }
2879 
2880 /*
2881  * dp_print_tx_de_cmn_stats_tlv: display htt_tx_de_cmn_stats_tlv
2882  * @tag_buf: buffer containing the tlv htt_tx_de_cmn_stats_tlv
2883  *
2884  * return:void
2885  */
2886 static void dp_print_tx_de_cmn_stats_tlv(uint32_t *tag_buf)
2887 {
2888 	htt_tx_de_cmn_stats_tlv *dp_stats_buf =
2889 		(htt_tx_de_cmn_stats_tlv *)tag_buf;
2890 
2891 	DP_PRINT_STATS("HTT_TX_DE_CMN_STATS_TLV:");
2892 	DP_PRINT_STATS("mac_id__word = %u",
2893 		       dp_stats_buf->mac_id__word);
2894 	DP_PRINT_STATS("tcl2fw_entry_count = %u",
2895 		       dp_stats_buf->tcl2fw_entry_count);
2896 	DP_PRINT_STATS("not_to_fw = %u",
2897 		       dp_stats_buf->not_to_fw);
2898 	DP_PRINT_STATS("invalid_pdev_vdev_peer = %u",
2899 		       dp_stats_buf->invalid_pdev_vdev_peer);
2900 	DP_PRINT_STATS("tcl_res_invalid_addrx = %u",
2901 		       dp_stats_buf->tcl_res_invalid_addrx);
2902 	DP_PRINT_STATS("wbm2fw_entry_count = %u",
2903 		       dp_stats_buf->wbm2fw_entry_count);
2904 	DP_PRINT_STATS("invalid_pdev = %u\n",
2905 		       dp_stats_buf->invalid_pdev);
2906 }
2907 
2908 /*
2909  * dp_print_ring_if_stats_tlv: display htt_ring_if_stats_tlv
2910  * @tag_buf: buffer containing the tlv htt_ring_if_stats_tlv
2911  *
2912  * return:void
2913  */
2914 static void dp_print_ring_if_stats_tlv(uint32_t *tag_buf)
2915 {
2916 	htt_ring_if_stats_tlv *dp_stats_buf =
2917 		(htt_ring_if_stats_tlv *)tag_buf;
2918 	uint8_t i;
2919 	uint16_t index = 0;
2920 	char *wm_hit_count = qdf_mem_malloc(DP_MAX_STRING_LEN);
2921 
2922 	if (!wm_hit_count) {
2923 		dp_stats_err("Output buffer not allocated");
2924 		return;
2925 	}
2926 
2927 	DP_PRINT_STATS("HTT_RING_IF_STATS_TLV:");
2928 	DP_PRINT_STATS("base_addr = %u",
2929 		       dp_stats_buf->base_addr);
2930 	DP_PRINT_STATS("elem_size = %u",
2931 		       dp_stats_buf->elem_size);
2932 	DP_PRINT_STATS("num_elems__prefetch_tail_idx = %u",
2933 		       dp_stats_buf->num_elems__prefetch_tail_idx);
2934 	DP_PRINT_STATS("head_idx__tail_idx = %u",
2935 		       dp_stats_buf->head_idx__tail_idx);
2936 	DP_PRINT_STATS("shadow_head_idx__shadow_tail_idx = %u",
2937 		       dp_stats_buf->shadow_head_idx__shadow_tail_idx);
2938 	DP_PRINT_STATS("num_tail_incr = %u",
2939 		       dp_stats_buf->num_tail_incr);
2940 	DP_PRINT_STATS("lwm_thresh__hwm_thresh = %u",
2941 		       dp_stats_buf->lwm_thresh__hwm_thresh);
2942 	DP_PRINT_STATS("overrun_hit_count = %u",
2943 		       dp_stats_buf->overrun_hit_count);
2944 	DP_PRINT_STATS("underrun_hit_count = %u",
2945 		       dp_stats_buf->underrun_hit_count);
2946 	DP_PRINT_STATS("prod_blockwait_count = %u",
2947 		       dp_stats_buf->prod_blockwait_count);
2948 	DP_PRINT_STATS("cons_blockwait_count = %u",
2949 		       dp_stats_buf->cons_blockwait_count);
2950 
2951 	for (i = 0; i <  DP_HTT_LOW_WM_HIT_COUNT_LEN; i++) {
2952 		index += qdf_snprint(&wm_hit_count[index],
2953 				DP_MAX_STRING_LEN - index,
2954 				" %u:%u,", i,
2955 				dp_stats_buf->low_wm_hit_count[i]);
2956 	}
2957 	DP_PRINT_STATS("low_wm_hit_count = %s ", wm_hit_count);
2958 
2959 	qdf_mem_zero(wm_hit_count, DP_MAX_STRING_LEN);
2960 
2961 	index = 0;
2962 	for (i = 0; i <  DP_HTT_HIGH_WM_HIT_COUNT_LEN; i++) {
2963 		index += qdf_snprint(&wm_hit_count[index],
2964 				DP_MAX_STRING_LEN - index,
2965 				" %u:%u,", i,
2966 				dp_stats_buf->high_wm_hit_count[i]);
2967 	}
2968 	DP_PRINT_STATS("high_wm_hit_count = %s\n", wm_hit_count);
2969 }
2970 
2971 /*
2972  * dp_print_ring_if_cmn_tlv: display htt_ring_if_cmn_tlv
2973  * @tag_buf: buffer containing the tlv htt_ring_if_cmn_tlv
2974  *
2975  * return:void
2976  */
2977 static void dp_print_ring_if_cmn_tlv(uint32_t *tag_buf)
2978 {
2979 	htt_ring_if_cmn_tlv *dp_stats_buf =
2980 		(htt_ring_if_cmn_tlv *)tag_buf;
2981 
2982 	DP_PRINT_STATS("HTT_RING_IF_CMN_TLV:");
2983 	DP_PRINT_STATS("mac_id__word = %u",
2984 		       dp_stats_buf->mac_id__word);
2985 	DP_PRINT_STATS("num_records = %u\n",
2986 		       dp_stats_buf->num_records);
2987 }
2988 
2989 /*
2990  * dp_print_sfm_client_user_tlv_v: display htt_sfm_client_user_tlv_v
2991  * @tag_buf: buffer containing the tlv htt_sfm_client_user_tlv_v
2992  *
2993  * return:void
2994  */
2995 static void dp_print_sfm_client_user_tlv_v(uint32_t *tag_buf)
2996 {
2997 	htt_sfm_client_user_tlv_v *dp_stats_buf =
2998 		(htt_sfm_client_user_tlv_v *)tag_buf;
2999 	uint8_t i;
3000 	uint16_t index = 0;
3001 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
3002 	char *dwords_used_by_user_n = qdf_mem_malloc(DP_MAX_STRING_LEN);
3003 
3004 	if (!dwords_used_by_user_n) {
3005 		dp_stats_err("Output buffer not allocated");
3006 		return;
3007 	}
3008 
3009 	DP_PRINT_STATS("HTT_SFM_CLIENT_USER_TLV_V:");
3010 	for (i = 0; i <  tag_len; i++) {
3011 		index += qdf_snprint(&dwords_used_by_user_n[index],
3012 				DP_MAX_STRING_LEN - index,
3013 				" %u:%u,", i,
3014 				dp_stats_buf->dwords_used_by_user_n[i]);
3015 	}
3016 	DP_PRINT_STATS("dwords_used_by_user_n = %s\n",
3017 		       dwords_used_by_user_n);
3018 	qdf_mem_free(dwords_used_by_user_n);
3019 }
3020 
3021 /*
3022  * dp_print_sfm_client_tlv: display htt_sfm_client_tlv
3023  * @tag_buf: buffer containing the tlv htt_sfm_client_tlv
3024  *
3025  * return:void
3026  */
3027 static void dp_print_sfm_client_tlv(uint32_t *tag_buf)
3028 {
3029 	htt_sfm_client_tlv *dp_stats_buf =
3030 		(htt_sfm_client_tlv *)tag_buf;
3031 
3032 	DP_PRINT_STATS("HTT_SFM_CLIENT_TLV:");
3033 	DP_PRINT_STATS("client_id = %u",
3034 		       dp_stats_buf->client_id);
3035 	DP_PRINT_STATS("buf_min = %u",
3036 		       dp_stats_buf->buf_min);
3037 	DP_PRINT_STATS("buf_max = %u",
3038 		       dp_stats_buf->buf_max);
3039 	DP_PRINT_STATS("buf_busy = %u",
3040 		       dp_stats_buf->buf_busy);
3041 	DP_PRINT_STATS("buf_alloc = %u",
3042 		       dp_stats_buf->buf_alloc);
3043 	DP_PRINT_STATS("buf_avail = %u",
3044 		       dp_stats_buf->buf_avail);
3045 	DP_PRINT_STATS("num_users = %u\n",
3046 		       dp_stats_buf->num_users);
3047 }
3048 
3049 /*
3050  * dp_print_sfm_cmn_tlv: display htt_sfm_cmn_tlv
3051  * @tag_buf: buffer containing the tlv htt_sfm_cmn_tlv
3052  *
3053  * return:void
3054  */
3055 static void dp_print_sfm_cmn_tlv(uint32_t *tag_buf)
3056 {
3057 	htt_sfm_cmn_tlv *dp_stats_buf =
3058 		(htt_sfm_cmn_tlv *)tag_buf;
3059 
3060 	DP_PRINT_STATS("HTT_SFM_CMN_TLV:");
3061 	DP_PRINT_STATS("mac_id__word = %u",
3062 		       dp_stats_buf->mac_id__word);
3063 	DP_PRINT_STATS("buf_total = %u",
3064 		       dp_stats_buf->buf_total);
3065 	DP_PRINT_STATS("mem_empty = %u",
3066 		       dp_stats_buf->mem_empty);
3067 	DP_PRINT_STATS("deallocate_bufs = %u",
3068 		       dp_stats_buf->deallocate_bufs);
3069 	DP_PRINT_STATS("num_records = %u\n",
3070 		       dp_stats_buf->num_records);
3071 }
3072 
3073 /*
3074  * dp_print_sring_stats_tlv: display htt_sring_stats_tlv
3075  * @tag_buf: buffer containing the tlv htt_sring_stats_tlv
3076  *
3077  * return:void
3078  */
3079 static void dp_print_sring_stats_tlv(uint32_t *tag_buf)
3080 {
3081 	htt_sring_stats_tlv *dp_stats_buf =
3082 		(htt_sring_stats_tlv *)tag_buf;
3083 
3084 	DP_PRINT_STATS("HTT_SRING_STATS_TLV:");
3085 	DP_PRINT_STATS("mac_id__ring_id__arena__ep = %u",
3086 		       dp_stats_buf->mac_id__ring_id__arena__ep);
3087 	DP_PRINT_STATS("base_addr_lsb = %u",
3088 		       dp_stats_buf->base_addr_lsb);
3089 	DP_PRINT_STATS("base_addr_msb = %u",
3090 		       dp_stats_buf->base_addr_msb);
3091 	DP_PRINT_STATS("ring_size = %u",
3092 		       dp_stats_buf->ring_size);
3093 	DP_PRINT_STATS("elem_size = %u",
3094 		       dp_stats_buf->elem_size);
3095 	DP_PRINT_STATS("num_avail_words__num_valid_words = %u",
3096 		       dp_stats_buf->num_avail_words__num_valid_words);
3097 	DP_PRINT_STATS("head_ptr__tail_ptr = %u",
3098 		       dp_stats_buf->head_ptr__tail_ptr);
3099 	DP_PRINT_STATS("consumer_empty__producer_full = %u",
3100 		       dp_stats_buf->consumer_empty__producer_full);
3101 	DP_PRINT_STATS("prefetch_count__internal_tail_ptr = %u\n",
3102 		       dp_stats_buf->prefetch_count__internal_tail_ptr);
3103 }
3104 
3105 /*
3106  * dp_print_sring_cmn_tlv: display htt_sring_cmn_tlv
3107  * @tag_buf: buffer containing the tlv htt_sring_cmn_tlv
3108  *
3109  * return:void
3110  */
3111 static void dp_print_sring_cmn_tlv(uint32_t *tag_buf)
3112 {
3113 	htt_sring_cmn_tlv *dp_stats_buf =
3114 		(htt_sring_cmn_tlv *)tag_buf;
3115 
3116 	DP_PRINT_STATS("HTT_SRING_CMN_TLV:");
3117 	DP_PRINT_STATS("num_records = %u\n",
3118 		       dp_stats_buf->num_records);
3119 }
3120 
3121 /*
3122  * dp_print_tx_pdev_rate_stats_tlv: display htt_tx_pdev_rate_stats_tlv
3123  * @tag_buf: buffer containing the tlv htt_tx_pdev_rate_stats_tlv
3124  *
3125  * return:void
3126  */
3127 static void dp_print_tx_pdev_rate_stats_tlv(uint32_t *tag_buf)
3128 {
3129 	htt_tx_pdev_rate_stats_tlv *dp_stats_buf =
3130 		(htt_tx_pdev_rate_stats_tlv *)tag_buf;
3131 	uint8_t i, j;
3132 	uint16_t index = 0;
3133 	char *tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0};
3134 	char *tx_gi_ext[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0};
3135 	char *ac_mu_mimo_tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0};
3136 	char *ax_mu_mimo_tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0};
3137 	char *ofdma_tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0};
3138 	char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
3139 
3140 	if (!str_buf) {
3141 		dp_err("Output buffer not allocated");
3142 		return;
3143 	}
3144 
3145 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
3146 		tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
3147 		tx_gi_ext[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
3148 		if (!tx_gi[i] || !tx_gi_ext[i]) {
3149 			dp_err("Unable to allocate buffer for tx_gi");
3150 			goto fail1;
3151 		}
3152 		ac_mu_mimo_tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
3153 		if (!ac_mu_mimo_tx_gi[i]) {
3154 			dp_err("Unable to allocate buffer for ac_mu_mimo_tx_gi");
3155 			goto fail1;
3156 		}
3157 		ax_mu_mimo_tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
3158 		if (!ax_mu_mimo_tx_gi[i]) {
3159 			dp_err("Unable to allocate buffer for ax_mu_mimo_tx_gi");
3160 			goto fail1;
3161 		}
3162 		ofdma_tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
3163 		if (!ofdma_tx_gi[i]) {
3164 			dp_err("Unable to allocate buffer for ofdma_tx_gi");
3165 			goto fail1;
3166 		}
3167 	}
3168 
3169 	DP_PRINT_STATS("HTT_TX_PDEV_RATE_STATS_TLV:");
3170 	DP_PRINT_STATS("mac_id__word = %u",
3171 		       dp_stats_buf->mac_id__word);
3172 	DP_PRINT_STATS("tx_ldpc = %u",
3173 		       dp_stats_buf->tx_ldpc);
3174 	DP_PRINT_STATS("rts_cnt = %u",
3175 		       dp_stats_buf->rts_cnt);
3176 	DP_PRINT_STATS("rts_success = %u",
3177 		       dp_stats_buf->rts_success);
3178 
3179 	DP_PRINT_STATS("ack_rssi = %u",
3180 		       dp_stats_buf->ack_rssi);
3181 
3182 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3183 	for (i = 0; i <  DP_HTT_TX_MCS_LEN; i++) {
3184 		index += qdf_snprint(&str_buf[index],
3185 				DP_MAX_STRING_LEN - index,
3186 				" %u:%u,", i, dp_stats_buf->tx_mcs[i]);
3187 	}
3188 
3189 	for (i = 0; i <  DP_HTT_TX_MCS_EXT_LEN; i++) {
3190 		index += qdf_snprint(&str_buf[index],
3191 				DP_MAX_STRING_LEN - index,
3192 				" %u:%u,", i + DP_HTT_TX_MCS_LEN,
3193 				dp_stats_buf->tx_mcs_ext[i]);
3194 	}
3195 
3196 	for (i = 0; i <  DP_HTT_TX_MCS_EXT2_LEN; i++) {
3197 		index += qdf_snprint(&str_buf[index],
3198 				DP_MAX_STRING_LEN - index,
3199 				" %u:%u,", i + DP_HTT_TX_MCS_LEN +
3200 				DP_HTT_TX_MCS_EXT_LEN,
3201 				dp_stats_buf->tx_mcs_ext_2[i]);
3202 	}
3203 	DP_PRINT_STATS("tx_mcs = %s ", str_buf);
3204 
3205 	index = 0;
3206 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3207 	for (i = 0; i <  DP_HTT_TX_SU_MCS_LEN; i++) {
3208 		index += qdf_snprint(&str_buf[index],
3209 				DP_MAX_STRING_LEN - index,
3210 				" %u:%u,", i, dp_stats_buf->tx_su_mcs[i]);
3211 	}
3212 	DP_PRINT_STATS("tx_su_mcs = %s ", str_buf);
3213 
3214 	index = 0;
3215 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3216 	for (i = 0; i <  DP_HTT_TX_MU_MCS_LEN; i++) {
3217 		index += qdf_snprint(&str_buf[index],
3218 				DP_MAX_STRING_LEN - index,
3219 				" %u:%u,", i, dp_stats_buf->tx_mu_mcs[i]);
3220 	}
3221 	DP_PRINT_STATS("tx_mu_mcs = %s ", str_buf);
3222 
3223 	index = 0;
3224 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3225 	for (i = 0; i <  DP_HTT_TX_NSS_LEN; i++) {
3226 		/* 0 stands for NSS 1, 1 stands for NSS 2, etc. */
3227 		index += qdf_snprint(&str_buf[index],
3228 				DP_MAX_STRING_LEN - index,
3229 				" %u:%u,", (i + 1),
3230 				dp_stats_buf->tx_nss[i]);
3231 	}
3232 	DP_PRINT_STATS("tx_nss = %s ", str_buf);
3233 
3234 	index = 0;
3235 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3236 	for (i = 0; i <  DP_HTT_TX_BW_LEN; i++) {
3237 		index += qdf_snprint(&str_buf[index],
3238 				DP_MAX_STRING_LEN - index,
3239 				" %u:%u,", i, dp_stats_buf->tx_bw[i]);
3240 	}
3241 	DP_PRINT_STATS("tx_bw = %s ", str_buf);
3242 
3243 	DP_PRINT_STATS("tx_bw_320mhz = %u ", dp_stats_buf->tx_bw_320mhz);
3244 
3245 	index = 0;
3246 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3247 	for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3248 		index += qdf_snprint(&str_buf[index],
3249 				DP_MAX_STRING_LEN - index,
3250 				" %u:%u,", i, dp_stats_buf->tx_stbc[i]);
3251 	}
3252 	for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) {
3253 		index += qdf_snprint(&str_buf[index],
3254 				DP_MAX_STRING_LEN - index,
3255 				" %u:%u,", i + HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,
3256 				dp_stats_buf->tx_stbc_ext[i]);
3257 	}
3258 	DP_PRINT_STATS("tx_stbc = %s ", str_buf);
3259 
3260 	index = 0;
3261 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3262 	for (i = 0; i <  DP_HTT_TX_PREAM_LEN; i++) {
3263 		index += qdf_snprint(&str_buf[index],
3264 				DP_MAX_STRING_LEN - index,
3265 				" %u:%u,", i, dp_stats_buf->tx_pream[i]);
3266 	}
3267 	DP_PRINT_STATS("tx_pream = %s ", str_buf);
3268 
3269 	for (j = 0; j < DP_HTT_PDEV_TX_GI_LEN; j++) {
3270 		index = 0;
3271 		qdf_mem_zero(tx_gi[j], DP_MAX_STRING_LEN);
3272 		for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3273 			index += qdf_snprint(&tx_gi[j][index],
3274 					DP_MAX_STRING_LEN - index,
3275 					" %u:%u,", i,
3276 					dp_stats_buf->tx_gi[j][i]);
3277 		}
3278 		DP_PRINT_STATS("tx_gi[%u] = %s ", j, tx_gi[j]);
3279 	}
3280 
3281 	for (j = 0; j < DP_HTT_PDEV_TX_GI_LEN; j++) {
3282 		index = 0;
3283 		qdf_mem_zero(tx_gi_ext[j], DP_MAX_STRING_LEN);
3284 		for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) {
3285 			index += qdf_snprint(&tx_gi_ext[j][index],
3286 					DP_MAX_STRING_LEN - index,
3287 					" %u:%u,", i,
3288 					dp_stats_buf->tx_gi_ext[j][i]);
3289 		}
3290 		DP_PRINT_STATS("tx_gi_ext[%u] = %s ", j, tx_gi_ext[j]);
3291 	}
3292 
3293 	index = 0;
3294 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3295 	for (i = 0; i <  DP_HTT_TX_DCM_LEN; i++) {
3296 		index += qdf_snprint(&str_buf[index],
3297 				DP_MAX_STRING_LEN - index,
3298 				" %u:%u,", i, dp_stats_buf->tx_dcm[i]);
3299 	}
3300 	DP_PRINT_STATS("tx_dcm = %s", str_buf);
3301 
3302 	index = 0;
3303 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3304 	for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_PUNCTURED_MODE_COUNTERS; i++) {
3305 		index += qdf_snprint(&str_buf[index],
3306 				DP_MAX_STRING_LEN - index,
3307 				" %u:%u,", i,
3308 				dp_stats_buf->tx_su_punctured_mode[i]);
3309 	}
3310 	DP_PRINT_STATS("tx_su_punctured_mode = %s\n", str_buf);
3311 
3312 	DP_PRINT_STATS("rts_success = %u",
3313 		       dp_stats_buf->rts_success);
3314 	DP_PRINT_STATS("ac_mu_mimo_tx_ldpc = %u",
3315 		       dp_stats_buf->ac_mu_mimo_tx_ldpc);
3316 	DP_PRINT_STATS("ax_mu_mimo_tx_ldpc = %u",
3317 		       dp_stats_buf->ax_mu_mimo_tx_ldpc);
3318 	DP_PRINT_STATS("ofdma_tx_ldpc = %u",
3319 		       dp_stats_buf->ofdma_tx_ldpc);
3320 
3321 	index = 0;
3322 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3323 	for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_LEGACY_CCK_STATS; i++) {
3324 		index += qdf_snprint(&str_buf[index],
3325 				     DP_MAX_STRING_LEN - index,
3326 				     " %u:%u,",
3327 				     i, dp_stats_buf->tx_legacy_cck_rate[i]);
3328 	}
3329 	DP_PRINT_STATS("tx_legacy_cck_rate = %s ", str_buf);
3330 
3331 	index = 0;
3332 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3333 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_LEGACY_OFDM_STATS; i++) {
3334 		index += qdf_snprint(&str_buf[index],
3335 				     DP_MAX_STRING_LEN - index,
3336 				     " %u:%u,", i,
3337 				     dp_stats_buf->tx_legacy_ofdm_rate[i]);
3338 	}
3339 	DP_PRINT_STATS("tx_legacy_ofdm_rate = %s ", str_buf);
3340 
3341 	index = 0;
3342 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3343 	for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_LTF; i++) {
3344 		index += qdf_snprint(&str_buf[index],
3345 				     DP_MAX_STRING_LEN - index,
3346 				     " %u:%u,",
3347 				     i, dp_stats_buf->tx_he_ltf[i]);
3348 	}
3349 	DP_PRINT_STATS("tx_he_ltf = %s ", str_buf);
3350 
3351 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3352 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3353 		index += qdf_snprint(&str_buf[index],
3354 				     DP_MAX_STRING_LEN - index,
3355 				     " %u:%u,",
3356 				     i, dp_stats_buf->ofdma_tx_mcs[i]);
3357 	}
3358 	DP_PRINT_STATS("ofdma_tx_mcs = %s ", str_buf);
3359 
3360 	index = 0;
3361 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3362 	for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3363 		index += qdf_snprint(&str_buf[index],
3364 				     DP_MAX_STRING_LEN - index,
3365 				     " %u:%u,",
3366 				     i, dp_stats_buf->ac_mu_mimo_tx_mcs[i]);
3367 	}
3368 	DP_PRINT_STATS("ac_mu_mimo_tx_mcs = %s ", str_buf);
3369 
3370 	index = 0;
3371 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3372 	for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3373 		index += qdf_snprint(&str_buf[index],
3374 				     DP_MAX_STRING_LEN - index,
3375 				     " %u:%u,",
3376 				     i, dp_stats_buf->ax_mu_mimo_tx_mcs[i]);
3377 	}
3378 	DP_PRINT_STATS("ax_mu_mimo_tx_mcs = %s ", str_buf);
3379 
3380 	index = 0;
3381 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3382 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3383 		index += qdf_snprint(&str_buf[index],
3384 				     DP_MAX_STRING_LEN - index,
3385 				     " %u:%u,",
3386 				     i, dp_stats_buf->ofdma_tx_mcs[i]);
3387 	}
3388 	DP_PRINT_STATS("ofdma_tx_mcs = %s ", str_buf);
3389 
3390 	index = 0;
3391 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3392 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) {
3393 		index += qdf_snprint(&str_buf[index],
3394 				     DP_MAX_STRING_LEN - index,
3395 				     " %u:%u,",
3396 				     i, dp_stats_buf->ac_mu_mimo_tx_nss[i]);
3397 	}
3398 	DP_PRINT_STATS("ac_mu_mimo_tx_nss = %s ", str_buf);
3399 
3400 	index = 0;
3401 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3402 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) {
3403 		index += qdf_snprint(&str_buf[index],
3404 				     DP_MAX_STRING_LEN - index,
3405 				     " %u:%u,",
3406 				     i, dp_stats_buf->ax_mu_mimo_tx_nss[i]);
3407 	}
3408 	DP_PRINT_STATS("ax_mu_mimo_tx_nss = %s ", str_buf);
3409 
3410 	index = 0;
3411 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3412 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) {
3413 		index += qdf_snprint(&str_buf[index],
3414 				     DP_MAX_STRING_LEN - index,
3415 				     " %u:%u,",
3416 				     i, dp_stats_buf->ofdma_tx_nss[i]);
3417 	}
3418 	DP_PRINT_STATS("ofdma_tx_nss = %s ", str_buf);
3419 
3420 	index = 0;
3421 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3422 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
3423 		index += qdf_snprint(&str_buf[index],
3424 				     DP_MAX_STRING_LEN - index,
3425 				     " %u:%u,",
3426 				     i, dp_stats_buf->ac_mu_mimo_tx_bw[i]);
3427 	}
3428 	DP_PRINT_STATS("ac_mu_mimo_tx_bw = %s ", str_buf);
3429 
3430 	index = 0;
3431 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3432 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
3433 		index += qdf_snprint(&str_buf[index],
3434 				     DP_MAX_STRING_LEN - index,
3435 				     " %u:%u,",
3436 				     i, dp_stats_buf->ax_mu_mimo_tx_bw[i]);
3437 	}
3438 	DP_PRINT_STATS("ax_mu_mimo_tx_bw = %s ", str_buf);
3439 
3440 	index = 0;
3441 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3442 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
3443 		index += qdf_snprint(&str_buf[index],
3444 				     DP_MAX_STRING_LEN - index,
3445 				     " %u:%u,",
3446 				     i, dp_stats_buf->ofdma_tx_bw[i]);
3447 	}
3448 
3449 	DP_PRINT_STATS("ofdma_tx_bw = %s ", str_buf);
3450 
3451 	for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
3452 		index = 0;
3453 		qdf_mem_zero(ac_mu_mimo_tx_gi[j], DP_MAX_STRING_LEN);
3454 		for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3455 			index += qdf_snprint(&ac_mu_mimo_tx_gi[j][index],
3456 					     DP_MAX_STRING_LEN - index,
3457 					     " %u:%u,", i,
3458 					     dp_stats_buf->
3459 					     ac_mu_mimo_tx_gi[j][i]);
3460 		}
3461 		DP_PRINT_STATS("ac_mu_mimo_tx_gi[%u] = %s ",
3462 			       j, ac_mu_mimo_tx_gi[j]);
3463 	}
3464 
3465 	for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
3466 		index = 0;
3467 		qdf_mem_zero(ax_mu_mimo_tx_gi[j], DP_MAX_STRING_LEN);
3468 		for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3469 			index += qdf_snprint(&ax_mu_mimo_tx_gi[j][index],
3470 					DP_MAX_STRING_LEN - index,
3471 					" %u:%u,", i,
3472 					dp_stats_buf->ax_mu_mimo_tx_gi[j][i]);
3473 		}
3474 		DP_PRINT_STATS("ax_mu_mimo_tx_gi[%u] = %s ",
3475 			       j, ax_mu_mimo_tx_gi[j]);
3476 	}
3477 
3478 	for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
3479 		index = 0;
3480 		qdf_mem_zero(ofdma_tx_gi[j], DP_MAX_STRING_LEN);
3481 		for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3482 			index += qdf_snprint(&ofdma_tx_gi[j][index],
3483 					DP_MAX_STRING_LEN - index,
3484 					" %u:%u,", i,
3485 					dp_stats_buf->ofdma_tx_gi[j][i]);
3486 		}
3487 		DP_PRINT_STATS("ofdma_tx_gi[%u] = %s ",
3488 			       j, ofdma_tx_gi[j]);
3489 	}
3490 
3491 fail1:
3492 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
3493 		if (tx_gi[i])
3494 			qdf_mem_free(tx_gi[i]);
3495 		if (tx_gi_ext[i])
3496 			qdf_mem_free(tx_gi_ext[i]);
3497 		if (ac_mu_mimo_tx_gi[i])
3498 			qdf_mem_free(ac_mu_mimo_tx_gi[i]);
3499 		if (ax_mu_mimo_tx_gi[i])
3500 			qdf_mem_free(ax_mu_mimo_tx_gi[i]);
3501 		if (ofdma_tx_gi[i])
3502 			qdf_mem_free(ofdma_tx_gi[i]);
3503 	}
3504 	qdf_mem_free(str_buf);
3505 }
3506 
3507 /*
3508  * dp_print_rx_pdev_rate_ext_stats_tlv: display htt_rx_pdev_rate_ext_stats_tlv
3509  * @tag_buf: buffer containing the tlv htt_rx_pdev_rate_ext_stats_tlv
3510  *
3511  * return:void
3512  */
3513 static void dp_print_rx_pdev_rate_ext_stats_tlv(struct dp_pdev *pdev,
3514 						uint32_t *tag_buf)
3515 {
3516 	htt_rx_pdev_rate_ext_stats_tlv *dp_stats_buf =
3517 		(htt_rx_pdev_rate_ext_stats_tlv *)tag_buf;
3518 	uint8_t i, j;
3519 	uint16_t index = 0;
3520 	char *rx_gi_ext[HTT_RX_PDEV_STATS_NUM_GI_COUNTERS] = {0};
3521 	char *ul_ofdma_rx_gi_ext[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0};
3522 	char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
3523 
3524 	if (!str_buf) {
3525 		dp_err("Output buffer not allocated");
3526 		return;
3527 	}
3528 
3529 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
3530 		rx_gi_ext[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
3531 		if (!rx_gi_ext[i]) {
3532 			dp_err("Unable to allocate buffer for rx_gi_ext");
3533 			goto fail1;
3534 		}
3535 
3536 		ul_ofdma_rx_gi_ext[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
3537 		if (!ul_ofdma_rx_gi_ext[i]) {
3538 			dp_err("Unable to allocate buffer for ul_ofdma_rx_gi_ext");
3539 			goto fail1;
3540 		}
3541 	}
3542 
3543 	index = 0;
3544 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3545 	for (i = 0; i <  DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
3546 		index += qdf_snprint(&str_buf[index],
3547 				DP_MAX_STRING_LEN - index,
3548 				" %u:%u,", i, dp_stats_buf->rx_mcs_ext[i]);
3549 	}
3550 
3551 	for (i = 0; i <  DP_HTT_RX_PDEV_MCS_LEN_EXT2; i++) {
3552 		index += qdf_snprint(&str_buf[index],
3553 				DP_MAX_STRING_LEN - index,
3554 				" %u:%u,", i + DP_HTT_RX_PDEV_MCS_LEN_EXT,
3555 				 dp_stats_buf->rx_mcs_ext_2[i]);
3556 	}
3557 	DP_PRINT_STATS("rx_mcs_ext = %s ", str_buf);
3558 
3559 	index = 0;
3560 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3561 	for (i = 0; i <  DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
3562 		index += qdf_snprint(&str_buf[index],
3563 				DP_MAX_STRING_LEN - index,
3564 				" %u:%u,", i, dp_stats_buf->rx_stbc_ext[i]);
3565 	}
3566 	DP_PRINT_STATS("rx_stbc_ext = %s ", str_buf);
3567 
3568 	for (j = 0; j < DP_HTT_RX_GI_LEN; j++) {
3569 		index = 0;
3570 		qdf_mem_zero(rx_gi_ext[j], DP_MAX_STRING_LEN);
3571 		for (i = 0; i <  DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
3572 			index += qdf_snprint(&rx_gi_ext[j][index],
3573 					DP_MAX_STRING_LEN - index,
3574 					" %u:%u,", i,
3575 					dp_stats_buf->rx_gi_ext[j][i]);
3576 		}
3577 		DP_PRINT_STATS("rx_gi_ext[%u] = %s ", j, rx_gi_ext[j]);
3578 	}
3579 
3580 	index = 0;
3581 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3582 	for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
3583 		index += qdf_snprint(&str_buf[index],
3584 				     DP_MAX_STRING_LEN - index,
3585 				     " %u:%u,",
3586 				     i, dp_stats_buf->ul_ofdma_rx_mcs_ext[i]);
3587 	}
3588 	DP_PRINT_STATS("ul_ofdma_rx_mcs_ext = %s", str_buf);
3589 
3590 	for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
3591 		index = 0;
3592 		qdf_mem_zero(ul_ofdma_rx_gi_ext[j], DP_MAX_STRING_LEN);
3593 		for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
3594 			index += qdf_snprint(&ul_ofdma_rx_gi_ext[j][index],
3595 					     DP_MAX_STRING_LEN - index,
3596 					     " %u:%u,", i,
3597 					     dp_stats_buf->
3598 					     ul_ofdma_rx_gi_ext[j][i]);
3599 		}
3600 		DP_PRINT_STATS("ul_ofdma_rx_gi_ext[%u] = %s ",
3601 			       j, ul_ofdma_rx_gi_ext[j]);
3602 	}
3603 
3604 	index = 0;
3605 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3606 	for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
3607 		index += qdf_snprint(&str_buf[index],
3608 		DP_MAX_STRING_LEN - index,
3609 		" %u:%u,", i,
3610 		dp_stats_buf->rx_11ax_su_txbf_mcs_ext[i]);
3611 	}
3612 	DP_PRINT_STATS("rx_11ax_su_txbf_mcs_ext = %s ", str_buf);
3613 
3614 	index = 0;
3615 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3616 	for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
3617 		index += qdf_snprint(&str_buf[index],
3618 		DP_MAX_STRING_LEN - index,
3619 		" %u:%u,", i,
3620 		dp_stats_buf->rx_11ax_mu_txbf_mcs_ext[i]);
3621 	}
3622 	DP_PRINT_STATS("rx_11ax_mu_txbf_mcs_ext = %s ", str_buf);
3623 
3624 	index = 0;
3625 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3626 	for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
3627 		index += qdf_snprint(&str_buf[index],
3628 		DP_MAX_STRING_LEN - index,
3629 		" %u:%u,", i,
3630 		dp_stats_buf->rx_11ax_dl_ofdma_mcs_ext[i]);
3631 	}
3632 	DP_PRINT_STATS("rx_11ax_dl_ofdma_mcs_ext = %s ", str_buf);
3633 
3634 	index = 0;
3635 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3636 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_BW_EXT2_COUNTERS; i++) {
3637 		index += qdf_snprint(&str_buf[index],
3638 		DP_MAX_STRING_LEN - index,
3639 		" %u:%u,", i,
3640 		dp_stats_buf->rx_bw_ext[i]);
3641 	}
3642 	DP_PRINT_STATS("rx_bw_ext = %s ", str_buf);
3643 
3644 	index = 0;
3645 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3646 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_PUNCTURED_MODE_COUNTERS; i++) {
3647 		index += qdf_snprint(&str_buf[index],
3648 		DP_MAX_STRING_LEN - index,
3649 		" %u:%u,", i,
3650 		dp_stats_buf->rx_su_punctured_mode[i]);
3651 	}
3652 	DP_PRINT_STATS("rx_su_punctured_mode = %s ", str_buf);
3653 
3654 fail1:
3655 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
3656 		if (ul_ofdma_rx_gi_ext[i])
3657 			qdf_mem_free(ul_ofdma_rx_gi_ext[i]);
3658 		if (rx_gi_ext[i])
3659 			qdf_mem_free(rx_gi_ext[i]);
3660 	}
3661 
3662 	qdf_mem_free(str_buf);
3663 }
3664 
3665 /*
3666  * dp_print_rx_pdev_rate_stats_tlv: display htt_rx_pdev_rate_stats_tlv
3667  * @tag_buf: buffer containing the tlv htt_rx_pdev_rate_stats_tlv
3668  *
3669  * return:void
3670  */
3671 static void dp_print_rx_pdev_rate_stats_tlv(struct dp_pdev *pdev,
3672 					    uint32_t *tag_buf)
3673 {
3674 	htt_rx_pdev_rate_stats_tlv *dp_stats_buf =
3675 		(htt_rx_pdev_rate_stats_tlv *)tag_buf;
3676 	uint8_t i, j;
3677 	uint16_t index = 0;
3678 	char *rssi_chain[DP_HTT_RSSI_CHAIN_LEN];
3679 	char *rx_gi[HTT_RX_PDEV_STATS_NUM_GI_COUNTERS];
3680 	char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
3681 	char *ul_ofdma_rx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS];
3682 
3683 	if (!str_buf) {
3684 		dp_err("Output buffer not allocated");
3685 		return;
3686 	}
3687 
3688 	for (i = 0; i < DP_HTT_RSSI_CHAIN_LEN; i++) {
3689 		rssi_chain[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
3690 		if (!rssi_chain[i]) {
3691 			dp_err("Unable to allocate buffer for rssi_chain");
3692 			goto fail1;
3693 		}
3694 	}
3695 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
3696 		rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
3697 		if (!rx_gi[i]) {
3698 			dp_err("Unable to allocate buffer for rx_gi");
3699 			goto fail2;
3700 		}
3701 	}
3702 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
3703 		ul_ofdma_rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
3704 		if (!ul_ofdma_rx_gi[i]) {
3705 			dp_err("Unable to allocate buffer for ul_ofdma_rx_gi");
3706 			goto fail3;
3707 		}
3708 	}
3709 
3710 	DP_PRINT_STATS("ul_ofdma_data_rx_ppdu = %d",
3711 		       pdev->stats.ul_ofdma.data_rx_ppdu);
3712 
3713 	for (i = 0; i < OFDMA_NUM_USERS; i++) {
3714 		DP_PRINT_STATS("ul_ofdma data %d user = %d",
3715 			       i, pdev->stats.ul_ofdma.data_users[i]);
3716 	}
3717 
3718 	index = 0;
3719 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3720 	for (i = 0; i < OFDMA_NUM_RU_SIZE; i++) {
3721 		index += qdf_snprint(&str_buf[index],
3722 			DP_MAX_STRING_LEN - index,
3723 			" %u:%u,", i,
3724 			pdev->stats.ul_ofdma.data_rx_ru_size[i]);
3725 	}
3726 	DP_PRINT_STATS("ul_ofdma_data_rx_ru_size= %s", str_buf);
3727 
3728 	index = 0;
3729 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3730 	for (i = 0; i < OFDMA_NUM_RU_SIZE; i++) {
3731 		index += qdf_snprint(&str_buf[index],
3732 			DP_MAX_STRING_LEN - index,
3733 			" %u:%u,", i,
3734 			pdev->stats.ul_ofdma.nondata_rx_ru_size[i]);
3735 	}
3736 	DP_PRINT_STATS("ul_ofdma_nondata_rx_ru_size= %s", str_buf);
3737 
3738 	DP_PRINT_STATS("HTT_RX_PDEV_RATE_STATS_TLV:");
3739 	DP_PRINT_STATS("mac_id__word = %u",
3740 		       dp_stats_buf->mac_id__word);
3741 	DP_PRINT_STATS("nsts = %u",
3742 		       dp_stats_buf->nsts);
3743 	DP_PRINT_STATS("rx_ldpc = %u",
3744 		       dp_stats_buf->rx_ldpc);
3745 	DP_PRINT_STATS("rts_cnt = %u",
3746 		       dp_stats_buf->rts_cnt);
3747 	DP_PRINT_STATS("rssi_mgmt = %u",
3748 		       dp_stats_buf->rssi_mgmt);
3749 	DP_PRINT_STATS("rssi_data = %u",
3750 		       dp_stats_buf->rssi_data);
3751 	DP_PRINT_STATS("rssi_comb = %u",
3752 		       dp_stats_buf->rssi_comb);
3753 	DP_PRINT_STATS("rssi_in_dbm = %d",
3754 		       dp_stats_buf->rssi_in_dbm);
3755 	DP_PRINT_STATS("rx_11ax_su_ext = %u",
3756 		       dp_stats_buf->rx_11ax_su_ext);
3757 	DP_PRINT_STATS("rx_11ac_mumimo = %u",
3758 		       dp_stats_buf->rx_11ac_mumimo);
3759 	DP_PRINT_STATS("rx_11ax_mumimo = %u",
3760 		       dp_stats_buf->rx_11ax_mumimo);
3761 	DP_PRINT_STATS("rx_11ax_ofdma = %u",
3762 		       dp_stats_buf->rx_11ax_ofdma);
3763 	DP_PRINT_STATS("txbf = %u",
3764 		       dp_stats_buf->txbf);
3765 	DP_PRINT_STATS("rx_su_ndpa = %u",
3766 		       dp_stats_buf->rx_su_ndpa);
3767 	DP_PRINT_STATS("rx_br_poll = %u",
3768 		       dp_stats_buf->rx_br_poll);
3769 
3770 	index = 0;
3771 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3772 	for (i = 0; i <  DP_HTT_RX_MCS_LEN; i++) {
3773 		index += qdf_snprint(&str_buf[index],
3774 				DP_MAX_STRING_LEN - index,
3775 				" %u:%u,", i, dp_stats_buf->rx_mcs[i]);
3776 	}
3777 	DP_PRINT_STATS("rx_mcs = %s ", str_buf);
3778 
3779 	index = 0;
3780 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3781 	for (i = 0; i <  DP_HTT_RX_NSS_LEN; i++) {
3782 		/* 0 stands for NSS 1, 1 stands for NSS 2, etc. */
3783 		index += qdf_snprint(&str_buf[index],
3784 				DP_MAX_STRING_LEN - index,
3785 				" %u:%u,", (i + 1),
3786 				dp_stats_buf->rx_nss[i]);
3787 	}
3788 	DP_PRINT_STATS("rx_nss = %s ", str_buf);
3789 
3790 	index = 0;
3791 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3792 	for (i = 0; i <  DP_HTT_RX_DCM_LEN; i++) {
3793 		index += qdf_snprint(&str_buf[index],
3794 				DP_MAX_STRING_LEN - index,
3795 				" %u:%u,", i, dp_stats_buf->rx_dcm[i]);
3796 	}
3797 	DP_PRINT_STATS("rx_dcm = %s ", str_buf);
3798 
3799 	index = 0;
3800 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3801 	for (i = 0; i <  HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3802 		index += qdf_snprint(&str_buf[index],
3803 				DP_MAX_STRING_LEN - index,
3804 				" %u:%u,", i, dp_stats_buf->rx_stbc[i]);
3805 	}
3806 	DP_PRINT_STATS("rx_stbc = %s ", str_buf);
3807 
3808 	index = 0;
3809 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3810 	for (i = 0; i <  DP_HTT_RX_BW_LEN; i++) {
3811 		index += qdf_snprint(&str_buf[index],
3812 				DP_MAX_STRING_LEN - index,
3813 				" %u:%u,", i, dp_stats_buf->rx_bw[i]);
3814 	}
3815 	DP_PRINT_STATS("rx_bw = %s ", str_buf);
3816 
3817 	for (j = 0; j < DP_HTT_RSSI_CHAIN_LEN; j++) {
3818 		index = 0;
3819 		for (i = 0; i <  HTT_RX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
3820 			index += qdf_snprint(&rssi_chain[j][index],
3821 					DP_MAX_STRING_LEN - index,
3822 					" %u:%u,", i,
3823 					dp_stats_buf->rssi_chain[j][i]);
3824 		}
3825 		DP_PRINT_STATS("rssi_chain[%u] = %s ", j, rssi_chain[j]);
3826 	}
3827 
3828 	for (j = 0; j < DP_HTT_RX_GI_LEN; j++) {
3829 		index = 0;
3830 		qdf_mem_zero(rx_gi[j], DP_MAX_STRING_LEN);
3831 		for (i = 0; i <  HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3832 			index += qdf_snprint(&rx_gi[j][index],
3833 					DP_MAX_STRING_LEN - index,
3834 					" %u:%u,", i,
3835 					dp_stats_buf->rx_gi[j][i]);
3836 		}
3837 		DP_PRINT_STATS("rx_gi[%u] = %s ", j, rx_gi[j]);
3838 	}
3839 
3840 	index = 0;
3841 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3842 	for (i = 0; i <  DP_HTT_RX_PREAM_LEN; i++) {
3843 		index += qdf_snprint(&str_buf[index],
3844 				     DP_MAX_STRING_LEN - index,
3845 				     " %u:%u,",
3846 				     i,
3847 				     dp_stats_buf->rx_pream[i]);
3848 	}
3849 	DP_PRINT_STATS("rx_pream = %s", str_buf);
3850 
3851 	index = 0;
3852 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3853 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_LEGACY_CCK_STATS; i++) {
3854 		index += qdf_snprint(&str_buf[index],
3855 				     DP_MAX_STRING_LEN - index,
3856 				     " %u:%u,",
3857 				     i,
3858 				     dp_stats_buf->rx_legacy_cck_rate[i]);
3859 	}
3860 	DP_PRINT_STATS("rx_legacy_cck_rate = %s", str_buf);
3861 
3862 	index = 0;
3863 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3864 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_LEGACY_OFDM_STATS; i++) {
3865 		index += qdf_snprint(&str_buf[index],
3866 				     DP_MAX_STRING_LEN - index,
3867 				     " %u:%u,",
3868 				     i,
3869 				     dp_stats_buf->rx_legacy_ofdm_rate[i]);
3870 	}
3871 	DP_PRINT_STATS("rx_legacy_ofdm_rate = %s", str_buf);
3872 
3873 	index = 0;
3874 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3875 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3876 		index += qdf_snprint(&str_buf[index],
3877 				     DP_MAX_STRING_LEN - index,
3878 				     " %u:%u,",
3879 				     i, dp_stats_buf->ul_ofdma_rx_mcs[i]);
3880 	}
3881 	DP_PRINT_STATS("ul_ofdma_rx_mcs = %s", str_buf);
3882 
3883 	DP_PRINT_STATS("rx_11ax_ul_ofdma = %u",
3884 		       dp_stats_buf->rx_11ax_ul_ofdma);
3885 
3886 	for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
3887 		index = 0;
3888 		qdf_mem_zero(ul_ofdma_rx_gi[j], DP_MAX_STRING_LEN);
3889 		for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3890 			index += qdf_snprint(&ul_ofdma_rx_gi[j][index],
3891 					     DP_MAX_STRING_LEN - index,
3892 					     " %u:%u,", i,
3893 					     dp_stats_buf->
3894 					     ul_ofdma_rx_gi[j][i]);
3895 		}
3896 		DP_PRINT_STATS("ul_ofdma_rx_gi[%u] = %s ",
3897 			       j, ul_ofdma_rx_gi[j]);
3898 	}
3899 
3900 	index = 0;
3901 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3902 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) {
3903 		index += qdf_snprint(&str_buf[index],
3904 				DP_MAX_STRING_LEN - index,
3905 				" %u:%u,", i, dp_stats_buf->ul_ofdma_rx_nss[i]);
3906 	}
3907 	DP_PRINT_STATS("ul_ofdma_rx_nss = %s", str_buf);
3908 
3909 	index = 0;
3910 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3911 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
3912 		index += qdf_snprint(&str_buf[index],
3913 				DP_MAX_STRING_LEN - index,
3914 				" %u:%u,", i, dp_stats_buf->ul_ofdma_rx_bw[i]);
3915 	}
3916 	DP_PRINT_STATS("ul_ofdma_rx_bw = %s", str_buf);
3917 	DP_PRINT_STATS("ul_ofdma_rx_stbc = %u",
3918 		       dp_stats_buf->ul_ofdma_rx_stbc);
3919 	DP_PRINT_STATS("ul_ofdma_rx_ldpc = %u",
3920 		       dp_stats_buf->ul_ofdma_rx_ldpc);
3921 
3922 	index = 0;
3923 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3924 	for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) {
3925 		index += qdf_snprint(&str_buf[index],
3926 				     DP_MAX_STRING_LEN - index,
3927 				     " %u:%u,", i,
3928 				     dp_stats_buf->rx_ulofdma_non_data_ppdu[i]);
3929 	}
3930 	DP_PRINT_STATS("rx_ulofdma_non_data_ppdu = %s", str_buf);
3931 
3932 	index = 0;
3933 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3934 	for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) {
3935 		index += qdf_snprint(&str_buf[index],
3936 				     DP_MAX_STRING_LEN - index,
3937 				     " %u:%u,",
3938 				     i, dp_stats_buf->rx_ulofdma_data_ppdu[i]);
3939 	}
3940 	DP_PRINT_STATS("rx_ulofdma_data_ppdu = %s", str_buf);
3941 
3942 	index = 0;
3943 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3944 	for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) {
3945 		index += qdf_snprint(&str_buf[index],
3946 				     DP_MAX_STRING_LEN - index,
3947 				     " %u:%u,",
3948 				     i, dp_stats_buf->rx_ulofdma_mpdu_ok[i]);
3949 	}
3950 	DP_PRINT_STATS("rx_ulofdma_mpdu_ok = %s", str_buf);
3951 
3952 	index = 0;
3953 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3954 	for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) {
3955 		index += qdf_snprint(&str_buf[index],
3956 				     DP_MAX_STRING_LEN - index,
3957 				     " %u:%u,",
3958 				     i, dp_stats_buf->rx_ulofdma_mpdu_fail[i]);
3959 	}
3960 	DP_PRINT_STATS("rx_ulofdma_mpdu_fail = %s", str_buf);
3961 
3962 	index = 0;
3963 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3964 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3965 		index += qdf_snprint(&str_buf[index],
3966 				     DP_MAX_STRING_LEN - index,
3967 				     " %u:%u,",
3968 				     i, dp_stats_buf->rx_11ax_su_txbf_mcs[i]);
3969 	}
3970 	DP_PRINT_STATS("rx_11ax_su_txbf_mcs = %s", str_buf);
3971 
3972 	index = 0;
3973 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3974 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3975 		index += qdf_snprint(&str_buf[index],
3976 				     DP_MAX_STRING_LEN - index,
3977 				     " %u:%u,",
3978 				     i, dp_stats_buf->rx_11ax_mu_txbf_mcs[i]);
3979 	}
3980 	DP_PRINT_STATS("rx_11ax_mu_txbf_mcs = %s", str_buf);
3981 
3982 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++)
3983 		qdf_mem_free(ul_ofdma_rx_gi[i]);
3984 
3985 fail3:
3986 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++)
3987 		qdf_mem_free(rx_gi[i]);
3988 fail2:
3989 	for (i = 0; i < DP_HTT_RSSI_CHAIN_LEN; i++)
3990 		qdf_mem_free(rssi_chain[i]);
3991 fail1:
3992 	qdf_mem_free(str_buf);
3993 
3994 }
3995 
3996 /*
3997  * dp_print_rx_soc_fw_stats_tlv: display htt_rx_soc_fw_stats_tlv
3998  * @tag_buf: buffer containing the tlv htt_rx_soc_fw_stats_tlv
3999  *
4000  * return:void
4001  */
4002 static void dp_print_rx_soc_fw_stats_tlv(uint32_t *tag_buf)
4003 {
4004 	htt_rx_soc_fw_stats_tlv *dp_stats_buf =
4005 		(htt_rx_soc_fw_stats_tlv *)tag_buf;
4006 
4007 	DP_PRINT_STATS("HTT_RX_SOC_FW_STATS_TLV:");
4008 	DP_PRINT_STATS("fw_reo_ring_data_msdu = %u",
4009 		       dp_stats_buf->fw_reo_ring_data_msdu);
4010 	DP_PRINT_STATS("fw_to_host_data_msdu_bcmc = %u",
4011 		       dp_stats_buf->fw_to_host_data_msdu_bcmc);
4012 	DP_PRINT_STATS("fw_to_host_data_msdu_uc = %u",
4013 		       dp_stats_buf->fw_to_host_data_msdu_uc);
4014 	DP_PRINT_STATS("ofld_remote_data_buf_recycle_cnt = %u",
4015 		       dp_stats_buf->ofld_remote_data_buf_recycle_cnt);
4016 	DP_PRINT_STATS("ofld_remote_free_buf_indication_cnt = %u",
4017 		       dp_stats_buf->ofld_remote_free_buf_indication_cnt);
4018 	DP_PRINT_STATS("ofld_buf_to_host_data_msdu_uc = %u ",
4019 		       dp_stats_buf->ofld_buf_to_host_data_msdu_uc);
4020 	DP_PRINT_STATS("reo_fw_ring_to_host_data_msdu_uc = %u ",
4021 		       dp_stats_buf->reo_fw_ring_to_host_data_msdu_uc);
4022 	DP_PRINT_STATS("wbm_sw_ring_reap = %u ",
4023 		       dp_stats_buf->wbm_sw_ring_reap);
4024 	DP_PRINT_STATS("wbm_forward_to_host_cnt = %u ",
4025 		       dp_stats_buf->wbm_forward_to_host_cnt);
4026 	DP_PRINT_STATS("wbm_target_recycle_cnt = %u ",
4027 		       dp_stats_buf->wbm_target_recycle_cnt);
4028 	DP_PRINT_STATS("target_refill_ring_recycle_cnt = %u",
4029 		       dp_stats_buf->target_refill_ring_recycle_cnt);
4030 
4031 }
4032 
4033 /*
4034  * dp_print_rx_soc_fw_refill_ring_empty_tlv_v: display
4035  *					htt_rx_soc_fw_refill_ring_empty_tlv_v
4036  * @tag_buf: buffer containing the tlv htt_rx_soc_fw_refill_ring_empty_tlv_v
4037  *
4038  * return:void
4039  */
4040 static void dp_print_rx_soc_fw_refill_ring_empty_tlv_v(uint32_t *tag_buf)
4041 {
4042 	htt_rx_soc_fw_refill_ring_empty_tlv_v *dp_stats_buf =
4043 		(htt_rx_soc_fw_refill_ring_empty_tlv_v *)tag_buf;
4044 	uint8_t i;
4045 	uint16_t index = 0;
4046 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
4047 	char *refill_ring_empty_cnt = qdf_mem_malloc(DP_MAX_STRING_LEN);
4048 
4049 	if (!refill_ring_empty_cnt) {
4050 		dp_stats_err("Output buffer not allocated");
4051 		return;
4052 	}
4053 
4054 	tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_STATS_REFILL_MAX_RING);
4055 
4056 	DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_EMPTY_TLV_V:");
4057 	for (i = 0; i <  tag_len; i++) {
4058 		index += qdf_snprint(&refill_ring_empty_cnt[index],
4059 				DP_MAX_STRING_LEN - index,
4060 				" %u:%u,", i,
4061 				dp_stats_buf->refill_ring_empty_cnt[i]);
4062 	}
4063 	DP_PRINT_STATS("refill_ring_empty_cnt = %s\n",
4064 		       refill_ring_empty_cnt);
4065 	qdf_mem_free(refill_ring_empty_cnt);
4066 }
4067 
4068 /*
4069  * dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v: display
4070  *				htt_rx_soc_fw_refill_ring_num_refill_tlv_v
4071  * @tag_buf: buffer containing the tlv htt_rx_soc_fw_refill_ring_num_refill_tlv
4072  *
4073  * return:void
4074  */
4075 static void dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v(
4076 		uint32_t *tag_buf)
4077 {
4078 	htt_rx_soc_fw_refill_ring_num_refill_tlv_v *dp_stats_buf =
4079 		(htt_rx_soc_fw_refill_ring_num_refill_tlv_v *)tag_buf;
4080 	uint8_t i;
4081 	uint16_t index = 0;
4082 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
4083 	char *refill_ring_num_refill = qdf_mem_malloc(DP_MAX_STRING_LEN);
4084 
4085 	if (!refill_ring_num_refill) {
4086 		dp_stats_err("Output buffer not allocated");
4087 		return;
4088 	}
4089 
4090 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_URRN_STATS);
4091 
4092 	DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_REFILL_TLV_V:");
4093 	for (i = 0; i <  tag_len; i++) {
4094 		index += qdf_snprint(&refill_ring_num_refill[index],
4095 				DP_MAX_STRING_LEN - index,
4096 				" %u:%u,", i,
4097 				dp_stats_buf->refill_ring_num_refill[i]);
4098 	}
4099 	DP_PRINT_STATS("refill_ring_num_refill = %s\n",
4100 		       refill_ring_num_refill);
4101 	qdf_mem_free(refill_ring_num_refill);
4102 }
4103 
4104 /*
4105  * dp_print_rx_pdev_fw_stats_tlv: display htt_rx_pdev_fw_stats_tlv
4106  * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_stats_tlv
4107  *
4108  * return:void
4109  */
4110 static void dp_print_rx_pdev_fw_stats_tlv(uint32_t *tag_buf)
4111 {
4112 	htt_rx_pdev_fw_stats_tlv *dp_stats_buf =
4113 		(htt_rx_pdev_fw_stats_tlv *)tag_buf;
4114 	uint8_t i;
4115 	uint16_t index = 0;
4116 	char fw_ring_mgmt_subtype[DP_MAX_STRING_LEN];
4117 	char fw_ring_ctrl_subtype[DP_MAX_STRING_LEN];
4118 
4119 	DP_PRINT_STATS("HTT_RX_PDEV_FW_STATS_TLV:");
4120 	DP_PRINT_STATS("mac_id__word = %u",
4121 		       dp_stats_buf->mac_id__word);
4122 	DP_PRINT_STATS("ppdu_recvd = %u",
4123 		       dp_stats_buf->ppdu_recvd);
4124 	DP_PRINT_STATS("mpdu_cnt_fcs_ok = %u",
4125 		       dp_stats_buf->mpdu_cnt_fcs_ok);
4126 	DP_PRINT_STATS("mpdu_cnt_fcs_err = %u",
4127 		       dp_stats_buf->mpdu_cnt_fcs_err);
4128 	DP_PRINT_STATS("tcp_msdu_cnt = %u",
4129 		       dp_stats_buf->tcp_msdu_cnt);
4130 	DP_PRINT_STATS("tcp_ack_msdu_cnt = %u",
4131 		       dp_stats_buf->tcp_ack_msdu_cnt);
4132 	DP_PRINT_STATS("udp_msdu_cnt = %u",
4133 		       dp_stats_buf->udp_msdu_cnt);
4134 	DP_PRINT_STATS("other_msdu_cnt = %u",
4135 		       dp_stats_buf->other_msdu_cnt);
4136 	DP_PRINT_STATS("fw_ring_mpdu_ind = %u",
4137 		       dp_stats_buf->fw_ring_mpdu_ind);
4138 
4139 	for (i = 0; i <  DP_HTT_FW_RING_MGMT_SUBTYPE_LEN; i++) {
4140 		index += qdf_snprint(&fw_ring_mgmt_subtype[index],
4141 				DP_MAX_STRING_LEN - index,
4142 				" %u:%u,", i,
4143 				dp_stats_buf->fw_ring_mgmt_subtype[i]);
4144 	}
4145 	DP_PRINT_STATS("fw_ring_mgmt_subtype = %s ", fw_ring_mgmt_subtype);
4146 
4147 	index = 0;
4148 	for (i = 0; i <  DP_HTT_FW_RING_CTRL_SUBTYPE_LEN; i++) {
4149 		index += qdf_snprint(&fw_ring_ctrl_subtype[index],
4150 				DP_MAX_STRING_LEN - index,
4151 				" %u:%u,", i,
4152 				dp_stats_buf->fw_ring_ctrl_subtype[i]);
4153 	}
4154 	DP_PRINT_STATS("fw_ring_ctrl_subtype = %s ", fw_ring_ctrl_subtype);
4155 	DP_PRINT_STATS("fw_ring_mcast_data_msdu = %u",
4156 		       dp_stats_buf->fw_ring_mcast_data_msdu);
4157 	DP_PRINT_STATS("fw_ring_bcast_data_msdu = %u",
4158 		       dp_stats_buf->fw_ring_bcast_data_msdu);
4159 	DP_PRINT_STATS("fw_ring_ucast_data_msdu = %u",
4160 		       dp_stats_buf->fw_ring_ucast_data_msdu);
4161 	DP_PRINT_STATS("fw_ring_null_data_msdu = %u",
4162 		       dp_stats_buf->fw_ring_null_data_msdu);
4163 	DP_PRINT_STATS("fw_ring_mpdu_drop = %u",
4164 		       dp_stats_buf->fw_ring_mpdu_drop);
4165 	DP_PRINT_STATS("ofld_local_data_ind_cnt = %u",
4166 		       dp_stats_buf->ofld_local_data_ind_cnt);
4167 	DP_PRINT_STATS("ofld_local_data_buf_recycle_cnt = %u",
4168 		       dp_stats_buf->ofld_local_data_buf_recycle_cnt);
4169 	DP_PRINT_STATS("drx_local_data_ind_cnt = %u",
4170 		       dp_stats_buf->drx_local_data_ind_cnt);
4171 	DP_PRINT_STATS("drx_local_data_buf_recycle_cnt = %u",
4172 		       dp_stats_buf->drx_local_data_buf_recycle_cnt);
4173 	DP_PRINT_STATS("local_nondata_ind_cnt = %u",
4174 		       dp_stats_buf->local_nondata_ind_cnt);
4175 	DP_PRINT_STATS("local_nondata_buf_recycle_cnt = %u",
4176 		       dp_stats_buf->local_nondata_buf_recycle_cnt);
4177 	DP_PRINT_STATS("fw_status_buf_ring_refill_cnt = %u",
4178 		       dp_stats_buf->fw_status_buf_ring_refill_cnt);
4179 	DP_PRINT_STATS("fw_status_buf_ring_empty_cnt = %u",
4180 		       dp_stats_buf->fw_status_buf_ring_empty_cnt);
4181 	DP_PRINT_STATS("fw_pkt_buf_ring_refill_cnt = %u",
4182 		       dp_stats_buf->fw_pkt_buf_ring_refill_cnt);
4183 	DP_PRINT_STATS("fw_pkt_buf_ring_empty_cnt = %u",
4184 		       dp_stats_buf->fw_pkt_buf_ring_empty_cnt);
4185 	DP_PRINT_STATS("fw_link_buf_ring_refill_cnt = %u",
4186 		       dp_stats_buf->fw_link_buf_ring_refill_cnt);
4187 	DP_PRINT_STATS("fw_link_buf_ring_empty_cnt = %u",
4188 		       dp_stats_buf->fw_link_buf_ring_empty_cnt);
4189 	DP_PRINT_STATS("host_pkt_buf_ring_refill_cnt = %u",
4190 		       dp_stats_buf->host_pkt_buf_ring_refill_cnt);
4191 	DP_PRINT_STATS("host_pkt_buf_ring_empty_cnt = %u",
4192 		       dp_stats_buf->host_pkt_buf_ring_empty_cnt);
4193 	DP_PRINT_STATS("mon_pkt_buf_ring_refill_cnt = %u",
4194 		       dp_stats_buf->mon_pkt_buf_ring_refill_cnt);
4195 	DP_PRINT_STATS("mon_pkt_buf_ring_empty_cnt = %u",
4196 		       dp_stats_buf->mon_pkt_buf_ring_empty_cnt);
4197 	DP_PRINT_STATS("mon_status_buf_ring_refill_cnt = %u",
4198 		       dp_stats_buf->mon_status_buf_ring_refill_cnt);
4199 	DP_PRINT_STATS("mon_status_buf_ring_empty_cnt = %u",
4200 		       dp_stats_buf->mon_status_buf_ring_empty_cnt);
4201 	DP_PRINT_STATS("mon_desc_buf_ring_refill_cnt = %u",
4202 		       dp_stats_buf->mon_desc_buf_ring_refill_cnt);
4203 	DP_PRINT_STATS("mon_desc_buf_ring_empty_cnt = %u",
4204 		       dp_stats_buf->mon_desc_buf_ring_empty_cnt);
4205 	DP_PRINT_STATS("mon_dest_ring_update_cnt = %u",
4206 		       dp_stats_buf->mon_dest_ring_update_cnt);
4207 	DP_PRINT_STATS("mon_dest_ring_full_cnt = %u",
4208 		       dp_stats_buf->mon_dest_ring_full_cnt);
4209 	DP_PRINT_STATS("rx_suspend_cnt = %u",
4210 		       dp_stats_buf->rx_suspend_cnt);
4211 	DP_PRINT_STATS("rx_suspend_fail_cnt = %u",
4212 		       dp_stats_buf->rx_suspend_fail_cnt);
4213 	DP_PRINT_STATS("rx_resume_cnt = %u",
4214 		       dp_stats_buf->rx_resume_cnt);
4215 	DP_PRINT_STATS("rx_resume_fail_cnt = %u",
4216 		       dp_stats_buf->rx_resume_fail_cnt);
4217 	DP_PRINT_STATS("rx_ring_switch_cnt = %u",
4218 		       dp_stats_buf->rx_ring_switch_cnt);
4219 	DP_PRINT_STATS("rx_ring_restore_cnt = %u",
4220 		       dp_stats_buf->rx_ring_restore_cnt);
4221 	DP_PRINT_STATS("rx_flush_cnt = %u\n",
4222 		       dp_stats_buf->rx_flush_cnt);
4223 }
4224 
4225 /*
4226  * dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v: display
4227  *				htt_rx_pdev_fw_ring_mpdu_err_tlv_v
4228  * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_ring_mpdu_err_tlv_v
4229  *
4230  * return:void
4231  */
4232 static void dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v(uint32_t *tag_buf)
4233 {
4234 	htt_rx_pdev_fw_ring_mpdu_err_tlv_v *dp_stats_buf =
4235 		(htt_rx_pdev_fw_ring_mpdu_err_tlv_v *)tag_buf;
4236 	uint8_t i;
4237 	uint16_t index = 0;
4238 	char *fw_ring_mpdu_err = qdf_mem_malloc(DP_MAX_STRING_LEN);
4239 
4240 	if (!fw_ring_mpdu_err) {
4241 		dp_stats_err("Output buffer not allocated");
4242 		return;
4243 	}
4244 
4245 	DP_PRINT_STATS("HTT_RX_PDEV_FW_RING_MPDU_ERR_TLV_V:");
4246 	for (i = 0; i <  DP_HTT_FW_RING_MPDU_ERR_LEN; i++) {
4247 		index += qdf_snprint(&fw_ring_mpdu_err[index],
4248 				DP_MAX_STRING_LEN - index,
4249 				" %u:%u,", i,
4250 				dp_stats_buf->fw_ring_mpdu_err[i]);
4251 	}
4252 	DP_PRINT_STATS("fw_ring_mpdu_err = %s\n", fw_ring_mpdu_err);
4253 	qdf_mem_free(fw_ring_mpdu_err);
4254 }
4255 
4256 /*
4257  * dp_print_rx_pdev_fw_mpdu_drop_tlv_v: display htt_rx_pdev_fw_mpdu_drop_tlv_v
4258  * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_mpdu_drop_tlv_v
4259  *
4260  * return:void
4261  */
4262 static void dp_print_rx_pdev_fw_mpdu_drop_tlv_v(uint32_t *tag_buf)
4263 {
4264 	htt_rx_pdev_fw_mpdu_drop_tlv_v *dp_stats_buf =
4265 		(htt_rx_pdev_fw_mpdu_drop_tlv_v *)tag_buf;
4266 	uint8_t i;
4267 	uint16_t index = 0;
4268 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
4269 	char *fw_mpdu_drop = qdf_mem_malloc(DP_MAX_STRING_LEN);
4270 
4271 	if (!fw_mpdu_drop) {
4272 		dp_stats_err("Output buffer not allocated");
4273 		return;
4274 	}
4275 
4276 	tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_STATS_FW_DROP_REASON_MAX);
4277 
4278 	DP_PRINT_STATS("HTT_RX_PDEV_FW_MPDU_DROP_TLV_V:");
4279 	for (i = 0; i <  tag_len; i++) {
4280 		index += qdf_snprint(&fw_mpdu_drop[index],
4281 				DP_MAX_STRING_LEN - index,
4282 				" %u:%u,", i, dp_stats_buf->fw_mpdu_drop[i]);
4283 	}
4284 	DP_PRINT_STATS("fw_mpdu_drop = %s\n", fw_mpdu_drop);
4285 	qdf_mem_free(fw_mpdu_drop);
4286 }
4287 
4288 /*
4289  * dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv() - Accounts for rxdma error
4290  * packets
4291  *
4292  * tag_buf - Buffer
4293  * Return - NULL
4294  */
4295 static void dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv(uint32_t *tag_buf)
4296 {
4297 	htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v *dp_stats_buf =
4298 		(htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v *)tag_buf;
4299 
4300 	uint8_t i;
4301 	uint16_t index = 0;
4302 	char rxdma_err_cnt[DP_MAX_STRING_LEN];
4303 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
4304 
4305 	tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_RXDMA_MAX_ERR_CODE);
4306 
4307 	DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_RXDMA_ERR_TLV_V");
4308 
4309 	for (i = 0; i <  tag_len; i++) {
4310 		index += snprintf(&rxdma_err_cnt[index],
4311 				DP_MAX_STRING_LEN - index,
4312 				" %u:%u,", i,
4313 				dp_stats_buf->rxdma_err[i]);
4314 	}
4315 
4316 	DP_PRINT_STATS("rxdma_err = %s\n", rxdma_err_cnt);
4317 }
4318 
4319 /*
4320  * dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv() - Accounts for reo error
4321  * packets
4322  *
4323  * tag_buf - Buffer
4324  * Return - NULL
4325  */
4326 static void dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv(uint32_t *tag_buf)
4327 {
4328 	htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v *dp_stats_buf =
4329 		(htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v *)tag_buf;
4330 
4331 	uint8_t i;
4332 	uint16_t index = 0;
4333 	char reo_err_cnt[DP_MAX_STRING_LEN];
4334 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
4335 
4336 	tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_REO_MAX_ERR_CODE);
4337 
4338 	DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_REO_ERR_TLV_V");
4339 
4340 	for (i = 0; i <  tag_len; i++) {
4341 		index += snprintf(&reo_err_cnt[index],
4342 				DP_MAX_STRING_LEN - index,
4343 				" %u:%u,", i,
4344 				dp_stats_buf->reo_err[i]);
4345 	}
4346 
4347 	DP_PRINT_STATS("reo_err = %s\n", reo_err_cnt);
4348 }
4349 
4350 /*
4351  * dp_print_rx_reo_debug_stats_tlv() - REO Statistics
4352  *
4353  * tag_buf - Buffer
4354  * Return - NULL
4355  */
4356 static void dp_print_rx_reo_debug_stats_tlv(uint32_t *tag_buf)
4357 {
4358 	htt_rx_reo_resource_stats_tlv_v *dp_stats_buf =
4359 			(htt_rx_reo_resource_stats_tlv_v *)tag_buf;
4360 
4361 	DP_PRINT_STATS("HTT_RX_REO_RESOURCE_STATS_TLV");
4362 
4363 	DP_PRINT_STATS("sample_id: %u ",
4364 		       dp_stats_buf->sample_id);
4365 	DP_PRINT_STATS("total_max: %u ",
4366 		       dp_stats_buf->total_max);
4367 	DP_PRINT_STATS("total_avg: %u ",
4368 		       dp_stats_buf->total_avg);
4369 	DP_PRINT_STATS("total_sample: %u ",
4370 		       dp_stats_buf->total_sample);
4371 	DP_PRINT_STATS("non_zeros_avg: %u ",
4372 		       dp_stats_buf->non_zeros_avg);
4373 	DP_PRINT_STATS("non_zeros_sample: %u ",
4374 		       dp_stats_buf->non_zeros_sample);
4375 	DP_PRINT_STATS("last_non_zeros_max: %u ",
4376 		       dp_stats_buf->last_non_zeros_max);
4377 	DP_PRINT_STATS("last_non_zeros_min: %u ",
4378 		       dp_stats_buf->last_non_zeros_min);
4379 	DP_PRINT_STATS("last_non_zeros_avg: %u ",
4380 		       dp_stats_buf->last_non_zeros_avg);
4381 	DP_PRINT_STATS("last_non_zeros_sample: %u\n ",
4382 		       dp_stats_buf->last_non_zeros_sample);
4383 }
4384 
4385 /*
4386  * dp_print_rx_pdev_fw_stats_phy_err_tlv() - Accounts for phy errors
4387  *
4388  * tag_buf - Buffer
4389  * Return - NULL
4390  */
4391 static void dp_print_rx_pdev_fw_stats_phy_err_tlv(uint32_t *tag_buf)
4392 {
4393 	htt_rx_pdev_fw_stats_phy_err_tlv *dp_stats_buf =
4394 		(htt_rx_pdev_fw_stats_phy_err_tlv *)tag_buf;
4395 
4396 	uint8_t i = 0;
4397 	uint16_t index = 0;
4398 	char phy_errs[DP_MAX_STRING_LEN];
4399 
4400 	DP_PRINT_STATS("HTT_RX_PDEV_FW_STATS_PHY_ERR_TLV");
4401 
4402 	DP_PRINT_STATS("mac_id_word: %u",
4403 		       dp_stats_buf->mac_id__word);
4404 	DP_PRINT_STATS("total_phy_err_cnt: %u",
4405 		       dp_stats_buf->total_phy_err_cnt);
4406 
4407 	for (i = 0; i < HTT_STATS_PHY_ERR_MAX; i++) {
4408 		index += snprintf(&phy_errs[index],
4409 				DP_MAX_STRING_LEN - index,
4410 				" %u:%u,", i, dp_stats_buf->phy_err[i]);
4411 	}
4412 
4413 	DP_PRINT_STATS("phy_errs: %s\n",  phy_errs);
4414 }
4415 
4416 /*
4417  * dp_htt_stats_print_tag: function to select the tag type and
4418  * print the corresponding tag structure
4419  * @pdev: pdev pointer
4420  * @tag_type: tag type that is to be printed
4421  * @tag_buf: pointer to the tag structure
4422  *
4423  * return: void
4424  */
4425 void dp_htt_stats_print_tag(struct dp_pdev *pdev,
4426 			    uint8_t tag_type, uint32_t *tag_buf)
4427 {
4428 	switch (tag_type) {
4429 	case HTT_STATS_TX_PDEV_CMN_TAG:
4430 		dp_print_tx_pdev_stats_cmn_tlv(tag_buf);
4431 		break;
4432 	case HTT_STATS_TX_PDEV_UNDERRUN_TAG:
4433 		dp_print_tx_pdev_stats_urrn_tlv_v(tag_buf);
4434 		break;
4435 	case HTT_STATS_TX_PDEV_SIFS_TAG:
4436 		dp_print_tx_pdev_stats_sifs_tlv_v(tag_buf);
4437 		break;
4438 	case HTT_STATS_TX_PDEV_FLUSH_TAG:
4439 		dp_print_tx_pdev_stats_flush_tlv_v(tag_buf);
4440 		break;
4441 
4442 	case HTT_STATS_TX_PDEV_PHY_ERR_TAG:
4443 		dp_print_tx_pdev_stats_phy_err_tlv_v(tag_buf);
4444 		break;
4445 
4446 	case HTT_STATS_STRING_TAG:
4447 		dp_print_stats_string_tlv(tag_buf);
4448 		break;
4449 
4450 	case HTT_STATS_TX_HWQ_CMN_TAG:
4451 		dp_print_tx_hwq_stats_cmn_tlv(tag_buf);
4452 		break;
4453 
4454 	case HTT_STATS_TX_HWQ_DIFS_LATENCY_TAG:
4455 		dp_print_tx_hwq_difs_latency_stats_tlv_v(tag_buf);
4456 		break;
4457 
4458 	case HTT_STATS_TX_HWQ_CMD_RESULT_TAG:
4459 		dp_print_tx_hwq_cmd_result_stats_tlv_v(tag_buf);
4460 		break;
4461 
4462 	case HTT_STATS_TX_HWQ_CMD_STALL_TAG:
4463 		dp_print_tx_hwq_cmd_stall_stats_tlv_v(tag_buf);
4464 		break;
4465 
4466 	case HTT_STATS_TX_HWQ_FES_STATUS_TAG:
4467 		dp_print_tx_hwq_fes_result_stats_tlv_v(tag_buf);
4468 		break;
4469 
4470 	case HTT_STATS_TX_TQM_GEN_MPDU_TAG:
4471 		dp_print_tx_tqm_gen_mpdu_stats_tlv_v(tag_buf);
4472 		break;
4473 
4474 	case HTT_STATS_TX_TQM_LIST_MPDU_TAG:
4475 		dp_print_tx_tqm_list_mpdu_stats_tlv_v(tag_buf);
4476 		break;
4477 
4478 	case HTT_STATS_TX_TQM_LIST_MPDU_CNT_TAG:
4479 		dp_print_tx_tqm_list_mpdu_cnt_tlv_v(tag_buf);
4480 		break;
4481 
4482 	case HTT_STATS_TX_TQM_CMN_TAG:
4483 		dp_print_tx_tqm_cmn_stats_tlv(tag_buf);
4484 		break;
4485 
4486 	case HTT_STATS_TX_TQM_PDEV_TAG:
4487 		dp_print_tx_tqm_pdev_stats_tlv_v(tag_buf);
4488 		break;
4489 
4490 	case HTT_STATS_TX_TQM_CMDQ_STATUS_TAG:
4491 		dp_print_tx_tqm_cmdq_status_tlv(tag_buf);
4492 		break;
4493 
4494 	case HTT_STATS_TX_DE_EAPOL_PACKETS_TAG:
4495 		dp_print_tx_de_eapol_packets_stats_tlv(tag_buf);
4496 		break;
4497 
4498 	case HTT_STATS_TX_DE_CLASSIFY_FAILED_TAG:
4499 		dp_print_tx_de_classify_failed_stats_tlv(tag_buf);
4500 		break;
4501 
4502 	case HTT_STATS_TX_DE_CLASSIFY_STATS_TAG:
4503 		dp_print_tx_de_classify_stats_tlv(tag_buf);
4504 		break;
4505 
4506 	case HTT_STATS_TX_DE_CLASSIFY_STATUS_TAG:
4507 		dp_print_tx_de_classify_status_stats_tlv(tag_buf);
4508 		break;
4509 
4510 	case HTT_STATS_TX_DE_ENQUEUE_PACKETS_TAG:
4511 		dp_print_tx_de_enqueue_packets_stats_tlv(tag_buf);
4512 		break;
4513 
4514 	case HTT_STATS_TX_DE_ENQUEUE_DISCARD_TAG:
4515 		dp_print_tx_de_enqueue_discard_stats_tlv(tag_buf);
4516 		break;
4517 
4518 	case HTT_STATS_TX_DE_CMN_TAG:
4519 		dp_print_tx_de_cmn_stats_tlv(tag_buf);
4520 		break;
4521 
4522 	case HTT_STATS_RING_IF_TAG:
4523 		dp_print_ring_if_stats_tlv(tag_buf);
4524 		break;
4525 
4526 	case HTT_STATS_TX_PDEV_MU_MIMO_STATS_TAG:
4527 		dp_print_tx_pdev_mu_mimo_sch_stats_tlv(tag_buf);
4528 		break;
4529 
4530 	case HTT_STATS_SFM_CMN_TAG:
4531 		dp_print_sfm_cmn_tlv(tag_buf);
4532 		break;
4533 
4534 	case HTT_STATS_SRING_STATS_TAG:
4535 		dp_print_sring_stats_tlv(tag_buf);
4536 		break;
4537 
4538 	case HTT_STATS_RX_PDEV_FW_STATS_TAG:
4539 		dp_print_rx_pdev_fw_stats_tlv(tag_buf);
4540 		break;
4541 
4542 	case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG:
4543 		dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v(tag_buf);
4544 		break;
4545 
4546 	case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG:
4547 		dp_print_rx_pdev_fw_mpdu_drop_tlv_v(tag_buf);
4548 		break;
4549 
4550 	case HTT_STATS_RX_SOC_FW_STATS_TAG:
4551 		dp_print_rx_soc_fw_stats_tlv(tag_buf);
4552 		break;
4553 
4554 	case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG:
4555 		dp_print_rx_soc_fw_refill_ring_empty_tlv_v(tag_buf);
4556 		break;
4557 
4558 	case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG:
4559 		dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v(
4560 				tag_buf);
4561 		break;
4562 
4563 	case HTT_STATS_TX_PDEV_RATE_STATS_TAG:
4564 		dp_print_tx_pdev_rate_stats_tlv(tag_buf);
4565 		break;
4566 
4567 	case HTT_STATS_RX_PDEV_RATE_STATS_TAG:
4568 		dp_print_rx_pdev_rate_stats_tlv(pdev, tag_buf);
4569 		break;
4570 
4571 	case HTT_STATS_RX_PDEV_RATE_EXT_STATS_TAG:
4572 		dp_print_rx_pdev_rate_ext_stats_tlv(pdev, tag_buf);
4573 		break;
4574 
4575 	case HTT_STATS_TX_PDEV_SCHEDULER_TXQ_STATS_TAG:
4576 		dp_print_tx_pdev_stats_sched_per_txq_tlv(tag_buf);
4577 		break;
4578 
4579 	case HTT_STATS_TX_SCHED_CMN_TAG:
4580 		dp_print_stats_tx_sched_cmn_tlv(tag_buf);
4581 		break;
4582 
4583 	case HTT_STATS_TX_PDEV_MPDU_STATS_TAG:
4584 		dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv(tag_buf);
4585 		break;
4586 
4587 	case HTT_STATS_SCHED_TXQ_CMD_POSTED_TAG:
4588 		dp_print_sched_txq_cmd_posted_tlv_v(tag_buf);
4589 		break;
4590 
4591 	case HTT_STATS_RING_IF_CMN_TAG:
4592 		dp_print_ring_if_cmn_tlv(tag_buf);
4593 		break;
4594 
4595 	case HTT_STATS_SFM_CLIENT_USER_TAG:
4596 		dp_print_sfm_client_user_tlv_v(tag_buf);
4597 		break;
4598 
4599 	case HTT_STATS_SFM_CLIENT_TAG:
4600 		dp_print_sfm_client_tlv(tag_buf);
4601 		break;
4602 
4603 	case HTT_STATS_TX_TQM_ERROR_STATS_TAG:
4604 		dp_print_tx_tqm_error_stats_tlv(tag_buf);
4605 		break;
4606 
4607 	case HTT_STATS_SCHED_TXQ_CMD_REAPED_TAG:
4608 		dp_print_sched_txq_cmd_reaped_tlv_v(tag_buf);
4609 		break;
4610 
4611 	case HTT_STATS_SRING_CMN_TAG:
4612 		dp_print_sring_cmn_tlv(tag_buf);
4613 		break;
4614 
4615 	case HTT_STATS_TX_SELFGEN_AC_ERR_STATS_TAG:
4616 		dp_print_tx_selfgen_ac_err_stats_tlv(tag_buf);
4617 		break;
4618 
4619 	case HTT_STATS_TX_SELFGEN_CMN_STATS_TAG:
4620 		dp_print_tx_selfgen_cmn_stats_tlv(tag_buf);
4621 		break;
4622 
4623 	case HTT_STATS_TX_SELFGEN_AC_STATS_TAG:
4624 		dp_print_tx_selfgen_ac_stats_tlv(tag_buf);
4625 		break;
4626 
4627 	case HTT_STATS_TX_SELFGEN_AX_STATS_TAG:
4628 		dp_print_tx_selfgen_ax_stats_tlv(tag_buf);
4629 		break;
4630 
4631 	case HTT_STATS_TX_SELFGEN_AX_ERR_STATS_TAG:
4632 		dp_print_tx_selfgen_ax_err_stats_tlv(tag_buf);
4633 		break;
4634 
4635 	case  HTT_STATS_TX_SELFGEN_BE_STATS_TAG:
4636 		dp_print_tx_selfgen_be_stats_tlv(tag_buf);
4637 		break;
4638 
4639 	case HTT_STATS_TX_SELFGEN_BE_ERR_STATS_TAG:
4640 		dp_print_tx_selfgen_be_err_stats_tlv(tag_buf);
4641 		break;
4642 
4643 	case HTT_STATS_TX_SOUNDING_STATS_TAG:
4644 		dp_print_tx_sounding_stats_tlv(tag_buf);
4645 		break;
4646 
4647 	case HTT_STATS_TX_HWQ_MUMIMO_SCH_STATS_TAG:
4648 		dp_print_tx_hwq_mu_mimo_sch_stats_tlv(tag_buf);
4649 		break;
4650 
4651 	case HTT_STATS_TX_HWQ_MUMIMO_MPDU_STATS_TAG:
4652 		dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv(tag_buf);
4653 		break;
4654 
4655 	case HTT_STATS_TX_HWQ_MUMIMO_CMN_STATS_TAG:
4656 		dp_print_tx_hwq_mu_mimo_cmn_stats_tlv(tag_buf);
4657 		break;
4658 
4659 	case HTT_STATS_HW_INTR_MISC_TAG:
4660 		dp_print_hw_stats_intr_misc_tlv(tag_buf);
4661 		break;
4662 
4663 	case HTT_STATS_HW_WD_TIMEOUT_TAG:
4664 		dp_print_hw_stats_wd_timeout_tlv(tag_buf);
4665 		break;
4666 
4667 	case HTT_STATS_HW_PDEV_ERRS_TAG:
4668 		dp_print_hw_stats_pdev_errs_tlv(tag_buf);
4669 		break;
4670 
4671 	case HTT_STATS_COUNTER_NAME_TAG:
4672 		dp_print_counter_tlv(tag_buf);
4673 		break;
4674 
4675 	case HTT_STATS_TX_TID_DETAILS_TAG:
4676 		dp_print_tx_tid_stats_tlv(tag_buf);
4677 		break;
4678 
4679 	case HTT_STATS_TX_TID_DETAILS_V1_TAG:
4680 		dp_print_tx_tid_stats_v1_tlv(tag_buf);
4681 		break;
4682 
4683 	case HTT_STATS_RX_TID_DETAILS_TAG:
4684 		dp_print_rx_tid_stats_tlv(tag_buf);
4685 		break;
4686 
4687 	case HTT_STATS_PEER_STATS_CMN_TAG:
4688 		dp_print_peer_stats_cmn_tlv(tag_buf);
4689 		break;
4690 
4691 	case HTT_STATS_PEER_DETAILS_TAG:
4692 		dp_print_peer_details_tlv(tag_buf);
4693 		break;
4694 
4695 	case HTT_STATS_PEER_MSDU_FLOWQ_TAG:
4696 		dp_print_msdu_flow_stats_tlv(tag_buf);
4697 		break;
4698 
4699 	case HTT_STATS_PEER_TX_RATE_STATS_TAG:
4700 		dp_print_tx_peer_rate_stats_tlv(tag_buf);
4701 		break;
4702 
4703 	case HTT_STATS_PEER_RX_RATE_STATS_TAG:
4704 		dp_print_rx_peer_rate_stats_tlv(tag_buf);
4705 		break;
4706 
4707 	case HTT_STATS_TX_DE_COMPL_STATS_TAG:
4708 		dp_print_tx_de_compl_stats_tlv(tag_buf);
4709 		break;
4710 
4711 	case HTT_STATS_RX_REFILL_RXDMA_ERR_TAG:
4712 		dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv(tag_buf);
4713 		break;
4714 
4715 	case HTT_STATS_RX_REFILL_REO_ERR_TAG:
4716 		dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv(tag_buf);
4717 		break;
4718 
4719 	case HTT_STATS_RX_REO_RESOURCE_STATS_TAG:
4720 		dp_print_rx_reo_debug_stats_tlv(tag_buf);
4721 		break;
4722 
4723 	case HTT_STATS_RX_PDEV_FW_STATS_PHY_ERR_TAG:
4724 		dp_print_rx_pdev_fw_stats_phy_err_tlv(tag_buf);
4725 		break;
4726 
4727 	default:
4728 		break;
4729 	}
4730 }
4731 
4732 /*
4733  * dp_htt_stats_copy_tag: function to select the tag type and
4734  * copy the corresponding tag structure
4735  * @pdev: DP_PDEV handle
4736  * @tag_type: tag type that is to be printed
4737  * @tag_buf: pointer to the tag structure
4738  *
4739  * return: void
4740  */
4741 void dp_htt_stats_copy_tag(struct dp_pdev *pdev, uint8_t tag_type, uint32_t *tag_buf)
4742 {
4743 	void *dest_ptr = NULL;
4744 	uint32_t size = 0;
4745 	uint32_t size_expected = 0;
4746 	uint64_t val = 1;
4747 
4748 	pdev->fw_stats_tlv_bitmap_rcvd |= (val << tag_type);
4749 	switch (tag_type) {
4750 	case HTT_STATS_TX_PDEV_CMN_TAG:
4751 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.cmn_tlv;
4752 		size = sizeof(htt_tx_pdev_stats_cmn_tlv);
4753 		size_expected = sizeof(struct cdp_htt_tx_pdev_stats_cmn_tlv);
4754 		break;
4755 	case HTT_STATS_TX_PDEV_UNDERRUN_TAG:
4756 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.underrun_tlv;
4757 		size = sizeof(htt_tx_pdev_stats_urrn_tlv_v);
4758 		size_expected = sizeof(struct cdp_htt_tx_pdev_stats_urrn_tlv_v);
4759 		break;
4760 	case HTT_STATS_TX_PDEV_SIFS_TAG:
4761 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.sifs_tlv;
4762 		size = sizeof(htt_tx_pdev_stats_sifs_tlv_v);
4763 		size_expected = sizeof(struct cdp_htt_tx_pdev_stats_sifs_tlv_v);
4764 		break;
4765 	case HTT_STATS_TX_PDEV_FLUSH_TAG:
4766 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.flush_tlv;
4767 		size = sizeof(htt_tx_pdev_stats_flush_tlv_v);
4768 		size_expected =
4769 			sizeof(struct cdp_htt_tx_pdev_stats_flush_tlv_v);
4770 		break;
4771 	case HTT_STATS_TX_PDEV_PHY_ERR_TAG:
4772 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.phy_err_tlv;
4773 		size = sizeof(htt_tx_pdev_stats_phy_err_tlv_v);
4774 		size_expected =
4775 			sizeof(struct cdp_htt_tx_pdev_stats_phy_err_tlv_v);
4776 		break;
4777 	case HTT_STATS_RX_PDEV_FW_STATS_TAG:
4778 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_stats_tlv;
4779 		size = sizeof(htt_rx_pdev_fw_stats_tlv);
4780 		size_expected = sizeof(struct cdp_htt_rx_pdev_fw_stats_tlv);
4781 		break;
4782 	case HTT_STATS_RX_SOC_FW_STATS_TAG:
4783 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_tlv;
4784 		size = sizeof(htt_rx_soc_fw_stats_tlv);
4785 		size_expected = sizeof(struct cdp_htt_rx_soc_fw_stats_tlv);
4786 		break;
4787 	case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG:
4788 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_refill_ring_empty_tlv;
4789 		size = sizeof(htt_rx_soc_fw_refill_ring_empty_tlv_v);
4790 		size_expected =
4791 		sizeof(struct cdp_htt_rx_soc_fw_refill_ring_empty_tlv_v);
4792 		break;
4793 	case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG:
4794 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_refill_ring_num_refill_tlv;
4795 		size = sizeof(htt_rx_soc_fw_refill_ring_num_refill_tlv_v);
4796 		size_expected =
4797 		sizeof(struct cdp_htt_rx_soc_fw_refill_ring_num_refill_tlv_v);
4798 		break;
4799 	case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG:
4800 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_ring_mpdu_err_tlv;
4801 		size = sizeof(htt_rx_pdev_fw_ring_mpdu_err_tlv_v);
4802 		size_expected =
4803 			sizeof(struct cdp_htt_rx_pdev_fw_ring_mpdu_err_tlv_v);
4804 		break;
4805 	case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG:
4806 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_ring_mpdu_drop;
4807 		size = sizeof(htt_rx_pdev_fw_mpdu_drop_tlv_v);
4808 		size_expected =
4809 			sizeof(struct cdp_htt_rx_pdev_fw_mpdu_drop_tlv_v);
4810 		break;
4811 	default:
4812 		break;
4813 	}
4814 
4815 	if (size_expected < size)
4816 		dp_warn("Buffer Overflow:FW Struct Size:%d Host Struct Size:%d"
4817 			, size, size_expected);
4818 
4819 	if (dest_ptr)
4820 		qdf_mem_copy(dest_ptr, tag_buf, size_expected);
4821 
4822 	if (((pdev->fw_stats_tlv_bitmap_rcvd) & DP_HTT_TX_RX_EXPECTED_TLVS)
4823 	      == DP_HTT_TX_RX_EXPECTED_TLVS) {
4824 		qdf_event_set(&pdev->fw_stats_event);
4825 	}
4826 }
4827 
4828 #ifdef VDEV_PEER_PROTOCOL_COUNT
4829 #ifdef VDEV_PEER_PROTOCOL_COUNT_TESTING
4830 static QDF_STATUS dp_peer_stats_update_protocol_test_cnt(struct dp_vdev *vdev,
4831 							 bool is_egress,
4832 							 bool is_rx)
4833 {
4834 	int mask;
4835 
4836 	if (is_egress)
4837 		if (is_rx)
4838 			mask = VDEV_PEER_PROTOCOL_RX_EGRESS_MASK;
4839 		else
4840 			mask = VDEV_PEER_PROTOCOL_TX_EGRESS_MASK;
4841 	else
4842 		if (is_rx)
4843 			mask = VDEV_PEER_PROTOCOL_RX_INGRESS_MASK;
4844 		else
4845 			mask = VDEV_PEER_PROTOCOL_TX_INGRESS_MASK;
4846 
4847 	if (qdf_unlikely(vdev->peer_protocol_count_dropmask & mask)) {
4848 		dp_info("drop mask set %x", vdev->peer_protocol_count_dropmask);
4849 		return QDF_STATUS_SUCCESS;
4850 	}
4851 	return QDF_STATUS_E_FAILURE;
4852 }
4853 
4854 #else
4855 static QDF_STATUS dp_peer_stats_update_protocol_test_cnt(struct dp_vdev *vdev,
4856 							 bool is_egress,
4857 							 bool is_rx)
4858 {
4859 	return QDF_STATUS_E_FAILURE;
4860 }
4861 #endif
4862 
4863 void dp_vdev_peer_stats_update_protocol_cnt(struct dp_vdev *vdev,
4864 					    qdf_nbuf_t nbuf,
4865 					    struct dp_txrx_peer *txrx_peer,
4866 					    bool is_egress,
4867 					    bool is_rx)
4868 {
4869 	struct dp_peer_per_pkt_stats *per_pkt_stats;
4870 	struct protocol_trace_count *protocol_trace_cnt;
4871 	enum cdp_protocol_trace prot;
4872 	struct dp_soc *soc;
4873 	struct ether_header *eh;
4874 	char *mac;
4875 	bool new_peer_ref = false;
4876 	struct dp_peer *peer = NULL;
4877 
4878 	if (qdf_likely(!vdev->peer_protocol_count_track))
4879 		return;
4880 	if (qdf_unlikely(dp_peer_stats_update_protocol_test_cnt(vdev,
4881 								is_egress,
4882 								is_rx) ==
4883 					       QDF_STATUS_SUCCESS))
4884 		return;
4885 
4886 	soc = vdev->pdev->soc;
4887 	eh = (struct ether_header *)qdf_nbuf_data(nbuf);
4888 	if (is_rx)
4889 		mac = eh->ether_shost;
4890 	else
4891 		mac = eh->ether_dhost;
4892 
4893 	if (!txrx_peer) {
4894 		peer = dp_peer_find_hash_find(soc, mac, 0, vdev->vdev_id,
4895 					      DP_MOD_ID_GENERIC_STATS);
4896 		new_peer_ref = true;
4897 		if (!peer)
4898 			return;
4899 
4900 		txrx_peer = peer->txrx_peer;
4901 		if (!txrx_peer)
4902 			goto dp_vdev_peer_stats_update_protocol_cnt_free_peer;
4903 	}
4904 	per_pkt_stats = &txrx_peer->stats.per_pkt_stats;
4905 
4906 	if (qdf_nbuf_is_icmp_pkt(nbuf) == true)
4907 		prot = CDP_TRACE_ICMP;
4908 	else if (qdf_nbuf_is_ipv4_arp_pkt(nbuf) == true)
4909 		prot = CDP_TRACE_ARP;
4910 	else if (qdf_nbuf_is_ipv4_eapol_pkt(nbuf) == true)
4911 		prot = CDP_TRACE_EAP;
4912 	else
4913 		goto dp_vdev_peer_stats_update_protocol_cnt_free_peer;
4914 
4915 	if (is_rx)
4916 		protocol_trace_cnt = per_pkt_stats->rx.protocol_trace_cnt;
4917 	else
4918 		protocol_trace_cnt = per_pkt_stats->tx.protocol_trace_cnt;
4919 
4920 	if (is_egress)
4921 		protocol_trace_cnt[prot].egress_cnt++;
4922 	else
4923 		protocol_trace_cnt[prot].ingress_cnt++;
4924 dp_vdev_peer_stats_update_protocol_cnt_free_peer:
4925 	if (new_peer_ref)
4926 		dp_peer_unref_delete(peer, DP_MOD_ID_GENERIC_STATS);
4927 }
4928 
4929 void dp_peer_stats_update_protocol_cnt(struct cdp_soc_t *soc_hdl,
4930 				       int8_t vdev_id,
4931 				       qdf_nbuf_t nbuf,
4932 				       bool is_egress,
4933 				       bool is_rx)
4934 {
4935 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
4936 	struct dp_vdev *vdev;
4937 
4938 	vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_GENERIC_STATS);
4939 	if (!vdev)
4940 		return;
4941 
4942 	if (qdf_likely(vdev->peer_protocol_count_track))
4943 		dp_vdev_peer_stats_update_protocol_cnt(vdev, nbuf, NULL,
4944 						       is_egress, is_rx);
4945 
4946 	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS);
4947 }
4948 #endif
4949 
4950 #if defined(QCA_ENH_V3_STATS_SUPPORT) || defined(HW_TX_DELAY_STATS_ENABLE)
4951 /**
4952  * dp_vow_str_fw_to_hw_delay() - Return string for a delay
4953  * @index: Index of delay
4954  *
4955  * Return: char const pointer
4956  */
4957 static inline const char *dp_vow_str_fw_to_hw_delay(uint8_t index)
4958 {
4959 	if (index > CDP_DELAY_BUCKET_MAX) {
4960 		return "Invalid index";
4961 	}
4962 	return fw_to_hw_delay_bucket[index];
4963 }
4964 
4965 /**
4966  * dp_accumulate_delay_stats() - Update delay stats members
4967  * @total: Update stats total structure
4968  * @per_ring: per ring structures from where stats need to be accumulated
4969  *
4970  * Return: void
4971  */
4972 static void
4973 dp_accumulate_delay_stats(struct cdp_delay_stats *total,
4974 			  struct cdp_delay_stats *per_ring)
4975 {
4976 	uint8_t index;
4977 
4978 	for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++)
4979 		total->delay_bucket[index] += per_ring->delay_bucket[index];
4980 	total->min_delay = QDF_MIN(total->min_delay, per_ring->min_delay);
4981 	total->max_delay = QDF_MAX(total->max_delay, per_ring->max_delay);
4982 	total->avg_delay = ((total->avg_delay + per_ring->avg_delay) >> 1);
4983 }
4984 #endif
4985 
4986 #ifdef QCA_ENH_V3_STATS_SUPPORT
4987 /**
4988  * dp_vow_str_sw_enq_delay() - Return string for a delay
4989  * @index: Index of delay
4990  *
4991  * Return: char const pointer
4992  */
4993 static inline const char *dp_vow_str_sw_enq_delay(uint8_t index)
4994 {
4995 	if (index > CDP_DELAY_BUCKET_MAX) {
4996 		return "Invalid index";
4997 	}
4998 	return sw_enq_delay_bucket[index];
4999 }
5000 
5001 /**
5002  * dp_vow_str_intfrm_delay() - Return string for a delay
5003  * @index: Index of delay
5004  *
5005  * Return: char const pointer
5006  */
5007 static inline const char *dp_vow_str_intfrm_delay(uint8_t index)
5008 {
5009 	if (index > CDP_DELAY_BUCKET_MAX) {
5010 		return "Invalid index";
5011 	}
5012 	return intfrm_delay_bucket[index];
5013 }
5014 
5015 /**
5016  * dp_accumulate_tid_stats() - Accumulate TID stats from each ring
5017  * @pdev: pdev handle
5018  * @tid: traffic ID
5019  * @total_tx: fill this tx structure to get stats from all wbm rings
5020  * @total_rx: fill this rx structure to get stats from all reo rings
5021  * @type: delay stats or regular frame counters
5022  *
5023  * Return: void
5024  */
5025 static void
5026 dp_accumulate_tid_stats(struct dp_pdev *pdev, uint8_t tid,
5027 			struct cdp_tid_tx_stats *total_tx,
5028 			struct cdp_tid_rx_stats *total_rx, uint8_t type)
5029 {
5030 	uint8_t i = 0, ring_id = 0, drop = 0, tqm_status_idx = 0, htt_status_idx = 0;
5031 	struct cdp_tid_stats *tid_stats = &pdev->stats.tid_stats;
5032 	struct cdp_tid_tx_stats *per_ring_tx = NULL;
5033 	struct cdp_tid_rx_stats *per_ring_rx = NULL;
5034 
5035 	if (wlan_cfg_get_dp_soc_nss_cfg(pdev->soc->wlan_cfg_ctx)) {
5036 		qdf_mem_copy(total_tx, &tid_stats->tid_tx_stats[0][tid],
5037 			     sizeof(struct cdp_tid_tx_stats));
5038 		qdf_mem_copy(total_rx, &tid_stats->tid_rx_stats[0][tid],
5039 			     sizeof(struct cdp_tid_rx_stats));
5040 		return;
5041 	} else {
5042 		qdf_mem_zero(total_tx, sizeof(struct cdp_tid_tx_stats));
5043 		qdf_mem_zero(total_rx, sizeof(struct cdp_tid_rx_stats));
5044 	}
5045 
5046 	switch (type) {
5047 	case TID_COUNTER_STATS:
5048 	{
5049 		for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) {
5050 			per_ring_tx = &tid_stats->tid_tx_stats[ring_id][tid];
5051 			total_tx->success_cnt += per_ring_tx->success_cnt;
5052 			total_tx->comp_fail_cnt += per_ring_tx->comp_fail_cnt;
5053 			for (tqm_status_idx = 0; tqm_status_idx < CDP_MAX_TX_TQM_STATUS; tqm_status_idx++) {
5054 				total_tx->tqm_status_cnt[tqm_status_idx] +=
5055 					per_ring_tx->tqm_status_cnt[tqm_status_idx];
5056 			}
5057 
5058 			for (htt_status_idx = 0; htt_status_idx < CDP_MAX_TX_HTT_STATUS; htt_status_idx++) {
5059 				total_tx->htt_status_cnt[htt_status_idx] +=
5060 					per_ring_tx->htt_status_cnt[htt_status_idx];
5061 			}
5062 
5063 			for (drop = 0; drop < TX_MAX_DROP; drop++)
5064 				total_tx->swdrop_cnt[drop] +=
5065 					per_ring_tx->swdrop_cnt[drop];
5066 		}
5067 		for (ring_id = 0; ring_id < CDP_MAX_RX_RINGS; ring_id++) {
5068 			per_ring_rx = &tid_stats->tid_rx_stats[ring_id][tid];
5069 			total_rx->delivered_to_stack +=
5070 				per_ring_rx->delivered_to_stack;
5071 			total_rx->intrabss_cnt += per_ring_rx->intrabss_cnt;
5072 			total_rx->msdu_cnt += per_ring_rx->msdu_cnt;
5073 			total_rx->mcast_msdu_cnt += per_ring_rx->mcast_msdu_cnt;
5074 			total_rx->bcast_msdu_cnt += per_ring_rx->bcast_msdu_cnt;
5075 			for (drop = 0; drop < RX_MAX_DROP; drop++)
5076 				total_rx->fail_cnt[drop] +=
5077 					per_ring_rx->fail_cnt[drop];
5078 		}
5079 		break;
5080 	}
5081 
5082 	case TID_DELAY_STATS:
5083 	{
5084 		for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) {
5085 			per_ring_tx = &tid_stats->tid_tx_stats[ring_id][tid];
5086 			dp_accumulate_delay_stats(&total_tx->swq_delay,
5087 						  &per_ring_tx->swq_delay);
5088 			dp_accumulate_delay_stats(&total_tx->hwtx_delay,
5089 						  &per_ring_tx->hwtx_delay);
5090 			dp_accumulate_delay_stats(&total_tx->intfrm_delay,
5091 						  &per_ring_tx->intfrm_delay);
5092 		}
5093 		for (ring_id = 0; ring_id < CDP_MAX_RX_RINGS; ring_id++) {
5094 			per_ring_rx = &tid_stats->tid_rx_stats[ring_id][tid];
5095 			dp_accumulate_delay_stats(&total_rx->intfrm_delay,
5096 						  &per_ring_rx->intfrm_delay);
5097 			dp_accumulate_delay_stats(&total_rx->to_stack_delay,
5098 						  &per_ring_rx->to_stack_delay);
5099 		}
5100 		break;
5101 	}
5102 
5103 	case TID_RX_ERROR_STATS:
5104 	{
5105 		for (ring_id = 0; ring_id < CDP_MAX_RX_RINGS; ring_id++) {
5106 			per_ring_rx = &tid_stats->tid_rx_stats[ring_id][tid];
5107 			total_rx->reo_err.err_src_reo_code_inv += per_ring_rx->reo_err.err_src_reo_code_inv;
5108 			for (i = 0; i < CDP_REO_CODE_MAX; i++) {
5109 				total_rx->reo_err.err_reo_codes[i] += per_ring_rx->reo_err.err_reo_codes[i];
5110 			}
5111 
5112 			total_rx->rxdma_err.err_src_rxdma_code_inv += per_ring_rx->rxdma_err.err_src_rxdma_code_inv;
5113 			for (i = 0; i < CDP_DMA_CODE_MAX; i++) {
5114 				total_rx->rxdma_err.err_dma_codes[i] += per_ring_rx->rxdma_err.err_dma_codes[i];
5115 			}
5116 		}
5117 		break;
5118 	}
5119 	default:
5120 		qdf_err("Invalid stats type");
5121 		break;
5122 	}
5123 }
5124 
5125 void dp_pdev_print_tid_stats(struct dp_pdev *pdev)
5126 {
5127 	struct cdp_tid_tx_stats total_tx;
5128 	struct cdp_tid_rx_stats total_rx;
5129 	uint8_t tid, tqm_status_idx, htt_status_idx;
5130 	struct cdp_tid_rx_stats *rx_wbm_stats = NULL;
5131 
5132 	DP_PRINT_STATS("Packets received in hardstart: %llu ",
5133 			pdev->stats.tid_stats.ingress_stack);
5134 	DP_PRINT_STATS("Packets dropped in osif layer: %llu ",
5135 			pdev->stats.tid_stats.osif_drop);
5136 	DP_PRINT_STATS("Per TID Video Stats:\n");
5137 
5138 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
5139 		rx_wbm_stats = &pdev->stats.tid_stats.tid_rx_wbm_stats[0][tid];
5140 
5141 		dp_accumulate_tid_stats(pdev, tid, &total_tx, &total_rx,
5142 					TID_COUNTER_STATS);
5143 		DP_PRINT_STATS("----TID: %d----", tid);
5144 		DP_PRINT_STATS("Tx TQM Success Count: %llu",
5145 				total_tx.tqm_status_cnt[HAL_TX_TQM_RR_FRAME_ACKED]);
5146 		DP_PRINT_STATS("Tx HTT Success Count: %llu",
5147 				total_tx.htt_status_cnt[HTT_TX_FW2WBM_TX_STATUS_OK]);
5148 		for (tqm_status_idx = 1; tqm_status_idx < CDP_MAX_TX_TQM_STATUS; tqm_status_idx++) {
5149 			if (total_tx.tqm_status_cnt[tqm_status_idx]) {
5150 				DP_PRINT_STATS("Tx TQM Drop Count[%d]: %llu",
5151 						tqm_status_idx, total_tx.tqm_status_cnt[tqm_status_idx]);
5152 			}
5153 		}
5154 
5155 		for (htt_status_idx = 1; htt_status_idx < CDP_MAX_TX_HTT_STATUS; htt_status_idx++) {
5156 			if (total_tx.htt_status_cnt[htt_status_idx]) {
5157 				DP_PRINT_STATS("Tx HTT Drop Count[%d]: %llu",
5158 						htt_status_idx, total_tx.htt_status_cnt[htt_status_idx]);
5159 			}
5160 		}
5161 
5162 		DP_PRINT_STATS("Tx Hardware Drop Count: %llu",
5163 			       total_tx.swdrop_cnt[TX_HW_ENQUEUE]);
5164 		DP_PRINT_STATS("Tx Software Drop Count: %llu",
5165 			       total_tx.swdrop_cnt[TX_SW_ENQUEUE]);
5166 		DP_PRINT_STATS("Tx Descriptor Error Count: %llu",
5167 			       total_tx.swdrop_cnt[TX_DESC_ERR]);
5168 		DP_PRINT_STATS("Tx HAL Ring Error Count: %llu",
5169 			       total_tx.swdrop_cnt[TX_HAL_RING_ACCESS_ERR]);
5170 		DP_PRINT_STATS("Tx Dma Map Error Count: %llu",
5171 			       total_tx.swdrop_cnt[TX_DMA_MAP_ERR]);
5172 		DP_PRINT_STATS("Rx Delievered Count: %llu",
5173 			       total_rx.delivered_to_stack);
5174 		DP_PRINT_STATS("Rx Software Enqueue Drop Count: %llu",
5175 			       total_rx.fail_cnt[ENQUEUE_DROP]);
5176 		DP_PRINT_STATS("Rx Intrabss Drop Count: %llu",
5177 			       total_rx.fail_cnt[INTRABSS_DROP]);
5178 		DP_PRINT_STATS("Rx Msdu Done Failure Count: %llu",
5179 			       total_rx.fail_cnt[MSDU_DONE_FAILURE]);
5180 		DP_PRINT_STATS("Rx Invalid Peer Count: %llu",
5181 			       total_rx.fail_cnt[INVALID_PEER_VDEV]);
5182 		DP_PRINT_STATS("Rx Policy Check Drop Count: %llu",
5183 			       total_rx.fail_cnt[POLICY_CHECK_DROP]);
5184 		DP_PRINT_STATS("Rx Mec Drop Count: %llu",
5185 			       total_rx.fail_cnt[MEC_DROP]);
5186 		DP_PRINT_STATS("Rx Nawds Mcast Drop Count: %llu",
5187 			       total_rx.fail_cnt[NAWDS_MCAST_DROP]);
5188 		DP_PRINT_STATS("Rx Mesh Filter Drop Count: %llu",
5189 			       total_rx.fail_cnt[MESH_FILTER_DROP]);
5190 		DP_PRINT_STATS("Rx Intra Bss Deliver Count: %llu",
5191 			       total_rx.intrabss_cnt);
5192 		DP_PRINT_STATS("Rx MSDU Count: %llu", total_rx.msdu_cnt);
5193 		DP_PRINT_STATS("Rx Multicast MSDU Count: %llu",
5194 			       total_rx.mcast_msdu_cnt);
5195 		DP_PRINT_STATS("Rx Broadcast MSDU Count: %llu\n",
5196 			       total_rx.bcast_msdu_cnt);
5197 		DP_PRINT_STATS("Rx WBM Intra Bss Deliver Count: %llu",
5198 			       rx_wbm_stats->intrabss_cnt);
5199 		DP_PRINT_STATS("Rx WBM Intrabss Drop Count: %llu",
5200 			       rx_wbm_stats->fail_cnt[INTRABSS_DROP]);
5201 	}
5202 }
5203 
5204 void dp_pdev_print_delay_stats(struct dp_pdev *pdev)
5205 {
5206 	struct dp_soc *soc = pdev->soc;
5207 	struct cdp_tid_tx_stats total_tx;
5208 	struct cdp_tid_rx_stats total_rx;
5209 	struct cdp_tid_stats *tid_stats;
5210 
5211 	uint8_t tid, index;
5212 	uint64_t count = 0;
5213 
5214 	if (!soc)
5215 		return;
5216 
5217 	tid = 0;
5218 	index = 0;
5219 	tid_stats = &pdev->stats.tid_stats;
5220 
5221 	DP_PRINT_STATS("Per TID Delay Non-Zero Stats:\n");
5222 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
5223 		dp_accumulate_tid_stats(pdev, tid, &total_tx, &total_rx,
5224 					TID_DELAY_STATS);
5225 		DP_PRINT_STATS("----TID: %d----", tid);
5226 
5227 		DP_PRINT_STATS("Software Enqueue Delay:");
5228 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
5229 			count = total_tx.swq_delay.delay_bucket[index];
5230 			if (count) {
5231 				DP_PRINT_STATS("%s:  Packets = %llu",
5232 					       dp_vow_str_sw_enq_delay(index),
5233 					       count);
5234 			}
5235 		}
5236 
5237 		DP_PRINT_STATS("Min = %u", total_tx.swq_delay.min_delay);
5238 		DP_PRINT_STATS("Max = %u", total_tx.swq_delay.max_delay);
5239 		DP_PRINT_STATS("Avg = %u\n", total_tx.swq_delay.avg_delay);
5240 
5241 		DP_PRINT_STATS("Hardware Transmission Delay:");
5242 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
5243 			count = total_tx.hwtx_delay.delay_bucket[index];
5244 			if (count) {
5245 				DP_PRINT_STATS("%s:  Packets = %llu",
5246 					       dp_vow_str_fw_to_hw_delay(index),
5247 					       count);
5248 			}
5249 		}
5250 		DP_PRINT_STATS("Min = %u", total_tx.hwtx_delay.min_delay);
5251 		DP_PRINT_STATS("Max = %u", total_tx.hwtx_delay.max_delay);
5252 		DP_PRINT_STATS("Avg = %u\n", total_tx.hwtx_delay.avg_delay);
5253 
5254 		DP_PRINT_STATS("Tx Interframe Delay:");
5255 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
5256 			count = total_tx.intfrm_delay.delay_bucket[index];
5257 			if (count) {
5258 				DP_PRINT_STATS("%s:  Packets = %llu",
5259 					       dp_vow_str_intfrm_delay(index),
5260 					       count);
5261 			}
5262 		}
5263 		DP_PRINT_STATS("Min = %u", total_tx.intfrm_delay.min_delay);
5264 		DP_PRINT_STATS("Max = %u", total_tx.intfrm_delay.max_delay);
5265 		DP_PRINT_STATS("Avg = %u\n", total_tx.intfrm_delay.avg_delay);
5266 
5267 		DP_PRINT_STATS("Rx Interframe Delay:");
5268 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
5269 			count = total_rx.intfrm_delay.delay_bucket[index];
5270 			if (count) {
5271 				DP_PRINT_STATS("%s:  Packets = %llu",
5272 					       dp_vow_str_intfrm_delay(index),
5273 					       count);
5274 			}
5275 		}
5276 		DP_PRINT_STATS("Min = %u", total_rx.intfrm_delay.min_delay);
5277 		DP_PRINT_STATS("Max = %u", total_rx.intfrm_delay.max_delay);
5278 		DP_PRINT_STATS("Avg = %u\n", total_rx.intfrm_delay.avg_delay);
5279 
5280 		DP_PRINT_STATS("Rx Reap to Stack Delay:");
5281 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
5282 			count = total_rx.to_stack_delay.delay_bucket[index];
5283 			if (count) {
5284 				DP_PRINT_STATS("%s:  Packets = %llu",
5285 					       dp_vow_str_intfrm_delay(index),
5286 					       count);
5287 			}
5288 		}
5289 
5290 		DP_PRINT_STATS("Min = %u", total_rx.to_stack_delay.min_delay);
5291 		DP_PRINT_STATS("Max = %u", total_rx.to_stack_delay.max_delay);
5292 		DP_PRINT_STATS("Avg = %u\n", total_rx.to_stack_delay.avg_delay);
5293 	}
5294 }
5295 
5296 void dp_pdev_print_rx_error_stats(struct dp_pdev *pdev)
5297 {
5298 	struct dp_soc *soc = pdev->soc;
5299 	struct cdp_tid_rx_stats total_rx;
5300 	struct cdp_tid_tx_stats total_tx;
5301 	struct cdp_tid_stats *tid_stats;
5302 
5303 	uint8_t tid, index;
5304 
5305 	if (!soc)
5306 		return;
5307 
5308 	tid_stats = &pdev->stats.tid_stats;
5309 
5310 	DP_PRINT_STATS("Per TID RX Error Stats:\n");
5311 	for (tid = 0; tid < CDP_MAX_VOW_TID; tid++) {
5312 		dp_accumulate_tid_stats(pdev, tid, &total_tx, &total_rx,
5313 					TID_RX_ERROR_STATS);
5314 		DP_PRINT_STATS("----TID: %d----", tid + 4);
5315 
5316 		DP_PRINT_STATS("Rx REO Error stats:");
5317 		DP_PRINT_STATS("err_src_reo_code_inv = %llu", total_rx.reo_err.err_src_reo_code_inv);
5318 		for (index = 0; index < CDP_REO_CODE_MAX; index++) {
5319 			DP_PRINT_STATS("err src reo codes: %d = %llu", index, total_rx.reo_err.err_reo_codes[index]);
5320 		}
5321 
5322 		DP_PRINT_STATS("Rx Rxdma Error stats:");
5323 		DP_PRINT_STATS("err_src_rxdma_code_inv = %llu", total_rx.rxdma_err.err_src_rxdma_code_inv);
5324 		for (index = 0; index < CDP_DMA_CODE_MAX; index++) {
5325 			DP_PRINT_STATS("err src dma codes: %d = %llu", index, total_rx.rxdma_err.err_dma_codes[index]);
5326 		}
5327 	}
5328 }
5329 
5330 QDF_STATUS dp_pdev_get_tid_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
5331 				 struct cdp_tid_stats_intf *tid_stats)
5332 {
5333 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
5334 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
5335 	struct cdp_tid_rx_stats rx;
5336 	struct cdp_tid_tx_stats tx;
5337 	uint8_t tid;
5338 	uint32_t size;
5339 
5340 	if (!pdev)
5341 		return QDF_STATUS_E_INVAL;
5342 
5343 	size = sizeof(struct cdp_delay_stats);
5344 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
5345 		dp_accumulate_tid_stats(pdev, tid, &tx, &rx, TID_COUNTER_STATS);
5346 		/* Copy specific accumulated Tx tid stats */
5347 		tid_stats->tx_total[tid].success_cnt = tx.success_cnt;
5348 		tid_stats->tx_total[tid].comp_fail_cnt = tx.comp_fail_cnt;
5349 		qdf_mem_copy(&tid_stats->tx_total[tid].tqm_status_cnt[0],
5350 			     &tx.tqm_status_cnt[0],
5351 			     CDP_MAX_TX_TQM_STATUS * sizeof(uint64_t));
5352 		qdf_mem_copy(&tid_stats->tx_total[tid].htt_status_cnt[0],
5353 			     &tx.htt_status_cnt[0],
5354 			     CDP_MAX_TX_HTT_STATUS * sizeof(uint64_t));
5355 		qdf_mem_copy(&tid_stats->tx_total[tid].swdrop_cnt[0],
5356 			     &tx.swdrop_cnt[0], TX_MAX_DROP * sizeof(uint64_t));
5357 
5358 		/* Copy specific accumulated Rx tid stats */
5359 		tid_stats->rx_total[tid].delivered_to_stack =
5360 							rx.delivered_to_stack;
5361 		tid_stats->rx_total[tid].intrabss_cnt = rx.intrabss_cnt;
5362 		tid_stats->rx_total[tid].msdu_cnt = rx.msdu_cnt;
5363 		tid_stats->rx_total[tid].mcast_msdu_cnt = rx.mcast_msdu_cnt;
5364 		tid_stats->rx_total[tid].bcast_msdu_cnt = rx.bcast_msdu_cnt;
5365 		qdf_mem_copy(&tid_stats->rx_total[tid].fail_cnt[0],
5366 			     &rx.fail_cnt[0], RX_MAX_DROP * sizeof(uint64_t));
5367 
5368 		dp_accumulate_tid_stats(pdev, tid, &tx, &rx, TID_DELAY_STATS);
5369 		/* Copy specific accumulated Tx delay stats */
5370 		qdf_mem_copy(&tid_stats->tx_total[tid].swq_delay,
5371 			     &tx.swq_delay, size);
5372 		qdf_mem_copy(&tid_stats->tx_total[tid].hwtx_delay,
5373 			     &tx.hwtx_delay, size);
5374 		qdf_mem_copy(&tid_stats->tx_total[tid].intfrm_delay,
5375 			     &tx.intfrm_delay, size);
5376 
5377 		/* Copy specific accumulated Rx delay stats */
5378 		qdf_mem_copy(&tid_stats->rx_total[tid].intfrm_delay,
5379 			     &rx.intfrm_delay, size);
5380 		qdf_mem_copy(&tid_stats->rx_total[tid].to_stack_delay,
5381 			     &rx.to_stack_delay, size);
5382 	}
5383 	for (tid = 0; tid < CDP_MAX_VOW_TID; tid++) {
5384 		dp_accumulate_tid_stats(pdev, tid, &tx, &rx,
5385 					TID_RX_ERROR_STATS);
5386 		/* Copy specific accumulated VOW Rx stats */
5387 		qdf_mem_copy(&tid_stats->rx_total[tid].reo_err,
5388 			     &rx.reo_err, sizeof(struct cdp_reo_error_stats));
5389 		qdf_mem_copy(&tid_stats->rx_total[tid].rxdma_err, &rx.rxdma_err,
5390 			     sizeof(struct cdp_rxdma_error_stats));
5391 	}
5392 	tid_stats->ingress_stack = pdev->stats.tid_stats.ingress_stack;
5393 	tid_stats->osif_drop = pdev->stats.tid_stats.osif_drop;
5394 
5395 	return QDF_STATUS_SUCCESS;
5396 }
5397 #else
5398 QDF_STATUS dp_pdev_get_tid_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
5399 				 struct cdp_tid_stats_intf *tid_stats)
5400 {
5401 	return QDF_STATUS_E_INVAL;
5402 }
5403 #endif
5404 
5405 #ifdef HW_TX_DELAY_STATS_ENABLE
5406 static void dp_vdev_print_tx_delay_stats(struct dp_vdev *vdev)
5407 {
5408 	struct cdp_delay_stats delay_stats;
5409 	struct cdp_tid_tx_stats *per_ring;
5410 	uint8_t tid, index;
5411 	uint64_t count = 0;
5412 	uint8_t ring_id;
5413 
5414 	if (!vdev)
5415 		return;
5416 
5417 	DP_PRINT_STATS("vdev_id: %d Per TID Delay Non-Zero Stats:\n",
5418 		       vdev->vdev_id);
5419 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
5420 		qdf_mem_zero(&delay_stats, sizeof(delay_stats));
5421 		for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) {
5422 			per_ring = &vdev->stats.tid_tx_stats[ring_id][tid];
5423 			dp_accumulate_delay_stats(&delay_stats,
5424 						  &per_ring->hwtx_delay);
5425 		}
5426 
5427 		DP_PRINT_STATS("Hardware Tx completion latency stats TID: %d",
5428 			       tid);
5429 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
5430 			count = delay_stats.delay_bucket[index];
5431 			if (count) {
5432 				DP_PRINT_STATS("%s:  Packets = %llu",
5433 					       dp_vow_str_fw_to_hw_delay(index),
5434 					       count);
5435 			}
5436 		}
5437 
5438 		DP_PRINT_STATS("Min = %u", delay_stats.min_delay);
5439 		DP_PRINT_STATS("Max = %u", delay_stats.max_delay);
5440 		DP_PRINT_STATS("Avg = %u\n", delay_stats.avg_delay);
5441 	}
5442 }
5443 
5444 void dp_pdev_print_tx_delay_stats(struct dp_soc *soc)
5445 {
5446 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, 0);
5447 	struct dp_vdev *vdev;
5448 	struct dp_vdev **vdev_array = NULL;
5449 	int index = 0, num_vdev = 0;
5450 
5451 	if (!pdev) {
5452 		dp_err("pdev is NULL");
5453 		return;
5454 	}
5455 
5456 	vdev_array =
5457 		qdf_mem_malloc(sizeof(struct dp_vdev *) * WLAN_PDEV_MAX_VDEVS);
5458 	if (!vdev_array)
5459 		return;
5460 
5461 	qdf_spin_lock_bh(&pdev->vdev_list_lock);
5462 	DP_PDEV_ITERATE_VDEV_LIST(pdev, vdev) {
5463 		if (dp_vdev_get_ref(soc, vdev, DP_MOD_ID_GENERIC_STATS))
5464 			continue;
5465 		vdev_array[index] = vdev;
5466 		index = index + 1;
5467 	}
5468 	qdf_spin_unlock_bh(&pdev->vdev_list_lock);
5469 
5470 	num_vdev = index;
5471 
5472 	for (index = 0; index < num_vdev; index++) {
5473 		vdev = vdev_array[index];
5474 		dp_vdev_print_tx_delay_stats(vdev);
5475 		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS);
5476 	}
5477 	qdf_mem_free(vdev_array);
5478 }
5479 
5480 /**
5481  * dp_reset_delay_stats() - reset delay stats
5482  * @per_ring: per ring structures from where stats need to be accumulated
5483  *
5484  * Return: void
5485  */
5486 static void dp_reset_delay_stats(struct cdp_delay_stats *per_ring)
5487 {
5488 	qdf_mem_zero(per_ring, sizeof(struct cdp_delay_stats));
5489 }
5490 
5491 /**
5492  * dp_vdev_init_tx_delay_stats() - Clear tx delay stats
5493  * @vdev: vdev handle
5494  *
5495  * Return: None
5496  */
5497 static void dp_vdev_init_tx_delay_stats(struct dp_vdev *vdev)
5498 {
5499 	struct cdp_tid_tx_stats *per_ring;
5500 	uint8_t tid;
5501 	uint8_t ring_id;
5502 
5503 	if (!vdev)
5504 		return;
5505 
5506 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
5507 		for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) {
5508 			per_ring = &vdev->stats.tid_tx_stats[ring_id][tid];
5509 			dp_reset_delay_stats(&per_ring->hwtx_delay);
5510 		}
5511 	}
5512 }
5513 
5514 void dp_pdev_clear_tx_delay_stats(struct dp_soc *soc)
5515 {
5516 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, 0);
5517 	struct dp_vdev *vdev;
5518 	struct dp_vdev **vdev_array = NULL;
5519 	int index = 0, num_vdev = 0;
5520 
5521 	if (!pdev) {
5522 		dp_err("pdev is NULL");
5523 		return;
5524 	}
5525 
5526 	vdev_array =
5527 		qdf_mem_malloc(sizeof(struct dp_vdev *) * WLAN_PDEV_MAX_VDEVS);
5528 	if (!vdev_array)
5529 		return;
5530 
5531 	qdf_spin_lock_bh(&pdev->vdev_list_lock);
5532 	DP_PDEV_ITERATE_VDEV_LIST(pdev, vdev) {
5533 		if (dp_vdev_get_ref(soc, vdev, DP_MOD_ID_GENERIC_STATS) !=
5534 		    QDF_STATUS_SUCCESS)
5535 			continue;
5536 		vdev_array[index] = vdev;
5537 		index = index + 1;
5538 	}
5539 	qdf_spin_unlock_bh(&pdev->vdev_list_lock);
5540 
5541 	num_vdev = index;
5542 
5543 	for (index = 0; index < num_vdev; index++) {
5544 		vdev = vdev_array[index];
5545 		dp_vdev_init_tx_delay_stats(vdev);
5546 		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS);
5547 	}
5548 	qdf_mem_free(vdev_array);
5549 }
5550 #endif
5551 
5552 void dp_print_soc_cfg_params(struct dp_soc *soc)
5553 {
5554 	struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx;
5555 	uint8_t index = 0, i = 0;
5556 	char ring_mask[DP_MAX_INT_CONTEXTS_STRING_LENGTH];
5557 	int num_of_int_contexts;
5558 
5559 	if (!soc) {
5560 		dp_err("Context is null");
5561 		return;
5562 	}
5563 
5564 	soc_cfg_ctx = soc->wlan_cfg_ctx;
5565 
5566 	if (!soc_cfg_ctx) {
5567 		dp_err("Context is null");
5568 		return;
5569 	}
5570 
5571 	num_of_int_contexts =
5572 			wlan_cfg_get_num_contexts(soc_cfg_ctx);
5573 
5574 	DP_PRINT_STATS("No. of interrupt contexts: %u",
5575 		       soc_cfg_ctx->num_int_ctxts);
5576 	DP_PRINT_STATS("Max clients: %u",
5577 		       soc_cfg_ctx->max_clients);
5578 	DP_PRINT_STATS("Max alloc size: %u ",
5579 		       soc_cfg_ctx->max_alloc_size);
5580 	DP_PRINT_STATS("Per pdev tx ring: %u ",
5581 		       soc_cfg_ctx->per_pdev_tx_ring);
5582 	DP_PRINT_STATS("Num tcl data rings: %u ",
5583 		       soc_cfg_ctx->num_tcl_data_rings);
5584 	DP_PRINT_STATS("Per pdev rx ring: %u ",
5585 		       soc_cfg_ctx->per_pdev_rx_ring);
5586 	DP_PRINT_STATS("Per pdev lmac ring: %u ",
5587 		       soc_cfg_ctx->per_pdev_lmac_ring);
5588 	DP_PRINT_STATS("Num of reo dest rings: %u ",
5589 		       soc_cfg_ctx->num_reo_dest_rings);
5590 	DP_PRINT_STATS("Num tx desc pool: %u ",
5591 		       soc_cfg_ctx->num_tx_desc_pool);
5592 	DP_PRINT_STATS("Num tx ext desc pool: %u ",
5593 		       soc_cfg_ctx->num_tx_ext_desc_pool);
5594 	DP_PRINT_STATS("Num tx desc: %u ",
5595 		       soc_cfg_ctx->num_tx_desc);
5596 	DP_PRINT_STATS("Num tx ext desc: %u ",
5597 		       soc_cfg_ctx->num_tx_ext_desc);
5598 	DP_PRINT_STATS("Htt packet type: %u ",
5599 		       soc_cfg_ctx->htt_packet_type);
5600 	DP_PRINT_STATS("Max peer_ids: %u ",
5601 		       soc_cfg_ctx->max_peer_id);
5602 	DP_PRINT_STATS("Tx ring size: %u ",
5603 		       soc_cfg_ctx->tx_ring_size);
5604 	DP_PRINT_STATS("Tx comp ring size: %u ",
5605 		       soc_cfg_ctx->tx_comp_ring_size);
5606 	DP_PRINT_STATS("Tx comp ring size nss: %u ",
5607 		       soc_cfg_ctx->tx_comp_ring_size_nss);
5608 	DP_PRINT_STATS("Int batch threshold tx: %u ",
5609 		       soc_cfg_ctx->int_batch_threshold_tx);
5610 	DP_PRINT_STATS("Int timer threshold tx: %u ",
5611 		       soc_cfg_ctx->int_timer_threshold_tx);
5612 	DP_PRINT_STATS("Int batch threshold rx: %u ",
5613 		       soc_cfg_ctx->int_batch_threshold_rx);
5614 	DP_PRINT_STATS("Int timer threshold rx: %u ",
5615 		       soc_cfg_ctx->int_timer_threshold_rx);
5616 	DP_PRINT_STATS("Int batch threshold other: %u ",
5617 		       soc_cfg_ctx->int_batch_threshold_other);
5618 	DP_PRINT_STATS("Int timer threshold other: %u ",
5619 		       soc_cfg_ctx->int_timer_threshold_other);
5620 	DP_PRINT_STATS("DP NAPI scale factor: %u ",
5621 		       soc_cfg_ctx->napi_scale_factor);
5622 
5623 	for (i = 0; i < num_of_int_contexts; i++) {
5624 		index += qdf_snprint(&ring_mask[index],
5625 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5626 				     " %d",
5627 				     soc_cfg_ctx->int_tx_ring_mask[i]);
5628 	}
5629 
5630 	DP_PRINT_STATS("Tx ring mask (0-%d):%s",
5631 		       num_of_int_contexts, ring_mask);
5632 
5633 	index = 0;
5634 	for (i = 0; i < num_of_int_contexts; i++) {
5635 		index += qdf_snprint(&ring_mask[index],
5636 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5637 				     " %d",
5638 				     soc_cfg_ctx->int_rx_ring_mask[i]);
5639 	}
5640 
5641 	DP_PRINT_STATS("Rx ring mask (0-%d):%s",
5642 		       num_of_int_contexts, ring_mask);
5643 
5644 	index = 0;
5645 	for (i = 0; i < num_of_int_contexts; i++) {
5646 		index += qdf_snprint(&ring_mask[index],
5647 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5648 				     " %d",
5649 				     soc_cfg_ctx->int_rx_mon_ring_mask[i]);
5650 	}
5651 
5652 	DP_PRINT_STATS("Rx mon ring mask (0-%d):%s",
5653 		       num_of_int_contexts, ring_mask);
5654 
5655 	index = 0;
5656 	for (i = 0; i < num_of_int_contexts; i++) {
5657 		index += qdf_snprint(&ring_mask[index],
5658 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5659 				     " %d",
5660 				     soc_cfg_ctx->int_rx_err_ring_mask[i]);
5661 	}
5662 
5663 	DP_PRINT_STATS("Rx err ring mask (0-%d):%s",
5664 		       num_of_int_contexts, ring_mask);
5665 
5666 	index = 0;
5667 	for (i = 0; i < num_of_int_contexts; i++) {
5668 		index += qdf_snprint(&ring_mask[index],
5669 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5670 				     " %d",
5671 				     soc_cfg_ctx->int_rx_wbm_rel_ring_mask[i]);
5672 	}
5673 
5674 	DP_PRINT_STATS("Rx wbm rel ring mask (0-%d):%s",
5675 		       num_of_int_contexts, ring_mask);
5676 
5677 	index = 0;
5678 	for (i = 0; i < num_of_int_contexts; i++) {
5679 		index += qdf_snprint(&ring_mask[index],
5680 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5681 				     " %d",
5682 				     soc_cfg_ctx->int_reo_status_ring_mask[i]);
5683 	}
5684 
5685 	DP_PRINT_STATS("Reo ring mask (0-%d):%s",
5686 		       num_of_int_contexts, ring_mask);
5687 
5688 	index = 0;
5689 	for (i = 0; i < num_of_int_contexts; i++) {
5690 		index += qdf_snprint(&ring_mask[index],
5691 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5692 				     " %d",
5693 				     soc_cfg_ctx->int_rxdma2host_ring_mask[i]);
5694 	}
5695 
5696 	DP_PRINT_STATS("Rxdma2host ring mask (0-%d):%s",
5697 		       num_of_int_contexts, ring_mask);
5698 
5699 	index = 0;
5700 	for (i = 0; i < num_of_int_contexts; i++) {
5701 		index += qdf_snprint(&ring_mask[index],
5702 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5703 				     " %d",
5704 				     soc_cfg_ctx->int_host2rxdma_ring_mask[i]);
5705 	}
5706 
5707 	DP_PRINT_STATS("Host2rxdma ring mask (0-%d):%s",
5708 		       num_of_int_contexts, ring_mask);
5709 
5710 	DP_PRINT_STATS("Rx hash: %u ",
5711 		       soc_cfg_ctx->rx_hash);
5712 	DP_PRINT_STATS("Tso enabled: %u ",
5713 		       soc_cfg_ctx->tso_enabled);
5714 	DP_PRINT_STATS("Lro enabled: %u ",
5715 		       soc_cfg_ctx->lro_enabled);
5716 	DP_PRINT_STATS("Sg enabled: %u ",
5717 		       soc_cfg_ctx->sg_enabled);
5718 	DP_PRINT_STATS("Gro enabled: %u ",
5719 		       soc_cfg_ctx->gro_enabled);
5720 	DP_PRINT_STATS("TC based dynamic GRO: %u ",
5721 		       soc_cfg_ctx->tc_based_dynamic_gro);
5722 	DP_PRINT_STATS("TC ingress prio: %u ",
5723 		       soc_cfg_ctx->tc_ingress_prio);
5724 	DP_PRINT_STATS("rawmode enabled: %u ",
5725 		       soc_cfg_ctx->rawmode_enabled);
5726 	DP_PRINT_STATS("peer flow ctrl enabled: %u ",
5727 		       soc_cfg_ctx->peer_flow_ctrl_enabled);
5728 	DP_PRINT_STATS("napi enabled: %u ",
5729 		       soc_cfg_ctx->napi_enabled);
5730 	DP_PRINT_STATS("P2P Tcp Udp checksum offload: %u ",
5731 		       soc_cfg_ctx->p2p_tcp_udp_checksumoffload);
5732 	DP_PRINT_STATS("NAN Tcp Udp checksum offload: %u ",
5733 		       soc_cfg_ctx->nan_tcp_udp_checksumoffload);
5734 	DP_PRINT_STATS("Tcp Udp checksum offload: %u ",
5735 		       soc_cfg_ctx->tcp_udp_checksumoffload);
5736 	DP_PRINT_STATS("Defrag timeout check: %u ",
5737 		       soc_cfg_ctx->defrag_timeout_check);
5738 	DP_PRINT_STATS("Rx defrag min timeout: %u ",
5739 		       soc_cfg_ctx->rx_defrag_min_timeout);
5740 	DP_PRINT_STATS("WBM release ring: %u ",
5741 		       soc_cfg_ctx->wbm_release_ring);
5742 	DP_PRINT_STATS("TCL CMD_CREDIT ring: %u ",
5743 		       soc_cfg_ctx->tcl_cmd_credit_ring);
5744 	DP_PRINT_STATS("TCL Status ring: %u ",
5745 		       soc_cfg_ctx->tcl_status_ring);
5746 	DP_PRINT_STATS("REO Destination ring: %u ",
5747 		       soc_cfg_ctx->reo_dst_ring_size);
5748 	DP_PRINT_STATS("REO Reinject ring: %u ",
5749 		       soc_cfg_ctx->reo_reinject_ring);
5750 	DP_PRINT_STATS("RX release ring: %u ",
5751 		       soc_cfg_ctx->rx_release_ring);
5752 	DP_PRINT_STATS("REO Exception ring: %u ",
5753 		       soc_cfg_ctx->reo_exception_ring);
5754 	DP_PRINT_STATS("REO CMD ring: %u ",
5755 		       soc_cfg_ctx->reo_cmd_ring);
5756 	DP_PRINT_STATS("REO STATUS ring: %u ",
5757 		       soc_cfg_ctx->reo_status_ring);
5758 	DP_PRINT_STATS("RXDMA refill ring: %u ",
5759 		       soc_cfg_ctx->rxdma_refill_ring);
5760 	DP_PRINT_STATS("TX_desc limit_0: %u ",
5761 		       soc_cfg_ctx->tx_desc_limit_0);
5762 	DP_PRINT_STATS("TX_desc limit_1: %u ",
5763 		       soc_cfg_ctx->tx_desc_limit_1);
5764 	DP_PRINT_STATS("TX_desc limit_2: %u ",
5765 		       soc_cfg_ctx->tx_desc_limit_2);
5766 	DP_PRINT_STATS("TX device limit: %u ",
5767 		       soc_cfg_ctx->tx_device_limit);
5768 	DP_PRINT_STATS("TX sw internode queue: %u ",
5769 		       soc_cfg_ctx->tx_sw_internode_queue);
5770 	DP_PRINT_STATS("RXDMA err dst ring: %u ",
5771 		       soc_cfg_ctx->rxdma_err_dst_ring);
5772 	DP_PRINT_STATS("RX Flow Tag Enabled: %u ",
5773 		       soc_cfg_ctx->is_rx_flow_tag_enabled);
5774 	DP_PRINT_STATS("RX Flow Search Table Size (# of entries): %u ",
5775 		       soc_cfg_ctx->rx_flow_search_table_size);
5776 	DP_PRINT_STATS("RX Flow Search Table Per PDev : %u ",
5777 		       soc_cfg_ctx->is_rx_flow_search_table_per_pdev);
5778 	DP_PRINT_STATS("Rx desc pool size: %u ",
5779 		       soc_cfg_ctx->rx_sw_desc_num);
5780 }
5781 
5782 void
5783 dp_print_pdev_cfg_params(struct dp_pdev *pdev)
5784 {
5785 	struct wlan_cfg_dp_pdev_ctxt *pdev_cfg_ctx;
5786 
5787 	if (!pdev) {
5788 		dp_err("Context is null");
5789 		return;
5790 	}
5791 
5792 	pdev_cfg_ctx = pdev->wlan_cfg_ctx;
5793 
5794 	if (!pdev_cfg_ctx) {
5795 		dp_err("Context is null");
5796 		return;
5797 	}
5798 
5799 	DP_PRINT_STATS("Rx dma buf ring size: %d ",
5800 		       pdev_cfg_ctx->rx_dma_buf_ring_size);
5801 	DP_PRINT_STATS("DMA Mon buf ring size: %d ",
5802 		       pdev_cfg_ctx->dma_mon_buf_ring_size);
5803 	DP_PRINT_STATS("DMA Mon dest ring size: %d ",
5804 		       pdev_cfg_ctx->dma_rx_mon_dest_ring_size);
5805 	DP_PRINT_STATS("DMA Mon status ring size: %d ",
5806 		       pdev_cfg_ctx->dma_mon_status_ring_size);
5807 	DP_PRINT_STATS("Rxdma monitor desc ring: %d",
5808 		       pdev_cfg_ctx->rxdma_monitor_desc_ring);
5809 	DP_PRINT_STATS("Num mac rings: %d ",
5810 		       pdev_cfg_ctx->num_mac_rings);
5811 }
5812 
5813 /**
5814  * dp_print_ring_stat_from_hal(): Print hal level ring stats
5815  * @soc: DP_SOC handle
5816  * @srng: DP_SRNG handle
5817  * @ring_name: SRNG name
5818  * @ring_type: srng src/dst ring
5819  *
5820  * Return: void
5821  */
5822 void
5823 dp_print_ring_stat_from_hal(struct dp_soc *soc,  struct dp_srng *srng,
5824 			    enum hal_ring_type ring_type)
5825 {
5826 	uint32_t tailp;
5827 	uint32_t headp;
5828 	int32_t hw_headp = -1;
5829 	int32_t hw_tailp = -1;
5830 	uint32_t ring_usage;
5831 	const char *ring_name;
5832 	struct hal_soc *hal_soc;
5833 
5834 	if (soc && srng && srng->hal_srng) {
5835 		hal_soc = (struct hal_soc *)soc->hal_soc;
5836 		ring_name = dp_srng_get_str_from_hal_ring_type(ring_type);
5837 		hal_get_sw_hptp(soc->hal_soc, srng->hal_srng, &tailp, &headp);
5838 		ring_usage = hal_get_ring_usage(srng->hal_srng,
5839 						ring_type, &headp, &tailp);
5840 
5841 		DP_PRINT_STATS("%s:SW: Head = %d Tail = %d Ring Usage = %u",
5842 			       ring_name, headp, tailp, ring_usage);
5843 
5844 		hal_get_hw_hptp(soc->hal_soc, srng->hal_srng, &hw_headp,
5845 				&hw_tailp, ring_type);
5846 		ring_usage = 0;
5847 		if (hw_headp >= 0 && tailp >= 0)
5848 			ring_usage =
5849 				hal_get_ring_usage(
5850 					srng->hal_srng, ring_type,
5851 					&hw_headp, &hw_tailp);
5852 		DP_PRINT_STATS("%s:HW: Head = %d Tail = %d Ring Usage = %u",
5853 			       ring_name, hw_headp, hw_tailp, ring_usage);
5854 	}
5855 }
5856 
5857 #ifdef FEATURE_TSO_STATS
5858 /**
5859  * dp_print_tso_seg_stats - tso segment stats
5860  * @pdev: pdev handle
5861  * @id: tso packet id
5862  *
5863  * Return: None
5864  */
5865 static void dp_print_tso_seg_stats(struct dp_pdev *pdev, uint32_t id)
5866 {
5867 	uint8_t num_seg;
5868 	uint32_t segid;
5869 
5870 	/* TSO LEVEL 2 - SEGMENT INFO */
5871 	num_seg = pdev->stats.tso_stats.tso_info.tso_packet_info[id].num_seg;
5872 	for (segid = 0; segid < CDP_MAX_TSO_SEGMENTS && segid < num_seg; segid++) {
5873 		DP_PRINT_STATS(
5874 			  "Segment id:[%u] fragments: %u | Segment Length %u | TCP Seq no.: %u | ip_id: %u",
5875 			  segid,
5876 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5877 			  .tso_seg[segid].num_frags,
5878 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5879 			  .tso_seg[segid].total_len,
5880 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5881 			  .tso_seg[segid].tso_flags.tcp_seq_num,
5882 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5883 			  .tso_seg[segid].tso_flags.ip_id);
5884 		DP_PRINT_STATS(
5885 			  "fin: %u syn: %u rst: %u psh: %u ack: %u urg: %u ece: %u cwr: %u ns: %u",
5886 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5887 			  .tso_seg[segid].tso_flags.fin,
5888 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5889 			  .tso_seg[segid].tso_flags.syn,
5890 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5891 			  .tso_seg[segid].tso_flags.rst,
5892 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5893 			  .tso_seg[segid].tso_flags.psh,
5894 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5895 			  .tso_seg[segid].tso_flags.ack,
5896 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5897 			  .tso_seg[segid].tso_flags.urg,
5898 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5899 			  .tso_seg[segid].tso_flags.ece,
5900 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5901 			  .tso_seg[segid].tso_flags.cwr,
5902 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5903 			  .tso_seg[segid].tso_flags.ns);
5904 	}
5905 }
5906 #else
5907 static inline
5908 void dp_print_tso_seg_stats(struct dp_pdev *pdev, uint32_t id)
5909 {
5910 }
5911 #endif /* FEATURE_TSO_STATS */
5912 
5913 /**
5914  * dp_print_mon_ring_stats_from_hal() - Print stat for monitor rings based
5915  *					on target
5916  * @pdev: physical device handle
5917  * @mac_id: mac id
5918  *
5919  * Return: void
5920  */
5921 static inline
5922 void dp_print_mon_ring_stat_from_hal(struct dp_pdev *pdev, uint8_t mac_id)
5923 {
5924 	if (pdev->soc->wlan_cfg_ctx->rxdma1_enable) {
5925 		dp_print_ring_stat_from_hal(pdev->soc,
5926 			&pdev->soc->rxdma_mon_buf_ring[mac_id],
5927 			RXDMA_MONITOR_BUF);
5928 		dp_print_ring_stat_from_hal(pdev->soc,
5929 			&pdev->soc->rxdma_mon_dst_ring[mac_id],
5930 			RXDMA_MONITOR_DST);
5931 		dp_print_ring_stat_from_hal(pdev->soc,
5932 			&pdev->soc->rxdma_mon_desc_ring[mac_id],
5933 			RXDMA_MONITOR_DESC);
5934 	}
5935 
5936 	dp_print_ring_stat_from_hal(pdev->soc,
5937 				    &pdev->soc->rxdma_mon_status_ring[mac_id],
5938 					RXDMA_MONITOR_STATUS);
5939 }
5940 
5941 void
5942 dp_print_ring_stats(struct dp_pdev *pdev)
5943 {
5944 	struct dp_soc *soc = pdev->soc;
5945 	uint32_t i;
5946 	int mac_id;
5947 	int lmac_id;
5948 
5949 	if (hif_rtpm_get(HIF_RTPM_GET_SYNC, HIF_RTPM_ID_DP_RING_STATS))
5950 		return;
5951 
5952 	dp_print_ring_stat_from_hal(pdev->soc,
5953 				    &pdev->soc->wbm_idle_link_ring,
5954 				    WBM_IDLE_LINK);
5955 	dp_print_ring_stat_from_hal(pdev->soc,
5956 				    &pdev->soc->reo_exception_ring,
5957 				    REO_EXCEPTION);
5958 	dp_print_ring_stat_from_hal(pdev->soc,
5959 				    &pdev->soc->reo_reinject_ring,
5960 				    REO_REINJECT);
5961 	dp_print_ring_stat_from_hal(pdev->soc,
5962 				    &pdev->soc->reo_cmd_ring,
5963 				    REO_CMD);
5964 	dp_print_ring_stat_from_hal(pdev->soc,
5965 				    &pdev->soc->reo_status_ring,
5966 				    REO_STATUS);
5967 	dp_print_ring_stat_from_hal(pdev->soc,
5968 				    &pdev->soc->rx_rel_ring,
5969 				    WBM2SW_RELEASE);
5970 	dp_print_ring_stat_from_hal(pdev->soc,
5971 				    &pdev->soc->tcl_cmd_credit_ring,
5972 				    TCL_CMD_CREDIT);
5973 	dp_print_ring_stat_from_hal(pdev->soc,
5974 				    &pdev->soc->tcl_status_ring,
5975 				    TCL_STATUS);
5976 	dp_print_ring_stat_from_hal(pdev->soc,
5977 				    &pdev->soc->wbm_desc_rel_ring,
5978 				    SW2WBM_RELEASE);
5979 	for (i = 0; i < MAX_REO_DEST_RINGS; i++)
5980 		dp_print_ring_stat_from_hal(pdev->soc,
5981 					    &pdev->soc->reo_dest_ring[i],
5982 					    REO_DST);
5983 
5984 	for (i = 0; i < pdev->soc->num_tcl_data_rings; i++)
5985 		dp_print_ring_stat_from_hal(pdev->soc,
5986 					    &pdev->soc->tcl_data_ring[i],
5987 					    TCL_DATA);
5988 	for (i = 0; i < pdev->soc->num_tcl_data_rings; i++)
5989 		dp_print_ring_stat_from_hal(pdev->soc,
5990 					    &pdev->soc->tx_comp_ring[i],
5991 					    WBM2SW_RELEASE);
5992 
5993 	if (pdev->soc->features.dmac_cmn_src_rxbuf_ring_enabled) {
5994 		for (i = 0; i < pdev->soc->num_rx_refill_buf_rings; i++) {
5995 			dp_print_ring_stat_from_hal
5996 				(pdev->soc, &pdev->soc->rx_refill_buf_ring[i],
5997 				 RXDMA_BUF);
5998 		}
5999 	} else {
6000 		lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc, 0,
6001 						     pdev->pdev_id);
6002 		dp_print_ring_stat_from_hal
6003 			(pdev->soc, &pdev->soc->rx_refill_buf_ring[lmac_id],
6004 			 RXDMA_BUF);
6005 	}
6006 
6007 	dp_print_ring_stat_from_hal(pdev->soc,
6008 				    &pdev->rx_refill_buf_ring2,
6009 				    RXDMA_BUF);
6010 
6011 	for (i = 0; i < MAX_RX_MAC_RINGS; i++)
6012 		dp_print_ring_stat_from_hal(pdev->soc,
6013 					    &pdev->rx_mac_buf_ring[i],
6014 					    RXDMA_BUF);
6015 
6016 	for (mac_id = 0;
6017 	     mac_id  < soc->wlan_cfg_ctx->num_rxdma_status_rings_per_pdev;
6018 	     mac_id++) {
6019 		lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc,
6020 						     mac_id, pdev->pdev_id);
6021 
6022 		dp_print_mon_ring_stat_from_hal(pdev, lmac_id);
6023 	}
6024 
6025 	for (i = 0; i < soc->wlan_cfg_ctx->num_rxdma_dst_rings_per_pdev; i++) {
6026 		lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc,
6027 						     i, pdev->pdev_id);
6028 
6029 		dp_print_ring_stat_from_hal(pdev->soc,
6030 					    &pdev->soc->rxdma_err_dst_ring
6031 					    [lmac_id],
6032 					    RXDMA_DST);
6033 	}
6034 
6035 #ifdef WLAN_SUPPORT_PPEDS
6036 	if (pdev->soc->arch_ops.dp_txrx_ppeds_rings_status)
6037 		pdev->soc->arch_ops.dp_txrx_ppeds_rings_status(pdev->soc);
6038 #endif
6039 	hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_DP_RING_STATS);
6040 }
6041 
6042 /**
6043  * dp_print_common_rates_info(): Print common rate for tx or rx
6044  * @pkt_type_array: rate type array contains rate info
6045  *
6046  * Return:void
6047  */
6048 static inline void
6049 dp_print_common_rates_info(struct cdp_pkt_type *pkt_type_array)
6050 {
6051 	uint8_t mcs, pkt_type;
6052 
6053 	DP_PRINT_STATS("MSDU Count");
6054 	for (pkt_type = 0; pkt_type < DOT11_MAX; pkt_type++) {
6055 		for (mcs = 0; mcs < MAX_MCS; mcs++) {
6056 			if (!cdp_rate_string[pkt_type][mcs].valid)
6057 				continue;
6058 
6059 			DP_PRINT_STATS("	%s = %d",
6060 				       cdp_rate_string[pkt_type][mcs].mcs_type,
6061 				       pkt_type_array[pkt_type].mcs_count[mcs]);
6062 		}
6063 
6064 		DP_PRINT_STATS("\n");
6065 	}
6066 }
6067 
6068 /**
6069  * dp_print_common_ppdu_rates_info(): Print ppdu rate for tx or rx
6070  * @pkt_type_array: rate type array contains rate info
6071  * @pkt_type: packet type
6072  *
6073  * Return:void
6074  */
6075 #ifdef WLAN_FEATURE_11BE
6076 static inline void
6077 dp_print_common_ppdu_rates_info(struct cdp_pkt_type *pkt_type_array,
6078 				enum cdp_packet_type pkt_type)
6079 {
6080 	uint8_t mcs;
6081 
6082 	DP_PRINT_STATS("PPDU Count");
6083 	for (mcs = 0; mcs < MAX_MCS; mcs++) {
6084 		if (pkt_type == DOT11_AX) {
6085 			if (!dp_ppdu_rate_string[0][mcs].valid)
6086 				continue;
6087 
6088 			DP_PRINT_STATS("	%s = %d",
6089 				       dp_ppdu_rate_string[0][mcs].mcs_type,
6090 				       pkt_type_array->mcs_count[mcs]);
6091 		} else if (pkt_type == DOT11_BE) {
6092 			if (!dp_ppdu_rate_string[1][mcs].valid)
6093 				continue;
6094 
6095 			DP_PRINT_STATS("	%s = %d",
6096 				       dp_ppdu_rate_string[1][mcs].mcs_type,
6097 				       pkt_type_array->mcs_count[mcs]);
6098 		}
6099 	}
6100 
6101 	DP_PRINT_STATS("\n");
6102 }
6103 #else
6104 static inline void
6105 dp_print_common_ppdu_rates_info(struct cdp_pkt_type *pkt_type_array,
6106 				enum cdp_packet_type pkt_type)
6107 {
6108 	uint8_t mcs;
6109 
6110 	DP_PRINT_STATS("PPDU Count");
6111 	for (mcs = 0; mcs < MAX_MCS; mcs++) {
6112 		if (!dp_ppdu_rate_string[0][mcs].valid)
6113 			continue;
6114 
6115 		DP_PRINT_STATS("	%s = %d",
6116 			       dp_ppdu_rate_string[0][mcs].mcs_type,
6117 			       pkt_type_array->mcs_count[mcs]);
6118 	}
6119 
6120 	DP_PRINT_STATS("\n");
6121 }
6122 #endif
6123 
6124 /**
6125  * dp_print_mu_be_ppdu_rates_info(): Print mu be rate for tx or rx
6126  * @pkt_type_array: rate type array contains rate info
6127  *
6128  * Return:void
6129  */
6130 #ifdef WLAN_FEATURE_11BE
6131 static inline void
6132 dp_print_mu_be_ppdu_rates_info(struct cdp_pkt_type *pkt_type_array)
6133 {
6134 	uint8_t mcs, pkt_type;
6135 
6136 	DP_PRINT_STATS("PPDU Count");
6137 	for (pkt_type = 0; pkt_type < TXRX_TYPE_MU_MAX; pkt_type++) {
6138 		for (mcs = 0; mcs < MAX_MCS; mcs++) {
6139 			if (!dp_mu_be_rate_string[pkt_type][mcs].valid)
6140 				continue;
6141 
6142 			DP_PRINT_STATS("	%s = %d",
6143 				       dp_mu_be_rate_string[pkt_type][mcs].mcs_type,
6144 				       pkt_type_array[pkt_type].mcs_count[mcs]);
6145 		}
6146 
6147 		DP_PRINT_STATS("\n");
6148 	}
6149 }
6150 #endif
6151 
6152 static inline void
6153 dp_print_mu_ppdu_rates_info(struct cdp_rx_mu *rx_mu)
6154 {
6155 	uint8_t mcs, pkt_type;
6156 
6157 	DP_PRINT_STATS("PPDU Count");
6158 	for (pkt_type = 0; pkt_type < TXRX_TYPE_MU_MAX; pkt_type++) {
6159 		for (mcs = 0; mcs < MAX_MCS; mcs++) {
6160 			if (!dp_mu_rate_string[pkt_type][mcs].valid)
6161 				continue;
6162 
6163 			DP_PRINT_STATS("	%s = %d",
6164 				dp_mu_rate_string[pkt_type][mcs].mcs_type,
6165 				rx_mu[pkt_type].ppdu.mcs_count[mcs]);
6166 		}
6167 
6168 		DP_PRINT_STATS("\n");
6169 	}
6170 }
6171 
6172 void dp_print_rx_rates(struct dp_vdev *vdev)
6173 {
6174 	struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev;
6175 	uint8_t i;
6176 	uint8_t index = 0;
6177 	char nss[DP_NSS_LENGTH];
6178 
6179 	DP_PRINT_STATS("Rx Rate Info:\n");
6180 	dp_print_common_rates_info(pdev->stats.rx.pkt_type);
6181 
6182 	index = 0;
6183 	for (i = 0; i < SS_COUNT; i++) {
6184 		index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index,
6185 				     " %d", pdev->stats.rx.nss[i]);
6186 	}
6187 	DP_PRINT_STATS("NSS(1-8) = %s",
6188 		       nss);
6189 
6190 	DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
6191 		       pdev->stats.rx.sgi_count[0],
6192 		       pdev->stats.rx.sgi_count[1],
6193 		       pdev->stats.rx.sgi_count[2],
6194 		       pdev->stats.rx.sgi_count[3]);
6195 	DP_PRINT_STATS("BW Counts = 20MHZ %d, 40MHZ %d, 80MHZ %d, 160MHZ %d",
6196 		       pdev->stats.rx.bw[0], pdev->stats.rx.bw[1],
6197 		       pdev->stats.rx.bw[2], pdev->stats.rx.bw[3]);
6198 	DP_PRINT_STATS("Reception Type ="
6199 		       "SU: %d MU_MIMO:%d MU_OFDMA:%d MU_OFDMA_MIMO:%d",
6200 		       pdev->stats.rx.reception_type[0],
6201 		       pdev->stats.rx.reception_type[1],
6202 		       pdev->stats.rx.reception_type[2],
6203 		       pdev->stats.rx.reception_type[3]);
6204 	DP_PRINT_STATS("Aggregation:\n");
6205 	DP_PRINT_STATS("Number of Msdu's Part of Ampdus = %d",
6206 		       pdev->stats.rx.ampdu_cnt);
6207 	DP_PRINT_STATS("Number of Msdu's With No Mpdu Level Aggregation : %d",
6208 		       pdev->stats.rx.non_ampdu_cnt);
6209 	DP_PRINT_STATS("Number of Msdu's Part of Amsdu: %d",
6210 		       pdev->stats.rx.amsdu_cnt);
6211 	DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation: %d",
6212 		       pdev->stats.rx.non_amsdu_cnt);
6213 }
6214 
6215 void dp_print_tx_rates(struct dp_vdev *vdev)
6216 {
6217 	struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev;
6218 
6219 	DP_PRINT_STATS("Tx Rate Info:\n");
6220 	dp_print_common_rates_info(pdev->stats.tx.pkt_type);
6221 
6222 	DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
6223 		       pdev->stats.tx.sgi_count[0],
6224 		       pdev->stats.tx.sgi_count[1],
6225 		       pdev->stats.tx.sgi_count[2],
6226 		       pdev->stats.tx.sgi_count[3]);
6227 
6228 	DP_PRINT_STATS("BW Counts = 20MHZ %d, 40MHZ %d, 80MHZ %d, 160MHZ %d",
6229 		       pdev->stats.tx.bw[0], pdev->stats.tx.bw[1],
6230 		       pdev->stats.tx.bw[2], pdev->stats.tx.bw[3]);
6231 
6232 	DP_PRINT_STATS("OFDMA = %d", pdev->stats.tx.ofdma);
6233 	DP_PRINT_STATS("STBC = %d", pdev->stats.tx.stbc);
6234 	DP_PRINT_STATS("LDPC = %d", pdev->stats.tx.ldpc);
6235 	DP_PRINT_STATS("Retries = %d", pdev->stats.tx.retries);
6236 	DP_PRINT_STATS("Last ack rssi = %d\n", pdev->stats.tx.last_ack_rssi);
6237 	DP_PRINT_STATS("Number of PPDU's with Punctured Preamble = %d",
6238 			   pdev->stats.tx.pream_punct_cnt);
6239 
6240 	DP_PRINT_STATS("Aggregation:\n");
6241 	DP_PRINT_STATS("Number of Msdu's Part of Ampdus = %d",
6242 		       pdev->stats.tx.ampdu_cnt);
6243 	DP_PRINT_STATS("Number of Msdu's With No Mpdu Level Aggregation : %d",
6244 		       pdev->stats.tx.non_ampdu_cnt);
6245 	DP_PRINT_STATS("Number of Msdu's Part of Amsdu = %d",
6246 		       pdev->stats.tx.amsdu_cnt);
6247 	DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation = %d",
6248 		       pdev->stats.tx.non_amsdu_cnt);
6249 }
6250 
6251 /**
6252  * dp_print_nss(): Print nss count
6253  * @nss: printable nss count array
6254  * @pnss: nss count array
6255  * @ss_count: number of nss
6256  *
6257  * Return:void
6258  */
6259 static void dp_print_nss(char *nss, uint32_t *pnss, uint32_t ss_count)
6260 {
6261 	uint32_t index;
6262 	uint8_t i;
6263 
6264 	index = 0;
6265 	for (i = 0; i < ss_count; i++) {
6266 		index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index,
6267 				     " %d", *(pnss + i));
6268 	}
6269 }
6270 
6271 /**
6272  * dp_print_jitter_stats(): Print per-tid jitter stats
6273  * @peer: DP peer object
6274  * @pdev: DP pdev object
6275  *
6276  * Return: void
6277  */
6278 #ifdef WLAN_PEER_JITTER
6279 static void dp_print_jitter_stats(struct dp_peer *peer, struct dp_pdev *pdev)
6280 {
6281 	uint8_t tid = 0;
6282 
6283 	if (!pdev || !wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx))
6284 		return;
6285 
6286 	if (!peer->txrx_peer || !peer->txrx_peer->jitter_stats)
6287 		return;
6288 
6289 	DP_PRINT_STATS("Per TID Tx HW Enqueue-Comp Jitter Stats:\n");
6290 	for (tid = 0; tid < qdf_min(CDP_DATA_TID_MAX, DP_MAX_TIDS); tid++) {
6291 		struct cdp_peer_tid_stats *rx_tid =
6292 					&peer->txrx_peer->jitter_stats[tid];
6293 
6294 		DP_PRINT_STATS("Node tid = %d\n"
6295 				"Average Jiiter            : %u (us)\n"
6296 				"Average Delay             : %u (us)\n"
6297 				"Total Average error count : %llu\n"
6298 				"Total Success Count       : %llu\n"
6299 				"Total Drop                : %llu\n",
6300 				tid,
6301 				rx_tid->tx_avg_jitter,
6302 				rx_tid->tx_avg_delay,
6303 				rx_tid->tx_avg_err,
6304 				rx_tid->tx_total_success,
6305 				rx_tid->tx_drop);
6306 	}
6307 }
6308 #else
6309 static void dp_print_jitter_stats(struct dp_peer *peer, struct dp_pdev *pdev)
6310 {
6311 }
6312 #endif /* WLAN_PEER_JITTER */
6313 
6314 #ifdef QCA_PEER_EXT_STATS
6315 /*
6316  * dp_print_hist_stats() : Print delay histogram
6317  * @hstats: Histogram stats
6318  *
6319  * Return: void
6320  */
6321 static void dp_print_hist_stats(struct cdp_hist_stats *hstats,
6322 				enum cdp_hist_types hist_type)
6323 {
6324 	uint8_t index = 0;
6325 	uint64_t count = 0;
6326 	bool hist_delay_data = false;
6327 
6328 	for (index = 0; index < CDP_HIST_BUCKET_MAX; index++) {
6329 		count = hstats->hist.freq[index];
6330 		if (!count)
6331 			continue;
6332 		hist_delay_data = true;
6333 		if (hist_type == CDP_HIST_TYPE_SW_ENQEUE_DELAY)
6334 			DP_PRINT_STATS("%s:  Packets = %llu",
6335 				       dp_vow_str_sw_enq_delay(index),
6336 				       count);
6337 		else if (hist_type == CDP_HIST_TYPE_HW_COMP_DELAY)
6338 			DP_PRINT_STATS("%s:  Packets = %llu",
6339 				       dp_vow_str_fw_to_hw_delay(index),
6340 				       count);
6341 		else if (hist_type == CDP_HIST_TYPE_REAP_STACK)
6342 			DP_PRINT_STATS("%s:  Packets = %llu",
6343 				       dp_vow_str_intfrm_delay(index),
6344 				       count);
6345 	}
6346 
6347 	/*
6348 	 * If none of the buckets have any packets,
6349 	 * there is no need to display the stats.
6350 	 */
6351 	if (hist_delay_data) {
6352 		DP_PRINT_STATS("Min = %u", hstats->min);
6353 		DP_PRINT_STATS("Max = %u", hstats->max);
6354 		DP_PRINT_STATS("Avg = %u\n", hstats->avg);
6355 	}
6356 }
6357 
6358 #ifdef CONFIG_SAWF
6359 /*
6360  * dp_accumulate_delay_avg_stats(): Accumulate the delay average stats
6361  * @stats: cdp_delay_tid stats
6362  * @dst_hstats: Destination delay Tx stats
6363  * @tid: TID value
6364  *
6365  * Return: void
6366  */
6367 static void dp_accumulate_delay_avg_stats(struct cdp_delay_tid_stats stats[]
6368 					  [CDP_MAX_TXRX_CTX],
6369 					  struct cdp_delay_tx_stats *dst_stats,
6370 					  uint8_t tid)
6371 {
6372 	uint32_t num_rings = 0;
6373 	uint8_t ring_id;
6374 
6375 	for (ring_id = 0; ring_id < CDP_MAX_TXRX_CTX; ring_id++) {
6376 		struct cdp_delay_tx_stats *dstats =
6377 				&stats[tid][ring_id].tx_delay;
6378 
6379 		if (dstats->swdelay_avg || dstats->hwdelay_avg) {
6380 			dst_stats->nwdelay_avg += dstats->nwdelay_avg;
6381 			dst_stats->swdelay_avg += dstats->swdelay_avg;
6382 			dst_stats->hwdelay_avg += dstats->hwdelay_avg;
6383 			num_rings++;
6384 		}
6385 	}
6386 
6387 	if (!num_rings)
6388 		return;
6389 
6390 	dst_stats->nwdelay_avg = qdf_do_div(dst_stats->nwdelay_avg,
6391 					    num_rings);
6392 	dst_stats->swdelay_avg = qdf_do_div(dst_stats->swdelay_avg,
6393 					    num_rings);
6394 	dst_stats->hwdelay_avg = qdf_do_div(dst_stats->hwdelay_avg,
6395 					    num_rings);
6396 }
6397 #else
6398 static void dp_accumulate_delay_avg_stats(struct cdp_delay_tid_stats stats[]
6399 					  [CDP_MAX_TXRX_CTX],
6400 					  struct cdp_delay_tx_stats *dst_stats,
6401 					  uint8_t tid)
6402 {
6403 }
6404 #endif
6405 
6406 /*
6407  * dp_accumulate_delay_tid_stats(): Accumulate the tid stats to the
6408  *                                  hist stats.
6409  * @soc: DP SoC handle
6410  * @stats: cdp_delay_tid stats
6411  * @dst_hstats: Destination histogram to copy tid stats
6412  * @tid: TID value
6413  *
6414  * Return: void
6415  */
6416 static void dp_accumulate_delay_tid_stats(struct dp_soc *soc,
6417 					  struct cdp_delay_tid_stats stats[]
6418 					  [CDP_MAX_TXRX_CTX],
6419 					  struct cdp_hist_stats *dst_hstats,
6420 					  uint8_t tid, uint32_t mode)
6421 {
6422 	uint8_t ring_id;
6423 
6424 	if (wlan_cfg_get_dp_soc_nss_cfg(soc->wlan_cfg_ctx)) {
6425 		struct cdp_delay_tid_stats *dstats =
6426 				&stats[tid][0];
6427 		struct cdp_hist_stats *src_hstats = NULL;
6428 
6429 		switch (mode) {
6430 		case CDP_HIST_TYPE_SW_ENQEUE_DELAY:
6431 			src_hstats = &dstats->tx_delay.tx_swq_delay;
6432 			break;
6433 		case CDP_HIST_TYPE_HW_COMP_DELAY:
6434 			src_hstats = &dstats->tx_delay.hwtx_delay;
6435 			break;
6436 		case CDP_HIST_TYPE_REAP_STACK:
6437 			src_hstats = &dstats->rx_delay.to_stack_delay;
6438 			break;
6439 		default:
6440 			break;
6441 		}
6442 
6443 		if (src_hstats)
6444 			dp_copy_hist_stats(src_hstats, dst_hstats);
6445 
6446 		return;
6447 	}
6448 
6449 	for (ring_id = 0; ring_id < CDP_MAX_TXRX_CTX; ring_id++) {
6450 		struct cdp_delay_tid_stats *dstats =
6451 				&stats[tid][ring_id];
6452 		struct cdp_hist_stats *src_hstats = NULL;
6453 
6454 		switch (mode) {
6455 		case CDP_HIST_TYPE_SW_ENQEUE_DELAY:
6456 			src_hstats = &dstats->tx_delay.tx_swq_delay;
6457 			break;
6458 		case CDP_HIST_TYPE_HW_COMP_DELAY:
6459 			src_hstats = &dstats->tx_delay.hwtx_delay;
6460 			break;
6461 		case CDP_HIST_TYPE_REAP_STACK:
6462 			src_hstats = &dstats->rx_delay.to_stack_delay;
6463 			break;
6464 		default:
6465 			break;
6466 		}
6467 
6468 		if (src_hstats)
6469 			dp_accumulate_hist_stats(src_hstats, dst_hstats);
6470 	}
6471 }
6472 
6473 /*
6474  * dp_peer_print_delay_stats(): Print peer delay stats
6475  * @soc: DP SoC handle
6476  * @peer: DP peer handle
6477  *
6478  * Return: void
6479  */
6480 void dp_peer_print_tx_delay_stats(struct dp_pdev *pdev,
6481 				  struct dp_peer *peer)
6482 {
6483 	struct dp_peer_delay_stats *delay_stats;
6484 	struct dp_soc *soc = NULL;
6485 	struct cdp_hist_stats hist_stats;
6486 	uint8_t tid;
6487 
6488 	if (!peer || !peer->txrx_peer)
6489 		return;
6490 
6491 	if (!pdev || !pdev->soc)
6492 		return;
6493 
6494 	soc = pdev->soc;
6495 	if (!wlan_cfg_is_peer_ext_stats_enabled(soc->wlan_cfg_ctx))
6496 		return;
6497 
6498 	delay_stats = peer->txrx_peer->delay_stats;
6499 	if (!delay_stats)
6500 		return;
6501 
6502 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
6503 		DP_PRINT_STATS("----TID: %d----", tid);
6504 		DP_PRINT_STATS("Software Enqueue Delay:");
6505 		dp_hist_init(&hist_stats, CDP_HIST_TYPE_SW_ENQEUE_DELAY);
6506 		dp_accumulate_delay_tid_stats(soc, delay_stats->delay_tid_stats,
6507 					      &hist_stats, tid,
6508 					      CDP_HIST_TYPE_SW_ENQEUE_DELAY);
6509 		dp_print_hist_stats(&hist_stats, CDP_HIST_TYPE_SW_ENQEUE_DELAY);
6510 
6511 		DP_PRINT_STATS("Hardware Transmission Delay:");
6512 		dp_hist_init(&hist_stats, CDP_HIST_TYPE_HW_COMP_DELAY);
6513 		dp_accumulate_delay_tid_stats(soc, delay_stats->delay_tid_stats,
6514 					      &hist_stats, tid,
6515 					      CDP_HIST_TYPE_HW_COMP_DELAY);
6516 		dp_print_hist_stats(&hist_stats, CDP_HIST_TYPE_HW_COMP_DELAY);
6517 	}
6518 }
6519 
6520 /*
6521  * dp_peer_print_rx_delay_stats(): Print peer delay stats
6522  * @soc: DP SoC handle
6523  * @peer: DP peer handle
6524  *
6525  * Return: void
6526  */
6527 void dp_peer_print_rx_delay_stats(struct dp_pdev *pdev,
6528 				  struct dp_peer *peer)
6529 {
6530 	struct dp_peer_delay_stats *delay_stats;
6531 	struct dp_soc *soc = NULL;
6532 	struct cdp_hist_stats hist_stats;
6533 	uint8_t tid;
6534 
6535 	if (!peer || !peer->txrx_peer)
6536 		return;
6537 
6538 	if (!pdev || !pdev->soc)
6539 		return;
6540 
6541 	soc = pdev->soc;
6542 	if (!wlan_cfg_is_peer_ext_stats_enabled(soc->wlan_cfg_ctx))
6543 		return;
6544 
6545 	delay_stats = peer->txrx_peer->delay_stats;
6546 	if (!delay_stats)
6547 		return;
6548 
6549 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
6550 		DP_PRINT_STATS("----TID: %d----", tid);
6551 		DP_PRINT_STATS("Rx Reap2stack Deliver Delay:");
6552 		dp_hist_init(&hist_stats, CDP_HIST_TYPE_REAP_STACK);
6553 		dp_accumulate_delay_tid_stats(soc, delay_stats->delay_tid_stats,
6554 					      &hist_stats, tid,
6555 					      CDP_HIST_TYPE_REAP_STACK);
6556 		dp_print_hist_stats(&hist_stats, CDP_HIST_TYPE_REAP_STACK);
6557 	}
6558 }
6559 
6560 #else
6561 static inline void dp_peer_print_tx_delay_stats(struct dp_pdev *pdev,
6562 						struct dp_peer *peer)
6563 {
6564 }
6565 
6566 static inline void dp_peer_print_rx_delay_stats(struct dp_pdev *pdev,
6567 						struct dp_peer *peer)
6568 {
6569 }
6570 #endif
6571 
6572 #ifdef WLAN_FEATURE_11BE
6573 void dp_print_peer_txrx_stats_be(struct cdp_peer_stats *peer_stats,
6574 				 enum peer_stats_type stats_type)
6575 {
6576 	uint8_t i;
6577 
6578 	if (stats_type == PEER_TX_STATS) {
6579 		DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d 320MHZ %d\n",
6580 			       peer_stats->tx.bw[CMN_BW_20MHZ],
6581 			       peer_stats->tx.bw[CMN_BW_40MHZ],
6582 			       peer_stats->tx.bw[CMN_BW_80MHZ],
6583 			       peer_stats->tx.bw[CMN_BW_160MHZ],
6584 			       peer_stats->tx.bw[CMN_BW_320MHZ]);
6585 		DP_PRINT_STATS("Punctured BW Counts = NO_PUNC %d 20MHz %d 40MHz %d 80MHz %d 120MHz %d\n",
6586 			       peer_stats->tx.punc_bw[NO_PUNCTURE],
6587 			       peer_stats->tx.punc_bw[PUNCTURED_20MHZ],
6588 			       peer_stats->tx.punc_bw[PUNCTURED_40MHZ],
6589 			       peer_stats->tx.punc_bw[PUNCTURED_80MHZ],
6590 			       peer_stats->tx.punc_bw[PUNCTURED_120MHZ]);
6591 		DP_PRINT_STATS("RU Locations");
6592 		for (i = 0; i < RU_INDEX_MAX; i++)
6593 			DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
6594 				       cdp_ru_string[i].ru_type,
6595 				       peer_stats->tx.ru_loc[i].num_msdu,
6596 				       peer_stats->tx.ru_loc[i].num_mpdu,
6597 				       peer_stats->tx.ru_loc[i].mpdu_tried);
6598 		dp_print_common_ppdu_rates_info(&peer_stats->tx.su_be_ppdu_cnt,
6599 						DOT11_BE);
6600 		dp_print_mu_be_ppdu_rates_info(&peer_stats->tx.mu_be_ppdu_cnt[0]);
6601 
6602 	} else {
6603 		DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d 320MHZ %d",
6604 			       peer_stats->rx.bw[CMN_BW_20MHZ],
6605 			       peer_stats->rx.bw[CMN_BW_40MHZ],
6606 			       peer_stats->rx.bw[CMN_BW_80MHZ],
6607 			       peer_stats->rx.bw[CMN_BW_160MHZ],
6608 			       peer_stats->rx.bw[CMN_BW_320MHZ]);
6609 		DP_PRINT_STATS("Punctured BW Counts = NO_PUNC %d 20MHz %d 40MHz %d 80MHz %d 120MHz %d\n",
6610 			       peer_stats->rx.punc_bw[NO_PUNCTURE],
6611 			       peer_stats->rx.punc_bw[PUNCTURED_20MHZ],
6612 			       peer_stats->rx.punc_bw[PUNCTURED_40MHZ],
6613 			       peer_stats->rx.punc_bw[PUNCTURED_80MHZ],
6614 			       peer_stats->rx.punc_bw[PUNCTURED_120MHZ]);
6615 		dp_print_common_ppdu_rates_info(&peer_stats->rx.su_be_ppdu_cnt,
6616 						DOT11_BE);
6617 		dp_print_mu_be_ppdu_rates_info(&peer_stats->rx.mu_be_ppdu_cnt[0]);
6618 	}
6619 }
6620 #else
6621 void dp_print_peer_txrx_stats_be(struct cdp_peer_stats *peer_stats,
6622 				 enum peer_stats_type stats_type)
6623 {
6624 }
6625 #endif
6626 
6627 void dp_print_peer_txrx_stats_li(struct cdp_peer_stats *peer_stats,
6628 				 enum peer_stats_type stats_type)
6629 {
6630 	if (stats_type == PEER_TX_STATS) {
6631 		DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d\n",
6632 			       peer_stats->tx.bw[CMN_BW_20MHZ],
6633 			       peer_stats->tx.bw[CMN_BW_40MHZ],
6634 			       peer_stats->tx.bw[CMN_BW_80MHZ],
6635 			       peer_stats->tx.bw[CMN_BW_160MHZ]);
6636 		DP_PRINT_STATS("RU Locations");
6637 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
6638 			       cdp_ru_string[RU_26_INDEX].ru_type,
6639 			       peer_stats->tx.ru_loc[RU_26_INDEX].num_msdu,
6640 			       peer_stats->tx.ru_loc[RU_26_INDEX].num_mpdu,
6641 			       peer_stats->tx.ru_loc[RU_26_INDEX].mpdu_tried);
6642 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
6643 			       cdp_ru_string[RU_52_INDEX].ru_type,
6644 			       peer_stats->tx.ru_loc[RU_52_INDEX].num_msdu,
6645 			       peer_stats->tx.ru_loc[RU_52_INDEX].num_mpdu,
6646 			       peer_stats->tx.ru_loc[RU_52_INDEX].mpdu_tried);
6647 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
6648 			       cdp_ru_string[RU_106_INDEX].ru_type,
6649 			       peer_stats->tx.ru_loc[RU_106_INDEX].num_msdu,
6650 			       peer_stats->tx.ru_loc[RU_106_INDEX].num_mpdu,
6651 			       peer_stats->tx.ru_loc[RU_106_INDEX].mpdu_tried);
6652 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
6653 			       cdp_ru_string[RU_242_INDEX].ru_type,
6654 			       peer_stats->tx.ru_loc[RU_242_INDEX].num_msdu,
6655 			       peer_stats->tx.ru_loc[RU_242_INDEX].num_mpdu,
6656 			       peer_stats->tx.ru_loc[RU_242_INDEX].mpdu_tried);
6657 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
6658 			       cdp_ru_string[RU_484_INDEX].ru_type,
6659 			       peer_stats->tx.ru_loc[RU_484_INDEX].num_msdu,
6660 			       peer_stats->tx.ru_loc[RU_484_INDEX].num_mpdu,
6661 			       peer_stats->tx.ru_loc[RU_484_INDEX].mpdu_tried);
6662 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
6663 			       cdp_ru_string[RU_996_INDEX].ru_type,
6664 			       peer_stats->tx.ru_loc[RU_996_INDEX].num_msdu,
6665 			       peer_stats->tx.ru_loc[RU_996_INDEX].num_mpdu,
6666 			       peer_stats->tx.ru_loc[RU_996_INDEX].mpdu_tried);
6667 	} else {
6668 		DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d",
6669 			       peer_stats->rx.bw[CMN_BW_20MHZ],
6670 			       peer_stats->rx.bw[CMN_BW_40MHZ],
6671 			       peer_stats->rx.bw[CMN_BW_80MHZ],
6672 			       peer_stats->rx.bw[CMN_BW_160MHZ]);
6673 	}
6674 }
6675 
6676 #ifdef REO_SHARED_QREF_TABLE_EN
6677 static void dp_peer_print_reo_qref_table(struct dp_peer *peer)
6678 {
6679 	struct hal_soc *hal;
6680 	struct dp_peer *mld_peer;
6681 	int i;
6682 	uint64_t *reo_qref_addr;
6683 	uint32_t peer_idx;
6684 
6685 	hal = (struct hal_soc *)peer->vdev->pdev->soc->hal_soc;
6686 
6687 	if (!hal_reo_shared_qaddr_is_enable((hal_soc_handle_t)hal))
6688 		return;
6689 
6690 	peer_idx = (peer->peer_id * DP_MAX_TIDS);
6691 
6692 	if ((!hal->reo_qref.non_mlo_reo_qref_table_vaddr) ||
6693 	    (!hal->reo_qref.mlo_reo_qref_table_vaddr)) {
6694 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
6695 			  FL("REO shared table not allocated"));
6696 		return;
6697 	}
6698 
6699 	reo_qref_addr = &hal->reo_qref.non_mlo_reo_qref_table_vaddr[peer_idx];
6700 	mld_peer = DP_GET_MLD_PEER_FROM_PEER(peer);
6701 	if (mld_peer) {
6702 		peer = mld_peer;
6703 		hal = (struct hal_soc *)
6704 			  peer->vdev->pdev->soc->hal_soc;
6705 		peer_idx = (mld_peer->peer_id - HAL_ML_PEER_ID_START) *
6706 			    DP_MAX_TIDS;
6707 		reo_qref_addr = &hal->reo_qref.mlo_reo_qref_table_vaddr[peer_idx];
6708 	}
6709 	DP_PRINT_STATS("Reo Qref table for peer_id: %d\n", peer->peer_id);
6710 
6711 	for (i = 0; i < DP_MAX_TIDS; i++)
6712 		DP_PRINT_STATS("    Tid [%d]  :%llx", i, reo_qref_addr[i]);
6713 }
6714 #else
6715 static inline void dp_peer_print_reo_qref_table(struct dp_peer *peer)
6716 {
6717 }
6718 #endif
6719 
6720 void dp_print_peer_stats(struct dp_peer *peer,
6721 			 struct cdp_peer_stats *peer_stats)
6722 {
6723 	uint8_t i;
6724 	uint32_t index;
6725 	uint32_t j;
6726 	char nss[DP_NSS_LENGTH];
6727 	char mu_group_id[DP_MU_GROUP_LENGTH];
6728 	struct dp_pdev *pdev;
6729 	uint32_t *pnss;
6730 	enum cdp_mu_packet_type rx_mu_type;
6731 	struct cdp_rx_mu *rx_mu;
6732 
6733 	pdev = peer->vdev->pdev;
6734 
6735 	DP_PRINT_STATS("Node Tx Stats:\n");
6736 	DP_PRINT_STATS("Total Packet Completions = %d",
6737 		       peer_stats->tx.comp_pkt.num);
6738 	DP_PRINT_STATS("Total Bytes Completions = %llu",
6739 		       peer_stats->tx.comp_pkt.bytes);
6740 	DP_PRINT_STATS("Success Packets = %d",
6741 		       peer_stats->tx.tx_success.num);
6742 	DP_PRINT_STATS("Success Bytes = %llu",
6743 		       peer_stats->tx.tx_success.bytes);
6744 	DP_PRINT_STATS("Success Packets in TWT Session = %d",
6745 		       peer_stats->tx.tx_success_twt.num);
6746 	DP_PRINT_STATS("Success Bytes in TWT Session = %llu",
6747 		       peer_stats->tx.tx_success_twt.bytes);
6748 	DP_PRINT_STATS("Unicast Success Packets = %d",
6749 		       peer_stats->tx.ucast.num);
6750 	DP_PRINT_STATS("Unicast Success Bytes = %llu",
6751 		       peer_stats->tx.ucast.bytes);
6752 	DP_PRINT_STATS("Multicast Success Packets = %d",
6753 		       peer_stats->tx.mcast.num);
6754 	DP_PRINT_STATS("Multicast Success Bytes = %llu",
6755 		       peer_stats->tx.mcast.bytes);
6756 	DP_PRINT_STATS("Broadcast Success Packets = %d",
6757 		       peer_stats->tx.bcast.num);
6758 	DP_PRINT_STATS("Broadcast Success Bytes = %llu",
6759 		       peer_stats->tx.bcast.bytes);
6760 	DP_PRINT_STATS("Packets Successfully Sent after one or more retry = %d",
6761 		       peer_stats->tx.retry_count);
6762 	DP_PRINT_STATS("Packets Successfully Sent after more than one retry = %d",
6763 		       peer_stats->tx.multiple_retry_count);
6764 	DP_PRINT_STATS("Packets Failed = %d",
6765 		       peer_stats->tx.tx_failed);
6766 	DP_PRINT_STATS("Packets Failed due to retry threshold breach = %d",
6767 		       peer_stats->tx.failed_retry_count);
6768 	DP_PRINT_STATS("Packets In OFDMA = %d",
6769 		       peer_stats->tx.ofdma);
6770 	DP_PRINT_STATS("Packets In STBC = %d",
6771 		       peer_stats->tx.stbc);
6772 	DP_PRINT_STATS("Packets In LDPC = %d",
6773 		       peer_stats->tx.ldpc);
6774 	DP_PRINT_STATS("Packet Retries = %d",
6775 		       peer_stats->tx.retries);
6776 	DP_PRINT_STATS("MSDU's Part of AMSDU = %d",
6777 		       peer_stats->tx.amsdu_cnt);
6778 	DP_PRINT_STATS("Msdu's As Part of Ampdu = %d",
6779 		       peer_stats->tx.non_ampdu_cnt);
6780 	DP_PRINT_STATS("Msdu's As Ampdu = %d",
6781 		       peer_stats->tx.ampdu_cnt);
6782 	DP_PRINT_STATS("Last Packet RSSI = %d",
6783 		       peer_stats->tx.last_ack_rssi);
6784 	DP_PRINT_STATS("Dropped At FW: Removed Pkts = %u",
6785 		       peer_stats->tx.dropped.fw_rem.num);
6786 	DP_PRINT_STATS("Release source not TQM = %u",
6787 		       peer_stats->tx.release_src_not_tqm);
6788 	if (pdev && !wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) {
6789 		DP_PRINT_STATS("Dropped At FW: Removed bytes = %llu",
6790 			peer_stats->tx.dropped.fw_rem.bytes);
6791 	}
6792 	DP_PRINT_STATS("Dropped At FW: Removed transmitted = %d",
6793 		       peer_stats->tx.dropped.fw_rem_tx);
6794 	DP_PRINT_STATS("Dropped At FW: Removed Untransmitted = %d",
6795 		       peer_stats->tx.dropped.fw_rem_notx);
6796 	DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason1 = %u",
6797 		       peer_stats->tx.dropped.fw_reason1);
6798 	DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason2 = %u",
6799 		       peer_stats->tx.dropped.fw_reason2);
6800 	DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason3 = %u",
6801 		       peer_stats->tx.dropped.fw_reason3);
6802 	DP_PRINT_STATS("Dropped At FW:removed untransmitted disable queue = %u",
6803 		       peer_stats->tx.dropped.fw_rem_queue_disable);
6804 	DP_PRINT_STATS("Dropped At FW: removed untransmitted no match = %u",
6805 		       peer_stats->tx.dropped.fw_rem_no_match);
6806 	DP_PRINT_STATS("Dropped due to HW threshold criteria = %u",
6807 		       peer_stats->tx.dropped.drop_threshold);
6808 	DP_PRINT_STATS("Dropped due Link desc not available drop in HW = %u",
6809 		       peer_stats->tx.dropped.drop_link_desc_na);
6810 	DP_PRINT_STATS("Drop bit set or invalid flow = %u",
6811 		       peer_stats->tx.dropped.invalid_drop);
6812 	DP_PRINT_STATS("MCAST vdev drop in HW = %u",
6813 		       peer_stats->tx.dropped.mcast_vdev_drop);
6814 	DP_PRINT_STATS("Dropped : Age Out = %d",
6815 		       peer_stats->tx.dropped.age_out);
6816 	DP_PRINT_STATS("Dropped : Invalid Reason = %u",
6817 		       peer_stats->tx.dropped.invalid_rr);
6818 	DP_PRINT_STATS("NAWDS : ");
6819 	DP_PRINT_STATS("Nawds multicast Drop Tx Packet = %d",
6820 		       peer_stats->tx.nawds_mcast_drop);
6821 	DP_PRINT_STATS("	Nawds multicast  Tx Packet Count = %d",
6822 		       peer_stats->tx.nawds_mcast.num);
6823 	DP_PRINT_STATS("	Nawds multicast  Tx Packet Bytes = %llu",
6824 		       peer_stats->tx.nawds_mcast.bytes);
6825 
6826 	DP_PRINT_STATS("PPDU's = %d", peer_stats->tx.tx_ppdus);
6827 	DP_PRINT_STATS("Number of PPDU's with Punctured Preamble = %d",
6828 		       peer_stats->tx.pream_punct_cnt);
6829 	DP_PRINT_STATS("MPDU's Successful = %d",
6830 		       peer_stats->tx.tx_mpdus_success);
6831 	DP_PRINT_STATS("MPDU's Tried = %d", peer_stats->tx.tx_mpdus_tried);
6832 
6833 	DP_PRINT_STATS("Rate Info:");
6834 	dp_print_common_rates_info(peer_stats->tx.pkt_type);
6835 
6836 	DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
6837 		       peer_stats->tx.sgi_count[0],
6838 		       peer_stats->tx.sgi_count[1],
6839 		       peer_stats->tx.sgi_count[2],
6840 		       peer_stats->tx.sgi_count[3]);
6841 
6842 	DP_PRINT_STATS("Wireless Mutlimedia ");
6843 	DP_PRINT_STATS("	 Best effort = %d",
6844 		       peer_stats->tx.wme_ac_type[0]);
6845 	DP_PRINT_STATS("	 Background= %d",
6846 		       peer_stats->tx.wme_ac_type[1]);
6847 	DP_PRINT_STATS("	 Video = %d",
6848 		       peer_stats->tx.wme_ac_type[2]);
6849 	DP_PRINT_STATS("	 Voice = %d",
6850 		       peer_stats->tx.wme_ac_type[3]);
6851 
6852 	DP_PRINT_STATS("Excess Retries per AC ");
6853 	DP_PRINT_STATS("	 Best effort = %d",
6854 		       peer_stats->tx.excess_retries_per_ac[0]);
6855 	DP_PRINT_STATS("	 Background= %d",
6856 		       peer_stats->tx.excess_retries_per_ac[1]);
6857 	DP_PRINT_STATS("	 Video = %d",
6858 		       peer_stats->tx.excess_retries_per_ac[2]);
6859 	DP_PRINT_STATS("	 Voice = %d",
6860 		       peer_stats->tx.excess_retries_per_ac[3]);
6861 
6862 	pnss = &peer_stats->tx.nss[0];
6863 	dp_print_nss(nss, pnss, SS_COUNT);
6864 
6865 	DP_PRINT_STATS("NSS(1-8) = %s", nss);
6866 
6867 	DP_PRINT_STATS("Transmit Type :");
6868 	DP_PRINT_STATS("MSDUs Success: SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d",
6869 		       peer_stats->tx.transmit_type[SU].num_msdu,
6870 		       peer_stats->tx.transmit_type[MU_MIMO].num_msdu,
6871 		       peer_stats->tx.transmit_type[MU_OFDMA].num_msdu,
6872 		       peer_stats->tx.transmit_type[MU_MIMO_OFDMA].num_msdu);
6873 
6874 	DP_PRINT_STATS("MPDUs Success: SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d",
6875 		       peer_stats->tx.transmit_type[SU].num_mpdu,
6876 		       peer_stats->tx.transmit_type[MU_MIMO].num_mpdu,
6877 		       peer_stats->tx.transmit_type[MU_OFDMA].num_mpdu,
6878 		       peer_stats->tx.transmit_type[MU_MIMO_OFDMA].num_mpdu);
6879 
6880 	DP_PRINT_STATS("MPDUs Tried: SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d",
6881 		       peer_stats->tx.transmit_type[SU].mpdu_tried,
6882 		       peer_stats->tx.transmit_type[MU_MIMO].mpdu_tried,
6883 		       peer_stats->tx.transmit_type[MU_OFDMA].mpdu_tried,
6884 		       peer_stats->tx.transmit_type[MU_MIMO_OFDMA].mpdu_tried);
6885 
6886 	for (i = 0; i < MAX_MU_GROUP_ID;) {
6887 		index = 0;
6888 		for (j = 0; j < DP_MU_GROUP_SHOW && i < MAX_MU_GROUP_ID;
6889 		     j++) {
6890 			index += qdf_snprint(&mu_group_id[index],
6891 					     DP_MU_GROUP_LENGTH - index,
6892 					     " %d",
6893 					     peer_stats->tx.mu_group_id[i]);
6894 			i++;
6895 		}
6896 
6897 		DP_PRINT_STATS("User position list for GID %02d->%d: [%s]",
6898 			       i - DP_MU_GROUP_SHOW, i - 1, mu_group_id);
6899 	}
6900 
6901 	DP_PRINT_STATS("Last Packet RU index [%d], Size [%d]",
6902 		       peer_stats->tx.ru_start, peer_stats->tx.ru_tones);
6903 
6904 	DP_PRINT_STATS("Aggregation:");
6905 	DP_PRINT_STATS("Number of Msdu's Part of Amsdu = %d",
6906 		       peer_stats->tx.amsdu_cnt);
6907 	DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation = %d",
6908 		       peer_stats->tx.non_amsdu_cnt);
6909 
6910 	DP_PRINT_STATS("Bytes and Packets transmitted  in last one sec:");
6911 	DP_PRINT_STATS("	Bytes transmitted in last sec: %d",
6912 		       peer_stats->tx.tx_byte_rate);
6913 	DP_PRINT_STATS("	Data transmitted in last sec: %d",
6914 		       peer_stats->tx.tx_data_rate);
6915 
6916 	if (pdev && pdev->soc->arch_ops.txrx_print_peer_stats)
6917 		pdev->soc->arch_ops.txrx_print_peer_stats(peer_stats,
6918 							  PEER_TX_STATS);
6919 
6920 	if (!IS_MLO_DP_LINK_PEER(peer)) {
6921 		dp_print_jitter_stats(peer, pdev);
6922 		dp_peer_print_tx_delay_stats(pdev, peer);
6923 	}
6924 
6925 	DP_PRINT_STATS("Node Rx Stats:");
6926 	DP_PRINT_STATS("Packets Sent To Stack = %d",
6927 		       peer_stats->rx.to_stack.num);
6928 	DP_PRINT_STATS("Bytes Sent To Stack = %llu",
6929 		       peer_stats->rx.to_stack.bytes);
6930 	for (i = 0; i <  CDP_MAX_RX_RINGS; i++) {
6931 		DP_PRINT_STATS("Ring Id = %d", i);
6932 		DP_PRINT_STATS("	Packets Received = %d",
6933 			       peer_stats->rx.rcvd_reo[i].num);
6934 		DP_PRINT_STATS("	Bytes Received = %llu",
6935 			       peer_stats->rx.rcvd_reo[i].bytes);
6936 	}
6937 	for (i = 0; i < CDP_MAX_LMACS; i++)
6938 		DP_PRINT_STATS("Packets Received on lmac[%d] = %d ( %llu ),",
6939 			       i, peer_stats->rx.rx_lmac[i].num,
6940 			       peer_stats->rx.rx_lmac[i].bytes);
6941 
6942 	DP_PRINT_STATS("Unicast Packets Received = %d",
6943 		       peer_stats->rx.unicast.num);
6944 	DP_PRINT_STATS("Unicast Bytes Received = %llu",
6945 		       peer_stats->rx.unicast.bytes);
6946 	DP_PRINT_STATS("Multicast Packets Received = %d",
6947 		       peer_stats->rx.multicast.num);
6948 	DP_PRINT_STATS("Multicast Bytes Received = %llu",
6949 		       peer_stats->rx.multicast.bytes);
6950 	DP_PRINT_STATS("Broadcast Packets Received = %d",
6951 		       peer_stats->rx.bcast.num);
6952 	DP_PRINT_STATS("Broadcast Bytes Received = %llu",
6953 		       peer_stats->rx.bcast.bytes);
6954 	DP_PRINT_STATS("Packets Sent To Stack in TWT Session = %d",
6955 		       peer_stats->rx.to_stack_twt.num);
6956 	DP_PRINT_STATS("Bytes Sent To Stack in TWT Session = %llu",
6957 		       peer_stats->rx.to_stack_twt.bytes);
6958 	DP_PRINT_STATS("Intra BSS Packets Received = %d",
6959 		       peer_stats->rx.intra_bss.pkts.num);
6960 	DP_PRINT_STATS("Intra BSS Bytes Received = %llu",
6961 		       peer_stats->rx.intra_bss.pkts.bytes);
6962 	DP_PRINT_STATS("Intra BSS Packets Failed = %d",
6963 		       peer_stats->rx.intra_bss.fail.num);
6964 	DP_PRINT_STATS("Intra BSS Bytes Failed = %llu",
6965 		       peer_stats->rx.intra_bss.fail.bytes);
6966 	DP_PRINT_STATS("Intra BSS MDNS Packets Not Forwarded  = %d",
6967 		       peer_stats->rx.intra_bss.mdns_no_fwd);
6968 	DP_PRINT_STATS("Raw Packets Received = %d",
6969 		       peer_stats->rx.raw.num);
6970 	DP_PRINT_STATS("Raw Bytes Received = %llu",
6971 		       peer_stats->rx.raw.bytes);
6972 	DP_PRINT_STATS("Errors: MIC Errors = %d",
6973 		       peer_stats->rx.err.mic_err);
6974 	DP_PRINT_STATS("Errors: Decryption Errors = %d",
6975 		       peer_stats->rx.err.decrypt_err);
6976 	DP_PRINT_STATS("Errors: PN Errors = %d",
6977 		       peer_stats->rx.err.pn_err);
6978 	DP_PRINT_STATS("Errors: OOR Errors = %d",
6979 		       peer_stats->rx.err.oor_err);
6980 	DP_PRINT_STATS("Errors: 2k Jump Errors = %d",
6981 		       peer_stats->rx.err.jump_2k_err);
6982 	DP_PRINT_STATS("Errors: RXDMA Wifi Parse Errors = %d",
6983 		       peer_stats->rx.err.rxdma_wifi_parse_err);
6984 	DP_PRINT_STATS("Msdu's Received As Part of Ampdu = %d",
6985 		       peer_stats->rx.non_ampdu_cnt);
6986 	DP_PRINT_STATS("Msdu's Received As Ampdu = %d",
6987 		       peer_stats->rx.ampdu_cnt);
6988 	DP_PRINT_STATS("Msdu's Received Not Part of Amsdu's = %d",
6989 		       peer_stats->rx.non_amsdu_cnt);
6990 	DP_PRINT_STATS("MSDUs Received As Part of Amsdu = %d",
6991 		       peer_stats->rx.amsdu_cnt);
6992 	DP_PRINT_STATS("MSDU Rx Retries= %d", peer_stats->rx.rx_retries);
6993 	DP_PRINT_STATS("MPDU Rx Retries= %d", peer_stats->rx.mpdu_retry_cnt);
6994 	DP_PRINT_STATS("NAWDS : ");
6995 	DP_PRINT_STATS("	Nawds multicast Drop Rx Packet = %d",
6996 		       peer_stats->rx.nawds_mcast_drop);
6997 	DP_PRINT_STATS(" 3address multicast Drop Rx Packet = %d",
6998 		       peer_stats->rx.mcast_3addr_drop);
6999 	DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
7000 		       peer_stats->rx.sgi_count[0],
7001 		       peer_stats->rx.sgi_count[1],
7002 		       peer_stats->rx.sgi_count[2],
7003 		       peer_stats->rx.sgi_count[3]);
7004 
7005 	DP_PRINT_STATS("Wireless Mutlimedia ");
7006 	DP_PRINT_STATS("	 Best effort = %d",
7007 		       peer_stats->rx.wme_ac_type[0]);
7008 	DP_PRINT_STATS("	 Background= %d",
7009 		       peer_stats->rx.wme_ac_type[1]);
7010 	DP_PRINT_STATS("	 Video = %d",
7011 		       peer_stats->rx.wme_ac_type[2]);
7012 	DP_PRINT_STATS("	 Voice = %d",
7013 		       peer_stats->rx.wme_ac_type[3]);
7014 
7015 	DP_PRINT_STATS(" Total Rx PPDU Count = %d", peer_stats->rx.rx_ppdus);
7016 	DP_PRINT_STATS(" Total Rx MPDU Count = %d", peer_stats->rx.rx_mpdus);
7017 	DP_PRINT_STATS("MSDU Reception Type");
7018 	DP_PRINT_STATS("SU %d MU_MIMO %d MU_OFDMA %d MU_OFDMA_MIMO %d",
7019 		       peer_stats->rx.reception_type[0],
7020 		       peer_stats->rx.reception_type[1],
7021 		       peer_stats->rx.reception_type[2],
7022 		       peer_stats->rx.reception_type[3]);
7023 	DP_PRINT_STATS("PPDU Reception Type");
7024 	DP_PRINT_STATS("SU %d MU_MIMO %d MU_OFDMA %d MU_OFDMA_MIMO %d",
7025 		       peer_stats->rx.ppdu_cnt[0],
7026 		       peer_stats->rx.ppdu_cnt[1],
7027 		       peer_stats->rx.ppdu_cnt[2],
7028 		       peer_stats->rx.ppdu_cnt[3]);
7029 
7030 	dp_print_common_rates_info(peer_stats->rx.pkt_type);
7031 	dp_print_common_ppdu_rates_info(&peer_stats->rx.su_ax_ppdu_cnt,
7032 					DOT11_AX);
7033 	dp_print_mu_ppdu_rates_info(&peer_stats->rx.rx_mu[0]);
7034 
7035 	pnss = &peer_stats->rx.nss[0];
7036 	dp_print_nss(nss, pnss, SS_COUNT);
7037 	DP_PRINT_STATS("MSDU Count");
7038 	DP_PRINT_STATS("	NSS(1-8) = %s", nss);
7039 
7040 	DP_PRINT_STATS("reception mode SU");
7041 	pnss = &peer_stats->rx.ppdu_nss[0];
7042 	dp_print_nss(nss, pnss, SS_COUNT);
7043 
7044 	DP_PRINT_STATS("	PPDU Count");
7045 	DP_PRINT_STATS("	NSS(1-8) = %s", nss);
7046 
7047 	DP_PRINT_STATS("	MPDU OK = %d, MPDU Fail = %d",
7048 		       peer_stats->rx.mpdu_cnt_fcs_ok,
7049 		       peer_stats->rx.mpdu_cnt_fcs_err);
7050 
7051 	for (rx_mu_type = 0; rx_mu_type < TXRX_TYPE_MU_MAX; rx_mu_type++) {
7052 		DP_PRINT_STATS("reception mode %s",
7053 			       mu_reception_mode[rx_mu_type]);
7054 		rx_mu = &peer_stats->rx.rx_mu[rx_mu_type];
7055 
7056 		pnss = &rx_mu->ppdu_nss[0];
7057 		dp_print_nss(nss, pnss, SS_COUNT);
7058 		DP_PRINT_STATS("	PPDU Count");
7059 		DP_PRINT_STATS("	NSS(1-8) = %s", nss);
7060 
7061 		DP_PRINT_STATS("	MPDU OK = %d, MPDU Fail = %d",
7062 			       rx_mu->mpdu_cnt_fcs_ok,
7063 			       rx_mu->mpdu_cnt_fcs_err);
7064 	}
7065 
7066 	DP_PRINT_STATS("Aggregation:");
7067 	DP_PRINT_STATS("	Msdu's Part of Ampdu = %d",
7068 		       peer_stats->rx.ampdu_cnt);
7069 	DP_PRINT_STATS("	Msdu's With No Mpdu Level Aggregation = %d",
7070 		       peer_stats->rx.non_ampdu_cnt);
7071 	DP_PRINT_STATS("	Msdu's Part of Amsdu = %d",
7072 		       peer_stats->rx.amsdu_cnt);
7073 	DP_PRINT_STATS("	Msdu's With No Msdu Level Aggregation = %d",
7074 		       peer_stats->rx.non_amsdu_cnt);
7075 
7076 	DP_PRINT_STATS("Bytes and Packets received in last one sec:");
7077 	DP_PRINT_STATS("	Bytes received in last sec: %d",
7078 		       peer_stats->rx.rx_byte_rate);
7079 	DP_PRINT_STATS("	Data received in last sec: %d",
7080 		       peer_stats->rx.rx_data_rate);
7081 	DP_PRINT_STATS("MEC Packet Drop = %d",
7082 		       peer_stats->rx.mec_drop.num);
7083 	DP_PRINT_STATS("MEC Byte Drop = %llu",
7084 		       peer_stats->rx.mec_drop.bytes);
7085 	DP_PRINT_STATS("Multipass Rx Packet Drop = %d",
7086 		       peer_stats->rx.multipass_rx_pkt_drop);
7087 	DP_PRINT_STATS("Peer Unauth Rx Packet Drop = %d",
7088 		       peer_stats->rx.peer_unauth_rx_pkt_drop);
7089 	DP_PRINT_STATS("Policy Check Rx Packet Drop = %d",
7090 		       peer_stats->rx.policy_check_drop);
7091 	if (pdev && pdev->soc->arch_ops.txrx_print_peer_stats)
7092 		pdev->soc->arch_ops.txrx_print_peer_stats(peer_stats,
7093 							  PEER_RX_STATS);
7094 
7095 	if (!IS_MLO_DP_LINK_PEER(peer))
7096 		dp_peer_print_rx_delay_stats(pdev, peer);
7097 
7098 	dp_peer_print_reo_qref_table(peer);
7099 }
7100 
7101 void dp_print_per_ring_stats(struct dp_soc *soc)
7102 {
7103 	uint8_t ring;
7104 	uint16_t core;
7105 	uint64_t total_packets;
7106 
7107 	DP_PRINT_STATS("Reo packets per ring:");
7108 	for (ring = 0; ring < MAX_REO_DEST_RINGS; ring++) {
7109 		total_packets = 0;
7110 		DP_PRINT_STATS("Packets on ring %u:", ring);
7111 		for (core = 0; core < num_possible_cpus(); core++) {
7112 			if (!soc->stats.rx.ring_packets[core][ring])
7113 				continue;
7114 			DP_PRINT_STATS("Packets arriving on core %u: %llu",
7115 				       core,
7116 				       soc->stats.rx.ring_packets[core][ring]);
7117 			total_packets += soc->stats.rx.ring_packets[core][ring];
7118 		}
7119 		DP_PRINT_STATS("Total packets on ring %u: %llu",
7120 			       ring, total_packets);
7121 	}
7122 }
7123 
7124 void dp_txrx_path_stats(struct dp_soc *soc)
7125 {
7126 	uint8_t error_code;
7127 	uint8_t loop_pdev;
7128 	struct dp_pdev *pdev;
7129 	uint8_t i;
7130 
7131 	if (!soc) {
7132 		dp_err("%s: Invalid access",  __func__);
7133 		return;
7134 	}
7135 
7136 	for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) {
7137 		pdev = soc->pdev_list[loop_pdev];
7138 		dp_aggregate_pdev_stats(pdev);
7139 		DP_PRINT_STATS("Tx path Statistics:");
7140 		DP_PRINT_STATS("from stack: %u msdus (%llu bytes)",
7141 			       pdev->stats.tx_i.rcvd.num,
7142 			       pdev->stats.tx_i.rcvd.bytes);
7143 		DP_PRINT_STATS("processed from host: %u msdus (%llu bytes)",
7144 			       pdev->stats.tx_i.processed.num,
7145 			       pdev->stats.tx_i.processed.bytes);
7146 		DP_PRINT_STATS("successfully transmitted: %u msdus (%llu bytes)",
7147 			       pdev->stats.tx.tx_success.num,
7148 			       pdev->stats.tx.tx_success.bytes);
7149 		for (i = 0; i < soc->num_tcl_data_rings; i++) {
7150 			DP_PRINT_STATS("Enqueue to SW2TCL%u: %u", i + 1,
7151 				       soc->stats.tx.tcl_enq[i]);
7152 			DP_PRINT_STATS("TX completions reaped from ring %u: %u",
7153 				       i, soc->stats.tx.tx_comp[i]);
7154 		}
7155 
7156 		DP_PRINT_STATS("Invalid release source: %u",
7157 			       soc->stats.tx.invalid_release_source);
7158 		DP_PRINT_STATS("Dropped in host:");
7159 		DP_PRINT_STATS("Total packets dropped: %u,",
7160 			       pdev->stats.tx_i.dropped.dropped_pkt.num);
7161 		DP_PRINT_STATS("Descriptor not available: %u",
7162 			       pdev->stats.tx_i.dropped.desc_na.num);
7163 		DP_PRINT_STATS("Ring full: %u",
7164 			       pdev->stats.tx_i.dropped.ring_full);
7165 		DP_PRINT_STATS("Enqueue fail: %u",
7166 			       pdev->stats.tx_i.dropped.enqueue_fail);
7167 		DP_PRINT_STATS("Pkt dropped in vdev-id check: %u",
7168 			       pdev->stats.tx_i.dropped.fail_per_pkt_vdev_id_check);
7169 		DP_PRINT_STATS("DMA Error: %u",
7170 			       pdev->stats.tx_i.dropped.dma_error);
7171 		DP_PRINT_STATS("Drop Ingress: %u",
7172 			       pdev->stats.tx_i.dropped.drop_ingress);
7173 
7174 		DP_PRINT_STATS("Dropped in hardware:");
7175 		DP_PRINT_STATS("total packets dropped: %u",
7176 			       pdev->stats.tx.tx_failed);
7177 		DP_PRINT_STATS("mpdu age out: %u",
7178 			       pdev->stats.tx.dropped.age_out);
7179 		DP_PRINT_STATS("firmware removed packets: %u (%llu bytes)",
7180 			       pdev->stats.tx.dropped.fw_rem.num,
7181 			       pdev->stats.tx.dropped.fw_rem.bytes);
7182 		DP_PRINT_STATS("firmware removed tx: %u",
7183 			       pdev->stats.tx.dropped.fw_rem_tx);
7184 		DP_PRINT_STATS("firmware removed notx %u",
7185 			       pdev->stats.tx.dropped.fw_rem_notx);
7186 		DP_PRINT_STATS("Invalid peer on tx path: %u",
7187 			       pdev->soc->stats.tx.tx_invalid_peer.num);
7188 		DP_PRINT_STATS("Tx desc freed in non-completion path: %u",
7189 			       pdev->soc->stats.tx.tx_comp_exception);
7190 		DP_PRINT_STATS("Tx desc force freed: %u",
7191 			       pdev->soc->stats.tx.tx_comp_force_freed);
7192 
7193 		DP_PRINT_STATS("Tx packets sent per interrupt:");
7194 		DP_PRINT_STATS("Single Packet: %u",
7195 			       pdev->stats.tx_comp_histogram.pkts_1);
7196 		DP_PRINT_STATS("2-20 Packets:  %u",
7197 			       pdev->stats.tx_comp_histogram.pkts_2_20);
7198 		DP_PRINT_STATS("21-40 Packets: %u",
7199 			       pdev->stats.tx_comp_histogram.pkts_21_40);
7200 		DP_PRINT_STATS("41-60 Packets: %u",
7201 			       pdev->stats.tx_comp_histogram.pkts_41_60);
7202 		DP_PRINT_STATS("61-80 Packets: %u",
7203 			       pdev->stats.tx_comp_histogram.pkts_61_80);
7204 		DP_PRINT_STATS("81-100 Packets: %u",
7205 			       pdev->stats.tx_comp_histogram.pkts_81_100);
7206 		DP_PRINT_STATS("101-200 Packets: %u",
7207 			       pdev->stats.tx_comp_histogram.pkts_101_200);
7208 		DP_PRINT_STATS("    201+ Packets: %u",
7209 			       pdev->stats.tx_comp_histogram.pkts_201_plus);
7210 
7211 		DP_PRINT_STATS("Rx path statistics");
7212 
7213 		DP_PRINT_STATS("delivered %u msdus ( %llu bytes),",
7214 			       pdev->stats.rx.to_stack.num,
7215 			       pdev->stats.rx.to_stack.bytes);
7216 		for (i = 0; i < CDP_MAX_RX_RINGS; i++) {
7217 			if (!pdev->stats.rx.rcvd_reo[i].num)
7218 				continue;
7219 			DP_PRINT_STATS(
7220 				       "received on reo[%d] %u msdus( %llu bytes),",
7221 				       i, pdev->stats.rx.rcvd_reo[i].num,
7222 				       pdev->stats.rx.rcvd_reo[i].bytes);
7223 		}
7224 		for (i = 0; i < CDP_MAX_LMACS; i++)
7225 			DP_PRINT_STATS("received on lmac[%d] %u msdus (%llu bytes),",
7226 				       i, pdev->stats.rx.rx_lmac[i].num,
7227 				       pdev->stats.rx.rx_lmac[i].bytes);
7228 		DP_PRINT_STATS("intra-bss packets %u msdus ( %llu bytes),",
7229 			       pdev->stats.rx.intra_bss.pkts.num,
7230 			       pdev->stats.rx.intra_bss.pkts.bytes);
7231 		DP_PRINT_STATS("intra-bss fails %u msdus ( %llu bytes),",
7232 			       pdev->stats.rx.intra_bss.fail.num,
7233 			       pdev->stats.rx.intra_bss.fail.bytes);
7234 		DP_PRINT_STATS("intra-bss no mdns fwds %u msdus",
7235 			       pdev->stats.rx.intra_bss.mdns_no_fwd);
7236 		DP_PRINT_STATS("intra-bss EAPOL drops: %u",
7237 			       soc->stats.rx.err.intrabss_eapol_drop);
7238 
7239 		DP_PRINT_STATS("raw packets %u msdus ( %llu bytes),",
7240 			       pdev->stats.rx.raw.num,
7241 			       pdev->stats.rx.raw.bytes);
7242 		DP_PRINT_STATS("mic errors %u",
7243 			       pdev->stats.rx.err.mic_err);
7244 		DP_PRINT_STATS("Invalid peer on rx path: %u",
7245 			       pdev->soc->stats.rx.err.rx_invalid_peer.num);
7246 		DP_PRINT_STATS("sw_peer_id invalid %u",
7247 			       pdev->soc->stats.rx.err.rx_invalid_peer_id.num);
7248 		DP_PRINT_STATS("packet_len invalid %u",
7249 			       pdev->soc->stats.rx.err.rx_invalid_pkt_len.num);
7250 		DP_PRINT_STATS("sa or da idx invalid %u",
7251 			       pdev->soc->stats.rx.err.invalid_sa_da_idx);
7252 		DP_PRINT_STATS("defrag peer uninit %u",
7253 			       pdev->soc->stats.rx.err.defrag_peer_uninit);
7254 		DP_PRINT_STATS("pkts delivered no peer %u",
7255 			       pdev->soc->stats.rx.err.pkt_delivered_no_peer);
7256 		DP_PRINT_STATS("RX invalid cookie: %d",
7257 			       soc->stats.rx.err.invalid_cookie);
7258 		DP_PRINT_STATS("RX stale cookie: %d",
7259 			       soc->stats.rx.err.stale_cookie);
7260 		DP_PRINT_STATS("2k jump delba sent: %u",
7261 			       pdev->soc->stats.rx.err.rx_2k_jump_delba_sent);
7262 		DP_PRINT_STATS("2k jump msdu to stack: %u",
7263 			       pdev->soc->stats.rx.err.rx_2k_jump_to_stack);
7264 		DP_PRINT_STATS("2k jump msdu drop: %u",
7265 			       pdev->soc->stats.rx.err.rx_2k_jump_drop);
7266 		DP_PRINT_STATS("REO err oor msdu to stack %u",
7267 			       pdev->soc->stats.rx.err.reo_err_oor_to_stack);
7268 		DP_PRINT_STATS("REO err oor msdu drop: %u",
7269 			       pdev->soc->stats.rx.err.reo_err_oor_drop);
7270 		DP_PRINT_STATS("REO err raw mpdu drop: %u",
7271 			       pdev->soc->stats.rx.err.reo_err_raw_mpdu_drop);
7272 		DP_PRINT_STATS("Rx err msdu rejected: %d",
7273 			       soc->stats.rx.err.rejected);
7274 		DP_PRINT_STATS("Rx raw frame dropped: %d",
7275 			       soc->stats.rx.err.raw_frm_drop);
7276 		DP_PRINT_STATS("Rx stale link desc cookie: %d",
7277 			       pdev->soc->stats.rx.err.invalid_link_cookie);
7278 		DP_PRINT_STATS("Rx nbuf sanity fails: %d",
7279 			       pdev->soc->stats.rx.err.nbuf_sanity_fail);
7280 		DP_PRINT_STATS("Rx refill duplicate link desc: %d",
7281 			       pdev->soc->stats.rx.err.dup_refill_link_desc);
7282 		DP_PRINT_STATS("Rx ipa smmu map duplicate: %d",
7283 			       pdev->soc->stats.rx.err.ipa_smmu_map_dup);
7284 		DP_PRINT_STATS("Rx ipa smmu unmap duplicate: %d",
7285 			       pdev->soc->stats.rx.err.ipa_smmu_unmap_dup);
7286 		DP_PRINT_STATS("Rx ipa smmu unmap no pipes: %d",
7287 			       pdev->soc->stats.rx.err.ipa_unmap_no_pipe);
7288 		DP_PRINT_STATS("PN-in-Dest error frame pn-check fail: %d",
7289 			       soc->stats.rx.err.pn_in_dest_check_fail);
7290 
7291 		DP_PRINT_STATS("Reo Statistics");
7292 		DP_PRINT_STATS("near_full: %u ", soc->stats.rx.near_full);
7293 		DP_PRINT_STATS("rbm error: %u msdus",
7294 			       pdev->soc->stats.rx.err.invalid_rbm);
7295 		DP_PRINT_STATS("hal ring access fail: %u msdus",
7296 			       pdev->soc->stats.rx.err.hal_ring_access_fail);
7297 
7298 		DP_PRINT_STATS("hal ring access full fail: %u msdus",
7299 			       pdev->soc->stats.rx.err.hal_ring_access_full_fail);
7300 
7301 		DP_PRINT_STATS("Rx BAR frames:%d", soc->stats.rx.bar_frame);
7302 
7303 		for (error_code = 0; error_code < HAL_REO_ERR_MAX;
7304 				error_code++) {
7305 			if (!pdev->soc->stats.rx.err.reo_error[error_code])
7306 				continue;
7307 			DP_PRINT_STATS("Reo error number (%u): %u msdus",
7308 				       error_code,
7309 				       pdev->soc->stats.rx.err
7310 				       .reo_error[error_code]);
7311 		}
7312 
7313 		for (error_code = 0; error_code < HAL_RXDMA_ERR_MAX;
7314 				error_code++) {
7315 			if (!pdev->soc->stats.rx.err.rxdma_error[error_code])
7316 				continue;
7317 			DP_PRINT_STATS("Rxdma error number (%u): %u msdus",
7318 				       error_code,
7319 				       pdev->soc->stats.rx.err
7320 				       .rxdma_error[error_code]);
7321 		}
7322 
7323 		DP_PRINT_STATS("Rx packets reaped per interrupt:");
7324 		DP_PRINT_STATS("Single Packet: %u",
7325 			       pdev->stats.rx_ind_histogram.pkts_1);
7326 		DP_PRINT_STATS("2-20 Packets:  %u",
7327 			       pdev->stats.rx_ind_histogram.pkts_2_20);
7328 		DP_PRINT_STATS("21-40 Packets: %u",
7329 			       pdev->stats.rx_ind_histogram.pkts_21_40);
7330 		DP_PRINT_STATS("41-60 Packets: %u",
7331 			       pdev->stats.rx_ind_histogram.pkts_41_60);
7332 		DP_PRINT_STATS("61-80 Packets: %u",
7333 			       pdev->stats.rx_ind_histogram.pkts_61_80);
7334 		DP_PRINT_STATS("81-100 Packets: %u",
7335 			       pdev->stats.rx_ind_histogram.pkts_81_100);
7336 		DP_PRINT_STATS("101-200 Packets: %u",
7337 			       pdev->stats.rx_ind_histogram.pkts_101_200);
7338 		DP_PRINT_STATS("   201+ Packets: %u",
7339 			       pdev->stats.rx_ind_histogram.pkts_201_plus);
7340 
7341 		DP_PRINT_STATS("%s: tso_enable: %u lro_enable: %u rx_hash: %u napi_enable: %u",
7342 			       __func__,
7343 			       pdev->soc->wlan_cfg_ctx
7344 			       ->tso_enabled,
7345 			       pdev->soc->wlan_cfg_ctx
7346 			       ->lro_enabled,
7347 			       pdev->soc->wlan_cfg_ctx
7348 			       ->rx_hash,
7349 			       pdev->soc->wlan_cfg_ctx
7350 			       ->napi_enabled);
7351 #ifdef QCA_LL_TX_FLOW_CONTROL_V2
7352 		DP_PRINT_STATS("%s: Tx flow stop queue: %u tx flow start queue offset: %u",
7353 			       __func__,
7354 			       pdev->soc->wlan_cfg_ctx
7355 			       ->tx_flow_stop_queue_threshold,
7356 			       pdev->soc->wlan_cfg_ctx
7357 			       ->tx_flow_start_queue_offset);
7358 #endif
7359 	}
7360 }
7361 
7362 /*
7363  * dp_aggregate_pdev_ctrl_frames_stats()- function to agreegate peer stats
7364  * Current scope is bar received count
7365  *
7366  * @soc : Datapath SOC handle
7367  * @peer: Datapath peer handle
7368  * @arg : argument to iterate function
7369  *
7370  * Return: void
7371  */
7372 static void
7373 dp_peer_ctrl_frames_stats_get(struct dp_soc *soc,
7374 			      struct dp_peer *peer,
7375 			      void *arg)
7376 {
7377 	uint32_t waitcnt;
7378 	struct dp_pdev *pdev = peer->vdev->pdev;
7379 
7380 	waitcnt = 0;
7381 	dp_peer_rxtid_stats(peer, dp_rx_bar_stats_cb, pdev);
7382 	while (!(qdf_atomic_read(&pdev->stats_cmd_complete)) &&
7383 	       waitcnt < 10) {
7384 		schedule_timeout_interruptible(
7385 				STATS_PROC_TIMEOUT);
7386 		waitcnt++;
7387 	}
7388 	qdf_atomic_set(&pdev->stats_cmd_complete, 0);
7389 }
7390 
7391 void
7392 dp_print_pdev_tx_stats(struct dp_pdev *pdev)
7393 {
7394 	uint8_t i = 0, index = 0;
7395 
7396 	DP_PRINT_STATS("PDEV Tx Stats:\n");
7397 	DP_PRINT_STATS("Received From Stack:");
7398 	DP_PRINT_STATS("	Packets = %u",
7399 		       pdev->stats.tx_i.rcvd.num);
7400 	DP_PRINT_STATS("	Bytes = %llu",
7401 		       pdev->stats.tx_i.rcvd.bytes);
7402 	DP_PRINT_STATS("Received from Stack in FP:");
7403 	DP_PRINT_STATS("	Packets = %llu",
7404 		       pdev->stats.tx_i.rcvd_in_fast_xmit_flow);
7405 	DP_PRINT_STATS("Received from Stack per core:");
7406 	DP_PRINT_STATS("	Packets = %u %u %u %u",
7407 		       pdev->stats.tx_i.rcvd_per_core[0],
7408 		       pdev->stats.tx_i.rcvd_per_core[1],
7409 		       pdev->stats.tx_i.rcvd_per_core[2],
7410 		       pdev->stats.tx_i.rcvd_per_core[3]);
7411 	DP_PRINT_STATS("Processed:");
7412 	DP_PRINT_STATS("	Packets = %u",
7413 		       pdev->stats.tx_i.processed.num);
7414 	DP_PRINT_STATS("	Bytes = %llu",
7415 		       pdev->stats.tx_i.processed.bytes);
7416 	DP_PRINT_STATS("Total Completions:");
7417 	DP_PRINT_STATS("	Packets = %u",
7418 		       pdev->stats.tx.comp_pkt.num);
7419 	DP_PRINT_STATS("	Bytes = %llu",
7420 		       pdev->stats.tx.comp_pkt.bytes);
7421 	DP_PRINT_STATS("Successful Completions:");
7422 	DP_PRINT_STATS("	Packets = %u",
7423 		       pdev->stats.tx.tx_success.num);
7424 	DP_PRINT_STATS("	Bytes = %llu",
7425 		       pdev->stats.tx.tx_success.bytes);
7426 	DP_PRINT_STATS("Dropped:");
7427 	DP_PRINT_STATS("	Total = %u",
7428 		       pdev->stats.tx_i.dropped.dropped_pkt.num);
7429 	DP_PRINT_STATS("	Dma_map_error = %u",
7430 		       pdev->stats.tx_i.dropped.dma_error);
7431 	DP_PRINT_STATS("	Ring Full = %u",
7432 		       pdev->stats.tx_i.dropped.ring_full);
7433 	DP_PRINT_STATS("	Descriptor Not available = %u",
7434 		       pdev->stats.tx_i.dropped.desc_na.num);
7435 	DP_PRINT_STATS("	HW enqueue failed= %u",
7436 		       pdev->stats.tx_i.dropped.enqueue_fail);
7437 	DP_PRINT_STATS("        Descriptor alloc fail = %u",
7438 		       pdev->stats.tx_i.dropped.desc_na_exc_alloc_fail.num);
7439 	DP_PRINT_STATS("        Tx outstanding too many = %u",
7440 		       pdev->stats.tx_i.dropped.desc_na_exc_outstand.num);
7441 	DP_PRINT_STATS("	Pkt dropped in vdev-id check= %u",
7442 		       pdev->stats.tx_i.dropped.fail_per_pkt_vdev_id_check);
7443 	DP_PRINT_STATS("	Resources Full = %u",
7444 		       pdev->stats.tx_i.dropped.res_full);
7445 	DP_PRINT_STATS("	Drop Ingress = %u",
7446 		       pdev->stats.tx_i.dropped.drop_ingress);
7447 	DP_PRINT_STATS("	invalid peer id in exception path = %u",
7448 		       pdev->stats.tx_i.dropped.invalid_peer_id_in_exc_path);
7449 	DP_PRINT_STATS("Tx failed = %u",
7450 		       pdev->stats.tx.tx_failed);
7451 	DP_PRINT_STATS("	FW removed Pkts = %u",
7452 		       pdev->stats.tx.dropped.fw_rem.num);
7453 	DP_PRINT_STATS("	FW removed bytes= %llu",
7454 		       pdev->stats.tx.dropped.fw_rem.bytes);
7455 	DP_PRINT_STATS("	FW removed transmitted = %u",
7456 		       pdev->stats.tx.dropped.fw_rem_tx);
7457 	DP_PRINT_STATS("	FW removed untransmitted = %u",
7458 		       pdev->stats.tx.dropped.fw_rem_notx);
7459 	DP_PRINT_STATS("	FW removed untransmitted fw_reason1 = %u",
7460 		       pdev->stats.tx.dropped.fw_reason1);
7461 	DP_PRINT_STATS("	FW removed untransmitted fw_reason2 = %u",
7462 		       pdev->stats.tx.dropped.fw_reason2);
7463 	DP_PRINT_STATS("	FW removed untransmitted fw_reason3 = %u",
7464 		       pdev->stats.tx.dropped.fw_reason3);
7465 	DP_PRINT_STATS("	FW removed untransmitted disable queue = %u",
7466 		       pdev->stats.tx.dropped.fw_rem_queue_disable);
7467 	DP_PRINT_STATS("	FW removed untransmitted no match = %u",
7468 		       pdev->stats.tx.dropped.fw_rem_no_match);
7469 	DP_PRINT_STATS("	Dropped due to HW threshold criteria = %u",
7470 		       pdev->stats.tx.dropped.drop_threshold);
7471 	DP_PRINT_STATS("	Link desc not available drop = %u",
7472 		       pdev->stats.tx.dropped.drop_link_desc_na);
7473 	DP_PRINT_STATS("	Drop bit set or invalid flow = %u",
7474 		       pdev->stats.tx.dropped.invalid_drop);
7475 	DP_PRINT_STATS("	MCAST vdev drop in HW = %u",
7476 		       pdev->stats.tx.dropped.mcast_vdev_drop);
7477 	DP_PRINT_STATS("	Dropped with invalid reason = %u",
7478 		       pdev->stats.tx.dropped.invalid_rr);
7479 	DP_PRINT_STATS("	Aged Out from msdu/mpdu queues = %u",
7480 		       pdev->stats.tx.dropped.age_out);
7481 	DP_PRINT_STATS("	headroom insufficient = %u",
7482 		       pdev->stats.tx_i.dropped.headroom_insufficient);
7483 	DP_PRINT_STATS("Multicast:");
7484 	DP_PRINT_STATS("	Packets: %u",
7485 		       pdev->stats.tx.mcast.num);
7486 	DP_PRINT_STATS("	Bytes: %llu",
7487 		       pdev->stats.tx.mcast.bytes);
7488 	DP_PRINT_STATS("Scatter Gather:");
7489 	DP_PRINT_STATS("	Packets = %d",
7490 		       pdev->stats.tx_i.sg.sg_pkt.num);
7491 	DP_PRINT_STATS("	Bytes = %llu",
7492 		       pdev->stats.tx_i.sg.sg_pkt.bytes);
7493 	DP_PRINT_STATS("	Dropped By Host = %u",
7494 		       pdev->stats.tx_i.sg.dropped_host.num);
7495 	DP_PRINT_STATS("	Dropped By Target = %u",
7496 		       pdev->stats.tx_i.sg.dropped_target);
7497 	DP_PRINT_STATS("Mcast Enhancement:");
7498 	DP_PRINT_STATS("	Packets = %u",
7499 		       pdev->stats.tx_i.mcast_en.mcast_pkt.num);
7500 	DP_PRINT_STATS("	Bytes = %llu",
7501 		       pdev->stats.tx_i.mcast_en.mcast_pkt.bytes);
7502 	DP_PRINT_STATS("	Dropped: Map Errors = %u",
7503 		       pdev->stats.tx_i.mcast_en.dropped_map_error);
7504 	DP_PRINT_STATS("	Dropped: Self Mac = %u",
7505 		       pdev->stats.tx_i.mcast_en.dropped_self_mac);
7506 	DP_PRINT_STATS("	Dropped: Send Fail = %u",
7507 		       pdev->stats.tx_i.mcast_en.dropped_send_fail);
7508 	DP_PRINT_STATS("	Unicast sent = %u",
7509 		       pdev->stats.tx_i.mcast_en.ucast);
7510 	DP_PRINT_STATS("IGMP Mcast Enhancement:");
7511 	DP_PRINT_STATS("	IGMP packets received = %u",
7512 		       pdev->stats.tx_i.igmp_mcast_en.igmp_rcvd);
7513 	DP_PRINT_STATS("	Converted to uncast = %u",
7514 		       pdev->stats.tx_i.igmp_mcast_en.igmp_ucast_converted);
7515 	DP_PRINT_STATS("Raw:");
7516 	DP_PRINT_STATS("	Packets = %u",
7517 		       pdev->stats.tx_i.raw.raw_pkt.num);
7518 	DP_PRINT_STATS("	Bytes = %llu",
7519 		       pdev->stats.tx_i.raw.raw_pkt.bytes);
7520 	DP_PRINT_STATS("	DMA map error = %u",
7521 		       pdev->stats.tx_i.raw.dma_map_error);
7522 	DP_PRINT_STATS("        RAW pkt type[!data] error = %u",
7523 		       pdev->stats.tx_i.raw.invalid_raw_pkt_datatype);
7524 	DP_PRINT_STATS("        Frags count overflow  error = %u",
7525 		       pdev->stats.tx_i.raw.num_frags_overflow_err);
7526 	DP_PRINT_STATS("Reinjected:");
7527 	DP_PRINT_STATS("	Packets = %u",
7528 		       pdev->stats.tx_i.reinject_pkts.num);
7529 	DP_PRINT_STATS("	Bytes = %llu\n",
7530 		       pdev->stats.tx_i.reinject_pkts.bytes);
7531 	DP_PRINT_STATS("Inspected:");
7532 	DP_PRINT_STATS("	Packets = %d",
7533 		       pdev->stats.tx_i.inspect_pkts.num);
7534 	DP_PRINT_STATS("	Bytes = %llu",
7535 		       pdev->stats.tx_i.inspect_pkts.bytes);
7536 	DP_PRINT_STATS("Nawds Multicast:");
7537 	DP_PRINT_STATS("	Packets = %u",
7538 		       pdev->stats.tx_i.nawds_mcast.num);
7539 	DP_PRINT_STATS("	Bytes = %llu",
7540 		       pdev->stats.tx_i.nawds_mcast.bytes);
7541 	DP_PRINT_STATS("CCE Classified:");
7542 	DP_PRINT_STATS("	CCE Classified Packets: %u",
7543 		       pdev->stats.tx_i.cce_classified);
7544 	DP_PRINT_STATS("	RAW CCE Classified Packets: %u",
7545 		       pdev->stats.tx_i.cce_classified_raw);
7546 	DP_PRINT_STATS("Mesh stats:");
7547 	DP_PRINT_STATS("	frames to firmware: %u",
7548 		       pdev->stats.tx_i.mesh.exception_fw);
7549 	DP_PRINT_STATS("	completions from fw: %u",
7550 		       pdev->stats.tx_i.mesh.completion_fw);
7551 	DP_PRINT_STATS("PPDU stats counter");
7552 	for (index = 0; index < CDP_PPDU_STATS_MAX_TAG; index++) {
7553 		DP_PRINT_STATS("	Tag[%d] = %llu", index,
7554 			       pdev->stats.ppdu_stats_counter[index]);
7555 	}
7556 	DP_PRINT_STATS("BA not received for delayed_ba: %u",
7557 		       pdev->stats.cdp_delayed_ba_not_recev);
7558 
7559 	dp_monitor_print_tx_stats(pdev);
7560 
7561 	DP_PRINT_STATS("tx_ppdu_proc: %llu",
7562 		       pdev->stats.tx_ppdu_proc);
7563 	DP_PRINT_STATS("ack ba comes twice: %llu",
7564 		       pdev->stats.ack_ba_comes_twice);
7565 	DP_PRINT_STATS("ppdu dropped because of incomplete tlv: %llu",
7566 		       pdev->stats.ppdu_drop);
7567 	DP_PRINT_STATS("ppdu dropped because of wrap around: %llu",
7568 		       pdev->stats.ppdu_wrap_drop);
7569 
7570 	for (i = 0; i < CDP_WDI_NUM_EVENTS; i++) {
7571 		if (!pdev->stats.wdi_event[i])
7572 			DP_PRINT_STATS("Wdi msgs received from fw[%d]:%d",
7573 				       i, pdev->stats.wdi_event[i]);
7574 	}
7575 
7576 	dp_monitor_print_pdev_tx_capture_stats(pdev);
7577 }
7578 
7579 void
7580 dp_print_pdev_rx_stats(struct dp_pdev *pdev)
7581 {
7582 	uint8_t i;
7583 
7584 	DP_PRINT_STATS("PDEV Rx Stats:\n");
7585 	DP_PRINT_STATS("Received From HW (Per Rx Ring):");
7586 	DP_PRINT_STATS("	Packets = %u %u %u %u",
7587 		       pdev->stats.rx.rcvd_reo[0].num,
7588 		       pdev->stats.rx.rcvd_reo[1].num,
7589 		       pdev->stats.rx.rcvd_reo[2].num,
7590 		       pdev->stats.rx.rcvd_reo[3].num);
7591 	DP_PRINT_STATS("	Bytes = %llu %llu %llu %llu",
7592 		       pdev->stats.rx.rcvd_reo[0].bytes,
7593 		       pdev->stats.rx.rcvd_reo[1].bytes,
7594 		       pdev->stats.rx.rcvd_reo[2].bytes,
7595 		       pdev->stats.rx.rcvd_reo[3].bytes);
7596 	for (i = 0; i < CDP_MAX_LMACS; i++)
7597 		DP_PRINT_STATS("Packets Received on lmac[%d] = %d (%llu)",
7598 			       i, pdev->stats.rx.rx_lmac[i].num,
7599 			       pdev->stats.rx.rx_lmac[i].bytes);
7600 	DP_PRINT_STATS("Replenished:");
7601 	DP_PRINT_STATS("	Packets = %u",
7602 		       pdev->stats.replenish.pkts.num);
7603 	DP_PRINT_STATS("	Buffers Added To Freelist = %u",
7604 		       pdev->stats.buf_freelist);
7605 	DP_PRINT_STATS("	Low threshold intr = %d",
7606 		       pdev->stats.replenish.low_thresh_intrs);
7607 	DP_PRINT_STATS("Dropped:");
7608 	DP_PRINT_STATS("	msdu_not_done = %u",
7609 		       pdev->stats.dropped.msdu_not_done);
7610 	DP_PRINT_STATS("        wifi parse = %u",
7611 		       pdev->stats.dropped.wifi_parse);
7612 	DP_PRINT_STATS("        mon_rx_drop = %u",
7613 		       pdev->stats.dropped.mon_rx_drop);
7614 	DP_PRINT_STATS("        mon_radiotap_update_err = %u",
7615 		       pdev->stats.dropped.mon_radiotap_update_err);
7616 	DP_PRINT_STATS("        mec_drop = %u",
7617 		       pdev->stats.rx.mec_drop.num);
7618 	DP_PRINT_STATS("	Bytes = %llu",
7619 		       pdev->stats.rx.mec_drop.bytes);
7620 	DP_PRINT_STATS("	peer_unauth_drop = %u",
7621 		       pdev->stats.rx.peer_unauth_rx_pkt_drop);
7622 	DP_PRINT_STATS("	policy_check_drop = %u",
7623 		       pdev->stats.rx.policy_check_drop);
7624 	DP_PRINT_STATS("Sent To Stack:");
7625 	DP_PRINT_STATS("	Packets = %u",
7626 		       pdev->stats.rx.to_stack.num);
7627 	DP_PRINT_STATS("	Bytes = %llu",
7628 		       pdev->stats.rx.to_stack.bytes);
7629 	DP_PRINT_STATS("        vlan_tag_stp_cnt = %u",
7630 		       pdev->stats.vlan_tag_stp_cnt);
7631 	DP_PRINT_STATS("Multicast/Broadcast:");
7632 	DP_PRINT_STATS("	Packets = %u",
7633 		       pdev->stats.rx.multicast.num);
7634 	DP_PRINT_STATS("	Bytes = %llu",
7635 		       pdev->stats.rx.multicast.bytes);
7636 	DP_PRINT_STATS("Errors:");
7637 	DP_PRINT_STATS("	Rxdma Ring Un-inititalized = %u",
7638 		       pdev->stats.replenish.rxdma_err);
7639 	DP_PRINT_STATS("	Desc Alloc Failed: = %u",
7640 		       pdev->stats.err.desc_alloc_fail);
7641 	DP_PRINT_STATS("	IP checksum error = %u",
7642 		       pdev->stats.err.ip_csum_err);
7643 	DP_PRINT_STATS("	TCP/UDP checksum error = %u",
7644 		       pdev->stats.err.tcp_udp_csum_err);
7645 	DP_PRINT_STATS("	Failed frag alloc = %u",
7646 		       pdev->stats.replenish.frag_alloc_fail);
7647 
7648 	dp_pdev_iterate_peer_lock_safe(pdev, dp_peer_ctrl_frames_stats_get,
7649 				       NULL, DP_MOD_ID_GENERIC_STATS);
7650 	/* Get bar_recv_cnt */
7651 	DP_PRINT_STATS("BAR Received Count: = %u",
7652 		       pdev->stats.rx.bar_recv_cnt);
7653 
7654 	DP_PRINT_STATS("RX Buffer Pool Stats:\n");
7655 	DP_PRINT_STATS("\tBuffers consumed during refill = %llu",
7656 		       pdev->stats.rx_buffer_pool.num_bufs_consumed);
7657 	DP_PRINT_STATS("\tSuccessful allocations during refill = %llu",
7658 		       pdev->stats.rx_buffer_pool.num_bufs_alloc_success);
7659 	DP_PRINT_STATS("\tAllocations from the pool during replenish = %llu",
7660 		       pdev->stats.rx_buffer_pool.num_pool_bufs_replenish);
7661 }
7662 
7663 void
7664 dp_print_soc_tx_stats(struct dp_soc *soc)
7665 {
7666 	uint8_t desc_pool_id;
7667 
7668 	soc->stats.tx.desc_in_use = 0;
7669 
7670 	DP_PRINT_STATS("SOC Tx Stats:\n");
7671 
7672 	for (desc_pool_id = 0;
7673 	     desc_pool_id < wlan_cfg_get_num_tx_desc_pool(soc->wlan_cfg_ctx);
7674 	     desc_pool_id++)
7675 		soc->stats.tx.desc_in_use +=
7676 			soc->tx_desc[desc_pool_id].num_allocated;
7677 
7678 	DP_PRINT_STATS("Tx Descriptors In Use = %u",
7679 		       soc->stats.tx.desc_in_use);
7680 	DP_PRINT_STATS("Tx Invalid peer:");
7681 	DP_PRINT_STATS("	Packets = %u",
7682 		       soc->stats.tx.tx_invalid_peer.num);
7683 	DP_PRINT_STATS("	Bytes = %llu",
7684 		       soc->stats.tx.tx_invalid_peer.bytes);
7685 	DP_PRINT_STATS("Packets dropped due to TCL ring full = %u %u %u %u",
7686 		       soc->stats.tx.tcl_ring_full[0],
7687 		       soc->stats.tx.tcl_ring_full[1],
7688 		       soc->stats.tx.tcl_ring_full[2],
7689 		       soc->stats.tx.tcl_ring_full[3]);
7690 	DP_PRINT_STATS("Tx invalid completion release = %u",
7691 		       soc->stats.tx.invalid_release_source);
7692 	DP_PRINT_STATS("Tx comp wbm internal error = %d : [%d %d %d %d]",
7693 		       soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_ALL],
7694 		       soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_BUFFER],
7695 		       soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_LINK_DESC],
7696 		       soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_MSDU_BUFF],
7697 		       soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_BUFF_REAPED]);
7698 	DP_PRINT_STATS("Tx comp non wbm internal error = %d",
7699 		       soc->stats.tx.non_wbm_internal_err);
7700 	DP_PRINT_STATS("Tx comp loop pkt limit hit = %d",
7701 		       soc->stats.tx.tx_comp_loop_pkt_limit_hit);
7702 	DP_PRINT_STATS("Tx comp HP out of sync2 = %d",
7703 		       soc->stats.tx.hp_oos2);
7704 }
7705 
7706 static
7707 int dp_fill_rx_interrupt_ctx_stats(struct dp_intr *intr_ctx,
7708 				   char *buf, int buf_len)
7709 {	int i;
7710 	int pos = 0;
7711 
7712 	if (buf_len <= 0 || !buf) {
7713 		dp_err("incorrect buf or buf_len(%d)!", buf_len);
7714 		return pos;
7715 	}
7716 
7717 	for (i = 0; i < MAX_REO_DEST_RINGS; i++) {
7718 		if (intr_ctx->intr_stats.num_rx_ring_masks[i])
7719 			pos += qdf_scnprintf(buf + pos,
7720 					     buf_len - pos,
7721 					     "reo[%u]:%u ", i,
7722 					     intr_ctx->intr_stats.num_rx_ring_masks[i]);
7723 	}
7724 	return pos;
7725 }
7726 
7727 static
7728 int dp_fill_tx_interrupt_ctx_stats(struct dp_intr *intr_ctx,
7729 				   char *buf, int buf_len)
7730 {	int i;
7731 	int pos = 0;
7732 
7733 	if (buf_len <= 0 || !buf) {
7734 		dp_err("incorrect buf or buf_len(%d)!", buf_len);
7735 		return pos;
7736 	}
7737 
7738 	for (i = 0; i < MAX_TCL_DATA_RINGS; i++) {
7739 		if (intr_ctx->intr_stats.num_tx_ring_masks[i])
7740 			pos += qdf_scnprintf(buf + pos,
7741 					     buf_len - pos,
7742 					     "tx_comps[%u]:%u ", i,
7743 					     intr_ctx->intr_stats.num_tx_ring_masks[i]);
7744 	}
7745 	return pos;
7746 }
7747 
7748 #ifdef WLAN_DP_SRNG_USAGE_WM_TRACKING
7749 #define DP_SRNG_HIGH_WM_STATS_STRING_LEN 512
7750 void dp_dump_srng_high_wm_stats(struct dp_soc *soc, uint64_t srng_mask)
7751 {
7752 	char *buf;
7753 	int ring, pos, buf_len;
7754 	char srng_high_wm_str[DP_SRNG_HIGH_WM_STATS_STRING_LEN] = {'\0'};
7755 
7756 	if (!srng_mask)
7757 		return;
7758 
7759 	buf = srng_high_wm_str;
7760 	buf_len = DP_SRNG_HIGH_WM_STATS_STRING_LEN;
7761 
7762 	dp_info("%8s %7s %12s %10s %10s %10s %10s %10s %10s",
7763 		"ring_id", "high_wm", "time", "<50", "50-60", "60-70",
7764 		"70-80", "80-90", "90-100");
7765 
7766 	if (srng_mask & (1 << REO_DST)) {
7767 		for (ring = 0; ring < soc->num_reo_dest_rings; ring++) {
7768 			pos = 0;
7769 			pos += hal_dump_srng_high_wm_stats(soc->hal_soc,
7770 					    soc->reo_dest_ring[ring].hal_srng,
7771 					    buf, buf_len, pos);
7772 			dp_info("%s", srng_high_wm_str);
7773 		}
7774 	}
7775 }
7776 #endif
7777 
7778 #define DP_INT_CTX_STATS_STRING_LEN 512
7779 void dp_print_soc_interrupt_stats(struct dp_soc *soc)
7780 {
7781 	char *buf;
7782 	char int_ctx_str[DP_INT_CTX_STATS_STRING_LEN] = {'\0'};
7783 	int i, pos, buf_len;
7784 	struct dp_intr_stats *intr_stats;
7785 
7786 	buf = int_ctx_str;
7787 	buf_len = DP_INT_CTX_STATS_STRING_LEN;
7788 
7789 	for (i = 0; i < WLAN_CFG_INT_NUM_CONTEXTS; i++) {
7790 		pos = 0;
7791 		qdf_mem_zero(int_ctx_str, sizeof(int_ctx_str));
7792 		intr_stats = &soc->intr_ctx[i].intr_stats;
7793 
7794 		if (!intr_stats->num_masks && !intr_stats->num_near_full_masks)
7795 			continue;
7796 
7797 		pos += qdf_scnprintf(buf + pos,
7798 				     buf_len - pos,
7799 				     "%2u[%3d] - Total:%u ",
7800 				     i,
7801 				     hif_get_int_ctx_irq_num(soc->hif_handle,
7802 							     i),
7803 				     intr_stats->num_masks);
7804 
7805 		if (soc->intr_ctx[i].tx_ring_mask)
7806 			pos += dp_fill_tx_interrupt_ctx_stats(&soc->intr_ctx[i],
7807 							      buf + pos,
7808 							      buf_len - pos);
7809 
7810 		if (soc->intr_ctx[i].rx_ring_mask)
7811 			pos += dp_fill_rx_interrupt_ctx_stats(&soc->intr_ctx[i],
7812 							      buf + pos,
7813 							      buf_len - pos);
7814 		if (soc->intr_ctx[i].rx_err_ring_mask)
7815 			pos += qdf_scnprintf(buf + pos,
7816 					     buf_len - pos,
7817 					     "reo_err:%u ",
7818 					     intr_stats->num_rx_err_ring_masks);
7819 
7820 		if (soc->intr_ctx[i].rx_wbm_rel_ring_mask)
7821 			pos += qdf_scnprintf(buf + pos,
7822 					     buf_len - pos,
7823 					     "wbm_rx_err:%u ",
7824 					     intr_stats->num_rx_wbm_rel_ring_masks);
7825 
7826 		if (soc->intr_ctx[i].rxdma2host_ring_mask)
7827 			pos += qdf_scnprintf(buf + pos,
7828 					     buf_len - pos,
7829 					     "rxdma2_host_err:%u ",
7830 					     intr_stats->num_rxdma2host_ring_masks);
7831 
7832 		if (soc->intr_ctx[i].rx_near_full_grp_1_mask)
7833 			pos += qdf_scnprintf(buf + pos,
7834 					     buf_len - pos,
7835 					     "rx_near_full_grp_1:%u ",
7836 					     intr_stats->num_near_full_masks);
7837 
7838 		if (soc->intr_ctx[i].rx_near_full_grp_2_mask)
7839 			pos += qdf_scnprintf(buf + pos,
7840 					     buf_len - pos,
7841 					     "rx_near_full_grp_2:%u ",
7842 					     intr_stats->num_near_full_masks);
7843 		if (soc->intr_ctx[i].tx_ring_near_full_mask)
7844 			pos += qdf_scnprintf(buf + pos,
7845 					     buf_len - pos,
7846 					     "tx_near_full:%u ",
7847 					     intr_stats->num_near_full_masks);
7848 
7849 		dp_info("%s", int_ctx_str);
7850 	}
7851 }
7852 
7853 void
7854 dp_print_soc_rx_stats(struct dp_soc *soc)
7855 {
7856 	uint32_t i;
7857 	char reo_error[DP_REO_ERR_LENGTH];
7858 	char rxdma_error[DP_RXDMA_ERR_LENGTH];
7859 	uint8_t index = 0;
7860 
7861 	DP_PRINT_STATS("No of AST Entries = %d", soc->num_ast_entries);
7862 	DP_PRINT_STATS("SOC Rx Stats:\n");
7863 	DP_PRINT_STATS("Fragmented packets: %u",
7864 		       soc->stats.rx.rx_frags);
7865 	DP_PRINT_STATS("Reo reinjected packets: %u",
7866 		       soc->stats.rx.reo_reinject);
7867 	DP_PRINT_STATS("Errors:\n");
7868 	DP_PRINT_STATS("Rx Decrypt Errors = %d",
7869 		       (soc->stats.rx.err.rxdma_error[HAL_RXDMA_ERR_DECRYPT] +
7870 		       soc->stats.rx.err.rxdma_error[HAL_RXDMA_ERR_TKIP_MIC]));
7871 	DP_PRINT_STATS("Invalid RBM = %d",
7872 		       soc->stats.rx.err.invalid_rbm);
7873 	DP_PRINT_STATS("Invalid Vdev = %d",
7874 		       soc->stats.rx.err.invalid_vdev);
7875 	DP_PRINT_STATS("Invalid sa_idx or da_idx = %d",
7876 		       soc->stats.rx.err.invalid_sa_da_idx);
7877 	DP_PRINT_STATS("Defrag peer uninit = %d",
7878 		       soc->stats.rx.err.defrag_peer_uninit);
7879 	DP_PRINT_STATS("Pkts delivered no peer = %d",
7880 		       soc->stats.rx.err.pkt_delivered_no_peer);
7881 	DP_PRINT_STATS("Invalid Pdev = %d",
7882 		       soc->stats.rx.err.invalid_pdev);
7883 	DP_PRINT_STATS("Invalid Peer = %d",
7884 		       soc->stats.rx.err.rx_invalid_peer.num);
7885 	DP_PRINT_STATS("HAL Ring Access Fail = %d",
7886 		       soc->stats.rx.err.hal_ring_access_fail);
7887 	DP_PRINT_STATS("HAL Ring Access Full Fail = %d",
7888 		       soc->stats.rx.err.hal_ring_access_full_fail);
7889 	DP_PRINT_STATS("MSDU Done failures = %d",
7890 		       soc->stats.rx.err.msdu_done_fail);
7891 	DP_PRINT_STATS("RX frags: %d", soc->stats.rx.rx_frags);
7892 	DP_PRINT_STATS("RX frag wait: %d", soc->stats.rx.rx_frag_wait);
7893 	DP_PRINT_STATS("RX frag err: %d", soc->stats.rx.rx_frag_err);
7894 	DP_PRINT_STATS("RX frag OOR: %d", soc->stats.rx.rx_frag_oor);
7895 
7896 	DP_PRINT_STATS("RX HP out_of_sync: %d", soc->stats.rx.hp_oos2);
7897 	DP_PRINT_STATS("RX Ring Near Full: %d", soc->stats.rx.near_full);
7898 
7899 	DP_PRINT_STATS("RX Reap Loop Pkt Limit Hit: %d",
7900 		       soc->stats.rx.reap_loop_pkt_limit_hit);
7901 	DP_PRINT_STATS("RX DESC invalid magic: %u",
7902 		       soc->stats.rx.err.rx_desc_invalid_magic);
7903 	DP_PRINT_STATS("RX DUP DESC: %d",
7904 		       soc->stats.rx.err.hal_reo_dest_dup);
7905 	DP_PRINT_STATS("RX REL DUP DESC: %d",
7906 		       soc->stats.rx.err.hal_wbm_rel_dup);
7907 
7908 	DP_PRINT_STATS("RXDMA ERR DUP DESC: %d",
7909 		       soc->stats.rx.err.hal_rxdma_err_dup);
7910 
7911 	DP_PRINT_STATS("RX scatter msdu: %d",
7912 		       soc->stats.rx.err.scatter_msdu);
7913 
7914 	DP_PRINT_STATS("RX invalid cookie: %d",
7915 		       soc->stats.rx.err.invalid_cookie);
7916 
7917 	DP_PRINT_STATS("RX stale cookie: %d",
7918 		       soc->stats.rx.err.stale_cookie);
7919 
7920 	DP_PRINT_STATS("RX wait completed msdu break: %d",
7921 		       soc->stats.rx.msdu_scatter_wait_break);
7922 
7923 	DP_PRINT_STATS("2k jump delba sent: %d",
7924 		       soc->stats.rx.err.rx_2k_jump_delba_sent);
7925 
7926 	DP_PRINT_STATS("2k jump msdu to stack: %d",
7927 		       soc->stats.rx.err.rx_2k_jump_to_stack);
7928 
7929 	DP_PRINT_STATS("2k jump msdu drop: %d",
7930 		       soc->stats.rx.err.rx_2k_jump_drop);
7931 
7932 	DP_PRINT_STATS("REO err oor msdu to stack %d",
7933 		       soc->stats.rx.err.reo_err_oor_to_stack);
7934 
7935 	DP_PRINT_STATS("REO err oor msdu drop: %d",
7936 		       soc->stats.rx.err.reo_err_oor_drop);
7937 
7938 	DP_PRINT_STATS("REO err raw ampdu drop: %d",
7939 		       soc->stats.rx.err.reo_err_raw_mpdu_drop);
7940 
7941 	DP_PRINT_STATS("Rx err msdu rejected: %d",
7942 		       soc->stats.rx.err.rejected);
7943 
7944 	DP_PRINT_STATS("Rx stale link desc cookie: %d",
7945 		       soc->stats.rx.err.invalid_link_cookie);
7946 
7947 	DP_PRINT_STATS("Rx nbuf sanity fail: %d",
7948 		       soc->stats.rx.err.nbuf_sanity_fail);
7949 
7950 	DP_PRINT_STATS("Rx err msdu continuation err: %d",
7951 		       soc->stats.rx.err.msdu_continuation_err);
7952 
7953 	DP_PRINT_STATS("ssn update count: %d",
7954 		       soc->stats.rx.err.ssn_update_count);
7955 
7956 	DP_PRINT_STATS("bar handle update fail count: %d",
7957 		       soc->stats.rx.err.bar_handle_fail_count);
7958 
7959 	DP_PRINT_STATS("PN-in-Dest error frame pn-check fail: %d",
7960 		       soc->stats.rx.err.pn_in_dest_check_fail);
7961 
7962 	for (i = 0; i < HAL_RXDMA_ERR_MAX; i++) {
7963 		index += qdf_snprint(&rxdma_error[index],
7964 				DP_RXDMA_ERR_LENGTH - index,
7965 				" %d", soc->stats.rx.err.rxdma_error[i]);
7966 	}
7967 	DP_PRINT_STATS("RXDMA Error (0-31):%s", rxdma_error);
7968 
7969 	index = 0;
7970 	for (i = 0; i < HAL_REO_ERR_MAX; i++) {
7971 		index += qdf_snprint(&reo_error[index],
7972 				DP_REO_ERR_LENGTH - index,
7973 				" %d", soc->stats.rx.err.reo_error[i]);
7974 	}
7975 	DP_PRINT_STATS("REO Error(0-14):%s", reo_error);
7976 	DP_PRINT_STATS("REO CMD SEND FAIL: %d",
7977 		       soc->stats.rx.err.reo_cmd_send_fail);
7978 
7979 	DP_PRINT_STATS("Rx BAR frames:%d", soc->stats.rx.bar_frame);
7980 	DP_PRINT_STATS("Rxdma2rel route drop:%d",
7981 		       soc->stats.rx.rxdma2rel_route_drop);
7982 	DP_PRINT_STATS("Reo2rel route drop:%d",
7983 		       soc->stats.rx.reo2rel_route_drop);
7984 	DP_PRINT_STATS("Rx Flush count:%d", soc->stats.rx.err.rx_flush_count);
7985 	DP_PRINT_STATS("Rx invalid TID count:%d",
7986 		       soc->stats.rx.err.rx_invalid_tid_err);
7987 }
7988 
7989 #ifdef FEATURE_TSO_STATS
7990 void dp_print_tso_stats(struct dp_soc *soc,
7991 			enum qdf_stats_verbosity_level level)
7992 {
7993 	uint8_t loop_pdev;
7994 	uint32_t id;
7995 	struct dp_pdev *pdev;
7996 
7997 	for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) {
7998 		pdev = soc->pdev_list[loop_pdev];
7999 		DP_PRINT_STATS("TSO Statistics\n");
8000 		DP_PRINT_STATS(
8001 			  "From stack: %d | Successful completions: %d | TSO Packets: %d | TSO Completions: %d",
8002 			  pdev->stats.tx_i.rcvd.num,
8003 			  pdev->stats.tx.tx_success.num,
8004 			  pdev->stats.tso_stats.num_tso_pkts.num,
8005 			  pdev->stats.tso_stats.tso_comp);
8006 
8007 		for (id = 0; id < CDP_MAX_TSO_PACKETS; id++) {
8008 			/* TSO LEVEL 1 - PACKET INFO */
8009 			DP_PRINT_STATS(
8010 				  "Packet_Id:[%u]: Packet Length %zu | No. of segments: %u",
8011 				  id,
8012 				  pdev->stats.tso_stats.tso_info
8013 				  .tso_packet_info[id].tso_packet_len,
8014 				  pdev->stats.tso_stats.tso_info
8015 				  .tso_packet_info[id].num_seg);
8016 			/* TSO LEVEL 2 */
8017 			if (level == QDF_STATS_VERBOSITY_LEVEL_HIGH)
8018 				dp_print_tso_seg_stats(pdev, id);
8019 		}
8020 
8021 		DP_PRINT_STATS(
8022 			  "TSO Histogram: Single: %llu | 2-5 segs: %llu | 6-10: %llu segs | 11-15 segs: %llu | 16-20 segs: %llu | 20+ segs: %llu",
8023 			  pdev->stats.tso_stats.seg_histogram.segs_1,
8024 			  pdev->stats.tso_stats.seg_histogram.segs_2_5,
8025 			  pdev->stats.tso_stats.seg_histogram.segs_6_10,
8026 			  pdev->stats.tso_stats.seg_histogram.segs_11_15,
8027 			  pdev->stats.tso_stats.seg_histogram.segs_16_20,
8028 			  pdev->stats.tso_stats.seg_histogram.segs_20_plus);
8029 	}
8030 }
8031 
8032 void dp_stats_tso_segment_histogram_update(struct dp_pdev *pdev,
8033 					   uint8_t _p_cntrs)
8034 {
8035 	if (_p_cntrs == 1) {
8036 		DP_STATS_INC(pdev,
8037 			     tso_stats.seg_histogram.segs_1, 1);
8038 	} else if (_p_cntrs >= 2 && _p_cntrs <= 5) {
8039 		DP_STATS_INC(pdev,
8040 			     tso_stats.seg_histogram.segs_2_5, 1);
8041 	} else if (_p_cntrs > 5 && _p_cntrs <= 10) {
8042 		DP_STATS_INC(pdev,
8043 			     tso_stats.seg_histogram.segs_6_10, 1);
8044 	} else if (_p_cntrs > 10 && _p_cntrs <= 15) {
8045 		DP_STATS_INC(pdev,
8046 			     tso_stats.seg_histogram.segs_11_15, 1);
8047 	} else if (_p_cntrs > 15 && _p_cntrs <= 20) {
8048 		DP_STATS_INC(pdev,
8049 			     tso_stats.seg_histogram.segs_16_20, 1);
8050 	} else if (_p_cntrs > 20) {
8051 		DP_STATS_INC(pdev,
8052 			     tso_stats.seg_histogram.segs_20_plus, 1);
8053 	}
8054 }
8055 
8056 void dp_tso_segment_update(struct dp_pdev *pdev,
8057 			   uint32_t stats_idx,
8058 			   uint8_t idx,
8059 			   struct qdf_tso_seg_t seg)
8060 {
8061 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8062 		     .tso_seg[idx].num_frags,
8063 		     seg.num_frags);
8064 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8065 		     .tso_seg[idx].total_len,
8066 		     seg.total_len);
8067 
8068 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8069 		     .tso_seg[idx].tso_flags.tso_enable,
8070 		     seg.tso_flags.tso_enable);
8071 
8072 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8073 		     .tso_seg[idx].tso_flags.fin,
8074 		     seg.tso_flags.fin);
8075 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8076 		     .tso_seg[idx].tso_flags.syn,
8077 		     seg.tso_flags.syn);
8078 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8079 		     .tso_seg[idx].tso_flags.rst,
8080 		     seg.tso_flags.rst);
8081 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8082 		     .tso_seg[idx].tso_flags.psh,
8083 		     seg.tso_flags.psh);
8084 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8085 		     .tso_seg[idx].tso_flags.ack,
8086 		     seg.tso_flags.ack);
8087 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8088 		     .tso_seg[idx].tso_flags.urg,
8089 		     seg.tso_flags.urg);
8090 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8091 		     .tso_seg[idx].tso_flags.ece,
8092 		     seg.tso_flags.ece);
8093 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8094 		     .tso_seg[idx].tso_flags.cwr,
8095 		     seg.tso_flags.cwr);
8096 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8097 		     .tso_seg[idx].tso_flags.ns,
8098 		     seg.tso_flags.ns);
8099 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8100 		     .tso_seg[idx].tso_flags.tcp_seq_num,
8101 		     seg.tso_flags.tcp_seq_num);
8102 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8103 		     .tso_seg[idx].tso_flags.ip_id,
8104 		     seg.tso_flags.ip_id);
8105 }
8106 
8107 void dp_tso_packet_update(struct dp_pdev *pdev, uint32_t stats_idx,
8108 			  qdf_nbuf_t msdu, uint16_t num_segs)
8109 {
8110 	DP_STATS_UPD(pdev,
8111 		     tso_stats.tso_info.tso_packet_info[stats_idx]
8112 		     .num_seg,
8113 		     num_segs);
8114 
8115 	DP_STATS_UPD(pdev,
8116 		     tso_stats.tso_info.tso_packet_info[stats_idx]
8117 		     .tso_packet_len,
8118 		     qdf_nbuf_get_tcp_payload_len(msdu));
8119 }
8120 
8121 void dp_tso_segment_stats_update(struct dp_pdev *pdev,
8122 				 struct qdf_tso_seg_elem_t *stats_seg,
8123 				 uint32_t stats_idx)
8124 {
8125 	uint8_t tso_seg_idx = 0;
8126 
8127 	while (stats_seg  && (tso_seg_idx < CDP_MAX_TSO_SEGMENTS)) {
8128 		dp_tso_segment_update(pdev, stats_idx,
8129 				      tso_seg_idx,
8130 				      stats_seg->seg);
8131 		++tso_seg_idx;
8132 		stats_seg = stats_seg->next;
8133 	}
8134 }
8135 
8136 void dp_txrx_clear_tso_stats(struct dp_soc *soc)
8137 {
8138 	uint8_t loop_pdev;
8139 	struct dp_pdev *pdev;
8140 
8141 	for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) {
8142 		pdev = soc->pdev_list[loop_pdev];
8143 		dp_init_tso_stats(pdev);
8144 	}
8145 }
8146 #endif /* FEATURE_TSO_STATS */
8147 
8148 QDF_STATUS dp_txrx_get_peer_per_pkt_stats_param(struct dp_peer *peer,
8149 						enum cdp_peer_stats_type type,
8150 						cdp_peer_stats_param_t *buf)
8151 {
8152 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
8153 	struct dp_peer *tgt_peer;
8154 	struct dp_txrx_peer *txrx_peer;
8155 	struct dp_peer_per_pkt_stats *peer_stats;
8156 
8157 	txrx_peer = dp_get_txrx_peer(peer);
8158 	if (!txrx_peer)
8159 		return QDF_STATUS_E_FAILURE;
8160 
8161 	peer_stats = &txrx_peer->stats.per_pkt_stats;
8162 	switch (type) {
8163 	case cdp_peer_tx_ucast:
8164 		buf->tx_ucast = peer_stats->tx.ucast;
8165 		break;
8166 	case cdp_peer_tx_mcast:
8167 		buf->tx_mcast = peer_stats->tx.mcast;
8168 		break;
8169 	case cdp_peer_tx_inactive_time:
8170 		tgt_peer = dp_get_tgt_peer_from_peer(peer);
8171 		if (tgt_peer)
8172 			buf->tx_inactive_time =
8173 					tgt_peer->stats.tx.inactive_time;
8174 		else
8175 			ret = QDF_STATUS_E_FAILURE;
8176 		break;
8177 	case cdp_peer_rx_ucast:
8178 		buf->rx_ucast = peer_stats->rx.unicast;
8179 		break;
8180 	default:
8181 		ret = QDF_STATUS_E_FAILURE;
8182 		break;
8183 	}
8184 
8185 	return ret;
8186 }
8187 
8188 #ifdef QCA_ENHANCED_STATS_SUPPORT
8189 #ifdef WLAN_FEATURE_11BE_MLO
8190 QDF_STATUS dp_txrx_get_peer_extd_stats_param(struct dp_peer *peer,
8191 					     enum cdp_peer_stats_type type,
8192 					     cdp_peer_stats_param_t *buf)
8193 {
8194 	QDF_STATUS ret = QDF_STATUS_E_FAILURE;
8195 	struct dp_soc *soc = peer->vdev->pdev->soc;
8196 
8197 	if (IS_MLO_DP_MLD_PEER(peer)) {
8198 		struct dp_peer *link_peer;
8199 		struct dp_soc *link_peer_soc;
8200 
8201 		link_peer = dp_get_primary_link_peer_by_id(soc, peer->peer_id,
8202 							   DP_MOD_ID_CDP);
8203 
8204 		if (link_peer) {
8205 			link_peer_soc = link_peer->vdev->pdev->soc;
8206 			ret = dp_monitor_peer_get_stats_param(link_peer_soc,
8207 							      link_peer,
8208 							      type, buf);
8209 			dp_peer_unref_delete(link_peer, DP_MOD_ID_CDP);
8210 		}
8211 		return ret;
8212 	} else {
8213 		return dp_monitor_peer_get_stats_param(soc, peer, type, buf);
8214 	}
8215 }
8216 #else
8217 QDF_STATUS dp_txrx_get_peer_extd_stats_param(struct dp_peer *peer,
8218 					     enum cdp_peer_stats_type type,
8219 					     cdp_peer_stats_param_t *buf)
8220 {
8221 	struct dp_soc *soc = peer->vdev->pdev->soc;
8222 
8223 	return dp_monitor_peer_get_stats_param(soc, peer, type, buf);
8224 }
8225 #endif
8226 #else
8227 QDF_STATUS dp_txrx_get_peer_extd_stats_param(struct dp_peer *peer,
8228 					     enum cdp_peer_stats_type type,
8229 					     cdp_peer_stats_param_t *buf)
8230 {
8231 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
8232 	struct dp_txrx_peer *txrx_peer;
8233 	struct dp_peer_extd_stats *peer_stats;
8234 
8235 	txrx_peer = dp_get_txrx_peer(peer);
8236 	if (!txrx_peer)
8237 		return QDF_STATUS_E_FAILURE;
8238 
8239 	peer_stats = &txrx_peer->stats.extd_stats;
8240 
8241 	switch (type) {
8242 	case cdp_peer_tx_rate:
8243 		buf->tx_rate = peer_stats->tx.tx_rate;
8244 		break;
8245 	case cdp_peer_tx_last_tx_rate:
8246 		buf->last_tx_rate = peer_stats->tx.last_tx_rate;
8247 		break;
8248 	case cdp_peer_tx_ratecode:
8249 		buf->tx_ratecode = peer_stats->tx.tx_ratecode;
8250 		break;
8251 	case cdp_peer_rx_rate:
8252 		buf->rx_rate = peer_stats->rx.rx_rate;
8253 		break;
8254 	case cdp_peer_rx_last_rx_rate:
8255 		buf->last_rx_rate = peer_stats->rx.last_rx_rate;
8256 		break;
8257 	case cdp_peer_rx_ratecode:
8258 		buf->rx_ratecode = peer_stats->rx.rx_ratecode;
8259 		break;
8260 	case cdp_peer_rx_avg_snr:
8261 		buf->rx_avg_snr = peer_stats->rx.avg_snr;
8262 		break;
8263 	case cdp_peer_rx_snr:
8264 		buf->rx_snr = peer_stats->rx.snr;
8265 		break;
8266 	default:
8267 		ret = QDF_STATUS_E_FAILURE;
8268 		break;
8269 	}
8270 
8271 	return ret;
8272 }
8273 #endif
8274 
8275 /**
8276  * dp_is_wds_extended() - Check if wds ext is enabled
8277  * @txrx_peer: DP txrx_peer handle
8278  *
8279  * return: true if enabled, false if not
8280  */
8281 #ifdef QCA_SUPPORT_WDS_EXTENDED
8282 static inline
8283 bool dp_is_wds_extended(struct dp_txrx_peer *txrx_peer)
8284 {
8285 	if (qdf_atomic_test_bit(WDS_EXT_PEER_INIT_BIT,
8286 				&txrx_peer->wds_ext.init))
8287 		return true;
8288 
8289 	return false;
8290 }
8291 #else
8292 static inline
8293 bool dp_is_wds_extended(struct dp_txrx_peer *txrx_peer)
8294 {
8295 	return false;
8296 }
8297 #endif /* QCA_SUPPORT_WDS_EXTENDED */
8298 
8299 /**
8300  * dp_peer_get_hw_txrx_stats_en() - Get value of hw_txrx_stats_en
8301  * @txrx_peer: DP txrx_peer handle
8302  *
8303  * Return: true if enabled, false if not
8304  */
8305 #ifdef QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT
8306 static inline
8307 bool dp_peer_get_hw_txrx_stats_en(struct dp_txrx_peer *txrx_peer)
8308 {
8309 	return txrx_peer->hw_txrx_stats_en;
8310 }
8311 #else
8312 static inline
8313 bool dp_peer_get_hw_txrx_stats_en(struct dp_txrx_peer *txrx_peer)
8314 {
8315 	return false;
8316 }
8317 #endif
8318 
8319 #ifdef WLAN_FEATURE_11BE_MLO
8320 static inline struct dp_peer *dp_get_stats_peer(struct dp_peer *peer)
8321 {
8322 	/* ML primay link peer return mld_peer */
8323 	if (IS_MLO_DP_LINK_PEER(peer) && peer->primary_link)
8324 		return peer->mld_peer;
8325 
8326 	return peer;
8327 }
8328 #else
8329 static inline struct dp_peer *dp_get_stats_peer(struct dp_peer *peer)
8330 {
8331 	return peer;
8332 }
8333 #endif
8334 
8335 /**
8336  * dp_update_vdev_basic_stats() - Update vdev basic stats
8337  * @txrx_peer: DP txrx_peer handle
8338  * @tgtobj: Pointer to buffer for vdev stats
8339  *
8340  * Return: None
8341  */
8342 static inline
8343 void dp_update_vdev_basic_stats(struct dp_txrx_peer *txrx_peer,
8344 				struct cdp_vdev_stats *tgtobj)
8345 {
8346 	if (qdf_unlikely(!txrx_peer || !tgtobj))
8347 		return;
8348 
8349 	if (!dp_peer_get_hw_txrx_stats_en(txrx_peer)) {
8350 		tgtobj->tx.comp_pkt.num += txrx_peer->comp_pkt.num;
8351 		tgtobj->tx.comp_pkt.bytes += txrx_peer->comp_pkt.bytes;
8352 		tgtobj->tx.tx_failed += txrx_peer->tx_failed;
8353 	}
8354 	tgtobj->rx.to_stack.num += txrx_peer->to_stack.num;
8355 	tgtobj->rx.to_stack.bytes += txrx_peer->to_stack.bytes;
8356 }
8357 
8358 #ifdef QCA_ENHANCED_STATS_SUPPORT
8359 void dp_update_vdev_stats(struct dp_soc *soc, struct dp_peer *srcobj,
8360 			  void *arg)
8361 {
8362 	struct dp_txrx_peer *txrx_peer;
8363 	struct cdp_vdev_stats *vdev_stats = (struct cdp_vdev_stats *)arg;
8364 	struct dp_peer_per_pkt_stats *per_pkt_stats;
8365 
8366 	txrx_peer = dp_get_txrx_peer(srcobj);
8367 	if (qdf_unlikely(!txrx_peer))
8368 		goto link_stats;
8369 
8370 	if (qdf_unlikely(dp_is_wds_extended(txrx_peer)))
8371 		return;
8372 
8373 	if (!dp_peer_is_primary_link_peer(srcobj))
8374 		goto link_stats;
8375 
8376 	dp_update_vdev_basic_stats(txrx_peer, vdev_stats);
8377 
8378 	per_pkt_stats = &txrx_peer->stats.per_pkt_stats;
8379 	DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats);
8380 
8381 link_stats:
8382 	dp_monitor_peer_get_stats(soc, srcobj, vdev_stats, UPDATE_VDEV_STATS);
8383 }
8384 
8385 void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev,
8386 					struct dp_peer *peer)
8387 {
8388 	struct dp_soc *soc = vdev->pdev->soc;
8389 	struct dp_txrx_peer *txrx_peer;
8390 	struct dp_peer_per_pkt_stats *per_pkt_stats;
8391 	struct cdp_vdev_stats *vdev_stats = &vdev->stats;
8392 
8393 	txrx_peer = peer->txrx_peer;
8394 	if (!txrx_peer)
8395 		goto link_stats;
8396 
8397 	dp_update_vdev_basic_stats(txrx_peer, vdev_stats);
8398 
8399 	per_pkt_stats = &txrx_peer->stats.per_pkt_stats;
8400 	DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats);
8401 
8402 link_stats:
8403 	dp_monitor_peer_get_stats(soc, peer, vdev_stats, UPDATE_VDEV_STATS);
8404 }
8405 
8406 #else
8407 void dp_update_vdev_stats(struct dp_soc *soc, struct dp_peer *srcobj,
8408 			  void *arg)
8409 {
8410 	struct dp_txrx_peer *txrx_peer;
8411 	struct cdp_vdev_stats *vdev_stats = (struct cdp_vdev_stats *)arg;
8412 	struct dp_peer_per_pkt_stats *per_pkt_stats;
8413 	struct dp_peer_extd_stats *extd_stats;
8414 
8415 	txrx_peer = dp_get_txrx_peer(srcobj);
8416 	if (qdf_unlikely(!txrx_peer))
8417 		return;
8418 
8419 	if (qdf_unlikely(dp_is_wds_extended(txrx_peer)))
8420 		return;
8421 
8422 	if (!dp_peer_is_primary_link_peer(srcobj))
8423 		return;
8424 
8425 	dp_update_vdev_basic_stats(txrx_peer, vdev_stats);
8426 
8427 	per_pkt_stats = &txrx_peer->stats.per_pkt_stats;
8428 	DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats);
8429 
8430 	extd_stats = &txrx_peer->stats.extd_stats;
8431 	DP_UPDATE_EXTD_STATS(vdev_stats, extd_stats);
8432 }
8433 
8434 void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev,
8435 					struct dp_peer *peer)
8436 {
8437 	struct dp_txrx_peer *txrx_peer;
8438 	struct dp_peer_per_pkt_stats *per_pkt_stats;
8439 	struct dp_peer_extd_stats *extd_stats;
8440 	struct cdp_vdev_stats *vdev_stats = &vdev->stats;
8441 
8442 	txrx_peer = peer->txrx_peer;
8443 	if (!txrx_peer)
8444 		return;
8445 
8446 	dp_update_vdev_basic_stats(txrx_peer, vdev_stats);
8447 
8448 	per_pkt_stats = &txrx_peer->stats.per_pkt_stats;
8449 	DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats);
8450 
8451 	extd_stats = &txrx_peer->stats.extd_stats;
8452 	DP_UPDATE_EXTD_STATS(vdev_stats, extd_stats);
8453 }
8454 #endif
8455 
8456 void dp_update_pdev_stats(struct dp_pdev *tgtobj,
8457 			  struct cdp_vdev_stats *srcobj)
8458 {
8459 	uint8_t i;
8460 	uint8_t pream_type;
8461 	uint8_t mu_type;
8462 	struct cdp_pdev_stats *pdev_stats = NULL;
8463 
8464 	pdev_stats = &tgtobj->stats;
8465 	for (pream_type = 0; pream_type < DOT11_MAX; pream_type++) {
8466 		for (i = 0; i < MAX_MCS; i++) {
8467 			tgtobj->stats.tx.pkt_type[pream_type].
8468 				mcs_count[i] +=
8469 			srcobj->tx.pkt_type[pream_type].
8470 				mcs_count[i];
8471 			tgtobj->stats.rx.pkt_type[pream_type].
8472 				mcs_count[i] +=
8473 			srcobj->rx.pkt_type[pream_type].
8474 				mcs_count[i];
8475 		}
8476 	}
8477 
8478 	for (i = 0; i < MAX_BW; i++) {
8479 		tgtobj->stats.tx.bw[i] += srcobj->tx.bw[i];
8480 		tgtobj->stats.rx.bw[i] += srcobj->rx.bw[i];
8481 	}
8482 
8483 	for (i = 0; i < SS_COUNT; i++) {
8484 		tgtobj->stats.tx.nss[i] += srcobj->tx.nss[i];
8485 		tgtobj->stats.rx.nss[i] += srcobj->rx.nss[i];
8486 		tgtobj->stats.rx.ppdu_nss[i] += srcobj->rx.ppdu_nss[i];
8487 	}
8488 
8489 	for (i = 0; i < WME_AC_MAX; i++) {
8490 		tgtobj->stats.tx.wme_ac_type[i] +=
8491 			srcobj->tx.wme_ac_type[i];
8492 		tgtobj->stats.rx.wme_ac_type[i] +=
8493 			srcobj->rx.wme_ac_type[i];
8494 		tgtobj->stats.tx.excess_retries_per_ac[i] +=
8495 			srcobj->tx.excess_retries_per_ac[i];
8496 	}
8497 
8498 	for (i = 0; i < MAX_GI; i++) {
8499 		tgtobj->stats.tx.sgi_count[i] +=
8500 			srcobj->tx.sgi_count[i];
8501 		tgtobj->stats.rx.sgi_count[i] +=
8502 			srcobj->rx.sgi_count[i];
8503 	}
8504 
8505 	for (i = 0; i < MAX_RECEPTION_TYPES; i++) {
8506 		tgtobj->stats.rx.reception_type[i] +=
8507 			srcobj->rx.reception_type[i];
8508 		tgtobj->stats.rx.ppdu_cnt[i] += srcobj->rx.ppdu_cnt[i];
8509 	}
8510 
8511 	for (i = 0; i < MAX_TRANSMIT_TYPES; i++) {
8512 		tgtobj->stats.tx.transmit_type[i].num_msdu +=
8513 				srcobj->tx.transmit_type[i].num_msdu;
8514 		tgtobj->stats.tx.transmit_type[i].num_mpdu +=
8515 				srcobj->tx.transmit_type[i].num_mpdu;
8516 		tgtobj->stats.tx.transmit_type[i].mpdu_tried +=
8517 				srcobj->tx.transmit_type[i].mpdu_tried;
8518 	}
8519 
8520 	for (i = 0; i < QDF_PROTO_SUBTYPE_MAX; i++)
8521 		tgtobj->stats.tx.no_ack_count[i] += srcobj->tx.no_ack_count[i];
8522 
8523 	for (i = 0; i < MAX_MU_GROUP_ID; i++)
8524 		tgtobj->stats.tx.mu_group_id[i] = srcobj->tx.mu_group_id[i];
8525 
8526 	for (i = 0; i < MAX_RU_LOCATIONS; i++) {
8527 		tgtobj->stats.tx.ru_loc[i].num_msdu +=
8528 			srcobj->tx.ru_loc[i].num_msdu;
8529 		tgtobj->stats.tx.ru_loc[i].num_mpdu +=
8530 			srcobj->tx.ru_loc[i].num_mpdu;
8531 		tgtobj->stats.tx.ru_loc[i].mpdu_tried +=
8532 			srcobj->tx.ru_loc[i].mpdu_tried;
8533 	}
8534 
8535 	tgtobj->stats.tx.tx_ppdus += srcobj->tx.tx_ppdus;
8536 	tgtobj->stats.tx.tx_mpdus_success += srcobj->tx.tx_mpdus_success;
8537 	tgtobj->stats.tx.tx_mpdus_tried += srcobj->tx.tx_mpdus_tried;
8538 	tgtobj->stats.tx.retries_mpdu += srcobj->tx.retries_mpdu;
8539 	tgtobj->stats.tx.mpdu_success_with_retries +=
8540 		srcobj->tx.mpdu_success_with_retries;
8541 	tgtobj->stats.tx.last_tx_ts = srcobj->tx.last_tx_ts;
8542 	tgtobj->stats.tx.tx_rate = srcobj->tx.tx_rate;
8543 	tgtobj->stats.tx.last_tx_rate = srcobj->tx.last_tx_rate;
8544 	tgtobj->stats.tx.last_tx_rate_mcs = srcobj->tx.last_tx_rate_mcs;
8545 	tgtobj->stats.tx.mcast_last_tx_rate = srcobj->tx.mcast_last_tx_rate;
8546 	tgtobj->stats.tx.mcast_last_tx_rate_mcs =
8547 		srcobj->tx.mcast_last_tx_rate_mcs;
8548 	tgtobj->stats.tx.rnd_avg_tx_rate = srcobj->tx.rnd_avg_tx_rate;
8549 	tgtobj->stats.tx.avg_tx_rate = srcobj->tx.avg_tx_rate;
8550 	tgtobj->stats.tx.tx_ratecode = srcobj->tx.tx_ratecode;
8551 	tgtobj->stats.tx.ru_start = srcobj->tx.ru_start;
8552 	tgtobj->stats.tx.ru_tones = srcobj->tx.ru_tones;
8553 	tgtobj->stats.tx.last_ack_rssi = srcobj->tx.last_ack_rssi;
8554 	tgtobj->stats.tx.nss_info = srcobj->tx.nss_info;
8555 	tgtobj->stats.tx.mcs_info = srcobj->tx.mcs_info;
8556 	tgtobj->stats.tx.bw_info = srcobj->tx.bw_info;
8557 	tgtobj->stats.tx.gi_info = srcobj->tx.gi_info;
8558 	tgtobj->stats.tx.preamble_info = srcobj->tx.preamble_info;
8559 	tgtobj->stats.tx.comp_pkt.bytes += srcobj->tx.comp_pkt.bytes;
8560 	tgtobj->stats.tx.comp_pkt.num += srcobj->tx.comp_pkt.num;
8561 	tgtobj->stats.tx.ucast.num += srcobj->tx.ucast.num;
8562 	tgtobj->stats.tx.ucast.bytes += srcobj->tx.ucast.bytes;
8563 	tgtobj->stats.tx.mcast.num += srcobj->tx.mcast.num;
8564 	tgtobj->stats.tx.mcast.bytes += srcobj->tx.mcast.bytes;
8565 	tgtobj->stats.tx.bcast.num += srcobj->tx.bcast.num;
8566 	tgtobj->stats.tx.bcast.bytes += srcobj->tx.bcast.bytes;
8567 	tgtobj->stats.tx.tx_success.num += srcobj->tx.tx_success.num;
8568 	tgtobj->stats.tx.tx_success.bytes +=
8569 		srcobj->tx.tx_success.bytes;
8570 	tgtobj->stats.tx.nawds_mcast.num +=
8571 		srcobj->tx.nawds_mcast.num;
8572 	tgtobj->stats.tx.nawds_mcast.bytes +=
8573 		srcobj->tx.nawds_mcast.bytes;
8574 	tgtobj->stats.tx.nawds_mcast_drop +=
8575 		srcobj->tx.nawds_mcast_drop;
8576 	tgtobj->stats.tx.num_ppdu_cookie_valid +=
8577 		srcobj->tx.num_ppdu_cookie_valid;
8578 	tgtobj->stats.tx.tx_failed += srcobj->tx.tx_failed;
8579 	tgtobj->stats.tx.ofdma += srcobj->tx.ofdma;
8580 	tgtobj->stats.tx.stbc += srcobj->tx.stbc;
8581 	tgtobj->stats.tx.ldpc += srcobj->tx.ldpc;
8582 	tgtobj->stats.tx.pream_punct_cnt += srcobj->tx.pream_punct_cnt;
8583 	tgtobj->stats.tx.retries += srcobj->tx.retries;
8584 	tgtobj->stats.tx.non_amsdu_cnt += srcobj->tx.non_amsdu_cnt;
8585 	tgtobj->stats.tx.amsdu_cnt += srcobj->tx.amsdu_cnt;
8586 	tgtobj->stats.tx.non_ampdu_cnt += srcobj->tx.non_ampdu_cnt;
8587 	tgtobj->stats.tx.ampdu_cnt += srcobj->tx.ampdu_cnt;
8588 	tgtobj->stats.tx.dropped.fw_rem.num += srcobj->tx.dropped.fw_rem.num;
8589 	tgtobj->stats.tx.dropped.fw_rem.bytes +=
8590 			srcobj->tx.dropped.fw_rem.bytes;
8591 	tgtobj->stats.tx.dropped.fw_rem_tx +=
8592 			srcobj->tx.dropped.fw_rem_tx;
8593 	tgtobj->stats.tx.dropped.fw_rem_notx +=
8594 			srcobj->tx.dropped.fw_rem_notx;
8595 	tgtobj->stats.tx.dropped.fw_reason1 +=
8596 			srcobj->tx.dropped.fw_reason1;
8597 	tgtobj->stats.tx.dropped.fw_reason2 +=
8598 			srcobj->tx.dropped.fw_reason2;
8599 	tgtobj->stats.tx.dropped.fw_reason3 +=
8600 			srcobj->tx.dropped.fw_reason3;
8601 	tgtobj->stats.tx.dropped.fw_rem_queue_disable +=
8602 				srcobj->tx.dropped.fw_rem_queue_disable;
8603 	tgtobj->stats.tx.dropped.fw_rem_no_match +=
8604 				srcobj->tx.dropped.fw_rem_no_match;
8605 	tgtobj->stats.tx.dropped.drop_threshold +=
8606 				srcobj->tx.dropped.drop_threshold;
8607 	tgtobj->stats.tx.dropped.drop_link_desc_na +=
8608 				srcobj->tx.dropped.drop_link_desc_na;
8609 	tgtobj->stats.tx.dropped.invalid_drop +=
8610 				srcobj->tx.dropped.invalid_drop;
8611 	tgtobj->stats.tx.dropped.mcast_vdev_drop +=
8612 					srcobj->tx.dropped.mcast_vdev_drop;
8613 	tgtobj->stats.tx.dropped.invalid_rr +=
8614 				srcobj->tx.dropped.invalid_rr;
8615 	tgtobj->stats.tx.dropped.age_out += srcobj->tx.dropped.age_out;
8616 	tgtobj->stats.rx.err.mic_err += srcobj->rx.err.mic_err;
8617 	tgtobj->stats.rx.err.decrypt_err += srcobj->rx.err.decrypt_err;
8618 	tgtobj->stats.rx.err.fcserr += srcobj->rx.err.fcserr;
8619 	tgtobj->stats.rx.err.pn_err += srcobj->rx.err.pn_err;
8620 	tgtobj->stats.rx.err.oor_err += srcobj->rx.err.oor_err;
8621 	tgtobj->stats.rx.err.jump_2k_err += srcobj->rx.err.jump_2k_err;
8622 	tgtobj->stats.rx.err.rxdma_wifi_parse_err +=
8623 				srcobj->rx.err.rxdma_wifi_parse_err;
8624 	if (srcobj->rx.snr != 0)
8625 		tgtobj->stats.rx.snr = srcobj->rx.snr;
8626 	tgtobj->stats.rx.rx_rate = srcobj->rx.rx_rate;
8627 	tgtobj->stats.rx.last_rx_rate = srcobj->rx.last_rx_rate;
8628 	tgtobj->stats.rx.rnd_avg_rx_rate = srcobj->rx.rnd_avg_rx_rate;
8629 	tgtobj->stats.rx.avg_rx_rate = srcobj->rx.avg_rx_rate;
8630 	tgtobj->stats.rx.rx_ratecode = srcobj->rx.rx_ratecode;
8631 	tgtobj->stats.rx.avg_snr = srcobj->rx.avg_snr;
8632 	tgtobj->stats.rx.rx_snr_measured_time = srcobj->rx.rx_snr_measured_time;
8633 	tgtobj->stats.rx.last_snr = srcobj->rx.last_snr;
8634 	tgtobj->stats.rx.nss_info = srcobj->rx.nss_info;
8635 	tgtobj->stats.rx.mcs_info = srcobj->rx.mcs_info;
8636 	tgtobj->stats.rx.bw_info = srcobj->rx.bw_info;
8637 	tgtobj->stats.rx.gi_info = srcobj->rx.gi_info;
8638 	tgtobj->stats.rx.preamble_info = srcobj->rx.preamble_info;
8639 	tgtobj->stats.rx.non_ampdu_cnt += srcobj->rx.non_ampdu_cnt;
8640 	tgtobj->stats.rx.ampdu_cnt += srcobj->rx.ampdu_cnt;
8641 	tgtobj->stats.rx.non_amsdu_cnt += srcobj->rx.non_amsdu_cnt;
8642 	tgtobj->stats.rx.amsdu_cnt += srcobj->rx.amsdu_cnt;
8643 	tgtobj->stats.rx.nawds_mcast_drop += srcobj->rx.nawds_mcast_drop;
8644 	tgtobj->stats.rx.mcast_3addr_drop += srcobj->rx.mcast_3addr_drop;
8645 	tgtobj->stats.rx.to_stack.num += srcobj->rx.to_stack.num;
8646 	tgtobj->stats.rx.to_stack.bytes += srcobj->rx.to_stack.bytes;
8647 
8648 	for (i = 0; i < CDP_MAX_RX_RINGS; i++) {
8649 		tgtobj->stats.rx.rcvd_reo[i].num +=
8650 			srcobj->rx.rcvd_reo[i].num;
8651 		tgtobj->stats.rx.rcvd_reo[i].bytes +=
8652 			srcobj->rx.rcvd_reo[i].bytes;
8653 	}
8654 
8655 	for (i = 0; i < CDP_MAX_LMACS; i++) {
8656 		tgtobj->stats.rx.rx_lmac[i].num +=
8657 			srcobj->rx.rx_lmac[i].num;
8658 		tgtobj->stats.rx.rx_lmac[i].bytes +=
8659 			srcobj->rx.rx_lmac[i].bytes;
8660 	}
8661 
8662 	srcobj->rx.unicast.num =
8663 		srcobj->rx.to_stack.num -
8664 				(srcobj->rx.multicast.num);
8665 	srcobj->rx.unicast.bytes =
8666 		srcobj->rx.to_stack.bytes -
8667 				(srcobj->rx.multicast.bytes);
8668 
8669 	tgtobj->stats.rx.unicast.num += srcobj->rx.unicast.num;
8670 	tgtobj->stats.rx.unicast.bytes += srcobj->rx.unicast.bytes;
8671 	tgtobj->stats.rx.multicast.num += srcobj->rx.multicast.num;
8672 	tgtobj->stats.rx.multicast.bytes += srcobj->rx.multicast.bytes;
8673 	tgtobj->stats.rx.bcast.num += srcobj->rx.bcast.num;
8674 	tgtobj->stats.rx.bcast.bytes += srcobj->rx.bcast.bytes;
8675 	tgtobj->stats.rx.raw.num += srcobj->rx.raw.num;
8676 	tgtobj->stats.rx.raw.bytes += srcobj->rx.raw.bytes;
8677 	tgtobj->stats.rx.intra_bss.pkts.num +=
8678 			srcobj->rx.intra_bss.pkts.num;
8679 	tgtobj->stats.rx.intra_bss.pkts.bytes +=
8680 			srcobj->rx.intra_bss.pkts.bytes;
8681 	tgtobj->stats.rx.intra_bss.fail.num +=
8682 			srcobj->rx.intra_bss.fail.num;
8683 	tgtobj->stats.rx.intra_bss.fail.bytes +=
8684 			srcobj->rx.intra_bss.fail.bytes;
8685 
8686 	tgtobj->stats.tx.last_ack_rssi =
8687 		srcobj->tx.last_ack_rssi;
8688 	tgtobj->stats.rx.mec_drop.num += srcobj->rx.mec_drop.num;
8689 	tgtobj->stats.rx.mec_drop.bytes += srcobj->rx.mec_drop.bytes;
8690 	tgtobj->stats.rx.multipass_rx_pkt_drop +=
8691 		srcobj->rx.multipass_rx_pkt_drop;
8692 	tgtobj->stats.rx.peer_unauth_rx_pkt_drop +=
8693 		srcobj->rx.peer_unauth_rx_pkt_drop;
8694 	tgtobj->stats.rx.policy_check_drop +=
8695 		srcobj->rx.policy_check_drop;
8696 
8697 	for (mu_type = 0 ; mu_type < TXRX_TYPE_MU_MAX; mu_type++) {
8698 		tgtobj->stats.rx.rx_mu[mu_type].mpdu_cnt_fcs_ok +=
8699 			srcobj->rx.rx_mu[mu_type].mpdu_cnt_fcs_ok;
8700 		tgtobj->stats.rx.rx_mu[mu_type].mpdu_cnt_fcs_err +=
8701 			srcobj->rx.rx_mu[mu_type].mpdu_cnt_fcs_err;
8702 		for (i = 0; i < SS_COUNT; i++)
8703 			tgtobj->stats.rx.rx_mu[mu_type].ppdu_nss[i] +=
8704 				srcobj->rx.rx_mu[mu_type].ppdu_nss[i];
8705 		for (i = 0; i < MAX_MCS; i++)
8706 			tgtobj->stats.rx.rx_mu[mu_type].ppdu.mcs_count[i] +=
8707 				srcobj->rx.rx_mu[mu_type].ppdu.mcs_count[i];
8708 	}
8709 
8710 	for (i = 0; i < MAX_MCS; i++) {
8711 		tgtobj->stats.rx.su_ax_ppdu_cnt.mcs_count[i] +=
8712 			srcobj->rx.su_ax_ppdu_cnt.mcs_count[i];
8713 		tgtobj->stats.rx.rx_mpdu_cnt[i] += srcobj->rx.rx_mpdu_cnt[i];
8714 	}
8715 
8716 	tgtobj->stats.rx.mpdu_cnt_fcs_ok += srcobj->rx.mpdu_cnt_fcs_ok;
8717 	tgtobj->stats.rx.mpdu_cnt_fcs_err += srcobj->rx.mpdu_cnt_fcs_err;
8718 	tgtobj->stats.rx.rx_mpdus += srcobj->rx.rx_mpdus;
8719 	tgtobj->stats.rx.rx_ppdus += srcobj->rx.rx_ppdus;
8720 	tgtobj->stats.rx.mpdu_retry_cnt += srcobj->rx.mpdu_retry_cnt;
8721 	tgtobj->stats.rx.rx_retries += srcobj->rx.rx_retries;
8722 
8723 	DP_UPDATE_11BE_STATS(pdev_stats, srcobj);
8724 }
8725 
8726 void dp_update_vdev_ingress_stats(struct dp_vdev *tgtobj)
8727 {
8728 	tgtobj->stats.tx_i.dropped.dropped_pkt.num =
8729 		tgtobj->stats.tx_i.dropped.dma_error +
8730 		tgtobj->stats.tx_i.dropped.ring_full +
8731 		tgtobj->stats.tx_i.dropped.enqueue_fail +
8732 		tgtobj->stats.tx_i.dropped.fail_per_pkt_vdev_id_check +
8733 		tgtobj->stats.tx_i.dropped.desc_na.num +
8734 		tgtobj->stats.tx_i.dropped.res_full +
8735 		tgtobj->stats.tx_i.dropped.drop_ingress +
8736 		tgtobj->stats.tx_i.dropped.headroom_insufficient +
8737 		tgtobj->stats.tx_i.dropped.invalid_peer_id_in_exc_path;
8738 }
8739 
8740 void dp_update_vdev_rate_stats(struct cdp_vdev_stats *tgtobj,
8741 			       struct cdp_vdev_stats *srcobj)
8742 {
8743 	tgtobj->tx.last_tx_rate = srcobj->tx.last_tx_rate;
8744 	tgtobj->tx.last_tx_rate_mcs = srcobj->tx.last_tx_rate_mcs;
8745 	tgtobj->tx.mcast_last_tx_rate = srcobj->tx.mcast_last_tx_rate;
8746 	tgtobj->tx.mcast_last_tx_rate_mcs = srcobj->tx.mcast_last_tx_rate_mcs;
8747 	tgtobj->rx.last_rx_rate = srcobj->rx.last_rx_rate;
8748 }
8749 
8750 void dp_update_pdev_ingress_stats(struct dp_pdev *tgtobj,
8751 				  struct dp_vdev *srcobj)
8752 {
8753 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.nawds_mcast);
8754 
8755 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.rcvd);
8756 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_in_fast_xmit_flow);
8757 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_per_core[0]);
8758 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_per_core[1]);
8759 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_per_core[2]);
8760 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_per_core[3]);
8761 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.processed);
8762 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.reinject_pkts);
8763 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.inspect_pkts);
8764 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.raw.raw_pkt);
8765 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.raw.dma_map_error);
8766 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.raw.num_frags_overflow_err);
8767 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.sg.dropped_host.num);
8768 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.sg.dropped_target);
8769 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.sg.sg_pkt);
8770 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.mcast_en.mcast_pkt);
8771 	DP_STATS_AGGR(tgtobj, srcobj,
8772 		      tx_i.mcast_en.dropped_map_error);
8773 	DP_STATS_AGGR(tgtobj, srcobj,
8774 		      tx_i.mcast_en.dropped_self_mac);
8775 	DP_STATS_AGGR(tgtobj, srcobj,
8776 		      tx_i.mcast_en.dropped_send_fail);
8777 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.mcast_en.ucast);
8778 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.igmp_mcast_en.igmp_rcvd);
8779 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.igmp_mcast_en.igmp_ucast_converted);
8780 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.dma_error);
8781 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.ring_full);
8782 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.enqueue_fail);
8783 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.fail_per_pkt_vdev_id_check);
8784 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.desc_na.num);
8785 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.res_full);
8786 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.drop_ingress);
8787 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.headroom_insufficient);
8788 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.invalid_peer_id_in_exc_path);
8789 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.cce_classified);
8790 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.cce_classified_raw);
8791 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.sniffer_rcvd);
8792 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.mesh.exception_fw);
8793 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.mesh.completion_fw);
8794 
8795 	DP_STATS_AGGR_PKT(tgtobj, srcobj, rx_i.reo_rcvd_pkt);
8796 	DP_STATS_AGGR_PKT(tgtobj, srcobj, rx_i.null_q_desc_pkt);
8797 	DP_STATS_AGGR_PKT(tgtobj, srcobj, rx_i.routed_eapol_pkt);
8798 
8799 	tgtobj->stats.tx_i.dropped.dropped_pkt.num =
8800 		tgtobj->stats.tx_i.dropped.dma_error +
8801 		tgtobj->stats.tx_i.dropped.ring_full +
8802 		tgtobj->stats.tx_i.dropped.enqueue_fail +
8803 		tgtobj->stats.tx_i.dropped.fail_per_pkt_vdev_id_check +
8804 		tgtobj->stats.tx_i.dropped.desc_na.num +
8805 		tgtobj->stats.tx_i.dropped.res_full +
8806 		tgtobj->stats.tx_i.dropped.drop_ingress +
8807 		tgtobj->stats.tx_i.dropped.headroom_insufficient +
8808 		tgtobj->stats.tx_i.dropped.invalid_peer_id_in_exc_path;
8809 }
8810 
8811 QDF_STATUS dp_txrx_get_soc_stats(struct cdp_soc_t *soc_hdl,
8812 				 struct cdp_soc_stats *soc_stats)
8813 {
8814 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
8815 	uint8_t inx;
8816 	uint8_t cpus;
8817 
8818 	/* soc tx stats */
8819 	soc_stats->tx.egress = soc->stats.tx.egress[0];
8820 	soc_stats->tx.tx_invalid_peer = soc->stats.tx.tx_invalid_peer;
8821 	for (inx = 0; inx < CDP_MAX_TX_DATA_RINGS; inx++) {
8822 		soc_stats->tx.tx_hw_enq[inx] = soc->stats.tx.tcl_enq[inx];
8823 		soc_stats->tx.tx_hw_ring_full[inx] =
8824 					soc->stats.tx.tcl_ring_full[inx];
8825 	}
8826 	soc_stats->tx.desc_in_use = soc->stats.tx.desc_in_use;
8827 	soc_stats->tx.dropped_fw_removed = soc->stats.tx.dropped_fw_removed;
8828 	soc_stats->tx.invalid_release_source =
8829 					soc->stats.tx.invalid_release_source;
8830 	for (inx = 0; inx < CDP_MAX_WIFI_INT_ERROR_REASONS; inx++)
8831 		soc_stats->tx.wifi_internal_error[inx] =
8832 					soc->stats.tx.wbm_internal_error[inx];
8833 	soc_stats->tx.non_wifi_internal_err =
8834 					soc->stats.tx.non_wbm_internal_err;
8835 	soc_stats->tx.tx_comp_loop_pkt_limit_hit =
8836 				soc->stats.tx.tx_comp_loop_pkt_limit_hit;
8837 	soc_stats->tx.hp_oos2 = soc->stats.tx.hp_oos2;
8838 	soc_stats->tx.tx_comp_exception = soc->stats.tx.tx_comp_exception;
8839 	/* soc rx stats */
8840 	soc_stats->rx.ingress = soc->stats.rx.ingress;
8841 	soc_stats->rx.err_ring_pkts = soc->stats.rx.err_ring_pkts;
8842 	soc_stats->rx.rx_frags = soc->stats.rx.rx_frags;
8843 	soc_stats->rx.rx_hw_reinject = soc->stats.rx.reo_reinject;
8844 	soc_stats->rx.bar_frame = soc->stats.rx.bar_frame;
8845 	soc_stats->rx.rx_frag_err_len_error =
8846 					soc->stats.rx.rx_frag_err_len_error;
8847 	soc_stats->rx.rx_frag_err_no_peer = soc->stats.rx.rx_frag_err_no_peer;
8848 	soc_stats->rx.rx_frag_wait = soc->stats.rx.rx_frag_wait;
8849 	soc_stats->rx.rx_frag_err = soc->stats.rx.rx_frag_err;
8850 	soc_stats->rx.rx_frag_oor = soc->stats.rx.rx_frag_oor;
8851 	soc_stats->rx.reap_loop_pkt_limit_hit =
8852 					soc->stats.rx.reap_loop_pkt_limit_hit;
8853 	soc_stats->rx.hp_oos2 = soc->stats.rx.hp_oos2;
8854 	soc_stats->rx.near_full = soc->stats.rx.near_full;
8855 	soc_stats->rx.msdu_scatter_wait_break =
8856 					soc->stats.rx.msdu_scatter_wait_break;
8857 	soc_stats->rx.rx_sw_route_drop = soc->stats.rx.rxdma2rel_route_drop;
8858 	soc_stats->rx.rx_hw_route_drop = soc->stats.rx.reo2rel_route_drop;
8859 	soc_stats->rx.rx_packets.num_cpus = qdf_min((uint32_t)CDP_NR_CPUS,
8860 						    num_possible_cpus());
8861 	for (cpus = 0; cpus < soc_stats->rx.rx_packets.num_cpus; cpus++) {
8862 		for (inx = 0; inx < CDP_MAX_RX_DEST_RINGS; inx++)
8863 			soc_stats->rx.rx_packets.pkts[cpus][inx] =
8864 					soc->stats.rx.ring_packets[cpus][inx];
8865 	}
8866 	soc_stats->rx.err.rx_rejected = soc->stats.rx.err.rejected;
8867 	soc_stats->rx.err.rx_raw_frm_drop = soc->stats.rx.err.raw_frm_drop;
8868 	soc_stats->rx.err.phy_ring_access_fail =
8869 					soc->stats.rx.err.hal_ring_access_fail;
8870 	soc_stats->rx.err.phy_ring_access_full_fail =
8871 				soc->stats.rx.err.hal_ring_access_full_fail;
8872 	for (inx = 0; inx < CDP_MAX_RX_DEST_RINGS; inx++)
8873 		soc_stats->rx.err.phy_rx_hw_error[inx] =
8874 					soc->stats.rx.err.hal_reo_error[inx];
8875 	soc_stats->rx.err.phy_rx_hw_dest_dup =
8876 					soc->stats.rx.err.hal_reo_dest_dup;
8877 	soc_stats->rx.err.phy_wifi_rel_dup = soc->stats.rx.err.hal_wbm_rel_dup;
8878 	soc_stats->rx.err.phy_rx_sw_err_dup =
8879 					soc->stats.rx.err.hal_rxdma_err_dup;
8880 	soc_stats->rx.err.invalid_rbm = soc->stats.rx.err.invalid_rbm;
8881 	soc_stats->rx.err.invalid_vdev = soc->stats.rx.err.invalid_vdev;
8882 	soc_stats->rx.err.invalid_pdev = soc->stats.rx.err.invalid_pdev;
8883 	soc_stats->rx.err.pkt_delivered_no_peer =
8884 					soc->stats.rx.err.pkt_delivered_no_peer;
8885 	soc_stats->rx.err.defrag_peer_uninit =
8886 					soc->stats.rx.err.defrag_peer_uninit;
8887 	soc_stats->rx.err.invalid_sa_da_idx =
8888 					soc->stats.rx.err.invalid_sa_da_idx;
8889 	soc_stats->rx.err.msdu_done_fail = soc->stats.rx.err.msdu_done_fail;
8890 	soc_stats->rx.err.rx_invalid_peer = soc->stats.rx.err.rx_invalid_peer;
8891 	soc_stats->rx.err.rx_invalid_peer_id =
8892 					soc->stats.rx.err.rx_invalid_peer_id;
8893 	soc_stats->rx.err.rx_invalid_pkt_len =
8894 					soc->stats.rx.err.rx_invalid_pkt_len;
8895 	for (inx = 0; inx < qdf_min((uint32_t)CDP_WIFI_ERR_MAX,
8896 				    (uint32_t)HAL_RXDMA_ERR_MAX); inx++)
8897 		soc_stats->rx.err.rx_sw_error[inx] =
8898 					soc->stats.rx.err.rxdma_error[inx];
8899 	for (inx = 0; inx < qdf_min((uint32_t)CDP_RX_ERR_MAX,
8900 				    (uint32_t)HAL_REO_ERR_MAX); inx++)
8901 		soc_stats->rx.err.rx_hw_error[inx] =
8902 					soc->stats.rx.err.reo_error[inx];
8903 	soc_stats->rx.err.rx_desc_invalid_magic =
8904 					soc->stats.rx.err.rx_desc_invalid_magic;
8905 	soc_stats->rx.err.rx_hw_cmd_send_fail =
8906 					soc->stats.rx.err.reo_cmd_send_fail;
8907 	soc_stats->rx.err.rx_hw_cmd_send_drain =
8908 					soc->stats.rx.err.reo_cmd_send_drain;
8909 	soc_stats->rx.err.scatter_msdu = soc->stats.rx.err.scatter_msdu;
8910 	soc_stats->rx.err.invalid_cookie = soc->stats.rx.err.invalid_cookie;
8911 	soc_stats->rx.err.stale_cookie = soc->stats.rx.err.stale_cookie;
8912 	soc_stats->rx.err.rx_2k_jump_delba_sent =
8913 					soc->stats.rx.err.rx_2k_jump_delba_sent;
8914 	soc_stats->rx.err.rx_2k_jump_to_stack =
8915 					soc->stats.rx.err.rx_2k_jump_to_stack;
8916 	soc_stats->rx.err.rx_2k_jump_drop = soc->stats.rx.err.rx_2k_jump_drop;
8917 	soc_stats->rx.err.rx_hw_err_msdu_buf_rcved =
8918 				soc->stats.rx.err.reo_err_msdu_buf_rcved;
8919 	soc_stats->rx.err.rx_hw_err_msdu_buf_invalid_cookie =
8920 			soc->stats.rx.err.reo_err_msdu_buf_invalid_cookie;
8921 	soc_stats->rx.err.rx_hw_err_oor_drop =
8922 					soc->stats.rx.err.reo_err_oor_drop;
8923 	soc_stats->rx.err.rx_hw_err_raw_mpdu_drop =
8924 					soc->stats.rx.err.reo_err_raw_mpdu_drop;
8925 	soc_stats->rx.err.rx_hw_err_oor_to_stack =
8926 					soc->stats.rx.err.reo_err_oor_to_stack;
8927 	soc_stats->rx.err.rx_hw_err_oor_sg_count =
8928 					soc->stats.rx.err.reo_err_oor_sg_count;
8929 	soc_stats->rx.err.msdu_count_mismatch =
8930 					soc->stats.rx.err.msdu_count_mismatch;
8931 	soc_stats->rx.err.invalid_link_cookie =
8932 					soc->stats.rx.err.invalid_link_cookie;
8933 	soc_stats->rx.err.nbuf_sanity_fail = soc->stats.rx.err.nbuf_sanity_fail;
8934 	soc_stats->rx.err.dup_refill_link_desc =
8935 					soc->stats.rx.err.dup_refill_link_desc;
8936 	soc_stats->rx.err.msdu_continuation_err =
8937 					soc->stats.rx.err.msdu_continuation_err;
8938 	soc_stats->rx.err.ssn_update_count = soc->stats.rx.err.ssn_update_count;
8939 	soc_stats->rx.err.bar_handle_fail_count =
8940 					soc->stats.rx.err.bar_handle_fail_count;
8941 	soc_stats->rx.err.intrabss_eapol_drop =
8942 					soc->stats.rx.err.intrabss_eapol_drop;
8943 	soc_stats->rx.err.pn_in_dest_check_fail =
8944 					soc->stats.rx.err.pn_in_dest_check_fail;
8945 	soc_stats->rx.err.msdu_len_err = soc->stats.rx.err.msdu_len_err;
8946 	soc_stats->rx.err.rx_flush_count = soc->stats.rx.err.rx_flush_count;
8947 	/* soc ast stats */
8948 	soc_stats->ast.added = soc->stats.ast.added;
8949 	soc_stats->ast.deleted = soc->stats.ast.deleted;
8950 	soc_stats->ast.aged_out = soc->stats.ast.aged_out;
8951 	soc_stats->ast.map_err = soc->stats.ast.map_err;
8952 	soc_stats->ast.ast_mismatch = soc->stats.ast.ast_mismatch;
8953 	/* soc mec stats */
8954 	soc_stats->mec.added = soc->stats.mec.added;
8955 	soc_stats->mec.deleted = soc->stats.mec.deleted;
8956 
8957 	return QDF_STATUS_SUCCESS;
8958 }
8959 
8960 #ifdef QCA_PEER_EXT_STATS
8961 QDF_STATUS
8962 dp_txrx_get_peer_delay_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
8963 			     uint8_t *peer_mac,
8964 			     struct cdp_delay_tid_stats *delay_stats)
8965 {
8966 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
8967 	struct dp_peer *peer = dp_peer_find_hash_find(soc, peer_mac, 0, vdev_id,
8968 						      DP_MOD_ID_CDP);
8969 	struct dp_peer_delay_stats *pext_stats;
8970 	struct cdp_delay_rx_stats *rx_delay;
8971 	struct cdp_delay_tx_stats *tx_delay;
8972 	uint8_t tid;
8973 
8974 	if (!peer)
8975 		return QDF_STATUS_E_FAILURE;
8976 
8977 	if (!wlan_cfg_is_peer_ext_stats_enabled(soc->wlan_cfg_ctx)) {
8978 		dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
8979 		return QDF_STATUS_E_FAILURE;
8980 	}
8981 
8982 	if (!peer->txrx_peer) {
8983 		dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
8984 		return QDF_STATUS_E_FAILURE;
8985 	}
8986 
8987 	pext_stats = peer->txrx_peer->delay_stats;
8988 	if (!pext_stats) {
8989 		dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
8990 		return QDF_STATUS_E_FAILURE;
8991 	}
8992 
8993 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
8994 		rx_delay = &delay_stats[tid].rx_delay;
8995 		dp_accumulate_delay_tid_stats(soc, pext_stats->delay_tid_stats,
8996 					      &rx_delay->to_stack_delay, tid,
8997 					      CDP_HIST_TYPE_REAP_STACK);
8998 		tx_delay = &delay_stats[tid].tx_delay;
8999 		dp_accumulate_delay_avg_stats(pext_stats->delay_tid_stats,
9000 					      tx_delay,
9001 					      tid);
9002 		dp_accumulate_delay_tid_stats(soc, pext_stats->delay_tid_stats,
9003 					      &tx_delay->tx_swq_delay, tid,
9004 					      CDP_HIST_TYPE_SW_ENQEUE_DELAY);
9005 		dp_accumulate_delay_tid_stats(soc, pext_stats->delay_tid_stats,
9006 					      &tx_delay->hwtx_delay, tid,
9007 					      CDP_HIST_TYPE_HW_COMP_DELAY);
9008 	}
9009 	dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
9010 
9011 	return QDF_STATUS_SUCCESS;
9012 }
9013 #else
9014 QDF_STATUS
9015 dp_txrx_get_peer_delay_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
9016 			     uint8_t *peer_mac,
9017 			     struct cdp_delay_tid_stats *delay_stats)
9018 {
9019 	return QDF_STATUS_E_FAILURE;
9020 }
9021 #endif /* QCA_PEER_EXT_STATS */
9022 
9023 #ifdef WLAN_PEER_JITTER
9024 QDF_STATUS
9025 dp_txrx_get_peer_jitter_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
9026 			      uint8_t vdev_id, uint8_t *peer_mac,
9027 			      struct cdp_peer_tid_stats *tid_stats)
9028 {
9029 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9030 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
9031 	struct dp_peer *peer;
9032 	uint8_t tid;
9033 
9034 	if (!pdev)
9035 		return QDF_STATUS_E_FAILURE;
9036 
9037 	if (!wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx))
9038 		return QDF_STATUS_E_FAILURE;
9039 
9040 	peer = dp_peer_find_hash_find(soc, peer_mac, 0, vdev_id, DP_MOD_ID_CDP);
9041 	if (!peer)
9042 		return QDF_STATUS_E_FAILURE;
9043 
9044 	if (!peer->txrx_peer || !peer->txrx_peer->jitter_stats) {
9045 		dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
9046 		return QDF_STATUS_E_FAILURE;
9047 	}
9048 
9049 	for (tid = 0; tid < qdf_min(CDP_DATA_TID_MAX, DP_MAX_TIDS); tid++) {
9050 		struct cdp_peer_tid_stats *rx_tid =
9051 					&peer->txrx_peer->jitter_stats[tid];
9052 
9053 		tid_stats[tid].tx_avg_jitter = rx_tid->tx_avg_jitter;
9054 		tid_stats[tid].tx_avg_delay = rx_tid->tx_avg_delay;
9055 		tid_stats[tid].tx_avg_err = rx_tid->tx_avg_err;
9056 		tid_stats[tid].tx_total_success = rx_tid->tx_total_success;
9057 		tid_stats[tid].tx_drop = rx_tid->tx_drop;
9058 	}
9059 	dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
9060 
9061 	return QDF_STATUS_SUCCESS;
9062 }
9063 #else
9064 QDF_STATUS
9065 dp_txrx_get_peer_jitter_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
9066 			      uint8_t vdev_id, uint8_t *peer_mac,
9067 			      struct cdp_peer_tid_stats *tid_stats)
9068 {
9069 	return QDF_STATUS_E_FAILURE;
9070 }
9071 #endif /* WLAN_PEER_JITTER */
9072 
9073 #ifdef WLAN_TX_PKT_CAPTURE_ENH
9074 QDF_STATUS
9075 dp_peer_get_tx_capture_stats(struct cdp_soc_t *soc_hdl,
9076 			     uint8_t vdev_id, uint8_t *peer_mac,
9077 			     struct cdp_peer_tx_capture_stats *stats)
9078 {
9079 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9080 	struct dp_peer *peer = dp_peer_find_hash_find(soc, peer_mac, 0, vdev_id,
9081 						      DP_MOD_ID_TX_CAPTURE);
9082 	QDF_STATUS status;
9083 
9084 	if (!peer)
9085 		return QDF_STATUS_E_FAILURE;
9086 
9087 	status = dp_monitor_peer_tx_capture_get_stats(soc, peer, stats);
9088 	dp_peer_unref_delete(peer, DP_MOD_ID_TX_CAPTURE);
9089 
9090 	return status;
9091 }
9092 
9093 QDF_STATUS
9094 dp_pdev_get_tx_capture_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
9095 			     struct cdp_pdev_tx_capture_stats *stats)
9096 {
9097 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9098 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
9099 
9100 	if (!pdev)
9101 		return QDF_STATUS_E_FAILURE;
9102 
9103 	return dp_monitor_pdev_tx_capture_get_stats(soc, pdev, stats);
9104 }
9105 #else /* WLAN_TX_PKT_CAPTURE_ENH */
9106 QDF_STATUS
9107 dp_peer_get_tx_capture_stats(struct cdp_soc_t *soc_hdl,
9108 			     uint8_t vdev_id, uint8_t *peer_mac,
9109 			     struct cdp_peer_tx_capture_stats *stats)
9110 {
9111 	return QDF_STATUS_E_FAILURE;
9112 }
9113 
9114 QDF_STATUS
9115 dp_pdev_get_tx_capture_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
9116 			     struct cdp_pdev_tx_capture_stats *stats)
9117 {
9118 	return QDF_STATUS_E_FAILURE;
9119 }
9120 #endif /* WLAN_TX_PKT_CAPTURE_ENH */
9121 
9122 #ifdef WLAN_TELEMETRY_STATS_SUPPORT
9123 QDF_STATUS
9124 dp_get_pdev_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
9125 			    struct cdp_pdev_telemetry_stats *stats)
9126 {
9127 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9128 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
9129 	uint8_t ac = 0;
9130 
9131 	if (!pdev)
9132 		return QDF_STATUS_E_FAILURE;
9133 
9134 	/* consumption is in micro seconds, convert it to seconds and
9135 	 * then calculate %age per sec
9136 	 */
9137 	for (ac = 0; ac < WME_AC_MAX; ac++)
9138 		stats->link_airtime[ac] =
9139 			((pdev->stats.telemetry_stats.link_airtime[ac] * 100) / 1000000);
9140 	stats->tx_mpdu_failed = pdev->stats.telemetry_stats.tx_mpdu_failed;
9141 	stats->tx_mpdu_total = pdev->stats.telemetry_stats.tx_mpdu_total;
9142 
9143 	return QDF_STATUS_SUCCESS;
9144 }
9145 
9146 QDF_STATUS
9147 dp_get_peer_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t *addr,
9148 			    struct cdp_peer_telemetry_stats *stats)
9149 {
9150 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9151 	struct dp_peer *peer = dp_peer_find_hash_find(soc, addr, 0, DP_VDEV_ALL,
9152 						      DP_MOD_ID_MISC);
9153 
9154 	if (!peer)
9155 		return QDF_STATUS_E_FAILURE;
9156 
9157 	dp_monitor_peer_telemetry_stats(peer, stats);
9158 	dp_peer_unref_delete(peer, DP_MOD_ID_MISC);
9159 
9160 	return QDF_STATUS_SUCCESS;
9161 }
9162 #endif
9163