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