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