xref: /wlan-dirver/qca-wifi-host-cmn/dp/wifi3.0/dp_stats.c (revision 70a19e16789e308182f63b15c75decec7bf0b342)
1 /*
2  * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 #include "qdf_types.h"
20 #include "qdf_module.h"
21 #include "dp_peer.h"
22 #include "dp_types.h"
23 #include "dp_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() -
1475  *			display 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() -
3510  *					display htt_rx_pdev_rate_ext_stats_tlv
3511  * @pdev: pdev pointer
3512  * @tag_buf: buffer containing the tlv htt_rx_pdev_rate_ext_stats_tlv
3513  *
3514  * Return: void
3515  */
3516 static void dp_print_rx_pdev_rate_ext_stats_tlv(struct dp_pdev *pdev,
3517 						uint32_t *tag_buf)
3518 {
3519 	htt_rx_pdev_rate_ext_stats_tlv *dp_stats_buf =
3520 		(htt_rx_pdev_rate_ext_stats_tlv *)tag_buf;
3521 	uint8_t i, j;
3522 	uint16_t index = 0;
3523 	char *rx_gi_ext[HTT_RX_PDEV_STATS_NUM_GI_COUNTERS] = {0};
3524 	char *ul_ofdma_rx_gi_ext[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0};
3525 	char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
3526 
3527 	if (!str_buf) {
3528 		dp_err("Output buffer not allocated");
3529 		return;
3530 	}
3531 
3532 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
3533 		rx_gi_ext[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
3534 		if (!rx_gi_ext[i]) {
3535 			dp_err("Unable to allocate buffer for rx_gi_ext");
3536 			goto fail1;
3537 		}
3538 
3539 		ul_ofdma_rx_gi_ext[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
3540 		if (!ul_ofdma_rx_gi_ext[i]) {
3541 			dp_err("Unable to allocate buffer for ul_ofdma_rx_gi_ext");
3542 			goto fail1;
3543 		}
3544 	}
3545 
3546 	index = 0;
3547 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3548 	for (i = 0; i <  DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
3549 		index += qdf_snprint(&str_buf[index],
3550 				DP_MAX_STRING_LEN - index,
3551 				" %u:%u,", i, dp_stats_buf->rx_mcs_ext[i]);
3552 	}
3553 
3554 	for (i = 0; i <  DP_HTT_RX_PDEV_MCS_LEN_EXT2; i++) {
3555 		index += qdf_snprint(&str_buf[index],
3556 				DP_MAX_STRING_LEN - index,
3557 				" %u:%u,", i + DP_HTT_RX_PDEV_MCS_LEN_EXT,
3558 				 dp_stats_buf->rx_mcs_ext_2[i]);
3559 	}
3560 	DP_PRINT_STATS("rx_mcs_ext = %s ", str_buf);
3561 
3562 	index = 0;
3563 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3564 	for (i = 0; i <  DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
3565 		index += qdf_snprint(&str_buf[index],
3566 				DP_MAX_STRING_LEN - index,
3567 				" %u:%u,", i, dp_stats_buf->rx_stbc_ext[i]);
3568 	}
3569 	DP_PRINT_STATS("rx_stbc_ext = %s ", str_buf);
3570 
3571 	for (j = 0; j < DP_HTT_RX_GI_LEN; j++) {
3572 		index = 0;
3573 		qdf_mem_zero(rx_gi_ext[j], DP_MAX_STRING_LEN);
3574 		for (i = 0; i <  DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
3575 			index += qdf_snprint(&rx_gi_ext[j][index],
3576 					DP_MAX_STRING_LEN - index,
3577 					" %u:%u,", i,
3578 					dp_stats_buf->rx_gi_ext[j][i]);
3579 		}
3580 		DP_PRINT_STATS("rx_gi_ext[%u] = %s ", j, rx_gi_ext[j]);
3581 	}
3582 
3583 	index = 0;
3584 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3585 	for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
3586 		index += qdf_snprint(&str_buf[index],
3587 				     DP_MAX_STRING_LEN - index,
3588 				     " %u:%u,",
3589 				     i, dp_stats_buf->ul_ofdma_rx_mcs_ext[i]);
3590 	}
3591 	DP_PRINT_STATS("ul_ofdma_rx_mcs_ext = %s", str_buf);
3592 
3593 	for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
3594 		index = 0;
3595 		qdf_mem_zero(ul_ofdma_rx_gi_ext[j], DP_MAX_STRING_LEN);
3596 		for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
3597 			index += qdf_snprint(&ul_ofdma_rx_gi_ext[j][index],
3598 					     DP_MAX_STRING_LEN - index,
3599 					     " %u:%u,", i,
3600 					     dp_stats_buf->
3601 					     ul_ofdma_rx_gi_ext[j][i]);
3602 		}
3603 		DP_PRINT_STATS("ul_ofdma_rx_gi_ext[%u] = %s ",
3604 			       j, ul_ofdma_rx_gi_ext[j]);
3605 	}
3606 
3607 	index = 0;
3608 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3609 	for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
3610 		index += qdf_snprint(&str_buf[index],
3611 		DP_MAX_STRING_LEN - index,
3612 		" %u:%u,", i,
3613 		dp_stats_buf->rx_11ax_su_txbf_mcs_ext[i]);
3614 	}
3615 	DP_PRINT_STATS("rx_11ax_su_txbf_mcs_ext = %s ", str_buf);
3616 
3617 	index = 0;
3618 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3619 	for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
3620 		index += qdf_snprint(&str_buf[index],
3621 		DP_MAX_STRING_LEN - index,
3622 		" %u:%u,", i,
3623 		dp_stats_buf->rx_11ax_mu_txbf_mcs_ext[i]);
3624 	}
3625 	DP_PRINT_STATS("rx_11ax_mu_txbf_mcs_ext = %s ", str_buf);
3626 
3627 	index = 0;
3628 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3629 	for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
3630 		index += qdf_snprint(&str_buf[index],
3631 		DP_MAX_STRING_LEN - index,
3632 		" %u:%u,", i,
3633 		dp_stats_buf->rx_11ax_dl_ofdma_mcs_ext[i]);
3634 	}
3635 	DP_PRINT_STATS("rx_11ax_dl_ofdma_mcs_ext = %s ", str_buf);
3636 
3637 	index = 0;
3638 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3639 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_BW_EXT2_COUNTERS; i++) {
3640 		index += qdf_snprint(&str_buf[index],
3641 		DP_MAX_STRING_LEN - index,
3642 		" %u:%u,", i,
3643 		dp_stats_buf->rx_bw_ext[i]);
3644 	}
3645 	DP_PRINT_STATS("rx_bw_ext = %s ", str_buf);
3646 
3647 	index = 0;
3648 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3649 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_PUNCTURED_MODE_COUNTERS; i++) {
3650 		index += qdf_snprint(&str_buf[index],
3651 		DP_MAX_STRING_LEN - index,
3652 		" %u:%u,", i,
3653 		dp_stats_buf->rx_su_punctured_mode[i]);
3654 	}
3655 	DP_PRINT_STATS("rx_su_punctured_mode = %s ", str_buf);
3656 
3657 fail1:
3658 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
3659 		if (ul_ofdma_rx_gi_ext[i])
3660 			qdf_mem_free(ul_ofdma_rx_gi_ext[i]);
3661 		if (rx_gi_ext[i])
3662 			qdf_mem_free(rx_gi_ext[i]);
3663 	}
3664 
3665 	qdf_mem_free(str_buf);
3666 }
3667 
3668 /**
3669  * dp_print_rx_pdev_rate_stats_tlv() - display htt_rx_pdev_rate_stats_tlv
3670  * @pdev: pdev pointer
3671  * @tag_buf: buffer containing the tlv htt_rx_pdev_rate_stats_tlv
3672  *
3673  * Return: void
3674  */
3675 static void dp_print_rx_pdev_rate_stats_tlv(struct dp_pdev *pdev,
3676 					    uint32_t *tag_buf)
3677 {
3678 	htt_rx_pdev_rate_stats_tlv *dp_stats_buf =
3679 		(htt_rx_pdev_rate_stats_tlv *)tag_buf;
3680 	uint8_t i, j;
3681 	uint16_t index = 0;
3682 	char *rssi_chain[DP_HTT_RSSI_CHAIN_LEN];
3683 	char *rx_gi[HTT_RX_PDEV_STATS_NUM_GI_COUNTERS];
3684 	char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
3685 	char *ul_ofdma_rx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS];
3686 
3687 	if (!str_buf) {
3688 		dp_err("Output buffer not allocated");
3689 		return;
3690 	}
3691 
3692 	for (i = 0; i < DP_HTT_RSSI_CHAIN_LEN; i++) {
3693 		rssi_chain[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
3694 		if (!rssi_chain[i]) {
3695 			dp_err("Unable to allocate buffer for rssi_chain");
3696 			goto fail1;
3697 		}
3698 	}
3699 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
3700 		rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
3701 		if (!rx_gi[i]) {
3702 			dp_err("Unable to allocate buffer for rx_gi");
3703 			goto fail2;
3704 		}
3705 	}
3706 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
3707 		ul_ofdma_rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
3708 		if (!ul_ofdma_rx_gi[i]) {
3709 			dp_err("Unable to allocate buffer for ul_ofdma_rx_gi");
3710 			goto fail3;
3711 		}
3712 	}
3713 
3714 	DP_PRINT_STATS("ul_ofdma_data_rx_ppdu = %d",
3715 		       pdev->stats.ul_ofdma.data_rx_ppdu);
3716 
3717 	for (i = 0; i < OFDMA_NUM_USERS; i++) {
3718 		DP_PRINT_STATS("ul_ofdma data %d user = %d",
3719 			       i, pdev->stats.ul_ofdma.data_users[i]);
3720 	}
3721 
3722 	index = 0;
3723 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3724 	for (i = 0; i < OFDMA_NUM_RU_SIZE; i++) {
3725 		index += qdf_snprint(&str_buf[index],
3726 			DP_MAX_STRING_LEN - index,
3727 			" %u:%u,", i,
3728 			pdev->stats.ul_ofdma.data_rx_ru_size[i]);
3729 	}
3730 	DP_PRINT_STATS("ul_ofdma_data_rx_ru_size= %s", str_buf);
3731 
3732 	index = 0;
3733 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3734 	for (i = 0; i < OFDMA_NUM_RU_SIZE; i++) {
3735 		index += qdf_snprint(&str_buf[index],
3736 			DP_MAX_STRING_LEN - index,
3737 			" %u:%u,", i,
3738 			pdev->stats.ul_ofdma.nondata_rx_ru_size[i]);
3739 	}
3740 	DP_PRINT_STATS("ul_ofdma_nondata_rx_ru_size= %s", str_buf);
3741 
3742 	DP_PRINT_STATS("HTT_RX_PDEV_RATE_STATS_TLV:");
3743 	DP_PRINT_STATS("mac_id__word = %u",
3744 		       dp_stats_buf->mac_id__word);
3745 	DP_PRINT_STATS("nsts = %u",
3746 		       dp_stats_buf->nsts);
3747 	DP_PRINT_STATS("rx_ldpc = %u",
3748 		       dp_stats_buf->rx_ldpc);
3749 	DP_PRINT_STATS("rts_cnt = %u",
3750 		       dp_stats_buf->rts_cnt);
3751 	DP_PRINT_STATS("rssi_mgmt = %u",
3752 		       dp_stats_buf->rssi_mgmt);
3753 	DP_PRINT_STATS("rssi_data = %u",
3754 		       dp_stats_buf->rssi_data);
3755 	DP_PRINT_STATS("rssi_comb = %u",
3756 		       dp_stats_buf->rssi_comb);
3757 	DP_PRINT_STATS("rssi_in_dbm = %d",
3758 		       dp_stats_buf->rssi_in_dbm);
3759 	DP_PRINT_STATS("rx_11ax_su_ext = %u",
3760 		       dp_stats_buf->rx_11ax_su_ext);
3761 	DP_PRINT_STATS("rx_11ac_mumimo = %u",
3762 		       dp_stats_buf->rx_11ac_mumimo);
3763 	DP_PRINT_STATS("rx_11ax_mumimo = %u",
3764 		       dp_stats_buf->rx_11ax_mumimo);
3765 	DP_PRINT_STATS("rx_11ax_ofdma = %u",
3766 		       dp_stats_buf->rx_11ax_ofdma);
3767 	DP_PRINT_STATS("txbf = %u",
3768 		       dp_stats_buf->txbf);
3769 	DP_PRINT_STATS("rx_su_ndpa = %u",
3770 		       dp_stats_buf->rx_su_ndpa);
3771 	DP_PRINT_STATS("rx_br_poll = %u",
3772 		       dp_stats_buf->rx_br_poll);
3773 
3774 	index = 0;
3775 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3776 	for (i = 0; i <  DP_HTT_RX_MCS_LEN; i++) {
3777 		index += qdf_snprint(&str_buf[index],
3778 				DP_MAX_STRING_LEN - index,
3779 				" %u:%u,", i, dp_stats_buf->rx_mcs[i]);
3780 	}
3781 	for (i = 0; i <  DP_HTT_RX_MCS_EXT_LEN; i++) {
3782 		index += qdf_snprint(&str_buf[index],
3783 				DP_MAX_STRING_LEN - index,
3784 				" %u:%u,", i + DP_HTT_RX_MCS_LEN,
3785 				dp_stats_buf->rx_mcs_ext[i]);
3786 	}
3787 	DP_PRINT_STATS("rx_mcs = %s ", str_buf);
3788 
3789 	index = 0;
3790 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3791 	for (i = 0; i <  DP_HTT_RX_NSS_LEN; i++) {
3792 		/* 0 stands for NSS 1, 1 stands for NSS 2, etc. */
3793 		index += qdf_snprint(&str_buf[index],
3794 				DP_MAX_STRING_LEN - index,
3795 				" %u:%u,", (i + 1),
3796 				dp_stats_buf->rx_nss[i]);
3797 	}
3798 	DP_PRINT_STATS("rx_nss = %s ", str_buf);
3799 
3800 	index = 0;
3801 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3802 	for (i = 0; i <  DP_HTT_RX_DCM_LEN; i++) {
3803 		index += qdf_snprint(&str_buf[index],
3804 				DP_MAX_STRING_LEN - index,
3805 				" %u:%u,", i, dp_stats_buf->rx_dcm[i]);
3806 	}
3807 	DP_PRINT_STATS("rx_dcm = %s ", str_buf);
3808 
3809 	index = 0;
3810 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3811 	for (i = 0; i <  HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3812 		index += qdf_snprint(&str_buf[index],
3813 				DP_MAX_STRING_LEN - index,
3814 				" %u:%u,", i, dp_stats_buf->rx_stbc[i]);
3815 	}
3816 	DP_PRINT_STATS("rx_stbc = %s ", str_buf);
3817 
3818 	index = 0;
3819 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3820 	for (i = 0; i <  DP_HTT_RX_BW_LEN; i++) {
3821 		index += qdf_snprint(&str_buf[index],
3822 				DP_MAX_STRING_LEN - index,
3823 				" %u:%u,", i, dp_stats_buf->rx_bw[i]);
3824 	}
3825 	DP_PRINT_STATS("rx_bw = %s ", str_buf);
3826 
3827 	for (j = 0; j < DP_HTT_RSSI_CHAIN_LEN; j++) {
3828 		index = 0;
3829 		for (i = 0; i <  HTT_RX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
3830 			index += qdf_snprint(&rssi_chain[j][index],
3831 					DP_MAX_STRING_LEN - index,
3832 					" %u:%u,", i,
3833 					dp_stats_buf->rssi_chain[j][i]);
3834 		}
3835 		DP_PRINT_STATS("rssi_chain[%u] = %s ", j, rssi_chain[j]);
3836 	}
3837 
3838 	for (j = 0; j < DP_HTT_RX_GI_LEN; j++) {
3839 		index = 0;
3840 		qdf_mem_zero(rx_gi[j], DP_MAX_STRING_LEN);
3841 		for (i = 0; i <  HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3842 			index += qdf_snprint(&rx_gi[j][index],
3843 					DP_MAX_STRING_LEN - index,
3844 					" %u:%u,", i,
3845 					dp_stats_buf->rx_gi[j][i]);
3846 		}
3847 		DP_PRINT_STATS("rx_gi[%u] = %s ", j, rx_gi[j]);
3848 	}
3849 
3850 	index = 0;
3851 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3852 	for (i = 0; i <  DP_HTT_RX_PREAM_LEN; i++) {
3853 		index += qdf_snprint(&str_buf[index],
3854 				     DP_MAX_STRING_LEN - index,
3855 				     " %u:%u,",
3856 				     i,
3857 				     dp_stats_buf->rx_pream[i]);
3858 	}
3859 	DP_PRINT_STATS("rx_pream = %s", str_buf);
3860 
3861 	index = 0;
3862 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3863 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_LEGACY_CCK_STATS; i++) {
3864 		index += qdf_snprint(&str_buf[index],
3865 				     DP_MAX_STRING_LEN - index,
3866 				     " %u:%u,",
3867 				     i,
3868 				     dp_stats_buf->rx_legacy_cck_rate[i]);
3869 	}
3870 	DP_PRINT_STATS("rx_legacy_cck_rate = %s", str_buf);
3871 
3872 	index = 0;
3873 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3874 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_LEGACY_OFDM_STATS; i++) {
3875 		index += qdf_snprint(&str_buf[index],
3876 				     DP_MAX_STRING_LEN - index,
3877 				     " %u:%u,",
3878 				     i,
3879 				     dp_stats_buf->rx_legacy_ofdm_rate[i]);
3880 	}
3881 	DP_PRINT_STATS("rx_legacy_ofdm_rate = %s", str_buf);
3882 
3883 	index = 0;
3884 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3885 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3886 		index += qdf_snprint(&str_buf[index],
3887 				     DP_MAX_STRING_LEN - index,
3888 				     " %u:%u,",
3889 				     i, dp_stats_buf->ul_ofdma_rx_mcs[i]);
3890 	}
3891 	DP_PRINT_STATS("ul_ofdma_rx_mcs = %s", str_buf);
3892 
3893 	DP_PRINT_STATS("rx_11ax_ul_ofdma = %u",
3894 		       dp_stats_buf->rx_11ax_ul_ofdma);
3895 
3896 	for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
3897 		index = 0;
3898 		qdf_mem_zero(ul_ofdma_rx_gi[j], DP_MAX_STRING_LEN);
3899 		for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3900 			index += qdf_snprint(&ul_ofdma_rx_gi[j][index],
3901 					     DP_MAX_STRING_LEN - index,
3902 					     " %u:%u,", i,
3903 					     dp_stats_buf->
3904 					     ul_ofdma_rx_gi[j][i]);
3905 		}
3906 		DP_PRINT_STATS("ul_ofdma_rx_gi[%u] = %s ",
3907 			       j, ul_ofdma_rx_gi[j]);
3908 	}
3909 
3910 	index = 0;
3911 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3912 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) {
3913 		index += qdf_snprint(&str_buf[index],
3914 				DP_MAX_STRING_LEN - index,
3915 				" %u:%u,", i, dp_stats_buf->ul_ofdma_rx_nss[i]);
3916 	}
3917 	DP_PRINT_STATS("ul_ofdma_rx_nss = %s", str_buf);
3918 
3919 	index = 0;
3920 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3921 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
3922 		index += qdf_snprint(&str_buf[index],
3923 				DP_MAX_STRING_LEN - index,
3924 				" %u:%u,", i, dp_stats_buf->ul_ofdma_rx_bw[i]);
3925 	}
3926 	DP_PRINT_STATS("ul_ofdma_rx_bw = %s", str_buf);
3927 	DP_PRINT_STATS("ul_ofdma_rx_stbc = %u",
3928 		       dp_stats_buf->ul_ofdma_rx_stbc);
3929 	DP_PRINT_STATS("ul_ofdma_rx_ldpc = %u",
3930 		       dp_stats_buf->ul_ofdma_rx_ldpc);
3931 
3932 	index = 0;
3933 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3934 	for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) {
3935 		index += qdf_snprint(&str_buf[index],
3936 				     DP_MAX_STRING_LEN - index,
3937 				     " %u:%u,", i,
3938 				     dp_stats_buf->rx_ulofdma_non_data_ppdu[i]);
3939 	}
3940 	DP_PRINT_STATS("rx_ulofdma_non_data_ppdu = %s", str_buf);
3941 
3942 	index = 0;
3943 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3944 	for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) {
3945 		index += qdf_snprint(&str_buf[index],
3946 				     DP_MAX_STRING_LEN - index,
3947 				     " %u:%u,",
3948 				     i, dp_stats_buf->rx_ulofdma_data_ppdu[i]);
3949 	}
3950 	DP_PRINT_STATS("rx_ulofdma_data_ppdu = %s", str_buf);
3951 
3952 	index = 0;
3953 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3954 	for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) {
3955 		index += qdf_snprint(&str_buf[index],
3956 				     DP_MAX_STRING_LEN - index,
3957 				     " %u:%u,",
3958 				     i, dp_stats_buf->rx_ulofdma_mpdu_ok[i]);
3959 	}
3960 	DP_PRINT_STATS("rx_ulofdma_mpdu_ok = %s", str_buf);
3961 
3962 	index = 0;
3963 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3964 	for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) {
3965 		index += qdf_snprint(&str_buf[index],
3966 				     DP_MAX_STRING_LEN - index,
3967 				     " %u:%u,",
3968 				     i, dp_stats_buf->rx_ulofdma_mpdu_fail[i]);
3969 	}
3970 	DP_PRINT_STATS("rx_ulofdma_mpdu_fail = %s", str_buf);
3971 
3972 	index = 0;
3973 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3974 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3975 		index += qdf_snprint(&str_buf[index],
3976 				     DP_MAX_STRING_LEN - index,
3977 				     " %u:%u,",
3978 				     i, dp_stats_buf->rx_11ax_su_txbf_mcs[i]);
3979 	}
3980 	DP_PRINT_STATS("rx_11ax_su_txbf_mcs = %s", str_buf);
3981 
3982 	index = 0;
3983 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3984 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3985 		index += qdf_snprint(&str_buf[index],
3986 				     DP_MAX_STRING_LEN - index,
3987 				     " %u:%u,",
3988 				     i, dp_stats_buf->rx_11ax_mu_txbf_mcs[i]);
3989 	}
3990 	DP_PRINT_STATS("rx_11ax_mu_txbf_mcs = %s", str_buf);
3991 
3992 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++)
3993 		qdf_mem_free(ul_ofdma_rx_gi[i]);
3994 
3995 fail3:
3996 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++)
3997 		qdf_mem_free(rx_gi[i]);
3998 fail2:
3999 	for (i = 0; i < DP_HTT_RSSI_CHAIN_LEN; i++)
4000 		qdf_mem_free(rssi_chain[i]);
4001 fail1:
4002 	qdf_mem_free(str_buf);
4003 
4004 }
4005 
4006 /**
4007  * dp_print_rx_soc_fw_stats_tlv() - display htt_rx_soc_fw_stats_tlv
4008  * @tag_buf: buffer containing the tlv htt_rx_soc_fw_stats_tlv
4009  *
4010  * Return: void
4011  */
4012 static void dp_print_rx_soc_fw_stats_tlv(uint32_t *tag_buf)
4013 {
4014 	htt_rx_soc_fw_stats_tlv *dp_stats_buf =
4015 		(htt_rx_soc_fw_stats_tlv *)tag_buf;
4016 
4017 	DP_PRINT_STATS("HTT_RX_SOC_FW_STATS_TLV:");
4018 	DP_PRINT_STATS("fw_reo_ring_data_msdu = %u",
4019 		       dp_stats_buf->fw_reo_ring_data_msdu);
4020 	DP_PRINT_STATS("fw_to_host_data_msdu_bcmc = %u",
4021 		       dp_stats_buf->fw_to_host_data_msdu_bcmc);
4022 	DP_PRINT_STATS("fw_to_host_data_msdu_uc = %u",
4023 		       dp_stats_buf->fw_to_host_data_msdu_uc);
4024 	DP_PRINT_STATS("ofld_remote_data_buf_recycle_cnt = %u",
4025 		       dp_stats_buf->ofld_remote_data_buf_recycle_cnt);
4026 	DP_PRINT_STATS("ofld_remote_free_buf_indication_cnt = %u",
4027 		       dp_stats_buf->ofld_remote_free_buf_indication_cnt);
4028 	DP_PRINT_STATS("ofld_buf_to_host_data_msdu_uc = %u ",
4029 		       dp_stats_buf->ofld_buf_to_host_data_msdu_uc);
4030 	DP_PRINT_STATS("reo_fw_ring_to_host_data_msdu_uc = %u ",
4031 		       dp_stats_buf->reo_fw_ring_to_host_data_msdu_uc);
4032 	DP_PRINT_STATS("wbm_sw_ring_reap = %u ",
4033 		       dp_stats_buf->wbm_sw_ring_reap);
4034 	DP_PRINT_STATS("wbm_forward_to_host_cnt = %u ",
4035 		       dp_stats_buf->wbm_forward_to_host_cnt);
4036 	DP_PRINT_STATS("wbm_target_recycle_cnt = %u ",
4037 		       dp_stats_buf->wbm_target_recycle_cnt);
4038 	DP_PRINT_STATS("target_refill_ring_recycle_cnt = %u",
4039 		       dp_stats_buf->target_refill_ring_recycle_cnt);
4040 
4041 }
4042 
4043 /**
4044  * dp_print_rx_soc_fw_refill_ring_empty_tlv_v() - display
4045  *					htt_rx_soc_fw_refill_ring_empty_tlv_v
4046  * @tag_buf: buffer containing the tlv htt_rx_soc_fw_refill_ring_empty_tlv_v
4047  *
4048  * Return: void
4049  */
4050 static void dp_print_rx_soc_fw_refill_ring_empty_tlv_v(uint32_t *tag_buf)
4051 {
4052 	htt_rx_soc_fw_refill_ring_empty_tlv_v *dp_stats_buf =
4053 		(htt_rx_soc_fw_refill_ring_empty_tlv_v *)tag_buf;
4054 	uint8_t i;
4055 	uint16_t index = 0;
4056 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
4057 	char *refill_ring_empty_cnt = qdf_mem_malloc(DP_MAX_STRING_LEN);
4058 
4059 	if (!refill_ring_empty_cnt) {
4060 		dp_stats_err("Output buffer not allocated");
4061 		return;
4062 	}
4063 
4064 	tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_STATS_REFILL_MAX_RING);
4065 
4066 	DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_EMPTY_TLV_V:");
4067 	for (i = 0; i <  tag_len; i++) {
4068 		index += qdf_snprint(&refill_ring_empty_cnt[index],
4069 				DP_MAX_STRING_LEN - index,
4070 				" %u:%u,", i,
4071 				dp_stats_buf->refill_ring_empty_cnt[i]);
4072 	}
4073 	DP_PRINT_STATS("refill_ring_empty_cnt = %s\n",
4074 		       refill_ring_empty_cnt);
4075 	qdf_mem_free(refill_ring_empty_cnt);
4076 }
4077 
4078 /**
4079  * dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v() - display
4080  *				htt_rx_soc_fw_refill_ring_num_refill_tlv_v
4081  * @tag_buf: buffer containing the tlv htt_rx_soc_fw_refill_ring_num_refill_tlv
4082  *
4083  * Return: void
4084  */
4085 static void dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v(
4086 		uint32_t *tag_buf)
4087 {
4088 	htt_rx_soc_fw_refill_ring_num_refill_tlv_v *dp_stats_buf =
4089 		(htt_rx_soc_fw_refill_ring_num_refill_tlv_v *)tag_buf;
4090 	uint8_t i;
4091 	uint16_t index = 0;
4092 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
4093 	char *refill_ring_num_refill = qdf_mem_malloc(DP_MAX_STRING_LEN);
4094 
4095 	if (!refill_ring_num_refill) {
4096 		dp_stats_err("Output buffer not allocated");
4097 		return;
4098 	}
4099 
4100 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_URRN_STATS);
4101 
4102 	DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_REFILL_TLV_V:");
4103 	for (i = 0; i <  tag_len; i++) {
4104 		index += qdf_snprint(&refill_ring_num_refill[index],
4105 				DP_MAX_STRING_LEN - index,
4106 				" %u:%u,", i,
4107 				dp_stats_buf->refill_ring_num_refill[i]);
4108 	}
4109 	DP_PRINT_STATS("refill_ring_num_refill = %s\n",
4110 		       refill_ring_num_refill);
4111 	qdf_mem_free(refill_ring_num_refill);
4112 }
4113 
4114 /**
4115  * dp_print_rx_pdev_fw_stats_tlv() - display htt_rx_pdev_fw_stats_tlv
4116  * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_stats_tlv
4117  *
4118  * Return: void
4119  */
4120 static void dp_print_rx_pdev_fw_stats_tlv(uint32_t *tag_buf)
4121 {
4122 	htt_rx_pdev_fw_stats_tlv *dp_stats_buf =
4123 		(htt_rx_pdev_fw_stats_tlv *)tag_buf;
4124 	uint8_t i;
4125 	uint16_t index = 0;
4126 	char fw_ring_mgmt_subtype[DP_MAX_STRING_LEN];
4127 	char fw_ring_ctrl_subtype[DP_MAX_STRING_LEN];
4128 
4129 	DP_PRINT_STATS("HTT_RX_PDEV_FW_STATS_TLV:");
4130 	DP_PRINT_STATS("mac_id__word = %u",
4131 		       dp_stats_buf->mac_id__word);
4132 	DP_PRINT_STATS("ppdu_recvd = %u",
4133 		       dp_stats_buf->ppdu_recvd);
4134 	DP_PRINT_STATS("mpdu_cnt_fcs_ok = %u",
4135 		       dp_stats_buf->mpdu_cnt_fcs_ok);
4136 	DP_PRINT_STATS("mpdu_cnt_fcs_err = %u",
4137 		       dp_stats_buf->mpdu_cnt_fcs_err);
4138 	DP_PRINT_STATS("tcp_msdu_cnt = %u",
4139 		       dp_stats_buf->tcp_msdu_cnt);
4140 	DP_PRINT_STATS("tcp_ack_msdu_cnt = %u",
4141 		       dp_stats_buf->tcp_ack_msdu_cnt);
4142 	DP_PRINT_STATS("udp_msdu_cnt = %u",
4143 		       dp_stats_buf->udp_msdu_cnt);
4144 	DP_PRINT_STATS("other_msdu_cnt = %u",
4145 		       dp_stats_buf->other_msdu_cnt);
4146 	DP_PRINT_STATS("fw_ring_mpdu_ind = %u",
4147 		       dp_stats_buf->fw_ring_mpdu_ind);
4148 
4149 	for (i = 0; i <  DP_HTT_FW_RING_MGMT_SUBTYPE_LEN; i++) {
4150 		index += qdf_snprint(&fw_ring_mgmt_subtype[index],
4151 				DP_MAX_STRING_LEN - index,
4152 				" %u:%u,", i,
4153 				dp_stats_buf->fw_ring_mgmt_subtype[i]);
4154 	}
4155 	DP_PRINT_STATS("fw_ring_mgmt_subtype = %s ", fw_ring_mgmt_subtype);
4156 
4157 	index = 0;
4158 	for (i = 0; i <  DP_HTT_FW_RING_CTRL_SUBTYPE_LEN; i++) {
4159 		index += qdf_snprint(&fw_ring_ctrl_subtype[index],
4160 				DP_MAX_STRING_LEN - index,
4161 				" %u:%u,", i,
4162 				dp_stats_buf->fw_ring_ctrl_subtype[i]);
4163 	}
4164 	DP_PRINT_STATS("fw_ring_ctrl_subtype = %s ", fw_ring_ctrl_subtype);
4165 	DP_PRINT_STATS("fw_ring_mcast_data_msdu = %u",
4166 		       dp_stats_buf->fw_ring_mcast_data_msdu);
4167 	DP_PRINT_STATS("fw_ring_bcast_data_msdu = %u",
4168 		       dp_stats_buf->fw_ring_bcast_data_msdu);
4169 	DP_PRINT_STATS("fw_ring_ucast_data_msdu = %u",
4170 		       dp_stats_buf->fw_ring_ucast_data_msdu);
4171 	DP_PRINT_STATS("fw_ring_null_data_msdu = %u",
4172 		       dp_stats_buf->fw_ring_null_data_msdu);
4173 	DP_PRINT_STATS("fw_ring_mpdu_drop = %u",
4174 		       dp_stats_buf->fw_ring_mpdu_drop);
4175 	DP_PRINT_STATS("ofld_local_data_ind_cnt = %u",
4176 		       dp_stats_buf->ofld_local_data_ind_cnt);
4177 	DP_PRINT_STATS("ofld_local_data_buf_recycle_cnt = %u",
4178 		       dp_stats_buf->ofld_local_data_buf_recycle_cnt);
4179 	DP_PRINT_STATS("drx_local_data_ind_cnt = %u",
4180 		       dp_stats_buf->drx_local_data_ind_cnt);
4181 	DP_PRINT_STATS("drx_local_data_buf_recycle_cnt = %u",
4182 		       dp_stats_buf->drx_local_data_buf_recycle_cnt);
4183 	DP_PRINT_STATS("local_nondata_ind_cnt = %u",
4184 		       dp_stats_buf->local_nondata_ind_cnt);
4185 	DP_PRINT_STATS("local_nondata_buf_recycle_cnt = %u",
4186 		       dp_stats_buf->local_nondata_buf_recycle_cnt);
4187 	DP_PRINT_STATS("fw_status_buf_ring_refill_cnt = %u",
4188 		       dp_stats_buf->fw_status_buf_ring_refill_cnt);
4189 	DP_PRINT_STATS("fw_status_buf_ring_empty_cnt = %u",
4190 		       dp_stats_buf->fw_status_buf_ring_empty_cnt);
4191 	DP_PRINT_STATS("fw_pkt_buf_ring_refill_cnt = %u",
4192 		       dp_stats_buf->fw_pkt_buf_ring_refill_cnt);
4193 	DP_PRINT_STATS("fw_pkt_buf_ring_empty_cnt = %u",
4194 		       dp_stats_buf->fw_pkt_buf_ring_empty_cnt);
4195 	DP_PRINT_STATS("fw_link_buf_ring_refill_cnt = %u",
4196 		       dp_stats_buf->fw_link_buf_ring_refill_cnt);
4197 	DP_PRINT_STATS("fw_link_buf_ring_empty_cnt = %u",
4198 		       dp_stats_buf->fw_link_buf_ring_empty_cnt);
4199 	DP_PRINT_STATS("host_pkt_buf_ring_refill_cnt = %u",
4200 		       dp_stats_buf->host_pkt_buf_ring_refill_cnt);
4201 	DP_PRINT_STATS("host_pkt_buf_ring_empty_cnt = %u",
4202 		       dp_stats_buf->host_pkt_buf_ring_empty_cnt);
4203 	DP_PRINT_STATS("mon_pkt_buf_ring_refill_cnt = %u",
4204 		       dp_stats_buf->mon_pkt_buf_ring_refill_cnt);
4205 	DP_PRINT_STATS("mon_pkt_buf_ring_empty_cnt = %u",
4206 		       dp_stats_buf->mon_pkt_buf_ring_empty_cnt);
4207 	DP_PRINT_STATS("mon_status_buf_ring_refill_cnt = %u",
4208 		       dp_stats_buf->mon_status_buf_ring_refill_cnt);
4209 	DP_PRINT_STATS("mon_status_buf_ring_empty_cnt = %u",
4210 		       dp_stats_buf->mon_status_buf_ring_empty_cnt);
4211 	DP_PRINT_STATS("mon_desc_buf_ring_refill_cnt = %u",
4212 		       dp_stats_buf->mon_desc_buf_ring_refill_cnt);
4213 	DP_PRINT_STATS("mon_desc_buf_ring_empty_cnt = %u",
4214 		       dp_stats_buf->mon_desc_buf_ring_empty_cnt);
4215 	DP_PRINT_STATS("mon_dest_ring_update_cnt = %u",
4216 		       dp_stats_buf->mon_dest_ring_update_cnt);
4217 	DP_PRINT_STATS("mon_dest_ring_full_cnt = %u",
4218 		       dp_stats_buf->mon_dest_ring_full_cnt);
4219 	DP_PRINT_STATS("rx_suspend_cnt = %u",
4220 		       dp_stats_buf->rx_suspend_cnt);
4221 	DP_PRINT_STATS("rx_suspend_fail_cnt = %u",
4222 		       dp_stats_buf->rx_suspend_fail_cnt);
4223 	DP_PRINT_STATS("rx_resume_cnt = %u",
4224 		       dp_stats_buf->rx_resume_cnt);
4225 	DP_PRINT_STATS("rx_resume_fail_cnt = %u",
4226 		       dp_stats_buf->rx_resume_fail_cnt);
4227 	DP_PRINT_STATS("rx_ring_switch_cnt = %u",
4228 		       dp_stats_buf->rx_ring_switch_cnt);
4229 	DP_PRINT_STATS("rx_ring_restore_cnt = %u",
4230 		       dp_stats_buf->rx_ring_restore_cnt);
4231 	DP_PRINT_STATS("rx_flush_cnt = %u\n",
4232 		       dp_stats_buf->rx_flush_cnt);
4233 }
4234 
4235 /**
4236  * dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v() - display
4237  *				htt_rx_pdev_fw_ring_mpdu_err_tlv_v
4238  * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_ring_mpdu_err_tlv_v
4239  *
4240  * Return: void
4241  */
4242 static void dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v(uint32_t *tag_buf)
4243 {
4244 	htt_rx_pdev_fw_ring_mpdu_err_tlv_v *dp_stats_buf =
4245 		(htt_rx_pdev_fw_ring_mpdu_err_tlv_v *)tag_buf;
4246 	uint8_t i;
4247 	uint16_t index = 0;
4248 	char *fw_ring_mpdu_err = qdf_mem_malloc(DP_MAX_STRING_LEN);
4249 
4250 	if (!fw_ring_mpdu_err) {
4251 		dp_stats_err("Output buffer not allocated");
4252 		return;
4253 	}
4254 
4255 	DP_PRINT_STATS("HTT_RX_PDEV_FW_RING_MPDU_ERR_TLV_V:");
4256 	for (i = 0; i <  DP_HTT_FW_RING_MPDU_ERR_LEN; i++) {
4257 		index += qdf_snprint(&fw_ring_mpdu_err[index],
4258 				DP_MAX_STRING_LEN - index,
4259 				" %u:%u,", i,
4260 				dp_stats_buf->fw_ring_mpdu_err[i]);
4261 	}
4262 	DP_PRINT_STATS("fw_ring_mpdu_err = %s\n", fw_ring_mpdu_err);
4263 	qdf_mem_free(fw_ring_mpdu_err);
4264 }
4265 
4266 /**
4267  * dp_print_rx_pdev_fw_mpdu_drop_tlv_v() - display htt_rx_pdev_fw_mpdu_drop_tlv_v
4268  * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_mpdu_drop_tlv_v
4269  *
4270  * Return: void
4271  */
4272 static void dp_print_rx_pdev_fw_mpdu_drop_tlv_v(uint32_t *tag_buf)
4273 {
4274 	htt_rx_pdev_fw_mpdu_drop_tlv_v *dp_stats_buf =
4275 		(htt_rx_pdev_fw_mpdu_drop_tlv_v *)tag_buf;
4276 	uint8_t i;
4277 	uint16_t index = 0;
4278 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
4279 	char *fw_mpdu_drop = qdf_mem_malloc(DP_MAX_STRING_LEN);
4280 
4281 	if (!fw_mpdu_drop) {
4282 		dp_stats_err("Output buffer not allocated");
4283 		return;
4284 	}
4285 
4286 	tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_STATS_FW_DROP_REASON_MAX);
4287 
4288 	DP_PRINT_STATS("HTT_RX_PDEV_FW_MPDU_DROP_TLV_V:");
4289 	for (i = 0; i <  tag_len; i++) {
4290 		index += qdf_snprint(&fw_mpdu_drop[index],
4291 				DP_MAX_STRING_LEN - index,
4292 				" %u:%u,", i, dp_stats_buf->fw_mpdu_drop[i]);
4293 	}
4294 	DP_PRINT_STATS("fw_mpdu_drop = %s\n", fw_mpdu_drop);
4295 	qdf_mem_free(fw_mpdu_drop);
4296 }
4297 
4298 /**
4299  * dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv() - Accounts for rxdma error
4300  * packets
4301  * @tag_buf: Buffer
4302  *
4303  * Return: void
4304  */
4305 static uint64_t
4306 dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv(uint32_t *tag_buf)
4307 {
4308 	htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v *dp_stats_buf =
4309 		(htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v *)tag_buf;
4310 
4311 	uint8_t i;
4312 	uint16_t index = 0;
4313 	char rxdma_err_cnt[DP_MAX_STRING_LEN];
4314 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
4315 	uint64_t total_rxdma_err_cnt = 0;
4316 
4317 	tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_RXDMA_MAX_ERR_CODE);
4318 
4319 	DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_RXDMA_ERR_TLV_V");
4320 
4321 	for (i = 0; i <  tag_len; i++) {
4322 		index += snprintf(&rxdma_err_cnt[index],
4323 				DP_MAX_STRING_LEN - index,
4324 				" %u() -%u,", i,
4325 				dp_stats_buf->rxdma_err[i]);
4326 		total_rxdma_err_cnt += dp_stats_buf->rxdma_err[i];
4327 	}
4328 
4329 	DP_PRINT_STATS("rxdma_err = %s\n", rxdma_err_cnt);
4330 
4331 	return total_rxdma_err_cnt;
4332 }
4333 
4334 /**
4335  * dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv() - Accounts for reo error
4336  * packets
4337  * @tag_buf: Buffer
4338  *
4339  * Return: void
4340  */
4341 static void dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv(uint32_t *tag_buf)
4342 {
4343 	htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v *dp_stats_buf =
4344 		(htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v *)tag_buf;
4345 
4346 	uint8_t i;
4347 	uint16_t index = 0;
4348 	char reo_err_cnt[DP_MAX_STRING_LEN];
4349 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
4350 
4351 	tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_REO_MAX_ERR_CODE);
4352 
4353 	DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_REO_ERR_TLV_V");
4354 
4355 	for (i = 0; i <  tag_len; i++) {
4356 		index += snprintf(&reo_err_cnt[index],
4357 				DP_MAX_STRING_LEN - index,
4358 				" %u() -%u,", i,
4359 				dp_stats_buf->reo_err[i]);
4360 	}
4361 
4362 	DP_PRINT_STATS("reo_err = %s\n", reo_err_cnt);
4363 }
4364 
4365 /**
4366  * dp_print_rx_reo_debug_stats_tlv() - REO Statistics
4367  * @tag_buf: Buffer
4368  *
4369  * Return: void
4370  */
4371 static void dp_print_rx_reo_debug_stats_tlv(uint32_t *tag_buf)
4372 {
4373 	htt_rx_reo_resource_stats_tlv_v *dp_stats_buf =
4374 			(htt_rx_reo_resource_stats_tlv_v *)tag_buf;
4375 
4376 	DP_PRINT_STATS("HTT_RX_REO_RESOURCE_STATS_TLV");
4377 
4378 	DP_PRINT_STATS("sample_id() - %u ",
4379 		       dp_stats_buf->sample_id);
4380 	DP_PRINT_STATS("total_max: %u ",
4381 		       dp_stats_buf->total_max);
4382 	DP_PRINT_STATS("total_avg: %u ",
4383 		       dp_stats_buf->total_avg);
4384 	DP_PRINT_STATS("total_sample: %u ",
4385 		       dp_stats_buf->total_sample);
4386 	DP_PRINT_STATS("non_zeros_avg: %u ",
4387 		       dp_stats_buf->non_zeros_avg);
4388 	DP_PRINT_STATS("non_zeros_sample: %u ",
4389 		       dp_stats_buf->non_zeros_sample);
4390 	DP_PRINT_STATS("last_non_zeros_max: %u ",
4391 		       dp_stats_buf->last_non_zeros_max);
4392 	DP_PRINT_STATS("last_non_zeros_min: %u ",
4393 		       dp_stats_buf->last_non_zeros_min);
4394 	DP_PRINT_STATS("last_non_zeros_avg: %u ",
4395 		       dp_stats_buf->last_non_zeros_avg);
4396 	DP_PRINT_STATS("last_non_zeros_sample: %u\n ",
4397 		       dp_stats_buf->last_non_zeros_sample);
4398 }
4399 
4400 /**
4401  * dp_print_rx_pdev_fw_stats_phy_err_tlv() - Accounts for phy errors
4402  * @tag_buf: Buffer
4403  *
4404  * Return: void
4405  */
4406 static void dp_print_rx_pdev_fw_stats_phy_err_tlv(uint32_t *tag_buf)
4407 {
4408 	htt_rx_pdev_fw_stats_phy_err_tlv *dp_stats_buf =
4409 		(htt_rx_pdev_fw_stats_phy_err_tlv *)tag_buf;
4410 
4411 	uint8_t i = 0;
4412 	uint16_t index = 0;
4413 	char phy_errs[DP_MAX_STRING_LEN];
4414 
4415 	DP_PRINT_STATS("HTT_RX_PDEV_FW_STATS_PHY_ERR_TLV");
4416 
4417 	DP_PRINT_STATS("mac_id_word() - %u",
4418 		       dp_stats_buf->mac_id__word);
4419 	DP_PRINT_STATS("total_phy_err_cnt: %u",
4420 		       dp_stats_buf->total_phy_err_cnt);
4421 
4422 	for (i = 0; i < HTT_STATS_PHY_ERR_MAX; i++) {
4423 		index += snprintf(&phy_errs[index],
4424 				DP_MAX_STRING_LEN - index,
4425 				" %u:%u,", i, dp_stats_buf->phy_err[i]);
4426 	}
4427 
4428 	DP_PRINT_STATS("phy_errs: %s\n",  phy_errs);
4429 }
4430 
4431 void dp_htt_stats_print_tag(struct dp_pdev *pdev,
4432 			    uint8_t tag_type, uint32_t *tag_buf)
4433 {
4434 	switch (tag_type) {
4435 	case HTT_STATS_TX_PDEV_CMN_TAG:
4436 		dp_print_tx_pdev_stats_cmn_tlv(tag_buf);
4437 		break;
4438 	case HTT_STATS_TX_PDEV_UNDERRUN_TAG:
4439 		dp_print_tx_pdev_stats_urrn_tlv_v(tag_buf);
4440 		break;
4441 	case HTT_STATS_TX_PDEV_SIFS_TAG:
4442 		dp_print_tx_pdev_stats_sifs_tlv_v(tag_buf);
4443 		break;
4444 	case HTT_STATS_TX_PDEV_FLUSH_TAG:
4445 		dp_print_tx_pdev_stats_flush_tlv_v(tag_buf);
4446 		break;
4447 
4448 	case HTT_STATS_TX_PDEV_PHY_ERR_TAG:
4449 		dp_print_tx_pdev_stats_phy_err_tlv_v(tag_buf);
4450 		break;
4451 
4452 	case HTT_STATS_STRING_TAG:
4453 		dp_print_stats_string_tlv(tag_buf);
4454 		break;
4455 
4456 	case HTT_STATS_TX_HWQ_CMN_TAG:
4457 		dp_print_tx_hwq_stats_cmn_tlv(tag_buf);
4458 		break;
4459 
4460 	case HTT_STATS_TX_HWQ_DIFS_LATENCY_TAG:
4461 		dp_print_tx_hwq_difs_latency_stats_tlv_v(tag_buf);
4462 		break;
4463 
4464 	case HTT_STATS_TX_HWQ_CMD_RESULT_TAG:
4465 		dp_print_tx_hwq_cmd_result_stats_tlv_v(tag_buf);
4466 		break;
4467 
4468 	case HTT_STATS_TX_HWQ_CMD_STALL_TAG:
4469 		dp_print_tx_hwq_cmd_stall_stats_tlv_v(tag_buf);
4470 		break;
4471 
4472 	case HTT_STATS_TX_HWQ_FES_STATUS_TAG:
4473 		dp_print_tx_hwq_fes_result_stats_tlv_v(tag_buf);
4474 		break;
4475 
4476 	case HTT_STATS_TX_TQM_GEN_MPDU_TAG:
4477 		dp_print_tx_tqm_gen_mpdu_stats_tlv_v(tag_buf);
4478 		break;
4479 
4480 	case HTT_STATS_TX_TQM_LIST_MPDU_TAG:
4481 		dp_print_tx_tqm_list_mpdu_stats_tlv_v(tag_buf);
4482 		break;
4483 
4484 	case HTT_STATS_TX_TQM_LIST_MPDU_CNT_TAG:
4485 		dp_print_tx_tqm_list_mpdu_cnt_tlv_v(tag_buf);
4486 		break;
4487 
4488 	case HTT_STATS_TX_TQM_CMN_TAG:
4489 		dp_print_tx_tqm_cmn_stats_tlv(tag_buf);
4490 		break;
4491 
4492 	case HTT_STATS_TX_TQM_PDEV_TAG:
4493 		dp_print_tx_tqm_pdev_stats_tlv_v(tag_buf);
4494 		break;
4495 
4496 	case HTT_STATS_TX_TQM_CMDQ_STATUS_TAG:
4497 		dp_print_tx_tqm_cmdq_status_tlv(tag_buf);
4498 		break;
4499 
4500 	case HTT_STATS_TX_DE_EAPOL_PACKETS_TAG:
4501 		dp_print_tx_de_eapol_packets_stats_tlv(tag_buf);
4502 		break;
4503 
4504 	case HTT_STATS_TX_DE_CLASSIFY_FAILED_TAG:
4505 		dp_print_tx_de_classify_failed_stats_tlv(tag_buf);
4506 		break;
4507 
4508 	case HTT_STATS_TX_DE_CLASSIFY_STATS_TAG:
4509 		dp_print_tx_de_classify_stats_tlv(tag_buf);
4510 		break;
4511 
4512 	case HTT_STATS_TX_DE_CLASSIFY_STATUS_TAG:
4513 		dp_print_tx_de_classify_status_stats_tlv(tag_buf);
4514 		break;
4515 
4516 	case HTT_STATS_TX_DE_ENQUEUE_PACKETS_TAG:
4517 		dp_print_tx_de_enqueue_packets_stats_tlv(tag_buf);
4518 		break;
4519 
4520 	case HTT_STATS_TX_DE_ENQUEUE_DISCARD_TAG:
4521 		dp_print_tx_de_enqueue_discard_stats_tlv(tag_buf);
4522 		break;
4523 
4524 	case HTT_STATS_TX_DE_CMN_TAG:
4525 		dp_print_tx_de_cmn_stats_tlv(tag_buf);
4526 		break;
4527 
4528 	case HTT_STATS_RING_IF_TAG:
4529 		dp_print_ring_if_stats_tlv(tag_buf);
4530 		break;
4531 
4532 	case HTT_STATS_TX_PDEV_MU_MIMO_STATS_TAG:
4533 		dp_print_tx_pdev_mu_mimo_sch_stats_tlv(tag_buf);
4534 		break;
4535 
4536 	case HTT_STATS_SFM_CMN_TAG:
4537 		dp_print_sfm_cmn_tlv(tag_buf);
4538 		break;
4539 
4540 	case HTT_STATS_SRING_STATS_TAG:
4541 		dp_print_sring_stats_tlv(tag_buf);
4542 		break;
4543 
4544 	case HTT_STATS_RX_PDEV_FW_STATS_TAG:
4545 		dp_print_rx_pdev_fw_stats_tlv(tag_buf);
4546 		break;
4547 
4548 	case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG:
4549 		dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v(tag_buf);
4550 		break;
4551 
4552 	case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG:
4553 		dp_print_rx_pdev_fw_mpdu_drop_tlv_v(tag_buf);
4554 		break;
4555 
4556 	case HTT_STATS_RX_SOC_FW_STATS_TAG:
4557 		dp_print_rx_soc_fw_stats_tlv(tag_buf);
4558 		break;
4559 
4560 	case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG:
4561 		dp_print_rx_soc_fw_refill_ring_empty_tlv_v(tag_buf);
4562 		break;
4563 
4564 	case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG:
4565 		dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v(
4566 				tag_buf);
4567 		break;
4568 
4569 	case HTT_STATS_TX_PDEV_RATE_STATS_TAG:
4570 		dp_print_tx_pdev_rate_stats_tlv(tag_buf);
4571 		break;
4572 
4573 	case HTT_STATS_RX_PDEV_RATE_STATS_TAG:
4574 		dp_print_rx_pdev_rate_stats_tlv(pdev, tag_buf);
4575 		break;
4576 
4577 	case HTT_STATS_RX_PDEV_RATE_EXT_STATS_TAG:
4578 		dp_print_rx_pdev_rate_ext_stats_tlv(pdev, tag_buf);
4579 		break;
4580 
4581 	case HTT_STATS_TX_PDEV_SCHEDULER_TXQ_STATS_TAG:
4582 		dp_print_tx_pdev_stats_sched_per_txq_tlv(tag_buf);
4583 		break;
4584 
4585 	case HTT_STATS_TX_SCHED_CMN_TAG:
4586 		dp_print_stats_tx_sched_cmn_tlv(tag_buf);
4587 		break;
4588 
4589 	case HTT_STATS_TX_PDEV_MPDU_STATS_TAG:
4590 		dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv(tag_buf);
4591 		break;
4592 
4593 	case HTT_STATS_SCHED_TXQ_CMD_POSTED_TAG:
4594 		dp_print_sched_txq_cmd_posted_tlv_v(tag_buf);
4595 		break;
4596 
4597 	case HTT_STATS_RING_IF_CMN_TAG:
4598 		dp_print_ring_if_cmn_tlv(tag_buf);
4599 		break;
4600 
4601 	case HTT_STATS_SFM_CLIENT_USER_TAG:
4602 		dp_print_sfm_client_user_tlv_v(tag_buf);
4603 		break;
4604 
4605 	case HTT_STATS_SFM_CLIENT_TAG:
4606 		dp_print_sfm_client_tlv(tag_buf);
4607 		break;
4608 
4609 	case HTT_STATS_TX_TQM_ERROR_STATS_TAG:
4610 		dp_print_tx_tqm_error_stats_tlv(tag_buf);
4611 		break;
4612 
4613 	case HTT_STATS_SCHED_TXQ_CMD_REAPED_TAG:
4614 		dp_print_sched_txq_cmd_reaped_tlv_v(tag_buf);
4615 		break;
4616 
4617 	case HTT_STATS_SRING_CMN_TAG:
4618 		dp_print_sring_cmn_tlv(tag_buf);
4619 		break;
4620 
4621 	case HTT_STATS_TX_SELFGEN_AC_ERR_STATS_TAG:
4622 		dp_print_tx_selfgen_ac_err_stats_tlv(tag_buf);
4623 		break;
4624 
4625 	case HTT_STATS_TX_SELFGEN_CMN_STATS_TAG:
4626 		dp_print_tx_selfgen_cmn_stats_tlv(tag_buf);
4627 		break;
4628 
4629 	case HTT_STATS_TX_SELFGEN_AC_STATS_TAG:
4630 		dp_print_tx_selfgen_ac_stats_tlv(tag_buf);
4631 		break;
4632 
4633 	case HTT_STATS_TX_SELFGEN_AX_STATS_TAG:
4634 		dp_print_tx_selfgen_ax_stats_tlv(tag_buf);
4635 		break;
4636 
4637 	case HTT_STATS_TX_SELFGEN_AX_ERR_STATS_TAG:
4638 		dp_print_tx_selfgen_ax_err_stats_tlv(tag_buf);
4639 		break;
4640 
4641 	case  HTT_STATS_TX_SELFGEN_BE_STATS_TAG:
4642 		dp_print_tx_selfgen_be_stats_tlv(tag_buf);
4643 		break;
4644 
4645 	case HTT_STATS_TX_SELFGEN_BE_ERR_STATS_TAG:
4646 		dp_print_tx_selfgen_be_err_stats_tlv(tag_buf);
4647 		break;
4648 
4649 	case HTT_STATS_TX_SOUNDING_STATS_TAG:
4650 		dp_print_tx_sounding_stats_tlv(tag_buf);
4651 		break;
4652 
4653 	case HTT_STATS_TX_HWQ_MUMIMO_SCH_STATS_TAG:
4654 		dp_print_tx_hwq_mu_mimo_sch_stats_tlv(tag_buf);
4655 		break;
4656 
4657 	case HTT_STATS_TX_HWQ_MUMIMO_MPDU_STATS_TAG:
4658 		dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv(tag_buf);
4659 		break;
4660 
4661 	case HTT_STATS_TX_HWQ_MUMIMO_CMN_STATS_TAG:
4662 		dp_print_tx_hwq_mu_mimo_cmn_stats_tlv(tag_buf);
4663 		break;
4664 
4665 	case HTT_STATS_HW_INTR_MISC_TAG:
4666 		dp_print_hw_stats_intr_misc_tlv(tag_buf);
4667 		break;
4668 
4669 	case HTT_STATS_HW_WD_TIMEOUT_TAG:
4670 		dp_print_hw_stats_wd_timeout_tlv(tag_buf);
4671 		break;
4672 
4673 	case HTT_STATS_HW_PDEV_ERRS_TAG:
4674 		dp_print_hw_stats_pdev_errs_tlv(tag_buf);
4675 		break;
4676 
4677 	case HTT_STATS_COUNTER_NAME_TAG:
4678 		dp_print_counter_tlv(tag_buf);
4679 		break;
4680 
4681 	case HTT_STATS_TX_TID_DETAILS_TAG:
4682 		dp_print_tx_tid_stats_tlv(tag_buf);
4683 		break;
4684 
4685 	case HTT_STATS_TX_TID_DETAILS_V1_TAG:
4686 		dp_print_tx_tid_stats_v1_tlv(tag_buf);
4687 		break;
4688 
4689 	case HTT_STATS_RX_TID_DETAILS_TAG:
4690 		dp_print_rx_tid_stats_tlv(tag_buf);
4691 		break;
4692 
4693 	case HTT_STATS_PEER_STATS_CMN_TAG:
4694 		dp_print_peer_stats_cmn_tlv(tag_buf);
4695 		break;
4696 
4697 	case HTT_STATS_PEER_DETAILS_TAG:
4698 		dp_print_peer_details_tlv(tag_buf);
4699 		break;
4700 
4701 	case HTT_STATS_PEER_MSDU_FLOWQ_TAG:
4702 		dp_print_msdu_flow_stats_tlv(tag_buf);
4703 		break;
4704 
4705 	case HTT_STATS_PEER_TX_RATE_STATS_TAG:
4706 		dp_print_tx_peer_rate_stats_tlv(tag_buf);
4707 		break;
4708 
4709 	case HTT_STATS_PEER_RX_RATE_STATS_TAG:
4710 		dp_print_rx_peer_rate_stats_tlv(tag_buf);
4711 		break;
4712 
4713 	case HTT_STATS_TX_DE_COMPL_STATS_TAG:
4714 		dp_print_tx_de_compl_stats_tlv(tag_buf);
4715 		break;
4716 
4717 	case HTT_STATS_RX_REFILL_RXDMA_ERR_TAG:
4718 		pdev->stats.err.fw_reported_rxdma_error =
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 void dp_htt_stats_copy_tag(struct dp_pdev *pdev, uint8_t tag_type, uint32_t *tag_buf)
4740 {
4741 	void *dest_ptr = NULL;
4742 	uint32_t size = 0;
4743 	uint32_t size_expected = 0;
4744 	uint64_t val = 1;
4745 
4746 	pdev->fw_stats_tlv_bitmap_rcvd |= (val << tag_type);
4747 	switch (tag_type) {
4748 	case HTT_STATS_TX_PDEV_CMN_TAG:
4749 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.cmn_tlv;
4750 		size = sizeof(htt_tx_pdev_stats_cmn_tlv);
4751 		size_expected = sizeof(struct cdp_htt_tx_pdev_stats_cmn_tlv);
4752 		break;
4753 	case HTT_STATS_TX_PDEV_UNDERRUN_TAG:
4754 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.underrun_tlv;
4755 		size = sizeof(htt_tx_pdev_stats_urrn_tlv_v);
4756 		size_expected = sizeof(struct cdp_htt_tx_pdev_stats_urrn_tlv_v);
4757 		break;
4758 	case HTT_STATS_TX_PDEV_SIFS_TAG:
4759 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.sifs_tlv;
4760 		size = sizeof(htt_tx_pdev_stats_sifs_tlv_v);
4761 		size_expected = sizeof(struct cdp_htt_tx_pdev_stats_sifs_tlv_v);
4762 		break;
4763 	case HTT_STATS_TX_PDEV_FLUSH_TAG:
4764 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.flush_tlv;
4765 		size = sizeof(htt_tx_pdev_stats_flush_tlv_v);
4766 		size_expected =
4767 			sizeof(struct cdp_htt_tx_pdev_stats_flush_tlv_v);
4768 		break;
4769 	case HTT_STATS_TX_PDEV_PHY_ERR_TAG:
4770 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.phy_err_tlv;
4771 		size = sizeof(htt_tx_pdev_stats_phy_err_tlv_v);
4772 		size_expected =
4773 			sizeof(struct cdp_htt_tx_pdev_stats_phy_err_tlv_v);
4774 		break;
4775 	case HTT_STATS_RX_PDEV_FW_STATS_TAG:
4776 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_stats_tlv;
4777 		size = sizeof(htt_rx_pdev_fw_stats_tlv);
4778 		size_expected = sizeof(struct cdp_htt_rx_pdev_fw_stats_tlv);
4779 		break;
4780 	case HTT_STATS_RX_SOC_FW_STATS_TAG:
4781 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_tlv;
4782 		size = sizeof(htt_rx_soc_fw_stats_tlv);
4783 		size_expected = sizeof(struct cdp_htt_rx_soc_fw_stats_tlv);
4784 		break;
4785 	case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG:
4786 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_refill_ring_empty_tlv;
4787 		size = sizeof(htt_rx_soc_fw_refill_ring_empty_tlv_v);
4788 		size_expected =
4789 		sizeof(struct cdp_htt_rx_soc_fw_refill_ring_empty_tlv_v);
4790 		break;
4791 	case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG:
4792 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_refill_ring_num_refill_tlv;
4793 		size = sizeof(htt_rx_soc_fw_refill_ring_num_refill_tlv_v);
4794 		size_expected =
4795 		sizeof(struct cdp_htt_rx_soc_fw_refill_ring_num_refill_tlv_v);
4796 		break;
4797 	case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG:
4798 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_ring_mpdu_err_tlv;
4799 		size = sizeof(htt_rx_pdev_fw_ring_mpdu_err_tlv_v);
4800 		size_expected =
4801 			sizeof(struct cdp_htt_rx_pdev_fw_ring_mpdu_err_tlv_v);
4802 		break;
4803 	case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG:
4804 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_ring_mpdu_drop;
4805 		size = sizeof(htt_rx_pdev_fw_mpdu_drop_tlv_v);
4806 		size_expected =
4807 			sizeof(struct cdp_htt_rx_pdev_fw_mpdu_drop_tlv_v);
4808 		break;
4809 	default:
4810 		break;
4811 	}
4812 
4813 	if (size_expected < size)
4814 		dp_warn("Buffer Overflow:FW Struct Size:%d Host Struct Size:%d"
4815 			, size, size_expected);
4816 
4817 	if (dest_ptr)
4818 		qdf_mem_copy(dest_ptr, tag_buf, size_expected);
4819 
4820 	if (((pdev->fw_stats_tlv_bitmap_rcvd) & DP_HTT_TX_RX_EXPECTED_TLVS)
4821 	      == DP_HTT_TX_RX_EXPECTED_TLVS) {
4822 		qdf_event_set(&pdev->fw_stats_event);
4823 	}
4824 }
4825 
4826 #ifdef VDEV_PEER_PROTOCOL_COUNT
4827 #ifdef VDEV_PEER_PROTOCOL_COUNT_TESTING
4828 static QDF_STATUS dp_peer_stats_update_protocol_test_cnt(struct dp_vdev *vdev,
4829 							 bool is_egress,
4830 							 bool is_rx)
4831 {
4832 	int mask;
4833 
4834 	if (is_egress)
4835 		if (is_rx)
4836 			mask = VDEV_PEER_PROTOCOL_RX_EGRESS_MASK;
4837 		else
4838 			mask = VDEV_PEER_PROTOCOL_TX_EGRESS_MASK;
4839 	else
4840 		if (is_rx)
4841 			mask = VDEV_PEER_PROTOCOL_RX_INGRESS_MASK;
4842 		else
4843 			mask = VDEV_PEER_PROTOCOL_TX_INGRESS_MASK;
4844 
4845 	if (qdf_unlikely(vdev->peer_protocol_count_dropmask & mask)) {
4846 		dp_info("drop mask set %x", vdev->peer_protocol_count_dropmask);
4847 		return QDF_STATUS_SUCCESS;
4848 	}
4849 	return QDF_STATUS_E_FAILURE;
4850 }
4851 
4852 #else
4853 static QDF_STATUS dp_peer_stats_update_protocol_test_cnt(struct dp_vdev *vdev,
4854 							 bool is_egress,
4855 							 bool is_rx)
4856 {
4857 	return QDF_STATUS_E_FAILURE;
4858 }
4859 #endif
4860 
4861 void dp_vdev_peer_stats_update_protocol_cnt(struct dp_vdev *vdev,
4862 					    qdf_nbuf_t nbuf,
4863 					    struct dp_txrx_peer *txrx_peer,
4864 					    bool is_egress,
4865 					    bool is_rx)
4866 {
4867 	struct dp_peer_per_pkt_stats *per_pkt_stats;
4868 	struct protocol_trace_count *protocol_trace_cnt;
4869 	enum cdp_protocol_trace prot;
4870 	struct dp_soc *soc;
4871 	struct ether_header *eh;
4872 	char *mac;
4873 	bool new_peer_ref = false;
4874 	struct dp_peer *peer = NULL;
4875 
4876 	if (qdf_likely(!vdev->peer_protocol_count_track))
4877 		return;
4878 	if (qdf_unlikely(dp_peer_stats_update_protocol_test_cnt(vdev,
4879 								is_egress,
4880 								is_rx) ==
4881 					       QDF_STATUS_SUCCESS))
4882 		return;
4883 
4884 	soc = vdev->pdev->soc;
4885 	eh = (struct ether_header *)qdf_nbuf_data(nbuf);
4886 	if (is_rx)
4887 		mac = eh->ether_shost;
4888 	else
4889 		mac = eh->ether_dhost;
4890 
4891 	if (!txrx_peer) {
4892 		peer = dp_peer_find_hash_find(soc, mac, 0, vdev->vdev_id,
4893 					      DP_MOD_ID_GENERIC_STATS);
4894 		new_peer_ref = true;
4895 		if (!peer)
4896 			return;
4897 
4898 		txrx_peer = peer->txrx_peer;
4899 		if (!txrx_peer)
4900 			goto dp_vdev_peer_stats_update_protocol_cnt_free_peer;
4901 	}
4902 	per_pkt_stats = &txrx_peer->stats.per_pkt_stats;
4903 
4904 	if (qdf_nbuf_is_icmp_pkt(nbuf) == true)
4905 		prot = CDP_TRACE_ICMP;
4906 	else if (qdf_nbuf_is_ipv4_arp_pkt(nbuf) == true)
4907 		prot = CDP_TRACE_ARP;
4908 	else if (qdf_nbuf_is_ipv4_eapol_pkt(nbuf) == true)
4909 		prot = CDP_TRACE_EAP;
4910 	else
4911 		goto dp_vdev_peer_stats_update_protocol_cnt_free_peer;
4912 
4913 	if (is_rx)
4914 		protocol_trace_cnt = per_pkt_stats->rx.protocol_trace_cnt;
4915 	else
4916 		protocol_trace_cnt = per_pkt_stats->tx.protocol_trace_cnt;
4917 
4918 	if (is_egress)
4919 		protocol_trace_cnt[prot].egress_cnt++;
4920 	else
4921 		protocol_trace_cnt[prot].ingress_cnt++;
4922 dp_vdev_peer_stats_update_protocol_cnt_free_peer:
4923 	if (new_peer_ref)
4924 		dp_peer_unref_delete(peer, DP_MOD_ID_GENERIC_STATS);
4925 }
4926 
4927 void dp_peer_stats_update_protocol_cnt(struct cdp_soc_t *soc_hdl,
4928 				       int8_t vdev_id,
4929 				       qdf_nbuf_t nbuf,
4930 				       bool is_egress,
4931 				       bool is_rx)
4932 {
4933 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
4934 	struct dp_vdev *vdev;
4935 
4936 	vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_GENERIC_STATS);
4937 	if (!vdev)
4938 		return;
4939 
4940 	if (qdf_likely(vdev->peer_protocol_count_track))
4941 		dp_vdev_peer_stats_update_protocol_cnt(vdev, nbuf, NULL,
4942 						       is_egress, is_rx);
4943 
4944 	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS);
4945 }
4946 #endif
4947 
4948 #if defined(QCA_ENH_V3_STATS_SUPPORT) || defined(HW_TX_DELAY_STATS_ENABLE)
4949 /**
4950  * dp_vow_str_fw_to_hw_delay() - Return string for a delay
4951  * @index: Index of delay
4952  *
4953  * Return: char const pointer
4954  */
4955 static inline const char *dp_vow_str_fw_to_hw_delay(uint8_t index)
4956 {
4957 	if (index > CDP_DELAY_BUCKET_MAX) {
4958 		return "Invalid index";
4959 	}
4960 	return fw_to_hw_delay_bucket[index];
4961 }
4962 
4963 /**
4964  * dp_accumulate_delay_stats() - Update delay stats members
4965  * @total: Update stats total structure
4966  * @per_ring: per ring structures from where stats need to be accumulated
4967  *
4968  * Return: void
4969  */
4970 static void
4971 dp_accumulate_delay_stats(struct cdp_delay_stats *total,
4972 			  struct cdp_delay_stats *per_ring)
4973 {
4974 	uint8_t index;
4975 
4976 	for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++)
4977 		total->delay_bucket[index] += per_ring->delay_bucket[index];
4978 	total->min_delay = QDF_MIN(total->min_delay, per_ring->min_delay);
4979 	total->max_delay = QDF_MAX(total->max_delay, per_ring->max_delay);
4980 	total->avg_delay = ((total->avg_delay + per_ring->avg_delay) >> 1);
4981 }
4982 #endif
4983 
4984 #ifdef QCA_ENH_V3_STATS_SUPPORT
4985 /**
4986  * dp_vow_str_sw_enq_delay() - Return string for a delay
4987  * @index: Index of delay
4988  *
4989  * Return: char const pointer
4990  */
4991 static inline const char *dp_vow_str_sw_enq_delay(uint8_t index)
4992 {
4993 	if (index > CDP_DELAY_BUCKET_MAX) {
4994 		return "Invalid index";
4995 	}
4996 	return sw_enq_delay_bucket[index];
4997 }
4998 
4999 /**
5000  * dp_vow_str_intfrm_delay() - Return string for a delay
5001  * @index: Index of delay
5002  *
5003  * Return: char const pointer
5004  */
5005 static inline const char *dp_vow_str_intfrm_delay(uint8_t index)
5006 {
5007 	if (index > CDP_DELAY_BUCKET_MAX) {
5008 		return "Invalid index";
5009 	}
5010 	return intfrm_delay_bucket[index];
5011 }
5012 
5013 /**
5014  * dp_accumulate_tid_stats() - Accumulate TID stats from each ring
5015  * @pdev: pdev handle
5016  * @tid: traffic ID
5017  * @total_tx: fill this tx structure to get stats from all wbm rings
5018  * @total_rx: fill this rx structure to get stats from all reo rings
5019  * @type: delay stats or regular frame counters
5020  *
5021  * Return: void
5022  */
5023 static void
5024 dp_accumulate_tid_stats(struct dp_pdev *pdev, uint8_t tid,
5025 			struct cdp_tid_tx_stats *total_tx,
5026 			struct cdp_tid_rx_stats *total_rx, uint8_t type)
5027 {
5028 	uint8_t i = 0, ring_id = 0, drop = 0, tqm_status_idx = 0, htt_status_idx = 0;
5029 	struct cdp_tid_stats *tid_stats = &pdev->stats.tid_stats;
5030 	struct cdp_tid_tx_stats *per_ring_tx = NULL;
5031 	struct cdp_tid_rx_stats *per_ring_rx = NULL;
5032 
5033 	if (wlan_cfg_get_dp_soc_nss_cfg(pdev->soc->wlan_cfg_ctx)) {
5034 		qdf_mem_copy(total_tx, &tid_stats->tid_tx_stats[0][tid],
5035 			     sizeof(struct cdp_tid_tx_stats));
5036 		qdf_mem_copy(total_rx, &tid_stats->tid_rx_stats[0][tid],
5037 			     sizeof(struct cdp_tid_rx_stats));
5038 		return;
5039 	} else {
5040 		qdf_mem_zero(total_tx, sizeof(struct cdp_tid_tx_stats));
5041 		qdf_mem_zero(total_rx, sizeof(struct cdp_tid_rx_stats));
5042 	}
5043 
5044 	switch (type) {
5045 	case TID_COUNTER_STATS:
5046 	{
5047 		for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) {
5048 			per_ring_tx = &tid_stats->tid_tx_stats[ring_id][tid];
5049 			total_tx->success_cnt += per_ring_tx->success_cnt;
5050 			total_tx->comp_fail_cnt += per_ring_tx->comp_fail_cnt;
5051 			for (tqm_status_idx = 0; tqm_status_idx < CDP_MAX_TX_TQM_STATUS; tqm_status_idx++) {
5052 				total_tx->tqm_status_cnt[tqm_status_idx] +=
5053 					per_ring_tx->tqm_status_cnt[tqm_status_idx];
5054 			}
5055 
5056 			for (htt_status_idx = 0; htt_status_idx < CDP_MAX_TX_HTT_STATUS; htt_status_idx++) {
5057 				total_tx->htt_status_cnt[htt_status_idx] +=
5058 					per_ring_tx->htt_status_cnt[htt_status_idx];
5059 			}
5060 
5061 			for (drop = 0; drop < TX_MAX_DROP; drop++)
5062 				total_tx->swdrop_cnt[drop] +=
5063 					per_ring_tx->swdrop_cnt[drop];
5064 		}
5065 		for (ring_id = 0; ring_id < CDP_MAX_RX_RINGS; ring_id++) {
5066 			per_ring_rx = &tid_stats->tid_rx_stats[ring_id][tid];
5067 			total_rx->delivered_to_stack +=
5068 				per_ring_rx->delivered_to_stack;
5069 			total_rx->intrabss_cnt += per_ring_rx->intrabss_cnt;
5070 			total_rx->msdu_cnt += per_ring_rx->msdu_cnt;
5071 			total_rx->mcast_msdu_cnt += per_ring_rx->mcast_msdu_cnt;
5072 			total_rx->bcast_msdu_cnt += per_ring_rx->bcast_msdu_cnt;
5073 			for (drop = 0; drop < RX_MAX_DROP; drop++)
5074 				total_rx->fail_cnt[drop] +=
5075 					per_ring_rx->fail_cnt[drop];
5076 		}
5077 		break;
5078 	}
5079 
5080 	case TID_DELAY_STATS:
5081 	{
5082 		for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) {
5083 			per_ring_tx = &tid_stats->tid_tx_stats[ring_id][tid];
5084 			dp_accumulate_delay_stats(&total_tx->swq_delay,
5085 						  &per_ring_tx->swq_delay);
5086 			dp_accumulate_delay_stats(&total_tx->hwtx_delay,
5087 						  &per_ring_tx->hwtx_delay);
5088 			dp_accumulate_delay_stats(&total_tx->intfrm_delay,
5089 						  &per_ring_tx->intfrm_delay);
5090 		}
5091 		for (ring_id = 0; ring_id < CDP_MAX_RX_RINGS; ring_id++) {
5092 			per_ring_rx = &tid_stats->tid_rx_stats[ring_id][tid];
5093 			dp_accumulate_delay_stats(&total_rx->intfrm_delay,
5094 						  &per_ring_rx->intfrm_delay);
5095 			dp_accumulate_delay_stats(&total_rx->to_stack_delay,
5096 						  &per_ring_rx->to_stack_delay);
5097 		}
5098 		break;
5099 	}
5100 
5101 	case TID_RX_ERROR_STATS:
5102 	{
5103 		for (ring_id = 0; ring_id < CDP_MAX_RX_RINGS; ring_id++) {
5104 			per_ring_rx = &tid_stats->tid_rx_stats[ring_id][tid];
5105 			total_rx->reo_err.err_src_reo_code_inv += per_ring_rx->reo_err.err_src_reo_code_inv;
5106 			for (i = 0; i < CDP_REO_CODE_MAX; i++) {
5107 				total_rx->reo_err.err_reo_codes[i] += per_ring_rx->reo_err.err_reo_codes[i];
5108 			}
5109 
5110 			total_rx->rxdma_err.err_src_rxdma_code_inv += per_ring_rx->rxdma_err.err_src_rxdma_code_inv;
5111 			for (i = 0; i < CDP_DMA_CODE_MAX; i++) {
5112 				total_rx->rxdma_err.err_dma_codes[i] += per_ring_rx->rxdma_err.err_dma_codes[i];
5113 			}
5114 		}
5115 		break;
5116 	}
5117 	default:
5118 		qdf_err("Invalid stats type");
5119 		break;
5120 	}
5121 }
5122 
5123 void dp_pdev_print_tid_stats(struct dp_pdev *pdev)
5124 {
5125 	struct cdp_tid_tx_stats total_tx;
5126 	struct cdp_tid_rx_stats total_rx;
5127 	uint8_t tid, tqm_status_idx, htt_status_idx;
5128 	struct cdp_tid_rx_stats *rx_wbm_stats = NULL;
5129 
5130 	DP_PRINT_STATS("Packets received in hardstart: %llu ",
5131 			pdev->stats.tid_stats.ingress_stack);
5132 	DP_PRINT_STATS("Packets dropped in osif layer: %llu ",
5133 			pdev->stats.tid_stats.osif_drop);
5134 	DP_PRINT_STATS("Per TID Video Stats:\n");
5135 
5136 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
5137 		rx_wbm_stats = &pdev->stats.tid_stats.tid_rx_wbm_stats[0][tid];
5138 
5139 		dp_accumulate_tid_stats(pdev, tid, &total_tx, &total_rx,
5140 					TID_COUNTER_STATS);
5141 		DP_PRINT_STATS("----TID: %d----", tid);
5142 		DP_PRINT_STATS("Tx TQM Success Count: %llu",
5143 				total_tx.tqm_status_cnt[HAL_TX_TQM_RR_FRAME_ACKED]);
5144 		DP_PRINT_STATS("Tx HTT Success Count: %llu",
5145 				total_tx.htt_status_cnt[HTT_TX_FW2WBM_TX_STATUS_OK]);
5146 		for (tqm_status_idx = 1; tqm_status_idx < CDP_MAX_TX_TQM_STATUS; tqm_status_idx++) {
5147 			if (total_tx.tqm_status_cnt[tqm_status_idx]) {
5148 				DP_PRINT_STATS("Tx TQM Drop Count[%d]: %llu",
5149 						tqm_status_idx, total_tx.tqm_status_cnt[tqm_status_idx]);
5150 			}
5151 		}
5152 
5153 		for (htt_status_idx = 1; htt_status_idx < CDP_MAX_TX_HTT_STATUS; htt_status_idx++) {
5154 			if (total_tx.htt_status_cnt[htt_status_idx]) {
5155 				DP_PRINT_STATS("Tx HTT Drop Count[%d]: %llu",
5156 						htt_status_idx, total_tx.htt_status_cnt[htt_status_idx]);
5157 			}
5158 		}
5159 
5160 		DP_PRINT_STATS("Tx Hardware Drop Count: %llu",
5161 			       total_tx.swdrop_cnt[TX_HW_ENQUEUE]);
5162 		DP_PRINT_STATS("Tx Software Drop Count: %llu",
5163 			       total_tx.swdrop_cnt[TX_SW_ENQUEUE]);
5164 		DP_PRINT_STATS("Tx Descriptor Error Count: %llu",
5165 			       total_tx.swdrop_cnt[TX_DESC_ERR]);
5166 		DP_PRINT_STATS("Tx HAL Ring Error Count: %llu",
5167 			       total_tx.swdrop_cnt[TX_HAL_RING_ACCESS_ERR]);
5168 		DP_PRINT_STATS("Tx Dma Map Error Count: %llu",
5169 			       total_tx.swdrop_cnt[TX_DMA_MAP_ERR]);
5170 		DP_PRINT_STATS("Rx Delievered Count: %llu",
5171 			       total_rx.delivered_to_stack);
5172 		DP_PRINT_STATS("Rx Software Enqueue Drop Count: %llu",
5173 			       total_rx.fail_cnt[ENQUEUE_DROP]);
5174 		DP_PRINT_STATS("Rx Intrabss Drop Count: %llu",
5175 			       total_rx.fail_cnt[INTRABSS_DROP]);
5176 		DP_PRINT_STATS("Rx Msdu Done Failure Count: %llu",
5177 			       total_rx.fail_cnt[MSDU_DONE_FAILURE]);
5178 		DP_PRINT_STATS("Rx Invalid Peer Count: %llu",
5179 			       total_rx.fail_cnt[INVALID_PEER_VDEV]);
5180 		DP_PRINT_STATS("Rx Policy Check Drop Count: %llu",
5181 			       total_rx.fail_cnt[POLICY_CHECK_DROP]);
5182 		DP_PRINT_STATS("Rx Mec Drop Count: %llu",
5183 			       total_rx.fail_cnt[MEC_DROP]);
5184 		DP_PRINT_STATS("Rx Nawds Mcast Drop Count: %llu",
5185 			       total_rx.fail_cnt[NAWDS_MCAST_DROP]);
5186 		DP_PRINT_STATS("Rx Mesh Filter Drop Count: %llu",
5187 			       total_rx.fail_cnt[MESH_FILTER_DROP]);
5188 		DP_PRINT_STATS("Rx Intra Bss Deliver Count: %llu",
5189 			       total_rx.intrabss_cnt);
5190 		DP_PRINT_STATS("Rx MSDU Count: %llu", total_rx.msdu_cnt);
5191 		DP_PRINT_STATS("Rx Multicast MSDU Count: %llu",
5192 			       total_rx.mcast_msdu_cnt);
5193 		DP_PRINT_STATS("Rx Broadcast MSDU Count: %llu\n",
5194 			       total_rx.bcast_msdu_cnt);
5195 		DP_PRINT_STATS("Rx WBM Intra Bss Deliver Count: %llu",
5196 			       rx_wbm_stats->intrabss_cnt);
5197 		DP_PRINT_STATS("Rx WBM Intrabss Drop Count: %llu",
5198 			       rx_wbm_stats->fail_cnt[INTRABSS_DROP]);
5199 	}
5200 }
5201 
5202 void dp_pdev_print_delay_stats(struct dp_pdev *pdev)
5203 {
5204 	struct dp_soc *soc = pdev->soc;
5205 	struct cdp_tid_tx_stats total_tx;
5206 	struct cdp_tid_rx_stats total_rx;
5207 
5208 	uint8_t tid, index;
5209 	uint64_t count = 0;
5210 
5211 	if (!soc)
5212 		return;
5213 
5214 	tid = 0;
5215 	index = 0;
5216 
5217 	DP_PRINT_STATS("Per TID Delay Non-Zero Stats:\n");
5218 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
5219 		dp_accumulate_tid_stats(pdev, tid, &total_tx, &total_rx,
5220 					TID_DELAY_STATS);
5221 		DP_PRINT_STATS("----TID: %d----", tid);
5222 
5223 		DP_PRINT_STATS("Software Enqueue Delay:");
5224 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
5225 			count = total_tx.swq_delay.delay_bucket[index];
5226 			if (count) {
5227 				DP_PRINT_STATS("%s:  Packets = %llu",
5228 					       dp_vow_str_sw_enq_delay(index),
5229 					       count);
5230 			}
5231 		}
5232 
5233 		DP_PRINT_STATS("Min = %u", total_tx.swq_delay.min_delay);
5234 		DP_PRINT_STATS("Max = %u", total_tx.swq_delay.max_delay);
5235 		DP_PRINT_STATS("Avg = %u\n", total_tx.swq_delay.avg_delay);
5236 
5237 		DP_PRINT_STATS("Hardware Transmission Delay:");
5238 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
5239 			count = total_tx.hwtx_delay.delay_bucket[index];
5240 			if (count) {
5241 				DP_PRINT_STATS("%s:  Packets = %llu",
5242 					       dp_vow_str_fw_to_hw_delay(index),
5243 					       count);
5244 			}
5245 		}
5246 		DP_PRINT_STATS("Min = %u", total_tx.hwtx_delay.min_delay);
5247 		DP_PRINT_STATS("Max = %u", total_tx.hwtx_delay.max_delay);
5248 		DP_PRINT_STATS("Avg = %u\n", total_tx.hwtx_delay.avg_delay);
5249 
5250 		DP_PRINT_STATS("Tx Interframe Delay:");
5251 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
5252 			count = total_tx.intfrm_delay.delay_bucket[index];
5253 			if (count) {
5254 				DP_PRINT_STATS("%s:  Packets = %llu",
5255 					       dp_vow_str_intfrm_delay(index),
5256 					       count);
5257 			}
5258 		}
5259 		DP_PRINT_STATS("Min = %u", total_tx.intfrm_delay.min_delay);
5260 		DP_PRINT_STATS("Max = %u", total_tx.intfrm_delay.max_delay);
5261 		DP_PRINT_STATS("Avg = %u\n", total_tx.intfrm_delay.avg_delay);
5262 
5263 		DP_PRINT_STATS("Rx Interframe Delay:");
5264 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
5265 			count = total_rx.intfrm_delay.delay_bucket[index];
5266 			if (count) {
5267 				DP_PRINT_STATS("%s:  Packets = %llu",
5268 					       dp_vow_str_intfrm_delay(index),
5269 					       count);
5270 			}
5271 		}
5272 		DP_PRINT_STATS("Min = %u", total_rx.intfrm_delay.min_delay);
5273 		DP_PRINT_STATS("Max = %u", total_rx.intfrm_delay.max_delay);
5274 		DP_PRINT_STATS("Avg = %u\n", total_rx.intfrm_delay.avg_delay);
5275 
5276 		DP_PRINT_STATS("Rx Reap to Stack Delay:");
5277 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
5278 			count = total_rx.to_stack_delay.delay_bucket[index];
5279 			if (count) {
5280 				DP_PRINT_STATS("%s:  Packets = %llu",
5281 					       dp_vow_str_intfrm_delay(index),
5282 					       count);
5283 			}
5284 		}
5285 
5286 		DP_PRINT_STATS("Min = %u", total_rx.to_stack_delay.min_delay);
5287 		DP_PRINT_STATS("Max = %u", total_rx.to_stack_delay.max_delay);
5288 		DP_PRINT_STATS("Avg = %u\n", total_rx.to_stack_delay.avg_delay);
5289 	}
5290 }
5291 
5292 void dp_pdev_print_rx_error_stats(struct dp_pdev *pdev)
5293 {
5294 	struct dp_soc *soc = pdev->soc;
5295 	struct cdp_tid_rx_stats total_rx;
5296 	struct cdp_tid_tx_stats total_tx;
5297 
5298 	uint8_t tid, index;
5299 
5300 	if (!soc)
5301 		return;
5302 
5303 
5304 	DP_PRINT_STATS("Per TID RX Error Stats:\n");
5305 	for (tid = 0; tid < CDP_MAX_VOW_TID; tid++) {
5306 		dp_accumulate_tid_stats(pdev, tid, &total_tx, &total_rx,
5307 					TID_RX_ERROR_STATS);
5308 		DP_PRINT_STATS("----TID: %d----", tid + 4);
5309 
5310 		DP_PRINT_STATS("Rx REO Error stats:");
5311 		DP_PRINT_STATS("err_src_reo_code_inv = %llu", total_rx.reo_err.err_src_reo_code_inv);
5312 		for (index = 0; index < CDP_REO_CODE_MAX; index++) {
5313 			DP_PRINT_STATS("err src reo codes: %d = %llu", index, total_rx.reo_err.err_reo_codes[index]);
5314 		}
5315 
5316 		DP_PRINT_STATS("Rx Rxdma Error stats:");
5317 		DP_PRINT_STATS("err_src_rxdma_code_inv = %llu", total_rx.rxdma_err.err_src_rxdma_code_inv);
5318 		for (index = 0; index < CDP_DMA_CODE_MAX; index++) {
5319 			DP_PRINT_STATS("err src dma codes: %d = %llu", index, total_rx.rxdma_err.err_dma_codes[index]);
5320 		}
5321 	}
5322 }
5323 
5324 QDF_STATUS dp_pdev_get_tid_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
5325 				 struct cdp_tid_stats_intf *tid_stats)
5326 {
5327 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
5328 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
5329 	struct cdp_tid_rx_stats rx;
5330 	struct cdp_tid_tx_stats tx;
5331 	uint8_t tid;
5332 	uint32_t size;
5333 
5334 	if (!pdev)
5335 		return QDF_STATUS_E_INVAL;
5336 
5337 	size = sizeof(struct cdp_delay_stats);
5338 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
5339 		dp_accumulate_tid_stats(pdev, tid, &tx, &rx, TID_COUNTER_STATS);
5340 		/* Copy specific accumulated Tx tid stats */
5341 		tid_stats->tx_total[tid].success_cnt = tx.success_cnt;
5342 		tid_stats->tx_total[tid].comp_fail_cnt = tx.comp_fail_cnt;
5343 		qdf_mem_copy(&tid_stats->tx_total[tid].tqm_status_cnt[0],
5344 			     &tx.tqm_status_cnt[0],
5345 			     CDP_MAX_TX_TQM_STATUS * sizeof(uint64_t));
5346 		qdf_mem_copy(&tid_stats->tx_total[tid].htt_status_cnt[0],
5347 			     &tx.htt_status_cnt[0],
5348 			     CDP_MAX_TX_HTT_STATUS * sizeof(uint64_t));
5349 		qdf_mem_copy(&tid_stats->tx_total[tid].swdrop_cnt[0],
5350 			     &tx.swdrop_cnt[0], TX_MAX_DROP * sizeof(uint64_t));
5351 
5352 		/* Copy specific accumulated Rx tid stats */
5353 		tid_stats->rx_total[tid].delivered_to_stack =
5354 							rx.delivered_to_stack;
5355 		tid_stats->rx_total[tid].intrabss_cnt = rx.intrabss_cnt;
5356 		tid_stats->rx_total[tid].msdu_cnt = rx.msdu_cnt;
5357 		tid_stats->rx_total[tid].mcast_msdu_cnt = rx.mcast_msdu_cnt;
5358 		tid_stats->rx_total[tid].bcast_msdu_cnt = rx.bcast_msdu_cnt;
5359 		qdf_mem_copy(&tid_stats->rx_total[tid].fail_cnt[0],
5360 			     &rx.fail_cnt[0], RX_MAX_DROP * sizeof(uint64_t));
5361 
5362 		dp_accumulate_tid_stats(pdev, tid, &tx, &rx, TID_DELAY_STATS);
5363 		/* Copy specific accumulated Tx delay stats */
5364 		qdf_mem_copy(&tid_stats->tx_total[tid].swq_delay,
5365 			     &tx.swq_delay, size);
5366 		qdf_mem_copy(&tid_stats->tx_total[tid].hwtx_delay,
5367 			     &tx.hwtx_delay, size);
5368 		qdf_mem_copy(&tid_stats->tx_total[tid].intfrm_delay,
5369 			     &tx.intfrm_delay, size);
5370 
5371 		/* Copy specific accumulated Rx delay stats */
5372 		qdf_mem_copy(&tid_stats->rx_total[tid].intfrm_delay,
5373 			     &rx.intfrm_delay, size);
5374 		qdf_mem_copy(&tid_stats->rx_total[tid].to_stack_delay,
5375 			     &rx.to_stack_delay, size);
5376 	}
5377 	for (tid = 0; tid < CDP_MAX_VOW_TID; tid++) {
5378 		dp_accumulate_tid_stats(pdev, tid, &tx, &rx,
5379 					TID_RX_ERROR_STATS);
5380 		/* Copy specific accumulated VOW Rx stats */
5381 		qdf_mem_copy(&tid_stats->rx_total[tid].reo_err,
5382 			     &rx.reo_err, sizeof(struct cdp_reo_error_stats));
5383 		qdf_mem_copy(&tid_stats->rx_total[tid].rxdma_err, &rx.rxdma_err,
5384 			     sizeof(struct cdp_rxdma_error_stats));
5385 	}
5386 	tid_stats->ingress_stack = pdev->stats.tid_stats.ingress_stack;
5387 	tid_stats->osif_drop = pdev->stats.tid_stats.osif_drop;
5388 
5389 	return QDF_STATUS_SUCCESS;
5390 }
5391 #else
5392 QDF_STATUS dp_pdev_get_tid_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
5393 				 struct cdp_tid_stats_intf *tid_stats)
5394 {
5395 	return QDF_STATUS_E_INVAL;
5396 }
5397 #endif
5398 
5399 #ifdef HW_TX_DELAY_STATS_ENABLE
5400 static void dp_vdev_print_tx_delay_stats(struct dp_vdev *vdev)
5401 {
5402 	struct cdp_delay_stats delay_stats;
5403 	struct cdp_tid_tx_stats *per_ring;
5404 	uint8_t tid, index;
5405 	uint64_t count = 0;
5406 	uint8_t ring_id;
5407 
5408 	if (!vdev)
5409 		return;
5410 
5411 	DP_PRINT_STATS("vdev_id: %d Per TID Delay Non-Zero Stats:\n",
5412 		       vdev->vdev_id);
5413 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
5414 		qdf_mem_zero(&delay_stats, sizeof(delay_stats));
5415 		for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) {
5416 			per_ring = &vdev->stats.tid_tx_stats[ring_id][tid];
5417 			dp_accumulate_delay_stats(&delay_stats,
5418 						  &per_ring->hwtx_delay);
5419 		}
5420 
5421 		DP_PRINT_STATS("Hardware Tx completion latency stats TID: %d",
5422 			       tid);
5423 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
5424 			count = delay_stats.delay_bucket[index];
5425 			if (count) {
5426 				DP_PRINT_STATS("%s:  Packets = %llu",
5427 					       dp_vow_str_fw_to_hw_delay(index),
5428 					       count);
5429 			}
5430 		}
5431 
5432 		DP_PRINT_STATS("Min = %u", delay_stats.min_delay);
5433 		DP_PRINT_STATS("Max = %u", delay_stats.max_delay);
5434 		DP_PRINT_STATS("Avg = %u\n", delay_stats.avg_delay);
5435 	}
5436 }
5437 
5438 void dp_pdev_print_tx_delay_stats(struct dp_soc *soc)
5439 {
5440 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, 0);
5441 	struct dp_vdev *vdev;
5442 	struct dp_vdev **vdev_array = NULL;
5443 	int index = 0, num_vdev = 0;
5444 
5445 	if (!pdev) {
5446 		dp_err("pdev is NULL");
5447 		return;
5448 	}
5449 
5450 	vdev_array =
5451 		qdf_mem_malloc(sizeof(struct dp_vdev *) * WLAN_PDEV_MAX_VDEVS);
5452 	if (!vdev_array)
5453 		return;
5454 
5455 	qdf_spin_lock_bh(&pdev->vdev_list_lock);
5456 	DP_PDEV_ITERATE_VDEV_LIST(pdev, vdev) {
5457 		if (dp_vdev_get_ref(soc, vdev, DP_MOD_ID_GENERIC_STATS))
5458 			continue;
5459 		vdev_array[index] = vdev;
5460 		index = index + 1;
5461 	}
5462 	qdf_spin_unlock_bh(&pdev->vdev_list_lock);
5463 
5464 	num_vdev = index;
5465 
5466 	for (index = 0; index < num_vdev; index++) {
5467 		vdev = vdev_array[index];
5468 		dp_vdev_print_tx_delay_stats(vdev);
5469 		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS);
5470 	}
5471 	qdf_mem_free(vdev_array);
5472 }
5473 
5474 /**
5475  * dp_reset_delay_stats() - reset delay stats
5476  * @per_ring: per ring structures from where stats need to be accumulated
5477  *
5478  * Return: void
5479  */
5480 static void dp_reset_delay_stats(struct cdp_delay_stats *per_ring)
5481 {
5482 	qdf_mem_zero(per_ring, sizeof(struct cdp_delay_stats));
5483 }
5484 
5485 /**
5486  * dp_vdev_init_tx_delay_stats() - Clear tx delay stats
5487  * @vdev: vdev handle
5488  *
5489  * Return: None
5490  */
5491 static void dp_vdev_init_tx_delay_stats(struct dp_vdev *vdev)
5492 {
5493 	struct cdp_tid_tx_stats *per_ring;
5494 	uint8_t tid;
5495 	uint8_t ring_id;
5496 
5497 	if (!vdev)
5498 		return;
5499 
5500 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
5501 		for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) {
5502 			per_ring = &vdev->stats.tid_tx_stats[ring_id][tid];
5503 			dp_reset_delay_stats(&per_ring->hwtx_delay);
5504 		}
5505 	}
5506 }
5507 
5508 void dp_pdev_clear_tx_delay_stats(struct dp_soc *soc)
5509 {
5510 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, 0);
5511 	struct dp_vdev *vdev;
5512 	struct dp_vdev **vdev_array = NULL;
5513 	int index = 0, num_vdev = 0;
5514 
5515 	if (!pdev) {
5516 		dp_err("pdev is NULL");
5517 		return;
5518 	}
5519 
5520 	vdev_array =
5521 		qdf_mem_malloc(sizeof(struct dp_vdev *) * WLAN_PDEV_MAX_VDEVS);
5522 	if (!vdev_array)
5523 		return;
5524 
5525 	qdf_spin_lock_bh(&pdev->vdev_list_lock);
5526 	DP_PDEV_ITERATE_VDEV_LIST(pdev, vdev) {
5527 		if (dp_vdev_get_ref(soc, vdev, DP_MOD_ID_GENERIC_STATS) !=
5528 		    QDF_STATUS_SUCCESS)
5529 			continue;
5530 		vdev_array[index] = vdev;
5531 		index = index + 1;
5532 	}
5533 	qdf_spin_unlock_bh(&pdev->vdev_list_lock);
5534 
5535 	num_vdev = index;
5536 
5537 	for (index = 0; index < num_vdev; index++) {
5538 		vdev = vdev_array[index];
5539 		dp_vdev_init_tx_delay_stats(vdev);
5540 		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS);
5541 	}
5542 	qdf_mem_free(vdev_array);
5543 }
5544 #endif
5545 
5546 void dp_print_soc_cfg_params(struct dp_soc *soc)
5547 {
5548 	struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx;
5549 	uint8_t index = 0, i = 0;
5550 	char ring_mask[DP_MAX_INT_CONTEXTS_STRING_LENGTH];
5551 	int num_of_int_contexts;
5552 
5553 	if (!soc) {
5554 		dp_err("Context is null");
5555 		return;
5556 	}
5557 
5558 	soc_cfg_ctx = soc->wlan_cfg_ctx;
5559 
5560 	if (!soc_cfg_ctx) {
5561 		dp_err("Context is null");
5562 		return;
5563 	}
5564 
5565 	num_of_int_contexts =
5566 			wlan_cfg_get_num_contexts(soc_cfg_ctx);
5567 
5568 	DP_PRINT_STATS("No. of interrupt contexts: %u",
5569 		       soc_cfg_ctx->num_int_ctxts);
5570 	DP_PRINT_STATS("Max clients: %u",
5571 		       soc_cfg_ctx->max_clients);
5572 	DP_PRINT_STATS("Max alloc size: %u ",
5573 		       soc_cfg_ctx->max_alloc_size);
5574 	DP_PRINT_STATS("Per pdev tx ring: %u ",
5575 		       soc_cfg_ctx->per_pdev_tx_ring);
5576 	DP_PRINT_STATS("Num tcl data rings: %u ",
5577 		       soc_cfg_ctx->num_tcl_data_rings);
5578 	DP_PRINT_STATS("Per pdev rx ring: %u ",
5579 		       soc_cfg_ctx->per_pdev_rx_ring);
5580 	DP_PRINT_STATS("Per pdev lmac ring: %u ",
5581 		       soc_cfg_ctx->per_pdev_lmac_ring);
5582 	DP_PRINT_STATS("Num of reo dest rings: %u ",
5583 		       soc_cfg_ctx->num_reo_dest_rings);
5584 	DP_PRINT_STATS("Num tx desc pool: %u ",
5585 		       soc_cfg_ctx->num_tx_desc_pool);
5586 	DP_PRINT_STATS("Num tx ext desc pool: %u ",
5587 		       soc_cfg_ctx->num_tx_ext_desc_pool);
5588 	DP_PRINT_STATS("Num tx desc: %u ",
5589 		       soc_cfg_ctx->num_tx_desc);
5590 	DP_PRINT_STATS("Num tx ext desc: %u ",
5591 		       soc_cfg_ctx->num_tx_ext_desc);
5592 	DP_PRINT_STATS("Htt packet type: %u ",
5593 		       soc_cfg_ctx->htt_packet_type);
5594 	DP_PRINT_STATS("Max peer_ids: %u ",
5595 		       soc_cfg_ctx->max_peer_id);
5596 	DP_PRINT_STATS("Tx ring size: %u ",
5597 		       soc_cfg_ctx->tx_ring_size);
5598 	DP_PRINT_STATS("Tx comp ring size: %u ",
5599 		       soc_cfg_ctx->tx_comp_ring_size);
5600 	DP_PRINT_STATS("Tx comp ring size nss: %u ",
5601 		       soc_cfg_ctx->tx_comp_ring_size_nss);
5602 	DP_PRINT_STATS("Int batch threshold tx: %u ",
5603 		       soc_cfg_ctx->int_batch_threshold_tx);
5604 	DP_PRINT_STATS("Int timer threshold tx: %u ",
5605 		       soc_cfg_ctx->int_timer_threshold_tx);
5606 	DP_PRINT_STATS("Int batch threshold rx: %u ",
5607 		       soc_cfg_ctx->int_batch_threshold_rx);
5608 	DP_PRINT_STATS("Int timer threshold rx: %u ",
5609 		       soc_cfg_ctx->int_timer_threshold_rx);
5610 	DP_PRINT_STATS("Int batch threshold other: %u ",
5611 		       soc_cfg_ctx->int_batch_threshold_other);
5612 	DP_PRINT_STATS("Int timer threshold other: %u ",
5613 		       soc_cfg_ctx->int_timer_threshold_other);
5614 	DP_PRINT_STATS("Int batch threshold ppe2tcl: %u ",
5615 		       soc_cfg_ctx->int_batch_threshold_ppe2tcl);
5616 	DP_PRINT_STATS("Int timer threshold ppe2tcl: %u ",
5617 		       soc_cfg_ctx->int_timer_threshold_ppe2tcl);
5618 
5619 	DP_PRINT_STATS("DP NAPI scale factor: %u ",
5620 		       soc_cfg_ctx->napi_scale_factor);
5621 
5622 	for (i = 0; i < num_of_int_contexts; i++) {
5623 		index += qdf_snprint(&ring_mask[index],
5624 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5625 				     " %d",
5626 				     soc_cfg_ctx->int_tx_ring_mask[i]);
5627 	}
5628 
5629 	DP_PRINT_STATS("Tx ring mask (0-%d):%s",
5630 		       num_of_int_contexts, ring_mask);
5631 
5632 	index = 0;
5633 	for (i = 0; i < num_of_int_contexts; i++) {
5634 		index += qdf_snprint(&ring_mask[index],
5635 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5636 				     " %d",
5637 				     soc_cfg_ctx->int_rx_ring_mask[i]);
5638 	}
5639 
5640 	DP_PRINT_STATS("Rx ring mask (0-%d):%s",
5641 		       num_of_int_contexts, ring_mask);
5642 
5643 	index = 0;
5644 	for (i = 0; i < num_of_int_contexts; i++) {
5645 		index += qdf_snprint(&ring_mask[index],
5646 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5647 				     " %d",
5648 				     soc_cfg_ctx->int_rx_mon_ring_mask[i]);
5649 	}
5650 
5651 	DP_PRINT_STATS("Rx mon ring mask (0-%d):%s",
5652 		       num_of_int_contexts, ring_mask);
5653 
5654 	index = 0;
5655 	for (i = 0; i < num_of_int_contexts; i++) {
5656 		index += qdf_snprint(&ring_mask[index],
5657 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5658 				     " %d",
5659 				     soc_cfg_ctx->int_rx_err_ring_mask[i]);
5660 	}
5661 
5662 	DP_PRINT_STATS("Rx err ring mask (0-%d):%s",
5663 		       num_of_int_contexts, ring_mask);
5664 
5665 	index = 0;
5666 	for (i = 0; i < num_of_int_contexts; i++) {
5667 		index += qdf_snprint(&ring_mask[index],
5668 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5669 				     " %d",
5670 				     soc_cfg_ctx->int_rx_wbm_rel_ring_mask[i]);
5671 	}
5672 
5673 	DP_PRINT_STATS("Rx wbm rel ring mask (0-%d):%s",
5674 		       num_of_int_contexts, ring_mask);
5675 
5676 	index = 0;
5677 	for (i = 0; i < num_of_int_contexts; i++) {
5678 		index += qdf_snprint(&ring_mask[index],
5679 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5680 				     " %d",
5681 				     soc_cfg_ctx->int_reo_status_ring_mask[i]);
5682 	}
5683 
5684 	DP_PRINT_STATS("Reo ring mask (0-%d):%s",
5685 		       num_of_int_contexts, ring_mask);
5686 
5687 	index = 0;
5688 	for (i = 0; i < num_of_int_contexts; i++) {
5689 		index += qdf_snprint(&ring_mask[index],
5690 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5691 				     " %d",
5692 				     soc_cfg_ctx->int_rxdma2host_ring_mask[i]);
5693 	}
5694 
5695 	DP_PRINT_STATS("Rxdma2host ring mask (0-%d):%s",
5696 		       num_of_int_contexts, ring_mask);
5697 
5698 	index = 0;
5699 	for (i = 0; i < num_of_int_contexts; i++) {
5700 		index += qdf_snprint(&ring_mask[index],
5701 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5702 				     " %d",
5703 				     soc_cfg_ctx->int_host2rxdma_ring_mask[i]);
5704 	}
5705 
5706 	DP_PRINT_STATS("Host2rxdma ring mask (0-%d):%s",
5707 		       num_of_int_contexts, ring_mask);
5708 
5709 	DP_PRINT_STATS("Rx hash: %u ",
5710 		       soc_cfg_ctx->rx_hash);
5711 	DP_PRINT_STATS("Tso enabled: %u ",
5712 		       soc_cfg_ctx->tso_enabled);
5713 	DP_PRINT_STATS("Lro enabled: %u ",
5714 		       soc_cfg_ctx->lro_enabled);
5715 	DP_PRINT_STATS("Sg enabled: %u ",
5716 		       soc_cfg_ctx->sg_enabled);
5717 	DP_PRINT_STATS("Gro enabled: %u ",
5718 		       soc_cfg_ctx->gro_enabled);
5719 	DP_PRINT_STATS("TC based dynamic GRO: %u ",
5720 		       soc_cfg_ctx->tc_based_dynamic_gro);
5721 	DP_PRINT_STATS("TC ingress prio: %u ",
5722 		       soc_cfg_ctx->tc_ingress_prio);
5723 	DP_PRINT_STATS("rawmode enabled: %u ",
5724 		       soc_cfg_ctx->rawmode_enabled);
5725 	DP_PRINT_STATS("peer flow ctrl enabled: %u ",
5726 		       soc_cfg_ctx->peer_flow_ctrl_enabled);
5727 	DP_PRINT_STATS("napi enabled: %u ",
5728 		       soc_cfg_ctx->napi_enabled);
5729 	DP_PRINT_STATS("P2P Tcp Udp checksum offload: %u ",
5730 		       soc_cfg_ctx->p2p_tcp_udp_checksumoffload);
5731 	DP_PRINT_STATS("NAN Tcp Udp checksum offload: %u ",
5732 		       soc_cfg_ctx->nan_tcp_udp_checksumoffload);
5733 	DP_PRINT_STATS("Tcp Udp checksum offload: %u ",
5734 		       soc_cfg_ctx->tcp_udp_checksumoffload);
5735 	DP_PRINT_STATS("Defrag timeout check: %u ",
5736 		       soc_cfg_ctx->defrag_timeout_check);
5737 	DP_PRINT_STATS("Rx defrag min timeout: %u ",
5738 		       soc_cfg_ctx->rx_defrag_min_timeout);
5739 	DP_PRINT_STATS("WBM release ring: %u ",
5740 		       soc_cfg_ctx->wbm_release_ring);
5741 	DP_PRINT_STATS("TCL CMD_CREDIT ring: %u ",
5742 		       soc_cfg_ctx->tcl_cmd_credit_ring);
5743 	DP_PRINT_STATS("TCL Status ring: %u ",
5744 		       soc_cfg_ctx->tcl_status_ring);
5745 	DP_PRINT_STATS("REO Destination ring: %u ",
5746 		       soc_cfg_ctx->reo_dst_ring_size);
5747 	DP_PRINT_STATS("REO Reinject ring: %u ",
5748 		       soc_cfg_ctx->reo_reinject_ring);
5749 	DP_PRINT_STATS("RX release ring: %u ",
5750 		       soc_cfg_ctx->rx_release_ring);
5751 	DP_PRINT_STATS("REO Exception ring: %u ",
5752 		       soc_cfg_ctx->reo_exception_ring);
5753 	DP_PRINT_STATS("REO CMD ring: %u ",
5754 		       soc_cfg_ctx->reo_cmd_ring);
5755 	DP_PRINT_STATS("REO STATUS ring: %u ",
5756 		       soc_cfg_ctx->reo_status_ring);
5757 	DP_PRINT_STATS("RXDMA refill ring: %u ",
5758 		       soc_cfg_ctx->rxdma_refill_ring);
5759 	DP_PRINT_STATS("TX_desc limit_0: %u ",
5760 		       soc_cfg_ctx->tx_desc_limit_0);
5761 	DP_PRINT_STATS("TX_desc limit_1: %u ",
5762 		       soc_cfg_ctx->tx_desc_limit_1);
5763 	DP_PRINT_STATS("TX_desc limit_2: %u ",
5764 		       soc_cfg_ctx->tx_desc_limit_2);
5765 	DP_PRINT_STATS("TX device limit: %u ",
5766 		       soc_cfg_ctx->tx_device_limit);
5767 	DP_PRINT_STATS("TX sw internode queue: %u ",
5768 		       soc_cfg_ctx->tx_sw_internode_queue);
5769 	DP_PRINT_STATS("RXDMA err dst ring: %u ",
5770 		       soc_cfg_ctx->rxdma_err_dst_ring);
5771 	DP_PRINT_STATS("RX Flow Tag Enabled: %u ",
5772 		       soc_cfg_ctx->is_rx_flow_tag_enabled);
5773 	DP_PRINT_STATS("RX Flow Search Table Size (# of entries): %u ",
5774 		       soc_cfg_ctx->rx_flow_search_table_size);
5775 	DP_PRINT_STATS("RX Flow Search Table Per PDev : %u ",
5776 		       soc_cfg_ctx->is_rx_flow_search_table_per_pdev);
5777 	DP_PRINT_STATS("Rx desc pool size: %u ",
5778 		       soc_cfg_ctx->rx_sw_desc_num);
5779 }
5780 
5781 void
5782 dp_print_pdev_cfg_params(struct dp_pdev *pdev)
5783 {
5784 	struct wlan_cfg_dp_pdev_ctxt *pdev_cfg_ctx;
5785 
5786 	if (!pdev) {
5787 		dp_err("Context is null");
5788 		return;
5789 	}
5790 
5791 	pdev_cfg_ctx = pdev->wlan_cfg_ctx;
5792 
5793 	if (!pdev_cfg_ctx) {
5794 		dp_err("Context is null");
5795 		return;
5796 	}
5797 
5798 	DP_PRINT_STATS("Rx dma buf ring size: %d ",
5799 		       pdev_cfg_ctx->rx_dma_buf_ring_size);
5800 	DP_PRINT_STATS("DMA Mon buf ring size: %d ",
5801 		       pdev_cfg_ctx->dma_mon_buf_ring_size);
5802 	DP_PRINT_STATS("DMA Mon dest ring size: %d ",
5803 		       pdev_cfg_ctx->dma_rx_mon_dest_ring_size);
5804 	DP_PRINT_STATS("DMA Mon status ring size: %d ",
5805 		       pdev_cfg_ctx->dma_mon_status_ring_size);
5806 	DP_PRINT_STATS("Rxdma monitor desc ring: %d",
5807 		       pdev_cfg_ctx->rxdma_monitor_desc_ring);
5808 	DP_PRINT_STATS("Num mac rings: %d ",
5809 		       pdev_cfg_ctx->num_mac_rings);
5810 }
5811 
5812 void
5813 dp_print_ring_stat_from_hal(struct dp_soc *soc,  struct dp_srng *srng,
5814 			    enum hal_ring_type ring_type)
5815 {
5816 	uint32_t tailp;
5817 	uint32_t headp;
5818 	int32_t hw_headp = -1;
5819 	int32_t hw_tailp = -1;
5820 	uint32_t ring_usage;
5821 	const char *ring_name;
5822 
5823 	if (soc && srng && srng->hal_srng) {
5824 		ring_name = dp_srng_get_str_from_hal_ring_type(ring_type);
5825 		hal_get_sw_hptp(soc->hal_soc, srng->hal_srng, &tailp, &headp);
5826 		ring_usage = hal_get_ring_usage(srng->hal_srng,
5827 						ring_type, &headp, &tailp);
5828 
5829 		DP_PRINT_STATS("%s:SW: Head = %d Tail = %d Ring Usage = %u",
5830 			       ring_name, headp, tailp, ring_usage);
5831 
5832 		hal_get_hw_hptp(soc->hal_soc, srng->hal_srng, &hw_headp,
5833 				&hw_tailp, ring_type);
5834 		ring_usage = 0;
5835 		if (hw_headp >= 0 && tailp >= 0)
5836 			ring_usage =
5837 				hal_get_ring_usage(
5838 					srng->hal_srng, ring_type,
5839 					&hw_headp, &hw_tailp);
5840 		DP_PRINT_STATS("%s:HW: Head = %d Tail = %d Ring Usage = %u",
5841 			       ring_name, hw_headp, hw_tailp, ring_usage);
5842 	}
5843 }
5844 
5845 qdf_export_symbol(dp_print_ring_stat_from_hal);
5846 
5847 #ifdef FEATURE_TSO_STATS
5848 /**
5849  * dp_print_tso_seg_stats - tso segment stats
5850  * @pdev: pdev handle
5851  * @id: tso packet id
5852  *
5853  * Return: None
5854  */
5855 static void dp_print_tso_seg_stats(struct dp_pdev *pdev, uint32_t id)
5856 {
5857 	uint8_t num_seg;
5858 	uint32_t segid;
5859 
5860 	/* TSO LEVEL 2 - SEGMENT INFO */
5861 	num_seg = pdev->stats.tso_stats.tso_info.tso_packet_info[id].num_seg;
5862 	for (segid = 0; segid < CDP_MAX_TSO_SEGMENTS && segid < num_seg; segid++) {
5863 		DP_PRINT_STATS(
5864 			  "Segment id:[%u] fragments: %u | Segment Length %u | TCP Seq no.: %u | ip_id: %u",
5865 			  segid,
5866 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5867 			  .tso_seg[segid].num_frags,
5868 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5869 			  .tso_seg[segid].total_len,
5870 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5871 			  .tso_seg[segid].tso_flags.tcp_seq_num,
5872 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5873 			  .tso_seg[segid].tso_flags.ip_id);
5874 		DP_PRINT_STATS(
5875 			  "fin: %u syn: %u rst: %u psh: %u ack: %u urg: %u ece: %u cwr: %u ns: %u",
5876 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5877 			  .tso_seg[segid].tso_flags.fin,
5878 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5879 			  .tso_seg[segid].tso_flags.syn,
5880 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5881 			  .tso_seg[segid].tso_flags.rst,
5882 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5883 			  .tso_seg[segid].tso_flags.psh,
5884 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5885 			  .tso_seg[segid].tso_flags.ack,
5886 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5887 			  .tso_seg[segid].tso_flags.urg,
5888 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5889 			  .tso_seg[segid].tso_flags.ece,
5890 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5891 			  .tso_seg[segid].tso_flags.cwr,
5892 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5893 			  .tso_seg[segid].tso_flags.ns);
5894 	}
5895 }
5896 #else
5897 static inline
5898 void dp_print_tso_seg_stats(struct dp_pdev *pdev, uint32_t id)
5899 {
5900 }
5901 #endif /* FEATURE_TSO_STATS */
5902 
5903 /**
5904  * dp_print_mon_ring_stat_from_hal() - Print stat for monitor rings based
5905  *					on target
5906  * @pdev: physical device handle
5907  * @mac_id: mac id
5908  *
5909  * Return: void
5910  */
5911 static inline
5912 void dp_print_mon_ring_stat_from_hal(struct dp_pdev *pdev, uint8_t mac_id)
5913 {
5914 	if (pdev->soc->wlan_cfg_ctx->rxdma1_enable) {
5915 		dp_print_ring_stat_from_hal(pdev->soc,
5916 			&pdev->soc->rxdma_mon_buf_ring[mac_id],
5917 			RXDMA_MONITOR_BUF);
5918 		dp_print_ring_stat_from_hal(pdev->soc,
5919 			&pdev->soc->rxdma_mon_dst_ring[mac_id],
5920 			RXDMA_MONITOR_DST);
5921 		dp_print_ring_stat_from_hal(pdev->soc,
5922 			&pdev->soc->rxdma_mon_desc_ring[mac_id],
5923 			RXDMA_MONITOR_DESC);
5924 	}
5925 
5926 	dp_print_ring_stat_from_hal(pdev->soc,
5927 				    &pdev->soc->rxdma_mon_status_ring[mac_id],
5928 					RXDMA_MONITOR_STATUS);
5929 }
5930 
5931 void
5932 dp_print_ring_stats(struct dp_pdev *pdev)
5933 {
5934 	struct dp_soc *soc = pdev->soc;
5935 	uint32_t i;
5936 	int mac_id;
5937 	int lmac_id;
5938 
5939 	if (hif_rtpm_get(HIF_RTPM_GET_SYNC, HIF_RTPM_ID_DP_RING_STATS))
5940 		return;
5941 
5942 	dp_print_ring_stat_from_hal(pdev->soc,
5943 				    &pdev->soc->wbm_idle_link_ring,
5944 				    WBM_IDLE_LINK);
5945 	dp_print_ring_stat_from_hal(pdev->soc,
5946 				    &pdev->soc->reo_exception_ring,
5947 				    REO_EXCEPTION);
5948 	dp_print_ring_stat_from_hal(pdev->soc,
5949 				    &pdev->soc->reo_reinject_ring,
5950 				    REO_REINJECT);
5951 	dp_print_ring_stat_from_hal(pdev->soc,
5952 				    &pdev->soc->reo_cmd_ring,
5953 				    REO_CMD);
5954 	dp_print_ring_stat_from_hal(pdev->soc,
5955 				    &pdev->soc->reo_status_ring,
5956 				    REO_STATUS);
5957 	dp_print_ring_stat_from_hal(pdev->soc,
5958 				    &pdev->soc->rx_rel_ring,
5959 				    WBM2SW_RELEASE);
5960 	dp_print_ring_stat_from_hal(pdev->soc,
5961 				    &pdev->soc->tcl_cmd_credit_ring,
5962 				    TCL_CMD_CREDIT);
5963 	dp_print_ring_stat_from_hal(pdev->soc,
5964 				    &pdev->soc->tcl_status_ring,
5965 				    TCL_STATUS);
5966 	dp_print_ring_stat_from_hal(pdev->soc,
5967 				    &pdev->soc->wbm_desc_rel_ring,
5968 				    SW2WBM_RELEASE);
5969 	for (i = 0; i < MAX_REO_DEST_RINGS; i++)
5970 		dp_print_ring_stat_from_hal(pdev->soc,
5971 					    &pdev->soc->reo_dest_ring[i],
5972 					    REO_DST);
5973 
5974 	for (i = 0; i < pdev->soc->num_tcl_data_rings; i++)
5975 		dp_print_ring_stat_from_hal(pdev->soc,
5976 					    &pdev->soc->tcl_data_ring[i],
5977 					    TCL_DATA);
5978 	for (i = 0; i < pdev->soc->num_tcl_data_rings; i++)
5979 		dp_print_ring_stat_from_hal(pdev->soc,
5980 					    &pdev->soc->tx_comp_ring[i],
5981 					    WBM2SW_RELEASE);
5982 
5983 	if (pdev->soc->features.dmac_cmn_src_rxbuf_ring_enabled) {
5984 		for (i = 0; i < pdev->soc->num_rx_refill_buf_rings; i++) {
5985 			dp_print_ring_stat_from_hal
5986 				(pdev->soc, &pdev->soc->rx_refill_buf_ring[i],
5987 				 RXDMA_BUF);
5988 		}
5989 	} else {
5990 		lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc, 0,
5991 						     pdev->pdev_id);
5992 		dp_print_ring_stat_from_hal
5993 			(pdev->soc, &pdev->soc->rx_refill_buf_ring[lmac_id],
5994 			 RXDMA_BUF);
5995 	}
5996 
5997 	dp_print_ring_stat_from_hal(pdev->soc,
5998 				    &pdev->rx_refill_buf_ring2,
5999 				    RXDMA_BUF);
6000 
6001 	for (i = 0; i < MAX_RX_MAC_RINGS; i++)
6002 		dp_print_ring_stat_from_hal(pdev->soc,
6003 					    &pdev->rx_mac_buf_ring[i],
6004 					    RXDMA_BUF);
6005 
6006 	for (mac_id = 0;
6007 	     mac_id  < soc->wlan_cfg_ctx->num_rxdma_status_rings_per_pdev;
6008 	     mac_id++) {
6009 		lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc,
6010 						     mac_id, pdev->pdev_id);
6011 
6012 		dp_print_mon_ring_stat_from_hal(pdev, lmac_id);
6013 	}
6014 
6015 	for (i = 0; i < soc->wlan_cfg_ctx->num_rxdma_dst_rings_per_pdev; i++) {
6016 		lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc,
6017 						     i, pdev->pdev_id);
6018 
6019 		dp_print_ring_stat_from_hal(pdev->soc,
6020 					    &pdev->soc->rxdma_err_dst_ring
6021 					    [lmac_id],
6022 					    RXDMA_DST);
6023 	}
6024 
6025 	dp_print_txmon_ring_stat_from_hal(pdev);
6026 
6027 #ifdef WLAN_SUPPORT_PPEDS
6028 	if (pdev->soc->arch_ops.dp_txrx_ppeds_rings_status)
6029 		pdev->soc->arch_ops.dp_txrx_ppeds_rings_status(pdev->soc);
6030 #endif
6031 	hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_DP_RING_STATS);
6032 }
6033 
6034 /**
6035  * dp_print_common_rates_info(): Print common rate for tx or rx
6036  * @pkt_type_array: rate type array contains rate info
6037  *
6038  * Return: void
6039  */
6040 static inline void
6041 dp_print_common_rates_info(struct cdp_pkt_type *pkt_type_array)
6042 {
6043 	uint8_t mcs, pkt_type;
6044 
6045 	DP_PRINT_STATS("MSDU Count");
6046 	for (pkt_type = 0; pkt_type < DOT11_MAX; pkt_type++) {
6047 		for (mcs = 0; mcs < MAX_MCS; mcs++) {
6048 			if (!cdp_rate_string[pkt_type][mcs].valid)
6049 				continue;
6050 
6051 			DP_PRINT_STATS("	%s = %d",
6052 				       cdp_rate_string[pkt_type][mcs].mcs_type,
6053 				       pkt_type_array[pkt_type].mcs_count[mcs]);
6054 		}
6055 
6056 		DP_PRINT_STATS("\n");
6057 	}
6058 }
6059 
6060 /**
6061  * dp_print_common_ppdu_rates_info(): Print ppdu rate for tx or rx
6062  * @pkt_type_array: rate type array contains rate info
6063  * @pkt_type: packet type
6064  *
6065  * Return: void
6066  */
6067 #ifdef WLAN_FEATURE_11BE
6068 static inline void
6069 dp_print_common_ppdu_rates_info(struct cdp_pkt_type *pkt_type_array,
6070 				enum cdp_packet_type pkt_type)
6071 {
6072 	uint8_t mcs;
6073 
6074 	DP_PRINT_STATS("PPDU Count");
6075 	for (mcs = 0; mcs < MAX_MCS; mcs++) {
6076 		if (pkt_type == DOT11_AX) {
6077 			if (!dp_ppdu_rate_string[0][mcs].valid)
6078 				continue;
6079 
6080 			DP_PRINT_STATS("	%s = %d",
6081 				       dp_ppdu_rate_string[0][mcs].mcs_type,
6082 				       pkt_type_array->mcs_count[mcs]);
6083 		} else if (pkt_type == DOT11_BE) {
6084 			if (!dp_ppdu_rate_string[1][mcs].valid)
6085 				continue;
6086 
6087 			DP_PRINT_STATS("	%s = %d",
6088 				       dp_ppdu_rate_string[1][mcs].mcs_type,
6089 				       pkt_type_array->mcs_count[mcs]);
6090 		}
6091 	}
6092 
6093 	DP_PRINT_STATS("\n");
6094 }
6095 #else
6096 static inline void
6097 dp_print_common_ppdu_rates_info(struct cdp_pkt_type *pkt_type_array,
6098 				enum cdp_packet_type pkt_type)
6099 {
6100 	uint8_t mcs;
6101 
6102 	DP_PRINT_STATS("PPDU Count");
6103 	for (mcs = 0; mcs < MAX_MCS; mcs++) {
6104 		if (!dp_ppdu_rate_string[0][mcs].valid)
6105 			continue;
6106 
6107 		DP_PRINT_STATS("	%s = %d",
6108 			       dp_ppdu_rate_string[0][mcs].mcs_type,
6109 			       pkt_type_array->mcs_count[mcs]);
6110 	}
6111 
6112 	DP_PRINT_STATS("\n");
6113 }
6114 #endif
6115 
6116 /**
6117  * dp_print_mu_be_ppdu_rates_info(): Print mu be rate for tx or rx
6118  * @pkt_type_array: rate type array contains rate info
6119  *
6120  * Return: void
6121  */
6122 #ifdef WLAN_FEATURE_11BE
6123 static inline void
6124 dp_print_mu_be_ppdu_rates_info(struct cdp_pkt_type *pkt_type_array)
6125 {
6126 	uint8_t mcs, pkt_type;
6127 
6128 	DP_PRINT_STATS("PPDU Count");
6129 	for (pkt_type = 0; pkt_type < TXRX_TYPE_MU_MAX; pkt_type++) {
6130 		for (mcs = 0; mcs < MAX_MCS; mcs++) {
6131 			if (!dp_mu_be_rate_string[pkt_type][mcs].valid)
6132 				continue;
6133 
6134 			DP_PRINT_STATS("	%s = %d",
6135 				       dp_mu_be_rate_string[pkt_type][mcs].mcs_type,
6136 				       pkt_type_array[pkt_type].mcs_count[mcs]);
6137 		}
6138 
6139 		DP_PRINT_STATS("\n");
6140 	}
6141 }
6142 #endif
6143 
6144 static inline void
6145 dp_print_mu_ppdu_rates_info(struct cdp_rx_mu *rx_mu)
6146 {
6147 	uint8_t mcs, pkt_type;
6148 
6149 	DP_PRINT_STATS("PPDU Count");
6150 	for (pkt_type = 0; pkt_type < TXRX_TYPE_MU_MAX; pkt_type++) {
6151 		for (mcs = 0; mcs < MAX_MCS; mcs++) {
6152 			if (!dp_mu_rate_string[pkt_type][mcs].valid)
6153 				continue;
6154 
6155 			DP_PRINT_STATS("	%s = %d",
6156 				dp_mu_rate_string[pkt_type][mcs].mcs_type,
6157 				rx_mu[pkt_type].ppdu.mcs_count[mcs]);
6158 		}
6159 
6160 		DP_PRINT_STATS("\n");
6161 	}
6162 }
6163 
6164 #ifdef WLAN_FEATURE_11BE
6165 static inline void dp_print_rx_bw_stats(struct dp_pdev *pdev)
6166 {
6167 	DP_PRINT_STATS("BW Counts = 20MHz %d, 40MHz %d, 80MHz %d, 160MHz %d, 320MHz %d",
6168 		       pdev->stats.rx.bw[0], pdev->stats.rx.bw[1],
6169 		       pdev->stats.rx.bw[2], pdev->stats.rx.bw[3],
6170 		       pdev->stats.rx.bw[4]);
6171 }
6172 
6173 static inline void dp_print_tx_bw_stats(struct dp_pdev *pdev)
6174 {
6175 	DP_PRINT_STATS("BW Counts = 20MHz %d, 40MHz %d, 80MHz %d, 160MHz %d, 320MHz %d",
6176 		       pdev->stats.tx.bw[0], pdev->stats.tx.bw[1],
6177 		       pdev->stats.tx.bw[2], pdev->stats.tx.bw[3],
6178 		       pdev->stats.tx.bw[4]);
6179 }
6180 #else
6181 static inline void dp_print_rx_bw_stats(struct dp_pdev *pdev)
6182 {
6183 	DP_PRINT_STATS("BW Counts = 20MHz %d, 40MHz %d, 80MHz %d, 160MHz %d",
6184 		       pdev->stats.rx.bw[0], pdev->stats.rx.bw[1],
6185 		       pdev->stats.rx.bw[2], pdev->stats.rx.bw[3]);
6186 }
6187 
6188 static inline void dp_print_tx_bw_stats(struct dp_pdev *pdev)
6189 {
6190 	DP_PRINT_STATS("BW Counts = 20MHz %d, 40MHz %d, 80MHz %d, 160MHz %d",
6191 		       pdev->stats.tx.bw[0], pdev->stats.tx.bw[1],
6192 		       pdev->stats.tx.bw[2], pdev->stats.tx.bw[3]);
6193 }
6194 #endif
6195 
6196 void dp_print_rx_rates(struct dp_vdev *vdev)
6197 {
6198 	struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev;
6199 	uint8_t i;
6200 	uint8_t index = 0;
6201 	char nss[DP_NSS_LENGTH];
6202 
6203 	DP_PRINT_STATS("Rx Rate Info:\n");
6204 	dp_print_common_rates_info(pdev->stats.rx.pkt_type);
6205 
6206 	index = 0;
6207 	for (i = 0; i < SS_COUNT; i++) {
6208 		index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index,
6209 				     " %d", pdev->stats.rx.nss[i]);
6210 	}
6211 	DP_PRINT_STATS("NSS(1-8) = %s",
6212 		       nss);
6213 
6214 	DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
6215 		       pdev->stats.rx.sgi_count[0],
6216 		       pdev->stats.rx.sgi_count[1],
6217 		       pdev->stats.rx.sgi_count[2],
6218 		       pdev->stats.rx.sgi_count[3]);
6219 
6220 	dp_print_rx_bw_stats(pdev);
6221 
6222 	DP_PRINT_STATS("Reception Type ="
6223 		       "SU: %d MU_MIMO:%d MU_OFDMA:%d MU_OFDMA_MIMO:%d",
6224 		       pdev->stats.rx.reception_type[0],
6225 		       pdev->stats.rx.reception_type[1],
6226 		       pdev->stats.rx.reception_type[2],
6227 		       pdev->stats.rx.reception_type[3]);
6228 	DP_PRINT_STATS("Aggregation:\n");
6229 	DP_PRINT_STATS("Number of Msdu's Part of Ampdus = %d",
6230 		       pdev->stats.rx.ampdu_cnt);
6231 	DP_PRINT_STATS("Number of Msdu's With No Mpdu Level Aggregation : %d",
6232 		       pdev->stats.rx.non_ampdu_cnt);
6233 	DP_PRINT_STATS("Number of Msdu's Part of Amsdu: %d",
6234 		       pdev->stats.rx.amsdu_cnt);
6235 	DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation: %d",
6236 		       pdev->stats.rx.non_amsdu_cnt);
6237 }
6238 
6239 void dp_print_tx_rates(struct dp_vdev *vdev)
6240 {
6241 	struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev;
6242 
6243 	DP_PRINT_STATS("Tx Rate Info:\n");
6244 	dp_print_common_rates_info(pdev->stats.tx.pkt_type);
6245 
6246 	DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
6247 		       pdev->stats.tx.sgi_count[0],
6248 		       pdev->stats.tx.sgi_count[1],
6249 		       pdev->stats.tx.sgi_count[2],
6250 		       pdev->stats.tx.sgi_count[3]);
6251 
6252 	dp_print_tx_bw_stats(pdev);
6253 
6254 	DP_PRINT_STATS("OFDMA = %d", pdev->stats.tx.ofdma);
6255 	DP_PRINT_STATS("STBC = %d", pdev->stats.tx.stbc);
6256 	DP_PRINT_STATS("LDPC = %d", pdev->stats.tx.ldpc);
6257 	DP_PRINT_STATS("Retries = %d", pdev->stats.tx.retries);
6258 	DP_PRINT_STATS("Last ack rssi = %d\n", pdev->stats.tx.last_ack_rssi);
6259 	DP_PRINT_STATS("Number of PPDU's with Punctured Preamble = %d",
6260 			   pdev->stats.tx.pream_punct_cnt);
6261 
6262 	DP_PRINT_STATS("Aggregation:\n");
6263 	DP_PRINT_STATS("Number of Msdu's Part of Ampdus = %d",
6264 		       pdev->stats.tx.ampdu_cnt);
6265 	DP_PRINT_STATS("Number of Msdu's With No Mpdu Level Aggregation : %d",
6266 		       pdev->stats.tx.non_ampdu_cnt);
6267 	DP_PRINT_STATS("Number of Msdu's Part of Amsdu = %d",
6268 		       pdev->stats.tx.amsdu_cnt);
6269 	DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation = %d",
6270 		       pdev->stats.tx.non_amsdu_cnt);
6271 }
6272 
6273 /**
6274  * dp_print_nss(): Print nss count
6275  * @nss: printable nss count array
6276  * @pnss: nss count array
6277  * @ss_count: number of nss
6278  *
6279  * Return: void
6280  */
6281 static void dp_print_nss(char *nss, uint32_t *pnss, uint32_t ss_count)
6282 {
6283 	uint32_t index;
6284 	uint8_t i;
6285 
6286 	index = 0;
6287 	for (i = 0; i < ss_count; i++) {
6288 		index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index,
6289 				     " %d", *(pnss + i));
6290 	}
6291 }
6292 
6293 /**
6294  * dp_print_jitter_stats(): Print per-tid jitter stats
6295  * @peer: DP peer object
6296  * @pdev: DP pdev object
6297  *
6298  * Return: void
6299  */
6300 #ifdef WLAN_PEER_JITTER
6301 static void dp_print_jitter_stats(struct dp_peer *peer, struct dp_pdev *pdev)
6302 {
6303 	uint8_t tid = 0;
6304 
6305 	if (!pdev || !wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx))
6306 		return;
6307 
6308 	if (!peer->txrx_peer || !peer->txrx_peer->jitter_stats)
6309 		return;
6310 
6311 	DP_PRINT_STATS("Per TID Tx HW Enqueue-Comp Jitter Stats:\n");
6312 	for (tid = 0; tid < qdf_min(CDP_DATA_TID_MAX, DP_MAX_TIDS); tid++) {
6313 		struct cdp_peer_tid_stats *rx_tid =
6314 					&peer->txrx_peer->jitter_stats[tid];
6315 
6316 		DP_PRINT_STATS("Node tid = %d\n"
6317 				"Average Jiiter            : %u (us)\n"
6318 				"Average Delay             : %u (us)\n"
6319 				"Total Average error count : %llu\n"
6320 				"Total Success Count       : %llu\n"
6321 				"Total Drop                : %llu\n",
6322 				tid,
6323 				rx_tid->tx_avg_jitter,
6324 				rx_tid->tx_avg_delay,
6325 				rx_tid->tx_avg_err,
6326 				rx_tid->tx_total_success,
6327 				rx_tid->tx_drop);
6328 	}
6329 }
6330 #else
6331 static void dp_print_jitter_stats(struct dp_peer *peer, struct dp_pdev *pdev)
6332 {
6333 }
6334 #endif /* WLAN_PEER_JITTER */
6335 
6336 #ifdef QCA_PEER_EXT_STATS
6337 /**
6338  * dp_print_hist_stats() - Print delay histogram
6339  * @hstats: Histogram stats
6340  * @hist_type: histogram type
6341  *
6342  * Return: void
6343  */
6344 static void dp_print_hist_stats(struct cdp_hist_stats *hstats,
6345 				enum cdp_hist_types hist_type)
6346 {
6347 	uint8_t index = 0;
6348 	uint64_t count = 0;
6349 	bool hist_delay_data = false;
6350 
6351 	for (index = 0; index < CDP_HIST_BUCKET_MAX; index++) {
6352 		count = hstats->hist.freq[index];
6353 		if (!count)
6354 			continue;
6355 		hist_delay_data = true;
6356 		if (hist_type == CDP_HIST_TYPE_SW_ENQEUE_DELAY)
6357 			DP_PRINT_STATS("%s:  Packets = %llu",
6358 				       dp_vow_str_sw_enq_delay(index),
6359 				       count);
6360 		else if (hist_type == CDP_HIST_TYPE_HW_COMP_DELAY)
6361 			DP_PRINT_STATS("%s:  Packets = %llu",
6362 				       dp_vow_str_fw_to_hw_delay(index),
6363 				       count);
6364 		else if (hist_type == CDP_HIST_TYPE_REAP_STACK)
6365 			DP_PRINT_STATS("%s:  Packets = %llu",
6366 				       dp_vow_str_intfrm_delay(index),
6367 				       count);
6368 	}
6369 
6370 	/*
6371 	 * If none of the buckets have any packets,
6372 	 * there is no need to display the stats.
6373 	 */
6374 	if (hist_delay_data) {
6375 		DP_PRINT_STATS("Min = %u", hstats->min);
6376 		DP_PRINT_STATS("Max = %u", hstats->max);
6377 		DP_PRINT_STATS("Avg = %u\n", hstats->avg);
6378 	}
6379 }
6380 
6381 #ifdef CONFIG_SAWF
6382 /**
6383  * dp_accumulate_delay_avg_stats(): Accumulate the delay average stats
6384  * @stats: cdp_delay_tid stats
6385  * @dst_stats: Destination delay Tx stats
6386  * @tid: TID value
6387  *
6388  * Return: void
6389  */
6390 static void dp_accumulate_delay_avg_stats(struct cdp_delay_tid_stats stats[]
6391 					  [CDP_MAX_TXRX_CTX],
6392 					  struct cdp_delay_tx_stats *dst_stats,
6393 					  uint8_t tid)
6394 {
6395 	uint32_t num_rings = 0;
6396 	uint8_t ring_id;
6397 
6398 	for (ring_id = 0; ring_id < CDP_MAX_TXRX_CTX; ring_id++) {
6399 		struct cdp_delay_tx_stats *dstats =
6400 				&stats[tid][ring_id].tx_delay;
6401 
6402 		if (dstats->swdelay_avg || dstats->hwdelay_avg) {
6403 			dst_stats->nwdelay_avg += dstats->nwdelay_avg;
6404 			dst_stats->swdelay_avg += dstats->swdelay_avg;
6405 			dst_stats->hwdelay_avg += dstats->hwdelay_avg;
6406 			num_rings++;
6407 		}
6408 	}
6409 
6410 	if (!num_rings)
6411 		return;
6412 
6413 	dst_stats->nwdelay_avg = qdf_do_div(dst_stats->nwdelay_avg,
6414 					    num_rings);
6415 	dst_stats->swdelay_avg = qdf_do_div(dst_stats->swdelay_avg,
6416 					    num_rings);
6417 	dst_stats->hwdelay_avg = qdf_do_div(dst_stats->hwdelay_avg,
6418 					    num_rings);
6419 }
6420 #else
6421 static void dp_accumulate_delay_avg_stats(struct cdp_delay_tid_stats stats[]
6422 					  [CDP_MAX_TXRX_CTX],
6423 					  struct cdp_delay_tx_stats *dst_stats,
6424 					  uint8_t tid)
6425 {
6426 }
6427 #endif
6428 
6429 /**
6430  * dp_accumulate_delay_tid_stats(): Accumulate the tid stats to the
6431  *                                  hist stats.
6432  * @soc: DP SoC handle
6433  * @stats: cdp_delay_tid stats
6434  * @dst_hstats: Destination histogram to copy tid stats
6435  * @tid: TID value
6436  * @mode:
6437  *
6438  * Return: void
6439  */
6440 static void dp_accumulate_delay_tid_stats(struct dp_soc *soc,
6441 					  struct cdp_delay_tid_stats stats[]
6442 					  [CDP_MAX_TXRX_CTX],
6443 					  struct cdp_hist_stats *dst_hstats,
6444 					  uint8_t tid, uint32_t mode)
6445 {
6446 	uint8_t ring_id;
6447 
6448 	if (wlan_cfg_get_dp_soc_nss_cfg(soc->wlan_cfg_ctx)) {
6449 		struct cdp_delay_tid_stats *dstats =
6450 				&stats[tid][0];
6451 		struct cdp_hist_stats *src_hstats = NULL;
6452 
6453 		switch (mode) {
6454 		case CDP_HIST_TYPE_SW_ENQEUE_DELAY:
6455 			src_hstats = &dstats->tx_delay.tx_swq_delay;
6456 			break;
6457 		case CDP_HIST_TYPE_HW_COMP_DELAY:
6458 			src_hstats = &dstats->tx_delay.hwtx_delay;
6459 			break;
6460 		case CDP_HIST_TYPE_REAP_STACK:
6461 			src_hstats = &dstats->rx_delay.to_stack_delay;
6462 			break;
6463 		default:
6464 			break;
6465 		}
6466 
6467 		if (src_hstats)
6468 			dp_copy_hist_stats(src_hstats, dst_hstats);
6469 
6470 		return;
6471 	}
6472 
6473 	for (ring_id = 0; ring_id < CDP_MAX_TXRX_CTX; ring_id++) {
6474 		struct cdp_delay_tid_stats *dstats =
6475 				&stats[tid][ring_id];
6476 		struct cdp_hist_stats *src_hstats = NULL;
6477 
6478 		switch (mode) {
6479 		case CDP_HIST_TYPE_SW_ENQEUE_DELAY:
6480 			src_hstats = &dstats->tx_delay.tx_swq_delay;
6481 			break;
6482 		case CDP_HIST_TYPE_HW_COMP_DELAY:
6483 			src_hstats = &dstats->tx_delay.hwtx_delay;
6484 			break;
6485 		case CDP_HIST_TYPE_REAP_STACK:
6486 			src_hstats = &dstats->rx_delay.to_stack_delay;
6487 			break;
6488 		default:
6489 			break;
6490 		}
6491 
6492 		if (src_hstats)
6493 			dp_accumulate_hist_stats(src_hstats, dst_hstats);
6494 	}
6495 }
6496 
6497 /**
6498  * dp_peer_print_tx_delay_stats() - Print peer delay stats
6499  * @pdev: DP pdev handle
6500  * @peer: DP peer handle
6501  *
6502  * Return: void
6503  */
6504 static void dp_peer_print_tx_delay_stats(struct dp_pdev *pdev,
6505 					 struct dp_peer *peer)
6506 {
6507 	struct dp_peer_delay_stats *delay_stats;
6508 	struct dp_soc *soc = NULL;
6509 	struct cdp_hist_stats hist_stats;
6510 	uint8_t tid;
6511 
6512 	if (!peer || !peer->txrx_peer)
6513 		return;
6514 
6515 	if (!pdev || !pdev->soc)
6516 		return;
6517 
6518 	soc = pdev->soc;
6519 	if (!wlan_cfg_is_peer_ext_stats_enabled(soc->wlan_cfg_ctx))
6520 		return;
6521 
6522 	delay_stats = peer->txrx_peer->delay_stats;
6523 	if (!delay_stats)
6524 		return;
6525 
6526 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
6527 		DP_PRINT_STATS("----TID: %d----", tid);
6528 		DP_PRINT_STATS("Software Enqueue Delay:");
6529 		dp_hist_init(&hist_stats, CDP_HIST_TYPE_SW_ENQEUE_DELAY);
6530 		dp_accumulate_delay_tid_stats(soc, delay_stats->delay_tid_stats,
6531 					      &hist_stats, tid,
6532 					      CDP_HIST_TYPE_SW_ENQEUE_DELAY);
6533 		dp_print_hist_stats(&hist_stats, CDP_HIST_TYPE_SW_ENQEUE_DELAY);
6534 
6535 		DP_PRINT_STATS("Hardware Transmission Delay:");
6536 		dp_hist_init(&hist_stats, CDP_HIST_TYPE_HW_COMP_DELAY);
6537 		dp_accumulate_delay_tid_stats(soc, delay_stats->delay_tid_stats,
6538 					      &hist_stats, tid,
6539 					      CDP_HIST_TYPE_HW_COMP_DELAY);
6540 		dp_print_hist_stats(&hist_stats, CDP_HIST_TYPE_HW_COMP_DELAY);
6541 	}
6542 }
6543 
6544 /**
6545  * dp_peer_print_rx_delay_stats() - Print peer delay stats
6546  * @pdev: DP pdev handle
6547  * @peer: DP peer handle
6548  *
6549  * Return: void
6550  */
6551 static void dp_peer_print_rx_delay_stats(struct dp_pdev *pdev,
6552 					 struct dp_peer *peer)
6553 {
6554 	struct dp_peer_delay_stats *delay_stats;
6555 	struct dp_soc *soc = NULL;
6556 	struct cdp_hist_stats hist_stats;
6557 	uint8_t tid;
6558 
6559 	if (!peer || !peer->txrx_peer)
6560 		return;
6561 
6562 	if (!pdev || !pdev->soc)
6563 		return;
6564 
6565 	soc = pdev->soc;
6566 	if (!wlan_cfg_is_peer_ext_stats_enabled(soc->wlan_cfg_ctx))
6567 		return;
6568 
6569 	delay_stats = peer->txrx_peer->delay_stats;
6570 	if (!delay_stats)
6571 		return;
6572 
6573 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
6574 		DP_PRINT_STATS("----TID: %d----", tid);
6575 		DP_PRINT_STATS("Rx Reap2stack Deliver Delay:");
6576 		dp_hist_init(&hist_stats, CDP_HIST_TYPE_REAP_STACK);
6577 		dp_accumulate_delay_tid_stats(soc, delay_stats->delay_tid_stats,
6578 					      &hist_stats, tid,
6579 					      CDP_HIST_TYPE_REAP_STACK);
6580 		dp_print_hist_stats(&hist_stats, CDP_HIST_TYPE_REAP_STACK);
6581 	}
6582 }
6583 
6584 #else
6585 static inline void dp_peer_print_tx_delay_stats(struct dp_pdev *pdev,
6586 						struct dp_peer *peer)
6587 {
6588 }
6589 
6590 static inline void dp_peer_print_rx_delay_stats(struct dp_pdev *pdev,
6591 						struct dp_peer *peer)
6592 {
6593 }
6594 #endif
6595 
6596 #ifdef WLAN_FEATURE_11BE
6597 void dp_print_peer_txrx_stats_be(struct cdp_peer_stats *peer_stats,
6598 				 enum peer_stats_type stats_type)
6599 {
6600 	uint8_t i;
6601 
6602 	if (stats_type == PEER_TX_STATS) {
6603 		DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d 320MHZ %d\n",
6604 			       peer_stats->tx.bw[CMN_BW_20MHZ],
6605 			       peer_stats->tx.bw[CMN_BW_40MHZ],
6606 			       peer_stats->tx.bw[CMN_BW_80MHZ],
6607 			       peer_stats->tx.bw[CMN_BW_160MHZ],
6608 			       peer_stats->tx.bw[CMN_BW_320MHZ]);
6609 		DP_PRINT_STATS("Punctured BW Counts = NO_PUNC %d 20MHz %d 40MHz %d 80MHz %d 120MHz %d\n",
6610 			       peer_stats->tx.punc_bw[NO_PUNCTURE],
6611 			       peer_stats->tx.punc_bw[PUNCTURED_20MHZ],
6612 			       peer_stats->tx.punc_bw[PUNCTURED_40MHZ],
6613 			       peer_stats->tx.punc_bw[PUNCTURED_80MHZ],
6614 			       peer_stats->tx.punc_bw[PUNCTURED_120MHZ]);
6615 		DP_PRINT_STATS("RU Locations");
6616 		for (i = 0; i < RU_INDEX_MAX; i++)
6617 			DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
6618 				       cdp_ru_string[i].ru_type,
6619 				       peer_stats->tx.ru_loc[i].num_msdu,
6620 				       peer_stats->tx.ru_loc[i].num_mpdu,
6621 				       peer_stats->tx.ru_loc[i].mpdu_tried);
6622 		dp_print_common_ppdu_rates_info(&peer_stats->tx.su_be_ppdu_cnt,
6623 						DOT11_BE);
6624 		dp_print_mu_be_ppdu_rates_info(&peer_stats->tx.mu_be_ppdu_cnt[0]);
6625 
6626 	} else {
6627 		DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d 320MHZ %d",
6628 			       peer_stats->rx.bw[CMN_BW_20MHZ],
6629 			       peer_stats->rx.bw[CMN_BW_40MHZ],
6630 			       peer_stats->rx.bw[CMN_BW_80MHZ],
6631 			       peer_stats->rx.bw[CMN_BW_160MHZ],
6632 			       peer_stats->rx.bw[CMN_BW_320MHZ]);
6633 		DP_PRINT_STATS("Punctured BW Counts = NO_PUNC %d 20MHz %d 40MHz %d 80MHz %d 120MHz %d\n",
6634 			       peer_stats->rx.punc_bw[NO_PUNCTURE],
6635 			       peer_stats->rx.punc_bw[PUNCTURED_20MHZ],
6636 			       peer_stats->rx.punc_bw[PUNCTURED_40MHZ],
6637 			       peer_stats->rx.punc_bw[PUNCTURED_80MHZ],
6638 			       peer_stats->rx.punc_bw[PUNCTURED_120MHZ]);
6639 		dp_print_common_ppdu_rates_info(&peer_stats->rx.su_be_ppdu_cnt,
6640 						DOT11_BE);
6641 		dp_print_mu_be_ppdu_rates_info(&peer_stats->rx.mu_be_ppdu_cnt[0]);
6642 	}
6643 }
6644 #else
6645 void dp_print_peer_txrx_stats_be(struct cdp_peer_stats *peer_stats,
6646 				 enum peer_stats_type stats_type)
6647 {
6648 }
6649 #endif
6650 
6651 void dp_print_peer_txrx_stats_li(struct cdp_peer_stats *peer_stats,
6652 				 enum peer_stats_type stats_type)
6653 {
6654 	if (stats_type == PEER_TX_STATS) {
6655 		DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d\n",
6656 			       peer_stats->tx.bw[CMN_BW_20MHZ],
6657 			       peer_stats->tx.bw[CMN_BW_40MHZ],
6658 			       peer_stats->tx.bw[CMN_BW_80MHZ],
6659 			       peer_stats->tx.bw[CMN_BW_160MHZ]);
6660 		DP_PRINT_STATS("RU Locations");
6661 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
6662 			       cdp_ru_string[RU_26_INDEX].ru_type,
6663 			       peer_stats->tx.ru_loc[RU_26_INDEX].num_msdu,
6664 			       peer_stats->tx.ru_loc[RU_26_INDEX].num_mpdu,
6665 			       peer_stats->tx.ru_loc[RU_26_INDEX].mpdu_tried);
6666 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
6667 			       cdp_ru_string[RU_52_INDEX].ru_type,
6668 			       peer_stats->tx.ru_loc[RU_52_INDEX].num_msdu,
6669 			       peer_stats->tx.ru_loc[RU_52_INDEX].num_mpdu,
6670 			       peer_stats->tx.ru_loc[RU_52_INDEX].mpdu_tried);
6671 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
6672 			       cdp_ru_string[RU_106_INDEX].ru_type,
6673 			       peer_stats->tx.ru_loc[RU_106_INDEX].num_msdu,
6674 			       peer_stats->tx.ru_loc[RU_106_INDEX].num_mpdu,
6675 			       peer_stats->tx.ru_loc[RU_106_INDEX].mpdu_tried);
6676 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
6677 			       cdp_ru_string[RU_242_INDEX].ru_type,
6678 			       peer_stats->tx.ru_loc[RU_242_INDEX].num_msdu,
6679 			       peer_stats->tx.ru_loc[RU_242_INDEX].num_mpdu,
6680 			       peer_stats->tx.ru_loc[RU_242_INDEX].mpdu_tried);
6681 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
6682 			       cdp_ru_string[RU_484_INDEX].ru_type,
6683 			       peer_stats->tx.ru_loc[RU_484_INDEX].num_msdu,
6684 			       peer_stats->tx.ru_loc[RU_484_INDEX].num_mpdu,
6685 			       peer_stats->tx.ru_loc[RU_484_INDEX].mpdu_tried);
6686 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
6687 			       cdp_ru_string[RU_996_INDEX].ru_type,
6688 			       peer_stats->tx.ru_loc[RU_996_INDEX].num_msdu,
6689 			       peer_stats->tx.ru_loc[RU_996_INDEX].num_mpdu,
6690 			       peer_stats->tx.ru_loc[RU_996_INDEX].mpdu_tried);
6691 	} else {
6692 		DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d",
6693 			       peer_stats->rx.bw[CMN_BW_20MHZ],
6694 			       peer_stats->rx.bw[CMN_BW_40MHZ],
6695 			       peer_stats->rx.bw[CMN_BW_80MHZ],
6696 			       peer_stats->rx.bw[CMN_BW_160MHZ]);
6697 	}
6698 }
6699 
6700 #ifdef REO_SHARED_QREF_TABLE_EN
6701 static void dp_peer_print_reo_qref_table(struct dp_peer *peer)
6702 {
6703 	struct hal_soc *hal;
6704 	struct dp_peer *mld_peer;
6705 	int i;
6706 	uint64_t *reo_qref_addr;
6707 	uint32_t peer_idx;
6708 
6709 	hal = (struct hal_soc *)peer->vdev->pdev->soc->hal_soc;
6710 
6711 	if (!hal_reo_shared_qaddr_is_enable((hal_soc_handle_t)hal))
6712 		return;
6713 
6714 	peer_idx = (peer->peer_id * DP_MAX_TIDS);
6715 
6716 	if ((!hal->reo_qref.non_mlo_reo_qref_table_vaddr) ||
6717 	    (!hal->reo_qref.mlo_reo_qref_table_vaddr)) {
6718 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
6719 			  FL("REO shared table not allocated"));
6720 		return;
6721 	}
6722 
6723 	reo_qref_addr = &hal->reo_qref.non_mlo_reo_qref_table_vaddr[peer_idx];
6724 	mld_peer = DP_GET_MLD_PEER_FROM_PEER(peer);
6725 	if (mld_peer) {
6726 		peer = mld_peer;
6727 		hal = (struct hal_soc *)
6728 			  peer->vdev->pdev->soc->hal_soc;
6729 		peer_idx = (mld_peer->peer_id - HAL_ML_PEER_ID_START) *
6730 			    DP_MAX_TIDS;
6731 		reo_qref_addr = &hal->reo_qref.mlo_reo_qref_table_vaddr[peer_idx];
6732 	}
6733 	DP_PRINT_STATS("Reo Qref table for peer_id: %d\n", peer->peer_id);
6734 
6735 	for (i = 0; i < DP_MAX_TIDS; i++)
6736 		DP_PRINT_STATS("    Tid [%d]  :%llx", i, reo_qref_addr[i]);
6737 }
6738 #else
6739 static inline void dp_peer_print_reo_qref_table(struct dp_peer *peer)
6740 {
6741 }
6742 #endif
6743 
6744 void dp_print_peer_stats(struct dp_peer *peer,
6745 			 struct cdp_peer_stats *peer_stats)
6746 {
6747 	uint8_t i;
6748 	uint32_t index;
6749 	uint32_t j;
6750 	char nss[DP_NSS_LENGTH];
6751 	char mu_group_id[DP_MU_GROUP_LENGTH];
6752 	struct dp_pdev *pdev;
6753 	uint32_t *pnss;
6754 	enum cdp_mu_packet_type rx_mu_type;
6755 	struct cdp_rx_mu *rx_mu;
6756 
6757 	pdev = peer->vdev->pdev;
6758 
6759 	DP_PRINT_STATS("Node Tx Stats:\n");
6760 	DP_PRINT_STATS("Total Packet Completions = %d",
6761 		       peer_stats->tx.comp_pkt.num);
6762 	DP_PRINT_STATS("Total Bytes Completions = %llu",
6763 		       peer_stats->tx.comp_pkt.bytes);
6764 	DP_PRINT_STATS("Success Packets = %d",
6765 		       peer_stats->tx.tx_success.num);
6766 	DP_PRINT_STATS("Success Bytes = %llu",
6767 		       peer_stats->tx.tx_success.bytes);
6768 	DP_PRINT_STATS("Success Packets in TWT Session = %d",
6769 		       peer_stats->tx.tx_success_twt.num);
6770 	DP_PRINT_STATS("Success Bytes in TWT Session = %llu",
6771 		       peer_stats->tx.tx_success_twt.bytes);
6772 	DP_PRINT_STATS("Unicast Success Packets = %d",
6773 		       peer_stats->tx.ucast.num);
6774 	DP_PRINT_STATS("Unicast Success Bytes = %llu",
6775 		       peer_stats->tx.ucast.bytes);
6776 	DP_PRINT_STATS("Multicast Success Packets = %d",
6777 		       peer_stats->tx.mcast.num);
6778 	DP_PRINT_STATS("Multicast Success Bytes = %llu",
6779 		       peer_stats->tx.mcast.bytes);
6780 	DP_PRINT_STATS("Broadcast Success Packets = %d",
6781 		       peer_stats->tx.bcast.num);
6782 	DP_PRINT_STATS("Broadcast Success Bytes = %llu",
6783 		       peer_stats->tx.bcast.bytes);
6784 	DP_PRINT_STATS("Packets Successfully Sent after one or more retry = %d",
6785 		       peer_stats->tx.retry_count);
6786 	DP_PRINT_STATS("Packets Successfully Sent after more than one retry = %d",
6787 		       peer_stats->tx.multiple_retry_count);
6788 	DP_PRINT_STATS("Packets Failed = %d",
6789 		       peer_stats->tx.tx_failed);
6790 	DP_PRINT_STATS("Packets Failed due to retry threshold breach = %d",
6791 		       peer_stats->tx.failed_retry_count);
6792 	DP_PRINT_STATS("Packets In OFDMA = %d",
6793 		       peer_stats->tx.ofdma);
6794 	DP_PRINT_STATS("Packets In STBC = %d",
6795 		       peer_stats->tx.stbc);
6796 	DP_PRINT_STATS("Packets In LDPC = %d",
6797 		       peer_stats->tx.ldpc);
6798 	DP_PRINT_STATS("Packet Retries = %d",
6799 		       peer_stats->tx.retries);
6800 	DP_PRINT_STATS("MSDU's Part of AMSDU = %d",
6801 		       peer_stats->tx.amsdu_cnt);
6802 	DP_PRINT_STATS("Msdu's As Part of Ampdu = %d",
6803 		       peer_stats->tx.non_ampdu_cnt);
6804 	DP_PRINT_STATS("Msdu's As Ampdu = %d",
6805 		       peer_stats->tx.ampdu_cnt);
6806 	DP_PRINT_STATS("Last Packet RSSI = %d",
6807 		       peer_stats->tx.last_ack_rssi);
6808 	DP_PRINT_STATS("Dropped At FW: Removed Pkts = %u",
6809 		       peer_stats->tx.dropped.fw_rem.num);
6810 	DP_PRINT_STATS("Release source not TQM = %u",
6811 		       peer_stats->tx.release_src_not_tqm);
6812 	if (pdev && !wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) {
6813 		DP_PRINT_STATS("Dropped At FW: Removed bytes = %llu",
6814 			peer_stats->tx.dropped.fw_rem.bytes);
6815 	}
6816 	DP_PRINT_STATS("Dropped At FW: Removed transmitted = %d",
6817 		       peer_stats->tx.dropped.fw_rem_tx);
6818 	DP_PRINT_STATS("Dropped At FW: Removed Untransmitted = %d",
6819 		       peer_stats->tx.dropped.fw_rem_notx);
6820 	DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason1 = %u",
6821 		       peer_stats->tx.dropped.fw_reason1);
6822 	DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason2 = %u",
6823 		       peer_stats->tx.dropped.fw_reason2);
6824 	DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason3 = %u",
6825 		       peer_stats->tx.dropped.fw_reason3);
6826 	DP_PRINT_STATS("Dropped At FW:removed untransmitted disable queue = %u",
6827 		       peer_stats->tx.dropped.fw_rem_queue_disable);
6828 	DP_PRINT_STATS("Dropped At FW: removed untransmitted no match = %u",
6829 		       peer_stats->tx.dropped.fw_rem_no_match);
6830 	DP_PRINT_STATS("Dropped due to HW threshold criteria = %u",
6831 		       peer_stats->tx.dropped.drop_threshold);
6832 	DP_PRINT_STATS("Dropped due Link desc not available drop in HW = %u",
6833 		       peer_stats->tx.dropped.drop_link_desc_na);
6834 	DP_PRINT_STATS("Drop bit set or invalid flow = %u",
6835 		       peer_stats->tx.dropped.invalid_drop);
6836 	DP_PRINT_STATS("MCAST vdev drop in HW = %u",
6837 		       peer_stats->tx.dropped.mcast_vdev_drop);
6838 	DP_PRINT_STATS("Dropped : Age Out = %d",
6839 		       peer_stats->tx.dropped.age_out);
6840 	DP_PRINT_STATS("Dropped : Invalid Reason = %u",
6841 		       peer_stats->tx.dropped.invalid_rr);
6842 	DP_PRINT_STATS("NAWDS : ");
6843 	DP_PRINT_STATS("Nawds multicast Drop Tx Packet = %d",
6844 		       peer_stats->tx.nawds_mcast_drop);
6845 	DP_PRINT_STATS("	Nawds multicast  Tx Packet Count = %d",
6846 		       peer_stats->tx.nawds_mcast.num);
6847 	DP_PRINT_STATS("	Nawds multicast  Tx Packet Bytes = %llu",
6848 		       peer_stats->tx.nawds_mcast.bytes);
6849 
6850 	DP_PRINT_STATS("PPDU's = %d", peer_stats->tx.tx_ppdus);
6851 	DP_PRINT_STATS("Number of PPDU's with Punctured Preamble = %d",
6852 		       peer_stats->tx.pream_punct_cnt);
6853 	DP_PRINT_STATS("MPDU's Successful = %d",
6854 		       peer_stats->tx.tx_mpdus_success);
6855 	DP_PRINT_STATS("MPDU's Tried = %d", peer_stats->tx.tx_mpdus_tried);
6856 
6857 	DP_PRINT_STATS("Rate Info:");
6858 	dp_print_common_rates_info(peer_stats->tx.pkt_type);
6859 
6860 	DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
6861 		       peer_stats->tx.sgi_count[0],
6862 		       peer_stats->tx.sgi_count[1],
6863 		       peer_stats->tx.sgi_count[2],
6864 		       peer_stats->tx.sgi_count[3]);
6865 
6866 	DP_PRINT_STATS("Wireless Mutlimedia ");
6867 	DP_PRINT_STATS("	 Best effort = %d",
6868 		       peer_stats->tx.wme_ac_type[0]);
6869 	DP_PRINT_STATS("	 Background= %d",
6870 		       peer_stats->tx.wme_ac_type[1]);
6871 	DP_PRINT_STATS("	 Video = %d",
6872 		       peer_stats->tx.wme_ac_type[2]);
6873 	DP_PRINT_STATS("	 Voice = %d",
6874 		       peer_stats->tx.wme_ac_type[3]);
6875 
6876 	DP_PRINT_STATS("Excess Retries per AC ");
6877 	DP_PRINT_STATS("	 Best effort = %d",
6878 		       peer_stats->tx.excess_retries_per_ac[0]);
6879 	DP_PRINT_STATS("	 Background= %d",
6880 		       peer_stats->tx.excess_retries_per_ac[1]);
6881 	DP_PRINT_STATS("	 Video = %d",
6882 		       peer_stats->tx.excess_retries_per_ac[2]);
6883 	DP_PRINT_STATS("	 Voice = %d",
6884 		       peer_stats->tx.excess_retries_per_ac[3]);
6885 
6886 	pnss = &peer_stats->tx.nss[0];
6887 	dp_print_nss(nss, pnss, SS_COUNT);
6888 
6889 	DP_PRINT_STATS("NSS(1-8) = %s", nss);
6890 
6891 	DP_PRINT_STATS("Transmit Type :");
6892 	DP_PRINT_STATS("MSDUs Success: SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d",
6893 		       peer_stats->tx.transmit_type[SU].num_msdu,
6894 		       peer_stats->tx.transmit_type[MU_MIMO].num_msdu,
6895 		       peer_stats->tx.transmit_type[MU_OFDMA].num_msdu,
6896 		       peer_stats->tx.transmit_type[MU_MIMO_OFDMA].num_msdu);
6897 
6898 	DP_PRINT_STATS("MPDUs Success: SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d",
6899 		       peer_stats->tx.transmit_type[SU].num_mpdu,
6900 		       peer_stats->tx.transmit_type[MU_MIMO].num_mpdu,
6901 		       peer_stats->tx.transmit_type[MU_OFDMA].num_mpdu,
6902 		       peer_stats->tx.transmit_type[MU_MIMO_OFDMA].num_mpdu);
6903 
6904 	DP_PRINT_STATS("MPDUs Tried: SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d",
6905 		       peer_stats->tx.transmit_type[SU].mpdu_tried,
6906 		       peer_stats->tx.transmit_type[MU_MIMO].mpdu_tried,
6907 		       peer_stats->tx.transmit_type[MU_OFDMA].mpdu_tried,
6908 		       peer_stats->tx.transmit_type[MU_MIMO_OFDMA].mpdu_tried);
6909 
6910 	for (i = 0; i < MAX_MU_GROUP_ID;) {
6911 		index = 0;
6912 		for (j = 0; j < DP_MU_GROUP_SHOW && i < MAX_MU_GROUP_ID;
6913 		     j++) {
6914 			index += qdf_snprint(&mu_group_id[index],
6915 					     DP_MU_GROUP_LENGTH - index,
6916 					     " %d",
6917 					     peer_stats->tx.mu_group_id[i]);
6918 			i++;
6919 		}
6920 
6921 		DP_PRINT_STATS("User position list for GID %02d->%d: [%s]",
6922 			       i - DP_MU_GROUP_SHOW, i - 1, mu_group_id);
6923 	}
6924 
6925 	DP_PRINT_STATS("Last Packet RU index [%d], Size [%d]",
6926 		       peer_stats->tx.ru_start, peer_stats->tx.ru_tones);
6927 
6928 	DP_PRINT_STATS("Aggregation:");
6929 	DP_PRINT_STATS("Number of Msdu's Part of Amsdu = %d",
6930 		       peer_stats->tx.amsdu_cnt);
6931 	DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation = %d",
6932 		       peer_stats->tx.non_amsdu_cnt);
6933 
6934 	DP_PRINT_STATS("Bytes and Packets transmitted  in last one sec:");
6935 	DP_PRINT_STATS("	Bytes transmitted in last sec: %d",
6936 		       peer_stats->tx.tx_byte_rate);
6937 	DP_PRINT_STATS("	Data transmitted in last sec: %d",
6938 		       peer_stats->tx.tx_data_rate);
6939 
6940 	if (pdev && pdev->soc->arch_ops.txrx_print_peer_stats)
6941 		pdev->soc->arch_ops.txrx_print_peer_stats(peer_stats,
6942 							  PEER_TX_STATS);
6943 
6944 	if (!IS_MLO_DP_LINK_PEER(peer)) {
6945 		dp_print_jitter_stats(peer, pdev);
6946 		dp_peer_print_tx_delay_stats(pdev, peer);
6947 	}
6948 
6949 	DP_PRINT_STATS("Node Rx Stats:");
6950 	DP_PRINT_STATS("Packets Sent To Stack = %d",
6951 		       peer_stats->rx.to_stack.num);
6952 	DP_PRINT_STATS("Bytes Sent To Stack = %llu",
6953 		       peer_stats->rx.to_stack.bytes);
6954 	for (i = 0; i <  CDP_MAX_RX_RINGS; i++) {
6955 		DP_PRINT_STATS("Ring Id = %d", i);
6956 		DP_PRINT_STATS("	Packets Received = %d",
6957 			       peer_stats->rx.rcvd_reo[i].num);
6958 		DP_PRINT_STATS("	Bytes Received = %llu",
6959 			       peer_stats->rx.rcvd_reo[i].bytes);
6960 	}
6961 	for (i = 0; i < CDP_MAX_LMACS; i++)
6962 		DP_PRINT_STATS("Packets Received on lmac[%d] = %d ( %llu ),",
6963 			       i, peer_stats->rx.rx_lmac[i].num,
6964 			       peer_stats->rx.rx_lmac[i].bytes);
6965 
6966 	DP_PRINT_STATS("Unicast Packets Received = %d",
6967 		       peer_stats->rx.unicast.num);
6968 	DP_PRINT_STATS("Unicast Bytes Received = %llu",
6969 		       peer_stats->rx.unicast.bytes);
6970 	DP_PRINT_STATS("Multicast Packets Received = %d",
6971 		       peer_stats->rx.multicast.num);
6972 	DP_PRINT_STATS("Multicast Bytes Received = %llu",
6973 		       peer_stats->rx.multicast.bytes);
6974 	DP_PRINT_STATS("Broadcast Packets Received = %d",
6975 		       peer_stats->rx.bcast.num);
6976 	DP_PRINT_STATS("Broadcast Bytes Received = %llu",
6977 		       peer_stats->rx.bcast.bytes);
6978 	DP_PRINT_STATS("Packets Sent To Stack in TWT Session = %d",
6979 		       peer_stats->rx.to_stack_twt.num);
6980 	DP_PRINT_STATS("Bytes Sent To Stack in TWT Session = %llu",
6981 		       peer_stats->rx.to_stack_twt.bytes);
6982 	DP_PRINT_STATS("Intra BSS Packets Received = %d",
6983 		       peer_stats->rx.intra_bss.pkts.num);
6984 	DP_PRINT_STATS("Intra BSS Bytes Received = %llu",
6985 		       peer_stats->rx.intra_bss.pkts.bytes);
6986 	DP_PRINT_STATS("Intra BSS Packets Failed = %d",
6987 		       peer_stats->rx.intra_bss.fail.num);
6988 	DP_PRINT_STATS("Intra BSS Bytes Failed = %llu",
6989 		       peer_stats->rx.intra_bss.fail.bytes);
6990 	DP_PRINT_STATS("Intra BSS MDNS Packets Not Forwarded  = %d",
6991 		       peer_stats->rx.intra_bss.mdns_no_fwd);
6992 	DP_PRINT_STATS("Raw Packets Received = %d",
6993 		       peer_stats->rx.raw.num);
6994 	DP_PRINT_STATS("Raw Bytes Received = %llu",
6995 		       peer_stats->rx.raw.bytes);
6996 	DP_PRINT_STATS("Errors: MIC Errors = %d",
6997 		       peer_stats->rx.err.mic_err);
6998 	DP_PRINT_STATS("Errors: Decryption Errors = %d",
6999 		       peer_stats->rx.err.decrypt_err);
7000 	DP_PRINT_STATS("Errors: PN Errors = %d",
7001 		       peer_stats->rx.err.pn_err);
7002 	DP_PRINT_STATS("Errors: OOR Errors = %d",
7003 		       peer_stats->rx.err.oor_err);
7004 	DP_PRINT_STATS("Errors: 2k Jump Errors = %d",
7005 		       peer_stats->rx.err.jump_2k_err);
7006 	DP_PRINT_STATS("Errors: RXDMA Wifi Parse Errors = %d",
7007 		       peer_stats->rx.err.rxdma_wifi_parse_err);
7008 	DP_PRINT_STATS("Msdu's Received As Part of Ampdu = %d",
7009 		       peer_stats->rx.non_ampdu_cnt);
7010 	DP_PRINT_STATS("Msdu's Received As Ampdu = %d",
7011 		       peer_stats->rx.ampdu_cnt);
7012 	DP_PRINT_STATS("Msdu's Received Not Part of Amsdu's = %d",
7013 		       peer_stats->rx.non_amsdu_cnt);
7014 	DP_PRINT_STATS("MSDUs Received As Part of Amsdu = %d",
7015 		       peer_stats->rx.amsdu_cnt);
7016 	DP_PRINT_STATS("MSDU Rx Retries= %d", peer_stats->rx.rx_retries);
7017 	DP_PRINT_STATS("MPDU Rx Retries= %d", peer_stats->rx.mpdu_retry_cnt);
7018 	DP_PRINT_STATS("NAWDS : ");
7019 	DP_PRINT_STATS("	Nawds multicast Drop Rx Packet = %d",
7020 		       peer_stats->rx.nawds_mcast_drop);
7021 	DP_PRINT_STATS(" 3address multicast Drop Rx Packet = %d",
7022 		       peer_stats->rx.mcast_3addr_drop);
7023 	DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
7024 		       peer_stats->rx.sgi_count[0],
7025 		       peer_stats->rx.sgi_count[1],
7026 		       peer_stats->rx.sgi_count[2],
7027 		       peer_stats->rx.sgi_count[3]);
7028 
7029 	DP_PRINT_STATS("Wireless Mutlimedia ");
7030 	DP_PRINT_STATS("	 Best effort = %d",
7031 		       peer_stats->rx.wme_ac_type[0]);
7032 	DP_PRINT_STATS("	 Background= %d",
7033 		       peer_stats->rx.wme_ac_type[1]);
7034 	DP_PRINT_STATS("	 Video = %d",
7035 		       peer_stats->rx.wme_ac_type[2]);
7036 	DP_PRINT_STATS("	 Voice = %d",
7037 		       peer_stats->rx.wme_ac_type[3]);
7038 
7039 	DP_PRINT_STATS(" Total Rx PPDU Count = %d", peer_stats->rx.rx_ppdus);
7040 	DP_PRINT_STATS(" Total Rx MPDU Count = %d", peer_stats->rx.rx_mpdus);
7041 	DP_PRINT_STATS("MSDU Reception Type");
7042 	DP_PRINT_STATS("SU %d MU_MIMO %d MU_OFDMA %d MU_OFDMA_MIMO %d",
7043 		       peer_stats->rx.reception_type[0],
7044 		       peer_stats->rx.reception_type[1],
7045 		       peer_stats->rx.reception_type[2],
7046 		       peer_stats->rx.reception_type[3]);
7047 	DP_PRINT_STATS("PPDU Reception Type");
7048 	DP_PRINT_STATS("SU %d MU_MIMO %d MU_OFDMA %d MU_OFDMA_MIMO %d",
7049 		       peer_stats->rx.ppdu_cnt[0],
7050 		       peer_stats->rx.ppdu_cnt[1],
7051 		       peer_stats->rx.ppdu_cnt[2],
7052 		       peer_stats->rx.ppdu_cnt[3]);
7053 
7054 	dp_print_common_rates_info(peer_stats->rx.pkt_type);
7055 	dp_print_common_ppdu_rates_info(&peer_stats->rx.su_ax_ppdu_cnt,
7056 					DOT11_AX);
7057 	dp_print_mu_ppdu_rates_info(&peer_stats->rx.rx_mu[0]);
7058 
7059 	pnss = &peer_stats->rx.nss[0];
7060 	dp_print_nss(nss, pnss, SS_COUNT);
7061 	DP_PRINT_STATS("MSDU Count");
7062 	DP_PRINT_STATS("	NSS(1-8) = %s", nss);
7063 
7064 	DP_PRINT_STATS("reception mode SU");
7065 	pnss = &peer_stats->rx.ppdu_nss[0];
7066 	dp_print_nss(nss, pnss, SS_COUNT);
7067 
7068 	DP_PRINT_STATS("	PPDU Count");
7069 	DP_PRINT_STATS("	NSS(1-8) = %s", nss);
7070 
7071 	DP_PRINT_STATS("	MPDU OK = %d, MPDU Fail = %d",
7072 		       peer_stats->rx.mpdu_cnt_fcs_ok,
7073 		       peer_stats->rx.mpdu_cnt_fcs_err);
7074 
7075 	for (rx_mu_type = 0; rx_mu_type < TXRX_TYPE_MU_MAX; rx_mu_type++) {
7076 		DP_PRINT_STATS("reception mode %s",
7077 			       mu_reception_mode[rx_mu_type]);
7078 		rx_mu = &peer_stats->rx.rx_mu[rx_mu_type];
7079 
7080 		pnss = &rx_mu->ppdu_nss[0];
7081 		dp_print_nss(nss, pnss, SS_COUNT);
7082 		DP_PRINT_STATS("	PPDU Count");
7083 		DP_PRINT_STATS("	NSS(1-8) = %s", nss);
7084 
7085 		DP_PRINT_STATS("	MPDU OK = %d, MPDU Fail = %d",
7086 			       rx_mu->mpdu_cnt_fcs_ok,
7087 			       rx_mu->mpdu_cnt_fcs_err);
7088 	}
7089 
7090 	DP_PRINT_STATS("Aggregation:");
7091 	DP_PRINT_STATS("	Msdu's Part of Ampdu = %d",
7092 		       peer_stats->rx.ampdu_cnt);
7093 	DP_PRINT_STATS("	Msdu's With No Mpdu Level Aggregation = %d",
7094 		       peer_stats->rx.non_ampdu_cnt);
7095 	DP_PRINT_STATS("	Msdu's Part of Amsdu = %d",
7096 		       peer_stats->rx.amsdu_cnt);
7097 	DP_PRINT_STATS("	Msdu's With No Msdu Level Aggregation = %d",
7098 		       peer_stats->rx.non_amsdu_cnt);
7099 
7100 	DP_PRINT_STATS("Bytes and Packets received in last one sec:");
7101 	DP_PRINT_STATS("	Bytes received in last sec: %d",
7102 		       peer_stats->rx.rx_byte_rate);
7103 	DP_PRINT_STATS("	Data received in last sec: %d",
7104 		       peer_stats->rx.rx_data_rate);
7105 	DP_PRINT_STATS("MEC Packet Drop = %d",
7106 		       peer_stats->rx.mec_drop.num);
7107 	DP_PRINT_STATS("MEC Byte Drop = %llu",
7108 		       peer_stats->rx.mec_drop.bytes);
7109 	DP_PRINT_STATS("Multipass Rx Packet Drop = %d",
7110 		       peer_stats->rx.multipass_rx_pkt_drop);
7111 	DP_PRINT_STATS("Peer Unauth Rx Packet Drop = %d",
7112 		       peer_stats->rx.peer_unauth_rx_pkt_drop);
7113 	DP_PRINT_STATS("Policy Check Rx Packet Drop = %d",
7114 		       peer_stats->rx.policy_check_drop);
7115 	if (pdev && pdev->soc->arch_ops.txrx_print_peer_stats)
7116 		pdev->soc->arch_ops.txrx_print_peer_stats(peer_stats,
7117 							  PEER_RX_STATS);
7118 
7119 	if (!IS_MLO_DP_LINK_PEER(peer))
7120 		dp_peer_print_rx_delay_stats(pdev, peer);
7121 
7122 	dp_peer_print_reo_qref_table(peer);
7123 }
7124 
7125 void dp_print_per_ring_stats(struct dp_soc *soc)
7126 {
7127 	uint8_t ring;
7128 	uint16_t core;
7129 	uint64_t total_packets;
7130 
7131 	DP_PRINT_STATS("Reo packets per ring:");
7132 	for (ring = 0; ring < MAX_REO_DEST_RINGS; ring++) {
7133 		total_packets = 0;
7134 		DP_PRINT_STATS("Packets on ring %u:", ring);
7135 		for (core = 0; core < num_possible_cpus(); core++) {
7136 			if (!soc->stats.rx.ring_packets[core][ring])
7137 				continue;
7138 			DP_PRINT_STATS("Packets arriving on core %u: %llu",
7139 				       core,
7140 				       soc->stats.rx.ring_packets[core][ring]);
7141 			total_packets += soc->stats.rx.ring_packets[core][ring];
7142 		}
7143 		DP_PRINT_STATS("Total packets on ring %u: %llu",
7144 			       ring, total_packets);
7145 	}
7146 }
7147 
7148 void dp_txrx_path_stats(struct dp_soc *soc)
7149 {
7150 	uint8_t error_code;
7151 	uint8_t loop_pdev;
7152 	struct dp_pdev *pdev;
7153 	uint8_t i;
7154 
7155 	if (!soc) {
7156 		dp_err("%s: Invalid access",  __func__);
7157 		return;
7158 	}
7159 
7160 	for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) {
7161 		pdev = soc->pdev_list[loop_pdev];
7162 		dp_aggregate_pdev_stats(pdev);
7163 		DP_PRINT_STATS("Tx path Statistics:");
7164 		DP_PRINT_STATS("from stack: %u msdus (%llu bytes)",
7165 			       pdev->stats.tx_i.rcvd.num,
7166 			       pdev->stats.tx_i.rcvd.bytes);
7167 		DP_PRINT_STATS("processed from host: %u msdus (%llu bytes)",
7168 			       pdev->stats.tx_i.processed.num,
7169 			       pdev->stats.tx_i.processed.bytes);
7170 		DP_PRINT_STATS("successfully transmitted: %u msdus (%llu bytes)",
7171 			       pdev->stats.tx.tx_success.num,
7172 			       pdev->stats.tx.tx_success.bytes);
7173 		for (i = 0; i < soc->num_tcl_data_rings; i++) {
7174 			DP_PRINT_STATS("Enqueue to SW2TCL%u: %u", i + 1,
7175 				       soc->stats.tx.tcl_enq[i]);
7176 			DP_PRINT_STATS("TX completions reaped from ring %u: %u",
7177 				       i, soc->stats.tx.tx_comp[i]);
7178 		}
7179 
7180 		DP_PRINT_STATS("Invalid release source: %u",
7181 			       soc->stats.tx.invalid_release_source);
7182 		DP_PRINT_STATS("Invalid TX desc from completion ring: %u",
7183 			       soc->stats.tx.invalid_tx_comp_desc);
7184 		DP_PRINT_STATS("Dropped in host:");
7185 		DP_PRINT_STATS("Total packets dropped: %u,",
7186 			       pdev->stats.tx_i.dropped.dropped_pkt.num);
7187 		DP_PRINT_STATS("Descriptor not available: %u",
7188 			       pdev->stats.tx_i.dropped.desc_na.num);
7189 		DP_PRINT_STATS("Ring full: %u",
7190 			       pdev->stats.tx_i.dropped.ring_full);
7191 		DP_PRINT_STATS("Enqueue fail: %u",
7192 			       pdev->stats.tx_i.dropped.enqueue_fail);
7193 		DP_PRINT_STATS("Pkt dropped in vdev-id check: %u",
7194 			       pdev->stats.tx_i.dropped.fail_per_pkt_vdev_id_check);
7195 		DP_PRINT_STATS("DMA Error: %u",
7196 			       pdev->stats.tx_i.dropped.dma_error);
7197 		DP_PRINT_STATS("Drop Ingress: %u",
7198 			       pdev->stats.tx_i.dropped.drop_ingress);
7199 
7200 		DP_PRINT_STATS("Dropped in hardware:");
7201 		DP_PRINT_STATS("total packets dropped: %u",
7202 			       pdev->stats.tx.tx_failed);
7203 		DP_PRINT_STATS("mpdu age out: %u",
7204 			       pdev->stats.tx.dropped.age_out);
7205 		DP_PRINT_STATS("firmware removed packets: %u (%llu bytes)",
7206 			       pdev->stats.tx.dropped.fw_rem.num,
7207 			       pdev->stats.tx.dropped.fw_rem.bytes);
7208 		DP_PRINT_STATS("firmware removed tx: %u",
7209 			       pdev->stats.tx.dropped.fw_rem_tx);
7210 		DP_PRINT_STATS("firmware removed notx %u",
7211 			       pdev->stats.tx.dropped.fw_rem_notx);
7212 		DP_PRINT_STATS("Invalid peer on tx path: %u",
7213 			       pdev->soc->stats.tx.tx_invalid_peer.num);
7214 		DP_PRINT_STATS("Tx desc freed in non-completion path: %u",
7215 			       pdev->soc->stats.tx.tx_comp_exception);
7216 		DP_PRINT_STATS("Tx desc force freed: %u",
7217 			       pdev->soc->stats.tx.tx_comp_force_freed);
7218 
7219 		DP_PRINT_STATS("Tx packets sent per interrupt:");
7220 		DP_PRINT_STATS("Single Packet: %u",
7221 			       pdev->stats.tx_comp_histogram.pkts_1);
7222 		DP_PRINT_STATS("2-20 Packets:  %u",
7223 			       pdev->stats.tx_comp_histogram.pkts_2_20);
7224 		DP_PRINT_STATS("21-40 Packets: %u",
7225 			       pdev->stats.tx_comp_histogram.pkts_21_40);
7226 		DP_PRINT_STATS("41-60 Packets: %u",
7227 			       pdev->stats.tx_comp_histogram.pkts_41_60);
7228 		DP_PRINT_STATS("61-80 Packets: %u",
7229 			       pdev->stats.tx_comp_histogram.pkts_61_80);
7230 		DP_PRINT_STATS("81-100 Packets: %u",
7231 			       pdev->stats.tx_comp_histogram.pkts_81_100);
7232 		DP_PRINT_STATS("101-200 Packets: %u",
7233 			       pdev->stats.tx_comp_histogram.pkts_101_200);
7234 		DP_PRINT_STATS("    201+ Packets: %u",
7235 			       pdev->stats.tx_comp_histogram.pkts_201_plus);
7236 
7237 		DP_PRINT_STATS("Rx path statistics");
7238 
7239 		DP_PRINT_STATS("delivered %u msdus ( %llu bytes),",
7240 			       pdev->stats.rx.to_stack.num,
7241 			       pdev->stats.rx.to_stack.bytes);
7242 		for (i = 0; i < CDP_MAX_RX_RINGS; i++) {
7243 			if (!pdev->stats.rx.rcvd_reo[i].num)
7244 				continue;
7245 			DP_PRINT_STATS(
7246 				       "received on reo[%d] %u msdus( %llu bytes),",
7247 				       i, pdev->stats.rx.rcvd_reo[i].num,
7248 				       pdev->stats.rx.rcvd_reo[i].bytes);
7249 		}
7250 		for (i = 0; i < CDP_MAX_LMACS; i++)
7251 			DP_PRINT_STATS("received on lmac[%d] %u msdus (%llu bytes),",
7252 				       i, pdev->stats.rx.rx_lmac[i].num,
7253 				       pdev->stats.rx.rx_lmac[i].bytes);
7254 		DP_PRINT_STATS("intra-bss packets %u msdus ( %llu bytes),",
7255 			       pdev->stats.rx.intra_bss.pkts.num,
7256 			       pdev->stats.rx.intra_bss.pkts.bytes);
7257 		DP_PRINT_STATS("intra-bss fails %u msdus ( %llu bytes),",
7258 			       pdev->stats.rx.intra_bss.fail.num,
7259 			       pdev->stats.rx.intra_bss.fail.bytes);
7260 		DP_PRINT_STATS("intra-bss no mdns fwds %u msdus",
7261 			       pdev->stats.rx.intra_bss.mdns_no_fwd);
7262 		DP_PRINT_STATS("intra-bss EAPOL drops: %u",
7263 			       soc->stats.rx.err.intrabss_eapol_drop);
7264 
7265 		DP_PRINT_STATS("raw packets %u msdus ( %llu bytes),",
7266 			       pdev->stats.rx.raw.num,
7267 			       pdev->stats.rx.raw.bytes);
7268 		DP_PRINT_STATS("mic errors %u",
7269 			       pdev->stats.rx.err.mic_err);
7270 		DP_PRINT_STATS("Invalid peer on rx path: %u",
7271 			       pdev->soc->stats.rx.err.rx_invalid_peer.num);
7272 		DP_PRINT_STATS("sw_peer_id invalid %u",
7273 			       pdev->soc->stats.rx.err.rx_invalid_peer_id.num);
7274 		DP_PRINT_STATS("packet_len invalid %u",
7275 			       pdev->soc->stats.rx.err.rx_invalid_pkt_len.num);
7276 		DP_PRINT_STATS("sa or da idx invalid %u",
7277 			       pdev->soc->stats.rx.err.invalid_sa_da_idx);
7278 		DP_PRINT_STATS("defrag peer uninit %u",
7279 			       pdev->soc->stats.rx.err.defrag_peer_uninit);
7280 		DP_PRINT_STATS("pkts delivered no peer %u",
7281 			       pdev->soc->stats.rx.err.pkt_delivered_no_peer);
7282 		DP_PRINT_STATS("RX invalid cookie: %d",
7283 			       soc->stats.rx.err.invalid_cookie);
7284 		DP_PRINT_STATS("RX stale cookie: %d",
7285 			       soc->stats.rx.err.stale_cookie);
7286 		DP_PRINT_STATS("2k jump delba sent: %u",
7287 			       pdev->soc->stats.rx.err.rx_2k_jump_delba_sent);
7288 		DP_PRINT_STATS("2k jump msdu to stack: %u",
7289 			       pdev->soc->stats.rx.err.rx_2k_jump_to_stack);
7290 		DP_PRINT_STATS("2k jump msdu drop: %u",
7291 			       pdev->soc->stats.rx.err.rx_2k_jump_drop);
7292 		DP_PRINT_STATS("REO err oor msdu to stack %u",
7293 			       pdev->soc->stats.rx.err.reo_err_oor_to_stack);
7294 		DP_PRINT_STATS("REO err oor msdu drop: %u",
7295 			       pdev->soc->stats.rx.err.reo_err_oor_drop);
7296 		DP_PRINT_STATS("REO err raw mpdu drop: %u",
7297 			       pdev->soc->stats.rx.err.reo_err_raw_mpdu_drop);
7298 		DP_PRINT_STATS("Rx err msdu rejected: %d",
7299 			       soc->stats.rx.err.rejected);
7300 		DP_PRINT_STATS("Rx raw frame dropped: %d",
7301 			       soc->stats.rx.err.raw_frm_drop);
7302 		DP_PRINT_STATS("Rx stale link desc cookie: %d",
7303 			       pdev->soc->stats.rx.err.invalid_link_cookie);
7304 		DP_PRINT_STATS("Rx nbuf sanity fails: %d",
7305 			       pdev->soc->stats.rx.err.nbuf_sanity_fail);
7306 		DP_PRINT_STATS("Rx refill duplicate link desc: %d",
7307 			       pdev->soc->stats.rx.err.dup_refill_link_desc);
7308 		DP_PRINT_STATS("Rx ipa smmu map duplicate: %d",
7309 			       pdev->soc->stats.rx.err.ipa_smmu_map_dup);
7310 		DP_PRINT_STATS("Rx ipa smmu unmap duplicate: %d",
7311 			       pdev->soc->stats.rx.err.ipa_smmu_unmap_dup);
7312 		DP_PRINT_STATS("Rx ipa smmu unmap no pipes: %d",
7313 			       pdev->soc->stats.rx.err.ipa_unmap_no_pipe);
7314 		DP_PRINT_STATS("PN-in-Dest error frame pn-check fail: %d",
7315 			       soc->stats.rx.err.pn_in_dest_check_fail);
7316 
7317 		DP_PRINT_STATS("Reo Statistics");
7318 		DP_PRINT_STATS("near_full: %u ", soc->stats.rx.near_full);
7319 		DP_PRINT_STATS("rbm error: %u msdus",
7320 			       pdev->soc->stats.rx.err.invalid_rbm);
7321 		DP_PRINT_STATS("hal ring access fail: %u msdus",
7322 			       pdev->soc->stats.rx.err.hal_ring_access_fail);
7323 
7324 		DP_PRINT_STATS("hal ring access full fail: %u msdus",
7325 			       pdev->soc->stats.rx.err.hal_ring_access_full_fail);
7326 
7327 		DP_PRINT_STATS("Rx BAR frames:%d", soc->stats.rx.bar_frame);
7328 
7329 		for (error_code = 0; error_code < HAL_REO_ERR_MAX;
7330 				error_code++) {
7331 			if (!pdev->soc->stats.rx.err.reo_error[error_code])
7332 				continue;
7333 			DP_PRINT_STATS("Reo error number (%u): %u msdus",
7334 				       error_code,
7335 				       pdev->soc->stats.rx.err
7336 				       .reo_error[error_code]);
7337 		}
7338 
7339 		for (error_code = 0; error_code < HAL_RXDMA_ERR_MAX;
7340 				error_code++) {
7341 			if (!pdev->soc->stats.rx.err.rxdma_error[error_code])
7342 				continue;
7343 			DP_PRINT_STATS("Rxdma error number (%u): %u msdus",
7344 				       error_code,
7345 				       pdev->soc->stats.rx.err
7346 				       .rxdma_error[error_code]);
7347 		}
7348 
7349 		DP_PRINT_STATS("Rx packets reaped per interrupt:");
7350 		DP_PRINT_STATS("Single Packet: %u",
7351 			       pdev->stats.rx_ind_histogram.pkts_1);
7352 		DP_PRINT_STATS("2-20 Packets:  %u",
7353 			       pdev->stats.rx_ind_histogram.pkts_2_20);
7354 		DP_PRINT_STATS("21-40 Packets: %u",
7355 			       pdev->stats.rx_ind_histogram.pkts_21_40);
7356 		DP_PRINT_STATS("41-60 Packets: %u",
7357 			       pdev->stats.rx_ind_histogram.pkts_41_60);
7358 		DP_PRINT_STATS("61-80 Packets: %u",
7359 			       pdev->stats.rx_ind_histogram.pkts_61_80);
7360 		DP_PRINT_STATS("81-100 Packets: %u",
7361 			       pdev->stats.rx_ind_histogram.pkts_81_100);
7362 		DP_PRINT_STATS("101-200 Packets: %u",
7363 			       pdev->stats.rx_ind_histogram.pkts_101_200);
7364 		DP_PRINT_STATS("   201+ Packets: %u",
7365 			       pdev->stats.rx_ind_histogram.pkts_201_plus);
7366 
7367 		DP_PRINT_STATS("%s: tso_enable: %u lro_enable: %u rx_hash: %u napi_enable: %u",
7368 			       __func__,
7369 			       pdev->soc->wlan_cfg_ctx
7370 			       ->tso_enabled,
7371 			       pdev->soc->wlan_cfg_ctx
7372 			       ->lro_enabled,
7373 			       pdev->soc->wlan_cfg_ctx
7374 			       ->rx_hash,
7375 			       pdev->soc->wlan_cfg_ctx
7376 			       ->napi_enabled);
7377 #ifdef QCA_LL_TX_FLOW_CONTROL_V2
7378 		DP_PRINT_STATS("%s: Tx flow stop queue: %u tx flow start queue offset: %u",
7379 			       __func__,
7380 			       pdev->soc->wlan_cfg_ctx
7381 			       ->tx_flow_stop_queue_threshold,
7382 			       pdev->soc->wlan_cfg_ctx
7383 			       ->tx_flow_start_queue_offset);
7384 #endif
7385 	}
7386 }
7387 
7388 /**
7389  * dp_peer_ctrl_frames_stats_get() - function to agreegate peer stats
7390  * Current scope is bar received count
7391  *
7392  * @soc : Datapath SOC handle
7393  * @peer: Datapath peer handle
7394  * @arg : argument to iterate function
7395  *
7396  * Return: void
7397  */
7398 static void
7399 dp_peer_ctrl_frames_stats_get(struct dp_soc *soc,
7400 			      struct dp_peer *peer,
7401 			      void *arg)
7402 {
7403 	uint32_t waitcnt;
7404 	struct dp_pdev *pdev = peer->vdev->pdev;
7405 
7406 	waitcnt = 0;
7407 	dp_peer_rxtid_stats(peer, dp_rx_bar_stats_cb, pdev);
7408 	while (!(qdf_atomic_read(&pdev->stats_cmd_complete)) &&
7409 	       waitcnt < 10) {
7410 		schedule_timeout_interruptible(
7411 				STATS_PROC_TIMEOUT);
7412 		waitcnt++;
7413 	}
7414 	qdf_atomic_set(&pdev->stats_cmd_complete, 0);
7415 }
7416 
7417 void
7418 dp_print_pdev_tx_stats(struct dp_pdev *pdev)
7419 {
7420 	uint8_t i = 0, index = 0;
7421 
7422 	DP_PRINT_STATS("PDEV Tx Stats:\n");
7423 	DP_PRINT_STATS("Received From Stack:");
7424 	DP_PRINT_STATS("	Packets = %u",
7425 		       pdev->stats.tx_i.rcvd.num);
7426 	DP_PRINT_STATS("	Bytes = %llu",
7427 		       pdev->stats.tx_i.rcvd.bytes);
7428 	DP_PRINT_STATS("Received from Stack in FP:");
7429 	DP_PRINT_STATS("	Packets = %llu",
7430 		       pdev->stats.tx_i.rcvd_in_fast_xmit_flow);
7431 	DP_PRINT_STATS("Received from Stack per core:");
7432 	DP_PRINT_STATS("	Packets = %u %u %u %u",
7433 		       pdev->stats.tx_i.rcvd_per_core[0],
7434 		       pdev->stats.tx_i.rcvd_per_core[1],
7435 		       pdev->stats.tx_i.rcvd_per_core[2],
7436 		       pdev->stats.tx_i.rcvd_per_core[3]);
7437 	DP_PRINT_STATS("Processed:");
7438 	DP_PRINT_STATS("	Packets = %u",
7439 		       pdev->stats.tx_i.processed.num);
7440 	DP_PRINT_STATS("	Bytes = %llu",
7441 		       pdev->stats.tx_i.processed.bytes);
7442 	DP_PRINT_STATS("Total Completions:");
7443 	DP_PRINT_STATS("	Packets = %u",
7444 		       pdev->stats.tx.comp_pkt.num);
7445 	DP_PRINT_STATS("	Bytes = %llu",
7446 		       pdev->stats.tx.comp_pkt.bytes);
7447 	DP_PRINT_STATS("Successful Completions:");
7448 	DP_PRINT_STATS("	Packets = %u",
7449 		       pdev->stats.tx.tx_success.num);
7450 	DP_PRINT_STATS("	Bytes = %llu",
7451 		       pdev->stats.tx.tx_success.bytes);
7452 	DP_PRINT_STATS("Dropped:");
7453 	DP_PRINT_STATS("	Total = %u",
7454 		       pdev->stats.tx_i.dropped.dropped_pkt.num);
7455 	DP_PRINT_STATS("	Dma_map_error = %u",
7456 		       pdev->stats.tx_i.dropped.dma_error);
7457 	DP_PRINT_STATS("	Ring Full = %u",
7458 		       pdev->stats.tx_i.dropped.ring_full);
7459 	DP_PRINT_STATS("	Descriptor Not available = %u",
7460 		       pdev->stats.tx_i.dropped.desc_na.num);
7461 	DP_PRINT_STATS("	HW enqueue failed= %u",
7462 		       pdev->stats.tx_i.dropped.enqueue_fail);
7463 	DP_PRINT_STATS("        Descriptor alloc fail = %u",
7464 		       pdev->stats.tx_i.dropped.desc_na_exc_alloc_fail.num);
7465 	DP_PRINT_STATS("        Tx outstanding too many = %u",
7466 		       pdev->stats.tx_i.dropped.desc_na_exc_outstand.num);
7467 	DP_PRINT_STATS("	Pkt dropped in vdev-id check= %u",
7468 		       pdev->stats.tx_i.dropped.fail_per_pkt_vdev_id_check);
7469 	DP_PRINT_STATS("	Resources Full = %u",
7470 		       pdev->stats.tx_i.dropped.res_full);
7471 	DP_PRINT_STATS("	Drop Ingress = %u",
7472 		       pdev->stats.tx_i.dropped.drop_ingress);
7473 	DP_PRINT_STATS("	invalid peer id in exception path = %u",
7474 		       pdev->stats.tx_i.dropped.invalid_peer_id_in_exc_path);
7475 	DP_PRINT_STATS("	Tx Mcast Drop = %u",
7476 		       pdev->stats.tx_i.dropped.tx_mcast_drop);
7477 	DP_PRINT_STATS("Tx failed = %u",
7478 		       pdev->stats.tx.tx_failed);
7479 	DP_PRINT_STATS("	FW removed Pkts = %u",
7480 		       pdev->stats.tx.dropped.fw_rem.num);
7481 	DP_PRINT_STATS("	FW removed bytes= %llu",
7482 		       pdev->stats.tx.dropped.fw_rem.bytes);
7483 	DP_PRINT_STATS("	FW removed transmitted = %u",
7484 		       pdev->stats.tx.dropped.fw_rem_tx);
7485 	DP_PRINT_STATS("	FW removed untransmitted = %u",
7486 		       pdev->stats.tx.dropped.fw_rem_notx);
7487 	DP_PRINT_STATS("	FW removed untransmitted fw_reason1 = %u",
7488 		       pdev->stats.tx.dropped.fw_reason1);
7489 	DP_PRINT_STATS("	FW removed untransmitted fw_reason2 = %u",
7490 		       pdev->stats.tx.dropped.fw_reason2);
7491 	DP_PRINT_STATS("	FW removed untransmitted fw_reason3 = %u",
7492 		       pdev->stats.tx.dropped.fw_reason3);
7493 	DP_PRINT_STATS("	FW removed untransmitted disable queue = %u",
7494 		       pdev->stats.tx.dropped.fw_rem_queue_disable);
7495 	DP_PRINT_STATS("	FW removed untransmitted no match = %u",
7496 		       pdev->stats.tx.dropped.fw_rem_no_match);
7497 	DP_PRINT_STATS("	Dropped due to HW threshold criteria = %u",
7498 		       pdev->stats.tx.dropped.drop_threshold);
7499 	DP_PRINT_STATS("	Link desc not available drop = %u",
7500 		       pdev->stats.tx.dropped.drop_link_desc_na);
7501 	DP_PRINT_STATS("	Drop bit set or invalid flow = %u",
7502 		       pdev->stats.tx.dropped.invalid_drop);
7503 	DP_PRINT_STATS("	MCAST vdev drop in HW = %u",
7504 		       pdev->stats.tx.dropped.mcast_vdev_drop);
7505 	DP_PRINT_STATS("	Dropped with invalid reason = %u",
7506 		       pdev->stats.tx.dropped.invalid_rr);
7507 	DP_PRINT_STATS("	Aged Out from msdu/mpdu queues = %u",
7508 		       pdev->stats.tx.dropped.age_out);
7509 	DP_PRINT_STATS("	headroom insufficient = %u",
7510 		       pdev->stats.tx_i.dropped.headroom_insufficient);
7511 	DP_PRINT_STATS("Multicast:");
7512 	DP_PRINT_STATS("	Packets: %u",
7513 		       pdev->stats.tx.mcast.num);
7514 	DP_PRINT_STATS("	Bytes: %llu",
7515 		       pdev->stats.tx.mcast.bytes);
7516 	DP_PRINT_STATS("Scatter Gather:");
7517 	DP_PRINT_STATS("	Packets = %d",
7518 		       pdev->stats.tx_i.sg.sg_pkt.num);
7519 	DP_PRINT_STATS("	Bytes = %llu",
7520 		       pdev->stats.tx_i.sg.sg_pkt.bytes);
7521 	DP_PRINT_STATS("	Dropped By Host = %u",
7522 		       pdev->stats.tx_i.sg.dropped_host.num);
7523 	DP_PRINT_STATS("	Dropped By Target = %u",
7524 		       pdev->stats.tx_i.sg.dropped_target);
7525 	DP_PRINT_STATS("Mcast Enhancement:");
7526 	DP_PRINT_STATS("	Packets = %u",
7527 		       pdev->stats.tx_i.mcast_en.mcast_pkt.num);
7528 	DP_PRINT_STATS("	Bytes = %llu",
7529 		       pdev->stats.tx_i.mcast_en.mcast_pkt.bytes);
7530 	DP_PRINT_STATS("	Dropped: Map Errors = %u",
7531 		       pdev->stats.tx_i.mcast_en.dropped_map_error);
7532 	DP_PRINT_STATS("	Dropped: Self Mac = %u",
7533 		       pdev->stats.tx_i.mcast_en.dropped_self_mac);
7534 	DP_PRINT_STATS("	Dropped: Send Fail = %u",
7535 		       pdev->stats.tx_i.mcast_en.dropped_send_fail);
7536 	DP_PRINT_STATS("	Unicast sent = %u",
7537 		       pdev->stats.tx_i.mcast_en.ucast);
7538 
7539 	DP_PRINT_STATS("EAPOL Packets dropped:");
7540 	DP_PRINT_STATS("        Dropped: TX desc errors = %u",
7541 		       pdev->stats.eap_drop_stats.tx_desc_err);
7542 	DP_PRINT_STATS("        Dropped: Tx HAL ring access errors = %u",
7543 		       pdev->stats.eap_drop_stats.tx_hal_ring_access_err);
7544 	DP_PRINT_STATS("        Dropped: TX DMA map errors = %u",
7545 		       pdev->stats.eap_drop_stats.tx_dma_map_err);
7546 	DP_PRINT_STATS("        Dropped: Tx HW enqueue errors = %u",
7547 		       pdev->stats.eap_drop_stats.tx_hw_enqueue);
7548 	DP_PRINT_STATS("        Dropped: TX SW enqueue errors= %u",
7549 		       pdev->stats.eap_drop_stats.tx_sw_enqueue);
7550 
7551 	DP_PRINT_STATS("IGMP Mcast Enhancement:");
7552 	DP_PRINT_STATS("	IGMP packets received = %u",
7553 		       pdev->stats.tx_i.igmp_mcast_en.igmp_rcvd);
7554 	DP_PRINT_STATS("	Converted to uncast = %u",
7555 		       pdev->stats.tx_i.igmp_mcast_en.igmp_ucast_converted);
7556 	DP_PRINT_STATS("Raw:");
7557 	DP_PRINT_STATS("	Packets = %u",
7558 		       pdev->stats.tx_i.raw.raw_pkt.num);
7559 	DP_PRINT_STATS("	Bytes = %llu",
7560 		       pdev->stats.tx_i.raw.raw_pkt.bytes);
7561 	DP_PRINT_STATS("	DMA map error = %u",
7562 		       pdev->stats.tx_i.raw.dma_map_error);
7563 	DP_PRINT_STATS("        RAW pkt type[!data] error = %u",
7564 		       pdev->stats.tx_i.raw.invalid_raw_pkt_datatype);
7565 	DP_PRINT_STATS("        Frags count overflow  error = %u",
7566 		       pdev->stats.tx_i.raw.num_frags_overflow_err);
7567 	DP_PRINT_STATS("Reinjected:");
7568 	DP_PRINT_STATS("	Packets = %u",
7569 		       pdev->stats.tx_i.reinject_pkts.num);
7570 	DP_PRINT_STATS("	Bytes = %llu\n",
7571 		       pdev->stats.tx_i.reinject_pkts.bytes);
7572 	DP_PRINT_STATS("Inspected:");
7573 	DP_PRINT_STATS("	Packets = %d",
7574 		       pdev->stats.tx_i.inspect_pkts.num);
7575 	DP_PRINT_STATS("	Bytes = %llu",
7576 		       pdev->stats.tx_i.inspect_pkts.bytes);
7577 	DP_PRINT_STATS("Nawds Multicast:");
7578 	DP_PRINT_STATS("	Packets = %u",
7579 		       pdev->stats.tx_i.nawds_mcast.num);
7580 	DP_PRINT_STATS("	Bytes = %llu",
7581 		       pdev->stats.tx_i.nawds_mcast.bytes);
7582 	DP_PRINT_STATS("CCE Classified:");
7583 	DP_PRINT_STATS("	CCE Classified Packets: %u",
7584 		       pdev->stats.tx_i.cce_classified);
7585 	DP_PRINT_STATS("	RAW CCE Classified Packets: %u",
7586 		       pdev->stats.tx_i.cce_classified_raw);
7587 	DP_PRINT_STATS("Mesh stats:");
7588 	DP_PRINT_STATS("	frames to firmware: %u",
7589 		       pdev->stats.tx_i.mesh.exception_fw);
7590 	DP_PRINT_STATS("	completions from fw: %u",
7591 		       pdev->stats.tx_i.mesh.completion_fw);
7592 	DP_PRINT_STATS("PPDU stats counter");
7593 	for (index = 0; index < CDP_PPDU_STATS_MAX_TAG; index++) {
7594 		DP_PRINT_STATS("	Tag[%d] = %llu", index,
7595 			       pdev->stats.ppdu_stats_counter[index]);
7596 	}
7597 	DP_PRINT_STATS("BA not received for delayed_ba: %u",
7598 		       pdev->stats.cdp_delayed_ba_not_recev);
7599 
7600 	dp_monitor_print_tx_stats(pdev);
7601 
7602 	DP_PRINT_STATS("tx_ppdu_proc: %llu",
7603 		       pdev->stats.tx_ppdu_proc);
7604 	DP_PRINT_STATS("ack ba comes twice: %llu",
7605 		       pdev->stats.ack_ba_comes_twice);
7606 	DP_PRINT_STATS("ppdu dropped because of incomplete tlv: %llu",
7607 		       pdev->stats.ppdu_drop);
7608 	DP_PRINT_STATS("ppdu dropped because of wrap around: %llu",
7609 		       pdev->stats.ppdu_wrap_drop);
7610 
7611 	for (i = 0; i < CDP_WDI_NUM_EVENTS; i++) {
7612 		if (!pdev->stats.wdi_event[i])
7613 			DP_PRINT_STATS("Wdi msgs received from fw[%d]:%d",
7614 				       i, pdev->stats.wdi_event[i]);
7615 	}
7616 
7617 	dp_monitor_print_pdev_tx_capture_stats(pdev);
7618 }
7619 
7620 #ifdef WLAN_SUPPORT_RX_FLOW_TAG
7621 static inline void dp_rx_basic_fst_stats(struct dp_pdev *pdev)
7622 {
7623 	DP_PRINT_STATS("\tNo of IPv4 Flow entries inserted = %d",
7624 		       qdf_atomic_read(&pdev->soc->ipv4_fse_cnt));
7625 	DP_PRINT_STATS("\tNo of IPv6 Flow entries inserted = %d",
7626 		       qdf_atomic_read(&pdev->soc->ipv6_fse_cnt));
7627 }
7628 #else
7629 static inline void dp_rx_basic_fst_stats(struct dp_pdev *pdev)
7630 {
7631 }
7632 #endif
7633 
7634 void
7635 dp_print_pdev_rx_stats(struct dp_pdev *pdev)
7636 {
7637 	uint8_t i;
7638 
7639 	DP_PRINT_STATS("PDEV Rx Stats:\n");
7640 	DP_PRINT_STATS("Received From HW (Per Rx Ring):");
7641 	DP_PRINT_STATS("	Packets = %u %u %u %u",
7642 		       pdev->stats.rx.rcvd_reo[0].num,
7643 		       pdev->stats.rx.rcvd_reo[1].num,
7644 		       pdev->stats.rx.rcvd_reo[2].num,
7645 		       pdev->stats.rx.rcvd_reo[3].num);
7646 	DP_PRINT_STATS("	Bytes = %llu %llu %llu %llu",
7647 		       pdev->stats.rx.rcvd_reo[0].bytes,
7648 		       pdev->stats.rx.rcvd_reo[1].bytes,
7649 		       pdev->stats.rx.rcvd_reo[2].bytes,
7650 		       pdev->stats.rx.rcvd_reo[3].bytes);
7651 	for (i = 0; i < CDP_MAX_LMACS; i++)
7652 		DP_PRINT_STATS("Packets Received on lmac[%d] = %d (%llu)",
7653 			       i, pdev->stats.rx.rx_lmac[i].num,
7654 			       pdev->stats.rx.rx_lmac[i].bytes);
7655 	DP_PRINT_STATS("Replenished:");
7656 	DP_PRINT_STATS("	Packets = %u",
7657 		       pdev->stats.replenish.pkts.num);
7658 	DP_PRINT_STATS("	Buffers Added To Freelist = %u",
7659 		       pdev->stats.buf_freelist);
7660 	DP_PRINT_STATS("	Low threshold intr = %d",
7661 		       pdev->stats.replenish.low_thresh_intrs);
7662 	DP_PRINT_STATS("Dropped:");
7663 	DP_PRINT_STATS("	msdu_not_done = %u",
7664 		       pdev->stats.dropped.msdu_not_done);
7665 	DP_PRINT_STATS("        wifi parse = %u",
7666 		       pdev->stats.dropped.wifi_parse);
7667 	DP_PRINT_STATS("        mon_rx_drop = %u",
7668 		       pdev->stats.dropped.mon_rx_drop);
7669 	DP_PRINT_STATS("        mon_radiotap_update_err = %u",
7670 		       pdev->stats.dropped.mon_radiotap_update_err);
7671 	DP_PRINT_STATS("        mec_drop = %u",
7672 		       pdev->stats.rx.mec_drop.num);
7673 	DP_PRINT_STATS("	Bytes = %llu",
7674 		       pdev->stats.rx.mec_drop.bytes);
7675 	DP_PRINT_STATS("	peer_unauth_drop = %u",
7676 		       pdev->stats.rx.peer_unauth_rx_pkt_drop);
7677 	DP_PRINT_STATS("	policy_check_drop = %u",
7678 		       pdev->stats.rx.policy_check_drop);
7679 	DP_PRINT_STATS("Sent To Stack:");
7680 	DP_PRINT_STATS("	Packets = %u",
7681 		       pdev->stats.rx.to_stack.num);
7682 	DP_PRINT_STATS("	Bytes = %llu",
7683 		       pdev->stats.rx.to_stack.bytes);
7684 	DP_PRINT_STATS("        vlan_tag_stp_cnt = %u",
7685 		       pdev->stats.vlan_tag_stp_cnt);
7686 	DP_PRINT_STATS("Multicast/Broadcast:");
7687 	DP_PRINT_STATS("	Packets = %u",
7688 		       pdev->stats.rx.multicast.num);
7689 	DP_PRINT_STATS("	Bytes = %llu",
7690 		       pdev->stats.rx.multicast.bytes);
7691 	DP_PRINT_STATS("Errors:");
7692 	DP_PRINT_STATS("	Rxdma Ring Un-inititalized = %u",
7693 		       pdev->stats.replenish.rxdma_err);
7694 	DP_PRINT_STATS("	Desc Alloc Failed: = %u",
7695 		       pdev->stats.err.desc_alloc_fail);
7696 	DP_PRINT_STATS("        Low threshold Desc Alloc Failed: = %u",
7697 		       pdev->stats.err.desc_lt_alloc_fail);
7698 	DP_PRINT_STATS("	IP checksum error = %u",
7699 		       pdev->stats.err.ip_csum_err);
7700 	DP_PRINT_STATS("	TCP/UDP checksum error = %u",
7701 		       pdev->stats.err.tcp_udp_csum_err);
7702 	DP_PRINT_STATS("	Failed frag alloc = %u",
7703 		       pdev->stats.replenish.frag_alloc_fail);
7704 
7705 	dp_pdev_iterate_peer_lock_safe(pdev, dp_peer_ctrl_frames_stats_get,
7706 				       NULL, DP_MOD_ID_GENERIC_STATS);
7707 	/* Get bar_recv_cnt */
7708 	DP_PRINT_STATS("BAR Received Count: = %u",
7709 		       pdev->stats.rx.bar_recv_cnt);
7710 
7711 	DP_PRINT_STATS("RX Buffer Pool Stats:\n");
7712 	DP_PRINT_STATS("\tBuffers consumed during refill = %llu",
7713 		       pdev->stats.rx_buffer_pool.num_bufs_consumed);
7714 	DP_PRINT_STATS("\tSuccessful allocations during refill = %llu",
7715 		       pdev->stats.rx_buffer_pool.num_bufs_alloc_success);
7716 	DP_PRINT_STATS("\tAllocations from the pool during replenish = %llu",
7717 		       pdev->stats.rx_buffer_pool.num_pool_bufs_replenish);
7718 
7719 	dp_rx_basic_fst_stats(pdev);
7720 }
7721 
7722 #ifdef WLAN_SUPPORT_PPEDS
7723 void dp_print_tx_ppeds_stats(struct dp_soc *soc)
7724 {
7725 	if (soc->arch_ops.dp_tx_ppeds_inuse_desc)
7726 		soc->arch_ops.dp_tx_ppeds_inuse_desc(soc);
7727 }
7728 #else
7729 void dp_print_tx_ppeds_stats(struct dp_soc *soc)
7730 {
7731 }
7732 #endif
7733 
7734 void
7735 dp_print_soc_tx_stats(struct dp_soc *soc)
7736 {
7737 	uint8_t desc_pool_id;
7738 
7739 	soc->stats.tx.desc_in_use = 0;
7740 
7741 	DP_PRINT_STATS("SOC Tx Stats:\n");
7742 
7743 	for (desc_pool_id = 0;
7744 	     desc_pool_id < wlan_cfg_get_num_tx_desc_pool(soc->wlan_cfg_ctx);
7745 	     desc_pool_id++)
7746 		soc->stats.tx.desc_in_use +=
7747 			soc->tx_desc[desc_pool_id].num_allocated;
7748 
7749 	DP_PRINT_STATS("Tx Descriptors In Use = %u",
7750 		       soc->stats.tx.desc_in_use);
7751 	DP_PRINT_STATS("Tx Invalid peer:");
7752 	DP_PRINT_STATS("	Packets = %u",
7753 		       soc->stats.tx.tx_invalid_peer.num);
7754 	DP_PRINT_STATS("	Bytes = %llu",
7755 		       soc->stats.tx.tx_invalid_peer.bytes);
7756 	DP_PRINT_STATS("Packets dropped due to TCL ring full = %u %u %u %u",
7757 		       soc->stats.tx.tcl_ring_full[0],
7758 		       soc->stats.tx.tcl_ring_full[1],
7759 		       soc->stats.tx.tcl_ring_full[2],
7760 		       soc->stats.tx.tcl_ring_full[3]);
7761 	DP_PRINT_STATS("Tx invalid completion release = %u",
7762 		       soc->stats.tx.invalid_release_source);
7763 	DP_PRINT_STATS("TX invalid Desc from completion ring = %u",
7764 		       soc->stats.tx.invalid_tx_comp_desc);
7765 	DP_PRINT_STATS("Tx comp wbm internal error = %d : [%d %d %d %d]",
7766 		       soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_ALL],
7767 		       soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_BUFFER],
7768 		       soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_LINK_DESC],
7769 		       soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_MSDU_BUFF],
7770 		       soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_BUFF_REAPED]);
7771 	DP_PRINT_STATS("Tx comp non wbm internal error = %d",
7772 		       soc->stats.tx.non_wbm_internal_err);
7773 	DP_PRINT_STATS("Tx comp loop pkt limit hit = %d",
7774 		       soc->stats.tx.tx_comp_loop_pkt_limit_hit);
7775 	DP_PRINT_STATS("Tx comp HP out of sync2 = %d",
7776 		       soc->stats.tx.hp_oos2);
7777 	dp_print_tx_ppeds_stats(soc);
7778 }
7779 
7780 static
7781 int dp_fill_rx_interrupt_ctx_stats(struct dp_intr *intr_ctx,
7782 				   char *buf, int buf_len)
7783 {	int i;
7784 	int pos = 0;
7785 
7786 	if (buf_len <= 0 || !buf) {
7787 		dp_err("incorrect buf or buf_len(%d)!", buf_len);
7788 		return pos;
7789 	}
7790 
7791 	for (i = 0; i < MAX_REO_DEST_RINGS; i++) {
7792 		if (intr_ctx->intr_stats.num_rx_ring_masks[i])
7793 			pos += qdf_scnprintf(buf + pos,
7794 					     buf_len - pos,
7795 					     "reo[%u]:%u ", i,
7796 					     intr_ctx->intr_stats.num_rx_ring_masks[i]);
7797 	}
7798 	return pos;
7799 }
7800 
7801 static
7802 int dp_fill_tx_interrupt_ctx_stats(struct dp_intr *intr_ctx,
7803 				   char *buf, int buf_len)
7804 {	int i;
7805 	int pos = 0;
7806 
7807 	if (buf_len <= 0 || !buf) {
7808 		dp_err("incorrect buf or buf_len(%d)!", buf_len);
7809 		return pos;
7810 	}
7811 
7812 	for (i = 0; i < MAX_TCL_DATA_RINGS; i++) {
7813 		if (intr_ctx->intr_stats.num_tx_ring_masks[i])
7814 			pos += qdf_scnprintf(buf + pos,
7815 					     buf_len - pos,
7816 					     "tx_comps[%u]:%u ", i,
7817 					     intr_ctx->intr_stats.num_tx_ring_masks[i]);
7818 	}
7819 	return pos;
7820 }
7821 
7822 #ifdef WLAN_DP_SRNG_USAGE_WM_TRACKING
7823 #define DP_SRNG_HIGH_WM_STATS_STRING_LEN 512
7824 void dp_dump_srng_high_wm_stats(struct dp_soc *soc, uint64_t srng_mask)
7825 {
7826 	char *buf;
7827 	int ring, pos, buf_len;
7828 	char srng_high_wm_str[DP_SRNG_HIGH_WM_STATS_STRING_LEN] = {'\0'};
7829 
7830 	if (!srng_mask)
7831 		return;
7832 
7833 	buf = srng_high_wm_str;
7834 	buf_len = DP_SRNG_HIGH_WM_STATS_STRING_LEN;
7835 
7836 	dp_info("%8s %7s %12s %10s %10s %10s %10s %10s %10s",
7837 		"ring_id", "high_wm", "time", "<50", "50-60", "60-70",
7838 		"70-80", "80-90", "90-100");
7839 
7840 	if (srng_mask & (1 << REO_DST)) {
7841 		for (ring = 0; ring < soc->num_reo_dest_rings; ring++) {
7842 			pos = 0;
7843 			pos += hal_dump_srng_high_wm_stats(soc->hal_soc,
7844 					    soc->reo_dest_ring[ring].hal_srng,
7845 					    buf, buf_len, pos);
7846 			dp_info("%s", srng_high_wm_str);
7847 		}
7848 	}
7849 }
7850 #endif
7851 
7852 #define DP_INT_CTX_STATS_STRING_LEN 512
7853 void dp_print_soc_interrupt_stats(struct dp_soc *soc)
7854 {
7855 	char *buf;
7856 	char int_ctx_str[DP_INT_CTX_STATS_STRING_LEN] = {'\0'};
7857 	int i, pos, buf_len;
7858 	struct dp_intr_stats *intr_stats;
7859 
7860 	buf = int_ctx_str;
7861 	buf_len = DP_INT_CTX_STATS_STRING_LEN;
7862 
7863 	for (i = 0; i < WLAN_CFG_INT_NUM_CONTEXTS; i++) {
7864 		pos = 0;
7865 		qdf_mem_zero(int_ctx_str, sizeof(int_ctx_str));
7866 		intr_stats = &soc->intr_ctx[i].intr_stats;
7867 
7868 		if (!intr_stats->num_masks && !intr_stats->num_near_full_masks)
7869 			continue;
7870 
7871 		pos += qdf_scnprintf(buf + pos,
7872 				     buf_len - pos,
7873 				     "%2u[%3d] - Total:%u ",
7874 				     i,
7875 				     hif_get_int_ctx_irq_num(soc->hif_handle,
7876 							     i),
7877 				     intr_stats->num_masks);
7878 
7879 		if (soc->intr_ctx[i].tx_ring_mask)
7880 			pos += dp_fill_tx_interrupt_ctx_stats(&soc->intr_ctx[i],
7881 							      buf + pos,
7882 							      buf_len - pos);
7883 
7884 		if (soc->intr_ctx[i].rx_ring_mask)
7885 			pos += dp_fill_rx_interrupt_ctx_stats(&soc->intr_ctx[i],
7886 							      buf + pos,
7887 							      buf_len - pos);
7888 		if (soc->intr_ctx[i].rx_err_ring_mask)
7889 			pos += qdf_scnprintf(buf + pos,
7890 					     buf_len - pos,
7891 					     "reo_err:%u ",
7892 					     intr_stats->num_rx_err_ring_masks);
7893 
7894 		if (soc->intr_ctx[i].rx_wbm_rel_ring_mask)
7895 			pos += qdf_scnprintf(buf + pos,
7896 					     buf_len - pos,
7897 					     "wbm_rx_err:%u ",
7898 					     intr_stats->num_rx_wbm_rel_ring_masks);
7899 
7900 		if (soc->intr_ctx[i].rxdma2host_ring_mask)
7901 			pos += qdf_scnprintf(buf + pos,
7902 					     buf_len - pos,
7903 					     "rxdma2_host_err:%u ",
7904 					     intr_stats->num_rxdma2host_ring_masks);
7905 
7906 		if (soc->intr_ctx[i].rx_near_full_grp_1_mask)
7907 			pos += qdf_scnprintf(buf + pos,
7908 					     buf_len - pos,
7909 					     "rx_near_full_grp_1:%u ",
7910 					     intr_stats->num_near_full_masks);
7911 
7912 		if (soc->intr_ctx[i].rx_near_full_grp_2_mask)
7913 			pos += qdf_scnprintf(buf + pos,
7914 					     buf_len - pos,
7915 					     "rx_near_full_grp_2:%u ",
7916 					     intr_stats->num_near_full_masks);
7917 		if (soc->intr_ctx[i].tx_ring_near_full_mask)
7918 			pos += qdf_scnprintf(buf + pos,
7919 					     buf_len - pos,
7920 					     "tx_near_full:%u ",
7921 					     intr_stats->num_near_full_masks);
7922 
7923 		dp_info("%s", int_ctx_str);
7924 	}
7925 }
7926 
7927 void
7928 dp_print_soc_rx_stats(struct dp_soc *soc)
7929 {
7930 	uint32_t i;
7931 	char reo_error[DP_REO_ERR_LENGTH];
7932 	char rxdma_error[DP_RXDMA_ERR_LENGTH];
7933 	uint8_t index = 0;
7934 
7935 	DP_PRINT_STATS("No of AST Entries = %d", soc->num_ast_entries);
7936 	DP_PRINT_STATS("SOC Rx Stats:\n");
7937 	DP_PRINT_STATS("Fast recycled packets: %llu",
7938 		       soc->stats.rx.fast_recycled);
7939 	DP_PRINT_STATS("Fragmented packets: %u",
7940 		       soc->stats.rx.rx_frags);
7941 	DP_PRINT_STATS("Reo reinjected packets: %u",
7942 		       soc->stats.rx.reo_reinject);
7943 	DP_PRINT_STATS("Errors:\n");
7944 	DP_PRINT_STATS("Rx Decrypt Errors = %d",
7945 		       (soc->stats.rx.err.rxdma_error[HAL_RXDMA_ERR_DECRYPT] +
7946 		       soc->stats.rx.err.rxdma_error[HAL_RXDMA_ERR_TKIP_MIC]));
7947 	DP_PRINT_STATS("Invalid RBM = %d",
7948 		       soc->stats.rx.err.invalid_rbm);
7949 	DP_PRINT_STATS("Invalid Vdev = %d",
7950 		       soc->stats.rx.err.invalid_vdev);
7951 	DP_PRINT_STATS("Invalid sa_idx or da_idx = %d",
7952 		       soc->stats.rx.err.invalid_sa_da_idx);
7953 	DP_PRINT_STATS("Defrag peer uninit = %d",
7954 		       soc->stats.rx.err.defrag_peer_uninit);
7955 	DP_PRINT_STATS("Pkts delivered no peer = %d",
7956 		       soc->stats.rx.err.pkt_delivered_no_peer);
7957 	DP_PRINT_STATS("Invalid Pdev = %d",
7958 		       soc->stats.rx.err.invalid_pdev);
7959 	DP_PRINT_STATS("Invalid Peer = %d",
7960 		       soc->stats.rx.err.rx_invalid_peer.num);
7961 	DP_PRINT_STATS("HAL Ring Access Fail = %d",
7962 		       soc->stats.rx.err.hal_ring_access_fail);
7963 	DP_PRINT_STATS("HAL Ring Access Full Fail = %d",
7964 		       soc->stats.rx.err.hal_ring_access_full_fail);
7965 	DP_PRINT_STATS("MSDU Done failures = %d",
7966 		       soc->stats.rx.err.msdu_done_fail);
7967 	DP_PRINT_STATS("RX frags: %d", soc->stats.rx.rx_frags);
7968 	DP_PRINT_STATS("RX frag wait: %d", soc->stats.rx.rx_frag_wait);
7969 	DP_PRINT_STATS("RX frag err: %d", soc->stats.rx.rx_frag_err);
7970 	DP_PRINT_STATS("RX frag OOR: %d", soc->stats.rx.rx_frag_oor);
7971 
7972 	DP_PRINT_STATS("RX HP out_of_sync: %d", soc->stats.rx.hp_oos2);
7973 	DP_PRINT_STATS("RX Ring Near Full: %d", soc->stats.rx.near_full);
7974 
7975 	DP_PRINT_STATS("RX Reap Loop Pkt Limit Hit: %d",
7976 		       soc->stats.rx.reap_loop_pkt_limit_hit);
7977 	DP_PRINT_STATS("RX DESC invalid magic: %u",
7978 		       soc->stats.rx.err.rx_desc_invalid_magic);
7979 	DP_PRINT_STATS("RX DUP DESC: %d",
7980 		       soc->stats.rx.err.hal_reo_dest_dup);
7981 	DP_PRINT_STATS("RX REL DUP DESC: %d",
7982 		       soc->stats.rx.err.hal_wbm_rel_dup);
7983 
7984 	DP_PRINT_STATS("RXDMA ERR DUP DESC: %d",
7985 		       soc->stats.rx.err.hal_rxdma_err_dup);
7986 
7987 	DP_PRINT_STATS("RX scatter msdu: %d",
7988 		       soc->stats.rx.err.scatter_msdu);
7989 
7990 	DP_PRINT_STATS("RX invalid cookie: %d",
7991 		       soc->stats.rx.err.invalid_cookie);
7992 
7993 	DP_PRINT_STATS("RX stale cookie: %d",
7994 		       soc->stats.rx.err.stale_cookie);
7995 
7996 	DP_PRINT_STATS("RX wait completed msdu break: %d",
7997 		       soc->stats.rx.msdu_scatter_wait_break);
7998 
7999 	DP_PRINT_STATS("2k jump delba sent: %d",
8000 		       soc->stats.rx.err.rx_2k_jump_delba_sent);
8001 
8002 	DP_PRINT_STATS("2k jump msdu to stack: %d",
8003 		       soc->stats.rx.err.rx_2k_jump_to_stack);
8004 
8005 	DP_PRINT_STATS("2k jump msdu drop: %d",
8006 		       soc->stats.rx.err.rx_2k_jump_drop);
8007 
8008 	DP_PRINT_STATS("REO err oor msdu to stack %d",
8009 		       soc->stats.rx.err.reo_err_oor_to_stack);
8010 
8011 	DP_PRINT_STATS("REO err oor msdu drop: %d",
8012 		       soc->stats.rx.err.reo_err_oor_drop);
8013 
8014 	DP_PRINT_STATS("REO err raw ampdu drop: %d",
8015 		       soc->stats.rx.err.reo_err_raw_mpdu_drop);
8016 
8017 	DP_PRINT_STATS("Rx err msdu rejected: %d",
8018 		       soc->stats.rx.err.rejected);
8019 
8020 	DP_PRINT_STATS("Rx stale link desc cookie: %d",
8021 		       soc->stats.rx.err.invalid_link_cookie);
8022 
8023 	DP_PRINT_STATS("Rx nbuf sanity fail: %d",
8024 		       soc->stats.rx.err.nbuf_sanity_fail);
8025 
8026 	DP_PRINT_STATS("Rx err msdu continuation err: %d",
8027 		       soc->stats.rx.err.msdu_continuation_err);
8028 
8029 	DP_PRINT_STATS("ssn update count: %d",
8030 		       soc->stats.rx.err.ssn_update_count);
8031 
8032 	DP_PRINT_STATS("bar handle update fail count: %d",
8033 		       soc->stats.rx.err.bar_handle_fail_count);
8034 
8035 	DP_PRINT_STATS("PN-in-Dest error frame pn-check fail: %d",
8036 		       soc->stats.rx.err.pn_in_dest_check_fail);
8037 
8038 	for (i = 0; i < HAL_RXDMA_ERR_MAX; i++) {
8039 		index += qdf_snprint(&rxdma_error[index],
8040 				DP_RXDMA_ERR_LENGTH - index,
8041 				" %d", soc->stats.rx.err.rxdma_error[i]);
8042 	}
8043 	DP_PRINT_STATS("RXDMA Error (0-31):%s", rxdma_error);
8044 
8045 	index = 0;
8046 	for (i = 0; i < HAL_REO_ERR_MAX; i++) {
8047 		index += qdf_snprint(&reo_error[index],
8048 				DP_REO_ERR_LENGTH - index,
8049 				" %d", soc->stats.rx.err.reo_error[i]);
8050 	}
8051 	DP_PRINT_STATS("REO Error(0-14):%s", reo_error);
8052 	DP_PRINT_STATS("REO CMD SEND FAIL: %d",
8053 		       soc->stats.rx.err.reo_cmd_send_fail);
8054 
8055 	DP_PRINT_STATS("Rx BAR frames:%d", soc->stats.rx.bar_frame);
8056 	DP_PRINT_STATS("Rxdma2rel route drop:%d",
8057 		       soc->stats.rx.rxdma2rel_route_drop);
8058 	DP_PRINT_STATS("Reo2rel route drop:%d",
8059 		       soc->stats.rx.reo2rel_route_drop);
8060 	DP_PRINT_STATS("Rx Flush count:%d", soc->stats.rx.err.rx_flush_count);
8061 	DP_PRINT_STATS("RX HW stats request count:%d",
8062 		       soc->stats.rx.rx_hw_stats_requested);
8063 	DP_PRINT_STATS("RX HW stats request timeout:%d",
8064 		       soc->stats.rx.rx_hw_stats_timeout);
8065 	DP_PRINT_STATS("Rx invalid TID count:%d",
8066 		       soc->stats.rx.err.rx_invalid_tid_err);
8067 	DP_PRINT_STATS("Rx Defrag Address1 Invalid:%d",
8068 		       soc->stats.rx.err.defrag_ad1_invalid);
8069 }
8070 
8071 #ifdef FEATURE_TSO_STATS
8072 void dp_print_tso_stats(struct dp_soc *soc,
8073 			enum qdf_stats_verbosity_level level)
8074 {
8075 	uint8_t loop_pdev;
8076 	uint32_t id;
8077 	struct dp_pdev *pdev;
8078 
8079 	for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) {
8080 		pdev = soc->pdev_list[loop_pdev];
8081 		DP_PRINT_STATS("TSO Statistics\n");
8082 		DP_PRINT_STATS(
8083 			  "From stack: %d | Successful completions: %d | TSO Packets: %d | TSO Completions: %d",
8084 			  pdev->stats.tx_i.rcvd.num,
8085 			  pdev->stats.tx.tx_success.num,
8086 			  pdev->stats.tso_stats.num_tso_pkts.num,
8087 			  pdev->stats.tso_stats.tso_comp);
8088 
8089 		for (id = 0; id < CDP_MAX_TSO_PACKETS; id++) {
8090 			/* TSO LEVEL 1 - PACKET INFO */
8091 			DP_PRINT_STATS(
8092 				  "Packet_Id:[%u]: Packet Length %zu | No. of segments: %u",
8093 				  id,
8094 				  pdev->stats.tso_stats.tso_info
8095 				  .tso_packet_info[id].tso_packet_len,
8096 				  pdev->stats.tso_stats.tso_info
8097 				  .tso_packet_info[id].num_seg);
8098 			/* TSO LEVEL 2 */
8099 			if (level == QDF_STATS_VERBOSITY_LEVEL_HIGH)
8100 				dp_print_tso_seg_stats(pdev, id);
8101 		}
8102 
8103 		DP_PRINT_STATS(
8104 			  "TSO Histogram: Single: %llu | 2-5 segs: %llu | 6-10: %llu segs | 11-15 segs: %llu | 16-20 segs: %llu | 20+ segs: %llu",
8105 			  pdev->stats.tso_stats.seg_histogram.segs_1,
8106 			  pdev->stats.tso_stats.seg_histogram.segs_2_5,
8107 			  pdev->stats.tso_stats.seg_histogram.segs_6_10,
8108 			  pdev->stats.tso_stats.seg_histogram.segs_11_15,
8109 			  pdev->stats.tso_stats.seg_histogram.segs_16_20,
8110 			  pdev->stats.tso_stats.seg_histogram.segs_20_plus);
8111 	}
8112 }
8113 
8114 void dp_stats_tso_segment_histogram_update(struct dp_pdev *pdev,
8115 					   uint8_t _p_cntrs)
8116 {
8117 	if (_p_cntrs == 1) {
8118 		DP_STATS_INC(pdev,
8119 			     tso_stats.seg_histogram.segs_1, 1);
8120 	} else if (_p_cntrs >= 2 && _p_cntrs <= 5) {
8121 		DP_STATS_INC(pdev,
8122 			     tso_stats.seg_histogram.segs_2_5, 1);
8123 	} else if (_p_cntrs > 5 && _p_cntrs <= 10) {
8124 		DP_STATS_INC(pdev,
8125 			     tso_stats.seg_histogram.segs_6_10, 1);
8126 	} else if (_p_cntrs > 10 && _p_cntrs <= 15) {
8127 		DP_STATS_INC(pdev,
8128 			     tso_stats.seg_histogram.segs_11_15, 1);
8129 	} else if (_p_cntrs > 15 && _p_cntrs <= 20) {
8130 		DP_STATS_INC(pdev,
8131 			     tso_stats.seg_histogram.segs_16_20, 1);
8132 	} else if (_p_cntrs > 20) {
8133 		DP_STATS_INC(pdev,
8134 			     tso_stats.seg_histogram.segs_20_plus, 1);
8135 	}
8136 }
8137 
8138 void dp_tso_segment_update(struct dp_pdev *pdev,
8139 			   uint32_t stats_idx,
8140 			   uint8_t idx,
8141 			   struct qdf_tso_seg_t seg)
8142 {
8143 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8144 		     .tso_seg[idx].num_frags,
8145 		     seg.num_frags);
8146 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8147 		     .tso_seg[idx].total_len,
8148 		     seg.total_len);
8149 
8150 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8151 		     .tso_seg[idx].tso_flags.tso_enable,
8152 		     seg.tso_flags.tso_enable);
8153 
8154 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8155 		     .tso_seg[idx].tso_flags.fin,
8156 		     seg.tso_flags.fin);
8157 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8158 		     .tso_seg[idx].tso_flags.syn,
8159 		     seg.tso_flags.syn);
8160 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8161 		     .tso_seg[idx].tso_flags.rst,
8162 		     seg.tso_flags.rst);
8163 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8164 		     .tso_seg[idx].tso_flags.psh,
8165 		     seg.tso_flags.psh);
8166 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8167 		     .tso_seg[idx].tso_flags.ack,
8168 		     seg.tso_flags.ack);
8169 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8170 		     .tso_seg[idx].tso_flags.urg,
8171 		     seg.tso_flags.urg);
8172 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8173 		     .tso_seg[idx].tso_flags.ece,
8174 		     seg.tso_flags.ece);
8175 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8176 		     .tso_seg[idx].tso_flags.cwr,
8177 		     seg.tso_flags.cwr);
8178 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8179 		     .tso_seg[idx].tso_flags.ns,
8180 		     seg.tso_flags.ns);
8181 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8182 		     .tso_seg[idx].tso_flags.tcp_seq_num,
8183 		     seg.tso_flags.tcp_seq_num);
8184 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8185 		     .tso_seg[idx].tso_flags.ip_id,
8186 		     seg.tso_flags.ip_id);
8187 }
8188 
8189 void dp_tso_packet_update(struct dp_pdev *pdev, uint32_t stats_idx,
8190 			  qdf_nbuf_t msdu, uint16_t num_segs)
8191 {
8192 	DP_STATS_UPD(pdev,
8193 		     tso_stats.tso_info.tso_packet_info[stats_idx]
8194 		     .num_seg,
8195 		     num_segs);
8196 
8197 	DP_STATS_UPD(pdev,
8198 		     tso_stats.tso_info.tso_packet_info[stats_idx]
8199 		     .tso_packet_len,
8200 		     qdf_nbuf_get_tcp_payload_len(msdu));
8201 }
8202 
8203 void dp_tso_segment_stats_update(struct dp_pdev *pdev,
8204 				 struct qdf_tso_seg_elem_t *stats_seg,
8205 				 uint32_t stats_idx)
8206 {
8207 	uint8_t tso_seg_idx = 0;
8208 
8209 	while (stats_seg  && (tso_seg_idx < CDP_MAX_TSO_SEGMENTS)) {
8210 		dp_tso_segment_update(pdev, stats_idx,
8211 				      tso_seg_idx,
8212 				      stats_seg->seg);
8213 		++tso_seg_idx;
8214 		stats_seg = stats_seg->next;
8215 	}
8216 }
8217 
8218 void dp_txrx_clear_tso_stats(struct dp_soc *soc)
8219 {
8220 	uint8_t loop_pdev;
8221 	struct dp_pdev *pdev;
8222 
8223 	for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) {
8224 		pdev = soc->pdev_list[loop_pdev];
8225 		dp_init_tso_stats(pdev);
8226 	}
8227 }
8228 #endif /* FEATURE_TSO_STATS */
8229 
8230 QDF_STATUS dp_txrx_get_peer_per_pkt_stats_param(struct dp_peer *peer,
8231 						enum cdp_peer_stats_type type,
8232 						cdp_peer_stats_param_t *buf)
8233 {
8234 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
8235 	struct dp_peer *tgt_peer;
8236 	struct dp_txrx_peer *txrx_peer;
8237 	struct dp_peer_per_pkt_stats *peer_stats;
8238 
8239 	txrx_peer = dp_get_txrx_peer(peer);
8240 	if (!txrx_peer)
8241 		return QDF_STATUS_E_FAILURE;
8242 
8243 	peer_stats = &txrx_peer->stats.per_pkt_stats;
8244 	switch (type) {
8245 	case cdp_peer_tx_ucast:
8246 		buf->tx_ucast = peer_stats->tx.ucast;
8247 		break;
8248 	case cdp_peer_tx_mcast:
8249 		buf->tx_mcast = peer_stats->tx.mcast;
8250 		break;
8251 	case cdp_peer_tx_inactive_time:
8252 		tgt_peer = dp_get_tgt_peer_from_peer(peer);
8253 		if (tgt_peer)
8254 			buf->tx_inactive_time =
8255 					tgt_peer->stats.tx.inactive_time;
8256 		else
8257 			ret = QDF_STATUS_E_FAILURE;
8258 		break;
8259 	case cdp_peer_rx_ucast:
8260 		buf->rx_ucast = peer_stats->rx.unicast;
8261 		break;
8262 	default:
8263 		ret = QDF_STATUS_E_FAILURE;
8264 		break;
8265 	}
8266 
8267 	return ret;
8268 }
8269 
8270 #ifdef QCA_ENHANCED_STATS_SUPPORT
8271 #ifdef WLAN_FEATURE_11BE_MLO
8272 QDF_STATUS dp_txrx_get_peer_extd_stats_param(struct dp_peer *peer,
8273 					     enum cdp_peer_stats_type type,
8274 					     cdp_peer_stats_param_t *buf)
8275 {
8276 	QDF_STATUS ret = QDF_STATUS_E_FAILURE;
8277 	struct dp_soc *soc = peer->vdev->pdev->soc;
8278 
8279 	if (IS_MLO_DP_MLD_PEER(peer)) {
8280 		struct dp_peer *link_peer;
8281 		struct dp_soc *link_peer_soc;
8282 
8283 		link_peer = dp_get_primary_link_peer_by_id(soc, peer->peer_id,
8284 							   DP_MOD_ID_CDP);
8285 
8286 		if (link_peer) {
8287 			link_peer_soc = link_peer->vdev->pdev->soc;
8288 			ret = dp_monitor_peer_get_stats_param(link_peer_soc,
8289 							      link_peer,
8290 							      type, buf);
8291 			dp_peer_unref_delete(link_peer, DP_MOD_ID_CDP);
8292 		}
8293 		return ret;
8294 	} else {
8295 		return dp_monitor_peer_get_stats_param(soc, peer, type, buf);
8296 	}
8297 }
8298 #else
8299 QDF_STATUS dp_txrx_get_peer_extd_stats_param(struct dp_peer *peer,
8300 					     enum cdp_peer_stats_type type,
8301 					     cdp_peer_stats_param_t *buf)
8302 {
8303 	struct dp_soc *soc = peer->vdev->pdev->soc;
8304 
8305 	return dp_monitor_peer_get_stats_param(soc, peer, type, buf);
8306 }
8307 #endif
8308 #else
8309 QDF_STATUS dp_txrx_get_peer_extd_stats_param(struct dp_peer *peer,
8310 					     enum cdp_peer_stats_type type,
8311 					     cdp_peer_stats_param_t *buf)
8312 {
8313 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
8314 	struct dp_txrx_peer *txrx_peer;
8315 	struct dp_peer_extd_stats *peer_stats;
8316 
8317 	txrx_peer = dp_get_txrx_peer(peer);
8318 	if (!txrx_peer)
8319 		return QDF_STATUS_E_FAILURE;
8320 
8321 	peer_stats = &txrx_peer->stats.extd_stats;
8322 
8323 	switch (type) {
8324 	case cdp_peer_tx_rate:
8325 		buf->tx_rate = peer_stats->tx.tx_rate;
8326 		break;
8327 	case cdp_peer_tx_last_tx_rate:
8328 		buf->last_tx_rate = peer_stats->tx.last_tx_rate;
8329 		break;
8330 	case cdp_peer_tx_ratecode:
8331 		buf->tx_ratecode = peer_stats->tx.tx_ratecode;
8332 		break;
8333 	case cdp_peer_rx_rate:
8334 		buf->rx_rate = peer_stats->rx.rx_rate;
8335 		break;
8336 	case cdp_peer_rx_last_rx_rate:
8337 		buf->last_rx_rate = peer_stats->rx.last_rx_rate;
8338 		break;
8339 	case cdp_peer_rx_ratecode:
8340 		buf->rx_ratecode = peer_stats->rx.rx_ratecode;
8341 		break;
8342 	case cdp_peer_rx_avg_snr:
8343 		buf->rx_avg_snr = peer_stats->rx.avg_snr;
8344 		break;
8345 	case cdp_peer_rx_snr:
8346 		buf->rx_snr = peer_stats->rx.snr;
8347 		break;
8348 	default:
8349 		ret = QDF_STATUS_E_FAILURE;
8350 		break;
8351 	}
8352 
8353 	return ret;
8354 }
8355 #endif
8356 
8357 /**
8358  * dp_is_wds_extended() - Check if wds ext is enabled
8359  * @txrx_peer: DP txrx_peer handle
8360  *
8361  * Return: true if enabled, false if not
8362  */
8363 #ifdef QCA_SUPPORT_WDS_EXTENDED
8364 static inline
8365 bool dp_is_wds_extended(struct dp_txrx_peer *txrx_peer)
8366 {
8367 	if (qdf_atomic_test_bit(WDS_EXT_PEER_INIT_BIT,
8368 				&txrx_peer->wds_ext.init))
8369 		return true;
8370 
8371 	return false;
8372 }
8373 #else
8374 static inline
8375 bool dp_is_wds_extended(struct dp_txrx_peer *txrx_peer)
8376 {
8377 	return false;
8378 }
8379 #endif /* QCA_SUPPORT_WDS_EXTENDED */
8380 
8381 /**
8382  * dp_peer_get_hw_txrx_stats_en() - Get value of hw_txrx_stats_en
8383  * @txrx_peer: DP txrx_peer handle
8384  *
8385  * Return: true if enabled, false if not
8386  */
8387 #ifdef QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT
8388 static inline
8389 bool dp_peer_get_hw_txrx_stats_en(struct dp_txrx_peer *txrx_peer)
8390 {
8391 	return txrx_peer->hw_txrx_stats_en;
8392 }
8393 #else
8394 static inline
8395 bool dp_peer_get_hw_txrx_stats_en(struct dp_txrx_peer *txrx_peer)
8396 {
8397 	return false;
8398 }
8399 #endif
8400 
8401 #ifdef WLAN_FEATURE_11BE_MLO
8402 static inline struct dp_peer *dp_get_stats_peer(struct dp_peer *peer)
8403 {
8404 	/* ML primary link peer return mld_peer */
8405 	if (IS_MLO_DP_LINK_PEER(peer) && peer->primary_link)
8406 		return peer->mld_peer;
8407 
8408 	return peer;
8409 }
8410 #else
8411 static inline struct dp_peer *dp_get_stats_peer(struct dp_peer *peer)
8412 {
8413 	return peer;
8414 }
8415 #endif
8416 
8417 /**
8418  * dp_update_vdev_basic_stats() - Update vdev basic stats
8419  * @txrx_peer: DP txrx_peer handle
8420  * @tgtobj: Pointer to buffer for vdev stats
8421  *
8422  * Return: None
8423  */
8424 static inline
8425 void dp_update_vdev_basic_stats(struct dp_txrx_peer *txrx_peer,
8426 				struct cdp_vdev_stats *tgtobj)
8427 {
8428 	if (qdf_unlikely(!txrx_peer || !tgtobj))
8429 		return;
8430 
8431 	if (!dp_peer_get_hw_txrx_stats_en(txrx_peer)) {
8432 		tgtobj->tx.comp_pkt.num += txrx_peer->comp_pkt.num;
8433 		tgtobj->tx.comp_pkt.bytes += txrx_peer->comp_pkt.bytes;
8434 		tgtobj->tx.tx_failed += txrx_peer->tx_failed;
8435 	}
8436 	tgtobj->rx.to_stack.num += txrx_peer->to_stack.num;
8437 	tgtobj->rx.to_stack.bytes += txrx_peer->to_stack.bytes;
8438 }
8439 
8440 #ifdef QCA_ENHANCED_STATS_SUPPORT
8441 void dp_update_vdev_stats(struct dp_soc *soc, struct dp_peer *srcobj,
8442 			  void *arg)
8443 {
8444 	struct dp_txrx_peer *txrx_peer;
8445 	struct cdp_vdev_stats *vdev_stats = (struct cdp_vdev_stats *)arg;
8446 	struct dp_peer_per_pkt_stats *per_pkt_stats;
8447 
8448 	txrx_peer = dp_get_txrx_peer(srcobj);
8449 	if (qdf_unlikely(!txrx_peer))
8450 		goto link_stats;
8451 
8452 	if (qdf_unlikely(dp_is_wds_extended(txrx_peer)))
8453 		return;
8454 
8455 	if (!dp_peer_is_primary_link_peer(srcobj))
8456 		goto link_stats;
8457 
8458 	dp_update_vdev_basic_stats(txrx_peer, vdev_stats);
8459 
8460 	per_pkt_stats = &txrx_peer->stats.per_pkt_stats;
8461 	DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats);
8462 
8463 link_stats:
8464 	dp_monitor_peer_get_stats(soc, srcobj, vdev_stats, UPDATE_VDEV_STATS);
8465 }
8466 
8467 void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev,
8468 					struct dp_peer *peer)
8469 {
8470 	struct dp_soc *soc = vdev->pdev->soc;
8471 	struct dp_txrx_peer *txrx_peer;
8472 	struct dp_peer_per_pkt_stats *per_pkt_stats;
8473 	struct cdp_vdev_stats *vdev_stats = &vdev->stats;
8474 
8475 	txrx_peer = peer->txrx_peer;
8476 	if (!txrx_peer)
8477 		goto link_stats;
8478 
8479 	dp_update_vdev_basic_stats(txrx_peer, vdev_stats);
8480 	dp_peer_aggregate_tid_stats(peer);
8481 
8482 	per_pkt_stats = &txrx_peer->stats.per_pkt_stats;
8483 	DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats);
8484 
8485 link_stats:
8486 	dp_monitor_peer_get_stats(soc, peer, vdev_stats, UPDATE_VDEV_STATS);
8487 }
8488 
8489 #else
8490 void dp_update_vdev_stats(struct dp_soc *soc, struct dp_peer *srcobj,
8491 			  void *arg)
8492 {
8493 	struct dp_txrx_peer *txrx_peer;
8494 	struct cdp_vdev_stats *vdev_stats = (struct cdp_vdev_stats *)arg;
8495 	struct dp_peer_per_pkt_stats *per_pkt_stats;
8496 	struct dp_peer_extd_stats *extd_stats;
8497 
8498 	txrx_peer = dp_get_txrx_peer(srcobj);
8499 	if (qdf_unlikely(!txrx_peer))
8500 		return;
8501 
8502 	if (qdf_unlikely(dp_is_wds_extended(txrx_peer)))
8503 		return;
8504 
8505 	if (!dp_peer_is_primary_link_peer(srcobj))
8506 		return;
8507 
8508 	dp_update_vdev_basic_stats(txrx_peer, vdev_stats);
8509 
8510 	per_pkt_stats = &txrx_peer->stats.per_pkt_stats;
8511 	DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats);
8512 
8513 	extd_stats = &txrx_peer->stats.extd_stats;
8514 	DP_UPDATE_EXTD_STATS(vdev_stats, extd_stats);
8515 }
8516 
8517 void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev,
8518 					struct dp_peer *peer)
8519 {
8520 	struct dp_txrx_peer *txrx_peer;
8521 	struct dp_peer_per_pkt_stats *per_pkt_stats;
8522 	struct dp_peer_extd_stats *extd_stats;
8523 	struct cdp_vdev_stats *vdev_stats = &vdev->stats;
8524 
8525 	txrx_peer = peer->txrx_peer;
8526 	if (!txrx_peer)
8527 		return;
8528 
8529 	dp_update_vdev_basic_stats(txrx_peer, vdev_stats);
8530 
8531 	per_pkt_stats = &txrx_peer->stats.per_pkt_stats;
8532 	DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats);
8533 
8534 	extd_stats = &txrx_peer->stats.extd_stats;
8535 	DP_UPDATE_EXTD_STATS(vdev_stats, extd_stats);
8536 }
8537 #endif
8538 
8539 void dp_update_pdev_stats(struct dp_pdev *tgtobj,
8540 			  struct cdp_vdev_stats *srcobj)
8541 {
8542 	uint8_t i;
8543 	uint8_t pream_type;
8544 	uint8_t mu_type;
8545 	struct cdp_pdev_stats *pdev_stats = NULL;
8546 
8547 	pdev_stats = &tgtobj->stats;
8548 	for (pream_type = 0; pream_type < DOT11_MAX; pream_type++) {
8549 		for (i = 0; i < MAX_MCS; i++) {
8550 			tgtobj->stats.tx.pkt_type[pream_type].
8551 				mcs_count[i] +=
8552 			srcobj->tx.pkt_type[pream_type].
8553 				mcs_count[i];
8554 			tgtobj->stats.rx.pkt_type[pream_type].
8555 				mcs_count[i] +=
8556 			srcobj->rx.pkt_type[pream_type].
8557 				mcs_count[i];
8558 		}
8559 	}
8560 
8561 	for (i = 0; i < MAX_BW; i++) {
8562 		tgtobj->stats.tx.bw[i] += srcobj->tx.bw[i];
8563 		tgtobj->stats.rx.bw[i] += srcobj->rx.bw[i];
8564 	}
8565 
8566 	for (i = 0; i < SS_COUNT; i++) {
8567 		tgtobj->stats.tx.nss[i] += srcobj->tx.nss[i];
8568 		tgtobj->stats.rx.nss[i] += srcobj->rx.nss[i];
8569 		tgtobj->stats.rx.ppdu_nss[i] += srcobj->rx.ppdu_nss[i];
8570 	}
8571 
8572 	for (i = 0; i < WME_AC_MAX; i++) {
8573 		tgtobj->stats.tx.wme_ac_type[i] +=
8574 			srcobj->tx.wme_ac_type[i];
8575 		tgtobj->stats.tx.wme_ac_type_bytes[i] +=
8576 			srcobj->tx.wme_ac_type_bytes[i];
8577 		tgtobj->stats.rx.wme_ac_type[i] +=
8578 			srcobj->rx.wme_ac_type[i];
8579 		tgtobj->stats.rx.wme_ac_type_bytes[i] +=
8580 			srcobj->rx.wme_ac_type_bytes[i];
8581 		tgtobj->stats.tx.excess_retries_per_ac[i] +=
8582 			srcobj->tx.excess_retries_per_ac[i];
8583 	}
8584 
8585 	for (i = 0; i < MAX_GI; i++) {
8586 		tgtobj->stats.tx.sgi_count[i] +=
8587 			srcobj->tx.sgi_count[i];
8588 		tgtobj->stats.rx.sgi_count[i] +=
8589 			srcobj->rx.sgi_count[i];
8590 	}
8591 
8592 	for (i = 0; i < MAX_RECEPTION_TYPES; i++) {
8593 		tgtobj->stats.rx.reception_type[i] +=
8594 			srcobj->rx.reception_type[i];
8595 		tgtobj->stats.rx.ppdu_cnt[i] += srcobj->rx.ppdu_cnt[i];
8596 	}
8597 
8598 	for (i = 0; i < MAX_TRANSMIT_TYPES; i++) {
8599 		tgtobj->stats.tx.transmit_type[i].num_msdu +=
8600 				srcobj->tx.transmit_type[i].num_msdu;
8601 		tgtobj->stats.tx.transmit_type[i].num_mpdu +=
8602 				srcobj->tx.transmit_type[i].num_mpdu;
8603 		tgtobj->stats.tx.transmit_type[i].mpdu_tried +=
8604 				srcobj->tx.transmit_type[i].mpdu_tried;
8605 	}
8606 
8607 	for (i = 0; i < QDF_PROTO_SUBTYPE_MAX; i++)
8608 		tgtobj->stats.tx.no_ack_count[i] += srcobj->tx.no_ack_count[i];
8609 
8610 	for (i = 0; i < MAX_MU_GROUP_ID; i++)
8611 		tgtobj->stats.tx.mu_group_id[i] = srcobj->tx.mu_group_id[i];
8612 
8613 	for (i = 0; i < MAX_RU_LOCATIONS; i++) {
8614 		tgtobj->stats.tx.ru_loc[i].num_msdu +=
8615 			srcobj->tx.ru_loc[i].num_msdu;
8616 		tgtobj->stats.tx.ru_loc[i].num_mpdu +=
8617 			srcobj->tx.ru_loc[i].num_mpdu;
8618 		tgtobj->stats.tx.ru_loc[i].mpdu_tried +=
8619 			srcobj->tx.ru_loc[i].mpdu_tried;
8620 	}
8621 
8622 	tgtobj->stats.tx.tx_ppdus += srcobj->tx.tx_ppdus;
8623 	tgtobj->stats.tx.tx_mpdus_success += srcobj->tx.tx_mpdus_success;
8624 	tgtobj->stats.tx.tx_mpdus_tried += srcobj->tx.tx_mpdus_tried;
8625 	tgtobj->stats.tx.retries_mpdu += srcobj->tx.retries_mpdu;
8626 	tgtobj->stats.tx.mpdu_success_with_retries +=
8627 		srcobj->tx.mpdu_success_with_retries;
8628 	tgtobj->stats.tx.last_tx_ts = srcobj->tx.last_tx_ts;
8629 	tgtobj->stats.tx.tx_rate = srcobj->tx.tx_rate;
8630 	tgtobj->stats.tx.last_tx_rate = srcobj->tx.last_tx_rate;
8631 	tgtobj->stats.tx.last_tx_rate_mcs = srcobj->tx.last_tx_rate_mcs;
8632 	tgtobj->stats.tx.mcast_last_tx_rate = srcobj->tx.mcast_last_tx_rate;
8633 	tgtobj->stats.tx.mcast_last_tx_rate_mcs =
8634 		srcobj->tx.mcast_last_tx_rate_mcs;
8635 	tgtobj->stats.tx.rnd_avg_tx_rate = srcobj->tx.rnd_avg_tx_rate;
8636 	tgtobj->stats.tx.avg_tx_rate = srcobj->tx.avg_tx_rate;
8637 	tgtobj->stats.tx.tx_ratecode = srcobj->tx.tx_ratecode;
8638 	tgtobj->stats.tx.ru_start = srcobj->tx.ru_start;
8639 	tgtobj->stats.tx.ru_tones = srcobj->tx.ru_tones;
8640 	tgtobj->stats.tx.last_ack_rssi = srcobj->tx.last_ack_rssi;
8641 	tgtobj->stats.tx.nss_info = srcobj->tx.nss_info;
8642 	tgtobj->stats.tx.mcs_info = srcobj->tx.mcs_info;
8643 	tgtobj->stats.tx.bw_info = srcobj->tx.bw_info;
8644 	tgtobj->stats.tx.gi_info = srcobj->tx.gi_info;
8645 	tgtobj->stats.tx.preamble_info = srcobj->tx.preamble_info;
8646 	tgtobj->stats.tx.comp_pkt.bytes += srcobj->tx.comp_pkt.bytes;
8647 	tgtobj->stats.tx.comp_pkt.num += srcobj->tx.comp_pkt.num;
8648 	tgtobj->stats.tx.ucast.num += srcobj->tx.ucast.num;
8649 	tgtobj->stats.tx.ucast.bytes += srcobj->tx.ucast.bytes;
8650 	tgtobj->stats.tx.mcast.num += srcobj->tx.mcast.num;
8651 	tgtobj->stats.tx.mcast.bytes += srcobj->tx.mcast.bytes;
8652 	tgtobj->stats.tx.bcast.num += srcobj->tx.bcast.num;
8653 	tgtobj->stats.tx.bcast.bytes += srcobj->tx.bcast.bytes;
8654 	tgtobj->stats.tx.tx_success.num += srcobj->tx.tx_success.num;
8655 	tgtobj->stats.tx.tx_success.bytes +=
8656 		srcobj->tx.tx_success.bytes;
8657 	tgtobj->stats.tx.nawds_mcast.num +=
8658 		srcobj->tx.nawds_mcast.num;
8659 	tgtobj->stats.tx.nawds_mcast.bytes +=
8660 		srcobj->tx.nawds_mcast.bytes;
8661 	tgtobj->stats.tx.nawds_mcast_drop +=
8662 		srcobj->tx.nawds_mcast_drop;
8663 	tgtobj->stats.tx.num_ppdu_cookie_valid +=
8664 		srcobj->tx.num_ppdu_cookie_valid;
8665 	tgtobj->stats.tx.tx_failed += srcobj->tx.tx_failed;
8666 	tgtobj->stats.tx.ofdma += srcobj->tx.ofdma;
8667 	tgtobj->stats.tx.stbc += srcobj->tx.stbc;
8668 	tgtobj->stats.tx.ldpc += srcobj->tx.ldpc;
8669 	tgtobj->stats.tx.pream_punct_cnt += srcobj->tx.pream_punct_cnt;
8670 	tgtobj->stats.tx.retries += srcobj->tx.retries;
8671 	tgtobj->stats.tx.non_amsdu_cnt += srcobj->tx.non_amsdu_cnt;
8672 	tgtobj->stats.tx.amsdu_cnt += srcobj->tx.amsdu_cnt;
8673 	tgtobj->stats.tx.non_ampdu_cnt += srcobj->tx.non_ampdu_cnt;
8674 	tgtobj->stats.tx.ampdu_cnt += srcobj->tx.ampdu_cnt;
8675 	tgtobj->stats.tx.dropped.fw_rem.num += srcobj->tx.dropped.fw_rem.num;
8676 	tgtobj->stats.tx.dropped.fw_rem.bytes +=
8677 			srcobj->tx.dropped.fw_rem.bytes;
8678 	tgtobj->stats.tx.dropped.fw_rem_tx +=
8679 			srcobj->tx.dropped.fw_rem_tx;
8680 	tgtobj->stats.tx.dropped.fw_rem_notx +=
8681 			srcobj->tx.dropped.fw_rem_notx;
8682 	tgtobj->stats.tx.dropped.fw_reason1 +=
8683 			srcobj->tx.dropped.fw_reason1;
8684 	tgtobj->stats.tx.dropped.fw_reason2 +=
8685 			srcobj->tx.dropped.fw_reason2;
8686 	tgtobj->stats.tx.dropped.fw_reason3 +=
8687 			srcobj->tx.dropped.fw_reason3;
8688 	tgtobj->stats.tx.dropped.fw_rem_queue_disable +=
8689 				srcobj->tx.dropped.fw_rem_queue_disable;
8690 	tgtobj->stats.tx.dropped.fw_rem_no_match +=
8691 				srcobj->tx.dropped.fw_rem_no_match;
8692 	tgtobj->stats.tx.dropped.drop_threshold +=
8693 				srcobj->tx.dropped.drop_threshold;
8694 	tgtobj->stats.tx.dropped.drop_link_desc_na +=
8695 				srcobj->tx.dropped.drop_link_desc_na;
8696 	tgtobj->stats.tx.dropped.invalid_drop +=
8697 				srcobj->tx.dropped.invalid_drop;
8698 	tgtobj->stats.tx.dropped.mcast_vdev_drop +=
8699 					srcobj->tx.dropped.mcast_vdev_drop;
8700 	tgtobj->stats.tx.dropped.invalid_rr +=
8701 				srcobj->tx.dropped.invalid_rr;
8702 	tgtobj->stats.tx.dropped.age_out += srcobj->tx.dropped.age_out;
8703 	tgtobj->stats.rx.err.mic_err += srcobj->rx.err.mic_err;
8704 	tgtobj->stats.rx.err.decrypt_err += srcobj->rx.err.decrypt_err;
8705 	tgtobj->stats.rx.err.fcserr += srcobj->rx.err.fcserr;
8706 	tgtobj->stats.rx.err.pn_err += srcobj->rx.err.pn_err;
8707 	tgtobj->stats.rx.err.oor_err += srcobj->rx.err.oor_err;
8708 	tgtobj->stats.rx.err.jump_2k_err += srcobj->rx.err.jump_2k_err;
8709 	tgtobj->stats.rx.err.rxdma_wifi_parse_err +=
8710 				srcobj->rx.err.rxdma_wifi_parse_err;
8711 	if (srcobj->rx.snr != 0)
8712 		tgtobj->stats.rx.snr = srcobj->rx.snr;
8713 	tgtobj->stats.rx.rx_rate = srcobj->rx.rx_rate;
8714 	tgtobj->stats.rx.last_rx_rate = srcobj->rx.last_rx_rate;
8715 	tgtobj->stats.rx.rnd_avg_rx_rate = srcobj->rx.rnd_avg_rx_rate;
8716 	tgtobj->stats.rx.avg_rx_rate = srcobj->rx.avg_rx_rate;
8717 	tgtobj->stats.rx.rx_ratecode = srcobj->rx.rx_ratecode;
8718 	tgtobj->stats.rx.avg_snr = srcobj->rx.avg_snr;
8719 	tgtobj->stats.rx.rx_snr_measured_time = srcobj->rx.rx_snr_measured_time;
8720 	tgtobj->stats.rx.last_snr = srcobj->rx.last_snr;
8721 	tgtobj->stats.rx.nss_info = srcobj->rx.nss_info;
8722 	tgtobj->stats.rx.mcs_info = srcobj->rx.mcs_info;
8723 	tgtobj->stats.rx.bw_info = srcobj->rx.bw_info;
8724 	tgtobj->stats.rx.gi_info = srcobj->rx.gi_info;
8725 	tgtobj->stats.rx.preamble_info = srcobj->rx.preamble_info;
8726 	tgtobj->stats.rx.non_ampdu_cnt += srcobj->rx.non_ampdu_cnt;
8727 	tgtobj->stats.rx.ampdu_cnt += srcobj->rx.ampdu_cnt;
8728 	tgtobj->stats.rx.non_amsdu_cnt += srcobj->rx.non_amsdu_cnt;
8729 	tgtobj->stats.rx.amsdu_cnt += srcobj->rx.amsdu_cnt;
8730 	tgtobj->stats.rx.nawds_mcast_drop += srcobj->rx.nawds_mcast_drop;
8731 	tgtobj->stats.rx.mcast_3addr_drop += srcobj->rx.mcast_3addr_drop;
8732 	tgtobj->stats.rx.to_stack.num += srcobj->rx.to_stack.num;
8733 	tgtobj->stats.rx.to_stack.bytes += srcobj->rx.to_stack.bytes;
8734 
8735 	for (i = 0; i < CDP_MAX_RX_RINGS; i++) {
8736 		tgtobj->stats.rx.rcvd_reo[i].num +=
8737 			srcobj->rx.rcvd_reo[i].num;
8738 		tgtobj->stats.rx.rcvd_reo[i].bytes +=
8739 			srcobj->rx.rcvd_reo[i].bytes;
8740 	}
8741 
8742 	for (i = 0; i < CDP_MAX_LMACS; i++) {
8743 		tgtobj->stats.rx.rx_lmac[i].num +=
8744 			srcobj->rx.rx_lmac[i].num;
8745 		tgtobj->stats.rx.rx_lmac[i].bytes +=
8746 			srcobj->rx.rx_lmac[i].bytes;
8747 	}
8748 
8749 	if (srcobj->rx.to_stack.num >= (srcobj->rx.multicast.num))
8750 		srcobj->rx.unicast.num =
8751 			srcobj->rx.to_stack.num -
8752 				(srcobj->rx.multicast.num);
8753 	if (srcobj->rx.to_stack.bytes >= srcobj->rx.multicast.bytes)
8754 		srcobj->rx.unicast.bytes =
8755 			srcobj->rx.to_stack.bytes -
8756 				(srcobj->rx.multicast.bytes);
8757 
8758 	tgtobj->stats.rx.unicast.num += srcobj->rx.unicast.num;
8759 	tgtobj->stats.rx.unicast.bytes += srcobj->rx.unicast.bytes;
8760 	tgtobj->stats.rx.multicast.num += srcobj->rx.multicast.num;
8761 	tgtobj->stats.rx.multicast.bytes += srcobj->rx.multicast.bytes;
8762 	tgtobj->stats.rx.bcast.num += srcobj->rx.bcast.num;
8763 	tgtobj->stats.rx.bcast.bytes += srcobj->rx.bcast.bytes;
8764 	tgtobj->stats.rx.raw.num += srcobj->rx.raw.num;
8765 	tgtobj->stats.rx.raw.bytes += srcobj->rx.raw.bytes;
8766 	tgtobj->stats.rx.intra_bss.pkts.num +=
8767 			srcobj->rx.intra_bss.pkts.num;
8768 	tgtobj->stats.rx.intra_bss.pkts.bytes +=
8769 			srcobj->rx.intra_bss.pkts.bytes;
8770 	tgtobj->stats.rx.intra_bss.fail.num +=
8771 			srcobj->rx.intra_bss.fail.num;
8772 	tgtobj->stats.rx.intra_bss.fail.bytes +=
8773 			srcobj->rx.intra_bss.fail.bytes;
8774 
8775 	tgtobj->stats.tx.last_ack_rssi =
8776 		srcobj->tx.last_ack_rssi;
8777 	tgtobj->stats.rx.mec_drop.num += srcobj->rx.mec_drop.num;
8778 	tgtobj->stats.rx.mec_drop.bytes += srcobj->rx.mec_drop.bytes;
8779 	tgtobj->stats.rx.multipass_rx_pkt_drop +=
8780 		srcobj->rx.multipass_rx_pkt_drop;
8781 	tgtobj->stats.rx.peer_unauth_rx_pkt_drop +=
8782 		srcobj->rx.peer_unauth_rx_pkt_drop;
8783 	tgtobj->stats.rx.policy_check_drop +=
8784 		srcobj->rx.policy_check_drop;
8785 
8786 	for (mu_type = 0 ; mu_type < TXRX_TYPE_MU_MAX; mu_type++) {
8787 		tgtobj->stats.rx.rx_mu[mu_type].mpdu_cnt_fcs_ok +=
8788 			srcobj->rx.rx_mu[mu_type].mpdu_cnt_fcs_ok;
8789 		tgtobj->stats.rx.rx_mu[mu_type].mpdu_cnt_fcs_err +=
8790 			srcobj->rx.rx_mu[mu_type].mpdu_cnt_fcs_err;
8791 		for (i = 0; i < SS_COUNT; i++)
8792 			tgtobj->stats.rx.rx_mu[mu_type].ppdu_nss[i] +=
8793 				srcobj->rx.rx_mu[mu_type].ppdu_nss[i];
8794 		for (i = 0; i < MAX_MCS; i++)
8795 			tgtobj->stats.rx.rx_mu[mu_type].ppdu.mcs_count[i] +=
8796 				srcobj->rx.rx_mu[mu_type].ppdu.mcs_count[i];
8797 	}
8798 
8799 	for (i = 0; i < MAX_MCS; i++) {
8800 		tgtobj->stats.rx.su_ax_ppdu_cnt.mcs_count[i] +=
8801 			srcobj->rx.su_ax_ppdu_cnt.mcs_count[i];
8802 		tgtobj->stats.rx.rx_mpdu_cnt[i] += srcobj->rx.rx_mpdu_cnt[i];
8803 	}
8804 
8805 	tgtobj->stats.rx.mpdu_cnt_fcs_ok += srcobj->rx.mpdu_cnt_fcs_ok;
8806 	tgtobj->stats.rx.mpdu_cnt_fcs_err += srcobj->rx.mpdu_cnt_fcs_err;
8807 	tgtobj->stats.rx.rx_mpdus += srcobj->rx.rx_mpdus;
8808 	tgtobj->stats.rx.rx_ppdus += srcobj->rx.rx_ppdus;
8809 	tgtobj->stats.rx.mpdu_retry_cnt += srcobj->rx.mpdu_retry_cnt;
8810 	tgtobj->stats.rx.rx_retries += srcobj->rx.rx_retries;
8811 
8812 	DP_UPDATE_11BE_STATS(pdev_stats, srcobj);
8813 }
8814 
8815 void dp_update_vdev_ingress_stats(struct dp_vdev *tgtobj)
8816 {
8817 	tgtobj->stats.tx_i.dropped.dropped_pkt.num =
8818 		tgtobj->stats.tx_i.dropped.dma_error +
8819 		tgtobj->stats.tx_i.dropped.ring_full +
8820 		tgtobj->stats.tx_i.dropped.enqueue_fail +
8821 		tgtobj->stats.tx_i.dropped.fail_per_pkt_vdev_id_check +
8822 		tgtobj->stats.tx_i.dropped.desc_na.num +
8823 		tgtobj->stats.tx_i.dropped.res_full +
8824 		tgtobj->stats.tx_i.dropped.drop_ingress +
8825 		tgtobj->stats.tx_i.dropped.headroom_insufficient +
8826 		tgtobj->stats.tx_i.dropped.invalid_peer_id_in_exc_path +
8827 		tgtobj->stats.tx_i.dropped.tx_mcast_drop;
8828 }
8829 
8830 void dp_update_vdev_rate_stats(struct cdp_vdev_stats *tgtobj,
8831 			       struct cdp_vdev_stats *srcobj)
8832 {
8833 	tgtobj->tx.last_tx_rate = srcobj->tx.last_tx_rate;
8834 	tgtobj->tx.last_tx_rate_mcs = srcobj->tx.last_tx_rate_mcs;
8835 	tgtobj->tx.mcast_last_tx_rate = srcobj->tx.mcast_last_tx_rate;
8836 	tgtobj->tx.mcast_last_tx_rate_mcs = srcobj->tx.mcast_last_tx_rate_mcs;
8837 	tgtobj->rx.last_rx_rate = srcobj->rx.last_rx_rate;
8838 }
8839 
8840 void dp_update_pdev_ingress_stats(struct dp_pdev *tgtobj,
8841 				  struct dp_vdev *srcobj)
8842 {
8843 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.nawds_mcast);
8844 
8845 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.rcvd);
8846 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_in_fast_xmit_flow);
8847 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_per_core[0]);
8848 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_per_core[1]);
8849 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_per_core[2]);
8850 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_per_core[3]);
8851 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.processed);
8852 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.reinject_pkts);
8853 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.inspect_pkts);
8854 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.raw.raw_pkt);
8855 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.raw.dma_map_error);
8856 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.raw.num_frags_overflow_err);
8857 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.sg.dropped_host.num);
8858 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.sg.dropped_target);
8859 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.sg.sg_pkt);
8860 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.mcast_en.mcast_pkt);
8861 	DP_STATS_AGGR(tgtobj, srcobj,
8862 		      tx_i.mcast_en.dropped_map_error);
8863 	DP_STATS_AGGR(tgtobj, srcobj,
8864 		      tx_i.mcast_en.dropped_self_mac);
8865 	DP_STATS_AGGR(tgtobj, srcobj,
8866 		      tx_i.mcast_en.dropped_send_fail);
8867 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.mcast_en.ucast);
8868 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.igmp_mcast_en.igmp_rcvd);
8869 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.igmp_mcast_en.igmp_ucast_converted);
8870 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.dma_error);
8871 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.ring_full);
8872 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.enqueue_fail);
8873 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.fail_per_pkt_vdev_id_check);
8874 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.desc_na.num);
8875 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.res_full);
8876 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.drop_ingress);
8877 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.headroom_insufficient);
8878 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.invalid_peer_id_in_exc_path);
8879 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.tx_mcast_drop);
8880 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.cce_classified);
8881 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.cce_classified_raw);
8882 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.sniffer_rcvd);
8883 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.mesh.exception_fw);
8884 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.mesh.completion_fw);
8885 
8886 	DP_STATS_AGGR_PKT(tgtobj, srcobj, rx_i.reo_rcvd_pkt);
8887 	DP_STATS_AGGR_PKT(tgtobj, srcobj, rx_i.null_q_desc_pkt);
8888 	DP_STATS_AGGR_PKT(tgtobj, srcobj, rx_i.routed_eapol_pkt);
8889 
8890 	tgtobj->stats.tx_i.dropped.dropped_pkt.num =
8891 		tgtobj->stats.tx_i.dropped.dma_error +
8892 		tgtobj->stats.tx_i.dropped.ring_full +
8893 		tgtobj->stats.tx_i.dropped.enqueue_fail +
8894 		tgtobj->stats.tx_i.dropped.fail_per_pkt_vdev_id_check +
8895 		tgtobj->stats.tx_i.dropped.desc_na.num +
8896 		tgtobj->stats.tx_i.dropped.res_full +
8897 		tgtobj->stats.tx_i.dropped.drop_ingress +
8898 		tgtobj->stats.tx_i.dropped.headroom_insufficient +
8899 		tgtobj->stats.tx_i.dropped.invalid_peer_id_in_exc_path +
8900 		tgtobj->stats.tx_i.dropped.tx_mcast_drop;
8901 }
8902 
8903 QDF_STATUS dp_txrx_get_soc_stats(struct cdp_soc_t *soc_hdl,
8904 				 struct cdp_soc_stats *soc_stats)
8905 {
8906 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
8907 	uint8_t inx;
8908 	uint8_t cpus;
8909 
8910 	/* soc tx stats */
8911 	soc_stats->tx.egress = soc->stats.tx.egress[0];
8912 	soc_stats->tx.tx_invalid_peer = soc->stats.tx.tx_invalid_peer;
8913 	for (inx = 0; inx < CDP_MAX_TX_DATA_RINGS; inx++) {
8914 		soc_stats->tx.tx_hw_enq[inx] = soc->stats.tx.tcl_enq[inx];
8915 		soc_stats->tx.tx_hw_ring_full[inx] =
8916 					soc->stats.tx.tcl_ring_full[inx];
8917 	}
8918 	soc_stats->tx.desc_in_use = soc->stats.tx.desc_in_use;
8919 	soc_stats->tx.dropped_fw_removed = soc->stats.tx.dropped_fw_removed;
8920 	soc_stats->tx.invalid_release_source =
8921 					soc->stats.tx.invalid_release_source;
8922 	soc_stats->tx.invalid_tx_comp_desc =
8923 					soc->stats.tx.invalid_tx_comp_desc;
8924 	for (inx = 0; inx < CDP_MAX_WIFI_INT_ERROR_REASONS; inx++)
8925 		soc_stats->tx.wifi_internal_error[inx] =
8926 					soc->stats.tx.wbm_internal_error[inx];
8927 	soc_stats->tx.non_wifi_internal_err =
8928 					soc->stats.tx.non_wbm_internal_err;
8929 	soc_stats->tx.tx_comp_loop_pkt_limit_hit =
8930 				soc->stats.tx.tx_comp_loop_pkt_limit_hit;
8931 	soc_stats->tx.hp_oos2 = soc->stats.tx.hp_oos2;
8932 	soc_stats->tx.tx_comp_exception = soc->stats.tx.tx_comp_exception;
8933 	/* soc rx stats */
8934 	soc_stats->rx.ingress = soc->stats.rx.ingress;
8935 	soc_stats->rx.err_ring_pkts = soc->stats.rx.err_ring_pkts;
8936 	soc_stats->rx.rx_frags = soc->stats.rx.rx_frags;
8937 	soc_stats->rx.rx_hw_reinject = soc->stats.rx.reo_reinject;
8938 	soc_stats->rx.bar_frame = soc->stats.rx.bar_frame;
8939 	soc_stats->rx.rx_frag_err_len_error =
8940 					soc->stats.rx.rx_frag_err_len_error;
8941 	soc_stats->rx.rx_frag_err_no_peer = soc->stats.rx.rx_frag_err_no_peer;
8942 	soc_stats->rx.rx_frag_wait = soc->stats.rx.rx_frag_wait;
8943 	soc_stats->rx.rx_frag_err = soc->stats.rx.rx_frag_err;
8944 	soc_stats->rx.rx_frag_oor = soc->stats.rx.rx_frag_oor;
8945 	soc_stats->rx.reap_loop_pkt_limit_hit =
8946 					soc->stats.rx.reap_loop_pkt_limit_hit;
8947 	soc_stats->rx.hp_oos2 = soc->stats.rx.hp_oos2;
8948 	soc_stats->rx.near_full = soc->stats.rx.near_full;
8949 	soc_stats->rx.msdu_scatter_wait_break =
8950 					soc->stats.rx.msdu_scatter_wait_break;
8951 	soc_stats->rx.rx_sw_route_drop = soc->stats.rx.rxdma2rel_route_drop;
8952 	soc_stats->rx.rx_hw_route_drop = soc->stats.rx.reo2rel_route_drop;
8953 	soc_stats->rx.rx_packets.num_cpus = qdf_min((uint32_t)CDP_NR_CPUS,
8954 						    num_possible_cpus());
8955 	for (cpus = 0; cpus < soc_stats->rx.rx_packets.num_cpus; cpus++) {
8956 		for (inx = 0; inx < CDP_MAX_RX_DEST_RINGS; inx++)
8957 			soc_stats->rx.rx_packets.pkts[cpus][inx] =
8958 					soc->stats.rx.ring_packets[cpus][inx];
8959 	}
8960 	soc_stats->rx.err.rx_rejected = soc->stats.rx.err.rejected;
8961 	soc_stats->rx.err.rx_raw_frm_drop = soc->stats.rx.err.raw_frm_drop;
8962 	soc_stats->rx.err.phy_ring_access_fail =
8963 					soc->stats.rx.err.hal_ring_access_fail;
8964 	soc_stats->rx.err.phy_ring_access_full_fail =
8965 				soc->stats.rx.err.hal_ring_access_full_fail;
8966 	for (inx = 0; inx < CDP_MAX_RX_DEST_RINGS; inx++)
8967 		soc_stats->rx.err.phy_rx_hw_error[inx] =
8968 					soc->stats.rx.err.hal_reo_error[inx];
8969 	soc_stats->rx.err.phy_rx_hw_dest_dup =
8970 					soc->stats.rx.err.hal_reo_dest_dup;
8971 	soc_stats->rx.err.phy_wifi_rel_dup = soc->stats.rx.err.hal_wbm_rel_dup;
8972 	soc_stats->rx.err.phy_rx_sw_err_dup =
8973 					soc->stats.rx.err.hal_rxdma_err_dup;
8974 	soc_stats->rx.err.invalid_rbm = soc->stats.rx.err.invalid_rbm;
8975 	soc_stats->rx.err.invalid_vdev = soc->stats.rx.err.invalid_vdev;
8976 	soc_stats->rx.err.invalid_pdev = soc->stats.rx.err.invalid_pdev;
8977 	soc_stats->rx.err.pkt_delivered_no_peer =
8978 					soc->stats.rx.err.pkt_delivered_no_peer;
8979 	soc_stats->rx.err.defrag_peer_uninit =
8980 					soc->stats.rx.err.defrag_peer_uninit;
8981 	soc_stats->rx.err.invalid_sa_da_idx =
8982 					soc->stats.rx.err.invalid_sa_da_idx;
8983 	soc_stats->rx.err.msdu_done_fail = soc->stats.rx.err.msdu_done_fail;
8984 	soc_stats->rx.err.rx_invalid_peer = soc->stats.rx.err.rx_invalid_peer;
8985 	soc_stats->rx.err.rx_invalid_peer_id =
8986 					soc->stats.rx.err.rx_invalid_peer_id;
8987 	soc_stats->rx.err.rx_invalid_pkt_len =
8988 					soc->stats.rx.err.rx_invalid_pkt_len;
8989 	for (inx = 0; inx < qdf_min((uint32_t)CDP_WIFI_ERR_MAX,
8990 				    (uint32_t)HAL_RXDMA_ERR_MAX); inx++)
8991 		soc_stats->rx.err.rx_sw_error[inx] =
8992 					soc->stats.rx.err.rxdma_error[inx];
8993 	for (inx = 0; inx < qdf_min((uint32_t)CDP_RX_ERR_MAX,
8994 				    (uint32_t)HAL_REO_ERR_MAX); inx++)
8995 		soc_stats->rx.err.rx_hw_error[inx] =
8996 					soc->stats.rx.err.reo_error[inx];
8997 	soc_stats->rx.err.rx_desc_invalid_magic =
8998 					soc->stats.rx.err.rx_desc_invalid_magic;
8999 	soc_stats->rx.err.rx_hw_cmd_send_fail =
9000 					soc->stats.rx.err.reo_cmd_send_fail;
9001 	soc_stats->rx.err.rx_hw_cmd_send_drain =
9002 					soc->stats.rx.err.reo_cmd_send_drain;
9003 	soc_stats->rx.err.scatter_msdu = soc->stats.rx.err.scatter_msdu;
9004 	soc_stats->rx.err.invalid_cookie = soc->stats.rx.err.invalid_cookie;
9005 	soc_stats->rx.err.stale_cookie = soc->stats.rx.err.stale_cookie;
9006 	soc_stats->rx.err.rx_2k_jump_delba_sent =
9007 					soc->stats.rx.err.rx_2k_jump_delba_sent;
9008 	soc_stats->rx.err.rx_2k_jump_to_stack =
9009 					soc->stats.rx.err.rx_2k_jump_to_stack;
9010 	soc_stats->rx.err.rx_2k_jump_drop = soc->stats.rx.err.rx_2k_jump_drop;
9011 	soc_stats->rx.err.rx_hw_err_msdu_buf_rcved =
9012 				soc->stats.rx.err.reo_err_msdu_buf_rcved;
9013 	soc_stats->rx.err.rx_hw_err_msdu_buf_invalid_cookie =
9014 			soc->stats.rx.err.reo_err_msdu_buf_invalid_cookie;
9015 	soc_stats->rx.err.rx_hw_err_oor_drop =
9016 					soc->stats.rx.err.reo_err_oor_drop;
9017 	soc_stats->rx.err.rx_hw_err_raw_mpdu_drop =
9018 					soc->stats.rx.err.reo_err_raw_mpdu_drop;
9019 	soc_stats->rx.err.rx_hw_err_oor_to_stack =
9020 					soc->stats.rx.err.reo_err_oor_to_stack;
9021 	soc_stats->rx.err.rx_hw_err_oor_sg_count =
9022 					soc->stats.rx.err.reo_err_oor_sg_count;
9023 	soc_stats->rx.err.msdu_count_mismatch =
9024 					soc->stats.rx.err.msdu_count_mismatch;
9025 	soc_stats->rx.err.invalid_link_cookie =
9026 					soc->stats.rx.err.invalid_link_cookie;
9027 	soc_stats->rx.err.nbuf_sanity_fail = soc->stats.rx.err.nbuf_sanity_fail;
9028 	soc_stats->rx.err.dup_refill_link_desc =
9029 					soc->stats.rx.err.dup_refill_link_desc;
9030 	soc_stats->rx.err.msdu_continuation_err =
9031 					soc->stats.rx.err.msdu_continuation_err;
9032 	soc_stats->rx.err.ssn_update_count = soc->stats.rx.err.ssn_update_count;
9033 	soc_stats->rx.err.bar_handle_fail_count =
9034 					soc->stats.rx.err.bar_handle_fail_count;
9035 	soc_stats->rx.err.intrabss_eapol_drop =
9036 					soc->stats.rx.err.intrabss_eapol_drop;
9037 	soc_stats->rx.err.pn_in_dest_check_fail =
9038 					soc->stats.rx.err.pn_in_dest_check_fail;
9039 	soc_stats->rx.err.msdu_len_err = soc->stats.rx.err.msdu_len_err;
9040 	soc_stats->rx.err.rx_flush_count = soc->stats.rx.err.rx_flush_count;
9041 	/* soc ast stats */
9042 	soc_stats->ast.added = soc->stats.ast.added;
9043 	soc_stats->ast.deleted = soc->stats.ast.deleted;
9044 	soc_stats->ast.aged_out = soc->stats.ast.aged_out;
9045 	soc_stats->ast.map_err = soc->stats.ast.map_err;
9046 	soc_stats->ast.ast_mismatch = soc->stats.ast.ast_mismatch;
9047 	/* soc mec stats */
9048 	soc_stats->mec.added = soc->stats.mec.added;
9049 	soc_stats->mec.deleted = soc->stats.mec.deleted;
9050 
9051 	return QDF_STATUS_SUCCESS;
9052 }
9053 
9054 #ifdef QCA_PEER_EXT_STATS
9055 QDF_STATUS
9056 dp_txrx_get_peer_delay_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
9057 			     uint8_t *peer_mac,
9058 			     struct cdp_delay_tid_stats *delay_stats)
9059 {
9060 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9061 	struct dp_peer *peer = NULL;
9062 	struct dp_peer_delay_stats *pext_stats;
9063 	struct cdp_delay_rx_stats *rx_delay;
9064 	struct cdp_delay_tx_stats *tx_delay;
9065 	uint8_t tid;
9066 	struct cdp_peer_info peer_info = { 0 };
9067 
9068 	if (!wlan_cfg_is_peer_ext_stats_enabled(soc->wlan_cfg_ctx))
9069 		return QDF_STATUS_E_FAILURE;
9070 
9071 	DP_PEER_INFO_PARAMS_INIT(&peer_info, vdev_id, peer_mac, false,
9072 				 CDP_WILD_PEER_TYPE);
9073 
9074 	peer = dp_peer_hash_find_wrapper(soc, &peer_info, DP_MOD_ID_CDP);
9075 	if (!peer)
9076 		return QDF_STATUS_E_FAILURE;
9077 
9078 	if (!peer->txrx_peer) {
9079 		dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
9080 		return QDF_STATUS_E_FAILURE;
9081 	}
9082 
9083 	pext_stats = peer->txrx_peer->delay_stats;
9084 	if (!pext_stats) {
9085 		dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
9086 		return QDF_STATUS_E_FAILURE;
9087 	}
9088 
9089 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
9090 		rx_delay = &delay_stats[tid].rx_delay;
9091 		dp_accumulate_delay_tid_stats(soc, pext_stats->delay_tid_stats,
9092 					      &rx_delay->to_stack_delay, tid,
9093 					      CDP_HIST_TYPE_REAP_STACK);
9094 		tx_delay = &delay_stats[tid].tx_delay;
9095 		dp_accumulate_delay_avg_stats(pext_stats->delay_tid_stats,
9096 					      tx_delay,
9097 					      tid);
9098 		dp_accumulate_delay_tid_stats(soc, pext_stats->delay_tid_stats,
9099 					      &tx_delay->tx_swq_delay, tid,
9100 					      CDP_HIST_TYPE_SW_ENQEUE_DELAY);
9101 		dp_accumulate_delay_tid_stats(soc, pext_stats->delay_tid_stats,
9102 					      &tx_delay->hwtx_delay, tid,
9103 					      CDP_HIST_TYPE_HW_COMP_DELAY);
9104 	}
9105 	dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
9106 
9107 	return QDF_STATUS_SUCCESS;
9108 }
9109 #else
9110 QDF_STATUS
9111 dp_txrx_get_peer_delay_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
9112 			     uint8_t *peer_mac,
9113 			     struct cdp_delay_tid_stats *delay_stats)
9114 {
9115 	return QDF_STATUS_E_FAILURE;
9116 }
9117 #endif /* QCA_PEER_EXT_STATS */
9118 
9119 #ifdef WLAN_PEER_JITTER
9120 QDF_STATUS
9121 dp_txrx_get_peer_jitter_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
9122 			      uint8_t vdev_id, uint8_t *peer_mac,
9123 			      struct cdp_peer_tid_stats *tid_stats)
9124 {
9125 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9126 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
9127 	struct dp_peer *peer = NULL;
9128 	uint8_t tid;
9129 	struct cdp_peer_info peer_info = { 0 };
9130 	struct cdp_peer_tid_stats *jitter_stats;
9131 	uint8_t ring_id;
9132 
9133 	if (!pdev)
9134 		return QDF_STATUS_E_FAILURE;
9135 
9136 	if (!wlan_cfg_is_peer_jitter_stats_enabled(soc->wlan_cfg_ctx))
9137 		return QDF_STATUS_E_FAILURE;
9138 
9139 	DP_PEER_INFO_PARAMS_INIT(&peer_info, vdev_id, peer_mac, false,
9140 				 CDP_WILD_PEER_TYPE);
9141 
9142 	peer = dp_peer_hash_find_wrapper(soc, &peer_info, DP_MOD_ID_CDP);
9143 	if (!peer)
9144 		return QDF_STATUS_E_FAILURE;
9145 
9146 	if (!peer->txrx_peer || !peer->txrx_peer->jitter_stats) {
9147 		dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
9148 		return QDF_STATUS_E_FAILURE;
9149 	}
9150 
9151 	if (wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) {
9152 		for (tid = 0; tid < qdf_min(CDP_DATA_TID_MAX, DP_MAX_TIDS); tid++) {
9153 			struct cdp_peer_tid_stats *rx_tid =
9154 					&peer->txrx_peer->jitter_stats[tid];
9155 
9156 			tid_stats[tid].tx_avg_jitter = rx_tid->tx_avg_jitter;
9157 			tid_stats[tid].tx_avg_delay = rx_tid->tx_avg_delay;
9158 			tid_stats[tid].tx_avg_err = rx_tid->tx_avg_err;
9159 			tid_stats[tid].tx_total_success = rx_tid->tx_total_success;
9160 			tid_stats[tid].tx_drop = rx_tid->tx_drop;
9161 		}
9162 
9163 	} else {
9164 		jitter_stats = peer->txrx_peer->jitter_stats;
9165 		for (tid = 0; tid < qdf_min(CDP_DATA_TID_MAX, DP_MAX_TIDS); tid++) {
9166 			for (ring_id = 0; ring_id < CDP_MAX_TXRX_CTX; ring_id++) {
9167 				struct cdp_peer_tid_stats *rx_tid =
9168 					&jitter_stats[tid *
9169 					CDP_MAX_TXRX_CTX + ring_id];
9170 				tid_stats[tid].tx_avg_jitter =
9171 					(rx_tid->tx_avg_jitter +
9172 					tid_stats[tid].tx_avg_jitter) >> 1;
9173 				tid_stats[tid].tx_avg_delay =
9174 					(rx_tid->tx_avg_delay +
9175 					tid_stats[tid].tx_avg_delay) >> 1;
9176 				tid_stats[tid].tx_avg_err = (rx_tid->tx_avg_err
9177 					+ tid_stats[tid].tx_avg_err) >> 1;
9178 				tid_stats[tid].tx_total_success +=
9179 						rx_tid->tx_total_success;
9180 				tid_stats[tid].tx_drop += rx_tid->tx_drop;
9181 			}
9182 		}
9183 	}
9184 
9185 	dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
9186 
9187 	return QDF_STATUS_SUCCESS;
9188 }
9189 #else
9190 QDF_STATUS
9191 dp_txrx_get_peer_jitter_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
9192 			      uint8_t vdev_id, uint8_t *peer_mac,
9193 			      struct cdp_peer_tid_stats *tid_stats)
9194 {
9195 	return QDF_STATUS_E_FAILURE;
9196 }
9197 #endif /* WLAN_PEER_JITTER */
9198 
9199 #ifdef WLAN_TX_PKT_CAPTURE_ENH
9200 QDF_STATUS
9201 dp_peer_get_tx_capture_stats(struct cdp_soc_t *soc_hdl,
9202 			     uint8_t vdev_id, uint8_t *peer_mac,
9203 			     struct cdp_peer_tx_capture_stats *stats)
9204 {
9205 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9206 	struct dp_peer *peer = dp_peer_find_hash_find(soc, peer_mac, 0, vdev_id,
9207 						      DP_MOD_ID_TX_CAPTURE);
9208 	QDF_STATUS status;
9209 
9210 	if (!peer)
9211 		return QDF_STATUS_E_FAILURE;
9212 
9213 	status = dp_monitor_peer_tx_capture_get_stats(soc, peer, stats);
9214 	dp_peer_unref_delete(peer, DP_MOD_ID_TX_CAPTURE);
9215 
9216 	return status;
9217 }
9218 
9219 QDF_STATUS
9220 dp_pdev_get_tx_capture_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
9221 			     struct cdp_pdev_tx_capture_stats *stats)
9222 {
9223 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9224 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
9225 
9226 	if (!pdev)
9227 		return QDF_STATUS_E_FAILURE;
9228 
9229 	return dp_monitor_pdev_tx_capture_get_stats(soc, pdev, stats);
9230 }
9231 #else /* WLAN_TX_PKT_CAPTURE_ENH */
9232 QDF_STATUS
9233 dp_peer_get_tx_capture_stats(struct cdp_soc_t *soc_hdl,
9234 			     uint8_t vdev_id, uint8_t *peer_mac,
9235 			     struct cdp_peer_tx_capture_stats *stats)
9236 {
9237 	return QDF_STATUS_E_FAILURE;
9238 }
9239 
9240 QDF_STATUS
9241 dp_pdev_get_tx_capture_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
9242 			     struct cdp_pdev_tx_capture_stats *stats)
9243 {
9244 	return QDF_STATUS_E_FAILURE;
9245 }
9246 #endif /* WLAN_TX_PKT_CAPTURE_ENH */
9247 
9248 #ifdef WLAN_TELEMETRY_STATS_SUPPORT
9249 QDF_STATUS
9250 dp_get_pdev_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
9251 			    struct cdp_pdev_telemetry_stats *stats)
9252 {
9253 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9254 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
9255 	uint8_t ac = 0;
9256 
9257 	if (!pdev)
9258 		return QDF_STATUS_E_FAILURE;
9259 
9260 	/* consumption is in micro seconds, convert it to seconds and
9261 	 * then calculate %age per sec
9262 	 */
9263 	for (ac = 0; ac < WME_AC_MAX; ac++) {
9264 		stats->link_airtime[ac] =
9265 			((pdev->stats.telemetry_stats.link_airtime[ac] * 100) / 1000000);
9266 		stats->tx_mpdu_failed[ac] = pdev->stats.telemetry_stats.tx_mpdu_failed[ac];
9267 		stats->tx_mpdu_total[ac] = pdev->stats.telemetry_stats.tx_mpdu_total[ac];
9268 	}
9269 	return QDF_STATUS_SUCCESS;
9270 }
9271 
9272 QDF_STATUS
9273 dp_get_peer_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t *addr,
9274 			    struct cdp_peer_telemetry_stats *stats)
9275 {
9276 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9277 	struct dp_peer *peer = dp_peer_find_hash_find(soc, addr, 0, DP_VDEV_ALL,
9278 						      DP_MOD_ID_MISC);
9279 
9280 	if (!peer)
9281 		return QDF_STATUS_E_FAILURE;
9282 
9283 	dp_monitor_peer_telemetry_stats(peer, stats);
9284 	dp_peer_unref_delete(peer, DP_MOD_ID_MISC);
9285 
9286 	return QDF_STATUS_SUCCESS;
9287 }
9288 #endif
9289