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