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