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