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