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