xref: /wlan-dirver/qca-wifi-host-cmn/dp/wifi3.0/dp_stats.c (revision d3be64a66deb873bac895fb0ecea12cbfca02017)
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 500
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_mgmt_subtype[DP_MAX_STRING_LEN];
4148 	char fw_ring_ctrl_subtype[DP_MAX_STRING_LEN];
4149 
4150 	DP_PRINT_STATS("HTT_RX_PDEV_FW_STATS_TLV:");
4151 	DP_PRINT_STATS("mac_id__word = %u",
4152 		       dp_stats_buf->mac_id__word);
4153 	DP_PRINT_STATS("ppdu_recvd = %u",
4154 		       dp_stats_buf->ppdu_recvd);
4155 	DP_PRINT_STATS("mpdu_cnt_fcs_ok = %u",
4156 		       dp_stats_buf->mpdu_cnt_fcs_ok);
4157 	DP_PRINT_STATS("mpdu_cnt_fcs_err = %u",
4158 		       dp_stats_buf->mpdu_cnt_fcs_err);
4159 	DP_PRINT_STATS("tcp_msdu_cnt = %u",
4160 		       dp_stats_buf->tcp_msdu_cnt);
4161 	DP_PRINT_STATS("tcp_ack_msdu_cnt = %u",
4162 		       dp_stats_buf->tcp_ack_msdu_cnt);
4163 	DP_PRINT_STATS("udp_msdu_cnt = %u",
4164 		       dp_stats_buf->udp_msdu_cnt);
4165 	DP_PRINT_STATS("other_msdu_cnt = %u",
4166 		       dp_stats_buf->other_msdu_cnt);
4167 	DP_PRINT_STATS("fw_ring_mpdu_ind = %u",
4168 		       dp_stats_buf->fw_ring_mpdu_ind);
4169 
4170 	for (i = 0; i <  DP_HTT_FW_RING_MGMT_SUBTYPE_LEN; i++) {
4171 		index += qdf_snprint(&fw_ring_mgmt_subtype[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_mgmt_subtype);
4177 
4178 	index = 0;
4179 	for (i = 0; i <  DP_HTT_FW_RING_CTRL_SUBTYPE_LEN; i++) {
4180 		index += qdf_snprint(&fw_ring_ctrl_subtype[index],
4181 				DP_MAX_STRING_LEN - index,
4182 				" %u:%u,", i,
4183 				dp_stats_buf->fw_ring_ctrl_subtype[i]);
4184 	}
4185 	DP_PRINT_STATS("fw_ring_ctrl_subtype = %s ", fw_ring_ctrl_subtype);
4186 	DP_PRINT_STATS("fw_ring_mcast_data_msdu = %u",
4187 		       dp_stats_buf->fw_ring_mcast_data_msdu);
4188 	DP_PRINT_STATS("fw_ring_bcast_data_msdu = %u",
4189 		       dp_stats_buf->fw_ring_bcast_data_msdu);
4190 	DP_PRINT_STATS("fw_ring_ucast_data_msdu = %u",
4191 		       dp_stats_buf->fw_ring_ucast_data_msdu);
4192 	DP_PRINT_STATS("fw_ring_null_data_msdu = %u",
4193 		       dp_stats_buf->fw_ring_null_data_msdu);
4194 	DP_PRINT_STATS("fw_ring_mpdu_drop = %u",
4195 		       dp_stats_buf->fw_ring_mpdu_drop);
4196 	DP_PRINT_STATS("ofld_local_data_ind_cnt = %u",
4197 		       dp_stats_buf->ofld_local_data_ind_cnt);
4198 	DP_PRINT_STATS("ofld_local_data_buf_recycle_cnt = %u",
4199 		       dp_stats_buf->ofld_local_data_buf_recycle_cnt);
4200 	DP_PRINT_STATS("drx_local_data_ind_cnt = %u",
4201 		       dp_stats_buf->drx_local_data_ind_cnt);
4202 	DP_PRINT_STATS("drx_local_data_buf_recycle_cnt = %u",
4203 		       dp_stats_buf->drx_local_data_buf_recycle_cnt);
4204 	DP_PRINT_STATS("local_nondata_ind_cnt = %u",
4205 		       dp_stats_buf->local_nondata_ind_cnt);
4206 	DP_PRINT_STATS("local_nondata_buf_recycle_cnt = %u",
4207 		       dp_stats_buf->local_nondata_buf_recycle_cnt);
4208 	DP_PRINT_STATS("fw_status_buf_ring_refill_cnt = %u",
4209 		       dp_stats_buf->fw_status_buf_ring_refill_cnt);
4210 	DP_PRINT_STATS("fw_status_buf_ring_empty_cnt = %u",
4211 		       dp_stats_buf->fw_status_buf_ring_empty_cnt);
4212 	DP_PRINT_STATS("fw_pkt_buf_ring_refill_cnt = %u",
4213 		       dp_stats_buf->fw_pkt_buf_ring_refill_cnt);
4214 	DP_PRINT_STATS("fw_pkt_buf_ring_empty_cnt = %u",
4215 		       dp_stats_buf->fw_pkt_buf_ring_empty_cnt);
4216 	DP_PRINT_STATS("fw_link_buf_ring_refill_cnt = %u",
4217 		       dp_stats_buf->fw_link_buf_ring_refill_cnt);
4218 	DP_PRINT_STATS("fw_link_buf_ring_empty_cnt = %u",
4219 		       dp_stats_buf->fw_link_buf_ring_empty_cnt);
4220 	DP_PRINT_STATS("host_pkt_buf_ring_refill_cnt = %u",
4221 		       dp_stats_buf->host_pkt_buf_ring_refill_cnt);
4222 	DP_PRINT_STATS("host_pkt_buf_ring_empty_cnt = %u",
4223 		       dp_stats_buf->host_pkt_buf_ring_empty_cnt);
4224 	DP_PRINT_STATS("mon_pkt_buf_ring_refill_cnt = %u",
4225 		       dp_stats_buf->mon_pkt_buf_ring_refill_cnt);
4226 	DP_PRINT_STATS("mon_pkt_buf_ring_empty_cnt = %u",
4227 		       dp_stats_buf->mon_pkt_buf_ring_empty_cnt);
4228 	DP_PRINT_STATS("mon_status_buf_ring_refill_cnt = %u",
4229 		       dp_stats_buf->mon_status_buf_ring_refill_cnt);
4230 	DP_PRINT_STATS("mon_status_buf_ring_empty_cnt = %u",
4231 		       dp_stats_buf->mon_status_buf_ring_empty_cnt);
4232 	DP_PRINT_STATS("mon_desc_buf_ring_refill_cnt = %u",
4233 		       dp_stats_buf->mon_desc_buf_ring_refill_cnt);
4234 	DP_PRINT_STATS("mon_desc_buf_ring_empty_cnt = %u",
4235 		       dp_stats_buf->mon_desc_buf_ring_empty_cnt);
4236 	DP_PRINT_STATS("mon_dest_ring_update_cnt = %u",
4237 		       dp_stats_buf->mon_dest_ring_update_cnt);
4238 	DP_PRINT_STATS("mon_dest_ring_full_cnt = %u",
4239 		       dp_stats_buf->mon_dest_ring_full_cnt);
4240 	DP_PRINT_STATS("rx_suspend_cnt = %u",
4241 		       dp_stats_buf->rx_suspend_cnt);
4242 	DP_PRINT_STATS("rx_suspend_fail_cnt = %u",
4243 		       dp_stats_buf->rx_suspend_fail_cnt);
4244 	DP_PRINT_STATS("rx_resume_cnt = %u",
4245 		       dp_stats_buf->rx_resume_cnt);
4246 	DP_PRINT_STATS("rx_resume_fail_cnt = %u",
4247 		       dp_stats_buf->rx_resume_fail_cnt);
4248 	DP_PRINT_STATS("rx_ring_switch_cnt = %u",
4249 		       dp_stats_buf->rx_ring_switch_cnt);
4250 	DP_PRINT_STATS("rx_ring_restore_cnt = %u",
4251 		       dp_stats_buf->rx_ring_restore_cnt);
4252 	DP_PRINT_STATS("rx_flush_cnt = %u\n",
4253 		       dp_stats_buf->rx_flush_cnt);
4254 }
4255 
4256 /**
4257  * dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v() - display
4258  *				htt_rx_pdev_fw_ring_mpdu_err_tlv_v
4259  * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_ring_mpdu_err_tlv_v
4260  *
4261  * Return: void
4262  */
4263 static void dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v(uint32_t *tag_buf)
4264 {
4265 	htt_rx_pdev_fw_ring_mpdu_err_tlv_v *dp_stats_buf =
4266 		(htt_rx_pdev_fw_ring_mpdu_err_tlv_v *)tag_buf;
4267 	uint8_t i;
4268 	uint16_t index = 0;
4269 	char *fw_ring_mpdu_err = qdf_mem_malloc(DP_MAX_STRING_LEN);
4270 
4271 	if (!fw_ring_mpdu_err) {
4272 		dp_stats_err("Output buffer not allocated");
4273 		return;
4274 	}
4275 
4276 	DP_PRINT_STATS("HTT_RX_PDEV_FW_RING_MPDU_ERR_TLV_V:");
4277 	for (i = 0; i <  DP_HTT_FW_RING_MPDU_ERR_LEN; i++) {
4278 		index += qdf_snprint(&fw_ring_mpdu_err[index],
4279 				DP_MAX_STRING_LEN - index,
4280 				" %u:%u,", i,
4281 				dp_stats_buf->fw_ring_mpdu_err[i]);
4282 	}
4283 	DP_PRINT_STATS("fw_ring_mpdu_err = %s\n", fw_ring_mpdu_err);
4284 	qdf_mem_free(fw_ring_mpdu_err);
4285 }
4286 
4287 /**
4288  * dp_print_rx_pdev_fw_mpdu_drop_tlv_v() - display htt_rx_pdev_fw_mpdu_drop_tlv_v
4289  * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_mpdu_drop_tlv_v
4290  *
4291  * Return: void
4292  */
4293 static void dp_print_rx_pdev_fw_mpdu_drop_tlv_v(uint32_t *tag_buf)
4294 {
4295 	htt_rx_pdev_fw_mpdu_drop_tlv_v *dp_stats_buf =
4296 		(htt_rx_pdev_fw_mpdu_drop_tlv_v *)tag_buf;
4297 	uint8_t i;
4298 	uint16_t index = 0;
4299 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
4300 	char *fw_mpdu_drop = qdf_mem_malloc(DP_MAX_STRING_LEN);
4301 
4302 	if (!fw_mpdu_drop) {
4303 		dp_stats_err("Output buffer not allocated");
4304 		return;
4305 	}
4306 
4307 	tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_STATS_FW_DROP_REASON_MAX);
4308 
4309 	DP_PRINT_STATS("HTT_RX_PDEV_FW_MPDU_DROP_TLV_V:");
4310 	for (i = 0; i <  tag_len; i++) {
4311 		index += qdf_snprint(&fw_mpdu_drop[index],
4312 				DP_MAX_STRING_LEN - index,
4313 				" %u:%u,", i, dp_stats_buf->fw_mpdu_drop[i]);
4314 	}
4315 	DP_PRINT_STATS("fw_mpdu_drop = %s\n", fw_mpdu_drop);
4316 	qdf_mem_free(fw_mpdu_drop);
4317 }
4318 
4319 /**
4320  * dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv() - Accounts for rxdma error
4321  * packets
4322  * @tag_buf: Buffer
4323  *
4324  * Return: void
4325  */
4326 static uint64_t
4327 dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv(uint32_t *tag_buf)
4328 {
4329 	htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v *dp_stats_buf =
4330 		(htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v *)tag_buf;
4331 
4332 	uint8_t i;
4333 	uint16_t index = 0;
4334 	char rxdma_err_cnt[DP_MAX_STRING_LEN] = {'\0'};
4335 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
4336 	uint64_t total_rxdma_err_cnt = 0;
4337 
4338 	tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_RXDMA_MAX_ERR_CODE);
4339 
4340 	DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_RXDMA_ERR_TLV_V");
4341 
4342 	for (i = 0; i <  tag_len; i++) {
4343 		index += snprintf(&rxdma_err_cnt[index],
4344 				DP_MAX_STRING_LEN - index,
4345 				" %u() -%u,", i,
4346 				dp_stats_buf->rxdma_err[i]);
4347 		total_rxdma_err_cnt += dp_stats_buf->rxdma_err[i];
4348 	}
4349 
4350 	DP_PRINT_STATS("rxdma_err = %s\n", rxdma_err_cnt);
4351 
4352 	return total_rxdma_err_cnt;
4353 }
4354 
4355 /**
4356  * dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv() - Accounts for reo error
4357  * packets
4358  * @tag_buf: Buffer
4359  *
4360  * Return: void
4361  */
4362 static void dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv(uint32_t *tag_buf)
4363 {
4364 	htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v *dp_stats_buf =
4365 		(htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v *)tag_buf;
4366 
4367 	uint8_t i;
4368 	uint16_t index = 0;
4369 	char reo_err_cnt[DP_MAX_STRING_LEN] = {'\0'};
4370 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
4371 
4372 	tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_REO_MAX_ERR_CODE);
4373 
4374 	DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_REO_ERR_TLV_V");
4375 
4376 	for (i = 0; i <  tag_len; i++) {
4377 		index += snprintf(&reo_err_cnt[index],
4378 				DP_MAX_STRING_LEN - index,
4379 				" %u() -%u,", i,
4380 				dp_stats_buf->reo_err[i]);
4381 	}
4382 
4383 	DP_PRINT_STATS("reo_err = %s\n", reo_err_cnt);
4384 }
4385 
4386 /**
4387  * dp_print_rx_reo_debug_stats_tlv() - REO Statistics
4388  * @tag_buf: Buffer
4389  *
4390  * Return: void
4391  */
4392 static void dp_print_rx_reo_debug_stats_tlv(uint32_t *tag_buf)
4393 {
4394 	htt_rx_reo_resource_stats_tlv_v *dp_stats_buf =
4395 			(htt_rx_reo_resource_stats_tlv_v *)tag_buf;
4396 
4397 	DP_PRINT_STATS("HTT_RX_REO_RESOURCE_STATS_TLV");
4398 
4399 	DP_PRINT_STATS("sample_id() - %u ",
4400 		       dp_stats_buf->sample_id);
4401 	DP_PRINT_STATS("total_max: %u ",
4402 		       dp_stats_buf->total_max);
4403 	DP_PRINT_STATS("total_avg: %u ",
4404 		       dp_stats_buf->total_avg);
4405 	DP_PRINT_STATS("total_sample: %u ",
4406 		       dp_stats_buf->total_sample);
4407 	DP_PRINT_STATS("non_zeros_avg: %u ",
4408 		       dp_stats_buf->non_zeros_avg);
4409 	DP_PRINT_STATS("non_zeros_sample: %u ",
4410 		       dp_stats_buf->non_zeros_sample);
4411 	DP_PRINT_STATS("last_non_zeros_max: %u ",
4412 		       dp_stats_buf->last_non_zeros_max);
4413 	DP_PRINT_STATS("last_non_zeros_min: %u ",
4414 		       dp_stats_buf->last_non_zeros_min);
4415 	DP_PRINT_STATS("last_non_zeros_avg: %u ",
4416 		       dp_stats_buf->last_non_zeros_avg);
4417 	DP_PRINT_STATS("last_non_zeros_sample: %u\n ",
4418 		       dp_stats_buf->last_non_zeros_sample);
4419 }
4420 
4421 /**
4422  * dp_print_rx_pdev_fw_stats_phy_err_tlv() - Accounts for phy errors
4423  * @tag_buf: Buffer
4424  *
4425  * Return: void
4426  */
4427 static void dp_print_rx_pdev_fw_stats_phy_err_tlv(uint32_t *tag_buf)
4428 {
4429 	htt_rx_pdev_fw_stats_phy_err_tlv *dp_stats_buf =
4430 		(htt_rx_pdev_fw_stats_phy_err_tlv *)tag_buf;
4431 
4432 	uint8_t i = 0;
4433 	uint16_t index = 0;
4434 	char phy_errs[DP_MAX_STRING_LEN];
4435 
4436 	DP_PRINT_STATS("HTT_RX_PDEV_FW_STATS_PHY_ERR_TLV");
4437 
4438 	DP_PRINT_STATS("mac_id_word() - %u",
4439 		       dp_stats_buf->mac_id__word);
4440 	DP_PRINT_STATS("total_phy_err_cnt: %u",
4441 		       dp_stats_buf->total_phy_err_cnt);
4442 
4443 	for (i = 0; i < HTT_STATS_PHY_ERR_MAX; i++) {
4444 		index += snprintf(&phy_errs[index],
4445 				DP_MAX_STRING_LEN - index,
4446 				" %u:%u,", i, dp_stats_buf->phy_err[i]);
4447 	}
4448 
4449 	DP_PRINT_STATS("phy_errs: %s\n",  phy_errs);
4450 }
4451 
4452 void dp_htt_stats_print_tag(struct dp_pdev *pdev,
4453 			    uint8_t tag_type, uint32_t *tag_buf)
4454 {
4455 	switch (tag_type) {
4456 	case HTT_STATS_TX_PDEV_CMN_TAG:
4457 		dp_print_tx_pdev_stats_cmn_tlv(tag_buf);
4458 		break;
4459 	case HTT_STATS_TX_PDEV_UNDERRUN_TAG:
4460 		dp_print_tx_pdev_stats_urrn_tlv_v(tag_buf);
4461 		break;
4462 	case HTT_STATS_TX_PDEV_SIFS_TAG:
4463 		dp_print_tx_pdev_stats_sifs_tlv_v(tag_buf);
4464 		break;
4465 	case HTT_STATS_TX_PDEV_FLUSH_TAG:
4466 		dp_print_tx_pdev_stats_flush_tlv_v(tag_buf);
4467 		break;
4468 
4469 	case HTT_STATS_TX_PDEV_PHY_ERR_TAG:
4470 		dp_print_tx_pdev_stats_phy_err_tlv_v(tag_buf);
4471 		break;
4472 
4473 	case HTT_STATS_STRING_TAG:
4474 		dp_print_stats_string_tlv(tag_buf);
4475 		break;
4476 
4477 	case HTT_STATS_TX_HWQ_CMN_TAG:
4478 		dp_print_tx_hwq_stats_cmn_tlv(tag_buf);
4479 		break;
4480 
4481 	case HTT_STATS_TX_HWQ_DIFS_LATENCY_TAG:
4482 		dp_print_tx_hwq_difs_latency_stats_tlv_v(tag_buf);
4483 		break;
4484 
4485 	case HTT_STATS_TX_HWQ_CMD_RESULT_TAG:
4486 		dp_print_tx_hwq_cmd_result_stats_tlv_v(tag_buf);
4487 		break;
4488 
4489 	case HTT_STATS_TX_HWQ_CMD_STALL_TAG:
4490 		dp_print_tx_hwq_cmd_stall_stats_tlv_v(tag_buf);
4491 		break;
4492 
4493 	case HTT_STATS_TX_HWQ_FES_STATUS_TAG:
4494 		dp_print_tx_hwq_fes_result_stats_tlv_v(tag_buf);
4495 		break;
4496 
4497 	case HTT_STATS_TX_TQM_GEN_MPDU_TAG:
4498 		dp_print_tx_tqm_gen_mpdu_stats_tlv_v(tag_buf);
4499 		break;
4500 
4501 	case HTT_STATS_TX_TQM_LIST_MPDU_TAG:
4502 		dp_print_tx_tqm_list_mpdu_stats_tlv_v(tag_buf);
4503 		break;
4504 
4505 	case HTT_STATS_TX_TQM_LIST_MPDU_CNT_TAG:
4506 		dp_print_tx_tqm_list_mpdu_cnt_tlv_v(tag_buf);
4507 		break;
4508 
4509 	case HTT_STATS_TX_TQM_CMN_TAG:
4510 		dp_print_tx_tqm_cmn_stats_tlv(tag_buf);
4511 		break;
4512 
4513 	case HTT_STATS_TX_TQM_PDEV_TAG:
4514 		dp_print_tx_tqm_pdev_stats_tlv_v(tag_buf);
4515 		break;
4516 
4517 	case HTT_STATS_TX_TQM_CMDQ_STATUS_TAG:
4518 		dp_print_tx_tqm_cmdq_status_tlv(tag_buf);
4519 		break;
4520 
4521 	case HTT_STATS_TX_DE_EAPOL_PACKETS_TAG:
4522 		dp_print_tx_de_eapol_packets_stats_tlv(tag_buf);
4523 		break;
4524 
4525 	case HTT_STATS_TX_DE_CLASSIFY_FAILED_TAG:
4526 		dp_print_tx_de_classify_failed_stats_tlv(tag_buf);
4527 		break;
4528 
4529 	case HTT_STATS_TX_DE_CLASSIFY_STATS_TAG:
4530 		dp_print_tx_de_classify_stats_tlv(tag_buf);
4531 		break;
4532 
4533 	case HTT_STATS_TX_DE_CLASSIFY_STATUS_TAG:
4534 		dp_print_tx_de_classify_status_stats_tlv(tag_buf);
4535 		break;
4536 
4537 	case HTT_STATS_TX_DE_ENQUEUE_PACKETS_TAG:
4538 		dp_print_tx_de_enqueue_packets_stats_tlv(tag_buf);
4539 		break;
4540 
4541 	case HTT_STATS_TX_DE_ENQUEUE_DISCARD_TAG:
4542 		dp_print_tx_de_enqueue_discard_stats_tlv(tag_buf);
4543 		break;
4544 
4545 	case HTT_STATS_TX_DE_CMN_TAG:
4546 		dp_print_tx_de_cmn_stats_tlv(tag_buf);
4547 		break;
4548 
4549 	case HTT_STATS_RING_IF_TAG:
4550 		dp_print_ring_if_stats_tlv(tag_buf);
4551 		break;
4552 
4553 	case HTT_STATS_TX_PDEV_MU_MIMO_STATS_TAG:
4554 		dp_print_tx_pdev_mu_mimo_sch_stats_tlv(tag_buf);
4555 		break;
4556 
4557 	case HTT_STATS_SFM_CMN_TAG:
4558 		dp_print_sfm_cmn_tlv(tag_buf);
4559 		break;
4560 
4561 	case HTT_STATS_SRING_STATS_TAG:
4562 		dp_print_sring_stats_tlv(tag_buf);
4563 		break;
4564 
4565 	case HTT_STATS_RX_PDEV_FW_STATS_TAG:
4566 		dp_print_rx_pdev_fw_stats_tlv(tag_buf);
4567 		break;
4568 
4569 	case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG:
4570 		dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v(tag_buf);
4571 		break;
4572 
4573 	case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG:
4574 		dp_print_rx_pdev_fw_mpdu_drop_tlv_v(tag_buf);
4575 		break;
4576 
4577 	case HTT_STATS_RX_SOC_FW_STATS_TAG:
4578 		dp_print_rx_soc_fw_stats_tlv(tag_buf);
4579 		break;
4580 
4581 	case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG:
4582 		dp_print_rx_soc_fw_refill_ring_empty_tlv_v(tag_buf);
4583 		break;
4584 
4585 	case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG:
4586 		dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v(
4587 				tag_buf);
4588 		break;
4589 
4590 	case HTT_STATS_TX_PDEV_RATE_STATS_TAG:
4591 		dp_print_tx_pdev_rate_stats_tlv(tag_buf);
4592 		break;
4593 
4594 	case HTT_STATS_RX_PDEV_RATE_STATS_TAG:
4595 		dp_print_rx_pdev_rate_stats_tlv(pdev, tag_buf);
4596 		break;
4597 
4598 	case HTT_STATS_RX_PDEV_RATE_EXT_STATS_TAG:
4599 		dp_print_rx_pdev_rate_ext_stats_tlv(pdev, tag_buf);
4600 		break;
4601 
4602 	case HTT_STATS_TX_PDEV_SCHEDULER_TXQ_STATS_TAG:
4603 		dp_print_tx_pdev_stats_sched_per_txq_tlv(tag_buf);
4604 		break;
4605 
4606 	case HTT_STATS_TX_SCHED_CMN_TAG:
4607 		dp_print_stats_tx_sched_cmn_tlv(tag_buf);
4608 		break;
4609 
4610 	case HTT_STATS_TX_PDEV_MPDU_STATS_TAG:
4611 		dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv(tag_buf);
4612 		break;
4613 
4614 	case HTT_STATS_SCHED_TXQ_CMD_POSTED_TAG:
4615 		dp_print_sched_txq_cmd_posted_tlv_v(tag_buf);
4616 		break;
4617 
4618 	case HTT_STATS_RING_IF_CMN_TAG:
4619 		dp_print_ring_if_cmn_tlv(tag_buf);
4620 		break;
4621 
4622 	case HTT_STATS_SFM_CLIENT_USER_TAG:
4623 		dp_print_sfm_client_user_tlv_v(tag_buf);
4624 		break;
4625 
4626 	case HTT_STATS_SFM_CLIENT_TAG:
4627 		dp_print_sfm_client_tlv(tag_buf);
4628 		break;
4629 
4630 	case HTT_STATS_TX_TQM_ERROR_STATS_TAG:
4631 		dp_print_tx_tqm_error_stats_tlv(tag_buf);
4632 		break;
4633 
4634 	case HTT_STATS_SCHED_TXQ_CMD_REAPED_TAG:
4635 		dp_print_sched_txq_cmd_reaped_tlv_v(tag_buf);
4636 		break;
4637 
4638 	case HTT_STATS_SRING_CMN_TAG:
4639 		dp_print_sring_cmn_tlv(tag_buf);
4640 		break;
4641 
4642 	case HTT_STATS_TX_SELFGEN_AC_ERR_STATS_TAG:
4643 		dp_print_tx_selfgen_ac_err_stats_tlv(tag_buf);
4644 		break;
4645 
4646 	case HTT_STATS_TX_SELFGEN_CMN_STATS_TAG:
4647 		dp_print_tx_selfgen_cmn_stats_tlv(tag_buf);
4648 		break;
4649 
4650 	case HTT_STATS_TX_SELFGEN_AC_STATS_TAG:
4651 		dp_print_tx_selfgen_ac_stats_tlv(tag_buf);
4652 		break;
4653 
4654 	case HTT_STATS_TX_SELFGEN_AX_STATS_TAG:
4655 		dp_print_tx_selfgen_ax_stats_tlv(tag_buf);
4656 		break;
4657 
4658 	case HTT_STATS_TX_SELFGEN_AX_ERR_STATS_TAG:
4659 		dp_print_tx_selfgen_ax_err_stats_tlv(tag_buf);
4660 		break;
4661 
4662 	case  HTT_STATS_TX_SELFGEN_BE_STATS_TAG:
4663 		dp_print_tx_selfgen_be_stats_tlv(tag_buf);
4664 		break;
4665 
4666 	case HTT_STATS_TX_SELFGEN_BE_ERR_STATS_TAG:
4667 		dp_print_tx_selfgen_be_err_stats_tlv(tag_buf);
4668 		break;
4669 
4670 	case HTT_STATS_TX_SOUNDING_STATS_TAG:
4671 		dp_print_tx_sounding_stats_tlv(tag_buf);
4672 		break;
4673 
4674 	case HTT_STATS_TX_HWQ_MUMIMO_SCH_STATS_TAG:
4675 		dp_print_tx_hwq_mu_mimo_sch_stats_tlv(tag_buf);
4676 		break;
4677 
4678 	case HTT_STATS_TX_HWQ_MUMIMO_MPDU_STATS_TAG:
4679 		dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv(tag_buf);
4680 		break;
4681 
4682 	case HTT_STATS_TX_HWQ_MUMIMO_CMN_STATS_TAG:
4683 		dp_print_tx_hwq_mu_mimo_cmn_stats_tlv(tag_buf);
4684 		break;
4685 
4686 	case HTT_STATS_HW_INTR_MISC_TAG:
4687 		dp_print_hw_stats_intr_misc_tlv(tag_buf);
4688 		break;
4689 
4690 	case HTT_STATS_HW_WD_TIMEOUT_TAG:
4691 		dp_print_hw_stats_wd_timeout_tlv(tag_buf);
4692 		break;
4693 
4694 	case HTT_STATS_HW_PDEV_ERRS_TAG:
4695 		dp_print_hw_stats_pdev_errs_tlv(tag_buf);
4696 		break;
4697 
4698 	case HTT_STATS_COUNTER_NAME_TAG:
4699 		dp_print_counter_tlv(tag_buf);
4700 		break;
4701 
4702 	case HTT_STATS_TX_TID_DETAILS_TAG:
4703 		dp_print_tx_tid_stats_tlv(tag_buf);
4704 		break;
4705 
4706 	case HTT_STATS_TX_TID_DETAILS_V1_TAG:
4707 		dp_print_tx_tid_stats_v1_tlv(tag_buf);
4708 		break;
4709 
4710 	case HTT_STATS_RX_TID_DETAILS_TAG:
4711 		dp_print_rx_tid_stats_tlv(tag_buf);
4712 		break;
4713 
4714 	case HTT_STATS_PEER_STATS_CMN_TAG:
4715 		dp_print_peer_stats_cmn_tlv(tag_buf);
4716 		break;
4717 
4718 	case HTT_STATS_PEER_DETAILS_TAG:
4719 		dp_print_peer_details_tlv(tag_buf);
4720 		break;
4721 
4722 	case HTT_STATS_PEER_MSDU_FLOWQ_TAG:
4723 		dp_print_msdu_flow_stats_tlv(tag_buf);
4724 		break;
4725 
4726 	case HTT_STATS_PEER_TX_RATE_STATS_TAG:
4727 		dp_print_tx_peer_rate_stats_tlv(tag_buf);
4728 		break;
4729 
4730 	case HTT_STATS_PEER_RX_RATE_STATS_TAG:
4731 		dp_print_rx_peer_rate_stats_tlv(tag_buf);
4732 		break;
4733 
4734 	case HTT_STATS_TX_DE_COMPL_STATS_TAG:
4735 		dp_print_tx_de_compl_stats_tlv(tag_buf);
4736 		break;
4737 
4738 	case HTT_STATS_RX_REFILL_RXDMA_ERR_TAG:
4739 		pdev->stats.err.fw_reported_rxdma_error =
4740 		dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv(tag_buf);
4741 		break;
4742 
4743 	case HTT_STATS_RX_REFILL_REO_ERR_TAG:
4744 		dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv(tag_buf);
4745 		break;
4746 
4747 	case HTT_STATS_RX_REO_RESOURCE_STATS_TAG:
4748 		dp_print_rx_reo_debug_stats_tlv(tag_buf);
4749 		break;
4750 
4751 	case HTT_STATS_RX_PDEV_FW_STATS_PHY_ERR_TAG:
4752 		dp_print_rx_pdev_fw_stats_phy_err_tlv(tag_buf);
4753 		break;
4754 
4755 	default:
4756 		break;
4757 	}
4758 }
4759 
4760 void dp_htt_stats_copy_tag(struct dp_pdev *pdev, uint8_t tag_type, uint32_t *tag_buf)
4761 {
4762 	void *dest_ptr = NULL;
4763 	uint32_t size = 0;
4764 	uint32_t size_expected = 0;
4765 	uint64_t val = 1;
4766 
4767 	pdev->fw_stats_tlv_bitmap_rcvd |= (val << tag_type);
4768 	switch (tag_type) {
4769 	case HTT_STATS_TX_PDEV_CMN_TAG:
4770 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.cmn_tlv;
4771 		size = sizeof(htt_tx_pdev_stats_cmn_tlv);
4772 		size_expected = sizeof(struct cdp_htt_tx_pdev_stats_cmn_tlv);
4773 		break;
4774 	case HTT_STATS_TX_PDEV_UNDERRUN_TAG:
4775 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.underrun_tlv;
4776 		size = sizeof(htt_tx_pdev_stats_urrn_tlv_v);
4777 		size_expected = sizeof(struct cdp_htt_tx_pdev_stats_urrn_tlv_v);
4778 		break;
4779 	case HTT_STATS_TX_PDEV_SIFS_TAG:
4780 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.sifs_tlv;
4781 		size = sizeof(htt_tx_pdev_stats_sifs_tlv_v);
4782 		size_expected = sizeof(struct cdp_htt_tx_pdev_stats_sifs_tlv_v);
4783 		break;
4784 	case HTT_STATS_TX_PDEV_FLUSH_TAG:
4785 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.flush_tlv;
4786 		size = sizeof(htt_tx_pdev_stats_flush_tlv_v);
4787 		size_expected =
4788 			sizeof(struct cdp_htt_tx_pdev_stats_flush_tlv_v);
4789 		break;
4790 	case HTT_STATS_TX_PDEV_PHY_ERR_TAG:
4791 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.phy_err_tlv;
4792 		size = sizeof(htt_tx_pdev_stats_phy_err_tlv_v);
4793 		size_expected =
4794 			sizeof(struct cdp_htt_tx_pdev_stats_phy_err_tlv_v);
4795 		break;
4796 	case HTT_STATS_RX_PDEV_FW_STATS_TAG:
4797 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_stats_tlv;
4798 		size = sizeof(htt_rx_pdev_fw_stats_tlv);
4799 		size_expected = sizeof(struct cdp_htt_rx_pdev_fw_stats_tlv);
4800 		break;
4801 	case HTT_STATS_RX_SOC_FW_STATS_TAG:
4802 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_tlv;
4803 		size = sizeof(htt_rx_soc_fw_stats_tlv);
4804 		size_expected = sizeof(struct cdp_htt_rx_soc_fw_stats_tlv);
4805 		break;
4806 	case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG:
4807 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_refill_ring_empty_tlv;
4808 		size = sizeof(htt_rx_soc_fw_refill_ring_empty_tlv_v);
4809 		size_expected =
4810 		sizeof(struct cdp_htt_rx_soc_fw_refill_ring_empty_tlv_v);
4811 		break;
4812 	case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG:
4813 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_refill_ring_num_refill_tlv;
4814 		size = sizeof(htt_rx_soc_fw_refill_ring_num_refill_tlv_v);
4815 		size_expected =
4816 		sizeof(struct cdp_htt_rx_soc_fw_refill_ring_num_refill_tlv_v);
4817 		break;
4818 	case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG:
4819 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_ring_mpdu_err_tlv;
4820 		size = sizeof(htt_rx_pdev_fw_ring_mpdu_err_tlv_v);
4821 		size_expected =
4822 			sizeof(struct cdp_htt_rx_pdev_fw_ring_mpdu_err_tlv_v);
4823 		break;
4824 	case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG:
4825 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_ring_mpdu_drop;
4826 		size = sizeof(htt_rx_pdev_fw_mpdu_drop_tlv_v);
4827 		size_expected =
4828 			sizeof(struct cdp_htt_rx_pdev_fw_mpdu_drop_tlv_v);
4829 		break;
4830 	default:
4831 		break;
4832 	}
4833 
4834 	if (size_expected < size)
4835 		dp_warn("Buffer Overflow:FW Struct Size:%d Host Struct Size:%d"
4836 			, size, size_expected);
4837 
4838 	if (dest_ptr)
4839 		qdf_mem_copy(dest_ptr, tag_buf, size_expected);
4840 
4841 	if (((pdev->fw_stats_tlv_bitmap_rcvd) & DP_HTT_TX_RX_EXPECTED_TLVS)
4842 	      == DP_HTT_TX_RX_EXPECTED_TLVS) {
4843 		qdf_event_set(&pdev->fw_stats_event);
4844 	}
4845 }
4846 
4847 #ifdef VDEV_PEER_PROTOCOL_COUNT
4848 #ifdef VDEV_PEER_PROTOCOL_COUNT_TESTING
4849 static QDF_STATUS dp_peer_stats_update_protocol_test_cnt(struct dp_vdev *vdev,
4850 							 bool is_egress,
4851 							 bool is_rx)
4852 {
4853 	int mask;
4854 
4855 	if (is_egress)
4856 		if (is_rx)
4857 			mask = VDEV_PEER_PROTOCOL_RX_EGRESS_MASK;
4858 		else
4859 			mask = VDEV_PEER_PROTOCOL_TX_EGRESS_MASK;
4860 	else
4861 		if (is_rx)
4862 			mask = VDEV_PEER_PROTOCOL_RX_INGRESS_MASK;
4863 		else
4864 			mask = VDEV_PEER_PROTOCOL_TX_INGRESS_MASK;
4865 
4866 	if (qdf_unlikely(vdev->peer_protocol_count_dropmask & mask)) {
4867 		dp_info("drop mask set %x", vdev->peer_protocol_count_dropmask);
4868 		return QDF_STATUS_SUCCESS;
4869 	}
4870 	return QDF_STATUS_E_FAILURE;
4871 }
4872 
4873 #else
4874 static QDF_STATUS dp_peer_stats_update_protocol_test_cnt(struct dp_vdev *vdev,
4875 							 bool is_egress,
4876 							 bool is_rx)
4877 {
4878 	return QDF_STATUS_E_FAILURE;
4879 }
4880 #endif
4881 
4882 void dp_vdev_peer_stats_update_protocol_cnt(struct dp_vdev *vdev,
4883 					    qdf_nbuf_t nbuf,
4884 					    struct dp_txrx_peer *txrx_peer,
4885 					    bool is_egress,
4886 					    bool is_rx)
4887 {
4888 	struct dp_peer_per_pkt_stats *per_pkt_stats;
4889 	struct protocol_trace_count *protocol_trace_cnt;
4890 	enum cdp_protocol_trace prot;
4891 	struct dp_soc *soc;
4892 	struct ether_header *eh;
4893 	char *mac;
4894 	bool new_peer_ref = false;
4895 	struct dp_peer *peer = NULL;
4896 
4897 	if (qdf_likely(!vdev->peer_protocol_count_track))
4898 		return;
4899 	if (qdf_unlikely(dp_peer_stats_update_protocol_test_cnt(vdev,
4900 								is_egress,
4901 								is_rx) ==
4902 					       QDF_STATUS_SUCCESS))
4903 		return;
4904 
4905 	soc = vdev->pdev->soc;
4906 	eh = (struct ether_header *)qdf_nbuf_data(nbuf);
4907 	if (is_rx)
4908 		mac = eh->ether_shost;
4909 	else
4910 		mac = eh->ether_dhost;
4911 
4912 	if (!txrx_peer) {
4913 		peer = dp_peer_find_hash_find(soc, mac, 0, vdev->vdev_id,
4914 					      DP_MOD_ID_GENERIC_STATS);
4915 		new_peer_ref = true;
4916 		if (!peer)
4917 			return;
4918 
4919 		txrx_peer = peer->txrx_peer;
4920 		if (!txrx_peer)
4921 			goto dp_vdev_peer_stats_update_protocol_cnt_free_peer;
4922 	}
4923 	per_pkt_stats = &txrx_peer->stats[0].per_pkt_stats;
4924 
4925 	if (qdf_nbuf_is_icmp_pkt(nbuf) == true)
4926 		prot = CDP_TRACE_ICMP;
4927 	else if (qdf_nbuf_is_ipv4_arp_pkt(nbuf) == true)
4928 		prot = CDP_TRACE_ARP;
4929 	else if (qdf_nbuf_is_ipv4_eapol_pkt(nbuf) == true)
4930 		prot = CDP_TRACE_EAP;
4931 	else
4932 		goto dp_vdev_peer_stats_update_protocol_cnt_free_peer;
4933 
4934 	if (is_rx)
4935 		protocol_trace_cnt = per_pkt_stats->rx.protocol_trace_cnt;
4936 	else
4937 		protocol_trace_cnt = per_pkt_stats->tx.protocol_trace_cnt;
4938 
4939 	if (is_egress)
4940 		protocol_trace_cnt[prot].egress_cnt++;
4941 	else
4942 		protocol_trace_cnt[prot].ingress_cnt++;
4943 dp_vdev_peer_stats_update_protocol_cnt_free_peer:
4944 	if (new_peer_ref)
4945 		dp_peer_unref_delete(peer, DP_MOD_ID_GENERIC_STATS);
4946 }
4947 
4948 void dp_peer_stats_update_protocol_cnt(struct cdp_soc_t *soc_hdl,
4949 				       int8_t vdev_id,
4950 				       qdf_nbuf_t nbuf,
4951 				       bool is_egress,
4952 				       bool is_rx)
4953 {
4954 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
4955 	struct dp_vdev *vdev;
4956 
4957 	vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_GENERIC_STATS);
4958 	if (!vdev)
4959 		return;
4960 
4961 	if (qdf_likely(vdev->peer_protocol_count_track))
4962 		dp_vdev_peer_stats_update_protocol_cnt(vdev, nbuf, NULL,
4963 						       is_egress, is_rx);
4964 
4965 	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS);
4966 }
4967 #endif
4968 
4969 #if defined(QCA_ENH_V3_STATS_SUPPORT) || defined(HW_TX_DELAY_STATS_ENABLE)
4970 /**
4971  * dp_vow_str_fw_to_hw_delay() - Return string for a delay
4972  * @index: Index of delay
4973  *
4974  * Return: char const pointer
4975  */
4976 static inline const char *dp_vow_str_fw_to_hw_delay(uint8_t index)
4977 {
4978 	if (index > CDP_DELAY_BUCKET_MAX) {
4979 		return "Invalid index";
4980 	}
4981 	return fw_to_hw_delay_bucket[index];
4982 }
4983 
4984 #if defined(HW_TX_DELAY_STATS_ENABLE)
4985 /**
4986  * dp_str_fw_to_hw_delay_bkt() - Return string for concise logging of delay
4987  * @index: Index of delay
4988  *
4989  * Return: char const pointer
4990  */
4991 static inline const char *dp_str_fw_to_hw_delay_bkt(uint8_t index)
4992 {
4993 	if (index > CDP_DELAY_BUCKET_MAX)
4994 		return "Invalid";
4995 
4996 	return fw_to_hw_delay_bkt_str[index];
4997 }
4998 #endif
4999 
5000 /**
5001  * dp_accumulate_delay_stats() - Update delay stats members
5002  * @total: Update stats total structure
5003  * @per_ring: per ring structures from where stats need to be accumulated
5004  *
5005  * Return: void
5006  */
5007 static void
5008 dp_accumulate_delay_stats(struct cdp_delay_stats *total,
5009 			  struct cdp_delay_stats *per_ring)
5010 {
5011 	uint8_t index;
5012 
5013 	for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++)
5014 		total->delay_bucket[index] += per_ring->delay_bucket[index];
5015 	total->min_delay = QDF_MIN(total->min_delay, per_ring->min_delay);
5016 	total->max_delay = QDF_MAX(total->max_delay, per_ring->max_delay);
5017 	total->avg_delay = ((total->avg_delay + per_ring->avg_delay) >> 1);
5018 }
5019 #endif
5020 
5021 #ifdef QCA_ENH_V3_STATS_SUPPORT
5022 /**
5023  * dp_vow_str_sw_enq_delay() - Return string for a delay
5024  * @index: Index of delay
5025  *
5026  * Return: char const pointer
5027  */
5028 static inline const char *dp_vow_str_sw_enq_delay(uint8_t index)
5029 {
5030 	if (index > CDP_DELAY_BUCKET_MAX) {
5031 		return "Invalid index";
5032 	}
5033 	return sw_enq_delay_bucket[index];
5034 }
5035 
5036 /**
5037  * dp_vow_str_intfrm_delay() - Return string for a delay
5038  * @index: Index of delay
5039  *
5040  * Return: char const pointer
5041  */
5042 static inline const char *dp_vow_str_intfrm_delay(uint8_t index)
5043 {
5044 	if (index > CDP_DELAY_BUCKET_MAX) {
5045 		return "Invalid index";
5046 	}
5047 	return intfrm_delay_bucket[index];
5048 }
5049 
5050 /**
5051  * dp_accumulate_tid_stats() - Accumulate TID stats from each ring
5052  * @pdev: pdev handle
5053  * @tid: traffic ID
5054  * @total_tx: fill this tx structure to get stats from all wbm rings
5055  * @total_rx: fill this rx structure to get stats from all reo rings
5056  * @type: delay stats or regular frame counters
5057  *
5058  * Return: void
5059  */
5060 static void
5061 dp_accumulate_tid_stats(struct dp_pdev *pdev, uint8_t tid,
5062 			struct cdp_tid_tx_stats *total_tx,
5063 			struct cdp_tid_rx_stats *total_rx, uint8_t type)
5064 {
5065 	uint8_t i = 0, ring_id = 0, drop = 0, tqm_status_idx = 0, htt_status_idx = 0;
5066 	struct cdp_tid_stats *tid_stats = &pdev->stats.tid_stats;
5067 	struct cdp_tid_tx_stats *per_ring_tx = NULL;
5068 	struct cdp_tid_rx_stats *per_ring_rx = NULL;
5069 
5070 	if (wlan_cfg_get_dp_soc_nss_cfg(pdev->soc->wlan_cfg_ctx)) {
5071 		qdf_mem_copy(total_tx, &tid_stats->tid_tx_stats[0][tid],
5072 			     sizeof(struct cdp_tid_tx_stats));
5073 		qdf_mem_copy(total_rx, &tid_stats->tid_rx_stats[0][tid],
5074 			     sizeof(struct cdp_tid_rx_stats));
5075 		return;
5076 	} else {
5077 		qdf_mem_zero(total_tx, sizeof(struct cdp_tid_tx_stats));
5078 		qdf_mem_zero(total_rx, sizeof(struct cdp_tid_rx_stats));
5079 	}
5080 
5081 	switch (type) {
5082 	case TID_COUNTER_STATS:
5083 	{
5084 		for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) {
5085 			per_ring_tx = &tid_stats->tid_tx_stats[ring_id][tid];
5086 			total_tx->success_cnt += per_ring_tx->success_cnt;
5087 			total_tx->comp_fail_cnt += per_ring_tx->comp_fail_cnt;
5088 			for (tqm_status_idx = 0; tqm_status_idx < CDP_MAX_TX_TQM_STATUS; tqm_status_idx++) {
5089 				total_tx->tqm_status_cnt[tqm_status_idx] +=
5090 					per_ring_tx->tqm_status_cnt[tqm_status_idx];
5091 			}
5092 
5093 			for (htt_status_idx = 0; htt_status_idx < CDP_MAX_TX_HTT_STATUS; htt_status_idx++) {
5094 				total_tx->htt_status_cnt[htt_status_idx] +=
5095 					per_ring_tx->htt_status_cnt[htt_status_idx];
5096 			}
5097 
5098 			for (drop = 0; drop < TX_MAX_DROP; drop++)
5099 				total_tx->swdrop_cnt[drop] +=
5100 					per_ring_tx->swdrop_cnt[drop];
5101 		}
5102 		for (ring_id = 0; ring_id < CDP_MAX_RX_RINGS; ring_id++) {
5103 			per_ring_rx = &tid_stats->tid_rx_stats[ring_id][tid];
5104 			total_rx->delivered_to_stack +=
5105 				per_ring_rx->delivered_to_stack;
5106 			total_rx->intrabss_cnt += per_ring_rx->intrabss_cnt;
5107 			total_rx->msdu_cnt += per_ring_rx->msdu_cnt;
5108 			total_rx->mcast_msdu_cnt += per_ring_rx->mcast_msdu_cnt;
5109 			total_rx->bcast_msdu_cnt += per_ring_rx->bcast_msdu_cnt;
5110 			for (drop = 0; drop < RX_MAX_DROP; drop++)
5111 				total_rx->fail_cnt[drop] +=
5112 					per_ring_rx->fail_cnt[drop];
5113 		}
5114 		break;
5115 	}
5116 
5117 	case TID_DELAY_STATS:
5118 	{
5119 		for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) {
5120 			per_ring_tx = &tid_stats->tid_tx_stats[ring_id][tid];
5121 			dp_accumulate_delay_stats(&total_tx->swq_delay,
5122 						  &per_ring_tx->swq_delay);
5123 			dp_accumulate_delay_stats(&total_tx->hwtx_delay,
5124 						  &per_ring_tx->hwtx_delay);
5125 			dp_accumulate_delay_stats(&total_tx->intfrm_delay,
5126 						  &per_ring_tx->intfrm_delay);
5127 		}
5128 		for (ring_id = 0; ring_id < CDP_MAX_RX_RINGS; ring_id++) {
5129 			per_ring_rx = &tid_stats->tid_rx_stats[ring_id][tid];
5130 			dp_accumulate_delay_stats(&total_rx->intfrm_delay,
5131 						  &per_ring_rx->intfrm_delay);
5132 			dp_accumulate_delay_stats(&total_rx->to_stack_delay,
5133 						  &per_ring_rx->to_stack_delay);
5134 		}
5135 		break;
5136 	}
5137 
5138 	case TID_RX_ERROR_STATS:
5139 	{
5140 		for (ring_id = 0; ring_id < CDP_MAX_RX_RINGS; ring_id++) {
5141 			per_ring_rx = &tid_stats->tid_rx_stats[ring_id][tid];
5142 			total_rx->reo_err.err_src_reo_code_inv += per_ring_rx->reo_err.err_src_reo_code_inv;
5143 			for (i = 0; i < CDP_REO_CODE_MAX; i++) {
5144 				total_rx->reo_err.err_reo_codes[i] += per_ring_rx->reo_err.err_reo_codes[i];
5145 			}
5146 
5147 			total_rx->rxdma_err.err_src_rxdma_code_inv += per_ring_rx->rxdma_err.err_src_rxdma_code_inv;
5148 			for (i = 0; i < CDP_DMA_CODE_MAX; i++) {
5149 				total_rx->rxdma_err.err_dma_codes[i] += per_ring_rx->rxdma_err.err_dma_codes[i];
5150 			}
5151 		}
5152 		break;
5153 	}
5154 	default:
5155 		qdf_err("Invalid stats type: %d", type);
5156 		break;
5157 	}
5158 }
5159 
5160 void dp_pdev_print_tid_stats(struct dp_pdev *pdev)
5161 {
5162 	struct cdp_tid_tx_stats total_tx;
5163 	struct cdp_tid_rx_stats total_rx;
5164 	uint8_t tid, tqm_status_idx, htt_status_idx;
5165 	struct cdp_tid_rx_stats *rx_wbm_stats = NULL;
5166 
5167 	DP_PRINT_STATS("Packets received in hardstart: %llu ",
5168 			pdev->stats.tid_stats.ingress_stack);
5169 	DP_PRINT_STATS("Packets dropped in osif layer: %llu ",
5170 			pdev->stats.tid_stats.osif_drop);
5171 	DP_PRINT_STATS("Per TID Video Stats:\n");
5172 
5173 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
5174 		rx_wbm_stats = &pdev->stats.tid_stats.tid_rx_wbm_stats[0][tid];
5175 
5176 		dp_accumulate_tid_stats(pdev, tid, &total_tx, &total_rx,
5177 					TID_COUNTER_STATS);
5178 		DP_PRINT_STATS("----TID: %d----", tid);
5179 		DP_PRINT_STATS("Tx TQM Success Count: %llu",
5180 				total_tx.tqm_status_cnt[HAL_TX_TQM_RR_FRAME_ACKED]);
5181 		DP_PRINT_STATS("Tx HTT Success Count: %llu",
5182 				total_tx.htt_status_cnt[HTT_TX_FW2WBM_TX_STATUS_OK]);
5183 		for (tqm_status_idx = 1; tqm_status_idx < CDP_MAX_TX_TQM_STATUS; tqm_status_idx++) {
5184 			if (total_tx.tqm_status_cnt[tqm_status_idx]) {
5185 				DP_PRINT_STATS("Tx TQM Drop Count[%d]: %llu",
5186 						tqm_status_idx, total_tx.tqm_status_cnt[tqm_status_idx]);
5187 			}
5188 		}
5189 
5190 		for (htt_status_idx = 1; htt_status_idx < CDP_MAX_TX_HTT_STATUS; htt_status_idx++) {
5191 			if (total_tx.htt_status_cnt[htt_status_idx]) {
5192 				DP_PRINT_STATS("Tx HTT Drop Count[%d]: %llu",
5193 						htt_status_idx, total_tx.htt_status_cnt[htt_status_idx]);
5194 			}
5195 		}
5196 
5197 		DP_PRINT_STATS("Tx Hardware Drop Count: %llu",
5198 			       total_tx.swdrop_cnt[TX_HW_ENQUEUE]);
5199 		DP_PRINT_STATS("Tx Software Drop Count: %llu",
5200 			       total_tx.swdrop_cnt[TX_SW_ENQUEUE]);
5201 		DP_PRINT_STATS("Tx Descriptor Error Count: %llu",
5202 			       total_tx.swdrop_cnt[TX_DESC_ERR]);
5203 		DP_PRINT_STATS("Tx HAL Ring Error Count: %llu",
5204 			       total_tx.swdrop_cnt[TX_HAL_RING_ACCESS_ERR]);
5205 		DP_PRINT_STATS("Tx Dma Map Error Count: %llu",
5206 			       total_tx.swdrop_cnt[TX_DMA_MAP_ERR]);
5207 		DP_PRINT_STATS("Rx Delievered Count: %llu",
5208 			       total_rx.delivered_to_stack);
5209 		DP_PRINT_STATS("Rx Software Enqueue Drop Count: %llu",
5210 			       total_rx.fail_cnt[ENQUEUE_DROP]);
5211 		DP_PRINT_STATS("Rx Intrabss Drop Count: %llu",
5212 			       total_rx.fail_cnt[INTRABSS_DROP]);
5213 		DP_PRINT_STATS("Rx Msdu Done Failure Count: %llu",
5214 			       total_rx.fail_cnt[MSDU_DONE_FAILURE]);
5215 		DP_PRINT_STATS("Rx Invalid Peer Count: %llu",
5216 			       total_rx.fail_cnt[INVALID_PEER_VDEV]);
5217 		DP_PRINT_STATS("Rx Policy Check Drop Count: %llu",
5218 			       total_rx.fail_cnt[POLICY_CHECK_DROP]);
5219 		DP_PRINT_STATS("Rx Mec Drop Count: %llu",
5220 			       total_rx.fail_cnt[MEC_DROP]);
5221 		DP_PRINT_STATS("Rx Nawds Mcast Drop Count: %llu",
5222 			       total_rx.fail_cnt[NAWDS_MCAST_DROP]);
5223 		DP_PRINT_STATS("Rx Mesh Filter Drop Count: %llu",
5224 			       total_rx.fail_cnt[MESH_FILTER_DROP]);
5225 		DP_PRINT_STATS("Rx Intra Bss Deliver Count: %llu",
5226 			       total_rx.intrabss_cnt);
5227 		DP_PRINT_STATS("Rx MSDU Count: %llu", total_rx.msdu_cnt);
5228 		DP_PRINT_STATS("Rx Multicast MSDU Count: %llu",
5229 			       total_rx.mcast_msdu_cnt);
5230 		DP_PRINT_STATS("Rx Broadcast MSDU Count: %llu\n",
5231 			       total_rx.bcast_msdu_cnt);
5232 		DP_PRINT_STATS("Rx WBM Intra Bss Deliver Count: %llu",
5233 			       rx_wbm_stats->intrabss_cnt);
5234 		DP_PRINT_STATS("Rx WBM Intrabss Drop Count: %llu",
5235 			       rx_wbm_stats->fail_cnt[INTRABSS_DROP]);
5236 	}
5237 }
5238 
5239 void dp_pdev_print_delay_stats(struct dp_pdev *pdev)
5240 {
5241 	struct dp_soc *soc = pdev->soc;
5242 	struct cdp_tid_tx_stats total_tx;
5243 	struct cdp_tid_rx_stats total_rx;
5244 
5245 	uint8_t tid, index;
5246 	uint64_t count = 0;
5247 
5248 	if (!soc)
5249 		return;
5250 
5251 	tid = 0;
5252 	index = 0;
5253 
5254 	DP_PRINT_STATS("Per TID Delay Non-Zero Stats:\n");
5255 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
5256 		dp_accumulate_tid_stats(pdev, tid, &total_tx, &total_rx,
5257 					TID_DELAY_STATS);
5258 		DP_PRINT_STATS("----TID: %d----", tid);
5259 
5260 		DP_PRINT_STATS("Software Enqueue Delay:");
5261 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
5262 			count = total_tx.swq_delay.delay_bucket[index];
5263 			if (count) {
5264 				DP_PRINT_STATS("%s:  Packets = %llu",
5265 					       dp_vow_str_sw_enq_delay(index),
5266 					       count);
5267 			}
5268 		}
5269 
5270 		DP_PRINT_STATS("Min = %u", total_tx.swq_delay.min_delay);
5271 		DP_PRINT_STATS("Max = %u", total_tx.swq_delay.max_delay);
5272 		DP_PRINT_STATS("Avg = %u\n", total_tx.swq_delay.avg_delay);
5273 
5274 		DP_PRINT_STATS("Hardware Transmission Delay:");
5275 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
5276 			count = total_tx.hwtx_delay.delay_bucket[index];
5277 			if (count) {
5278 				DP_PRINT_STATS("%s:  Packets = %llu",
5279 					       dp_vow_str_fw_to_hw_delay(index),
5280 					       count);
5281 			}
5282 		}
5283 		DP_PRINT_STATS("Min = %u", total_tx.hwtx_delay.min_delay);
5284 		DP_PRINT_STATS("Max = %u", total_tx.hwtx_delay.max_delay);
5285 		DP_PRINT_STATS("Avg = %u\n", total_tx.hwtx_delay.avg_delay);
5286 
5287 		DP_PRINT_STATS("Tx Interframe Delay:");
5288 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
5289 			count = total_tx.intfrm_delay.delay_bucket[index];
5290 			if (count) {
5291 				DP_PRINT_STATS("%s:  Packets = %llu",
5292 					       dp_vow_str_intfrm_delay(index),
5293 					       count);
5294 			}
5295 		}
5296 		DP_PRINT_STATS("Min = %u", total_tx.intfrm_delay.min_delay);
5297 		DP_PRINT_STATS("Max = %u", total_tx.intfrm_delay.max_delay);
5298 		DP_PRINT_STATS("Avg = %u\n", total_tx.intfrm_delay.avg_delay);
5299 
5300 		DP_PRINT_STATS("Rx Interframe Delay:");
5301 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
5302 			count = total_rx.intfrm_delay.delay_bucket[index];
5303 			if (count) {
5304 				DP_PRINT_STATS("%s:  Packets = %llu",
5305 					       dp_vow_str_intfrm_delay(index),
5306 					       count);
5307 			}
5308 		}
5309 		DP_PRINT_STATS("Min = %u", total_rx.intfrm_delay.min_delay);
5310 		DP_PRINT_STATS("Max = %u", total_rx.intfrm_delay.max_delay);
5311 		DP_PRINT_STATS("Avg = %u\n", total_rx.intfrm_delay.avg_delay);
5312 
5313 		DP_PRINT_STATS("Rx Reap to Stack Delay:");
5314 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
5315 			count = total_rx.to_stack_delay.delay_bucket[index];
5316 			if (count) {
5317 				DP_PRINT_STATS("%s:  Packets = %llu",
5318 					       dp_vow_str_intfrm_delay(index),
5319 					       count);
5320 			}
5321 		}
5322 
5323 		DP_PRINT_STATS("Min = %u", total_rx.to_stack_delay.min_delay);
5324 		DP_PRINT_STATS("Max = %u", total_rx.to_stack_delay.max_delay);
5325 		DP_PRINT_STATS("Avg = %u\n", total_rx.to_stack_delay.avg_delay);
5326 	}
5327 }
5328 
5329 void dp_pdev_print_rx_error_stats(struct dp_pdev *pdev)
5330 {
5331 	struct dp_soc *soc = pdev->soc;
5332 	struct cdp_tid_rx_stats total_rx;
5333 	struct cdp_tid_tx_stats total_tx;
5334 
5335 	uint8_t tid, index;
5336 
5337 	if (!soc)
5338 		return;
5339 
5340 
5341 	DP_PRINT_STATS("Per TID RX Error Stats:\n");
5342 	for (tid = 0; tid < CDP_MAX_VOW_TID; tid++) {
5343 		dp_accumulate_tid_stats(pdev, tid, &total_tx, &total_rx,
5344 					TID_RX_ERROR_STATS);
5345 		DP_PRINT_STATS("----TID: %d----", tid + 4);
5346 
5347 		DP_PRINT_STATS("Rx REO Error stats:");
5348 		DP_PRINT_STATS("err_src_reo_code_inv = %llu", total_rx.reo_err.err_src_reo_code_inv);
5349 		for (index = 0; index < CDP_REO_CODE_MAX; index++) {
5350 			DP_PRINT_STATS("err src reo codes: %d = %llu", index, total_rx.reo_err.err_reo_codes[index]);
5351 		}
5352 
5353 		DP_PRINT_STATS("Rx Rxdma Error stats:");
5354 		DP_PRINT_STATS("err_src_rxdma_code_inv = %llu", total_rx.rxdma_err.err_src_rxdma_code_inv);
5355 		for (index = 0; index < CDP_DMA_CODE_MAX; index++) {
5356 			DP_PRINT_STATS("err src dma codes: %d = %llu", index, total_rx.rxdma_err.err_dma_codes[index]);
5357 		}
5358 	}
5359 }
5360 
5361 QDF_STATUS dp_pdev_get_tid_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
5362 				 struct cdp_tid_stats_intf *tid_stats)
5363 {
5364 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
5365 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
5366 	struct cdp_tid_rx_stats rx;
5367 	struct cdp_tid_tx_stats tx;
5368 	uint8_t tid;
5369 	uint32_t size;
5370 
5371 	if (!pdev)
5372 		return QDF_STATUS_E_INVAL;
5373 
5374 	size = sizeof(struct cdp_delay_stats);
5375 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
5376 		dp_accumulate_tid_stats(pdev, tid, &tx, &rx, TID_COUNTER_STATS);
5377 		/* Copy specific accumulated Tx tid stats */
5378 		tid_stats->tx_total[tid].success_cnt = tx.success_cnt;
5379 		tid_stats->tx_total[tid].comp_fail_cnt = tx.comp_fail_cnt;
5380 		qdf_mem_copy(&tid_stats->tx_total[tid].tqm_status_cnt[0],
5381 			     &tx.tqm_status_cnt[0],
5382 			     CDP_MAX_TX_TQM_STATUS * sizeof(uint64_t));
5383 		qdf_mem_copy(&tid_stats->tx_total[tid].htt_status_cnt[0],
5384 			     &tx.htt_status_cnt[0],
5385 			     CDP_MAX_TX_HTT_STATUS * sizeof(uint64_t));
5386 		qdf_mem_copy(&tid_stats->tx_total[tid].swdrop_cnt[0],
5387 			     &tx.swdrop_cnt[0], TX_MAX_DROP * sizeof(uint64_t));
5388 
5389 		/* Copy specific accumulated Rx tid stats */
5390 		tid_stats->rx_total[tid].delivered_to_stack =
5391 							rx.delivered_to_stack;
5392 		tid_stats->rx_total[tid].intrabss_cnt = rx.intrabss_cnt;
5393 		tid_stats->rx_total[tid].msdu_cnt = rx.msdu_cnt;
5394 		tid_stats->rx_total[tid].mcast_msdu_cnt = rx.mcast_msdu_cnt;
5395 		tid_stats->rx_total[tid].bcast_msdu_cnt = rx.bcast_msdu_cnt;
5396 		qdf_mem_copy(&tid_stats->rx_total[tid].fail_cnt[0],
5397 			     &rx.fail_cnt[0], RX_MAX_DROP * sizeof(uint64_t));
5398 
5399 		dp_accumulate_tid_stats(pdev, tid, &tx, &rx, TID_DELAY_STATS);
5400 		/* Copy specific accumulated Tx delay stats */
5401 		qdf_mem_copy(&tid_stats->tx_total[tid].swq_delay,
5402 			     &tx.swq_delay, size);
5403 		qdf_mem_copy(&tid_stats->tx_total[tid].hwtx_delay,
5404 			     &tx.hwtx_delay, size);
5405 		qdf_mem_copy(&tid_stats->tx_total[tid].intfrm_delay,
5406 			     &tx.intfrm_delay, size);
5407 
5408 		/* Copy specific accumulated Rx delay stats */
5409 		qdf_mem_copy(&tid_stats->rx_total[tid].intfrm_delay,
5410 			     &rx.intfrm_delay, size);
5411 		qdf_mem_copy(&tid_stats->rx_total[tid].to_stack_delay,
5412 			     &rx.to_stack_delay, size);
5413 	}
5414 	for (tid = 0; tid < CDP_MAX_VOW_TID; tid++) {
5415 		dp_accumulate_tid_stats(pdev, tid, &tx, &rx,
5416 					TID_RX_ERROR_STATS);
5417 		/* Copy specific accumulated VOW Rx stats */
5418 		qdf_mem_copy(&tid_stats->rx_total[tid].reo_err,
5419 			     &rx.reo_err, sizeof(struct cdp_reo_error_stats));
5420 		qdf_mem_copy(&tid_stats->rx_total[tid].rxdma_err, &rx.rxdma_err,
5421 			     sizeof(struct cdp_rxdma_error_stats));
5422 	}
5423 	tid_stats->ingress_stack = pdev->stats.tid_stats.ingress_stack;
5424 	tid_stats->osif_drop = pdev->stats.tid_stats.osif_drop;
5425 
5426 	return QDF_STATUS_SUCCESS;
5427 }
5428 #else
5429 QDF_STATUS dp_pdev_get_tid_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
5430 				 struct cdp_tid_stats_intf *tid_stats)
5431 {
5432 	return QDF_STATUS_E_INVAL;
5433 }
5434 #endif
5435 
5436 #ifdef HW_TX_DELAY_STATS_ENABLE
5437 #define DP_TX_DELAY_STATS_STR_LEN 512
5438 #define DP_SHORT_DELAY_BKT_COUNT 5
5439 static void dp_vdev_print_tx_delay_stats(struct dp_vdev *vdev)
5440 {
5441 	struct cdp_delay_stats delay_stats;
5442 	struct cdp_tid_tx_stats *per_ring;
5443 	uint8_t tid, index;
5444 	uint32_t count = 0;
5445 	uint8_t ring_id;
5446 	char *buf;
5447 	size_t pos, buf_len;
5448 	char hw_tx_delay_str[DP_TX_DELAY_STATS_STR_LEN] = {"\0"};
5449 
5450 	buf_len = DP_TX_DELAY_STATS_STR_LEN;
5451 	if (!vdev)
5452 		return;
5453 
5454 	dp_info("vdev_id: %d Per TID HW Tx completion latency Stats:",
5455 		vdev->vdev_id);
5456 	buf = hw_tx_delay_str;
5457 	dp_info("  Tid%32sPkts_per_delay_bucket%60s | Min | Max | Avg |",
5458 		"", "");
5459 	pos = 0;
5460 	pos += qdf_scnprintf(buf + pos, buf_len - pos, "%6s", "");
5461 	for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
5462 		if (index < DP_SHORT_DELAY_BKT_COUNT)
5463 			pos += qdf_scnprintf(buf + pos, buf_len - pos, "%7s",
5464 					     dp_str_fw_to_hw_delay_bkt(index));
5465 		else
5466 			pos += qdf_scnprintf(buf + pos, buf_len - pos, "%9s",
5467 					     dp_str_fw_to_hw_delay_bkt(index));
5468 	}
5469 	dp_info("%s", hw_tx_delay_str);
5470 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
5471 		qdf_mem_zero(&delay_stats, sizeof(delay_stats));
5472 		for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) {
5473 			per_ring = &vdev->stats.tid_tx_stats[ring_id][tid];
5474 			dp_accumulate_delay_stats(&delay_stats,
5475 						  &per_ring->hwtx_delay);
5476 		}
5477 		pos = 0;
5478 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "%4u  ", tid);
5479 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
5480 			count = delay_stats.delay_bucket[index];
5481 			if (index < DP_SHORT_DELAY_BKT_COUNT)
5482 				pos += qdf_scnprintf(buf + pos, buf_len - pos,
5483 						     "%6u|", count);
5484 			else
5485 				pos += qdf_scnprintf(buf + pos, buf_len - pos,
5486 						     "%8u|", count);
5487 		}
5488 		pos += qdf_scnprintf(buf + pos, buf_len - pos,
5489 			"%10u | %3u | %3u|", delay_stats.min_delay,
5490 			delay_stats.max_delay, delay_stats.avg_delay);
5491 		dp_info("%s", hw_tx_delay_str);
5492 	}
5493 }
5494 
5495 void dp_pdev_print_tx_delay_stats(struct dp_soc *soc)
5496 {
5497 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, 0);
5498 	struct dp_vdev *vdev;
5499 	struct dp_vdev **vdev_array = NULL;
5500 	int index = 0, num_vdev = 0;
5501 
5502 	if (!pdev) {
5503 		dp_err("pdev is NULL");
5504 		return;
5505 	}
5506 
5507 	vdev_array =
5508 		qdf_mem_malloc(sizeof(struct dp_vdev *) * WLAN_PDEV_MAX_VDEVS);
5509 	if (!vdev_array)
5510 		return;
5511 
5512 	qdf_spin_lock_bh(&pdev->vdev_list_lock);
5513 	DP_PDEV_ITERATE_VDEV_LIST(pdev, vdev) {
5514 		if (dp_vdev_get_ref(soc, vdev, DP_MOD_ID_GENERIC_STATS))
5515 			continue;
5516 		vdev_array[index] = vdev;
5517 		index = index + 1;
5518 	}
5519 	qdf_spin_unlock_bh(&pdev->vdev_list_lock);
5520 
5521 	num_vdev = index;
5522 
5523 	for (index = 0; index < num_vdev; index++) {
5524 		vdev = vdev_array[index];
5525 		if (qdf_unlikely(dp_is_vdev_tx_delay_stats_enabled(vdev)))
5526 			dp_vdev_print_tx_delay_stats(vdev);
5527 		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS);
5528 	}
5529 	qdf_mem_free(vdev_array);
5530 }
5531 
5532 /**
5533  * dp_reset_delay_stats() - reset delay stats
5534  * @per_ring: per ring structures from where stats need to be accumulated
5535  *
5536  * Return: void
5537  */
5538 static void dp_reset_delay_stats(struct cdp_delay_stats *per_ring)
5539 {
5540 	qdf_mem_zero(per_ring, sizeof(struct cdp_delay_stats));
5541 }
5542 
5543 /**
5544  * dp_vdev_init_tx_delay_stats() - Clear tx delay stats
5545  * @vdev: vdev handle
5546  *
5547  * Return: None
5548  */
5549 static void dp_vdev_init_tx_delay_stats(struct dp_vdev *vdev)
5550 {
5551 	struct cdp_tid_tx_stats *per_ring;
5552 	uint8_t tid;
5553 	uint8_t ring_id;
5554 
5555 	if (!vdev)
5556 		return;
5557 
5558 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
5559 		for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) {
5560 			per_ring = &vdev->stats.tid_tx_stats[ring_id][tid];
5561 			dp_reset_delay_stats(&per_ring->hwtx_delay);
5562 		}
5563 	}
5564 }
5565 
5566 void dp_pdev_clear_tx_delay_stats(struct dp_soc *soc)
5567 {
5568 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, 0);
5569 	struct dp_vdev *vdev;
5570 	struct dp_vdev **vdev_array = NULL;
5571 	int index = 0, num_vdev = 0;
5572 
5573 	if (!pdev) {
5574 		dp_err("pdev is NULL");
5575 		return;
5576 	}
5577 
5578 	vdev_array =
5579 		qdf_mem_malloc(sizeof(struct dp_vdev *) * WLAN_PDEV_MAX_VDEVS);
5580 	if (!vdev_array)
5581 		return;
5582 
5583 	qdf_spin_lock_bh(&pdev->vdev_list_lock);
5584 	DP_PDEV_ITERATE_VDEV_LIST(pdev, vdev) {
5585 		if (dp_vdev_get_ref(soc, vdev, DP_MOD_ID_GENERIC_STATS) !=
5586 		    QDF_STATUS_SUCCESS)
5587 			continue;
5588 		vdev_array[index] = vdev;
5589 		index = index + 1;
5590 	}
5591 	qdf_spin_unlock_bh(&pdev->vdev_list_lock);
5592 
5593 	num_vdev = index;
5594 
5595 	for (index = 0; index < num_vdev; index++) {
5596 		vdev = vdev_array[index];
5597 		dp_vdev_init_tx_delay_stats(vdev);
5598 		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS);
5599 	}
5600 	qdf_mem_free(vdev_array);
5601 }
5602 #endif
5603 
5604 void dp_print_soc_cfg_params(struct dp_soc *soc)
5605 {
5606 	struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx;
5607 	uint8_t index = 0, i = 0;
5608 	char ring_mask[DP_MAX_INT_CONTEXTS_STRING_LENGTH] = {'\0'};
5609 	int num_of_int_contexts;
5610 
5611 	if (!soc) {
5612 		dp_err("Context is null");
5613 		return;
5614 	}
5615 
5616 	soc_cfg_ctx = soc->wlan_cfg_ctx;
5617 
5618 	if (!soc_cfg_ctx) {
5619 		dp_err("Context is null");
5620 		return;
5621 	}
5622 
5623 	num_of_int_contexts =
5624 			wlan_cfg_get_num_contexts(soc_cfg_ctx);
5625 
5626 	DP_PRINT_STATS("No. of interrupt contexts: %u",
5627 		       soc_cfg_ctx->num_int_ctxts);
5628 	DP_PRINT_STATS("Max clients: %u",
5629 		       soc_cfg_ctx->max_clients);
5630 	DP_PRINT_STATS("Max alloc size: %u ",
5631 		       soc_cfg_ctx->max_alloc_size);
5632 	DP_PRINT_STATS("Per pdev tx ring: %u ",
5633 		       soc_cfg_ctx->per_pdev_tx_ring);
5634 	DP_PRINT_STATS("Num tcl data rings: %u ",
5635 		       soc_cfg_ctx->num_tcl_data_rings);
5636 	DP_PRINT_STATS("Per pdev rx ring: %u ",
5637 		       soc_cfg_ctx->per_pdev_rx_ring);
5638 	DP_PRINT_STATS("Per pdev lmac ring: %u ",
5639 		       soc_cfg_ctx->per_pdev_lmac_ring);
5640 	DP_PRINT_STATS("Num of reo dest rings: %u ",
5641 		       soc_cfg_ctx->num_reo_dest_rings);
5642 	DP_PRINT_STATS("Num tx desc pool: %u ",
5643 		       soc_cfg_ctx->num_tx_desc_pool);
5644 	DP_PRINT_STATS("Num tx ext desc pool: %u ",
5645 		       soc_cfg_ctx->num_tx_ext_desc_pool);
5646 	DP_PRINT_STATS("Num tx desc: %u ",
5647 		       soc_cfg_ctx->num_tx_desc);
5648 	DP_PRINT_STATS("Num tx ext desc: %u ",
5649 		       soc_cfg_ctx->num_tx_ext_desc);
5650 	DP_PRINT_STATS("Htt packet type: %u ",
5651 		       soc_cfg_ctx->htt_packet_type);
5652 	DP_PRINT_STATS("Max peer_ids: %u ",
5653 		       soc_cfg_ctx->max_peer_id);
5654 	DP_PRINT_STATS("Tx ring size: %u ",
5655 		       soc_cfg_ctx->tx_ring_size);
5656 	DP_PRINT_STATS("Tx comp ring size: %u ",
5657 		       soc_cfg_ctx->tx_comp_ring_size);
5658 	DP_PRINT_STATS("Tx comp ring size nss: %u ",
5659 		       soc_cfg_ctx->tx_comp_ring_size_nss);
5660 	DP_PRINT_STATS("Int batch threshold tx: %u ",
5661 		       soc_cfg_ctx->int_batch_threshold_tx);
5662 	DP_PRINT_STATS("Int timer threshold tx: %u ",
5663 		       soc_cfg_ctx->int_timer_threshold_tx);
5664 	DP_PRINT_STATS("Int batch threshold rx: %u ",
5665 		       soc_cfg_ctx->int_batch_threshold_rx);
5666 	DP_PRINT_STATS("Int timer threshold rx: %u ",
5667 		       soc_cfg_ctx->int_timer_threshold_rx);
5668 	DP_PRINT_STATS("Int batch threshold other: %u ",
5669 		       soc_cfg_ctx->int_batch_threshold_other);
5670 	DP_PRINT_STATS("Int timer threshold other: %u ",
5671 		       soc_cfg_ctx->int_timer_threshold_other);
5672 	DP_PRINT_STATS("Int batch threshold ppe2tcl: %u ",
5673 		       soc_cfg_ctx->int_batch_threshold_ppe2tcl);
5674 	DP_PRINT_STATS("Int timer threshold ppe2tcl: %u ",
5675 		       soc_cfg_ctx->int_timer_threshold_ppe2tcl);
5676 
5677 	DP_PRINT_STATS("DP NAPI scale factor: %u ",
5678 		       soc_cfg_ctx->napi_scale_factor);
5679 
5680 	for (i = 0; i < num_of_int_contexts; i++) {
5681 		index += qdf_snprint(&ring_mask[index],
5682 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5683 				     " %d",
5684 				     soc_cfg_ctx->int_tx_ring_mask[i]);
5685 	}
5686 
5687 	DP_PRINT_STATS("Tx ring mask (0-%d):%s",
5688 		       num_of_int_contexts, ring_mask);
5689 
5690 	index = 0;
5691 	for (i = 0; i < num_of_int_contexts; i++) {
5692 		index += qdf_snprint(&ring_mask[index],
5693 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5694 				     " %d",
5695 				     soc_cfg_ctx->int_rx_ring_mask[i]);
5696 	}
5697 
5698 	DP_PRINT_STATS("Rx ring mask (0-%d):%s",
5699 		       num_of_int_contexts, ring_mask);
5700 
5701 	index = 0;
5702 	for (i = 0; i < num_of_int_contexts; i++) {
5703 		index += qdf_snprint(&ring_mask[index],
5704 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5705 				     " %d",
5706 				     soc_cfg_ctx->int_rx_mon_ring_mask[i]);
5707 	}
5708 
5709 	DP_PRINT_STATS("Rx mon ring mask (0-%d):%s",
5710 		       num_of_int_contexts, ring_mask);
5711 
5712 	index = 0;
5713 	for (i = 0; i < num_of_int_contexts; i++) {
5714 		index += qdf_snprint(&ring_mask[index],
5715 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5716 				     " %d",
5717 				     soc_cfg_ctx->int_rx_err_ring_mask[i]);
5718 	}
5719 
5720 	DP_PRINT_STATS("Rx err ring mask (0-%d):%s",
5721 		       num_of_int_contexts, ring_mask);
5722 
5723 	index = 0;
5724 	for (i = 0; i < num_of_int_contexts; i++) {
5725 		index += qdf_snprint(&ring_mask[index],
5726 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5727 				     " %d",
5728 				     soc_cfg_ctx->int_rx_wbm_rel_ring_mask[i]);
5729 	}
5730 
5731 	DP_PRINT_STATS("Rx wbm rel ring mask (0-%d):%s",
5732 		       num_of_int_contexts, ring_mask);
5733 
5734 	index = 0;
5735 	for (i = 0; i < num_of_int_contexts; i++) {
5736 		index += qdf_snprint(&ring_mask[index],
5737 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5738 				     " %d",
5739 				     soc_cfg_ctx->int_reo_status_ring_mask[i]);
5740 	}
5741 
5742 	DP_PRINT_STATS("Reo ring mask (0-%d):%s",
5743 		       num_of_int_contexts, ring_mask);
5744 
5745 	index = 0;
5746 	for (i = 0; i < num_of_int_contexts; i++) {
5747 		index += qdf_snprint(&ring_mask[index],
5748 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5749 				     " %d",
5750 				     soc_cfg_ctx->int_rxdma2host_ring_mask[i]);
5751 	}
5752 
5753 	DP_PRINT_STATS("Rxdma2host ring mask (0-%d):%s",
5754 		       num_of_int_contexts, ring_mask);
5755 
5756 	index = 0;
5757 	for (i = 0; i < num_of_int_contexts; i++) {
5758 		index += qdf_snprint(&ring_mask[index],
5759 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5760 				     " %d",
5761 				     soc_cfg_ctx->int_host2rxdma_ring_mask[i]);
5762 	}
5763 
5764 	DP_PRINT_STATS("Host2rxdma ring mask (0-%d):%s",
5765 		       num_of_int_contexts, ring_mask);
5766 
5767 	DP_PRINT_STATS("Rx hash: %u ",
5768 		       soc_cfg_ctx->rx_hash);
5769 	DP_PRINT_STATS("Tso enabled: %u ",
5770 		       soc_cfg_ctx->tso_enabled);
5771 	DP_PRINT_STATS("Lro enabled: %u ",
5772 		       soc_cfg_ctx->lro_enabled);
5773 	DP_PRINT_STATS("Sg enabled: %u ",
5774 		       soc_cfg_ctx->sg_enabled);
5775 	DP_PRINT_STATS("Gro enabled: %u ",
5776 		       soc_cfg_ctx->gro_enabled);
5777 	DP_PRINT_STATS("TC based dynamic GRO: %u ",
5778 		       soc_cfg_ctx->tc_based_dynamic_gro);
5779 	DP_PRINT_STATS("TC ingress prio: %u ",
5780 		       soc_cfg_ctx->tc_ingress_prio);
5781 	DP_PRINT_STATS("rawmode enabled: %u ",
5782 		       soc_cfg_ctx->rawmode_enabled);
5783 	DP_PRINT_STATS("peer flow ctrl enabled: %u ",
5784 		       soc_cfg_ctx->peer_flow_ctrl_enabled);
5785 	DP_PRINT_STATS("napi enabled: %u ",
5786 		       soc_cfg_ctx->napi_enabled);
5787 	DP_PRINT_STATS("P2P Tcp Udp checksum offload: %u ",
5788 		       soc_cfg_ctx->p2p_tcp_udp_checksumoffload);
5789 	DP_PRINT_STATS("NAN Tcp Udp checksum offload: %u ",
5790 		       soc_cfg_ctx->nan_tcp_udp_checksumoffload);
5791 	DP_PRINT_STATS("Tcp Udp checksum offload: %u ",
5792 		       soc_cfg_ctx->tcp_udp_checksumoffload);
5793 	DP_PRINT_STATS("Defrag timeout check: %u ",
5794 		       soc_cfg_ctx->defrag_timeout_check);
5795 	DP_PRINT_STATS("Rx defrag min timeout: %u ",
5796 		       soc_cfg_ctx->rx_defrag_min_timeout);
5797 	DP_PRINT_STATS("WBM release ring: %u ",
5798 		       soc_cfg_ctx->wbm_release_ring);
5799 	DP_PRINT_STATS("TCL CMD_CREDIT ring: %u ",
5800 		       soc_cfg_ctx->tcl_cmd_credit_ring);
5801 	DP_PRINT_STATS("TCL Status ring: %u ",
5802 		       soc_cfg_ctx->tcl_status_ring);
5803 	DP_PRINT_STATS("REO Destination ring: %u ",
5804 		       soc_cfg_ctx->reo_dst_ring_size);
5805 	DP_PRINT_STATS("REO Reinject ring: %u ",
5806 		       soc_cfg_ctx->reo_reinject_ring);
5807 	DP_PRINT_STATS("RX release ring: %u ",
5808 		       soc_cfg_ctx->rx_release_ring);
5809 	DP_PRINT_STATS("REO Exception ring: %u ",
5810 		       soc_cfg_ctx->reo_exception_ring);
5811 	DP_PRINT_STATS("REO CMD ring: %u ",
5812 		       soc_cfg_ctx->reo_cmd_ring);
5813 	DP_PRINT_STATS("REO STATUS ring: %u ",
5814 		       soc_cfg_ctx->reo_status_ring);
5815 	DP_PRINT_STATS("RXDMA refill ring: %u ",
5816 		       soc_cfg_ctx->rxdma_refill_ring);
5817 	DP_PRINT_STATS("TX_desc limit_0: %u ",
5818 		       soc_cfg_ctx->tx_desc_limit_0);
5819 	DP_PRINT_STATS("TX_desc limit_1: %u ",
5820 		       soc_cfg_ctx->tx_desc_limit_1);
5821 	DP_PRINT_STATS("TX_desc limit_2: %u ",
5822 		       soc_cfg_ctx->tx_desc_limit_2);
5823 	DP_PRINT_STATS("TX device limit: %u ",
5824 		       soc_cfg_ctx->tx_device_limit);
5825 	DP_PRINT_STATS("TX sw internode queue: %u ",
5826 		       soc_cfg_ctx->tx_sw_internode_queue);
5827 	DP_PRINT_STATS("RXDMA err dst ring: %u ",
5828 		       soc_cfg_ctx->rxdma_err_dst_ring);
5829 	DP_PRINT_STATS("RX Flow Tag Enabled: %u ",
5830 		       soc_cfg_ctx->is_rx_flow_tag_enabled);
5831 	DP_PRINT_STATS("RX Flow Search Table Size (# of entries): %u ",
5832 		       soc_cfg_ctx->rx_flow_search_table_size);
5833 	DP_PRINT_STATS("RX Flow Search Table Per PDev : %u ",
5834 		       soc_cfg_ctx->is_rx_flow_search_table_per_pdev);
5835 	DP_PRINT_STATS("Rx desc pool size: %u ",
5836 		       soc_cfg_ctx->rx_sw_desc_num);
5837 }
5838 
5839 void
5840 dp_print_pdev_cfg_params(struct dp_pdev *pdev)
5841 {
5842 	struct wlan_cfg_dp_pdev_ctxt *pdev_cfg_ctx;
5843 
5844 	if (!pdev) {
5845 		dp_err("Context is null");
5846 		return;
5847 	}
5848 
5849 	pdev_cfg_ctx = pdev->wlan_cfg_ctx;
5850 
5851 	if (!pdev_cfg_ctx) {
5852 		dp_err("Context is null");
5853 		return;
5854 	}
5855 
5856 	DP_PRINT_STATS("Rx dma buf ring size: %d ",
5857 		       pdev_cfg_ctx->rx_dma_buf_ring_size);
5858 	DP_PRINT_STATS("DMA Mon buf ring size: %d ",
5859 		       pdev_cfg_ctx->dma_mon_buf_ring_size);
5860 	DP_PRINT_STATS("DMA Mon dest ring size: %d ",
5861 		       pdev_cfg_ctx->dma_rx_mon_dest_ring_size);
5862 	DP_PRINT_STATS("DMA Mon status ring size: %d ",
5863 		       pdev_cfg_ctx->dma_mon_status_ring_size);
5864 	DP_PRINT_STATS("Rxdma monitor desc ring: %d",
5865 		       pdev_cfg_ctx->rxdma_monitor_desc_ring);
5866 	DP_PRINT_STATS("Num mac rings: %d ",
5867 		       pdev_cfg_ctx->num_mac_rings);
5868 }
5869 
5870 void
5871 dp_print_ring_stat_from_hal(struct dp_soc *soc,  struct dp_srng *srng,
5872 			    enum hal_ring_type ring_type)
5873 {
5874 	uint32_t tailp;
5875 	uint32_t headp;
5876 	int32_t hw_headp = -1;
5877 	int32_t hw_tailp = -1;
5878 	uint32_t ring_usage;
5879 	const char *ring_name;
5880 
5881 	if (soc && srng && srng->hal_srng) {
5882 		ring_name = dp_srng_get_str_from_hal_ring_type(ring_type);
5883 		hal_get_sw_hptp(soc->hal_soc, srng->hal_srng, &tailp, &headp);
5884 		ring_usage = hal_get_ring_usage(srng->hal_srng,
5885 						ring_type, &headp, &tailp);
5886 
5887 		DP_PRINT_STATS("%s:SW: Head = %d Tail = %d Ring Usage = %u",
5888 			       ring_name, headp, tailp, ring_usage);
5889 
5890 		hal_get_hw_hptp(soc->hal_soc, srng->hal_srng, &hw_headp,
5891 				&hw_tailp, ring_type);
5892 		ring_usage = 0;
5893 		if (hw_headp >= 0 && tailp >= 0)
5894 			ring_usage =
5895 				hal_get_ring_usage(
5896 					srng->hal_srng, ring_type,
5897 					&hw_headp, &hw_tailp);
5898 		DP_PRINT_STATS("%s:HW: Head = %d Tail = %d Ring Usage = %u",
5899 			       ring_name, hw_headp, hw_tailp, ring_usage);
5900 	}
5901 }
5902 
5903 qdf_export_symbol(dp_print_ring_stat_from_hal);
5904 
5905 #ifdef FEATURE_TSO_STATS
5906 /**
5907  * dp_print_tso_seg_stats - tso segment stats
5908  * @pdev: pdev handle
5909  * @id: tso packet id
5910  *
5911  * Return: None
5912  */
5913 static void dp_print_tso_seg_stats(struct dp_pdev *pdev, uint32_t id)
5914 {
5915 	uint8_t num_seg;
5916 	uint32_t segid;
5917 
5918 	/* TSO LEVEL 2 - SEGMENT INFO */
5919 	num_seg = pdev->stats.tso_stats.tso_info.tso_packet_info[id].num_seg;
5920 	for (segid = 0; segid < CDP_MAX_TSO_SEGMENTS && segid < num_seg; segid++) {
5921 		DP_PRINT_STATS(
5922 			  "Segment id:[%u] fragments: %u | Segment Length %u | TCP Seq no.: %u | ip_id: %u",
5923 			  segid,
5924 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5925 			  .tso_seg[segid].num_frags,
5926 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5927 			  .tso_seg[segid].total_len,
5928 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5929 			  .tso_seg[segid].tso_flags.tcp_seq_num,
5930 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5931 			  .tso_seg[segid].tso_flags.ip_id);
5932 		DP_PRINT_STATS(
5933 			  "fin: %u syn: %u rst: %u psh: %u ack: %u urg: %u ece: %u cwr: %u ns: %u",
5934 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5935 			  .tso_seg[segid].tso_flags.fin,
5936 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5937 			  .tso_seg[segid].tso_flags.syn,
5938 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5939 			  .tso_seg[segid].tso_flags.rst,
5940 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5941 			  .tso_seg[segid].tso_flags.psh,
5942 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5943 			  .tso_seg[segid].tso_flags.ack,
5944 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5945 			  .tso_seg[segid].tso_flags.urg,
5946 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5947 			  .tso_seg[segid].tso_flags.ece,
5948 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5949 			  .tso_seg[segid].tso_flags.cwr,
5950 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5951 			  .tso_seg[segid].tso_flags.ns);
5952 	}
5953 }
5954 #else
5955 static inline
5956 void dp_print_tso_seg_stats(struct dp_pdev *pdev, uint32_t id)
5957 {
5958 }
5959 #endif /* FEATURE_TSO_STATS */
5960 
5961 /**
5962  * dp_print_mon_ring_stat_from_hal() - Print stat for monitor rings based
5963  *					on target
5964  * @pdev: physical device handle
5965  * @mac_id: mac id
5966  *
5967  * Return: void
5968  */
5969 static inline
5970 void dp_print_mon_ring_stat_from_hal(struct dp_pdev *pdev, uint8_t mac_id)
5971 {
5972 	if (pdev->soc->wlan_cfg_ctx->rxdma1_enable) {
5973 		dp_print_ring_stat_from_hal(pdev->soc,
5974 			&pdev->soc->rxdma_mon_buf_ring[mac_id],
5975 			RXDMA_MONITOR_BUF);
5976 		dp_print_ring_stat_from_hal(pdev->soc,
5977 			&pdev->soc->rxdma_mon_dst_ring[mac_id],
5978 			RXDMA_MONITOR_DST);
5979 		dp_print_ring_stat_from_hal(pdev->soc,
5980 			&pdev->soc->rxdma_mon_desc_ring[mac_id],
5981 			RXDMA_MONITOR_DESC);
5982 	}
5983 
5984 	dp_print_ring_stat_from_hal(pdev->soc,
5985 				    &pdev->soc->rxdma_mon_status_ring[mac_id],
5986 					RXDMA_MONITOR_STATUS);
5987 }
5988 
5989 #if defined(IPA_OFFLOAD) && defined(QCA_WIFI_QCN9224)
5990 /**
5991  * dp_print_wbm2sw_ring_stats_from_hal() - Print ring stats from hal for ipa
5992  *                                         use case
5993  * @pdev : physical device handle
5994  *
5995  * Return: void
5996  */
5997 static inline void
5998 dp_print_wbm2sw_ring_stats_from_hal(struct dp_pdev *pdev)
5999 {
6000 	uint8_t i = 0;
6001 
6002 	for (i = 0; i < pdev->soc->num_tcl_data_rings; i++) {
6003 		if (i != IPA_TX_COMP_RING_IDX)
6004 			dp_print_ring_stat_from_hal(pdev->soc,
6005 						    &pdev->soc->tx_comp_ring[i],
6006 						    WBM2SW_RELEASE);
6007 	}
6008 }
6009 #else
6010 static inline void
6011 dp_print_wbm2sw_ring_stats_from_hal(struct dp_pdev *pdev)
6012 {
6013 	uint8_t i = 0;
6014 
6015 	for (i = 0; i < pdev->soc->num_tcl_data_rings; i++)
6016 		dp_print_ring_stat_from_hal(pdev->soc,
6017 					    &pdev->soc->tx_comp_ring[i],
6018 					    WBM2SW_RELEASE);
6019 }
6020 #endif
6021 
6022 /*
6023  * Format is:
6024  * [0 18 1728, 1 15 1222, 2 24 1969,...]
6025  * 2 character space for [ and ]
6026  * 8 reo * 3 white space = 24
6027  * 8 char space for reo rings
6028  * 8 * 10 (uint32_t max value is 4294967295) = 80
6029  * 8 * 20 (uint64_t max value is 18446744073709551615) = 160
6030  * 8 commas
6031  * 1 for \0
6032  * Total of 283
6033  */
6034 #define DP_STATS_STR_LEN 283
6035 #ifndef WLAN_SOFTUMAC_SUPPORT
6036 static int
6037 dp_fill_rx_interrupt_ctx_stats(struct dp_intr *intr_ctx,
6038 			       char *buf, int buf_len)
6039 {
6040 	int i;
6041 	int pos = 0;
6042 
6043 	if (buf_len <= 0 || !buf) {
6044 		dp_err("incorrect buf or buf_len(%d)!", buf_len);
6045 		return pos;
6046 	}
6047 
6048 	for (i = 0; i < MAX_REO_DEST_RINGS; i++) {
6049 		if (intr_ctx->intr_stats.num_rx_ring_masks[i])
6050 			pos += qdf_scnprintf(buf + pos,
6051 					     buf_len - pos,
6052 					     "reo[%u]:%u ", i,
6053 					     intr_ctx->intr_stats.num_rx_ring_masks[i]);
6054 	}
6055 	return pos;
6056 }
6057 
6058 static int
6059 dp_fill_tx_interrupt_ctx_stats(struct dp_intr *intr_ctx,
6060 			       char *buf, int buf_len)
6061 {	int i;
6062 	int pos = 0;
6063 
6064 	if (buf_len <= 0 || !buf) {
6065 		dp_err("incorrect buf or buf_len(%d)!", buf_len);
6066 		return pos;
6067 	}
6068 
6069 	for (i = 0; i < MAX_TCL_DATA_RINGS; i++) {
6070 		if (intr_ctx->intr_stats.num_tx_ring_masks[i])
6071 			pos += qdf_scnprintf(buf + pos,
6072 					     buf_len - pos,
6073 					     "tx_comps[%u]:%u ", i,
6074 					     intr_ctx->intr_stats.num_tx_ring_masks[i]);
6075 	}
6076 	return pos;
6077 }
6078 
6079 static inline void dp_print_umac_ring_stats(struct dp_pdev *pdev)
6080 {
6081 	uint8_t i;
6082 
6083 	dp_print_ring_stat_from_hal(pdev->soc,
6084 				    &pdev->soc->wbm_idle_link_ring,
6085 				    WBM_IDLE_LINK);
6086 	dp_print_ring_stat_from_hal(pdev->soc,
6087 				    &pdev->soc->reo_exception_ring,
6088 				    REO_EXCEPTION);
6089 	dp_print_ring_stat_from_hal(pdev->soc,
6090 				    &pdev->soc->reo_reinject_ring,
6091 				    REO_REINJECT);
6092 	dp_print_ring_stat_from_hal(pdev->soc,
6093 				    &pdev->soc->reo_cmd_ring,
6094 				    REO_CMD);
6095 	dp_print_ring_stat_from_hal(pdev->soc,
6096 				    &pdev->soc->reo_status_ring,
6097 				    REO_STATUS);
6098 	dp_print_ring_stat_from_hal(pdev->soc,
6099 				    &pdev->soc->rx_rel_ring,
6100 				    WBM2SW_RELEASE);
6101 	dp_print_ring_stat_from_hal(pdev->soc,
6102 				    &pdev->soc->tcl_cmd_credit_ring,
6103 				    TCL_CMD_CREDIT);
6104 	dp_print_ring_stat_from_hal(pdev->soc,
6105 				    &pdev->soc->tcl_status_ring,
6106 				    TCL_STATUS);
6107 	dp_print_ring_stat_from_hal(pdev->soc,
6108 				    &pdev->soc->wbm_desc_rel_ring,
6109 				    SW2WBM_RELEASE);
6110 	for (i = 0; i < MAX_REO_DEST_RINGS; i++)
6111 		dp_print_ring_stat_from_hal(pdev->soc,
6112 					    &pdev->soc->reo_dest_ring[i],
6113 					    REO_DST);
6114 
6115 	for (i = 0; i < pdev->soc->num_tcl_data_rings; i++)
6116 		dp_print_ring_stat_from_hal(pdev->soc,
6117 					    &pdev->soc->tcl_data_ring[i],
6118 					    TCL_DATA);
6119 	dp_print_wbm2sw_ring_stats_from_hal(pdev);
6120 }
6121 
6122 static inline void dp_print_ce_ring_stats(struct dp_pdev *pdev) {}
6123 
6124 static inline void dp_print_tx_ring_stats(struct dp_soc *soc)
6125 {
6126 	uint8_t i;
6127 
6128 	for (i = 0; i < soc->num_tcl_data_rings; i++) {
6129 		DP_PRINT_STATS("Enqueue to SW2TCL%u: %u", i + 1,
6130 			       soc->stats.tx.tcl_enq[i]);
6131 		DP_PRINT_STATS("TX completions reaped from ring %u: %u",
6132 			       i, soc->stats.tx.tx_comp[i]);
6133 	}
6134 }
6135 
6136 static inline void dp_print_rx_ring_stats(struct dp_pdev *pdev)
6137 {
6138 	uint8_t dp_stats_str[DP_STATS_STR_LEN] = {'\0'};
6139 	uint8_t *buf = dp_stats_str;
6140 	size_t pos = 0;
6141 	size_t buf_len = DP_STATS_STR_LEN;
6142 	uint8_t i;
6143 
6144 	pos += qdf_scnprintf(buf + pos, buf_len - pos, "%s", "REO/msdus/bytes [");
6145 	for (i = 0; i < CDP_MAX_RX_RINGS; i++) {
6146 		if (!pdev->stats.rx.rcvd_reo[i].num)
6147 			continue;
6148 
6149 		pos += qdf_scnprintf(buf + pos, buf_len - pos,
6150 				     "%d %llu %llu, ",
6151 				     i, pdev->stats.rx.rcvd_reo[i].num,
6152 				     pdev->stats.rx.rcvd_reo[i].bytes);
6153 	}
6154 	pos += qdf_scnprintf(buf + pos, buf_len - pos, "%s", "]");
6155 	DP_PRINT_STATS("%s", dp_stats_str);
6156 }
6157 
6158 static inline void
6159 dp_print_rx_err_stats(struct dp_soc *soc, struct dp_pdev *pdev)
6160 {
6161 	uint8_t error_code;
6162 
6163 	DP_PRINT_STATS("intra-bss EAPOL drops: %u",
6164 		       soc->stats.rx.err.intrabss_eapol_drop);
6165 	DP_PRINT_STATS("mic errors %u",
6166 		       pdev->stats.rx.err.mic_err);
6167 	DP_PRINT_STATS("Invalid peer on rx path: %llu",
6168 		       pdev->soc->stats.rx.err.rx_invalid_peer.num);
6169 	DP_PRINT_STATS("sw_peer_id invalid %llu",
6170 		       pdev->soc->stats.rx.err.rx_invalid_peer_id.num);
6171 	DP_PRINT_STATS("packet_len invalid %llu",
6172 		       pdev->soc->stats.rx.err.rx_invalid_pkt_len.num);
6173 	DP_PRINT_STATS("sa or da idx invalid %u",
6174 		       pdev->soc->stats.rx.err.invalid_sa_da_idx);
6175 	DP_PRINT_STATS("defrag peer uninit %u",
6176 		       pdev->soc->stats.rx.err.defrag_peer_uninit);
6177 	DP_PRINT_STATS("pkts delivered no peer %u",
6178 		       pdev->soc->stats.rx.err.pkt_delivered_no_peer);
6179 	DP_PRINT_STATS("RX invalid cookie: %d",
6180 		       soc->stats.rx.err.invalid_cookie);
6181 	DP_PRINT_STATS("RX stale cookie: %d",
6182 		       soc->stats.rx.err.stale_cookie);
6183 	DP_PRINT_STATS("2k jump delba sent: %u",
6184 		       pdev->soc->stats.rx.err.rx_2k_jump_delba_sent);
6185 	DP_PRINT_STATS("2k jump msdu to stack: %u",
6186 		       pdev->soc->stats.rx.err.rx_2k_jump_to_stack);
6187 	DP_PRINT_STATS("2k jump msdu drop: %u",
6188 		       pdev->soc->stats.rx.err.rx_2k_jump_drop);
6189 	DP_PRINT_STATS("REO err oor msdu to stack %u",
6190 		       pdev->soc->stats.rx.err.reo_err_oor_to_stack);
6191 	DP_PRINT_STATS("REO err oor msdu drop: %u",
6192 		       pdev->soc->stats.rx.err.reo_err_oor_drop);
6193 	DP_PRINT_STATS("Rx err msdu rejected: %d",
6194 		       soc->stats.rx.err.rejected);
6195 	DP_PRINT_STATS("Rx raw frame dropped: %d",
6196 		       soc->stats.rx.err.raw_frm_drop);
6197 	DP_PRINT_STATS("Rx stale link desc cookie: %d",
6198 		       pdev->soc->stats.rx.err.invalid_link_cookie);
6199 	DP_PRINT_STATS("Rx nbuf sanity fails: %d",
6200 		       pdev->soc->stats.rx.err.nbuf_sanity_fail);
6201 	DP_PRINT_STATS("Rx refill duplicate link desc: %d",
6202 		       pdev->soc->stats.rx.err.dup_refill_link_desc);
6203 	DP_PRINT_STATS("Rx ipa smmu map duplicate: %d",
6204 		       pdev->soc->stats.rx.err.ipa_smmu_map_dup);
6205 	DP_PRINT_STATS("Rx ipa smmu unmap duplicate: %d",
6206 		       pdev->soc->stats.rx.err.ipa_smmu_unmap_dup);
6207 	DP_PRINT_STATS("Rx ipa smmu unmap no pipes: %d",
6208 		       pdev->soc->stats.rx.err.ipa_unmap_no_pipe);
6209 	DP_PRINT_STATS("PN-in-Dest error frame pn-check fail: %d",
6210 		       soc->stats.rx.err.pn_in_dest_check_fail);
6211 
6212 	DP_PRINT_STATS("Reo Statistics");
6213 	DP_PRINT_STATS("near_full: %u ", soc->stats.rx.near_full);
6214 	DP_PRINT_STATS("rbm error: %u msdus",
6215 		       pdev->soc->stats.rx.err.invalid_rbm);
6216 	DP_PRINT_STATS("hal ring access fail: %u msdus",
6217 		       pdev->soc->stats.rx.err.hal_ring_access_fail);
6218 
6219 	DP_PRINT_STATS("hal ring access full fail: %u msdus",
6220 		       pdev->soc->stats.rx.err.hal_ring_access_full_fail);
6221 
6222 	for (error_code = 0; error_code < HAL_REO_ERR_MAX;
6223 	     error_code++) {
6224 		if (!pdev->soc->stats.rx.err.reo_error[error_code])
6225 			continue;
6226 		DP_PRINT_STATS("Reo error number (%u): %u msdus",
6227 			       error_code,
6228 			       pdev->soc->stats.rx.err.reo_error[error_code]);
6229 	}
6230 }
6231 
6232 void dp_print_soc_tx_stats(struct dp_soc *soc)
6233 {
6234 	uint8_t desc_pool_id;
6235 
6236 	soc->stats.tx.desc_in_use = 0;
6237 
6238 	DP_PRINT_STATS("SOC Tx Stats:\n");
6239 
6240 	for (desc_pool_id = 0;
6241 	     desc_pool_id < wlan_cfg_get_num_tx_desc_pool(soc->wlan_cfg_ctx);
6242 	     desc_pool_id++)
6243 		soc->stats.tx.desc_in_use +=
6244 			soc->tx_desc[desc_pool_id].num_allocated;
6245 
6246 	DP_PRINT_STATS("Tx Descriptors In Use = %u",
6247 		       soc->stats.tx.desc_in_use);
6248 	DP_PRINT_STATS("Tx Invalid peer:");
6249 	DP_PRINT_STATS("	Packets = %llu",
6250 		       soc->stats.tx.tx_invalid_peer.num);
6251 	DP_PRINT_STATS("	Bytes = %llu",
6252 		       soc->stats.tx.tx_invalid_peer.bytes);
6253 	DP_PRINT_STATS("Packets dropped due to TCL ring full = %u %u %u %u",
6254 		       soc->stats.tx.tcl_ring_full[0],
6255 		       soc->stats.tx.tcl_ring_full[1],
6256 		       soc->stats.tx.tcl_ring_full[2],
6257 		       soc->stats.tx.tcl_ring_full[3]);
6258 	DP_PRINT_STATS("Tx invalid completion release = %u",
6259 		       soc->stats.tx.invalid_release_source);
6260 	DP_PRINT_STATS("TX invalid Desc from completion ring = %u",
6261 		       soc->stats.tx.invalid_tx_comp_desc);
6262 	DP_PRINT_STATS("Tx comp wbm internal error = %d : [%d %d %d %d]",
6263 		       soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_ALL],
6264 		       soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_BUFFER],
6265 		       soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_LINK_DESC],
6266 		       soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_MSDU_BUFF],
6267 		       soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_BUFF_REAPED]);
6268 	DP_PRINT_STATS("Tx comp non wbm internal error = %d",
6269 		       soc->stats.tx.non_wbm_internal_err);
6270 	DP_PRINT_STATS("Tx comp loop pkt limit hit = %d",
6271 		       soc->stats.tx.tx_comp_loop_pkt_limit_hit);
6272 	DP_PRINT_STATS("Tx comp HP out of sync2 = %d",
6273 		       soc->stats.tx.hp_oos2);
6274 	dp_print_tx_ppeds_stats(soc);
6275 }
6276 
6277 #define DP_INT_CTX_STATS_STRING_LEN 512
6278 void dp_print_soc_interrupt_stats(struct dp_soc *soc)
6279 {
6280 	char *buf;
6281 	char int_ctx_str[DP_INT_CTX_STATS_STRING_LEN] = {'\0'};
6282 	int i, pos, buf_len;
6283 	struct dp_intr_stats *intr_stats;
6284 
6285 	buf = int_ctx_str;
6286 	buf_len = DP_INT_CTX_STATS_STRING_LEN;
6287 
6288 	for (i = 0; i < WLAN_CFG_INT_NUM_CONTEXTS; i++) {
6289 		pos = 0;
6290 		qdf_mem_zero(int_ctx_str, sizeof(int_ctx_str));
6291 		intr_stats = &soc->intr_ctx[i].intr_stats;
6292 
6293 		if (!intr_stats->num_masks && !intr_stats->num_near_full_masks)
6294 			continue;
6295 
6296 		pos += qdf_scnprintf(buf + pos,
6297 				     buf_len - pos,
6298 				     "%2u[%3d] - Total:%u ",
6299 				     i,
6300 				     hif_get_int_ctx_irq_num(soc->hif_handle,
6301 							     i),
6302 				     intr_stats->num_masks);
6303 
6304 		if (soc->intr_ctx[i].tx_ring_mask)
6305 			pos += dp_fill_tx_interrupt_ctx_stats(&soc->intr_ctx[i],
6306 							      buf + pos,
6307 							      buf_len - pos);
6308 
6309 		if (soc->intr_ctx[i].rx_ring_mask)
6310 			pos += dp_fill_rx_interrupt_ctx_stats(&soc->intr_ctx[i],
6311 							      buf + pos,
6312 							      buf_len - pos);
6313 		if (soc->intr_ctx[i].rx_err_ring_mask)
6314 			pos += qdf_scnprintf(buf + pos,
6315 					     buf_len - pos,
6316 					     "reo_err:%u ",
6317 					     intr_stats->num_rx_err_ring_masks);
6318 
6319 		if (soc->intr_ctx[i].rx_wbm_rel_ring_mask)
6320 			pos += qdf_scnprintf(buf + pos,
6321 					     buf_len - pos,
6322 					     "wbm_rx_err:%u ",
6323 					     intr_stats->num_rx_wbm_rel_ring_masks);
6324 
6325 		if (soc->intr_ctx[i].rxdma2host_ring_mask)
6326 			pos += qdf_scnprintf(buf + pos,
6327 					     buf_len - pos,
6328 					     "rxdma2_host_err:%u ",
6329 					     intr_stats->num_rxdma2host_ring_masks);
6330 
6331 		if (soc->intr_ctx[i].rx_near_full_grp_1_mask)
6332 			pos += qdf_scnprintf(buf + pos,
6333 					     buf_len - pos,
6334 					     "rx_near_full_grp_1:%u ",
6335 					     intr_stats->num_near_full_masks);
6336 
6337 		if (soc->intr_ctx[i].rx_near_full_grp_2_mask)
6338 			pos += qdf_scnprintf(buf + pos,
6339 					     buf_len - pos,
6340 					     "rx_near_full_grp_2:%u ",
6341 					     intr_stats->num_near_full_masks);
6342 		if (soc->intr_ctx[i].tx_ring_near_full_mask)
6343 			pos += qdf_scnprintf(buf + pos,
6344 					     buf_len - pos,
6345 					     "tx_near_full:%u ",
6346 					     intr_stats->num_near_full_masks);
6347 
6348 		dp_info("%s", int_ctx_str);
6349 	}
6350 }
6351 #else
6352 static inline void dp_print_umac_ring_stats(struct dp_pdev *pdev) {}
6353 
6354 static inline void dp_print_ce_ring_stats(struct dp_pdev *pdev)
6355 {
6356 	hif_ce_print_ring_stats(pdev->soc->hif_handle);
6357 }
6358 
6359 static inline void dp_print_tx_ring_stats(struct dp_soc *soc)
6360 {
6361 	uint8_t i;
6362 
6363 	for (i = 0; i < MAX_TCL_DATA_RINGS; i++) {
6364 		DP_PRINT_STATS("Enqueue to Tx ring %u: %u", i + 1,
6365 			       soc->stats.tx.tcl_enq[i]);
6366 		DP_PRINT_STATS("TX completions reaped from ring %u: %u",
6367 			       i, soc->stats.tx.tx_comp[i]);
6368 	}
6369 }
6370 
6371 static inline void dp_print_rx_ring_stats(struct dp_pdev *pdev)
6372 {
6373 	uint8_t dp_stats_str[DP_STATS_STR_LEN] = {'\0'};
6374 	uint8_t *buf = dp_stats_str;
6375 	size_t pos = 0;
6376 	size_t buf_len = DP_STATS_STR_LEN;
6377 	uint8_t i;
6378 
6379 	pos += qdf_scnprintf(buf + pos, buf_len - pos, "%s", "RX/msdus/bytes [");
6380 	for (i = 0; i < CDP_MAX_RX_RINGS; i++) {
6381 		if (!pdev->stats.rx.rcvd_reo[i].num)
6382 			continue;
6383 
6384 		pos += qdf_scnprintf(buf + pos, buf_len - pos,
6385 				     "%d %llu %llu, ",
6386 				     i, pdev->stats.rx.rcvd_reo[i].num,
6387 				     pdev->stats.rx.rcvd_reo[i].bytes);
6388 	}
6389 	pos += qdf_scnprintf(buf + pos, buf_len - pos, "%s", "]");
6390 	DP_PRINT_STATS("%s", dp_stats_str);
6391 }
6392 
6393 static inline void
6394 dp_print_rx_err_stats(struct dp_soc *soc, struct dp_pdev *pdev)
6395 {
6396 	DP_PRINT_STATS("intra-bss EAPOL drops: %u",
6397 		       soc->stats.rx.err.intrabss_eapol_drop);
6398 	DP_PRINT_STATS("mic errors %u",
6399 		       pdev->stats.rx.err.mic_err);
6400 	DP_PRINT_STATS("2k jump msdu drop: %u",
6401 		       pdev->soc->stats.rx.err.rx_2k_jump_drop);
6402 	DP_PRINT_STATS("REO err oor msdu drop: %u",
6403 		       pdev->soc->stats.rx.err.reo_err_oor_drop);
6404 	DP_PRINT_STATS("Invalid peer on rx path: %llu",
6405 		       pdev->soc->stats.rx.err.rx_invalid_peer.num);
6406 	DP_PRINT_STATS("sw_peer_id invalid %llu",
6407 		       pdev->soc->stats.rx.err.rx_invalid_peer_id.num);
6408 	DP_PRINT_STATS("packet_len invalid %llu",
6409 		       pdev->soc->stats.rx.err.rx_invalid_pkt_len.num);
6410 	DP_PRINT_STATS("sa or da idx invalid %u",
6411 		       pdev->soc->stats.rx.err.invalid_sa_da_idx);
6412 	DP_PRINT_STATS("defrag peer uninit %u",
6413 		       pdev->soc->stats.rx.err.defrag_peer_uninit);
6414 	DP_PRINT_STATS("pkts delivered no peer %u",
6415 		       pdev->soc->stats.rx.err.pkt_delivered_no_peer);
6416 	DP_PRINT_STATS("RX invalid cookie: %d",
6417 		       soc->stats.rx.err.invalid_cookie);
6418 	DP_PRINT_STATS("RX stale cookie: %d",
6419 		       soc->stats.rx.err.stale_cookie);
6420 	DP_PRINT_STATS("Rx err msdu rejected: %d",
6421 		       soc->stats.rx.err.rejected);
6422 	DP_PRINT_STATS("Rx raw frame dropped: %d",
6423 		       soc->stats.rx.err.raw_frm_drop);
6424 	DP_PRINT_STATS("Rx nbuf sanity fails: %d",
6425 		       pdev->soc->stats.rx.err.nbuf_sanity_fail);
6426 	DP_PRINT_STATS("PN-in-Dest error frame pn-check fail: %d",
6427 		       soc->stats.rx.err.pn_in_dest_check_fail);
6428 }
6429 
6430 void dp_print_soc_tx_stats(struct dp_soc *soc)
6431 {
6432 	uint8_t desc_pool_id;
6433 
6434 	soc->stats.tx.desc_in_use = 0;
6435 
6436 	DP_PRINT_STATS("SOC Tx Stats:\n");
6437 
6438 	for (desc_pool_id = 0;
6439 	     desc_pool_id < wlan_cfg_get_num_tx_desc_pool(soc->wlan_cfg_ctx);
6440 	     desc_pool_id++)
6441 		soc->stats.tx.desc_in_use +=
6442 			soc->tx_desc[desc_pool_id].num_allocated;
6443 
6444 	DP_PRINT_STATS("Tx Descriptors In Use = %u",
6445 		       soc->stats.tx.desc_in_use);
6446 	DP_PRINT_STATS("Tx Invalid peer:");
6447 	DP_PRINT_STATS("	Packets = %llu",
6448 		       soc->stats.tx.tx_invalid_peer.num);
6449 	DP_PRINT_STATS("	Bytes = %llu",
6450 		       soc->stats.tx.tx_invalid_peer.bytes);
6451 	DP_PRINT_STATS("Packets dropped due to Tx ring full = %u",
6452 		       soc->stats.tx.tcl_ring_full[0]);
6453 	DP_PRINT_STATS("Tx invalid completion release = %u",
6454 		       soc->stats.tx.invalid_release_source);
6455 	DP_PRINT_STATS("TX invalid Desc from completion ring = %u",
6456 		       soc->stats.tx.invalid_tx_comp_desc);
6457 	dp_print_tx_ppeds_stats(soc);
6458 }
6459 
6460 /* TODO: print CE intr stats? */
6461 void dp_print_soc_interrupt_stats(struct dp_soc *soc) {}
6462 #endif
6463 
6464 void
6465 dp_print_ring_stats(struct dp_pdev *pdev)
6466 {
6467 	struct dp_soc *soc = pdev->soc;
6468 	uint32_t i;
6469 	int mac_id;
6470 	int lmac_id;
6471 
6472 	if (hif_rtpm_get(HIF_RTPM_GET_SYNC, HIF_RTPM_ID_DP_RING_STATS))
6473 		return;
6474 
6475 	dp_print_ce_ring_stats(pdev);
6476 	dp_print_umac_ring_stats(pdev);
6477 
6478 	if (pdev->soc->features.dmac_cmn_src_rxbuf_ring_enabled) {
6479 		for (i = 0; i < pdev->soc->num_rx_refill_buf_rings; i++) {
6480 			dp_print_ring_stat_from_hal
6481 				(pdev->soc, &pdev->soc->rx_refill_buf_ring[i],
6482 				 RXDMA_BUF);
6483 		}
6484 	} else {
6485 		lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc, 0,
6486 						     pdev->pdev_id);
6487 		dp_print_ring_stat_from_hal
6488 			(pdev->soc, &pdev->soc->rx_refill_buf_ring[lmac_id],
6489 			 RXDMA_BUF);
6490 	}
6491 
6492 	dp_print_ring_stat_from_hal(pdev->soc,
6493 				    &pdev->rx_refill_buf_ring2,
6494 				    RXDMA_BUF);
6495 
6496 	for (i = 0; i < MAX_RX_MAC_RINGS; i++)
6497 		dp_print_ring_stat_from_hal(pdev->soc,
6498 					    &pdev->rx_mac_buf_ring[i],
6499 					    RXDMA_BUF);
6500 
6501 	for (mac_id = 0;
6502 	     mac_id  < soc->wlan_cfg_ctx->num_rxdma_status_rings_per_pdev;
6503 	     mac_id++) {
6504 		lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc,
6505 						     mac_id, pdev->pdev_id);
6506 
6507 		dp_print_mon_ring_stat_from_hal(pdev, lmac_id);
6508 	}
6509 
6510 	for (i = 0; i < soc->wlan_cfg_ctx->num_rxdma_dst_rings_per_pdev; i++) {
6511 		lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc,
6512 						     i, pdev->pdev_id);
6513 
6514 		dp_print_ring_stat_from_hal(pdev->soc,
6515 					    &pdev->soc->rxdma_err_dst_ring
6516 					    [lmac_id],
6517 					    RXDMA_DST);
6518 	}
6519 
6520 	dp_print_txmon_ring_stat_from_hal(pdev);
6521 
6522 #ifdef WLAN_SUPPORT_PPEDS
6523 	if (pdev->soc->arch_ops.dp_txrx_ppeds_rings_status)
6524 		pdev->soc->arch_ops.dp_txrx_ppeds_rings_status(pdev->soc);
6525 #endif
6526 	hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_DP_RING_STATS);
6527 }
6528 
6529 /**
6530  * dp_print_common_rates_info(): Print common rate for tx or rx
6531  * @pkt_type_array: rate type array contains rate info
6532  *
6533  * Return: void
6534  */
6535 static inline void
6536 dp_print_common_rates_info(struct cdp_pkt_type *pkt_type_array)
6537 {
6538 	uint8_t mcs, pkt_type;
6539 
6540 	DP_PRINT_STATS("MSDU Count");
6541 	for (pkt_type = 0; pkt_type < DOT11_MAX; pkt_type++) {
6542 		for (mcs = 0; mcs < MAX_MCS; mcs++) {
6543 			if (!cdp_rate_string[pkt_type][mcs].valid)
6544 				continue;
6545 
6546 			DP_PRINT_STATS("	%s = %d",
6547 				       cdp_rate_string[pkt_type][mcs].mcs_type,
6548 				       pkt_type_array[pkt_type].mcs_count[mcs]);
6549 		}
6550 
6551 		DP_PRINT_STATS("\n");
6552 	}
6553 }
6554 
6555 /**
6556  * dp_print_common_ppdu_rates_info(): Print ppdu rate for tx or rx
6557  * @pkt_type_array: rate type array contains rate info
6558  * @pkt_type: packet type
6559  *
6560  * Return: void
6561  */
6562 #ifdef WLAN_FEATURE_11BE
6563 static inline void
6564 dp_print_common_ppdu_rates_info(struct cdp_pkt_type *pkt_type_array,
6565 				enum cdp_packet_type pkt_type)
6566 {
6567 	uint8_t mcs;
6568 
6569 	DP_PRINT_STATS("PPDU Count");
6570 	for (mcs = 0; mcs < MAX_MCS; mcs++) {
6571 		if (pkt_type == DOT11_AX) {
6572 			if (!dp_ppdu_rate_string[0][mcs].valid)
6573 				continue;
6574 
6575 			DP_PRINT_STATS("	%s = %d",
6576 				       dp_ppdu_rate_string[0][mcs].mcs_type,
6577 				       pkt_type_array->mcs_count[mcs]);
6578 		} else if (pkt_type == DOT11_BE) {
6579 			if (!dp_ppdu_rate_string[1][mcs].valid)
6580 				continue;
6581 
6582 			DP_PRINT_STATS("	%s = %d",
6583 				       dp_ppdu_rate_string[1][mcs].mcs_type,
6584 				       pkt_type_array->mcs_count[mcs]);
6585 		}
6586 	}
6587 
6588 	DP_PRINT_STATS("\n");
6589 }
6590 #else
6591 static inline void
6592 dp_print_common_ppdu_rates_info(struct cdp_pkt_type *pkt_type_array,
6593 				enum cdp_packet_type pkt_type)
6594 {
6595 	uint8_t mcs;
6596 
6597 	DP_PRINT_STATS("PPDU Count");
6598 	for (mcs = 0; mcs < MAX_MCS; mcs++) {
6599 		if (!dp_ppdu_rate_string[0][mcs].valid)
6600 			continue;
6601 
6602 		DP_PRINT_STATS("	%s = %d",
6603 			       dp_ppdu_rate_string[0][mcs].mcs_type,
6604 			       pkt_type_array->mcs_count[mcs]);
6605 	}
6606 
6607 	DP_PRINT_STATS("\n");
6608 }
6609 #endif
6610 
6611 /**
6612  * dp_print_mu_be_ppdu_rates_info(): Print mu be rate for tx or rx
6613  * @pkt_type_array: rate type array contains rate info
6614  *
6615  * Return: void
6616  */
6617 #ifdef WLAN_FEATURE_11BE
6618 static inline void
6619 dp_print_mu_be_ppdu_rates_info(struct cdp_pkt_type *pkt_type_array)
6620 {
6621 	uint8_t mcs, pkt_type;
6622 
6623 	DP_PRINT_STATS("PPDU Count");
6624 	for (pkt_type = 0; pkt_type < TXRX_TYPE_MU_MAX; pkt_type++) {
6625 		for (mcs = 0; mcs < MAX_MCS; mcs++) {
6626 			if (!dp_mu_be_rate_string[pkt_type][mcs].valid)
6627 				continue;
6628 
6629 			DP_PRINT_STATS("	%s = %d",
6630 				       dp_mu_be_rate_string[pkt_type][mcs].mcs_type,
6631 				       pkt_type_array[pkt_type].mcs_count[mcs]);
6632 		}
6633 
6634 		DP_PRINT_STATS("\n");
6635 	}
6636 }
6637 #endif
6638 
6639 static inline void
6640 dp_print_mu_ppdu_rates_info(struct cdp_rx_mu *rx_mu)
6641 {
6642 	uint8_t mcs, pkt_type;
6643 
6644 	DP_PRINT_STATS("PPDU Count");
6645 	for (pkt_type = 0; pkt_type < TXRX_TYPE_MU_MAX; pkt_type++) {
6646 		for (mcs = 0; mcs < MAX_MCS; mcs++) {
6647 			if (!dp_mu_rate_string[pkt_type][mcs].valid)
6648 				continue;
6649 
6650 			DP_PRINT_STATS("	%s = %d",
6651 				dp_mu_rate_string[pkt_type][mcs].mcs_type,
6652 				rx_mu[pkt_type].ppdu.mcs_count[mcs]);
6653 		}
6654 
6655 		DP_PRINT_STATS("\n");
6656 	}
6657 }
6658 
6659 #ifdef WLAN_FEATURE_11BE
6660 static inline void dp_print_rx_bw_stats(struct dp_pdev *pdev)
6661 {
6662 	DP_PRINT_STATS("BW Counts = 20MHz %d, 40MHz %d, 80MHz %d, 160MHz %d, 320MHz %d",
6663 		       pdev->stats.rx.bw[0], pdev->stats.rx.bw[1],
6664 		       pdev->stats.rx.bw[2], pdev->stats.rx.bw[3],
6665 		       pdev->stats.rx.bw[4]);
6666 }
6667 
6668 static inline void dp_print_tx_bw_stats(struct dp_pdev *pdev)
6669 {
6670 	DP_PRINT_STATS("BW Counts = 20MHz %d, 40MHz %d, 80MHz %d, 160MHz %d, 320MHz %d",
6671 		       pdev->stats.tx.bw[0], pdev->stats.tx.bw[1],
6672 		       pdev->stats.tx.bw[2], pdev->stats.tx.bw[3],
6673 		       pdev->stats.tx.bw[4]);
6674 }
6675 #else
6676 static inline void dp_print_rx_bw_stats(struct dp_pdev *pdev)
6677 {
6678 	DP_PRINT_STATS("BW Counts = 20MHz %d, 40MHz %d, 80MHz %d, 160MHz %d",
6679 		       pdev->stats.rx.bw[0], pdev->stats.rx.bw[1],
6680 		       pdev->stats.rx.bw[2], pdev->stats.rx.bw[3]);
6681 }
6682 
6683 static inline void dp_print_tx_bw_stats(struct dp_pdev *pdev)
6684 {
6685 	DP_PRINT_STATS("BW Counts = 20MHz %d, 40MHz %d, 80MHz %d, 160MHz %d",
6686 		       pdev->stats.tx.bw[0], pdev->stats.tx.bw[1],
6687 		       pdev->stats.tx.bw[2], pdev->stats.tx.bw[3]);
6688 }
6689 #endif
6690 
6691 void dp_print_rx_rates(struct dp_vdev *vdev)
6692 {
6693 	struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev;
6694 	uint8_t i;
6695 	uint8_t index = 0;
6696 	char nss[DP_NSS_LENGTH];
6697 
6698 	DP_PRINT_STATS("Rx Rate Info:\n");
6699 	dp_print_common_rates_info(pdev->stats.rx.pkt_type);
6700 
6701 	index = 0;
6702 	for (i = 0; i < SS_COUNT; i++) {
6703 		index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index,
6704 				     " %d", pdev->stats.rx.nss[i]);
6705 	}
6706 	DP_PRINT_STATS("NSS(1-8) = %s",
6707 		       nss);
6708 
6709 	DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
6710 		       pdev->stats.rx.sgi_count[0],
6711 		       pdev->stats.rx.sgi_count[1],
6712 		       pdev->stats.rx.sgi_count[2],
6713 		       pdev->stats.rx.sgi_count[3]);
6714 
6715 	dp_print_rx_bw_stats(pdev);
6716 
6717 	DP_PRINT_STATS("Reception Type ="
6718 		       "SU: %d MU_MIMO:%d MU_OFDMA:%d MU_OFDMA_MIMO:%d",
6719 		       pdev->stats.rx.reception_type[0],
6720 		       pdev->stats.rx.reception_type[1],
6721 		       pdev->stats.rx.reception_type[2],
6722 		       pdev->stats.rx.reception_type[3]);
6723 	DP_PRINT_STATS("Aggregation:\n");
6724 	DP_PRINT_STATS("Number of Msdu's Part of Ampdus = %d",
6725 		       pdev->stats.rx.ampdu_cnt);
6726 	DP_PRINT_STATS("Number of Msdu's With No Mpdu Level Aggregation : %d",
6727 		       pdev->stats.rx.non_ampdu_cnt);
6728 	DP_PRINT_STATS("Number of Msdu's Part of Amsdu: %d",
6729 		       pdev->stats.rx.amsdu_cnt);
6730 	DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation: %d",
6731 		       pdev->stats.rx.non_amsdu_cnt);
6732 }
6733 
6734 void dp_print_tx_rates(struct dp_vdev *vdev)
6735 {
6736 	struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev;
6737 
6738 	DP_PRINT_STATS("Tx Rate Info:\n");
6739 	dp_print_common_rates_info(pdev->stats.tx.pkt_type);
6740 
6741 	DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
6742 		       pdev->stats.tx.sgi_count[0],
6743 		       pdev->stats.tx.sgi_count[1],
6744 		       pdev->stats.tx.sgi_count[2],
6745 		       pdev->stats.tx.sgi_count[3]);
6746 
6747 	dp_print_tx_bw_stats(pdev);
6748 
6749 	DP_PRINT_STATS("OFDMA = %d", pdev->stats.tx.ofdma);
6750 	DP_PRINT_STATS("STBC = %d", pdev->stats.tx.stbc);
6751 	DP_PRINT_STATS("LDPC = %d", pdev->stats.tx.ldpc);
6752 	DP_PRINT_STATS("Retries = %d", pdev->stats.tx.retries);
6753 	DP_PRINT_STATS("Last ack rssi = %d\n", pdev->stats.tx.last_ack_rssi);
6754 	DP_PRINT_STATS("Number of PPDU's with Punctured Preamble = %d",
6755 			   pdev->stats.tx.pream_punct_cnt);
6756 
6757 	DP_PRINT_STATS("Aggregation:\n");
6758 	DP_PRINT_STATS("Number of Msdu's Part of Ampdus = %d",
6759 		       pdev->stats.tx.ampdu_cnt);
6760 	DP_PRINT_STATS("Number of Msdu's With No Mpdu Level Aggregation : %d",
6761 		       pdev->stats.tx.non_ampdu_cnt);
6762 	DP_PRINT_STATS("Number of Msdu's Part of Amsdu = %d",
6763 		       pdev->stats.tx.amsdu_cnt);
6764 	DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation = %d",
6765 		       pdev->stats.tx.non_amsdu_cnt);
6766 }
6767 
6768 /**
6769  * dp_print_nss(): Print nss count
6770  * @nss: printable nss count array
6771  * @pnss: nss count array
6772  * @ss_count: number of nss
6773  *
6774  * Return: void
6775  */
6776 static void dp_print_nss(char *nss, uint32_t *pnss, uint32_t ss_count)
6777 {
6778 	uint32_t index;
6779 	uint8_t i;
6780 
6781 	index = 0;
6782 	for (i = 0; i < ss_count; i++) {
6783 		index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index,
6784 				     " %d", *(pnss + i));
6785 	}
6786 }
6787 
6788 /**
6789  * dp_print_jitter_stats(): Print per-tid jitter stats
6790  * @peer: DP peer object
6791  * @pdev: DP pdev object
6792  *
6793  * Return: void
6794  */
6795 #ifdef WLAN_PEER_JITTER
6796 static void dp_print_jitter_stats(struct dp_peer *peer, struct dp_pdev *pdev)
6797 {
6798 	uint8_t tid = 0;
6799 
6800 	if (!pdev || !wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx))
6801 		return;
6802 
6803 	if (!peer->txrx_peer || !peer->txrx_peer->jitter_stats)
6804 		return;
6805 
6806 	DP_PRINT_STATS("Per TID Tx HW Enqueue-Comp Jitter Stats:\n");
6807 	for (tid = 0; tid < qdf_min(CDP_DATA_TID_MAX, DP_MAX_TIDS); tid++) {
6808 		struct cdp_peer_tid_stats *rx_tid =
6809 					&peer->txrx_peer->jitter_stats[tid];
6810 
6811 		DP_PRINT_STATS("Node tid = %d\n"
6812 				"Average Jiiter            : %u (us)\n"
6813 				"Average Delay             : %u (us)\n"
6814 				"Total Average error count : %llu\n"
6815 				"Total Success Count       : %llu\n"
6816 				"Total Drop                : %llu\n",
6817 				tid,
6818 				rx_tid->tx_avg_jitter,
6819 				rx_tid->tx_avg_delay,
6820 				rx_tid->tx_avg_err,
6821 				rx_tid->tx_total_success,
6822 				rx_tid->tx_drop);
6823 	}
6824 }
6825 #else
6826 static void dp_print_jitter_stats(struct dp_peer *peer, struct dp_pdev *pdev)
6827 {
6828 }
6829 #endif /* WLAN_PEER_JITTER */
6830 
6831 #ifdef QCA_PEER_EXT_STATS
6832 /**
6833  * dp_print_hist_stats() - Print delay histogram
6834  * @hstats: Histogram stats
6835  * @hist_type: histogram type
6836  *
6837  * Return: void
6838  */
6839 static void dp_print_hist_stats(struct cdp_hist_stats *hstats,
6840 				enum cdp_hist_types hist_type)
6841 {
6842 	uint8_t index = 0;
6843 	uint64_t count = 0;
6844 	bool hist_delay_data = false;
6845 
6846 	for (index = 0; index < CDP_HIST_BUCKET_MAX; index++) {
6847 		count = hstats->hist.freq[index];
6848 		if (!count)
6849 			continue;
6850 		hist_delay_data = true;
6851 		if (hist_type == CDP_HIST_TYPE_SW_ENQEUE_DELAY)
6852 			DP_PRINT_STATS("%s:  Packets = %llu",
6853 				       dp_vow_str_sw_enq_delay(index),
6854 				       count);
6855 		else if (hist_type == CDP_HIST_TYPE_HW_COMP_DELAY)
6856 			DP_PRINT_STATS("%s:  Packets = %llu",
6857 				       dp_vow_str_fw_to_hw_delay(index),
6858 				       count);
6859 		else if (hist_type == CDP_HIST_TYPE_REAP_STACK)
6860 			DP_PRINT_STATS("%s:  Packets = %llu",
6861 				       dp_vow_str_intfrm_delay(index),
6862 				       count);
6863 	}
6864 
6865 	/*
6866 	 * If none of the buckets have any packets,
6867 	 * there is no need to display the stats.
6868 	 */
6869 	if (hist_delay_data) {
6870 		DP_PRINT_STATS("Min = %u", hstats->min);
6871 		DP_PRINT_STATS("Max = %u", hstats->max);
6872 		DP_PRINT_STATS("Avg = %u\n", hstats->avg);
6873 	}
6874 }
6875 
6876 #ifdef CONFIG_SAWF
6877 /**
6878  * dp_accumulate_delay_avg_stats(): Accumulate the delay average stats
6879  * @stats: cdp_delay_tid stats
6880  * @dst_stats: Destination delay Tx stats
6881  * @tid: TID value
6882  *
6883  * Return: void
6884  */
6885 static void dp_accumulate_delay_avg_stats(struct cdp_delay_tid_stats stats[]
6886 					  [CDP_MAX_TXRX_CTX],
6887 					  struct cdp_delay_tx_stats *dst_stats,
6888 					  uint8_t tid)
6889 {
6890 	uint32_t num_rings = 0;
6891 	uint8_t ring_id;
6892 
6893 	for (ring_id = 0; ring_id < CDP_MAX_TXRX_CTX; ring_id++) {
6894 		struct cdp_delay_tx_stats *dstats =
6895 				&stats[tid][ring_id].tx_delay;
6896 
6897 		if (dstats->swdelay_avg || dstats->hwdelay_avg) {
6898 			dst_stats->nwdelay_avg += dstats->nwdelay_avg;
6899 			dst_stats->swdelay_avg += dstats->swdelay_avg;
6900 			dst_stats->hwdelay_avg += dstats->hwdelay_avg;
6901 			num_rings++;
6902 		}
6903 	}
6904 
6905 	if (!num_rings)
6906 		return;
6907 
6908 	dst_stats->nwdelay_avg = qdf_do_div(dst_stats->nwdelay_avg,
6909 					    num_rings);
6910 	dst_stats->swdelay_avg = qdf_do_div(dst_stats->swdelay_avg,
6911 					    num_rings);
6912 	dst_stats->hwdelay_avg = qdf_do_div(dst_stats->hwdelay_avg,
6913 					    num_rings);
6914 }
6915 #else
6916 static void dp_accumulate_delay_avg_stats(struct cdp_delay_tid_stats stats[]
6917 					  [CDP_MAX_TXRX_CTX],
6918 					  struct cdp_delay_tx_stats *dst_stats,
6919 					  uint8_t tid)
6920 {
6921 }
6922 #endif
6923 
6924 /**
6925  * dp_accumulate_delay_tid_stats(): Accumulate the tid stats to the
6926  *                                  hist stats.
6927  * @soc: DP SoC handle
6928  * @stats: cdp_delay_tid stats
6929  * @dst_hstats: Destination histogram to copy tid stats
6930  * @tid: TID value
6931  * @mode:
6932  *
6933  * Return: void
6934  */
6935 static void dp_accumulate_delay_tid_stats(struct dp_soc *soc,
6936 					  struct cdp_delay_tid_stats stats[]
6937 					  [CDP_MAX_TXRX_CTX],
6938 					  struct cdp_hist_stats *dst_hstats,
6939 					  uint8_t tid, uint32_t mode)
6940 {
6941 	uint8_t ring_id;
6942 
6943 	if (wlan_cfg_get_dp_soc_nss_cfg(soc->wlan_cfg_ctx)) {
6944 		struct cdp_delay_tid_stats *dstats =
6945 				&stats[tid][0];
6946 		struct cdp_hist_stats *src_hstats = NULL;
6947 
6948 		switch (mode) {
6949 		case CDP_HIST_TYPE_SW_ENQEUE_DELAY:
6950 			src_hstats = &dstats->tx_delay.tx_swq_delay;
6951 			break;
6952 		case CDP_HIST_TYPE_HW_COMP_DELAY:
6953 			src_hstats = &dstats->tx_delay.hwtx_delay;
6954 			break;
6955 		case CDP_HIST_TYPE_REAP_STACK:
6956 			src_hstats = &dstats->rx_delay.to_stack_delay;
6957 			break;
6958 		default:
6959 			break;
6960 		}
6961 
6962 		if (src_hstats)
6963 			dp_copy_hist_stats(src_hstats, dst_hstats);
6964 
6965 		return;
6966 	}
6967 
6968 	for (ring_id = 0; ring_id < CDP_MAX_TXRX_CTX; ring_id++) {
6969 		struct cdp_delay_tid_stats *dstats =
6970 				&stats[tid][ring_id];
6971 		struct cdp_hist_stats *src_hstats = NULL;
6972 
6973 		switch (mode) {
6974 		case CDP_HIST_TYPE_SW_ENQEUE_DELAY:
6975 			src_hstats = &dstats->tx_delay.tx_swq_delay;
6976 			break;
6977 		case CDP_HIST_TYPE_HW_COMP_DELAY:
6978 			src_hstats = &dstats->tx_delay.hwtx_delay;
6979 			break;
6980 		case CDP_HIST_TYPE_REAP_STACK:
6981 			src_hstats = &dstats->rx_delay.to_stack_delay;
6982 			break;
6983 		default:
6984 			break;
6985 		}
6986 
6987 		if (src_hstats)
6988 			dp_accumulate_hist_stats(src_hstats, dst_hstats);
6989 	}
6990 }
6991 
6992 /**
6993  * dp_peer_print_tx_delay_stats() - Print peer delay stats
6994  * @pdev: DP pdev handle
6995  * @peer: DP peer handle
6996  *
6997  * Return: void
6998  */
6999 static void dp_peer_print_tx_delay_stats(struct dp_pdev *pdev,
7000 					 struct dp_peer *peer)
7001 {
7002 	struct dp_peer_delay_stats *delay_stats;
7003 	struct dp_soc *soc = NULL;
7004 	struct cdp_hist_stats hist_stats;
7005 	uint8_t tid;
7006 
7007 	if (!peer || !peer->txrx_peer)
7008 		return;
7009 
7010 	if (!pdev || !pdev->soc)
7011 		return;
7012 
7013 	soc = pdev->soc;
7014 	if (!wlan_cfg_is_peer_ext_stats_enabled(soc->wlan_cfg_ctx))
7015 		return;
7016 
7017 	delay_stats = peer->txrx_peer->delay_stats;
7018 	if (!delay_stats)
7019 		return;
7020 
7021 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
7022 		DP_PRINT_STATS("----TID: %d----", tid);
7023 		DP_PRINT_STATS("Software Enqueue Delay:");
7024 		dp_hist_init(&hist_stats, CDP_HIST_TYPE_SW_ENQEUE_DELAY);
7025 		dp_accumulate_delay_tid_stats(soc, delay_stats->delay_tid_stats,
7026 					      &hist_stats, tid,
7027 					      CDP_HIST_TYPE_SW_ENQEUE_DELAY);
7028 		dp_print_hist_stats(&hist_stats, CDP_HIST_TYPE_SW_ENQEUE_DELAY);
7029 
7030 		DP_PRINT_STATS("Hardware Transmission Delay:");
7031 		dp_hist_init(&hist_stats, CDP_HIST_TYPE_HW_COMP_DELAY);
7032 		dp_accumulate_delay_tid_stats(soc, delay_stats->delay_tid_stats,
7033 					      &hist_stats, tid,
7034 					      CDP_HIST_TYPE_HW_COMP_DELAY);
7035 		dp_print_hist_stats(&hist_stats, CDP_HIST_TYPE_HW_COMP_DELAY);
7036 	}
7037 }
7038 
7039 /**
7040  * dp_peer_print_rx_delay_stats() - Print peer delay stats
7041  * @pdev: DP pdev handle
7042  * @peer: DP peer handle
7043  *
7044  * Return: void
7045  */
7046 static void dp_peer_print_rx_delay_stats(struct dp_pdev *pdev,
7047 					 struct dp_peer *peer)
7048 {
7049 	struct dp_peer_delay_stats *delay_stats;
7050 	struct dp_soc *soc = NULL;
7051 	struct cdp_hist_stats hist_stats;
7052 	uint8_t tid;
7053 
7054 	if (!peer || !peer->txrx_peer)
7055 		return;
7056 
7057 	if (!pdev || !pdev->soc)
7058 		return;
7059 
7060 	soc = pdev->soc;
7061 	if (!wlan_cfg_is_peer_ext_stats_enabled(soc->wlan_cfg_ctx))
7062 		return;
7063 
7064 	delay_stats = peer->txrx_peer->delay_stats;
7065 	if (!delay_stats)
7066 		return;
7067 
7068 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
7069 		DP_PRINT_STATS("----TID: %d----", tid);
7070 		DP_PRINT_STATS("Rx Reap2stack Deliver Delay:");
7071 		dp_hist_init(&hist_stats, CDP_HIST_TYPE_REAP_STACK);
7072 		dp_accumulate_delay_tid_stats(soc, delay_stats->delay_tid_stats,
7073 					      &hist_stats, tid,
7074 					      CDP_HIST_TYPE_REAP_STACK);
7075 		dp_print_hist_stats(&hist_stats, CDP_HIST_TYPE_REAP_STACK);
7076 	}
7077 }
7078 
7079 #else
7080 static inline void dp_peer_print_tx_delay_stats(struct dp_pdev *pdev,
7081 						struct dp_peer *peer)
7082 {
7083 }
7084 
7085 static inline void dp_peer_print_rx_delay_stats(struct dp_pdev *pdev,
7086 						struct dp_peer *peer)
7087 {
7088 }
7089 #endif
7090 
7091 #ifdef WLAN_FEATURE_11BE
7092 void dp_print_peer_txrx_stats_be(struct cdp_peer_stats *peer_stats,
7093 				 enum peer_stats_type stats_type)
7094 {
7095 	uint8_t i;
7096 
7097 	if (stats_type == PEER_TX_STATS) {
7098 		DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d 320MHZ %d\n",
7099 			       peer_stats->tx.bw[CMN_BW_20MHZ],
7100 			       peer_stats->tx.bw[CMN_BW_40MHZ],
7101 			       peer_stats->tx.bw[CMN_BW_80MHZ],
7102 			       peer_stats->tx.bw[CMN_BW_160MHZ],
7103 			       peer_stats->tx.bw[CMN_BW_320MHZ]);
7104 		DP_PRINT_STATS("Punctured BW Counts = NO_PUNC %d 20MHz %d 40MHz %d 80MHz %d 120MHz %d\n",
7105 			       peer_stats->tx.punc_bw[NO_PUNCTURE],
7106 			       peer_stats->tx.punc_bw[PUNCTURED_20MHZ],
7107 			       peer_stats->tx.punc_bw[PUNCTURED_40MHZ],
7108 			       peer_stats->tx.punc_bw[PUNCTURED_80MHZ],
7109 			       peer_stats->tx.punc_bw[PUNCTURED_120MHZ]);
7110 		DP_PRINT_STATS("RU Locations");
7111 		for (i = 0; i < RU_INDEX_MAX; i++)
7112 			DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
7113 				       cdp_ru_string[i].ru_type,
7114 				       peer_stats->tx.ru_loc[i].num_msdu,
7115 				       peer_stats->tx.ru_loc[i].num_mpdu,
7116 				       peer_stats->tx.ru_loc[i].mpdu_tried);
7117 		dp_print_common_ppdu_rates_info(&peer_stats->tx.su_be_ppdu_cnt,
7118 						DOT11_BE);
7119 		dp_print_mu_be_ppdu_rates_info(&peer_stats->tx.mu_be_ppdu_cnt[0]);
7120 
7121 	} else {
7122 		DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d 320MHZ %d",
7123 			       peer_stats->rx.bw[CMN_BW_20MHZ],
7124 			       peer_stats->rx.bw[CMN_BW_40MHZ],
7125 			       peer_stats->rx.bw[CMN_BW_80MHZ],
7126 			       peer_stats->rx.bw[CMN_BW_160MHZ],
7127 			       peer_stats->rx.bw[CMN_BW_320MHZ]);
7128 		DP_PRINT_STATS("Punctured BW Counts = NO_PUNC %d 20MHz %d 40MHz %d 80MHz %d 120MHz %d\n",
7129 			       peer_stats->rx.punc_bw[NO_PUNCTURE],
7130 			       peer_stats->rx.punc_bw[PUNCTURED_20MHZ],
7131 			       peer_stats->rx.punc_bw[PUNCTURED_40MHZ],
7132 			       peer_stats->rx.punc_bw[PUNCTURED_80MHZ],
7133 			       peer_stats->rx.punc_bw[PUNCTURED_120MHZ]);
7134 		dp_print_common_ppdu_rates_info(&peer_stats->rx.su_be_ppdu_cnt,
7135 						DOT11_BE);
7136 		dp_print_mu_be_ppdu_rates_info(&peer_stats->rx.mu_be_ppdu_cnt[0]);
7137 	}
7138 }
7139 #else
7140 void dp_print_peer_txrx_stats_be(struct cdp_peer_stats *peer_stats,
7141 				 enum peer_stats_type stats_type)
7142 {
7143 }
7144 #endif
7145 
7146 void dp_print_peer_txrx_stats_li(struct cdp_peer_stats *peer_stats,
7147 				 enum peer_stats_type stats_type)
7148 {
7149 	if (stats_type == PEER_TX_STATS) {
7150 		DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d\n",
7151 			       peer_stats->tx.bw[CMN_BW_20MHZ],
7152 			       peer_stats->tx.bw[CMN_BW_40MHZ],
7153 			       peer_stats->tx.bw[CMN_BW_80MHZ],
7154 			       peer_stats->tx.bw[CMN_BW_160MHZ]);
7155 		DP_PRINT_STATS("RU Locations");
7156 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
7157 			       cdp_ru_string[RU_26_INDEX].ru_type,
7158 			       peer_stats->tx.ru_loc[RU_26_INDEX].num_msdu,
7159 			       peer_stats->tx.ru_loc[RU_26_INDEX].num_mpdu,
7160 			       peer_stats->tx.ru_loc[RU_26_INDEX].mpdu_tried);
7161 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
7162 			       cdp_ru_string[RU_52_INDEX].ru_type,
7163 			       peer_stats->tx.ru_loc[RU_52_INDEX].num_msdu,
7164 			       peer_stats->tx.ru_loc[RU_52_INDEX].num_mpdu,
7165 			       peer_stats->tx.ru_loc[RU_52_INDEX].mpdu_tried);
7166 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
7167 			       cdp_ru_string[RU_106_INDEX].ru_type,
7168 			       peer_stats->tx.ru_loc[RU_106_INDEX].num_msdu,
7169 			       peer_stats->tx.ru_loc[RU_106_INDEX].num_mpdu,
7170 			       peer_stats->tx.ru_loc[RU_106_INDEX].mpdu_tried);
7171 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
7172 			       cdp_ru_string[RU_242_INDEX].ru_type,
7173 			       peer_stats->tx.ru_loc[RU_242_INDEX].num_msdu,
7174 			       peer_stats->tx.ru_loc[RU_242_INDEX].num_mpdu,
7175 			       peer_stats->tx.ru_loc[RU_242_INDEX].mpdu_tried);
7176 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
7177 			       cdp_ru_string[RU_484_INDEX].ru_type,
7178 			       peer_stats->tx.ru_loc[RU_484_INDEX].num_msdu,
7179 			       peer_stats->tx.ru_loc[RU_484_INDEX].num_mpdu,
7180 			       peer_stats->tx.ru_loc[RU_484_INDEX].mpdu_tried);
7181 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
7182 			       cdp_ru_string[RU_996_INDEX].ru_type,
7183 			       peer_stats->tx.ru_loc[RU_996_INDEX].num_msdu,
7184 			       peer_stats->tx.ru_loc[RU_996_INDEX].num_mpdu,
7185 			       peer_stats->tx.ru_loc[RU_996_INDEX].mpdu_tried);
7186 	} else {
7187 		DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d",
7188 			       peer_stats->rx.bw[CMN_BW_20MHZ],
7189 			       peer_stats->rx.bw[CMN_BW_40MHZ],
7190 			       peer_stats->rx.bw[CMN_BW_80MHZ],
7191 			       peer_stats->rx.bw[CMN_BW_160MHZ]);
7192 	}
7193 }
7194 
7195 void dp_print_peer_txrx_stats_rh(struct cdp_peer_stats *peer_stats,
7196 				 enum peer_stats_type stats_type)
7197 {
7198 	if (stats_type == PEER_TX_STATS) {
7199 		DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d\n",
7200 			       peer_stats->tx.bw[CMN_BW_20MHZ],
7201 			       peer_stats->tx.bw[CMN_BW_40MHZ],
7202 			       peer_stats->tx.bw[CMN_BW_80MHZ],
7203 			       peer_stats->tx.bw[CMN_BW_160MHZ]);
7204 		DP_PRINT_STATS("RU Locations");
7205 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
7206 			       cdp_ru_string[RU_26_INDEX].ru_type,
7207 			       peer_stats->tx.ru_loc[RU_26_INDEX].num_msdu,
7208 			       peer_stats->tx.ru_loc[RU_26_INDEX].num_mpdu,
7209 			       peer_stats->tx.ru_loc[RU_26_INDEX].mpdu_tried);
7210 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
7211 			       cdp_ru_string[RU_52_INDEX].ru_type,
7212 			       peer_stats->tx.ru_loc[RU_52_INDEX].num_msdu,
7213 			       peer_stats->tx.ru_loc[RU_52_INDEX].num_mpdu,
7214 			       peer_stats->tx.ru_loc[RU_52_INDEX].mpdu_tried);
7215 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
7216 			       cdp_ru_string[RU_106_INDEX].ru_type,
7217 			       peer_stats->tx.ru_loc[RU_106_INDEX].num_msdu,
7218 			       peer_stats->tx.ru_loc[RU_106_INDEX].num_mpdu,
7219 			       peer_stats->tx.ru_loc[RU_106_INDEX].mpdu_tried);
7220 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
7221 			       cdp_ru_string[RU_242_INDEX].ru_type,
7222 			       peer_stats->tx.ru_loc[RU_242_INDEX].num_msdu,
7223 			       peer_stats->tx.ru_loc[RU_242_INDEX].num_mpdu,
7224 			       peer_stats->tx.ru_loc[RU_242_INDEX].mpdu_tried);
7225 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
7226 			       cdp_ru_string[RU_484_INDEX].ru_type,
7227 			       peer_stats->tx.ru_loc[RU_484_INDEX].num_msdu,
7228 			       peer_stats->tx.ru_loc[RU_484_INDEX].num_mpdu,
7229 			       peer_stats->tx.ru_loc[RU_484_INDEX].mpdu_tried);
7230 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
7231 			       cdp_ru_string[RU_996_INDEX].ru_type,
7232 			       peer_stats->tx.ru_loc[RU_996_INDEX].num_msdu,
7233 			       peer_stats->tx.ru_loc[RU_996_INDEX].num_mpdu,
7234 			       peer_stats->tx.ru_loc[RU_996_INDEX].mpdu_tried);
7235 	} else {
7236 		DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d",
7237 			       peer_stats->rx.bw[CMN_BW_20MHZ],
7238 			       peer_stats->rx.bw[CMN_BW_40MHZ],
7239 			       peer_stats->rx.bw[CMN_BW_80MHZ],
7240 			       peer_stats->rx.bw[CMN_BW_160MHZ]);
7241 	}
7242 }
7243 
7244 #ifdef REO_SHARED_QREF_TABLE_EN
7245 static void dp_peer_print_reo_qref_table(struct dp_peer *peer)
7246 {
7247 	struct hal_soc *hal;
7248 	int i;
7249 	uint64_t *reo_qref_addr;
7250 	uint32_t peer_idx;
7251 
7252 	hal = (struct hal_soc *)peer->vdev->pdev->soc->hal_soc;
7253 
7254 	if (!hal_reo_shared_qaddr_is_enable((hal_soc_handle_t)hal))
7255 		return;
7256 
7257 	if ((!hal->reo_qref.non_mlo_reo_qref_table_vaddr) ||
7258 	    (!hal->reo_qref.mlo_reo_qref_table_vaddr)) {
7259 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
7260 			  FL("REO shared table not allocated"));
7261 		return;
7262 	}
7263 
7264 	if (IS_MLO_DP_LINK_PEER(peer))
7265 		return;
7266 
7267 	if (IS_MLO_DP_MLD_PEER(peer)) {
7268 		hal = (struct hal_soc *)
7269 			  peer->vdev->pdev->soc->hal_soc;
7270 		peer_idx = (peer->peer_id - HAL_ML_PEER_ID_START) *
7271 			    DP_MAX_TIDS;
7272 		reo_qref_addr =
7273 			&hal->reo_qref.mlo_reo_qref_table_vaddr[peer_idx];
7274 	} else {
7275 		peer_idx = (peer->peer_id * DP_MAX_TIDS);
7276 		reo_qref_addr =
7277 			&hal->reo_qref.non_mlo_reo_qref_table_vaddr[peer_idx];
7278 	}
7279 	DP_PRINT_STATS("Reo Qref table for peer_id: %d\n", peer->peer_id);
7280 
7281 	for (i = 0; i < DP_MAX_TIDS; i++)
7282 		DP_PRINT_STATS("    Tid [%d]  :%llx", i, reo_qref_addr[i]);
7283 }
7284 #else
7285 static inline void dp_peer_print_reo_qref_table(struct dp_peer *peer)
7286 {
7287 }
7288 #endif
7289 
7290 void dp_print_peer_stats(struct dp_peer *peer,
7291 			 struct cdp_peer_stats *peer_stats)
7292 {
7293 	uint8_t i;
7294 	uint32_t index;
7295 	uint32_t j;
7296 	char nss[DP_NSS_LENGTH];
7297 	char mu_group_id[DP_MU_GROUP_LENGTH];
7298 	struct dp_pdev *pdev;
7299 	uint32_t *pnss;
7300 	enum cdp_mu_packet_type rx_mu_type;
7301 	struct cdp_rx_mu *rx_mu;
7302 
7303 	pdev = peer->vdev->pdev;
7304 
7305 	DP_PRINT_STATS("Node Tx Stats:\n");
7306 	DP_PRINT_STATS("Total Packet Completions = %llu",
7307 		       peer_stats->tx.comp_pkt.num);
7308 	DP_PRINT_STATS("Total Bytes Completions = %llu",
7309 		       peer_stats->tx.comp_pkt.bytes);
7310 	DP_PRINT_STATS("Success Packets = %llu",
7311 		       peer_stats->tx.tx_success.num);
7312 	DP_PRINT_STATS("Success Bytes = %llu",
7313 		       peer_stats->tx.tx_success.bytes);
7314 	DP_PRINT_STATS("Success Packets in TWT Session = %llu",
7315 		       peer_stats->tx.tx_success_twt.num);
7316 	DP_PRINT_STATS("Success Bytes in TWT Session = %llu",
7317 		       peer_stats->tx.tx_success_twt.bytes);
7318 	DP_PRINT_STATS("Unicast Success Packets = %llu",
7319 		       peer_stats->tx.ucast.num);
7320 	DP_PRINT_STATS("Unicast Success Bytes = %llu",
7321 		       peer_stats->tx.ucast.bytes);
7322 	DP_PRINT_STATS("Multicast Success Packets = %llu",
7323 		       peer_stats->tx.mcast.num);
7324 	DP_PRINT_STATS("Multicast Success Bytes = %llu",
7325 		       peer_stats->tx.mcast.bytes);
7326 	DP_PRINT_STATS("Broadcast Success Packets = %llu",
7327 		       peer_stats->tx.bcast.num);
7328 	DP_PRINT_STATS("Broadcast Success Bytes = %llu",
7329 		       peer_stats->tx.bcast.bytes);
7330 	DP_PRINT_STATS("Packets Successfully Sent after one or more retry = %d",
7331 		       peer_stats->tx.retry_count);
7332 	DP_PRINT_STATS("Packets Successfully Sent after more than one retry = %d",
7333 		       peer_stats->tx.multiple_retry_count);
7334 	DP_PRINT_STATS("Packets Failed = %d",
7335 		       peer_stats->tx.tx_failed);
7336 	DP_PRINT_STATS("Packets Failed due to retry threshold breach = %d",
7337 		       peer_stats->tx.failed_retry_count);
7338 	DP_PRINT_STATS("Packets In OFDMA = %d",
7339 		       peer_stats->tx.ofdma);
7340 	DP_PRINT_STATS("Packets In STBC = %d",
7341 		       peer_stats->tx.stbc);
7342 	DP_PRINT_STATS("Packets In LDPC = %d",
7343 		       peer_stats->tx.ldpc);
7344 	DP_PRINT_STATS("Packet Retries = %d",
7345 		       peer_stats->tx.retries);
7346 	DP_PRINT_STATS("MSDU's Part of AMSDU = %d",
7347 		       peer_stats->tx.amsdu_cnt);
7348 	DP_PRINT_STATS("Msdu's As Part of Ampdu = %d",
7349 		       peer_stats->tx.non_ampdu_cnt);
7350 	DP_PRINT_STATS("Msdu's As Ampdu = %d",
7351 		       peer_stats->tx.ampdu_cnt);
7352 	DP_PRINT_STATS("Last Packet RSSI = %d",
7353 		       peer_stats->tx.last_ack_rssi);
7354 	DP_PRINT_STATS("Dropped At FW: Removed Pkts = %llu",
7355 		       peer_stats->tx.dropped.fw_rem.num);
7356 	DP_PRINT_STATS("Release source not TQM = %u",
7357 		       peer_stats->tx.release_src_not_tqm);
7358 	if (pdev && !wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) {
7359 		DP_PRINT_STATS("Dropped At FW: Removed bytes = %llu",
7360 			peer_stats->tx.dropped.fw_rem.bytes);
7361 	}
7362 	DP_PRINT_STATS("Dropped At FW: Removed transmitted = %d",
7363 		       peer_stats->tx.dropped.fw_rem_tx);
7364 	DP_PRINT_STATS("Dropped At FW: Removed Untransmitted = %d",
7365 		       peer_stats->tx.dropped.fw_rem_notx);
7366 	DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason1 = %u",
7367 		       peer_stats->tx.dropped.fw_reason1);
7368 	DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason2 = %u",
7369 		       peer_stats->tx.dropped.fw_reason2);
7370 	DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason3 = %u",
7371 		       peer_stats->tx.dropped.fw_reason3);
7372 	DP_PRINT_STATS("Dropped At FW:removed untransmitted disable queue = %u",
7373 		       peer_stats->tx.dropped.fw_rem_queue_disable);
7374 	DP_PRINT_STATS("Dropped At FW: removed untransmitted no match = %u",
7375 		       peer_stats->tx.dropped.fw_rem_no_match);
7376 	DP_PRINT_STATS("Dropped due to HW threshold criteria = %u",
7377 		       peer_stats->tx.dropped.drop_threshold);
7378 	DP_PRINT_STATS("Dropped due Link desc not available drop in HW = %u",
7379 		       peer_stats->tx.dropped.drop_link_desc_na);
7380 	DP_PRINT_STATS("Drop bit set or invalid flow = %u",
7381 		       peer_stats->tx.dropped.invalid_drop);
7382 	DP_PRINT_STATS("MCAST vdev drop in HW = %u",
7383 		       peer_stats->tx.dropped.mcast_vdev_drop);
7384 	DP_PRINT_STATS("Dropped : Age Out = %d",
7385 		       peer_stats->tx.dropped.age_out);
7386 	DP_PRINT_STATS("Dropped : Invalid Reason = %u",
7387 		       peer_stats->tx.dropped.invalid_rr);
7388 	DP_PRINT_STATS("NAWDS : ");
7389 	DP_PRINT_STATS("Nawds multicast Drop Tx Packet = %d",
7390 		       peer_stats->tx.nawds_mcast_drop);
7391 	DP_PRINT_STATS("	Nawds multicast  Tx Packet Count = %llu",
7392 		       peer_stats->tx.nawds_mcast.num);
7393 	DP_PRINT_STATS("	Nawds multicast  Tx Packet Bytes = %llu",
7394 		       peer_stats->tx.nawds_mcast.bytes);
7395 
7396 	DP_PRINT_STATS("PPDU's = %d", peer_stats->tx.tx_ppdus);
7397 	DP_PRINT_STATS("Number of PPDU's with Punctured Preamble = %d",
7398 		       peer_stats->tx.pream_punct_cnt);
7399 	DP_PRINT_STATS("MPDU's Successful = %d",
7400 		       peer_stats->tx.tx_mpdus_success);
7401 	DP_PRINT_STATS("MPDU's Tried = %d", peer_stats->tx.tx_mpdus_tried);
7402 
7403 	DP_PRINT_STATS("Rate Info:");
7404 	dp_print_common_rates_info(peer_stats->tx.pkt_type);
7405 
7406 	DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
7407 		       peer_stats->tx.sgi_count[0],
7408 		       peer_stats->tx.sgi_count[1],
7409 		       peer_stats->tx.sgi_count[2],
7410 		       peer_stats->tx.sgi_count[3]);
7411 
7412 	DP_PRINT_STATS("Wireless Mutlimedia ");
7413 	DP_PRINT_STATS("	 Best effort = %d",
7414 		       peer_stats->tx.wme_ac_type[0]);
7415 	DP_PRINT_STATS("	 Background= %d",
7416 		       peer_stats->tx.wme_ac_type[1]);
7417 	DP_PRINT_STATS("	 Video = %d",
7418 		       peer_stats->tx.wme_ac_type[2]);
7419 	DP_PRINT_STATS("	 Voice = %d",
7420 		       peer_stats->tx.wme_ac_type[3]);
7421 
7422 	DP_PRINT_STATS("Excess Retries per AC ");
7423 	DP_PRINT_STATS("	 Best effort = %d",
7424 		       peer_stats->tx.excess_retries_per_ac[0]);
7425 	DP_PRINT_STATS("	 Background= %d",
7426 		       peer_stats->tx.excess_retries_per_ac[1]);
7427 	DP_PRINT_STATS("	 Video = %d",
7428 		       peer_stats->tx.excess_retries_per_ac[2]);
7429 	DP_PRINT_STATS("	 Voice = %d",
7430 		       peer_stats->tx.excess_retries_per_ac[3]);
7431 
7432 	pnss = &peer_stats->tx.nss[0];
7433 	dp_print_nss(nss, pnss, SS_COUNT);
7434 
7435 	DP_PRINT_STATS("NSS(1-8) = %s", nss);
7436 
7437 	DP_PRINT_STATS("Transmit Type :");
7438 	DP_PRINT_STATS("MSDUs Success: SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d",
7439 		       peer_stats->tx.transmit_type[SU].num_msdu,
7440 		       peer_stats->tx.transmit_type[MU_MIMO].num_msdu,
7441 		       peer_stats->tx.transmit_type[MU_OFDMA].num_msdu,
7442 		       peer_stats->tx.transmit_type[MU_MIMO_OFDMA].num_msdu);
7443 
7444 	DP_PRINT_STATS("MPDUs Success: SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d",
7445 		       peer_stats->tx.transmit_type[SU].num_mpdu,
7446 		       peer_stats->tx.transmit_type[MU_MIMO].num_mpdu,
7447 		       peer_stats->tx.transmit_type[MU_OFDMA].num_mpdu,
7448 		       peer_stats->tx.transmit_type[MU_MIMO_OFDMA].num_mpdu);
7449 
7450 	DP_PRINT_STATS("MPDUs Tried: SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d",
7451 		       peer_stats->tx.transmit_type[SU].mpdu_tried,
7452 		       peer_stats->tx.transmit_type[MU_MIMO].mpdu_tried,
7453 		       peer_stats->tx.transmit_type[MU_OFDMA].mpdu_tried,
7454 		       peer_stats->tx.transmit_type[MU_MIMO_OFDMA].mpdu_tried);
7455 
7456 	for (i = 0; i < MAX_MU_GROUP_ID;) {
7457 		index = 0;
7458 		for (j = 0; j < DP_MU_GROUP_SHOW && i < MAX_MU_GROUP_ID;
7459 		     j++) {
7460 			index += qdf_snprint(&mu_group_id[index],
7461 					     DP_MU_GROUP_LENGTH - index,
7462 					     " %d",
7463 					     peer_stats->tx.mu_group_id[i]);
7464 			i++;
7465 		}
7466 
7467 		DP_PRINT_STATS("User position list for GID %02d->%d: [%s]",
7468 			       i - DP_MU_GROUP_SHOW, i - 1, mu_group_id);
7469 	}
7470 
7471 	DP_PRINT_STATS("Last Packet RU index [%d], Size [%d]",
7472 		       peer_stats->tx.ru_start, peer_stats->tx.ru_tones);
7473 
7474 	DP_PRINT_STATS("Aggregation:");
7475 	DP_PRINT_STATS("Number of Msdu's Part of Amsdu = %d",
7476 		       peer_stats->tx.amsdu_cnt);
7477 	DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation = %d",
7478 		       peer_stats->tx.non_amsdu_cnt);
7479 
7480 	DP_PRINT_STATS("Bytes and Packets transmitted  in last one sec:");
7481 	DP_PRINT_STATS("	Bytes transmitted in last sec: %d",
7482 		       peer_stats->tx.tx_byte_rate);
7483 	DP_PRINT_STATS("	Data transmitted in last sec: %d",
7484 		       peer_stats->tx.tx_data_rate);
7485 
7486 	if (pdev && pdev->soc->arch_ops.txrx_print_peer_stats)
7487 		pdev->soc->arch_ops.txrx_print_peer_stats(peer_stats,
7488 							  PEER_TX_STATS);
7489 
7490 	if (!IS_MLO_DP_LINK_PEER(peer)) {
7491 		dp_print_jitter_stats(peer, pdev);
7492 		dp_peer_print_tx_delay_stats(pdev, peer);
7493 	}
7494 
7495 	if (IS_MLO_DP_MLD_PEER(peer))
7496 		DP_PRINT_STATS("TX Invalid Link ID Packet Count = %u",
7497 			       peer_stats->tx.inval_link_id_pkt_cnt);
7498 
7499 	DP_PRINT_STATS("Node Rx Stats:");
7500 	DP_PRINT_STATS("Packets Sent To Stack = %llu",
7501 		       peer_stats->rx.to_stack.num);
7502 	DP_PRINT_STATS("Bytes Sent To Stack = %llu",
7503 		       peer_stats->rx.to_stack.bytes);
7504 	for (i = 0; i <  CDP_MAX_RX_RINGS; i++) {
7505 		DP_PRINT_STATS("Ring Id = %d", i);
7506 		DP_PRINT_STATS("	Packets Received = %llu",
7507 			       peer_stats->rx.rcvd_reo[i].num);
7508 		DP_PRINT_STATS("	Bytes Received = %llu",
7509 			       peer_stats->rx.rcvd_reo[i].bytes);
7510 	}
7511 	for (i = 0; i < CDP_MAX_LMACS; i++)
7512 		DP_PRINT_STATS("Packets Received on lmac[%d] = %llu ( %llu )",
7513 			       i, peer_stats->rx.rx_lmac[i].num,
7514 			       peer_stats->rx.rx_lmac[i].bytes);
7515 
7516 	DP_PRINT_STATS("Unicast Packets Received = %llu",
7517 		       peer_stats->rx.unicast.num);
7518 	DP_PRINT_STATS("Unicast Bytes Received = %llu",
7519 		       peer_stats->rx.unicast.bytes);
7520 	DP_PRINT_STATS("Multicast Packets Received = %llu",
7521 		       peer_stats->rx.multicast.num);
7522 	DP_PRINT_STATS("Multicast Bytes Received = %llu",
7523 		       peer_stats->rx.multicast.bytes);
7524 	DP_PRINT_STATS("Broadcast Packets Received = %llu",
7525 		       peer_stats->rx.bcast.num);
7526 	DP_PRINT_STATS("Broadcast Bytes Received = %llu",
7527 		       peer_stats->rx.bcast.bytes);
7528 	DP_PRINT_STATS("Packets Sent To Stack in TWT Session = %llu",
7529 		       peer_stats->rx.to_stack_twt.num);
7530 	DP_PRINT_STATS("Bytes Sent To Stack in TWT Session = %llu",
7531 		       peer_stats->rx.to_stack_twt.bytes);
7532 	DP_PRINT_STATS("Intra BSS Packets Received = %llu",
7533 		       peer_stats->rx.intra_bss.pkts.num);
7534 	DP_PRINT_STATS("Intra BSS Bytes Received = %llu",
7535 		       peer_stats->rx.intra_bss.pkts.bytes);
7536 	DP_PRINT_STATS("Intra BSS Packets Failed = %llu",
7537 		       peer_stats->rx.intra_bss.fail.num);
7538 	DP_PRINT_STATS("Intra BSS Bytes Failed = %llu",
7539 		       peer_stats->rx.intra_bss.fail.bytes);
7540 	DP_PRINT_STATS("Intra BSS MDNS Packets Not Forwarded  = %d",
7541 		       peer_stats->rx.intra_bss.mdns_no_fwd);
7542 	DP_PRINT_STATS("Raw Packets Received = %llu",
7543 		       peer_stats->rx.raw.num);
7544 	DP_PRINT_STATS("Raw Bytes Received = %llu",
7545 		       peer_stats->rx.raw.bytes);
7546 	DP_PRINT_STATS("Errors: MIC Errors = %d",
7547 		       peer_stats->rx.err.mic_err);
7548 	DP_PRINT_STATS("Errors: Decryption Errors = %d",
7549 		       peer_stats->rx.err.decrypt_err);
7550 	DP_PRINT_STATS("Errors: PN Errors = %d",
7551 		       peer_stats->rx.err.pn_err);
7552 	DP_PRINT_STATS("Errors: OOR Errors = %d",
7553 		       peer_stats->rx.err.oor_err);
7554 	DP_PRINT_STATS("Errors: 2k Jump Errors = %d",
7555 		       peer_stats->rx.err.jump_2k_err);
7556 	DP_PRINT_STATS("Errors: RXDMA Wifi Parse Errors = %d",
7557 		       peer_stats->rx.err.rxdma_wifi_parse_err);
7558 	DP_PRINT_STATS("Msdu's Received As Part of Ampdu = %d",
7559 		       peer_stats->rx.non_ampdu_cnt);
7560 	DP_PRINT_STATS("Msdu's Received As Ampdu = %d",
7561 		       peer_stats->rx.ampdu_cnt);
7562 	DP_PRINT_STATS("Msdu's Received Not Part of Amsdu's = %d",
7563 		       peer_stats->rx.non_amsdu_cnt);
7564 	DP_PRINT_STATS("MSDUs Received As Part of Amsdu = %d",
7565 		       peer_stats->rx.amsdu_cnt);
7566 	DP_PRINT_STATS("MSDU Rx Retries= %d", peer_stats->rx.rx_retries);
7567 	DP_PRINT_STATS("MPDU Rx Retries= %d", peer_stats->rx.mpdu_retry_cnt);
7568 	DP_PRINT_STATS("NAWDS : ");
7569 	DP_PRINT_STATS("	Nawds multicast Drop Rx Packet = %d",
7570 		       peer_stats->rx.nawds_mcast_drop);
7571 	DP_PRINT_STATS(" 3address multicast Drop Rx Packet = %d",
7572 		       peer_stats->rx.mcast_3addr_drop);
7573 	DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
7574 		       peer_stats->rx.sgi_count[0],
7575 		       peer_stats->rx.sgi_count[1],
7576 		       peer_stats->rx.sgi_count[2],
7577 		       peer_stats->rx.sgi_count[3]);
7578 
7579 	DP_PRINT_STATS("Wireless Mutlimedia ");
7580 	DP_PRINT_STATS("	 Best effort = %d",
7581 		       peer_stats->rx.wme_ac_type[0]);
7582 	DP_PRINT_STATS("	 Background= %d",
7583 		       peer_stats->rx.wme_ac_type[1]);
7584 	DP_PRINT_STATS("	 Video = %d",
7585 		       peer_stats->rx.wme_ac_type[2]);
7586 	DP_PRINT_STATS("	 Voice = %d",
7587 		       peer_stats->rx.wme_ac_type[3]);
7588 
7589 	DP_PRINT_STATS(" Total Rx PPDU Count = %d", peer_stats->rx.rx_ppdus);
7590 	DP_PRINT_STATS(" Total Rx MPDU Count = %d", peer_stats->rx.rx_mpdus);
7591 	DP_PRINT_STATS("MSDU Reception Type");
7592 	DP_PRINT_STATS("SU %d MU_MIMO %d MU_OFDMA %d MU_OFDMA_MIMO %d",
7593 		       peer_stats->rx.reception_type[0],
7594 		       peer_stats->rx.reception_type[1],
7595 		       peer_stats->rx.reception_type[2],
7596 		       peer_stats->rx.reception_type[3]);
7597 	DP_PRINT_STATS("PPDU Reception Type");
7598 	DP_PRINT_STATS("SU %d MU_MIMO %d MU_OFDMA %d MU_OFDMA_MIMO %d",
7599 		       peer_stats->rx.ppdu_cnt[0],
7600 		       peer_stats->rx.ppdu_cnt[1],
7601 		       peer_stats->rx.ppdu_cnt[2],
7602 		       peer_stats->rx.ppdu_cnt[3]);
7603 
7604 	dp_print_common_rates_info(peer_stats->rx.pkt_type);
7605 	dp_print_common_ppdu_rates_info(&peer_stats->rx.su_ax_ppdu_cnt,
7606 					DOT11_AX);
7607 	dp_print_mu_ppdu_rates_info(&peer_stats->rx.rx_mu[0]);
7608 
7609 	pnss = &peer_stats->rx.nss[0];
7610 	dp_print_nss(nss, pnss, SS_COUNT);
7611 	DP_PRINT_STATS("MSDU Count");
7612 	DP_PRINT_STATS("	NSS(1-8) = %s", nss);
7613 
7614 	DP_PRINT_STATS("reception mode SU");
7615 	pnss = &peer_stats->rx.ppdu_nss[0];
7616 	dp_print_nss(nss, pnss, SS_COUNT);
7617 
7618 	DP_PRINT_STATS("	PPDU Count");
7619 	DP_PRINT_STATS("	NSS(1-8) = %s", nss);
7620 
7621 	DP_PRINT_STATS("	MPDU OK = %d, MPDU Fail = %d",
7622 		       peer_stats->rx.mpdu_cnt_fcs_ok,
7623 		       peer_stats->rx.mpdu_cnt_fcs_err);
7624 
7625 	for (rx_mu_type = 0; rx_mu_type < TXRX_TYPE_MU_MAX; rx_mu_type++) {
7626 		DP_PRINT_STATS("reception mode %s",
7627 			       mu_reception_mode[rx_mu_type]);
7628 		rx_mu = &peer_stats->rx.rx_mu[rx_mu_type];
7629 
7630 		pnss = &rx_mu->ppdu_nss[0];
7631 		dp_print_nss(nss, pnss, SS_COUNT);
7632 		DP_PRINT_STATS("	PPDU Count");
7633 		DP_PRINT_STATS("	NSS(1-8) = %s", nss);
7634 
7635 		DP_PRINT_STATS("	MPDU OK = %d, MPDU Fail = %d",
7636 			       rx_mu->mpdu_cnt_fcs_ok,
7637 			       rx_mu->mpdu_cnt_fcs_err);
7638 	}
7639 
7640 	DP_PRINT_STATS("Aggregation:");
7641 	DP_PRINT_STATS("	Msdu's Part of Ampdu = %d",
7642 		       peer_stats->rx.ampdu_cnt);
7643 	DP_PRINT_STATS("	Msdu's With No Mpdu Level Aggregation = %d",
7644 		       peer_stats->rx.non_ampdu_cnt);
7645 	DP_PRINT_STATS("	Msdu's Part of Amsdu = %d",
7646 		       peer_stats->rx.amsdu_cnt);
7647 	DP_PRINT_STATS("	Msdu's With No Msdu Level Aggregation = %d",
7648 		       peer_stats->rx.non_amsdu_cnt);
7649 
7650 	DP_PRINT_STATS("Bytes and Packets received in last one sec:");
7651 	DP_PRINT_STATS("	Bytes received in last sec: %d",
7652 		       peer_stats->rx.rx_byte_rate);
7653 	DP_PRINT_STATS("	Data received in last sec: %d",
7654 		       peer_stats->rx.rx_data_rate);
7655 	DP_PRINT_STATS("MEC Packet Drop = %llu",
7656 		       peer_stats->rx.mec_drop.num);
7657 	DP_PRINT_STATS("MEC Byte Drop = %llu",
7658 		       peer_stats->rx.mec_drop.bytes);
7659 	DP_PRINT_STATS("Multipass Rx Packet Drop = %d",
7660 		       peer_stats->rx.multipass_rx_pkt_drop);
7661 	DP_PRINT_STATS("Peer Unauth Rx Packet Drop = %d",
7662 		       peer_stats->rx.peer_unauth_rx_pkt_drop);
7663 	DP_PRINT_STATS("Policy Check Rx Packet Drop = %d",
7664 		       peer_stats->rx.policy_check_drop);
7665 	if (pdev && pdev->soc->arch_ops.txrx_print_peer_stats)
7666 		pdev->soc->arch_ops.txrx_print_peer_stats(peer_stats,
7667 							  PEER_RX_STATS);
7668 
7669 	if (!IS_MLO_DP_LINK_PEER(peer))
7670 		dp_peer_print_rx_delay_stats(pdev, peer);
7671 
7672 	if (IS_MLO_DP_MLD_PEER(peer))
7673 		DP_PRINT_STATS("RX Invalid Link ID Packet Count = %u",
7674 			       peer_stats->rx.inval_link_id_pkt_cnt);
7675 
7676 	dp_peer_print_reo_qref_table(peer);
7677 }
7678 
7679 void dp_print_per_ring_stats(struct dp_soc *soc)
7680 {
7681 	uint8_t ring;
7682 	uint16_t core;
7683 	uint64_t total_packets;
7684 
7685 	DP_PRINT_STATS("Rx packets per ring:");
7686 	for (ring = 0; ring < MAX_REO_DEST_RINGS; ring++) {
7687 		total_packets = 0;
7688 		DP_PRINT_STATS("Packets on ring %u:", ring);
7689 		for (core = 0; core < num_possible_cpus(); core++) {
7690 			if (!soc->stats.rx.ring_packets[core][ring])
7691 				continue;
7692 			DP_PRINT_STATS("Packets arriving on core %u: %llu",
7693 				       core,
7694 				       soc->stats.rx.ring_packets[core][ring]);
7695 			total_packets += soc->stats.rx.ring_packets[core][ring];
7696 		}
7697 		DP_PRINT_STATS("Total packets on ring %u: %llu",
7698 			       ring, total_packets);
7699 	}
7700 }
7701 
7702 static void dp_pdev_print_tx_rx_rates(struct dp_pdev *pdev)
7703 {
7704 	struct dp_vdev *vdev;
7705 	struct dp_vdev **vdev_array = NULL;
7706 	int index = 0, num_vdev = 0;
7707 
7708 	if (!pdev) {
7709 		dp_err("pdev is NULL");
7710 		return;
7711 	}
7712 
7713 	vdev_array =
7714 		qdf_mem_malloc(sizeof(struct dp_vdev *) * WLAN_PDEV_MAX_VDEVS);
7715 	if (!vdev_array)
7716 		return;
7717 
7718 	qdf_spin_lock_bh(&pdev->vdev_list_lock);
7719 	DP_PDEV_ITERATE_VDEV_LIST(pdev, vdev) {
7720 		if (dp_vdev_get_ref(pdev->soc, vdev, DP_MOD_ID_GENERIC_STATS))
7721 			continue;
7722 		vdev_array[index] = vdev;
7723 		index = index + 1;
7724 	}
7725 	qdf_spin_unlock_bh(&pdev->vdev_list_lock);
7726 
7727 	num_vdev = index;
7728 
7729 	for (index = 0; index < num_vdev; index++) {
7730 		vdev = vdev_array[index];
7731 		dp_print_rx_rates(vdev);
7732 		dp_print_tx_rates(vdev);
7733 		dp_vdev_unref_delete(pdev->soc, vdev, DP_MOD_ID_GENERIC_STATS);
7734 	}
7735 	qdf_mem_free(vdev_array);
7736 }
7737 
7738 void dp_txrx_path_stats(struct dp_soc *soc)
7739 {
7740 	uint8_t error_code;
7741 	uint8_t loop_pdev;
7742 	struct dp_pdev *pdev;
7743 	uint8_t i;
7744 	uint8_t *buf;
7745 	size_t pos, buf_len;
7746 	uint8_t dp_stats_str[DP_STATS_STR_LEN] = {'\0'};
7747 
7748 	if (!soc) {
7749 		dp_err("Invalid access");
7750 		return;
7751 	}
7752 
7753 	for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) {
7754 		pdev = soc->pdev_list[loop_pdev];
7755 		dp_aggregate_pdev_stats(pdev);
7756 		DP_PRINT_STATS("Tx path Statistics:");
7757 		DP_PRINT_STATS("from stack: %llu msdus (%llu bytes)",
7758 			       pdev->stats.tx_i.rcvd.num,
7759 			       pdev->stats.tx_i.rcvd.bytes);
7760 		DP_PRINT_STATS("processed from host: %llu msdus (%llu bytes)",
7761 			       pdev->stats.tx_i.processed.num,
7762 			       pdev->stats.tx_i.processed.bytes);
7763 		DP_PRINT_STATS("successfully transmitted: %llu msdus (%llu bytes)",
7764 			       pdev->stats.tx.tx_success.num,
7765 			       pdev->stats.tx.tx_success.bytes);
7766 
7767 		dp_print_tx_ring_stats(soc);
7768 
7769 		DP_PRINT_STATS("Invalid release source: %u",
7770 			       soc->stats.tx.invalid_release_source);
7771 		DP_PRINT_STATS("Invalid TX desc from completion ring: %u",
7772 			       soc->stats.tx.invalid_tx_comp_desc);
7773 		DP_PRINT_STATS("Dropped in host:");
7774 		DP_PRINT_STATS("Total packets dropped: %llu",
7775 			       pdev->stats.tx_i.dropped.dropped_pkt.num);
7776 		DP_PRINT_STATS("Descriptor not available: %llu",
7777 			       pdev->stats.tx_i.dropped.desc_na.num);
7778 		DP_PRINT_STATS("Ring full: %u",
7779 			       pdev->stats.tx_i.dropped.ring_full);
7780 		DP_PRINT_STATS("Enqueue fail: %u",
7781 			       pdev->stats.tx_i.dropped.enqueue_fail);
7782 		DP_PRINT_STATS("Pkt dropped in vdev-id check: %u",
7783 			       pdev->stats.tx_i.dropped.fail_per_pkt_vdev_id_check);
7784 		DP_PRINT_STATS("DMA Error: %u",
7785 			       pdev->stats.tx_i.dropped.dma_error);
7786 		DP_PRINT_STATS("Drop Ingress: %u",
7787 			       pdev->stats.tx_i.dropped.drop_ingress);
7788 		DP_PRINT_STATS("Resources full: %u",
7789 			       pdev->stats.tx_i.dropped.res_full);
7790 		DP_PRINT_STATS("Headroom insufficient: %u",
7791 			       pdev->stats.tx_i.dropped.headroom_insufficient);
7792 		DP_PRINT_STATS("Invalid peer id in exception path: %u",
7793 			       pdev->stats.tx_i.dropped.invalid_peer_id_in_exc_path);
7794 		DP_PRINT_STATS("Tx Mcast Drop: %u",
7795 			       pdev->stats.tx_i.dropped.tx_mcast_drop);
7796 		DP_PRINT_STATS("FW2WBM Tx Drop: %u",
7797 			       pdev->stats.tx_i.dropped.fw2wbm_tx_drop);
7798 
7799 		DP_PRINT_STATS("Dropped in hardware:");
7800 		DP_PRINT_STATS("total packets dropped: %u",
7801 			       pdev->stats.tx.tx_failed);
7802 		DP_PRINT_STATS("mpdu age out: %u",
7803 			       pdev->stats.tx.dropped.age_out);
7804 		DP_PRINT_STATS("firmware removed packets: %llu (%llu bytes)",
7805 			       pdev->stats.tx.dropped.fw_rem.num,
7806 			       pdev->stats.tx.dropped.fw_rem.bytes);
7807 		DP_PRINT_STATS("firmware removed tx: %u",
7808 			       pdev->stats.tx.dropped.fw_rem_tx);
7809 		DP_PRINT_STATS("firmware removed notx %u",
7810 			       pdev->stats.tx.dropped.fw_rem_notx);
7811 		DP_PRINT_STATS("Invalid peer on tx path: %llu",
7812 			       pdev->soc->stats.tx.tx_invalid_peer.num);
7813 		DP_PRINT_STATS("Tx desc freed in non-completion path: %u",
7814 			       pdev->soc->stats.tx.tx_comp_exception);
7815 		DP_PRINT_STATS("Tx desc force freed: %u",
7816 			       pdev->soc->stats.tx.tx_comp_force_freed);
7817 
7818 		buf = dp_stats_str;
7819 		buf_len = DP_STATS_STR_LEN;
7820 		pos = 0;
7821 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "%s", "Tx/IRQ [Range:Pkts] [");
7822 
7823 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "1: %u, ",
7824 				     pdev->stats.tx_comp_histogram.pkts_1);
7825 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "2-20: %u, ",
7826 				     pdev->stats.tx_comp_histogram.pkts_2_20);
7827 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "21-40: %u, ",
7828 				     pdev->stats.tx_comp_histogram.pkts_21_40);
7829 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "41-60: %u, ",
7830 				     pdev->stats.tx_comp_histogram.pkts_41_60);
7831 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "61-80: %u, ",
7832 				     pdev->stats.tx_comp_histogram.pkts_61_80);
7833 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "81-100: %u, ",
7834 				     pdev->stats.tx_comp_histogram.pkts_81_100);
7835 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "101-200: %u, ",
7836 				    pdev->stats.tx_comp_histogram.pkts_101_200);
7837 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "201+: %u",
7838 				   pdev->stats.tx_comp_histogram.pkts_201_plus);
7839 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "%s", "]");
7840 		DP_PRINT_STATS("%s", dp_stats_str);
7841 
7842 		DP_PRINT_STATS("Rx path statistics:");
7843 
7844 		DP_PRINT_STATS("delivered %llu msdus ( %llu bytes)",
7845 			       pdev->stats.rx.to_stack.num,
7846 			       pdev->stats.rx.to_stack.bytes);
7847 
7848 		dp_print_rx_ring_stats(pdev);
7849 
7850 		for (i = 0; i < CDP_MAX_LMACS; i++)
7851 			DP_PRINT_STATS("received on lmac[%d] %llu msdus (%llu bytes)",
7852 				       i, pdev->stats.rx.rx_lmac[i].num,
7853 				       pdev->stats.rx.rx_lmac[i].bytes);
7854 		DP_PRINT_STATS("intra-bss packets %llu msdus ( %llu bytes)",
7855 			       pdev->stats.rx.intra_bss.pkts.num,
7856 			       pdev->stats.rx.intra_bss.pkts.bytes);
7857 		DP_PRINT_STATS("intra-bss fails %llu msdus ( %llu bytes)",
7858 			       pdev->stats.rx.intra_bss.fail.num,
7859 			       pdev->stats.rx.intra_bss.fail.bytes);
7860 		DP_PRINT_STATS("intra-bss no mdns fwds %u msdus",
7861 			       pdev->stats.rx.intra_bss.mdns_no_fwd);
7862 
7863 		DP_PRINT_STATS("raw packets %llu msdus ( %llu bytes)",
7864 			       pdev->stats.rx.raw.num,
7865 			       pdev->stats.rx.raw.bytes);
7866 
7867 		DP_PRINT_STATS("Rx BAR frames:%d", soc->stats.rx.bar_frame);
7868 
7869 		dp_print_rx_err_stats(soc, pdev);
7870 
7871 		for (error_code = 0; error_code < HAL_RXDMA_ERR_MAX;
7872 				error_code++) {
7873 			if (!pdev->soc->stats.rx.err.rxdma_error[error_code])
7874 				continue;
7875 			DP_PRINT_STATS("Rxdma error number (%u): %u msdus",
7876 				       error_code,
7877 				       pdev->soc->stats.rx.err
7878 				       .rxdma_error[error_code]);
7879 		}
7880 
7881 		pos = 0;
7882 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "%s", "Rx/IRQ [Range:Pkts] [");
7883 
7884 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "1: %u, ",
7885 				     pdev->stats.rx_ind_histogram.pkts_1);
7886 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "2-20: %u, ",
7887 				     pdev->stats.rx_ind_histogram.pkts_2_20);
7888 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "21-40: %u, ",
7889 				     pdev->stats.rx_ind_histogram.pkts_21_40);
7890 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "41-60: %u, ",
7891 				     pdev->stats.rx_ind_histogram.pkts_41_60);
7892 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "61-80: %u, ",
7893 				     pdev->stats.rx_ind_histogram.pkts_61_80);
7894 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "81-100: %u, ",
7895 				     pdev->stats.rx_ind_histogram.pkts_81_100);
7896 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "101-200: %u, ",
7897 				    pdev->stats.rx_ind_histogram.pkts_101_200);
7898 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "201+: %u",
7899 				   pdev->stats.rx_ind_histogram.pkts_201_plus);
7900 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "%s", "]");
7901 		DP_PRINT_STATS("%s", dp_stats_str);
7902 
7903 		DP_PRINT_STATS("%s: tso_enable: %u lro_enable: %u rx_hash: %u napi_enable: %u",
7904 			       __func__,
7905 			       pdev->soc->wlan_cfg_ctx
7906 			       ->tso_enabled,
7907 			       pdev->soc->wlan_cfg_ctx
7908 			       ->lro_enabled,
7909 			       pdev->soc->wlan_cfg_ctx
7910 			       ->rx_hash,
7911 			       pdev->soc->wlan_cfg_ctx
7912 			       ->napi_enabled);
7913 #ifdef QCA_LL_TX_FLOW_CONTROL_V2
7914 		DP_PRINT_STATS("%s: Tx flow stop queue: %u tx flow start queue offset: %u",
7915 			       __func__,
7916 			       pdev->soc->wlan_cfg_ctx
7917 			       ->tx_flow_stop_queue_threshold,
7918 			       pdev->soc->wlan_cfg_ctx
7919 			       ->tx_flow_start_queue_offset);
7920 #endif
7921 		dp_pdev_print_tx_rx_rates(pdev);
7922 	}
7923 }
7924 
7925 #ifndef WLAN_SOFTUMAC_SUPPORT
7926 /**
7927  * dp_peer_ctrl_frames_stats_get() - function to agreegate peer stats
7928  * Current scope is bar received count
7929  *
7930  * @soc : Datapath SOC handle
7931  * @peer: Datapath peer handle
7932  * @arg : argument to iterate function
7933  *
7934  * Return: void
7935  */
7936 static void
7937 dp_peer_ctrl_frames_stats_get(struct dp_soc *soc,
7938 			      struct dp_peer *peer,
7939 			      void *arg)
7940 {
7941 	uint32_t waitcnt;
7942 	struct dp_peer *tgt_peer = dp_get_tgt_peer_from_peer(peer);
7943 	struct dp_pdev *pdev = tgt_peer->vdev->pdev;
7944 
7945 	waitcnt = 0;
7946 	dp_peer_rxtid_stats(tgt_peer, dp_rx_bar_stats_cb, pdev);
7947 	while (!(qdf_atomic_read(&pdev->stats_cmd_complete)) &&
7948 	       waitcnt < 10) {
7949 		schedule_timeout_interruptible(
7950 				STATS_PROC_TIMEOUT);
7951 		waitcnt++;
7952 	}
7953 	qdf_atomic_set(&pdev->stats_cmd_complete, 0);
7954 }
7955 
7956 #else
7957 /**
7958  * dp_peer_ctrl_frames_stats_get() - function to agreegate peer stats
7959  * Current scope is bar received count
7960  *
7961  * @soc : Datapath SOC handle
7962  * @peer: Datapath peer handle
7963  * @arg : argument to iterate function
7964  *
7965  * Return: void
7966  */
7967 static void
7968 dp_peer_ctrl_frames_stats_get(struct dp_soc *soc,
7969 			      struct dp_peer *peer,
7970 			      void *arg)
7971 {
7972 }
7973 #endif /* WLAN_SOFTUMAC_SUPPORT */
7974 
7975 void
7976 dp_print_pdev_tx_stats(struct dp_pdev *pdev)
7977 {
7978 	uint8_t i = 0, index = 0;
7979 
7980 	DP_PRINT_STATS("PDEV Tx Stats:\n");
7981 	DP_PRINT_STATS("Received From Stack:");
7982 	DP_PRINT_STATS("	Packets = %llu",
7983 		       pdev->stats.tx_i.rcvd.num);
7984 	DP_PRINT_STATS("	Bytes = %llu",
7985 		       pdev->stats.tx_i.rcvd.bytes);
7986 	DP_PRINT_STATS("Received from Stack in FP:");
7987 	DP_PRINT_STATS("	Packets = %llu",
7988 		       pdev->stats.tx_i.rcvd_in_fast_xmit_flow);
7989 	DP_PRINT_STATS("Received from Stack per core:");
7990 	DP_PRINT_STATS("	Packets = %u %u %u %u",
7991 		       pdev->stats.tx_i.rcvd_per_core[0],
7992 		       pdev->stats.tx_i.rcvd_per_core[1],
7993 		       pdev->stats.tx_i.rcvd_per_core[2],
7994 		       pdev->stats.tx_i.rcvd_per_core[3]);
7995 	DP_PRINT_STATS("Processed:");
7996 	DP_PRINT_STATS("	Packets = %llu",
7997 		       pdev->stats.tx_i.processed.num);
7998 	DP_PRINT_STATS("	Bytes = %llu",
7999 		       pdev->stats.tx_i.processed.bytes);
8000 	DP_PRINT_STATS("Total Completions:");
8001 	DP_PRINT_STATS("	Packets = %llu",
8002 		       pdev->stats.tx.comp_pkt.num);
8003 	DP_PRINT_STATS("	Bytes = %llu",
8004 		       pdev->stats.tx.comp_pkt.bytes);
8005 	DP_PRINT_STATS("Successful Completions:");
8006 	DP_PRINT_STATS("	Packets = %llu",
8007 		       pdev->stats.tx.tx_success.num);
8008 	DP_PRINT_STATS("	Bytes = %llu",
8009 		       pdev->stats.tx.tx_success.bytes);
8010 	DP_PRINT_STATS("Dropped:");
8011 	DP_PRINT_STATS("	Total = %llu",
8012 		       pdev->stats.tx_i.dropped.dropped_pkt.num);
8013 	DP_PRINT_STATS("	Dma_map_error = %u",
8014 		       pdev->stats.tx_i.dropped.dma_error);
8015 	DP_PRINT_STATS("	Ring Full = %u",
8016 		       pdev->stats.tx_i.dropped.ring_full);
8017 	DP_PRINT_STATS("	Descriptor Not available = %llu",
8018 		       pdev->stats.tx_i.dropped.desc_na.num);
8019 	DP_PRINT_STATS("	HW enqueue failed= %u",
8020 		       pdev->stats.tx_i.dropped.enqueue_fail);
8021 	DP_PRINT_STATS("        Descriptor alloc fail = %llu",
8022 		       pdev->stats.tx_i.dropped.desc_na_exc_alloc_fail.num);
8023 	DP_PRINT_STATS("        Tx outstanding too many = %llu",
8024 		       pdev->stats.tx_i.dropped.desc_na_exc_outstand.num);
8025 	DP_PRINT_STATS("	Pkt dropped in vdev-id check= %u",
8026 		       pdev->stats.tx_i.dropped.fail_per_pkt_vdev_id_check);
8027 	DP_PRINT_STATS("	Resources Full = %u",
8028 		       pdev->stats.tx_i.dropped.res_full);
8029 	DP_PRINT_STATS("	Drop Ingress = %u",
8030 		       pdev->stats.tx_i.dropped.drop_ingress);
8031 	DP_PRINT_STATS("	invalid peer id in exception path = %u",
8032 		       pdev->stats.tx_i.dropped.invalid_peer_id_in_exc_path);
8033 	DP_PRINT_STATS("	Tx Mcast Drop = %u",
8034 		       pdev->stats.tx_i.dropped.tx_mcast_drop);
8035 	DP_PRINT_STATS("	PPE-DS FW2WBM Tx Drop = %u",
8036 		       pdev->stats.tx_i.dropped.fw2wbm_tx_drop);
8037 	DP_PRINT_STATS("Tx failed = %u",
8038 		       pdev->stats.tx.tx_failed);
8039 	DP_PRINT_STATS("	FW removed Pkts = %llu",
8040 		       pdev->stats.tx.dropped.fw_rem.num);
8041 	DP_PRINT_STATS("	FW removed bytes= %llu",
8042 		       pdev->stats.tx.dropped.fw_rem.bytes);
8043 	DP_PRINT_STATS("	FW removed transmitted = %u",
8044 		       pdev->stats.tx.dropped.fw_rem_tx);
8045 	DP_PRINT_STATS("	FW removed untransmitted = %u",
8046 		       pdev->stats.tx.dropped.fw_rem_notx);
8047 	DP_PRINT_STATS("	FW removed untransmitted fw_reason1 = %u",
8048 		       pdev->stats.tx.dropped.fw_reason1);
8049 	DP_PRINT_STATS("	FW removed untransmitted fw_reason2 = %u",
8050 		       pdev->stats.tx.dropped.fw_reason2);
8051 	DP_PRINT_STATS("	FW removed untransmitted fw_reason3 = %u",
8052 		       pdev->stats.tx.dropped.fw_reason3);
8053 	DP_PRINT_STATS("	FW removed untransmitted disable queue = %u",
8054 		       pdev->stats.tx.dropped.fw_rem_queue_disable);
8055 	DP_PRINT_STATS("	FW removed untransmitted no match = %u",
8056 		       pdev->stats.tx.dropped.fw_rem_no_match);
8057 	DP_PRINT_STATS("	Dropped due to HW threshold criteria = %u",
8058 		       pdev->stats.tx.dropped.drop_threshold);
8059 	DP_PRINT_STATS("	Link desc not available drop = %u",
8060 		       pdev->stats.tx.dropped.drop_link_desc_na);
8061 	DP_PRINT_STATS("	Drop bit set or invalid flow = %u",
8062 		       pdev->stats.tx.dropped.invalid_drop);
8063 	DP_PRINT_STATS("	MCAST vdev drop in HW = %u",
8064 		       pdev->stats.tx.dropped.mcast_vdev_drop);
8065 	DP_PRINT_STATS("	Dropped with invalid reason = %u",
8066 		       pdev->stats.tx.dropped.invalid_rr);
8067 	DP_PRINT_STATS("	Aged Out from msdu/mpdu queues = %u",
8068 		       pdev->stats.tx.dropped.age_out);
8069 	DP_PRINT_STATS("	headroom insufficient = %u",
8070 		       pdev->stats.tx_i.dropped.headroom_insufficient);
8071 	DP_PRINT_STATS("Multicast:");
8072 	DP_PRINT_STATS("	Packets: %llu",
8073 		       pdev->stats.tx.mcast.num);
8074 	DP_PRINT_STATS("	Bytes: %llu",
8075 		       pdev->stats.tx.mcast.bytes);
8076 	DP_PRINT_STATS("Scatter Gather:");
8077 	DP_PRINT_STATS("	Packets = %llu",
8078 		       pdev->stats.tx_i.sg.sg_pkt.num);
8079 	DP_PRINT_STATS("	Bytes = %llu",
8080 		       pdev->stats.tx_i.sg.sg_pkt.bytes);
8081 	DP_PRINT_STATS("	Dropped By Host = %llu",
8082 		       pdev->stats.tx_i.sg.dropped_host.num);
8083 	DP_PRINT_STATS("	Dropped By Target = %u",
8084 		       pdev->stats.tx_i.sg.dropped_target);
8085 	DP_PRINT_STATS("Mcast Enhancement:");
8086 	DP_PRINT_STATS("	Packets = %llu",
8087 		       pdev->stats.tx_i.mcast_en.mcast_pkt.num);
8088 	DP_PRINT_STATS("	Bytes = %llu",
8089 		       pdev->stats.tx_i.mcast_en.mcast_pkt.bytes);
8090 	DP_PRINT_STATS("	Dropped: Map Errors = %u",
8091 		       pdev->stats.tx_i.mcast_en.dropped_map_error);
8092 	DP_PRINT_STATS("	Dropped: Self Mac = %u",
8093 		       pdev->stats.tx_i.mcast_en.dropped_self_mac);
8094 	DP_PRINT_STATS("	Dropped: Send Fail = %u",
8095 		       pdev->stats.tx_i.mcast_en.dropped_send_fail);
8096 	DP_PRINT_STATS("	Unicast sent = %u",
8097 		       pdev->stats.tx_i.mcast_en.ucast);
8098 
8099 	DP_PRINT_STATS("EAPOL Packets dropped:");
8100 	DP_PRINT_STATS("        Dropped: TX desc errors = %u",
8101 		       pdev->stats.eap_drop_stats.tx_desc_err);
8102 	DP_PRINT_STATS("        Dropped: Tx HAL ring access errors = %u",
8103 		       pdev->stats.eap_drop_stats.tx_hal_ring_access_err);
8104 	DP_PRINT_STATS("        Dropped: TX DMA map errors = %u",
8105 		       pdev->stats.eap_drop_stats.tx_dma_map_err);
8106 	DP_PRINT_STATS("        Dropped: Tx HW enqueue errors = %u",
8107 		       pdev->stats.eap_drop_stats.tx_hw_enqueue);
8108 	DP_PRINT_STATS("        Dropped: TX SW enqueue errors= %u",
8109 		       pdev->stats.eap_drop_stats.tx_sw_enqueue);
8110 
8111 	DP_PRINT_STATS("IGMP Mcast Enhancement:");
8112 	DP_PRINT_STATS("	IGMP packets received = %u",
8113 		       pdev->stats.tx_i.igmp_mcast_en.igmp_rcvd);
8114 	DP_PRINT_STATS("	Converted to uncast = %u",
8115 		       pdev->stats.tx_i.igmp_mcast_en.igmp_ucast_converted);
8116 	DP_PRINT_STATS("Raw:");
8117 	DP_PRINT_STATS("	Packets = %llu",
8118 		       pdev->stats.tx_i.raw.raw_pkt.num);
8119 	DP_PRINT_STATS("	Bytes = %llu",
8120 		       pdev->stats.tx_i.raw.raw_pkt.bytes);
8121 	DP_PRINT_STATS("	DMA map error = %u",
8122 		       pdev->stats.tx_i.raw.dma_map_error);
8123 	DP_PRINT_STATS("        RAW pkt type[!data] error = %u",
8124 		       pdev->stats.tx_i.raw.invalid_raw_pkt_datatype);
8125 	DP_PRINT_STATS("        Frags count overflow  error = %u",
8126 		       pdev->stats.tx_i.raw.num_frags_overflow_err);
8127 	DP_PRINT_STATS("Reinjected:");
8128 	DP_PRINT_STATS("	Packets = %llu",
8129 		       pdev->stats.tx_i.reinject_pkts.num);
8130 	DP_PRINT_STATS("	Bytes = %llu\n",
8131 		       pdev->stats.tx_i.reinject_pkts.bytes);
8132 	DP_PRINT_STATS("Inspected:");
8133 	DP_PRINT_STATS("	Packets = %llu",
8134 		       pdev->stats.tx_i.inspect_pkts.num);
8135 	DP_PRINT_STATS("	Bytes = %llu",
8136 		       pdev->stats.tx_i.inspect_pkts.bytes);
8137 	DP_PRINT_STATS("Nawds Multicast:");
8138 	DP_PRINT_STATS("	Packets = %llu",
8139 		       pdev->stats.tx_i.nawds_mcast.num);
8140 	DP_PRINT_STATS("	Bytes = %llu",
8141 		       pdev->stats.tx_i.nawds_mcast.bytes);
8142 	DP_PRINT_STATS("CCE Classified:");
8143 	DP_PRINT_STATS("	CCE Classified Packets: %u",
8144 		       pdev->stats.tx_i.cce_classified);
8145 	DP_PRINT_STATS("	RAW CCE Classified Packets: %u",
8146 		       pdev->stats.tx_i.cce_classified_raw);
8147 	DP_PRINT_STATS("Mesh stats:");
8148 	DP_PRINT_STATS("	frames to firmware: %u",
8149 		       pdev->stats.tx_i.mesh.exception_fw);
8150 	DP_PRINT_STATS("	completions from fw: %u",
8151 		       pdev->stats.tx_i.mesh.completion_fw);
8152 	DP_PRINT_STATS("PPDU stats counter");
8153 	for (index = 0; index < CDP_PPDU_STATS_MAX_TAG; index++) {
8154 		DP_PRINT_STATS("	Tag[%d] = %llu", index,
8155 			       pdev->stats.ppdu_stats_counter[index]);
8156 	}
8157 	DP_PRINT_STATS("BA not received for delayed_ba: %u",
8158 		       pdev->stats.cdp_delayed_ba_not_recev);
8159 
8160 	dp_monitor_print_tx_stats(pdev);
8161 
8162 	DP_PRINT_STATS("tx_ppdu_proc: %llu",
8163 		       pdev->stats.tx_ppdu_proc);
8164 	DP_PRINT_STATS("ack ba comes twice: %llu",
8165 		       pdev->stats.ack_ba_comes_twice);
8166 	DP_PRINT_STATS("ppdu dropped because of incomplete tlv: %llu",
8167 		       pdev->stats.ppdu_drop);
8168 	DP_PRINT_STATS("ppdu dropped because of wrap around: %llu",
8169 		       pdev->stats.ppdu_wrap_drop);
8170 
8171 	for (i = 0; i < CDP_WDI_NUM_EVENTS; i++) {
8172 		if (pdev->stats.wdi_event[i])
8173 			DP_PRINT_STATS("Wdi msgs received for event ID[%d]:%d",
8174 				       i, pdev->stats.wdi_event[i]);
8175 	}
8176 
8177 	dp_monitor_print_pdev_tx_capture_stats(pdev);
8178 }
8179 
8180 #ifdef WLAN_SUPPORT_RX_FLOW_TAG
8181 static inline void dp_rx_basic_fst_stats(struct dp_pdev *pdev)
8182 {
8183 	DP_PRINT_STATS("\tNo of IPv4 Flow entries inserted = %d",
8184 		       qdf_atomic_read(&pdev->soc->ipv4_fse_cnt));
8185 	DP_PRINT_STATS("\tNo of IPv6 Flow entries inserted = %d",
8186 		       qdf_atomic_read(&pdev->soc->ipv6_fse_cnt));
8187 }
8188 #else
8189 static inline void dp_rx_basic_fst_stats(struct dp_pdev *pdev)
8190 {
8191 }
8192 #endif
8193 
8194 void
8195 dp_print_pdev_rx_stats(struct dp_pdev *pdev)
8196 {
8197 	uint8_t i;
8198 
8199 	DP_PRINT_STATS("PDEV Rx Stats:\n");
8200 	DP_PRINT_STATS("Received From HW (Per Rx Ring):");
8201 	DP_PRINT_STATS("	Packets = %llu %llu %llu %llu",
8202 		       pdev->stats.rx.rcvd_reo[0].num,
8203 		       pdev->stats.rx.rcvd_reo[1].num,
8204 		       pdev->stats.rx.rcvd_reo[2].num,
8205 		       pdev->stats.rx.rcvd_reo[3].num);
8206 	DP_PRINT_STATS("	Bytes = %llu %llu %llu %llu",
8207 		       pdev->stats.rx.rcvd_reo[0].bytes,
8208 		       pdev->stats.rx.rcvd_reo[1].bytes,
8209 		       pdev->stats.rx.rcvd_reo[2].bytes,
8210 		       pdev->stats.rx.rcvd_reo[3].bytes);
8211 	for (i = 0; i < CDP_MAX_LMACS; i++)
8212 		DP_PRINT_STATS("Packets Received on lmac[%d] = %llu (%llu)",
8213 			       i, pdev->stats.rx.rx_lmac[i].num,
8214 			       pdev->stats.rx.rx_lmac[i].bytes);
8215 	DP_PRINT_STATS("Replenished:");
8216 	DP_PRINT_STATS("	Packets = %llu",
8217 		       pdev->stats.replenish.pkts.num);
8218 	DP_PRINT_STATS("	Buffers Added To Freelist = %u",
8219 		       pdev->stats.buf_freelist);
8220 	DP_PRINT_STATS("	Low threshold intr = %d",
8221 		       pdev->stats.replenish.low_thresh_intrs);
8222 	DP_PRINT_STATS("Dropped:");
8223 	DP_PRINT_STATS("	msdu_not_done = %u",
8224 		       pdev->stats.dropped.msdu_not_done);
8225 	DP_PRINT_STATS("        wifi parse = %u",
8226 		       pdev->stats.dropped.wifi_parse);
8227 	DP_PRINT_STATS("        mon_rx_drop = %u",
8228 		       pdev->stats.dropped.mon_rx_drop);
8229 	DP_PRINT_STATS("        mon_radiotap_update_err = %u",
8230 		       pdev->stats.dropped.mon_radiotap_update_err);
8231 	DP_PRINT_STATS("        mec_drop = %llu",
8232 		       pdev->stats.rx.mec_drop.num);
8233 	DP_PRINT_STATS("	Bytes = %llu",
8234 		       pdev->stats.rx.mec_drop.bytes);
8235 	DP_PRINT_STATS("	peer_unauth_drop = %u",
8236 		       pdev->stats.rx.peer_unauth_rx_pkt_drop);
8237 	DP_PRINT_STATS("	policy_check_drop = %u",
8238 		       pdev->stats.rx.policy_check_drop);
8239 	DP_PRINT_STATS("Sent To Stack:");
8240 	DP_PRINT_STATS("	Packets = %llu",
8241 		       pdev->stats.rx.to_stack.num);
8242 	DP_PRINT_STATS("	Bytes = %llu",
8243 		       pdev->stats.rx.to_stack.bytes);
8244 	DP_PRINT_STATS("        vlan_tag_stp_cnt = %u",
8245 		       pdev->stats.vlan_tag_stp_cnt);
8246 	DP_PRINT_STATS("Multicast/Broadcast:");
8247 	DP_PRINT_STATS("	Packets = %llu",
8248 		       pdev->stats.rx.multicast.num);
8249 	DP_PRINT_STATS("	Bytes = %llu",
8250 		       pdev->stats.rx.multicast.bytes);
8251 	DP_PRINT_STATS("Errors:");
8252 	DP_PRINT_STATS("	Rxdma Ring Un-inititalized = %u",
8253 		       pdev->stats.replenish.rxdma_err);
8254 	DP_PRINT_STATS("	Desc Alloc Failed: = %u",
8255 		       pdev->stats.err.desc_alloc_fail);
8256 	DP_PRINT_STATS("        Low threshold Desc Alloc Failed: = %u",
8257 		       pdev->stats.err.desc_lt_alloc_fail);
8258 	DP_PRINT_STATS("	IP checksum error = %u",
8259 		       pdev->stats.err.ip_csum_err);
8260 	DP_PRINT_STATS("	TCP/UDP checksum error = %u",
8261 		       pdev->stats.err.tcp_udp_csum_err);
8262 	DP_PRINT_STATS("	Failed frag alloc = %u",
8263 		       pdev->stats.replenish.frag_alloc_fail);
8264 
8265 	dp_pdev_iterate_peer_lock_safe(pdev, dp_peer_ctrl_frames_stats_get,
8266 				       NULL, DP_MOD_ID_GENERIC_STATS);
8267 
8268 	/* Get bar_recv_cnt */
8269 	DP_PRINT_STATS("BAR Received Count: = %u",
8270 		       pdev->stats.rx.bar_recv_cnt);
8271 
8272 	DP_PRINT_STATS("RX Buffer Pool Stats:\n");
8273 	DP_PRINT_STATS("\tBuffers consumed during refill = %llu",
8274 		       pdev->stats.rx_buffer_pool.num_bufs_consumed);
8275 	DP_PRINT_STATS("\tSuccessful allocations during refill = %llu",
8276 		       pdev->stats.rx_buffer_pool.num_bufs_alloc_success);
8277 	DP_PRINT_STATS("\tAllocations from the pool during replenish = %llu",
8278 		       pdev->stats.rx_buffer_pool.num_pool_bufs_replenish);
8279 
8280 	DP_PRINT_STATS("Invalid MSDU count = %u",
8281 		       pdev->stats.invalid_msdu_cnt);
8282 
8283 	dp_rx_basic_fst_stats(pdev);
8284 }
8285 
8286 #ifdef WLAN_SUPPORT_PPEDS
8287 void dp_print_tx_ppeds_stats(struct dp_soc *soc)
8288 {
8289 	if (soc->arch_ops.dp_tx_ppeds_inuse_desc)
8290 		soc->arch_ops.dp_tx_ppeds_inuse_desc(soc);
8291 
8292 	DP_PRINT_STATS("PPE-DS Tx desc fw2wbm_tx_drop %u",
8293 		       soc->stats.tx.fw2wbm_tx_drop);
8294 
8295 	if (soc->arch_ops.dp_txrx_ppeds_rings_stats)
8296 		soc->arch_ops.dp_txrx_ppeds_rings_stats(soc);
8297 }
8298 #else
8299 void dp_print_tx_ppeds_stats(struct dp_soc *soc)
8300 {
8301 }
8302 #endif
8303 
8304 #ifdef QCA_SUPPORT_DP_GLOBAL_CTX
8305 void dp_print_global_desc_count(void)
8306 {
8307 	struct dp_global_context *dp_global;
8308 
8309 	dp_global = wlan_objmgr_get_global_ctx();
8310 
8311 	DP_PRINT_STATS("Global Tx Descriptors in use = %u",
8312 		       dp_tx_get_global_desc_in_use(dp_global));
8313 }
8314 #endif
8315 
8316 #ifdef WLAN_DP_SRNG_USAGE_WM_TRACKING
8317 #define DP_SRNG_HIGH_WM_STATS_STRING_LEN 512
8318 void dp_dump_srng_high_wm_stats(struct dp_soc *soc, uint64_t srng_mask)
8319 {
8320 	char *buf;
8321 	int ring, pos, buf_len;
8322 	char srng_high_wm_str[DP_SRNG_HIGH_WM_STATS_STRING_LEN] = {'\0'};
8323 
8324 	if (!srng_mask)
8325 		return;
8326 
8327 	buf = srng_high_wm_str;
8328 	buf_len = DP_SRNG_HIGH_WM_STATS_STRING_LEN;
8329 
8330 	dp_info("%8s %7s %12s %10s %10s %10s %10s %10s %10s",
8331 		"ring_id", "high_wm", "time", "<50", "50-60", "60-70",
8332 		"70-80", "80-90", "90-100");
8333 
8334 	if (srng_mask & (1 << REO_DST)) {
8335 		for (ring = 0; ring < soc->num_reo_dest_rings; ring++) {
8336 			pos = 0;
8337 			pos += hal_dump_srng_high_wm_stats(soc->hal_soc,
8338 					    soc->reo_dest_ring[ring].hal_srng,
8339 					    buf, buf_len, pos);
8340 			dp_info("%s", srng_high_wm_str);
8341 		}
8342 	}
8343 }
8344 #endif
8345 
8346 void
8347 dp_print_soc_rx_stats(struct dp_soc *soc)
8348 {
8349 	uint32_t i;
8350 	char reo_error[DP_REO_ERR_LENGTH];
8351 	char rxdma_error[DP_RXDMA_ERR_LENGTH];
8352 	uint8_t index = 0;
8353 
8354 	DP_PRINT_STATS("No of AST Entries = %d", soc->num_ast_entries);
8355 	DP_PRINT_STATS("SOC Rx Stats:\n");
8356 	DP_PRINT_STATS("Fast recycled packets: %llu",
8357 		       soc->stats.rx.fast_recycled);
8358 	DP_PRINT_STATS("Fragmented packets: %u",
8359 		       soc->stats.rx.rx_frags);
8360 	DP_PRINT_STATS("Reo reinjected packets: %u",
8361 		       soc->stats.rx.reo_reinject);
8362 	DP_PRINT_STATS("Errors:\n");
8363 	DP_PRINT_STATS("Rx Decrypt Errors = %d",
8364 		       (soc->stats.rx.err.rxdma_error[HAL_RXDMA_ERR_DECRYPT] +
8365 		       soc->stats.rx.err.rxdma_error[HAL_RXDMA_ERR_TKIP_MIC]));
8366 	DP_PRINT_STATS("Invalid RBM = %d",
8367 		       soc->stats.rx.err.invalid_rbm);
8368 	DP_PRINT_STATS("Invalid Vdev = %d",
8369 		       soc->stats.rx.err.invalid_vdev);
8370 	DP_PRINT_STATS("Invalid sa_idx or da_idx = %d",
8371 		       soc->stats.rx.err.invalid_sa_da_idx);
8372 	DP_PRINT_STATS("Defrag peer uninit = %d",
8373 		       soc->stats.rx.err.defrag_peer_uninit);
8374 	DP_PRINT_STATS("Pkts delivered no peer = %d",
8375 		       soc->stats.rx.err.pkt_delivered_no_peer);
8376 	DP_PRINT_STATS("Invalid Pdev = %d",
8377 		       soc->stats.rx.err.invalid_pdev);
8378 	DP_PRINT_STATS("Invalid Peer = %llu",
8379 		       soc->stats.rx.err.rx_invalid_peer.num);
8380 	DP_PRINT_STATS("HAL Ring Access Fail = %d",
8381 		       soc->stats.rx.err.hal_ring_access_fail);
8382 	DP_PRINT_STATS("HAL Ring Access Full Fail = %d",
8383 		       soc->stats.rx.err.hal_ring_access_full_fail);
8384 	DP_PRINT_STATS("MSDU Done failures = %d",
8385 		       soc->stats.rx.err.msdu_done_fail);
8386 	DP_PRINT_STATS("RX frags: %d", soc->stats.rx.rx_frags);
8387 	DP_PRINT_STATS("RX frag wait: %d", soc->stats.rx.rx_frag_wait);
8388 	DP_PRINT_STATS("RX frag err: %d", soc->stats.rx.rx_frag_err);
8389 	DP_PRINT_STATS("RX frag OOR: %d", soc->stats.rx.rx_frag_oor);
8390 
8391 	DP_PRINT_STATS("RX HP out_of_sync: %d", soc->stats.rx.hp_oos2);
8392 	DP_PRINT_STATS("RX Ring Near Full: %d", soc->stats.rx.near_full);
8393 
8394 	DP_PRINT_STATS("RX Reap Loop Pkt Limit Hit: %d",
8395 		       soc->stats.rx.reap_loop_pkt_limit_hit);
8396 	DP_PRINT_STATS("RX DESC invalid magic: %u",
8397 		       soc->stats.rx.err.rx_desc_invalid_magic);
8398 	DP_PRINT_STATS("RX DUP DESC: %d",
8399 		       soc->stats.rx.err.hal_reo_dest_dup);
8400 	DP_PRINT_STATS("RX REL DUP DESC: %d",
8401 		       soc->stats.rx.err.hal_wbm_rel_dup);
8402 
8403 	DP_PRINT_STATS("RXDMA ERR DUP DESC: %d",
8404 		       soc->stats.rx.err.hal_rxdma_err_dup);
8405 
8406 	DP_PRINT_STATS("RX scatter msdu: %d",
8407 		       soc->stats.rx.err.scatter_msdu);
8408 
8409 	DP_PRINT_STATS("RX invalid cookie: %d",
8410 		       soc->stats.rx.err.invalid_cookie);
8411 
8412 	DP_PRINT_STATS("RX stale cookie: %d",
8413 		       soc->stats.rx.err.stale_cookie);
8414 
8415 	DP_PRINT_STATS("RX wait completed msdu break: %d",
8416 		       soc->stats.rx.msdu_scatter_wait_break);
8417 
8418 	DP_PRINT_STATS("2k jump delba sent: %d",
8419 		       soc->stats.rx.err.rx_2k_jump_delba_sent);
8420 
8421 	DP_PRINT_STATS("2k jump msdu to stack: %d",
8422 		       soc->stats.rx.err.rx_2k_jump_to_stack);
8423 
8424 	DP_PRINT_STATS("2k jump msdu drop: %d",
8425 		       soc->stats.rx.err.rx_2k_jump_drop);
8426 
8427 	DP_PRINT_STATS("REO err oor msdu to stack %d",
8428 		       soc->stats.rx.err.reo_err_oor_to_stack);
8429 
8430 	DP_PRINT_STATS("REO err oor msdu drop: %d",
8431 		       soc->stats.rx.err.reo_err_oor_drop);
8432 
8433 	DP_PRINT_STATS("Rx err msdu rejected: %d",
8434 		       soc->stats.rx.err.rejected);
8435 
8436 	DP_PRINT_STATS("Rx stale link desc cookie: %d",
8437 		       soc->stats.rx.err.invalid_link_cookie);
8438 
8439 	DP_PRINT_STATS("Rx nbuf sanity fail: %d",
8440 		       soc->stats.rx.err.nbuf_sanity_fail);
8441 
8442 	DP_PRINT_STATS("Rx err msdu continuation err: %d",
8443 		       soc->stats.rx.err.msdu_continuation_err);
8444 
8445 	DP_PRINT_STATS("ssn update count: %d",
8446 		       soc->stats.rx.err.ssn_update_count);
8447 
8448 	DP_PRINT_STATS("bar handle update fail count: %d",
8449 		       soc->stats.rx.err.bar_handle_fail_count);
8450 
8451 	DP_PRINT_STATS("PN-in-Dest error frame pn-check fail: %d",
8452 		       soc->stats.rx.err.pn_in_dest_check_fail);
8453 
8454 	for (i = 0; i < HAL_RXDMA_ERR_MAX; i++) {
8455 		index += qdf_snprint(&rxdma_error[index],
8456 				DP_RXDMA_ERR_LENGTH - index,
8457 				" %d", soc->stats.rx.err.rxdma_error[i]);
8458 	}
8459 	DP_PRINT_STATS("RXDMA Error (0-31):%s", rxdma_error);
8460 
8461 	index = 0;
8462 	for (i = 0; i < HAL_REO_ERR_MAX; i++) {
8463 		index += qdf_snprint(&reo_error[index],
8464 				DP_REO_ERR_LENGTH - index,
8465 				" %d", soc->stats.rx.err.reo_error[i]);
8466 	}
8467 	DP_PRINT_STATS("REO Error(0-14):%s", reo_error);
8468 	DP_PRINT_STATS("REO CMD SEND FAIL: %d",
8469 		       soc->stats.rx.err.reo_cmd_send_fail);
8470 
8471 	DP_PRINT_STATS("Rx BAR frames:%d", soc->stats.rx.bar_frame);
8472 	DP_PRINT_STATS("Rxdma2rel route drop:%d",
8473 		       soc->stats.rx.rxdma2rel_route_drop);
8474 	DP_PRINT_STATS("Reo2rel route drop:%d",
8475 		       soc->stats.rx.reo2rel_route_drop);
8476 	DP_PRINT_STATS("Rx Flush count:%d", soc->stats.rx.err.rx_flush_count);
8477 	DP_PRINT_STATS("RX HW stats request count:%d",
8478 		       soc->stats.rx.rx_hw_stats_requested);
8479 	DP_PRINT_STATS("RX HW stats request timeout:%d",
8480 		       soc->stats.rx.rx_hw_stats_timeout);
8481 	DP_PRINT_STATS("Rx invalid TID count:%d",
8482 		       soc->stats.rx.err.rx_invalid_tid_err);
8483 	DP_PRINT_STATS("Rx Defrag Address1 Invalid:%d",
8484 		       soc->stats.rx.err.defrag_ad1_invalid);
8485 	DP_PRINT_STATS("Rx decrypt error frame for valid peer:%d",
8486 		       soc->stats.rx.err.decrypt_err_drop);
8487 }
8488 
8489 #ifdef FEATURE_TSO_STATS
8490 void dp_print_tso_stats(struct dp_soc *soc,
8491 			enum qdf_stats_verbosity_level level)
8492 {
8493 	uint8_t loop_pdev;
8494 	uint32_t id;
8495 	struct dp_pdev *pdev;
8496 
8497 	for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) {
8498 		pdev = soc->pdev_list[loop_pdev];
8499 		DP_PRINT_STATS("TSO Statistics\n");
8500 		DP_PRINT_STATS(
8501 			  "From stack: %d | Successful completions: %d | TSO Packets: %d | TSO Completions: %d",
8502 			  pdev->stats.tx_i.rcvd.num,
8503 			  pdev->stats.tx.tx_success.num,
8504 			  pdev->stats.tso_stats.num_tso_pkts.num,
8505 			  pdev->stats.tso_stats.tso_comp);
8506 
8507 		for (id = 0; id < CDP_MAX_TSO_PACKETS; id++) {
8508 			/* TSO LEVEL 1 - PACKET INFO */
8509 			DP_PRINT_STATS(
8510 				  "Packet_Id:[%u]: Packet Length %zu | No. of segments: %u",
8511 				  id,
8512 				  pdev->stats.tso_stats.tso_info
8513 				  .tso_packet_info[id].tso_packet_len,
8514 				  pdev->stats.tso_stats.tso_info
8515 				  .tso_packet_info[id].num_seg);
8516 			/* TSO LEVEL 2 */
8517 			if (level == QDF_STATS_VERBOSITY_LEVEL_HIGH)
8518 				dp_print_tso_seg_stats(pdev, id);
8519 		}
8520 
8521 		DP_PRINT_STATS(
8522 			  "TSO Histogram: Single: %llu | 2-5 segs: %llu | 6-10: %llu segs | 11-15 segs: %llu | 16-20 segs: %llu | 20+ segs: %llu",
8523 			  pdev->stats.tso_stats.seg_histogram.segs_1,
8524 			  pdev->stats.tso_stats.seg_histogram.segs_2_5,
8525 			  pdev->stats.tso_stats.seg_histogram.segs_6_10,
8526 			  pdev->stats.tso_stats.seg_histogram.segs_11_15,
8527 			  pdev->stats.tso_stats.seg_histogram.segs_16_20,
8528 			  pdev->stats.tso_stats.seg_histogram.segs_20_plus);
8529 	}
8530 }
8531 
8532 void dp_stats_tso_segment_histogram_update(struct dp_pdev *pdev,
8533 					   uint8_t _p_cntrs)
8534 {
8535 	if (_p_cntrs == 1) {
8536 		DP_STATS_INC(pdev,
8537 			     tso_stats.seg_histogram.segs_1, 1);
8538 	} else if (_p_cntrs >= 2 && _p_cntrs <= 5) {
8539 		DP_STATS_INC(pdev,
8540 			     tso_stats.seg_histogram.segs_2_5, 1);
8541 	} else if (_p_cntrs > 5 && _p_cntrs <= 10) {
8542 		DP_STATS_INC(pdev,
8543 			     tso_stats.seg_histogram.segs_6_10, 1);
8544 	} else if (_p_cntrs > 10 && _p_cntrs <= 15) {
8545 		DP_STATS_INC(pdev,
8546 			     tso_stats.seg_histogram.segs_11_15, 1);
8547 	} else if (_p_cntrs > 15 && _p_cntrs <= 20) {
8548 		DP_STATS_INC(pdev,
8549 			     tso_stats.seg_histogram.segs_16_20, 1);
8550 	} else if (_p_cntrs > 20) {
8551 		DP_STATS_INC(pdev,
8552 			     tso_stats.seg_histogram.segs_20_plus, 1);
8553 	}
8554 }
8555 
8556 void dp_tso_segment_update(struct dp_pdev *pdev,
8557 			   uint32_t stats_idx,
8558 			   uint8_t idx,
8559 			   struct qdf_tso_seg_t seg)
8560 {
8561 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8562 		     .tso_seg[idx].num_frags,
8563 		     seg.num_frags);
8564 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8565 		     .tso_seg[idx].total_len,
8566 		     seg.total_len);
8567 
8568 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8569 		     .tso_seg[idx].tso_flags.tso_enable,
8570 		     seg.tso_flags.tso_enable);
8571 
8572 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8573 		     .tso_seg[idx].tso_flags.fin,
8574 		     seg.tso_flags.fin);
8575 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8576 		     .tso_seg[idx].tso_flags.syn,
8577 		     seg.tso_flags.syn);
8578 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8579 		     .tso_seg[idx].tso_flags.rst,
8580 		     seg.tso_flags.rst);
8581 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8582 		     .tso_seg[idx].tso_flags.psh,
8583 		     seg.tso_flags.psh);
8584 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8585 		     .tso_seg[idx].tso_flags.ack,
8586 		     seg.tso_flags.ack);
8587 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8588 		     .tso_seg[idx].tso_flags.urg,
8589 		     seg.tso_flags.urg);
8590 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8591 		     .tso_seg[idx].tso_flags.ece,
8592 		     seg.tso_flags.ece);
8593 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8594 		     .tso_seg[idx].tso_flags.cwr,
8595 		     seg.tso_flags.cwr);
8596 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8597 		     .tso_seg[idx].tso_flags.ns,
8598 		     seg.tso_flags.ns);
8599 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8600 		     .tso_seg[idx].tso_flags.tcp_seq_num,
8601 		     seg.tso_flags.tcp_seq_num);
8602 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8603 		     .tso_seg[idx].tso_flags.ip_id,
8604 		     seg.tso_flags.ip_id);
8605 }
8606 
8607 void dp_tso_packet_update(struct dp_pdev *pdev, uint32_t stats_idx,
8608 			  qdf_nbuf_t msdu, uint16_t num_segs)
8609 {
8610 	DP_STATS_UPD(pdev,
8611 		     tso_stats.tso_info.tso_packet_info[stats_idx]
8612 		     .num_seg,
8613 		     num_segs);
8614 
8615 	DP_STATS_UPD(pdev,
8616 		     tso_stats.tso_info.tso_packet_info[stats_idx]
8617 		     .tso_packet_len,
8618 		     qdf_nbuf_get_tcp_payload_len(msdu));
8619 }
8620 
8621 void dp_tso_segment_stats_update(struct dp_pdev *pdev,
8622 				 struct qdf_tso_seg_elem_t *stats_seg,
8623 				 uint32_t stats_idx)
8624 {
8625 	uint8_t tso_seg_idx = 0;
8626 
8627 	while (stats_seg  && (tso_seg_idx < CDP_MAX_TSO_SEGMENTS)) {
8628 		dp_tso_segment_update(pdev, stats_idx,
8629 				      tso_seg_idx,
8630 				      stats_seg->seg);
8631 		++tso_seg_idx;
8632 		stats_seg = stats_seg->next;
8633 	}
8634 }
8635 
8636 void dp_txrx_clear_tso_stats(struct dp_soc *soc)
8637 {
8638 	uint8_t loop_pdev;
8639 	struct dp_pdev *pdev;
8640 
8641 	for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) {
8642 		pdev = soc->pdev_list[loop_pdev];
8643 		dp_init_tso_stats(pdev);
8644 	}
8645 }
8646 #endif /* FEATURE_TSO_STATS */
8647 
8648 QDF_STATUS dp_txrx_get_peer_per_pkt_stats_param(struct dp_peer *peer,
8649 						enum cdp_peer_stats_type type,
8650 						cdp_peer_stats_param_t *buf)
8651 {
8652 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
8653 	struct dp_peer *tgt_peer;
8654 	struct dp_txrx_peer *txrx_peer;
8655 	struct dp_peer_per_pkt_stats *peer_stats;
8656 	uint8_t link_id = 0;
8657 	uint8_t idx = 0;
8658 	uint8_t stats_arr_size;
8659 	struct cdp_pkt_info pkt_info = {0};
8660 	struct dp_soc *soc = peer->vdev->pdev->soc;
8661 	struct dp_pdev *pdev = peer->vdev->pdev;
8662 
8663 	txrx_peer = dp_get_txrx_peer(peer);
8664 	if (!txrx_peer)
8665 		return QDF_STATUS_E_FAILURE;
8666 
8667 	stats_arr_size = txrx_peer->stats_arr_size;
8668 
8669 	if (IS_MLO_DP_LINK_PEER(peer))
8670 		link_id = dp_get_peer_hw_link_id(soc, pdev);
8671 
8672 	switch (type) {
8673 	case cdp_peer_tx_ucast:
8674 		if (link_id > 0) {
8675 			peer_stats = &txrx_peer->stats[link_id].per_pkt_stats;
8676 			buf->tx_ucast = peer_stats->tx.ucast;
8677 		} else {
8678 			for (idx = 0; idx < stats_arr_size; idx++) {
8679 				peer_stats =
8680 					&txrx_peer->stats[idx].per_pkt_stats;
8681 				pkt_info.num += peer_stats->tx.ucast.num;
8682 				pkt_info.bytes += peer_stats->tx.ucast.bytes;
8683 			}
8684 
8685 			buf->tx_ucast = pkt_info;
8686 		}
8687 
8688 		break;
8689 	case cdp_peer_tx_mcast:
8690 		if (link_id > 0) {
8691 			peer_stats = &txrx_peer->stats[link_id].per_pkt_stats;
8692 			buf->tx_mcast = peer_stats->tx.mcast;
8693 		} else {
8694 			for (idx = 0; idx < stats_arr_size; idx++) {
8695 				peer_stats =
8696 					&txrx_peer->stats[idx].per_pkt_stats;
8697 				pkt_info.num += peer_stats->tx.mcast.num;
8698 				pkt_info.bytes += peer_stats->tx.mcast.bytes;
8699 			}
8700 
8701 			buf->tx_mcast = pkt_info;
8702 		}
8703 
8704 		break;
8705 	case cdp_peer_tx_inactive_time:
8706 		tgt_peer = dp_get_tgt_peer_from_peer(peer);
8707 		if (tgt_peer)
8708 			buf->tx_inactive_time =
8709 					tgt_peer->stats.tx.inactive_time;
8710 		else
8711 			ret = QDF_STATUS_E_FAILURE;
8712 		break;
8713 	case cdp_peer_rx_ucast:
8714 		if (link_id > 0) {
8715 			peer_stats = &txrx_peer->stats[link_id].per_pkt_stats;
8716 			buf->rx_ucast = peer_stats->rx.unicast;
8717 		} else {
8718 			for (idx = 0; idx < stats_arr_size; idx++) {
8719 				peer_stats =
8720 					&txrx_peer->stats[idx].per_pkt_stats;
8721 				pkt_info.num += peer_stats->rx.unicast.num;
8722 				pkt_info.bytes += peer_stats->rx.unicast.bytes;
8723 			}
8724 
8725 			buf->rx_ucast = pkt_info;
8726 		}
8727 
8728 		break;
8729 	default:
8730 		ret = QDF_STATUS_E_FAILURE;
8731 		break;
8732 	}
8733 
8734 	return ret;
8735 }
8736 
8737 #ifdef QCA_ENHANCED_STATS_SUPPORT
8738 #ifdef WLAN_FEATURE_11BE_MLO
8739 QDF_STATUS dp_txrx_get_peer_extd_stats_param(struct dp_peer *peer,
8740 					     enum cdp_peer_stats_type type,
8741 					     cdp_peer_stats_param_t *buf)
8742 {
8743 	QDF_STATUS ret = QDF_STATUS_E_FAILURE;
8744 	struct dp_soc *soc = peer->vdev->pdev->soc;
8745 
8746 	if (IS_MLO_DP_MLD_PEER(peer)) {
8747 		struct dp_peer *link_peer;
8748 		struct dp_soc *link_peer_soc;
8749 
8750 		link_peer = dp_get_primary_link_peer_by_id(soc, peer->peer_id,
8751 							   DP_MOD_ID_CDP);
8752 
8753 		if (link_peer) {
8754 			link_peer_soc = link_peer->vdev->pdev->soc;
8755 			ret = dp_monitor_peer_get_stats_param(link_peer_soc,
8756 							      link_peer,
8757 							      type, buf);
8758 			dp_peer_unref_delete(link_peer, DP_MOD_ID_CDP);
8759 		}
8760 		return ret;
8761 	} else {
8762 		return dp_monitor_peer_get_stats_param(soc, peer, type, buf);
8763 	}
8764 }
8765 #else
8766 QDF_STATUS dp_txrx_get_peer_extd_stats_param(struct dp_peer *peer,
8767 					     enum cdp_peer_stats_type type,
8768 					     cdp_peer_stats_param_t *buf)
8769 {
8770 	struct dp_soc *soc = peer->vdev->pdev->soc;
8771 
8772 	return dp_monitor_peer_get_stats_param(soc, peer, type, buf);
8773 }
8774 #endif
8775 #else
8776 QDF_STATUS dp_txrx_get_peer_extd_stats_param(struct dp_peer *peer,
8777 					     enum cdp_peer_stats_type type,
8778 					     cdp_peer_stats_param_t *buf)
8779 {
8780 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
8781 	struct dp_txrx_peer *txrx_peer;
8782 	struct dp_peer_extd_stats *peer_stats;
8783 
8784 	txrx_peer = dp_get_txrx_peer(peer);
8785 	if (!txrx_peer)
8786 		return QDF_STATUS_E_FAILURE;
8787 
8788 	peer_stats = &txrx_peer->stats[0].extd_stats;
8789 
8790 	switch (type) {
8791 	case cdp_peer_tx_rate:
8792 		buf->tx_rate = peer_stats->tx.tx_rate;
8793 		break;
8794 	case cdp_peer_tx_last_tx_rate:
8795 		buf->last_tx_rate = peer_stats->tx.last_tx_rate;
8796 		break;
8797 	case cdp_peer_tx_ratecode:
8798 		buf->tx_ratecode = peer_stats->tx.tx_ratecode;
8799 		break;
8800 	case cdp_peer_rx_rate:
8801 		buf->rx_rate = peer_stats->rx.rx_rate;
8802 		break;
8803 	case cdp_peer_rx_last_rx_rate:
8804 		buf->last_rx_rate = peer_stats->rx.last_rx_rate;
8805 		break;
8806 	case cdp_peer_rx_ratecode:
8807 		buf->rx_ratecode = peer_stats->rx.rx_ratecode;
8808 		break;
8809 	case cdp_peer_rx_avg_snr:
8810 		buf->rx_avg_snr = peer_stats->rx.avg_snr;
8811 		break;
8812 	case cdp_peer_rx_snr:
8813 		buf->rx_snr = peer_stats->rx.snr;
8814 		break;
8815 	default:
8816 		ret = QDF_STATUS_E_FAILURE;
8817 		break;
8818 	}
8819 
8820 	return ret;
8821 }
8822 #endif
8823 
8824 /**
8825  * dp_is_wds_extended() - Check if wds ext is enabled
8826  * @txrx_peer: DP txrx_peer handle
8827  *
8828  * Return: true if enabled, false if not
8829  */
8830 #ifdef QCA_SUPPORT_WDS_EXTENDED
8831 static inline
8832 bool dp_is_wds_extended(struct dp_txrx_peer *txrx_peer)
8833 {
8834 	if (qdf_atomic_test_bit(WDS_EXT_PEER_INIT_BIT,
8835 				&txrx_peer->wds_ext.init))
8836 		return true;
8837 
8838 	return false;
8839 }
8840 #else
8841 static inline
8842 bool dp_is_wds_extended(struct dp_txrx_peer *txrx_peer)
8843 {
8844 	return false;
8845 }
8846 #endif /* QCA_SUPPORT_WDS_EXTENDED */
8847 
8848 /**
8849  * dp_peer_get_hw_txrx_stats_en() - Get value of hw_txrx_stats_en
8850  * @txrx_peer: DP txrx_peer handle
8851  *
8852  * Return: true if enabled, false if not
8853  */
8854 #ifdef QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT
8855 static inline
8856 bool dp_peer_get_hw_txrx_stats_en(struct dp_txrx_peer *txrx_peer)
8857 {
8858 	return txrx_peer->hw_txrx_stats_en;
8859 }
8860 #else
8861 static inline
8862 bool dp_peer_get_hw_txrx_stats_en(struct dp_txrx_peer *txrx_peer)
8863 {
8864 	return false;
8865 }
8866 #endif
8867 
8868 #ifdef WLAN_FEATURE_11BE_MLO
8869 static inline struct dp_peer *dp_get_stats_peer(struct dp_peer *peer)
8870 {
8871 	/* ML primary link peer return mld_peer */
8872 	if (IS_MLO_DP_LINK_PEER(peer) && peer->primary_link)
8873 		return peer->mld_peer;
8874 
8875 	return peer;
8876 }
8877 #else
8878 static inline struct dp_peer *dp_get_stats_peer(struct dp_peer *peer)
8879 {
8880 	return peer;
8881 }
8882 #endif
8883 
8884 /**
8885  * dp_update_vdev_basic_stats() - Update vdev basic stats
8886  * @txrx_peer: DP txrx_peer handle
8887  * @tgtobj: Pointer to buffer for vdev stats
8888  *
8889  * Return: None
8890  */
8891 static inline
8892 void dp_update_vdev_basic_stats(struct dp_txrx_peer *txrx_peer,
8893 				struct cdp_vdev_stats *tgtobj)
8894 {
8895 	if (qdf_unlikely(!txrx_peer || !tgtobj))
8896 		return;
8897 
8898 	if (!dp_peer_get_hw_txrx_stats_en(txrx_peer)) {
8899 		tgtobj->tx.comp_pkt.num += txrx_peer->comp_pkt.num;
8900 		tgtobj->tx.comp_pkt.bytes += txrx_peer->comp_pkt.bytes;
8901 		tgtobj->tx.tx_failed += txrx_peer->tx_failed;
8902 	}
8903 	tgtobj->rx.to_stack.num += txrx_peer->to_stack.num;
8904 	tgtobj->rx.to_stack.bytes += txrx_peer->to_stack.bytes;
8905 }
8906 
8907 #ifdef QCA_ENHANCED_STATS_SUPPORT
8908 void dp_update_vdev_stats(struct dp_soc *soc, struct dp_peer *srcobj,
8909 			  void *arg)
8910 {
8911 	struct dp_txrx_peer *txrx_peer;
8912 	struct cdp_vdev_stats *vdev_stats = (struct cdp_vdev_stats *)arg;
8913 	struct dp_peer_per_pkt_stats *per_pkt_stats;
8914 	uint8_t link_id = 0;
8915 	struct dp_pdev *pdev = srcobj->vdev->pdev;
8916 
8917 	txrx_peer = dp_get_txrx_peer(srcobj);
8918 	if (qdf_unlikely(!txrx_peer))
8919 		goto link_stats;
8920 
8921 	if (dp_peer_is_primary_link_peer(srcobj)) {
8922 		dp_update_vdev_basic_stats(txrx_peer, vdev_stats);
8923 		per_pkt_stats = &txrx_peer->stats[0].per_pkt_stats;
8924 		DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats);
8925 	}
8926 
8927 	if (IS_MLO_DP_LINK_PEER(srcobj)) {
8928 		link_id = dp_get_peer_hw_link_id(soc, pdev);
8929 		if (link_id > 0) {
8930 			per_pkt_stats = &txrx_peer->
8931 				stats[link_id].per_pkt_stats;
8932 			DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats);
8933 		}
8934 	}
8935 
8936 link_stats:
8937 	dp_monitor_peer_get_stats(soc, srcobj, vdev_stats, UPDATE_VDEV_STATS);
8938 }
8939 
8940 void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev,
8941 					struct dp_peer *peer)
8942 {
8943 	struct dp_soc *soc = vdev->pdev->soc;
8944 	struct dp_txrx_peer *txrx_peer;
8945 	struct dp_peer_per_pkt_stats *per_pkt_stats;
8946 	struct cdp_vdev_stats *vdev_stats = &vdev->stats;
8947 	uint8_t link_id = 0;
8948 	struct dp_pdev *pdev = vdev->pdev;
8949 
8950 	if (soc->arch_ops.dp_get_vdev_stats_for_unmap_peer)
8951 		soc->arch_ops.dp_get_vdev_stats_for_unmap_peer(vdev,
8952 							       peer,
8953 							       &vdev_stats);
8954 
8955 	txrx_peer = dp_get_txrx_peer(peer);
8956 	if (!txrx_peer)
8957 		goto link_stats;
8958 
8959 	dp_peer_aggregate_tid_stats(peer);
8960 
8961 	if (!IS_MLO_DP_LINK_PEER(peer)) {
8962 		per_pkt_stats = &txrx_peer->stats[0].per_pkt_stats;
8963 		dp_update_vdev_basic_stats(txrx_peer, vdev_stats);
8964 		DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats);
8965 	}
8966 
8967 	if (IS_MLO_DP_LINK_PEER(peer)) {
8968 		link_id = dp_get_peer_hw_link_id(soc, pdev);
8969 		if (link_id > 0) {
8970 			per_pkt_stats =
8971 				&txrx_peer->stats[link_id].per_pkt_stats;
8972 			DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats);
8973 		}
8974 	}
8975 
8976 link_stats:
8977 	dp_monitor_peer_get_stats(soc, peer, vdev_stats, UPDATE_VDEV_STATS);
8978 }
8979 #else
8980 void dp_update_vdev_stats(struct dp_soc *soc, struct dp_peer *srcobj,
8981 			  void *arg)
8982 {
8983 	struct dp_txrx_peer *txrx_peer;
8984 	struct cdp_vdev_stats *vdev_stats = (struct cdp_vdev_stats *)arg;
8985 	struct dp_peer_per_pkt_stats *per_pkt_stats;
8986 	struct dp_peer_extd_stats *extd_stats;
8987 	uint8_t inx = 0;
8988 	uint8_t stats_arr_size = 0;
8989 
8990 	txrx_peer = dp_get_txrx_peer(srcobj);
8991 	if (qdf_unlikely(!txrx_peer))
8992 		return;
8993 
8994 	if (qdf_unlikely(dp_is_wds_extended(txrx_peer)))
8995 		return;
8996 
8997 	if (!dp_peer_is_primary_link_peer(srcobj))
8998 		return;
8999 
9000 	stats_arr_size = txrx_peer->stats_arr_size;
9001 	dp_update_vdev_basic_stats(txrx_peer, vdev_stats);
9002 
9003 	for (inx = 0; inx < stats_arr_size; inx++) {
9004 		per_pkt_stats = &txrx_peer->stats[inx].per_pkt_stats;
9005 		extd_stats = &txrx_peer->stats[inx].extd_stats;
9006 		DP_UPDATE_EXTD_STATS(vdev_stats, extd_stats);
9007 		DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats);
9008 	}
9009 }
9010 
9011 void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev,
9012 					struct dp_peer *peer)
9013 {
9014 	struct dp_txrx_peer *txrx_peer;
9015 	struct dp_peer_per_pkt_stats *per_pkt_stats;
9016 	struct dp_peer_extd_stats *extd_stats;
9017 	struct cdp_vdev_stats *vdev_stats = &vdev->stats;
9018 	uint8_t inx = 0;
9019 	uint8_t stats_arr_size = 0;
9020 
9021 	txrx_peer = dp_get_txrx_peer(peer);
9022 	if (!txrx_peer)
9023 		return;
9024 
9025 	stats_arr_size = txrx_peer->stats_arr_size;
9026 	dp_update_vdev_basic_stats(txrx_peer, vdev_stats);
9027 
9028 	for (inx = 0; inx < stats_arr_size; inx++) {
9029 		per_pkt_stats = &txrx_peer->stats[inx].per_pkt_stats;
9030 		extd_stats = &txrx_peer->stats[inx].extd_stats;
9031 		DP_UPDATE_EXTD_STATS(vdev_stats, extd_stats);
9032 		DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats);
9033 	}
9034 }
9035 #endif
9036 
9037 void dp_update_pdev_stats(struct dp_pdev *tgtobj,
9038 			  struct cdp_vdev_stats *srcobj)
9039 {
9040 	uint8_t i;
9041 	uint8_t pream_type;
9042 	uint8_t mu_type;
9043 	struct cdp_pdev_stats *pdev_stats = NULL;
9044 
9045 	pdev_stats = &tgtobj->stats;
9046 	for (pream_type = 0; pream_type < DOT11_MAX; pream_type++) {
9047 		for (i = 0; i < MAX_MCS; i++) {
9048 			tgtobj->stats.tx.pkt_type[pream_type].
9049 				mcs_count[i] +=
9050 			srcobj->tx.pkt_type[pream_type].
9051 				mcs_count[i];
9052 			tgtobj->stats.rx.pkt_type[pream_type].
9053 				mcs_count[i] +=
9054 			srcobj->rx.pkt_type[pream_type].
9055 				mcs_count[i];
9056 		}
9057 	}
9058 
9059 	for (i = 0; i < MAX_BW; i++) {
9060 		tgtobj->stats.tx.bw[i] += srcobj->tx.bw[i];
9061 		tgtobj->stats.rx.bw[i] += srcobj->rx.bw[i];
9062 	}
9063 
9064 	for (i = 0; i < SS_COUNT; i++) {
9065 		tgtobj->stats.tx.nss[i] += srcobj->tx.nss[i];
9066 		tgtobj->stats.rx.nss[i] += srcobj->rx.nss[i];
9067 		tgtobj->stats.rx.ppdu_nss[i] += srcobj->rx.ppdu_nss[i];
9068 	}
9069 
9070 	for (i = 0; i < WME_AC_MAX; i++) {
9071 		tgtobj->stats.tx.wme_ac_type[i] +=
9072 			srcobj->tx.wme_ac_type[i];
9073 		tgtobj->stats.tx.wme_ac_type_bytes[i] +=
9074 			srcobj->tx.wme_ac_type_bytes[i];
9075 		tgtobj->stats.rx.wme_ac_type[i] +=
9076 			srcobj->rx.wme_ac_type[i];
9077 		tgtobj->stats.rx.wme_ac_type_bytes[i] +=
9078 			srcobj->rx.wme_ac_type_bytes[i];
9079 		tgtobj->stats.tx.excess_retries_per_ac[i] +=
9080 			srcobj->tx.excess_retries_per_ac[i];
9081 	}
9082 
9083 	for (i = 0; i < MAX_GI; i++) {
9084 		tgtobj->stats.tx.sgi_count[i] +=
9085 			srcobj->tx.sgi_count[i];
9086 		tgtobj->stats.rx.sgi_count[i] +=
9087 			srcobj->rx.sgi_count[i];
9088 	}
9089 
9090 	for (i = 0; i < MAX_RECEPTION_TYPES; i++) {
9091 		tgtobj->stats.rx.reception_type[i] +=
9092 			srcobj->rx.reception_type[i];
9093 		tgtobj->stats.rx.ppdu_cnt[i] += srcobj->rx.ppdu_cnt[i];
9094 	}
9095 
9096 	for (i = 0; i < MAX_TRANSMIT_TYPES; i++) {
9097 		tgtobj->stats.tx.transmit_type[i].num_msdu +=
9098 				srcobj->tx.transmit_type[i].num_msdu;
9099 		tgtobj->stats.tx.transmit_type[i].num_mpdu +=
9100 				srcobj->tx.transmit_type[i].num_mpdu;
9101 		tgtobj->stats.tx.transmit_type[i].mpdu_tried +=
9102 				srcobj->tx.transmit_type[i].mpdu_tried;
9103 	}
9104 
9105 	for (i = 0; i < QDF_PROTO_SUBTYPE_MAX; i++)
9106 		tgtobj->stats.tx.no_ack_count[i] += srcobj->tx.no_ack_count[i];
9107 
9108 	for (i = 0; i < MAX_MU_GROUP_ID; i++)
9109 		tgtobj->stats.tx.mu_group_id[i] = srcobj->tx.mu_group_id[i];
9110 
9111 	for (i = 0; i < MAX_RU_LOCATIONS; i++) {
9112 		tgtobj->stats.tx.ru_loc[i].num_msdu +=
9113 			srcobj->tx.ru_loc[i].num_msdu;
9114 		tgtobj->stats.tx.ru_loc[i].num_mpdu +=
9115 			srcobj->tx.ru_loc[i].num_mpdu;
9116 		tgtobj->stats.tx.ru_loc[i].mpdu_tried +=
9117 			srcobj->tx.ru_loc[i].mpdu_tried;
9118 	}
9119 
9120 	tgtobj->stats.tx.tx_ppdus += srcobj->tx.tx_ppdus;
9121 	tgtobj->stats.tx.tx_mpdus_success += srcobj->tx.tx_mpdus_success;
9122 	tgtobj->stats.tx.tx_mpdus_tried += srcobj->tx.tx_mpdus_tried;
9123 	tgtobj->stats.tx.retries_mpdu += srcobj->tx.retries_mpdu;
9124 	tgtobj->stats.tx.mpdu_success_with_retries +=
9125 		srcobj->tx.mpdu_success_with_retries;
9126 	tgtobj->stats.tx.last_tx_ts = srcobj->tx.last_tx_ts;
9127 	tgtobj->stats.tx.tx_rate = srcobj->tx.tx_rate;
9128 	tgtobj->stats.tx.last_tx_rate = srcobj->tx.last_tx_rate;
9129 	tgtobj->stats.tx.last_tx_rate_mcs = srcobj->tx.last_tx_rate_mcs;
9130 	tgtobj->stats.tx.mcast_last_tx_rate = srcobj->tx.mcast_last_tx_rate;
9131 	tgtobj->stats.tx.mcast_last_tx_rate_mcs =
9132 		srcobj->tx.mcast_last_tx_rate_mcs;
9133 	tgtobj->stats.tx.rnd_avg_tx_rate = srcobj->tx.rnd_avg_tx_rate;
9134 	tgtobj->stats.tx.avg_tx_rate = srcobj->tx.avg_tx_rate;
9135 	tgtobj->stats.tx.tx_ratecode = srcobj->tx.tx_ratecode;
9136 	tgtobj->stats.tx.ru_start = srcobj->tx.ru_start;
9137 	tgtobj->stats.tx.ru_tones = srcobj->tx.ru_tones;
9138 	tgtobj->stats.tx.last_ack_rssi = srcobj->tx.last_ack_rssi;
9139 	tgtobj->stats.tx.nss_info = srcobj->tx.nss_info;
9140 	tgtobj->stats.tx.mcs_info = srcobj->tx.mcs_info;
9141 	tgtobj->stats.tx.bw_info = srcobj->tx.bw_info;
9142 	tgtobj->stats.tx.gi_info = srcobj->tx.gi_info;
9143 	tgtobj->stats.tx.preamble_info = srcobj->tx.preamble_info;
9144 	tgtobj->stats.tx.comp_pkt.bytes += srcobj->tx.comp_pkt.bytes;
9145 	tgtobj->stats.tx.comp_pkt.num += srcobj->tx.comp_pkt.num;
9146 	tgtobj->stats.tx.ucast.num += srcobj->tx.ucast.num;
9147 	tgtobj->stats.tx.ucast.bytes += srcobj->tx.ucast.bytes;
9148 	tgtobj->stats.tx.mcast.num += srcobj->tx.mcast.num;
9149 	tgtobj->stats.tx.mcast.bytes += srcobj->tx.mcast.bytes;
9150 	tgtobj->stats.tx.bcast.num += srcobj->tx.bcast.num;
9151 	tgtobj->stats.tx.bcast.bytes += srcobj->tx.bcast.bytes;
9152 	tgtobj->stats.tx.tx_success.num += srcobj->tx.tx_success.num;
9153 	tgtobj->stats.tx.tx_success.bytes +=
9154 		srcobj->tx.tx_success.bytes;
9155 	tgtobj->stats.tx.nawds_mcast.num +=
9156 		srcobj->tx.nawds_mcast.num;
9157 	tgtobj->stats.tx.nawds_mcast.bytes +=
9158 		srcobj->tx.nawds_mcast.bytes;
9159 	tgtobj->stats.tx.nawds_mcast_drop +=
9160 		srcobj->tx.nawds_mcast_drop;
9161 	tgtobj->stats.tx.num_ppdu_cookie_valid +=
9162 		srcobj->tx.num_ppdu_cookie_valid;
9163 	tgtobj->stats.tx.tx_failed += srcobj->tx.tx_failed;
9164 	tgtobj->stats.tx.ofdma += srcobj->tx.ofdma;
9165 	tgtobj->stats.tx.stbc += srcobj->tx.stbc;
9166 	tgtobj->stats.tx.ldpc += srcobj->tx.ldpc;
9167 	tgtobj->stats.tx.pream_punct_cnt += srcobj->tx.pream_punct_cnt;
9168 	tgtobj->stats.tx.retries += srcobj->tx.retries;
9169 	tgtobj->stats.tx.non_amsdu_cnt += srcobj->tx.non_amsdu_cnt;
9170 	tgtobj->stats.tx.amsdu_cnt += srcobj->tx.amsdu_cnt;
9171 	tgtobj->stats.tx.non_ampdu_cnt += srcobj->tx.non_ampdu_cnt;
9172 	tgtobj->stats.tx.ampdu_cnt += srcobj->tx.ampdu_cnt;
9173 	tgtobj->stats.tx.dropped.fw_rem.num += srcobj->tx.dropped.fw_rem.num;
9174 	tgtobj->stats.tx.dropped.fw_rem.bytes +=
9175 			srcobj->tx.dropped.fw_rem.bytes;
9176 	tgtobj->stats.tx.dropped.fw_rem_tx +=
9177 			srcobj->tx.dropped.fw_rem_tx;
9178 	tgtobj->stats.tx.dropped.fw_rem_notx +=
9179 			srcobj->tx.dropped.fw_rem_notx;
9180 	tgtobj->stats.tx.dropped.fw_reason1 +=
9181 			srcobj->tx.dropped.fw_reason1;
9182 	tgtobj->stats.tx.dropped.fw_reason2 +=
9183 			srcobj->tx.dropped.fw_reason2;
9184 	tgtobj->stats.tx.dropped.fw_reason3 +=
9185 			srcobj->tx.dropped.fw_reason3;
9186 	tgtobj->stats.tx.dropped.fw_rem_queue_disable +=
9187 				srcobj->tx.dropped.fw_rem_queue_disable;
9188 	tgtobj->stats.tx.dropped.fw_rem_no_match +=
9189 				srcobj->tx.dropped.fw_rem_no_match;
9190 	tgtobj->stats.tx.dropped.drop_threshold +=
9191 				srcobj->tx.dropped.drop_threshold;
9192 	tgtobj->stats.tx.dropped.drop_link_desc_na +=
9193 				srcobj->tx.dropped.drop_link_desc_na;
9194 	tgtobj->stats.tx.dropped.invalid_drop +=
9195 				srcobj->tx.dropped.invalid_drop;
9196 	tgtobj->stats.tx.dropped.mcast_vdev_drop +=
9197 					srcobj->tx.dropped.mcast_vdev_drop;
9198 	tgtobj->stats.tx.dropped.invalid_rr +=
9199 				srcobj->tx.dropped.invalid_rr;
9200 	tgtobj->stats.tx.dropped.age_out += srcobj->tx.dropped.age_out;
9201 	tgtobj->stats.rx.err.mic_err += srcobj->rx.err.mic_err;
9202 	tgtobj->stats.rx.err.decrypt_err += srcobj->rx.err.decrypt_err;
9203 	tgtobj->stats.rx.err.fcserr += srcobj->rx.err.fcserr;
9204 	tgtobj->stats.rx.err.pn_err += srcobj->rx.err.pn_err;
9205 	tgtobj->stats.rx.err.oor_err += srcobj->rx.err.oor_err;
9206 	tgtobj->stats.rx.err.jump_2k_err += srcobj->rx.err.jump_2k_err;
9207 	tgtobj->stats.rx.err.rxdma_wifi_parse_err +=
9208 				srcobj->rx.err.rxdma_wifi_parse_err;
9209 	if (srcobj->rx.snr != 0)
9210 		tgtobj->stats.rx.snr = srcobj->rx.snr;
9211 	tgtobj->stats.rx.rx_rate = srcobj->rx.rx_rate;
9212 	tgtobj->stats.rx.last_rx_rate = srcobj->rx.last_rx_rate;
9213 	tgtobj->stats.rx.rnd_avg_rx_rate = srcobj->rx.rnd_avg_rx_rate;
9214 	tgtobj->stats.rx.avg_rx_rate = srcobj->rx.avg_rx_rate;
9215 	tgtobj->stats.rx.rx_ratecode = srcobj->rx.rx_ratecode;
9216 	tgtobj->stats.rx.avg_snr = srcobj->rx.avg_snr;
9217 	tgtobj->stats.rx.rx_snr_measured_time = srcobj->rx.rx_snr_measured_time;
9218 	tgtobj->stats.rx.last_snr = srcobj->rx.last_snr;
9219 	tgtobj->stats.rx.nss_info = srcobj->rx.nss_info;
9220 	tgtobj->stats.rx.mcs_info = srcobj->rx.mcs_info;
9221 	tgtobj->stats.rx.bw_info = srcobj->rx.bw_info;
9222 	tgtobj->stats.rx.gi_info = srcobj->rx.gi_info;
9223 	tgtobj->stats.rx.preamble_info = srcobj->rx.preamble_info;
9224 	tgtobj->stats.rx.non_ampdu_cnt += srcobj->rx.non_ampdu_cnt;
9225 	tgtobj->stats.rx.ampdu_cnt += srcobj->rx.ampdu_cnt;
9226 	tgtobj->stats.rx.non_amsdu_cnt += srcobj->rx.non_amsdu_cnt;
9227 	tgtobj->stats.rx.amsdu_cnt += srcobj->rx.amsdu_cnt;
9228 	tgtobj->stats.rx.nawds_mcast_drop += srcobj->rx.nawds_mcast_drop;
9229 	tgtobj->stats.rx.mcast_3addr_drop += srcobj->rx.mcast_3addr_drop;
9230 	tgtobj->stats.rx.to_stack.num += srcobj->rx.to_stack.num;
9231 	tgtobj->stats.rx.to_stack.bytes += srcobj->rx.to_stack.bytes;
9232 
9233 	for (i = 0; i < CDP_MAX_RX_RINGS; i++) {
9234 		tgtobj->stats.rx.rcvd_reo[i].num +=
9235 			srcobj->rx.rcvd_reo[i].num;
9236 		tgtobj->stats.rx.rcvd_reo[i].bytes +=
9237 			srcobj->rx.rcvd_reo[i].bytes;
9238 	}
9239 
9240 	for (i = 0; i < CDP_MAX_LMACS; i++) {
9241 		tgtobj->stats.rx.rx_lmac[i].num +=
9242 			srcobj->rx.rx_lmac[i].num;
9243 		tgtobj->stats.rx.rx_lmac[i].bytes +=
9244 			srcobj->rx.rx_lmac[i].bytes;
9245 	}
9246 
9247 	if (srcobj->rx.to_stack.num >= (srcobj->rx.multicast.num))
9248 		srcobj->rx.unicast.num =
9249 			srcobj->rx.to_stack.num -
9250 				(srcobj->rx.multicast.num);
9251 	if (srcobj->rx.to_stack.bytes >= srcobj->rx.multicast.bytes)
9252 		srcobj->rx.unicast.bytes =
9253 			srcobj->rx.to_stack.bytes -
9254 				(srcobj->rx.multicast.bytes);
9255 
9256 	tgtobj->stats.rx.unicast.num += srcobj->rx.unicast.num;
9257 	tgtobj->stats.rx.unicast.bytes += srcobj->rx.unicast.bytes;
9258 	tgtobj->stats.rx.multicast.num += srcobj->rx.multicast.num;
9259 	tgtobj->stats.rx.multicast.bytes += srcobj->rx.multicast.bytes;
9260 	tgtobj->stats.rx.bcast.num += srcobj->rx.bcast.num;
9261 	tgtobj->stats.rx.bcast.bytes += srcobj->rx.bcast.bytes;
9262 	tgtobj->stats.rx.raw.num += srcobj->rx.raw.num;
9263 	tgtobj->stats.rx.raw.bytes += srcobj->rx.raw.bytes;
9264 	tgtobj->stats.rx.intra_bss.pkts.num +=
9265 			srcobj->rx.intra_bss.pkts.num;
9266 	tgtobj->stats.rx.intra_bss.pkts.bytes +=
9267 			srcobj->rx.intra_bss.pkts.bytes;
9268 	tgtobj->stats.rx.intra_bss.fail.num +=
9269 			srcobj->rx.intra_bss.fail.num;
9270 	tgtobj->stats.rx.intra_bss.fail.bytes +=
9271 			srcobj->rx.intra_bss.fail.bytes;
9272 
9273 	tgtobj->stats.tx.last_ack_rssi =
9274 		srcobj->tx.last_ack_rssi;
9275 	tgtobj->stats.rx.mec_drop.num += srcobj->rx.mec_drop.num;
9276 	tgtobj->stats.rx.mec_drop.bytes += srcobj->rx.mec_drop.bytes;
9277 	tgtobj->stats.rx.ppeds_drop.num += srcobj->rx.ppeds_drop.num;
9278 	tgtobj->stats.rx.ppeds_drop.bytes += srcobj->rx.ppeds_drop.bytes;
9279 	tgtobj->stats.rx.multipass_rx_pkt_drop +=
9280 		srcobj->rx.multipass_rx_pkt_drop;
9281 	tgtobj->stats.rx.peer_unauth_rx_pkt_drop +=
9282 		srcobj->rx.peer_unauth_rx_pkt_drop;
9283 	tgtobj->stats.rx.policy_check_drop +=
9284 		srcobj->rx.policy_check_drop;
9285 
9286 	for (mu_type = 0 ; mu_type < TXRX_TYPE_MU_MAX; mu_type++) {
9287 		tgtobj->stats.rx.rx_mu[mu_type].mpdu_cnt_fcs_ok +=
9288 			srcobj->rx.rx_mu[mu_type].mpdu_cnt_fcs_ok;
9289 		tgtobj->stats.rx.rx_mu[mu_type].mpdu_cnt_fcs_err +=
9290 			srcobj->rx.rx_mu[mu_type].mpdu_cnt_fcs_err;
9291 		for (i = 0; i < SS_COUNT; i++)
9292 			tgtobj->stats.rx.rx_mu[mu_type].ppdu_nss[i] +=
9293 				srcobj->rx.rx_mu[mu_type].ppdu_nss[i];
9294 		for (i = 0; i < MAX_MCS; i++)
9295 			tgtobj->stats.rx.rx_mu[mu_type].ppdu.mcs_count[i] +=
9296 				srcobj->rx.rx_mu[mu_type].ppdu.mcs_count[i];
9297 	}
9298 
9299 	for (i = 0; i < MAX_MCS; i++) {
9300 		tgtobj->stats.rx.su_ax_ppdu_cnt.mcs_count[i] +=
9301 			srcobj->rx.su_ax_ppdu_cnt.mcs_count[i];
9302 		tgtobj->stats.rx.rx_mpdu_cnt[i] += srcobj->rx.rx_mpdu_cnt[i];
9303 	}
9304 
9305 	tgtobj->stats.rx.mpdu_cnt_fcs_ok += srcobj->rx.mpdu_cnt_fcs_ok;
9306 	tgtobj->stats.rx.mpdu_cnt_fcs_err += srcobj->rx.mpdu_cnt_fcs_err;
9307 	tgtobj->stats.rx.rx_mpdus += srcobj->rx.rx_mpdus;
9308 	tgtobj->stats.rx.rx_ppdus += srcobj->rx.rx_ppdus;
9309 	tgtobj->stats.rx.mpdu_retry_cnt += srcobj->rx.mpdu_retry_cnt;
9310 	tgtobj->stats.rx.rx_retries += srcobj->rx.rx_retries;
9311 
9312 	DP_UPDATE_11BE_STATS(pdev_stats, srcobj);
9313 }
9314 
9315 void dp_update_vdev_ingress_stats(struct dp_vdev *tgtobj)
9316 {
9317 	tgtobj->stats.tx_i.dropped.dropped_pkt.num =
9318 		tgtobj->stats.tx_i.dropped.dma_error +
9319 		tgtobj->stats.tx_i.dropped.ring_full +
9320 		tgtobj->stats.tx_i.dropped.enqueue_fail +
9321 		tgtobj->stats.tx_i.dropped.fail_per_pkt_vdev_id_check +
9322 		tgtobj->stats.tx_i.dropped.desc_na.num +
9323 		tgtobj->stats.tx_i.dropped.res_full +
9324 		tgtobj->stats.tx_i.dropped.drop_ingress +
9325 		tgtobj->stats.tx_i.dropped.headroom_insufficient +
9326 		tgtobj->stats.tx_i.dropped.invalid_peer_id_in_exc_path +
9327 		tgtobj->stats.tx_i.dropped.tx_mcast_drop +
9328 		tgtobj->stats.tx_i.dropped.fw2wbm_tx_drop;
9329 }
9330 
9331 void dp_update_vdev_rate_stats(struct cdp_vdev_stats *tgtobj,
9332 			       struct cdp_vdev_stats *srcobj)
9333 {
9334 	tgtobj->tx.last_tx_rate = srcobj->tx.last_tx_rate;
9335 	tgtobj->tx.last_tx_rate_mcs = srcobj->tx.last_tx_rate_mcs;
9336 	tgtobj->tx.mcast_last_tx_rate = srcobj->tx.mcast_last_tx_rate;
9337 	tgtobj->tx.mcast_last_tx_rate_mcs = srcobj->tx.mcast_last_tx_rate_mcs;
9338 	tgtobj->rx.last_rx_rate = srcobj->rx.last_rx_rate;
9339 }
9340 
9341 void dp_update_pdev_ingress_stats(struct dp_pdev *tgtobj,
9342 				  struct dp_vdev *srcobj)
9343 {
9344 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.nawds_mcast);
9345 
9346 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.rcvd);
9347 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_in_fast_xmit_flow);
9348 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_per_core[0]);
9349 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_per_core[1]);
9350 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_per_core[2]);
9351 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_per_core[3]);
9352 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.processed);
9353 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.reinject_pkts);
9354 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.inspect_pkts);
9355 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.raw.raw_pkt);
9356 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.raw.dma_map_error);
9357 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.raw.num_frags_overflow_err);
9358 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.sg.dropped_host.num);
9359 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.sg.dropped_target);
9360 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.sg.sg_pkt);
9361 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.mcast_en.mcast_pkt);
9362 	DP_STATS_AGGR(tgtobj, srcobj,
9363 		      tx_i.mcast_en.dropped_map_error);
9364 	DP_STATS_AGGR(tgtobj, srcobj,
9365 		      tx_i.mcast_en.dropped_self_mac);
9366 	DP_STATS_AGGR(tgtobj, srcobj,
9367 		      tx_i.mcast_en.dropped_send_fail);
9368 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.mcast_en.ucast);
9369 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.igmp_mcast_en.igmp_rcvd);
9370 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.igmp_mcast_en.igmp_ucast_converted);
9371 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.dma_error);
9372 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.ring_full);
9373 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.enqueue_fail);
9374 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.fail_per_pkt_vdev_id_check);
9375 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.desc_na.num);
9376 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.res_full);
9377 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.drop_ingress);
9378 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.headroom_insufficient);
9379 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.invalid_peer_id_in_exc_path);
9380 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.tx_mcast_drop);
9381 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.fw2wbm_tx_drop);
9382 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.cce_classified);
9383 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.cce_classified_raw);
9384 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.sniffer_rcvd);
9385 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.mesh.exception_fw);
9386 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.mesh.completion_fw);
9387 
9388 	DP_STATS_AGGR_PKT(tgtobj, srcobj, rx_i.reo_rcvd_pkt);
9389 	DP_STATS_AGGR_PKT(tgtobj, srcobj, rx_i.null_q_desc_pkt);
9390 	DP_STATS_AGGR_PKT(tgtobj, srcobj, rx_i.routed_eapol_pkt);
9391 
9392 	tgtobj->stats.tx_i.dropped.dropped_pkt.num =
9393 		tgtobj->stats.tx_i.dropped.dma_error +
9394 		tgtobj->stats.tx_i.dropped.ring_full +
9395 		tgtobj->stats.tx_i.dropped.enqueue_fail +
9396 		tgtobj->stats.tx_i.dropped.fail_per_pkt_vdev_id_check +
9397 		tgtobj->stats.tx_i.dropped.desc_na.num +
9398 		tgtobj->stats.tx_i.dropped.res_full +
9399 		tgtobj->stats.tx_i.dropped.drop_ingress +
9400 		tgtobj->stats.tx_i.dropped.headroom_insufficient +
9401 		tgtobj->stats.tx_i.dropped.invalid_peer_id_in_exc_path +
9402 		tgtobj->stats.tx_i.dropped.tx_mcast_drop;
9403 }
9404 
9405 QDF_STATUS dp_txrx_get_soc_stats(struct cdp_soc_t *soc_hdl,
9406 				 struct cdp_soc_stats *soc_stats)
9407 {
9408 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9409 	uint8_t inx;
9410 	uint8_t cpus;
9411 
9412 	/* soc tx stats */
9413 	soc_stats->tx.egress = soc->stats.tx.egress[0];
9414 	soc_stats->tx.tx_invalid_peer = soc->stats.tx.tx_invalid_peer;
9415 	for (inx = 0; inx < CDP_MAX_TX_DATA_RINGS; inx++) {
9416 		soc_stats->tx.tx_hw_enq[inx] = soc->stats.tx.tcl_enq[inx];
9417 		soc_stats->tx.tx_hw_ring_full[inx] =
9418 					soc->stats.tx.tcl_ring_full[inx];
9419 	}
9420 	soc_stats->tx.desc_in_use = soc->stats.tx.desc_in_use;
9421 	soc_stats->tx.dropped_fw_removed = soc->stats.tx.dropped_fw_removed;
9422 	soc_stats->tx.invalid_release_source =
9423 					soc->stats.tx.invalid_release_source;
9424 	soc_stats->tx.invalid_tx_comp_desc =
9425 					soc->stats.tx.invalid_tx_comp_desc;
9426 	for (inx = 0; inx < CDP_MAX_WIFI_INT_ERROR_REASONS; inx++)
9427 		soc_stats->tx.wifi_internal_error[inx] =
9428 					soc->stats.tx.wbm_internal_error[inx];
9429 	soc_stats->tx.non_wifi_internal_err =
9430 					soc->stats.tx.non_wbm_internal_err;
9431 	soc_stats->tx.tx_comp_loop_pkt_limit_hit =
9432 				soc->stats.tx.tx_comp_loop_pkt_limit_hit;
9433 	soc_stats->tx.hp_oos2 = soc->stats.tx.hp_oos2;
9434 	soc_stats->tx.tx_comp_exception = soc->stats.tx.tx_comp_exception;
9435 	/* soc rx stats */
9436 	soc_stats->rx.ingress = soc->stats.rx.ingress;
9437 	soc_stats->rx.err_ring_pkts = soc->stats.rx.err_ring_pkts;
9438 	soc_stats->rx.rx_frags = soc->stats.rx.rx_frags;
9439 	soc_stats->rx.rx_hw_reinject = soc->stats.rx.reo_reinject;
9440 	soc_stats->rx.bar_frame = soc->stats.rx.bar_frame;
9441 	soc_stats->rx.rx_frag_err_len_error =
9442 					soc->stats.rx.rx_frag_err_len_error;
9443 	soc_stats->rx.rx_frag_err_no_peer = soc->stats.rx.rx_frag_err_no_peer;
9444 	soc_stats->rx.rx_frag_wait = soc->stats.rx.rx_frag_wait;
9445 	soc_stats->rx.rx_frag_err = soc->stats.rx.rx_frag_err;
9446 	soc_stats->rx.rx_frag_oor = soc->stats.rx.rx_frag_oor;
9447 	soc_stats->rx.reap_loop_pkt_limit_hit =
9448 					soc->stats.rx.reap_loop_pkt_limit_hit;
9449 	soc_stats->rx.hp_oos2 = soc->stats.rx.hp_oos2;
9450 	soc_stats->rx.near_full = soc->stats.rx.near_full;
9451 	soc_stats->rx.msdu_scatter_wait_break =
9452 					soc->stats.rx.msdu_scatter_wait_break;
9453 	soc_stats->rx.rx_sw_route_drop = soc->stats.rx.rxdma2rel_route_drop;
9454 	soc_stats->rx.rx_hw_route_drop = soc->stats.rx.reo2rel_route_drop;
9455 	soc_stats->rx.rx_packets.num_cpus = qdf_min((uint32_t)CDP_NR_CPUS,
9456 						    num_possible_cpus());
9457 	for (cpus = 0; cpus < soc_stats->rx.rx_packets.num_cpus; cpus++) {
9458 		for (inx = 0; inx < CDP_MAX_RX_DEST_RINGS; inx++)
9459 			soc_stats->rx.rx_packets.pkts[cpus][inx] =
9460 					soc->stats.rx.ring_packets[cpus][inx];
9461 	}
9462 	soc_stats->rx.err.rx_rejected = soc->stats.rx.err.rejected;
9463 	soc_stats->rx.err.rx_raw_frm_drop = soc->stats.rx.err.raw_frm_drop;
9464 	soc_stats->rx.err.phy_ring_access_fail =
9465 					soc->stats.rx.err.hal_ring_access_fail;
9466 	soc_stats->rx.err.phy_ring_access_full_fail =
9467 				soc->stats.rx.err.hal_ring_access_full_fail;
9468 	for (inx = 0; inx < CDP_MAX_RX_DEST_RINGS; inx++)
9469 		soc_stats->rx.err.phy_rx_hw_error[inx] =
9470 					soc->stats.rx.err.hal_reo_error[inx];
9471 	soc_stats->rx.err.phy_rx_hw_dest_dup =
9472 					soc->stats.rx.err.hal_reo_dest_dup;
9473 	soc_stats->rx.err.phy_wifi_rel_dup = soc->stats.rx.err.hal_wbm_rel_dup;
9474 	soc_stats->rx.err.phy_rx_sw_err_dup =
9475 					soc->stats.rx.err.hal_rxdma_err_dup;
9476 	soc_stats->rx.err.invalid_rbm = soc->stats.rx.err.invalid_rbm;
9477 	soc_stats->rx.err.invalid_vdev = soc->stats.rx.err.invalid_vdev;
9478 	soc_stats->rx.err.invalid_pdev = soc->stats.rx.err.invalid_pdev;
9479 	soc_stats->rx.err.pkt_delivered_no_peer =
9480 					soc->stats.rx.err.pkt_delivered_no_peer;
9481 	soc_stats->rx.err.defrag_peer_uninit =
9482 					soc->stats.rx.err.defrag_peer_uninit;
9483 	soc_stats->rx.err.invalid_sa_da_idx =
9484 					soc->stats.rx.err.invalid_sa_da_idx;
9485 	soc_stats->rx.err.msdu_done_fail = soc->stats.rx.err.msdu_done_fail;
9486 	soc_stats->rx.err.rx_invalid_peer = soc->stats.rx.err.rx_invalid_peer;
9487 	soc_stats->rx.err.rx_invalid_peer_id =
9488 					soc->stats.rx.err.rx_invalid_peer_id;
9489 	soc_stats->rx.err.rx_invalid_pkt_len =
9490 					soc->stats.rx.err.rx_invalid_pkt_len;
9491 	for (inx = 0; inx < qdf_min((uint32_t)CDP_WIFI_ERR_MAX,
9492 				    (uint32_t)HAL_RXDMA_ERR_MAX); inx++)
9493 		soc_stats->rx.err.rx_sw_error[inx] =
9494 					soc->stats.rx.err.rxdma_error[inx];
9495 	for (inx = 0; inx < qdf_min((uint32_t)CDP_RX_ERR_MAX,
9496 				    (uint32_t)HAL_REO_ERR_MAX); inx++)
9497 		soc_stats->rx.err.rx_hw_error[inx] =
9498 					soc->stats.rx.err.reo_error[inx];
9499 	soc_stats->rx.err.rx_desc_invalid_magic =
9500 					soc->stats.rx.err.rx_desc_invalid_magic;
9501 	soc_stats->rx.err.rx_hw_cmd_send_fail =
9502 					soc->stats.rx.err.reo_cmd_send_fail;
9503 	soc_stats->rx.err.rx_hw_cmd_send_drain =
9504 					soc->stats.rx.err.reo_cmd_send_drain;
9505 	soc_stats->rx.err.scatter_msdu = soc->stats.rx.err.scatter_msdu;
9506 	soc_stats->rx.err.invalid_cookie = soc->stats.rx.err.invalid_cookie;
9507 	soc_stats->rx.err.stale_cookie = soc->stats.rx.err.stale_cookie;
9508 	soc_stats->rx.err.rx_2k_jump_delba_sent =
9509 					soc->stats.rx.err.rx_2k_jump_delba_sent;
9510 	soc_stats->rx.err.rx_2k_jump_to_stack =
9511 					soc->stats.rx.err.rx_2k_jump_to_stack;
9512 	soc_stats->rx.err.rx_2k_jump_drop = soc->stats.rx.err.rx_2k_jump_drop;
9513 	soc_stats->rx.err.rx_hw_err_msdu_buf_rcved =
9514 				soc->stats.rx.err.reo_err_msdu_buf_rcved;
9515 	soc_stats->rx.err.rx_hw_err_msdu_buf_invalid_cookie =
9516 			soc->stats.rx.err.reo_err_msdu_buf_invalid_cookie;
9517 	soc_stats->rx.err.rx_hw_err_oor_drop =
9518 					soc->stats.rx.err.reo_err_oor_drop;
9519 	soc_stats->rx.err.rx_hw_err_oor_to_stack =
9520 					soc->stats.rx.err.reo_err_oor_to_stack;
9521 	soc_stats->rx.err.rx_hw_err_oor_sg_count =
9522 					soc->stats.rx.err.reo_err_oor_sg_count;
9523 	soc_stats->rx.err.msdu_count_mismatch =
9524 					soc->stats.rx.err.msdu_count_mismatch;
9525 	soc_stats->rx.err.invalid_link_cookie =
9526 					soc->stats.rx.err.invalid_link_cookie;
9527 	soc_stats->rx.err.nbuf_sanity_fail = soc->stats.rx.err.nbuf_sanity_fail;
9528 	soc_stats->rx.err.dup_refill_link_desc =
9529 					soc->stats.rx.err.dup_refill_link_desc;
9530 	soc_stats->rx.err.msdu_continuation_err =
9531 					soc->stats.rx.err.msdu_continuation_err;
9532 	soc_stats->rx.err.ssn_update_count = soc->stats.rx.err.ssn_update_count;
9533 	soc_stats->rx.err.bar_handle_fail_count =
9534 					soc->stats.rx.err.bar_handle_fail_count;
9535 	soc_stats->rx.err.intrabss_eapol_drop =
9536 					soc->stats.rx.err.intrabss_eapol_drop;
9537 	soc_stats->rx.err.pn_in_dest_check_fail =
9538 					soc->stats.rx.err.pn_in_dest_check_fail;
9539 	soc_stats->rx.err.msdu_len_err = soc->stats.rx.err.msdu_len_err;
9540 	soc_stats->rx.err.rx_flush_count = soc->stats.rx.err.rx_flush_count;
9541 	/* soc ast stats */
9542 	soc_stats->ast.added = soc->stats.ast.added;
9543 	soc_stats->ast.deleted = soc->stats.ast.deleted;
9544 	soc_stats->ast.aged_out = soc->stats.ast.aged_out;
9545 	soc_stats->ast.map_err = soc->stats.ast.map_err;
9546 	soc_stats->ast.ast_mismatch = soc->stats.ast.ast_mismatch;
9547 	/* soc mec stats */
9548 	soc_stats->mec.added = soc->stats.mec.added;
9549 	soc_stats->mec.deleted = soc->stats.mec.deleted;
9550 
9551 	return QDF_STATUS_SUCCESS;
9552 }
9553 
9554 #ifdef QCA_PEER_EXT_STATS
9555 QDF_STATUS
9556 dp_txrx_get_peer_delay_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
9557 			     uint8_t *peer_mac,
9558 			     struct cdp_delay_tid_stats *delay_stats)
9559 {
9560 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9561 	struct dp_peer *peer = NULL;
9562 	struct dp_peer_delay_stats *pext_stats;
9563 	struct cdp_delay_rx_stats *rx_delay;
9564 	struct cdp_delay_tx_stats *tx_delay;
9565 	uint8_t tid;
9566 	struct cdp_peer_info peer_info = { 0 };
9567 
9568 	if (!wlan_cfg_is_peer_ext_stats_enabled(soc->wlan_cfg_ctx))
9569 		return QDF_STATUS_E_FAILURE;
9570 
9571 	DP_PEER_INFO_PARAMS_INIT(&peer_info, vdev_id, peer_mac, false,
9572 				 CDP_WILD_PEER_TYPE);
9573 
9574 	peer = dp_peer_hash_find_wrapper(soc, &peer_info, DP_MOD_ID_CDP);
9575 	if (!peer)
9576 		return QDF_STATUS_E_FAILURE;
9577 
9578 	if (!peer->txrx_peer) {
9579 		dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
9580 		return QDF_STATUS_E_FAILURE;
9581 	}
9582 
9583 	pext_stats = peer->txrx_peer->delay_stats;
9584 	if (!pext_stats) {
9585 		dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
9586 		return QDF_STATUS_E_FAILURE;
9587 	}
9588 
9589 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
9590 		rx_delay = &delay_stats[tid].rx_delay;
9591 		dp_accumulate_delay_tid_stats(soc, pext_stats->delay_tid_stats,
9592 					      &rx_delay->to_stack_delay, tid,
9593 					      CDP_HIST_TYPE_REAP_STACK);
9594 		tx_delay = &delay_stats[tid].tx_delay;
9595 		dp_accumulate_delay_avg_stats(pext_stats->delay_tid_stats,
9596 					      tx_delay,
9597 					      tid);
9598 		dp_accumulate_delay_tid_stats(soc, pext_stats->delay_tid_stats,
9599 					      &tx_delay->tx_swq_delay, tid,
9600 					      CDP_HIST_TYPE_SW_ENQEUE_DELAY);
9601 		dp_accumulate_delay_tid_stats(soc, pext_stats->delay_tid_stats,
9602 					      &tx_delay->hwtx_delay, tid,
9603 					      CDP_HIST_TYPE_HW_COMP_DELAY);
9604 	}
9605 	dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
9606 
9607 	return QDF_STATUS_SUCCESS;
9608 }
9609 #else
9610 QDF_STATUS
9611 dp_txrx_get_peer_delay_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
9612 			     uint8_t *peer_mac,
9613 			     struct cdp_delay_tid_stats *delay_stats)
9614 {
9615 	return QDF_STATUS_E_FAILURE;
9616 }
9617 #endif /* QCA_PEER_EXT_STATS */
9618 
9619 #ifdef WLAN_PEER_JITTER
9620 QDF_STATUS
9621 dp_txrx_get_peer_jitter_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
9622 			      uint8_t vdev_id, uint8_t *peer_mac,
9623 			      struct cdp_peer_tid_stats *tid_stats)
9624 {
9625 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9626 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
9627 	struct dp_peer *peer = NULL;
9628 	uint8_t tid;
9629 	struct cdp_peer_info peer_info = { 0 };
9630 	struct cdp_peer_tid_stats *jitter_stats;
9631 	uint8_t ring_id;
9632 
9633 	if (!pdev)
9634 		return QDF_STATUS_E_FAILURE;
9635 
9636 	if (!wlan_cfg_is_peer_jitter_stats_enabled(soc->wlan_cfg_ctx))
9637 		return QDF_STATUS_E_FAILURE;
9638 
9639 	DP_PEER_INFO_PARAMS_INIT(&peer_info, vdev_id, peer_mac, false,
9640 				 CDP_WILD_PEER_TYPE);
9641 
9642 	peer = dp_peer_hash_find_wrapper(soc, &peer_info, DP_MOD_ID_CDP);
9643 	if (!peer)
9644 		return QDF_STATUS_E_FAILURE;
9645 
9646 	if (!peer->txrx_peer || !peer->txrx_peer->jitter_stats) {
9647 		dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
9648 		return QDF_STATUS_E_FAILURE;
9649 	}
9650 
9651 	if (wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) {
9652 		for (tid = 0; tid < qdf_min(CDP_DATA_TID_MAX, DP_MAX_TIDS); tid++) {
9653 			struct cdp_peer_tid_stats *rx_tid =
9654 					&peer->txrx_peer->jitter_stats[tid];
9655 
9656 			tid_stats[tid].tx_avg_jitter = rx_tid->tx_avg_jitter;
9657 			tid_stats[tid].tx_avg_delay = rx_tid->tx_avg_delay;
9658 			tid_stats[tid].tx_avg_err = rx_tid->tx_avg_err;
9659 			tid_stats[tid].tx_total_success = rx_tid->tx_total_success;
9660 			tid_stats[tid].tx_drop = rx_tid->tx_drop;
9661 		}
9662 
9663 	} else {
9664 		jitter_stats = peer->txrx_peer->jitter_stats;
9665 		for (tid = 0; tid < qdf_min(CDP_DATA_TID_MAX, DP_MAX_TIDS); tid++) {
9666 			for (ring_id = 0; ring_id < CDP_MAX_TXRX_CTX; ring_id++) {
9667 				struct cdp_peer_tid_stats *rx_tid =
9668 					&jitter_stats[tid *
9669 					CDP_MAX_TXRX_CTX + ring_id];
9670 				tid_stats[tid].tx_avg_jitter =
9671 					(rx_tid->tx_avg_jitter +
9672 					tid_stats[tid].tx_avg_jitter) >> 1;
9673 				tid_stats[tid].tx_avg_delay =
9674 					(rx_tid->tx_avg_delay +
9675 					tid_stats[tid].tx_avg_delay) >> 1;
9676 				tid_stats[tid].tx_avg_err = (rx_tid->tx_avg_err
9677 					+ tid_stats[tid].tx_avg_err) >> 1;
9678 				tid_stats[tid].tx_total_success +=
9679 						rx_tid->tx_total_success;
9680 				tid_stats[tid].tx_drop += rx_tid->tx_drop;
9681 			}
9682 		}
9683 	}
9684 
9685 	dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
9686 
9687 	return QDF_STATUS_SUCCESS;
9688 }
9689 #else
9690 QDF_STATUS
9691 dp_txrx_get_peer_jitter_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
9692 			      uint8_t vdev_id, uint8_t *peer_mac,
9693 			      struct cdp_peer_tid_stats *tid_stats)
9694 {
9695 	return QDF_STATUS_E_FAILURE;
9696 }
9697 #endif /* WLAN_PEER_JITTER */
9698 
9699 #ifdef WLAN_TX_PKT_CAPTURE_ENH
9700 QDF_STATUS
9701 dp_peer_get_tx_capture_stats(struct cdp_soc_t *soc_hdl,
9702 			     uint8_t vdev_id, uint8_t *peer_mac,
9703 			     struct cdp_peer_tx_capture_stats *stats)
9704 {
9705 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9706 	struct dp_peer *peer = dp_peer_find_hash_find(soc, peer_mac, 0, vdev_id,
9707 						      DP_MOD_ID_TX_CAPTURE);
9708 	QDF_STATUS status;
9709 
9710 	if (!peer)
9711 		return QDF_STATUS_E_FAILURE;
9712 
9713 	status = dp_monitor_peer_tx_capture_get_stats(soc, peer, stats);
9714 	dp_peer_unref_delete(peer, DP_MOD_ID_TX_CAPTURE);
9715 
9716 	return status;
9717 }
9718 
9719 QDF_STATUS
9720 dp_pdev_get_tx_capture_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
9721 			     struct cdp_pdev_tx_capture_stats *stats)
9722 {
9723 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9724 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
9725 
9726 	if (!pdev)
9727 		return QDF_STATUS_E_FAILURE;
9728 
9729 	return dp_monitor_pdev_tx_capture_get_stats(soc, pdev, stats);
9730 }
9731 #else /* WLAN_TX_PKT_CAPTURE_ENH */
9732 QDF_STATUS
9733 dp_peer_get_tx_capture_stats(struct cdp_soc_t *soc_hdl,
9734 			     uint8_t vdev_id, uint8_t *peer_mac,
9735 			     struct cdp_peer_tx_capture_stats *stats)
9736 {
9737 	return QDF_STATUS_E_FAILURE;
9738 }
9739 
9740 QDF_STATUS
9741 dp_pdev_get_tx_capture_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
9742 			     struct cdp_pdev_tx_capture_stats *stats)
9743 {
9744 	return QDF_STATUS_E_FAILURE;
9745 }
9746 #endif /* WLAN_TX_PKT_CAPTURE_ENH */
9747 
9748 #ifdef WLAN_CONFIG_TELEMETRY_AGENT
9749 QDF_STATUS
9750 dp_get_pdev_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
9751 			    struct cdp_pdev_telemetry_stats *stats)
9752 {
9753 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9754 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
9755 	uint8_t ac = 0;
9756 
9757 	if (!pdev)
9758 		return QDF_STATUS_E_FAILURE;
9759 
9760 	/* consumption is in micro seconds, convert it to seconds and
9761 	 * then calculate %age per sec
9762 	 */
9763 	for (ac = 0; ac < WME_AC_MAX; ac++) {
9764 		stats->link_airtime[ac] =
9765 			((pdev->stats.telemetry_stats.link_airtime[ac] * 100) / 1000000);
9766 		stats->tx_mpdu_failed[ac] = pdev->stats.telemetry_stats.tx_mpdu_failed[ac];
9767 		stats->tx_mpdu_total[ac] = pdev->stats.telemetry_stats.tx_mpdu_total[ac];
9768 	}
9769 	return QDF_STATUS_SUCCESS;
9770 }
9771 
9772 QDF_STATUS
9773 dp_get_peer_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t *addr,
9774 			    struct cdp_peer_telemetry_stats *stats)
9775 {
9776 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9777 	struct dp_peer *peer = dp_peer_find_hash_find(soc, addr, 0, DP_VDEV_ALL,
9778 						      DP_MOD_ID_MISC);
9779 
9780 	if (!peer)
9781 		return QDF_STATUS_E_FAILURE;
9782 
9783 	dp_monitor_peer_telemetry_stats(peer, stats);
9784 	dp_peer_unref_delete(peer, DP_MOD_ID_MISC);
9785 
9786 	return QDF_STATUS_SUCCESS;
9787 }
9788 
9789 QDF_STATUS
9790 dp_get_pdev_deter_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
9791 			struct cdp_pdev_deter_stats *stats)
9792 {
9793 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9794 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
9795 
9796 	if (!pdev)
9797 		return QDF_STATUS_E_FAILURE;
9798 
9799 	qdf_mem_copy(stats->dl_ofdma_usr, pdev->stats.deter_stats.dl_ofdma_usr,
9800 		     sizeof(stats->dl_ofdma_usr[0]) * CDP_MU_MAX_USERS);
9801 	qdf_mem_copy(stats->ul_ofdma_usr, pdev->stats.deter_stats.ul_ofdma_usr,
9802 		     sizeof(stats->ul_ofdma_usr[0]) * CDP_MU_MAX_USERS);
9803 	qdf_mem_copy(stats->dl_mimo_usr, pdev->stats.deter_stats.dl_mimo_usr,
9804 		     sizeof(stats->dl_mimo_usr[0]) * CDP_MU_MAX_MIMO_USERS);
9805 	qdf_mem_copy(stats->ul_mimo_usr, pdev->stats.deter_stats.ul_mimo_usr,
9806 		     sizeof(stats->ul_mimo_usr[0]) * CDP_MU_MAX_MIMO_USERS);
9807 
9808 	qdf_mem_copy(stats->ul_mode_cnt, pdev->stats.deter_stats.ul_mode_cnt,
9809 		     sizeof(stats->ul_mode_cnt[0]) * TX_MODE_UL_MAX);
9810 	qdf_mem_copy(stats->dl_mode_cnt, pdev->stats.deter_stats.dl_mode_cnt,
9811 		     sizeof(stats->dl_mode_cnt[0]) * TX_MODE_DL_MAX);
9812 	qdf_mem_copy(stats->ch_access_delay,
9813 		     pdev->stats.deter_stats.ch_access_delay,
9814 		     sizeof(stats->ch_access_delay[0]) * WME_AC_MAX);
9815 
9816 	qdf_mem_copy(stats->ts,
9817 		     pdev->stats.deter_stats.ts,
9818 		     sizeof(stats->ts[0]) * TX_MODE_UL_MAX);
9819 
9820 	stats->ch_util.ap_tx_util = pdev->stats.deter_stats.ch_util.ap_tx_util;
9821 	stats->ch_util.ap_rx_util = pdev->stats.deter_stats.ch_util.ap_rx_util;
9822 	stats->ch_util.ap_chan_util =
9823 			pdev->stats.deter_stats.ch_util.ap_chan_util;
9824 	stats->rx_su_cnt = pdev->stats.deter_stats.rx_su_cnt;
9825 
9826 	return QDF_STATUS_SUCCESS;
9827 }
9828 
9829 QDF_STATUS
9830 dp_get_peer_deter_stats(struct cdp_soc_t *soc_hdl,
9831 			uint8_t vdev_id,
9832 			uint8_t *addr,
9833 			struct cdp_peer_deter_stats *stats)
9834 {
9835 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9836 	struct dp_peer *peer = dp_peer_find_hash_find(soc, addr, 0, vdev_id,
9837 						      DP_MOD_ID_MISC);
9838 
9839 	if (!peer)
9840 		return QDF_STATUS_E_FAILURE;
9841 
9842 	dp_monitor_peer_deter_stats(peer, stats);
9843 	dp_peer_unref_delete(peer, DP_MOD_ID_MISC);
9844 
9845 	return QDF_STATUS_SUCCESS;
9846 }
9847 
9848 QDF_STATUS
9849 dp_update_pdev_chan_util_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
9850 			       struct cdp_pdev_chan_util_stats *ch_util)
9851 {
9852 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9853 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
9854 
9855 	if (!pdev)
9856 		return QDF_STATUS_E_FAILURE;
9857 
9858 	pdev->stats.deter_stats.ch_util.ap_tx_util = ch_util->ap_tx_util;
9859 	pdev->stats.deter_stats.ch_util.ap_rx_util = ch_util->ap_rx_util;
9860 	pdev->stats.deter_stats.ch_util.ap_chan_util = ch_util->ap_chan_util;
9861 
9862 	return QDF_STATUS_SUCCESS;
9863 }
9864 #endif
9865 #ifndef CONFIG_AP_PLATFORM
9866 #if defined WLAN_FEATURE_11BE_MLO && defined DP_MLO_LINK_STATS_SUPPORT
9867 /**
9868  * dp_print_per_link_peer_txrx_stats() - print link peer stats
9869  * @peer_stats: buffer holding peer stats
9870  * @pdev: DP pdev handle
9871  *
9872  * return None
9873  */
9874 static inline void
9875 dp_print_per_link_peer_txrx_stats(struct cdp_peer_stats *peer_stats,
9876 				  struct dp_pdev *pdev)
9877 {
9878 	uint8_t i;
9879 	uint32_t index;
9880 	uint32_t j;
9881 	char nss[DP_NSS_LENGTH];
9882 	char mu_group_id[DP_MU_GROUP_LENGTH];
9883 	uint32_t *pnss;
9884 	enum cdp_mu_packet_type rx_mu_type;
9885 	struct cdp_rx_mu *rx_mu;
9886 
9887 	DP_PRINT_STATS("peer_mac_addr = " QDF_MAC_ADDR_FMT,
9888 		       QDF_MAC_ADDR_REF(peer_stats->mac_addr.bytes));
9889 	DP_PRINT_STATS("Node Tx Stats:");
9890 	DP_PRINT_STATS("Success Packets = %llu",
9891 		       peer_stats->tx.tx_success.num);
9892 	DP_PRINT_STATS("Success Bytes = %llu",
9893 		       peer_stats->tx.tx_success.bytes);
9894 	DP_PRINT_STATS("Success Packets in TWT Session = %llu",
9895 		       peer_stats->tx.tx_success_twt.num);
9896 	DP_PRINT_STATS("Success Bytes in TWT Session = %llu",
9897 		       peer_stats->tx.tx_success_twt.bytes);
9898 	DP_PRINT_STATS("Unicast Success Packets = %llu",
9899 		       peer_stats->tx.ucast.num);
9900 	DP_PRINT_STATS("Unicast Success Bytes = %llu",
9901 		       peer_stats->tx.ucast.bytes);
9902 	DP_PRINT_STATS("Multicast Success Packets = %llu",
9903 		       peer_stats->tx.mcast.num);
9904 	DP_PRINT_STATS("Multicast Success Bytes = %llu",
9905 		       peer_stats->tx.mcast.bytes);
9906 	DP_PRINT_STATS("Broadcast Success Packets = %llu",
9907 		       peer_stats->tx.bcast.num);
9908 	DP_PRINT_STATS("Broadcast Success Bytes = %llu",
9909 		       peer_stats->tx.bcast.bytes);
9910 	DP_PRINT_STATS("Packets Successfully Sent after one or more retry = %u",
9911 		       peer_stats->tx.retry_count);
9912 	DP_PRINT_STATS("Packets  Sent Success after more than one retry = %u",
9913 		       peer_stats->tx.multiple_retry_count);
9914 	DP_PRINT_STATS("Packets Failed due to retry threshold breach = %u",
9915 		       peer_stats->tx.failed_retry_count);
9916 	DP_PRINT_STATS("Packets In OFDMA = %u",
9917 		       peer_stats->tx.ofdma);
9918 	DP_PRINT_STATS("Packets In STBC = %u",
9919 		       peer_stats->tx.stbc);
9920 	DP_PRINT_STATS("Packets In LDPC = %u",
9921 		       peer_stats->tx.ldpc);
9922 	DP_PRINT_STATS("Packet Retries = %u",
9923 		       peer_stats->tx.retries);
9924 	DP_PRINT_STATS("MSDU's Part of AMSDU = %u",
9925 		       peer_stats->tx.amsdu_cnt);
9926 	DP_PRINT_STATS("Msdu's As Part of Ampdu = %u",
9927 		       peer_stats->tx.non_ampdu_cnt);
9928 	DP_PRINT_STATS("Msdu's As Ampdu = %u",
9929 		       peer_stats->tx.ampdu_cnt);
9930 	DP_PRINT_STATS("Last Packet RSSI = %u",
9931 		       peer_stats->tx.last_ack_rssi);
9932 	DP_PRINT_STATS("Dropped At FW: Removed Pkts = %llu",
9933 		       peer_stats->tx.dropped.fw_rem.num);
9934 	DP_PRINT_STATS("Release source not TQM = %u",
9935 		       peer_stats->tx.release_src_not_tqm);
9936 	if (pdev &&
9937 	    !wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) {
9938 		DP_PRINT_STATS("Dropped At FW: Removed bytes = %llu",
9939 			       peer_stats->tx.dropped.fw_rem.bytes);
9940 	}
9941 	DP_PRINT_STATS("Dropped At FW: Removed transmitted = %u",
9942 		       peer_stats->tx.dropped.fw_rem_tx);
9943 	DP_PRINT_STATS("Dropped At FW: Removed Untransmitted = %u",
9944 		       peer_stats->tx.dropped.fw_rem_notx);
9945 	DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason1 = %u",
9946 		       peer_stats->tx.dropped.fw_reason1);
9947 	DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason2 = %u",
9948 		       peer_stats->tx.dropped.fw_reason2);
9949 	DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason3 = %u",
9950 		       peer_stats->tx.dropped.fw_reason3);
9951 	DP_PRINT_STATS("Dropped At FW:removed untransmitted disable queue = %u",
9952 		       peer_stats->tx.dropped.fw_rem_queue_disable);
9953 	DP_PRINT_STATS("Dropped At FW: removed untransmitted no match = %u",
9954 		       peer_stats->tx.dropped.fw_rem_no_match);
9955 	DP_PRINT_STATS("Dropped due to HW threshold criteria = %u",
9956 		       peer_stats->tx.dropped.drop_threshold);
9957 	DP_PRINT_STATS("Dropped due Link desc not available drop in HW = %u",
9958 		       peer_stats->tx.dropped.drop_link_desc_na);
9959 	DP_PRINT_STATS("Drop bit set or invalid flow = %u",
9960 		       peer_stats->tx.dropped.invalid_drop);
9961 	DP_PRINT_STATS("MCAST vdev drop in HW = %u",
9962 		       peer_stats->tx.dropped.mcast_vdev_drop);
9963 	DP_PRINT_STATS("Dropped : Age Out = %u",
9964 		       peer_stats->tx.dropped.age_out);
9965 	DP_PRINT_STATS("Dropped : Invalid Reason = %u",
9966 		       peer_stats->tx.dropped.invalid_rr);
9967 	DP_PRINT_STATS("NAWDS : ");
9968 	DP_PRINT_STATS("Nawds multicast Drop Tx Packet = %u",
9969 		       peer_stats->tx.nawds_mcast_drop);
9970 	DP_PRINT_STATS("	Nawds multicast  Tx Packet Count = %llu",
9971 		       peer_stats->tx.nawds_mcast.num);
9972 	DP_PRINT_STATS("	Nawds multicast Tx Packet Bytes = %llu",
9973 		       peer_stats->tx.nawds_mcast.bytes);
9974 
9975 	DP_PRINT_STATS("PPDU's = %u", peer_stats->tx.tx_ppdus);
9976 	DP_PRINT_STATS("Number of PPDU's with Punctured Preamble = %u",
9977 		       peer_stats->tx.pream_punct_cnt);
9978 	DP_PRINT_STATS("MPDU's Successful = %u",
9979 		       peer_stats->tx.tx_mpdus_success);
9980 	DP_PRINT_STATS("MPDU's Tried = %u",
9981 		       peer_stats->tx.tx_mpdus_tried);
9982 
9983 	DP_PRINT_STATS("Rate Info:");
9984 	dp_print_common_rates_info(peer_stats->tx.pkt_type);
9985 	DP_PRINT_STATS("SGI = 0.8us %u 0.4us %u 1.6us %u 3.2us %u",
9986 		       peer_stats->tx.sgi_count[0],
9987 		       peer_stats->tx.sgi_count[1],
9988 		       peer_stats->tx.sgi_count[2],
9989 		       peer_stats->tx.sgi_count[3]);
9990 
9991 	DP_PRINT_STATS("Wireless Mutlimedia ");
9992 	DP_PRINT_STATS("	 Best effort = %u",
9993 		       peer_stats->tx.wme_ac_type[0]);
9994 	DP_PRINT_STATS("	 Background= %u",
9995 		       peer_stats->tx.wme_ac_type[1]);
9996 	DP_PRINT_STATS("	 Video = %u",
9997 		       peer_stats->tx.wme_ac_type[2]);
9998 	DP_PRINT_STATS("	 Voice = %u",
9999 		       peer_stats->tx.wme_ac_type[3]);
10000 
10001 	DP_PRINT_STATS("Excess Retries per AC ");
10002 	DP_PRINT_STATS("	 Best effort = %u",
10003 		       peer_stats->tx.excess_retries_per_ac[0]);
10004 	DP_PRINT_STATS("	 Background= %u",
10005 		       peer_stats->tx.excess_retries_per_ac[1]);
10006 	DP_PRINT_STATS("	 Video = %u",
10007 		       peer_stats->tx.excess_retries_per_ac[2]);
10008 	DP_PRINT_STATS("	 Voice = %u",
10009 		       peer_stats->tx.excess_retries_per_ac[3]);
10010 
10011 	pnss = &peer_stats->tx.nss[0];
10012 	dp_print_nss(nss, pnss, SS_COUNT);
10013 
10014 	DP_PRINT_STATS("NSS(1-8) = %s", nss);
10015 
10016 	DP_PRINT_STATS("Transmit Type :");
10017 	DP_PRINT_STATS("MSDUs Success: SU %u, MU_MIMO %u, MU_OFDMA %u, MU_MIMO_OFDMA %u",
10018 		       peer_stats->tx.transmit_type[SU].num_msdu,
10019 		       peer_stats->tx.transmit_type[MU_MIMO].num_msdu,
10020 		       peer_stats->tx.transmit_type[MU_OFDMA].num_msdu,
10021 		       peer_stats->tx.transmit_type[MU_MIMO_OFDMA].num_msdu);
10022 
10023 	DP_PRINT_STATS("MPDUs Success: SU %u, MU_MIMO %u, MU_OFDMA %u, MU_MIMO_OFDMA %u",
10024 		       peer_stats->tx.transmit_type[SU].num_mpdu,
10025 		       peer_stats->tx.transmit_type[MU_MIMO].num_mpdu,
10026 		       peer_stats->tx.transmit_type[MU_OFDMA].num_mpdu,
10027 		       peer_stats->tx.transmit_type[MU_MIMO_OFDMA].num_mpdu);
10028 
10029 	DP_PRINT_STATS("MPDUs Tried: SU %u, MU_MIMO %u, MU_OFDMA %u, MU_MIMO_OFDMA %u",
10030 		       peer_stats->tx.transmit_type[SU].mpdu_tried,
10031 		       peer_stats->tx.transmit_type[MU_MIMO].mpdu_tried,
10032 		       peer_stats->tx.transmit_type[MU_OFDMA].mpdu_tried,
10033 		       peer_stats->tx.transmit_type[MU_MIMO_OFDMA].mpdu_tried);
10034 
10035 	for (i = 0; i < MAX_MU_GROUP_ID;) {
10036 		index = 0;
10037 		for (j = 0; j < DP_MU_GROUP_SHOW && i < MAX_MU_GROUP_ID;
10038 			j++) {
10039 			index += qdf_snprint(&mu_group_id[index],
10040 					     DP_MU_GROUP_LENGTH - index,
10041 					     " %u",
10042 					     peer_stats->tx.mu_group_id[i]);
10043 			i++;
10044 		}
10045 
10046 		DP_PRINT_STATS("User position list for GID %02d->%u: [%s]",
10047 			       i - DP_MU_GROUP_SHOW, i - 1,
10048 			       mu_group_id);
10049 	}
10050 
10051 	DP_PRINT_STATS("Last Packet RU index [%u], Size [%u]",
10052 		       peer_stats->tx.ru_start,
10053 		       peer_stats->tx.ru_tones);
10054 
10055 	DP_PRINT_STATS("Aggregation:");
10056 	DP_PRINT_STATS("Number of Msdu's Part of Amsdu = %u",
10057 		       peer_stats->tx.amsdu_cnt);
10058 	DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation = %u",
10059 		       peer_stats->tx.non_amsdu_cnt);
10060 
10061 	if (pdev && pdev->soc->arch_ops.txrx_print_peer_stats)
10062 		pdev->soc->arch_ops.txrx_print_peer_stats(peer_stats,
10063 							PEER_TX_STATS);
10064 
10065 	DP_PRINT_STATS("Node Rx Stats:");
10066 	for (i = 0; i <  CDP_MAX_RX_RINGS; i++) {
10067 		DP_PRINT_STATS("Ring Id = %u", i);
10068 		DP_PRINT_STATS("	Packets Received = %llu",
10069 			       peer_stats->rx.rcvd_reo[i].num);
10070 		DP_PRINT_STATS("	Bytes Received = %llu",
10071 			       peer_stats->rx.rcvd_reo[i].bytes);
10072 	}
10073 	for (i = 0; i < CDP_MAX_LMACS; i++)
10074 		DP_PRINT_STATS("Packets Received on lmac[%u] = %llu ( %llu ),",
10075 			       i, peer_stats->rx.rx_lmac[i].num,
10076 			       peer_stats->rx.rx_lmac[i].bytes);
10077 
10078 	DP_PRINT_STATS("Unicast Packets Received = %llu",
10079 		       peer_stats->rx.unicast.num);
10080 	DP_PRINT_STATS("Unicast Bytes Received = %llu",
10081 		       peer_stats->rx.unicast.bytes);
10082 	DP_PRINT_STATS("Multicast Packets Received = %llu",
10083 		       peer_stats->rx.multicast.num);
10084 	DP_PRINT_STATS("Multicast Bytes Received = %llu",
10085 		       peer_stats->rx.multicast.bytes);
10086 	DP_PRINT_STATS("Broadcast Packets Received = %llu",
10087 		       peer_stats->rx.bcast.num);
10088 	DP_PRINT_STATS("Broadcast Bytes Received = %llu",
10089 		       peer_stats->rx.bcast.bytes);
10090 	DP_PRINT_STATS("Packets Sent To Stack in TWT Session = %llu",
10091 		       peer_stats->rx.to_stack_twt.num);
10092 	DP_PRINT_STATS("Bytes Sent To Stack in TWT Session = %llu",
10093 		       peer_stats->rx.to_stack_twt.bytes);
10094 	DP_PRINT_STATS("Intra BSS Packets Received = %llu",
10095 		       peer_stats->rx.intra_bss.pkts.num);
10096 	DP_PRINT_STATS("Intra BSS Bytes Received = %llu",
10097 		       peer_stats->rx.intra_bss.pkts.bytes);
10098 	DP_PRINT_STATS("Intra BSS Packets Failed = %llu",
10099 		       peer_stats->rx.intra_bss.fail.num);
10100 	DP_PRINT_STATS("Intra BSS Bytes Failed = %llu",
10101 		       peer_stats->rx.intra_bss.fail.bytes);
10102 	DP_PRINT_STATS("Intra BSS MDNS Packets Not Forwarded  = %u",
10103 		       peer_stats->rx.intra_bss.mdns_no_fwd);
10104 	DP_PRINT_STATS("Raw Packets Received = %llu",
10105 		       peer_stats->rx.raw.num);
10106 	DP_PRINT_STATS("Raw Bytes Received = %llu",
10107 		       peer_stats->rx.raw.bytes);
10108 	DP_PRINT_STATS("Errors: MIC Errors = %u",
10109 		       peer_stats->rx.err.mic_err);
10110 	DP_PRINT_STATS("Errors: Decryption Errors = %u",
10111 		       peer_stats->rx.err.decrypt_err);
10112 	DP_PRINT_STATS("Errors: PN Errors = %u",
10113 		       peer_stats->rx.err.pn_err);
10114 	DP_PRINT_STATS("Errors: OOR Errors = %u",
10115 		       peer_stats->rx.err.oor_err);
10116 	DP_PRINT_STATS("Errors: 2k Jump Errors = %u",
10117 		       peer_stats->rx.err.jump_2k_err);
10118 	DP_PRINT_STATS("Errors: RXDMA Wifi Parse Errors = %u",
10119 		       peer_stats->rx.err.rxdma_wifi_parse_err);
10120 	DP_PRINT_STATS("Msdu's Received As Part of Ampdu = %u",
10121 		       peer_stats->rx.non_ampdu_cnt);
10122 	DP_PRINT_STATS("Msdu's Received As Ampdu = %u",
10123 		       peer_stats->rx.ampdu_cnt);
10124 	DP_PRINT_STATS("Msdu's Received Not Part of Amsdu's = %u",
10125 		       peer_stats->rx.non_amsdu_cnt);
10126 	DP_PRINT_STATS("MSDUs Received As Part of Amsdu = %u",
10127 		       peer_stats->rx.amsdu_cnt);
10128 	DP_PRINT_STATS("MSDU Rx Retries= %u",
10129 		       peer_stats->rx.rx_retries);
10130 	DP_PRINT_STATS("MPDU Rx Retries= %u",
10131 		       peer_stats->rx.mpdu_retry_cnt);
10132 	DP_PRINT_STATS("NAWDS : ");
10133 	DP_PRINT_STATS("	Nawds multicast Drop Rx Packet = %u",
10134 		       peer_stats->rx.nawds_mcast_drop);
10135 	DP_PRINT_STATS(" 3address multicast Drop Rx Packet = %u",
10136 		       peer_stats->rx.mcast_3addr_drop);
10137 	DP_PRINT_STATS("SGI = 0.8us %u 0.4us %u 1.6us %u 3.2us %u",
10138 		       peer_stats->rx.sgi_count[0],
10139 		       peer_stats->rx.sgi_count[1],
10140 		       peer_stats->rx.sgi_count[2],
10141 		       peer_stats->rx.sgi_count[3]);
10142 
10143 	DP_PRINT_STATS("Wireless Mutlimedia ");
10144 	DP_PRINT_STATS("	 Best effort = %u",
10145 		       peer_stats->rx.wme_ac_type[0]);
10146 	DP_PRINT_STATS("	 Background= %u",
10147 		       peer_stats->rx.wme_ac_type[1]);
10148 	DP_PRINT_STATS("	 Video = %u",
10149 		       peer_stats->rx.wme_ac_type[2]);
10150 	DP_PRINT_STATS("	 Voice = %u",
10151 		       peer_stats->rx.wme_ac_type[3]);
10152 
10153 	DP_PRINT_STATS(" Total Rx PPDU Count = %u",
10154 		       peer_stats->rx.rx_ppdus);
10155 	DP_PRINT_STATS(" Total Rx MPDU Count = %u",
10156 		       peer_stats->rx.rx_mpdus);
10157 	DP_PRINT_STATS("MSDU Reception Type");
10158 	DP_PRINT_STATS("SU %u MU_MIMO %u MU_OFDMA %u MU_OFDMA_MIMO %u",
10159 		       peer_stats->rx.reception_type[0],
10160 		       peer_stats->rx.reception_type[1],
10161 		       peer_stats->rx.reception_type[2],
10162 		       peer_stats->rx.reception_type[3]);
10163 	DP_PRINT_STATS("PPDU Reception Type");
10164 	DP_PRINT_STATS("SU %u MU_MIMO %u MU_OFDMA %u MU_OFDMA_MIMO %u",
10165 		       peer_stats->rx.ppdu_cnt[0],
10166 		       peer_stats->rx.ppdu_cnt[1],
10167 		       peer_stats->rx.ppdu_cnt[2],
10168 		       peer_stats->rx.ppdu_cnt[3]);
10169 
10170 	dp_print_common_rates_info(peer_stats->rx.pkt_type);
10171 	dp_print_common_ppdu_rates_info(&peer_stats->rx.su_ax_ppdu_cnt,
10172 					DOT11_AX);
10173 	dp_print_mu_ppdu_rates_info(&peer_stats->rx.rx_mu[0]);
10174 
10175 	pnss = &peer_stats->rx.nss[0];
10176 	dp_print_nss(nss, pnss, SS_COUNT);
10177 	DP_PRINT_STATS("MSDU Count");
10178 	DP_PRINT_STATS("	NSS(1-8) = %s", nss);
10179 
10180 	DP_PRINT_STATS("reception mode SU");
10181 	pnss = &peer_stats->rx.ppdu_nss[0];
10182 	dp_print_nss(nss, pnss, SS_COUNT);
10183 
10184 	DP_PRINT_STATS("	PPDU Count");
10185 	DP_PRINT_STATS("	NSS(1-8) = %s", nss);
10186 
10187 	DP_PRINT_STATS("	MPDU OK = %u, MPDU Fail = %u",
10188 		       peer_stats->rx.mpdu_cnt_fcs_ok,
10189 		       peer_stats->rx.mpdu_cnt_fcs_err);
10190 
10191 	for (rx_mu_type = 0; rx_mu_type < TXRX_TYPE_MU_MAX;
10192 	     rx_mu_type++) {
10193 		DP_PRINT_STATS("reception mode %s",
10194 			       mu_reception_mode[rx_mu_type]);
10195 		rx_mu = &peer_stats->rx.rx_mu[rx_mu_type];
10196 
10197 		pnss = &rx_mu->ppdu_nss[0];
10198 		dp_print_nss(nss, pnss, SS_COUNT);
10199 		DP_PRINT_STATS("	PPDU Count");
10200 		DP_PRINT_STATS("	NSS(1-8) = %s", nss);
10201 
10202 		DP_PRINT_STATS("	MPDU OK = %u, MPDU Fail = %u",
10203 			       rx_mu->mpdu_cnt_fcs_ok,
10204 			       rx_mu->mpdu_cnt_fcs_err);
10205 	}
10206 
10207 	DP_PRINT_STATS("Aggregation:");
10208 	DP_PRINT_STATS("   Msdu's Part of Ampdu = %u",
10209 		       peer_stats->rx.ampdu_cnt);
10210 	DP_PRINT_STATS("   Msdu's With No Mpdu Level Aggregation = %u",
10211 		       peer_stats->rx.non_ampdu_cnt);
10212 	DP_PRINT_STATS("   Msdu's Part of Amsdu = %u",
10213 		       peer_stats->rx.amsdu_cnt);
10214 	DP_PRINT_STATS("   Msdu's With No Msdu Level Aggregation = %u",
10215 		       peer_stats->rx.non_amsdu_cnt);
10216 	DP_PRINT_STATS("MEC Packet Drop = %llu",
10217 		       peer_stats->rx.mec_drop.num);
10218 	DP_PRINT_STATS("MEC Byte Drop = %llu",
10219 		       peer_stats->rx.mec_drop.bytes);
10220 	DP_PRINT_STATS("Multipass Rx Packet Drop = %u",
10221 		       peer_stats->rx.multipass_rx_pkt_drop);
10222 	DP_PRINT_STATS("Peer Unauth Rx Packet Drop = %u",
10223 		       peer_stats->rx.peer_unauth_rx_pkt_drop);
10224 	DP_PRINT_STATS("Policy Check Rx Packet Drop = %u",
10225 		       peer_stats->rx.policy_check_drop);
10226 	if (pdev && pdev->soc->arch_ops.txrx_print_peer_stats)
10227 		pdev->soc->arch_ops.txrx_print_peer_stats(peer_stats,
10228 							PEER_RX_STATS);
10229 }
10230 
10231 /**
10232  * dp_print_per_link_peer_stats() - print per link peer stats of MLD peer
10233  * @peer: MLD DP_PEER handle
10234  * @peer_stats: buffer holding peer stats
10235  * @num_links: Number of Link peers.
10236  *
10237  * This API should only be called with MLD peer and peer_stats should
10238  * point to buffer of size = (sizeof(*peer_stats) * num_links).
10239  *
10240  * return None
10241  */
10242 static
10243 void dp_print_per_link_peer_stats(struct dp_peer *peer,
10244 				  struct cdp_peer_stats *peer_stats,
10245 				  uint8_t num_links)
10246 {
10247 	uint8_t index;
10248 	struct dp_pdev *pdev = peer->vdev->pdev;
10249 
10250 	if (!IS_MLO_DP_MLD_PEER(peer))
10251 		return;
10252 
10253 	DP_PRINT_STATS("Node Tx ML peer Stats:\n");
10254 	DP_PRINT_STATS("Total Packet Completions = %llu",
10255 		       peer_stats->tx.comp_pkt.num);
10256 	DP_PRINT_STATS("Total Bytes Completions = %llu",
10257 		       peer_stats->tx.comp_pkt.bytes);
10258 	DP_PRINT_STATS("Packets Failed = %u",
10259 		       peer_stats->tx.tx_failed);
10260 	DP_PRINT_STATS("Bytes and Packets transmitted  in last one sec:");
10261 	DP_PRINT_STATS("	Bytes transmitted in last sec: %u",
10262 		       peer_stats->tx.tx_byte_rate);
10263 	DP_PRINT_STATS("	Data transmitted in last sec: %u",
10264 		       peer_stats->tx.tx_data_rate);
10265 
10266 	if (!IS_MLO_DP_LINK_PEER(peer)) {
10267 		dp_print_jitter_stats(peer, pdev);
10268 		dp_peer_print_tx_delay_stats(pdev, peer);
10269 	}
10270 
10271 	DP_PRINT_STATS("Node Rx ML peer Stats:\n");
10272 	DP_PRINT_STATS("Packets Sent To Stack = %llu",
10273 		       peer_stats->rx.to_stack.num);
10274 	DP_PRINT_STATS("Bytes Sent To Stack = %llu",
10275 		       peer_stats->rx.to_stack.bytes);
10276 	DP_PRINT_STATS("Bytes and Packets received in last one sec:");
10277 	DP_PRINT_STATS("	Bytes received in last sec: %u",
10278 		       peer_stats->rx.rx_byte_rate);
10279 	DP_PRINT_STATS("	Data received in last sec: %u",
10280 		       peer_stats->rx.rx_data_rate);
10281 	if (!IS_MLO_DP_LINK_PEER(peer))
10282 		dp_peer_print_rx_delay_stats(pdev, peer);
10283 
10284 	dp_peer_print_reo_qref_table(peer);
10285 	DP_PRINT_STATS("Per Link TxRx Stats:\n");
10286 	for (index = 0; index < num_links; index++) {
10287 		DP_PRINT_STATS("Link %u TxRx Stats:\n", index);
10288 		dp_print_per_link_peer_txrx_stats(&peer_stats[index], pdev);
10289 	}
10290 }
10291 
10292 void dp_print_per_link_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id)
10293 {
10294 	struct dp_mld_link_peers link_peers_info;
10295 	struct dp_peer *peer, *ml_peer = NULL;
10296 	struct cdp_peer_stats *peer_stats = NULL;
10297 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
10298 	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
10299 						     DP_MOD_ID_GENERIC_STATS);
10300 	if (!vdev) {
10301 		dp_err_rl("vdev is NULL, vdev_id: %u", vdev_id);
10302 		return;
10303 	}
10304 	peer = dp_vdev_bss_peer_ref_n_get(soc, vdev, DP_MOD_ID_GENERIC_STATS);
10305 
10306 	if (!peer) {
10307 		dp_err("Peer is NULL, vdev_id: %u", vdev_id);
10308 		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS);
10309 		return;
10310 	}
10311 	if (IS_MLO_DP_LINK_PEER(peer))
10312 		ml_peer = peer->mld_peer;
10313 	if (ml_peer) {
10314 		dp_get_link_peers_ref_from_mld_peer(soc, ml_peer,
10315 						    &link_peers_info,
10316 						    DP_MOD_ID_GENERIC_STATS);
10317 		peer_stats = qdf_mem_malloc(sizeof(*peer_stats) *
10318 					    link_peers_info.num_links);
10319 		if (!peer_stats) {
10320 			dp_err("malloc failed, vdev_id: %u, ML peer_id: %u",
10321 			       vdev_id, ml_peer->peer_id);
10322 			dp_release_link_peers_ref(&link_peers_info,
10323 						  DP_MOD_ID_GENERIC_STATS);
10324 			goto fail;
10325 		}
10326 
10327 		dp_get_per_link_peer_stats(ml_peer, peer_stats,
10328 					   ml_peer->peer_type,
10329 					   link_peers_info.num_links);
10330 		dp_print_per_link_peer_stats(ml_peer, peer_stats,
10331 					     link_peers_info.num_links);
10332 		dp_release_link_peers_ref(&link_peers_info,
10333 					  DP_MOD_ID_GENERIC_STATS);
10334 		qdf_mem_free(peer_stats);
10335 	} else {
10336 		peer_stats = qdf_mem_malloc(sizeof(*peer_stats));
10337 		if (!peer_stats) {
10338 			dp_err("malloc failed, vdev_id: %u, peer_id: %u",
10339 			       vdev_id, peer->peer_id);
10340 			goto fail;
10341 		}
10342 		dp_get_peer_stats(peer, peer_stats);
10343 		dp_print_peer_stats(peer, peer_stats);
10344 		qdf_mem_free(peer_stats);
10345 	}
10346 
10347 fail:
10348 	dp_peer_unref_delete(peer, DP_MOD_ID_GENERIC_STATS);
10349 	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS);
10350 }
10351 #else
10352 void dp_print_per_link_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id)
10353 {
10354 	struct dp_peer *peer;
10355 	struct cdp_peer_stats *peer_stats = NULL;
10356 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
10357 	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
10358 						     DP_MOD_ID_GENERIC_STATS);
10359 	if (!vdev) {
10360 		dp_err_rl("vdev is null for vdev_id: %u", vdev_id);
10361 		return;
10362 	}
10363 	peer = dp_vdev_bss_peer_ref_n_get(soc, vdev, DP_MOD_ID_GENERIC_STATS);
10364 
10365 	if (!peer) {
10366 		dp_err_rl("Peer is NULL, vdev_id: %u", vdev_id);
10367 		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS);
10368 		return;
10369 	}
10370 	peer_stats = qdf_mem_malloc(sizeof(*peer_stats));
10371 	if (!peer_stats) {
10372 		dp_err_rl("peer_stats malloc failed, vdev_id: %u, peer_id: %u",
10373 			  vdev_id, peer->peer_id);
10374 		goto fail;
10375 	}
10376 
10377 	dp_get_peer_stats(peer, peer_stats);
10378 	dp_print_peer_stats(peer, peer_stats);
10379 	qdf_mem_free(peer_stats);
10380 
10381 fail:
10382 	dp_peer_unref_delete(peer, DP_MOD_ID_GENERIC_STATS);
10383 	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS);
10384 }
10385 #endif /* DP_MLO_LINK_STATS_SUPPORT */
10386 #else
10387 void dp_print_per_link_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id)
10388 {
10389 }
10390 #endif /* CONFIG_AP_PLATFORM */
10391