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