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