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