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