xref: /wlan-driver/qca-wifi-host-cmn/dp/wifi3.0/dp_stats.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name #include "qdf_types.h"
20*5113495bSYour Name #include "qdf_module.h"
21*5113495bSYour Name #include "dp_peer.h"
22*5113495bSYour Name #include "dp_types.h"
23*5113495bSYour Name #include "dp_tx.h"
24*5113495bSYour Name #include "dp_internal.h"
25*5113495bSYour Name #include "htt_stats.h"
26*5113495bSYour Name #include "htt_ppdu_stats.h"
27*5113495bSYour Name #ifdef QCA_PEER_EXT_STATS
28*5113495bSYour Name #include <cdp_txrx_hist_struct.h>
29*5113495bSYour Name #include "dp_hist.h"
30*5113495bSYour Name #endif
31*5113495bSYour Name #ifdef WIFI_MONITOR_SUPPORT
32*5113495bSYour Name #include "dp_htt.h"
33*5113495bSYour Name #include <dp_mon.h>
34*5113495bSYour Name #endif
35*5113495bSYour Name #ifdef IPA_OFFLOAD
36*5113495bSYour Name #include "dp_ipa.h"
37*5113495bSYour Name #endif
38*5113495bSYour Name #define DP_MAX_STRING_LEN 1000
39*5113495bSYour Name #define DP_HTT_TX_RX_EXPECTED_TLVS (((uint64_t)1 << HTT_STATS_TX_PDEV_CMN_TAG) |\
40*5113495bSYour Name 	((uint64_t)1 << HTT_STATS_TX_PDEV_UNDERRUN_TAG) |\
41*5113495bSYour Name 	((uint64_t)1 << HTT_STATS_TX_PDEV_SIFS_TAG) |\
42*5113495bSYour Name 	((uint64_t)1 << HTT_STATS_TX_PDEV_FLUSH_TAG) |\
43*5113495bSYour Name 	((uint64_t)1 << HTT_STATS_RX_PDEV_FW_STATS_TAG) |\
44*5113495bSYour Name 	((uint64_t)1 << HTT_STATS_RX_SOC_FW_STATS_TAG) |\
45*5113495bSYour Name 	((uint64_t)1 << HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG) |\
46*5113495bSYour Name 	((uint64_t)1 << HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG) |\
47*5113495bSYour Name 	((uint64_t)1 << HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG) |\
48*5113495bSYour Name 	((uint64_t)1 << HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG))
49*5113495bSYour Name 
50*5113495bSYour Name #define DP_HTT_HW_INTR_NAME_LEN  HTT_STATS_MAX_HW_INTR_NAME_LEN
51*5113495bSYour Name #define DP_HTT_HW_MODULE_NAME_LEN  HTT_STATS_MAX_HW_MODULE_NAME_LEN
52*5113495bSYour Name #define DP_HTT_COUNTER_NAME_LEN  HTT_MAX_COUNTER_NAME
53*5113495bSYour Name #define DP_HTT_LOW_WM_HIT_COUNT_LEN  HTT_STATS_LOW_WM_BINS
54*5113495bSYour Name #define DP_HTT_HIGH_WM_HIT_COUNT_LEN  HTT_STATS_HIGH_WM_BINS
55*5113495bSYour Name #define DP_HTT_TX_MCS_LEN  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS
56*5113495bSYour Name #define DP_HTT_TX_MCS_EXT_LEN  HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS
57*5113495bSYour Name #define DP_HTT_TX_MCS_EXT2_LEN  HTT_TX_PDEV_STATS_NUM_EXTRA2_MCS_COUNTERS
58*5113495bSYour Name #define DP_HTT_TX_SU_MCS_LEN  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS
59*5113495bSYour Name #define DP_HTT_TX_SU_MCS_EXT_LEN  HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS
60*5113495bSYour Name #define DP_HTT_TX_MU_MCS_LEN  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS
61*5113495bSYour Name #define DP_HTT_TX_MU_MCS_EXT_LEN  HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS
62*5113495bSYour Name #define DP_HTT_TX_NSS_LEN  HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS
63*5113495bSYour Name #define DP_HTT_TX_BW_LEN  HTT_TX_PDEV_STATS_NUM_BW_COUNTERS
64*5113495bSYour Name #define DP_HTT_TX_PREAM_LEN  HTT_TX_PDEV_STATS_NUM_PREAMBLE_TYPES
65*5113495bSYour Name #define DP_HTT_TX_PDEV_GI_LEN  HTT_TX_PDEV_STATS_NUM_GI_COUNTERS
66*5113495bSYour Name #define DP_HTT_TX_DCM_LEN  HTT_TX_PDEV_STATS_NUM_DCM_COUNTERS
67*5113495bSYour Name #define DP_HTT_RX_MCS_LEN  HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS
68*5113495bSYour Name #define DP_HTT_RX_MCS_EXT_LEN  HTT_RX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS
69*5113495bSYour Name #define DP_HTT_RX_PDEV_MCS_LEN_EXT HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT
70*5113495bSYour Name #define DP_HTT_RX_PDEV_MCS_LEN_EXT2 HTT_RX_PDEV_STATS_NUM_EXTRA2_MCS_COUNTERS
71*5113495bSYour Name #define DP_HTT_RX_NSS_LEN  HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS
72*5113495bSYour Name #define DP_HTT_RX_DCM_LEN  HTT_RX_PDEV_STATS_NUM_DCM_COUNTERS
73*5113495bSYour Name #define DP_HTT_RX_BW_LEN  HTT_RX_PDEV_STATS_NUM_BW_COUNTERS
74*5113495bSYour Name #define DP_HTT_RX_PREAM_LEN  HTT_RX_PDEV_STATS_NUM_PREAMBLE_TYPES
75*5113495bSYour Name #define DP_HTT_RSSI_CHAIN_LEN  HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS
76*5113495bSYour Name #define DP_HTT_RX_GI_LEN  HTT_RX_PDEV_STATS_NUM_GI_COUNTERS
77*5113495bSYour Name #define DP_HTT_FW_RING_MGMT_SUBTYPE_LEN  HTT_STATS_SUBTYPE_MAX
78*5113495bSYour Name #define DP_HTT_FW_RING_CTRL_SUBTYPE_LEN  HTT_STATS_SUBTYPE_MAX
79*5113495bSYour Name #define DP_HTT_FW_RING_MPDU_ERR_LEN  HTT_RX_STATS_RXDMA_MAX_ERR
80*5113495bSYour Name #define DP_HTT_TID_NAME_LEN  MAX_HTT_TID_NAME
81*5113495bSYour Name #define DP_HTT_PEER_NUM_SS HTT_RX_PEER_STATS_NUM_SPATIAL_STREAMS
82*5113495bSYour Name #define DP_HTT_PDEV_TX_GI_LEN HTT_TX_PDEV_STATS_NUM_GI_COUNTERS
83*5113495bSYour Name 
84*5113495bSYour Name #define DP_MAX_INT_CONTEXTS_STRING_LENGTH (6 * WLAN_CFG_INT_NUM_CONTEXTS)
85*5113495bSYour Name #define DP_NSS_LENGTH (6 * SS_COUNT)
86*5113495bSYour Name #define DP_MU_GROUP_LENGTH (6 * DP_MU_GROUP_SHOW)
87*5113495bSYour Name #define DP_MU_GROUP_SHOW 16
88*5113495bSYour Name #define DP_RXDMA_ERR_LENGTH (6 * HAL_RXDMA_ERR_MAX)
89*5113495bSYour Name #define DP_REO_ERR_LENGTH (6 * HAL_REO_ERR_MAX)
90*5113495bSYour Name #define STATS_PROC_TIMEOUT        (HZ / 1000)
91*5113495bSYour Name 
92*5113495bSYour Name #define dp_stats_alert(params...) QDF_TRACE_FATAL(QDF_MODULE_ID_DP_STATS, params)
93*5113495bSYour Name #define dp_stats_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_DP_STATS, params)
94*5113495bSYour Name #define dp_stats_warn(params...) QDF_TRACE_WARN(QDF_MODULE_ID_DP_STATS, params)
95*5113495bSYour Name #define dp_stats_info(params...) \
96*5113495bSYour Name 	__QDF_TRACE_FL(QDF_TRACE_LEVEL_INFO_HIGH, QDF_MODULE_ID_DP_STATS, ## params)
97*5113495bSYour Name #define dp_stats_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_DP_STATS, params)
98*5113495bSYour Name 
99*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
100*5113495bSYour Name static const struct cdp_rate_debug dp_ppdu_rate_string[DOT11_MAX][MAX_MCS] = {
101*5113495bSYour Name 	{
102*5113495bSYour Name 		{"HE MCS 0 (BPSK 1/2)     ", MCS_VALID},
103*5113495bSYour Name 		{"HE MCS 1 (QPSK 1/2)     ", MCS_VALID},
104*5113495bSYour Name 		{"HE MCS 2 (QPSK 3/4)     ", MCS_VALID},
105*5113495bSYour Name 		{"HE MCS 3 (16-QAM 1/2)   ", MCS_VALID},
106*5113495bSYour Name 		{"HE MCS 4 (16-QAM 3/4)   ", MCS_VALID},
107*5113495bSYour Name 		{"HE MCS 5 (64-QAM 2/3)   ", MCS_VALID},
108*5113495bSYour Name 		{"HE MCS 6 (64-QAM 3/4)   ", MCS_VALID},
109*5113495bSYour Name 		{"HE MCS 7 (64-QAM 5/6)   ", MCS_VALID},
110*5113495bSYour Name 		{"HE MCS 8 (256-QAM 3/4)  ", MCS_VALID},
111*5113495bSYour Name 		{"HE MCS 9 (256-QAM 5/6)  ", MCS_VALID},
112*5113495bSYour Name 		{"HE MCS 10 (1024-QAM 3/4)", MCS_VALID},
113*5113495bSYour Name 		{"HE MCS 11 (1024-QAM 5/6)", MCS_VALID},
114*5113495bSYour Name 		{"HE MCS 12 (4096-QAM 3/4)", MCS_VALID},
115*5113495bSYour Name 		{"HE MCS 13 (4096-QAM 5/6)", MCS_VALID},
116*5113495bSYour Name 		{"INVALID ", MCS_INVALID},
117*5113495bSYour Name 		{"INVALID ", MCS_INVALID},
118*5113495bSYour Name 		{"INVALID ", MCS_INVALID},
119*5113495bSYour Name 	},
120*5113495bSYour Name 	{
121*5113495bSYour Name 		{"EHT MCS 0 (BPSK 1/2)     ", MCS_VALID},
122*5113495bSYour Name 		{"EHT MCS 1 (QPSK 1/2)     ", MCS_VALID},
123*5113495bSYour Name 		{"EHT MCS 2 (QPSK 3/4)     ", MCS_VALID},
124*5113495bSYour Name 		{"EHT MCS 3 (16-QAM 1/2)   ", MCS_VALID},
125*5113495bSYour Name 		{"EHT MCS 4 (16-QAM 3/4)   ", MCS_VALID},
126*5113495bSYour Name 		{"EHT MCS 5 (64-QAM 2/3)   ", MCS_VALID},
127*5113495bSYour Name 		{"EHT MCS 6 (64-QAM 3/4)   ", MCS_VALID},
128*5113495bSYour Name 		{"EHT MCS 7 (64-QAM 5/6)   ", MCS_VALID},
129*5113495bSYour Name 		{"EHT MCS 8 (256-QAM 3/4)  ", MCS_VALID},
130*5113495bSYour Name 		{"EHT MCS 9 (256-QAM 5/6)  ", MCS_VALID},
131*5113495bSYour Name 		{"EHT MCS 10 (1024-QAM 3/4)", MCS_VALID},
132*5113495bSYour Name 		{"EHT MCS 11 (1024-QAM 5/6)", MCS_VALID},
133*5113495bSYour Name 		{"EHT MCS 12 (4096-QAM 3/4)", MCS_VALID},
134*5113495bSYour Name 		{"EHT MCS 13 (4096-QAM 5/6)", MCS_VALID},
135*5113495bSYour Name 		{"EHT MCS 14 (BPSK-DCM 1/2)", MCS_VALID},
136*5113495bSYour Name 		{"EHT MCS 15 (BPSK-DCM 1/2)", MCS_VALID},
137*5113495bSYour Name 		{"INVALID ", MCS_INVALID},
138*5113495bSYour Name 	}
139*5113495bSYour Name };
140*5113495bSYour Name #else
141*5113495bSYour Name static const struct cdp_rate_debug dp_ppdu_rate_string[DOT11_MAX][MAX_MCS] = {
142*5113495bSYour Name 	{
143*5113495bSYour Name 		{"HE MCS 0 (BPSK 1/2)     ", MCS_VALID},
144*5113495bSYour Name 		{"HE MCS 1 (QPSK 1/2)     ", MCS_VALID},
145*5113495bSYour Name 		{"HE MCS 2 (QPSK 3/4)     ", MCS_VALID},
146*5113495bSYour Name 		{"HE MCS 3 (16-QAM 1/2)   ", MCS_VALID},
147*5113495bSYour Name 		{"HE MCS 4 (16-QAM 3/4)   ", MCS_VALID},
148*5113495bSYour Name 		{"HE MCS 5 (64-QAM 2/3)   ", MCS_VALID},
149*5113495bSYour Name 		{"HE MCS 6 (64-QAM 3/4)   ", MCS_VALID},
150*5113495bSYour Name 		{"HE MCS 7 (64-QAM 5/6)   ", MCS_VALID},
151*5113495bSYour Name 		{"HE MCS 8 (256-QAM 3/4)  ", MCS_VALID},
152*5113495bSYour Name 		{"HE MCS 9 (256-QAM 5/6)  ", MCS_VALID},
153*5113495bSYour Name 		{"HE MCS 10 (1024-QAM 3/4)", MCS_VALID},
154*5113495bSYour Name 		{"HE MCS 11 (1024-QAM 5/6)", MCS_VALID},
155*5113495bSYour Name 		{"HE MCS 12 (4096-QAM 3/4)", MCS_VALID},
156*5113495bSYour Name 		{"HE MCS 13 (4096-QAM 5/6)", MCS_VALID},
157*5113495bSYour Name 		{"INVALID ", MCS_INVALID},
158*5113495bSYour Name 	}
159*5113495bSYour Name };
160*5113495bSYour Name #endif
161*5113495bSYour Name 
162*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
163*5113495bSYour Name static const struct cdp_rate_debug
164*5113495bSYour Name dp_mu_rate_string[TXRX_TYPE_MU_MAX][MAX_MCS] = {
165*5113495bSYour Name 	{
166*5113495bSYour Name 		{"HE MU-MIMO MCS 0 (BPSK 1/2)     ", MCS_VALID},
167*5113495bSYour Name 		{"HE MU-MIMO MCS 1 (QPSK 1/2)     ", MCS_VALID},
168*5113495bSYour Name 		{"HE MU-MIMO MCS 2 (QPSK 3/4)     ", MCS_VALID},
169*5113495bSYour Name 		{"HE MU-MIMO MCS 3 (16-QAM 1/2)   ", MCS_VALID},
170*5113495bSYour Name 		{"HE MU-MIMO MCS 4 (16-QAM 3/4)   ", MCS_VALID},
171*5113495bSYour Name 		{"HE MU-MIMO MCS 5 (64-QAM 2/3)   ", MCS_VALID},
172*5113495bSYour Name 		{"HE MU-MIMO MCS 6 (64-QAM 3/4)   ", MCS_VALID},
173*5113495bSYour Name 		{"HE MU-MIMO MCS 7 (64-QAM 5/6)   ", MCS_VALID},
174*5113495bSYour Name 		{"HE MU-MIMO MCS 8 (256-QAM 3/4)  ", MCS_VALID},
175*5113495bSYour Name 		{"HE MU-MIMO MCS 9 (256-QAM 5/6)  ", MCS_VALID},
176*5113495bSYour Name 		{"HE MU-MIMO MCS 10 (1024-QAM 3/4)", MCS_VALID},
177*5113495bSYour Name 		{"HE MU-MIMO MCS 11 (1024-QAM 5/6)", MCS_VALID},
178*5113495bSYour Name 		{"HE MU-MIMO MCS 12 (4096-QAM 3/4)", MCS_VALID},
179*5113495bSYour Name 		{"HE MU-MIMO MCS 13 (4096-QAM 5/6)", MCS_VALID},
180*5113495bSYour Name 		{"INVALID ", MCS_INVALID},
181*5113495bSYour Name 		{"INVALID ", MCS_INVALID},
182*5113495bSYour Name 		{"INVALID ", MCS_INVALID},
183*5113495bSYour Name 	},
184*5113495bSYour Name 	{
185*5113495bSYour Name 		{"HE OFDMA MCS 0 (BPSK 1/2)     ", MCS_VALID},
186*5113495bSYour Name 		{"HE OFDMA MCS 1 (QPSK 1/2)     ", MCS_VALID},
187*5113495bSYour Name 		{"HE OFDMA MCS 2 (QPSK 3/4)     ", MCS_VALID},
188*5113495bSYour Name 		{"HE OFDMA MCS 3 (16-QAM 1/2)   ", MCS_VALID},
189*5113495bSYour Name 		{"HE OFDMA MCS 4 (16-QAM 3/4)   ", MCS_VALID},
190*5113495bSYour Name 		{"HE OFDMA MCS 5 (64-QAM 2/3)   ", MCS_VALID},
191*5113495bSYour Name 		{"HE OFDMA MCS 6 (64-QAM 3/4)   ", MCS_VALID},
192*5113495bSYour Name 		{"HE OFDMA MCS 7 (64-QAM 5/6)   ", MCS_VALID},
193*5113495bSYour Name 		{"HE OFDMA MCS 8 (256-QAM 3/4)  ", MCS_VALID},
194*5113495bSYour Name 		{"HE OFDMA MCS 9 (256-QAM 5/6)  ", MCS_VALID},
195*5113495bSYour Name 		{"HE OFDMA MCS 10 (1024-QAM 3/4)", MCS_VALID},
196*5113495bSYour Name 		{"HE OFDMA MCS 11 (1024-QAM 5/6)", MCS_VALID},
197*5113495bSYour Name 		{"HE OFDMA MCS 12 (4096-QAM 3/4)", MCS_VALID},
198*5113495bSYour Name 		{"HE OFDMA MCS 13 (4096-QAM 5/6)", MCS_VALID},
199*5113495bSYour Name 		{"INVALID ", MCS_INVALID},
200*5113495bSYour Name 		{"INVALID ", MCS_INVALID},
201*5113495bSYour Name 		{"INVALID ", MCS_INVALID},
202*5113495bSYour Name 	}
203*5113495bSYour Name };
204*5113495bSYour Name 
205*5113495bSYour Name static const struct cdp_rate_debug
206*5113495bSYour Name dp_mu_be_rate_string[TXRX_TYPE_MU_MAX][MAX_MCS] = {
207*5113495bSYour Name 	{
208*5113495bSYour Name 		{"EHT MU-MIMO MCS 0 (BPSK 1/2)     ", MCS_VALID},
209*5113495bSYour Name 		{"EHT MU-MIMO MCS 1 (QPSK 1/2)     ", MCS_VALID},
210*5113495bSYour Name 		{"EHT MU-MIMO MCS 2 (QPSK 3/4)     ", MCS_VALID},
211*5113495bSYour Name 		{"EHT MU-MIMO MCS 3 (16-QAM 1/2)   ", MCS_VALID},
212*5113495bSYour Name 		{"EHT MU-MIMO MCS 4 (16-QAM 3/4)   ", MCS_VALID},
213*5113495bSYour Name 		{"EHT MU-MIMO MCS 5 (64-QAM 2/3)   ", MCS_VALID},
214*5113495bSYour Name 		{"EHT MU-MIMO MCS 6 (64-QAM 3/4)   ", MCS_VALID},
215*5113495bSYour Name 		{"EHT MU-MIMO MCS 7 (64-QAM 5/6)   ", MCS_VALID},
216*5113495bSYour Name 		{"EHT MU-MIMO MCS 8 (256-QAM 3/4)  ", MCS_VALID},
217*5113495bSYour Name 		{"EHT MU-MIMO MCS 9 (256-QAM 5/6)  ", MCS_VALID},
218*5113495bSYour Name 		{"EHT MU-MIMO MCS 10 (1024-QAM 3/4)", MCS_VALID},
219*5113495bSYour Name 		{"EHT MU-MIMO MCS 11 (1024-QAM 5/6)", MCS_VALID},
220*5113495bSYour Name 		{"EHT MU-MIMO MCS 12 (4096-QAM 3/4)", MCS_VALID},
221*5113495bSYour Name 		{"EHT MU-MIMO MCS 13 (4096-QAM 5/6)", MCS_VALID},
222*5113495bSYour Name 		{"EHT MU-MIMO MCS 14 (BPSK-DCM 1/2)", MCS_VALID},
223*5113495bSYour Name 		{"EHT MU-MIMO MCS 15 (BPSK-DCM 1/2)", MCS_VALID},
224*5113495bSYour Name 		{"INVALID ", MCS_INVALID},
225*5113495bSYour Name 	},
226*5113495bSYour Name 	{
227*5113495bSYour Name 		{"EHT OFDMA MCS 0 (BPSK 1/2)     ", MCS_VALID},
228*5113495bSYour Name 		{"EHT OFDMA MCS 1 (QPSK 1/2)     ", MCS_VALID},
229*5113495bSYour Name 		{"EHT OFDMA MCS 2 (QPSK 3/4)     ", MCS_VALID},
230*5113495bSYour Name 		{"EHT OFDMA MCS 3 (16-QAM 1/2)   ", MCS_VALID},
231*5113495bSYour Name 		{"EHT OFDMA MCS 4 (16-QAM 3/4)   ", MCS_VALID},
232*5113495bSYour Name 		{"EHT OFDMA MCS 5 (64-QAM 2/3)   ", MCS_VALID},
233*5113495bSYour Name 		{"EHT OFDMA MCS 6 (64-QAM 3/4)   ", MCS_VALID},
234*5113495bSYour Name 		{"EHT OFDMA MCS 7 (64-QAM 5/6)   ", MCS_VALID},
235*5113495bSYour Name 		{"EHT OFDMA MCS 8 (256-QAM 3/4)  ", MCS_VALID},
236*5113495bSYour Name 		{"EHT OFDMA MCS 9 (256-QAM 5/6)  ", MCS_VALID},
237*5113495bSYour Name 		{"EHT OFDMA MCS 10 (1024-QAM 3/4)", MCS_VALID},
238*5113495bSYour Name 		{"EHT OFDMA MCS 11 (1024-QAM 5/6)", MCS_VALID},
239*5113495bSYour Name 		{"EHT OFDMA MCS 12 (4096-QAM 3/4)", MCS_VALID},
240*5113495bSYour Name 		{"EHT OFDMA MCS 13 (4096-QAM 5/6)", MCS_VALID},
241*5113495bSYour Name 		{"EHT OFDMA MCS 14 (BPSK-DCM 1/2)", MCS_VALID},
242*5113495bSYour Name 		{"EHT OFDMA MCS 15 (BPSK-DCM 1/2)", MCS_VALID},
243*5113495bSYour Name 		{"INVALID ", MCS_INVALID},
244*5113495bSYour Name 	}
245*5113495bSYour Name };
246*5113495bSYour Name #else
247*5113495bSYour Name static const struct cdp_rate_debug
248*5113495bSYour Name dp_mu_rate_string[TXRX_TYPE_MU_MAX][MAX_MCS] = {
249*5113495bSYour Name 	{
250*5113495bSYour Name 		{"HE MU-MIMO MCS 0 (BPSK 1/2)     ", MCS_VALID},
251*5113495bSYour Name 		{"HE MU-MIMO MCS 1 (QPSK 1/2)     ", MCS_VALID},
252*5113495bSYour Name 		{"HE MU-MIMO MCS 2 (QPSK 3/4)     ", MCS_VALID},
253*5113495bSYour Name 		{"HE MU-MIMO MCS 3 (16-QAM 1/2)   ", MCS_VALID},
254*5113495bSYour Name 		{"HE MU-MIMO MCS 4 (16-QAM 3/4)   ", MCS_VALID},
255*5113495bSYour Name 		{"HE MU-MIMO MCS 5 (64-QAM 2/3)   ", MCS_VALID},
256*5113495bSYour Name 		{"HE MU-MIMO MCS 6 (64-QAM 3/4)   ", MCS_VALID},
257*5113495bSYour Name 		{"HE MU-MIMO MCS 7 (64-QAM 5/6)   ", MCS_VALID},
258*5113495bSYour Name 		{"HE MU-MIMO MCS 8 (256-QAM 3/4)  ", MCS_VALID},
259*5113495bSYour Name 		{"HE MU-MIMO MCS 9 (256-QAM 5/6)  ", MCS_VALID},
260*5113495bSYour Name 		{"HE MU-MIMO MCS 10 (1024-QAM 3/4)", MCS_VALID},
261*5113495bSYour Name 		{"HE MU-MIMO MCS 11 (1024-QAM 5/6)", MCS_VALID},
262*5113495bSYour Name 		{"HE MU-MIMO MCS 12 (4096-QAM 3/4)", MCS_VALID},
263*5113495bSYour Name 		{"HE MU-MIMO MCS 13 (4096-QAM 5/6)", MCS_VALID},
264*5113495bSYour Name 		{"INVALID ", MCS_INVALID},
265*5113495bSYour Name 	},
266*5113495bSYour Name 	{
267*5113495bSYour Name 		{"HE OFDMA MCS 0 (BPSK 1/2)     ", MCS_VALID},
268*5113495bSYour Name 		{"HE OFDMA MCS 1 (QPSK 1/2)     ", MCS_VALID},
269*5113495bSYour Name 		{"HE OFDMA MCS 2 (QPSK 3/4)     ", MCS_VALID},
270*5113495bSYour Name 		{"HE OFDMA MCS 3 (16-QAM 1/2)   ", MCS_VALID},
271*5113495bSYour Name 		{"HE OFDMA MCS 4 (16-QAM 3/4)   ", MCS_VALID},
272*5113495bSYour Name 		{"HE OFDMA MCS 5 (64-QAM 2/3)   ", MCS_VALID},
273*5113495bSYour Name 		{"HE OFDMA MCS 6 (64-QAM 3/4)   ", MCS_VALID},
274*5113495bSYour Name 		{"HE OFDMA MCS 7 (64-QAM 5/6)   ", MCS_VALID},
275*5113495bSYour Name 		{"HE OFDMA MCS 8 (256-QAM 3/4)  ", MCS_VALID},
276*5113495bSYour Name 		{"HE OFDMA MCS 9 (256-QAM 5/6)  ", MCS_VALID},
277*5113495bSYour Name 		{"HE OFDMA MCS 10 (1024-QAM 3/4)", MCS_VALID},
278*5113495bSYour Name 		{"HE OFDMA MCS 11 (1024-QAM 5/6)", MCS_VALID},
279*5113495bSYour Name 		{"HE OFDMA MCS 12 (4096-QAM 3/4)", MCS_VALID},
280*5113495bSYour Name 		{"HE OFDMA MCS 13 (4096-QAM 5/6)", MCS_VALID},
281*5113495bSYour Name 		{"INVALID ", MCS_INVALID},
282*5113495bSYour Name 	}
283*5113495bSYour Name };
284*5113495bSYour Name #endif
285*5113495bSYour Name 
286*5113495bSYour Name const char *mu_reception_mode[TXRX_TYPE_MU_MAX] = {
287*5113495bSYour Name 	"MU MIMO", "MU OFDMA"
288*5113495bSYour Name };
289*5113495bSYour Name 
290*5113495bSYour Name #ifdef QCA_ENH_V3_STATS_SUPPORT
291*5113495bSYour Name #ifndef WLAN_CONFIG_TX_DELAY
292*5113495bSYour Name const char *fw_to_hw_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = {
293*5113495bSYour Name 	"0 to 9 ms", "10 to 19 ms",
294*5113495bSYour Name 	"20 to 29 ms", "30 to 39 ms",
295*5113495bSYour Name 	"40 to 49 ms", "50 to 59 ms",
296*5113495bSYour Name 	"60 to 69 ms", "70 to 79 ms",
297*5113495bSYour Name 	"80 to 89 ms", "90 to 99 ms",
298*5113495bSYour Name 	"101 to 249 ms", "250 to 499 ms", "500+ ms"
299*5113495bSYour Name };
300*5113495bSYour Name #else
301*5113495bSYour Name const char *fw_to_hw_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = {
302*5113495bSYour Name 	"0 to 250 us", "250 to 500 us",
303*5113495bSYour Name 	"500 to 750 us", "750 to 1000 us",
304*5113495bSYour Name 	"1000 to 1500 us", "1500 to 2000 us",
305*5113495bSYour Name 	"2000 to 2500 us", "2500 to 5000 us",
306*5113495bSYour Name 	"5000 to 6000 us", "6000 to 7000 ms",
307*5113495bSYour Name 	"7000 to 8000 us", "8000 to 9000 us", "9000+ us"
308*5113495bSYour Name };
309*5113495bSYour Name #endif
310*5113495bSYour Name #elif defined(HW_TX_DELAY_STATS_ENABLE)
311*5113495bSYour Name const char *fw_to_hw_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = {
312*5113495bSYour Name 	"0 to 2 ms", "2 to 4 ms",
313*5113495bSYour Name 	"4 to 6 ms", "6 to 8 ms",
314*5113495bSYour Name 	"8 to 10 ms", "10 to 20 ms",
315*5113495bSYour Name 	"20 to 30 ms", "30 to 40 ms",
316*5113495bSYour Name 	"40 to 50 ms", "50 to 100 ms",
317*5113495bSYour Name 	"100 to 250 ms", "250 to 500 ms", "500+ ms"
318*5113495bSYour Name };
319*5113495bSYour Name #endif
320*5113495bSYour Name 
321*5113495bSYour Name #if defined(HW_TX_DELAY_STATS_ENABLE)
322*5113495bSYour Name const char *fw_to_hw_delay_bkt_str[CDP_DELAY_BUCKET_MAX + 1] = {
323*5113495bSYour Name 	"0-2ms", "2-4",
324*5113495bSYour Name 	"4-6", "6-8",
325*5113495bSYour Name 	"8-10", "10-20",
326*5113495bSYour Name 	"20-30", "30-40",
327*5113495bSYour Name 	"40-50", "50-100",
328*5113495bSYour Name 	"100-250", "250-500", "500+ ms"
329*5113495bSYour Name };
330*5113495bSYour Name #endif
331*5113495bSYour Name 
332*5113495bSYour Name #ifdef QCA_ENH_V3_STATS_SUPPORT
333*5113495bSYour Name #ifndef WLAN_CONFIG_TX_DELAY
334*5113495bSYour Name const char *sw_enq_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = {
335*5113495bSYour Name 	"0 to 1 ms", "1 to 2 ms",
336*5113495bSYour Name 	"2 to 3 ms", "3 to 4 ms",
337*5113495bSYour Name 	"4 to 5 ms", "5 to 6 ms",
338*5113495bSYour Name 	"6 to 7 ms", "7 to 8 ms",
339*5113495bSYour Name 	"8 to 9 ms", "9 to 10 ms",
340*5113495bSYour Name 	"10 to 11 ms", "11 to 12 ms", "12+ ms"
341*5113495bSYour Name };
342*5113495bSYour Name #else
343*5113495bSYour Name const char *sw_enq_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = {
344*5113495bSYour Name 	"0 to 250 us", "250 to 500 us",
345*5113495bSYour Name 	"500 to 750 us", "750 to 1000 us",
346*5113495bSYour Name 	"1000 to 1500 us", "1500 to 2000 us",
347*5113495bSYour Name 	"2000 to 2500 us", "2500 to 5000 us",
348*5113495bSYour Name 	"5000 to 6000 us", "6000 to 7000 ms",
349*5113495bSYour Name 	"7000 to 8000 us", "8000 to 9000 us", "9000+ us"
350*5113495bSYour Name };
351*5113495bSYour Name #endif
352*5113495bSYour Name 
353*5113495bSYour Name const char *intfrm_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = {
354*5113495bSYour Name 	"0 to 4 ms", "5 to 9 ms",
355*5113495bSYour Name 	"10 to 14 ms", "15 to 19 ms",
356*5113495bSYour Name 	"20 to 24 ms", "25 to 29 ms",
357*5113495bSYour Name 	"30 to 34 ms", "35 to 39 ms",
358*5113495bSYour Name 	"40 to 44 ms", "45 to 49 ms",
359*5113495bSYour Name 	"50 to 54 ms", "55 to 59 ms", "60+ ms"
360*5113495bSYour Name };
361*5113495bSYour Name #endif
362*5113495bSYour Name 
363*5113495bSYour Name #define TID_COUNTER_STATS 1	/* Success/drop stats type */
364*5113495bSYour Name #define TID_DELAY_STATS 2	/* Delay stats type */
365*5113495bSYour Name #define TID_RX_ERROR_STATS 3	/* Rx Error stats type */
366*5113495bSYour Name 
367*5113495bSYour Name #ifdef WLAN_SYSFS_DP_STATS
DP_PRINT_STATS(const char * fmt,...)368*5113495bSYour Name void DP_PRINT_STATS(const char *fmt, ...)
369*5113495bSYour Name {
370*5113495bSYour Name 	void *soc_void = NULL;
371*5113495bSYour Name 	va_list val;
372*5113495bSYour Name 	uint16_t buf_written = 0;
373*5113495bSYour Name 	uint16_t curr_len = 0;
374*5113495bSYour Name 	uint16_t max_len = 0;
375*5113495bSYour Name 	struct dp_soc *soc = NULL;
376*5113495bSYour Name 
377*5113495bSYour Name 	soc_void = cds_get_context(QDF_MODULE_ID_SOC);
378*5113495bSYour Name 	if (!soc_void)
379*5113495bSYour Name 		return;
380*5113495bSYour Name 
381*5113495bSYour Name 	soc = cdp_soc_t_to_dp_soc(soc_void);
382*5113495bSYour Name 
383*5113495bSYour Name 	va_start(val, fmt);
384*5113495bSYour Name 	QDF_VTRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH, (char *)fmt, val);
385*5113495bSYour Name 	/* writing to the buffer */
386*5113495bSYour Name 	if (soc->sysfs_config && soc->sysfs_config->printing_mode == PRINTING_MODE_ENABLED) {
387*5113495bSYour Name 		if (soc->sysfs_config->process_id == qdf_get_current_pid()) {
388*5113495bSYour Name 			curr_len = soc->sysfs_config->curr_buffer_length;
389*5113495bSYour Name 			max_len = soc->sysfs_config->max_buffer_length;
390*5113495bSYour Name 			if ((max_len - curr_len) <= 1)
391*5113495bSYour Name 				goto fail;
392*5113495bSYour Name 
393*5113495bSYour Name 			qdf_spinlock_acquire(&soc->sysfs_config->sysfs_write_user_buffer);
394*5113495bSYour Name 			if (soc->sysfs_config->buf) {
395*5113495bSYour Name 				buf_written = vscnprintf(soc->sysfs_config->buf + curr_len,
396*5113495bSYour Name 							 max_len - curr_len, fmt, val);
397*5113495bSYour Name 				curr_len += buf_written;
398*5113495bSYour Name 				if ((max_len - curr_len) <= 1)
399*5113495bSYour Name 					goto rel_lock;
400*5113495bSYour Name 
401*5113495bSYour Name 				buf_written += scnprintf(soc->sysfs_config->buf + curr_len,
402*5113495bSYour Name 							 max_len - curr_len, "\n");
403*5113495bSYour Name 				soc->sysfs_config->curr_buffer_length +=  buf_written;
404*5113495bSYour Name 			}
405*5113495bSYour Name 			qdf_spinlock_release(&soc->sysfs_config->sysfs_write_user_buffer);
406*5113495bSYour Name 		}
407*5113495bSYour Name 	}
408*5113495bSYour Name 	va_end(val);
409*5113495bSYour Name 	return;
410*5113495bSYour Name 
411*5113495bSYour Name rel_lock:
412*5113495bSYour Name 	qdf_spinlock_release(&soc->sysfs_config->sysfs_write_user_buffer);
413*5113495bSYour Name fail:
414*5113495bSYour Name 	va_end(val);
415*5113495bSYour Name }
416*5113495bSYour Name #endif /* WLAN_SYSFS_DP_STATS */
417*5113495bSYour Name /**
418*5113495bSYour Name  * dp_print_stats_string_tlv() - display htt_stats_string_tlv
419*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_stats_string_tlv
420*5113495bSYour Name  *
421*5113495bSYour Name  * Return: void
422*5113495bSYour Name  */
dp_print_stats_string_tlv(uint32_t * tag_buf)423*5113495bSYour Name static void dp_print_stats_string_tlv(uint32_t *tag_buf)
424*5113495bSYour Name {
425*5113495bSYour Name 	htt_stats_string_tlv *dp_stats_buf =
426*5113495bSYour Name 		(htt_stats_string_tlv *)tag_buf;
427*5113495bSYour Name 	uint8_t i;
428*5113495bSYour Name 	uint16_t index = 0;
429*5113495bSYour Name 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
430*5113495bSYour Name 	char *data = qdf_mem_malloc(DP_MAX_STRING_LEN);
431*5113495bSYour Name 
432*5113495bSYour Name 	if (!data) {
433*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
434*5113495bSYour Name 			  FL("Output buffer not allocated"));
435*5113495bSYour Name 		return;
436*5113495bSYour Name 	}
437*5113495bSYour Name 
438*5113495bSYour Name 	DP_PRINT_STATS("HTT_STATS_STRING_TLV:");
439*5113495bSYour Name 	for (i = 0; i <  tag_len; i++) {
440*5113495bSYour Name 		index += qdf_snprint(&data[index],
441*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
442*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->data[i]);
443*5113495bSYour Name 	}
444*5113495bSYour Name 	DP_PRINT_STATS("data = %s\n", data);
445*5113495bSYour Name 	qdf_mem_free(data);
446*5113495bSYour Name }
447*5113495bSYour Name 
448*5113495bSYour Name /**
449*5113495bSYour Name  * dp_print_tx_pdev_stats_cmn_tlv() - display htt_tx_pdev_stats_cmn_tlv
450*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_cmn_tlv
451*5113495bSYour Name  *
452*5113495bSYour Name  * Return: void
453*5113495bSYour Name  */
dp_print_tx_pdev_stats_cmn_tlv(uint32_t * tag_buf)454*5113495bSYour Name static void dp_print_tx_pdev_stats_cmn_tlv(uint32_t *tag_buf)
455*5113495bSYour Name {
456*5113495bSYour Name 	htt_tx_pdev_stats_cmn_tlv *dp_stats_buf =
457*5113495bSYour Name 		(htt_tx_pdev_stats_cmn_tlv *)tag_buf;
458*5113495bSYour Name 
459*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_PDEV_STATS_CMN_TLV:");
460*5113495bSYour Name 	DP_PRINT_STATS("mac_id__word = %u",
461*5113495bSYour Name 		       dp_stats_buf->mac_id__word);
462*5113495bSYour Name 	DP_PRINT_STATS("hw_queued = %u",
463*5113495bSYour Name 		       dp_stats_buf->hw_queued);
464*5113495bSYour Name 	DP_PRINT_STATS("hw_reaped = %u",
465*5113495bSYour Name 		       dp_stats_buf->hw_reaped);
466*5113495bSYour Name 	DP_PRINT_STATS("underrun = %u",
467*5113495bSYour Name 		       dp_stats_buf->underrun);
468*5113495bSYour Name 	DP_PRINT_STATS("hw_paused = %u",
469*5113495bSYour Name 		       dp_stats_buf->hw_paused);
470*5113495bSYour Name 	DP_PRINT_STATS("hw_flush = %u",
471*5113495bSYour Name 		       dp_stats_buf->hw_flush);
472*5113495bSYour Name 	DP_PRINT_STATS("hw_filt = %u",
473*5113495bSYour Name 		       dp_stats_buf->hw_filt);
474*5113495bSYour Name 	DP_PRINT_STATS("tx_abort = %u",
475*5113495bSYour Name 		       dp_stats_buf->tx_abort);
476*5113495bSYour Name 	DP_PRINT_STATS("mpdu_requeued = %u",
477*5113495bSYour Name 		       dp_stats_buf->mpdu_requed);
478*5113495bSYour Name 	DP_PRINT_STATS("tx_xretry = %u",
479*5113495bSYour Name 		       dp_stats_buf->tx_xretry);
480*5113495bSYour Name 	DP_PRINT_STATS("data_rc = %u",
481*5113495bSYour Name 		       dp_stats_buf->data_rc);
482*5113495bSYour Name 	DP_PRINT_STATS("mpdu_dropped_xretry = %u",
483*5113495bSYour Name 		       dp_stats_buf->mpdu_dropped_xretry);
484*5113495bSYour Name 	DP_PRINT_STATS("illegal_rate_phy_err = %u",
485*5113495bSYour Name 		       dp_stats_buf->illgl_rate_phy_err);
486*5113495bSYour Name 	DP_PRINT_STATS("cont_xretry = %u",
487*5113495bSYour Name 		       dp_stats_buf->cont_xretry);
488*5113495bSYour Name 	DP_PRINT_STATS("tx_timeout = %u",
489*5113495bSYour Name 		       dp_stats_buf->tx_timeout);
490*5113495bSYour Name 	DP_PRINT_STATS("pdev_resets = %u",
491*5113495bSYour Name 		       dp_stats_buf->pdev_resets);
492*5113495bSYour Name 	DP_PRINT_STATS("phy_underrun = %u",
493*5113495bSYour Name 		       dp_stats_buf->phy_underrun);
494*5113495bSYour Name 	DP_PRINT_STATS("txop_ovf = %u",
495*5113495bSYour Name 		       dp_stats_buf->txop_ovf);
496*5113495bSYour Name 	DP_PRINT_STATS("seq_posted = %u",
497*5113495bSYour Name 		       dp_stats_buf->seq_posted);
498*5113495bSYour Name 	DP_PRINT_STATS("seq_failed_queueing = %u",
499*5113495bSYour Name 		       dp_stats_buf->seq_failed_queueing);
500*5113495bSYour Name 	DP_PRINT_STATS("seq_completed = %u",
501*5113495bSYour Name 		       dp_stats_buf->seq_completed);
502*5113495bSYour Name 	DP_PRINT_STATS("seq_restarted = %u",
503*5113495bSYour Name 		       dp_stats_buf->seq_restarted);
504*5113495bSYour Name 	DP_PRINT_STATS("mu_seq_posted = %u",
505*5113495bSYour Name 		       dp_stats_buf->mu_seq_posted);
506*5113495bSYour Name 	DP_PRINT_STATS("seq_switch_hw_paused = %u",
507*5113495bSYour Name 		       dp_stats_buf->seq_switch_hw_paused);
508*5113495bSYour Name 	DP_PRINT_STATS("next_seq_posted_dsr = %u",
509*5113495bSYour Name 		       dp_stats_buf->next_seq_posted_dsr);
510*5113495bSYour Name 	DP_PRINT_STATS("seq_posted_isr = %u",
511*5113495bSYour Name 		       dp_stats_buf->seq_posted_isr);
512*5113495bSYour Name 	DP_PRINT_STATS("seq_ctrl_cached = %u",
513*5113495bSYour Name 		       dp_stats_buf->seq_ctrl_cached);
514*5113495bSYour Name 	DP_PRINT_STATS("mpdu_count_tqm = %u",
515*5113495bSYour Name 		       dp_stats_buf->mpdu_count_tqm);
516*5113495bSYour Name 	DP_PRINT_STATS("msdu_count_tqm = %u",
517*5113495bSYour Name 		       dp_stats_buf->msdu_count_tqm);
518*5113495bSYour Name 	DP_PRINT_STATS("mpdu_removed_tqm = %u",
519*5113495bSYour Name 		       dp_stats_buf->mpdu_removed_tqm);
520*5113495bSYour Name 	DP_PRINT_STATS("msdu_removed_tqm = %u",
521*5113495bSYour Name 		       dp_stats_buf->msdu_removed_tqm);
522*5113495bSYour Name 	DP_PRINT_STATS("mpdus_sw_flush = %u",
523*5113495bSYour Name 		       dp_stats_buf->mpdus_sw_flush);
524*5113495bSYour Name 	DP_PRINT_STATS("mpdus_hw_filter = %u",
525*5113495bSYour Name 		       dp_stats_buf->mpdus_hw_filter);
526*5113495bSYour Name 	DP_PRINT_STATS("mpdus_truncated = %u",
527*5113495bSYour Name 		       dp_stats_buf->mpdus_truncated);
528*5113495bSYour Name 	DP_PRINT_STATS("mpdus_ack_failed = %u",
529*5113495bSYour Name 		       dp_stats_buf->mpdus_ack_failed);
530*5113495bSYour Name 	DP_PRINT_STATS("mpdus_expired = %u",
531*5113495bSYour Name 		       dp_stats_buf->mpdus_expired);
532*5113495bSYour Name 	DP_PRINT_STATS("mpdus_seq_hw_retry = %u",
533*5113495bSYour Name 		       dp_stats_buf->mpdus_seq_hw_retry);
534*5113495bSYour Name 	DP_PRINT_STATS("ack_tlv_proc = %u",
535*5113495bSYour Name 		       dp_stats_buf->ack_tlv_proc);
536*5113495bSYour Name 	DP_PRINT_STATS("coex_abort_mpdu_cnt_valid = %u",
537*5113495bSYour Name 		       dp_stats_buf->coex_abort_mpdu_cnt_valid);
538*5113495bSYour Name 	DP_PRINT_STATS("coex_abort_mpdu_cnt = %u\n",
539*5113495bSYour Name 		       dp_stats_buf->coex_abort_mpdu_cnt);
540*5113495bSYour Name }
541*5113495bSYour Name 
542*5113495bSYour Name /**
543*5113495bSYour Name  * dp_print_tx_pdev_stats_urrn_tlv_v() - display htt_tx_pdev_stats_urrn_tlv_v
544*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_urrn_tlv_v
545*5113495bSYour Name  *
546*5113495bSYour Name  * Return: void
547*5113495bSYour Name  */
dp_print_tx_pdev_stats_urrn_tlv_v(uint32_t * tag_buf)548*5113495bSYour Name static void dp_print_tx_pdev_stats_urrn_tlv_v(uint32_t *tag_buf)
549*5113495bSYour Name {
550*5113495bSYour Name 	htt_tx_pdev_stats_urrn_tlv_v *dp_stats_buf =
551*5113495bSYour Name 		(htt_tx_pdev_stats_urrn_tlv_v *)tag_buf;
552*5113495bSYour Name 	uint8_t i;
553*5113495bSYour Name 	uint16_t index = 0;
554*5113495bSYour Name 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
555*5113495bSYour Name 	char *urrn_stats = qdf_mem_malloc(DP_MAX_STRING_LEN);
556*5113495bSYour Name 
557*5113495bSYour Name 	if (!urrn_stats) {
558*5113495bSYour Name 		dp_stats_err("Output buffer not allocated");
559*5113495bSYour Name 		return;
560*5113495bSYour Name 	}
561*5113495bSYour Name 
562*5113495bSYour Name 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_URRN_STATS);
563*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_PDEV_STATS_URRN_TLV_V:");
564*5113495bSYour Name 	for (i = 0; i <  tag_len; i++) {
565*5113495bSYour Name 		index += qdf_snprint(&urrn_stats[index],
566*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
567*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->urrn_stats[i]);
568*5113495bSYour Name 	}
569*5113495bSYour Name 	DP_PRINT_STATS("urrn_stats = %s\n", urrn_stats);
570*5113495bSYour Name 	qdf_mem_free(urrn_stats);
571*5113495bSYour Name }
572*5113495bSYour Name 
573*5113495bSYour Name /**
574*5113495bSYour Name  * dp_print_tx_pdev_stats_flush_tlv_v() - display htt_tx_pdev_stats_flush_tlv_v
575*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_flush_tlv_v
576*5113495bSYour Name  *
577*5113495bSYour Name  * Return: void
578*5113495bSYour Name  */
dp_print_tx_pdev_stats_flush_tlv_v(uint32_t * tag_buf)579*5113495bSYour Name static void dp_print_tx_pdev_stats_flush_tlv_v(uint32_t *tag_buf)
580*5113495bSYour Name {
581*5113495bSYour Name 	htt_tx_pdev_stats_flush_tlv_v *dp_stats_buf =
582*5113495bSYour Name 		(htt_tx_pdev_stats_flush_tlv_v *)tag_buf;
583*5113495bSYour Name 	uint8_t i;
584*5113495bSYour Name 	uint16_t index = 0;
585*5113495bSYour Name 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
586*5113495bSYour Name 	char *flush_errs = qdf_mem_malloc(DP_MAX_STRING_LEN);
587*5113495bSYour Name 
588*5113495bSYour Name 	if (!flush_errs) {
589*5113495bSYour Name 		dp_stats_err("Output buffer not allocated");
590*5113495bSYour Name 		return;
591*5113495bSYour Name 	}
592*5113495bSYour Name 
593*5113495bSYour Name 	tag_len = qdf_min(tag_len,
594*5113495bSYour Name 			(uint32_t)HTT_TX_PDEV_MAX_FLUSH_REASON_STATS);
595*5113495bSYour Name 
596*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_PDEV_STATS_FLUSH_TLV_V:");
597*5113495bSYour Name 	for (i = 0; i <  tag_len; i++) {
598*5113495bSYour Name 		index += qdf_snprint(&flush_errs[index],
599*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
600*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->flush_errs[i]);
601*5113495bSYour Name 	}
602*5113495bSYour Name 	DP_PRINT_STATS("flush_errs = %s\n", flush_errs);
603*5113495bSYour Name 	qdf_mem_free(flush_errs);
604*5113495bSYour Name }
605*5113495bSYour Name 
606*5113495bSYour Name /**
607*5113495bSYour Name  * dp_print_tx_pdev_stats_sifs_tlv_v() - display htt_tx_pdev_stats_sifs_tlv_v
608*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_sifs_tlv_v
609*5113495bSYour Name  *
610*5113495bSYour Name  * Return: void
611*5113495bSYour Name  */
dp_print_tx_pdev_stats_sifs_tlv_v(uint32_t * tag_buf)612*5113495bSYour Name static void dp_print_tx_pdev_stats_sifs_tlv_v(uint32_t *tag_buf)
613*5113495bSYour Name {
614*5113495bSYour Name 	htt_tx_pdev_stats_sifs_tlv_v *dp_stats_buf =
615*5113495bSYour Name 		(htt_tx_pdev_stats_sifs_tlv_v *)tag_buf;
616*5113495bSYour Name 	uint8_t i;
617*5113495bSYour Name 	uint16_t index = 0;
618*5113495bSYour Name 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
619*5113495bSYour Name 	char *sifs_status = qdf_mem_malloc(DP_MAX_STRING_LEN);
620*5113495bSYour Name 
621*5113495bSYour Name 	if (!sifs_status) {
622*5113495bSYour Name 		dp_stats_err("Output buffer not allocated");
623*5113495bSYour Name 		return;
624*5113495bSYour Name 	}
625*5113495bSYour Name 
626*5113495bSYour Name 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_SIFS_BURST_STATS);
627*5113495bSYour Name 
628*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_PDEV_STATS_SIFS_TLV_V:");
629*5113495bSYour Name 	for (i = 0; i <  tag_len; i++) {
630*5113495bSYour Name 		index += qdf_snprint(&sifs_status[index],
631*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
632*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->sifs_status[i]);
633*5113495bSYour Name 	}
634*5113495bSYour Name 	DP_PRINT_STATS("sifs_status = %s\n", sifs_status);
635*5113495bSYour Name 	qdf_mem_free(sifs_status);
636*5113495bSYour Name }
637*5113495bSYour Name 
638*5113495bSYour Name /**
639*5113495bSYour Name  * dp_print_tx_pdev_stats_phy_err_tlv_v() - display htt_tx_pdev_stats_phy_err_tlv_v
640*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_phy_err_tlv_v
641*5113495bSYour Name  *
642*5113495bSYour Name  * Return: void
643*5113495bSYour Name  */
dp_print_tx_pdev_stats_phy_err_tlv_v(uint32_t * tag_buf)644*5113495bSYour Name static void dp_print_tx_pdev_stats_phy_err_tlv_v(uint32_t *tag_buf)
645*5113495bSYour Name {
646*5113495bSYour Name 	htt_tx_pdev_stats_phy_err_tlv_v *dp_stats_buf =
647*5113495bSYour Name 		(htt_tx_pdev_stats_phy_err_tlv_v *)tag_buf;
648*5113495bSYour Name 	uint8_t i;
649*5113495bSYour Name 	uint16_t index = 0;
650*5113495bSYour Name 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
651*5113495bSYour Name 	char *phy_errs = qdf_mem_malloc(DP_MAX_STRING_LEN);
652*5113495bSYour Name 
653*5113495bSYour Name 	if (!phy_errs) {
654*5113495bSYour Name 		dp_stats_err("Output buffer not allocated");
655*5113495bSYour Name 		return;
656*5113495bSYour Name 	}
657*5113495bSYour Name 
658*5113495bSYour Name 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_PHY_ERR_STATS);
659*5113495bSYour Name 
660*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_PDEV_STATS_PHY_ERR_TLV_V:");
661*5113495bSYour Name 	for (i = 0; i <  tag_len; i++) {
662*5113495bSYour Name 		index += qdf_snprint(&phy_errs[index],
663*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
664*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->phy_errs[i]);
665*5113495bSYour Name 	}
666*5113495bSYour Name 	DP_PRINT_STATS("phy_errs = %s\n", phy_errs);
667*5113495bSYour Name 	qdf_mem_free(phy_errs);
668*5113495bSYour Name }
669*5113495bSYour Name 
670*5113495bSYour Name /**
671*5113495bSYour Name  * dp_print_hw_stats_intr_misc_tlv() - display htt_hw_stats_intr_misc_tlv
672*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_hw_stats_intr_misc_tlv
673*5113495bSYour Name  *
674*5113495bSYour Name  * Return: void
675*5113495bSYour Name  */
dp_print_hw_stats_intr_misc_tlv(uint32_t * tag_buf)676*5113495bSYour Name static void dp_print_hw_stats_intr_misc_tlv(uint32_t *tag_buf)
677*5113495bSYour Name {
678*5113495bSYour Name 	htt_hw_stats_intr_misc_tlv *dp_stats_buf =
679*5113495bSYour Name 		(htt_hw_stats_intr_misc_tlv *)tag_buf;
680*5113495bSYour Name 	uint8_t i;
681*5113495bSYour Name 	uint16_t index = 0;
682*5113495bSYour Name 	char *hw_intr_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
683*5113495bSYour Name 
684*5113495bSYour Name 	if (!hw_intr_name) {
685*5113495bSYour Name 		dp_stats_err("Output buffer not allocated");
686*5113495bSYour Name 		return;
687*5113495bSYour Name 	}
688*5113495bSYour Name 
689*5113495bSYour Name 	DP_PRINT_STATS("HTT_HW_STATS_INTR_MISC_TLV:");
690*5113495bSYour Name 	for (i = 0; i <  DP_HTT_HW_INTR_NAME_LEN; i++) {
691*5113495bSYour Name 		index += qdf_snprint(&hw_intr_name[index],
692*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
693*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->hw_intr_name[i]);
694*5113495bSYour Name 	}
695*5113495bSYour Name 	DP_PRINT_STATS("hw_intr_name = %s ", hw_intr_name);
696*5113495bSYour Name 	DP_PRINT_STATS("mask = %u",
697*5113495bSYour Name 		       dp_stats_buf->mask);
698*5113495bSYour Name 	DP_PRINT_STATS("count = %u\n",
699*5113495bSYour Name 		       dp_stats_buf->count);
700*5113495bSYour Name 	qdf_mem_free(hw_intr_name);
701*5113495bSYour Name }
702*5113495bSYour Name 
703*5113495bSYour Name /**
704*5113495bSYour Name  * dp_print_hw_stats_wd_timeout_tlv() - display htt_hw_stats_wd_timeout_tlv
705*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_hw_stats_wd_timeout_tlv
706*5113495bSYour Name  *
707*5113495bSYour Name  * Return: void
708*5113495bSYour Name  */
dp_print_hw_stats_wd_timeout_tlv(uint32_t * tag_buf)709*5113495bSYour Name static void dp_print_hw_stats_wd_timeout_tlv(uint32_t *tag_buf)
710*5113495bSYour Name {
711*5113495bSYour Name 	htt_hw_stats_wd_timeout_tlv *dp_stats_buf =
712*5113495bSYour Name 		(htt_hw_stats_wd_timeout_tlv *)tag_buf;
713*5113495bSYour Name 	uint8_t i;
714*5113495bSYour Name 	uint16_t index = 0;
715*5113495bSYour Name 	char *hw_module_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
716*5113495bSYour Name 
717*5113495bSYour Name 	if (!hw_module_name) {
718*5113495bSYour Name 		dp_stats_err("Output buffer not allocated");
719*5113495bSYour Name 		return;
720*5113495bSYour Name 	}
721*5113495bSYour Name 
722*5113495bSYour Name 	DP_PRINT_STATS("HTT_HW_STATS_WD_TIMEOUT_TLV:");
723*5113495bSYour Name 	for (i = 0; i <  DP_HTT_HW_MODULE_NAME_LEN; i++) {
724*5113495bSYour Name 		index += qdf_snprint(&hw_module_name[index],
725*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
726*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->hw_module_name[i]);
727*5113495bSYour Name 	}
728*5113495bSYour Name 	DP_PRINT_STATS("hw_module_name = %s ", hw_module_name);
729*5113495bSYour Name 	DP_PRINT_STATS("count = %u",
730*5113495bSYour Name 		       dp_stats_buf->count);
731*5113495bSYour Name 	qdf_mem_free(hw_module_name);
732*5113495bSYour Name }
733*5113495bSYour Name 
734*5113495bSYour Name /**
735*5113495bSYour Name  * dp_print_hw_stats_pdev_errs_tlv() - display htt_hw_stats_pdev_errs_tlv
736*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_hw_stats_pdev_errs_tlv
737*5113495bSYour Name  *
738*5113495bSYour Name  * Return: void
739*5113495bSYour Name  */
dp_print_hw_stats_pdev_errs_tlv(uint32_t * tag_buf)740*5113495bSYour Name static void dp_print_hw_stats_pdev_errs_tlv(uint32_t *tag_buf)
741*5113495bSYour Name {
742*5113495bSYour Name 	htt_hw_stats_pdev_errs_tlv *dp_stats_buf =
743*5113495bSYour Name 		(htt_hw_stats_pdev_errs_tlv *)tag_buf;
744*5113495bSYour Name 
745*5113495bSYour Name 	DP_PRINT_STATS("HTT_HW_STATS_PDEV_ERRS_TLV:");
746*5113495bSYour Name 	DP_PRINT_STATS("mac_id__word = %u",
747*5113495bSYour Name 		       dp_stats_buf->mac_id__word);
748*5113495bSYour Name 	DP_PRINT_STATS("tx_abort = %u",
749*5113495bSYour Name 		       dp_stats_buf->tx_abort);
750*5113495bSYour Name 	DP_PRINT_STATS("tx_abort_fail_count = %u",
751*5113495bSYour Name 		       dp_stats_buf->tx_abort_fail_count);
752*5113495bSYour Name 	DP_PRINT_STATS("rx_abort = %u",
753*5113495bSYour Name 		       dp_stats_buf->rx_abort);
754*5113495bSYour Name 	DP_PRINT_STATS("rx_abort_fail_count = %u",
755*5113495bSYour Name 		       dp_stats_buf->rx_abort_fail_count);
756*5113495bSYour Name 	DP_PRINT_STATS("warm_reset = %u",
757*5113495bSYour Name 		       dp_stats_buf->warm_reset);
758*5113495bSYour Name 	DP_PRINT_STATS("cold_reset = %u",
759*5113495bSYour Name 		       dp_stats_buf->cold_reset);
760*5113495bSYour Name 	DP_PRINT_STATS("tx_flush = %u",
761*5113495bSYour Name 		       dp_stats_buf->tx_flush);
762*5113495bSYour Name 	DP_PRINT_STATS("tx_glb_reset = %u",
763*5113495bSYour Name 		       dp_stats_buf->tx_glb_reset);
764*5113495bSYour Name 	DP_PRINT_STATS("tx_txq_reset = %u",
765*5113495bSYour Name 		       dp_stats_buf->tx_txq_reset);
766*5113495bSYour Name 	DP_PRINT_STATS("rx_timeout_reset = %u\n",
767*5113495bSYour Name 		       dp_stats_buf->rx_timeout_reset);
768*5113495bSYour Name }
769*5113495bSYour Name 
770*5113495bSYour Name /**
771*5113495bSYour Name  * dp_print_msdu_flow_stats_tlv() - display htt_msdu_flow_stats_tlv
772*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_msdu_flow_stats_tlv
773*5113495bSYour Name  *
774*5113495bSYour Name  * Return: void
775*5113495bSYour Name  */
dp_print_msdu_flow_stats_tlv(uint32_t * tag_buf)776*5113495bSYour Name static void dp_print_msdu_flow_stats_tlv(uint32_t *tag_buf)
777*5113495bSYour Name {
778*5113495bSYour Name 	htt_msdu_flow_stats_tlv *dp_stats_buf =
779*5113495bSYour Name 		(htt_msdu_flow_stats_tlv *)tag_buf;
780*5113495bSYour Name 
781*5113495bSYour Name 	DP_PRINT_STATS("HTT_MSDU_FLOW_STATS_TLV:");
782*5113495bSYour Name 	DP_PRINT_STATS("last_update_timestamp = %u",
783*5113495bSYour Name 		       dp_stats_buf->last_update_timestamp);
784*5113495bSYour Name 	DP_PRINT_STATS("last_add_timestamp = %u",
785*5113495bSYour Name 		       dp_stats_buf->last_add_timestamp);
786*5113495bSYour Name 	DP_PRINT_STATS("last_remove_timestamp = %u",
787*5113495bSYour Name 		       dp_stats_buf->last_remove_timestamp);
788*5113495bSYour Name 	DP_PRINT_STATS("total_processed_msdu_count = %u",
789*5113495bSYour Name 		       dp_stats_buf->total_processed_msdu_count);
790*5113495bSYour Name 	DP_PRINT_STATS("cur_msdu_count_in_flowq = %u",
791*5113495bSYour Name 		       dp_stats_buf->cur_msdu_count_in_flowq);
792*5113495bSYour Name 	DP_PRINT_STATS("sw_peer_id = %u",
793*5113495bSYour Name 		       dp_stats_buf->sw_peer_id);
794*5113495bSYour Name 	DP_PRINT_STATS("tx_flow_no__tid_num__drop_rule = %u\n",
795*5113495bSYour Name 		       dp_stats_buf->tx_flow_no__tid_num__drop_rule);
796*5113495bSYour Name }
797*5113495bSYour Name 
798*5113495bSYour Name /**
799*5113495bSYour Name  * dp_print_tx_tid_stats_tlv() - display htt_tx_tid_stats_tlv
800*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_tid_stats_tlv
801*5113495bSYour Name  *
802*5113495bSYour Name  * Return: void
803*5113495bSYour Name  */
dp_print_tx_tid_stats_tlv(uint32_t * tag_buf)804*5113495bSYour Name static void dp_print_tx_tid_stats_tlv(uint32_t *tag_buf)
805*5113495bSYour Name {
806*5113495bSYour Name 	htt_tx_tid_stats_tlv *dp_stats_buf =
807*5113495bSYour Name 		(htt_tx_tid_stats_tlv *)tag_buf;
808*5113495bSYour Name 	uint8_t i;
809*5113495bSYour Name 	uint16_t index = 0;
810*5113495bSYour Name 	char *tid_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
811*5113495bSYour Name 
812*5113495bSYour Name 	if (!tid_name) {
813*5113495bSYour Name 		dp_stats_err("Output buffer not allocated");
814*5113495bSYour Name 		return;
815*5113495bSYour Name 	}
816*5113495bSYour Name 
817*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_TID_STATS_TLV:");
818*5113495bSYour Name 	for (i = 0; i <  DP_HTT_TID_NAME_LEN; i++) {
819*5113495bSYour Name 		index += qdf_snprint(&tid_name[index],
820*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
821*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->tid_name[i]);
822*5113495bSYour Name 	}
823*5113495bSYour Name 	DP_PRINT_STATS("tid_name = %s ", tid_name);
824*5113495bSYour Name 	DP_PRINT_STATS("sw_peer_id__tid_num = %u",
825*5113495bSYour Name 		       dp_stats_buf->sw_peer_id__tid_num);
826*5113495bSYour Name 	DP_PRINT_STATS("num_sched_pending__num_ppdu_in_hwq = %u",
827*5113495bSYour Name 		       dp_stats_buf->num_sched_pending__num_ppdu_in_hwq);
828*5113495bSYour Name 	DP_PRINT_STATS("tid_flags = %u",
829*5113495bSYour Name 		       dp_stats_buf->tid_flags);
830*5113495bSYour Name 	DP_PRINT_STATS("hw_queued = %u",
831*5113495bSYour Name 		       dp_stats_buf->hw_queued);
832*5113495bSYour Name 	DP_PRINT_STATS("hw_reaped = %u",
833*5113495bSYour Name 		       dp_stats_buf->hw_reaped);
834*5113495bSYour Name 	DP_PRINT_STATS("mpdus_hw_filter = %u",
835*5113495bSYour Name 		       dp_stats_buf->mpdus_hw_filter);
836*5113495bSYour Name 	DP_PRINT_STATS("qdepth_bytes = %u",
837*5113495bSYour Name 		       dp_stats_buf->qdepth_bytes);
838*5113495bSYour Name 	DP_PRINT_STATS("qdepth_num_msdu = %u",
839*5113495bSYour Name 		       dp_stats_buf->qdepth_num_msdu);
840*5113495bSYour Name 	DP_PRINT_STATS("qdepth_num_mpdu = %u",
841*5113495bSYour Name 		       dp_stats_buf->qdepth_num_mpdu);
842*5113495bSYour Name 	DP_PRINT_STATS("last_scheduled_tsmp = %u",
843*5113495bSYour Name 		       dp_stats_buf->last_scheduled_tsmp);
844*5113495bSYour Name 	DP_PRINT_STATS("pause_module_id = %u",
845*5113495bSYour Name 		       dp_stats_buf->pause_module_id);
846*5113495bSYour Name 	DP_PRINT_STATS("block_module_id = %u\n",
847*5113495bSYour Name 		       dp_stats_buf->block_module_id);
848*5113495bSYour Name 	DP_PRINT_STATS("tid_tx_airtime = %u\n",
849*5113495bSYour Name 		       dp_stats_buf->tid_tx_airtime);
850*5113495bSYour Name 	qdf_mem_free(tid_name);
851*5113495bSYour Name }
852*5113495bSYour Name 
853*5113495bSYour Name /**
854*5113495bSYour Name  * dp_print_tx_tid_stats_v1_tlv() - display htt_tx_tid_stats_v1_tlv
855*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_tid_stats_v1_tlv
856*5113495bSYour Name  *
857*5113495bSYour Name  * Return: void
858*5113495bSYour Name  */
dp_print_tx_tid_stats_v1_tlv(uint32_t * tag_buf)859*5113495bSYour Name static void dp_print_tx_tid_stats_v1_tlv(uint32_t *tag_buf)
860*5113495bSYour Name {
861*5113495bSYour Name 	htt_tx_tid_stats_v1_tlv *dp_stats_buf =
862*5113495bSYour Name 		(htt_tx_tid_stats_v1_tlv *)tag_buf;
863*5113495bSYour Name 	uint8_t i;
864*5113495bSYour Name 	uint16_t index = 0;
865*5113495bSYour Name 	char *tid_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
866*5113495bSYour Name 
867*5113495bSYour Name 	if (!tid_name) {
868*5113495bSYour Name 		dp_stats_err("Output buffer not allocated");
869*5113495bSYour Name 		return;
870*5113495bSYour Name 	}
871*5113495bSYour Name 
872*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_TID_STATS_V1_TLV:");
873*5113495bSYour Name 	for (i = 0; i <  DP_HTT_TID_NAME_LEN; i++) {
874*5113495bSYour Name 		index += qdf_snprint(&tid_name[index],
875*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
876*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->tid_name[i]);
877*5113495bSYour Name 	}
878*5113495bSYour Name 	DP_PRINT_STATS("tid_name = %s ", tid_name);
879*5113495bSYour Name 	DP_PRINT_STATS("sw_peer_id__tid_num = %u",
880*5113495bSYour Name 		       dp_stats_buf->sw_peer_id__tid_num);
881*5113495bSYour Name 	DP_PRINT_STATS("num_sched_pending__num_ppdu_in_hwq = %u",
882*5113495bSYour Name 		       dp_stats_buf->num_sched_pending__num_ppdu_in_hwq);
883*5113495bSYour Name 	DP_PRINT_STATS("tid_flags = %u",
884*5113495bSYour Name 		       dp_stats_buf->tid_flags);
885*5113495bSYour Name 	DP_PRINT_STATS("max_qdepth_bytes = %u",
886*5113495bSYour Name 		       dp_stats_buf->max_qdepth_bytes);
887*5113495bSYour Name 	DP_PRINT_STATS("max_qdepth_n_msdus = %u",
888*5113495bSYour Name 		       dp_stats_buf->max_qdepth_n_msdus);
889*5113495bSYour Name 	DP_PRINT_STATS("rsvd = %u",
890*5113495bSYour Name 		       dp_stats_buf->rsvd);
891*5113495bSYour Name 	DP_PRINT_STATS("qdepth_bytes = %u",
892*5113495bSYour Name 		       dp_stats_buf->qdepth_bytes);
893*5113495bSYour Name 	DP_PRINT_STATS("qdepth_num_msdu = %u",
894*5113495bSYour Name 		       dp_stats_buf->qdepth_num_msdu);
895*5113495bSYour Name 	DP_PRINT_STATS("qdepth_num_mpdu = %u",
896*5113495bSYour Name 		       dp_stats_buf->qdepth_num_mpdu);
897*5113495bSYour Name 	DP_PRINT_STATS("last_scheduled_tsmp = %u",
898*5113495bSYour Name 		       dp_stats_buf->last_scheduled_tsmp);
899*5113495bSYour Name 	DP_PRINT_STATS("pause_module_id = %u",
900*5113495bSYour Name 		       dp_stats_buf->pause_module_id);
901*5113495bSYour Name 	DP_PRINT_STATS("block_module_id = %u\n",
902*5113495bSYour Name 		       dp_stats_buf->block_module_id);
903*5113495bSYour Name 	DP_PRINT_STATS("tid_tx_airtime = %u\n",
904*5113495bSYour Name 		       dp_stats_buf->tid_tx_airtime);
905*5113495bSYour Name 	qdf_mem_free(tid_name);
906*5113495bSYour Name }
907*5113495bSYour Name 
908*5113495bSYour Name /**
909*5113495bSYour Name  * dp_print_rx_tid_stats_tlv() - display htt_rx_tid_stats_tlv
910*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_rx_tid_stats_tlv
911*5113495bSYour Name  *
912*5113495bSYour Name  * Return: void
913*5113495bSYour Name  */
dp_print_rx_tid_stats_tlv(uint32_t * tag_buf)914*5113495bSYour Name static void dp_print_rx_tid_stats_tlv(uint32_t *tag_buf)
915*5113495bSYour Name {
916*5113495bSYour Name 	htt_rx_tid_stats_tlv *dp_stats_buf =
917*5113495bSYour Name 		(htt_rx_tid_stats_tlv *)tag_buf;
918*5113495bSYour Name 	uint8_t i;
919*5113495bSYour Name 	uint16_t index = 0;
920*5113495bSYour Name 	char *tid_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
921*5113495bSYour Name 
922*5113495bSYour Name 	if (!tid_name) {
923*5113495bSYour Name 		dp_stats_err("Output buffer not allocated");
924*5113495bSYour Name 		return;
925*5113495bSYour Name 	}
926*5113495bSYour Name 
927*5113495bSYour Name 	DP_PRINT_STATS("HTT_RX_TID_STATS_TLV:");
928*5113495bSYour Name 	DP_PRINT_STATS("sw_peer_id__tid_num = %u",
929*5113495bSYour Name 		       dp_stats_buf->sw_peer_id__tid_num);
930*5113495bSYour Name 	for (i = 0; i <  DP_HTT_TID_NAME_LEN; i++) {
931*5113495bSYour Name 		index += qdf_snprint(&tid_name[index],
932*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
933*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->tid_name[i]);
934*5113495bSYour Name 	}
935*5113495bSYour Name 	DP_PRINT_STATS("tid_name = %s ", tid_name);
936*5113495bSYour Name 	DP_PRINT_STATS("dup_in_reorder = %u",
937*5113495bSYour Name 		       dp_stats_buf->dup_in_reorder);
938*5113495bSYour Name 	DP_PRINT_STATS("dup_past_outside_window = %u",
939*5113495bSYour Name 		       dp_stats_buf->dup_past_outside_window);
940*5113495bSYour Name 	DP_PRINT_STATS("dup_past_within_window = %u",
941*5113495bSYour Name 		       dp_stats_buf->dup_past_within_window);
942*5113495bSYour Name 	DP_PRINT_STATS("rxdesc_err_decrypt = %u\n",
943*5113495bSYour Name 		       dp_stats_buf->rxdesc_err_decrypt);
944*5113495bSYour Name 	qdf_mem_free(tid_name);
945*5113495bSYour Name }
946*5113495bSYour Name 
947*5113495bSYour Name /**
948*5113495bSYour Name  * dp_print_counter_tlv() - display htt_counter_tlv
949*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_counter_tlv
950*5113495bSYour Name  *
951*5113495bSYour Name  * Return: void
952*5113495bSYour Name  */
dp_print_counter_tlv(uint32_t * tag_buf)953*5113495bSYour Name static void dp_print_counter_tlv(uint32_t *tag_buf)
954*5113495bSYour Name {
955*5113495bSYour Name 	htt_counter_tlv *dp_stats_buf =
956*5113495bSYour Name 		(htt_counter_tlv *)tag_buf;
957*5113495bSYour Name 	uint8_t i;
958*5113495bSYour Name 	uint16_t index = 0;
959*5113495bSYour Name 	char *counter_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
960*5113495bSYour Name 
961*5113495bSYour Name 	if (!counter_name) {
962*5113495bSYour Name 		dp_stats_err("Output buffer not allocated");
963*5113495bSYour Name 		return;
964*5113495bSYour Name 	}
965*5113495bSYour Name 
966*5113495bSYour Name 	DP_PRINT_STATS("HTT_COUNTER_TLV:");
967*5113495bSYour Name 	for (i = 0; i <  DP_HTT_COUNTER_NAME_LEN; i++) {
968*5113495bSYour Name 		index += qdf_snprint(&counter_name[index],
969*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
970*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->counter_name[i]);
971*5113495bSYour Name 	}
972*5113495bSYour Name 	DP_PRINT_STATS("counter_name = %s ", counter_name);
973*5113495bSYour Name 	DP_PRINT_STATS("count = %u\n",
974*5113495bSYour Name 		       dp_stats_buf->count);
975*5113495bSYour Name 	qdf_mem_free(counter_name);
976*5113495bSYour Name }
977*5113495bSYour Name 
978*5113495bSYour Name /**
979*5113495bSYour Name  * dp_print_peer_stats_cmn_tlv() - display htt_peer_stats_cmn_tlv
980*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_peer_stats_cmn_tlv
981*5113495bSYour Name  *
982*5113495bSYour Name  * Return: void
983*5113495bSYour Name  */
dp_print_peer_stats_cmn_tlv(uint32_t * tag_buf)984*5113495bSYour Name static void dp_print_peer_stats_cmn_tlv(uint32_t *tag_buf)
985*5113495bSYour Name {
986*5113495bSYour Name 	htt_peer_stats_cmn_tlv *dp_stats_buf =
987*5113495bSYour Name 		(htt_peer_stats_cmn_tlv *)tag_buf;
988*5113495bSYour Name 
989*5113495bSYour Name 	DP_PRINT_STATS("HTT_PEER_STATS_CMN_TLV:");
990*5113495bSYour Name 	DP_PRINT_STATS("ppdu_cnt = %u",
991*5113495bSYour Name 		       dp_stats_buf->ppdu_cnt);
992*5113495bSYour Name 	DP_PRINT_STATS("mpdu_cnt = %u",
993*5113495bSYour Name 		       dp_stats_buf->mpdu_cnt);
994*5113495bSYour Name 	DP_PRINT_STATS("msdu_cnt = %u",
995*5113495bSYour Name 		       dp_stats_buf->msdu_cnt);
996*5113495bSYour Name 	DP_PRINT_STATS("pause_bitmap = %u",
997*5113495bSYour Name 		       dp_stats_buf->pause_bitmap);
998*5113495bSYour Name 	DP_PRINT_STATS("block_bitmap = %u",
999*5113495bSYour Name 		       dp_stats_buf->block_bitmap);
1000*5113495bSYour Name 	DP_PRINT_STATS("current_timestamp = %u\n",
1001*5113495bSYour Name 		       dp_stats_buf->current_timestamp);
1002*5113495bSYour Name 	DP_PRINT_STATS("inactive_time = %u",
1003*5113495bSYour Name 		       dp_stats_buf->inactive_time);
1004*5113495bSYour Name }
1005*5113495bSYour Name 
1006*5113495bSYour Name /**
1007*5113495bSYour Name  * dp_print_peer_details_tlv() - display htt_peer_details_tlv
1008*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_peer_details_tlv
1009*5113495bSYour Name  *
1010*5113495bSYour Name  * Return: void
1011*5113495bSYour Name  */
dp_print_peer_details_tlv(uint32_t * tag_buf)1012*5113495bSYour Name static void dp_print_peer_details_tlv(uint32_t *tag_buf)
1013*5113495bSYour Name {
1014*5113495bSYour Name 	htt_peer_details_tlv *dp_stats_buf =
1015*5113495bSYour Name 		(htt_peer_details_tlv *)tag_buf;
1016*5113495bSYour Name 
1017*5113495bSYour Name 	DP_PRINT_STATS("HTT_PEER_DETAILS_TLV:");
1018*5113495bSYour Name 	DP_PRINT_STATS("peer_type = %u",
1019*5113495bSYour Name 		       dp_stats_buf->peer_type);
1020*5113495bSYour Name 	DP_PRINT_STATS("sw_peer_id = %u",
1021*5113495bSYour Name 		       dp_stats_buf->sw_peer_id);
1022*5113495bSYour Name 	DP_PRINT_STATS("vdev_pdev_ast_idx = %u",
1023*5113495bSYour Name 		       dp_stats_buf->vdev_pdev_ast_idx);
1024*5113495bSYour Name 	DP_PRINT_STATS("mac_addr(upper 4 bytes) = %u",
1025*5113495bSYour Name 		       dp_stats_buf->mac_addr.mac_addr31to0);
1026*5113495bSYour Name 	DP_PRINT_STATS("mac_addr(lower 2 bytes) = %u",
1027*5113495bSYour Name 		       dp_stats_buf->mac_addr.mac_addr47to32);
1028*5113495bSYour Name 	DP_PRINT_STATS("peer_flags = %u",
1029*5113495bSYour Name 		       dp_stats_buf->peer_flags);
1030*5113495bSYour Name 	DP_PRINT_STATS("qpeer_flags = %u\n",
1031*5113495bSYour Name 		       dp_stats_buf->qpeer_flags);
1032*5113495bSYour Name }
1033*5113495bSYour Name 
1034*5113495bSYour Name /**
1035*5113495bSYour Name  * dp_print_tx_peer_rate_stats_tlv() - display htt_tx_peer_rate_stats_tlv
1036*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_peer_rate_stats_tlv
1037*5113495bSYour Name  *
1038*5113495bSYour Name  * Return: void
1039*5113495bSYour Name  */
dp_print_tx_peer_rate_stats_tlv(uint32_t * tag_buf)1040*5113495bSYour Name static void dp_print_tx_peer_rate_stats_tlv(uint32_t *tag_buf)
1041*5113495bSYour Name {
1042*5113495bSYour Name 	htt_tx_peer_rate_stats_tlv *dp_stats_buf =
1043*5113495bSYour Name 		(htt_tx_peer_rate_stats_tlv *)tag_buf;
1044*5113495bSYour Name 	uint8_t i, j;
1045*5113495bSYour Name 	uint16_t index = 0;
1046*5113495bSYour Name 	char *tx_gi[HTT_TX_PEER_STATS_NUM_GI_COUNTERS] = {0};
1047*5113495bSYour Name 	char *tx_gi_ext[HTT_TX_PEER_STATS_NUM_GI_COUNTERS] = {0};
1048*5113495bSYour Name 	char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
1049*5113495bSYour Name 
1050*5113495bSYour Name 	if (!str_buf) {
1051*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
1052*5113495bSYour Name 			  FL("Output buffer not allocated"));
1053*5113495bSYour Name 		return;
1054*5113495bSYour Name 	}
1055*5113495bSYour Name 
1056*5113495bSYour Name 	for (i = 0; i < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; i++) {
1057*5113495bSYour Name 		tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
1058*5113495bSYour Name 		tx_gi_ext[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
1059*5113495bSYour Name 		if (!tx_gi[i] || !tx_gi_ext[i]) {
1060*5113495bSYour Name 			dp_err("Unable to allocate buffer for tx_gi");
1061*5113495bSYour Name 			goto fail1;
1062*5113495bSYour Name 		}
1063*5113495bSYour Name 	}
1064*5113495bSYour Name 
1065*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_PEER_RATE_STATS_TLV:");
1066*5113495bSYour Name 	DP_PRINT_STATS("tx_ldpc = %u",
1067*5113495bSYour Name 		       dp_stats_buf->tx_ldpc);
1068*5113495bSYour Name 	DP_PRINT_STATS("rts_cnt = %u",
1069*5113495bSYour Name 		       dp_stats_buf->rts_cnt);
1070*5113495bSYour Name 	DP_PRINT_STATS("ack_rssi = %u",
1071*5113495bSYour Name 		       dp_stats_buf->ack_rssi);
1072*5113495bSYour Name 
1073*5113495bSYour Name 	index = 0;
1074*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1075*5113495bSYour Name 	for (i = 0; i <  DP_HTT_TX_MCS_LEN; i++) {
1076*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
1077*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
1078*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->tx_mcs[i]);
1079*5113495bSYour Name 	}
1080*5113495bSYour Name 	for (i = 0; i <  DP_HTT_TX_MCS_EXT_LEN; i++) {
1081*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
1082*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
1083*5113495bSYour Name 				" %u:%u,", i + DP_HTT_TX_MCS_LEN,
1084*5113495bSYour Name 				dp_stats_buf->tx_mcs_ext[i]);
1085*5113495bSYour Name 	}
1086*5113495bSYour Name 	DP_PRINT_STATS("tx_mcs = %s ", str_buf);
1087*5113495bSYour Name 
1088*5113495bSYour Name 	index = 0;
1089*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1090*5113495bSYour Name 	for (i = 0; i <  DP_HTT_TX_SU_MCS_LEN; i++) {
1091*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
1092*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
1093*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->tx_su_mcs[i]);
1094*5113495bSYour Name 	}
1095*5113495bSYour Name 	for (i = 0; i <  DP_HTT_TX_SU_MCS_EXT_LEN; i++) {
1096*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
1097*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
1098*5113495bSYour Name 				" %u:%u,", i + DP_HTT_TX_SU_MCS_LEN,
1099*5113495bSYour Name 				dp_stats_buf->tx_su_mcs_ext[i]);
1100*5113495bSYour Name 	}
1101*5113495bSYour Name 	DP_PRINT_STATS("tx_su_mcs = %s ", str_buf);
1102*5113495bSYour Name 
1103*5113495bSYour Name 
1104*5113495bSYour Name 	index = 0;
1105*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1106*5113495bSYour Name 	for (i = 0; i <  DP_HTT_TX_MU_MCS_LEN; i++) {
1107*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
1108*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
1109*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->tx_mu_mcs[i]);
1110*5113495bSYour Name 	}
1111*5113495bSYour Name 	for (i = 0; i <  DP_HTT_TX_MU_MCS_EXT_LEN; i++) {
1112*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
1113*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
1114*5113495bSYour Name 				" %u:%u,", i + DP_HTT_TX_MU_MCS_LEN,
1115*5113495bSYour Name 				dp_stats_buf->tx_mu_mcs_ext[i]);
1116*5113495bSYour Name 	}
1117*5113495bSYour Name 	DP_PRINT_STATS("tx_mu_mcs = %s ", str_buf);
1118*5113495bSYour Name 
1119*5113495bSYour Name 	index = 0;
1120*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1121*5113495bSYour Name 	for (i = 0; i <  DP_HTT_TX_NSS_LEN; i++) {
1122*5113495bSYour Name 		/* 0 stands for NSS 1, 1 stands for NSS 2, etc. */
1123*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
1124*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
1125*5113495bSYour Name 				" %u:%u,", (i + 1),
1126*5113495bSYour Name 				dp_stats_buf->tx_nss[i]);
1127*5113495bSYour Name 	}
1128*5113495bSYour Name 	DP_PRINT_STATS("tx_nss = %s ", str_buf);
1129*5113495bSYour Name 	index = 0;
1130*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1131*5113495bSYour Name 	for (i = 0; i <  DP_HTT_TX_BW_LEN; i++) {
1132*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
1133*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
1134*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->tx_bw[i]);
1135*5113495bSYour Name 	}
1136*5113495bSYour Name 	DP_PRINT_STATS("tx_bw = %s ", str_buf);
1137*5113495bSYour Name 
1138*5113495bSYour Name 	index = 0;
1139*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1140*5113495bSYour Name 	for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
1141*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
1142*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
1143*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->tx_stbc[i]);
1144*5113495bSYour Name 	}
1145*5113495bSYour Name 	for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) {
1146*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
1147*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
1148*5113495bSYour Name 				" %u:%u,", i +  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,
1149*5113495bSYour Name 				dp_stats_buf->tx_stbc_ext[i]);
1150*5113495bSYour Name 	}
1151*5113495bSYour Name 	DP_PRINT_STATS("tx_stbc = %s ", str_buf);
1152*5113495bSYour Name 
1153*5113495bSYour Name 
1154*5113495bSYour Name 	index = 0;
1155*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1156*5113495bSYour Name 
1157*5113495bSYour Name 	for (i = 0; i <  DP_HTT_TX_PREAM_LEN; i++) {
1158*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
1159*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
1160*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->tx_pream[i]);
1161*5113495bSYour Name 	}
1162*5113495bSYour Name 	DP_PRINT_STATS("tx_pream = %s ", str_buf);
1163*5113495bSYour Name 
1164*5113495bSYour Name 	for (j = 0; j < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; j++) {
1165*5113495bSYour Name 		index = 0;
1166*5113495bSYour Name 		for (i = 0; i <  HTT_TX_PEER_STATS_NUM_MCS_COUNTERS; i++) {
1167*5113495bSYour Name 			index += qdf_snprint(&tx_gi[j][index],
1168*5113495bSYour Name 					DP_MAX_STRING_LEN - index,
1169*5113495bSYour Name 					" %u:%u,", i,
1170*5113495bSYour Name 					dp_stats_buf->tx_gi[j][i]);
1171*5113495bSYour Name 		}
1172*5113495bSYour Name 		DP_PRINT_STATS("tx_gi[%u] = %s ", j, tx_gi[j]);
1173*5113495bSYour Name 	}
1174*5113495bSYour Name 
1175*5113495bSYour Name 	for (j = 0; j < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; j++) {
1176*5113495bSYour Name 		index = 0;
1177*5113495bSYour Name 		for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) {
1178*5113495bSYour Name 			index += qdf_snprint(&tx_gi_ext[j][index],
1179*5113495bSYour Name 					DP_MAX_STRING_LEN - index,
1180*5113495bSYour Name 					" %u:%u,", i,
1181*5113495bSYour Name 					dp_stats_buf->tx_gi_ext[j][i]);
1182*5113495bSYour Name 		}
1183*5113495bSYour Name 		DP_PRINT_STATS("tx_gi_ext[%u] = %s ", j, tx_gi_ext[j]);
1184*5113495bSYour Name 	}
1185*5113495bSYour Name 
1186*5113495bSYour Name 	index = 0;
1187*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1188*5113495bSYour Name 	for (i = 0; i <  DP_HTT_TX_DCM_LEN; i++) {
1189*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
1190*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
1191*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->tx_dcm[i]);
1192*5113495bSYour Name 	}
1193*5113495bSYour Name 	DP_PRINT_STATS("tx_dcm = %s\n", str_buf);
1194*5113495bSYour Name 
1195*5113495bSYour Name fail1:
1196*5113495bSYour Name 	for (i = 0; i < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; i++) {
1197*5113495bSYour Name 		if (tx_gi[i])
1198*5113495bSYour Name 			qdf_mem_free(tx_gi[i]);
1199*5113495bSYour Name 		if (tx_gi_ext[i])
1200*5113495bSYour Name 			qdf_mem_free(tx_gi_ext[i]);
1201*5113495bSYour Name 	}
1202*5113495bSYour Name 	qdf_mem_free(str_buf);
1203*5113495bSYour Name }
1204*5113495bSYour Name 
1205*5113495bSYour Name /**
1206*5113495bSYour Name  * dp_print_rx_peer_rate_stats_tlv() - display htt_rx_peer_rate_stats_tlv
1207*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_rx_peer_rate_stats_tlv
1208*5113495bSYour Name  *
1209*5113495bSYour Name  * Return: void
1210*5113495bSYour Name  */
dp_print_rx_peer_rate_stats_tlv(uint32_t * tag_buf)1211*5113495bSYour Name static void dp_print_rx_peer_rate_stats_tlv(uint32_t *tag_buf)
1212*5113495bSYour Name {
1213*5113495bSYour Name 	htt_rx_peer_rate_stats_tlv *dp_stats_buf =
1214*5113495bSYour Name 		(htt_rx_peer_rate_stats_tlv *)tag_buf;
1215*5113495bSYour Name 	uint8_t i, j;
1216*5113495bSYour Name 	uint16_t index = 0;
1217*5113495bSYour Name 	char *rssi_chain[DP_HTT_PEER_NUM_SS] = {0};
1218*5113495bSYour Name 	char *rx_gi[HTT_RX_PEER_STATS_NUM_GI_COUNTERS] = {0};
1219*5113495bSYour Name 	char *rx_gi_ext[HTT_RX_PEER_STATS_NUM_GI_COUNTERS] = {0};
1220*5113495bSYour Name 	char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
1221*5113495bSYour Name 
1222*5113495bSYour Name 	if (!str_buf) {
1223*5113495bSYour Name 		dp_stats_err("Output buffer not allocated");
1224*5113495bSYour Name 		return;
1225*5113495bSYour Name 	}
1226*5113495bSYour Name 
1227*5113495bSYour Name 	for (i = 0; i < DP_HTT_PEER_NUM_SS; i++) {
1228*5113495bSYour Name 		rssi_chain[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
1229*5113495bSYour Name 		if (!rssi_chain[i]) {
1230*5113495bSYour Name 			dp_err("Unable to allocate buffer for rssi_chain");
1231*5113495bSYour Name 			goto fail1;
1232*5113495bSYour Name 		}
1233*5113495bSYour Name 	}
1234*5113495bSYour Name 
1235*5113495bSYour Name 	for (i = 0; i < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; i++) {
1236*5113495bSYour Name 		rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
1237*5113495bSYour Name 		rx_gi_ext[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
1238*5113495bSYour Name 		if (!rx_gi[i] || !rx_gi_ext[i]) {
1239*5113495bSYour Name 			dp_err("Unable to allocate buffer for rx_gi");
1240*5113495bSYour Name 			goto fail1;
1241*5113495bSYour Name 		}
1242*5113495bSYour Name 	}
1243*5113495bSYour Name 
1244*5113495bSYour Name 	DP_PRINT_STATS("HTT_RX_PEER_RATE_STATS_TLV:");
1245*5113495bSYour Name 	DP_PRINT_STATS("nsts = %u",
1246*5113495bSYour Name 		       dp_stats_buf->nsts);
1247*5113495bSYour Name 	DP_PRINT_STATS("rx_ldpc = %u",
1248*5113495bSYour Name 		       dp_stats_buf->rx_ldpc);
1249*5113495bSYour Name 	DP_PRINT_STATS("rts_cnt = %u",
1250*5113495bSYour Name 		       dp_stats_buf->rts_cnt);
1251*5113495bSYour Name 	DP_PRINT_STATS("rssi_mgmt = %u",
1252*5113495bSYour Name 		       dp_stats_buf->rssi_mgmt);
1253*5113495bSYour Name 	DP_PRINT_STATS("rssi_data = %u",
1254*5113495bSYour Name 		       dp_stats_buf->rssi_data);
1255*5113495bSYour Name 	DP_PRINT_STATS("rssi_comb = %u",
1256*5113495bSYour Name 		       dp_stats_buf->rssi_comb);
1257*5113495bSYour Name 
1258*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1259*5113495bSYour Name 	for (i = 0; i <  DP_HTT_RX_MCS_LEN; i++) {
1260*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
1261*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
1262*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->rx_mcs[i]);
1263*5113495bSYour Name 	}
1264*5113495bSYour Name 	for (i = 0; i <  DP_HTT_RX_MCS_EXT_LEN; i++) {
1265*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
1266*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
1267*5113495bSYour Name 				" %u:%u,", i + DP_HTT_RX_MCS_LEN,
1268*5113495bSYour Name 				dp_stats_buf->rx_mcs_ext[i]);
1269*5113495bSYour Name 	}
1270*5113495bSYour Name 	DP_PRINT_STATS("rx_mcs = %s ", str_buf);
1271*5113495bSYour Name 
1272*5113495bSYour Name 	index = 0;
1273*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1274*5113495bSYour Name 	for (i = 0; i <  DP_HTT_RX_NSS_LEN; i++) {
1275*5113495bSYour Name 		/* 0 stands for NSS 1, 1 stands for NSS 2, etc. */
1276*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
1277*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
1278*5113495bSYour Name 				" %u:%u,", (i + 1),
1279*5113495bSYour Name 				dp_stats_buf->rx_nss[i]);
1280*5113495bSYour Name 	}
1281*5113495bSYour Name 	DP_PRINT_STATS("rx_nss = %s ", str_buf);
1282*5113495bSYour Name 
1283*5113495bSYour Name 	index = 0;
1284*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1285*5113495bSYour Name 	for (i = 0; i <  DP_HTT_RX_DCM_LEN; i++) {
1286*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
1287*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
1288*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->rx_dcm[i]);
1289*5113495bSYour Name 	}
1290*5113495bSYour Name 	DP_PRINT_STATS("rx_dcm = %s ", str_buf);
1291*5113495bSYour Name 
1292*5113495bSYour Name 	index = 0;
1293*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1294*5113495bSYour Name 	for (i = 0; i <  HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
1295*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
1296*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
1297*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->rx_stbc[i]);
1298*5113495bSYour Name 	}
1299*5113495bSYour Name 	for (i = 0; i <  HTT_RX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) {
1300*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
1301*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
1302*5113495bSYour Name 				" %u:%u,", i + HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS,
1303*5113495bSYour Name 				dp_stats_buf->rx_stbc_ext[i]);
1304*5113495bSYour Name 	}
1305*5113495bSYour Name 	DP_PRINT_STATS("rx_stbc = %s ", str_buf);
1306*5113495bSYour Name 
1307*5113495bSYour Name 	index = 0;
1308*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1309*5113495bSYour Name 	for (i = 0; i <  DP_HTT_RX_BW_LEN; i++) {
1310*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
1311*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
1312*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->rx_bw[i]);
1313*5113495bSYour Name 	}
1314*5113495bSYour Name 	DP_PRINT_STATS("rx_bw = %s ", str_buf);
1315*5113495bSYour Name 
1316*5113495bSYour Name 	for (j = 0; j < DP_HTT_PEER_NUM_SS; j++) {
1317*5113495bSYour Name 		qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1318*5113495bSYour Name 		index = 0;
1319*5113495bSYour Name 		for (i = 0; i <  HTT_RX_PEER_STATS_NUM_BW_COUNTERS; i++) {
1320*5113495bSYour Name 			index += qdf_snprint(&rssi_chain[j][index],
1321*5113495bSYour Name 					DP_MAX_STRING_LEN - index,
1322*5113495bSYour Name 					" %u:%u,", i,
1323*5113495bSYour Name 					dp_stats_buf->rssi_chain[j][i]);
1324*5113495bSYour Name 		}
1325*5113495bSYour Name 		DP_PRINT_STATS("rssi_chain[%u] = %s ", j, rssi_chain[j]);
1326*5113495bSYour Name 	}
1327*5113495bSYour Name 
1328*5113495bSYour Name 	for (j = 0; j < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; j++) {
1329*5113495bSYour Name 		index = 0;
1330*5113495bSYour Name 		for (i = 0; i <  HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
1331*5113495bSYour Name 			index += qdf_snprint(&rx_gi[j][index],
1332*5113495bSYour Name 					DP_MAX_STRING_LEN - index,
1333*5113495bSYour Name 					" %u:%u,", i,
1334*5113495bSYour Name 					dp_stats_buf->rx_gi[j][i]);
1335*5113495bSYour Name 		}
1336*5113495bSYour Name 		DP_PRINT_STATS("rx_gi[%u] = %s ", j, rx_gi[j]);
1337*5113495bSYour Name 	}
1338*5113495bSYour Name 
1339*5113495bSYour Name 	for (j = 0; j < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; j++) {
1340*5113495bSYour Name 		index = 0;
1341*5113495bSYour Name 		for (i = 0; i <  HTT_RX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) {
1342*5113495bSYour Name 			index += qdf_snprint(&rx_gi_ext[j][index],
1343*5113495bSYour Name 					DP_MAX_STRING_LEN - index,
1344*5113495bSYour Name 					" %u:%u,", i,
1345*5113495bSYour Name 					dp_stats_buf->rx_gi_ext[j][i]);
1346*5113495bSYour Name 		}
1347*5113495bSYour Name 		DP_PRINT_STATS("rx_gi_ext[%u] = %s ", j, rx_gi_ext[j]);
1348*5113495bSYour Name 	}
1349*5113495bSYour Name 
1350*5113495bSYour Name 	index = 0;
1351*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
1352*5113495bSYour Name 	for (i = 0; i <  DP_HTT_RX_PREAM_LEN; i++) {
1353*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
1354*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
1355*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->rx_pream[i]);
1356*5113495bSYour Name 	}
1357*5113495bSYour Name 	DP_PRINT_STATS("rx_pream = %s\n", str_buf);
1358*5113495bSYour Name 
1359*5113495bSYour Name fail1:
1360*5113495bSYour Name 	for (i = 0; i < DP_HTT_PEER_NUM_SS; i++) {
1361*5113495bSYour Name 		if (!rssi_chain[i])
1362*5113495bSYour Name 			break;
1363*5113495bSYour Name 		qdf_mem_free(rssi_chain[i]);
1364*5113495bSYour Name 	}
1365*5113495bSYour Name 
1366*5113495bSYour Name 	for (i = 0; i < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; i++) {
1367*5113495bSYour Name 		if (rx_gi[i])
1368*5113495bSYour Name 			qdf_mem_free(rx_gi[i]);
1369*5113495bSYour Name 		if (rx_gi_ext[i])
1370*5113495bSYour Name 			qdf_mem_free(rx_gi_ext[i]);
1371*5113495bSYour Name 	}
1372*5113495bSYour Name 	qdf_mem_free(str_buf);
1373*5113495bSYour Name }
1374*5113495bSYour Name 
1375*5113495bSYour Name /**
1376*5113495bSYour Name  * dp_print_tx_hwq_mu_mimo_sch_stats_tlv() - display htt_tx_hwq_mu_mimo_sch_stats
1377*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_hwq_mu_mimo_sch_stats_tlv
1378*5113495bSYour Name  *
1379*5113495bSYour Name  * Return: void
1380*5113495bSYour Name  */
dp_print_tx_hwq_mu_mimo_sch_stats_tlv(uint32_t * tag_buf)1381*5113495bSYour Name static void dp_print_tx_hwq_mu_mimo_sch_stats_tlv(uint32_t *tag_buf)
1382*5113495bSYour Name {
1383*5113495bSYour Name 	htt_tx_hwq_mu_mimo_sch_stats_tlv *dp_stats_buf =
1384*5113495bSYour Name 		(htt_tx_hwq_mu_mimo_sch_stats_tlv *)tag_buf;
1385*5113495bSYour Name 
1386*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_HWQ_MU_MIMO_SCH_STATS_TLV:");
1387*5113495bSYour Name 	DP_PRINT_STATS("mu_mimo_sch_posted = %u",
1388*5113495bSYour Name 		       dp_stats_buf->mu_mimo_sch_posted);
1389*5113495bSYour Name 	DP_PRINT_STATS("mu_mimo_sch_failed = %u",
1390*5113495bSYour Name 		       dp_stats_buf->mu_mimo_sch_failed);
1391*5113495bSYour Name 	DP_PRINT_STATS("mu_mimo_ppdu_posted = %u\n",
1392*5113495bSYour Name 		       dp_stats_buf->mu_mimo_ppdu_posted);
1393*5113495bSYour Name }
1394*5113495bSYour Name 
1395*5113495bSYour Name /**
1396*5113495bSYour Name  * dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv() - display htt_tx_hwq_mu_mimo_mpdu_stats
1397*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_hwq_mu_mimo_mpdu_stats_tlv
1398*5113495bSYour Name  *
1399*5113495bSYour Name  * Return: void
1400*5113495bSYour Name  */
dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv(uint32_t * tag_buf)1401*5113495bSYour Name static void dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv(uint32_t *tag_buf)
1402*5113495bSYour Name {
1403*5113495bSYour Name 	htt_tx_hwq_mu_mimo_mpdu_stats_tlv *dp_stats_buf =
1404*5113495bSYour Name 		(htt_tx_hwq_mu_mimo_mpdu_stats_tlv *)tag_buf;
1405*5113495bSYour Name 
1406*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_HWQ_MU_MIMO_MPDU_STATS_TLV:");
1407*5113495bSYour Name 	DP_PRINT_STATS("mu_mimo_mpdus_queued_usr = %u",
1408*5113495bSYour Name 		       dp_stats_buf->mu_mimo_mpdus_queued_usr);
1409*5113495bSYour Name 	DP_PRINT_STATS("mu_mimo_mpdus_tried_usr = %u",
1410*5113495bSYour Name 		       dp_stats_buf->mu_mimo_mpdus_tried_usr);
1411*5113495bSYour Name 	DP_PRINT_STATS("mu_mimo_mpdus_failed_usr = %u",
1412*5113495bSYour Name 		       dp_stats_buf->mu_mimo_mpdus_failed_usr);
1413*5113495bSYour Name 	DP_PRINT_STATS("mu_mimo_mpdus_requeued_usr = %u",
1414*5113495bSYour Name 		       dp_stats_buf->mu_mimo_mpdus_requeued_usr);
1415*5113495bSYour Name 	DP_PRINT_STATS("mu_mimo_err_no_ba_usr = %u",
1416*5113495bSYour Name 		       dp_stats_buf->mu_mimo_err_no_ba_usr);
1417*5113495bSYour Name 	DP_PRINT_STATS("mu_mimo_mpdu_underrun_usr = %u",
1418*5113495bSYour Name 		       dp_stats_buf->mu_mimo_mpdu_underrun_usr);
1419*5113495bSYour Name 	DP_PRINT_STATS("mu_mimo_ampdu_underrun_usr = %u\n",
1420*5113495bSYour Name 		       dp_stats_buf->mu_mimo_ampdu_underrun_usr);
1421*5113495bSYour Name }
1422*5113495bSYour Name 
1423*5113495bSYour Name /**
1424*5113495bSYour Name  * dp_print_tx_hwq_mu_mimo_cmn_stats_tlv() - display htt_tx_hwq_mu_mimo_cmn_stats
1425*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_hwq_mu_mimo_cmn_stats_tlv
1426*5113495bSYour Name  *
1427*5113495bSYour Name  * Return: void
1428*5113495bSYour Name  */
dp_print_tx_hwq_mu_mimo_cmn_stats_tlv(uint32_t * tag_buf)1429*5113495bSYour Name static inline void dp_print_tx_hwq_mu_mimo_cmn_stats_tlv(uint32_t *tag_buf)
1430*5113495bSYour Name {
1431*5113495bSYour Name 	htt_tx_hwq_mu_mimo_cmn_stats_tlv *dp_stats_buf =
1432*5113495bSYour Name 		(htt_tx_hwq_mu_mimo_cmn_stats_tlv *)tag_buf;
1433*5113495bSYour Name 
1434*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_HWQ_MU_MIMO_CMN_STATS_TLV:");
1435*5113495bSYour Name 	DP_PRINT_STATS("mac_id__hwq_id__word = %u\n",
1436*5113495bSYour Name 		       dp_stats_buf->mac_id__hwq_id__word);
1437*5113495bSYour Name }
1438*5113495bSYour Name 
1439*5113495bSYour Name /**
1440*5113495bSYour Name  * dp_print_tx_hwq_stats_cmn_tlv() - display htt_tx_hwq_stats_cmn_tlv
1441*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_hwq_stats_cmn_tlv
1442*5113495bSYour Name  *
1443*5113495bSYour Name  * Return: void
1444*5113495bSYour Name  */
dp_print_tx_hwq_stats_cmn_tlv(uint32_t * tag_buf)1445*5113495bSYour Name static void dp_print_tx_hwq_stats_cmn_tlv(uint32_t *tag_buf)
1446*5113495bSYour Name {
1447*5113495bSYour Name 	htt_tx_hwq_stats_cmn_tlv *dp_stats_buf =
1448*5113495bSYour Name 		(htt_tx_hwq_stats_cmn_tlv *)tag_buf;
1449*5113495bSYour Name 
1450*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_HWQ_STATS_CMN_TLV:");
1451*5113495bSYour Name 	DP_PRINT_STATS("mac_id__hwq_id__word = %u",
1452*5113495bSYour Name 		       dp_stats_buf->mac_id__hwq_id__word);
1453*5113495bSYour Name 	DP_PRINT_STATS("xretry = %u",
1454*5113495bSYour Name 		       dp_stats_buf->xretry);
1455*5113495bSYour Name 	DP_PRINT_STATS("underrun_cnt = %u",
1456*5113495bSYour Name 		       dp_stats_buf->underrun_cnt);
1457*5113495bSYour Name 	DP_PRINT_STATS("flush_cnt = %u",
1458*5113495bSYour Name 		       dp_stats_buf->flush_cnt);
1459*5113495bSYour Name 	DP_PRINT_STATS("filt_cnt = %u",
1460*5113495bSYour Name 		       dp_stats_buf->filt_cnt);
1461*5113495bSYour Name 	DP_PRINT_STATS("null_mpdu_bmap = %u",
1462*5113495bSYour Name 		       dp_stats_buf->null_mpdu_bmap);
1463*5113495bSYour Name 	DP_PRINT_STATS("user_ack_failure = %u",
1464*5113495bSYour Name 		       dp_stats_buf->user_ack_failure);
1465*5113495bSYour Name 	DP_PRINT_STATS("ack_tlv_proc = %u",
1466*5113495bSYour Name 		       dp_stats_buf->ack_tlv_proc);
1467*5113495bSYour Name 	DP_PRINT_STATS("sched_id_proc = %u",
1468*5113495bSYour Name 		       dp_stats_buf->sched_id_proc);
1469*5113495bSYour Name 	DP_PRINT_STATS("null_mpdu_tx_count = %u",
1470*5113495bSYour Name 		       dp_stats_buf->null_mpdu_tx_count);
1471*5113495bSYour Name 	DP_PRINT_STATS("mpdu_bmap_not_recvd = %u",
1472*5113495bSYour Name 		       dp_stats_buf->mpdu_bmap_not_recvd);
1473*5113495bSYour Name 	DP_PRINT_STATS("num_bar = %u",
1474*5113495bSYour Name 		       dp_stats_buf->num_bar);
1475*5113495bSYour Name 	DP_PRINT_STATS("rts = %u",
1476*5113495bSYour Name 		       dp_stats_buf->rts);
1477*5113495bSYour Name 	DP_PRINT_STATS("cts2self = %u",
1478*5113495bSYour Name 		       dp_stats_buf->cts2self);
1479*5113495bSYour Name 	DP_PRINT_STATS("qos_null = %u",
1480*5113495bSYour Name 		       dp_stats_buf->qos_null);
1481*5113495bSYour Name 	DP_PRINT_STATS("mpdu_tried_cnt = %u",
1482*5113495bSYour Name 		       dp_stats_buf->mpdu_tried_cnt);
1483*5113495bSYour Name 	DP_PRINT_STATS("mpdu_queued_cnt = %u",
1484*5113495bSYour Name 		       dp_stats_buf->mpdu_queued_cnt);
1485*5113495bSYour Name 	DP_PRINT_STATS("mpdu_ack_fail_cnt = %u",
1486*5113495bSYour Name 		       dp_stats_buf->mpdu_ack_fail_cnt);
1487*5113495bSYour Name 	DP_PRINT_STATS("mpdu_filt_cnt = %u",
1488*5113495bSYour Name 		       dp_stats_buf->mpdu_filt_cnt);
1489*5113495bSYour Name 	DP_PRINT_STATS("false_mpdu_ack_count = %u\n",
1490*5113495bSYour Name 		       dp_stats_buf->false_mpdu_ack_count);
1491*5113495bSYour Name }
1492*5113495bSYour Name 
1493*5113495bSYour Name /**
1494*5113495bSYour Name  * dp_print_tx_hwq_difs_latency_stats_tlv_v() -
1495*5113495bSYour Name  *			display htt_tx_hwq_difs_latency_stats_tlv_v
1496*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_hwq_difs_latency_stats_tlv_v
1497*5113495bSYour Name  *
1498*5113495bSYour Name  * Return: void
1499*5113495bSYour Name  */
dp_print_tx_hwq_difs_latency_stats_tlv_v(uint32_t * tag_buf)1500*5113495bSYour Name static void dp_print_tx_hwq_difs_latency_stats_tlv_v(uint32_t *tag_buf)
1501*5113495bSYour Name {
1502*5113495bSYour Name 	htt_tx_hwq_difs_latency_stats_tlv_v *dp_stats_buf =
1503*5113495bSYour Name 		(htt_tx_hwq_difs_latency_stats_tlv_v *)tag_buf;
1504*5113495bSYour Name 	uint8_t i;
1505*5113495bSYour Name 	uint16_t index = 0;
1506*5113495bSYour Name 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
1507*5113495bSYour Name 	char *difs_latency_hist = qdf_mem_malloc(DP_MAX_STRING_LEN);
1508*5113495bSYour Name 
1509*5113495bSYour Name 	if (!difs_latency_hist) {
1510*5113495bSYour Name 		dp_stats_err("Output buffer not allocated");
1511*5113495bSYour Name 		return;
1512*5113495bSYour Name 	}
1513*5113495bSYour Name 
1514*5113495bSYour Name 	tag_len = qdf_min(tag_len,
1515*5113495bSYour Name 			(uint32_t)HTT_TX_HWQ_MAX_DIFS_LATENCY_BINS);
1516*5113495bSYour Name 
1517*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_HWQ_DIFS_LATENCY_STATS_TLV_V:");
1518*5113495bSYour Name 	DP_PRINT_STATS("hist_intvl = %u",
1519*5113495bSYour Name 		       dp_stats_buf->hist_intvl);
1520*5113495bSYour Name 
1521*5113495bSYour Name 	for (i = 0; i <  tag_len; i++) {
1522*5113495bSYour Name 		index += qdf_snprint(&difs_latency_hist[index],
1523*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
1524*5113495bSYour Name 				" %u:%u,", i,
1525*5113495bSYour Name 				dp_stats_buf->difs_latency_hist[i]);
1526*5113495bSYour Name 	}
1527*5113495bSYour Name 	DP_PRINT_STATS("difs_latency_hist = %s\n", difs_latency_hist);
1528*5113495bSYour Name 	qdf_mem_free(difs_latency_hist);
1529*5113495bSYour Name }
1530*5113495bSYour Name 
1531*5113495bSYour Name /**
1532*5113495bSYour Name  * dp_print_tx_hwq_cmd_result_stats_tlv_v() - display htt_tx_hwq_cmd_result_stats
1533*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_hwq_cmd_result_stats_tlv_v
1534*5113495bSYour Name  *
1535*5113495bSYour Name  * Return: void
1536*5113495bSYour Name  */
dp_print_tx_hwq_cmd_result_stats_tlv_v(uint32_t * tag_buf)1537*5113495bSYour Name static void dp_print_tx_hwq_cmd_result_stats_tlv_v(uint32_t *tag_buf)
1538*5113495bSYour Name {
1539*5113495bSYour Name 	htt_tx_hwq_cmd_result_stats_tlv_v *dp_stats_buf =
1540*5113495bSYour Name 		(htt_tx_hwq_cmd_result_stats_tlv_v *)tag_buf;
1541*5113495bSYour Name 	uint8_t i;
1542*5113495bSYour Name 	uint16_t index = 0;
1543*5113495bSYour Name 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
1544*5113495bSYour Name 	char *cmd_result = qdf_mem_malloc(DP_MAX_STRING_LEN);
1545*5113495bSYour Name 
1546*5113495bSYour Name 	if (!cmd_result) {
1547*5113495bSYour Name 		dp_stats_err("Output buffer not allocated");
1548*5113495bSYour Name 		return;
1549*5113495bSYour Name 	}
1550*5113495bSYour Name 
1551*5113495bSYour Name 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_HWQ_MAX_CMD_RESULT_STATS);
1552*5113495bSYour Name 
1553*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_HWQ_CMD_RESULT_STATS_TLV_V:");
1554*5113495bSYour Name 	for (i = 0; i <  tag_len; i++) {
1555*5113495bSYour Name 		index += qdf_snprint(&cmd_result[index],
1556*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
1557*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->cmd_result[i]);
1558*5113495bSYour Name 	}
1559*5113495bSYour Name 	DP_PRINT_STATS("cmd_result = %s ", cmd_result);
1560*5113495bSYour Name 	qdf_mem_free(cmd_result);
1561*5113495bSYour Name }
1562*5113495bSYour Name 
1563*5113495bSYour Name /**
1564*5113495bSYour Name  * dp_print_tx_hwq_cmd_stall_stats_tlv_v() - display htt_tx_hwq_cmd_stall_stats_tlv
1565*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_hwq_cmd_stall_stats_tlv_v
1566*5113495bSYour Name  *
1567*5113495bSYour Name  * Return: void
1568*5113495bSYour Name  */
dp_print_tx_hwq_cmd_stall_stats_tlv_v(uint32_t * tag_buf)1569*5113495bSYour Name static void dp_print_tx_hwq_cmd_stall_stats_tlv_v(uint32_t *tag_buf)
1570*5113495bSYour Name {
1571*5113495bSYour Name 	htt_tx_hwq_cmd_stall_stats_tlv_v *dp_stats_buf =
1572*5113495bSYour Name 		(htt_tx_hwq_cmd_stall_stats_tlv_v *)tag_buf;
1573*5113495bSYour Name 	uint8_t i;
1574*5113495bSYour Name 	uint16_t index = 0;
1575*5113495bSYour Name 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
1576*5113495bSYour Name 	char *cmd_stall_status = qdf_mem_malloc(DP_MAX_STRING_LEN);
1577*5113495bSYour Name 
1578*5113495bSYour Name 	if (!cmd_stall_status) {
1579*5113495bSYour Name 		dp_stats_err("Output buffer not allocated");
1580*5113495bSYour Name 		return;
1581*5113495bSYour Name 	}
1582*5113495bSYour Name 
1583*5113495bSYour Name 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_HWQ_MAX_CMD_STALL_STATS);
1584*5113495bSYour Name 
1585*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_HWQ_CMD_STALL_STATS_TLV_V:");
1586*5113495bSYour Name 	for (i = 0; i <  tag_len; i++) {
1587*5113495bSYour Name 		index += qdf_snprint(&cmd_stall_status[index],
1588*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
1589*5113495bSYour Name 				" %u:%u,", i,
1590*5113495bSYour Name 				dp_stats_buf->cmd_stall_status[i]);
1591*5113495bSYour Name 	}
1592*5113495bSYour Name 	DP_PRINT_STATS("cmd_stall_status = %s\n", cmd_stall_status);
1593*5113495bSYour Name 	qdf_mem_free(cmd_stall_status);
1594*5113495bSYour Name }
1595*5113495bSYour Name 
1596*5113495bSYour Name /**
1597*5113495bSYour Name  * dp_print_tx_hwq_fes_result_stats_tlv_v() - display htt_tx_hwq_fes_result_stats
1598*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_hwq_fes_result_stats_tlv_v
1599*5113495bSYour Name  *
1600*5113495bSYour Name  * Return: void
1601*5113495bSYour Name  */
dp_print_tx_hwq_fes_result_stats_tlv_v(uint32_t * tag_buf)1602*5113495bSYour Name static void dp_print_tx_hwq_fes_result_stats_tlv_v(uint32_t *tag_buf)
1603*5113495bSYour Name {
1604*5113495bSYour Name 	htt_tx_hwq_fes_result_stats_tlv_v *dp_stats_buf =
1605*5113495bSYour Name 		(htt_tx_hwq_fes_result_stats_tlv_v *)tag_buf;
1606*5113495bSYour Name 	uint8_t i;
1607*5113495bSYour Name 	uint16_t index = 0;
1608*5113495bSYour Name 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
1609*5113495bSYour Name 	char *fes_result = qdf_mem_malloc(DP_MAX_STRING_LEN);
1610*5113495bSYour Name 
1611*5113495bSYour Name 	if (!fes_result) {
1612*5113495bSYour Name 		dp_stats_err("Output buffer not allocated");
1613*5113495bSYour Name 		return;
1614*5113495bSYour Name 	}
1615*5113495bSYour Name 
1616*5113495bSYour Name 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_HWQ_MAX_FES_RESULT_STATS);
1617*5113495bSYour Name 
1618*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_HWQ_FES_RESULT_STATS_TLV_V:");
1619*5113495bSYour Name 	for (i = 0; i <  tag_len; i++) {
1620*5113495bSYour Name 		index += qdf_snprint(&fes_result[index],
1621*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
1622*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->fes_result[i]);
1623*5113495bSYour Name 	}
1624*5113495bSYour Name 	DP_PRINT_STATS("fes_result = %s ", fes_result);
1625*5113495bSYour Name 	qdf_mem_free(fes_result);
1626*5113495bSYour Name }
1627*5113495bSYour Name 
1628*5113495bSYour Name /**
1629*5113495bSYour Name  * dp_print_tx_selfgen_cmn_stats_tlv() - display htt_tx_selfgen_cmn_stats_tlv
1630*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_selfgen_cmn_stats_tlv
1631*5113495bSYour Name  *
1632*5113495bSYour Name  * Return: void
1633*5113495bSYour Name  */
dp_print_tx_selfgen_cmn_stats_tlv(uint32_t * tag_buf)1634*5113495bSYour Name static void dp_print_tx_selfgen_cmn_stats_tlv(uint32_t *tag_buf)
1635*5113495bSYour Name {
1636*5113495bSYour Name 	htt_tx_selfgen_cmn_stats_tlv *dp_stats_buf =
1637*5113495bSYour Name 		(htt_tx_selfgen_cmn_stats_tlv *)tag_buf;
1638*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_SELFGEN_CMN_STATS_TLV:");
1639*5113495bSYour Name 	DP_PRINT_STATS("mac_id__word = %u",
1640*5113495bSYour Name 		       dp_stats_buf->mac_id__word);
1641*5113495bSYour Name 	DP_PRINT_STATS("su_bar = %u",
1642*5113495bSYour Name 		       dp_stats_buf->su_bar);
1643*5113495bSYour Name 	DP_PRINT_STATS("rts = %u",
1644*5113495bSYour Name 		       dp_stats_buf->rts);
1645*5113495bSYour Name 	DP_PRINT_STATS("cts2self = %u",
1646*5113495bSYour Name 		       dp_stats_buf->cts2self);
1647*5113495bSYour Name 	DP_PRINT_STATS("qos_null = %u",
1648*5113495bSYour Name 		       dp_stats_buf->qos_null);
1649*5113495bSYour Name 	DP_PRINT_STATS("delayed_bar_1 = %u",
1650*5113495bSYour Name 		       dp_stats_buf->delayed_bar_1);
1651*5113495bSYour Name 	DP_PRINT_STATS("delayed_bar_2 = %u",
1652*5113495bSYour Name 		       dp_stats_buf->delayed_bar_2);
1653*5113495bSYour Name 	DP_PRINT_STATS("delayed_bar_3 = %u",
1654*5113495bSYour Name 		       dp_stats_buf->delayed_bar_3);
1655*5113495bSYour Name 	DP_PRINT_STATS("delayed_bar_4 = %u",
1656*5113495bSYour Name 		       dp_stats_buf->delayed_bar_4);
1657*5113495bSYour Name 	DP_PRINT_STATS("delayed_bar_5 = %u",
1658*5113495bSYour Name 		       dp_stats_buf->delayed_bar_5);
1659*5113495bSYour Name 	DP_PRINT_STATS("delayed_bar_6 = %u",
1660*5113495bSYour Name 		       dp_stats_buf->delayed_bar_6);
1661*5113495bSYour Name 	DP_PRINT_STATS("delayed_bar_7 = %u\n",
1662*5113495bSYour Name 		       dp_stats_buf->delayed_bar_7);
1663*5113495bSYour Name }
1664*5113495bSYour Name 
1665*5113495bSYour Name /**
1666*5113495bSYour Name  * dp_print_tx_selfgen_ac_stats_tlv() - display htt_tx_selfgen_ac_stats_tlv
1667*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_selfgen_ac_stats_tlv
1668*5113495bSYour Name  *
1669*5113495bSYour Name  * Return: void
1670*5113495bSYour Name  */
dp_print_tx_selfgen_ac_stats_tlv(uint32_t * tag_buf)1671*5113495bSYour Name static void dp_print_tx_selfgen_ac_stats_tlv(uint32_t *tag_buf)
1672*5113495bSYour Name {
1673*5113495bSYour Name 	htt_tx_selfgen_ac_stats_tlv *dp_stats_buf =
1674*5113495bSYour Name 		(htt_tx_selfgen_ac_stats_tlv *)tag_buf;
1675*5113495bSYour Name 
1676*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_SELFGEN_AC_STATS_TLV:");
1677*5113495bSYour Name 	DP_PRINT_STATS("ac_su_ndpa = %u",
1678*5113495bSYour Name 		       dp_stats_buf->ac_su_ndpa);
1679*5113495bSYour Name 	DP_PRINT_STATS("ac_su_ndp = %u",
1680*5113495bSYour Name 		       dp_stats_buf->ac_su_ndp);
1681*5113495bSYour Name 	DP_PRINT_STATS("ac_mu_mimo_ndpa = %u",
1682*5113495bSYour Name 		       dp_stats_buf->ac_mu_mimo_ndpa);
1683*5113495bSYour Name 	DP_PRINT_STATS("ac_mu_mimo_ndp = %u",
1684*5113495bSYour Name 		       dp_stats_buf->ac_mu_mimo_ndp);
1685*5113495bSYour Name 	DP_PRINT_STATS("ac_mu_mimo_brpoll_1 = %u",
1686*5113495bSYour Name 		       dp_stats_buf->ac_mu_mimo_brpoll_1);
1687*5113495bSYour Name 	DP_PRINT_STATS("ac_mu_mimo_brpoll_2 = %u",
1688*5113495bSYour Name 		       dp_stats_buf->ac_mu_mimo_brpoll_2);
1689*5113495bSYour Name 	DP_PRINT_STATS("ac_mu_mimo_brpoll_3 = %u\n",
1690*5113495bSYour Name 		       dp_stats_buf->ac_mu_mimo_brpoll_3);
1691*5113495bSYour Name }
1692*5113495bSYour Name 
1693*5113495bSYour Name /**
1694*5113495bSYour Name  * dp_print_tx_selfgen_ax_stats_tlv() - display htt_tx_selfgen_ax_stats_tlv
1695*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_selfgen_ax_stats_tlv
1696*5113495bSYour Name  *
1697*5113495bSYour Name  * Return: void
1698*5113495bSYour Name  */
dp_print_tx_selfgen_ax_stats_tlv(uint32_t * tag_buf)1699*5113495bSYour Name static void dp_print_tx_selfgen_ax_stats_tlv(uint32_t *tag_buf)
1700*5113495bSYour Name {
1701*5113495bSYour Name 	htt_tx_selfgen_ax_stats_tlv *dp_stats_buf =
1702*5113495bSYour Name 		(htt_tx_selfgen_ax_stats_tlv *)tag_buf;
1703*5113495bSYour Name 
1704*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_SELFGEN_AX_STATS_TLV:");
1705*5113495bSYour Name 	DP_PRINT_STATS("ax_su_ndpa = %u",
1706*5113495bSYour Name 		       dp_stats_buf->ax_su_ndpa);
1707*5113495bSYour Name 	DP_PRINT_STATS("ax_su_ndp = %u",
1708*5113495bSYour Name 		       dp_stats_buf->ax_su_ndp);
1709*5113495bSYour Name 	DP_PRINT_STATS("ax_mu_mimo_ndpa = %u",
1710*5113495bSYour Name 		       dp_stats_buf->ax_mu_mimo_ndpa);
1711*5113495bSYour Name 	DP_PRINT_STATS("ax_mu_mimo_ndp = %u",
1712*5113495bSYour Name 		       dp_stats_buf->ax_mu_mimo_ndp);
1713*5113495bSYour Name 	DP_PRINT_STATS("ax_mu_mimo_brpoll_1 = %u",
1714*5113495bSYour Name 		       dp_stats_buf->ax_mu_mimo_brpoll_1);
1715*5113495bSYour Name 	DP_PRINT_STATS("ax_mu_mimo_brpoll_2 = %u",
1716*5113495bSYour Name 		       dp_stats_buf->ax_mu_mimo_brpoll_2);
1717*5113495bSYour Name 	DP_PRINT_STATS("ax_mu_mimo_brpoll_3 = %u",
1718*5113495bSYour Name 		       dp_stats_buf->ax_mu_mimo_brpoll_3);
1719*5113495bSYour Name 	DP_PRINT_STATS("ax_mu_mimo_brpoll_4 = %u",
1720*5113495bSYour Name 		       dp_stats_buf->ax_mu_mimo_brpoll_4);
1721*5113495bSYour Name 	DP_PRINT_STATS("ax_mu_mimo_brpoll_5 = %u",
1722*5113495bSYour Name 		       dp_stats_buf->ax_mu_mimo_brpoll_5);
1723*5113495bSYour Name 	DP_PRINT_STATS("ax_mu_mimo_brpoll_6 = %u",
1724*5113495bSYour Name 		       dp_stats_buf->ax_mu_mimo_brpoll_6);
1725*5113495bSYour Name 	DP_PRINT_STATS("ax_mu_mimo_brpoll_7 = %u",
1726*5113495bSYour Name 		       dp_stats_buf->ax_mu_mimo_brpoll_7);
1727*5113495bSYour Name 	DP_PRINT_STATS("ax_basic_trigger = %u",
1728*5113495bSYour Name 		       dp_stats_buf->ax_basic_trigger);
1729*5113495bSYour Name 	DP_PRINT_STATS("ax_bsr_trigger = %u",
1730*5113495bSYour Name 		       dp_stats_buf->ax_bsr_trigger);
1731*5113495bSYour Name 	DP_PRINT_STATS("ax_mu_bar_trigger = %u",
1732*5113495bSYour Name 		       dp_stats_buf->ax_mu_bar_trigger);
1733*5113495bSYour Name 	DP_PRINT_STATS("ax_mu_rts_trigger = %u\n",
1734*5113495bSYour Name 		       dp_stats_buf->ax_mu_rts_trigger);
1735*5113495bSYour Name }
1736*5113495bSYour Name 
1737*5113495bSYour Name /**
1738*5113495bSYour Name  * dp_print_tx_selfgen_ac_err_stats_tlv() - display htt_tx_selfgen_ac_err_stats_tlv
1739*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_selfgen_ac_err_stats_tlv
1740*5113495bSYour Name  *
1741*5113495bSYour Name  * Return: void
1742*5113495bSYour Name  */
dp_print_tx_selfgen_ac_err_stats_tlv(uint32_t * tag_buf)1743*5113495bSYour Name static void dp_print_tx_selfgen_ac_err_stats_tlv(uint32_t *tag_buf)
1744*5113495bSYour Name {
1745*5113495bSYour Name 	htt_tx_selfgen_ac_err_stats_tlv *dp_stats_buf =
1746*5113495bSYour Name 		(htt_tx_selfgen_ac_err_stats_tlv *)tag_buf;
1747*5113495bSYour Name 
1748*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_SELFGEN_AC_ERR_STATS_TLV:");
1749*5113495bSYour Name 	DP_PRINT_STATS("ac_su_ndp_err = %u",
1750*5113495bSYour Name 		       dp_stats_buf->ac_su_ndp_err);
1751*5113495bSYour Name 	DP_PRINT_STATS("ac_su_ndpa_err = %u",
1752*5113495bSYour Name 		       dp_stats_buf->ac_su_ndpa_err);
1753*5113495bSYour Name 	DP_PRINT_STATS("ac_mu_mimo_ndpa_err = %u",
1754*5113495bSYour Name 		       dp_stats_buf->ac_mu_mimo_ndpa_err);
1755*5113495bSYour Name 	DP_PRINT_STATS("ac_mu_mimo_ndp_err = %u",
1756*5113495bSYour Name 		       dp_stats_buf->ac_mu_mimo_ndp_err);
1757*5113495bSYour Name 	DP_PRINT_STATS("ac_mu_mimo_brp1_err = %u",
1758*5113495bSYour Name 		       dp_stats_buf->ac_mu_mimo_brp1_err);
1759*5113495bSYour Name 	DP_PRINT_STATS("ac_mu_mimo_brp2_err = %u",
1760*5113495bSYour Name 		       dp_stats_buf->ac_mu_mimo_brp2_err);
1761*5113495bSYour Name 	DP_PRINT_STATS("ac_mu_mimo_brp3_err = %u\n",
1762*5113495bSYour Name 		       dp_stats_buf->ac_mu_mimo_brp3_err);
1763*5113495bSYour Name }
1764*5113495bSYour Name 
1765*5113495bSYour Name /* dp_print_tx_selfgen_be_err_stats_tlv: display htt_tx_selfgen_be_err_stats_tlv
1766*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_selfgen_be_err_stats_tlv
1767*5113495bSYour Name  *
1768*5113495bSYour Name  * Return: void
1769*5113495bSYour Name  */
dp_print_tx_selfgen_be_err_stats_tlv(uint32_t * tag_buf)1770*5113495bSYour Name static void dp_print_tx_selfgen_be_err_stats_tlv(uint32_t *tag_buf)
1771*5113495bSYour Name {
1772*5113495bSYour Name 	htt_tx_selfgen_be_err_stats_tlv *dp_stats_buf =
1773*5113495bSYour Name 		(htt_tx_selfgen_be_err_stats_tlv *)tag_buf;
1774*5113495bSYour Name 	uint16_t i;
1775*5113495bSYour Name 
1776*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_SELFGEN_BE_ERR_STATS_TLV:");
1777*5113495bSYour Name 	DP_PRINT_STATS("be_su_ndp_err = %u",
1778*5113495bSYour Name 		       dp_stats_buf->be_su_ndp_err);
1779*5113495bSYour Name 	DP_PRINT_STATS("be_su_ndpa_err = %u",
1780*5113495bSYour Name 		       dp_stats_buf->be_su_ndpa_err);
1781*5113495bSYour Name 	DP_PRINT_STATS("be_mu_mimo_ndpa_err = %u",
1782*5113495bSYour Name 		       dp_stats_buf->be_mu_mimo_ndpa_err);
1783*5113495bSYour Name 	DP_PRINT_STATS("be_mu_mimo_ndp_err = %u",
1784*5113495bSYour Name 		       dp_stats_buf->be_mu_mimo_ndp_err);
1785*5113495bSYour Name 	for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++)
1786*5113495bSYour Name 		DP_PRINT_STATS("be_mu_mimo_brp_err_%d: %u",
1787*5113495bSYour Name 			       i, dp_stats_buf->be_mu_mimo_brp_err[i]);
1788*5113495bSYour Name 	DP_PRINT_STATS("be_basic_trigger_err = %u",
1789*5113495bSYour Name 		       dp_stats_buf->be_basic_trigger_err);
1790*5113495bSYour Name 	DP_PRINT_STATS("be_bsr_trigger_err = %u",
1791*5113495bSYour Name 		       dp_stats_buf->be_bsr_trigger_err);
1792*5113495bSYour Name 	DP_PRINT_STATS("be_mu_bar_trigger_err = %u",
1793*5113495bSYour Name 		       dp_stats_buf->be_mu_bar_trigger_err);
1794*5113495bSYour Name 	DP_PRINT_STATS("be_mu_rts_trigger_err = %u",
1795*5113495bSYour Name 		       dp_stats_buf->be_mu_rts_trigger_err);
1796*5113495bSYour Name 	DP_PRINT_STATS("be_ulmumimo_trigger_err = %u",
1797*5113495bSYour Name 		       dp_stats_buf->be_ulmumimo_trigger_err);
1798*5113495bSYour Name 	for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++)
1799*5113495bSYour Name 		DP_PRINT_STATS("be_mu_mimo_brp_err_num_cbf_received _%d: %u", i,
1800*5113495bSYour Name 			       dp_stats_buf->be_mu_mimo_brp_err_num_cbf_received[i]);
1801*5113495bSYour Name 	DP_PRINT_STATS("be_su_ndpa_flushed = %u",
1802*5113495bSYour Name 		       dp_stats_buf->be_su_ndpa_flushed);
1803*5113495bSYour Name 	DP_PRINT_STATS("be_su_ndp_flushed = %u",
1804*5113495bSYour Name 		       dp_stats_buf->be_su_ndp_flushed);
1805*5113495bSYour Name 	DP_PRINT_STATS("be_mu_mimo_ndpa_flushed = %u",
1806*5113495bSYour Name 		       dp_stats_buf->be_mu_mimo_ndpa_flushed);
1807*5113495bSYour Name 	DP_PRINT_STATS("be_mu_mimo_ndp_flushed = %u",
1808*5113495bSYour Name 		       dp_stats_buf->be_mu_mimo_ndp_flushed);
1809*5113495bSYour Name 	for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++)
1810*5113495bSYour Name 		DP_PRINT_STATS("be_mu_mimo_brpoll_flushed_%d: %u",
1811*5113495bSYour Name 			       i, dp_stats_buf->be_mu_mimo_brpoll_flushed[i]);
1812*5113495bSYour Name 	for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++)
1813*5113495bSYour Name 		DP_PRINT_STATS("be_ul_mumimo_trigger_err_%d: %u",
1814*5113495bSYour Name 			       i, dp_stats_buf->be_ul_mumimo_trigger_err[i]);
1815*5113495bSYour Name }
1816*5113495bSYour Name 
1817*5113495bSYour Name /**
1818*5113495bSYour Name  * dp_print_tx_selfgen_be_stats_tlv() - display htt_tx_selfgen_be_stats_tlv
1819*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_selfgen_be_stats_tlv
1820*5113495bSYour Name  *
1821*5113495bSYour Name  * Return: void
1822*5113495bSYour Name  */
dp_print_tx_selfgen_be_stats_tlv(uint32_t * tag_buf)1823*5113495bSYour Name static void dp_print_tx_selfgen_be_stats_tlv(uint32_t *tag_buf)
1824*5113495bSYour Name {
1825*5113495bSYour Name 	htt_tx_selfgen_be_stats_tlv *dp_stats_buf =
1826*5113495bSYour Name 		(htt_tx_selfgen_be_stats_tlv *)tag_buf;
1827*5113495bSYour Name 	uint16_t i;
1828*5113495bSYour Name 
1829*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_SELFGEN_BE_STATS_TLV:");
1830*5113495bSYour Name 	DP_PRINT_STATS("be_su_ndpa = %u",
1831*5113495bSYour Name 		       dp_stats_buf->be_su_ndpa);
1832*5113495bSYour Name 	DP_PRINT_STATS("be_su_ndp = %u",
1833*5113495bSYour Name 		       dp_stats_buf->be_su_ndp);
1834*5113495bSYour Name 	DP_PRINT_STATS("be_mu_mimo_ndpa = %u",
1835*5113495bSYour Name 		       dp_stats_buf->be_mu_mimo_ndpa);
1836*5113495bSYour Name 	DP_PRINT_STATS("be_mu_mimo_ndp = %u",
1837*5113495bSYour Name 		       dp_stats_buf->be_mu_mimo_ndp);
1838*5113495bSYour Name 	for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++)
1839*5113495bSYour Name 		DP_PRINT_STATS("be_mu_mimo_brpoll_%d = %u",
1840*5113495bSYour Name 			       i, dp_stats_buf->be_mu_mimo_brpoll[i]);
1841*5113495bSYour Name 	DP_PRINT_STATS("be_basic_trigger = %u",
1842*5113495bSYour Name 		       dp_stats_buf->be_basic_trigger);
1843*5113495bSYour Name 	DP_PRINT_STATS("be_bsr_trigger = %u",
1844*5113495bSYour Name 		       dp_stats_buf->be_bsr_trigger);
1845*5113495bSYour Name 	DP_PRINT_STATS("be_mu_bar_trigger = %u",
1846*5113495bSYour Name 		       dp_stats_buf->be_mu_bar_trigger);
1847*5113495bSYour Name 	DP_PRINT_STATS("be_mu_rts_trigger = %u",
1848*5113495bSYour Name 		       dp_stats_buf->be_mu_rts_trigger);
1849*5113495bSYour Name 	DP_PRINT_STATS("be_ulmumimo_trigger = %u",
1850*5113495bSYour Name 		       dp_stats_buf->be_ulmumimo_trigger);
1851*5113495bSYour Name 	DP_PRINT_STATS("be_su_ndpa_queued = %u",
1852*5113495bSYour Name 		       dp_stats_buf->be_su_ndpa_queued);
1853*5113495bSYour Name 	DP_PRINT_STATS("be_su_ndp_queued = %u",
1854*5113495bSYour Name 		       dp_stats_buf->be_su_ndp_queued);
1855*5113495bSYour Name 	DP_PRINT_STATS("be_mu_mimo_ndpa_queued = %u",
1856*5113495bSYour Name 		       dp_stats_buf->be_mu_mimo_ndpa_queued);
1857*5113495bSYour Name 	DP_PRINT_STATS("be_mu_mimo_ndp_queued = %u",
1858*5113495bSYour Name 		       dp_stats_buf->be_mu_mimo_ndp_queued);
1859*5113495bSYour Name 	for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++)
1860*5113495bSYour Name 		DP_PRINT_STATS("be_mu_mimo_brpoll_queued_%d = %u",
1861*5113495bSYour Name 			       i, dp_stats_buf->be_mu_mimo_brpoll_queued[i]);
1862*5113495bSYour Name 	for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++)
1863*5113495bSYour Name 		DP_PRINT_STATS("be_ul_mumimo_trigger_%d = %u",
1864*5113495bSYour Name 			       i, dp_stats_buf->be_ul_mumimo_trigger[i]);
1865*5113495bSYour Name }
1866*5113495bSYour Name 
1867*5113495bSYour Name /**
1868*5113495bSYour Name  * dp_print_tx_selfgen_ax_err_stats_tlv() - display htt_tx_selfgen_ax_err_stats_tlv
1869*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_selfgen_ax_err_stats_tlv
1870*5113495bSYour Name  *
1871*5113495bSYour Name  * Return: void
1872*5113495bSYour Name  */
dp_print_tx_selfgen_ax_err_stats_tlv(uint32_t * tag_buf)1873*5113495bSYour Name static void dp_print_tx_selfgen_ax_err_stats_tlv(uint32_t *tag_buf)
1874*5113495bSYour Name {
1875*5113495bSYour Name 	htt_tx_selfgen_ax_err_stats_tlv *dp_stats_buf =
1876*5113495bSYour Name 		(htt_tx_selfgen_ax_err_stats_tlv *)tag_buf;
1877*5113495bSYour Name 
1878*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_SELFGEN_AX_ERR_STATS_TLV:");
1879*5113495bSYour Name 	DP_PRINT_STATS("ax_su_ndp_err = %u",
1880*5113495bSYour Name 		       dp_stats_buf->ax_su_ndp_err);
1881*5113495bSYour Name 	DP_PRINT_STATS("ax_su_ndpa_err = %u",
1882*5113495bSYour Name 		       dp_stats_buf->ax_su_ndpa_err);
1883*5113495bSYour Name 	DP_PRINT_STATS("ax_mu_mimo_ndpa_err = %u",
1884*5113495bSYour Name 		       dp_stats_buf->ax_mu_mimo_ndpa_err);
1885*5113495bSYour Name 	DP_PRINT_STATS("ax_mu_mimo_ndp_err = %u",
1886*5113495bSYour Name 		       dp_stats_buf->ax_mu_mimo_ndp_err);
1887*5113495bSYour Name 	DP_PRINT_STATS("ax_mu_mimo_brp1_err = %u",
1888*5113495bSYour Name 		       dp_stats_buf->ax_mu_mimo_brp1_err);
1889*5113495bSYour Name 	DP_PRINT_STATS("ax_mu_mimo_brp2_err = %u",
1890*5113495bSYour Name 		       dp_stats_buf->ax_mu_mimo_brp2_err);
1891*5113495bSYour Name 	DP_PRINT_STATS("ax_mu_mimo_brp3_err = %u",
1892*5113495bSYour Name 		       dp_stats_buf->ax_mu_mimo_brp3_err);
1893*5113495bSYour Name 	DP_PRINT_STATS("ax_mu_mimo_brp4_err = %u",
1894*5113495bSYour Name 		       dp_stats_buf->ax_mu_mimo_brp4_err);
1895*5113495bSYour Name 	DP_PRINT_STATS("ax_mu_mimo_brp5_err = %u",
1896*5113495bSYour Name 		       dp_stats_buf->ax_mu_mimo_brp5_err);
1897*5113495bSYour Name 	DP_PRINT_STATS("ax_mu_mimo_brp6_err = %u",
1898*5113495bSYour Name 		       dp_stats_buf->ax_mu_mimo_brp6_err);
1899*5113495bSYour Name 	DP_PRINT_STATS("ax_mu_mimo_brp7_err = %u",
1900*5113495bSYour Name 		       dp_stats_buf->ax_mu_mimo_brp7_err);
1901*5113495bSYour Name 	DP_PRINT_STATS("ax_basic_trigger_err = %u",
1902*5113495bSYour Name 		       dp_stats_buf->ax_basic_trigger_err);
1903*5113495bSYour Name 	DP_PRINT_STATS("ax_bsr_trigger_err = %u",
1904*5113495bSYour Name 		       dp_stats_buf->ax_bsr_trigger_err);
1905*5113495bSYour Name 	DP_PRINT_STATS("ax_mu_bar_trigger_err = %u",
1906*5113495bSYour Name 		       dp_stats_buf->ax_mu_bar_trigger_err);
1907*5113495bSYour Name 	DP_PRINT_STATS("ax_mu_rts_trigger_err = %u\n",
1908*5113495bSYour Name 		       dp_stats_buf->ax_mu_rts_trigger_err);
1909*5113495bSYour Name }
1910*5113495bSYour Name 
1911*5113495bSYour Name /**
1912*5113495bSYour Name  * dp_print_tx_sounding_stats_tlv() - display htt_tx_sounding_stats_tlv
1913*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_soundig_stats_tlv
1914*5113495bSYour Name  *
1915*5113495bSYour Name  * Return: void
1916*5113495bSYour Name  */
dp_print_tx_sounding_stats_tlv(uint32_t * tag_buf)1917*5113495bSYour Name static void dp_print_tx_sounding_stats_tlv(uint32_t *tag_buf)
1918*5113495bSYour Name {
1919*5113495bSYour Name 	htt_tx_sounding_stats_tlv *dp_stats_buf =
1920*5113495bSYour Name 		(htt_tx_sounding_stats_tlv *)tag_buf;
1921*5113495bSYour Name 	uint16_t i;
1922*5113495bSYour Name 	uint16_t max_bw = HTT_TX_PDEV_STATS_NUM_BW_COUNTERS;
1923*5113495bSYour Name 
1924*5113495bSYour Name 	switch (dp_stats_buf->tx_sounding_mode) {
1925*5113495bSYour Name 	case HTT_TX_AC_SOUNDING_MODE:
1926*5113495bSYour Name 		DP_PRINT_STATS("\n HTT_TX_AC_SOUNDING_STATS_TLV: ");
1927*5113495bSYour Name 		DP_PRINT_STATS("ac_cbf_20 =  IBF : %d, SU_SIFS : %d, "
1928*5113495bSYour Name 			"SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
1929*5113495bSYour Name 			dp_stats_buf->cbf_20[0], dp_stats_buf->cbf_20[1],
1930*5113495bSYour Name 			dp_stats_buf->cbf_20[2], dp_stats_buf->cbf_20[3],
1931*5113495bSYour Name 			dp_stats_buf->cbf_20[4]);
1932*5113495bSYour Name 		DP_PRINT_STATS("ac_cbf_40 =  IBF : %d, SU_SIFS : %d, "
1933*5113495bSYour Name 			"SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
1934*5113495bSYour Name 			dp_stats_buf->cbf_40[0], dp_stats_buf->cbf_40[1],
1935*5113495bSYour Name 			dp_stats_buf->cbf_40[2], dp_stats_buf->cbf_40[3],
1936*5113495bSYour Name 			dp_stats_buf->cbf_40[4]);
1937*5113495bSYour Name 		DP_PRINT_STATS("ac_cbf_80 =  IBF : %d, SU_SIFS : %d, "
1938*5113495bSYour Name 			"SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
1939*5113495bSYour Name 			dp_stats_buf->cbf_80[0], dp_stats_buf->cbf_80[1],
1940*5113495bSYour Name 			dp_stats_buf->cbf_80[2], dp_stats_buf->cbf_80[3],
1941*5113495bSYour Name 			dp_stats_buf->cbf_80[4]);
1942*5113495bSYour Name 		DP_PRINT_STATS("ac_cbf_160 =  IBF : %d, SU_SIFS : %d, "
1943*5113495bSYour Name 			"SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
1944*5113495bSYour Name 			dp_stats_buf->cbf_160[0], dp_stats_buf->cbf_160[1],
1945*5113495bSYour Name 			dp_stats_buf->cbf_160[2], dp_stats_buf->cbf_160[3],
1946*5113495bSYour Name 			dp_stats_buf->cbf_160[4]);
1947*5113495bSYour Name 		for (i = 0;
1948*5113495bSYour Name 		     i < HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS;
1949*5113495bSYour Name 		     i++) {
1950*5113495bSYour Name 				DP_PRINT_STATS("Sounding User %d = 20MHz: %d, "
1951*5113495bSYour Name 				       "40MHz : %d, 80MHz: %d, 160MHz: %d", i,
1952*5113495bSYour Name 				dp_stats_buf->sounding[(i * max_bw) + 0],
1953*5113495bSYour Name 				dp_stats_buf->sounding[(i * max_bw) + 1],
1954*5113495bSYour Name 				dp_stats_buf->sounding[(i * max_bw) + 2],
1955*5113495bSYour Name 				dp_stats_buf->sounding[(i * max_bw) + 3]);
1956*5113495bSYour Name 		}
1957*5113495bSYour Name 		break;
1958*5113495bSYour Name 	case HTT_TX_AX_SOUNDING_MODE:
1959*5113495bSYour Name 		DP_PRINT_STATS("\n HTT_TX_AX_SOUNDING_STATS_TLV: ");
1960*5113495bSYour Name 		DP_PRINT_STATS("ax_cbf_20 =  IBF : %d, SU_SIFS : %d, "
1961*5113495bSYour Name 			"SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
1962*5113495bSYour Name 			dp_stats_buf->cbf_20[0], dp_stats_buf->cbf_20[1],
1963*5113495bSYour Name 			dp_stats_buf->cbf_20[2], dp_stats_buf->cbf_20[3],
1964*5113495bSYour Name 			dp_stats_buf->cbf_20[4]);
1965*5113495bSYour Name 		DP_PRINT_STATS("ax_cbf_40 =  IBF : %d, SU_SIFS : %d, "
1966*5113495bSYour Name 			"SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
1967*5113495bSYour Name 			dp_stats_buf->cbf_40[0], dp_stats_buf->cbf_40[1],
1968*5113495bSYour Name 			dp_stats_buf->cbf_40[2], dp_stats_buf->cbf_40[3],
1969*5113495bSYour Name 			dp_stats_buf->cbf_40[4]);
1970*5113495bSYour Name 		DP_PRINT_STATS("ax_cbf_80 =  IBF : %d, SU_SIFS : %d, "
1971*5113495bSYour Name 			"SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
1972*5113495bSYour Name 			dp_stats_buf->cbf_80[0], dp_stats_buf->cbf_80[1],
1973*5113495bSYour Name 			dp_stats_buf->cbf_80[2], dp_stats_buf->cbf_80[3],
1974*5113495bSYour Name 			dp_stats_buf->cbf_80[4]);
1975*5113495bSYour Name 		DP_PRINT_STATS("ax_cbf_160 =  IBF : %d, SU_SIFS : %d, "
1976*5113495bSYour Name 			"SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
1977*5113495bSYour Name 			dp_stats_buf->cbf_160[0], dp_stats_buf->cbf_160[1],
1978*5113495bSYour Name 			dp_stats_buf->cbf_160[2], dp_stats_buf->cbf_160[3],
1979*5113495bSYour Name 			dp_stats_buf->cbf_160[4]);
1980*5113495bSYour Name 		for (i = 0;
1981*5113495bSYour Name 		     i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS;
1982*5113495bSYour Name 		     i++) {
1983*5113495bSYour Name 			DP_PRINT_STATS("Sounding User %d = 20MHz: %d, "
1984*5113495bSYour Name 				       "40MHz : %d, 80MHz: %d, 160MHz: %d", i,
1985*5113495bSYour Name 				dp_stats_buf->sounding[(i * max_bw) + 0],
1986*5113495bSYour Name 				dp_stats_buf->sounding[(i * max_bw) + 1],
1987*5113495bSYour Name 				dp_stats_buf->sounding[(i * max_bw) + 2],
1988*5113495bSYour Name 				dp_stats_buf->sounding[(i * max_bw) + 3]);
1989*5113495bSYour Name 		}
1990*5113495bSYour Name 		break;
1991*5113495bSYour Name 	case HTT_TX_BE_SOUNDING_MODE:
1992*5113495bSYour Name 		DP_PRINT_STATS("\n HTT_TX_BE_SOUNDING_STATS_TLV: ");
1993*5113495bSYour Name 		DP_PRINT_STATS("be_cbf_20 =  IBF : %d, SU_SIFS : %d, "
1994*5113495bSYour Name 			"SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
1995*5113495bSYour Name 			dp_stats_buf->cbf_20[0], dp_stats_buf->cbf_20[1],
1996*5113495bSYour Name 			dp_stats_buf->cbf_20[2], dp_stats_buf->cbf_20[3],
1997*5113495bSYour Name 			dp_stats_buf->cbf_20[4]);
1998*5113495bSYour Name 		DP_PRINT_STATS("be_cbf_40 =  IBF : %d, SU_SIFS : %d, "
1999*5113495bSYour Name 			"SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
2000*5113495bSYour Name 			dp_stats_buf->cbf_40[0], dp_stats_buf->cbf_40[1],
2001*5113495bSYour Name 			dp_stats_buf->cbf_40[2], dp_stats_buf->cbf_40[3],
2002*5113495bSYour Name 			dp_stats_buf->cbf_40[4]);
2003*5113495bSYour Name 		DP_PRINT_STATS("be_cbf_80 =  IBF : %d, SU_SIFS : %d, "
2004*5113495bSYour Name 			"SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
2005*5113495bSYour Name 			dp_stats_buf->cbf_80[0], dp_stats_buf->cbf_80[1],
2006*5113495bSYour Name 			dp_stats_buf->cbf_80[2], dp_stats_buf->cbf_80[3],
2007*5113495bSYour Name 			dp_stats_buf->cbf_80[4]);
2008*5113495bSYour Name 		DP_PRINT_STATS("be_cbf_160 =  IBF : %d, SU_SIFS : %d, "
2009*5113495bSYour Name 			"SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
2010*5113495bSYour Name 			dp_stats_buf->cbf_160[0], dp_stats_buf->cbf_160[1],
2011*5113495bSYour Name 			dp_stats_buf->cbf_160[2], dp_stats_buf->cbf_160[3],
2012*5113495bSYour Name 			dp_stats_buf->cbf_160[4]);
2013*5113495bSYour Name 		DP_PRINT_STATS("be_cbf_320 =  IBF : %d, SU_SIFS : %d, "
2014*5113495bSYour Name 			"SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
2015*5113495bSYour Name 			dp_stats_buf->cbf_320[0], dp_stats_buf->cbf_320[1],
2016*5113495bSYour Name 			dp_stats_buf->cbf_320[2], dp_stats_buf->cbf_320[3],
2017*5113495bSYour Name 			dp_stats_buf->cbf_320[4]);
2018*5113495bSYour Name 		for (i = 0;
2019*5113495bSYour Name 		     i < HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS;
2020*5113495bSYour Name 		     i++) {
2021*5113495bSYour Name 			DP_PRINT_STATS("Sounding User %d = 20MHz: %d, "
2022*5113495bSYour Name 				       "40MHz : %d, 80MHz: %d, 160MHz: %d, "
2023*5113495bSYour Name 				       "320MHz: %d", i,
2024*5113495bSYour Name 				dp_stats_buf->sounding[(i * max_bw) + 0],
2025*5113495bSYour Name 				dp_stats_buf->sounding[(i * max_bw) + 1],
2026*5113495bSYour Name 				dp_stats_buf->sounding[(i * max_bw) + 2],
2027*5113495bSYour Name 				dp_stats_buf->sounding[(i * max_bw) + 3],
2028*5113495bSYour Name 				dp_stats_buf->sounding_320[i]);
2029*5113495bSYour Name 		}
2030*5113495bSYour Name 		break;
2031*5113495bSYour Name 	case HTT_TX_CMN_SOUNDING_MODE:
2032*5113495bSYour Name 		DP_PRINT_STATS("\n CV UPLOAD HANDLER STATS:");
2033*5113495bSYour Name 		DP_PRINT_STATS("cv_nc_mismatch_err         : %u",
2034*5113495bSYour Name 			       dp_stats_buf->cv_nc_mismatch_err);
2035*5113495bSYour Name 		DP_PRINT_STATS("cv_fcs_err                 : %u",
2036*5113495bSYour Name 			       dp_stats_buf->cv_fcs_err);
2037*5113495bSYour Name 		DP_PRINT_STATS("cv_frag_idx_mismatch       : %u",
2038*5113495bSYour Name 			       dp_stats_buf->cv_frag_idx_mismatch);
2039*5113495bSYour Name 		DP_PRINT_STATS("cv_invalid_peer_id         : %u",
2040*5113495bSYour Name 			       dp_stats_buf->cv_invalid_peer_id);
2041*5113495bSYour Name 		DP_PRINT_STATS("cv_no_txbf_setup           : %u",
2042*5113495bSYour Name 			       dp_stats_buf->cv_no_txbf_setup);
2043*5113495bSYour Name 		DP_PRINT_STATS("cv_expiry_in_update        : %u",
2044*5113495bSYour Name 			       dp_stats_buf->cv_expiry_in_update);
2045*5113495bSYour Name 		DP_PRINT_STATS("cv_pkt_bw_exceed           : %u",
2046*5113495bSYour Name 			       dp_stats_buf->cv_pkt_bw_exceed);
2047*5113495bSYour Name 		DP_PRINT_STATS("cv_dma_not_done_err        : %u",
2048*5113495bSYour Name 			       dp_stats_buf->cv_dma_not_done_err);
2049*5113495bSYour Name 		DP_PRINT_STATS("cv_update_failed           : %u\n",
2050*5113495bSYour Name 			       dp_stats_buf->cv_update_failed);
2051*5113495bSYour Name 
2052*5113495bSYour Name 		DP_PRINT_STATS("\n CV QUERY STATS:");
2053*5113495bSYour Name 		DP_PRINT_STATS("cv_total_query             : %u",
2054*5113495bSYour Name 			       dp_stats_buf->cv_total_query);
2055*5113495bSYour Name 		DP_PRINT_STATS("cv_total_pattern_query     : %u",
2056*5113495bSYour Name 			       dp_stats_buf->cv_total_pattern_query);
2057*5113495bSYour Name 		DP_PRINT_STATS("cv_total_bw_query          : %u",
2058*5113495bSYour Name 			       dp_stats_buf->cv_total_bw_query);
2059*5113495bSYour Name 		DP_PRINT_STATS("cv_total_query             : %u",
2060*5113495bSYour Name 			       dp_stats_buf->cv_total_query);
2061*5113495bSYour Name 		DP_PRINT_STATS("cv_invalid_bw_coding       : %u",
2062*5113495bSYour Name 			       dp_stats_buf->cv_invalid_bw_coding);
2063*5113495bSYour Name 		DP_PRINT_STATS("cv_forced_sounding         : %u",
2064*5113495bSYour Name 			       dp_stats_buf->cv_forced_sounding);
2065*5113495bSYour Name 		DP_PRINT_STATS("cv_standalone_sounding     : %u",
2066*5113495bSYour Name 			       dp_stats_buf->cv_standalone_sounding);
2067*5113495bSYour Name 		DP_PRINT_STATS("cv_nc_mismatch             : %u",
2068*5113495bSYour Name 			       dp_stats_buf->cv_nc_mismatch);
2069*5113495bSYour Name 		DP_PRINT_STATS("cv_fb_type_mismatch        : %u",
2070*5113495bSYour Name 			       dp_stats_buf->cv_fb_type_mismatch);
2071*5113495bSYour Name 		DP_PRINT_STATS("cv_ofdma_bw_mismatch       : %u",
2072*5113495bSYour Name 			       dp_stats_buf->cv_ofdma_bw_mismatch);
2073*5113495bSYour Name 		DP_PRINT_STATS("cv_bw_mismatch             : %u",
2074*5113495bSYour Name 			       dp_stats_buf->cv_bw_mismatch);
2075*5113495bSYour Name 		DP_PRINT_STATS("cv_pattern_mismatch        : %u",
2076*5113495bSYour Name 			       dp_stats_buf->cv_pattern_mismatch);
2077*5113495bSYour Name 		DP_PRINT_STATS("cv_preamble_mismatch       : %u",
2078*5113495bSYour Name 			       dp_stats_buf->cv_preamble_mismatch);
2079*5113495bSYour Name 		DP_PRINT_STATS("cv_nr_mismatch             : %u",
2080*5113495bSYour Name 			       dp_stats_buf->cv_nr_mismatch);
2081*5113495bSYour Name 		DP_PRINT_STATS("cv_in_use_cnt_exceeded     : %u",
2082*5113495bSYour Name 			       dp_stats_buf->cv_in_use_cnt_exceeded);
2083*5113495bSYour Name 		DP_PRINT_STATS("cv_found                   : %u",
2084*5113495bSYour Name 			       dp_stats_buf->cv_found);
2085*5113495bSYour Name 		DP_PRINT_STATS("cv_not found               : %u",
2086*5113495bSYour Name 			       dp_stats_buf->cv_not_found);
2087*5113495bSYour Name 		DP_PRINT_STATS("cv_ntbr_sounding           : %u",
2088*5113495bSYour Name 			       dp_stats_buf->cv_ntbr_sounding);
2089*5113495bSYour Name 		DP_PRINT_STATS("cv_found_upload_in_progress: %u",
2090*5113495bSYour Name 			       dp_stats_buf->cv_found_upload_in_progress);
2091*5113495bSYour Name 		DP_PRINT_STATS("cv_expired_during_query    : %u\n",
2092*5113495bSYour Name 			       dp_stats_buf->cv_expired_during_query);
2093*5113495bSYour Name 		break;
2094*5113495bSYour Name 	default:
2095*5113495bSYour Name 		break;
2096*5113495bSYour Name 
2097*5113495bSYour Name 	}
2098*5113495bSYour Name }
2099*5113495bSYour Name 
2100*5113495bSYour Name /**
2101*5113495bSYour Name  * dp_print_tx_pdev_mu_mimo_sch_stats_tlv() - display htt_tx_pdev_mu_mimo_sch_stats
2102*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_pdev_mu_mimo_sch_stats_tlv
2103*5113495bSYour Name  *
2104*5113495bSYour Name  * Return: void
2105*5113495bSYour Name  */
dp_print_tx_pdev_mu_mimo_sch_stats_tlv(uint32_t * tag_buf)2106*5113495bSYour Name static void dp_print_tx_pdev_mu_mimo_sch_stats_tlv(uint32_t *tag_buf)
2107*5113495bSYour Name {
2108*5113495bSYour Name 	uint8_t i;
2109*5113495bSYour Name 	htt_tx_pdev_mu_mimo_sch_stats_tlv *dp_stats_buf =
2110*5113495bSYour Name 		(htt_tx_pdev_mu_mimo_sch_stats_tlv *)tag_buf;
2111*5113495bSYour Name 
2112*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_PDEV_MU_MIMO_SCH_STATS_TLV:");
2113*5113495bSYour Name 	DP_PRINT_STATS("mu_mimo_sch_posted = %u",
2114*5113495bSYour Name 		       dp_stats_buf->mu_mimo_sch_posted);
2115*5113495bSYour Name 	DP_PRINT_STATS("mu_mimo_sch_failed = %u",
2116*5113495bSYour Name 		       dp_stats_buf->mu_mimo_sch_failed);
2117*5113495bSYour Name 	DP_PRINT_STATS("mu_mimo_ppdu_posted = %u\n",
2118*5113495bSYour Name 		       dp_stats_buf->mu_mimo_ppdu_posted);
2119*5113495bSYour Name 
2120*5113495bSYour Name 	DP_PRINT_STATS("\n11ac MU_MIMO SCH STATS:\n");
2121*5113495bSYour Name 
2122*5113495bSYour Name 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS; i++) {
2123*5113495bSYour Name 		DP_PRINT_STATS("ac_mu_mimo_sch_nusers_%u = %u", i,
2124*5113495bSYour Name 			       dp_stats_buf->ac_mu_mimo_sch_nusers[i]);
2125*5113495bSYour Name 	}
2126*5113495bSYour Name 
2127*5113495bSYour Name 	DP_PRINT_STATS("\n11ax MU_MIMO SCH STATS:\n");
2128*5113495bSYour Name 
2129*5113495bSYour Name 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; i++) {
2130*5113495bSYour Name 		DP_PRINT_STATS("ax_mu_mimo_sch_nusers_%u = %u", i,
2131*5113495bSYour Name 			       dp_stats_buf->ax_mu_mimo_sch_nusers[i]);
2132*5113495bSYour Name 	}
2133*5113495bSYour Name 
2134*5113495bSYour Name 	DP_PRINT_STATS("\n11ax OFDMA SCH STATS:\n");
2135*5113495bSYour Name 
2136*5113495bSYour Name 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; i++) {
2137*5113495bSYour Name 		DP_PRINT_STATS("ax_ofdma_sch_nusers_%u = %u", i,
2138*5113495bSYour Name 			       dp_stats_buf->ax_ofdma_sch_nusers[i]);
2139*5113495bSYour Name 	}
2140*5113495bSYour Name }
2141*5113495bSYour Name 
2142*5113495bSYour Name /**
2143*5113495bSYour Name  * dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv() - display
2144*5113495bSYour Name  *				htt_tx_pdev_mu_mimo_mpdu_stats_tlv
2145*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_pdev_mu_mimo_mpdu_stats_tlv
2146*5113495bSYour Name  *
2147*5113495bSYour Name  * Return: void
2148*5113495bSYour Name  */
dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv(uint32_t * tag_buf)2149*5113495bSYour Name static void dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv(uint32_t *tag_buf)
2150*5113495bSYour Name {
2151*5113495bSYour Name 	htt_tx_pdev_mpdu_stats_tlv *dp_stats_buf =
2152*5113495bSYour Name 		(htt_tx_pdev_mpdu_stats_tlv *)tag_buf;
2153*5113495bSYour Name 
2154*5113495bSYour Name 	if (dp_stats_buf->tx_sched_mode ==
2155*5113495bSYour Name 			HTT_STATS_TX_SCHED_MODE_MU_MIMO_AC) {
2156*5113495bSYour Name 		if (!dp_stats_buf->user_index)
2157*5113495bSYour Name 			DP_PRINT_STATS(
2158*5113495bSYour Name 				       "\nHTT_TX_PDEV_MU_MIMO_AC_MPDU_STATS:\n");
2159*5113495bSYour Name 
2160*5113495bSYour Name 		if (dp_stats_buf->user_index <
2161*5113495bSYour Name 			HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS) {
2162*5113495bSYour Name 			DP_PRINT_STATS(
2163*5113495bSYour Name 				       "ac_mu_mimo_mpdus_queued_usr_%u = %u",
2164*5113495bSYour Name 				       dp_stats_buf->user_index,
2165*5113495bSYour Name 				       dp_stats_buf->mpdus_queued_usr);
2166*5113495bSYour Name 			DP_PRINT_STATS(
2167*5113495bSYour Name 				       "ac_mu_mimo_mpdus_tried_usr_%u = %u",
2168*5113495bSYour Name 				       dp_stats_buf->user_index,
2169*5113495bSYour Name 				       dp_stats_buf->mpdus_tried_usr);
2170*5113495bSYour Name 			DP_PRINT_STATS(
2171*5113495bSYour Name 				       "ac_mu_mimo_mpdus_failed_usr_%u = %u",
2172*5113495bSYour Name 				       dp_stats_buf->user_index,
2173*5113495bSYour Name 				       dp_stats_buf->mpdus_failed_usr);
2174*5113495bSYour Name 			DP_PRINT_STATS(
2175*5113495bSYour Name 				       "ac_mu_mimo_mpdus_requeued_usr_%u = %u",
2176*5113495bSYour Name 				       dp_stats_buf->user_index,
2177*5113495bSYour Name 				       dp_stats_buf->mpdus_requeued_usr);
2178*5113495bSYour Name 			DP_PRINT_STATS(
2179*5113495bSYour Name 				       "ac_mu_mimo_err_no_ba_usr_%u = %u",
2180*5113495bSYour Name 				       dp_stats_buf->user_index,
2181*5113495bSYour Name 				       dp_stats_buf->err_no_ba_usr);
2182*5113495bSYour Name 			DP_PRINT_STATS(
2183*5113495bSYour Name 				       "ac_mu_mimo_mpdu_underrun_usr_%u = %u",
2184*5113495bSYour Name 				       dp_stats_buf->user_index,
2185*5113495bSYour Name 				       dp_stats_buf->mpdu_underrun_usr);
2186*5113495bSYour Name 			DP_PRINT_STATS(
2187*5113495bSYour Name 				       "ac_mu_mimo_ampdu_underrun_usr_%u = %u\n",
2188*5113495bSYour Name 				       dp_stats_buf->user_index,
2189*5113495bSYour Name 				       dp_stats_buf->ampdu_underrun_usr);
2190*5113495bSYour Name 		}
2191*5113495bSYour Name 	}
2192*5113495bSYour Name 
2193*5113495bSYour Name 	if (dp_stats_buf->tx_sched_mode == HTT_STATS_TX_SCHED_MODE_MU_MIMO_AX) {
2194*5113495bSYour Name 		if (!dp_stats_buf->user_index)
2195*5113495bSYour Name 			DP_PRINT_STATS(
2196*5113495bSYour Name 				       "\nHTT_TX_PDEV_MU_MIMO_AX_MPDU_STATS:\n");
2197*5113495bSYour Name 
2198*5113495bSYour Name 		if (dp_stats_buf->user_index <
2199*5113495bSYour Name 				HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS) {
2200*5113495bSYour Name 			DP_PRINT_STATS(
2201*5113495bSYour Name 				       "ax_mu_mimo_mpdus_queued_usr_%u = %u",
2202*5113495bSYour Name 				       dp_stats_buf->user_index,
2203*5113495bSYour Name 				       dp_stats_buf->mpdus_queued_usr);
2204*5113495bSYour Name 			DP_PRINT_STATS(
2205*5113495bSYour Name 				       "ax_mu_mimo_mpdus_tried_usr_%u = %u",
2206*5113495bSYour Name 				       dp_stats_buf->user_index,
2207*5113495bSYour Name 				       dp_stats_buf->mpdus_tried_usr);
2208*5113495bSYour Name 			DP_PRINT_STATS(
2209*5113495bSYour Name 				       "ax_mu_mimo_mpdus_failed_usr_%u = %u",
2210*5113495bSYour Name 				       dp_stats_buf->user_index,
2211*5113495bSYour Name 				       dp_stats_buf->mpdus_failed_usr);
2212*5113495bSYour Name 			DP_PRINT_STATS(
2213*5113495bSYour Name 				       "ax_mu_mimo_mpdus_requeued_usr_%u = %u",
2214*5113495bSYour Name 				       dp_stats_buf->user_index,
2215*5113495bSYour Name 				       dp_stats_buf->mpdus_requeued_usr);
2216*5113495bSYour Name 			DP_PRINT_STATS(
2217*5113495bSYour Name 				       "ax_mu_mimo_err_no_ba_usr_%u = %u",
2218*5113495bSYour Name 				       dp_stats_buf->user_index,
2219*5113495bSYour Name 				       dp_stats_buf->err_no_ba_usr);
2220*5113495bSYour Name 			DP_PRINT_STATS(
2221*5113495bSYour Name 				       "ax_mu_mimo_mpdu_underrun_usr_%u = %u",
2222*5113495bSYour Name 				       dp_stats_buf->user_index,
2223*5113495bSYour Name 				       dp_stats_buf->mpdu_underrun_usr);
2224*5113495bSYour Name 			DP_PRINT_STATS(
2225*5113495bSYour Name 				       "ax_mu_mimo_ampdu_underrun_usr_%u = %u\n",
2226*5113495bSYour Name 				       dp_stats_buf->user_index,
2227*5113495bSYour Name 				       dp_stats_buf->ampdu_underrun_usr);
2228*5113495bSYour Name 		}
2229*5113495bSYour Name 	}
2230*5113495bSYour Name 
2231*5113495bSYour Name 	if (dp_stats_buf->tx_sched_mode ==
2232*5113495bSYour Name 			HTT_STATS_TX_SCHED_MODE_MU_OFDMA_AX) {
2233*5113495bSYour Name 		if (!dp_stats_buf->user_index)
2234*5113495bSYour Name 			DP_PRINT_STATS(
2235*5113495bSYour Name 				       "\nHTT_TX_PDEV_AX_MU_OFDMA_MPDU_STATS:\n");
2236*5113495bSYour Name 
2237*5113495bSYour Name 		if (dp_stats_buf->user_index <
2238*5113495bSYour Name 				HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS) {
2239*5113495bSYour Name 			DP_PRINT_STATS(
2240*5113495bSYour Name 				       "ax_mu_ofdma_mpdus_queued_usr_%u = %u",
2241*5113495bSYour Name 				       dp_stats_buf->user_index,
2242*5113495bSYour Name 				       dp_stats_buf->mpdus_queued_usr);
2243*5113495bSYour Name 			DP_PRINT_STATS(
2244*5113495bSYour Name 				       "ax_mu_ofdma_mpdus_tried_usr_%u = %u",
2245*5113495bSYour Name 				       dp_stats_buf->user_index,
2246*5113495bSYour Name 				       dp_stats_buf->mpdus_tried_usr);
2247*5113495bSYour Name 			DP_PRINT_STATS(
2248*5113495bSYour Name 				       "ax_mu_ofdma_mpdus_failed_usr_%u = %u",
2249*5113495bSYour Name 				       dp_stats_buf->user_index,
2250*5113495bSYour Name 				       dp_stats_buf->mpdus_failed_usr);
2251*5113495bSYour Name 			DP_PRINT_STATS(
2252*5113495bSYour Name 				       "ax_mu_ofdma_mpdus_requeued_usr_%u = %u",
2253*5113495bSYour Name 				       dp_stats_buf->user_index,
2254*5113495bSYour Name 				       dp_stats_buf->mpdus_requeued_usr);
2255*5113495bSYour Name 			DP_PRINT_STATS(
2256*5113495bSYour Name 				       "ax_mu_ofdma_err_no_ba_usr_%u = %u",
2257*5113495bSYour Name 				       dp_stats_buf->user_index,
2258*5113495bSYour Name 				       dp_stats_buf->err_no_ba_usr);
2259*5113495bSYour Name 			DP_PRINT_STATS(
2260*5113495bSYour Name 				       "ax_mu_ofdma_mpdu_underrun_usr_%u = %u",
2261*5113495bSYour Name 				       dp_stats_buf->user_index,
2262*5113495bSYour Name 				       dp_stats_buf->mpdu_underrun_usr);
2263*5113495bSYour Name 			DP_PRINT_STATS(
2264*5113495bSYour Name 				       "ax_mu_ofdma_ampdu_underrun_usr_%u = %u\n",
2265*5113495bSYour Name 				       dp_stats_buf->user_index,
2266*5113495bSYour Name 				       dp_stats_buf->ampdu_underrun_usr);
2267*5113495bSYour Name 		}
2268*5113495bSYour Name 	}
2269*5113495bSYour Name }
2270*5113495bSYour Name 
2271*5113495bSYour Name /**
2272*5113495bSYour Name  * dp_print_sched_txq_cmd_posted_tlv_v() - display htt_sched_txq_cmd_posted_tlv_v
2273*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_sched_txq_cmd_posted_tlv_v
2274*5113495bSYour Name  *
2275*5113495bSYour Name  * Return: void
2276*5113495bSYour Name  */
dp_print_sched_txq_cmd_posted_tlv_v(uint32_t * tag_buf)2277*5113495bSYour Name static void dp_print_sched_txq_cmd_posted_tlv_v(uint32_t *tag_buf)
2278*5113495bSYour Name {
2279*5113495bSYour Name 	htt_sched_txq_cmd_posted_tlv_v *dp_stats_buf =
2280*5113495bSYour Name 		(htt_sched_txq_cmd_posted_tlv_v *)tag_buf;
2281*5113495bSYour Name 	uint8_t i;
2282*5113495bSYour Name 	uint16_t index = 0;
2283*5113495bSYour Name 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
2284*5113495bSYour Name 	char *sched_cmd_posted = qdf_mem_malloc(DP_MAX_STRING_LEN);
2285*5113495bSYour Name 
2286*5113495bSYour Name 	if (!sched_cmd_posted) {
2287*5113495bSYour Name 		dp_stats_err("Output buffer not allocated");
2288*5113495bSYour Name 		return;
2289*5113495bSYour Name 	}
2290*5113495bSYour Name 
2291*5113495bSYour Name 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_SCHED_TX_MODE_MAX);
2292*5113495bSYour Name 
2293*5113495bSYour Name 	DP_PRINT_STATS("HTT_SCHED_TXQ_CMD_POSTED_TLV_V:");
2294*5113495bSYour Name 	for (i = 0; i <  tag_len; i++) {
2295*5113495bSYour Name 		index += qdf_snprint(&sched_cmd_posted[index],
2296*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
2297*5113495bSYour Name 				" %u:%u,", i,
2298*5113495bSYour Name 				dp_stats_buf->sched_cmd_posted[i]);
2299*5113495bSYour Name 	}
2300*5113495bSYour Name 	DP_PRINT_STATS("sched_cmd_posted = %s\n", sched_cmd_posted);
2301*5113495bSYour Name 	qdf_mem_free(sched_cmd_posted);
2302*5113495bSYour Name }
2303*5113495bSYour Name 
2304*5113495bSYour Name /**
2305*5113495bSYour Name  * dp_print_sched_txq_cmd_reaped_tlv_v() - display htt_sched_txq_cmd_reaped_tlv_v
2306*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_sched_txq_cmd_reaped_tlv_v
2307*5113495bSYour Name  *
2308*5113495bSYour Name  * Return: void
2309*5113495bSYour Name  */
dp_print_sched_txq_cmd_reaped_tlv_v(uint32_t * tag_buf)2310*5113495bSYour Name static void dp_print_sched_txq_cmd_reaped_tlv_v(uint32_t *tag_buf)
2311*5113495bSYour Name {
2312*5113495bSYour Name 	htt_sched_txq_cmd_reaped_tlv_v *dp_stats_buf =
2313*5113495bSYour Name 		(htt_sched_txq_cmd_reaped_tlv_v *)tag_buf;
2314*5113495bSYour Name 	uint8_t i;
2315*5113495bSYour Name 	uint16_t index = 0;
2316*5113495bSYour Name 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
2317*5113495bSYour Name 	char *sched_cmd_reaped = qdf_mem_malloc(DP_MAX_STRING_LEN);
2318*5113495bSYour Name 
2319*5113495bSYour Name 	if (!sched_cmd_reaped) {
2320*5113495bSYour Name 		dp_stats_err("Output buffer not allocated");
2321*5113495bSYour Name 		return;
2322*5113495bSYour Name 	}
2323*5113495bSYour Name 
2324*5113495bSYour Name 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_SCHED_TX_MODE_MAX);
2325*5113495bSYour Name 
2326*5113495bSYour Name 	DP_PRINT_STATS("HTT_SCHED_TXQ_CMD_REAPED_TLV_V:");
2327*5113495bSYour Name 	for (i = 0; i <  tag_len; i++) {
2328*5113495bSYour Name 		index += qdf_snprint(&sched_cmd_reaped[index],
2329*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
2330*5113495bSYour Name 				" %u:%u,", i,
2331*5113495bSYour Name 				dp_stats_buf->sched_cmd_reaped[i]);
2332*5113495bSYour Name 	}
2333*5113495bSYour Name 	DP_PRINT_STATS("sched_cmd_reaped = %s\n", sched_cmd_reaped);
2334*5113495bSYour Name 	qdf_mem_free(sched_cmd_reaped);
2335*5113495bSYour Name }
2336*5113495bSYour Name 
2337*5113495bSYour Name /**
2338*5113495bSYour Name  * dp_print_tx_pdev_stats_sched_per_txq_tlv() - display
2339*5113495bSYour Name  *				htt_tx_pdev_stats_sched_per_txq_tlv
2340*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_sched_per_txq_tlv
2341*5113495bSYour Name  *
2342*5113495bSYour Name  * Return: void
2343*5113495bSYour Name  */
dp_print_tx_pdev_stats_sched_per_txq_tlv(uint32_t * tag_buf)2344*5113495bSYour Name static void dp_print_tx_pdev_stats_sched_per_txq_tlv(uint32_t *tag_buf)
2345*5113495bSYour Name {
2346*5113495bSYour Name 	htt_tx_pdev_stats_sched_per_txq_tlv *dp_stats_buf =
2347*5113495bSYour Name 		(htt_tx_pdev_stats_sched_per_txq_tlv *)tag_buf;
2348*5113495bSYour Name 
2349*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_PDEV_STATS_SCHED_PER_TXQ_TLV:");
2350*5113495bSYour Name 	DP_PRINT_STATS("mac_id__txq_id__word = %u",
2351*5113495bSYour Name 		       dp_stats_buf->mac_id__txq_id__word);
2352*5113495bSYour Name 	DP_PRINT_STATS("sched_policy = %u",
2353*5113495bSYour Name 		       dp_stats_buf->sched_policy);
2354*5113495bSYour Name 	DP_PRINT_STATS("last_sched_cmd_posted_timestamp = %u",
2355*5113495bSYour Name 		       dp_stats_buf->last_sched_cmd_posted_timestamp);
2356*5113495bSYour Name 	DP_PRINT_STATS("last_sched_cmd_compl_timestamp = %u",
2357*5113495bSYour Name 		       dp_stats_buf->last_sched_cmd_compl_timestamp);
2358*5113495bSYour Name 	DP_PRINT_STATS("sched_2_tac_lwm_count = %u",
2359*5113495bSYour Name 		       dp_stats_buf->sched_2_tac_lwm_count);
2360*5113495bSYour Name 	DP_PRINT_STATS("sched_2_tac_ring_full = %u",
2361*5113495bSYour Name 		       dp_stats_buf->sched_2_tac_ring_full);
2362*5113495bSYour Name 	DP_PRINT_STATS("sched_cmd_post_failure = %u",
2363*5113495bSYour Name 		       dp_stats_buf->sched_cmd_post_failure);
2364*5113495bSYour Name 	DP_PRINT_STATS("num_active_tids = %u",
2365*5113495bSYour Name 		       dp_stats_buf->num_active_tids);
2366*5113495bSYour Name 	DP_PRINT_STATS("num_ps_schedules = %u",
2367*5113495bSYour Name 		       dp_stats_buf->num_ps_schedules);
2368*5113495bSYour Name 	DP_PRINT_STATS("sched_cmds_pending = %u",
2369*5113495bSYour Name 		       dp_stats_buf->sched_cmds_pending);
2370*5113495bSYour Name 	DP_PRINT_STATS("num_tid_register = %u",
2371*5113495bSYour Name 		       dp_stats_buf->num_tid_register);
2372*5113495bSYour Name 	DP_PRINT_STATS("num_tid_unregister = %u",
2373*5113495bSYour Name 		       dp_stats_buf->num_tid_unregister);
2374*5113495bSYour Name 	DP_PRINT_STATS("num_qstats_queried = %u",
2375*5113495bSYour Name 		       dp_stats_buf->num_qstats_queried);
2376*5113495bSYour Name 	DP_PRINT_STATS("qstats_update_pending = %u",
2377*5113495bSYour Name 		       dp_stats_buf->qstats_update_pending);
2378*5113495bSYour Name 	DP_PRINT_STATS("last_qstats_query_timestamp = %u",
2379*5113495bSYour Name 		       dp_stats_buf->last_qstats_query_timestamp);
2380*5113495bSYour Name 	DP_PRINT_STATS("num_tqm_cmdq_full = %u",
2381*5113495bSYour Name 		       dp_stats_buf->num_tqm_cmdq_full);
2382*5113495bSYour Name 	DP_PRINT_STATS("num_de_sched_algo_trigger = %u",
2383*5113495bSYour Name 		       dp_stats_buf->num_de_sched_algo_trigger);
2384*5113495bSYour Name 	DP_PRINT_STATS("num_rt_sched_algo_trigger = %u",
2385*5113495bSYour Name 		       dp_stats_buf->num_rt_sched_algo_trigger);
2386*5113495bSYour Name 	DP_PRINT_STATS("num_tqm_sched_algo_trigger = %u",
2387*5113495bSYour Name 		       dp_stats_buf->num_tqm_sched_algo_trigger);
2388*5113495bSYour Name 	DP_PRINT_STATS("notify_sched = %u\n",
2389*5113495bSYour Name 		       dp_stats_buf->notify_sched);
2390*5113495bSYour Name }
2391*5113495bSYour Name 
2392*5113495bSYour Name /**
2393*5113495bSYour Name  * dp_print_stats_tx_sched_cmn_tlv() - display htt_stats_tx_sched_cmn_tlv
2394*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_stats_tx_sched_cmn_tlv
2395*5113495bSYour Name  *
2396*5113495bSYour Name  * Return: void
2397*5113495bSYour Name  */
dp_print_stats_tx_sched_cmn_tlv(uint32_t * tag_buf)2398*5113495bSYour Name static void dp_print_stats_tx_sched_cmn_tlv(uint32_t *tag_buf)
2399*5113495bSYour Name {
2400*5113495bSYour Name 	htt_stats_tx_sched_cmn_tlv *dp_stats_buf =
2401*5113495bSYour Name 		(htt_stats_tx_sched_cmn_tlv *)tag_buf;
2402*5113495bSYour Name 
2403*5113495bSYour Name 	DP_PRINT_STATS("HTT_STATS_TX_SCHED_CMN_TLV:");
2404*5113495bSYour Name 	DP_PRINT_STATS("mac_id__word = %u",
2405*5113495bSYour Name 		       dp_stats_buf->mac_id__word);
2406*5113495bSYour Name 	DP_PRINT_STATS("current_timestamp = %u\n",
2407*5113495bSYour Name 		       dp_stats_buf->current_timestamp);
2408*5113495bSYour Name }
2409*5113495bSYour Name 
2410*5113495bSYour Name /**
2411*5113495bSYour Name  * dp_print_tx_tqm_gen_mpdu_stats_tlv_v() - display htt_tx_tqm_gen_mpdu_stats_tlv_v
2412*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_tqm_gen_mpdu_stats_tlv_v
2413*5113495bSYour Name  *
2414*5113495bSYour Name  * Return: void
2415*5113495bSYour Name  */
dp_print_tx_tqm_gen_mpdu_stats_tlv_v(uint32_t * tag_buf)2416*5113495bSYour Name static void dp_print_tx_tqm_gen_mpdu_stats_tlv_v(uint32_t *tag_buf)
2417*5113495bSYour Name {
2418*5113495bSYour Name 	htt_tx_tqm_gen_mpdu_stats_tlv_v *dp_stats_buf =
2419*5113495bSYour Name 		(htt_tx_tqm_gen_mpdu_stats_tlv_v *)tag_buf;
2420*5113495bSYour Name 	uint8_t i;
2421*5113495bSYour Name 	uint16_t index = 0;
2422*5113495bSYour Name 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
2423*5113495bSYour Name 	char *gen_mpdu_end_reason = qdf_mem_malloc(DP_MAX_STRING_LEN);
2424*5113495bSYour Name 
2425*5113495bSYour Name 	if (!gen_mpdu_end_reason) {
2426*5113495bSYour Name 		dp_stats_err("Output buffer not allocated");
2427*5113495bSYour Name 		return;
2428*5113495bSYour Name 	}
2429*5113495bSYour Name 
2430*5113495bSYour Name 	tag_len = qdf_min(tag_len,
2431*5113495bSYour Name 			(uint32_t)HTT_TX_TQM_MAX_GEN_MPDU_END_REASON);
2432*5113495bSYour Name 
2433*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_TQM_GEN_MPDU_STATS_TLV_V:");
2434*5113495bSYour Name 	for (i = 0; i <  tag_len; i++) {
2435*5113495bSYour Name 		index += qdf_snprint(&gen_mpdu_end_reason[index],
2436*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
2437*5113495bSYour Name 				" %u:%u,", i,
2438*5113495bSYour Name 				dp_stats_buf->gen_mpdu_end_reason[i]);
2439*5113495bSYour Name 	}
2440*5113495bSYour Name 	DP_PRINT_STATS("gen_mpdu_end_reason = %s\n", gen_mpdu_end_reason);
2441*5113495bSYour Name 	qdf_mem_free(gen_mpdu_end_reason);
2442*5113495bSYour Name }
2443*5113495bSYour Name 
2444*5113495bSYour Name /**
2445*5113495bSYour Name  * dp_print_tx_tqm_list_mpdu_stats_tlv_v() - display htt_tx_tqm_list_mpdu_stats_tlv
2446*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_tqm_list_mpdu_stats_tlv_v
2447*5113495bSYour Name  *
2448*5113495bSYour Name  * Return: void
2449*5113495bSYour Name  */
dp_print_tx_tqm_list_mpdu_stats_tlv_v(uint32_t * tag_buf)2450*5113495bSYour Name static void dp_print_tx_tqm_list_mpdu_stats_tlv_v(uint32_t *tag_buf)
2451*5113495bSYour Name {
2452*5113495bSYour Name 	htt_tx_tqm_list_mpdu_stats_tlv_v *dp_stats_buf =
2453*5113495bSYour Name 		(htt_tx_tqm_list_mpdu_stats_tlv_v *)tag_buf;
2454*5113495bSYour Name 	uint8_t i;
2455*5113495bSYour Name 	uint16_t index = 0;
2456*5113495bSYour Name 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
2457*5113495bSYour Name 	char *list_mpdu_end_reason = qdf_mem_malloc(DP_MAX_STRING_LEN);
2458*5113495bSYour Name 
2459*5113495bSYour Name 	if (!list_mpdu_end_reason) {
2460*5113495bSYour Name 		dp_stats_err("Output buffer not allocated");
2461*5113495bSYour Name 		return;
2462*5113495bSYour Name 	}
2463*5113495bSYour Name 
2464*5113495bSYour Name 	tag_len = qdf_min(tag_len,
2465*5113495bSYour Name 			(uint32_t)HTT_TX_TQM_MAX_LIST_MPDU_END_REASON);
2466*5113495bSYour Name 
2467*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_TQM_LIST_MPDU_STATS_TLV_V:");
2468*5113495bSYour Name 	for (i = 0; i <  tag_len; i++) {
2469*5113495bSYour Name 		index += qdf_snprint(&list_mpdu_end_reason[index],
2470*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
2471*5113495bSYour Name 				" %u:%u,", i,
2472*5113495bSYour Name 				dp_stats_buf->list_mpdu_end_reason[i]);
2473*5113495bSYour Name 	}
2474*5113495bSYour Name 	DP_PRINT_STATS("list_mpdu_end_reason = %s\n",
2475*5113495bSYour Name 		       list_mpdu_end_reason);
2476*5113495bSYour Name 	qdf_mem_free(list_mpdu_end_reason);
2477*5113495bSYour Name }
2478*5113495bSYour Name 
2479*5113495bSYour Name /**
2480*5113495bSYour Name  * dp_print_tx_tqm_list_mpdu_cnt_tlv_v() - display htt_tx_tqm_list_mpdu_cnt_tlv_v
2481*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_tqm_list_mpdu_cnt_tlv_v
2482*5113495bSYour Name  *
2483*5113495bSYour Name  * Return: void
2484*5113495bSYour Name  */
dp_print_tx_tqm_list_mpdu_cnt_tlv_v(uint32_t * tag_buf)2485*5113495bSYour Name static void dp_print_tx_tqm_list_mpdu_cnt_tlv_v(uint32_t *tag_buf)
2486*5113495bSYour Name {
2487*5113495bSYour Name 	htt_tx_tqm_list_mpdu_cnt_tlv_v *dp_stats_buf =
2488*5113495bSYour Name 		(htt_tx_tqm_list_mpdu_cnt_tlv_v *)tag_buf;
2489*5113495bSYour Name 	uint8_t i;
2490*5113495bSYour Name 	uint16_t index = 0;
2491*5113495bSYour Name 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
2492*5113495bSYour Name 	char *list_mpdu_cnt_hist = qdf_mem_malloc(DP_MAX_STRING_LEN);
2493*5113495bSYour Name 
2494*5113495bSYour Name 	if (!list_mpdu_cnt_hist) {
2495*5113495bSYour Name 		dp_stats_err("Output buffer not allocated");
2496*5113495bSYour Name 		return;
2497*5113495bSYour Name 	}
2498*5113495bSYour Name 
2499*5113495bSYour Name 	tag_len = qdf_min(tag_len,
2500*5113495bSYour Name 			(uint32_t)HTT_TX_TQM_MAX_LIST_MPDU_CNT_HISTOGRAM_BINS);
2501*5113495bSYour Name 
2502*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_TQM_LIST_MPDU_CNT_TLV_V:");
2503*5113495bSYour Name 	for (i = 0; i <  tag_len; i++) {
2504*5113495bSYour Name 		index += qdf_snprint(&list_mpdu_cnt_hist[index],
2505*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
2506*5113495bSYour Name 				" %u:%u,", i,
2507*5113495bSYour Name 				dp_stats_buf->list_mpdu_cnt_hist[i]);
2508*5113495bSYour Name 	}
2509*5113495bSYour Name 	DP_PRINT_STATS("list_mpdu_cnt_hist = %s\n", list_mpdu_cnt_hist);
2510*5113495bSYour Name 	qdf_mem_free(list_mpdu_cnt_hist);
2511*5113495bSYour Name }
2512*5113495bSYour Name 
2513*5113495bSYour Name /**
2514*5113495bSYour Name  * dp_print_tx_tqm_pdev_stats_tlv_v() - display htt_tx_tqm_pdev_stats_tlv_v
2515*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_tqm_pdev_stats_tlv_v
2516*5113495bSYour Name  *
2517*5113495bSYour Name  * Return: void
2518*5113495bSYour Name  */
dp_print_tx_tqm_pdev_stats_tlv_v(uint32_t * tag_buf)2519*5113495bSYour Name static void dp_print_tx_tqm_pdev_stats_tlv_v(uint32_t *tag_buf)
2520*5113495bSYour Name {
2521*5113495bSYour Name 	htt_tx_tqm_pdev_stats_tlv_v *dp_stats_buf =
2522*5113495bSYour Name 		(htt_tx_tqm_pdev_stats_tlv_v *)tag_buf;
2523*5113495bSYour Name 
2524*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_TQM_PDEV_STATS_TLV_V:");
2525*5113495bSYour Name 	DP_PRINT_STATS("msdu_count = %u",
2526*5113495bSYour Name 		       dp_stats_buf->msdu_count);
2527*5113495bSYour Name 	DP_PRINT_STATS("mpdu_count = %u",
2528*5113495bSYour Name 		       dp_stats_buf->mpdu_count);
2529*5113495bSYour Name 	DP_PRINT_STATS("remove_msdu = %u",
2530*5113495bSYour Name 		       dp_stats_buf->remove_msdu);
2531*5113495bSYour Name 	DP_PRINT_STATS("remove_mpdu = %u",
2532*5113495bSYour Name 		       dp_stats_buf->remove_mpdu);
2533*5113495bSYour Name 	DP_PRINT_STATS("remove_msdu_ttl = %u",
2534*5113495bSYour Name 		       dp_stats_buf->remove_msdu_ttl);
2535*5113495bSYour Name 	DP_PRINT_STATS("send_bar = %u",
2536*5113495bSYour Name 		       dp_stats_buf->send_bar);
2537*5113495bSYour Name 	DP_PRINT_STATS("bar_sync = %u",
2538*5113495bSYour Name 		       dp_stats_buf->bar_sync);
2539*5113495bSYour Name 	DP_PRINT_STATS("notify_mpdu = %u",
2540*5113495bSYour Name 		       dp_stats_buf->notify_mpdu);
2541*5113495bSYour Name 	DP_PRINT_STATS("sync_cmd = %u",
2542*5113495bSYour Name 		       dp_stats_buf->sync_cmd);
2543*5113495bSYour Name 	DP_PRINT_STATS("write_cmd = %u",
2544*5113495bSYour Name 		       dp_stats_buf->write_cmd);
2545*5113495bSYour Name 	DP_PRINT_STATS("hwsch_trigger = %u",
2546*5113495bSYour Name 		       dp_stats_buf->hwsch_trigger);
2547*5113495bSYour Name 	DP_PRINT_STATS("ack_tlv_proc = %u",
2548*5113495bSYour Name 		       dp_stats_buf->ack_tlv_proc);
2549*5113495bSYour Name 	DP_PRINT_STATS("gen_mpdu_cmd = %u",
2550*5113495bSYour Name 		       dp_stats_buf->gen_mpdu_cmd);
2551*5113495bSYour Name 	DP_PRINT_STATS("gen_list_cmd = %u",
2552*5113495bSYour Name 		       dp_stats_buf->gen_list_cmd);
2553*5113495bSYour Name 	DP_PRINT_STATS("remove_mpdu_cmd = %u",
2554*5113495bSYour Name 		       dp_stats_buf->remove_mpdu_cmd);
2555*5113495bSYour Name 	DP_PRINT_STATS("remove_mpdu_tried_cmd = %u",
2556*5113495bSYour Name 		       dp_stats_buf->remove_mpdu_tried_cmd);
2557*5113495bSYour Name 	DP_PRINT_STATS("mpdu_queue_stats_cmd = %u",
2558*5113495bSYour Name 		       dp_stats_buf->mpdu_queue_stats_cmd);
2559*5113495bSYour Name 	DP_PRINT_STATS("mpdu_head_info_cmd = %u",
2560*5113495bSYour Name 		       dp_stats_buf->mpdu_head_info_cmd);
2561*5113495bSYour Name 	DP_PRINT_STATS("msdu_flow_stats_cmd = %u",
2562*5113495bSYour Name 		       dp_stats_buf->msdu_flow_stats_cmd);
2563*5113495bSYour Name 	DP_PRINT_STATS("remove_msdu_cmd = %u",
2564*5113495bSYour Name 		       dp_stats_buf->remove_msdu_cmd);
2565*5113495bSYour Name 	DP_PRINT_STATS("remove_msdu_ttl_cmd = %u",
2566*5113495bSYour Name 		       dp_stats_buf->remove_msdu_ttl_cmd);
2567*5113495bSYour Name 	DP_PRINT_STATS("flush_cache_cmd = %u",
2568*5113495bSYour Name 		       dp_stats_buf->flush_cache_cmd);
2569*5113495bSYour Name 	DP_PRINT_STATS("update_mpduq_cmd = %u",
2570*5113495bSYour Name 		       dp_stats_buf->update_mpduq_cmd);
2571*5113495bSYour Name 	DP_PRINT_STATS("enqueue = %u",
2572*5113495bSYour Name 		       dp_stats_buf->enqueue);
2573*5113495bSYour Name 	DP_PRINT_STATS("enqueue_notify = %u",
2574*5113495bSYour Name 		       dp_stats_buf->enqueue_notify);
2575*5113495bSYour Name 	DP_PRINT_STATS("notify_mpdu_at_head = %u",
2576*5113495bSYour Name 		       dp_stats_buf->notify_mpdu_at_head);
2577*5113495bSYour Name 	DP_PRINT_STATS("notify_mpdu_state_valid = %u\n",
2578*5113495bSYour Name 		       dp_stats_buf->notify_mpdu_state_valid);
2579*5113495bSYour Name }
2580*5113495bSYour Name 
2581*5113495bSYour Name /**
2582*5113495bSYour Name  * dp_print_tx_tqm_cmn_stats_tlv() - display htt_tx_tqm_cmn_stats_tlv
2583*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_tqm_cmn_stats_tlv
2584*5113495bSYour Name  *
2585*5113495bSYour Name  * Return: void
2586*5113495bSYour Name  */
dp_print_tx_tqm_cmn_stats_tlv(uint32_t * tag_buf)2587*5113495bSYour Name static void dp_print_tx_tqm_cmn_stats_tlv(uint32_t *tag_buf)
2588*5113495bSYour Name {
2589*5113495bSYour Name 	htt_tx_tqm_cmn_stats_tlv *dp_stats_buf =
2590*5113495bSYour Name 		(htt_tx_tqm_cmn_stats_tlv *)tag_buf;
2591*5113495bSYour Name 
2592*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_TQM_CMN_STATS_TLV:");
2593*5113495bSYour Name 	DP_PRINT_STATS("mac_id__word = %u",
2594*5113495bSYour Name 		       dp_stats_buf->mac_id__word);
2595*5113495bSYour Name 	DP_PRINT_STATS("max_cmdq_id = %u",
2596*5113495bSYour Name 		       dp_stats_buf->max_cmdq_id);
2597*5113495bSYour Name 	DP_PRINT_STATS("list_mpdu_cnt_hist_intvl = %u",
2598*5113495bSYour Name 		       dp_stats_buf->list_mpdu_cnt_hist_intvl);
2599*5113495bSYour Name 	DP_PRINT_STATS("add_msdu = %u",
2600*5113495bSYour Name 		       dp_stats_buf->add_msdu);
2601*5113495bSYour Name 	DP_PRINT_STATS("q_empty = %u",
2602*5113495bSYour Name 		       dp_stats_buf->q_empty);
2603*5113495bSYour Name 	DP_PRINT_STATS("q_not_empty = %u",
2604*5113495bSYour Name 		       dp_stats_buf->q_not_empty);
2605*5113495bSYour Name 	DP_PRINT_STATS("drop_notification = %u",
2606*5113495bSYour Name 		       dp_stats_buf->drop_notification);
2607*5113495bSYour Name 	DP_PRINT_STATS("desc_threshold = %u\n",
2608*5113495bSYour Name 		       dp_stats_buf->desc_threshold);
2609*5113495bSYour Name }
2610*5113495bSYour Name 
2611*5113495bSYour Name /**
2612*5113495bSYour Name  * dp_print_tx_tqm_error_stats_tlv() - display htt_tx_tqm_error_stats_tlv
2613*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_tqm_error_stats_tlv
2614*5113495bSYour Name  *
2615*5113495bSYour Name  * Return: void
2616*5113495bSYour Name  */
dp_print_tx_tqm_error_stats_tlv(uint32_t * tag_buf)2617*5113495bSYour Name static void dp_print_tx_tqm_error_stats_tlv(uint32_t *tag_buf)
2618*5113495bSYour Name {
2619*5113495bSYour Name 	htt_tx_tqm_error_stats_tlv *dp_stats_buf =
2620*5113495bSYour Name 		(htt_tx_tqm_error_stats_tlv *)tag_buf;
2621*5113495bSYour Name 
2622*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_TQM_ERROR_STATS_TLV:");
2623*5113495bSYour Name 	DP_PRINT_STATS("q_empty_failure = %u",
2624*5113495bSYour Name 		       dp_stats_buf->q_empty_failure);
2625*5113495bSYour Name 	DP_PRINT_STATS("q_not_empty_failure = %u",
2626*5113495bSYour Name 		       dp_stats_buf->q_not_empty_failure);
2627*5113495bSYour Name 	DP_PRINT_STATS("add_msdu_failure = %u\n",
2628*5113495bSYour Name 		       dp_stats_buf->add_msdu_failure);
2629*5113495bSYour Name }
2630*5113495bSYour Name 
2631*5113495bSYour Name /**
2632*5113495bSYour Name  * dp_print_tx_tqm_cmdq_status_tlv() - display htt_tx_tqm_cmdq_status_tlv
2633*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_tqm_cmdq_status_tlv
2634*5113495bSYour Name  *
2635*5113495bSYour Name  * Return: void
2636*5113495bSYour Name  */
dp_print_tx_tqm_cmdq_status_tlv(uint32_t * tag_buf)2637*5113495bSYour Name static void dp_print_tx_tqm_cmdq_status_tlv(uint32_t *tag_buf)
2638*5113495bSYour Name {
2639*5113495bSYour Name 	htt_tx_tqm_cmdq_status_tlv *dp_stats_buf =
2640*5113495bSYour Name 		(htt_tx_tqm_cmdq_status_tlv *)tag_buf;
2641*5113495bSYour Name 
2642*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_TQM_CMDQ_STATUS_TLV:");
2643*5113495bSYour Name 	DP_PRINT_STATS("mac_id__cmdq_id__word = %u",
2644*5113495bSYour Name 		       dp_stats_buf->mac_id__cmdq_id__word);
2645*5113495bSYour Name 	DP_PRINT_STATS("sync_cmd = %u",
2646*5113495bSYour Name 		       dp_stats_buf->sync_cmd);
2647*5113495bSYour Name 	DP_PRINT_STATS("write_cmd = %u",
2648*5113495bSYour Name 		       dp_stats_buf->write_cmd);
2649*5113495bSYour Name 	DP_PRINT_STATS("gen_mpdu_cmd = %u",
2650*5113495bSYour Name 		       dp_stats_buf->gen_mpdu_cmd);
2651*5113495bSYour Name 	DP_PRINT_STATS("mpdu_queue_stats_cmd = %u",
2652*5113495bSYour Name 		       dp_stats_buf->mpdu_queue_stats_cmd);
2653*5113495bSYour Name 	DP_PRINT_STATS("mpdu_head_info_cmd = %u",
2654*5113495bSYour Name 		       dp_stats_buf->mpdu_head_info_cmd);
2655*5113495bSYour Name 	DP_PRINT_STATS("msdu_flow_stats_cmd = %u",
2656*5113495bSYour Name 		       dp_stats_buf->msdu_flow_stats_cmd);
2657*5113495bSYour Name 	DP_PRINT_STATS("remove_mpdu_cmd = %u",
2658*5113495bSYour Name 		       dp_stats_buf->remove_mpdu_cmd);
2659*5113495bSYour Name 	DP_PRINT_STATS("remove_msdu_cmd = %u",
2660*5113495bSYour Name 		       dp_stats_buf->remove_msdu_cmd);
2661*5113495bSYour Name 	DP_PRINT_STATS("flush_cache_cmd = %u",
2662*5113495bSYour Name 		       dp_stats_buf->flush_cache_cmd);
2663*5113495bSYour Name 	DP_PRINT_STATS("update_mpduq_cmd = %u",
2664*5113495bSYour Name 		       dp_stats_buf->update_mpduq_cmd);
2665*5113495bSYour Name 	DP_PRINT_STATS("update_msduq_cmd = %u\n",
2666*5113495bSYour Name 		       dp_stats_buf->update_msduq_cmd);
2667*5113495bSYour Name }
2668*5113495bSYour Name 
2669*5113495bSYour Name /**
2670*5113495bSYour Name  * dp_print_tx_de_eapol_packets_stats_tlv() - display htt_tx_de_eapol_packets_stats
2671*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_de_eapol_packets_stats_tlv
2672*5113495bSYour Name  *
2673*5113495bSYour Name  * Return: void
2674*5113495bSYour Name  */
dp_print_tx_de_eapol_packets_stats_tlv(uint32_t * tag_buf)2675*5113495bSYour Name static void dp_print_tx_de_eapol_packets_stats_tlv(uint32_t *tag_buf)
2676*5113495bSYour Name {
2677*5113495bSYour Name 	htt_tx_de_eapol_packets_stats_tlv *dp_stats_buf =
2678*5113495bSYour Name 		(htt_tx_de_eapol_packets_stats_tlv *)tag_buf;
2679*5113495bSYour Name 
2680*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_DE_EAPOL_PACKETS_STATS_TLV:");
2681*5113495bSYour Name 	DP_PRINT_STATS("m1_packets = %u",
2682*5113495bSYour Name 		       dp_stats_buf->m1_packets);
2683*5113495bSYour Name 	DP_PRINT_STATS("m2_packets = %u",
2684*5113495bSYour Name 		       dp_stats_buf->m2_packets);
2685*5113495bSYour Name 	DP_PRINT_STATS("m3_packets = %u",
2686*5113495bSYour Name 		       dp_stats_buf->m3_packets);
2687*5113495bSYour Name 	DP_PRINT_STATS("m4_packets = %u",
2688*5113495bSYour Name 		       dp_stats_buf->m4_packets);
2689*5113495bSYour Name 	DP_PRINT_STATS("g1_packets = %u",
2690*5113495bSYour Name 		       dp_stats_buf->g1_packets);
2691*5113495bSYour Name 	DP_PRINT_STATS("g2_packets = %u\n",
2692*5113495bSYour Name 		       dp_stats_buf->g2_packets);
2693*5113495bSYour Name }
2694*5113495bSYour Name 
2695*5113495bSYour Name /**
2696*5113495bSYour Name  * dp_print_tx_de_classify_failed_stats_tlv() - display
2697*5113495bSYour Name  *				htt_tx_de_classify_failed_stats_tlv
2698*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_de_classify_failed_stats_tlv
2699*5113495bSYour Name  *
2700*5113495bSYour Name  * Return: void
2701*5113495bSYour Name  */
dp_print_tx_de_classify_failed_stats_tlv(uint32_t * tag_buf)2702*5113495bSYour Name static void dp_print_tx_de_classify_failed_stats_tlv(uint32_t *tag_buf)
2703*5113495bSYour Name {
2704*5113495bSYour Name 	htt_tx_de_classify_failed_stats_tlv *dp_stats_buf =
2705*5113495bSYour Name 		(htt_tx_de_classify_failed_stats_tlv *)tag_buf;
2706*5113495bSYour Name 
2707*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_DE_CLASSIFY_FAILED_STATS_TLV:");
2708*5113495bSYour Name 	DP_PRINT_STATS("ap_bss_peer_not_found = %u",
2709*5113495bSYour Name 		       dp_stats_buf->ap_bss_peer_not_found);
2710*5113495bSYour Name 	DP_PRINT_STATS("ap_bcast_mcast_no_peer = %u",
2711*5113495bSYour Name 		       dp_stats_buf->ap_bcast_mcast_no_peer);
2712*5113495bSYour Name 	DP_PRINT_STATS("sta_delete_in_progress = %u",
2713*5113495bSYour Name 		       dp_stats_buf->sta_delete_in_progress);
2714*5113495bSYour Name 	DP_PRINT_STATS("ibss_no_bss_peer = %u",
2715*5113495bSYour Name 		       dp_stats_buf->ibss_no_bss_peer);
2716*5113495bSYour Name 	DP_PRINT_STATS("invaild_vdev_type = %u",
2717*5113495bSYour Name 		       dp_stats_buf->invaild_vdev_type);
2718*5113495bSYour Name 	DP_PRINT_STATS("invalid_ast_peer_entry = %u",
2719*5113495bSYour Name 		       dp_stats_buf->invalid_ast_peer_entry);
2720*5113495bSYour Name 	DP_PRINT_STATS("peer_entry_invalid = %u",
2721*5113495bSYour Name 		       dp_stats_buf->peer_entry_invalid);
2722*5113495bSYour Name 	DP_PRINT_STATS("ethertype_not_ip = %u",
2723*5113495bSYour Name 		       dp_stats_buf->ethertype_not_ip);
2724*5113495bSYour Name 	DP_PRINT_STATS("eapol_lookup_failed = %u",
2725*5113495bSYour Name 		       dp_stats_buf->eapol_lookup_failed);
2726*5113495bSYour Name 	DP_PRINT_STATS("qpeer_not_allow_data = %u",
2727*5113495bSYour Name 		       dp_stats_buf->qpeer_not_allow_data);
2728*5113495bSYour Name 	DP_PRINT_STATS("fse_tid_override = %u\n",
2729*5113495bSYour Name 		       dp_stats_buf->fse_tid_override);
2730*5113495bSYour Name }
2731*5113495bSYour Name 
2732*5113495bSYour Name /**
2733*5113495bSYour Name  * dp_print_tx_de_classify_stats_tlv() - display htt_tx_de_classify_stats_tlv
2734*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_de_classify_stats_tlv
2735*5113495bSYour Name  *
2736*5113495bSYour Name  * Return: void
2737*5113495bSYour Name  */
dp_print_tx_de_classify_stats_tlv(uint32_t * tag_buf)2738*5113495bSYour Name static void dp_print_tx_de_classify_stats_tlv(uint32_t *tag_buf)
2739*5113495bSYour Name {
2740*5113495bSYour Name 	htt_tx_de_classify_stats_tlv *dp_stats_buf =
2741*5113495bSYour Name 		(htt_tx_de_classify_stats_tlv *)tag_buf;
2742*5113495bSYour Name 
2743*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_DE_CLASSIFY_STATS_TLV:");
2744*5113495bSYour Name 	DP_PRINT_STATS("arp_packets = %u",
2745*5113495bSYour Name 		       dp_stats_buf->arp_packets);
2746*5113495bSYour Name 	DP_PRINT_STATS("igmp_packets = %u",
2747*5113495bSYour Name 		       dp_stats_buf->igmp_packets);
2748*5113495bSYour Name 	DP_PRINT_STATS("dhcp_packets = %u",
2749*5113495bSYour Name 		       dp_stats_buf->dhcp_packets);
2750*5113495bSYour Name 	DP_PRINT_STATS("host_inspected = %u",
2751*5113495bSYour Name 		       dp_stats_buf->host_inspected);
2752*5113495bSYour Name 	DP_PRINT_STATS("htt_included = %u",
2753*5113495bSYour Name 		       dp_stats_buf->htt_included);
2754*5113495bSYour Name 	DP_PRINT_STATS("htt_valid_mcs = %u",
2755*5113495bSYour Name 		       dp_stats_buf->htt_valid_mcs);
2756*5113495bSYour Name 	DP_PRINT_STATS("htt_valid_nss = %u",
2757*5113495bSYour Name 		       dp_stats_buf->htt_valid_nss);
2758*5113495bSYour Name 	DP_PRINT_STATS("htt_valid_preamble_type = %u",
2759*5113495bSYour Name 		       dp_stats_buf->htt_valid_preamble_type);
2760*5113495bSYour Name 	DP_PRINT_STATS("htt_valid_chainmask = %u",
2761*5113495bSYour Name 		       dp_stats_buf->htt_valid_chainmask);
2762*5113495bSYour Name 	DP_PRINT_STATS("htt_valid_guard_interval = %u",
2763*5113495bSYour Name 		       dp_stats_buf->htt_valid_guard_interval);
2764*5113495bSYour Name 	DP_PRINT_STATS("htt_valid_retries = %u",
2765*5113495bSYour Name 		       dp_stats_buf->htt_valid_retries);
2766*5113495bSYour Name 	DP_PRINT_STATS("htt_valid_bw_info = %u",
2767*5113495bSYour Name 		       dp_stats_buf->htt_valid_bw_info);
2768*5113495bSYour Name 	DP_PRINT_STATS("htt_valid_power = %u",
2769*5113495bSYour Name 		       dp_stats_buf->htt_valid_power);
2770*5113495bSYour Name 	DP_PRINT_STATS("htt_valid_key_flags = %u",
2771*5113495bSYour Name 		       dp_stats_buf->htt_valid_key_flags);
2772*5113495bSYour Name 	DP_PRINT_STATS("htt_valid_no_encryption = %u",
2773*5113495bSYour Name 		       dp_stats_buf->htt_valid_no_encryption);
2774*5113495bSYour Name 	DP_PRINT_STATS("fse_entry_count = %u",
2775*5113495bSYour Name 		       dp_stats_buf->fse_entry_count);
2776*5113495bSYour Name 	DP_PRINT_STATS("fse_priority_be = %u",
2777*5113495bSYour Name 		       dp_stats_buf->fse_priority_be);
2778*5113495bSYour Name 	DP_PRINT_STATS("fse_priority_high = %u",
2779*5113495bSYour Name 		       dp_stats_buf->fse_priority_high);
2780*5113495bSYour Name 	DP_PRINT_STATS("fse_priority_low = %u",
2781*5113495bSYour Name 		       dp_stats_buf->fse_priority_low);
2782*5113495bSYour Name 	DP_PRINT_STATS("fse_traffic_ptrn_be = %u",
2783*5113495bSYour Name 		       dp_stats_buf->fse_traffic_ptrn_be);
2784*5113495bSYour Name 	DP_PRINT_STATS("fse_traffic_ptrn_over_sub = %u",
2785*5113495bSYour Name 		       dp_stats_buf->fse_traffic_ptrn_over_sub);
2786*5113495bSYour Name 	DP_PRINT_STATS("fse_traffic_ptrn_bursty = %u",
2787*5113495bSYour Name 		       dp_stats_buf->fse_traffic_ptrn_bursty);
2788*5113495bSYour Name 	DP_PRINT_STATS("fse_traffic_ptrn_interactive = %u",
2789*5113495bSYour Name 		       dp_stats_buf->fse_traffic_ptrn_interactive);
2790*5113495bSYour Name 	DP_PRINT_STATS("fse_traffic_ptrn_periodic = %u",
2791*5113495bSYour Name 		       dp_stats_buf->fse_traffic_ptrn_periodic);
2792*5113495bSYour Name 	DP_PRINT_STATS("fse_hwqueue_alloc = %u",
2793*5113495bSYour Name 		       dp_stats_buf->fse_hwqueue_alloc);
2794*5113495bSYour Name 	DP_PRINT_STATS("fse_hwqueue_created = %u",
2795*5113495bSYour Name 		       dp_stats_buf->fse_hwqueue_created);
2796*5113495bSYour Name 	DP_PRINT_STATS("fse_hwqueue_send_to_host = %u",
2797*5113495bSYour Name 		       dp_stats_buf->fse_hwqueue_send_to_host);
2798*5113495bSYour Name 	DP_PRINT_STATS("mcast_entry = %u",
2799*5113495bSYour Name 		       dp_stats_buf->mcast_entry);
2800*5113495bSYour Name 	DP_PRINT_STATS("bcast_entry = %u\n",
2801*5113495bSYour Name 		       dp_stats_buf->bcast_entry);
2802*5113495bSYour Name }
2803*5113495bSYour Name 
2804*5113495bSYour Name /**
2805*5113495bSYour Name  * dp_print_tx_de_classify_status_stats_tlv() - display
2806*5113495bSYour Name  *				htt_tx_de_classify_status_stats_tlv
2807*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_de_classify_status_stats_tlv
2808*5113495bSYour Name  *
2809*5113495bSYour Name  * Return: void
2810*5113495bSYour Name  */
dp_print_tx_de_classify_status_stats_tlv(uint32_t * tag_buf)2811*5113495bSYour Name static void dp_print_tx_de_classify_status_stats_tlv(uint32_t *tag_buf)
2812*5113495bSYour Name {
2813*5113495bSYour Name 	htt_tx_de_classify_status_stats_tlv *dp_stats_buf =
2814*5113495bSYour Name 		(htt_tx_de_classify_status_stats_tlv *)tag_buf;
2815*5113495bSYour Name 
2816*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_DE_CLASSIFY_STATUS_STATS_TLV:");
2817*5113495bSYour Name 	DP_PRINT_STATS("eok = %u",
2818*5113495bSYour Name 		       dp_stats_buf->eok);
2819*5113495bSYour Name 	DP_PRINT_STATS("classify_done = %u",
2820*5113495bSYour Name 		       dp_stats_buf->classify_done);
2821*5113495bSYour Name 	DP_PRINT_STATS("lookup_failed = %u",
2822*5113495bSYour Name 		       dp_stats_buf->lookup_failed);
2823*5113495bSYour Name 	DP_PRINT_STATS("send_host_dhcp = %u",
2824*5113495bSYour Name 		       dp_stats_buf->send_host_dhcp);
2825*5113495bSYour Name 	DP_PRINT_STATS("send_host_mcast = %u",
2826*5113495bSYour Name 		       dp_stats_buf->send_host_mcast);
2827*5113495bSYour Name 	DP_PRINT_STATS("send_host_unknown_dest = %u",
2828*5113495bSYour Name 		       dp_stats_buf->send_host_unknown_dest);
2829*5113495bSYour Name 	DP_PRINT_STATS("send_host = %u",
2830*5113495bSYour Name 		       dp_stats_buf->send_host);
2831*5113495bSYour Name 	DP_PRINT_STATS("status_invalid = %u\n",
2832*5113495bSYour Name 		       dp_stats_buf->status_invalid);
2833*5113495bSYour Name }
2834*5113495bSYour Name 
2835*5113495bSYour Name /**
2836*5113495bSYour Name  * dp_print_tx_de_enqueue_packets_stats_tlv() - display
2837*5113495bSYour Name  *				htt_tx_de_enqueue_packets_stats_tlv
2838*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_de_enqueue_packets_stats_tlv
2839*5113495bSYour Name  *
2840*5113495bSYour Name  * Return: void
2841*5113495bSYour Name  */
dp_print_tx_de_enqueue_packets_stats_tlv(uint32_t * tag_buf)2842*5113495bSYour Name static void dp_print_tx_de_enqueue_packets_stats_tlv(uint32_t *tag_buf)
2843*5113495bSYour Name {
2844*5113495bSYour Name 	htt_tx_de_enqueue_packets_stats_tlv *dp_stats_buf =
2845*5113495bSYour Name 		(htt_tx_de_enqueue_packets_stats_tlv *)tag_buf;
2846*5113495bSYour Name 
2847*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_DE_ENQUEUE_PACKETS_STATS_TLV:");
2848*5113495bSYour Name 	DP_PRINT_STATS("enqueued_pkts = %u",
2849*5113495bSYour Name 		       dp_stats_buf->enqueued_pkts);
2850*5113495bSYour Name 	DP_PRINT_STATS("to_tqm = %u",
2851*5113495bSYour Name 		       dp_stats_buf->to_tqm);
2852*5113495bSYour Name 	DP_PRINT_STATS("to_tqm_bypass = %u\n",
2853*5113495bSYour Name 		       dp_stats_buf->to_tqm_bypass);
2854*5113495bSYour Name }
2855*5113495bSYour Name 
2856*5113495bSYour Name /**
2857*5113495bSYour Name  * dp_print_tx_de_enqueue_discard_stats_tlv() - display
2858*5113495bSYour Name  *					htt_tx_de_enqueue_discard_stats_tlv
2859*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_de_enqueue_discard_stats_tlv
2860*5113495bSYour Name  *
2861*5113495bSYour Name  * Return: void
2862*5113495bSYour Name  */
dp_print_tx_de_enqueue_discard_stats_tlv(uint32_t * tag_buf)2863*5113495bSYour Name static void dp_print_tx_de_enqueue_discard_stats_tlv(uint32_t *tag_buf)
2864*5113495bSYour Name {
2865*5113495bSYour Name 	htt_tx_de_enqueue_discard_stats_tlv *dp_stats_buf =
2866*5113495bSYour Name 		(htt_tx_de_enqueue_discard_stats_tlv *)tag_buf;
2867*5113495bSYour Name 
2868*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_DE_ENQUEUE_DISCARD_STATS_TLV:");
2869*5113495bSYour Name 	DP_PRINT_STATS("discarded_pkts = %u",
2870*5113495bSYour Name 		       dp_stats_buf->discarded_pkts);
2871*5113495bSYour Name 	DP_PRINT_STATS("local_frames = %u",
2872*5113495bSYour Name 		       dp_stats_buf->local_frames);
2873*5113495bSYour Name 	DP_PRINT_STATS("is_ext_msdu = %u\n",
2874*5113495bSYour Name 		       dp_stats_buf->is_ext_msdu);
2875*5113495bSYour Name }
2876*5113495bSYour Name 
2877*5113495bSYour Name /**
2878*5113495bSYour Name  * dp_print_tx_de_compl_stats_tlv() - display htt_tx_de_compl_stats_tlv
2879*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_de_compl_stats_tlv
2880*5113495bSYour Name  *
2881*5113495bSYour Name  * Return: void
2882*5113495bSYour Name  */
dp_print_tx_de_compl_stats_tlv(uint32_t * tag_buf)2883*5113495bSYour Name static void dp_print_tx_de_compl_stats_tlv(uint32_t *tag_buf)
2884*5113495bSYour Name {
2885*5113495bSYour Name 	htt_tx_de_compl_stats_tlv *dp_stats_buf =
2886*5113495bSYour Name 		(htt_tx_de_compl_stats_tlv *)tag_buf;
2887*5113495bSYour Name 
2888*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_DE_COMPL_STATS_TLV:");
2889*5113495bSYour Name 	DP_PRINT_STATS("tcl_dummy_frame = %u",
2890*5113495bSYour Name 		       dp_stats_buf->tcl_dummy_frame);
2891*5113495bSYour Name 	DP_PRINT_STATS("tqm_dummy_frame = %u",
2892*5113495bSYour Name 		       dp_stats_buf->tqm_dummy_frame);
2893*5113495bSYour Name 	DP_PRINT_STATS("tqm_notify_frame = %u",
2894*5113495bSYour Name 		       dp_stats_buf->tqm_notify_frame);
2895*5113495bSYour Name 	DP_PRINT_STATS("fw2wbm_enq = %u",
2896*5113495bSYour Name 		       dp_stats_buf->fw2wbm_enq);
2897*5113495bSYour Name 	DP_PRINT_STATS("tqm_bypass_frame = %u\n",
2898*5113495bSYour Name 		       dp_stats_buf->tqm_bypass_frame);
2899*5113495bSYour Name }
2900*5113495bSYour Name 
2901*5113495bSYour Name /**
2902*5113495bSYour Name  * dp_print_tx_de_cmn_stats_tlv() - display htt_tx_de_cmn_stats_tlv
2903*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_de_cmn_stats_tlv
2904*5113495bSYour Name  *
2905*5113495bSYour Name  * Return: void
2906*5113495bSYour Name  */
dp_print_tx_de_cmn_stats_tlv(uint32_t * tag_buf)2907*5113495bSYour Name static void dp_print_tx_de_cmn_stats_tlv(uint32_t *tag_buf)
2908*5113495bSYour Name {
2909*5113495bSYour Name 	htt_tx_de_cmn_stats_tlv *dp_stats_buf =
2910*5113495bSYour Name 		(htt_tx_de_cmn_stats_tlv *)tag_buf;
2911*5113495bSYour Name 
2912*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_DE_CMN_STATS_TLV:");
2913*5113495bSYour Name 	DP_PRINT_STATS("mac_id__word = %u",
2914*5113495bSYour Name 		       dp_stats_buf->mac_id__word);
2915*5113495bSYour Name 	DP_PRINT_STATS("tcl2fw_entry_count = %u",
2916*5113495bSYour Name 		       dp_stats_buf->tcl2fw_entry_count);
2917*5113495bSYour Name 	DP_PRINT_STATS("not_to_fw = %u",
2918*5113495bSYour Name 		       dp_stats_buf->not_to_fw);
2919*5113495bSYour Name 	DP_PRINT_STATS("invalid_pdev_vdev_peer = %u",
2920*5113495bSYour Name 		       dp_stats_buf->invalid_pdev_vdev_peer);
2921*5113495bSYour Name 	DP_PRINT_STATS("tcl_res_invalid_addrx = %u",
2922*5113495bSYour Name 		       dp_stats_buf->tcl_res_invalid_addrx);
2923*5113495bSYour Name 	DP_PRINT_STATS("wbm2fw_entry_count = %u",
2924*5113495bSYour Name 		       dp_stats_buf->wbm2fw_entry_count);
2925*5113495bSYour Name 	DP_PRINT_STATS("invalid_pdev = %u\n",
2926*5113495bSYour Name 		       dp_stats_buf->invalid_pdev);
2927*5113495bSYour Name }
2928*5113495bSYour Name 
2929*5113495bSYour Name /**
2930*5113495bSYour Name  * dp_print_ring_if_stats_tlv() - display htt_ring_if_stats_tlv
2931*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_ring_if_stats_tlv
2932*5113495bSYour Name  *
2933*5113495bSYour Name  * Return: void
2934*5113495bSYour Name  */
dp_print_ring_if_stats_tlv(uint32_t * tag_buf)2935*5113495bSYour Name static void dp_print_ring_if_stats_tlv(uint32_t *tag_buf)
2936*5113495bSYour Name {
2937*5113495bSYour Name 	htt_ring_if_stats_tlv *dp_stats_buf =
2938*5113495bSYour Name 		(htt_ring_if_stats_tlv *)tag_buf;
2939*5113495bSYour Name 	uint8_t i;
2940*5113495bSYour Name 	uint16_t index = 0;
2941*5113495bSYour Name 	char *wm_hit_count = qdf_mem_malloc(DP_MAX_STRING_LEN);
2942*5113495bSYour Name 
2943*5113495bSYour Name 	if (!wm_hit_count) {
2944*5113495bSYour Name 		dp_stats_err("Output buffer not allocated");
2945*5113495bSYour Name 		return;
2946*5113495bSYour Name 	}
2947*5113495bSYour Name 
2948*5113495bSYour Name 	DP_PRINT_STATS("HTT_RING_IF_STATS_TLV:");
2949*5113495bSYour Name 	DP_PRINT_STATS("base_addr = %u",
2950*5113495bSYour Name 		       dp_stats_buf->base_addr);
2951*5113495bSYour Name 	DP_PRINT_STATS("elem_size = %u",
2952*5113495bSYour Name 		       dp_stats_buf->elem_size);
2953*5113495bSYour Name 	DP_PRINT_STATS("num_elems__prefetch_tail_idx = %u",
2954*5113495bSYour Name 		       dp_stats_buf->num_elems__prefetch_tail_idx);
2955*5113495bSYour Name 	DP_PRINT_STATS("head_idx__tail_idx = %u",
2956*5113495bSYour Name 		       dp_stats_buf->head_idx__tail_idx);
2957*5113495bSYour Name 	DP_PRINT_STATS("shadow_head_idx__shadow_tail_idx = %u",
2958*5113495bSYour Name 		       dp_stats_buf->shadow_head_idx__shadow_tail_idx);
2959*5113495bSYour Name 	DP_PRINT_STATS("num_tail_incr = %u",
2960*5113495bSYour Name 		       dp_stats_buf->num_tail_incr);
2961*5113495bSYour Name 	DP_PRINT_STATS("lwm_thresh__hwm_thresh = %u",
2962*5113495bSYour Name 		       dp_stats_buf->lwm_thresh__hwm_thresh);
2963*5113495bSYour Name 	DP_PRINT_STATS("overrun_hit_count = %u",
2964*5113495bSYour Name 		       dp_stats_buf->overrun_hit_count);
2965*5113495bSYour Name 	DP_PRINT_STATS("underrun_hit_count = %u",
2966*5113495bSYour Name 		       dp_stats_buf->underrun_hit_count);
2967*5113495bSYour Name 	DP_PRINT_STATS("prod_blockwait_count = %u",
2968*5113495bSYour Name 		       dp_stats_buf->prod_blockwait_count);
2969*5113495bSYour Name 	DP_PRINT_STATS("cons_blockwait_count = %u",
2970*5113495bSYour Name 		       dp_stats_buf->cons_blockwait_count);
2971*5113495bSYour Name 
2972*5113495bSYour Name 	for (i = 0; i <  DP_HTT_LOW_WM_HIT_COUNT_LEN; i++) {
2973*5113495bSYour Name 		index += qdf_snprint(&wm_hit_count[index],
2974*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
2975*5113495bSYour Name 				" %u:%u,", i,
2976*5113495bSYour Name 				dp_stats_buf->low_wm_hit_count[i]);
2977*5113495bSYour Name 	}
2978*5113495bSYour Name 	DP_PRINT_STATS("low_wm_hit_count = %s ", wm_hit_count);
2979*5113495bSYour Name 
2980*5113495bSYour Name 	qdf_mem_zero(wm_hit_count, DP_MAX_STRING_LEN);
2981*5113495bSYour Name 
2982*5113495bSYour Name 	index = 0;
2983*5113495bSYour Name 	for (i = 0; i <  DP_HTT_HIGH_WM_HIT_COUNT_LEN; i++) {
2984*5113495bSYour Name 		index += qdf_snprint(&wm_hit_count[index],
2985*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
2986*5113495bSYour Name 				" %u:%u,", i,
2987*5113495bSYour Name 				dp_stats_buf->high_wm_hit_count[i]);
2988*5113495bSYour Name 	}
2989*5113495bSYour Name 	DP_PRINT_STATS("high_wm_hit_count = %s\n", wm_hit_count);
2990*5113495bSYour Name 	qdf_mem_free(wm_hit_count);
2991*5113495bSYour Name }
2992*5113495bSYour Name 
2993*5113495bSYour Name /**
2994*5113495bSYour Name  * dp_print_ring_if_cmn_tlv() - display htt_ring_if_cmn_tlv
2995*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_ring_if_cmn_tlv
2996*5113495bSYour Name  *
2997*5113495bSYour Name  * Return: void
2998*5113495bSYour Name  */
dp_print_ring_if_cmn_tlv(uint32_t * tag_buf)2999*5113495bSYour Name static void dp_print_ring_if_cmn_tlv(uint32_t *tag_buf)
3000*5113495bSYour Name {
3001*5113495bSYour Name 	htt_ring_if_cmn_tlv *dp_stats_buf =
3002*5113495bSYour Name 		(htt_ring_if_cmn_tlv *)tag_buf;
3003*5113495bSYour Name 
3004*5113495bSYour Name 	DP_PRINT_STATS("HTT_RING_IF_CMN_TLV:");
3005*5113495bSYour Name 	DP_PRINT_STATS("mac_id__word = %u",
3006*5113495bSYour Name 		       dp_stats_buf->mac_id__word);
3007*5113495bSYour Name 	DP_PRINT_STATS("num_records = %u\n",
3008*5113495bSYour Name 		       dp_stats_buf->num_records);
3009*5113495bSYour Name }
3010*5113495bSYour Name 
3011*5113495bSYour Name /**
3012*5113495bSYour Name  * dp_print_sfm_client_user_tlv_v() - display htt_sfm_client_user_tlv_v
3013*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_sfm_client_user_tlv_v
3014*5113495bSYour Name  *
3015*5113495bSYour Name  * Return: void
3016*5113495bSYour Name  */
dp_print_sfm_client_user_tlv_v(uint32_t * tag_buf)3017*5113495bSYour Name static void dp_print_sfm_client_user_tlv_v(uint32_t *tag_buf)
3018*5113495bSYour Name {
3019*5113495bSYour Name 	htt_sfm_client_user_tlv_v *dp_stats_buf =
3020*5113495bSYour Name 		(htt_sfm_client_user_tlv_v *)tag_buf;
3021*5113495bSYour Name 	uint8_t i;
3022*5113495bSYour Name 	uint16_t index = 0;
3023*5113495bSYour Name 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
3024*5113495bSYour Name 	char *dwords_used_by_user_n = qdf_mem_malloc(DP_MAX_STRING_LEN);
3025*5113495bSYour Name 
3026*5113495bSYour Name 	if (!dwords_used_by_user_n) {
3027*5113495bSYour Name 		dp_stats_err("Output buffer not allocated");
3028*5113495bSYour Name 		return;
3029*5113495bSYour Name 	}
3030*5113495bSYour Name 
3031*5113495bSYour Name 	DP_PRINT_STATS("HTT_SFM_CLIENT_USER_TLV_V:");
3032*5113495bSYour Name 	for (i = 0; i <  tag_len; i++) {
3033*5113495bSYour Name 		index += qdf_snprint(&dwords_used_by_user_n[index],
3034*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
3035*5113495bSYour Name 				" %u:%u,", i,
3036*5113495bSYour Name 				dp_stats_buf->dwords_used_by_user_n[i]);
3037*5113495bSYour Name 	}
3038*5113495bSYour Name 	DP_PRINT_STATS("dwords_used_by_user_n = %s\n",
3039*5113495bSYour Name 		       dwords_used_by_user_n);
3040*5113495bSYour Name 	qdf_mem_free(dwords_used_by_user_n);
3041*5113495bSYour Name }
3042*5113495bSYour Name 
3043*5113495bSYour Name /**
3044*5113495bSYour Name  * dp_print_sfm_client_tlv() - display htt_sfm_client_tlv
3045*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_sfm_client_tlv
3046*5113495bSYour Name  *
3047*5113495bSYour Name  * Return: void
3048*5113495bSYour Name  */
dp_print_sfm_client_tlv(uint32_t * tag_buf)3049*5113495bSYour Name static void dp_print_sfm_client_tlv(uint32_t *tag_buf)
3050*5113495bSYour Name {
3051*5113495bSYour Name 	htt_sfm_client_tlv *dp_stats_buf =
3052*5113495bSYour Name 		(htt_sfm_client_tlv *)tag_buf;
3053*5113495bSYour Name 
3054*5113495bSYour Name 	DP_PRINT_STATS("HTT_SFM_CLIENT_TLV:");
3055*5113495bSYour Name 	DP_PRINT_STATS("client_id = %u",
3056*5113495bSYour Name 		       dp_stats_buf->client_id);
3057*5113495bSYour Name 	DP_PRINT_STATS("buf_min = %u",
3058*5113495bSYour Name 		       dp_stats_buf->buf_min);
3059*5113495bSYour Name 	DP_PRINT_STATS("buf_max = %u",
3060*5113495bSYour Name 		       dp_stats_buf->buf_max);
3061*5113495bSYour Name 	DP_PRINT_STATS("buf_busy = %u",
3062*5113495bSYour Name 		       dp_stats_buf->buf_busy);
3063*5113495bSYour Name 	DP_PRINT_STATS("buf_alloc = %u",
3064*5113495bSYour Name 		       dp_stats_buf->buf_alloc);
3065*5113495bSYour Name 	DP_PRINT_STATS("buf_avail = %u",
3066*5113495bSYour Name 		       dp_stats_buf->buf_avail);
3067*5113495bSYour Name 	DP_PRINT_STATS("num_users = %u\n",
3068*5113495bSYour Name 		       dp_stats_buf->num_users);
3069*5113495bSYour Name }
3070*5113495bSYour Name 
3071*5113495bSYour Name /**
3072*5113495bSYour Name  * dp_print_sfm_cmn_tlv() - display htt_sfm_cmn_tlv
3073*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_sfm_cmn_tlv
3074*5113495bSYour Name  *
3075*5113495bSYour Name  * Return: void
3076*5113495bSYour Name  */
dp_print_sfm_cmn_tlv(uint32_t * tag_buf)3077*5113495bSYour Name static void dp_print_sfm_cmn_tlv(uint32_t *tag_buf)
3078*5113495bSYour Name {
3079*5113495bSYour Name 	htt_sfm_cmn_tlv *dp_stats_buf =
3080*5113495bSYour Name 		(htt_sfm_cmn_tlv *)tag_buf;
3081*5113495bSYour Name 
3082*5113495bSYour Name 	DP_PRINT_STATS("HTT_SFM_CMN_TLV:");
3083*5113495bSYour Name 	DP_PRINT_STATS("mac_id__word = %u",
3084*5113495bSYour Name 		       dp_stats_buf->mac_id__word);
3085*5113495bSYour Name 	DP_PRINT_STATS("buf_total = %u",
3086*5113495bSYour Name 		       dp_stats_buf->buf_total);
3087*5113495bSYour Name 	DP_PRINT_STATS("mem_empty = %u",
3088*5113495bSYour Name 		       dp_stats_buf->mem_empty);
3089*5113495bSYour Name 	DP_PRINT_STATS("deallocate_bufs = %u",
3090*5113495bSYour Name 		       dp_stats_buf->deallocate_bufs);
3091*5113495bSYour Name 	DP_PRINT_STATS("num_records = %u\n",
3092*5113495bSYour Name 		       dp_stats_buf->num_records);
3093*5113495bSYour Name }
3094*5113495bSYour Name 
3095*5113495bSYour Name /**
3096*5113495bSYour Name  * dp_print_sring_stats_tlv() - display htt_sring_stats_tlv
3097*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_sring_stats_tlv
3098*5113495bSYour Name  *
3099*5113495bSYour Name  * Return: void
3100*5113495bSYour Name  */
dp_print_sring_stats_tlv(uint32_t * tag_buf)3101*5113495bSYour Name static void dp_print_sring_stats_tlv(uint32_t *tag_buf)
3102*5113495bSYour Name {
3103*5113495bSYour Name 	htt_sring_stats_tlv *dp_stats_buf =
3104*5113495bSYour Name 		(htt_sring_stats_tlv *)tag_buf;
3105*5113495bSYour Name 
3106*5113495bSYour Name 	DP_PRINT_STATS("HTT_SRING_STATS_TLV:");
3107*5113495bSYour Name 	DP_PRINT_STATS("mac_id__ring_id__arena__ep = %u",
3108*5113495bSYour Name 		       dp_stats_buf->mac_id__ring_id__arena__ep);
3109*5113495bSYour Name 	DP_PRINT_STATS("base_addr_lsb = %u",
3110*5113495bSYour Name 		       dp_stats_buf->base_addr_lsb);
3111*5113495bSYour Name 	DP_PRINT_STATS("base_addr_msb = %u",
3112*5113495bSYour Name 		       dp_stats_buf->base_addr_msb);
3113*5113495bSYour Name 	DP_PRINT_STATS("ring_size = %u",
3114*5113495bSYour Name 		       dp_stats_buf->ring_size);
3115*5113495bSYour Name 	DP_PRINT_STATS("elem_size = %u",
3116*5113495bSYour Name 		       dp_stats_buf->elem_size);
3117*5113495bSYour Name 	DP_PRINT_STATS("num_avail_words__num_valid_words = %u",
3118*5113495bSYour Name 		       dp_stats_buf->num_avail_words__num_valid_words);
3119*5113495bSYour Name 	DP_PRINT_STATS("head_ptr__tail_ptr = %u",
3120*5113495bSYour Name 		       dp_stats_buf->head_ptr__tail_ptr);
3121*5113495bSYour Name 	DP_PRINT_STATS("consumer_empty__producer_full = %u",
3122*5113495bSYour Name 		       dp_stats_buf->consumer_empty__producer_full);
3123*5113495bSYour Name 	DP_PRINT_STATS("prefetch_count__internal_tail_ptr = %u\n",
3124*5113495bSYour Name 		       dp_stats_buf->prefetch_count__internal_tail_ptr);
3125*5113495bSYour Name }
3126*5113495bSYour Name 
3127*5113495bSYour Name /**
3128*5113495bSYour Name  * dp_print_sring_cmn_tlv() - display htt_sring_cmn_tlv
3129*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_sring_cmn_tlv
3130*5113495bSYour Name  *
3131*5113495bSYour Name  * Return: void
3132*5113495bSYour Name  */
dp_print_sring_cmn_tlv(uint32_t * tag_buf)3133*5113495bSYour Name static void dp_print_sring_cmn_tlv(uint32_t *tag_buf)
3134*5113495bSYour Name {
3135*5113495bSYour Name 	htt_sring_cmn_tlv *dp_stats_buf =
3136*5113495bSYour Name 		(htt_sring_cmn_tlv *)tag_buf;
3137*5113495bSYour Name 
3138*5113495bSYour Name 	DP_PRINT_STATS("HTT_SRING_CMN_TLV:");
3139*5113495bSYour Name 	DP_PRINT_STATS("num_records = %u\n",
3140*5113495bSYour Name 		       dp_stats_buf->num_records);
3141*5113495bSYour Name }
3142*5113495bSYour Name 
3143*5113495bSYour Name /**
3144*5113495bSYour Name  * dp_print_tx_pdev_rate_stats_tlv() - display htt_tx_pdev_rate_stats_tlv
3145*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_tx_pdev_rate_stats_tlv
3146*5113495bSYour Name  *
3147*5113495bSYour Name  * Return: void
3148*5113495bSYour Name  */
dp_print_tx_pdev_rate_stats_tlv(uint32_t * tag_buf)3149*5113495bSYour Name static void dp_print_tx_pdev_rate_stats_tlv(uint32_t *tag_buf)
3150*5113495bSYour Name {
3151*5113495bSYour Name 	htt_tx_pdev_rate_stats_tlv *dp_stats_buf =
3152*5113495bSYour Name 		(htt_tx_pdev_rate_stats_tlv *)tag_buf;
3153*5113495bSYour Name 	uint8_t i, j;
3154*5113495bSYour Name 	uint16_t index = 0;
3155*5113495bSYour Name 	char *tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0};
3156*5113495bSYour Name 	char *tx_gi_ext[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0};
3157*5113495bSYour Name 	char *ac_mu_mimo_tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0};
3158*5113495bSYour Name 	char *ax_mu_mimo_tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0};
3159*5113495bSYour Name 	char *ofdma_tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0};
3160*5113495bSYour Name 	char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
3161*5113495bSYour Name 
3162*5113495bSYour Name 	if (!str_buf) {
3163*5113495bSYour Name 		dp_err("Output buffer not allocated");
3164*5113495bSYour Name 		return;
3165*5113495bSYour Name 	}
3166*5113495bSYour Name 
3167*5113495bSYour Name 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
3168*5113495bSYour Name 		tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
3169*5113495bSYour Name 		tx_gi_ext[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
3170*5113495bSYour Name 		if (!tx_gi[i] || !tx_gi_ext[i]) {
3171*5113495bSYour Name 			dp_err("Unable to allocate buffer for tx_gi");
3172*5113495bSYour Name 			goto fail1;
3173*5113495bSYour Name 		}
3174*5113495bSYour Name 		ac_mu_mimo_tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
3175*5113495bSYour Name 		if (!ac_mu_mimo_tx_gi[i]) {
3176*5113495bSYour Name 			dp_err("Unable to allocate buffer for ac_mu_mimo_tx_gi");
3177*5113495bSYour Name 			goto fail1;
3178*5113495bSYour Name 		}
3179*5113495bSYour Name 		ax_mu_mimo_tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
3180*5113495bSYour Name 		if (!ax_mu_mimo_tx_gi[i]) {
3181*5113495bSYour Name 			dp_err("Unable to allocate buffer for ax_mu_mimo_tx_gi");
3182*5113495bSYour Name 			goto fail1;
3183*5113495bSYour Name 		}
3184*5113495bSYour Name 		ofdma_tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
3185*5113495bSYour Name 		if (!ofdma_tx_gi[i]) {
3186*5113495bSYour Name 			dp_err("Unable to allocate buffer for ofdma_tx_gi");
3187*5113495bSYour Name 			goto fail1;
3188*5113495bSYour Name 		}
3189*5113495bSYour Name 	}
3190*5113495bSYour Name 
3191*5113495bSYour Name 	DP_PRINT_STATS("HTT_TX_PDEV_RATE_STATS_TLV:");
3192*5113495bSYour Name 	DP_PRINT_STATS("mac_id__word = %u",
3193*5113495bSYour Name 		       dp_stats_buf->mac_id__word);
3194*5113495bSYour Name 	DP_PRINT_STATS("tx_ldpc = %u",
3195*5113495bSYour Name 		       dp_stats_buf->tx_ldpc);
3196*5113495bSYour Name 	DP_PRINT_STATS("rts_cnt = %u",
3197*5113495bSYour Name 		       dp_stats_buf->rts_cnt);
3198*5113495bSYour Name 	DP_PRINT_STATS("rts_success = %u",
3199*5113495bSYour Name 		       dp_stats_buf->rts_success);
3200*5113495bSYour Name 
3201*5113495bSYour Name 	DP_PRINT_STATS("ack_rssi = %u",
3202*5113495bSYour Name 		       dp_stats_buf->ack_rssi);
3203*5113495bSYour Name 
3204*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3205*5113495bSYour Name 	for (i = 0; i <  DP_HTT_TX_MCS_LEN; i++) {
3206*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3207*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
3208*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->tx_mcs[i]);
3209*5113495bSYour Name 	}
3210*5113495bSYour Name 
3211*5113495bSYour Name 	for (i = 0; i <  DP_HTT_TX_MCS_EXT_LEN; i++) {
3212*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3213*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
3214*5113495bSYour Name 				" %u:%u,", i + DP_HTT_TX_MCS_LEN,
3215*5113495bSYour Name 				dp_stats_buf->tx_mcs_ext[i]);
3216*5113495bSYour Name 	}
3217*5113495bSYour Name 
3218*5113495bSYour Name 	for (i = 0; i <  DP_HTT_TX_MCS_EXT2_LEN; i++) {
3219*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3220*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
3221*5113495bSYour Name 				" %u:%u,", i + DP_HTT_TX_MCS_LEN +
3222*5113495bSYour Name 				DP_HTT_TX_MCS_EXT_LEN,
3223*5113495bSYour Name 				dp_stats_buf->tx_mcs_ext_2[i]);
3224*5113495bSYour Name 	}
3225*5113495bSYour Name 	DP_PRINT_STATS("tx_mcs = %s ", str_buf);
3226*5113495bSYour Name 
3227*5113495bSYour Name 	index = 0;
3228*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3229*5113495bSYour Name 	for (i = 0; i <  DP_HTT_TX_SU_MCS_LEN; i++) {
3230*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3231*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
3232*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->tx_su_mcs[i]);
3233*5113495bSYour Name 	}
3234*5113495bSYour Name 	DP_PRINT_STATS("tx_su_mcs = %s ", str_buf);
3235*5113495bSYour Name 
3236*5113495bSYour Name 	index = 0;
3237*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3238*5113495bSYour Name 	for (i = 0; i <  DP_HTT_TX_MU_MCS_LEN; i++) {
3239*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3240*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
3241*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->tx_mu_mcs[i]);
3242*5113495bSYour Name 	}
3243*5113495bSYour Name 	DP_PRINT_STATS("tx_mu_mcs = %s ", str_buf);
3244*5113495bSYour Name 
3245*5113495bSYour Name 	index = 0;
3246*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3247*5113495bSYour Name 	for (i = 0; i <  DP_HTT_TX_NSS_LEN; i++) {
3248*5113495bSYour Name 		/* 0 stands for NSS 1, 1 stands for NSS 2, etc. */
3249*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3250*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
3251*5113495bSYour Name 				" %u:%u,", (i + 1),
3252*5113495bSYour Name 				dp_stats_buf->tx_nss[i]);
3253*5113495bSYour Name 	}
3254*5113495bSYour Name 	DP_PRINT_STATS("tx_nss = %s ", str_buf);
3255*5113495bSYour Name 
3256*5113495bSYour Name 	index = 0;
3257*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3258*5113495bSYour Name 	for (i = 0; i <  DP_HTT_TX_BW_LEN; i++) {
3259*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3260*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
3261*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->tx_bw[i]);
3262*5113495bSYour Name 	}
3263*5113495bSYour Name 	DP_PRINT_STATS("tx_bw = %s ", str_buf);
3264*5113495bSYour Name 
3265*5113495bSYour Name 	DP_PRINT_STATS("tx_bw_320mhz = %u ", dp_stats_buf->tx_bw_320mhz);
3266*5113495bSYour Name 
3267*5113495bSYour Name 	index = 0;
3268*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3269*5113495bSYour Name 	for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3270*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3271*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
3272*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->tx_stbc[i]);
3273*5113495bSYour Name 	}
3274*5113495bSYour Name 	for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) {
3275*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3276*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
3277*5113495bSYour Name 				" %u:%u,", i + HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,
3278*5113495bSYour Name 				dp_stats_buf->tx_stbc_ext[i]);
3279*5113495bSYour Name 	}
3280*5113495bSYour Name 	DP_PRINT_STATS("tx_stbc = %s ", str_buf);
3281*5113495bSYour Name 
3282*5113495bSYour Name 	index = 0;
3283*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3284*5113495bSYour Name 	for (i = 0; i <  DP_HTT_TX_PREAM_LEN; i++) {
3285*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3286*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
3287*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->tx_pream[i]);
3288*5113495bSYour Name 	}
3289*5113495bSYour Name 	DP_PRINT_STATS("tx_pream = %s ", str_buf);
3290*5113495bSYour Name 
3291*5113495bSYour Name 	for (j = 0; j < DP_HTT_PDEV_TX_GI_LEN; j++) {
3292*5113495bSYour Name 		index = 0;
3293*5113495bSYour Name 		qdf_mem_zero(tx_gi[j], DP_MAX_STRING_LEN);
3294*5113495bSYour Name 		for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3295*5113495bSYour Name 			index += qdf_snprint(&tx_gi[j][index],
3296*5113495bSYour Name 					DP_MAX_STRING_LEN - index,
3297*5113495bSYour Name 					" %u:%u,", i,
3298*5113495bSYour Name 					dp_stats_buf->tx_gi[j][i]);
3299*5113495bSYour Name 		}
3300*5113495bSYour Name 		DP_PRINT_STATS("tx_gi[%u] = %s ", j, tx_gi[j]);
3301*5113495bSYour Name 	}
3302*5113495bSYour Name 
3303*5113495bSYour Name 	for (j = 0; j < DP_HTT_PDEV_TX_GI_LEN; j++) {
3304*5113495bSYour Name 		index = 0;
3305*5113495bSYour Name 		qdf_mem_zero(tx_gi_ext[j], DP_MAX_STRING_LEN);
3306*5113495bSYour Name 		for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) {
3307*5113495bSYour Name 			index += qdf_snprint(&tx_gi_ext[j][index],
3308*5113495bSYour Name 					DP_MAX_STRING_LEN - index,
3309*5113495bSYour Name 					" %u:%u,", i,
3310*5113495bSYour Name 					dp_stats_buf->tx_gi_ext[j][i]);
3311*5113495bSYour Name 		}
3312*5113495bSYour Name 		DP_PRINT_STATS("tx_gi_ext[%u] = %s ", j, tx_gi_ext[j]);
3313*5113495bSYour Name 	}
3314*5113495bSYour Name 
3315*5113495bSYour Name 	index = 0;
3316*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3317*5113495bSYour Name 	for (i = 0; i <  DP_HTT_TX_DCM_LEN; i++) {
3318*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3319*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
3320*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->tx_dcm[i]);
3321*5113495bSYour Name 	}
3322*5113495bSYour Name 	DP_PRINT_STATS("tx_dcm = %s", str_buf);
3323*5113495bSYour Name 
3324*5113495bSYour Name 	index = 0;
3325*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3326*5113495bSYour Name 	for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_PUNCTURED_MODE_COUNTERS; i++) {
3327*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3328*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
3329*5113495bSYour Name 				" %u:%u,", i,
3330*5113495bSYour Name 				dp_stats_buf->tx_su_punctured_mode[i]);
3331*5113495bSYour Name 	}
3332*5113495bSYour Name 	DP_PRINT_STATS("tx_su_punctured_mode = %s\n", str_buf);
3333*5113495bSYour Name 
3334*5113495bSYour Name 	DP_PRINT_STATS("rts_success = %u",
3335*5113495bSYour Name 		       dp_stats_buf->rts_success);
3336*5113495bSYour Name 	DP_PRINT_STATS("ac_mu_mimo_tx_ldpc = %u",
3337*5113495bSYour Name 		       dp_stats_buf->ac_mu_mimo_tx_ldpc);
3338*5113495bSYour Name 	DP_PRINT_STATS("ax_mu_mimo_tx_ldpc = %u",
3339*5113495bSYour Name 		       dp_stats_buf->ax_mu_mimo_tx_ldpc);
3340*5113495bSYour Name 	DP_PRINT_STATS("ofdma_tx_ldpc = %u",
3341*5113495bSYour Name 		       dp_stats_buf->ofdma_tx_ldpc);
3342*5113495bSYour Name 
3343*5113495bSYour Name 	index = 0;
3344*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3345*5113495bSYour Name 	for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_LEGACY_CCK_STATS; i++) {
3346*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3347*5113495bSYour Name 				     DP_MAX_STRING_LEN - index,
3348*5113495bSYour Name 				     " %u:%u,",
3349*5113495bSYour Name 				     i, dp_stats_buf->tx_legacy_cck_rate[i]);
3350*5113495bSYour Name 	}
3351*5113495bSYour Name 	DP_PRINT_STATS("tx_legacy_cck_rate = %s ", str_buf);
3352*5113495bSYour Name 
3353*5113495bSYour Name 	index = 0;
3354*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3355*5113495bSYour Name 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_LEGACY_OFDM_STATS; i++) {
3356*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3357*5113495bSYour Name 				     DP_MAX_STRING_LEN - index,
3358*5113495bSYour Name 				     " %u:%u,", i,
3359*5113495bSYour Name 				     dp_stats_buf->tx_legacy_ofdm_rate[i]);
3360*5113495bSYour Name 	}
3361*5113495bSYour Name 	DP_PRINT_STATS("tx_legacy_ofdm_rate = %s ", str_buf);
3362*5113495bSYour Name 
3363*5113495bSYour Name 	index = 0;
3364*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3365*5113495bSYour Name 	for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_LTF; i++) {
3366*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3367*5113495bSYour Name 				     DP_MAX_STRING_LEN - index,
3368*5113495bSYour Name 				     " %u:%u,",
3369*5113495bSYour Name 				     i, dp_stats_buf->tx_he_ltf[i]);
3370*5113495bSYour Name 	}
3371*5113495bSYour Name 	DP_PRINT_STATS("tx_he_ltf = %s ", str_buf);
3372*5113495bSYour Name 
3373*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3374*5113495bSYour Name 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3375*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3376*5113495bSYour Name 				     DP_MAX_STRING_LEN - index,
3377*5113495bSYour Name 				     " %u:%u,",
3378*5113495bSYour Name 				     i, dp_stats_buf->ofdma_tx_mcs[i]);
3379*5113495bSYour Name 	}
3380*5113495bSYour Name 	DP_PRINT_STATS("ofdma_tx_mcs = %s ", str_buf);
3381*5113495bSYour Name 
3382*5113495bSYour Name 	index = 0;
3383*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3384*5113495bSYour Name 	for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3385*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3386*5113495bSYour Name 				     DP_MAX_STRING_LEN - index,
3387*5113495bSYour Name 				     " %u:%u,",
3388*5113495bSYour Name 				     i, dp_stats_buf->ac_mu_mimo_tx_mcs[i]);
3389*5113495bSYour Name 	}
3390*5113495bSYour Name 	DP_PRINT_STATS("ac_mu_mimo_tx_mcs = %s ", str_buf);
3391*5113495bSYour Name 
3392*5113495bSYour Name 	index = 0;
3393*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3394*5113495bSYour Name 	for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3395*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3396*5113495bSYour Name 				     DP_MAX_STRING_LEN - index,
3397*5113495bSYour Name 				     " %u:%u,",
3398*5113495bSYour Name 				     i, dp_stats_buf->ax_mu_mimo_tx_mcs[i]);
3399*5113495bSYour Name 	}
3400*5113495bSYour Name 	DP_PRINT_STATS("ax_mu_mimo_tx_mcs = %s ", str_buf);
3401*5113495bSYour Name 
3402*5113495bSYour Name 	index = 0;
3403*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3404*5113495bSYour Name 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3405*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3406*5113495bSYour Name 				     DP_MAX_STRING_LEN - index,
3407*5113495bSYour Name 				     " %u:%u,",
3408*5113495bSYour Name 				     i, dp_stats_buf->ofdma_tx_mcs[i]);
3409*5113495bSYour Name 	}
3410*5113495bSYour Name 	DP_PRINT_STATS("ofdma_tx_mcs = %s ", str_buf);
3411*5113495bSYour Name 
3412*5113495bSYour Name 	index = 0;
3413*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3414*5113495bSYour Name 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) {
3415*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3416*5113495bSYour Name 				     DP_MAX_STRING_LEN - index,
3417*5113495bSYour Name 				     " %u:%u,",
3418*5113495bSYour Name 				     i, dp_stats_buf->ac_mu_mimo_tx_nss[i]);
3419*5113495bSYour Name 	}
3420*5113495bSYour Name 	DP_PRINT_STATS("ac_mu_mimo_tx_nss = %s ", str_buf);
3421*5113495bSYour Name 
3422*5113495bSYour Name 	index = 0;
3423*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3424*5113495bSYour Name 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) {
3425*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3426*5113495bSYour Name 				     DP_MAX_STRING_LEN - index,
3427*5113495bSYour Name 				     " %u:%u,",
3428*5113495bSYour Name 				     i, dp_stats_buf->ax_mu_mimo_tx_nss[i]);
3429*5113495bSYour Name 	}
3430*5113495bSYour Name 	DP_PRINT_STATS("ax_mu_mimo_tx_nss = %s ", str_buf);
3431*5113495bSYour Name 
3432*5113495bSYour Name 	index = 0;
3433*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3434*5113495bSYour Name 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) {
3435*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3436*5113495bSYour Name 				     DP_MAX_STRING_LEN - index,
3437*5113495bSYour Name 				     " %u:%u,",
3438*5113495bSYour Name 				     i, dp_stats_buf->ofdma_tx_nss[i]);
3439*5113495bSYour Name 	}
3440*5113495bSYour Name 	DP_PRINT_STATS("ofdma_tx_nss = %s ", str_buf);
3441*5113495bSYour Name 
3442*5113495bSYour Name 	index = 0;
3443*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3444*5113495bSYour Name 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
3445*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3446*5113495bSYour Name 				     DP_MAX_STRING_LEN - index,
3447*5113495bSYour Name 				     " %u:%u,",
3448*5113495bSYour Name 				     i, dp_stats_buf->ac_mu_mimo_tx_bw[i]);
3449*5113495bSYour Name 	}
3450*5113495bSYour Name 	DP_PRINT_STATS("ac_mu_mimo_tx_bw = %s ", str_buf);
3451*5113495bSYour Name 
3452*5113495bSYour Name 	index = 0;
3453*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3454*5113495bSYour Name 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
3455*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3456*5113495bSYour Name 				     DP_MAX_STRING_LEN - index,
3457*5113495bSYour Name 				     " %u:%u,",
3458*5113495bSYour Name 				     i, dp_stats_buf->ax_mu_mimo_tx_bw[i]);
3459*5113495bSYour Name 	}
3460*5113495bSYour Name 	DP_PRINT_STATS("ax_mu_mimo_tx_bw = %s ", str_buf);
3461*5113495bSYour Name 
3462*5113495bSYour Name 	index = 0;
3463*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3464*5113495bSYour Name 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
3465*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3466*5113495bSYour Name 				     DP_MAX_STRING_LEN - index,
3467*5113495bSYour Name 				     " %u:%u,",
3468*5113495bSYour Name 				     i, dp_stats_buf->ofdma_tx_bw[i]);
3469*5113495bSYour Name 	}
3470*5113495bSYour Name 
3471*5113495bSYour Name 	DP_PRINT_STATS("ofdma_tx_bw = %s ", str_buf);
3472*5113495bSYour Name 
3473*5113495bSYour Name 	for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
3474*5113495bSYour Name 		index = 0;
3475*5113495bSYour Name 		qdf_mem_zero(ac_mu_mimo_tx_gi[j], DP_MAX_STRING_LEN);
3476*5113495bSYour Name 		for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3477*5113495bSYour Name 			index += qdf_snprint(&ac_mu_mimo_tx_gi[j][index],
3478*5113495bSYour Name 					     DP_MAX_STRING_LEN - index,
3479*5113495bSYour Name 					     " %u:%u,", i,
3480*5113495bSYour Name 					     dp_stats_buf->
3481*5113495bSYour Name 					     ac_mu_mimo_tx_gi[j][i]);
3482*5113495bSYour Name 		}
3483*5113495bSYour Name 		DP_PRINT_STATS("ac_mu_mimo_tx_gi[%u] = %s ",
3484*5113495bSYour Name 			       j, ac_mu_mimo_tx_gi[j]);
3485*5113495bSYour Name 	}
3486*5113495bSYour Name 
3487*5113495bSYour Name 	for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
3488*5113495bSYour Name 		index = 0;
3489*5113495bSYour Name 		qdf_mem_zero(ax_mu_mimo_tx_gi[j], DP_MAX_STRING_LEN);
3490*5113495bSYour Name 		for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3491*5113495bSYour Name 			index += qdf_snprint(&ax_mu_mimo_tx_gi[j][index],
3492*5113495bSYour Name 					DP_MAX_STRING_LEN - index,
3493*5113495bSYour Name 					" %u:%u,", i,
3494*5113495bSYour Name 					dp_stats_buf->ax_mu_mimo_tx_gi[j][i]);
3495*5113495bSYour Name 		}
3496*5113495bSYour Name 		DP_PRINT_STATS("ax_mu_mimo_tx_gi[%u] = %s ",
3497*5113495bSYour Name 			       j, ax_mu_mimo_tx_gi[j]);
3498*5113495bSYour Name 	}
3499*5113495bSYour Name 
3500*5113495bSYour Name 	for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
3501*5113495bSYour Name 		index = 0;
3502*5113495bSYour Name 		qdf_mem_zero(ofdma_tx_gi[j], DP_MAX_STRING_LEN);
3503*5113495bSYour Name 		for (i = 0; i <  HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3504*5113495bSYour Name 			index += qdf_snprint(&ofdma_tx_gi[j][index],
3505*5113495bSYour Name 					DP_MAX_STRING_LEN - index,
3506*5113495bSYour Name 					" %u:%u,", i,
3507*5113495bSYour Name 					dp_stats_buf->ofdma_tx_gi[j][i]);
3508*5113495bSYour Name 		}
3509*5113495bSYour Name 		DP_PRINT_STATS("ofdma_tx_gi[%u] = %s ",
3510*5113495bSYour Name 			       j, ofdma_tx_gi[j]);
3511*5113495bSYour Name 	}
3512*5113495bSYour Name 
3513*5113495bSYour Name fail1:
3514*5113495bSYour Name 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
3515*5113495bSYour Name 		if (tx_gi[i])
3516*5113495bSYour Name 			qdf_mem_free(tx_gi[i]);
3517*5113495bSYour Name 		if (tx_gi_ext[i])
3518*5113495bSYour Name 			qdf_mem_free(tx_gi_ext[i]);
3519*5113495bSYour Name 		if (ac_mu_mimo_tx_gi[i])
3520*5113495bSYour Name 			qdf_mem_free(ac_mu_mimo_tx_gi[i]);
3521*5113495bSYour Name 		if (ax_mu_mimo_tx_gi[i])
3522*5113495bSYour Name 			qdf_mem_free(ax_mu_mimo_tx_gi[i]);
3523*5113495bSYour Name 		if (ofdma_tx_gi[i])
3524*5113495bSYour Name 			qdf_mem_free(ofdma_tx_gi[i]);
3525*5113495bSYour Name 	}
3526*5113495bSYour Name 	qdf_mem_free(str_buf);
3527*5113495bSYour Name }
3528*5113495bSYour Name 
3529*5113495bSYour Name /**
3530*5113495bSYour Name  * dp_print_rx_pdev_rate_ext_stats_tlv() -
3531*5113495bSYour Name  *					display htt_rx_pdev_rate_ext_stats_tlv
3532*5113495bSYour Name  * @pdev: pdev pointer
3533*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_rx_pdev_rate_ext_stats_tlv
3534*5113495bSYour Name  *
3535*5113495bSYour Name  * Return: void
3536*5113495bSYour Name  */
dp_print_rx_pdev_rate_ext_stats_tlv(struct dp_pdev * pdev,uint32_t * tag_buf)3537*5113495bSYour Name static void dp_print_rx_pdev_rate_ext_stats_tlv(struct dp_pdev *pdev,
3538*5113495bSYour Name 						uint32_t *tag_buf)
3539*5113495bSYour Name {
3540*5113495bSYour Name 	htt_rx_pdev_rate_ext_stats_tlv *dp_stats_buf =
3541*5113495bSYour Name 		(htt_rx_pdev_rate_ext_stats_tlv *)tag_buf;
3542*5113495bSYour Name 	uint8_t i, j;
3543*5113495bSYour Name 	uint16_t index = 0;
3544*5113495bSYour Name 	char *rx_gi_ext[HTT_RX_PDEV_STATS_NUM_GI_COUNTERS] = {0};
3545*5113495bSYour Name 	char *ul_ofdma_rx_gi_ext[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0};
3546*5113495bSYour Name 	char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
3547*5113495bSYour Name 
3548*5113495bSYour Name 	if (!str_buf) {
3549*5113495bSYour Name 		dp_err("Output buffer not allocated");
3550*5113495bSYour Name 		return;
3551*5113495bSYour Name 	}
3552*5113495bSYour Name 
3553*5113495bSYour Name 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
3554*5113495bSYour Name 		rx_gi_ext[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
3555*5113495bSYour Name 		if (!rx_gi_ext[i]) {
3556*5113495bSYour Name 			dp_err("Unable to allocate buffer for rx_gi_ext");
3557*5113495bSYour Name 			goto fail1;
3558*5113495bSYour Name 		}
3559*5113495bSYour Name 
3560*5113495bSYour Name 		ul_ofdma_rx_gi_ext[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
3561*5113495bSYour Name 		if (!ul_ofdma_rx_gi_ext[i]) {
3562*5113495bSYour Name 			dp_err("Unable to allocate buffer for ul_ofdma_rx_gi_ext");
3563*5113495bSYour Name 			goto fail1;
3564*5113495bSYour Name 		}
3565*5113495bSYour Name 	}
3566*5113495bSYour Name 
3567*5113495bSYour Name 	index = 0;
3568*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3569*5113495bSYour Name 	for (i = 0; i <  DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
3570*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3571*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
3572*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->rx_mcs_ext[i]);
3573*5113495bSYour Name 	}
3574*5113495bSYour Name 
3575*5113495bSYour Name 	for (i = 0; i <  DP_HTT_RX_PDEV_MCS_LEN_EXT2; i++) {
3576*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3577*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
3578*5113495bSYour Name 				" %u:%u,", i + DP_HTT_RX_PDEV_MCS_LEN_EXT,
3579*5113495bSYour Name 				 dp_stats_buf->rx_mcs_ext_2[i]);
3580*5113495bSYour Name 	}
3581*5113495bSYour Name 	DP_PRINT_STATS("rx_mcs_ext = %s ", str_buf);
3582*5113495bSYour Name 
3583*5113495bSYour Name 	index = 0;
3584*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3585*5113495bSYour Name 	for (i = 0; i <  DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
3586*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3587*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
3588*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->rx_stbc_ext[i]);
3589*5113495bSYour Name 	}
3590*5113495bSYour Name 	DP_PRINT_STATS("rx_stbc_ext = %s ", str_buf);
3591*5113495bSYour Name 
3592*5113495bSYour Name 	for (j = 0; j < DP_HTT_RX_GI_LEN; j++) {
3593*5113495bSYour Name 		index = 0;
3594*5113495bSYour Name 		qdf_mem_zero(rx_gi_ext[j], DP_MAX_STRING_LEN);
3595*5113495bSYour Name 		for (i = 0; i <  DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
3596*5113495bSYour Name 			index += qdf_snprint(&rx_gi_ext[j][index],
3597*5113495bSYour Name 					DP_MAX_STRING_LEN - index,
3598*5113495bSYour Name 					" %u:%u,", i,
3599*5113495bSYour Name 					dp_stats_buf->rx_gi_ext[j][i]);
3600*5113495bSYour Name 		}
3601*5113495bSYour Name 		DP_PRINT_STATS("rx_gi_ext[%u] = %s ", j, rx_gi_ext[j]);
3602*5113495bSYour Name 	}
3603*5113495bSYour Name 
3604*5113495bSYour Name 	index = 0;
3605*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3606*5113495bSYour Name 	for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
3607*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3608*5113495bSYour Name 				     DP_MAX_STRING_LEN - index,
3609*5113495bSYour Name 				     " %u:%u,",
3610*5113495bSYour Name 				     i, dp_stats_buf->ul_ofdma_rx_mcs_ext[i]);
3611*5113495bSYour Name 	}
3612*5113495bSYour Name 	DP_PRINT_STATS("ul_ofdma_rx_mcs_ext = %s", str_buf);
3613*5113495bSYour Name 
3614*5113495bSYour Name 	for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
3615*5113495bSYour Name 		index = 0;
3616*5113495bSYour Name 		qdf_mem_zero(ul_ofdma_rx_gi_ext[j], DP_MAX_STRING_LEN);
3617*5113495bSYour Name 		for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
3618*5113495bSYour Name 			index += qdf_snprint(&ul_ofdma_rx_gi_ext[j][index],
3619*5113495bSYour Name 					     DP_MAX_STRING_LEN - index,
3620*5113495bSYour Name 					     " %u:%u,", i,
3621*5113495bSYour Name 					     dp_stats_buf->
3622*5113495bSYour Name 					     ul_ofdma_rx_gi_ext[j][i]);
3623*5113495bSYour Name 		}
3624*5113495bSYour Name 		DP_PRINT_STATS("ul_ofdma_rx_gi_ext[%u] = %s ",
3625*5113495bSYour Name 			       j, ul_ofdma_rx_gi_ext[j]);
3626*5113495bSYour Name 	}
3627*5113495bSYour Name 
3628*5113495bSYour Name 	index = 0;
3629*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3630*5113495bSYour Name 	for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
3631*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3632*5113495bSYour Name 		DP_MAX_STRING_LEN - index,
3633*5113495bSYour Name 		" %u:%u,", i,
3634*5113495bSYour Name 		dp_stats_buf->rx_11ax_su_txbf_mcs_ext[i]);
3635*5113495bSYour Name 	}
3636*5113495bSYour Name 	DP_PRINT_STATS("rx_11ax_su_txbf_mcs_ext = %s ", str_buf);
3637*5113495bSYour Name 
3638*5113495bSYour Name 	index = 0;
3639*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3640*5113495bSYour Name 	for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
3641*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3642*5113495bSYour Name 		DP_MAX_STRING_LEN - index,
3643*5113495bSYour Name 		" %u:%u,", i,
3644*5113495bSYour Name 		dp_stats_buf->rx_11ax_mu_txbf_mcs_ext[i]);
3645*5113495bSYour Name 	}
3646*5113495bSYour Name 	DP_PRINT_STATS("rx_11ax_mu_txbf_mcs_ext = %s ", str_buf);
3647*5113495bSYour Name 
3648*5113495bSYour Name 	index = 0;
3649*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3650*5113495bSYour Name 	for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
3651*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3652*5113495bSYour Name 		DP_MAX_STRING_LEN - index,
3653*5113495bSYour Name 		" %u:%u,", i,
3654*5113495bSYour Name 		dp_stats_buf->rx_11ax_dl_ofdma_mcs_ext[i]);
3655*5113495bSYour Name 	}
3656*5113495bSYour Name 	DP_PRINT_STATS("rx_11ax_dl_ofdma_mcs_ext = %s ", str_buf);
3657*5113495bSYour Name 
3658*5113495bSYour Name 	index = 0;
3659*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3660*5113495bSYour Name 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_BW_EXT2_COUNTERS; i++) {
3661*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3662*5113495bSYour Name 		DP_MAX_STRING_LEN - index,
3663*5113495bSYour Name 		" %u:%u,", i,
3664*5113495bSYour Name 		dp_stats_buf->rx_bw_ext[i]);
3665*5113495bSYour Name 	}
3666*5113495bSYour Name 	DP_PRINT_STATS("rx_bw_ext = %s ", str_buf);
3667*5113495bSYour Name 
3668*5113495bSYour Name 	index = 0;
3669*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3670*5113495bSYour Name 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_PUNCTURED_MODE_COUNTERS; i++) {
3671*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3672*5113495bSYour Name 		DP_MAX_STRING_LEN - index,
3673*5113495bSYour Name 		" %u:%u,", i,
3674*5113495bSYour Name 		dp_stats_buf->rx_su_punctured_mode[i]);
3675*5113495bSYour Name 	}
3676*5113495bSYour Name 	DP_PRINT_STATS("rx_su_punctured_mode = %s ", str_buf);
3677*5113495bSYour Name 
3678*5113495bSYour Name fail1:
3679*5113495bSYour Name 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
3680*5113495bSYour Name 		if (ul_ofdma_rx_gi_ext[i])
3681*5113495bSYour Name 			qdf_mem_free(ul_ofdma_rx_gi_ext[i]);
3682*5113495bSYour Name 		if (rx_gi_ext[i])
3683*5113495bSYour Name 			qdf_mem_free(rx_gi_ext[i]);
3684*5113495bSYour Name 	}
3685*5113495bSYour Name 
3686*5113495bSYour Name 	qdf_mem_free(str_buf);
3687*5113495bSYour Name }
3688*5113495bSYour Name 
3689*5113495bSYour Name /**
3690*5113495bSYour Name  * dp_print_rx_pdev_rate_stats_tlv() - display htt_rx_pdev_rate_stats_tlv
3691*5113495bSYour Name  * @pdev: pdev pointer
3692*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_rx_pdev_rate_stats_tlv
3693*5113495bSYour Name  *
3694*5113495bSYour Name  * Return: void
3695*5113495bSYour Name  */
dp_print_rx_pdev_rate_stats_tlv(struct dp_pdev * pdev,uint32_t * tag_buf)3696*5113495bSYour Name static void dp_print_rx_pdev_rate_stats_tlv(struct dp_pdev *pdev,
3697*5113495bSYour Name 					    uint32_t *tag_buf)
3698*5113495bSYour Name {
3699*5113495bSYour Name 	htt_rx_pdev_rate_stats_tlv *dp_stats_buf =
3700*5113495bSYour Name 		(htt_rx_pdev_rate_stats_tlv *)tag_buf;
3701*5113495bSYour Name 	uint8_t i, j;
3702*5113495bSYour Name 	uint16_t index = 0;
3703*5113495bSYour Name 	char *rssi_chain[DP_HTT_RSSI_CHAIN_LEN];
3704*5113495bSYour Name 	char *rx_gi[HTT_RX_PDEV_STATS_NUM_GI_COUNTERS];
3705*5113495bSYour Name 	char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
3706*5113495bSYour Name 	char *ul_ofdma_rx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS];
3707*5113495bSYour Name 
3708*5113495bSYour Name 	if (!str_buf) {
3709*5113495bSYour Name 		dp_err("Output buffer not allocated");
3710*5113495bSYour Name 		return;
3711*5113495bSYour Name 	}
3712*5113495bSYour Name 
3713*5113495bSYour Name 	for (i = 0; i < DP_HTT_RSSI_CHAIN_LEN; i++) {
3714*5113495bSYour Name 		rssi_chain[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
3715*5113495bSYour Name 		if (!rssi_chain[i]) {
3716*5113495bSYour Name 			dp_err("Unable to allocate buffer for rssi_chain");
3717*5113495bSYour Name 			goto fail1;
3718*5113495bSYour Name 		}
3719*5113495bSYour Name 	}
3720*5113495bSYour Name 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
3721*5113495bSYour Name 		rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
3722*5113495bSYour Name 		if (!rx_gi[i]) {
3723*5113495bSYour Name 			dp_err("Unable to allocate buffer for rx_gi");
3724*5113495bSYour Name 			goto fail2;
3725*5113495bSYour Name 		}
3726*5113495bSYour Name 	}
3727*5113495bSYour Name 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
3728*5113495bSYour Name 		ul_ofdma_rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
3729*5113495bSYour Name 		if (!ul_ofdma_rx_gi[i]) {
3730*5113495bSYour Name 			dp_err("Unable to allocate buffer for ul_ofdma_rx_gi");
3731*5113495bSYour Name 			goto fail3;
3732*5113495bSYour Name 		}
3733*5113495bSYour Name 	}
3734*5113495bSYour Name 
3735*5113495bSYour Name 	DP_PRINT_STATS("ul_ofdma_data_rx_ppdu = %d",
3736*5113495bSYour Name 		       pdev->stats.ul_ofdma.data_rx_ppdu);
3737*5113495bSYour Name 
3738*5113495bSYour Name 	for (i = 0; i < OFDMA_NUM_USERS; i++) {
3739*5113495bSYour Name 		DP_PRINT_STATS("ul_ofdma data %d user = %d",
3740*5113495bSYour Name 			       i, pdev->stats.ul_ofdma.data_users[i]);
3741*5113495bSYour Name 	}
3742*5113495bSYour Name 
3743*5113495bSYour Name 	index = 0;
3744*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3745*5113495bSYour Name 	for (i = 0; i < OFDMA_NUM_RU_SIZE; i++) {
3746*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3747*5113495bSYour Name 			DP_MAX_STRING_LEN - index,
3748*5113495bSYour Name 			" %u:%u,", i,
3749*5113495bSYour Name 			pdev->stats.ul_ofdma.data_rx_ru_size[i]);
3750*5113495bSYour Name 	}
3751*5113495bSYour Name 	DP_PRINT_STATS("ul_ofdma_data_rx_ru_size= %s", str_buf);
3752*5113495bSYour Name 
3753*5113495bSYour Name 	index = 0;
3754*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3755*5113495bSYour Name 	for (i = 0; i < OFDMA_NUM_RU_SIZE; i++) {
3756*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3757*5113495bSYour Name 			DP_MAX_STRING_LEN - index,
3758*5113495bSYour Name 			" %u:%u,", i,
3759*5113495bSYour Name 			pdev->stats.ul_ofdma.nondata_rx_ru_size[i]);
3760*5113495bSYour Name 	}
3761*5113495bSYour Name 	DP_PRINT_STATS("ul_ofdma_nondata_rx_ru_size= %s", str_buf);
3762*5113495bSYour Name 
3763*5113495bSYour Name 	DP_PRINT_STATS("HTT_RX_PDEV_RATE_STATS_TLV:");
3764*5113495bSYour Name 	DP_PRINT_STATS("mac_id__word = %u",
3765*5113495bSYour Name 		       dp_stats_buf->mac_id__word);
3766*5113495bSYour Name 	DP_PRINT_STATS("nsts = %u",
3767*5113495bSYour Name 		       dp_stats_buf->nsts);
3768*5113495bSYour Name 	DP_PRINT_STATS("rx_ldpc = %u",
3769*5113495bSYour Name 		       dp_stats_buf->rx_ldpc);
3770*5113495bSYour Name 	DP_PRINT_STATS("rts_cnt = %u",
3771*5113495bSYour Name 		       dp_stats_buf->rts_cnt);
3772*5113495bSYour Name 	DP_PRINT_STATS("rssi_mgmt = %u",
3773*5113495bSYour Name 		       dp_stats_buf->rssi_mgmt);
3774*5113495bSYour Name 	DP_PRINT_STATS("rssi_data = %u",
3775*5113495bSYour Name 		       dp_stats_buf->rssi_data);
3776*5113495bSYour Name 	DP_PRINT_STATS("rssi_comb = %u",
3777*5113495bSYour Name 		       dp_stats_buf->rssi_comb);
3778*5113495bSYour Name 	DP_PRINT_STATS("rssi_in_dbm = %d",
3779*5113495bSYour Name 		       dp_stats_buf->rssi_in_dbm);
3780*5113495bSYour Name 	DP_PRINT_STATS("rx_11ax_su_ext = %u",
3781*5113495bSYour Name 		       dp_stats_buf->rx_11ax_su_ext);
3782*5113495bSYour Name 	DP_PRINT_STATS("rx_11ac_mumimo = %u",
3783*5113495bSYour Name 		       dp_stats_buf->rx_11ac_mumimo);
3784*5113495bSYour Name 	DP_PRINT_STATS("rx_11ax_mumimo = %u",
3785*5113495bSYour Name 		       dp_stats_buf->rx_11ax_mumimo);
3786*5113495bSYour Name 	DP_PRINT_STATS("rx_11ax_ofdma = %u",
3787*5113495bSYour Name 		       dp_stats_buf->rx_11ax_ofdma);
3788*5113495bSYour Name 	DP_PRINT_STATS("txbf = %u",
3789*5113495bSYour Name 		       dp_stats_buf->txbf);
3790*5113495bSYour Name 	DP_PRINT_STATS("rx_su_ndpa = %u",
3791*5113495bSYour Name 		       dp_stats_buf->rx_su_ndpa);
3792*5113495bSYour Name 	DP_PRINT_STATS("rx_br_poll = %u",
3793*5113495bSYour Name 		       dp_stats_buf->rx_br_poll);
3794*5113495bSYour Name 
3795*5113495bSYour Name 	index = 0;
3796*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3797*5113495bSYour Name 	for (i = 0; i <  DP_HTT_RX_MCS_LEN; i++) {
3798*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3799*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
3800*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->rx_mcs[i]);
3801*5113495bSYour Name 	}
3802*5113495bSYour Name 	for (i = 0; i <  DP_HTT_RX_MCS_EXT_LEN; i++) {
3803*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3804*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
3805*5113495bSYour Name 				" %u:%u,", i + DP_HTT_RX_MCS_LEN,
3806*5113495bSYour Name 				dp_stats_buf->rx_mcs_ext[i]);
3807*5113495bSYour Name 	}
3808*5113495bSYour Name 	DP_PRINT_STATS("rx_mcs = %s ", str_buf);
3809*5113495bSYour Name 
3810*5113495bSYour Name 	index = 0;
3811*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3812*5113495bSYour Name 	for (i = 0; i <  DP_HTT_RX_NSS_LEN; i++) {
3813*5113495bSYour Name 		/* 0 stands for NSS 1, 1 stands for NSS 2, etc. */
3814*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3815*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
3816*5113495bSYour Name 				" %u:%u,", (i + 1),
3817*5113495bSYour Name 				dp_stats_buf->rx_nss[i]);
3818*5113495bSYour Name 	}
3819*5113495bSYour Name 	DP_PRINT_STATS("rx_nss = %s ", str_buf);
3820*5113495bSYour Name 
3821*5113495bSYour Name 	index = 0;
3822*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3823*5113495bSYour Name 	for (i = 0; i <  DP_HTT_RX_DCM_LEN; i++) {
3824*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3825*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
3826*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->rx_dcm[i]);
3827*5113495bSYour Name 	}
3828*5113495bSYour Name 	DP_PRINT_STATS("rx_dcm = %s ", str_buf);
3829*5113495bSYour Name 
3830*5113495bSYour Name 	index = 0;
3831*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3832*5113495bSYour Name 	for (i = 0; i <  HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3833*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3834*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
3835*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->rx_stbc[i]);
3836*5113495bSYour Name 	}
3837*5113495bSYour Name 	DP_PRINT_STATS("rx_stbc = %s ", str_buf);
3838*5113495bSYour Name 
3839*5113495bSYour Name 	index = 0;
3840*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3841*5113495bSYour Name 	for (i = 0; i <  DP_HTT_RX_BW_LEN; i++) {
3842*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3843*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
3844*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->rx_bw[i]);
3845*5113495bSYour Name 	}
3846*5113495bSYour Name 	DP_PRINT_STATS("rx_bw = %s ", str_buf);
3847*5113495bSYour Name 
3848*5113495bSYour Name 	for (j = 0; j < DP_HTT_RSSI_CHAIN_LEN; j++) {
3849*5113495bSYour Name 		index = 0;
3850*5113495bSYour Name 		for (i = 0; i <  HTT_RX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
3851*5113495bSYour Name 			index += qdf_snprint(&rssi_chain[j][index],
3852*5113495bSYour Name 					DP_MAX_STRING_LEN - index,
3853*5113495bSYour Name 					" %u:%u,", i,
3854*5113495bSYour Name 					dp_stats_buf->rssi_chain[j][i]);
3855*5113495bSYour Name 		}
3856*5113495bSYour Name 		DP_PRINT_STATS("rssi_chain[%u] = %s ", j, rssi_chain[j]);
3857*5113495bSYour Name 	}
3858*5113495bSYour Name 
3859*5113495bSYour Name 	for (j = 0; j < DP_HTT_RX_GI_LEN; j++) {
3860*5113495bSYour Name 		index = 0;
3861*5113495bSYour Name 		qdf_mem_zero(rx_gi[j], DP_MAX_STRING_LEN);
3862*5113495bSYour Name 		for (i = 0; i <  HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3863*5113495bSYour Name 			index += qdf_snprint(&rx_gi[j][index],
3864*5113495bSYour Name 					DP_MAX_STRING_LEN - index,
3865*5113495bSYour Name 					" %u:%u,", i,
3866*5113495bSYour Name 					dp_stats_buf->rx_gi[j][i]);
3867*5113495bSYour Name 		}
3868*5113495bSYour Name 		DP_PRINT_STATS("rx_gi[%u] = %s ", j, rx_gi[j]);
3869*5113495bSYour Name 	}
3870*5113495bSYour Name 
3871*5113495bSYour Name 	index = 0;
3872*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3873*5113495bSYour Name 	for (i = 0; i <  DP_HTT_RX_PREAM_LEN; i++) {
3874*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3875*5113495bSYour Name 				     DP_MAX_STRING_LEN - index,
3876*5113495bSYour Name 				     " %u:%u,",
3877*5113495bSYour Name 				     i,
3878*5113495bSYour Name 				     dp_stats_buf->rx_pream[i]);
3879*5113495bSYour Name 	}
3880*5113495bSYour Name 	DP_PRINT_STATS("rx_pream = %s", str_buf);
3881*5113495bSYour Name 
3882*5113495bSYour Name 	index = 0;
3883*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3884*5113495bSYour Name 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_LEGACY_CCK_STATS; i++) {
3885*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3886*5113495bSYour Name 				     DP_MAX_STRING_LEN - index,
3887*5113495bSYour Name 				     " %u:%u,",
3888*5113495bSYour Name 				     i,
3889*5113495bSYour Name 				     dp_stats_buf->rx_legacy_cck_rate[i]);
3890*5113495bSYour Name 	}
3891*5113495bSYour Name 	DP_PRINT_STATS("rx_legacy_cck_rate = %s", str_buf);
3892*5113495bSYour Name 
3893*5113495bSYour Name 	index = 0;
3894*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3895*5113495bSYour Name 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_LEGACY_OFDM_STATS; i++) {
3896*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3897*5113495bSYour Name 				     DP_MAX_STRING_LEN - index,
3898*5113495bSYour Name 				     " %u:%u,",
3899*5113495bSYour Name 				     i,
3900*5113495bSYour Name 				     dp_stats_buf->rx_legacy_ofdm_rate[i]);
3901*5113495bSYour Name 	}
3902*5113495bSYour Name 	DP_PRINT_STATS("rx_legacy_ofdm_rate = %s", str_buf);
3903*5113495bSYour Name 
3904*5113495bSYour Name 	index = 0;
3905*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3906*5113495bSYour Name 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3907*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3908*5113495bSYour Name 				     DP_MAX_STRING_LEN - index,
3909*5113495bSYour Name 				     " %u:%u,",
3910*5113495bSYour Name 				     i, dp_stats_buf->ul_ofdma_rx_mcs[i]);
3911*5113495bSYour Name 	}
3912*5113495bSYour Name 	DP_PRINT_STATS("ul_ofdma_rx_mcs = %s", str_buf);
3913*5113495bSYour Name 
3914*5113495bSYour Name 	DP_PRINT_STATS("rx_11ax_ul_ofdma = %u",
3915*5113495bSYour Name 		       dp_stats_buf->rx_11ax_ul_ofdma);
3916*5113495bSYour Name 
3917*5113495bSYour Name 	for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
3918*5113495bSYour Name 		index = 0;
3919*5113495bSYour Name 		qdf_mem_zero(ul_ofdma_rx_gi[j], DP_MAX_STRING_LEN);
3920*5113495bSYour Name 		for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3921*5113495bSYour Name 			index += qdf_snprint(&ul_ofdma_rx_gi[j][index],
3922*5113495bSYour Name 					     DP_MAX_STRING_LEN - index,
3923*5113495bSYour Name 					     " %u:%u,", i,
3924*5113495bSYour Name 					     dp_stats_buf->
3925*5113495bSYour Name 					     ul_ofdma_rx_gi[j][i]);
3926*5113495bSYour Name 		}
3927*5113495bSYour Name 		DP_PRINT_STATS("ul_ofdma_rx_gi[%u] = %s ",
3928*5113495bSYour Name 			       j, ul_ofdma_rx_gi[j]);
3929*5113495bSYour Name 	}
3930*5113495bSYour Name 
3931*5113495bSYour Name 	index = 0;
3932*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3933*5113495bSYour Name 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) {
3934*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3935*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
3936*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->ul_ofdma_rx_nss[i]);
3937*5113495bSYour Name 	}
3938*5113495bSYour Name 	DP_PRINT_STATS("ul_ofdma_rx_nss = %s", str_buf);
3939*5113495bSYour Name 
3940*5113495bSYour Name 	index = 0;
3941*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3942*5113495bSYour Name 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
3943*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3944*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
3945*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->ul_ofdma_rx_bw[i]);
3946*5113495bSYour Name 	}
3947*5113495bSYour Name 	DP_PRINT_STATS("ul_ofdma_rx_bw = %s", str_buf);
3948*5113495bSYour Name 	DP_PRINT_STATS("ul_ofdma_rx_stbc = %u",
3949*5113495bSYour Name 		       dp_stats_buf->ul_ofdma_rx_stbc);
3950*5113495bSYour Name 	DP_PRINT_STATS("ul_ofdma_rx_ldpc = %u",
3951*5113495bSYour Name 		       dp_stats_buf->ul_ofdma_rx_ldpc);
3952*5113495bSYour Name 
3953*5113495bSYour Name 	index = 0;
3954*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3955*5113495bSYour Name 	for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) {
3956*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3957*5113495bSYour Name 				     DP_MAX_STRING_LEN - index,
3958*5113495bSYour Name 				     " %u:%u,", i,
3959*5113495bSYour Name 				     dp_stats_buf->rx_ulofdma_non_data_ppdu[i]);
3960*5113495bSYour Name 	}
3961*5113495bSYour Name 	DP_PRINT_STATS("rx_ulofdma_non_data_ppdu = %s", str_buf);
3962*5113495bSYour Name 
3963*5113495bSYour Name 	index = 0;
3964*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3965*5113495bSYour Name 	for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) {
3966*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3967*5113495bSYour Name 				     DP_MAX_STRING_LEN - index,
3968*5113495bSYour Name 				     " %u:%u,",
3969*5113495bSYour Name 				     i, dp_stats_buf->rx_ulofdma_data_ppdu[i]);
3970*5113495bSYour Name 	}
3971*5113495bSYour Name 	DP_PRINT_STATS("rx_ulofdma_data_ppdu = %s", str_buf);
3972*5113495bSYour Name 
3973*5113495bSYour Name 	index = 0;
3974*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3975*5113495bSYour Name 	for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) {
3976*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3977*5113495bSYour Name 				     DP_MAX_STRING_LEN - index,
3978*5113495bSYour Name 				     " %u:%u,",
3979*5113495bSYour Name 				     i, dp_stats_buf->rx_ulofdma_mpdu_ok[i]);
3980*5113495bSYour Name 	}
3981*5113495bSYour Name 	DP_PRINT_STATS("rx_ulofdma_mpdu_ok = %s", str_buf);
3982*5113495bSYour Name 
3983*5113495bSYour Name 	index = 0;
3984*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3985*5113495bSYour Name 	for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) {
3986*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3987*5113495bSYour Name 				     DP_MAX_STRING_LEN - index,
3988*5113495bSYour Name 				     " %u:%u,",
3989*5113495bSYour Name 				     i, dp_stats_buf->rx_ulofdma_mpdu_fail[i]);
3990*5113495bSYour Name 	}
3991*5113495bSYour Name 	DP_PRINT_STATS("rx_ulofdma_mpdu_fail = %s", str_buf);
3992*5113495bSYour Name 
3993*5113495bSYour Name 	index = 0;
3994*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
3995*5113495bSYour Name 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
3996*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
3997*5113495bSYour Name 				     DP_MAX_STRING_LEN - index,
3998*5113495bSYour Name 				     " %u:%u,",
3999*5113495bSYour Name 				     i, dp_stats_buf->rx_11ax_su_txbf_mcs[i]);
4000*5113495bSYour Name 	}
4001*5113495bSYour Name 	DP_PRINT_STATS("rx_11ax_su_txbf_mcs = %s", str_buf);
4002*5113495bSYour Name 
4003*5113495bSYour Name 	index = 0;
4004*5113495bSYour Name 	qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
4005*5113495bSYour Name 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
4006*5113495bSYour Name 		index += qdf_snprint(&str_buf[index],
4007*5113495bSYour Name 				     DP_MAX_STRING_LEN - index,
4008*5113495bSYour Name 				     " %u:%u,",
4009*5113495bSYour Name 				     i, dp_stats_buf->rx_11ax_mu_txbf_mcs[i]);
4010*5113495bSYour Name 	}
4011*5113495bSYour Name 	DP_PRINT_STATS("rx_11ax_mu_txbf_mcs = %s", str_buf);
4012*5113495bSYour Name 
4013*5113495bSYour Name 	for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++)
4014*5113495bSYour Name 		qdf_mem_free(ul_ofdma_rx_gi[i]);
4015*5113495bSYour Name 
4016*5113495bSYour Name fail3:
4017*5113495bSYour Name 	for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++)
4018*5113495bSYour Name 		qdf_mem_free(rx_gi[i]);
4019*5113495bSYour Name fail2:
4020*5113495bSYour Name 	for (i = 0; i < DP_HTT_RSSI_CHAIN_LEN; i++)
4021*5113495bSYour Name 		qdf_mem_free(rssi_chain[i]);
4022*5113495bSYour Name fail1:
4023*5113495bSYour Name 	qdf_mem_free(str_buf);
4024*5113495bSYour Name 
4025*5113495bSYour Name }
4026*5113495bSYour Name 
4027*5113495bSYour Name /**
4028*5113495bSYour Name  * dp_print_rx_soc_fw_stats_tlv() - display htt_rx_soc_fw_stats_tlv
4029*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_rx_soc_fw_stats_tlv
4030*5113495bSYour Name  *
4031*5113495bSYour Name  * Return: void
4032*5113495bSYour Name  */
dp_print_rx_soc_fw_stats_tlv(uint32_t * tag_buf)4033*5113495bSYour Name static void dp_print_rx_soc_fw_stats_tlv(uint32_t *tag_buf)
4034*5113495bSYour Name {
4035*5113495bSYour Name 	htt_rx_soc_fw_stats_tlv *dp_stats_buf =
4036*5113495bSYour Name 		(htt_rx_soc_fw_stats_tlv *)tag_buf;
4037*5113495bSYour Name 
4038*5113495bSYour Name 	DP_PRINT_STATS("HTT_RX_SOC_FW_STATS_TLV:");
4039*5113495bSYour Name 	DP_PRINT_STATS("fw_reo_ring_data_msdu = %u",
4040*5113495bSYour Name 		       dp_stats_buf->fw_reo_ring_data_msdu);
4041*5113495bSYour Name 	DP_PRINT_STATS("fw_to_host_data_msdu_bcmc = %u",
4042*5113495bSYour Name 		       dp_stats_buf->fw_to_host_data_msdu_bcmc);
4043*5113495bSYour Name 	DP_PRINT_STATS("fw_to_host_data_msdu_uc = %u",
4044*5113495bSYour Name 		       dp_stats_buf->fw_to_host_data_msdu_uc);
4045*5113495bSYour Name 	DP_PRINT_STATS("ofld_remote_data_buf_recycle_cnt = %u",
4046*5113495bSYour Name 		       dp_stats_buf->ofld_remote_data_buf_recycle_cnt);
4047*5113495bSYour Name 	DP_PRINT_STATS("ofld_remote_free_buf_indication_cnt = %u",
4048*5113495bSYour Name 		       dp_stats_buf->ofld_remote_free_buf_indication_cnt);
4049*5113495bSYour Name 	DP_PRINT_STATS("ofld_buf_to_host_data_msdu_uc = %u ",
4050*5113495bSYour Name 		       dp_stats_buf->ofld_buf_to_host_data_msdu_uc);
4051*5113495bSYour Name 	DP_PRINT_STATS("reo_fw_ring_to_host_data_msdu_uc = %u ",
4052*5113495bSYour Name 		       dp_stats_buf->reo_fw_ring_to_host_data_msdu_uc);
4053*5113495bSYour Name 	DP_PRINT_STATS("wbm_sw_ring_reap = %u ",
4054*5113495bSYour Name 		       dp_stats_buf->wbm_sw_ring_reap);
4055*5113495bSYour Name 	DP_PRINT_STATS("wbm_forward_to_host_cnt = %u ",
4056*5113495bSYour Name 		       dp_stats_buf->wbm_forward_to_host_cnt);
4057*5113495bSYour Name 	DP_PRINT_STATS("wbm_target_recycle_cnt = %u ",
4058*5113495bSYour Name 		       dp_stats_buf->wbm_target_recycle_cnt);
4059*5113495bSYour Name 	DP_PRINT_STATS("target_refill_ring_recycle_cnt = %u",
4060*5113495bSYour Name 		       dp_stats_buf->target_refill_ring_recycle_cnt);
4061*5113495bSYour Name 
4062*5113495bSYour Name }
4063*5113495bSYour Name 
4064*5113495bSYour Name /**
4065*5113495bSYour Name  * dp_print_rx_soc_fw_refill_ring_empty_tlv_v() - display
4066*5113495bSYour Name  *					htt_rx_soc_fw_refill_ring_empty_tlv_v
4067*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_rx_soc_fw_refill_ring_empty_tlv_v
4068*5113495bSYour Name  *
4069*5113495bSYour Name  * Return: void
4070*5113495bSYour Name  */
dp_print_rx_soc_fw_refill_ring_empty_tlv_v(uint32_t * tag_buf)4071*5113495bSYour Name static void dp_print_rx_soc_fw_refill_ring_empty_tlv_v(uint32_t *tag_buf)
4072*5113495bSYour Name {
4073*5113495bSYour Name 	htt_rx_soc_fw_refill_ring_empty_tlv_v *dp_stats_buf =
4074*5113495bSYour Name 		(htt_rx_soc_fw_refill_ring_empty_tlv_v *)tag_buf;
4075*5113495bSYour Name 	uint8_t i;
4076*5113495bSYour Name 	uint16_t index = 0;
4077*5113495bSYour Name 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
4078*5113495bSYour Name 	char *refill_ring_empty_cnt = qdf_mem_malloc(DP_MAX_STRING_LEN);
4079*5113495bSYour Name 
4080*5113495bSYour Name 	if (!refill_ring_empty_cnt) {
4081*5113495bSYour Name 		dp_stats_err("Output buffer not allocated");
4082*5113495bSYour Name 		return;
4083*5113495bSYour Name 	}
4084*5113495bSYour Name 
4085*5113495bSYour Name 	tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_STATS_REFILL_MAX_RING);
4086*5113495bSYour Name 
4087*5113495bSYour Name 	DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_EMPTY_TLV_V:");
4088*5113495bSYour Name 	for (i = 0; i <  tag_len; i++) {
4089*5113495bSYour Name 		index += qdf_snprint(&refill_ring_empty_cnt[index],
4090*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
4091*5113495bSYour Name 				" %u:%u,", i,
4092*5113495bSYour Name 				dp_stats_buf->refill_ring_empty_cnt[i]);
4093*5113495bSYour Name 	}
4094*5113495bSYour Name 	DP_PRINT_STATS("refill_ring_empty_cnt = %s\n",
4095*5113495bSYour Name 		       refill_ring_empty_cnt);
4096*5113495bSYour Name 	qdf_mem_free(refill_ring_empty_cnt);
4097*5113495bSYour Name }
4098*5113495bSYour Name 
4099*5113495bSYour Name /**
4100*5113495bSYour Name  * dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v() - display
4101*5113495bSYour Name  *				htt_rx_soc_fw_refill_ring_num_refill_tlv_v
4102*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_rx_soc_fw_refill_ring_num_refill_tlv
4103*5113495bSYour Name  *
4104*5113495bSYour Name  * Return: void
4105*5113495bSYour Name  */
dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v(uint32_t * tag_buf)4106*5113495bSYour Name static void dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v(
4107*5113495bSYour Name 		uint32_t *tag_buf)
4108*5113495bSYour Name {
4109*5113495bSYour Name 	htt_rx_soc_fw_refill_ring_num_refill_tlv_v *dp_stats_buf =
4110*5113495bSYour Name 		(htt_rx_soc_fw_refill_ring_num_refill_tlv_v *)tag_buf;
4111*5113495bSYour Name 	uint8_t i;
4112*5113495bSYour Name 	uint16_t index = 0;
4113*5113495bSYour Name 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
4114*5113495bSYour Name 	char *refill_ring_num_refill = qdf_mem_malloc(DP_MAX_STRING_LEN);
4115*5113495bSYour Name 
4116*5113495bSYour Name 	if (!refill_ring_num_refill) {
4117*5113495bSYour Name 		dp_stats_err("Output buffer not allocated");
4118*5113495bSYour Name 		return;
4119*5113495bSYour Name 	}
4120*5113495bSYour Name 
4121*5113495bSYour Name 	tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_URRN_STATS);
4122*5113495bSYour Name 
4123*5113495bSYour Name 	DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_REFILL_TLV_V:");
4124*5113495bSYour Name 	for (i = 0; i <  tag_len; i++) {
4125*5113495bSYour Name 		index += qdf_snprint(&refill_ring_num_refill[index],
4126*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
4127*5113495bSYour Name 				" %u:%u,", i,
4128*5113495bSYour Name 				dp_stats_buf->refill_ring_num_refill[i]);
4129*5113495bSYour Name 	}
4130*5113495bSYour Name 	DP_PRINT_STATS("refill_ring_num_refill = %s\n",
4131*5113495bSYour Name 		       refill_ring_num_refill);
4132*5113495bSYour Name 	qdf_mem_free(refill_ring_num_refill);
4133*5113495bSYour Name }
4134*5113495bSYour Name 
4135*5113495bSYour Name /**
4136*5113495bSYour Name  * dp_print_rx_pdev_fw_stats_tlv() - display htt_rx_pdev_fw_stats_tlv
4137*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_stats_tlv
4138*5113495bSYour Name  *
4139*5113495bSYour Name  * Return: void
4140*5113495bSYour Name  */
dp_print_rx_pdev_fw_stats_tlv(uint32_t * tag_buf)4141*5113495bSYour Name static void dp_print_rx_pdev_fw_stats_tlv(uint32_t *tag_buf)
4142*5113495bSYour Name {
4143*5113495bSYour Name 	htt_rx_pdev_fw_stats_tlv *dp_stats_buf =
4144*5113495bSYour Name 		(htt_rx_pdev_fw_stats_tlv *)tag_buf;
4145*5113495bSYour Name 	uint8_t i;
4146*5113495bSYour Name 	uint16_t index = 0;
4147*5113495bSYour Name 	char fw_ring_subtype_buf[DP_MAX_STRING_LEN];
4148*5113495bSYour Name 
4149*5113495bSYour Name 	DP_PRINT_STATS("HTT_RX_PDEV_FW_STATS_TLV:");
4150*5113495bSYour Name 	DP_PRINT_STATS("mac_id__word = %u",
4151*5113495bSYour Name 		       dp_stats_buf->mac_id__word);
4152*5113495bSYour Name 	DP_PRINT_STATS("ppdu_recvd = %u",
4153*5113495bSYour Name 		       dp_stats_buf->ppdu_recvd);
4154*5113495bSYour Name 	DP_PRINT_STATS("mpdu_cnt_fcs_ok = %u",
4155*5113495bSYour Name 		       dp_stats_buf->mpdu_cnt_fcs_ok);
4156*5113495bSYour Name 	DP_PRINT_STATS("mpdu_cnt_fcs_err = %u",
4157*5113495bSYour Name 		       dp_stats_buf->mpdu_cnt_fcs_err);
4158*5113495bSYour Name 	DP_PRINT_STATS("tcp_msdu_cnt = %u",
4159*5113495bSYour Name 		       dp_stats_buf->tcp_msdu_cnt);
4160*5113495bSYour Name 	DP_PRINT_STATS("tcp_ack_msdu_cnt = %u",
4161*5113495bSYour Name 		       dp_stats_buf->tcp_ack_msdu_cnt);
4162*5113495bSYour Name 	DP_PRINT_STATS("udp_msdu_cnt = %u",
4163*5113495bSYour Name 		       dp_stats_buf->udp_msdu_cnt);
4164*5113495bSYour Name 	DP_PRINT_STATS("other_msdu_cnt = %u",
4165*5113495bSYour Name 		       dp_stats_buf->other_msdu_cnt);
4166*5113495bSYour Name 	DP_PRINT_STATS("fw_ring_mpdu_ind = %u",
4167*5113495bSYour Name 		       dp_stats_buf->fw_ring_mpdu_ind);
4168*5113495bSYour Name 
4169*5113495bSYour Name 	qdf_mem_zero(fw_ring_subtype_buf, DP_MAX_STRING_LEN);
4170*5113495bSYour Name 	for (i = 0; i <  DP_HTT_FW_RING_MGMT_SUBTYPE_LEN; i++) {
4171*5113495bSYour Name 		index += qdf_snprint(&fw_ring_subtype_buf[index],
4172*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
4173*5113495bSYour Name 				" %u:%u,", i,
4174*5113495bSYour Name 				dp_stats_buf->fw_ring_mgmt_subtype[i]);
4175*5113495bSYour Name 	}
4176*5113495bSYour Name 	DP_PRINT_STATS("fw_ring_mgmt_subtype = %s ", fw_ring_subtype_buf);
4177*5113495bSYour Name 
4178*5113495bSYour Name 	index = 0;
4179*5113495bSYour Name 	qdf_mem_zero(fw_ring_subtype_buf, DP_MAX_STRING_LEN);
4180*5113495bSYour Name 	for (i = 0; i <  DP_HTT_FW_RING_CTRL_SUBTYPE_LEN; i++) {
4181*5113495bSYour Name 		index += qdf_snprint(&fw_ring_subtype_buf[index],
4182*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
4183*5113495bSYour Name 				" %u:%u,", i,
4184*5113495bSYour Name 				dp_stats_buf->fw_ring_ctrl_subtype[i]);
4185*5113495bSYour Name 	}
4186*5113495bSYour Name 	DP_PRINT_STATS("fw_ring_ctrl_subtype = %s ", fw_ring_subtype_buf);
4187*5113495bSYour Name 	DP_PRINT_STATS("fw_ring_mcast_data_msdu = %u",
4188*5113495bSYour Name 		       dp_stats_buf->fw_ring_mcast_data_msdu);
4189*5113495bSYour Name 	DP_PRINT_STATS("fw_ring_bcast_data_msdu = %u",
4190*5113495bSYour Name 		       dp_stats_buf->fw_ring_bcast_data_msdu);
4191*5113495bSYour Name 	DP_PRINT_STATS("fw_ring_ucast_data_msdu = %u",
4192*5113495bSYour Name 		       dp_stats_buf->fw_ring_ucast_data_msdu);
4193*5113495bSYour Name 	DP_PRINT_STATS("fw_ring_null_data_msdu = %u",
4194*5113495bSYour Name 		       dp_stats_buf->fw_ring_null_data_msdu);
4195*5113495bSYour Name 	DP_PRINT_STATS("fw_ring_mpdu_drop = %u",
4196*5113495bSYour Name 		       dp_stats_buf->fw_ring_mpdu_drop);
4197*5113495bSYour Name 	DP_PRINT_STATS("ofld_local_data_ind_cnt = %u",
4198*5113495bSYour Name 		       dp_stats_buf->ofld_local_data_ind_cnt);
4199*5113495bSYour Name 	DP_PRINT_STATS("ofld_local_data_buf_recycle_cnt = %u",
4200*5113495bSYour Name 		       dp_stats_buf->ofld_local_data_buf_recycle_cnt);
4201*5113495bSYour Name 	DP_PRINT_STATS("drx_local_data_ind_cnt = %u",
4202*5113495bSYour Name 		       dp_stats_buf->drx_local_data_ind_cnt);
4203*5113495bSYour Name 	DP_PRINT_STATS("drx_local_data_buf_recycle_cnt = %u",
4204*5113495bSYour Name 		       dp_stats_buf->drx_local_data_buf_recycle_cnt);
4205*5113495bSYour Name 	DP_PRINT_STATS("local_nondata_ind_cnt = %u",
4206*5113495bSYour Name 		       dp_stats_buf->local_nondata_ind_cnt);
4207*5113495bSYour Name 	DP_PRINT_STATS("local_nondata_buf_recycle_cnt = %u",
4208*5113495bSYour Name 		       dp_stats_buf->local_nondata_buf_recycle_cnt);
4209*5113495bSYour Name 	DP_PRINT_STATS("fw_status_buf_ring_refill_cnt = %u",
4210*5113495bSYour Name 		       dp_stats_buf->fw_status_buf_ring_refill_cnt);
4211*5113495bSYour Name 	DP_PRINT_STATS("fw_status_buf_ring_empty_cnt = %u",
4212*5113495bSYour Name 		       dp_stats_buf->fw_status_buf_ring_empty_cnt);
4213*5113495bSYour Name 	DP_PRINT_STATS("fw_pkt_buf_ring_refill_cnt = %u",
4214*5113495bSYour Name 		       dp_stats_buf->fw_pkt_buf_ring_refill_cnt);
4215*5113495bSYour Name 	DP_PRINT_STATS("fw_pkt_buf_ring_empty_cnt = %u",
4216*5113495bSYour Name 		       dp_stats_buf->fw_pkt_buf_ring_empty_cnt);
4217*5113495bSYour Name 	DP_PRINT_STATS("fw_link_buf_ring_refill_cnt = %u",
4218*5113495bSYour Name 		       dp_stats_buf->fw_link_buf_ring_refill_cnt);
4219*5113495bSYour Name 	DP_PRINT_STATS("fw_link_buf_ring_empty_cnt = %u",
4220*5113495bSYour Name 		       dp_stats_buf->fw_link_buf_ring_empty_cnt);
4221*5113495bSYour Name 	DP_PRINT_STATS("host_pkt_buf_ring_refill_cnt = %u",
4222*5113495bSYour Name 		       dp_stats_buf->host_pkt_buf_ring_refill_cnt);
4223*5113495bSYour Name 	DP_PRINT_STATS("host_pkt_buf_ring_empty_cnt = %u",
4224*5113495bSYour Name 		       dp_stats_buf->host_pkt_buf_ring_empty_cnt);
4225*5113495bSYour Name 	DP_PRINT_STATS("mon_pkt_buf_ring_refill_cnt = %u",
4226*5113495bSYour Name 		       dp_stats_buf->mon_pkt_buf_ring_refill_cnt);
4227*5113495bSYour Name 	DP_PRINT_STATS("mon_pkt_buf_ring_empty_cnt = %u",
4228*5113495bSYour Name 		       dp_stats_buf->mon_pkt_buf_ring_empty_cnt);
4229*5113495bSYour Name 	DP_PRINT_STATS("mon_status_buf_ring_refill_cnt = %u",
4230*5113495bSYour Name 		       dp_stats_buf->mon_status_buf_ring_refill_cnt);
4231*5113495bSYour Name 	DP_PRINT_STATS("mon_status_buf_ring_empty_cnt = %u",
4232*5113495bSYour Name 		       dp_stats_buf->mon_status_buf_ring_empty_cnt);
4233*5113495bSYour Name 	DP_PRINT_STATS("mon_desc_buf_ring_refill_cnt = %u",
4234*5113495bSYour Name 		       dp_stats_buf->mon_desc_buf_ring_refill_cnt);
4235*5113495bSYour Name 	DP_PRINT_STATS("mon_desc_buf_ring_empty_cnt = %u",
4236*5113495bSYour Name 		       dp_stats_buf->mon_desc_buf_ring_empty_cnt);
4237*5113495bSYour Name 	DP_PRINT_STATS("mon_dest_ring_update_cnt = %u",
4238*5113495bSYour Name 		       dp_stats_buf->mon_dest_ring_update_cnt);
4239*5113495bSYour Name 	DP_PRINT_STATS("mon_dest_ring_full_cnt = %u",
4240*5113495bSYour Name 		       dp_stats_buf->mon_dest_ring_full_cnt);
4241*5113495bSYour Name 	DP_PRINT_STATS("rx_suspend_cnt = %u",
4242*5113495bSYour Name 		       dp_stats_buf->rx_suspend_cnt);
4243*5113495bSYour Name 	DP_PRINT_STATS("rx_suspend_fail_cnt = %u",
4244*5113495bSYour Name 		       dp_stats_buf->rx_suspend_fail_cnt);
4245*5113495bSYour Name 	DP_PRINT_STATS("rx_resume_cnt = %u",
4246*5113495bSYour Name 		       dp_stats_buf->rx_resume_cnt);
4247*5113495bSYour Name 	DP_PRINT_STATS("rx_resume_fail_cnt = %u",
4248*5113495bSYour Name 		       dp_stats_buf->rx_resume_fail_cnt);
4249*5113495bSYour Name 	DP_PRINT_STATS("rx_ring_switch_cnt = %u",
4250*5113495bSYour Name 		       dp_stats_buf->rx_ring_switch_cnt);
4251*5113495bSYour Name 	DP_PRINT_STATS("rx_ring_restore_cnt = %u",
4252*5113495bSYour Name 		       dp_stats_buf->rx_ring_restore_cnt);
4253*5113495bSYour Name 	DP_PRINT_STATS("rx_flush_cnt = %u\n",
4254*5113495bSYour Name 		       dp_stats_buf->rx_flush_cnt);
4255*5113495bSYour Name }
4256*5113495bSYour Name 
4257*5113495bSYour Name /**
4258*5113495bSYour Name  * dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v() - display
4259*5113495bSYour Name  *				htt_rx_pdev_fw_ring_mpdu_err_tlv_v
4260*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_ring_mpdu_err_tlv_v
4261*5113495bSYour Name  *
4262*5113495bSYour Name  * Return: void
4263*5113495bSYour Name  */
dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v(uint32_t * tag_buf)4264*5113495bSYour Name static void dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v(uint32_t *tag_buf)
4265*5113495bSYour Name {
4266*5113495bSYour Name 	htt_rx_pdev_fw_ring_mpdu_err_tlv_v *dp_stats_buf =
4267*5113495bSYour Name 		(htt_rx_pdev_fw_ring_mpdu_err_tlv_v *)tag_buf;
4268*5113495bSYour Name 	uint8_t i;
4269*5113495bSYour Name 	uint16_t index = 0;
4270*5113495bSYour Name 	char *fw_ring_mpdu_err = qdf_mem_malloc(DP_MAX_STRING_LEN);
4271*5113495bSYour Name 
4272*5113495bSYour Name 	if (!fw_ring_mpdu_err) {
4273*5113495bSYour Name 		dp_stats_err("Output buffer not allocated");
4274*5113495bSYour Name 		return;
4275*5113495bSYour Name 	}
4276*5113495bSYour Name 
4277*5113495bSYour Name 	DP_PRINT_STATS("HTT_RX_PDEV_FW_RING_MPDU_ERR_TLV_V:");
4278*5113495bSYour Name 	for (i = 0; i <  DP_HTT_FW_RING_MPDU_ERR_LEN; i++) {
4279*5113495bSYour Name 		index += qdf_snprint(&fw_ring_mpdu_err[index],
4280*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
4281*5113495bSYour Name 				" %u:%u,", i,
4282*5113495bSYour Name 				dp_stats_buf->fw_ring_mpdu_err[i]);
4283*5113495bSYour Name 	}
4284*5113495bSYour Name 	DP_PRINT_STATS("fw_ring_mpdu_err = %s\n", fw_ring_mpdu_err);
4285*5113495bSYour Name 	qdf_mem_free(fw_ring_mpdu_err);
4286*5113495bSYour Name }
4287*5113495bSYour Name 
4288*5113495bSYour Name /**
4289*5113495bSYour Name  * dp_print_rx_pdev_fw_mpdu_drop_tlv_v() - display htt_rx_pdev_fw_mpdu_drop_tlv_v
4290*5113495bSYour Name  * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_mpdu_drop_tlv_v
4291*5113495bSYour Name  *
4292*5113495bSYour Name  * Return: void
4293*5113495bSYour Name  */
dp_print_rx_pdev_fw_mpdu_drop_tlv_v(uint32_t * tag_buf)4294*5113495bSYour Name static void dp_print_rx_pdev_fw_mpdu_drop_tlv_v(uint32_t *tag_buf)
4295*5113495bSYour Name {
4296*5113495bSYour Name 	htt_rx_pdev_fw_mpdu_drop_tlv_v *dp_stats_buf =
4297*5113495bSYour Name 		(htt_rx_pdev_fw_mpdu_drop_tlv_v *)tag_buf;
4298*5113495bSYour Name 	uint8_t i;
4299*5113495bSYour Name 	uint16_t index = 0;
4300*5113495bSYour Name 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
4301*5113495bSYour Name 	char *fw_mpdu_drop = qdf_mem_malloc(DP_MAX_STRING_LEN);
4302*5113495bSYour Name 
4303*5113495bSYour Name 	if (!fw_mpdu_drop) {
4304*5113495bSYour Name 		dp_stats_err("Output buffer not allocated");
4305*5113495bSYour Name 		return;
4306*5113495bSYour Name 	}
4307*5113495bSYour Name 
4308*5113495bSYour Name 	tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_STATS_FW_DROP_REASON_MAX);
4309*5113495bSYour Name 
4310*5113495bSYour Name 	DP_PRINT_STATS("HTT_RX_PDEV_FW_MPDU_DROP_TLV_V:");
4311*5113495bSYour Name 	for (i = 0; i <  tag_len; i++) {
4312*5113495bSYour Name 		index += qdf_snprint(&fw_mpdu_drop[index],
4313*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
4314*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->fw_mpdu_drop[i]);
4315*5113495bSYour Name 	}
4316*5113495bSYour Name 	DP_PRINT_STATS("fw_mpdu_drop = %s\n", fw_mpdu_drop);
4317*5113495bSYour Name 	qdf_mem_free(fw_mpdu_drop);
4318*5113495bSYour Name }
4319*5113495bSYour Name 
4320*5113495bSYour Name /**
4321*5113495bSYour Name  * dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv() - Accounts for rxdma error
4322*5113495bSYour Name  * packets
4323*5113495bSYour Name  * @tag_buf: Buffer
4324*5113495bSYour Name  *
4325*5113495bSYour Name  * Return: void
4326*5113495bSYour Name  */
4327*5113495bSYour Name static uint64_t
dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv(uint32_t * tag_buf)4328*5113495bSYour Name dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv(uint32_t *tag_buf)
4329*5113495bSYour Name {
4330*5113495bSYour Name 	htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v *dp_stats_buf =
4331*5113495bSYour Name 		(htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v *)tag_buf;
4332*5113495bSYour Name 
4333*5113495bSYour Name 	uint8_t i;
4334*5113495bSYour Name 	uint16_t index = 0;
4335*5113495bSYour Name 	char rxdma_err_cnt[DP_MAX_STRING_LEN] = {'\0'};
4336*5113495bSYour Name 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
4337*5113495bSYour Name 	uint64_t total_rxdma_err_cnt = 0;
4338*5113495bSYour Name 
4339*5113495bSYour Name 	tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_RXDMA_MAX_ERR_CODE);
4340*5113495bSYour Name 
4341*5113495bSYour Name 	DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_RXDMA_ERR_TLV_V");
4342*5113495bSYour Name 
4343*5113495bSYour Name 	for (i = 0; i <  tag_len; i++) {
4344*5113495bSYour Name 		index += snprintf(&rxdma_err_cnt[index],
4345*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
4346*5113495bSYour Name 				" %u() -%u,", i,
4347*5113495bSYour Name 				dp_stats_buf->rxdma_err[i]);
4348*5113495bSYour Name 		total_rxdma_err_cnt += dp_stats_buf->rxdma_err[i];
4349*5113495bSYour Name 	}
4350*5113495bSYour Name 
4351*5113495bSYour Name 	DP_PRINT_STATS("rxdma_err = %s\n", rxdma_err_cnt);
4352*5113495bSYour Name 
4353*5113495bSYour Name 	return total_rxdma_err_cnt;
4354*5113495bSYour Name }
4355*5113495bSYour Name 
4356*5113495bSYour Name /**
4357*5113495bSYour Name  * dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv() - Accounts for reo error
4358*5113495bSYour Name  * packets
4359*5113495bSYour Name  * @tag_buf: Buffer
4360*5113495bSYour Name  *
4361*5113495bSYour Name  * Return: void
4362*5113495bSYour Name  */
dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv(uint32_t * tag_buf)4363*5113495bSYour Name static void dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv(uint32_t *tag_buf)
4364*5113495bSYour Name {
4365*5113495bSYour Name 	htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v *dp_stats_buf =
4366*5113495bSYour Name 		(htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v *)tag_buf;
4367*5113495bSYour Name 
4368*5113495bSYour Name 	uint8_t i;
4369*5113495bSYour Name 	uint16_t index = 0;
4370*5113495bSYour Name 	char reo_err_cnt[DP_MAX_STRING_LEN] = {'\0'};
4371*5113495bSYour Name 	uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
4372*5113495bSYour Name 
4373*5113495bSYour Name 	tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_REO_MAX_ERR_CODE);
4374*5113495bSYour Name 
4375*5113495bSYour Name 	DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_REO_ERR_TLV_V");
4376*5113495bSYour Name 
4377*5113495bSYour Name 	for (i = 0; i <  tag_len; i++) {
4378*5113495bSYour Name 		index += snprintf(&reo_err_cnt[index],
4379*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
4380*5113495bSYour Name 				" %u() -%u,", i,
4381*5113495bSYour Name 				dp_stats_buf->reo_err[i]);
4382*5113495bSYour Name 	}
4383*5113495bSYour Name 
4384*5113495bSYour Name 	DP_PRINT_STATS("reo_err = %s\n", reo_err_cnt);
4385*5113495bSYour Name }
4386*5113495bSYour Name 
4387*5113495bSYour Name /**
4388*5113495bSYour Name  * dp_print_rx_reo_debug_stats_tlv() - REO Statistics
4389*5113495bSYour Name  * @tag_buf: Buffer
4390*5113495bSYour Name  *
4391*5113495bSYour Name  * Return: void
4392*5113495bSYour Name  */
dp_print_rx_reo_debug_stats_tlv(uint32_t * tag_buf)4393*5113495bSYour Name static void dp_print_rx_reo_debug_stats_tlv(uint32_t *tag_buf)
4394*5113495bSYour Name {
4395*5113495bSYour Name 	htt_rx_reo_resource_stats_tlv_v *dp_stats_buf =
4396*5113495bSYour Name 			(htt_rx_reo_resource_stats_tlv_v *)tag_buf;
4397*5113495bSYour Name 
4398*5113495bSYour Name 	DP_PRINT_STATS("HTT_RX_REO_RESOURCE_STATS_TLV");
4399*5113495bSYour Name 
4400*5113495bSYour Name 	DP_PRINT_STATS("sample_id() - %u ",
4401*5113495bSYour Name 		       dp_stats_buf->sample_id);
4402*5113495bSYour Name 	DP_PRINT_STATS("total_max: %u ",
4403*5113495bSYour Name 		       dp_stats_buf->total_max);
4404*5113495bSYour Name 	DP_PRINT_STATS("total_avg: %u ",
4405*5113495bSYour Name 		       dp_stats_buf->total_avg);
4406*5113495bSYour Name 	DP_PRINT_STATS("total_sample: %u ",
4407*5113495bSYour Name 		       dp_stats_buf->total_sample);
4408*5113495bSYour Name 	DP_PRINT_STATS("non_zeros_avg: %u ",
4409*5113495bSYour Name 		       dp_stats_buf->non_zeros_avg);
4410*5113495bSYour Name 	DP_PRINT_STATS("non_zeros_sample: %u ",
4411*5113495bSYour Name 		       dp_stats_buf->non_zeros_sample);
4412*5113495bSYour Name 	DP_PRINT_STATS("last_non_zeros_max: %u ",
4413*5113495bSYour Name 		       dp_stats_buf->last_non_zeros_max);
4414*5113495bSYour Name 	DP_PRINT_STATS("last_non_zeros_min: %u ",
4415*5113495bSYour Name 		       dp_stats_buf->last_non_zeros_min);
4416*5113495bSYour Name 	DP_PRINT_STATS("last_non_zeros_avg: %u ",
4417*5113495bSYour Name 		       dp_stats_buf->last_non_zeros_avg);
4418*5113495bSYour Name 	DP_PRINT_STATS("last_non_zeros_sample: %u\n ",
4419*5113495bSYour Name 		       dp_stats_buf->last_non_zeros_sample);
4420*5113495bSYour Name }
4421*5113495bSYour Name 
4422*5113495bSYour Name /**
4423*5113495bSYour Name  * dp_print_rx_pdev_fw_stats_phy_err_tlv() - Accounts for phy errors
4424*5113495bSYour Name  * @tag_buf: Buffer
4425*5113495bSYour Name  *
4426*5113495bSYour Name  * Return: void
4427*5113495bSYour Name  */
dp_print_rx_pdev_fw_stats_phy_err_tlv(uint32_t * tag_buf)4428*5113495bSYour Name static void dp_print_rx_pdev_fw_stats_phy_err_tlv(uint32_t *tag_buf)
4429*5113495bSYour Name {
4430*5113495bSYour Name 	htt_rx_pdev_fw_stats_phy_err_tlv *dp_stats_buf =
4431*5113495bSYour Name 		(htt_rx_pdev_fw_stats_phy_err_tlv *)tag_buf;
4432*5113495bSYour Name 
4433*5113495bSYour Name 	uint8_t i = 0;
4434*5113495bSYour Name 	uint16_t index = 0;
4435*5113495bSYour Name 	char phy_errs[DP_MAX_STRING_LEN];
4436*5113495bSYour Name 
4437*5113495bSYour Name 	DP_PRINT_STATS("HTT_RX_PDEV_FW_STATS_PHY_ERR_TLV");
4438*5113495bSYour Name 
4439*5113495bSYour Name 	DP_PRINT_STATS("mac_id_word() - %u",
4440*5113495bSYour Name 		       dp_stats_buf->mac_id__word);
4441*5113495bSYour Name 	DP_PRINT_STATS("total_phy_err_cnt: %u",
4442*5113495bSYour Name 		       dp_stats_buf->total_phy_err_cnt);
4443*5113495bSYour Name 
4444*5113495bSYour Name 	for (i = 0; i < HTT_STATS_PHY_ERR_MAX; i++) {
4445*5113495bSYour Name 		index += snprintf(&phy_errs[index],
4446*5113495bSYour Name 				DP_MAX_STRING_LEN - index,
4447*5113495bSYour Name 				" %u:%u,", i, dp_stats_buf->phy_err[i]);
4448*5113495bSYour Name 	}
4449*5113495bSYour Name 
4450*5113495bSYour Name 	DP_PRINT_STATS("phy_errs: %s\n",  phy_errs);
4451*5113495bSYour Name }
4452*5113495bSYour Name 
dp_htt_stats_print_tag(struct dp_pdev * pdev,uint8_t tag_type,uint32_t * tag_buf)4453*5113495bSYour Name void dp_htt_stats_print_tag(struct dp_pdev *pdev,
4454*5113495bSYour Name 			    uint8_t tag_type, uint32_t *tag_buf)
4455*5113495bSYour Name {
4456*5113495bSYour Name 	switch (tag_type) {
4457*5113495bSYour Name 	case HTT_STATS_TX_PDEV_CMN_TAG:
4458*5113495bSYour Name 		dp_print_tx_pdev_stats_cmn_tlv(tag_buf);
4459*5113495bSYour Name 		break;
4460*5113495bSYour Name 	case HTT_STATS_TX_PDEV_UNDERRUN_TAG:
4461*5113495bSYour Name 		dp_print_tx_pdev_stats_urrn_tlv_v(tag_buf);
4462*5113495bSYour Name 		break;
4463*5113495bSYour Name 	case HTT_STATS_TX_PDEV_SIFS_TAG:
4464*5113495bSYour Name 		dp_print_tx_pdev_stats_sifs_tlv_v(tag_buf);
4465*5113495bSYour Name 		break;
4466*5113495bSYour Name 	case HTT_STATS_TX_PDEV_FLUSH_TAG:
4467*5113495bSYour Name 		dp_print_tx_pdev_stats_flush_tlv_v(tag_buf);
4468*5113495bSYour Name 		break;
4469*5113495bSYour Name 
4470*5113495bSYour Name 	case HTT_STATS_TX_PDEV_PHY_ERR_TAG:
4471*5113495bSYour Name 		dp_print_tx_pdev_stats_phy_err_tlv_v(tag_buf);
4472*5113495bSYour Name 		break;
4473*5113495bSYour Name 
4474*5113495bSYour Name 	case HTT_STATS_STRING_TAG:
4475*5113495bSYour Name 		dp_print_stats_string_tlv(tag_buf);
4476*5113495bSYour Name 		break;
4477*5113495bSYour Name 
4478*5113495bSYour Name 	case HTT_STATS_TX_HWQ_CMN_TAG:
4479*5113495bSYour Name 		dp_print_tx_hwq_stats_cmn_tlv(tag_buf);
4480*5113495bSYour Name 		break;
4481*5113495bSYour Name 
4482*5113495bSYour Name 	case HTT_STATS_TX_HWQ_DIFS_LATENCY_TAG:
4483*5113495bSYour Name 		dp_print_tx_hwq_difs_latency_stats_tlv_v(tag_buf);
4484*5113495bSYour Name 		break;
4485*5113495bSYour Name 
4486*5113495bSYour Name 	case HTT_STATS_TX_HWQ_CMD_RESULT_TAG:
4487*5113495bSYour Name 		dp_print_tx_hwq_cmd_result_stats_tlv_v(tag_buf);
4488*5113495bSYour Name 		break;
4489*5113495bSYour Name 
4490*5113495bSYour Name 	case HTT_STATS_TX_HWQ_CMD_STALL_TAG:
4491*5113495bSYour Name 		dp_print_tx_hwq_cmd_stall_stats_tlv_v(tag_buf);
4492*5113495bSYour Name 		break;
4493*5113495bSYour Name 
4494*5113495bSYour Name 	case HTT_STATS_TX_HWQ_FES_STATUS_TAG:
4495*5113495bSYour Name 		dp_print_tx_hwq_fes_result_stats_tlv_v(tag_buf);
4496*5113495bSYour Name 		break;
4497*5113495bSYour Name 
4498*5113495bSYour Name 	case HTT_STATS_TX_TQM_GEN_MPDU_TAG:
4499*5113495bSYour Name 		dp_print_tx_tqm_gen_mpdu_stats_tlv_v(tag_buf);
4500*5113495bSYour Name 		break;
4501*5113495bSYour Name 
4502*5113495bSYour Name 	case HTT_STATS_TX_TQM_LIST_MPDU_TAG:
4503*5113495bSYour Name 		dp_print_tx_tqm_list_mpdu_stats_tlv_v(tag_buf);
4504*5113495bSYour Name 		break;
4505*5113495bSYour Name 
4506*5113495bSYour Name 	case HTT_STATS_TX_TQM_LIST_MPDU_CNT_TAG:
4507*5113495bSYour Name 		dp_print_tx_tqm_list_mpdu_cnt_tlv_v(tag_buf);
4508*5113495bSYour Name 		break;
4509*5113495bSYour Name 
4510*5113495bSYour Name 	case HTT_STATS_TX_TQM_CMN_TAG:
4511*5113495bSYour Name 		dp_print_tx_tqm_cmn_stats_tlv(tag_buf);
4512*5113495bSYour Name 		break;
4513*5113495bSYour Name 
4514*5113495bSYour Name 	case HTT_STATS_TX_TQM_PDEV_TAG:
4515*5113495bSYour Name 		dp_print_tx_tqm_pdev_stats_tlv_v(tag_buf);
4516*5113495bSYour Name 		break;
4517*5113495bSYour Name 
4518*5113495bSYour Name 	case HTT_STATS_TX_TQM_CMDQ_STATUS_TAG:
4519*5113495bSYour Name 		dp_print_tx_tqm_cmdq_status_tlv(tag_buf);
4520*5113495bSYour Name 		break;
4521*5113495bSYour Name 
4522*5113495bSYour Name 	case HTT_STATS_TX_DE_EAPOL_PACKETS_TAG:
4523*5113495bSYour Name 		dp_print_tx_de_eapol_packets_stats_tlv(tag_buf);
4524*5113495bSYour Name 		break;
4525*5113495bSYour Name 
4526*5113495bSYour Name 	case HTT_STATS_TX_DE_CLASSIFY_FAILED_TAG:
4527*5113495bSYour Name 		dp_print_tx_de_classify_failed_stats_tlv(tag_buf);
4528*5113495bSYour Name 		break;
4529*5113495bSYour Name 
4530*5113495bSYour Name 	case HTT_STATS_TX_DE_CLASSIFY_STATS_TAG:
4531*5113495bSYour Name 		dp_print_tx_de_classify_stats_tlv(tag_buf);
4532*5113495bSYour Name 		break;
4533*5113495bSYour Name 
4534*5113495bSYour Name 	case HTT_STATS_TX_DE_CLASSIFY_STATUS_TAG:
4535*5113495bSYour Name 		dp_print_tx_de_classify_status_stats_tlv(tag_buf);
4536*5113495bSYour Name 		break;
4537*5113495bSYour Name 
4538*5113495bSYour Name 	case HTT_STATS_TX_DE_ENQUEUE_PACKETS_TAG:
4539*5113495bSYour Name 		dp_print_tx_de_enqueue_packets_stats_tlv(tag_buf);
4540*5113495bSYour Name 		break;
4541*5113495bSYour Name 
4542*5113495bSYour Name 	case HTT_STATS_TX_DE_ENQUEUE_DISCARD_TAG:
4543*5113495bSYour Name 		dp_print_tx_de_enqueue_discard_stats_tlv(tag_buf);
4544*5113495bSYour Name 		break;
4545*5113495bSYour Name 
4546*5113495bSYour Name 	case HTT_STATS_TX_DE_CMN_TAG:
4547*5113495bSYour Name 		dp_print_tx_de_cmn_stats_tlv(tag_buf);
4548*5113495bSYour Name 		break;
4549*5113495bSYour Name 
4550*5113495bSYour Name 	case HTT_STATS_RING_IF_TAG:
4551*5113495bSYour Name 		dp_print_ring_if_stats_tlv(tag_buf);
4552*5113495bSYour Name 		break;
4553*5113495bSYour Name 
4554*5113495bSYour Name 	case HTT_STATS_TX_PDEV_MU_MIMO_STATS_TAG:
4555*5113495bSYour Name 		dp_print_tx_pdev_mu_mimo_sch_stats_tlv(tag_buf);
4556*5113495bSYour Name 		break;
4557*5113495bSYour Name 
4558*5113495bSYour Name 	case HTT_STATS_SFM_CMN_TAG:
4559*5113495bSYour Name 		dp_print_sfm_cmn_tlv(tag_buf);
4560*5113495bSYour Name 		break;
4561*5113495bSYour Name 
4562*5113495bSYour Name 	case HTT_STATS_SRING_STATS_TAG:
4563*5113495bSYour Name 		dp_print_sring_stats_tlv(tag_buf);
4564*5113495bSYour Name 		break;
4565*5113495bSYour Name 
4566*5113495bSYour Name 	case HTT_STATS_RX_PDEV_FW_STATS_TAG:
4567*5113495bSYour Name 		dp_print_rx_pdev_fw_stats_tlv(tag_buf);
4568*5113495bSYour Name 		break;
4569*5113495bSYour Name 
4570*5113495bSYour Name 	case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG:
4571*5113495bSYour Name 		dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v(tag_buf);
4572*5113495bSYour Name 		break;
4573*5113495bSYour Name 
4574*5113495bSYour Name 	case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG:
4575*5113495bSYour Name 		dp_print_rx_pdev_fw_mpdu_drop_tlv_v(tag_buf);
4576*5113495bSYour Name 		break;
4577*5113495bSYour Name 
4578*5113495bSYour Name 	case HTT_STATS_RX_SOC_FW_STATS_TAG:
4579*5113495bSYour Name 		dp_print_rx_soc_fw_stats_tlv(tag_buf);
4580*5113495bSYour Name 		break;
4581*5113495bSYour Name 
4582*5113495bSYour Name 	case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG:
4583*5113495bSYour Name 		dp_print_rx_soc_fw_refill_ring_empty_tlv_v(tag_buf);
4584*5113495bSYour Name 		break;
4585*5113495bSYour Name 
4586*5113495bSYour Name 	case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG:
4587*5113495bSYour Name 		dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v(
4588*5113495bSYour Name 				tag_buf);
4589*5113495bSYour Name 		break;
4590*5113495bSYour Name 
4591*5113495bSYour Name 	case HTT_STATS_TX_PDEV_RATE_STATS_TAG:
4592*5113495bSYour Name 		dp_print_tx_pdev_rate_stats_tlv(tag_buf);
4593*5113495bSYour Name 		break;
4594*5113495bSYour Name 
4595*5113495bSYour Name 	case HTT_STATS_RX_PDEV_RATE_STATS_TAG:
4596*5113495bSYour Name 		dp_print_rx_pdev_rate_stats_tlv(pdev, tag_buf);
4597*5113495bSYour Name 		break;
4598*5113495bSYour Name 
4599*5113495bSYour Name 	case HTT_STATS_RX_PDEV_RATE_EXT_STATS_TAG:
4600*5113495bSYour Name 		dp_print_rx_pdev_rate_ext_stats_tlv(pdev, tag_buf);
4601*5113495bSYour Name 		break;
4602*5113495bSYour Name 
4603*5113495bSYour Name 	case HTT_STATS_TX_PDEV_SCHEDULER_TXQ_STATS_TAG:
4604*5113495bSYour Name 		dp_print_tx_pdev_stats_sched_per_txq_tlv(tag_buf);
4605*5113495bSYour Name 		break;
4606*5113495bSYour Name 
4607*5113495bSYour Name 	case HTT_STATS_TX_SCHED_CMN_TAG:
4608*5113495bSYour Name 		dp_print_stats_tx_sched_cmn_tlv(tag_buf);
4609*5113495bSYour Name 		break;
4610*5113495bSYour Name 
4611*5113495bSYour Name 	case HTT_STATS_TX_PDEV_MPDU_STATS_TAG:
4612*5113495bSYour Name 		dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv(tag_buf);
4613*5113495bSYour Name 		break;
4614*5113495bSYour Name 
4615*5113495bSYour Name 	case HTT_STATS_SCHED_TXQ_CMD_POSTED_TAG:
4616*5113495bSYour Name 		dp_print_sched_txq_cmd_posted_tlv_v(tag_buf);
4617*5113495bSYour Name 		break;
4618*5113495bSYour Name 
4619*5113495bSYour Name 	case HTT_STATS_RING_IF_CMN_TAG:
4620*5113495bSYour Name 		dp_print_ring_if_cmn_tlv(tag_buf);
4621*5113495bSYour Name 		break;
4622*5113495bSYour Name 
4623*5113495bSYour Name 	case HTT_STATS_SFM_CLIENT_USER_TAG:
4624*5113495bSYour Name 		dp_print_sfm_client_user_tlv_v(tag_buf);
4625*5113495bSYour Name 		break;
4626*5113495bSYour Name 
4627*5113495bSYour Name 	case HTT_STATS_SFM_CLIENT_TAG:
4628*5113495bSYour Name 		dp_print_sfm_client_tlv(tag_buf);
4629*5113495bSYour Name 		break;
4630*5113495bSYour Name 
4631*5113495bSYour Name 	case HTT_STATS_TX_TQM_ERROR_STATS_TAG:
4632*5113495bSYour Name 		dp_print_tx_tqm_error_stats_tlv(tag_buf);
4633*5113495bSYour Name 		break;
4634*5113495bSYour Name 
4635*5113495bSYour Name 	case HTT_STATS_SCHED_TXQ_CMD_REAPED_TAG:
4636*5113495bSYour Name 		dp_print_sched_txq_cmd_reaped_tlv_v(tag_buf);
4637*5113495bSYour Name 		break;
4638*5113495bSYour Name 
4639*5113495bSYour Name 	case HTT_STATS_SRING_CMN_TAG:
4640*5113495bSYour Name 		dp_print_sring_cmn_tlv(tag_buf);
4641*5113495bSYour Name 		break;
4642*5113495bSYour Name 
4643*5113495bSYour Name 	case HTT_STATS_TX_SELFGEN_AC_ERR_STATS_TAG:
4644*5113495bSYour Name 		dp_print_tx_selfgen_ac_err_stats_tlv(tag_buf);
4645*5113495bSYour Name 		break;
4646*5113495bSYour Name 
4647*5113495bSYour Name 	case HTT_STATS_TX_SELFGEN_CMN_STATS_TAG:
4648*5113495bSYour Name 		dp_print_tx_selfgen_cmn_stats_tlv(tag_buf);
4649*5113495bSYour Name 		break;
4650*5113495bSYour Name 
4651*5113495bSYour Name 	case HTT_STATS_TX_SELFGEN_AC_STATS_TAG:
4652*5113495bSYour Name 		dp_print_tx_selfgen_ac_stats_tlv(tag_buf);
4653*5113495bSYour Name 		break;
4654*5113495bSYour Name 
4655*5113495bSYour Name 	case HTT_STATS_TX_SELFGEN_AX_STATS_TAG:
4656*5113495bSYour Name 		dp_print_tx_selfgen_ax_stats_tlv(tag_buf);
4657*5113495bSYour Name 		break;
4658*5113495bSYour Name 
4659*5113495bSYour Name 	case HTT_STATS_TX_SELFGEN_AX_ERR_STATS_TAG:
4660*5113495bSYour Name 		dp_print_tx_selfgen_ax_err_stats_tlv(tag_buf);
4661*5113495bSYour Name 		break;
4662*5113495bSYour Name 
4663*5113495bSYour Name 	case  HTT_STATS_TX_SELFGEN_BE_STATS_TAG:
4664*5113495bSYour Name 		dp_print_tx_selfgen_be_stats_tlv(tag_buf);
4665*5113495bSYour Name 		break;
4666*5113495bSYour Name 
4667*5113495bSYour Name 	case HTT_STATS_TX_SELFGEN_BE_ERR_STATS_TAG:
4668*5113495bSYour Name 		dp_print_tx_selfgen_be_err_stats_tlv(tag_buf);
4669*5113495bSYour Name 		break;
4670*5113495bSYour Name 
4671*5113495bSYour Name 	case HTT_STATS_TX_SOUNDING_STATS_TAG:
4672*5113495bSYour Name 		dp_print_tx_sounding_stats_tlv(tag_buf);
4673*5113495bSYour Name 		break;
4674*5113495bSYour Name 
4675*5113495bSYour Name 	case HTT_STATS_TX_HWQ_MUMIMO_SCH_STATS_TAG:
4676*5113495bSYour Name 		dp_print_tx_hwq_mu_mimo_sch_stats_tlv(tag_buf);
4677*5113495bSYour Name 		break;
4678*5113495bSYour Name 
4679*5113495bSYour Name 	case HTT_STATS_TX_HWQ_MUMIMO_MPDU_STATS_TAG:
4680*5113495bSYour Name 		dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv(tag_buf);
4681*5113495bSYour Name 		break;
4682*5113495bSYour Name 
4683*5113495bSYour Name 	case HTT_STATS_TX_HWQ_MUMIMO_CMN_STATS_TAG:
4684*5113495bSYour Name 		dp_print_tx_hwq_mu_mimo_cmn_stats_tlv(tag_buf);
4685*5113495bSYour Name 		break;
4686*5113495bSYour Name 
4687*5113495bSYour Name 	case HTT_STATS_HW_INTR_MISC_TAG:
4688*5113495bSYour Name 		dp_print_hw_stats_intr_misc_tlv(tag_buf);
4689*5113495bSYour Name 		break;
4690*5113495bSYour Name 
4691*5113495bSYour Name 	case HTT_STATS_HW_WD_TIMEOUT_TAG:
4692*5113495bSYour Name 		dp_print_hw_stats_wd_timeout_tlv(tag_buf);
4693*5113495bSYour Name 		break;
4694*5113495bSYour Name 
4695*5113495bSYour Name 	case HTT_STATS_HW_PDEV_ERRS_TAG:
4696*5113495bSYour Name 		dp_print_hw_stats_pdev_errs_tlv(tag_buf);
4697*5113495bSYour Name 		break;
4698*5113495bSYour Name 
4699*5113495bSYour Name 	case HTT_STATS_COUNTER_NAME_TAG:
4700*5113495bSYour Name 		dp_print_counter_tlv(tag_buf);
4701*5113495bSYour Name 		break;
4702*5113495bSYour Name 
4703*5113495bSYour Name 	case HTT_STATS_TX_TID_DETAILS_TAG:
4704*5113495bSYour Name 		dp_print_tx_tid_stats_tlv(tag_buf);
4705*5113495bSYour Name 		break;
4706*5113495bSYour Name 
4707*5113495bSYour Name 	case HTT_STATS_TX_TID_DETAILS_V1_TAG:
4708*5113495bSYour Name 		dp_print_tx_tid_stats_v1_tlv(tag_buf);
4709*5113495bSYour Name 		break;
4710*5113495bSYour Name 
4711*5113495bSYour Name 	case HTT_STATS_RX_TID_DETAILS_TAG:
4712*5113495bSYour Name 		dp_print_rx_tid_stats_tlv(tag_buf);
4713*5113495bSYour Name 		break;
4714*5113495bSYour Name 
4715*5113495bSYour Name 	case HTT_STATS_PEER_STATS_CMN_TAG:
4716*5113495bSYour Name 		dp_print_peer_stats_cmn_tlv(tag_buf);
4717*5113495bSYour Name 		break;
4718*5113495bSYour Name 
4719*5113495bSYour Name 	case HTT_STATS_PEER_DETAILS_TAG:
4720*5113495bSYour Name 		dp_print_peer_details_tlv(tag_buf);
4721*5113495bSYour Name 		break;
4722*5113495bSYour Name 
4723*5113495bSYour Name 	case HTT_STATS_PEER_MSDU_FLOWQ_TAG:
4724*5113495bSYour Name 		dp_print_msdu_flow_stats_tlv(tag_buf);
4725*5113495bSYour Name 		break;
4726*5113495bSYour Name 
4727*5113495bSYour Name 	case HTT_STATS_PEER_TX_RATE_STATS_TAG:
4728*5113495bSYour Name 		dp_print_tx_peer_rate_stats_tlv(tag_buf);
4729*5113495bSYour Name 		break;
4730*5113495bSYour Name 
4731*5113495bSYour Name 	case HTT_STATS_PEER_RX_RATE_STATS_TAG:
4732*5113495bSYour Name 		dp_print_rx_peer_rate_stats_tlv(tag_buf);
4733*5113495bSYour Name 		break;
4734*5113495bSYour Name 
4735*5113495bSYour Name 	case HTT_STATS_TX_DE_COMPL_STATS_TAG:
4736*5113495bSYour Name 		dp_print_tx_de_compl_stats_tlv(tag_buf);
4737*5113495bSYour Name 		break;
4738*5113495bSYour Name 
4739*5113495bSYour Name 	case HTT_STATS_RX_REFILL_RXDMA_ERR_TAG:
4740*5113495bSYour Name 		pdev->stats.err.fw_reported_rxdma_error =
4741*5113495bSYour Name 		dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv(tag_buf);
4742*5113495bSYour Name 		break;
4743*5113495bSYour Name 
4744*5113495bSYour Name 	case HTT_STATS_RX_REFILL_REO_ERR_TAG:
4745*5113495bSYour Name 		dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv(tag_buf);
4746*5113495bSYour Name 		break;
4747*5113495bSYour Name 
4748*5113495bSYour Name 	case HTT_STATS_RX_REO_RESOURCE_STATS_TAG:
4749*5113495bSYour Name 		dp_print_rx_reo_debug_stats_tlv(tag_buf);
4750*5113495bSYour Name 		break;
4751*5113495bSYour Name 
4752*5113495bSYour Name 	case HTT_STATS_RX_PDEV_FW_STATS_PHY_ERR_TAG:
4753*5113495bSYour Name 		dp_print_rx_pdev_fw_stats_phy_err_tlv(tag_buf);
4754*5113495bSYour Name 		break;
4755*5113495bSYour Name 
4756*5113495bSYour Name 	default:
4757*5113495bSYour Name 		break;
4758*5113495bSYour Name 	}
4759*5113495bSYour Name }
4760*5113495bSYour Name 
dp_htt_stats_copy_tag(struct dp_pdev * pdev,uint8_t tag_type,uint32_t * tag_buf)4761*5113495bSYour Name void dp_htt_stats_copy_tag(struct dp_pdev *pdev, uint8_t tag_type, uint32_t *tag_buf)
4762*5113495bSYour Name {
4763*5113495bSYour Name 	void *dest_ptr = NULL;
4764*5113495bSYour Name 	uint32_t size = 0;
4765*5113495bSYour Name 	uint32_t size_expected = 0;
4766*5113495bSYour Name 	uint64_t val = 1;
4767*5113495bSYour Name 
4768*5113495bSYour Name 	pdev->fw_stats_tlv_bitmap_rcvd |= (val << tag_type);
4769*5113495bSYour Name 	switch (tag_type) {
4770*5113495bSYour Name 	case HTT_STATS_TX_PDEV_CMN_TAG:
4771*5113495bSYour Name 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.cmn_tlv;
4772*5113495bSYour Name 		size = sizeof(htt_tx_pdev_stats_cmn_tlv);
4773*5113495bSYour Name 		size_expected = sizeof(struct cdp_htt_tx_pdev_stats_cmn_tlv);
4774*5113495bSYour Name 		break;
4775*5113495bSYour Name 	case HTT_STATS_TX_PDEV_UNDERRUN_TAG:
4776*5113495bSYour Name 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.underrun_tlv;
4777*5113495bSYour Name 		size = sizeof(htt_tx_pdev_stats_urrn_tlv_v);
4778*5113495bSYour Name 		size_expected = sizeof(struct cdp_htt_tx_pdev_stats_urrn_tlv_v);
4779*5113495bSYour Name 		break;
4780*5113495bSYour Name 	case HTT_STATS_TX_PDEV_SIFS_TAG:
4781*5113495bSYour Name 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.sifs_tlv;
4782*5113495bSYour Name 		size = sizeof(htt_tx_pdev_stats_sifs_tlv_v);
4783*5113495bSYour Name 		size_expected = sizeof(struct cdp_htt_tx_pdev_stats_sifs_tlv_v);
4784*5113495bSYour Name 		break;
4785*5113495bSYour Name 	case HTT_STATS_TX_PDEV_FLUSH_TAG:
4786*5113495bSYour Name 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.flush_tlv;
4787*5113495bSYour Name 		size = sizeof(htt_tx_pdev_stats_flush_tlv_v);
4788*5113495bSYour Name 		size_expected =
4789*5113495bSYour Name 			sizeof(struct cdp_htt_tx_pdev_stats_flush_tlv_v);
4790*5113495bSYour Name 		break;
4791*5113495bSYour Name 	case HTT_STATS_TX_PDEV_PHY_ERR_TAG:
4792*5113495bSYour Name 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.phy_err_tlv;
4793*5113495bSYour Name 		size = sizeof(htt_tx_pdev_stats_phy_err_tlv_v);
4794*5113495bSYour Name 		size_expected =
4795*5113495bSYour Name 			sizeof(struct cdp_htt_tx_pdev_stats_phy_err_tlv_v);
4796*5113495bSYour Name 		break;
4797*5113495bSYour Name 	case HTT_STATS_RX_PDEV_FW_STATS_TAG:
4798*5113495bSYour Name 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_stats_tlv;
4799*5113495bSYour Name 		size = sizeof(htt_rx_pdev_fw_stats_tlv);
4800*5113495bSYour Name 		size_expected = sizeof(struct cdp_htt_rx_pdev_fw_stats_tlv);
4801*5113495bSYour Name 		break;
4802*5113495bSYour Name 	case HTT_STATS_RX_SOC_FW_STATS_TAG:
4803*5113495bSYour Name 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_tlv;
4804*5113495bSYour Name 		size = sizeof(htt_rx_soc_fw_stats_tlv);
4805*5113495bSYour Name 		size_expected = sizeof(struct cdp_htt_rx_soc_fw_stats_tlv);
4806*5113495bSYour Name 		break;
4807*5113495bSYour Name 	case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG:
4808*5113495bSYour Name 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_refill_ring_empty_tlv;
4809*5113495bSYour Name 		size = sizeof(htt_rx_soc_fw_refill_ring_empty_tlv_v);
4810*5113495bSYour Name 		size_expected =
4811*5113495bSYour Name 		sizeof(struct cdp_htt_rx_soc_fw_refill_ring_empty_tlv_v);
4812*5113495bSYour Name 		break;
4813*5113495bSYour Name 	case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG:
4814*5113495bSYour Name 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_refill_ring_num_refill_tlv;
4815*5113495bSYour Name 		size = sizeof(htt_rx_soc_fw_refill_ring_num_refill_tlv_v);
4816*5113495bSYour Name 		size_expected =
4817*5113495bSYour Name 		sizeof(struct cdp_htt_rx_soc_fw_refill_ring_num_refill_tlv_v);
4818*5113495bSYour Name 		break;
4819*5113495bSYour Name 	case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG:
4820*5113495bSYour Name 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_ring_mpdu_err_tlv;
4821*5113495bSYour Name 		size = sizeof(htt_rx_pdev_fw_ring_mpdu_err_tlv_v);
4822*5113495bSYour Name 		size_expected =
4823*5113495bSYour Name 			sizeof(struct cdp_htt_rx_pdev_fw_ring_mpdu_err_tlv_v);
4824*5113495bSYour Name 		break;
4825*5113495bSYour Name 	case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG:
4826*5113495bSYour Name 		dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_ring_mpdu_drop;
4827*5113495bSYour Name 		size = sizeof(htt_rx_pdev_fw_mpdu_drop_tlv_v);
4828*5113495bSYour Name 		size_expected =
4829*5113495bSYour Name 			sizeof(struct cdp_htt_rx_pdev_fw_mpdu_drop_tlv_v);
4830*5113495bSYour Name 		break;
4831*5113495bSYour Name 	default:
4832*5113495bSYour Name 		break;
4833*5113495bSYour Name 	}
4834*5113495bSYour Name 
4835*5113495bSYour Name 	if (size_expected < size)
4836*5113495bSYour Name 		dp_warn("Buffer Overflow:FW Struct Size:%d Host Struct Size:%d"
4837*5113495bSYour Name 			, size, size_expected);
4838*5113495bSYour Name 
4839*5113495bSYour Name 	if (dest_ptr)
4840*5113495bSYour Name 		qdf_mem_copy(dest_ptr, tag_buf, size_expected);
4841*5113495bSYour Name 
4842*5113495bSYour Name 	if (((pdev->fw_stats_tlv_bitmap_rcvd) & DP_HTT_TX_RX_EXPECTED_TLVS)
4843*5113495bSYour Name 	      == DP_HTT_TX_RX_EXPECTED_TLVS) {
4844*5113495bSYour Name 		qdf_event_set(&pdev->fw_stats_event);
4845*5113495bSYour Name 	}
4846*5113495bSYour Name }
4847*5113495bSYour Name 
4848*5113495bSYour Name #ifdef VDEV_PEER_PROTOCOL_COUNT
4849*5113495bSYour Name #ifdef VDEV_PEER_PROTOCOL_COUNT_TESTING
dp_peer_stats_update_protocol_test_cnt(struct dp_vdev * vdev,bool is_egress,bool is_rx)4850*5113495bSYour Name static QDF_STATUS dp_peer_stats_update_protocol_test_cnt(struct dp_vdev *vdev,
4851*5113495bSYour Name 							 bool is_egress,
4852*5113495bSYour Name 							 bool is_rx)
4853*5113495bSYour Name {
4854*5113495bSYour Name 	int mask;
4855*5113495bSYour Name 
4856*5113495bSYour Name 	if (is_egress)
4857*5113495bSYour Name 		if (is_rx)
4858*5113495bSYour Name 			mask = VDEV_PEER_PROTOCOL_RX_EGRESS_MASK;
4859*5113495bSYour Name 		else
4860*5113495bSYour Name 			mask = VDEV_PEER_PROTOCOL_TX_EGRESS_MASK;
4861*5113495bSYour Name 	else
4862*5113495bSYour Name 		if (is_rx)
4863*5113495bSYour Name 			mask = VDEV_PEER_PROTOCOL_RX_INGRESS_MASK;
4864*5113495bSYour Name 		else
4865*5113495bSYour Name 			mask = VDEV_PEER_PROTOCOL_TX_INGRESS_MASK;
4866*5113495bSYour Name 
4867*5113495bSYour Name 	if (qdf_unlikely(vdev->peer_protocol_count_dropmask & mask)) {
4868*5113495bSYour Name 		dp_info("drop mask set %x", vdev->peer_protocol_count_dropmask);
4869*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
4870*5113495bSYour Name 	}
4871*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
4872*5113495bSYour Name }
4873*5113495bSYour Name 
4874*5113495bSYour Name #else
dp_peer_stats_update_protocol_test_cnt(struct dp_vdev * vdev,bool is_egress,bool is_rx)4875*5113495bSYour Name static QDF_STATUS dp_peer_stats_update_protocol_test_cnt(struct dp_vdev *vdev,
4876*5113495bSYour Name 							 bool is_egress,
4877*5113495bSYour Name 							 bool is_rx)
4878*5113495bSYour Name {
4879*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
4880*5113495bSYour Name }
4881*5113495bSYour Name #endif
4882*5113495bSYour Name 
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*5113495bSYour Name void dp_vdev_peer_stats_update_protocol_cnt(struct dp_vdev *vdev,
4884*5113495bSYour Name 					    qdf_nbuf_t nbuf,
4885*5113495bSYour Name 					    struct dp_txrx_peer *txrx_peer,
4886*5113495bSYour Name 					    bool is_egress,
4887*5113495bSYour Name 					    bool is_rx)
4888*5113495bSYour Name {
4889*5113495bSYour Name 	struct dp_peer_per_pkt_stats *per_pkt_stats;
4890*5113495bSYour Name 	struct protocol_trace_count *protocol_trace_cnt;
4891*5113495bSYour Name 	enum cdp_protocol_trace prot;
4892*5113495bSYour Name 	struct dp_soc *soc;
4893*5113495bSYour Name 	struct ether_header *eh;
4894*5113495bSYour Name 	char *mac;
4895*5113495bSYour Name 	bool new_peer_ref = false;
4896*5113495bSYour Name 	struct dp_peer *peer = NULL;
4897*5113495bSYour Name 
4898*5113495bSYour Name 	if (qdf_likely(!vdev->peer_protocol_count_track))
4899*5113495bSYour Name 		return;
4900*5113495bSYour Name 	if (qdf_unlikely(dp_peer_stats_update_protocol_test_cnt(vdev,
4901*5113495bSYour Name 								is_egress,
4902*5113495bSYour Name 								is_rx) ==
4903*5113495bSYour Name 					       QDF_STATUS_SUCCESS))
4904*5113495bSYour Name 		return;
4905*5113495bSYour Name 
4906*5113495bSYour Name 	soc = vdev->pdev->soc;
4907*5113495bSYour Name 	eh = (struct ether_header *)qdf_nbuf_data(nbuf);
4908*5113495bSYour Name 	if (is_rx)
4909*5113495bSYour Name 		mac = eh->ether_shost;
4910*5113495bSYour Name 	else
4911*5113495bSYour Name 		mac = eh->ether_dhost;
4912*5113495bSYour Name 
4913*5113495bSYour Name 	if (!txrx_peer) {
4914*5113495bSYour Name 		peer = dp_peer_find_hash_find(soc, mac, 0, vdev->vdev_id,
4915*5113495bSYour Name 					      DP_MOD_ID_GENERIC_STATS);
4916*5113495bSYour Name 		new_peer_ref = true;
4917*5113495bSYour Name 		if (!peer)
4918*5113495bSYour Name 			return;
4919*5113495bSYour Name 
4920*5113495bSYour Name 		txrx_peer = peer->txrx_peer;
4921*5113495bSYour Name 		if (!txrx_peer)
4922*5113495bSYour Name 			goto dp_vdev_peer_stats_update_protocol_cnt_free_peer;
4923*5113495bSYour Name 	}
4924*5113495bSYour Name 	per_pkt_stats = &txrx_peer->stats[0].per_pkt_stats;
4925*5113495bSYour Name 
4926*5113495bSYour Name 	if (qdf_nbuf_is_icmp_pkt(nbuf) == true)
4927*5113495bSYour Name 		prot = CDP_TRACE_ICMP;
4928*5113495bSYour Name 	else if (qdf_nbuf_is_ipv4_arp_pkt(nbuf) == true)
4929*5113495bSYour Name 		prot = CDP_TRACE_ARP;
4930*5113495bSYour Name 	else if (qdf_nbuf_is_ipv4_eapol_pkt(nbuf) == true)
4931*5113495bSYour Name 		prot = CDP_TRACE_EAP;
4932*5113495bSYour Name 	else
4933*5113495bSYour Name 		goto dp_vdev_peer_stats_update_protocol_cnt_free_peer;
4934*5113495bSYour Name 
4935*5113495bSYour Name 	if (is_rx)
4936*5113495bSYour Name 		protocol_trace_cnt = per_pkt_stats->rx.protocol_trace_cnt;
4937*5113495bSYour Name 	else
4938*5113495bSYour Name 		protocol_trace_cnt = per_pkt_stats->tx.protocol_trace_cnt;
4939*5113495bSYour Name 
4940*5113495bSYour Name 	if (is_egress)
4941*5113495bSYour Name 		protocol_trace_cnt[prot].egress_cnt++;
4942*5113495bSYour Name 	else
4943*5113495bSYour Name 		protocol_trace_cnt[prot].ingress_cnt++;
4944*5113495bSYour Name dp_vdev_peer_stats_update_protocol_cnt_free_peer:
4945*5113495bSYour Name 	if (new_peer_ref)
4946*5113495bSYour Name 		dp_peer_unref_delete(peer, DP_MOD_ID_GENERIC_STATS);
4947*5113495bSYour Name }
4948*5113495bSYour Name 
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*5113495bSYour Name void dp_peer_stats_update_protocol_cnt(struct cdp_soc_t *soc_hdl,
4950*5113495bSYour Name 				       int8_t vdev_id,
4951*5113495bSYour Name 				       qdf_nbuf_t nbuf,
4952*5113495bSYour Name 				       bool is_egress,
4953*5113495bSYour Name 				       bool is_rx)
4954*5113495bSYour Name {
4955*5113495bSYour Name 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
4956*5113495bSYour Name 	struct dp_vdev *vdev;
4957*5113495bSYour Name 
4958*5113495bSYour Name 	vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_GENERIC_STATS);
4959*5113495bSYour Name 	if (!vdev)
4960*5113495bSYour Name 		return;
4961*5113495bSYour Name 
4962*5113495bSYour Name 	if (qdf_likely(vdev->peer_protocol_count_track))
4963*5113495bSYour Name 		dp_vdev_peer_stats_update_protocol_cnt(vdev, nbuf, NULL,
4964*5113495bSYour Name 						       is_egress, is_rx);
4965*5113495bSYour Name 
4966*5113495bSYour Name 	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS);
4967*5113495bSYour Name }
4968*5113495bSYour Name #endif
4969*5113495bSYour Name 
4970*5113495bSYour Name #if defined(QCA_ENH_V3_STATS_SUPPORT) || defined(HW_TX_DELAY_STATS_ENABLE)
4971*5113495bSYour Name /**
4972*5113495bSYour Name  * dp_vow_str_fw_to_hw_delay() - Return string for a delay
4973*5113495bSYour Name  * @index: Index of delay
4974*5113495bSYour Name  *
4975*5113495bSYour Name  * Return: char const pointer
4976*5113495bSYour Name  */
dp_vow_str_fw_to_hw_delay(uint8_t index)4977*5113495bSYour Name static inline const char *dp_vow_str_fw_to_hw_delay(uint8_t index)
4978*5113495bSYour Name {
4979*5113495bSYour Name 	if (index > CDP_DELAY_BUCKET_MAX) {
4980*5113495bSYour Name 		return "Invalid index";
4981*5113495bSYour Name 	}
4982*5113495bSYour Name 	return fw_to_hw_delay_bucket[index];
4983*5113495bSYour Name }
4984*5113495bSYour Name 
4985*5113495bSYour Name #if defined(HW_TX_DELAY_STATS_ENABLE)
4986*5113495bSYour Name /**
4987*5113495bSYour Name  * dp_str_fw_to_hw_delay_bkt() - Return string for concise logging of delay
4988*5113495bSYour Name  * @index: Index of delay
4989*5113495bSYour Name  *
4990*5113495bSYour Name  * Return: char const pointer
4991*5113495bSYour Name  */
dp_str_fw_to_hw_delay_bkt(uint8_t index)4992*5113495bSYour Name static inline const char *dp_str_fw_to_hw_delay_bkt(uint8_t index)
4993*5113495bSYour Name {
4994*5113495bSYour Name 	if (index > CDP_DELAY_BUCKET_MAX)
4995*5113495bSYour Name 		return "Invalid";
4996*5113495bSYour Name 
4997*5113495bSYour Name 	return fw_to_hw_delay_bkt_str[index];
4998*5113495bSYour Name }
4999*5113495bSYour Name #endif
5000*5113495bSYour Name 
5001*5113495bSYour Name /**
5002*5113495bSYour Name  * dp_accumulate_delay_stats() - Update delay stats members
5003*5113495bSYour Name  * @total: Update stats total structure
5004*5113495bSYour Name  * @per_ring: per ring structures from where stats need to be accumulated
5005*5113495bSYour Name  *
5006*5113495bSYour Name  * Return: void
5007*5113495bSYour Name  */
5008*5113495bSYour Name static void
dp_accumulate_delay_stats(struct cdp_delay_stats * total,struct cdp_delay_stats * per_ring)5009*5113495bSYour Name dp_accumulate_delay_stats(struct cdp_delay_stats *total,
5010*5113495bSYour Name 			  struct cdp_delay_stats *per_ring)
5011*5113495bSYour Name {
5012*5113495bSYour Name 	uint8_t index;
5013*5113495bSYour Name 
5014*5113495bSYour Name 	for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++)
5015*5113495bSYour Name 		total->delay_bucket[index] += per_ring->delay_bucket[index];
5016*5113495bSYour Name 	total->min_delay = QDF_MIN(total->min_delay, per_ring->min_delay);
5017*5113495bSYour Name 	total->max_delay = QDF_MAX(total->max_delay, per_ring->max_delay);
5018*5113495bSYour Name 	total->avg_delay = ((total->avg_delay + per_ring->avg_delay) >> 1);
5019*5113495bSYour Name }
5020*5113495bSYour Name #endif
5021*5113495bSYour Name 
5022*5113495bSYour Name #ifdef QCA_ENH_V3_STATS_SUPPORT
5023*5113495bSYour Name /**
5024*5113495bSYour Name  * dp_vow_str_sw_enq_delay() - Return string for a delay
5025*5113495bSYour Name  * @index: Index of delay
5026*5113495bSYour Name  *
5027*5113495bSYour Name  * Return: char const pointer
5028*5113495bSYour Name  */
dp_vow_str_sw_enq_delay(uint8_t index)5029*5113495bSYour Name static inline const char *dp_vow_str_sw_enq_delay(uint8_t index)
5030*5113495bSYour Name {
5031*5113495bSYour Name 	if (index > CDP_DELAY_BUCKET_MAX) {
5032*5113495bSYour Name 		return "Invalid index";
5033*5113495bSYour Name 	}
5034*5113495bSYour Name 	return sw_enq_delay_bucket[index];
5035*5113495bSYour Name }
5036*5113495bSYour Name 
5037*5113495bSYour Name /**
5038*5113495bSYour Name  * dp_vow_str_intfrm_delay() - Return string for a delay
5039*5113495bSYour Name  * @index: Index of delay
5040*5113495bSYour Name  *
5041*5113495bSYour Name  * Return: char const pointer
5042*5113495bSYour Name  */
dp_vow_str_intfrm_delay(uint8_t index)5043*5113495bSYour Name static inline const char *dp_vow_str_intfrm_delay(uint8_t index)
5044*5113495bSYour Name {
5045*5113495bSYour Name 	if (index > CDP_DELAY_BUCKET_MAX) {
5046*5113495bSYour Name 		return "Invalid index";
5047*5113495bSYour Name 	}
5048*5113495bSYour Name 	return intfrm_delay_bucket[index];
5049*5113495bSYour Name }
5050*5113495bSYour Name 
5051*5113495bSYour Name /**
5052*5113495bSYour Name  * dp_accumulate_tid_stats() - Accumulate TID stats from each ring
5053*5113495bSYour Name  * @pdev: pdev handle
5054*5113495bSYour Name  * @tid: traffic ID
5055*5113495bSYour Name  * @total_tx: fill this tx structure to get stats from all wbm rings
5056*5113495bSYour Name  * @total_rx: fill this rx structure to get stats from all reo rings
5057*5113495bSYour Name  * @type: delay stats or regular frame counters
5058*5113495bSYour Name  *
5059*5113495bSYour Name  * Return: void
5060*5113495bSYour Name  */
5061*5113495bSYour Name 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*5113495bSYour Name dp_accumulate_tid_stats(struct dp_pdev *pdev, uint8_t tid,
5063*5113495bSYour Name 			struct cdp_tid_tx_stats *total_tx,
5064*5113495bSYour Name 			struct cdp_tid_rx_stats *total_rx, uint8_t type)
5065*5113495bSYour Name {
5066*5113495bSYour Name 	uint8_t i = 0, ring_id = 0, drop = 0, tqm_status_idx = 0, htt_status_idx = 0;
5067*5113495bSYour Name 	struct cdp_tid_stats *tid_stats = &pdev->stats.tid_stats;
5068*5113495bSYour Name 	struct cdp_tid_tx_stats *per_ring_tx = NULL;
5069*5113495bSYour Name 	struct cdp_tid_rx_stats *per_ring_rx = NULL;
5070*5113495bSYour Name 
5071*5113495bSYour Name 	if (wlan_cfg_get_dp_soc_nss_cfg(pdev->soc->wlan_cfg_ctx)) {
5072*5113495bSYour Name 		qdf_mem_copy(total_tx, &tid_stats->tid_tx_stats[0][tid],
5073*5113495bSYour Name 			     sizeof(struct cdp_tid_tx_stats));
5074*5113495bSYour Name 		qdf_mem_copy(total_rx, &tid_stats->tid_rx_stats[0][tid],
5075*5113495bSYour Name 			     sizeof(struct cdp_tid_rx_stats));
5076*5113495bSYour Name 		return;
5077*5113495bSYour Name 	} else {
5078*5113495bSYour Name 		qdf_mem_zero(total_tx, sizeof(struct cdp_tid_tx_stats));
5079*5113495bSYour Name 		qdf_mem_zero(total_rx, sizeof(struct cdp_tid_rx_stats));
5080*5113495bSYour Name 	}
5081*5113495bSYour Name 
5082*5113495bSYour Name 	switch (type) {
5083*5113495bSYour Name 	case TID_COUNTER_STATS:
5084*5113495bSYour Name 	{
5085*5113495bSYour Name 		for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) {
5086*5113495bSYour Name 			per_ring_tx = &tid_stats->tid_tx_stats[ring_id][tid];
5087*5113495bSYour Name 			total_tx->success_cnt += per_ring_tx->success_cnt;
5088*5113495bSYour Name 			total_tx->comp_fail_cnt += per_ring_tx->comp_fail_cnt;
5089*5113495bSYour Name 			for (tqm_status_idx = 0; tqm_status_idx < CDP_MAX_TX_TQM_STATUS; tqm_status_idx++) {
5090*5113495bSYour Name 				total_tx->tqm_status_cnt[tqm_status_idx] +=
5091*5113495bSYour Name 					per_ring_tx->tqm_status_cnt[tqm_status_idx];
5092*5113495bSYour Name 			}
5093*5113495bSYour Name 
5094*5113495bSYour Name 			for (htt_status_idx = 0; htt_status_idx < CDP_MAX_TX_HTT_STATUS; htt_status_idx++) {
5095*5113495bSYour Name 				total_tx->htt_status_cnt[htt_status_idx] +=
5096*5113495bSYour Name 					per_ring_tx->htt_status_cnt[htt_status_idx];
5097*5113495bSYour Name 			}
5098*5113495bSYour Name 
5099*5113495bSYour Name 			for (drop = 0; drop < TX_MAX_DROP; drop++)
5100*5113495bSYour Name 				total_tx->swdrop_cnt[drop] +=
5101*5113495bSYour Name 					per_ring_tx->swdrop_cnt[drop];
5102*5113495bSYour Name 		}
5103*5113495bSYour Name 		for (ring_id = 0; ring_id < CDP_MAX_RX_RINGS; ring_id++) {
5104*5113495bSYour Name 			per_ring_rx = &tid_stats->tid_rx_stats[ring_id][tid];
5105*5113495bSYour Name 			total_rx->delivered_to_stack +=
5106*5113495bSYour Name 				per_ring_rx->delivered_to_stack;
5107*5113495bSYour Name 			total_rx->intrabss_cnt += per_ring_rx->intrabss_cnt;
5108*5113495bSYour Name 			total_rx->msdu_cnt += per_ring_rx->msdu_cnt;
5109*5113495bSYour Name 			total_rx->mcast_msdu_cnt += per_ring_rx->mcast_msdu_cnt;
5110*5113495bSYour Name 			total_rx->bcast_msdu_cnt += per_ring_rx->bcast_msdu_cnt;
5111*5113495bSYour Name 			for (drop = 0; drop < RX_MAX_DROP; drop++)
5112*5113495bSYour Name 				total_rx->fail_cnt[drop] +=
5113*5113495bSYour Name 					per_ring_rx->fail_cnt[drop];
5114*5113495bSYour Name 		}
5115*5113495bSYour Name 		break;
5116*5113495bSYour Name 	}
5117*5113495bSYour Name 
5118*5113495bSYour Name 	case TID_DELAY_STATS:
5119*5113495bSYour Name 	{
5120*5113495bSYour Name 		for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) {
5121*5113495bSYour Name 			per_ring_tx = &tid_stats->tid_tx_stats[ring_id][tid];
5122*5113495bSYour Name 			dp_accumulate_delay_stats(&total_tx->swq_delay,
5123*5113495bSYour Name 						  &per_ring_tx->swq_delay);
5124*5113495bSYour Name 			dp_accumulate_delay_stats(&total_tx->hwtx_delay,
5125*5113495bSYour Name 						  &per_ring_tx->hwtx_delay);
5126*5113495bSYour Name 			dp_accumulate_delay_stats(&total_tx->intfrm_delay,
5127*5113495bSYour Name 						  &per_ring_tx->intfrm_delay);
5128*5113495bSYour Name 		}
5129*5113495bSYour Name 		for (ring_id = 0; ring_id < CDP_MAX_RX_RINGS; ring_id++) {
5130*5113495bSYour Name 			per_ring_rx = &tid_stats->tid_rx_stats[ring_id][tid];
5131*5113495bSYour Name 			dp_accumulate_delay_stats(&total_rx->intfrm_delay,
5132*5113495bSYour Name 						  &per_ring_rx->intfrm_delay);
5133*5113495bSYour Name 			dp_accumulate_delay_stats(&total_rx->to_stack_delay,
5134*5113495bSYour Name 						  &per_ring_rx->to_stack_delay);
5135*5113495bSYour Name 		}
5136*5113495bSYour Name 		break;
5137*5113495bSYour Name 	}
5138*5113495bSYour Name 
5139*5113495bSYour Name 	case TID_RX_ERROR_STATS:
5140*5113495bSYour Name 	{
5141*5113495bSYour Name 		for (ring_id = 0; ring_id < CDP_MAX_RX_RINGS; ring_id++) {
5142*5113495bSYour Name 			per_ring_rx = &tid_stats->tid_rx_stats[ring_id][tid];
5143*5113495bSYour Name 			total_rx->reo_err.err_src_reo_code_inv += per_ring_rx->reo_err.err_src_reo_code_inv;
5144*5113495bSYour Name 			for (i = 0; i < CDP_REO_CODE_MAX; i++) {
5145*5113495bSYour Name 				total_rx->reo_err.err_reo_codes[i] += per_ring_rx->reo_err.err_reo_codes[i];
5146*5113495bSYour Name 			}
5147*5113495bSYour Name 
5148*5113495bSYour Name 			total_rx->rxdma_err.err_src_rxdma_code_inv += per_ring_rx->rxdma_err.err_src_rxdma_code_inv;
5149*5113495bSYour Name 			for (i = 0; i < CDP_DMA_CODE_MAX; i++) {
5150*5113495bSYour Name 				total_rx->rxdma_err.err_dma_codes[i] += per_ring_rx->rxdma_err.err_dma_codes[i];
5151*5113495bSYour Name 			}
5152*5113495bSYour Name 		}
5153*5113495bSYour Name 		break;
5154*5113495bSYour Name 	}
5155*5113495bSYour Name 	default:
5156*5113495bSYour Name 		qdf_err("Invalid stats type: %d", type);
5157*5113495bSYour Name 		break;
5158*5113495bSYour Name 	}
5159*5113495bSYour Name }
5160*5113495bSYour Name 
dp_pdev_print_tid_stats(struct dp_pdev * pdev)5161*5113495bSYour Name void dp_pdev_print_tid_stats(struct dp_pdev *pdev)
5162*5113495bSYour Name {
5163*5113495bSYour Name 	struct cdp_tid_tx_stats total_tx;
5164*5113495bSYour Name 	struct cdp_tid_rx_stats total_rx;
5165*5113495bSYour Name 	uint8_t tid, tqm_status_idx, htt_status_idx;
5166*5113495bSYour Name 	struct cdp_tid_rx_stats *rx_wbm_stats = NULL;
5167*5113495bSYour Name 
5168*5113495bSYour Name 	DP_PRINT_STATS("Packets received in hardstart: %llu ",
5169*5113495bSYour Name 			pdev->stats.tid_stats.ingress_stack);
5170*5113495bSYour Name 	DP_PRINT_STATS("Packets dropped in osif layer: %llu ",
5171*5113495bSYour Name 			pdev->stats.tid_stats.osif_drop);
5172*5113495bSYour Name 	DP_PRINT_STATS("Per TID Video Stats:\n");
5173*5113495bSYour Name 
5174*5113495bSYour Name 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
5175*5113495bSYour Name 		rx_wbm_stats = &pdev->stats.tid_stats.tid_rx_wbm_stats[0][tid];
5176*5113495bSYour Name 
5177*5113495bSYour Name 		dp_accumulate_tid_stats(pdev, tid, &total_tx, &total_rx,
5178*5113495bSYour Name 					TID_COUNTER_STATS);
5179*5113495bSYour Name 		DP_PRINT_STATS("----TID: %d----", tid);
5180*5113495bSYour Name 		DP_PRINT_STATS("Tx TQM Success Count: %llu",
5181*5113495bSYour Name 				total_tx.tqm_status_cnt[HAL_TX_TQM_RR_FRAME_ACKED]);
5182*5113495bSYour Name 		DP_PRINT_STATS("Tx HTT Success Count: %llu",
5183*5113495bSYour Name 				total_tx.htt_status_cnt[HTT_TX_FW2WBM_TX_STATUS_OK]);
5184*5113495bSYour Name 		for (tqm_status_idx = 1; tqm_status_idx < CDP_MAX_TX_TQM_STATUS; tqm_status_idx++) {
5185*5113495bSYour Name 			if (total_tx.tqm_status_cnt[tqm_status_idx]) {
5186*5113495bSYour Name 				DP_PRINT_STATS("Tx TQM Drop Count[%d]: %llu",
5187*5113495bSYour Name 						tqm_status_idx, total_tx.tqm_status_cnt[tqm_status_idx]);
5188*5113495bSYour Name 			}
5189*5113495bSYour Name 		}
5190*5113495bSYour Name 
5191*5113495bSYour Name 		for (htt_status_idx = 1; htt_status_idx < CDP_MAX_TX_HTT_STATUS; htt_status_idx++) {
5192*5113495bSYour Name 			if (total_tx.htt_status_cnt[htt_status_idx]) {
5193*5113495bSYour Name 				DP_PRINT_STATS("Tx HTT Drop Count[%d]: %llu",
5194*5113495bSYour Name 						htt_status_idx, total_tx.htt_status_cnt[htt_status_idx]);
5195*5113495bSYour Name 			}
5196*5113495bSYour Name 		}
5197*5113495bSYour Name 
5198*5113495bSYour Name 		DP_PRINT_STATS("Tx Hardware Drop Count: %llu",
5199*5113495bSYour Name 			       total_tx.swdrop_cnt[TX_HW_ENQUEUE]);
5200*5113495bSYour Name 		DP_PRINT_STATS("Tx Software Drop Count: %llu",
5201*5113495bSYour Name 			       total_tx.swdrop_cnt[TX_SW_ENQUEUE]);
5202*5113495bSYour Name 		DP_PRINT_STATS("Tx Descriptor Error Count: %llu",
5203*5113495bSYour Name 			       total_tx.swdrop_cnt[TX_DESC_ERR]);
5204*5113495bSYour Name 		DP_PRINT_STATS("Tx HAL Ring Error Count: %llu",
5205*5113495bSYour Name 			       total_tx.swdrop_cnt[TX_HAL_RING_ACCESS_ERR]);
5206*5113495bSYour Name 		DP_PRINT_STATS("Tx Dma Map Error Count: %llu",
5207*5113495bSYour Name 			       total_tx.swdrop_cnt[TX_DMA_MAP_ERR]);
5208*5113495bSYour Name 		DP_PRINT_STATS("Rx Delievered Count: %llu",
5209*5113495bSYour Name 			       total_rx.delivered_to_stack);
5210*5113495bSYour Name 		DP_PRINT_STATS("Rx Software Enqueue Drop Count: %llu",
5211*5113495bSYour Name 			       total_rx.fail_cnt[ENQUEUE_DROP]);
5212*5113495bSYour Name 		DP_PRINT_STATS("Rx Intrabss Drop Count: %llu",
5213*5113495bSYour Name 			       total_rx.fail_cnt[INTRABSS_DROP]);
5214*5113495bSYour Name 		DP_PRINT_STATS("Rx Msdu Done Failure Count: %llu",
5215*5113495bSYour Name 			       total_rx.fail_cnt[MSDU_DONE_FAILURE]);
5216*5113495bSYour Name 		DP_PRINT_STATS("Rx Invalid Peer Count: %llu",
5217*5113495bSYour Name 			       total_rx.fail_cnt[INVALID_PEER_VDEV]);
5218*5113495bSYour Name 		DP_PRINT_STATS("Rx Policy Check Drop Count: %llu",
5219*5113495bSYour Name 			       total_rx.fail_cnt[POLICY_CHECK_DROP]);
5220*5113495bSYour Name 		DP_PRINT_STATS("Rx Mec Drop Count: %llu",
5221*5113495bSYour Name 			       total_rx.fail_cnt[MEC_DROP]);
5222*5113495bSYour Name 		DP_PRINT_STATS("Rx Nawds Mcast Drop Count: %llu",
5223*5113495bSYour Name 			       total_rx.fail_cnt[NAWDS_MCAST_DROP]);
5224*5113495bSYour Name 		DP_PRINT_STATS("Rx Mesh Filter Drop Count: %llu",
5225*5113495bSYour Name 			       total_rx.fail_cnt[MESH_FILTER_DROP]);
5226*5113495bSYour Name 		DP_PRINT_STATS("Rx Intra Bss Deliver Count: %llu",
5227*5113495bSYour Name 			       total_rx.intrabss_cnt);
5228*5113495bSYour Name 		DP_PRINT_STATS("Rx MSDU Count: %llu", total_rx.msdu_cnt);
5229*5113495bSYour Name 		DP_PRINT_STATS("Rx Multicast MSDU Count: %llu",
5230*5113495bSYour Name 			       total_rx.mcast_msdu_cnt);
5231*5113495bSYour Name 		DP_PRINT_STATS("Rx Broadcast MSDU Count: %llu\n",
5232*5113495bSYour Name 			       total_rx.bcast_msdu_cnt);
5233*5113495bSYour Name 		DP_PRINT_STATS("Rx WBM Intra Bss Deliver Count: %llu",
5234*5113495bSYour Name 			       rx_wbm_stats->intrabss_cnt);
5235*5113495bSYour Name 		DP_PRINT_STATS("Rx WBM Intrabss Drop Count: %llu",
5236*5113495bSYour Name 			       rx_wbm_stats->fail_cnt[INTRABSS_DROP]);
5237*5113495bSYour Name 	}
5238*5113495bSYour Name }
5239*5113495bSYour Name 
dp_pdev_print_delay_stats(struct dp_pdev * pdev)5240*5113495bSYour Name void dp_pdev_print_delay_stats(struct dp_pdev *pdev)
5241*5113495bSYour Name {
5242*5113495bSYour Name 	struct dp_soc *soc = pdev->soc;
5243*5113495bSYour Name 	struct cdp_tid_tx_stats total_tx;
5244*5113495bSYour Name 	struct cdp_tid_rx_stats total_rx;
5245*5113495bSYour Name 
5246*5113495bSYour Name 	uint8_t tid, index;
5247*5113495bSYour Name 	uint64_t count = 0;
5248*5113495bSYour Name 
5249*5113495bSYour Name 	if (!soc)
5250*5113495bSYour Name 		return;
5251*5113495bSYour Name 
5252*5113495bSYour Name 	tid = 0;
5253*5113495bSYour Name 	index = 0;
5254*5113495bSYour Name 
5255*5113495bSYour Name 	DP_PRINT_STATS("Per TID Delay Non-Zero Stats:\n");
5256*5113495bSYour Name 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
5257*5113495bSYour Name 		dp_accumulate_tid_stats(pdev, tid, &total_tx, &total_rx,
5258*5113495bSYour Name 					TID_DELAY_STATS);
5259*5113495bSYour Name 		DP_PRINT_STATS("----TID: %d----", tid);
5260*5113495bSYour Name 
5261*5113495bSYour Name 		DP_PRINT_STATS("Software Enqueue Delay:");
5262*5113495bSYour Name 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
5263*5113495bSYour Name 			count = total_tx.swq_delay.delay_bucket[index];
5264*5113495bSYour Name 			if (count) {
5265*5113495bSYour Name 				DP_PRINT_STATS("%s:  Packets = %llu",
5266*5113495bSYour Name 					       dp_vow_str_sw_enq_delay(index),
5267*5113495bSYour Name 					       count);
5268*5113495bSYour Name 			}
5269*5113495bSYour Name 		}
5270*5113495bSYour Name 
5271*5113495bSYour Name 		DP_PRINT_STATS("Min = %u", total_tx.swq_delay.min_delay);
5272*5113495bSYour Name 		DP_PRINT_STATS("Max = %u", total_tx.swq_delay.max_delay);
5273*5113495bSYour Name 		DP_PRINT_STATS("Avg = %u\n", total_tx.swq_delay.avg_delay);
5274*5113495bSYour Name 
5275*5113495bSYour Name 		DP_PRINT_STATS("Hardware Transmission Delay:");
5276*5113495bSYour Name 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
5277*5113495bSYour Name 			count = total_tx.hwtx_delay.delay_bucket[index];
5278*5113495bSYour Name 			if (count) {
5279*5113495bSYour Name 				DP_PRINT_STATS("%s:  Packets = %llu",
5280*5113495bSYour Name 					       dp_vow_str_fw_to_hw_delay(index),
5281*5113495bSYour Name 					       count);
5282*5113495bSYour Name 			}
5283*5113495bSYour Name 		}
5284*5113495bSYour Name 		DP_PRINT_STATS("Min = %u", total_tx.hwtx_delay.min_delay);
5285*5113495bSYour Name 		DP_PRINT_STATS("Max = %u", total_tx.hwtx_delay.max_delay);
5286*5113495bSYour Name 		DP_PRINT_STATS("Avg = %u\n", total_tx.hwtx_delay.avg_delay);
5287*5113495bSYour Name 
5288*5113495bSYour Name 		DP_PRINT_STATS("Tx Interframe Delay:");
5289*5113495bSYour Name 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
5290*5113495bSYour Name 			count = total_tx.intfrm_delay.delay_bucket[index];
5291*5113495bSYour Name 			if (count) {
5292*5113495bSYour Name 				DP_PRINT_STATS("%s:  Packets = %llu",
5293*5113495bSYour Name 					       dp_vow_str_intfrm_delay(index),
5294*5113495bSYour Name 					       count);
5295*5113495bSYour Name 			}
5296*5113495bSYour Name 		}
5297*5113495bSYour Name 		DP_PRINT_STATS("Min = %u", total_tx.intfrm_delay.min_delay);
5298*5113495bSYour Name 		DP_PRINT_STATS("Max = %u", total_tx.intfrm_delay.max_delay);
5299*5113495bSYour Name 		DP_PRINT_STATS("Avg = %u\n", total_tx.intfrm_delay.avg_delay);
5300*5113495bSYour Name 
5301*5113495bSYour Name 		DP_PRINT_STATS("Rx Interframe Delay:");
5302*5113495bSYour Name 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
5303*5113495bSYour Name 			count = total_rx.intfrm_delay.delay_bucket[index];
5304*5113495bSYour Name 			if (count) {
5305*5113495bSYour Name 				DP_PRINT_STATS("%s:  Packets = %llu",
5306*5113495bSYour Name 					       dp_vow_str_intfrm_delay(index),
5307*5113495bSYour Name 					       count);
5308*5113495bSYour Name 			}
5309*5113495bSYour Name 		}
5310*5113495bSYour Name 		DP_PRINT_STATS("Min = %u", total_rx.intfrm_delay.min_delay);
5311*5113495bSYour Name 		DP_PRINT_STATS("Max = %u", total_rx.intfrm_delay.max_delay);
5312*5113495bSYour Name 		DP_PRINT_STATS("Avg = %u\n", total_rx.intfrm_delay.avg_delay);
5313*5113495bSYour Name 
5314*5113495bSYour Name 		DP_PRINT_STATS("Rx Reap to Stack Delay:");
5315*5113495bSYour Name 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
5316*5113495bSYour Name 			count = total_rx.to_stack_delay.delay_bucket[index];
5317*5113495bSYour Name 			if (count) {
5318*5113495bSYour Name 				DP_PRINT_STATS("%s:  Packets = %llu",
5319*5113495bSYour Name 					       dp_vow_str_intfrm_delay(index),
5320*5113495bSYour Name 					       count);
5321*5113495bSYour Name 			}
5322*5113495bSYour Name 		}
5323*5113495bSYour Name 
5324*5113495bSYour Name 		DP_PRINT_STATS("Min = %u", total_rx.to_stack_delay.min_delay);
5325*5113495bSYour Name 		DP_PRINT_STATS("Max = %u", total_rx.to_stack_delay.max_delay);
5326*5113495bSYour Name 		DP_PRINT_STATS("Avg = %u\n", total_rx.to_stack_delay.avg_delay);
5327*5113495bSYour Name 	}
5328*5113495bSYour Name }
5329*5113495bSYour Name 
dp_pdev_print_rx_error_stats(struct dp_pdev * pdev)5330*5113495bSYour Name void dp_pdev_print_rx_error_stats(struct dp_pdev *pdev)
5331*5113495bSYour Name {
5332*5113495bSYour Name 	struct dp_soc *soc = pdev->soc;
5333*5113495bSYour Name 	struct cdp_tid_rx_stats total_rx;
5334*5113495bSYour Name 	struct cdp_tid_tx_stats total_tx;
5335*5113495bSYour Name 
5336*5113495bSYour Name 	uint8_t tid, index;
5337*5113495bSYour Name 
5338*5113495bSYour Name 	if (!soc)
5339*5113495bSYour Name 		return;
5340*5113495bSYour Name 
5341*5113495bSYour Name 
5342*5113495bSYour Name 	DP_PRINT_STATS("Per TID RX Error Stats:\n");
5343*5113495bSYour Name 	for (tid = 0; tid < CDP_MAX_VOW_TID; tid++) {
5344*5113495bSYour Name 		dp_accumulate_tid_stats(pdev, tid, &total_tx, &total_rx,
5345*5113495bSYour Name 					TID_RX_ERROR_STATS);
5346*5113495bSYour Name 		DP_PRINT_STATS("----TID: %d----", tid + 4);
5347*5113495bSYour Name 
5348*5113495bSYour Name 		DP_PRINT_STATS("Rx REO Error stats:");
5349*5113495bSYour Name 		DP_PRINT_STATS("err_src_reo_code_inv = %llu", total_rx.reo_err.err_src_reo_code_inv);
5350*5113495bSYour Name 		for (index = 0; index < CDP_REO_CODE_MAX; index++) {
5351*5113495bSYour Name 			DP_PRINT_STATS("err src reo codes: %d = %llu", index, total_rx.reo_err.err_reo_codes[index]);
5352*5113495bSYour Name 		}
5353*5113495bSYour Name 
5354*5113495bSYour Name 		DP_PRINT_STATS("Rx Rxdma Error stats:");
5355*5113495bSYour Name 		DP_PRINT_STATS("err_src_rxdma_code_inv = %llu", total_rx.rxdma_err.err_src_rxdma_code_inv);
5356*5113495bSYour Name 		for (index = 0; index < CDP_DMA_CODE_MAX; index++) {
5357*5113495bSYour Name 			DP_PRINT_STATS("err src dma codes: %d = %llu", index, total_rx.rxdma_err.err_dma_codes[index]);
5358*5113495bSYour Name 		}
5359*5113495bSYour Name 	}
5360*5113495bSYour Name }
5361*5113495bSYour Name 
dp_pdev_get_tid_stats(struct cdp_soc_t * soc_hdl,uint8_t pdev_id,struct cdp_tid_stats_intf * tid_stats)5362*5113495bSYour Name QDF_STATUS dp_pdev_get_tid_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
5363*5113495bSYour Name 				 struct cdp_tid_stats_intf *tid_stats)
5364*5113495bSYour Name {
5365*5113495bSYour Name 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
5366*5113495bSYour Name 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
5367*5113495bSYour Name 	struct cdp_tid_rx_stats rx;
5368*5113495bSYour Name 	struct cdp_tid_tx_stats tx;
5369*5113495bSYour Name 	uint8_t tid;
5370*5113495bSYour Name 	uint32_t size;
5371*5113495bSYour Name 
5372*5113495bSYour Name 	if (!pdev)
5373*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
5374*5113495bSYour Name 
5375*5113495bSYour Name 	size = sizeof(struct cdp_delay_stats);
5376*5113495bSYour Name 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
5377*5113495bSYour Name 		dp_accumulate_tid_stats(pdev, tid, &tx, &rx, TID_COUNTER_STATS);
5378*5113495bSYour Name 		/* Copy specific accumulated Tx tid stats */
5379*5113495bSYour Name 		tid_stats->tx_total[tid].success_cnt = tx.success_cnt;
5380*5113495bSYour Name 		tid_stats->tx_total[tid].comp_fail_cnt = tx.comp_fail_cnt;
5381*5113495bSYour Name 		qdf_mem_copy(&tid_stats->tx_total[tid].tqm_status_cnt[0],
5382*5113495bSYour Name 			     &tx.tqm_status_cnt[0],
5383*5113495bSYour Name 			     CDP_MAX_TX_TQM_STATUS * sizeof(uint64_t));
5384*5113495bSYour Name 		qdf_mem_copy(&tid_stats->tx_total[tid].htt_status_cnt[0],
5385*5113495bSYour Name 			     &tx.htt_status_cnt[0],
5386*5113495bSYour Name 			     CDP_MAX_TX_HTT_STATUS * sizeof(uint64_t));
5387*5113495bSYour Name 		qdf_mem_copy(&tid_stats->tx_total[tid].swdrop_cnt[0],
5388*5113495bSYour Name 			     &tx.swdrop_cnt[0], TX_MAX_DROP * sizeof(uint64_t));
5389*5113495bSYour Name 
5390*5113495bSYour Name 		/* Copy specific accumulated Rx tid stats */
5391*5113495bSYour Name 		tid_stats->rx_total[tid].delivered_to_stack =
5392*5113495bSYour Name 							rx.delivered_to_stack;
5393*5113495bSYour Name 		tid_stats->rx_total[tid].intrabss_cnt = rx.intrabss_cnt;
5394*5113495bSYour Name 		tid_stats->rx_total[tid].msdu_cnt = rx.msdu_cnt;
5395*5113495bSYour Name 		tid_stats->rx_total[tid].mcast_msdu_cnt = rx.mcast_msdu_cnt;
5396*5113495bSYour Name 		tid_stats->rx_total[tid].bcast_msdu_cnt = rx.bcast_msdu_cnt;
5397*5113495bSYour Name 		qdf_mem_copy(&tid_stats->rx_total[tid].fail_cnt[0],
5398*5113495bSYour Name 			     &rx.fail_cnt[0], RX_MAX_DROP * sizeof(uint64_t));
5399*5113495bSYour Name 
5400*5113495bSYour Name 		dp_accumulate_tid_stats(pdev, tid, &tx, &rx, TID_DELAY_STATS);
5401*5113495bSYour Name 		/* Copy specific accumulated Tx delay stats */
5402*5113495bSYour Name 		qdf_mem_copy(&tid_stats->tx_total[tid].swq_delay,
5403*5113495bSYour Name 			     &tx.swq_delay, size);
5404*5113495bSYour Name 		qdf_mem_copy(&tid_stats->tx_total[tid].hwtx_delay,
5405*5113495bSYour Name 			     &tx.hwtx_delay, size);
5406*5113495bSYour Name 		qdf_mem_copy(&tid_stats->tx_total[tid].intfrm_delay,
5407*5113495bSYour Name 			     &tx.intfrm_delay, size);
5408*5113495bSYour Name 
5409*5113495bSYour Name 		/* Copy specific accumulated Rx delay stats */
5410*5113495bSYour Name 		qdf_mem_copy(&tid_stats->rx_total[tid].intfrm_delay,
5411*5113495bSYour Name 			     &rx.intfrm_delay, size);
5412*5113495bSYour Name 		qdf_mem_copy(&tid_stats->rx_total[tid].to_stack_delay,
5413*5113495bSYour Name 			     &rx.to_stack_delay, size);
5414*5113495bSYour Name 	}
5415*5113495bSYour Name 	for (tid = 0; tid < CDP_MAX_VOW_TID; tid++) {
5416*5113495bSYour Name 		dp_accumulate_tid_stats(pdev, tid, &tx, &rx,
5417*5113495bSYour Name 					TID_RX_ERROR_STATS);
5418*5113495bSYour Name 		/* Copy specific accumulated VOW Rx stats */
5419*5113495bSYour Name 		qdf_mem_copy(&tid_stats->rx_total[tid].reo_err,
5420*5113495bSYour Name 			     &rx.reo_err, sizeof(struct cdp_reo_error_stats));
5421*5113495bSYour Name 		qdf_mem_copy(&tid_stats->rx_total[tid].rxdma_err, &rx.rxdma_err,
5422*5113495bSYour Name 			     sizeof(struct cdp_rxdma_error_stats));
5423*5113495bSYour Name 	}
5424*5113495bSYour Name 	tid_stats->ingress_stack = pdev->stats.tid_stats.ingress_stack;
5425*5113495bSYour Name 	tid_stats->osif_drop = pdev->stats.tid_stats.osif_drop;
5426*5113495bSYour Name 
5427*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
5428*5113495bSYour Name }
5429*5113495bSYour Name #else
dp_pdev_get_tid_stats(struct cdp_soc_t * soc_hdl,uint8_t pdev_id,struct cdp_tid_stats_intf * tid_stats)5430*5113495bSYour Name QDF_STATUS dp_pdev_get_tid_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
5431*5113495bSYour Name 				 struct cdp_tid_stats_intf *tid_stats)
5432*5113495bSYour Name {
5433*5113495bSYour Name 	return QDF_STATUS_E_INVAL;
5434*5113495bSYour Name }
5435*5113495bSYour Name #endif
5436*5113495bSYour Name 
5437*5113495bSYour Name #ifdef HW_TX_DELAY_STATS_ENABLE
5438*5113495bSYour Name #define DP_TX_DELAY_STATS_STR_LEN 512
5439*5113495bSYour Name #define DP_SHORT_DELAY_BKT_COUNT 5
dp_vdev_print_tx_delay_stats(struct dp_vdev * vdev)5440*5113495bSYour Name static void dp_vdev_print_tx_delay_stats(struct dp_vdev *vdev)
5441*5113495bSYour Name {
5442*5113495bSYour Name 	struct cdp_delay_stats delay_stats;
5443*5113495bSYour Name 	struct cdp_tid_tx_stats *per_ring;
5444*5113495bSYour Name 	uint8_t tid, index;
5445*5113495bSYour Name 	uint32_t count = 0;
5446*5113495bSYour Name 	uint8_t ring_id;
5447*5113495bSYour Name 	char *buf;
5448*5113495bSYour Name 	size_t pos, buf_len;
5449*5113495bSYour Name 	char hw_tx_delay_str[DP_TX_DELAY_STATS_STR_LEN] = {"\0"};
5450*5113495bSYour Name 
5451*5113495bSYour Name 	buf_len = DP_TX_DELAY_STATS_STR_LEN;
5452*5113495bSYour Name 	if (!vdev)
5453*5113495bSYour Name 		return;
5454*5113495bSYour Name 
5455*5113495bSYour Name 	dp_info("vdev_id: %d Per TID HW Tx completion latency Stats:",
5456*5113495bSYour Name 		vdev->vdev_id);
5457*5113495bSYour Name 	buf = hw_tx_delay_str;
5458*5113495bSYour Name 	dp_info("  Tid%32sPkts_per_delay_bucket%60s | Min | Max | Avg |",
5459*5113495bSYour Name 		"", "");
5460*5113495bSYour Name 	pos = 0;
5461*5113495bSYour Name 	pos += qdf_scnprintf(buf + pos, buf_len - pos, "%6s", "");
5462*5113495bSYour Name 	for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
5463*5113495bSYour Name 		if (index < DP_SHORT_DELAY_BKT_COUNT)
5464*5113495bSYour Name 			pos += qdf_scnprintf(buf + pos, buf_len - pos, "%7s",
5465*5113495bSYour Name 					     dp_str_fw_to_hw_delay_bkt(index));
5466*5113495bSYour Name 		else
5467*5113495bSYour Name 			pos += qdf_scnprintf(buf + pos, buf_len - pos, "%9s",
5468*5113495bSYour Name 					     dp_str_fw_to_hw_delay_bkt(index));
5469*5113495bSYour Name 	}
5470*5113495bSYour Name 	dp_info("%s", hw_tx_delay_str);
5471*5113495bSYour Name 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
5472*5113495bSYour Name 		qdf_mem_zero(&delay_stats, sizeof(delay_stats));
5473*5113495bSYour Name 		for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) {
5474*5113495bSYour Name 			per_ring = &vdev->stats.tid_tx_stats[ring_id][tid];
5475*5113495bSYour Name 			dp_accumulate_delay_stats(&delay_stats,
5476*5113495bSYour Name 						  &per_ring->hwtx_delay);
5477*5113495bSYour Name 		}
5478*5113495bSYour Name 		pos = 0;
5479*5113495bSYour Name 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "%4u  ", tid);
5480*5113495bSYour Name 		for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
5481*5113495bSYour Name 			count = delay_stats.delay_bucket[index];
5482*5113495bSYour Name 			if (index < DP_SHORT_DELAY_BKT_COUNT)
5483*5113495bSYour Name 				pos += qdf_scnprintf(buf + pos, buf_len - pos,
5484*5113495bSYour Name 						     "%6u|", count);
5485*5113495bSYour Name 			else
5486*5113495bSYour Name 				pos += qdf_scnprintf(buf + pos, buf_len - pos,
5487*5113495bSYour Name 						     "%8u|", count);
5488*5113495bSYour Name 		}
5489*5113495bSYour Name 		pos += qdf_scnprintf(buf + pos, buf_len - pos,
5490*5113495bSYour Name 			"%10u | %3u | %3u|", delay_stats.min_delay,
5491*5113495bSYour Name 			delay_stats.max_delay, delay_stats.avg_delay);
5492*5113495bSYour Name 		dp_info("%s", hw_tx_delay_str);
5493*5113495bSYour Name 	}
5494*5113495bSYour Name }
5495*5113495bSYour Name 
dp_pdev_print_tx_delay_stats(struct dp_soc * soc)5496*5113495bSYour Name void dp_pdev_print_tx_delay_stats(struct dp_soc *soc)
5497*5113495bSYour Name {
5498*5113495bSYour Name 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, 0);
5499*5113495bSYour Name 	struct dp_vdev *vdev;
5500*5113495bSYour Name 	struct dp_vdev **vdev_array = NULL;
5501*5113495bSYour Name 	int index = 0, num_vdev = 0;
5502*5113495bSYour Name 
5503*5113495bSYour Name 	if (!pdev) {
5504*5113495bSYour Name 		dp_err("pdev is NULL");
5505*5113495bSYour Name 		return;
5506*5113495bSYour Name 	}
5507*5113495bSYour Name 
5508*5113495bSYour Name 	vdev_array =
5509*5113495bSYour Name 		qdf_mem_malloc(sizeof(struct dp_vdev *) * WLAN_PDEV_MAX_VDEVS);
5510*5113495bSYour Name 	if (!vdev_array)
5511*5113495bSYour Name 		return;
5512*5113495bSYour Name 
5513*5113495bSYour Name 	qdf_spin_lock_bh(&pdev->vdev_list_lock);
5514*5113495bSYour Name 	DP_PDEV_ITERATE_VDEV_LIST(pdev, vdev) {
5515*5113495bSYour Name 		if (dp_vdev_get_ref(soc, vdev, DP_MOD_ID_GENERIC_STATS))
5516*5113495bSYour Name 			continue;
5517*5113495bSYour Name 		vdev_array[index] = vdev;
5518*5113495bSYour Name 		index = index + 1;
5519*5113495bSYour Name 	}
5520*5113495bSYour Name 	qdf_spin_unlock_bh(&pdev->vdev_list_lock);
5521*5113495bSYour Name 
5522*5113495bSYour Name 	num_vdev = index;
5523*5113495bSYour Name 
5524*5113495bSYour Name 	for (index = 0; index < num_vdev; index++) {
5525*5113495bSYour Name 		vdev = vdev_array[index];
5526*5113495bSYour Name 		if (qdf_unlikely(dp_is_vdev_tx_delay_stats_enabled(vdev)))
5527*5113495bSYour Name 			dp_vdev_print_tx_delay_stats(vdev);
5528*5113495bSYour Name 		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS);
5529*5113495bSYour Name 	}
5530*5113495bSYour Name 	qdf_mem_free(vdev_array);
5531*5113495bSYour Name }
5532*5113495bSYour Name 
5533*5113495bSYour Name /**
5534*5113495bSYour Name  * dp_reset_delay_stats() - reset delay stats
5535*5113495bSYour Name  * @per_ring: per ring structures from where stats need to be accumulated
5536*5113495bSYour Name  *
5537*5113495bSYour Name  * Return: void
5538*5113495bSYour Name  */
dp_reset_delay_stats(struct cdp_delay_stats * per_ring)5539*5113495bSYour Name static void dp_reset_delay_stats(struct cdp_delay_stats *per_ring)
5540*5113495bSYour Name {
5541*5113495bSYour Name 	qdf_mem_zero(per_ring, sizeof(struct cdp_delay_stats));
5542*5113495bSYour Name }
5543*5113495bSYour Name 
5544*5113495bSYour Name /**
5545*5113495bSYour Name  * dp_vdev_init_tx_delay_stats() - Clear tx delay stats
5546*5113495bSYour Name  * @vdev: vdev handle
5547*5113495bSYour Name  *
5548*5113495bSYour Name  * Return: None
5549*5113495bSYour Name  */
dp_vdev_init_tx_delay_stats(struct dp_vdev * vdev)5550*5113495bSYour Name static void dp_vdev_init_tx_delay_stats(struct dp_vdev *vdev)
5551*5113495bSYour Name {
5552*5113495bSYour Name 	struct cdp_tid_tx_stats *per_ring;
5553*5113495bSYour Name 	uint8_t tid;
5554*5113495bSYour Name 	uint8_t ring_id;
5555*5113495bSYour Name 
5556*5113495bSYour Name 	if (!vdev)
5557*5113495bSYour Name 		return;
5558*5113495bSYour Name 
5559*5113495bSYour Name 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
5560*5113495bSYour Name 		for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) {
5561*5113495bSYour Name 			per_ring = &vdev->stats.tid_tx_stats[ring_id][tid];
5562*5113495bSYour Name 			dp_reset_delay_stats(&per_ring->hwtx_delay);
5563*5113495bSYour Name 		}
5564*5113495bSYour Name 	}
5565*5113495bSYour Name }
5566*5113495bSYour Name 
dp_pdev_clear_tx_delay_stats(struct dp_soc * soc)5567*5113495bSYour Name void dp_pdev_clear_tx_delay_stats(struct dp_soc *soc)
5568*5113495bSYour Name {
5569*5113495bSYour Name 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, 0);
5570*5113495bSYour Name 	struct dp_vdev *vdev;
5571*5113495bSYour Name 	struct dp_vdev **vdev_array = NULL;
5572*5113495bSYour Name 	int index = 0, num_vdev = 0;
5573*5113495bSYour Name 
5574*5113495bSYour Name 	if (!pdev) {
5575*5113495bSYour Name 		dp_err("pdev is NULL");
5576*5113495bSYour Name 		return;
5577*5113495bSYour Name 	}
5578*5113495bSYour Name 
5579*5113495bSYour Name 	vdev_array =
5580*5113495bSYour Name 		qdf_mem_malloc(sizeof(struct dp_vdev *) * WLAN_PDEV_MAX_VDEVS);
5581*5113495bSYour Name 	if (!vdev_array)
5582*5113495bSYour Name 		return;
5583*5113495bSYour Name 
5584*5113495bSYour Name 	qdf_spin_lock_bh(&pdev->vdev_list_lock);
5585*5113495bSYour Name 	DP_PDEV_ITERATE_VDEV_LIST(pdev, vdev) {
5586*5113495bSYour Name 		if (dp_vdev_get_ref(soc, vdev, DP_MOD_ID_GENERIC_STATS) !=
5587*5113495bSYour Name 		    QDF_STATUS_SUCCESS)
5588*5113495bSYour Name 			continue;
5589*5113495bSYour Name 		vdev_array[index] = vdev;
5590*5113495bSYour Name 		index = index + 1;
5591*5113495bSYour Name 	}
5592*5113495bSYour Name 	qdf_spin_unlock_bh(&pdev->vdev_list_lock);
5593*5113495bSYour Name 
5594*5113495bSYour Name 	num_vdev = index;
5595*5113495bSYour Name 
5596*5113495bSYour Name 	for (index = 0; index < num_vdev; index++) {
5597*5113495bSYour Name 		vdev = vdev_array[index];
5598*5113495bSYour Name 		dp_vdev_init_tx_delay_stats(vdev);
5599*5113495bSYour Name 		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS);
5600*5113495bSYour Name 	}
5601*5113495bSYour Name 	qdf_mem_free(vdev_array);
5602*5113495bSYour Name }
5603*5113495bSYour Name #endif
5604*5113495bSYour Name 
dp_print_soc_cfg_params(struct dp_soc * soc)5605*5113495bSYour Name void dp_print_soc_cfg_params(struct dp_soc *soc)
5606*5113495bSYour Name {
5607*5113495bSYour Name 	struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx;
5608*5113495bSYour Name 	uint8_t index = 0, i = 0;
5609*5113495bSYour Name 	char ring_mask[DP_MAX_INT_CONTEXTS_STRING_LENGTH] = {'\0'};
5610*5113495bSYour Name 	int num_of_int_contexts;
5611*5113495bSYour Name 
5612*5113495bSYour Name 	if (!soc) {
5613*5113495bSYour Name 		dp_err("Context is null");
5614*5113495bSYour Name 		return;
5615*5113495bSYour Name 	}
5616*5113495bSYour Name 
5617*5113495bSYour Name 	soc_cfg_ctx = soc->wlan_cfg_ctx;
5618*5113495bSYour Name 
5619*5113495bSYour Name 	if (!soc_cfg_ctx) {
5620*5113495bSYour Name 		dp_err("Context is null");
5621*5113495bSYour Name 		return;
5622*5113495bSYour Name 	}
5623*5113495bSYour Name 
5624*5113495bSYour Name 	num_of_int_contexts =
5625*5113495bSYour Name 			wlan_cfg_get_num_contexts(soc_cfg_ctx);
5626*5113495bSYour Name 
5627*5113495bSYour Name 	DP_PRINT_STATS("No. of interrupt contexts: %u",
5628*5113495bSYour Name 		       soc_cfg_ctx->num_int_ctxts);
5629*5113495bSYour Name 	DP_PRINT_STATS("Max clients: %u",
5630*5113495bSYour Name 		       soc_cfg_ctx->max_clients);
5631*5113495bSYour Name 	DP_PRINT_STATS("Max alloc size: %u ",
5632*5113495bSYour Name 		       soc_cfg_ctx->max_alloc_size);
5633*5113495bSYour Name 	DP_PRINT_STATS("Per pdev tx ring: %u ",
5634*5113495bSYour Name 		       soc_cfg_ctx->per_pdev_tx_ring);
5635*5113495bSYour Name 	DP_PRINT_STATS("Num tcl data rings: %u ",
5636*5113495bSYour Name 		       soc_cfg_ctx->num_tcl_data_rings);
5637*5113495bSYour Name 	DP_PRINT_STATS("Per pdev rx ring: %u ",
5638*5113495bSYour Name 		       soc_cfg_ctx->per_pdev_rx_ring);
5639*5113495bSYour Name 	DP_PRINT_STATS("Per pdev lmac ring: %u ",
5640*5113495bSYour Name 		       soc_cfg_ctx->per_pdev_lmac_ring);
5641*5113495bSYour Name 	DP_PRINT_STATS("Num of reo dest rings: %u ",
5642*5113495bSYour Name 		       soc_cfg_ctx->num_reo_dest_rings);
5643*5113495bSYour Name 	DP_PRINT_STATS("Num tx desc pool: %u ",
5644*5113495bSYour Name 		       soc_cfg_ctx->num_tx_desc_pool);
5645*5113495bSYour Name 	DP_PRINT_STATS("Num tx ext desc pool: %u ",
5646*5113495bSYour Name 		       soc_cfg_ctx->num_tx_ext_desc_pool);
5647*5113495bSYour Name 	DP_PRINT_STATS("Num tx desc: %u ",
5648*5113495bSYour Name 		       soc_cfg_ctx->num_tx_desc);
5649*5113495bSYour Name 	DP_PRINT_STATS("Num tx ext desc: %u ",
5650*5113495bSYour Name 		       soc_cfg_ctx->num_tx_ext_desc);
5651*5113495bSYour Name 	DP_PRINT_STATS("Htt packet type: %u ",
5652*5113495bSYour Name 		       soc_cfg_ctx->htt_packet_type);
5653*5113495bSYour Name 	DP_PRINT_STATS("Max peer_ids: %u ",
5654*5113495bSYour Name 		       soc_cfg_ctx->max_peer_id);
5655*5113495bSYour Name 	DP_PRINT_STATS("Tx ring size: %u ",
5656*5113495bSYour Name 		       soc_cfg_ctx->tx_ring_size);
5657*5113495bSYour Name 	DP_PRINT_STATS("Tx comp ring size: %u ",
5658*5113495bSYour Name 		       soc_cfg_ctx->tx_comp_ring_size);
5659*5113495bSYour Name 	DP_PRINT_STATS("Tx comp ring size nss: %u ",
5660*5113495bSYour Name 		       soc_cfg_ctx->tx_comp_ring_size_nss);
5661*5113495bSYour Name 	DP_PRINT_STATS("Int batch threshold tx: %u ",
5662*5113495bSYour Name 		       soc_cfg_ctx->int_batch_threshold_tx);
5663*5113495bSYour Name 	DP_PRINT_STATS("Int timer threshold tx: %u ",
5664*5113495bSYour Name 		       soc_cfg_ctx->int_timer_threshold_tx);
5665*5113495bSYour Name 	DP_PRINT_STATS("Int batch threshold rx: %u ",
5666*5113495bSYour Name 		       soc_cfg_ctx->int_batch_threshold_rx);
5667*5113495bSYour Name 	DP_PRINT_STATS("Int timer threshold rx: %u ",
5668*5113495bSYour Name 		       soc_cfg_ctx->int_timer_threshold_rx);
5669*5113495bSYour Name 	DP_PRINT_STATS("Int batch threshold other: %u ",
5670*5113495bSYour Name 		       soc_cfg_ctx->int_batch_threshold_other);
5671*5113495bSYour Name 	DP_PRINT_STATS("Int timer threshold other: %u ",
5672*5113495bSYour Name 		       soc_cfg_ctx->int_timer_threshold_other);
5673*5113495bSYour Name 	DP_PRINT_STATS("Int batch threshold mon dest: %u ",
5674*5113495bSYour Name 		       soc_cfg_ctx->int_batch_threshold_mon_dest);
5675*5113495bSYour Name 	DP_PRINT_STATS("Int timer threshold mon dest: %u ",
5676*5113495bSYour Name 		       soc_cfg_ctx->int_timer_threshold_mon_dest);
5677*5113495bSYour Name 	DP_PRINT_STATS("Int batch threshold ppe2tcl: %u ",
5678*5113495bSYour Name 		       soc_cfg_ctx->int_batch_threshold_ppe2tcl);
5679*5113495bSYour Name 	DP_PRINT_STATS("Int timer threshold ppe2tcl: %u ",
5680*5113495bSYour Name 		       soc_cfg_ctx->int_timer_threshold_ppe2tcl);
5681*5113495bSYour Name 
5682*5113495bSYour Name 	DP_PRINT_STATS("DP NAPI scale factor: %u ",
5683*5113495bSYour Name 		       soc_cfg_ctx->napi_scale_factor);
5684*5113495bSYour Name 
5685*5113495bSYour Name 	for (i = 0; i < num_of_int_contexts; i++) {
5686*5113495bSYour Name 		index += qdf_snprint(&ring_mask[index],
5687*5113495bSYour Name 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5688*5113495bSYour Name 				     " %d",
5689*5113495bSYour Name 				     soc_cfg_ctx->int_tx_ring_mask[i]);
5690*5113495bSYour Name 	}
5691*5113495bSYour Name 
5692*5113495bSYour Name 	DP_PRINT_STATS("Tx ring mask (0-%d):%s",
5693*5113495bSYour Name 		       num_of_int_contexts, ring_mask);
5694*5113495bSYour Name 
5695*5113495bSYour Name 	index = 0;
5696*5113495bSYour Name 	for (i = 0; i < num_of_int_contexts; i++) {
5697*5113495bSYour Name 		index += qdf_snprint(&ring_mask[index],
5698*5113495bSYour Name 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5699*5113495bSYour Name 				     " %d",
5700*5113495bSYour Name 				     soc_cfg_ctx->int_rx_ring_mask[i]);
5701*5113495bSYour Name 	}
5702*5113495bSYour Name 
5703*5113495bSYour Name 	DP_PRINT_STATS("Rx ring mask (0-%d):%s",
5704*5113495bSYour Name 		       num_of_int_contexts, ring_mask);
5705*5113495bSYour Name 
5706*5113495bSYour Name 	index = 0;
5707*5113495bSYour Name 	for (i = 0; i < num_of_int_contexts; i++) {
5708*5113495bSYour Name 		index += qdf_snprint(&ring_mask[index],
5709*5113495bSYour Name 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5710*5113495bSYour Name 				     " %d",
5711*5113495bSYour Name 				     soc_cfg_ctx->int_rx_mon_ring_mask[i]);
5712*5113495bSYour Name 	}
5713*5113495bSYour Name 
5714*5113495bSYour Name 	DP_PRINT_STATS("Rx mon ring mask (0-%d):%s",
5715*5113495bSYour Name 		       num_of_int_contexts, ring_mask);
5716*5113495bSYour Name 
5717*5113495bSYour Name 	index = 0;
5718*5113495bSYour Name 	for (i = 0; i < num_of_int_contexts; i++) {
5719*5113495bSYour Name 		index += qdf_snprint(&ring_mask[index],
5720*5113495bSYour Name 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5721*5113495bSYour Name 				     " %d",
5722*5113495bSYour Name 				     soc_cfg_ctx->int_rx_err_ring_mask[i]);
5723*5113495bSYour Name 	}
5724*5113495bSYour Name 
5725*5113495bSYour Name 	DP_PRINT_STATS("Rx err ring mask (0-%d):%s",
5726*5113495bSYour Name 		       num_of_int_contexts, ring_mask);
5727*5113495bSYour Name 
5728*5113495bSYour Name 	index = 0;
5729*5113495bSYour Name 	for (i = 0; i < num_of_int_contexts; i++) {
5730*5113495bSYour Name 		index += qdf_snprint(&ring_mask[index],
5731*5113495bSYour Name 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5732*5113495bSYour Name 				     " %d",
5733*5113495bSYour Name 				     soc_cfg_ctx->int_rx_wbm_rel_ring_mask[i]);
5734*5113495bSYour Name 	}
5735*5113495bSYour Name 
5736*5113495bSYour Name 	DP_PRINT_STATS("Rx wbm rel ring mask (0-%d):%s",
5737*5113495bSYour Name 		       num_of_int_contexts, ring_mask);
5738*5113495bSYour Name 
5739*5113495bSYour Name 	index = 0;
5740*5113495bSYour Name 	for (i = 0; i < num_of_int_contexts; i++) {
5741*5113495bSYour Name 		index += qdf_snprint(&ring_mask[index],
5742*5113495bSYour Name 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5743*5113495bSYour Name 				     " %d",
5744*5113495bSYour Name 				     soc_cfg_ctx->int_reo_status_ring_mask[i]);
5745*5113495bSYour Name 	}
5746*5113495bSYour Name 
5747*5113495bSYour Name 	DP_PRINT_STATS("Reo ring mask (0-%d):%s",
5748*5113495bSYour Name 		       num_of_int_contexts, ring_mask);
5749*5113495bSYour Name 
5750*5113495bSYour Name 	index = 0;
5751*5113495bSYour Name 	for (i = 0; i < num_of_int_contexts; i++) {
5752*5113495bSYour Name 		index += qdf_snprint(&ring_mask[index],
5753*5113495bSYour Name 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5754*5113495bSYour Name 				     " %d",
5755*5113495bSYour Name 				     soc_cfg_ctx->int_rxdma2host_ring_mask[i]);
5756*5113495bSYour Name 	}
5757*5113495bSYour Name 
5758*5113495bSYour Name 	DP_PRINT_STATS("Rxdma2host ring mask (0-%d):%s",
5759*5113495bSYour Name 		       num_of_int_contexts, ring_mask);
5760*5113495bSYour Name 
5761*5113495bSYour Name 	index = 0;
5762*5113495bSYour Name 	for (i = 0; i < num_of_int_contexts; i++) {
5763*5113495bSYour Name 		index += qdf_snprint(&ring_mask[index],
5764*5113495bSYour Name 				     DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
5765*5113495bSYour Name 				     " %d",
5766*5113495bSYour Name 				     soc_cfg_ctx->int_host2rxdma_ring_mask[i]);
5767*5113495bSYour Name 	}
5768*5113495bSYour Name 
5769*5113495bSYour Name 	DP_PRINT_STATS("Host2rxdma ring mask (0-%d):%s",
5770*5113495bSYour Name 		       num_of_int_contexts, ring_mask);
5771*5113495bSYour Name 
5772*5113495bSYour Name 	DP_PRINT_STATS("Rx hash: %u ",
5773*5113495bSYour Name 		       soc_cfg_ctx->rx_hash);
5774*5113495bSYour Name 	DP_PRINT_STATS("Tso enabled: %u ",
5775*5113495bSYour Name 		       soc_cfg_ctx->tso_enabled);
5776*5113495bSYour Name 	DP_PRINT_STATS("Lro enabled: %u ",
5777*5113495bSYour Name 		       soc_cfg_ctx->lro_enabled);
5778*5113495bSYour Name 	DP_PRINT_STATS("Sg enabled: %u ",
5779*5113495bSYour Name 		       soc_cfg_ctx->sg_enabled);
5780*5113495bSYour Name 	DP_PRINT_STATS("Gro enabled: %u ",
5781*5113495bSYour Name 		       soc_cfg_ctx->gro_enabled);
5782*5113495bSYour Name 	DP_PRINT_STATS("TC based dynamic GRO: %u ",
5783*5113495bSYour Name 		       soc_cfg_ctx->tc_based_dynamic_gro);
5784*5113495bSYour Name 	DP_PRINT_STATS("TC ingress prio: %u ",
5785*5113495bSYour Name 		       soc_cfg_ctx->tc_ingress_prio);
5786*5113495bSYour Name 	DP_PRINT_STATS("rawmode enabled: %u ",
5787*5113495bSYour Name 		       soc_cfg_ctx->rawmode_enabled);
5788*5113495bSYour Name 	DP_PRINT_STATS("peer flow ctrl enabled: %u ",
5789*5113495bSYour Name 		       soc_cfg_ctx->peer_flow_ctrl_enabled);
5790*5113495bSYour Name 	DP_PRINT_STATS("napi enabled: %u ",
5791*5113495bSYour Name 		       soc_cfg_ctx->napi_enabled);
5792*5113495bSYour Name 	DP_PRINT_STATS("P2P Tcp Udp checksum offload: %u ",
5793*5113495bSYour Name 		       soc_cfg_ctx->p2p_tcp_udp_checksumoffload);
5794*5113495bSYour Name 	DP_PRINT_STATS("NAN Tcp Udp checksum offload: %u ",
5795*5113495bSYour Name 		       soc_cfg_ctx->nan_tcp_udp_checksumoffload);
5796*5113495bSYour Name 	DP_PRINT_STATS("Tcp Udp checksum offload: %u ",
5797*5113495bSYour Name 		       soc_cfg_ctx->tcp_udp_checksumoffload);
5798*5113495bSYour Name 	DP_PRINT_STATS("Defrag timeout check: %u ",
5799*5113495bSYour Name 		       soc_cfg_ctx->defrag_timeout_check);
5800*5113495bSYour Name 	DP_PRINT_STATS("Rx defrag min timeout: %u ",
5801*5113495bSYour Name 		       soc_cfg_ctx->rx_defrag_min_timeout);
5802*5113495bSYour Name 	DP_PRINT_STATS("WBM release ring: %u ",
5803*5113495bSYour Name 		       soc_cfg_ctx->wbm_release_ring);
5804*5113495bSYour Name 	DP_PRINT_STATS("TCL CMD_CREDIT ring: %u ",
5805*5113495bSYour Name 		       soc_cfg_ctx->tcl_cmd_credit_ring);
5806*5113495bSYour Name 	DP_PRINT_STATS("TCL Status ring: %u ",
5807*5113495bSYour Name 		       soc_cfg_ctx->tcl_status_ring);
5808*5113495bSYour Name 	DP_PRINT_STATS("REO Destination ring: %u ",
5809*5113495bSYour Name 		       soc_cfg_ctx->reo_dst_ring_size);
5810*5113495bSYour Name 	DP_PRINT_STATS("REO Reinject ring: %u ",
5811*5113495bSYour Name 		       soc_cfg_ctx->reo_reinject_ring);
5812*5113495bSYour Name 	DP_PRINT_STATS("RX release ring: %u ",
5813*5113495bSYour Name 		       soc_cfg_ctx->rx_release_ring);
5814*5113495bSYour Name 	DP_PRINT_STATS("REO Exception ring: %u ",
5815*5113495bSYour Name 		       soc_cfg_ctx->reo_exception_ring);
5816*5113495bSYour Name 	DP_PRINT_STATS("REO CMD ring: %u ",
5817*5113495bSYour Name 		       soc_cfg_ctx->reo_cmd_ring);
5818*5113495bSYour Name 	DP_PRINT_STATS("REO STATUS ring: %u ",
5819*5113495bSYour Name 		       soc_cfg_ctx->reo_status_ring);
5820*5113495bSYour Name 	DP_PRINT_STATS("RXDMA refill ring: %u ",
5821*5113495bSYour Name 		       soc_cfg_ctx->rxdma_refill_ring);
5822*5113495bSYour Name 	DP_PRINT_STATS("TX_desc limit_0: %u ",
5823*5113495bSYour Name 		       soc_cfg_ctx->tx_desc_limit_0);
5824*5113495bSYour Name 	DP_PRINT_STATS("TX_desc limit_1: %u ",
5825*5113495bSYour Name 		       soc_cfg_ctx->tx_desc_limit_1);
5826*5113495bSYour Name 	DP_PRINT_STATS("TX_desc limit_2: %u ",
5827*5113495bSYour Name 		       soc_cfg_ctx->tx_desc_limit_2);
5828*5113495bSYour Name 	DP_PRINT_STATS("TX device limit: %u ",
5829*5113495bSYour Name 		       soc_cfg_ctx->tx_device_limit);
5830*5113495bSYour Name 	DP_PRINT_STATS("TX sw internode queue: %u ",
5831*5113495bSYour Name 		       soc_cfg_ctx->tx_sw_internode_queue);
5832*5113495bSYour Name 	DP_PRINT_STATS("RXDMA err dst ring: %u ",
5833*5113495bSYour Name 		       soc_cfg_ctx->rxdma_err_dst_ring);
5834*5113495bSYour Name 	DP_PRINT_STATS("RX Flow Tag Enabled: %u ",
5835*5113495bSYour Name 		       soc_cfg_ctx->is_rx_flow_tag_enabled);
5836*5113495bSYour Name 	DP_PRINT_STATS("RX Flow Search Table Size (# of entries): %u ",
5837*5113495bSYour Name 		       soc_cfg_ctx->rx_flow_search_table_size);
5838*5113495bSYour Name 	DP_PRINT_STATS("RX Flow Search Table Per PDev : %u ",
5839*5113495bSYour Name 		       soc_cfg_ctx->is_rx_flow_search_table_per_pdev);
5840*5113495bSYour Name 	DP_PRINT_STATS("Rx desc pool size: %u ",
5841*5113495bSYour Name 		       soc_cfg_ctx->rx_sw_desc_num);
5842*5113495bSYour Name }
5843*5113495bSYour Name 
5844*5113495bSYour Name void
dp_print_pdev_cfg_params(struct dp_pdev * pdev)5845*5113495bSYour Name dp_print_pdev_cfg_params(struct dp_pdev *pdev)
5846*5113495bSYour Name {
5847*5113495bSYour Name 	struct wlan_cfg_dp_pdev_ctxt *pdev_cfg_ctx;
5848*5113495bSYour Name 
5849*5113495bSYour Name 	if (!pdev) {
5850*5113495bSYour Name 		dp_err("Context is null");
5851*5113495bSYour Name 		return;
5852*5113495bSYour Name 	}
5853*5113495bSYour Name 
5854*5113495bSYour Name 	pdev_cfg_ctx = pdev->wlan_cfg_ctx;
5855*5113495bSYour Name 
5856*5113495bSYour Name 	if (!pdev_cfg_ctx) {
5857*5113495bSYour Name 		dp_err("Context is null");
5858*5113495bSYour Name 		return;
5859*5113495bSYour Name 	}
5860*5113495bSYour Name 
5861*5113495bSYour Name 	DP_PRINT_STATS("Rx dma buf ring size: %d ",
5862*5113495bSYour Name 		       pdev_cfg_ctx->rx_dma_buf_ring_size);
5863*5113495bSYour Name 	DP_PRINT_STATS("DMA Mon buf ring size: %d ",
5864*5113495bSYour Name 		       pdev_cfg_ctx->dma_mon_buf_ring_size);
5865*5113495bSYour Name 	DP_PRINT_STATS("DMA Mon dest ring size: %d ",
5866*5113495bSYour Name 		       pdev_cfg_ctx->dma_rx_mon_dest_ring_size);
5867*5113495bSYour Name 	DP_PRINT_STATS("DMA Mon status ring size: %d ",
5868*5113495bSYour Name 		       pdev_cfg_ctx->dma_mon_status_ring_size);
5869*5113495bSYour Name 	DP_PRINT_STATS("Rxdma monitor desc ring: %d",
5870*5113495bSYour Name 		       pdev_cfg_ctx->rxdma_monitor_desc_ring);
5871*5113495bSYour Name 	DP_PRINT_STATS("Num mac rings: %d ",
5872*5113495bSYour Name 		       pdev_cfg_ctx->num_mac_rings);
5873*5113495bSYour Name }
5874*5113495bSYour Name 
5875*5113495bSYour Name void
dp_print_ring_stat_from_hal(struct dp_soc * soc,struct dp_srng * srng,enum hal_ring_type ring_type)5876*5113495bSYour Name dp_print_ring_stat_from_hal(struct dp_soc *soc,  struct dp_srng *srng,
5877*5113495bSYour Name 			    enum hal_ring_type ring_type)
5878*5113495bSYour Name {
5879*5113495bSYour Name 	uint32_t tailp;
5880*5113495bSYour Name 	uint32_t headp;
5881*5113495bSYour Name 	int32_t hw_headp = -1;
5882*5113495bSYour Name 	int32_t hw_tailp = -1;
5883*5113495bSYour Name 	uint32_t ring_usage;
5884*5113495bSYour Name 	const char *ring_name;
5885*5113495bSYour Name 
5886*5113495bSYour Name 	if (soc && srng && srng->hal_srng) {
5887*5113495bSYour Name 		ring_name = dp_srng_get_str_from_hal_ring_type(ring_type);
5888*5113495bSYour Name 		hal_get_sw_hptp(soc->hal_soc, srng->hal_srng, &tailp, &headp);
5889*5113495bSYour Name 		ring_usage = hal_get_ring_usage(srng->hal_srng,
5890*5113495bSYour Name 						ring_type, &headp, &tailp);
5891*5113495bSYour Name 
5892*5113495bSYour Name 		DP_PRINT_STATS("%s:SW: Head = %d Tail = %d Ring Usage = %u",
5893*5113495bSYour Name 			       ring_name, headp, tailp, ring_usage);
5894*5113495bSYour Name 
5895*5113495bSYour Name 		hal_get_hw_hptp(soc->hal_soc, srng->hal_srng, &hw_headp,
5896*5113495bSYour Name 				&hw_tailp, ring_type);
5897*5113495bSYour Name 		ring_usage = 0;
5898*5113495bSYour Name 		if (hw_headp >= 0 && tailp >= 0)
5899*5113495bSYour Name 			ring_usage =
5900*5113495bSYour Name 				hal_get_ring_usage(
5901*5113495bSYour Name 					srng->hal_srng, ring_type,
5902*5113495bSYour Name 					&hw_headp, &hw_tailp);
5903*5113495bSYour Name 		DP_PRINT_STATS("%s:HW: Head = %d Tail = %d Ring Usage = %u",
5904*5113495bSYour Name 			       ring_name, hw_headp, hw_tailp, ring_usage);
5905*5113495bSYour Name 	}
5906*5113495bSYour Name }
5907*5113495bSYour Name 
5908*5113495bSYour Name qdf_export_symbol(dp_print_ring_stat_from_hal);
5909*5113495bSYour Name 
5910*5113495bSYour Name #ifdef FEATURE_TSO_STATS
5911*5113495bSYour Name /**
5912*5113495bSYour Name  * dp_print_tso_seg_stats - tso segment stats
5913*5113495bSYour Name  * @pdev: pdev handle
5914*5113495bSYour Name  * @id: tso packet id
5915*5113495bSYour Name  *
5916*5113495bSYour Name  * Return: None
5917*5113495bSYour Name  */
dp_print_tso_seg_stats(struct dp_pdev * pdev,uint32_t id)5918*5113495bSYour Name static void dp_print_tso_seg_stats(struct dp_pdev *pdev, uint32_t id)
5919*5113495bSYour Name {
5920*5113495bSYour Name 	uint8_t num_seg;
5921*5113495bSYour Name 	uint32_t segid;
5922*5113495bSYour Name 
5923*5113495bSYour Name 	/* TSO LEVEL 2 - SEGMENT INFO */
5924*5113495bSYour Name 	num_seg = pdev->stats.tso_stats.tso_info.tso_packet_info[id].num_seg;
5925*5113495bSYour Name 	for (segid = 0; segid < CDP_MAX_TSO_SEGMENTS && segid < num_seg; segid++) {
5926*5113495bSYour Name 		DP_PRINT_STATS(
5927*5113495bSYour Name 			  "Segment id:[%u] fragments: %u | Segment Length %u | TCP Seq no.: %u | ip_id: %u",
5928*5113495bSYour Name 			  segid,
5929*5113495bSYour Name 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5930*5113495bSYour Name 			  .tso_seg[segid].num_frags,
5931*5113495bSYour Name 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5932*5113495bSYour Name 			  .tso_seg[segid].total_len,
5933*5113495bSYour Name 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5934*5113495bSYour Name 			  .tso_seg[segid].tso_flags.tcp_seq_num,
5935*5113495bSYour Name 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5936*5113495bSYour Name 			  .tso_seg[segid].tso_flags.ip_id);
5937*5113495bSYour Name 		DP_PRINT_STATS(
5938*5113495bSYour Name 			  "fin: %u syn: %u rst: %u psh: %u ack: %u urg: %u ece: %u cwr: %u ns: %u",
5939*5113495bSYour Name 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5940*5113495bSYour Name 			  .tso_seg[segid].tso_flags.fin,
5941*5113495bSYour Name 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5942*5113495bSYour Name 			  .tso_seg[segid].tso_flags.syn,
5943*5113495bSYour Name 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5944*5113495bSYour Name 			  .tso_seg[segid].tso_flags.rst,
5945*5113495bSYour Name 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5946*5113495bSYour Name 			  .tso_seg[segid].tso_flags.psh,
5947*5113495bSYour Name 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5948*5113495bSYour Name 			  .tso_seg[segid].tso_flags.ack,
5949*5113495bSYour Name 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5950*5113495bSYour Name 			  .tso_seg[segid].tso_flags.urg,
5951*5113495bSYour Name 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5952*5113495bSYour Name 			  .tso_seg[segid].tso_flags.ece,
5953*5113495bSYour Name 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5954*5113495bSYour Name 			  .tso_seg[segid].tso_flags.cwr,
5955*5113495bSYour Name 			  pdev->stats.tso_stats.tso_info.tso_packet_info[id]
5956*5113495bSYour Name 			  .tso_seg[segid].tso_flags.ns);
5957*5113495bSYour Name 	}
5958*5113495bSYour Name }
5959*5113495bSYour Name #else
5960*5113495bSYour Name static inline
dp_print_tso_seg_stats(struct dp_pdev * pdev,uint32_t id)5961*5113495bSYour Name void dp_print_tso_seg_stats(struct dp_pdev *pdev, uint32_t id)
5962*5113495bSYour Name {
5963*5113495bSYour Name }
5964*5113495bSYour Name #endif /* FEATURE_TSO_STATS */
5965*5113495bSYour Name 
5966*5113495bSYour Name /**
5967*5113495bSYour Name  * dp_print_mon_ring_stat_from_hal() - Print stat for monitor rings based
5968*5113495bSYour Name  *					on target
5969*5113495bSYour Name  * @pdev: physical device handle
5970*5113495bSYour Name  * @mac_id: mac id
5971*5113495bSYour Name  *
5972*5113495bSYour Name  * Return: void
5973*5113495bSYour Name  */
5974*5113495bSYour Name static inline
dp_print_mon_ring_stat_from_hal(struct dp_pdev * pdev,uint8_t mac_id)5975*5113495bSYour Name void dp_print_mon_ring_stat_from_hal(struct dp_pdev *pdev, uint8_t mac_id)
5976*5113495bSYour Name {
5977*5113495bSYour Name 	if (pdev->soc->wlan_cfg_ctx->rxdma1_enable) {
5978*5113495bSYour Name 		dp_print_ring_stat_from_hal(pdev->soc,
5979*5113495bSYour Name 			&pdev->soc->rxdma_mon_buf_ring[mac_id],
5980*5113495bSYour Name 			RXDMA_MONITOR_BUF);
5981*5113495bSYour Name 		dp_print_ring_stat_from_hal(pdev->soc,
5982*5113495bSYour Name 			&pdev->soc->rxdma_mon_dst_ring[mac_id],
5983*5113495bSYour Name 			RXDMA_MONITOR_DST);
5984*5113495bSYour Name 		dp_print_ring_stat_from_hal(pdev->soc,
5985*5113495bSYour Name 			&pdev->soc->rxdma_mon_desc_ring[mac_id],
5986*5113495bSYour Name 			RXDMA_MONITOR_DESC);
5987*5113495bSYour Name 	}
5988*5113495bSYour Name 
5989*5113495bSYour Name 	dp_print_ring_stat_from_hal(pdev->soc,
5990*5113495bSYour Name 				    &pdev->soc->rxdma_mon_status_ring[mac_id],
5991*5113495bSYour Name 					RXDMA_MONITOR_STATUS);
5992*5113495bSYour Name }
5993*5113495bSYour Name 
5994*5113495bSYour Name #if defined(IPA_OFFLOAD) && defined(QCA_WIFI_QCN9224)
5995*5113495bSYour Name /**
5996*5113495bSYour Name  * dp_print_wbm2sw_ring_stats_from_hal() - Print ring stats from hal for ipa
5997*5113495bSYour Name  *                                         use case
5998*5113495bSYour Name  * @pdev : physical device handle
5999*5113495bSYour Name  *
6000*5113495bSYour Name  * Return: void
6001*5113495bSYour Name  */
6002*5113495bSYour Name static inline void
dp_print_wbm2sw_ring_stats_from_hal(struct dp_pdev * pdev)6003*5113495bSYour Name dp_print_wbm2sw_ring_stats_from_hal(struct dp_pdev *pdev)
6004*5113495bSYour Name {
6005*5113495bSYour Name 	uint8_t i = 0;
6006*5113495bSYour Name 
6007*5113495bSYour Name 	for (i = 0; i < pdev->soc->num_tcl_data_rings; i++) {
6008*5113495bSYour Name 		if (i != IPA_TX_COMP_RING_IDX)
6009*5113495bSYour Name 			dp_print_ring_stat_from_hal(pdev->soc,
6010*5113495bSYour Name 						    &pdev->soc->tx_comp_ring[i],
6011*5113495bSYour Name 						    WBM2SW_RELEASE);
6012*5113495bSYour Name 	}
6013*5113495bSYour Name }
6014*5113495bSYour Name #else
6015*5113495bSYour Name static inline void
dp_print_wbm2sw_ring_stats_from_hal(struct dp_pdev * pdev)6016*5113495bSYour Name dp_print_wbm2sw_ring_stats_from_hal(struct dp_pdev *pdev)
6017*5113495bSYour Name {
6018*5113495bSYour Name 	uint8_t i = 0;
6019*5113495bSYour Name 
6020*5113495bSYour Name 	for (i = 0; i < pdev->soc->num_tcl_data_rings; i++)
6021*5113495bSYour Name 		dp_print_ring_stat_from_hal(pdev->soc,
6022*5113495bSYour Name 					    &pdev->soc->tx_comp_ring[i],
6023*5113495bSYour Name 					    WBM2SW_RELEASE);
6024*5113495bSYour Name }
6025*5113495bSYour Name #endif
6026*5113495bSYour Name 
6027*5113495bSYour Name /*
6028*5113495bSYour Name  * Format is:
6029*5113495bSYour Name  * [0 18 1728, 1 15 1222, 2 24 1969,...]
6030*5113495bSYour Name  * 2 character space for [ and ]
6031*5113495bSYour Name  * 8 reo * 3 white space = 24
6032*5113495bSYour Name  * 8 char space for reo rings
6033*5113495bSYour Name  * 8 * 10 (uint32_t max value is 4294967295) = 80
6034*5113495bSYour Name  * 8 * 20 (uint64_t max value is 18446744073709551615) = 160
6035*5113495bSYour Name  * 8 commas
6036*5113495bSYour Name  * 1 for \0
6037*5113495bSYour Name  * Total of 283
6038*5113495bSYour Name  */
6039*5113495bSYour Name #define DP_STATS_STR_LEN 283
6040*5113495bSYour Name #ifndef WLAN_SOFTUMAC_SUPPORT
6041*5113495bSYour Name static int
dp_fill_rx_interrupt_ctx_stats(struct dp_intr * intr_ctx,char * buf,int buf_len)6042*5113495bSYour Name dp_fill_rx_interrupt_ctx_stats(struct dp_intr *intr_ctx,
6043*5113495bSYour Name 			       char *buf, int buf_len)
6044*5113495bSYour Name {
6045*5113495bSYour Name 	int i;
6046*5113495bSYour Name 	int pos = 0;
6047*5113495bSYour Name 
6048*5113495bSYour Name 	if (buf_len <= 0 || !buf) {
6049*5113495bSYour Name 		dp_err("incorrect buf or buf_len(%d)!", buf_len);
6050*5113495bSYour Name 		return pos;
6051*5113495bSYour Name 	}
6052*5113495bSYour Name 
6053*5113495bSYour Name 	for (i = 0; i < MAX_REO_DEST_RINGS; i++) {
6054*5113495bSYour Name 		if (intr_ctx->intr_stats.num_rx_ring_masks[i])
6055*5113495bSYour Name 			pos += qdf_scnprintf(buf + pos,
6056*5113495bSYour Name 					     buf_len - pos,
6057*5113495bSYour Name 					     "reo[%u]:%u ", i,
6058*5113495bSYour Name 					     intr_ctx->intr_stats.num_rx_ring_masks[i]);
6059*5113495bSYour Name 	}
6060*5113495bSYour Name 	return pos;
6061*5113495bSYour Name }
6062*5113495bSYour Name 
6063*5113495bSYour Name static int
dp_fill_tx_interrupt_ctx_stats(struct dp_intr * intr_ctx,char * buf,int buf_len)6064*5113495bSYour Name dp_fill_tx_interrupt_ctx_stats(struct dp_intr *intr_ctx,
6065*5113495bSYour Name 			       char *buf, int buf_len)
6066*5113495bSYour Name {	int i;
6067*5113495bSYour Name 	int pos = 0;
6068*5113495bSYour Name 
6069*5113495bSYour Name 	if (buf_len <= 0 || !buf) {
6070*5113495bSYour Name 		dp_err("incorrect buf or buf_len(%d)!", buf_len);
6071*5113495bSYour Name 		return pos;
6072*5113495bSYour Name 	}
6073*5113495bSYour Name 
6074*5113495bSYour Name 	for (i = 0; i < MAX_TCL_DATA_RINGS; i++) {
6075*5113495bSYour Name 		if (intr_ctx->intr_stats.num_tx_ring_masks[i])
6076*5113495bSYour Name 			pos += qdf_scnprintf(buf + pos,
6077*5113495bSYour Name 					     buf_len - pos,
6078*5113495bSYour Name 					     "tx_comps[%u]:%u ", i,
6079*5113495bSYour Name 					     intr_ctx->intr_stats.num_tx_ring_masks[i]);
6080*5113495bSYour Name 	}
6081*5113495bSYour Name 	return pos;
6082*5113495bSYour Name }
6083*5113495bSYour Name 
dp_print_umac_ring_stats(struct dp_pdev * pdev)6084*5113495bSYour Name static inline void dp_print_umac_ring_stats(struct dp_pdev *pdev)
6085*5113495bSYour Name {
6086*5113495bSYour Name 	uint8_t i;
6087*5113495bSYour Name 
6088*5113495bSYour Name 	dp_print_ring_stat_from_hal(pdev->soc,
6089*5113495bSYour Name 				    &pdev->soc->wbm_idle_link_ring,
6090*5113495bSYour Name 				    WBM_IDLE_LINK);
6091*5113495bSYour Name 	dp_print_ring_stat_from_hal(pdev->soc,
6092*5113495bSYour Name 				    &pdev->soc->reo_exception_ring,
6093*5113495bSYour Name 				    REO_EXCEPTION);
6094*5113495bSYour Name 	dp_print_ring_stat_from_hal(pdev->soc,
6095*5113495bSYour Name 				    &pdev->soc->reo_reinject_ring,
6096*5113495bSYour Name 				    REO_REINJECT);
6097*5113495bSYour Name 	dp_print_ring_stat_from_hal(pdev->soc,
6098*5113495bSYour Name 				    &pdev->soc->reo_cmd_ring,
6099*5113495bSYour Name 				    REO_CMD);
6100*5113495bSYour Name 	dp_print_ring_stat_from_hal(pdev->soc,
6101*5113495bSYour Name 				    &pdev->soc->reo_status_ring,
6102*5113495bSYour Name 				    REO_STATUS);
6103*5113495bSYour Name 	dp_print_ring_stat_from_hal(pdev->soc,
6104*5113495bSYour Name 				    &pdev->soc->rx_rel_ring,
6105*5113495bSYour Name 				    WBM2SW_RELEASE);
6106*5113495bSYour Name 	dp_print_ring_stat_from_hal(pdev->soc,
6107*5113495bSYour Name 				    &pdev->soc->tcl_cmd_credit_ring,
6108*5113495bSYour Name 				    TCL_CMD_CREDIT);
6109*5113495bSYour Name 	dp_print_ring_stat_from_hal(pdev->soc,
6110*5113495bSYour Name 				    &pdev->soc->tcl_status_ring,
6111*5113495bSYour Name 				    TCL_STATUS);
6112*5113495bSYour Name 	dp_print_ring_stat_from_hal(pdev->soc,
6113*5113495bSYour Name 				    &pdev->soc->wbm_desc_rel_ring,
6114*5113495bSYour Name 				    SW2WBM_RELEASE);
6115*5113495bSYour Name 	for (i = 0; i < MAX_REO_DEST_RINGS; i++)
6116*5113495bSYour Name 		dp_print_ring_stat_from_hal(pdev->soc,
6117*5113495bSYour Name 					    &pdev->soc->reo_dest_ring[i],
6118*5113495bSYour Name 					    REO_DST);
6119*5113495bSYour Name 
6120*5113495bSYour Name 	for (i = 0; i < pdev->soc->num_tcl_data_rings; i++)
6121*5113495bSYour Name 		dp_print_ring_stat_from_hal(pdev->soc,
6122*5113495bSYour Name 					    &pdev->soc->tcl_data_ring[i],
6123*5113495bSYour Name 					    TCL_DATA);
6124*5113495bSYour Name 	dp_print_wbm2sw_ring_stats_from_hal(pdev);
6125*5113495bSYour Name }
6126*5113495bSYour Name 
dp_print_ce_ring_stats(struct dp_pdev * pdev)6127*5113495bSYour Name static inline void dp_print_ce_ring_stats(struct dp_pdev *pdev) {}
6128*5113495bSYour Name 
dp_print_tx_ring_stats(struct dp_soc * soc)6129*5113495bSYour Name static inline void dp_print_tx_ring_stats(struct dp_soc *soc)
6130*5113495bSYour Name {
6131*5113495bSYour Name 	uint8_t i;
6132*5113495bSYour Name 
6133*5113495bSYour Name 	for (i = 0; i < soc->num_tcl_data_rings; i++) {
6134*5113495bSYour Name 		DP_PRINT_STATS("Enqueue to SW2TCL%u: %u", i + 1,
6135*5113495bSYour Name 			       soc->stats.tx.tcl_enq[i]);
6136*5113495bSYour Name 		DP_PRINT_STATS("TX completions reaped from ring %u: %u",
6137*5113495bSYour Name 			       i, soc->stats.tx.tx_comp[i]);
6138*5113495bSYour Name 	}
6139*5113495bSYour Name }
6140*5113495bSYour Name 
dp_print_rx_ring_stats(struct dp_pdev * pdev)6141*5113495bSYour Name static inline void dp_print_rx_ring_stats(struct dp_pdev *pdev)
6142*5113495bSYour Name {
6143*5113495bSYour Name 	uint8_t dp_stats_str[DP_STATS_STR_LEN] = {'\0'};
6144*5113495bSYour Name 	uint8_t *buf = dp_stats_str;
6145*5113495bSYour Name 	size_t pos = 0;
6146*5113495bSYour Name 	size_t buf_len = DP_STATS_STR_LEN;
6147*5113495bSYour Name 	uint8_t i;
6148*5113495bSYour Name 
6149*5113495bSYour Name 	pos += qdf_scnprintf(buf + pos, buf_len - pos, "%s", "REO/msdus/bytes [");
6150*5113495bSYour Name 	for (i = 0; i < CDP_MAX_RX_RINGS; i++) {
6151*5113495bSYour Name 		if (!pdev->stats.rx.rcvd_reo[i].num)
6152*5113495bSYour Name 			continue;
6153*5113495bSYour Name 
6154*5113495bSYour Name 		pos += qdf_scnprintf(buf + pos, buf_len - pos,
6155*5113495bSYour Name 				     "%d %llu %llu, ",
6156*5113495bSYour Name 				     i, pdev->stats.rx.rcvd_reo[i].num,
6157*5113495bSYour Name 				     pdev->stats.rx.rcvd_reo[i].bytes);
6158*5113495bSYour Name 	}
6159*5113495bSYour Name 	pos += qdf_scnprintf(buf + pos, buf_len - pos, "%s", "]");
6160*5113495bSYour Name 	DP_PRINT_STATS("%s", dp_stats_str);
6161*5113495bSYour Name }
6162*5113495bSYour Name 
6163*5113495bSYour Name static inline void
dp_print_rx_err_stats(struct dp_soc * soc,struct dp_pdev * pdev)6164*5113495bSYour Name dp_print_rx_err_stats(struct dp_soc *soc, struct dp_pdev *pdev)
6165*5113495bSYour Name {
6166*5113495bSYour Name 	uint8_t error_code;
6167*5113495bSYour Name 
6168*5113495bSYour Name 	DP_PRINT_STATS("intra-bss EAPOL drops: %u",
6169*5113495bSYour Name 		       soc->stats.rx.err.intrabss_eapol_drop);
6170*5113495bSYour Name 	DP_PRINT_STATS("mic errors %u",
6171*5113495bSYour Name 		       pdev->stats.rx.err.mic_err);
6172*5113495bSYour Name 	DP_PRINT_STATS("Invalid peer on rx path: %llu",
6173*5113495bSYour Name 		       pdev->soc->stats.rx.err.rx_invalid_peer.num);
6174*5113495bSYour Name 	DP_PRINT_STATS("sw_peer_id invalid %llu",
6175*5113495bSYour Name 		       pdev->soc->stats.rx.err.rx_invalid_peer_id.num);
6176*5113495bSYour Name 	DP_PRINT_STATS("packet_len invalid %llu",
6177*5113495bSYour Name 		       pdev->soc->stats.rx.err.rx_invalid_pkt_len.num);
6178*5113495bSYour Name 	DP_PRINT_STATS("sa or da idx invalid %u",
6179*5113495bSYour Name 		       pdev->soc->stats.rx.err.invalid_sa_da_idx);
6180*5113495bSYour Name 	DP_PRINT_STATS("defrag peer uninit %u",
6181*5113495bSYour Name 		       pdev->soc->stats.rx.err.defrag_peer_uninit);
6182*5113495bSYour Name 	DP_PRINT_STATS("pkts delivered no peer %u",
6183*5113495bSYour Name 		       pdev->soc->stats.rx.err.pkt_delivered_no_peer);
6184*5113495bSYour Name 	DP_PRINT_STATS("RX invalid cookie: %d",
6185*5113495bSYour Name 		       soc->stats.rx.err.invalid_cookie);
6186*5113495bSYour Name 	DP_PRINT_STATS("RX stale cookie: %d",
6187*5113495bSYour Name 		       soc->stats.rx.err.stale_cookie);
6188*5113495bSYour Name 	DP_PRINT_STATS("2k jump delba sent: %u",
6189*5113495bSYour Name 		       pdev->soc->stats.rx.err.rx_2k_jump_delba_sent);
6190*5113495bSYour Name 	DP_PRINT_STATS("2k jump msdu to stack: %u",
6191*5113495bSYour Name 		       pdev->soc->stats.rx.err.rx_2k_jump_to_stack);
6192*5113495bSYour Name 	DP_PRINT_STATS("2k jump msdu drop: %u",
6193*5113495bSYour Name 		       pdev->soc->stats.rx.err.rx_2k_jump_drop);
6194*5113495bSYour Name 	DP_PRINT_STATS("REO err oor msdu to stack %u",
6195*5113495bSYour Name 		       pdev->soc->stats.rx.err.reo_err_oor_to_stack);
6196*5113495bSYour Name 	DP_PRINT_STATS("REO err oor msdu drop: %u",
6197*5113495bSYour Name 		       pdev->soc->stats.rx.err.reo_err_oor_drop);
6198*5113495bSYour Name 	DP_PRINT_STATS("Rx err msdu rejected: %d",
6199*5113495bSYour Name 		       soc->stats.rx.err.rejected);
6200*5113495bSYour Name 	DP_PRINT_STATS("Rx raw frame dropped: %d",
6201*5113495bSYour Name 		       soc->stats.rx.err.raw_frm_drop);
6202*5113495bSYour Name 	DP_PRINT_STATS("Rx stale link desc cookie: %d",
6203*5113495bSYour Name 		       pdev->soc->stats.rx.err.invalid_link_cookie);
6204*5113495bSYour Name 	DP_PRINT_STATS("Rx nbuf sanity fails: %d",
6205*5113495bSYour Name 		       pdev->soc->stats.rx.err.nbuf_sanity_fail);
6206*5113495bSYour Name 	DP_PRINT_STATS("Rx refill duplicate link desc: %d",
6207*5113495bSYour Name 		       pdev->soc->stats.rx.err.dup_refill_link_desc);
6208*5113495bSYour Name 	DP_PRINT_STATS("Rx ipa smmu map duplicate: %d",
6209*5113495bSYour Name 		       pdev->soc->stats.rx.err.ipa_smmu_map_dup);
6210*5113495bSYour Name 	DP_PRINT_STATS("Rx ipa smmu unmap duplicate: %d",
6211*5113495bSYour Name 		       pdev->soc->stats.rx.err.ipa_smmu_unmap_dup);
6212*5113495bSYour Name 	DP_PRINT_STATS("Rx ipa smmu unmap no pipes: %d",
6213*5113495bSYour Name 		       pdev->soc->stats.rx.err.ipa_unmap_no_pipe);
6214*5113495bSYour Name 	DP_PRINT_STATS("PN-in-Dest error frame pn-check fail: %d",
6215*5113495bSYour Name 		       soc->stats.rx.err.pn_in_dest_check_fail);
6216*5113495bSYour Name 
6217*5113495bSYour Name 	DP_PRINT_STATS("Reo Statistics");
6218*5113495bSYour Name 	DP_PRINT_STATS("near_full: %u ", soc->stats.rx.near_full);
6219*5113495bSYour Name 	DP_PRINT_STATS("rbm error: %u msdus",
6220*5113495bSYour Name 		       pdev->soc->stats.rx.err.invalid_rbm);
6221*5113495bSYour Name 	DP_PRINT_STATS("hal ring access fail: %u msdus",
6222*5113495bSYour Name 		       pdev->soc->stats.rx.err.hal_ring_access_fail);
6223*5113495bSYour Name 
6224*5113495bSYour Name 	DP_PRINT_STATS("hal ring access full fail: %u msdus",
6225*5113495bSYour Name 		       pdev->soc->stats.rx.err.hal_ring_access_full_fail);
6226*5113495bSYour Name 
6227*5113495bSYour Name 	for (error_code = 0; error_code < HAL_REO_ERR_MAX;
6228*5113495bSYour Name 	     error_code++) {
6229*5113495bSYour Name 		if (!pdev->soc->stats.rx.err.reo_error[error_code])
6230*5113495bSYour Name 			continue;
6231*5113495bSYour Name 		DP_PRINT_STATS("Reo error number (%u): %u msdus",
6232*5113495bSYour Name 			       error_code,
6233*5113495bSYour Name 			       pdev->soc->stats.rx.err.reo_error[error_code]);
6234*5113495bSYour Name 	}
6235*5113495bSYour Name }
6236*5113495bSYour Name 
dp_print_soc_tx_stats(struct dp_soc * soc)6237*5113495bSYour Name void dp_print_soc_tx_stats(struct dp_soc *soc)
6238*5113495bSYour Name {
6239*5113495bSYour Name 	uint8_t desc_pool_id;
6240*5113495bSYour Name 	struct dp_tx_desc_pool_s *tx_desc_pool;
6241*5113495bSYour Name 
6242*5113495bSYour Name 	soc->stats.tx.desc_in_use = 0;
6243*5113495bSYour Name 
6244*5113495bSYour Name 	DP_PRINT_STATS("SOC Tx Stats:\n");
6245*5113495bSYour Name 
6246*5113495bSYour Name 	for (desc_pool_id = 0;
6247*5113495bSYour Name 	     desc_pool_id < wlan_cfg_get_num_tx_desc_pool(soc->wlan_cfg_ctx);
6248*5113495bSYour Name 	     desc_pool_id++) {
6249*5113495bSYour Name 		tx_desc_pool = dp_get_tx_desc_pool(soc, desc_pool_id);
6250*5113495bSYour Name 		soc->stats.tx.desc_in_use +=
6251*5113495bSYour Name 			tx_desc_pool->num_allocated;
6252*5113495bSYour Name 		tx_desc_pool = dp_get_spcl_tx_desc_pool(soc, desc_pool_id);
6253*5113495bSYour Name 		soc->stats.tx.desc_in_use +=
6254*5113495bSYour Name 			tx_desc_pool->num_allocated;
6255*5113495bSYour Name 	}
6256*5113495bSYour Name 
6257*5113495bSYour Name 	DP_PRINT_STATS("Tx Descriptors In Use = %u",
6258*5113495bSYour Name 		       soc->stats.tx.desc_in_use);
6259*5113495bSYour Name 	DP_PRINT_STATS("Tx Invalid peer:");
6260*5113495bSYour Name 	DP_PRINT_STATS("	Packets = %llu",
6261*5113495bSYour Name 		       soc->stats.tx.tx_invalid_peer.num);
6262*5113495bSYour Name 	DP_PRINT_STATS("	Bytes = %llu",
6263*5113495bSYour Name 		       soc->stats.tx.tx_invalid_peer.bytes);
6264*5113495bSYour Name 	DP_PRINT_STATS("Packets dropped due to TCL ring full = %u %u %u %u",
6265*5113495bSYour Name 		       soc->stats.tx.tcl_ring_full[0],
6266*5113495bSYour Name 		       soc->stats.tx.tcl_ring_full[1],
6267*5113495bSYour Name 		       soc->stats.tx.tcl_ring_full[2],
6268*5113495bSYour Name 		       soc->stats.tx.tcl_ring_full[3]);
6269*5113495bSYour Name 	DP_PRINT_STATS("Tx invalid completion release = %u",
6270*5113495bSYour Name 		       soc->stats.tx.invalid_release_source);
6271*5113495bSYour Name 	DP_PRINT_STATS("TX invalid Desc from completion ring = %u",
6272*5113495bSYour Name 		       soc->stats.tx.invalid_tx_comp_desc);
6273*5113495bSYour Name 	DP_PRINT_STATS("Tx comp wbm internal error = %d : [%d %d %d %d]",
6274*5113495bSYour Name 		       soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_ALL],
6275*5113495bSYour Name 		       soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_BUFFER],
6276*5113495bSYour Name 		       soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_LINK_DESC],
6277*5113495bSYour Name 		       soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_MSDU_BUFF],
6278*5113495bSYour Name 		       soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_BUFF_REAPED]);
6279*5113495bSYour Name 	DP_PRINT_STATS("Tx comp non wbm internal error = %d",
6280*5113495bSYour Name 		       soc->stats.tx.non_wbm_internal_err);
6281*5113495bSYour Name 	DP_PRINT_STATS("Tx comp loop pkt limit hit = %d",
6282*5113495bSYour Name 		       soc->stats.tx.tx_comp_loop_pkt_limit_hit);
6283*5113495bSYour Name 	DP_PRINT_STATS("Tx comp HP out of sync2 = %d",
6284*5113495bSYour Name 		       soc->stats.tx.hp_oos2);
6285*5113495bSYour Name 	dp_print_tx_ppeds_stats(soc);
6286*5113495bSYour Name }
6287*5113495bSYour Name 
6288*5113495bSYour Name #define DP_INT_CTX_STATS_STRING_LEN 512
dp_print_soc_interrupt_stats(struct dp_soc * soc)6289*5113495bSYour Name void dp_print_soc_interrupt_stats(struct dp_soc *soc)
6290*5113495bSYour Name {
6291*5113495bSYour Name 	char *buf;
6292*5113495bSYour Name 	char int_ctx_str[DP_INT_CTX_STATS_STRING_LEN] = {'\0'};
6293*5113495bSYour Name 	int i, pos, buf_len;
6294*5113495bSYour Name 	struct dp_intr_stats *intr_stats;
6295*5113495bSYour Name 
6296*5113495bSYour Name 	buf = int_ctx_str;
6297*5113495bSYour Name 	buf_len = DP_INT_CTX_STATS_STRING_LEN;
6298*5113495bSYour Name 
6299*5113495bSYour Name 	for (i = 0; i < WLAN_CFG_INT_NUM_CONTEXTS; i++) {
6300*5113495bSYour Name 		pos = 0;
6301*5113495bSYour Name 		qdf_mem_zero(int_ctx_str, sizeof(int_ctx_str));
6302*5113495bSYour Name 		intr_stats = &soc->intr_ctx[i].intr_stats;
6303*5113495bSYour Name 
6304*5113495bSYour Name 		if (!intr_stats->num_masks && !intr_stats->num_near_full_masks)
6305*5113495bSYour Name 			continue;
6306*5113495bSYour Name 
6307*5113495bSYour Name 		pos += qdf_scnprintf(buf + pos,
6308*5113495bSYour Name 				     buf_len - pos,
6309*5113495bSYour Name 				     "%2u[%3d] - Total:%u ",
6310*5113495bSYour Name 				     i,
6311*5113495bSYour Name 				     hif_get_int_ctx_irq_num(soc->hif_handle,
6312*5113495bSYour Name 							     i),
6313*5113495bSYour Name 				     intr_stats->num_masks);
6314*5113495bSYour Name 
6315*5113495bSYour Name 		if (soc->intr_ctx[i].tx_ring_mask)
6316*5113495bSYour Name 			pos += dp_fill_tx_interrupt_ctx_stats(&soc->intr_ctx[i],
6317*5113495bSYour Name 							      buf + pos,
6318*5113495bSYour Name 							      buf_len - pos);
6319*5113495bSYour Name 
6320*5113495bSYour Name 		if (soc->intr_ctx[i].rx_ring_mask)
6321*5113495bSYour Name 			pos += dp_fill_rx_interrupt_ctx_stats(&soc->intr_ctx[i],
6322*5113495bSYour Name 							      buf + pos,
6323*5113495bSYour Name 							      buf_len - pos);
6324*5113495bSYour Name 		if (soc->intr_ctx[i].rx_err_ring_mask)
6325*5113495bSYour Name 			pos += qdf_scnprintf(buf + pos,
6326*5113495bSYour Name 					     buf_len - pos,
6327*5113495bSYour Name 					     "reo_err:%u ",
6328*5113495bSYour Name 					     intr_stats->num_rx_err_ring_masks);
6329*5113495bSYour Name 
6330*5113495bSYour Name 		if (soc->intr_ctx[i].rx_wbm_rel_ring_mask)
6331*5113495bSYour Name 			pos += qdf_scnprintf(buf + pos,
6332*5113495bSYour Name 					     buf_len - pos,
6333*5113495bSYour Name 					     "wbm_rx_err:%u ",
6334*5113495bSYour Name 					     intr_stats->num_rx_wbm_rel_ring_masks);
6335*5113495bSYour Name 
6336*5113495bSYour Name 		if (soc->intr_ctx[i].rxdma2host_ring_mask)
6337*5113495bSYour Name 			pos += qdf_scnprintf(buf + pos,
6338*5113495bSYour Name 					     buf_len - pos,
6339*5113495bSYour Name 					     "rxdma2_host_err:%u ",
6340*5113495bSYour Name 					     intr_stats->num_rxdma2host_ring_masks);
6341*5113495bSYour Name 
6342*5113495bSYour Name 		if (soc->intr_ctx[i].rx_near_full_grp_1_mask)
6343*5113495bSYour Name 			pos += qdf_scnprintf(buf + pos,
6344*5113495bSYour Name 					     buf_len - pos,
6345*5113495bSYour Name 					     "rx_near_full_grp_1:%u ",
6346*5113495bSYour Name 					     intr_stats->num_near_full_masks);
6347*5113495bSYour Name 
6348*5113495bSYour Name 		if (soc->intr_ctx[i].rx_near_full_grp_2_mask)
6349*5113495bSYour Name 			pos += qdf_scnprintf(buf + pos,
6350*5113495bSYour Name 					     buf_len - pos,
6351*5113495bSYour Name 					     "rx_near_full_grp_2:%u ",
6352*5113495bSYour Name 					     intr_stats->num_near_full_masks);
6353*5113495bSYour Name 		if (soc->intr_ctx[i].tx_ring_near_full_mask)
6354*5113495bSYour Name 			pos += qdf_scnprintf(buf + pos,
6355*5113495bSYour Name 					     buf_len - pos,
6356*5113495bSYour Name 					     "tx_near_full:%u ",
6357*5113495bSYour Name 					     intr_stats->num_near_full_masks);
6358*5113495bSYour Name 
6359*5113495bSYour Name 		dp_info("%s", int_ctx_str);
6360*5113495bSYour Name 	}
6361*5113495bSYour Name }
6362*5113495bSYour Name #else
dp_print_umac_ring_stats(struct dp_pdev * pdev)6363*5113495bSYour Name static inline void dp_print_umac_ring_stats(struct dp_pdev *pdev) {}
6364*5113495bSYour Name 
dp_print_ce_ring_stats(struct dp_pdev * pdev)6365*5113495bSYour Name static inline void dp_print_ce_ring_stats(struct dp_pdev *pdev)
6366*5113495bSYour Name {
6367*5113495bSYour Name 	hif_ce_print_ring_stats(pdev->soc->hif_handle);
6368*5113495bSYour Name }
6369*5113495bSYour Name 
dp_print_tx_ring_stats(struct dp_soc * soc)6370*5113495bSYour Name static inline void dp_print_tx_ring_stats(struct dp_soc *soc)
6371*5113495bSYour Name {
6372*5113495bSYour Name 	uint8_t i;
6373*5113495bSYour Name 
6374*5113495bSYour Name 	for (i = 0; i < MAX_TCL_DATA_RINGS; i++) {
6375*5113495bSYour Name 		DP_PRINT_STATS("Enqueue to Tx ring %u: %u", i + 1,
6376*5113495bSYour Name 			       soc->stats.tx.tcl_enq[i]);
6377*5113495bSYour Name 		DP_PRINT_STATS("TX completions reaped from ring %u: %u",
6378*5113495bSYour Name 			       i, soc->stats.tx.tx_comp[i]);
6379*5113495bSYour Name 	}
6380*5113495bSYour Name }
6381*5113495bSYour Name 
dp_print_rx_ring_stats(struct dp_pdev * pdev)6382*5113495bSYour Name static inline void dp_print_rx_ring_stats(struct dp_pdev *pdev)
6383*5113495bSYour Name {
6384*5113495bSYour Name 	uint8_t dp_stats_str[DP_STATS_STR_LEN] = {'\0'};
6385*5113495bSYour Name 	uint8_t *buf = dp_stats_str;
6386*5113495bSYour Name 	size_t pos = 0;
6387*5113495bSYour Name 	size_t buf_len = DP_STATS_STR_LEN;
6388*5113495bSYour Name 	uint8_t i;
6389*5113495bSYour Name 
6390*5113495bSYour Name 	pos += qdf_scnprintf(buf + pos, buf_len - pos, "%s", "RX/msdus/bytes [");
6391*5113495bSYour Name 	for (i = 0; i < CDP_MAX_RX_RINGS; i++) {
6392*5113495bSYour Name 		if (!pdev->stats.rx.rcvd_reo[i].num)
6393*5113495bSYour Name 			continue;
6394*5113495bSYour Name 
6395*5113495bSYour Name 		pos += qdf_scnprintf(buf + pos, buf_len - pos,
6396*5113495bSYour Name 				     "%d %llu %llu, ",
6397*5113495bSYour Name 				     i, pdev->stats.rx.rcvd_reo[i].num,
6398*5113495bSYour Name 				     pdev->stats.rx.rcvd_reo[i].bytes);
6399*5113495bSYour Name 	}
6400*5113495bSYour Name 	pos += qdf_scnprintf(buf + pos, buf_len - pos, "%s", "]");
6401*5113495bSYour Name 	DP_PRINT_STATS("%s", dp_stats_str);
6402*5113495bSYour Name }
6403*5113495bSYour Name 
6404*5113495bSYour Name static inline void
dp_print_rx_err_stats(struct dp_soc * soc,struct dp_pdev * pdev)6405*5113495bSYour Name dp_print_rx_err_stats(struct dp_soc *soc, struct dp_pdev *pdev)
6406*5113495bSYour Name {
6407*5113495bSYour Name 	DP_PRINT_STATS("intra-bss EAPOL drops: %u",
6408*5113495bSYour Name 		       soc->stats.rx.err.intrabss_eapol_drop);
6409*5113495bSYour Name 	DP_PRINT_STATS("mic errors %u",
6410*5113495bSYour Name 		       pdev->stats.rx.err.mic_err);
6411*5113495bSYour Name 	DP_PRINT_STATS("2k jump msdu drop: %u",
6412*5113495bSYour Name 		       pdev->soc->stats.rx.err.rx_2k_jump_drop);
6413*5113495bSYour Name 	DP_PRINT_STATS("REO err oor msdu drop: %u",
6414*5113495bSYour Name 		       pdev->soc->stats.rx.err.reo_err_oor_drop);
6415*5113495bSYour Name 	DP_PRINT_STATS("Invalid peer on rx path: %llu",
6416*5113495bSYour Name 		       pdev->soc->stats.rx.err.rx_invalid_peer.num);
6417*5113495bSYour Name 	DP_PRINT_STATS("sw_peer_id invalid %llu",
6418*5113495bSYour Name 		       pdev->soc->stats.rx.err.rx_invalid_peer_id.num);
6419*5113495bSYour Name 	DP_PRINT_STATS("packet_len invalid %llu",
6420*5113495bSYour Name 		       pdev->soc->stats.rx.err.rx_invalid_pkt_len.num);
6421*5113495bSYour Name 	DP_PRINT_STATS("sa or da idx invalid %u",
6422*5113495bSYour Name 		       pdev->soc->stats.rx.err.invalid_sa_da_idx);
6423*5113495bSYour Name 	DP_PRINT_STATS("defrag peer uninit %u",
6424*5113495bSYour Name 		       pdev->soc->stats.rx.err.defrag_peer_uninit);
6425*5113495bSYour Name 	DP_PRINT_STATS("pkts delivered no peer %u",
6426*5113495bSYour Name 		       pdev->soc->stats.rx.err.pkt_delivered_no_peer);
6427*5113495bSYour Name 	DP_PRINT_STATS("RX invalid cookie: %d",
6428*5113495bSYour Name 		       soc->stats.rx.err.invalid_cookie);
6429*5113495bSYour Name 	DP_PRINT_STATS("RX stale cookie: %d",
6430*5113495bSYour Name 		       soc->stats.rx.err.stale_cookie);
6431*5113495bSYour Name 	DP_PRINT_STATS("Rx err msdu rejected: %d",
6432*5113495bSYour Name 		       soc->stats.rx.err.rejected);
6433*5113495bSYour Name 	DP_PRINT_STATS("Rx raw frame dropped: %d",
6434*5113495bSYour Name 		       soc->stats.rx.err.raw_frm_drop);
6435*5113495bSYour Name 	DP_PRINT_STATS("Rx nbuf sanity fails: %d",
6436*5113495bSYour Name 		       pdev->soc->stats.rx.err.nbuf_sanity_fail);
6437*5113495bSYour Name 	DP_PRINT_STATS("PN-in-Dest error frame pn-check fail: %d",
6438*5113495bSYour Name 		       soc->stats.rx.err.pn_in_dest_check_fail);
6439*5113495bSYour Name }
6440*5113495bSYour Name 
dp_print_soc_tx_stats(struct dp_soc * soc)6441*5113495bSYour Name void dp_print_soc_tx_stats(struct dp_soc *soc)
6442*5113495bSYour Name {
6443*5113495bSYour Name 	uint8_t desc_pool_id;
6444*5113495bSYour Name 
6445*5113495bSYour Name 	soc->stats.tx.desc_in_use = 0;
6446*5113495bSYour Name 
6447*5113495bSYour Name 	DP_PRINT_STATS("SOC Tx Stats:\n");
6448*5113495bSYour Name 
6449*5113495bSYour Name 	for (desc_pool_id = 0;
6450*5113495bSYour Name 	     desc_pool_id < wlan_cfg_get_num_tx_desc_pool(soc->wlan_cfg_ctx);
6451*5113495bSYour Name 	     desc_pool_id++)
6452*5113495bSYour Name 		soc->stats.tx.desc_in_use +=
6453*5113495bSYour Name 			soc->tx_desc[desc_pool_id].num_allocated;
6454*5113495bSYour Name 
6455*5113495bSYour Name 	DP_PRINT_STATS("Tx Descriptors In Use = %u",
6456*5113495bSYour Name 		       soc->stats.tx.desc_in_use);
6457*5113495bSYour Name 	DP_PRINT_STATS("Tx Invalid peer:");
6458*5113495bSYour Name 	DP_PRINT_STATS("	Packets = %llu",
6459*5113495bSYour Name 		       soc->stats.tx.tx_invalid_peer.num);
6460*5113495bSYour Name 	DP_PRINT_STATS("	Bytes = %llu",
6461*5113495bSYour Name 		       soc->stats.tx.tx_invalid_peer.bytes);
6462*5113495bSYour Name 	DP_PRINT_STATS("Packets dropped due to Tx ring full = %u",
6463*5113495bSYour Name 		       soc->stats.tx.tcl_ring_full[0]);
6464*5113495bSYour Name 	DP_PRINT_STATS("Tx invalid completion release = %u",
6465*5113495bSYour Name 		       soc->stats.tx.invalid_release_source);
6466*5113495bSYour Name 	DP_PRINT_STATS("TX invalid Desc from completion ring = %u",
6467*5113495bSYour Name 		       soc->stats.tx.invalid_tx_comp_desc);
6468*5113495bSYour Name 	dp_print_tx_ppeds_stats(soc);
6469*5113495bSYour Name }
6470*5113495bSYour Name 
6471*5113495bSYour Name /* TODO: print CE intr stats? */
dp_print_soc_interrupt_stats(struct dp_soc * soc)6472*5113495bSYour Name void dp_print_soc_interrupt_stats(struct dp_soc *soc) {}
6473*5113495bSYour Name #endif
6474*5113495bSYour Name 
6475*5113495bSYour Name void
dp_print_ring_stats(struct dp_pdev * pdev)6476*5113495bSYour Name dp_print_ring_stats(struct dp_pdev *pdev)
6477*5113495bSYour Name {
6478*5113495bSYour Name 	struct dp_soc *soc = pdev->soc;
6479*5113495bSYour Name 	uint32_t i;
6480*5113495bSYour Name 	int mac_id;
6481*5113495bSYour Name 	int lmac_id;
6482*5113495bSYour Name 
6483*5113495bSYour Name 	if (hif_rtpm_get(HIF_RTPM_GET_SYNC, HIF_RTPM_ID_DP_RING_STATS))
6484*5113495bSYour Name 		return;
6485*5113495bSYour Name 
6486*5113495bSYour Name 	dp_print_ce_ring_stats(pdev);
6487*5113495bSYour Name 	dp_print_umac_ring_stats(pdev);
6488*5113495bSYour Name 
6489*5113495bSYour Name 	if (pdev->soc->features.dmac_cmn_src_rxbuf_ring_enabled) {
6490*5113495bSYour Name 		for (i = 0; i < pdev->soc->num_rx_refill_buf_rings; i++) {
6491*5113495bSYour Name 			dp_print_ring_stat_from_hal
6492*5113495bSYour Name 				(pdev->soc, &pdev->soc->rx_refill_buf_ring[i],
6493*5113495bSYour Name 				 RXDMA_BUF);
6494*5113495bSYour Name 		}
6495*5113495bSYour Name 	} else {
6496*5113495bSYour Name 		lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc, 0,
6497*5113495bSYour Name 						     pdev->pdev_id);
6498*5113495bSYour Name 		dp_print_ring_stat_from_hal
6499*5113495bSYour Name 			(pdev->soc, &pdev->soc->rx_refill_buf_ring[lmac_id],
6500*5113495bSYour Name 			 RXDMA_BUF);
6501*5113495bSYour Name 	}
6502*5113495bSYour Name 
6503*5113495bSYour Name 	dp_print_ring_stat_from_hal(pdev->soc,
6504*5113495bSYour Name 				    &pdev->rx_refill_buf_ring2,
6505*5113495bSYour Name 				    RXDMA_BUF);
6506*5113495bSYour Name 
6507*5113495bSYour Name 	for (i = 0; i < MAX_RX_MAC_RINGS; i++)
6508*5113495bSYour Name 		dp_print_ring_stat_from_hal(pdev->soc,
6509*5113495bSYour Name 					    &pdev->rx_mac_buf_ring[i],
6510*5113495bSYour Name 					    RXDMA_BUF);
6511*5113495bSYour Name 
6512*5113495bSYour Name 	for (mac_id = 0;
6513*5113495bSYour Name 	     mac_id  < soc->wlan_cfg_ctx->num_rxdma_status_rings_per_pdev;
6514*5113495bSYour Name 	     mac_id++) {
6515*5113495bSYour Name 		lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc,
6516*5113495bSYour Name 						     mac_id, pdev->pdev_id);
6517*5113495bSYour Name 
6518*5113495bSYour Name 		dp_print_mon_ring_stat_from_hal(pdev, lmac_id);
6519*5113495bSYour Name 	}
6520*5113495bSYour Name 
6521*5113495bSYour Name 	for (i = 0; i < soc->wlan_cfg_ctx->num_rxdma_dst_rings_per_pdev; i++) {
6522*5113495bSYour Name 		lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc,
6523*5113495bSYour Name 						     i, pdev->pdev_id);
6524*5113495bSYour Name 
6525*5113495bSYour Name 		dp_print_ring_stat_from_hal(pdev->soc,
6526*5113495bSYour Name 					    &pdev->soc->rxdma_err_dst_ring
6527*5113495bSYour Name 					    [lmac_id],
6528*5113495bSYour Name 					    RXDMA_DST);
6529*5113495bSYour Name 	}
6530*5113495bSYour Name 
6531*5113495bSYour Name 	dp_print_txmon_ring_stat_from_hal(pdev);
6532*5113495bSYour Name 
6533*5113495bSYour Name #ifdef WLAN_SUPPORT_PPEDS
6534*5113495bSYour Name 	if (pdev->soc->arch_ops.dp_txrx_ppeds_rings_status)
6535*5113495bSYour Name 		pdev->soc->arch_ops.dp_txrx_ppeds_rings_status(pdev->soc);
6536*5113495bSYour Name #endif
6537*5113495bSYour Name 	hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_DP_RING_STATS);
6538*5113495bSYour Name }
6539*5113495bSYour Name 
6540*5113495bSYour Name /**
6541*5113495bSYour Name  * dp_print_common_rates_info(): Print common rate for tx or rx
6542*5113495bSYour Name  * @pkt_type_array: rate type array contains rate info
6543*5113495bSYour Name  *
6544*5113495bSYour Name  * Return: void
6545*5113495bSYour Name  */
6546*5113495bSYour Name static inline void
dp_print_common_rates_info(struct cdp_pkt_type * pkt_type_array)6547*5113495bSYour Name dp_print_common_rates_info(struct cdp_pkt_type *pkt_type_array)
6548*5113495bSYour Name {
6549*5113495bSYour Name 	uint8_t mcs, pkt_type;
6550*5113495bSYour Name 
6551*5113495bSYour Name 	DP_PRINT_STATS("MSDU Count");
6552*5113495bSYour Name 	for (pkt_type = 0; pkt_type < DOT11_MAX; pkt_type++) {
6553*5113495bSYour Name 		for (mcs = 0; mcs < MAX_MCS; mcs++) {
6554*5113495bSYour Name 			if (!cdp_rate_string[pkt_type][mcs].valid)
6555*5113495bSYour Name 				continue;
6556*5113495bSYour Name 
6557*5113495bSYour Name 			DP_PRINT_STATS("	%s = %d",
6558*5113495bSYour Name 				       cdp_rate_string[pkt_type][mcs].mcs_type,
6559*5113495bSYour Name 				       pkt_type_array[pkt_type].mcs_count[mcs]);
6560*5113495bSYour Name 		}
6561*5113495bSYour Name 
6562*5113495bSYour Name 		DP_PRINT_STATS("\n");
6563*5113495bSYour Name 	}
6564*5113495bSYour Name }
6565*5113495bSYour Name 
6566*5113495bSYour Name /**
6567*5113495bSYour Name  * dp_print_common_ppdu_rates_info(): Print ppdu rate for tx or rx
6568*5113495bSYour Name  * @pkt_type_array: rate type array contains rate info
6569*5113495bSYour Name  * @pkt_type: packet type
6570*5113495bSYour Name  *
6571*5113495bSYour Name  * Return: void
6572*5113495bSYour Name  */
6573*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
6574*5113495bSYour Name static inline void
dp_print_common_ppdu_rates_info(struct cdp_pkt_type * pkt_type_array,enum cdp_packet_type pkt_type)6575*5113495bSYour Name dp_print_common_ppdu_rates_info(struct cdp_pkt_type *pkt_type_array,
6576*5113495bSYour Name 				enum cdp_packet_type pkt_type)
6577*5113495bSYour Name {
6578*5113495bSYour Name 	uint8_t mcs;
6579*5113495bSYour Name 
6580*5113495bSYour Name 	DP_PRINT_STATS("PPDU Count");
6581*5113495bSYour Name 	for (mcs = 0; mcs < MAX_MCS; mcs++) {
6582*5113495bSYour Name 		if (pkt_type == DOT11_AX) {
6583*5113495bSYour Name 			if (!dp_ppdu_rate_string[0][mcs].valid)
6584*5113495bSYour Name 				continue;
6585*5113495bSYour Name 
6586*5113495bSYour Name 			DP_PRINT_STATS("	%s = %d",
6587*5113495bSYour Name 				       dp_ppdu_rate_string[0][mcs].mcs_type,
6588*5113495bSYour Name 				       pkt_type_array->mcs_count[mcs]);
6589*5113495bSYour Name 		} else if (pkt_type == DOT11_BE) {
6590*5113495bSYour Name 			if (!dp_ppdu_rate_string[1][mcs].valid)
6591*5113495bSYour Name 				continue;
6592*5113495bSYour Name 
6593*5113495bSYour Name 			DP_PRINT_STATS("	%s = %d",
6594*5113495bSYour Name 				       dp_ppdu_rate_string[1][mcs].mcs_type,
6595*5113495bSYour Name 				       pkt_type_array->mcs_count[mcs]);
6596*5113495bSYour Name 		}
6597*5113495bSYour Name 	}
6598*5113495bSYour Name 
6599*5113495bSYour Name 	DP_PRINT_STATS("\n");
6600*5113495bSYour Name }
6601*5113495bSYour Name #else
6602*5113495bSYour Name static inline void
dp_print_common_ppdu_rates_info(struct cdp_pkt_type * pkt_type_array,enum cdp_packet_type pkt_type)6603*5113495bSYour Name dp_print_common_ppdu_rates_info(struct cdp_pkt_type *pkt_type_array,
6604*5113495bSYour Name 				enum cdp_packet_type pkt_type)
6605*5113495bSYour Name {
6606*5113495bSYour Name 	uint8_t mcs;
6607*5113495bSYour Name 
6608*5113495bSYour Name 	DP_PRINT_STATS("PPDU Count");
6609*5113495bSYour Name 	for (mcs = 0; mcs < MAX_MCS; mcs++) {
6610*5113495bSYour Name 		if (!dp_ppdu_rate_string[0][mcs].valid)
6611*5113495bSYour Name 			continue;
6612*5113495bSYour Name 
6613*5113495bSYour Name 		DP_PRINT_STATS("	%s = %d",
6614*5113495bSYour Name 			       dp_ppdu_rate_string[0][mcs].mcs_type,
6615*5113495bSYour Name 			       pkt_type_array->mcs_count[mcs]);
6616*5113495bSYour Name 	}
6617*5113495bSYour Name 
6618*5113495bSYour Name 	DP_PRINT_STATS("\n");
6619*5113495bSYour Name }
6620*5113495bSYour Name #endif
6621*5113495bSYour Name 
6622*5113495bSYour Name /**
6623*5113495bSYour Name  * dp_print_mu_be_ppdu_rates_info(): Print mu be rate for tx or rx
6624*5113495bSYour Name  * @pkt_type_array: rate type array contains rate info
6625*5113495bSYour Name  *
6626*5113495bSYour Name  * Return: void
6627*5113495bSYour Name  */
6628*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
6629*5113495bSYour Name static inline void
dp_print_mu_be_ppdu_rates_info(struct cdp_pkt_type * pkt_type_array)6630*5113495bSYour Name dp_print_mu_be_ppdu_rates_info(struct cdp_pkt_type *pkt_type_array)
6631*5113495bSYour Name {
6632*5113495bSYour Name 	uint8_t mcs, pkt_type;
6633*5113495bSYour Name 
6634*5113495bSYour Name 	DP_PRINT_STATS("PPDU Count");
6635*5113495bSYour Name 	for (pkt_type = 0; pkt_type < TXRX_TYPE_MU_MAX; pkt_type++) {
6636*5113495bSYour Name 		for (mcs = 0; mcs < MAX_MCS; mcs++) {
6637*5113495bSYour Name 			if (!dp_mu_be_rate_string[pkt_type][mcs].valid)
6638*5113495bSYour Name 				continue;
6639*5113495bSYour Name 
6640*5113495bSYour Name 			DP_PRINT_STATS("	%s = %d",
6641*5113495bSYour Name 				       dp_mu_be_rate_string[pkt_type][mcs].mcs_type,
6642*5113495bSYour Name 				       pkt_type_array[pkt_type].mcs_count[mcs]);
6643*5113495bSYour Name 		}
6644*5113495bSYour Name 
6645*5113495bSYour Name 		DP_PRINT_STATS("\n");
6646*5113495bSYour Name 	}
6647*5113495bSYour Name }
6648*5113495bSYour Name #endif
6649*5113495bSYour Name 
6650*5113495bSYour Name static inline void
dp_print_mu_ppdu_rates_info(struct cdp_rx_mu * rx_mu)6651*5113495bSYour Name dp_print_mu_ppdu_rates_info(struct cdp_rx_mu *rx_mu)
6652*5113495bSYour Name {
6653*5113495bSYour Name 	uint8_t mcs, pkt_type;
6654*5113495bSYour Name 
6655*5113495bSYour Name 	DP_PRINT_STATS("PPDU Count");
6656*5113495bSYour Name 	for (pkt_type = 0; pkt_type < TXRX_TYPE_MU_MAX; pkt_type++) {
6657*5113495bSYour Name 		for (mcs = 0; mcs < MAX_MCS; mcs++) {
6658*5113495bSYour Name 			if (!dp_mu_rate_string[pkt_type][mcs].valid)
6659*5113495bSYour Name 				continue;
6660*5113495bSYour Name 
6661*5113495bSYour Name 			DP_PRINT_STATS("	%s = %d",
6662*5113495bSYour Name 				dp_mu_rate_string[pkt_type][mcs].mcs_type,
6663*5113495bSYour Name 				rx_mu[pkt_type].ppdu.mcs_count[mcs]);
6664*5113495bSYour Name 		}
6665*5113495bSYour Name 
6666*5113495bSYour Name 		DP_PRINT_STATS("\n");
6667*5113495bSYour Name 	}
6668*5113495bSYour Name }
6669*5113495bSYour Name 
6670*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
dp_print_rx_bw_stats(struct dp_pdev * pdev)6671*5113495bSYour Name static inline void dp_print_rx_bw_stats(struct dp_pdev *pdev)
6672*5113495bSYour Name {
6673*5113495bSYour Name 	DP_PRINT_STATS("BW Counts = 20MHz %d, 40MHz %d, 80MHz %d, 160MHz %d, 320MHz %d",
6674*5113495bSYour Name 		       pdev->stats.rx.bw[0], pdev->stats.rx.bw[1],
6675*5113495bSYour Name 		       pdev->stats.rx.bw[2], pdev->stats.rx.bw[3],
6676*5113495bSYour Name 		       pdev->stats.rx.bw[4]);
6677*5113495bSYour Name }
6678*5113495bSYour Name 
dp_print_tx_bw_stats(struct dp_pdev * pdev)6679*5113495bSYour Name static inline void dp_print_tx_bw_stats(struct dp_pdev *pdev)
6680*5113495bSYour Name {
6681*5113495bSYour Name 	DP_PRINT_STATS("BW Counts = 20MHz %d, 40MHz %d, 80MHz %d, 160MHz %d, 320MHz %d",
6682*5113495bSYour Name 		       pdev->stats.tx.bw[0], pdev->stats.tx.bw[1],
6683*5113495bSYour Name 		       pdev->stats.tx.bw[2], pdev->stats.tx.bw[3],
6684*5113495bSYour Name 		       pdev->stats.tx.bw[4]);
6685*5113495bSYour Name }
6686*5113495bSYour Name #else
dp_print_rx_bw_stats(struct dp_pdev * pdev)6687*5113495bSYour Name static inline void dp_print_rx_bw_stats(struct dp_pdev *pdev)
6688*5113495bSYour Name {
6689*5113495bSYour Name 	DP_PRINT_STATS("BW Counts = 20MHz %d, 40MHz %d, 80MHz %d, 160MHz %d",
6690*5113495bSYour Name 		       pdev->stats.rx.bw[0], pdev->stats.rx.bw[1],
6691*5113495bSYour Name 		       pdev->stats.rx.bw[2], pdev->stats.rx.bw[3]);
6692*5113495bSYour Name }
6693*5113495bSYour Name 
dp_print_tx_bw_stats(struct dp_pdev * pdev)6694*5113495bSYour Name static inline void dp_print_tx_bw_stats(struct dp_pdev *pdev)
6695*5113495bSYour Name {
6696*5113495bSYour Name 	DP_PRINT_STATS("BW Counts = 20MHz %d, 40MHz %d, 80MHz %d, 160MHz %d",
6697*5113495bSYour Name 		       pdev->stats.tx.bw[0], pdev->stats.tx.bw[1],
6698*5113495bSYour Name 		       pdev->stats.tx.bw[2], pdev->stats.tx.bw[3]);
6699*5113495bSYour Name }
6700*5113495bSYour Name #endif
6701*5113495bSYour Name 
dp_print_rx_rates(struct dp_vdev * vdev)6702*5113495bSYour Name void dp_print_rx_rates(struct dp_vdev *vdev)
6703*5113495bSYour Name {
6704*5113495bSYour Name 	struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev;
6705*5113495bSYour Name 	uint8_t i;
6706*5113495bSYour Name 	uint8_t index = 0;
6707*5113495bSYour Name 	char nss[DP_NSS_LENGTH];
6708*5113495bSYour Name 
6709*5113495bSYour Name 	DP_PRINT_STATS("Rx Rate Info:\n");
6710*5113495bSYour Name 	dp_print_common_rates_info(pdev->stats.rx.pkt_type);
6711*5113495bSYour Name 
6712*5113495bSYour Name 	index = 0;
6713*5113495bSYour Name 	for (i = 0; i < SS_COUNT; i++) {
6714*5113495bSYour Name 		index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index,
6715*5113495bSYour Name 				     " %d", pdev->stats.rx.nss[i]);
6716*5113495bSYour Name 	}
6717*5113495bSYour Name 	DP_PRINT_STATS("NSS(1-8) = %s",
6718*5113495bSYour Name 		       nss);
6719*5113495bSYour Name 
6720*5113495bSYour Name 	DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
6721*5113495bSYour Name 		       pdev->stats.rx.sgi_count[0],
6722*5113495bSYour Name 		       pdev->stats.rx.sgi_count[1],
6723*5113495bSYour Name 		       pdev->stats.rx.sgi_count[2],
6724*5113495bSYour Name 		       pdev->stats.rx.sgi_count[3]);
6725*5113495bSYour Name 
6726*5113495bSYour Name 	dp_print_rx_bw_stats(pdev);
6727*5113495bSYour Name 
6728*5113495bSYour Name 	DP_PRINT_STATS("Reception Type ="
6729*5113495bSYour Name 		       "SU: %d MU_MIMO:%d MU_OFDMA:%d MU_OFDMA_MIMO:%d",
6730*5113495bSYour Name 		       pdev->stats.rx.reception_type[0],
6731*5113495bSYour Name 		       pdev->stats.rx.reception_type[1],
6732*5113495bSYour Name 		       pdev->stats.rx.reception_type[2],
6733*5113495bSYour Name 		       pdev->stats.rx.reception_type[3]);
6734*5113495bSYour Name 	DP_PRINT_STATS("Aggregation:\n");
6735*5113495bSYour Name 	DP_PRINT_STATS("Number of Msdu's Part of Ampdus = %d",
6736*5113495bSYour Name 		       pdev->stats.rx.ampdu_cnt);
6737*5113495bSYour Name 	DP_PRINT_STATS("Number of Msdu's With No Mpdu Level Aggregation : %d",
6738*5113495bSYour Name 		       pdev->stats.rx.non_ampdu_cnt);
6739*5113495bSYour Name 	DP_PRINT_STATS("Number of Msdu's Part of Amsdu: %d",
6740*5113495bSYour Name 		       pdev->stats.rx.amsdu_cnt);
6741*5113495bSYour Name 	DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation: %d",
6742*5113495bSYour Name 		       pdev->stats.rx.non_amsdu_cnt);
6743*5113495bSYour Name }
6744*5113495bSYour Name 
dp_print_tx_rates(struct dp_vdev * vdev)6745*5113495bSYour Name void dp_print_tx_rates(struct dp_vdev *vdev)
6746*5113495bSYour Name {
6747*5113495bSYour Name 	struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev;
6748*5113495bSYour Name 
6749*5113495bSYour Name 	DP_PRINT_STATS("Tx Rate Info:\n");
6750*5113495bSYour Name 	dp_print_common_rates_info(pdev->stats.tx.pkt_type);
6751*5113495bSYour Name 
6752*5113495bSYour Name 	DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
6753*5113495bSYour Name 		       pdev->stats.tx.sgi_count[0],
6754*5113495bSYour Name 		       pdev->stats.tx.sgi_count[1],
6755*5113495bSYour Name 		       pdev->stats.tx.sgi_count[2],
6756*5113495bSYour Name 		       pdev->stats.tx.sgi_count[3]);
6757*5113495bSYour Name 
6758*5113495bSYour Name 	dp_print_tx_bw_stats(pdev);
6759*5113495bSYour Name 
6760*5113495bSYour Name 	DP_PRINT_STATS("OFDMA = %d", pdev->stats.tx.ofdma);
6761*5113495bSYour Name 	DP_PRINT_STATS("STBC = %d", pdev->stats.tx.stbc);
6762*5113495bSYour Name 	DP_PRINT_STATS("LDPC = %d", pdev->stats.tx.ldpc);
6763*5113495bSYour Name 	DP_PRINT_STATS("Retries = %d", pdev->stats.tx.retries);
6764*5113495bSYour Name 	DP_PRINT_STATS("Last ack rssi = %d\n", pdev->stats.tx.last_ack_rssi);
6765*5113495bSYour Name 	DP_PRINT_STATS("Number of PPDU's with Punctured Preamble = %d",
6766*5113495bSYour Name 			   pdev->stats.tx.pream_punct_cnt);
6767*5113495bSYour Name 
6768*5113495bSYour Name 	DP_PRINT_STATS("Aggregation:\n");
6769*5113495bSYour Name 	DP_PRINT_STATS("Number of Msdu's Part of Ampdus = %d",
6770*5113495bSYour Name 		       pdev->stats.tx.ampdu_cnt);
6771*5113495bSYour Name 	DP_PRINT_STATS("Number of Msdu's With No Mpdu Level Aggregation : %d",
6772*5113495bSYour Name 		       pdev->stats.tx.non_ampdu_cnt);
6773*5113495bSYour Name 	DP_PRINT_STATS("Number of Msdu's Part of Amsdu = %d",
6774*5113495bSYour Name 		       pdev->stats.tx.amsdu_cnt);
6775*5113495bSYour Name 	DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation = %d",
6776*5113495bSYour Name 		       pdev->stats.tx.non_amsdu_cnt);
6777*5113495bSYour Name }
6778*5113495bSYour Name 
6779*5113495bSYour Name /**
6780*5113495bSYour Name  * dp_print_nss(): Print nss count
6781*5113495bSYour Name  * @nss: printable nss count array
6782*5113495bSYour Name  * @pnss: nss count array
6783*5113495bSYour Name  * @ss_count: number of nss
6784*5113495bSYour Name  *
6785*5113495bSYour Name  * Return: void
6786*5113495bSYour Name  */
dp_print_nss(char * nss,uint32_t * pnss,uint32_t ss_count)6787*5113495bSYour Name static void dp_print_nss(char *nss, uint32_t *pnss, uint32_t ss_count)
6788*5113495bSYour Name {
6789*5113495bSYour Name 	uint32_t index;
6790*5113495bSYour Name 	uint8_t i;
6791*5113495bSYour Name 
6792*5113495bSYour Name 	index = 0;
6793*5113495bSYour Name 	for (i = 0; i < ss_count; i++) {
6794*5113495bSYour Name 		index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index,
6795*5113495bSYour Name 				     " %d", *(pnss + i));
6796*5113495bSYour Name 	}
6797*5113495bSYour Name }
6798*5113495bSYour Name 
6799*5113495bSYour Name /**
6800*5113495bSYour Name  * dp_print_jitter_stats(): Print per-tid jitter stats
6801*5113495bSYour Name  * @peer: DP peer object
6802*5113495bSYour Name  * @pdev: DP pdev object
6803*5113495bSYour Name  *
6804*5113495bSYour Name  * Return: void
6805*5113495bSYour Name  */
6806*5113495bSYour Name #ifdef WLAN_PEER_JITTER
dp_print_jitter_stats(struct dp_peer * peer,struct dp_pdev * pdev)6807*5113495bSYour Name static void dp_print_jitter_stats(struct dp_peer *peer, struct dp_pdev *pdev)
6808*5113495bSYour Name {
6809*5113495bSYour Name 	uint8_t tid = 0;
6810*5113495bSYour Name 
6811*5113495bSYour Name 	if (!pdev || !wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx))
6812*5113495bSYour Name 		return;
6813*5113495bSYour Name 
6814*5113495bSYour Name 	if (!peer->txrx_peer || !peer->txrx_peer->jitter_stats)
6815*5113495bSYour Name 		return;
6816*5113495bSYour Name 
6817*5113495bSYour Name 	DP_PRINT_STATS("Per TID Tx HW Enqueue-Comp Jitter Stats:\n");
6818*5113495bSYour Name 	for (tid = 0; tid < qdf_min(CDP_DATA_TID_MAX, DP_MAX_TIDS); tid++) {
6819*5113495bSYour Name 		struct cdp_peer_tid_stats *rx_tid =
6820*5113495bSYour Name 					&peer->txrx_peer->jitter_stats[tid];
6821*5113495bSYour Name 
6822*5113495bSYour Name 		DP_PRINT_STATS("Node tid = %d\n"
6823*5113495bSYour Name 				"Average Jiiter            : %u (us)\n"
6824*5113495bSYour Name 				"Average Delay             : %u (us)\n"
6825*5113495bSYour Name 				"Total Average error count : %llu\n"
6826*5113495bSYour Name 				"Total Success Count       : %llu\n"
6827*5113495bSYour Name 				"Total Drop                : %llu\n",
6828*5113495bSYour Name 				tid,
6829*5113495bSYour Name 				rx_tid->tx_avg_jitter,
6830*5113495bSYour Name 				rx_tid->tx_avg_delay,
6831*5113495bSYour Name 				rx_tid->tx_avg_err,
6832*5113495bSYour Name 				rx_tid->tx_total_success,
6833*5113495bSYour Name 				rx_tid->tx_drop);
6834*5113495bSYour Name 	}
6835*5113495bSYour Name }
6836*5113495bSYour Name #else
dp_print_jitter_stats(struct dp_peer * peer,struct dp_pdev * pdev)6837*5113495bSYour Name static void dp_print_jitter_stats(struct dp_peer *peer, struct dp_pdev *pdev)
6838*5113495bSYour Name {
6839*5113495bSYour Name }
6840*5113495bSYour Name #endif /* WLAN_PEER_JITTER */
6841*5113495bSYour Name 
6842*5113495bSYour Name #ifdef QCA_PEER_EXT_STATS
6843*5113495bSYour Name /**
6844*5113495bSYour Name  * dp_print_hist_stats() - Print delay histogram
6845*5113495bSYour Name  * @hstats: Histogram stats
6846*5113495bSYour Name  * @hist_type: histogram type
6847*5113495bSYour Name  *
6848*5113495bSYour Name  * Return: void
6849*5113495bSYour Name  */
dp_print_hist_stats(struct cdp_hist_stats * hstats,enum cdp_hist_types hist_type)6850*5113495bSYour Name static void dp_print_hist_stats(struct cdp_hist_stats *hstats,
6851*5113495bSYour Name 				enum cdp_hist_types hist_type)
6852*5113495bSYour Name {
6853*5113495bSYour Name 	uint8_t index = 0;
6854*5113495bSYour Name 	uint64_t count = 0;
6855*5113495bSYour Name 	bool hist_delay_data = false;
6856*5113495bSYour Name 
6857*5113495bSYour Name 	for (index = 0; index < CDP_HIST_BUCKET_MAX; index++) {
6858*5113495bSYour Name 		count = hstats->hist.freq[index];
6859*5113495bSYour Name 		if (!count)
6860*5113495bSYour Name 			continue;
6861*5113495bSYour Name 		hist_delay_data = true;
6862*5113495bSYour Name 		if (hist_type == CDP_HIST_TYPE_SW_ENQEUE_DELAY)
6863*5113495bSYour Name 			DP_PRINT_STATS("%s:  Packets = %llu",
6864*5113495bSYour Name 				       dp_vow_str_sw_enq_delay(index),
6865*5113495bSYour Name 				       count);
6866*5113495bSYour Name 		else if (hist_type == CDP_HIST_TYPE_HW_COMP_DELAY)
6867*5113495bSYour Name 			DP_PRINT_STATS("%s:  Packets = %llu",
6868*5113495bSYour Name 				       dp_vow_str_fw_to_hw_delay(index),
6869*5113495bSYour Name 				       count);
6870*5113495bSYour Name 		else if (hist_type == CDP_HIST_TYPE_REAP_STACK)
6871*5113495bSYour Name 			DP_PRINT_STATS("%s:  Packets = %llu",
6872*5113495bSYour Name 				       dp_vow_str_intfrm_delay(index),
6873*5113495bSYour Name 				       count);
6874*5113495bSYour Name 	}
6875*5113495bSYour Name 
6876*5113495bSYour Name 	/*
6877*5113495bSYour Name 	 * If none of the buckets have any packets,
6878*5113495bSYour Name 	 * there is no need to display the stats.
6879*5113495bSYour Name 	 */
6880*5113495bSYour Name 	if (hist_delay_data) {
6881*5113495bSYour Name 		DP_PRINT_STATS("Min = %u", hstats->min);
6882*5113495bSYour Name 		DP_PRINT_STATS("Max = %u", hstats->max);
6883*5113495bSYour Name 		DP_PRINT_STATS("Avg = %u\n", hstats->avg);
6884*5113495bSYour Name 	}
6885*5113495bSYour Name }
6886*5113495bSYour Name 
6887*5113495bSYour Name #ifdef CONFIG_SAWF
6888*5113495bSYour Name /**
6889*5113495bSYour Name  * dp_accumulate_delay_avg_stats(): Accumulate the delay average stats
6890*5113495bSYour Name  * @stats: cdp_delay_tid stats
6891*5113495bSYour Name  * @dst_stats: Destination delay Tx stats
6892*5113495bSYour Name  * @tid: TID value
6893*5113495bSYour Name  *
6894*5113495bSYour Name  * Return: void
6895*5113495bSYour Name  */
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*5113495bSYour Name static void dp_accumulate_delay_avg_stats(struct cdp_delay_tid_stats stats[]
6897*5113495bSYour Name 					  [CDP_MAX_TXRX_CTX],
6898*5113495bSYour Name 					  struct cdp_delay_tx_stats *dst_stats,
6899*5113495bSYour Name 					  uint8_t tid)
6900*5113495bSYour Name {
6901*5113495bSYour Name 	uint32_t num_rings = 0;
6902*5113495bSYour Name 	uint8_t ring_id;
6903*5113495bSYour Name 
6904*5113495bSYour Name 	for (ring_id = 0; ring_id < CDP_MAX_TXRX_CTX; ring_id++) {
6905*5113495bSYour Name 		struct cdp_delay_tx_stats *dstats =
6906*5113495bSYour Name 				&stats[tid][ring_id].tx_delay;
6907*5113495bSYour Name 
6908*5113495bSYour Name 		if (dstats->swdelay_avg || dstats->hwdelay_avg) {
6909*5113495bSYour Name 			dst_stats->nwdelay_avg += dstats->nwdelay_avg;
6910*5113495bSYour Name 			dst_stats->swdelay_avg += dstats->swdelay_avg;
6911*5113495bSYour Name 			dst_stats->hwdelay_avg += dstats->hwdelay_avg;
6912*5113495bSYour Name 			num_rings++;
6913*5113495bSYour Name 		}
6914*5113495bSYour Name 	}
6915*5113495bSYour Name 
6916*5113495bSYour Name 	if (!num_rings)
6917*5113495bSYour Name 		return;
6918*5113495bSYour Name 
6919*5113495bSYour Name 	dst_stats->nwdelay_avg = qdf_do_div(dst_stats->nwdelay_avg,
6920*5113495bSYour Name 					    num_rings);
6921*5113495bSYour Name 	dst_stats->swdelay_avg = qdf_do_div(dst_stats->swdelay_avg,
6922*5113495bSYour Name 					    num_rings);
6923*5113495bSYour Name 	dst_stats->hwdelay_avg = qdf_do_div(dst_stats->hwdelay_avg,
6924*5113495bSYour Name 					    num_rings);
6925*5113495bSYour Name }
6926*5113495bSYour Name #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*5113495bSYour Name static void dp_accumulate_delay_avg_stats(struct cdp_delay_tid_stats stats[]
6928*5113495bSYour Name 					  [CDP_MAX_TXRX_CTX],
6929*5113495bSYour Name 					  struct cdp_delay_tx_stats *dst_stats,
6930*5113495bSYour Name 					  uint8_t tid)
6931*5113495bSYour Name {
6932*5113495bSYour Name }
6933*5113495bSYour Name #endif
6934*5113495bSYour Name 
6935*5113495bSYour Name /**
6936*5113495bSYour Name  * dp_accumulate_delay_tid_stats(): Accumulate the tid stats to the
6937*5113495bSYour Name  *                                  hist stats.
6938*5113495bSYour Name  * @soc: DP SoC handle
6939*5113495bSYour Name  * @stats: cdp_delay_tid stats
6940*5113495bSYour Name  * @dst_hstats: Destination histogram to copy tid stats
6941*5113495bSYour Name  * @tid: TID value
6942*5113495bSYour Name  * @mode:
6943*5113495bSYour Name  *
6944*5113495bSYour Name  * Return: void
6945*5113495bSYour Name  */
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*5113495bSYour Name static void dp_accumulate_delay_tid_stats(struct dp_soc *soc,
6947*5113495bSYour Name 					  struct cdp_delay_tid_stats stats[]
6948*5113495bSYour Name 					  [CDP_MAX_TXRX_CTX],
6949*5113495bSYour Name 					  struct cdp_hist_stats *dst_hstats,
6950*5113495bSYour Name 					  uint8_t tid, uint32_t mode)
6951*5113495bSYour Name {
6952*5113495bSYour Name 	uint8_t ring_id;
6953*5113495bSYour Name 
6954*5113495bSYour Name 	if (wlan_cfg_get_dp_soc_nss_cfg(soc->wlan_cfg_ctx)) {
6955*5113495bSYour Name 		struct cdp_delay_tid_stats *dstats =
6956*5113495bSYour Name 				&stats[tid][0];
6957*5113495bSYour Name 		struct cdp_hist_stats *src_hstats = NULL;
6958*5113495bSYour Name 
6959*5113495bSYour Name 		switch (mode) {
6960*5113495bSYour Name 		case CDP_HIST_TYPE_SW_ENQEUE_DELAY:
6961*5113495bSYour Name 			src_hstats = &dstats->tx_delay.tx_swq_delay;
6962*5113495bSYour Name 			break;
6963*5113495bSYour Name 		case CDP_HIST_TYPE_HW_COMP_DELAY:
6964*5113495bSYour Name 			src_hstats = &dstats->tx_delay.hwtx_delay;
6965*5113495bSYour Name 			break;
6966*5113495bSYour Name 		case CDP_HIST_TYPE_REAP_STACK:
6967*5113495bSYour Name 			src_hstats = &dstats->rx_delay.to_stack_delay;
6968*5113495bSYour Name 			break;
6969*5113495bSYour Name 		default:
6970*5113495bSYour Name 			break;
6971*5113495bSYour Name 		}
6972*5113495bSYour Name 
6973*5113495bSYour Name 		if (src_hstats)
6974*5113495bSYour Name 			dp_copy_hist_stats(src_hstats, dst_hstats);
6975*5113495bSYour Name 
6976*5113495bSYour Name 		return;
6977*5113495bSYour Name 	}
6978*5113495bSYour Name 
6979*5113495bSYour Name 	for (ring_id = 0; ring_id < CDP_MAX_TXRX_CTX; ring_id++) {
6980*5113495bSYour Name 		struct cdp_delay_tid_stats *dstats =
6981*5113495bSYour Name 				&stats[tid][ring_id];
6982*5113495bSYour Name 		struct cdp_hist_stats *src_hstats = NULL;
6983*5113495bSYour Name 
6984*5113495bSYour Name 		switch (mode) {
6985*5113495bSYour Name 		case CDP_HIST_TYPE_SW_ENQEUE_DELAY:
6986*5113495bSYour Name 			src_hstats = &dstats->tx_delay.tx_swq_delay;
6987*5113495bSYour Name 			break;
6988*5113495bSYour Name 		case CDP_HIST_TYPE_HW_COMP_DELAY:
6989*5113495bSYour Name 			src_hstats = &dstats->tx_delay.hwtx_delay;
6990*5113495bSYour Name 			break;
6991*5113495bSYour Name 		case CDP_HIST_TYPE_REAP_STACK:
6992*5113495bSYour Name 			src_hstats = &dstats->rx_delay.to_stack_delay;
6993*5113495bSYour Name 			break;
6994*5113495bSYour Name 		default:
6995*5113495bSYour Name 			break;
6996*5113495bSYour Name 		}
6997*5113495bSYour Name 
6998*5113495bSYour Name 		if (src_hstats)
6999*5113495bSYour Name 			dp_accumulate_hist_stats(src_hstats, dst_hstats);
7000*5113495bSYour Name 	}
7001*5113495bSYour Name }
7002*5113495bSYour Name 
7003*5113495bSYour Name /**
7004*5113495bSYour Name  * dp_peer_print_tx_delay_stats() - Print peer delay stats
7005*5113495bSYour Name  * @pdev: DP pdev handle
7006*5113495bSYour Name  * @peer: DP peer handle
7007*5113495bSYour Name  *
7008*5113495bSYour Name  * Return: void
7009*5113495bSYour Name  */
dp_peer_print_tx_delay_stats(struct dp_pdev * pdev,struct dp_peer * peer)7010*5113495bSYour Name static void dp_peer_print_tx_delay_stats(struct dp_pdev *pdev,
7011*5113495bSYour Name 					 struct dp_peer *peer)
7012*5113495bSYour Name {
7013*5113495bSYour Name 	struct dp_peer_delay_stats *delay_stats;
7014*5113495bSYour Name 	struct dp_soc *soc = NULL;
7015*5113495bSYour Name 	struct cdp_hist_stats hist_stats;
7016*5113495bSYour Name 	uint8_t tid;
7017*5113495bSYour Name 
7018*5113495bSYour Name 	if (!peer || !peer->txrx_peer)
7019*5113495bSYour Name 		return;
7020*5113495bSYour Name 
7021*5113495bSYour Name 	if (!pdev || !pdev->soc)
7022*5113495bSYour Name 		return;
7023*5113495bSYour Name 
7024*5113495bSYour Name 	soc = pdev->soc;
7025*5113495bSYour Name 	if (!wlan_cfg_is_peer_ext_stats_enabled(soc->wlan_cfg_ctx))
7026*5113495bSYour Name 		return;
7027*5113495bSYour Name 
7028*5113495bSYour Name 	delay_stats = peer->txrx_peer->delay_stats;
7029*5113495bSYour Name 	if (!delay_stats)
7030*5113495bSYour Name 		return;
7031*5113495bSYour Name 
7032*5113495bSYour Name 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
7033*5113495bSYour Name 		DP_PRINT_STATS("----TID: %d----", tid);
7034*5113495bSYour Name 		DP_PRINT_STATS("Software Enqueue Delay:");
7035*5113495bSYour Name 		dp_hist_init(&hist_stats, CDP_HIST_TYPE_SW_ENQEUE_DELAY);
7036*5113495bSYour Name 		dp_accumulate_delay_tid_stats(soc, delay_stats->delay_tid_stats,
7037*5113495bSYour Name 					      &hist_stats, tid,
7038*5113495bSYour Name 					      CDP_HIST_TYPE_SW_ENQEUE_DELAY);
7039*5113495bSYour Name 		dp_print_hist_stats(&hist_stats, CDP_HIST_TYPE_SW_ENQEUE_DELAY);
7040*5113495bSYour Name 
7041*5113495bSYour Name 		DP_PRINT_STATS("Hardware Transmission Delay:");
7042*5113495bSYour Name 		dp_hist_init(&hist_stats, CDP_HIST_TYPE_HW_COMP_DELAY);
7043*5113495bSYour Name 		dp_accumulate_delay_tid_stats(soc, delay_stats->delay_tid_stats,
7044*5113495bSYour Name 					      &hist_stats, tid,
7045*5113495bSYour Name 					      CDP_HIST_TYPE_HW_COMP_DELAY);
7046*5113495bSYour Name 		dp_print_hist_stats(&hist_stats, CDP_HIST_TYPE_HW_COMP_DELAY);
7047*5113495bSYour Name 	}
7048*5113495bSYour Name }
7049*5113495bSYour Name 
7050*5113495bSYour Name /**
7051*5113495bSYour Name  * dp_peer_print_rx_delay_stats() - Print peer delay stats
7052*5113495bSYour Name  * @pdev: DP pdev handle
7053*5113495bSYour Name  * @peer: DP peer handle
7054*5113495bSYour Name  *
7055*5113495bSYour Name  * Return: void
7056*5113495bSYour Name  */
dp_peer_print_rx_delay_stats(struct dp_pdev * pdev,struct dp_peer * peer)7057*5113495bSYour Name static void dp_peer_print_rx_delay_stats(struct dp_pdev *pdev,
7058*5113495bSYour Name 					 struct dp_peer *peer)
7059*5113495bSYour Name {
7060*5113495bSYour Name 	struct dp_peer_delay_stats *delay_stats;
7061*5113495bSYour Name 	struct dp_soc *soc = NULL;
7062*5113495bSYour Name 	struct cdp_hist_stats hist_stats;
7063*5113495bSYour Name 	uint8_t tid;
7064*5113495bSYour Name 
7065*5113495bSYour Name 	if (!peer || !peer->txrx_peer)
7066*5113495bSYour Name 		return;
7067*5113495bSYour Name 
7068*5113495bSYour Name 	if (!pdev || !pdev->soc)
7069*5113495bSYour Name 		return;
7070*5113495bSYour Name 
7071*5113495bSYour Name 	soc = pdev->soc;
7072*5113495bSYour Name 	if (!wlan_cfg_is_peer_ext_stats_enabled(soc->wlan_cfg_ctx))
7073*5113495bSYour Name 		return;
7074*5113495bSYour Name 
7075*5113495bSYour Name 	delay_stats = peer->txrx_peer->delay_stats;
7076*5113495bSYour Name 	if (!delay_stats)
7077*5113495bSYour Name 		return;
7078*5113495bSYour Name 
7079*5113495bSYour Name 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
7080*5113495bSYour Name 		DP_PRINT_STATS("----TID: %d----", tid);
7081*5113495bSYour Name 		DP_PRINT_STATS("Rx Reap2stack Deliver Delay:");
7082*5113495bSYour Name 		dp_hist_init(&hist_stats, CDP_HIST_TYPE_REAP_STACK);
7083*5113495bSYour Name 		dp_accumulate_delay_tid_stats(soc, delay_stats->delay_tid_stats,
7084*5113495bSYour Name 					      &hist_stats, tid,
7085*5113495bSYour Name 					      CDP_HIST_TYPE_REAP_STACK);
7086*5113495bSYour Name 		dp_print_hist_stats(&hist_stats, CDP_HIST_TYPE_REAP_STACK);
7087*5113495bSYour Name 	}
7088*5113495bSYour Name }
7089*5113495bSYour Name 
7090*5113495bSYour Name #else
dp_peer_print_tx_delay_stats(struct dp_pdev * pdev,struct dp_peer * peer)7091*5113495bSYour Name static inline void dp_peer_print_tx_delay_stats(struct dp_pdev *pdev,
7092*5113495bSYour Name 						struct dp_peer *peer)
7093*5113495bSYour Name {
7094*5113495bSYour Name }
7095*5113495bSYour Name 
dp_peer_print_rx_delay_stats(struct dp_pdev * pdev,struct dp_peer * peer)7096*5113495bSYour Name static inline void dp_peer_print_rx_delay_stats(struct dp_pdev *pdev,
7097*5113495bSYour Name 						struct dp_peer *peer)
7098*5113495bSYour Name {
7099*5113495bSYour Name }
7100*5113495bSYour Name #endif
7101*5113495bSYour Name 
7102*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
dp_print_peer_txrx_stats_be(struct cdp_peer_stats * peer_stats,enum peer_stats_type stats_type)7103*5113495bSYour Name void dp_print_peer_txrx_stats_be(struct cdp_peer_stats *peer_stats,
7104*5113495bSYour Name 				 enum peer_stats_type stats_type)
7105*5113495bSYour Name {
7106*5113495bSYour Name 	uint8_t i;
7107*5113495bSYour Name 
7108*5113495bSYour Name 	if (stats_type == PEER_TX_STATS) {
7109*5113495bSYour Name 		DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d 320MHZ %d\n",
7110*5113495bSYour Name 			       peer_stats->tx.bw[CMN_BW_20MHZ],
7111*5113495bSYour Name 			       peer_stats->tx.bw[CMN_BW_40MHZ],
7112*5113495bSYour Name 			       peer_stats->tx.bw[CMN_BW_80MHZ],
7113*5113495bSYour Name 			       peer_stats->tx.bw[CMN_BW_160MHZ],
7114*5113495bSYour Name 			       peer_stats->tx.bw[CMN_BW_320MHZ]);
7115*5113495bSYour Name 		DP_PRINT_STATS("Punctured BW Counts = NO_PUNC %d 20MHz %d 40MHz %d 80MHz %d 120MHz %d\n",
7116*5113495bSYour Name 			       peer_stats->tx.punc_bw[NO_PUNCTURE],
7117*5113495bSYour Name 			       peer_stats->tx.punc_bw[PUNCTURED_20MHZ],
7118*5113495bSYour Name 			       peer_stats->tx.punc_bw[PUNCTURED_40MHZ],
7119*5113495bSYour Name 			       peer_stats->tx.punc_bw[PUNCTURED_80MHZ],
7120*5113495bSYour Name 			       peer_stats->tx.punc_bw[PUNCTURED_120MHZ]);
7121*5113495bSYour Name 		DP_PRINT_STATS("RU Locations");
7122*5113495bSYour Name 		for (i = 0; i < RU_INDEX_MAX; i++)
7123*5113495bSYour Name 			DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
7124*5113495bSYour Name 				       cdp_ru_string[i].ru_type,
7125*5113495bSYour Name 				       peer_stats->tx.ru_loc[i].num_msdu,
7126*5113495bSYour Name 				       peer_stats->tx.ru_loc[i].num_mpdu,
7127*5113495bSYour Name 				       peer_stats->tx.ru_loc[i].mpdu_tried);
7128*5113495bSYour Name 		dp_print_common_ppdu_rates_info(&peer_stats->tx.su_be_ppdu_cnt,
7129*5113495bSYour Name 						DOT11_BE);
7130*5113495bSYour Name 		dp_print_mu_be_ppdu_rates_info(&peer_stats->tx.mu_be_ppdu_cnt[0]);
7131*5113495bSYour Name 
7132*5113495bSYour Name 	} else {
7133*5113495bSYour Name 		DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d 320MHZ %d",
7134*5113495bSYour Name 			       peer_stats->rx.bw[CMN_BW_20MHZ],
7135*5113495bSYour Name 			       peer_stats->rx.bw[CMN_BW_40MHZ],
7136*5113495bSYour Name 			       peer_stats->rx.bw[CMN_BW_80MHZ],
7137*5113495bSYour Name 			       peer_stats->rx.bw[CMN_BW_160MHZ],
7138*5113495bSYour Name 			       peer_stats->rx.bw[CMN_BW_320MHZ]);
7139*5113495bSYour Name 		DP_PRINT_STATS("Punctured BW Counts = NO_PUNC %d 20MHz %d 40MHz %d 80MHz %d 120MHz %d\n",
7140*5113495bSYour Name 			       peer_stats->rx.punc_bw[NO_PUNCTURE],
7141*5113495bSYour Name 			       peer_stats->rx.punc_bw[PUNCTURED_20MHZ],
7142*5113495bSYour Name 			       peer_stats->rx.punc_bw[PUNCTURED_40MHZ],
7143*5113495bSYour Name 			       peer_stats->rx.punc_bw[PUNCTURED_80MHZ],
7144*5113495bSYour Name 			       peer_stats->rx.punc_bw[PUNCTURED_120MHZ]);
7145*5113495bSYour Name 		dp_print_common_ppdu_rates_info(&peer_stats->rx.su_be_ppdu_cnt,
7146*5113495bSYour Name 						DOT11_BE);
7147*5113495bSYour Name 		dp_print_mu_be_ppdu_rates_info(&peer_stats->rx.mu_be_ppdu_cnt[0]);
7148*5113495bSYour Name 	}
7149*5113495bSYour Name }
7150*5113495bSYour Name #else
dp_print_peer_txrx_stats_be(struct cdp_peer_stats * peer_stats,enum peer_stats_type stats_type)7151*5113495bSYour Name void dp_print_peer_txrx_stats_be(struct cdp_peer_stats *peer_stats,
7152*5113495bSYour Name 				 enum peer_stats_type stats_type)
7153*5113495bSYour Name {
7154*5113495bSYour Name }
7155*5113495bSYour Name #endif
7156*5113495bSYour Name 
dp_print_peer_txrx_stats_li(struct cdp_peer_stats * peer_stats,enum peer_stats_type stats_type)7157*5113495bSYour Name void dp_print_peer_txrx_stats_li(struct cdp_peer_stats *peer_stats,
7158*5113495bSYour Name 				 enum peer_stats_type stats_type)
7159*5113495bSYour Name {
7160*5113495bSYour Name 	if (stats_type == PEER_TX_STATS) {
7161*5113495bSYour Name 		DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d\n",
7162*5113495bSYour Name 			       peer_stats->tx.bw[CMN_BW_20MHZ],
7163*5113495bSYour Name 			       peer_stats->tx.bw[CMN_BW_40MHZ],
7164*5113495bSYour Name 			       peer_stats->tx.bw[CMN_BW_80MHZ],
7165*5113495bSYour Name 			       peer_stats->tx.bw[CMN_BW_160MHZ]);
7166*5113495bSYour Name 		DP_PRINT_STATS("RU Locations");
7167*5113495bSYour Name 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
7168*5113495bSYour Name 			       cdp_ru_string[RU_26_INDEX].ru_type,
7169*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_26_INDEX].num_msdu,
7170*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_26_INDEX].num_mpdu,
7171*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_26_INDEX].mpdu_tried);
7172*5113495bSYour Name 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
7173*5113495bSYour Name 			       cdp_ru_string[RU_52_INDEX].ru_type,
7174*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_52_INDEX].num_msdu,
7175*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_52_INDEX].num_mpdu,
7176*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_52_INDEX].mpdu_tried);
7177*5113495bSYour Name 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
7178*5113495bSYour Name 			       cdp_ru_string[RU_106_INDEX].ru_type,
7179*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_106_INDEX].num_msdu,
7180*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_106_INDEX].num_mpdu,
7181*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_106_INDEX].mpdu_tried);
7182*5113495bSYour Name 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
7183*5113495bSYour Name 			       cdp_ru_string[RU_242_INDEX].ru_type,
7184*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_242_INDEX].num_msdu,
7185*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_242_INDEX].num_mpdu,
7186*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_242_INDEX].mpdu_tried);
7187*5113495bSYour Name 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
7188*5113495bSYour Name 			       cdp_ru_string[RU_484_INDEX].ru_type,
7189*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_484_INDEX].num_msdu,
7190*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_484_INDEX].num_mpdu,
7191*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_484_INDEX].mpdu_tried);
7192*5113495bSYour Name 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
7193*5113495bSYour Name 			       cdp_ru_string[RU_996_INDEX].ru_type,
7194*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_996_INDEX].num_msdu,
7195*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_996_INDEX].num_mpdu,
7196*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_996_INDEX].mpdu_tried);
7197*5113495bSYour Name 	} else {
7198*5113495bSYour Name 		DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d",
7199*5113495bSYour Name 			       peer_stats->rx.bw[CMN_BW_20MHZ],
7200*5113495bSYour Name 			       peer_stats->rx.bw[CMN_BW_40MHZ],
7201*5113495bSYour Name 			       peer_stats->rx.bw[CMN_BW_80MHZ],
7202*5113495bSYour Name 			       peer_stats->rx.bw[CMN_BW_160MHZ]);
7203*5113495bSYour Name 	}
7204*5113495bSYour Name }
7205*5113495bSYour Name 
dp_print_peer_txrx_stats_rh(struct cdp_peer_stats * peer_stats,enum peer_stats_type stats_type)7206*5113495bSYour Name void dp_print_peer_txrx_stats_rh(struct cdp_peer_stats *peer_stats,
7207*5113495bSYour Name 				 enum peer_stats_type stats_type)
7208*5113495bSYour Name {
7209*5113495bSYour Name 	if (stats_type == PEER_TX_STATS) {
7210*5113495bSYour Name 		DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d\n",
7211*5113495bSYour Name 			       peer_stats->tx.bw[CMN_BW_20MHZ],
7212*5113495bSYour Name 			       peer_stats->tx.bw[CMN_BW_40MHZ],
7213*5113495bSYour Name 			       peer_stats->tx.bw[CMN_BW_80MHZ],
7214*5113495bSYour Name 			       peer_stats->tx.bw[CMN_BW_160MHZ]);
7215*5113495bSYour Name 		DP_PRINT_STATS("RU Locations");
7216*5113495bSYour Name 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
7217*5113495bSYour Name 			       cdp_ru_string[RU_26_INDEX].ru_type,
7218*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_26_INDEX].num_msdu,
7219*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_26_INDEX].num_mpdu,
7220*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_26_INDEX].mpdu_tried);
7221*5113495bSYour Name 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
7222*5113495bSYour Name 			       cdp_ru_string[RU_52_INDEX].ru_type,
7223*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_52_INDEX].num_msdu,
7224*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_52_INDEX].num_mpdu,
7225*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_52_INDEX].mpdu_tried);
7226*5113495bSYour Name 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
7227*5113495bSYour Name 			       cdp_ru_string[RU_106_INDEX].ru_type,
7228*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_106_INDEX].num_msdu,
7229*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_106_INDEX].num_mpdu,
7230*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_106_INDEX].mpdu_tried);
7231*5113495bSYour Name 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
7232*5113495bSYour Name 			       cdp_ru_string[RU_242_INDEX].ru_type,
7233*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_242_INDEX].num_msdu,
7234*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_242_INDEX].num_mpdu,
7235*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_242_INDEX].mpdu_tried);
7236*5113495bSYour Name 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
7237*5113495bSYour Name 			       cdp_ru_string[RU_484_INDEX].ru_type,
7238*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_484_INDEX].num_msdu,
7239*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_484_INDEX].num_mpdu,
7240*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_484_INDEX].mpdu_tried);
7241*5113495bSYour Name 		DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
7242*5113495bSYour Name 			       cdp_ru_string[RU_996_INDEX].ru_type,
7243*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_996_INDEX].num_msdu,
7244*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_996_INDEX].num_mpdu,
7245*5113495bSYour Name 			       peer_stats->tx.ru_loc[RU_996_INDEX].mpdu_tried);
7246*5113495bSYour Name 	} else {
7247*5113495bSYour Name 		DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d",
7248*5113495bSYour Name 			       peer_stats->rx.bw[CMN_BW_20MHZ],
7249*5113495bSYour Name 			       peer_stats->rx.bw[CMN_BW_40MHZ],
7250*5113495bSYour Name 			       peer_stats->rx.bw[CMN_BW_80MHZ],
7251*5113495bSYour Name 			       peer_stats->rx.bw[CMN_BW_160MHZ]);
7252*5113495bSYour Name 	}
7253*5113495bSYour Name }
7254*5113495bSYour Name 
7255*5113495bSYour Name #ifdef REO_SHARED_QREF_TABLE_EN
dp_peer_print_reo_qref_table(struct dp_peer * peer)7256*5113495bSYour Name static void dp_peer_print_reo_qref_table(struct dp_peer *peer)
7257*5113495bSYour Name {
7258*5113495bSYour Name 	struct hal_soc *hal;
7259*5113495bSYour Name 	int i;
7260*5113495bSYour Name 	uint64_t *reo_qref_addr;
7261*5113495bSYour Name 	uint32_t peer_idx;
7262*5113495bSYour Name 
7263*5113495bSYour Name 	hal = (struct hal_soc *)peer->vdev->pdev->soc->hal_soc;
7264*5113495bSYour Name 
7265*5113495bSYour Name 	if (!hal_reo_shared_qaddr_is_enable((hal_soc_handle_t)hal))
7266*5113495bSYour Name 		return;
7267*5113495bSYour Name 
7268*5113495bSYour Name 	if ((!hal->reo_qref.non_mlo_reo_qref_table_vaddr) ||
7269*5113495bSYour Name 	    (!hal->reo_qref.mlo_reo_qref_table_vaddr)) {
7270*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
7271*5113495bSYour Name 			  FL("REO shared table not allocated"));
7272*5113495bSYour Name 		return;
7273*5113495bSYour Name 	}
7274*5113495bSYour Name 
7275*5113495bSYour Name 	if (IS_MLO_DP_LINK_PEER(peer))
7276*5113495bSYour Name 		return;
7277*5113495bSYour Name 
7278*5113495bSYour Name 	if (IS_MLO_DP_MLD_PEER(peer)) {
7279*5113495bSYour Name 		hal = (struct hal_soc *)
7280*5113495bSYour Name 			  peer->vdev->pdev->soc->hal_soc;
7281*5113495bSYour Name 		peer_idx = (peer->peer_id - HAL_ML_PEER_ID_START) *
7282*5113495bSYour Name 			    DP_MAX_TIDS;
7283*5113495bSYour Name 		reo_qref_addr =
7284*5113495bSYour Name 			&hal->reo_qref.mlo_reo_qref_table_vaddr[peer_idx];
7285*5113495bSYour Name 	} else {
7286*5113495bSYour Name 		peer_idx = (peer->peer_id * DP_MAX_TIDS);
7287*5113495bSYour Name 		reo_qref_addr =
7288*5113495bSYour Name 			&hal->reo_qref.non_mlo_reo_qref_table_vaddr[peer_idx];
7289*5113495bSYour Name 	}
7290*5113495bSYour Name 	DP_PRINT_STATS("Reo Qref table for peer_id: %d\n", peer->peer_id);
7291*5113495bSYour Name 
7292*5113495bSYour Name 	for (i = 0; i < DP_MAX_TIDS; i++)
7293*5113495bSYour Name 		DP_PRINT_STATS("    Tid [%d]  :%llx", i, reo_qref_addr[i]);
7294*5113495bSYour Name }
7295*5113495bSYour Name #else
dp_peer_print_reo_qref_table(struct dp_peer * peer)7296*5113495bSYour Name static inline void dp_peer_print_reo_qref_table(struct dp_peer *peer)
7297*5113495bSYour Name {
7298*5113495bSYour Name }
7299*5113495bSYour Name #endif
7300*5113495bSYour Name 
dp_print_peer_stats(struct dp_peer * peer,struct cdp_peer_stats * peer_stats)7301*5113495bSYour Name void dp_print_peer_stats(struct dp_peer *peer,
7302*5113495bSYour Name 			 struct cdp_peer_stats *peer_stats)
7303*5113495bSYour Name {
7304*5113495bSYour Name 	uint8_t i;
7305*5113495bSYour Name 	uint32_t index;
7306*5113495bSYour Name 	uint32_t j;
7307*5113495bSYour Name 	char nss[DP_NSS_LENGTH];
7308*5113495bSYour Name 	char mu_group_id[DP_MU_GROUP_LENGTH];
7309*5113495bSYour Name 	struct dp_pdev *pdev;
7310*5113495bSYour Name 	uint32_t *pnss;
7311*5113495bSYour Name 	enum cdp_mu_packet_type rx_mu_type;
7312*5113495bSYour Name 	struct cdp_rx_mu *rx_mu;
7313*5113495bSYour Name 
7314*5113495bSYour Name 	pdev = peer->vdev->pdev;
7315*5113495bSYour Name 
7316*5113495bSYour Name 	DP_PRINT_STATS("Node Tx Stats:\n");
7317*5113495bSYour Name 	DP_PRINT_STATS("Total Packet Completions = %llu",
7318*5113495bSYour Name 		       peer_stats->tx.comp_pkt.num);
7319*5113495bSYour Name 	DP_PRINT_STATS("Total Bytes Completions = %llu",
7320*5113495bSYour Name 		       peer_stats->tx.comp_pkt.bytes);
7321*5113495bSYour Name 	DP_PRINT_STATS("Success Packets = %llu",
7322*5113495bSYour Name 		       peer_stats->tx.tx_success.num);
7323*5113495bSYour Name 	DP_PRINT_STATS("Success Bytes = %llu",
7324*5113495bSYour Name 		       peer_stats->tx.tx_success.bytes);
7325*5113495bSYour Name 	DP_PRINT_STATS("Success Packets in TWT Session = %llu",
7326*5113495bSYour Name 		       peer_stats->tx.tx_success_twt.num);
7327*5113495bSYour Name 	DP_PRINT_STATS("Success Bytes in TWT Session = %llu",
7328*5113495bSYour Name 		       peer_stats->tx.tx_success_twt.bytes);
7329*5113495bSYour Name 	DP_PRINT_STATS("Unicast Success Packets = %llu",
7330*5113495bSYour Name 		       peer_stats->tx.ucast.num);
7331*5113495bSYour Name 	DP_PRINT_STATS("Unicast Success Bytes = %llu",
7332*5113495bSYour Name 		       peer_stats->tx.ucast.bytes);
7333*5113495bSYour Name 	DP_PRINT_STATS("Multicast Success Packets = %llu",
7334*5113495bSYour Name 		       peer_stats->tx.mcast.num);
7335*5113495bSYour Name 	DP_PRINT_STATS("Multicast Success Bytes = %llu",
7336*5113495bSYour Name 		       peer_stats->tx.mcast.bytes);
7337*5113495bSYour Name 	DP_PRINT_STATS("Broadcast Success Packets = %llu",
7338*5113495bSYour Name 		       peer_stats->tx.bcast.num);
7339*5113495bSYour Name 	DP_PRINT_STATS("Broadcast Success Bytes = %llu",
7340*5113495bSYour Name 		       peer_stats->tx.bcast.bytes);
7341*5113495bSYour Name 	DP_PRINT_STATS("Packets Successfully Sent after one or more retry = %d",
7342*5113495bSYour Name 		       peer_stats->tx.retry_count);
7343*5113495bSYour Name 	DP_PRINT_STATS("Packets Successfully Sent after more than one retry = %d",
7344*5113495bSYour Name 		       peer_stats->tx.multiple_retry_count);
7345*5113495bSYour Name 	DP_PRINT_STATS("Packets Failed = %d",
7346*5113495bSYour Name 		       peer_stats->tx.tx_failed);
7347*5113495bSYour Name 	DP_PRINT_STATS("Packets Failed due to retry threshold breach = %d",
7348*5113495bSYour Name 		       peer_stats->tx.failed_retry_count);
7349*5113495bSYour Name 	DP_PRINT_STATS("Packets In OFDMA = %d",
7350*5113495bSYour Name 		       peer_stats->tx.ofdma);
7351*5113495bSYour Name 	DP_PRINT_STATS("Packets In STBC = %d",
7352*5113495bSYour Name 		       peer_stats->tx.stbc);
7353*5113495bSYour Name 	DP_PRINT_STATS("Packets In LDPC = %d",
7354*5113495bSYour Name 		       peer_stats->tx.ldpc);
7355*5113495bSYour Name 	DP_PRINT_STATS("Packet Retries = %d",
7356*5113495bSYour Name 		       peer_stats->tx.retries);
7357*5113495bSYour Name 	DP_PRINT_STATS("MSDU's Part of AMSDU = %d",
7358*5113495bSYour Name 		       peer_stats->tx.amsdu_cnt);
7359*5113495bSYour Name 	DP_PRINT_STATS("Msdu's As Part of Ampdu = %d",
7360*5113495bSYour Name 		       peer_stats->tx.non_ampdu_cnt);
7361*5113495bSYour Name 	DP_PRINT_STATS("Msdu's As Ampdu = %d",
7362*5113495bSYour Name 		       peer_stats->tx.ampdu_cnt);
7363*5113495bSYour Name 	DP_PRINT_STATS("Last Packet RSSI = %d",
7364*5113495bSYour Name 		       peer_stats->tx.last_ack_rssi);
7365*5113495bSYour Name 	DP_PRINT_STATS("Dropped At FW: Removed Pkts = %llu",
7366*5113495bSYour Name 		       peer_stats->tx.dropped.fw_rem.num);
7367*5113495bSYour Name 	DP_PRINT_STATS("Release source not TQM = %u",
7368*5113495bSYour Name 		       peer_stats->tx.release_src_not_tqm);
7369*5113495bSYour Name 	if (pdev && !wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) {
7370*5113495bSYour Name 		DP_PRINT_STATS("Dropped At FW: Removed bytes = %llu",
7371*5113495bSYour Name 			peer_stats->tx.dropped.fw_rem.bytes);
7372*5113495bSYour Name 	}
7373*5113495bSYour Name 	DP_PRINT_STATS("Dropped At FW: Removed transmitted = %d",
7374*5113495bSYour Name 		       peer_stats->tx.dropped.fw_rem_tx);
7375*5113495bSYour Name 	DP_PRINT_STATS("Dropped At FW: Removed Untransmitted = %d",
7376*5113495bSYour Name 		       peer_stats->tx.dropped.fw_rem_notx);
7377*5113495bSYour Name 	DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason1 = %u",
7378*5113495bSYour Name 		       peer_stats->tx.dropped.fw_reason1);
7379*5113495bSYour Name 	DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason2 = %u",
7380*5113495bSYour Name 		       peer_stats->tx.dropped.fw_reason2);
7381*5113495bSYour Name 	DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason3 = %u",
7382*5113495bSYour Name 		       peer_stats->tx.dropped.fw_reason3);
7383*5113495bSYour Name 	DP_PRINT_STATS("Dropped At FW:removed untransmitted disable queue = %u",
7384*5113495bSYour Name 		       peer_stats->tx.dropped.fw_rem_queue_disable);
7385*5113495bSYour Name 	DP_PRINT_STATS("Dropped At FW: removed untransmitted no match = %u",
7386*5113495bSYour Name 		       peer_stats->tx.dropped.fw_rem_no_match);
7387*5113495bSYour Name 	DP_PRINT_STATS("Dropped due to HW threshold criteria = %u",
7388*5113495bSYour Name 		       peer_stats->tx.dropped.drop_threshold);
7389*5113495bSYour Name 	DP_PRINT_STATS("Dropped due Link desc not available drop in HW = %u",
7390*5113495bSYour Name 		       peer_stats->tx.dropped.drop_link_desc_na);
7391*5113495bSYour Name 	DP_PRINT_STATS("Drop bit set or invalid flow = %u",
7392*5113495bSYour Name 		       peer_stats->tx.dropped.invalid_drop);
7393*5113495bSYour Name 	DP_PRINT_STATS("MCAST vdev drop in HW = %u",
7394*5113495bSYour Name 		       peer_stats->tx.dropped.mcast_vdev_drop);
7395*5113495bSYour Name 	DP_PRINT_STATS("Dropped : Age Out = %d",
7396*5113495bSYour Name 		       peer_stats->tx.dropped.age_out);
7397*5113495bSYour Name 	DP_PRINT_STATS("Dropped : Invalid Reason = %u",
7398*5113495bSYour Name 		       peer_stats->tx.dropped.invalid_rr);
7399*5113495bSYour Name 	DP_PRINT_STATS("NAWDS : ");
7400*5113495bSYour Name 	DP_PRINT_STATS("Nawds multicast Drop Tx Packet = %d",
7401*5113495bSYour Name 		       peer_stats->tx.nawds_mcast_drop);
7402*5113495bSYour Name 	DP_PRINT_STATS("	Nawds multicast  Tx Packet Count = %llu",
7403*5113495bSYour Name 		       peer_stats->tx.nawds_mcast.num);
7404*5113495bSYour Name 	DP_PRINT_STATS("	Nawds multicast  Tx Packet Bytes = %llu",
7405*5113495bSYour Name 		       peer_stats->tx.nawds_mcast.bytes);
7406*5113495bSYour Name 
7407*5113495bSYour Name 	DP_PRINT_STATS("PPDU's = %d", peer_stats->tx.tx_ppdus);
7408*5113495bSYour Name 	DP_PRINT_STATS("Number of PPDU's with Punctured Preamble = %d",
7409*5113495bSYour Name 		       peer_stats->tx.pream_punct_cnt);
7410*5113495bSYour Name 	DP_PRINT_STATS("MPDU's Successful = %d",
7411*5113495bSYour Name 		       peer_stats->tx.tx_mpdus_success);
7412*5113495bSYour Name 	DP_PRINT_STATS("MPDU's Tried = %d", peer_stats->tx.tx_mpdus_tried);
7413*5113495bSYour Name 
7414*5113495bSYour Name 	DP_PRINT_STATS("Rate Info:");
7415*5113495bSYour Name 	dp_print_common_rates_info(peer_stats->tx.pkt_type);
7416*5113495bSYour Name 
7417*5113495bSYour Name 	DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
7418*5113495bSYour Name 		       peer_stats->tx.sgi_count[0],
7419*5113495bSYour Name 		       peer_stats->tx.sgi_count[1],
7420*5113495bSYour Name 		       peer_stats->tx.sgi_count[2],
7421*5113495bSYour Name 		       peer_stats->tx.sgi_count[3]);
7422*5113495bSYour Name 
7423*5113495bSYour Name 	DP_PRINT_STATS("Wireless Mutlimedia ");
7424*5113495bSYour Name 	DP_PRINT_STATS("	 Best effort = %d",
7425*5113495bSYour Name 		       peer_stats->tx.wme_ac_type[0]);
7426*5113495bSYour Name 	DP_PRINT_STATS("	 Background= %d",
7427*5113495bSYour Name 		       peer_stats->tx.wme_ac_type[1]);
7428*5113495bSYour Name 	DP_PRINT_STATS("	 Video = %d",
7429*5113495bSYour Name 		       peer_stats->tx.wme_ac_type[2]);
7430*5113495bSYour Name 	DP_PRINT_STATS("	 Voice = %d",
7431*5113495bSYour Name 		       peer_stats->tx.wme_ac_type[3]);
7432*5113495bSYour Name 
7433*5113495bSYour Name 	DP_PRINT_STATS("Excess Retries per AC ");
7434*5113495bSYour Name 	DP_PRINT_STATS("	 Best effort = %d",
7435*5113495bSYour Name 		       peer_stats->tx.excess_retries_per_ac[0]);
7436*5113495bSYour Name 	DP_PRINT_STATS("	 Background= %d",
7437*5113495bSYour Name 		       peer_stats->tx.excess_retries_per_ac[1]);
7438*5113495bSYour Name 	DP_PRINT_STATS("	 Video = %d",
7439*5113495bSYour Name 		       peer_stats->tx.excess_retries_per_ac[2]);
7440*5113495bSYour Name 	DP_PRINT_STATS("	 Voice = %d",
7441*5113495bSYour Name 		       peer_stats->tx.excess_retries_per_ac[3]);
7442*5113495bSYour Name 
7443*5113495bSYour Name 	pnss = &peer_stats->tx.nss[0];
7444*5113495bSYour Name 	dp_print_nss(nss, pnss, SS_COUNT);
7445*5113495bSYour Name 
7446*5113495bSYour Name 	DP_PRINT_STATS("NSS(1-8) = %s", nss);
7447*5113495bSYour Name 
7448*5113495bSYour Name 	DP_PRINT_STATS("Transmit Type :");
7449*5113495bSYour Name 	DP_PRINT_STATS("MSDUs Success: SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d",
7450*5113495bSYour Name 		       peer_stats->tx.transmit_type[SU].num_msdu,
7451*5113495bSYour Name 		       peer_stats->tx.transmit_type[MU_MIMO].num_msdu,
7452*5113495bSYour Name 		       peer_stats->tx.transmit_type[MU_OFDMA].num_msdu,
7453*5113495bSYour Name 		       peer_stats->tx.transmit_type[MU_MIMO_OFDMA].num_msdu);
7454*5113495bSYour Name 
7455*5113495bSYour Name 	DP_PRINT_STATS("MPDUs Success: SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d",
7456*5113495bSYour Name 		       peer_stats->tx.transmit_type[SU].num_mpdu,
7457*5113495bSYour Name 		       peer_stats->tx.transmit_type[MU_MIMO].num_mpdu,
7458*5113495bSYour Name 		       peer_stats->tx.transmit_type[MU_OFDMA].num_mpdu,
7459*5113495bSYour Name 		       peer_stats->tx.transmit_type[MU_MIMO_OFDMA].num_mpdu);
7460*5113495bSYour Name 
7461*5113495bSYour Name 	DP_PRINT_STATS("MPDUs Tried: SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d",
7462*5113495bSYour Name 		       peer_stats->tx.transmit_type[SU].mpdu_tried,
7463*5113495bSYour Name 		       peer_stats->tx.transmit_type[MU_MIMO].mpdu_tried,
7464*5113495bSYour Name 		       peer_stats->tx.transmit_type[MU_OFDMA].mpdu_tried,
7465*5113495bSYour Name 		       peer_stats->tx.transmit_type[MU_MIMO_OFDMA].mpdu_tried);
7466*5113495bSYour Name 
7467*5113495bSYour Name 	for (i = 0; i < MAX_MU_GROUP_ID;) {
7468*5113495bSYour Name 		index = 0;
7469*5113495bSYour Name 		for (j = 0; j < DP_MU_GROUP_SHOW && i < MAX_MU_GROUP_ID;
7470*5113495bSYour Name 		     j++) {
7471*5113495bSYour Name 			index += qdf_snprint(&mu_group_id[index],
7472*5113495bSYour Name 					     DP_MU_GROUP_LENGTH - index,
7473*5113495bSYour Name 					     " %d",
7474*5113495bSYour Name 					     peer_stats->tx.mu_group_id[i]);
7475*5113495bSYour Name 			i++;
7476*5113495bSYour Name 		}
7477*5113495bSYour Name 
7478*5113495bSYour Name 		DP_PRINT_STATS("User position list for GID %02d->%d: [%s]",
7479*5113495bSYour Name 			       i - DP_MU_GROUP_SHOW, i - 1, mu_group_id);
7480*5113495bSYour Name 	}
7481*5113495bSYour Name 
7482*5113495bSYour Name 	DP_PRINT_STATS("Last Packet RU index [%d], Size [%d]",
7483*5113495bSYour Name 		       peer_stats->tx.ru_start, peer_stats->tx.ru_tones);
7484*5113495bSYour Name 
7485*5113495bSYour Name 	DP_PRINT_STATS("Aggregation:");
7486*5113495bSYour Name 	DP_PRINT_STATS("Number of Msdu's Part of Amsdu = %d",
7487*5113495bSYour Name 		       peer_stats->tx.amsdu_cnt);
7488*5113495bSYour Name 	DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation = %d",
7489*5113495bSYour Name 		       peer_stats->tx.non_amsdu_cnt);
7490*5113495bSYour Name 
7491*5113495bSYour Name 	DP_PRINT_STATS("Bytes and Packets transmitted  in last one sec:");
7492*5113495bSYour Name 	DP_PRINT_STATS("	Bytes transmitted in last sec: %d",
7493*5113495bSYour Name 		       peer_stats->tx.tx_byte_rate);
7494*5113495bSYour Name 	DP_PRINT_STATS("	Data transmitted in last sec: %d",
7495*5113495bSYour Name 		       peer_stats->tx.tx_data_rate);
7496*5113495bSYour Name 
7497*5113495bSYour Name 	if (pdev && pdev->soc->arch_ops.txrx_print_peer_stats)
7498*5113495bSYour Name 		pdev->soc->arch_ops.txrx_print_peer_stats(peer_stats,
7499*5113495bSYour Name 							  PEER_TX_STATS);
7500*5113495bSYour Name 
7501*5113495bSYour Name 	if (!IS_MLO_DP_LINK_PEER(peer)) {
7502*5113495bSYour Name 		dp_print_jitter_stats(peer, pdev);
7503*5113495bSYour Name 		dp_peer_print_tx_delay_stats(pdev, peer);
7504*5113495bSYour Name 	}
7505*5113495bSYour Name 
7506*5113495bSYour Name 	if (IS_MLO_DP_MLD_PEER(peer))
7507*5113495bSYour Name 		DP_PRINT_STATS("TX Invalid Link ID Packet Count = %u",
7508*5113495bSYour Name 			       peer_stats->tx.inval_link_id_pkt_cnt);
7509*5113495bSYour Name 
7510*5113495bSYour Name 	DP_PRINT_STATS("Node Rx Stats:");
7511*5113495bSYour Name 	DP_PRINT_STATS("Packets Sent To Stack = %llu",
7512*5113495bSYour Name 		       peer_stats->rx.rx_success.num);
7513*5113495bSYour Name 	DP_PRINT_STATS("Bytes Sent To Stack = %llu",
7514*5113495bSYour Name 		       peer_stats->rx.rx_success.bytes);
7515*5113495bSYour Name 	for (i = 0; i <  CDP_MAX_RX_RINGS; i++) {
7516*5113495bSYour Name 		DP_PRINT_STATS("Ring Id = %d", i);
7517*5113495bSYour Name 		DP_PRINT_STATS("	Packets Received = %llu",
7518*5113495bSYour Name 			       peer_stats->rx.rcvd_reo[i].num);
7519*5113495bSYour Name 		DP_PRINT_STATS("	Bytes Received = %llu",
7520*5113495bSYour Name 			       peer_stats->rx.rcvd_reo[i].bytes);
7521*5113495bSYour Name 	}
7522*5113495bSYour Name 	for (i = 0; i < CDP_MAX_LMACS; i++)
7523*5113495bSYour Name 		DP_PRINT_STATS("Packets Received on lmac[%d] = %llu ( %llu )",
7524*5113495bSYour Name 			       i, peer_stats->rx.rx_lmac[i].num,
7525*5113495bSYour Name 			       peer_stats->rx.rx_lmac[i].bytes);
7526*5113495bSYour Name 
7527*5113495bSYour Name 	DP_PRINT_STATS("Unicast Packets Received = %llu",
7528*5113495bSYour Name 		       peer_stats->rx.unicast.num);
7529*5113495bSYour Name 	DP_PRINT_STATS("Unicast Bytes Received = %llu",
7530*5113495bSYour Name 		       peer_stats->rx.unicast.bytes);
7531*5113495bSYour Name 	DP_PRINT_STATS("Multicast Packets Received = %llu",
7532*5113495bSYour Name 		       peer_stats->rx.multicast.num);
7533*5113495bSYour Name 	DP_PRINT_STATS("Multicast Bytes Received = %llu",
7534*5113495bSYour Name 		       peer_stats->rx.multicast.bytes);
7535*5113495bSYour Name 	DP_PRINT_STATS("Broadcast Packets Received = %llu",
7536*5113495bSYour Name 		       peer_stats->rx.bcast.num);
7537*5113495bSYour Name 	DP_PRINT_STATS("Broadcast Bytes Received = %llu",
7538*5113495bSYour Name 		       peer_stats->rx.bcast.bytes);
7539*5113495bSYour Name 	DP_PRINT_STATS("Packets Sent To Stack in TWT Session = %llu",
7540*5113495bSYour Name 		       peer_stats->rx.to_stack_twt.num);
7541*5113495bSYour Name 	DP_PRINT_STATS("Bytes Sent To Stack in TWT Session = %llu",
7542*5113495bSYour Name 		       peer_stats->rx.to_stack_twt.bytes);
7543*5113495bSYour Name 	DP_PRINT_STATS("Intra BSS Packets Received = %llu",
7544*5113495bSYour Name 		       peer_stats->rx.intra_bss.pkts.num);
7545*5113495bSYour Name 	DP_PRINT_STATS("Intra BSS Bytes Received = %llu",
7546*5113495bSYour Name 		       peer_stats->rx.intra_bss.pkts.bytes);
7547*5113495bSYour Name 	DP_PRINT_STATS("Intra BSS Packets Failed = %llu",
7548*5113495bSYour Name 		       peer_stats->rx.intra_bss.fail.num);
7549*5113495bSYour Name 	DP_PRINT_STATS("Intra BSS Bytes Failed = %llu",
7550*5113495bSYour Name 		       peer_stats->rx.intra_bss.fail.bytes);
7551*5113495bSYour Name 	DP_PRINT_STATS("Intra BSS MDNS Packets Not Forwarded  = %d",
7552*5113495bSYour Name 		       peer_stats->rx.intra_bss.mdns_no_fwd);
7553*5113495bSYour Name 	DP_PRINT_STATS("Raw Packets Received = %llu",
7554*5113495bSYour Name 		       peer_stats->rx.raw.num);
7555*5113495bSYour Name 	DP_PRINT_STATS("Raw Bytes Received = %llu",
7556*5113495bSYour Name 		       peer_stats->rx.raw.bytes);
7557*5113495bSYour Name 	DP_PRINT_STATS("Errors: MIC Errors = %d",
7558*5113495bSYour Name 		       peer_stats->rx.err.mic_err);
7559*5113495bSYour Name 	DP_PRINT_STATS("Errors: Decryption Errors = %d",
7560*5113495bSYour Name 		       peer_stats->rx.err.decrypt_err);
7561*5113495bSYour Name 	DP_PRINT_STATS("Errors: PN Errors = %d",
7562*5113495bSYour Name 		       peer_stats->rx.err.pn_err);
7563*5113495bSYour Name 	DP_PRINT_STATS("Errors: OOR Errors = %d",
7564*5113495bSYour Name 		       peer_stats->rx.err.oor_err);
7565*5113495bSYour Name 	DP_PRINT_STATS("Errors: 2k Jump Errors = %d",
7566*5113495bSYour Name 		       peer_stats->rx.err.jump_2k_err);
7567*5113495bSYour Name 	DP_PRINT_STATS("Errors: RXDMA Wifi Parse Errors = %d",
7568*5113495bSYour Name 		       peer_stats->rx.err.rxdma_wifi_parse_err);
7569*5113495bSYour Name 	DP_PRINT_STATS("Msdu's Received As Part of Ampdu = %d",
7570*5113495bSYour Name 		       peer_stats->rx.non_ampdu_cnt);
7571*5113495bSYour Name 	DP_PRINT_STATS("Msdu's Received As Ampdu = %d",
7572*5113495bSYour Name 		       peer_stats->rx.ampdu_cnt);
7573*5113495bSYour Name 	DP_PRINT_STATS("Msdu's Received Not Part of Amsdu's = %d",
7574*5113495bSYour Name 		       peer_stats->rx.non_amsdu_cnt);
7575*5113495bSYour Name 	DP_PRINT_STATS("MSDUs Received As Part of Amsdu = %d",
7576*5113495bSYour Name 		       peer_stats->rx.amsdu_cnt);
7577*5113495bSYour Name 	DP_PRINT_STATS("MSDU Rx Retries= %d", peer_stats->rx.rx_retries);
7578*5113495bSYour Name 	DP_PRINT_STATS("MPDU Rx Retries= %d", peer_stats->rx.mpdu_retry_cnt);
7579*5113495bSYour Name 	DP_PRINT_STATS("NAWDS : ");
7580*5113495bSYour Name 	DP_PRINT_STATS("	Nawds multicast Drop Rx Packet = %d",
7581*5113495bSYour Name 		       peer_stats->rx.nawds_mcast_drop);
7582*5113495bSYour Name 	DP_PRINT_STATS(" 3address multicast Drop Rx Packet = %d",
7583*5113495bSYour Name 		       peer_stats->rx.mcast_3addr_drop);
7584*5113495bSYour Name 	DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
7585*5113495bSYour Name 		       peer_stats->rx.sgi_count[0],
7586*5113495bSYour Name 		       peer_stats->rx.sgi_count[1],
7587*5113495bSYour Name 		       peer_stats->rx.sgi_count[2],
7588*5113495bSYour Name 		       peer_stats->rx.sgi_count[3]);
7589*5113495bSYour Name 
7590*5113495bSYour Name 	DP_PRINT_STATS("Wireless Mutlimedia ");
7591*5113495bSYour Name 	DP_PRINT_STATS("	 Best effort = %d",
7592*5113495bSYour Name 		       peer_stats->rx.wme_ac_type[0]);
7593*5113495bSYour Name 	DP_PRINT_STATS("	 Background= %d",
7594*5113495bSYour Name 		       peer_stats->rx.wme_ac_type[1]);
7595*5113495bSYour Name 	DP_PRINT_STATS("	 Video = %d",
7596*5113495bSYour Name 		       peer_stats->rx.wme_ac_type[2]);
7597*5113495bSYour Name 	DP_PRINT_STATS("	 Voice = %d",
7598*5113495bSYour Name 		       peer_stats->rx.wme_ac_type[3]);
7599*5113495bSYour Name 
7600*5113495bSYour Name 	DP_PRINT_STATS(" Total Rx PPDU Count = %d", peer_stats->rx.rx_ppdus);
7601*5113495bSYour Name 	DP_PRINT_STATS(" Total Rx MPDU Count = %d", peer_stats->rx.rx_mpdus);
7602*5113495bSYour Name 	DP_PRINT_STATS("MSDU Reception Type");
7603*5113495bSYour Name 	DP_PRINT_STATS("SU %d MU_MIMO %d MU_OFDMA %d MU_OFDMA_MIMO %d",
7604*5113495bSYour Name 		       peer_stats->rx.reception_type[0],
7605*5113495bSYour Name 		       peer_stats->rx.reception_type[1],
7606*5113495bSYour Name 		       peer_stats->rx.reception_type[2],
7607*5113495bSYour Name 		       peer_stats->rx.reception_type[3]);
7608*5113495bSYour Name 	DP_PRINT_STATS("PPDU Reception Type");
7609*5113495bSYour Name 	DP_PRINT_STATS("SU %d MU_MIMO %d MU_OFDMA %d MU_OFDMA_MIMO %d",
7610*5113495bSYour Name 		       peer_stats->rx.ppdu_cnt[0],
7611*5113495bSYour Name 		       peer_stats->rx.ppdu_cnt[1],
7612*5113495bSYour Name 		       peer_stats->rx.ppdu_cnt[2],
7613*5113495bSYour Name 		       peer_stats->rx.ppdu_cnt[3]);
7614*5113495bSYour Name 
7615*5113495bSYour Name 	dp_print_common_rates_info(peer_stats->rx.pkt_type);
7616*5113495bSYour Name 	dp_print_common_ppdu_rates_info(&peer_stats->rx.su_ax_ppdu_cnt,
7617*5113495bSYour Name 					DOT11_AX);
7618*5113495bSYour Name 	dp_print_mu_ppdu_rates_info(&peer_stats->rx.rx_mu[0]);
7619*5113495bSYour Name 
7620*5113495bSYour Name 	pnss = &peer_stats->rx.nss[0];
7621*5113495bSYour Name 	dp_print_nss(nss, pnss, SS_COUNT);
7622*5113495bSYour Name 	DP_PRINT_STATS("MSDU Count");
7623*5113495bSYour Name 	DP_PRINT_STATS("	NSS(1-8) = %s", nss);
7624*5113495bSYour Name 
7625*5113495bSYour Name 	DP_PRINT_STATS("reception mode SU");
7626*5113495bSYour Name 	pnss = &peer_stats->rx.ppdu_nss[0];
7627*5113495bSYour Name 	dp_print_nss(nss, pnss, SS_COUNT);
7628*5113495bSYour Name 
7629*5113495bSYour Name 	DP_PRINT_STATS("	PPDU Count");
7630*5113495bSYour Name 	DP_PRINT_STATS("	NSS(1-8) = %s", nss);
7631*5113495bSYour Name 
7632*5113495bSYour Name 	DP_PRINT_STATS("	MPDU OK = %d, MPDU Fail = %d",
7633*5113495bSYour Name 		       peer_stats->rx.mpdu_cnt_fcs_ok,
7634*5113495bSYour Name 		       peer_stats->rx.mpdu_cnt_fcs_err);
7635*5113495bSYour Name 
7636*5113495bSYour Name 	for (rx_mu_type = 0; rx_mu_type < TXRX_TYPE_MU_MAX; rx_mu_type++) {
7637*5113495bSYour Name 		DP_PRINT_STATS("reception mode %s",
7638*5113495bSYour Name 			       mu_reception_mode[rx_mu_type]);
7639*5113495bSYour Name 		rx_mu = &peer_stats->rx.rx_mu[rx_mu_type];
7640*5113495bSYour Name 
7641*5113495bSYour Name 		pnss = &rx_mu->ppdu_nss[0];
7642*5113495bSYour Name 		dp_print_nss(nss, pnss, SS_COUNT);
7643*5113495bSYour Name 		DP_PRINT_STATS("	PPDU Count");
7644*5113495bSYour Name 		DP_PRINT_STATS("	NSS(1-8) = %s", nss);
7645*5113495bSYour Name 
7646*5113495bSYour Name 		DP_PRINT_STATS("	MPDU OK = %d, MPDU Fail = %d",
7647*5113495bSYour Name 			       rx_mu->mpdu_cnt_fcs_ok,
7648*5113495bSYour Name 			       rx_mu->mpdu_cnt_fcs_err);
7649*5113495bSYour Name 	}
7650*5113495bSYour Name 
7651*5113495bSYour Name 	DP_PRINT_STATS("Aggregation:");
7652*5113495bSYour Name 	DP_PRINT_STATS("	Msdu's Part of Ampdu = %d",
7653*5113495bSYour Name 		       peer_stats->rx.ampdu_cnt);
7654*5113495bSYour Name 	DP_PRINT_STATS("	Msdu's With No Mpdu Level Aggregation = %d",
7655*5113495bSYour Name 		       peer_stats->rx.non_ampdu_cnt);
7656*5113495bSYour Name 	DP_PRINT_STATS("	Msdu's Part of Amsdu = %d",
7657*5113495bSYour Name 		       peer_stats->rx.amsdu_cnt);
7658*5113495bSYour Name 	DP_PRINT_STATS("	Msdu's With No Msdu Level Aggregation = %d",
7659*5113495bSYour Name 		       peer_stats->rx.non_amsdu_cnt);
7660*5113495bSYour Name 
7661*5113495bSYour Name 	DP_PRINT_STATS("Bytes and Packets received in last one sec:");
7662*5113495bSYour Name 	DP_PRINT_STATS("	Bytes received in last sec: %d",
7663*5113495bSYour Name 		       peer_stats->rx.rx_byte_rate);
7664*5113495bSYour Name 	DP_PRINT_STATS("	Data received in last sec: %d",
7665*5113495bSYour Name 		       peer_stats->rx.rx_data_rate);
7666*5113495bSYour Name 	DP_PRINT_STATS("MEC Packet Drop = %llu",
7667*5113495bSYour Name 		       peer_stats->rx.mec_drop.num);
7668*5113495bSYour Name 	DP_PRINT_STATS("MEC Byte Drop = %llu",
7669*5113495bSYour Name 		       peer_stats->rx.mec_drop.bytes);
7670*5113495bSYour Name 	DP_PRINT_STATS("Multipass Rx Packet Drop = %d",
7671*5113495bSYour Name 		       peer_stats->rx.multipass_rx_pkt_drop);
7672*5113495bSYour Name 	DP_PRINT_STATS("Peer Unauth Rx Packet Drop = %d",
7673*5113495bSYour Name 		       peer_stats->rx.peer_unauth_rx_pkt_drop);
7674*5113495bSYour Name 	DP_PRINT_STATS("Policy Check Rx Packet Drop = %d",
7675*5113495bSYour Name 		       peer_stats->rx.policy_check_drop);
7676*5113495bSYour Name 	if (pdev && pdev->soc->arch_ops.txrx_print_peer_stats)
7677*5113495bSYour Name 		pdev->soc->arch_ops.txrx_print_peer_stats(peer_stats,
7678*5113495bSYour Name 							  PEER_RX_STATS);
7679*5113495bSYour Name 
7680*5113495bSYour Name 	if (!IS_MLO_DP_LINK_PEER(peer))
7681*5113495bSYour Name 		dp_peer_print_rx_delay_stats(pdev, peer);
7682*5113495bSYour Name 
7683*5113495bSYour Name 	if (IS_MLO_DP_MLD_PEER(peer))
7684*5113495bSYour Name 		DP_PRINT_STATS("RX Invalid Link ID Packet Count = %u",
7685*5113495bSYour Name 			       peer_stats->rx.inval_link_id_pkt_cnt);
7686*5113495bSYour Name 
7687*5113495bSYour Name 	dp_peer_print_reo_qref_table(peer);
7688*5113495bSYour Name }
7689*5113495bSYour Name 
dp_print_per_ring_stats(struct dp_soc * soc)7690*5113495bSYour Name void dp_print_per_ring_stats(struct dp_soc *soc)
7691*5113495bSYour Name {
7692*5113495bSYour Name 	uint8_t ring;
7693*5113495bSYour Name 	uint16_t core;
7694*5113495bSYour Name 	uint64_t total_packets;
7695*5113495bSYour Name 
7696*5113495bSYour Name 	DP_PRINT_STATS("Rx packets per ring:");
7697*5113495bSYour Name 	for (ring = 0; ring < MAX_REO_DEST_RINGS; ring++) {
7698*5113495bSYour Name 		total_packets = 0;
7699*5113495bSYour Name 		DP_PRINT_STATS("Packets on ring %u:", ring);
7700*5113495bSYour Name 		for (core = 0; core < num_possible_cpus(); core++) {
7701*5113495bSYour Name 			if (!soc->stats.rx.ring_packets[core][ring])
7702*5113495bSYour Name 				continue;
7703*5113495bSYour Name 			DP_PRINT_STATS("Packets arriving on core %u: %llu",
7704*5113495bSYour Name 				       core,
7705*5113495bSYour Name 				       soc->stats.rx.ring_packets[core][ring]);
7706*5113495bSYour Name 			total_packets += soc->stats.rx.ring_packets[core][ring];
7707*5113495bSYour Name 		}
7708*5113495bSYour Name 		DP_PRINT_STATS("Total packets on ring %u: %llu",
7709*5113495bSYour Name 			       ring, total_packets);
7710*5113495bSYour Name 	}
7711*5113495bSYour Name }
7712*5113495bSYour Name 
dp_pdev_print_tx_rx_rates(struct dp_pdev * pdev)7713*5113495bSYour Name static void dp_pdev_print_tx_rx_rates(struct dp_pdev *pdev)
7714*5113495bSYour Name {
7715*5113495bSYour Name 	struct dp_vdev *vdev;
7716*5113495bSYour Name 	struct dp_vdev **vdev_array = NULL;
7717*5113495bSYour Name 	int index = 0, num_vdev = 0;
7718*5113495bSYour Name 
7719*5113495bSYour Name 	if (!pdev) {
7720*5113495bSYour Name 		dp_err("pdev is NULL");
7721*5113495bSYour Name 		return;
7722*5113495bSYour Name 	}
7723*5113495bSYour Name 
7724*5113495bSYour Name 	vdev_array =
7725*5113495bSYour Name 		qdf_mem_malloc(sizeof(struct dp_vdev *) * WLAN_PDEV_MAX_VDEVS);
7726*5113495bSYour Name 	if (!vdev_array)
7727*5113495bSYour Name 		return;
7728*5113495bSYour Name 
7729*5113495bSYour Name 	qdf_spin_lock_bh(&pdev->vdev_list_lock);
7730*5113495bSYour Name 	DP_PDEV_ITERATE_VDEV_LIST(pdev, vdev) {
7731*5113495bSYour Name 		if (dp_vdev_get_ref(pdev->soc, vdev, DP_MOD_ID_GENERIC_STATS))
7732*5113495bSYour Name 			continue;
7733*5113495bSYour Name 		vdev_array[index] = vdev;
7734*5113495bSYour Name 		index = index + 1;
7735*5113495bSYour Name 	}
7736*5113495bSYour Name 	qdf_spin_unlock_bh(&pdev->vdev_list_lock);
7737*5113495bSYour Name 
7738*5113495bSYour Name 	num_vdev = index;
7739*5113495bSYour Name 
7740*5113495bSYour Name 	for (index = 0; index < num_vdev; index++) {
7741*5113495bSYour Name 		vdev = vdev_array[index];
7742*5113495bSYour Name 		dp_print_rx_rates(vdev);
7743*5113495bSYour Name 		dp_print_tx_rates(vdev);
7744*5113495bSYour Name 		dp_vdev_unref_delete(pdev->soc, vdev, DP_MOD_ID_GENERIC_STATS);
7745*5113495bSYour Name 	}
7746*5113495bSYour Name 	qdf_mem_free(vdev_array);
7747*5113495bSYour Name }
7748*5113495bSYour Name 
dp_txrx_path_stats(struct dp_soc * soc)7749*5113495bSYour Name void dp_txrx_path_stats(struct dp_soc *soc)
7750*5113495bSYour Name {
7751*5113495bSYour Name 	uint8_t error_code;
7752*5113495bSYour Name 	uint8_t loop_pdev;
7753*5113495bSYour Name 	struct dp_pdev *pdev;
7754*5113495bSYour Name 	uint8_t i;
7755*5113495bSYour Name 	uint8_t *buf;
7756*5113495bSYour Name 	size_t pos, buf_len;
7757*5113495bSYour Name 	uint8_t dp_stats_str[DP_STATS_STR_LEN] = {'\0'};
7758*5113495bSYour Name 
7759*5113495bSYour Name 	if (!soc) {
7760*5113495bSYour Name 		dp_err("Invalid access");
7761*5113495bSYour Name 		return;
7762*5113495bSYour Name 	}
7763*5113495bSYour Name 
7764*5113495bSYour Name 	for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) {
7765*5113495bSYour Name 		pdev = soc->pdev_list[loop_pdev];
7766*5113495bSYour Name 		dp_aggregate_pdev_stats(pdev);
7767*5113495bSYour Name 		DP_PRINT_STATS("Tx path Statistics:");
7768*5113495bSYour Name 		DP_PRINT_STATS("from stack: %llu msdus (%llu bytes)",
7769*5113495bSYour Name 			       pdev->stats.tx_i.rcvd.num,
7770*5113495bSYour Name 			       pdev->stats.tx_i.rcvd.bytes);
7771*5113495bSYour Name 		DP_PRINT_STATS("processed from host: %llu msdus (%llu bytes)",
7772*5113495bSYour Name 			       pdev->stats.tx_i.processed.num,
7773*5113495bSYour Name 			       pdev->stats.tx_i.processed.bytes);
7774*5113495bSYour Name 		DP_PRINT_STATS("successfully transmitted: %llu msdus (%llu bytes)",
7775*5113495bSYour Name 			       pdev->stats.tx.tx_success.num,
7776*5113495bSYour Name 			       pdev->stats.tx.tx_success.bytes);
7777*5113495bSYour Name 
7778*5113495bSYour Name 		dp_print_tx_ring_stats(soc);
7779*5113495bSYour Name 
7780*5113495bSYour Name 		DP_PRINT_STATS("Invalid release source: %u",
7781*5113495bSYour Name 			       soc->stats.tx.invalid_release_source);
7782*5113495bSYour Name 		DP_PRINT_STATS("Invalid TX desc from completion ring: %u",
7783*5113495bSYour Name 			       soc->stats.tx.invalid_tx_comp_desc);
7784*5113495bSYour Name 		DP_PRINT_STATS("Dropped in host:");
7785*5113495bSYour Name 		DP_PRINT_STATS("Total packets dropped: %llu",
7786*5113495bSYour Name 			       pdev->stats.tx_i.dropped.dropped_pkt.num);
7787*5113495bSYour Name 		DP_PRINT_STATS("Descriptor not available: %llu",
7788*5113495bSYour Name 			       pdev->stats.tx_i.dropped.desc_na.num);
7789*5113495bSYour Name 		DP_PRINT_STATS("Ring full: %u",
7790*5113495bSYour Name 			       pdev->stats.tx_i.dropped.ring_full);
7791*5113495bSYour Name 		DP_PRINT_STATS("Enqueue fail: %u",
7792*5113495bSYour Name 			       pdev->stats.tx_i.dropped.enqueue_fail);
7793*5113495bSYour Name 		DP_PRINT_STATS("Pkt dropped in vdev-id check: %u",
7794*5113495bSYour Name 			       pdev->stats.tx_i.dropped.fail_per_pkt_vdev_id_check);
7795*5113495bSYour Name 		DP_PRINT_STATS("DMA Error: %u",
7796*5113495bSYour Name 			       pdev->stats.tx_i.dropped.dma_error);
7797*5113495bSYour Name 		DP_PRINT_STATS("Drop Ingress: %u",
7798*5113495bSYour Name 			       pdev->stats.tx_i.dropped.drop_ingress);
7799*5113495bSYour Name 		DP_PRINT_STATS("Resources full: %u",
7800*5113495bSYour Name 			       pdev->stats.tx_i.dropped.res_full);
7801*5113495bSYour Name 		DP_PRINT_STATS("Headroom insufficient: %u",
7802*5113495bSYour Name 			       pdev->stats.tx_i.dropped.headroom_insufficient);
7803*5113495bSYour Name 		DP_PRINT_STATS("Invalid peer id in exception path: %u",
7804*5113495bSYour Name 			       pdev->stats.tx_i.dropped.invalid_peer_id_in_exc_path);
7805*5113495bSYour Name 		DP_PRINT_STATS("Tx Mcast Drop: %u",
7806*5113495bSYour Name 			       pdev->stats.tx_i.dropped.tx_mcast_drop);
7807*5113495bSYour Name 		DP_PRINT_STATS("FW2WBM Tx Drop: %u",
7808*5113495bSYour Name 			       pdev->stats.tx_i.dropped.fw2wbm_tx_drop);
7809*5113495bSYour Name 
7810*5113495bSYour Name 		DP_PRINT_STATS("Dropped in hardware:");
7811*5113495bSYour Name 		DP_PRINT_STATS("total packets dropped: %u",
7812*5113495bSYour Name 			       pdev->stats.tx.tx_failed);
7813*5113495bSYour Name 		DP_PRINT_STATS("mpdu age out: %u",
7814*5113495bSYour Name 			       pdev->stats.tx.dropped.age_out);
7815*5113495bSYour Name 		DP_PRINT_STATS("firmware removed packets: %llu (%llu bytes)",
7816*5113495bSYour Name 			       pdev->stats.tx.dropped.fw_rem.num,
7817*5113495bSYour Name 			       pdev->stats.tx.dropped.fw_rem.bytes);
7818*5113495bSYour Name 		DP_PRINT_STATS("firmware removed tx: %u",
7819*5113495bSYour Name 			       pdev->stats.tx.dropped.fw_rem_tx);
7820*5113495bSYour Name 		DP_PRINT_STATS("firmware removed notx %u",
7821*5113495bSYour Name 			       pdev->stats.tx.dropped.fw_rem_notx);
7822*5113495bSYour Name 		DP_PRINT_STATS("Invalid peer on tx path: %llu",
7823*5113495bSYour Name 			       pdev->soc->stats.tx.tx_invalid_peer.num);
7824*5113495bSYour Name 		DP_PRINT_STATS("Tx desc freed in non-completion path: %u",
7825*5113495bSYour Name 			       pdev->soc->stats.tx.tx_comp_exception);
7826*5113495bSYour Name 		DP_PRINT_STATS("Tx desc force freed: %u",
7827*5113495bSYour Name 			       pdev->soc->stats.tx.tx_comp_force_freed);
7828*5113495bSYour Name 
7829*5113495bSYour Name 		buf = dp_stats_str;
7830*5113495bSYour Name 		buf_len = DP_STATS_STR_LEN;
7831*5113495bSYour Name 		pos = 0;
7832*5113495bSYour Name 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "%s", "Tx/IRQ [Range:Pkts] [");
7833*5113495bSYour Name 
7834*5113495bSYour Name 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "1: %u, ",
7835*5113495bSYour Name 				     pdev->stats.tx_comp_histogram.pkts_1);
7836*5113495bSYour Name 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "2-20: %u, ",
7837*5113495bSYour Name 				     pdev->stats.tx_comp_histogram.pkts_2_20);
7838*5113495bSYour Name 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "21-40: %u, ",
7839*5113495bSYour Name 				     pdev->stats.tx_comp_histogram.pkts_21_40);
7840*5113495bSYour Name 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "41-60: %u, ",
7841*5113495bSYour Name 				     pdev->stats.tx_comp_histogram.pkts_41_60);
7842*5113495bSYour Name 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "61-80: %u, ",
7843*5113495bSYour Name 				     pdev->stats.tx_comp_histogram.pkts_61_80);
7844*5113495bSYour Name 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "81-100: %u, ",
7845*5113495bSYour Name 				     pdev->stats.tx_comp_histogram.pkts_81_100);
7846*5113495bSYour Name 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "101-200: %u, ",
7847*5113495bSYour Name 				    pdev->stats.tx_comp_histogram.pkts_101_200);
7848*5113495bSYour Name 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "201+: %u",
7849*5113495bSYour Name 				   pdev->stats.tx_comp_histogram.pkts_201_plus);
7850*5113495bSYour Name 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "%s", "]");
7851*5113495bSYour Name 		DP_PRINT_STATS("%s", dp_stats_str);
7852*5113495bSYour Name 
7853*5113495bSYour Name 		DP_PRINT_STATS("Rx path statistics:");
7854*5113495bSYour Name 
7855*5113495bSYour Name 		DP_PRINT_STATS("delivered %llu msdus ( %llu bytes)",
7856*5113495bSYour Name 			       pdev->stats.rx.to_stack.num,
7857*5113495bSYour Name 			       pdev->stats.rx.to_stack.bytes);
7858*5113495bSYour Name 
7859*5113495bSYour Name 		dp_print_rx_ring_stats(pdev);
7860*5113495bSYour Name 
7861*5113495bSYour Name 		for (i = 0; i < CDP_MAX_LMACS; i++)
7862*5113495bSYour Name 			DP_PRINT_STATS("received on lmac[%d] %llu msdus (%llu bytes)",
7863*5113495bSYour Name 				       i, pdev->stats.rx.rx_lmac[i].num,
7864*5113495bSYour Name 				       pdev->stats.rx.rx_lmac[i].bytes);
7865*5113495bSYour Name 		DP_PRINT_STATS("intra-bss packets %llu msdus ( %llu bytes)",
7866*5113495bSYour Name 			       pdev->stats.rx.intra_bss.pkts.num,
7867*5113495bSYour Name 			       pdev->stats.rx.intra_bss.pkts.bytes);
7868*5113495bSYour Name 		DP_PRINT_STATS("intra-bss fails %llu msdus ( %llu bytes)",
7869*5113495bSYour Name 			       pdev->stats.rx.intra_bss.fail.num,
7870*5113495bSYour Name 			       pdev->stats.rx.intra_bss.fail.bytes);
7871*5113495bSYour Name 		DP_PRINT_STATS("intra-bss no mdns fwds %u msdus",
7872*5113495bSYour Name 			       pdev->stats.rx.intra_bss.mdns_no_fwd);
7873*5113495bSYour Name 
7874*5113495bSYour Name 		DP_PRINT_STATS("raw packets %llu msdus ( %llu bytes)",
7875*5113495bSYour Name 			       pdev->stats.rx.raw.num,
7876*5113495bSYour Name 			       pdev->stats.rx.raw.bytes);
7877*5113495bSYour Name 
7878*5113495bSYour Name 		DP_PRINT_STATS("Rx BAR frames:%d", soc->stats.rx.bar_frame);
7879*5113495bSYour Name 
7880*5113495bSYour Name 		dp_print_rx_err_stats(soc, pdev);
7881*5113495bSYour Name 
7882*5113495bSYour Name 		for (error_code = 0; error_code < HAL_RXDMA_ERR_MAX;
7883*5113495bSYour Name 				error_code++) {
7884*5113495bSYour Name 			if (!pdev->soc->stats.rx.err.rxdma_error[error_code])
7885*5113495bSYour Name 				continue;
7886*5113495bSYour Name 			DP_PRINT_STATS("Rxdma error number (%u): %u msdus",
7887*5113495bSYour Name 				       error_code,
7888*5113495bSYour Name 				       pdev->soc->stats.rx.err
7889*5113495bSYour Name 				       .rxdma_error[error_code]);
7890*5113495bSYour Name 		}
7891*5113495bSYour Name 
7892*5113495bSYour Name 		pos = 0;
7893*5113495bSYour Name 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "%s", "Rx/IRQ [Range:Pkts] [");
7894*5113495bSYour Name 
7895*5113495bSYour Name 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "1: %u, ",
7896*5113495bSYour Name 				     pdev->stats.rx_ind_histogram.pkts_1);
7897*5113495bSYour Name 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "2-20: %u, ",
7898*5113495bSYour Name 				     pdev->stats.rx_ind_histogram.pkts_2_20);
7899*5113495bSYour Name 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "21-40: %u, ",
7900*5113495bSYour Name 				     pdev->stats.rx_ind_histogram.pkts_21_40);
7901*5113495bSYour Name 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "41-60: %u, ",
7902*5113495bSYour Name 				     pdev->stats.rx_ind_histogram.pkts_41_60);
7903*5113495bSYour Name 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "61-80: %u, ",
7904*5113495bSYour Name 				     pdev->stats.rx_ind_histogram.pkts_61_80);
7905*5113495bSYour Name 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "81-100: %u, ",
7906*5113495bSYour Name 				     pdev->stats.rx_ind_histogram.pkts_81_100);
7907*5113495bSYour Name 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "101-200: %u, ",
7908*5113495bSYour Name 				    pdev->stats.rx_ind_histogram.pkts_101_200);
7909*5113495bSYour Name 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "201+: %u",
7910*5113495bSYour Name 				   pdev->stats.rx_ind_histogram.pkts_201_plus);
7911*5113495bSYour Name 		pos += qdf_scnprintf(buf + pos, buf_len - pos, "%s", "]");
7912*5113495bSYour Name 		DP_PRINT_STATS("%s", dp_stats_str);
7913*5113495bSYour Name 
7914*5113495bSYour Name 		DP_PRINT_STATS("%s: tso_enable: %u lro_enable: %u rx_hash: %u napi_enable: %u",
7915*5113495bSYour Name 			       __func__,
7916*5113495bSYour Name 			       pdev->soc->wlan_cfg_ctx
7917*5113495bSYour Name 			       ->tso_enabled,
7918*5113495bSYour Name 			       pdev->soc->wlan_cfg_ctx
7919*5113495bSYour Name 			       ->lro_enabled,
7920*5113495bSYour Name 			       pdev->soc->wlan_cfg_ctx
7921*5113495bSYour Name 			       ->rx_hash,
7922*5113495bSYour Name 			       pdev->soc->wlan_cfg_ctx
7923*5113495bSYour Name 			       ->napi_enabled);
7924*5113495bSYour Name #ifdef QCA_LL_TX_FLOW_CONTROL_V2
7925*5113495bSYour Name 		DP_PRINT_STATS("%s: Tx flow stop queue: %u tx flow start queue offset: %u",
7926*5113495bSYour Name 			       __func__,
7927*5113495bSYour Name 			       pdev->soc->wlan_cfg_ctx
7928*5113495bSYour Name 			       ->tx_flow_stop_queue_threshold,
7929*5113495bSYour Name 			       pdev->soc->wlan_cfg_ctx
7930*5113495bSYour Name 			       ->tx_flow_start_queue_offset);
7931*5113495bSYour Name #endif
7932*5113495bSYour Name 		dp_pdev_print_tx_rx_rates(pdev);
7933*5113495bSYour Name 	}
7934*5113495bSYour Name }
7935*5113495bSYour Name 
7936*5113495bSYour Name #ifndef WLAN_SOFTUMAC_SUPPORT
7937*5113495bSYour Name /**
7938*5113495bSYour Name  * dp_peer_ctrl_frames_stats_get() - function to agreegate peer stats
7939*5113495bSYour Name  * Current scope is bar received count
7940*5113495bSYour Name  *
7941*5113495bSYour Name  * @soc : Datapath SOC handle
7942*5113495bSYour Name  * @peer: Datapath peer handle
7943*5113495bSYour Name  * @arg : argument to iterate function
7944*5113495bSYour Name  *
7945*5113495bSYour Name  * Return: void
7946*5113495bSYour Name  */
7947*5113495bSYour Name static void
dp_peer_ctrl_frames_stats_get(struct dp_soc * soc,struct dp_peer * peer,void * arg)7948*5113495bSYour Name dp_peer_ctrl_frames_stats_get(struct dp_soc *soc,
7949*5113495bSYour Name 			      struct dp_peer *peer,
7950*5113495bSYour Name 			      void *arg)
7951*5113495bSYour Name {
7952*5113495bSYour Name 	uint32_t waitcnt;
7953*5113495bSYour Name 	struct dp_peer *tgt_peer = dp_get_tgt_peer_from_peer(peer);
7954*5113495bSYour Name 	struct dp_pdev *pdev = tgt_peer->vdev->pdev;
7955*5113495bSYour Name 
7956*5113495bSYour Name 	waitcnt = 0;
7957*5113495bSYour Name 	dp_peer_rxtid_stats(tgt_peer, dp_rx_bar_stats_cb, pdev);
7958*5113495bSYour Name 	while (!(qdf_atomic_read(&pdev->stats_cmd_complete)) &&
7959*5113495bSYour Name 	       waitcnt < 10) {
7960*5113495bSYour Name 		schedule_timeout_interruptible(
7961*5113495bSYour Name 				STATS_PROC_TIMEOUT);
7962*5113495bSYour Name 		waitcnt++;
7963*5113495bSYour Name 	}
7964*5113495bSYour Name 	qdf_atomic_set(&pdev->stats_cmd_complete, 0);
7965*5113495bSYour Name }
7966*5113495bSYour Name 
7967*5113495bSYour Name #else
7968*5113495bSYour Name /**
7969*5113495bSYour Name  * dp_peer_ctrl_frames_stats_get() - function to agreegate peer stats
7970*5113495bSYour Name  * Current scope is bar received count
7971*5113495bSYour Name  *
7972*5113495bSYour Name  * @soc : Datapath SOC handle
7973*5113495bSYour Name  * @peer: Datapath peer handle
7974*5113495bSYour Name  * @arg : argument to iterate function
7975*5113495bSYour Name  *
7976*5113495bSYour Name  * Return: void
7977*5113495bSYour Name  */
7978*5113495bSYour Name static void
dp_peer_ctrl_frames_stats_get(struct dp_soc * soc,struct dp_peer * peer,void * arg)7979*5113495bSYour Name dp_peer_ctrl_frames_stats_get(struct dp_soc *soc,
7980*5113495bSYour Name 			      struct dp_peer *peer,
7981*5113495bSYour Name 			      void *arg)
7982*5113495bSYour Name {
7983*5113495bSYour Name }
7984*5113495bSYour Name #endif /* WLAN_SOFTUMAC_SUPPORT */
7985*5113495bSYour Name 
7986*5113495bSYour Name void
dp_print_pdev_tx_stats(struct dp_pdev * pdev)7987*5113495bSYour Name dp_print_pdev_tx_stats(struct dp_pdev *pdev)
7988*5113495bSYour Name {
7989*5113495bSYour Name 	uint8_t i = 0, index = 0;
7990*5113495bSYour Name 
7991*5113495bSYour Name 	DP_PRINT_STATS("PDEV Tx Stats:\n");
7992*5113495bSYour Name 	DP_PRINT_STATS("Received From Stack:");
7993*5113495bSYour Name 	DP_PRINT_STATS("	Packets = %llu",
7994*5113495bSYour Name 		       pdev->stats.tx_i.rcvd.num);
7995*5113495bSYour Name 	DP_PRINT_STATS("	Bytes = %llu",
7996*5113495bSYour Name 		       pdev->stats.tx_i.rcvd.bytes);
7997*5113495bSYour Name 	DP_PRINT_STATS("Received from Stack in FP:");
7998*5113495bSYour Name 	DP_PRINT_STATS("	Packets = %llu",
7999*5113495bSYour Name 		       pdev->stats.tx_i.rcvd_in_fast_xmit_flow);
8000*5113495bSYour Name 	DP_PRINT_STATS("Received from Stack per core:");
8001*5113495bSYour Name 	DP_PRINT_STATS("	Packets = %u %u %u %u",
8002*5113495bSYour Name 		       pdev->stats.tx_i.rcvd_per_core[0],
8003*5113495bSYour Name 		       pdev->stats.tx_i.rcvd_per_core[1],
8004*5113495bSYour Name 		       pdev->stats.tx_i.rcvd_per_core[2],
8005*5113495bSYour Name 		       pdev->stats.tx_i.rcvd_per_core[3]);
8006*5113495bSYour Name 	DP_PRINT_STATS("Processed:");
8007*5113495bSYour Name 	DP_PRINT_STATS("	Packets = %llu",
8008*5113495bSYour Name 		       pdev->stats.tx_i.processed.num);
8009*5113495bSYour Name 	DP_PRINT_STATS("	Bytes = %llu",
8010*5113495bSYour Name 		       pdev->stats.tx_i.processed.bytes);
8011*5113495bSYour Name 	DP_PRINT_STATS("Total Completions:");
8012*5113495bSYour Name 	DP_PRINT_STATS("	Packets = %llu",
8013*5113495bSYour Name 		       pdev->stats.tx.comp_pkt.num);
8014*5113495bSYour Name 	DP_PRINT_STATS("	Bytes = %llu",
8015*5113495bSYour Name 		       pdev->stats.tx.comp_pkt.bytes);
8016*5113495bSYour Name 	DP_PRINT_STATS("Successful Completions:");
8017*5113495bSYour Name 	DP_PRINT_STATS("	Packets = %llu",
8018*5113495bSYour Name 		       pdev->stats.tx.tx_success.num);
8019*5113495bSYour Name 	DP_PRINT_STATS("	Bytes = %llu",
8020*5113495bSYour Name 		       pdev->stats.tx.tx_success.bytes);
8021*5113495bSYour Name 	DP_PRINT_STATS("Dropped:");
8022*5113495bSYour Name 	DP_PRINT_STATS("	Total = %llu",
8023*5113495bSYour Name 		       pdev->stats.tx_i.dropped.dropped_pkt.num);
8024*5113495bSYour Name 	DP_PRINT_STATS("	Dma_map_error = %u",
8025*5113495bSYour Name 		       pdev->stats.tx_i.dropped.dma_error);
8026*5113495bSYour Name 	DP_PRINT_STATS("	Ring Full = %u",
8027*5113495bSYour Name 		       pdev->stats.tx_i.dropped.ring_full);
8028*5113495bSYour Name 	DP_PRINT_STATS("	Descriptor Not available = %llu",
8029*5113495bSYour Name 		       pdev->stats.tx_i.dropped.desc_na.num);
8030*5113495bSYour Name 	DP_PRINT_STATS("	HW enqueue failed= %u",
8031*5113495bSYour Name 		       pdev->stats.tx_i.dropped.enqueue_fail);
8032*5113495bSYour Name 	DP_PRINT_STATS("        Descriptor alloc fail = %llu",
8033*5113495bSYour Name 		       pdev->stats.tx_i.dropped.desc_na_exc_alloc_fail.num);
8034*5113495bSYour Name 	DP_PRINT_STATS("        Tx outstanding too many = %llu",
8035*5113495bSYour Name 		       pdev->stats.tx_i.dropped.desc_na_exc_outstand.num);
8036*5113495bSYour Name 	DP_PRINT_STATS("	Pkt dropped in vdev-id check= %u",
8037*5113495bSYour Name 		       pdev->stats.tx_i.dropped.fail_per_pkt_vdev_id_check);
8038*5113495bSYour Name 	DP_PRINT_STATS("	Resources Full = %u",
8039*5113495bSYour Name 		       pdev->stats.tx_i.dropped.res_full);
8040*5113495bSYour Name 	DP_PRINT_STATS("	Drop Ingress = %u",
8041*5113495bSYour Name 		       pdev->stats.tx_i.dropped.drop_ingress);
8042*5113495bSYour Name 	DP_PRINT_STATS("	invalid peer id in exception path = %u",
8043*5113495bSYour Name 		       pdev->stats.tx_i.dropped.invalid_peer_id_in_exc_path);
8044*5113495bSYour Name 	DP_PRINT_STATS("	Tx Mcast Drop = %u",
8045*5113495bSYour Name 		       pdev->stats.tx_i.dropped.tx_mcast_drop);
8046*5113495bSYour Name 	DP_PRINT_STATS("	PPE-DS FW2WBM Tx Drop = %u",
8047*5113495bSYour Name 		       pdev->stats.tx_i.dropped.fw2wbm_tx_drop);
8048*5113495bSYour Name 	DP_PRINT_STATS("Tx failed = %u",
8049*5113495bSYour Name 		       pdev->stats.tx.tx_failed);
8050*5113495bSYour Name 	DP_PRINT_STATS("	FW removed Pkts = %llu",
8051*5113495bSYour Name 		       pdev->stats.tx.dropped.fw_rem.num);
8052*5113495bSYour Name 	DP_PRINT_STATS("	FW removed bytes= %llu",
8053*5113495bSYour Name 		       pdev->stats.tx.dropped.fw_rem.bytes);
8054*5113495bSYour Name 	DP_PRINT_STATS("	FW removed transmitted = %u",
8055*5113495bSYour Name 		       pdev->stats.tx.dropped.fw_rem_tx);
8056*5113495bSYour Name 	DP_PRINT_STATS("	FW removed untransmitted = %u",
8057*5113495bSYour Name 		       pdev->stats.tx.dropped.fw_rem_notx);
8058*5113495bSYour Name 	DP_PRINT_STATS("	FW removed untransmitted fw_reason1 = %u",
8059*5113495bSYour Name 		       pdev->stats.tx.dropped.fw_reason1);
8060*5113495bSYour Name 	DP_PRINT_STATS("	FW removed untransmitted fw_reason2 = %u",
8061*5113495bSYour Name 		       pdev->stats.tx.dropped.fw_reason2);
8062*5113495bSYour Name 	DP_PRINT_STATS("	FW removed untransmitted fw_reason3 = %u",
8063*5113495bSYour Name 		       pdev->stats.tx.dropped.fw_reason3);
8064*5113495bSYour Name 	DP_PRINT_STATS("	FW removed untransmitted disable queue = %u",
8065*5113495bSYour Name 		       pdev->stats.tx.dropped.fw_rem_queue_disable);
8066*5113495bSYour Name 	DP_PRINT_STATS("	FW removed untransmitted no match = %u",
8067*5113495bSYour Name 		       pdev->stats.tx.dropped.fw_rem_no_match);
8068*5113495bSYour Name 	DP_PRINT_STATS("	Dropped due to HW threshold criteria = %u",
8069*5113495bSYour Name 		       pdev->stats.tx.dropped.drop_threshold);
8070*5113495bSYour Name 	DP_PRINT_STATS("	Link desc not available drop = %u",
8071*5113495bSYour Name 		       pdev->stats.tx.dropped.drop_link_desc_na);
8072*5113495bSYour Name 	DP_PRINT_STATS("	Drop bit set or invalid flow = %u",
8073*5113495bSYour Name 		       pdev->stats.tx.dropped.invalid_drop);
8074*5113495bSYour Name 	DP_PRINT_STATS("	MCAST vdev drop in HW = %u",
8075*5113495bSYour Name 		       pdev->stats.tx.dropped.mcast_vdev_drop);
8076*5113495bSYour Name 	DP_PRINT_STATS("	Dropped with invalid reason = %u",
8077*5113495bSYour Name 		       pdev->stats.tx.dropped.invalid_rr);
8078*5113495bSYour Name 	DP_PRINT_STATS("	Aged Out from msdu/mpdu queues = %u",
8079*5113495bSYour Name 		       pdev->stats.tx.dropped.age_out);
8080*5113495bSYour Name 	DP_PRINT_STATS("	headroom insufficient = %u",
8081*5113495bSYour Name 		       pdev->stats.tx_i.dropped.headroom_insufficient);
8082*5113495bSYour Name 	DP_PRINT_STATS("Multicast:");
8083*5113495bSYour Name 	DP_PRINT_STATS("	Packets: %llu",
8084*5113495bSYour Name 		       pdev->stats.tx.mcast.num);
8085*5113495bSYour Name 	DP_PRINT_STATS("	Bytes: %llu",
8086*5113495bSYour Name 		       pdev->stats.tx.mcast.bytes);
8087*5113495bSYour Name 	DP_PRINT_STATS("Scatter Gather:");
8088*5113495bSYour Name 	DP_PRINT_STATS("	Packets = %llu",
8089*5113495bSYour Name 		       pdev->stats.tx_i.sg.sg_pkt.num);
8090*5113495bSYour Name 	DP_PRINT_STATS("	Bytes = %llu",
8091*5113495bSYour Name 		       pdev->stats.tx_i.sg.sg_pkt.bytes);
8092*5113495bSYour Name 	DP_PRINT_STATS("	Dropped By Host = %llu",
8093*5113495bSYour Name 		       pdev->stats.tx_i.sg.dropped_host.num);
8094*5113495bSYour Name 	DP_PRINT_STATS("	Dropped By Target = %u",
8095*5113495bSYour Name 		       pdev->stats.tx_i.sg.dropped_target);
8096*5113495bSYour Name 	DP_PRINT_STATS("Mcast Enhancement:");
8097*5113495bSYour Name 	DP_PRINT_STATS("	Packets = %llu",
8098*5113495bSYour Name 		       pdev->stats.tx_i.mcast_en.mcast_pkt.num);
8099*5113495bSYour Name 	DP_PRINT_STATS("	Bytes = %llu",
8100*5113495bSYour Name 		       pdev->stats.tx_i.mcast_en.mcast_pkt.bytes);
8101*5113495bSYour Name 	DP_PRINT_STATS("	Dropped: Map Errors = %u",
8102*5113495bSYour Name 		       pdev->stats.tx_i.mcast_en.dropped_map_error);
8103*5113495bSYour Name 	DP_PRINT_STATS("	Dropped: Self Mac = %u",
8104*5113495bSYour Name 		       pdev->stats.tx_i.mcast_en.dropped_self_mac);
8105*5113495bSYour Name 	DP_PRINT_STATS("	Dropped: Send Fail = %u",
8106*5113495bSYour Name 		       pdev->stats.tx_i.mcast_en.dropped_send_fail);
8107*5113495bSYour Name 	DP_PRINT_STATS("	Unicast sent = %u",
8108*5113495bSYour Name 		       pdev->stats.tx_i.mcast_en.ucast);
8109*5113495bSYour Name 
8110*5113495bSYour Name 	DP_PRINT_STATS("EAPOL Packets dropped:");
8111*5113495bSYour Name 	DP_PRINT_STATS("        Dropped: TX desc errors = %u",
8112*5113495bSYour Name 		       pdev->stats.eap_drop_stats.tx_desc_err);
8113*5113495bSYour Name 	DP_PRINT_STATS("        Dropped: Tx HAL ring access errors = %u",
8114*5113495bSYour Name 		       pdev->stats.eap_drop_stats.tx_hal_ring_access_err);
8115*5113495bSYour Name 	DP_PRINT_STATS("        Dropped: TX DMA map errors = %u",
8116*5113495bSYour Name 		       pdev->stats.eap_drop_stats.tx_dma_map_err);
8117*5113495bSYour Name 	DP_PRINT_STATS("        Dropped: Tx HW enqueue errors = %u",
8118*5113495bSYour Name 		       pdev->stats.eap_drop_stats.tx_hw_enqueue);
8119*5113495bSYour Name 	DP_PRINT_STATS("        Dropped: TX SW enqueue errors= %u",
8120*5113495bSYour Name 		       pdev->stats.eap_drop_stats.tx_sw_enqueue);
8121*5113495bSYour Name 
8122*5113495bSYour Name 	DP_PRINT_STATS("IGMP Mcast Enhancement:");
8123*5113495bSYour Name 	DP_PRINT_STATS("	IGMP packets received = %u",
8124*5113495bSYour Name 		       pdev->stats.tx_i.igmp_mcast_en.igmp_rcvd);
8125*5113495bSYour Name 	DP_PRINT_STATS("	Converted to uncast = %u",
8126*5113495bSYour Name 		       pdev->stats.tx_i.igmp_mcast_en.igmp_ucast_converted);
8127*5113495bSYour Name 	DP_PRINT_STATS("Raw:");
8128*5113495bSYour Name 	DP_PRINT_STATS("	Packets = %llu",
8129*5113495bSYour Name 		       pdev->stats.tx_i.raw.raw_pkt.num);
8130*5113495bSYour Name 	DP_PRINT_STATS("	Bytes = %llu",
8131*5113495bSYour Name 		       pdev->stats.tx_i.raw.raw_pkt.bytes);
8132*5113495bSYour Name 	DP_PRINT_STATS("	DMA map error = %u",
8133*5113495bSYour Name 		       pdev->stats.tx_i.raw.dma_map_error);
8134*5113495bSYour Name 	DP_PRINT_STATS("        RAW pkt type[!data] error = %u",
8135*5113495bSYour Name 		       pdev->stats.tx_i.raw.invalid_raw_pkt_datatype);
8136*5113495bSYour Name 	DP_PRINT_STATS("        Frags count overflow  error = %u",
8137*5113495bSYour Name 		       pdev->stats.tx_i.raw.num_frags_overflow_err);
8138*5113495bSYour Name 	DP_PRINT_STATS("Reinjected:");
8139*5113495bSYour Name 	DP_PRINT_STATS("	Packets = %llu",
8140*5113495bSYour Name 		       pdev->stats.tx_i.reinject_pkts.num);
8141*5113495bSYour Name 	DP_PRINT_STATS("	Bytes = %llu\n",
8142*5113495bSYour Name 		       pdev->stats.tx_i.reinject_pkts.bytes);
8143*5113495bSYour Name 	DP_PRINT_STATS("Inspected:");
8144*5113495bSYour Name 	DP_PRINT_STATS("	Packets = %llu",
8145*5113495bSYour Name 		       pdev->stats.tx_i.inspect_pkts.num);
8146*5113495bSYour Name 	DP_PRINT_STATS("	Bytes = %llu",
8147*5113495bSYour Name 		       pdev->stats.tx_i.inspect_pkts.bytes);
8148*5113495bSYour Name 	DP_PRINT_STATS("Nawds Multicast:");
8149*5113495bSYour Name 	DP_PRINT_STATS("	Packets = %llu",
8150*5113495bSYour Name 		       pdev->stats.tx_i.nawds_mcast.num);
8151*5113495bSYour Name 	DP_PRINT_STATS("	Bytes = %llu",
8152*5113495bSYour Name 		       pdev->stats.tx_i.nawds_mcast.bytes);
8153*5113495bSYour Name 	DP_PRINT_STATS("CCE Classified:");
8154*5113495bSYour Name 	DP_PRINT_STATS("	CCE Classified Packets: %u",
8155*5113495bSYour Name 		       pdev->stats.tx_i.cce_classified);
8156*5113495bSYour Name 	DP_PRINT_STATS("	RAW CCE Classified Packets: %u",
8157*5113495bSYour Name 		       pdev->stats.tx_i.cce_classified_raw);
8158*5113495bSYour Name 	DP_PRINT_STATS("Mesh stats:");
8159*5113495bSYour Name 	DP_PRINT_STATS("	frames to firmware: %u",
8160*5113495bSYour Name 		       pdev->stats.tx_i.mesh.exception_fw);
8161*5113495bSYour Name 	DP_PRINT_STATS("	completions from fw: %u",
8162*5113495bSYour Name 		       pdev->stats.tx_i.mesh.completion_fw);
8163*5113495bSYour Name 	DP_PRINT_STATS("PPDU stats counter");
8164*5113495bSYour Name 	for (index = 0; index < CDP_PPDU_STATS_MAX_TAG; index++) {
8165*5113495bSYour Name 		DP_PRINT_STATS("	Tag[%d] = %llu", index,
8166*5113495bSYour Name 			       pdev->stats.ppdu_stats_counter[index]);
8167*5113495bSYour Name 	}
8168*5113495bSYour Name 	DP_PRINT_STATS("BA not received for delayed_ba: %u",
8169*5113495bSYour Name 		       pdev->stats.cdp_delayed_ba_not_recev);
8170*5113495bSYour Name 
8171*5113495bSYour Name 	dp_monitor_print_tx_stats(pdev);
8172*5113495bSYour Name 
8173*5113495bSYour Name 	DP_PRINT_STATS("tx_ppdu_proc: %llu",
8174*5113495bSYour Name 		       pdev->stats.tx_ppdu_proc);
8175*5113495bSYour Name 	DP_PRINT_STATS("ack ba comes twice: %llu",
8176*5113495bSYour Name 		       pdev->stats.ack_ba_comes_twice);
8177*5113495bSYour Name 	DP_PRINT_STATS("ppdu dropped because of incomplete tlv: %llu",
8178*5113495bSYour Name 		       pdev->stats.ppdu_drop);
8179*5113495bSYour Name 	DP_PRINT_STATS("ppdu dropped because of wrap around: %llu",
8180*5113495bSYour Name 		       pdev->stats.ppdu_wrap_drop);
8181*5113495bSYour Name 
8182*5113495bSYour Name 	for (i = 0; i < CDP_WDI_NUM_EVENTS; i++) {
8183*5113495bSYour Name 		if (pdev->stats.wdi_event[i])
8184*5113495bSYour Name 			DP_PRINT_STATS("Wdi msgs received for event ID[%d]:%d",
8185*5113495bSYour Name 				       i, pdev->stats.wdi_event[i]);
8186*5113495bSYour Name 	}
8187*5113495bSYour Name 
8188*5113495bSYour Name 	dp_monitor_print_pdev_tx_capture_stats(pdev);
8189*5113495bSYour Name }
8190*5113495bSYour Name 
8191*5113495bSYour Name #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MCAST_MLO)
dp_print_vdev_mlo_mcast_tx_stats(struct dp_vdev * vdev)8192*5113495bSYour Name void dp_print_vdev_mlo_mcast_tx_stats(struct dp_vdev *vdev)
8193*5113495bSYour Name {
8194*5113495bSYour Name 	uint8_t idx;
8195*5113495bSYour Name 	uint32_t send_pkt_count = 0;
8196*5113495bSYour Name 	uint32_t fail_pkt_count = 0;
8197*5113495bSYour Name 
8198*5113495bSYour Name 	for (idx = 0; idx < DP_INGRESS_STATS_MAX_SIZE; idx++) {
8199*5113495bSYour Name 		send_pkt_count +=
8200*5113495bSYour Name 			vdev->stats.tx_i[idx].mlo_mcast.send_pkt_count;
8201*5113495bSYour Name 		fail_pkt_count +=
8202*5113495bSYour Name 			vdev->stats.tx_i[idx].mlo_mcast.fail_pkt_count;
8203*5113495bSYour Name 	}
8204*5113495bSYour Name 	DP_PRINT_STATS("MLO MCAST TX stats:");
8205*5113495bSYour Name 	DP_PRINT_STATS("	send packet count = %u", send_pkt_count);
8206*5113495bSYour Name 	DP_PRINT_STATS("	failed packet count = %u", fail_pkt_count);
8207*5113495bSYour Name }
8208*5113495bSYour Name #endif
8209*5113495bSYour Name 
8210*5113495bSYour Name #ifdef WLAN_SUPPORT_RX_FLOW_TAG
dp_rx_basic_fst_stats(struct dp_pdev * pdev)8211*5113495bSYour Name static inline void dp_rx_basic_fst_stats(struct dp_pdev *pdev)
8212*5113495bSYour Name {
8213*5113495bSYour Name 	DP_PRINT_STATS("\tNo of IPv4 Flow entries inserted = %d",
8214*5113495bSYour Name 		       qdf_atomic_read(&pdev->soc->ipv4_fse_cnt));
8215*5113495bSYour Name 	DP_PRINT_STATS("\tNo of IPv6 Flow entries inserted = %d",
8216*5113495bSYour Name 		       qdf_atomic_read(&pdev->soc->ipv6_fse_cnt));
8217*5113495bSYour Name }
8218*5113495bSYour Name #else
dp_rx_basic_fst_stats(struct dp_pdev * pdev)8219*5113495bSYour Name static inline void dp_rx_basic_fst_stats(struct dp_pdev *pdev)
8220*5113495bSYour Name {
8221*5113495bSYour Name }
8222*5113495bSYour Name #endif
8223*5113495bSYour Name 
8224*5113495bSYour Name void
dp_print_pdev_rx_stats(struct dp_pdev * pdev)8225*5113495bSYour Name dp_print_pdev_rx_stats(struct dp_pdev *pdev)
8226*5113495bSYour Name {
8227*5113495bSYour Name 	uint8_t i;
8228*5113495bSYour Name 
8229*5113495bSYour Name 	DP_PRINT_STATS("PDEV Rx Stats:\n");
8230*5113495bSYour Name 	DP_PRINT_STATS("Received From HW (Per Rx Ring):");
8231*5113495bSYour Name 	DP_PRINT_STATS("	Packets = %llu %llu %llu %llu",
8232*5113495bSYour Name 		       pdev->stats.rx.rcvd_reo[0].num,
8233*5113495bSYour Name 		       pdev->stats.rx.rcvd_reo[1].num,
8234*5113495bSYour Name 		       pdev->stats.rx.rcvd_reo[2].num,
8235*5113495bSYour Name 		       pdev->stats.rx.rcvd_reo[3].num);
8236*5113495bSYour Name 	DP_PRINT_STATS("	Bytes = %llu %llu %llu %llu",
8237*5113495bSYour Name 		       pdev->stats.rx.rcvd_reo[0].bytes,
8238*5113495bSYour Name 		       pdev->stats.rx.rcvd_reo[1].bytes,
8239*5113495bSYour Name 		       pdev->stats.rx.rcvd_reo[2].bytes,
8240*5113495bSYour Name 		       pdev->stats.rx.rcvd_reo[3].bytes);
8241*5113495bSYour Name 	for (i = 0; i < CDP_MAX_LMACS; i++)
8242*5113495bSYour Name 		DP_PRINT_STATS("Packets Received on lmac[%d] = %llu (%llu)",
8243*5113495bSYour Name 			       i, pdev->stats.rx.rx_lmac[i].num,
8244*5113495bSYour Name 			       pdev->stats.rx.rx_lmac[i].bytes);
8245*5113495bSYour Name 	DP_PRINT_STATS("Replenished:");
8246*5113495bSYour Name 	DP_PRINT_STATS("	Packets = %llu",
8247*5113495bSYour Name 		       pdev->stats.replenish.pkts.num);
8248*5113495bSYour Name 	DP_PRINT_STATS("	Buffers Added To Freelist = %u",
8249*5113495bSYour Name 		       pdev->stats.buf_freelist);
8250*5113495bSYour Name 	DP_PRINT_STATS("	Low threshold intr = %d",
8251*5113495bSYour Name 		       pdev->stats.replenish.low_thresh_intrs);
8252*5113495bSYour Name 	DP_PRINT_STATS("Dropped:");
8253*5113495bSYour Name 	DP_PRINT_STATS("	msdu_not_done = %u",
8254*5113495bSYour Name 		       pdev->stats.dropped.msdu_not_done);
8255*5113495bSYour Name 	DP_PRINT_STATS("        wifi parse = %u",
8256*5113495bSYour Name 		       pdev->stats.dropped.wifi_parse);
8257*5113495bSYour Name 	DP_PRINT_STATS("        mon_rx_drop = %u",
8258*5113495bSYour Name 		       pdev->stats.dropped.mon_rx_drop);
8259*5113495bSYour Name 	DP_PRINT_STATS("        mon_radiotap_update_err = %u",
8260*5113495bSYour Name 		       pdev->stats.dropped.mon_radiotap_update_err);
8261*5113495bSYour Name 	DP_PRINT_STATS("        mon_ver_err = %u",
8262*5113495bSYour Name 		       pdev->stats.dropped.mon_ver_err);
8263*5113495bSYour Name 	DP_PRINT_STATS("        mec_drop = %llu",
8264*5113495bSYour Name 		       pdev->stats.rx.mec_drop.num);
8265*5113495bSYour Name 	DP_PRINT_STATS("	Bytes = %llu",
8266*5113495bSYour Name 		       pdev->stats.rx.mec_drop.bytes);
8267*5113495bSYour Name 	DP_PRINT_STATS("	peer_unauth_drop = %u",
8268*5113495bSYour Name 		       pdev->stats.rx.peer_unauth_rx_pkt_drop);
8269*5113495bSYour Name 	DP_PRINT_STATS("	policy_check_drop = %u",
8270*5113495bSYour Name 		       pdev->stats.rx.policy_check_drop);
8271*5113495bSYour Name 	DP_PRINT_STATS("Sent To Stack:");
8272*5113495bSYour Name 	DP_PRINT_STATS("	Packets = %llu",
8273*5113495bSYour Name 		       pdev->stats.rx.to_stack.num);
8274*5113495bSYour Name 	DP_PRINT_STATS("	Bytes = %llu",
8275*5113495bSYour Name 		       pdev->stats.rx.to_stack.bytes);
8276*5113495bSYour Name 	DP_PRINT_STATS("        vlan_tag_stp_cnt = %u",
8277*5113495bSYour Name 		       pdev->stats.vlan_tag_stp_cnt);
8278*5113495bSYour Name 	DP_PRINT_STATS("Multicast/Broadcast:");
8279*5113495bSYour Name 	DP_PRINT_STATS("	Packets = %llu",
8280*5113495bSYour Name 		       pdev->stats.rx.multicast.num);
8281*5113495bSYour Name 	DP_PRINT_STATS("	Bytes = %llu",
8282*5113495bSYour Name 		       pdev->stats.rx.multicast.bytes);
8283*5113495bSYour Name 	DP_PRINT_STATS("Errors:");
8284*5113495bSYour Name 	DP_PRINT_STATS("	Rxdma Ring Un-inititalized = %u",
8285*5113495bSYour Name 		       pdev->stats.replenish.rxdma_err);
8286*5113495bSYour Name 	DP_PRINT_STATS("	Desc Alloc Failed: = %u",
8287*5113495bSYour Name 		       pdev->stats.err.desc_alloc_fail);
8288*5113495bSYour Name 	DP_PRINT_STATS("        Low threshold Desc Alloc Failed: = %u",
8289*5113495bSYour Name 		       pdev->stats.err.desc_lt_alloc_fail);
8290*5113495bSYour Name 	DP_PRINT_STATS("	IP checksum error = %u",
8291*5113495bSYour Name 		       pdev->stats.err.ip_csum_err);
8292*5113495bSYour Name 	DP_PRINT_STATS("	TCP/UDP checksum error = %u",
8293*5113495bSYour Name 		       pdev->stats.err.tcp_udp_csum_err);
8294*5113495bSYour Name 	DP_PRINT_STATS("	Failed frag alloc = %u",
8295*5113495bSYour Name 		       pdev->stats.replenish.frag_alloc_fail);
8296*5113495bSYour Name 
8297*5113495bSYour Name 	dp_pdev_iterate_peer_lock_safe(pdev, dp_peer_ctrl_frames_stats_get,
8298*5113495bSYour Name 				       NULL, DP_MOD_ID_GENERIC_STATS);
8299*5113495bSYour Name 
8300*5113495bSYour Name 	/* Get bar_recv_cnt */
8301*5113495bSYour Name 	DP_PRINT_STATS("BAR Received Count: = %u",
8302*5113495bSYour Name 		       pdev->stats.rx.bar_recv_cnt);
8303*5113495bSYour Name 
8304*5113495bSYour Name 	DP_PRINT_STATS("RX Buffer Pool Stats:\n");
8305*5113495bSYour Name 	DP_PRINT_STATS("\tBuffers consumed during refill = %llu",
8306*5113495bSYour Name 		       pdev->stats.rx_buffer_pool.num_bufs_consumed);
8307*5113495bSYour Name 	DP_PRINT_STATS("\tSuccessful allocations during refill = %llu",
8308*5113495bSYour Name 		       pdev->stats.rx_buffer_pool.num_bufs_alloc_success);
8309*5113495bSYour Name 	DP_PRINT_STATS("\tAllocations from the pool during replenish = %llu",
8310*5113495bSYour Name 		       pdev->stats.rx_buffer_pool.num_pool_bufs_replenish);
8311*5113495bSYour Name 
8312*5113495bSYour Name 	DP_PRINT_STATS("Invalid MSDU count = %u",
8313*5113495bSYour Name 		       pdev->stats.invalid_msdu_cnt);
8314*5113495bSYour Name 
8315*5113495bSYour Name 	dp_rx_basic_fst_stats(pdev);
8316*5113495bSYour Name }
8317*5113495bSYour Name 
8318*5113495bSYour Name #ifdef WLAN_SUPPORT_PPEDS
dp_print_tx_ppeds_stats(struct dp_soc * soc)8319*5113495bSYour Name void dp_print_tx_ppeds_stats(struct dp_soc *soc)
8320*5113495bSYour Name {
8321*5113495bSYour Name 	if (soc->arch_ops.dp_tx_ppeds_inuse_desc)
8322*5113495bSYour Name 		soc->arch_ops.dp_tx_ppeds_inuse_desc(soc);
8323*5113495bSYour Name 
8324*5113495bSYour Name 	DP_PRINT_STATS("PPE-DS Tx desc fw2wbm_tx_drop %u",
8325*5113495bSYour Name 		       soc->stats.tx.fw2wbm_tx_drop);
8326*5113495bSYour Name 
8327*5113495bSYour Name 	if (soc->arch_ops.dp_txrx_ppeds_rings_stats)
8328*5113495bSYour Name 		soc->arch_ops.dp_txrx_ppeds_rings_stats(soc);
8329*5113495bSYour Name }
8330*5113495bSYour Name #else
dp_print_tx_ppeds_stats(struct dp_soc * soc)8331*5113495bSYour Name void dp_print_tx_ppeds_stats(struct dp_soc *soc)
8332*5113495bSYour Name {
8333*5113495bSYour Name }
8334*5113495bSYour Name #endif
8335*5113495bSYour Name 
8336*5113495bSYour Name #ifdef QCA_SUPPORT_DP_GLOBAL_CTX
dp_print_global_desc_count(void)8337*5113495bSYour Name void dp_print_global_desc_count(void)
8338*5113495bSYour Name {
8339*5113495bSYour Name 	struct dp_global_context *dp_global;
8340*5113495bSYour Name 
8341*5113495bSYour Name 	dp_global = wlan_objmgr_get_global_ctx();
8342*5113495bSYour Name 
8343*5113495bSYour Name 	DP_PRINT_STATS("Global Tx Descriptors in use = %u",
8344*5113495bSYour Name 		       dp_tx_get_global_desc_in_use(dp_global));
8345*5113495bSYour Name }
8346*5113495bSYour Name #endif
8347*5113495bSYour Name 
8348*5113495bSYour Name #ifdef WLAN_DP_SRNG_USAGE_WM_TRACKING
8349*5113495bSYour Name #define DP_SRNG_HIGH_WM_STATS_STRING_LEN 512
dp_dump_srng_high_wm_stats(struct dp_soc * soc,uint64_t srng_mask)8350*5113495bSYour Name void dp_dump_srng_high_wm_stats(struct dp_soc *soc, uint64_t srng_mask)
8351*5113495bSYour Name {
8352*5113495bSYour Name 	char *buf;
8353*5113495bSYour Name 	int ring, pos, buf_len;
8354*5113495bSYour Name 	char srng_high_wm_str[DP_SRNG_HIGH_WM_STATS_STRING_LEN] = {'\0'};
8355*5113495bSYour Name 
8356*5113495bSYour Name 	if (!srng_mask)
8357*5113495bSYour Name 		return;
8358*5113495bSYour Name 
8359*5113495bSYour Name 	buf = srng_high_wm_str;
8360*5113495bSYour Name 	buf_len = DP_SRNG_HIGH_WM_STATS_STRING_LEN;
8361*5113495bSYour Name 
8362*5113495bSYour Name 	dp_info("%8s %7s %12s %10s %10s %10s %10s %10s %10s",
8363*5113495bSYour Name 		"ring_id", "high_wm", "time", "<50", "50-60", "60-70",
8364*5113495bSYour Name 		"70-80", "80-90", "90-100");
8365*5113495bSYour Name 
8366*5113495bSYour Name 	if (srng_mask & DP_SRNG_WM_MASK_REO_DST) {
8367*5113495bSYour Name 		for (ring = 0; ring < soc->num_reo_dest_rings; ring++) {
8368*5113495bSYour Name 			pos = 0;
8369*5113495bSYour Name 			pos += hal_dump_srng_high_wm_stats(soc->hal_soc,
8370*5113495bSYour Name 					    soc->reo_dest_ring[ring].hal_srng,
8371*5113495bSYour Name 					    buf, buf_len, pos);
8372*5113495bSYour Name 			dp_info("%s", srng_high_wm_str);
8373*5113495bSYour Name 		}
8374*5113495bSYour Name 	}
8375*5113495bSYour Name 
8376*5113495bSYour Name 	if (srng_mask & DP_SRNG_WM_MASK_TX_COMP) {
8377*5113495bSYour Name 		for (ring = 0; ring < soc->num_tcl_data_rings; ring++) {
8378*5113495bSYour Name 			if (wlan_cfg_get_wbm_ring_num_for_index(
8379*5113495bSYour Name 						soc->wlan_cfg_ctx, ring) ==
8380*5113495bSYour Name 			    INVALID_WBM_RING_NUM)
8381*5113495bSYour Name 				continue;
8382*5113495bSYour Name 
8383*5113495bSYour Name 			pos = 0;
8384*5113495bSYour Name 			pos += hal_dump_srng_high_wm_stats(soc->hal_soc,
8385*5113495bSYour Name 					soc->tx_comp_ring[ring].hal_srng,
8386*5113495bSYour Name 					buf, buf_len, pos);
8387*5113495bSYour Name 			dp_info("%s", srng_high_wm_str);
8388*5113495bSYour Name 		}
8389*5113495bSYour Name 	}
8390*5113495bSYour Name }
8391*5113495bSYour Name #endif
8392*5113495bSYour Name 
8393*5113495bSYour Name #ifdef GLOBAL_ASSERT_AVOIDANCE
dp_print_assert_war_stats(struct dp_soc * soc)8394*5113495bSYour Name static void dp_print_assert_war_stats(struct dp_soc *soc)
8395*5113495bSYour Name {
8396*5113495bSYour Name 	DP_PRINT_STATS("Rx WAR stats: [%d] [%d] [%d] [%d]",
8397*5113495bSYour Name 		       soc->stats.rx.err.rx_desc_null,
8398*5113495bSYour Name 		       soc->stats.rx.err.wbm_err_buf_rel_type,
8399*5113495bSYour Name 		       soc->stats.rx.err.reo_err_rx_desc_null,
8400*5113495bSYour Name 		       soc->stats.rx.err.intra_bss_bad_chipid);
8401*5113495bSYour Name }
8402*5113495bSYour Name #else
dp_print_assert_war_stats(struct dp_soc * soc)8403*5113495bSYour Name static void dp_print_assert_war_stats(struct dp_soc *soc)
8404*5113495bSYour Name {
8405*5113495bSYour Name }
8406*5113495bSYour Name #endif
8407*5113495bSYour Name void
dp_print_soc_rx_stats(struct dp_soc * soc)8408*5113495bSYour Name dp_print_soc_rx_stats(struct dp_soc *soc)
8409*5113495bSYour Name {
8410*5113495bSYour Name 	uint32_t i;
8411*5113495bSYour Name 	char reo_error[DP_REO_ERR_LENGTH];
8412*5113495bSYour Name 	char rxdma_error[DP_RXDMA_ERR_LENGTH];
8413*5113495bSYour Name 	uint8_t index = 0;
8414*5113495bSYour Name 
8415*5113495bSYour Name 	DP_PRINT_STATS("No of AST Entries = %d", soc->num_ast_entries);
8416*5113495bSYour Name 	DP_PRINT_STATS("SOC Rx Stats:\n");
8417*5113495bSYour Name 	DP_PRINT_STATS("Fast recycled packets: %llu",
8418*5113495bSYour Name 		       soc->stats.rx.fast_recycled);
8419*5113495bSYour Name 	DP_PRINT_STATS("Fragmented packets: %u",
8420*5113495bSYour Name 		       soc->stats.rx.rx_frags);
8421*5113495bSYour Name 	DP_PRINT_STATS("Reo reinjected packets: %u",
8422*5113495bSYour Name 		       soc->stats.rx.reo_reinject);
8423*5113495bSYour Name 	DP_PRINT_STATS("Errors:\n");
8424*5113495bSYour Name 	DP_PRINT_STATS("Rx Decrypt Errors = %d",
8425*5113495bSYour Name 		       (soc->stats.rx.err.rxdma_error[HAL_RXDMA_ERR_DECRYPT] +
8426*5113495bSYour Name 		       soc->stats.rx.err.rxdma_error[HAL_RXDMA_ERR_TKIP_MIC]));
8427*5113495bSYour Name 	DP_PRINT_STATS("Invalid RBM = %d",
8428*5113495bSYour Name 		       soc->stats.rx.err.invalid_rbm);
8429*5113495bSYour Name 	DP_PRINT_STATS("Invalid Vdev = %d",
8430*5113495bSYour Name 		       soc->stats.rx.err.invalid_vdev);
8431*5113495bSYour Name 	DP_PRINT_STATS("Invalid sa_idx or da_idx = %d",
8432*5113495bSYour Name 		       soc->stats.rx.err.invalid_sa_da_idx);
8433*5113495bSYour Name 	DP_PRINT_STATS("Defrag peer uninit = %d",
8434*5113495bSYour Name 		       soc->stats.rx.err.defrag_peer_uninit);
8435*5113495bSYour Name 	DP_PRINT_STATS("Pkts delivered no peer = %d",
8436*5113495bSYour Name 		       soc->stats.rx.err.pkt_delivered_no_peer);
8437*5113495bSYour Name 	DP_PRINT_STATS("Invalid Pdev = %d",
8438*5113495bSYour Name 		       soc->stats.rx.err.invalid_pdev);
8439*5113495bSYour Name 	DP_PRINT_STATS("Invalid Peer = %llu",
8440*5113495bSYour Name 		       soc->stats.rx.err.rx_invalid_peer.num);
8441*5113495bSYour Name 	DP_PRINT_STATS("HAL Ring Access Fail = %d",
8442*5113495bSYour Name 		       soc->stats.rx.err.hal_ring_access_fail);
8443*5113495bSYour Name 	DP_PRINT_STATS("HAL Ring Access Full Fail = %d",
8444*5113495bSYour Name 		       soc->stats.rx.err.hal_ring_access_full_fail);
8445*5113495bSYour Name 	DP_PRINT_STATS("MSDU Done failures = %d",
8446*5113495bSYour Name 		       soc->stats.rx.err.msdu_done_fail);
8447*5113495bSYour Name 	DP_PRINT_STATS("RX frags: %d", soc->stats.rx.rx_frags);
8448*5113495bSYour Name 	DP_PRINT_STATS("RX frag wait: %d", soc->stats.rx.rx_frag_wait);
8449*5113495bSYour Name 	DP_PRINT_STATS("RX frag err: %d", soc->stats.rx.rx_frag_err);
8450*5113495bSYour Name 	DP_PRINT_STATS("RX frag OOR: %d", soc->stats.rx.rx_frag_oor);
8451*5113495bSYour Name 
8452*5113495bSYour Name 	DP_PRINT_STATS("RX HP out_of_sync: %d", soc->stats.rx.hp_oos2);
8453*5113495bSYour Name 	DP_PRINT_STATS("RX Ring Near Full: %d", soc->stats.rx.near_full);
8454*5113495bSYour Name 
8455*5113495bSYour Name 	DP_PRINT_STATS("RX Reap Loop Pkt Limit Hit: %d",
8456*5113495bSYour Name 		       soc->stats.rx.reap_loop_pkt_limit_hit);
8457*5113495bSYour Name 	DP_PRINT_STATS("RX DESC invalid magic: %u",
8458*5113495bSYour Name 		       soc->stats.rx.err.rx_desc_invalid_magic);
8459*5113495bSYour Name 	DP_PRINT_STATS("RX DUP DESC: %d",
8460*5113495bSYour Name 		       soc->stats.rx.err.hal_reo_dest_dup);
8461*5113495bSYour Name 	DP_PRINT_STATS("RX REL DUP DESC: %d",
8462*5113495bSYour Name 		       soc->stats.rx.err.hal_wbm_rel_dup);
8463*5113495bSYour Name 
8464*5113495bSYour Name 	DP_PRINT_STATS("RXDMA ERR DUP DESC: %d",
8465*5113495bSYour Name 		       soc->stats.rx.err.hal_rxdma_err_dup);
8466*5113495bSYour Name 
8467*5113495bSYour Name 	DP_PRINT_STATS("RX scatter msdu: %d",
8468*5113495bSYour Name 		       soc->stats.rx.err.scatter_msdu);
8469*5113495bSYour Name 
8470*5113495bSYour Name 	DP_PRINT_STATS("RX invalid cookie: %d",
8471*5113495bSYour Name 		       soc->stats.rx.err.invalid_cookie);
8472*5113495bSYour Name 
8473*5113495bSYour Name 	DP_PRINT_STATS("RX stale cookie: %d",
8474*5113495bSYour Name 		       soc->stats.rx.err.stale_cookie);
8475*5113495bSYour Name 
8476*5113495bSYour Name 	DP_PRINT_STATS("RX wait completed msdu break: %d",
8477*5113495bSYour Name 		       soc->stats.rx.msdu_scatter_wait_break);
8478*5113495bSYour Name 
8479*5113495bSYour Name 	DP_PRINT_STATS("2k jump delba sent: %d",
8480*5113495bSYour Name 		       soc->stats.rx.err.rx_2k_jump_delba_sent);
8481*5113495bSYour Name 
8482*5113495bSYour Name 	DP_PRINT_STATS("2k jump msdu to stack: %d",
8483*5113495bSYour Name 		       soc->stats.rx.err.rx_2k_jump_to_stack);
8484*5113495bSYour Name 
8485*5113495bSYour Name 	DP_PRINT_STATS("2k jump msdu drop: %d",
8486*5113495bSYour Name 		       soc->stats.rx.err.rx_2k_jump_drop);
8487*5113495bSYour Name 
8488*5113495bSYour Name 	DP_PRINT_STATS("REO err oor msdu to stack %d",
8489*5113495bSYour Name 		       soc->stats.rx.err.reo_err_oor_to_stack);
8490*5113495bSYour Name 
8491*5113495bSYour Name 	DP_PRINT_STATS("REO err oor msdu drop: %d",
8492*5113495bSYour Name 		       soc->stats.rx.err.reo_err_oor_drop);
8493*5113495bSYour Name 
8494*5113495bSYour Name 	DP_PRINT_STATS("Rx err msdu rejected: %d",
8495*5113495bSYour Name 		       soc->stats.rx.err.rejected);
8496*5113495bSYour Name 
8497*5113495bSYour Name 	DP_PRINT_STATS("Rx stale link desc cookie: %d",
8498*5113495bSYour Name 		       soc->stats.rx.err.invalid_link_cookie);
8499*5113495bSYour Name 
8500*5113495bSYour Name 	DP_PRINT_STATS("Rx nbuf sanity fail: %d",
8501*5113495bSYour Name 		       soc->stats.rx.err.nbuf_sanity_fail);
8502*5113495bSYour Name 
8503*5113495bSYour Name 	DP_PRINT_STATS("Rx err msdu continuation err: %d",
8504*5113495bSYour Name 		       soc->stats.rx.err.msdu_continuation_err);
8505*5113495bSYour Name 
8506*5113495bSYour Name 	DP_PRINT_STATS("ssn update count: %d",
8507*5113495bSYour Name 		       soc->stats.rx.err.ssn_update_count);
8508*5113495bSYour Name 
8509*5113495bSYour Name 	DP_PRINT_STATS("bar handle update fail count: %d",
8510*5113495bSYour Name 		       soc->stats.rx.err.bar_handle_fail_count);
8511*5113495bSYour Name 
8512*5113495bSYour Name 	DP_PRINT_STATS("PN-in-Dest error frame pn-check fail: %d",
8513*5113495bSYour Name 		       soc->stats.rx.err.pn_in_dest_check_fail);
8514*5113495bSYour Name 
8515*5113495bSYour Name 	for (i = 0; i < HAL_RXDMA_ERR_MAX; i++) {
8516*5113495bSYour Name 		index += qdf_snprint(&rxdma_error[index],
8517*5113495bSYour Name 				DP_RXDMA_ERR_LENGTH - index,
8518*5113495bSYour Name 				" %d", soc->stats.rx.err.rxdma_error[i]);
8519*5113495bSYour Name 	}
8520*5113495bSYour Name 	DP_PRINT_STATS("RXDMA Error (0-31):%s", rxdma_error);
8521*5113495bSYour Name 
8522*5113495bSYour Name 	index = 0;
8523*5113495bSYour Name 	for (i = 0; i < HAL_REO_ERR_MAX; i++) {
8524*5113495bSYour Name 		index += qdf_snprint(&reo_error[index],
8525*5113495bSYour Name 				DP_REO_ERR_LENGTH - index,
8526*5113495bSYour Name 				" %d", soc->stats.rx.err.reo_error[i]);
8527*5113495bSYour Name 	}
8528*5113495bSYour Name 	DP_PRINT_STATS("REO Error(0-14):%s", reo_error);
8529*5113495bSYour Name 	DP_PRINT_STATS("REO CMD SEND FAIL: %d",
8530*5113495bSYour Name 		       soc->stats.rx.err.reo_cmd_send_fail);
8531*5113495bSYour Name 
8532*5113495bSYour Name 	DP_PRINT_STATS("Rx BAR frames:%d", soc->stats.rx.bar_frame);
8533*5113495bSYour Name 	DP_PRINT_STATS("Rxdma2rel route drop:%d",
8534*5113495bSYour Name 		       soc->stats.rx.rxdma2rel_route_drop);
8535*5113495bSYour Name 	DP_PRINT_STATS("Reo2rel route drop:%d",
8536*5113495bSYour Name 		       soc->stats.rx.reo2rel_route_drop);
8537*5113495bSYour Name 	DP_PRINT_STATS("Rx Flush count:%d", soc->stats.rx.err.rx_flush_count);
8538*5113495bSYour Name 	DP_PRINT_STATS("RX HW stats request count:%d",
8539*5113495bSYour Name 		       soc->stats.rx.rx_hw_stats_requested);
8540*5113495bSYour Name 	DP_PRINT_STATS("RX HW stats request timeout:%d",
8541*5113495bSYour Name 		       soc->stats.rx.rx_hw_stats_timeout);
8542*5113495bSYour Name 	DP_PRINT_STATS("Rx invalid TID count:%d",
8543*5113495bSYour Name 		       soc->stats.rx.err.rx_invalid_tid_err);
8544*5113495bSYour Name 	DP_PRINT_STATS("Rx Defrag Address1 Invalid:%d",
8545*5113495bSYour Name 		       soc->stats.rx.err.defrag_ad1_invalid);
8546*5113495bSYour Name 	DP_PRINT_STATS("Rx decrypt error frame for valid peer:%d",
8547*5113495bSYour Name 		       soc->stats.rx.err.decrypt_err_drop);
8548*5113495bSYour Name 	dp_print_assert_war_stats(soc);
8549*5113495bSYour Name }
8550*5113495bSYour Name 
8551*5113495bSYour Name #ifdef FEATURE_TSO_STATS
dp_print_tso_stats(struct dp_soc * soc,enum qdf_stats_verbosity_level level)8552*5113495bSYour Name void dp_print_tso_stats(struct dp_soc *soc,
8553*5113495bSYour Name 			enum qdf_stats_verbosity_level level)
8554*5113495bSYour Name {
8555*5113495bSYour Name 	uint8_t loop_pdev;
8556*5113495bSYour Name 	uint32_t id;
8557*5113495bSYour Name 	struct dp_pdev *pdev;
8558*5113495bSYour Name 
8559*5113495bSYour Name 	for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) {
8560*5113495bSYour Name 		pdev = soc->pdev_list[loop_pdev];
8561*5113495bSYour Name 		DP_PRINT_STATS("TSO Statistics\n");
8562*5113495bSYour Name 		DP_PRINT_STATS(
8563*5113495bSYour Name 			  "From stack: %llu | Successful completions: %llu | TSO Packets: %llu | TSO Completions: %d",
8564*5113495bSYour Name 			  pdev->stats.tx_i.rcvd.num,
8565*5113495bSYour Name 			  pdev->stats.tx.tx_success.num,
8566*5113495bSYour Name 			  pdev->stats.tso_stats.num_tso_pkts.num,
8567*5113495bSYour Name 			  pdev->stats.tso_stats.tso_comp);
8568*5113495bSYour Name 
8569*5113495bSYour Name 		for (id = 0; id < CDP_MAX_TSO_PACKETS; id++) {
8570*5113495bSYour Name 			/* TSO LEVEL 1 - PACKET INFO */
8571*5113495bSYour Name 			DP_PRINT_STATS(
8572*5113495bSYour Name 				  "Packet_Id:[%u]: Packet Length %zu | No. of segments: %u",
8573*5113495bSYour Name 				  id,
8574*5113495bSYour Name 				  pdev->stats.tso_stats.tso_info
8575*5113495bSYour Name 				  .tso_packet_info[id].tso_packet_len,
8576*5113495bSYour Name 				  pdev->stats.tso_stats.tso_info
8577*5113495bSYour Name 				  .tso_packet_info[id].num_seg);
8578*5113495bSYour Name 			/* TSO LEVEL 2 */
8579*5113495bSYour Name 			if (level == QDF_STATS_VERBOSITY_LEVEL_HIGH)
8580*5113495bSYour Name 				dp_print_tso_seg_stats(pdev, id);
8581*5113495bSYour Name 		}
8582*5113495bSYour Name 
8583*5113495bSYour Name 		DP_PRINT_STATS(
8584*5113495bSYour Name 			  "TSO Histogram: Single: %llu | 2-5 segs: %llu | 6-10: %llu segs | 11-15 segs: %llu | 16-20 segs: %llu | 20+ segs: %llu",
8585*5113495bSYour Name 			  pdev->stats.tso_stats.seg_histogram.segs_1,
8586*5113495bSYour Name 			  pdev->stats.tso_stats.seg_histogram.segs_2_5,
8587*5113495bSYour Name 			  pdev->stats.tso_stats.seg_histogram.segs_6_10,
8588*5113495bSYour Name 			  pdev->stats.tso_stats.seg_histogram.segs_11_15,
8589*5113495bSYour Name 			  pdev->stats.tso_stats.seg_histogram.segs_16_20,
8590*5113495bSYour Name 			  pdev->stats.tso_stats.seg_histogram.segs_20_plus);
8591*5113495bSYour Name 	}
8592*5113495bSYour Name }
8593*5113495bSYour Name 
dp_stats_tso_segment_histogram_update(struct dp_pdev * pdev,uint8_t _p_cntrs)8594*5113495bSYour Name void dp_stats_tso_segment_histogram_update(struct dp_pdev *pdev,
8595*5113495bSYour Name 					   uint8_t _p_cntrs)
8596*5113495bSYour Name {
8597*5113495bSYour Name 	if (_p_cntrs == 1) {
8598*5113495bSYour Name 		DP_STATS_INC(pdev,
8599*5113495bSYour Name 			     tso_stats.seg_histogram.segs_1, 1);
8600*5113495bSYour Name 	} else if (_p_cntrs >= 2 && _p_cntrs <= 5) {
8601*5113495bSYour Name 		DP_STATS_INC(pdev,
8602*5113495bSYour Name 			     tso_stats.seg_histogram.segs_2_5, 1);
8603*5113495bSYour Name 	} else if (_p_cntrs > 5 && _p_cntrs <= 10) {
8604*5113495bSYour Name 		DP_STATS_INC(pdev,
8605*5113495bSYour Name 			     tso_stats.seg_histogram.segs_6_10, 1);
8606*5113495bSYour Name 	} else if (_p_cntrs > 10 && _p_cntrs <= 15) {
8607*5113495bSYour Name 		DP_STATS_INC(pdev,
8608*5113495bSYour Name 			     tso_stats.seg_histogram.segs_11_15, 1);
8609*5113495bSYour Name 	} else if (_p_cntrs > 15 && _p_cntrs <= 20) {
8610*5113495bSYour Name 		DP_STATS_INC(pdev,
8611*5113495bSYour Name 			     tso_stats.seg_histogram.segs_16_20, 1);
8612*5113495bSYour Name 	} else if (_p_cntrs > 20) {
8613*5113495bSYour Name 		DP_STATS_INC(pdev,
8614*5113495bSYour Name 			     tso_stats.seg_histogram.segs_20_plus, 1);
8615*5113495bSYour Name 	}
8616*5113495bSYour Name }
8617*5113495bSYour Name 
dp_tso_segment_update(struct dp_pdev * pdev,uint32_t stats_idx,uint8_t idx,struct qdf_tso_seg_t seg)8618*5113495bSYour Name void dp_tso_segment_update(struct dp_pdev *pdev,
8619*5113495bSYour Name 			   uint32_t stats_idx,
8620*5113495bSYour Name 			   uint8_t idx,
8621*5113495bSYour Name 			   struct qdf_tso_seg_t seg)
8622*5113495bSYour Name {
8623*5113495bSYour Name 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8624*5113495bSYour Name 		     .tso_seg[idx].num_frags,
8625*5113495bSYour Name 		     seg.num_frags);
8626*5113495bSYour Name 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8627*5113495bSYour Name 		     .tso_seg[idx].total_len,
8628*5113495bSYour Name 		     seg.total_len);
8629*5113495bSYour Name 
8630*5113495bSYour Name 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8631*5113495bSYour Name 		     .tso_seg[idx].tso_flags.tso_enable,
8632*5113495bSYour Name 		     seg.tso_flags.tso_enable);
8633*5113495bSYour Name 
8634*5113495bSYour Name 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8635*5113495bSYour Name 		     .tso_seg[idx].tso_flags.fin,
8636*5113495bSYour Name 		     seg.tso_flags.fin);
8637*5113495bSYour Name 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8638*5113495bSYour Name 		     .tso_seg[idx].tso_flags.syn,
8639*5113495bSYour Name 		     seg.tso_flags.syn);
8640*5113495bSYour Name 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8641*5113495bSYour Name 		     .tso_seg[idx].tso_flags.rst,
8642*5113495bSYour Name 		     seg.tso_flags.rst);
8643*5113495bSYour Name 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8644*5113495bSYour Name 		     .tso_seg[idx].tso_flags.psh,
8645*5113495bSYour Name 		     seg.tso_flags.psh);
8646*5113495bSYour Name 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8647*5113495bSYour Name 		     .tso_seg[idx].tso_flags.ack,
8648*5113495bSYour Name 		     seg.tso_flags.ack);
8649*5113495bSYour Name 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8650*5113495bSYour Name 		     .tso_seg[idx].tso_flags.urg,
8651*5113495bSYour Name 		     seg.tso_flags.urg);
8652*5113495bSYour Name 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8653*5113495bSYour Name 		     .tso_seg[idx].tso_flags.ece,
8654*5113495bSYour Name 		     seg.tso_flags.ece);
8655*5113495bSYour Name 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8656*5113495bSYour Name 		     .tso_seg[idx].tso_flags.cwr,
8657*5113495bSYour Name 		     seg.tso_flags.cwr);
8658*5113495bSYour Name 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8659*5113495bSYour Name 		     .tso_seg[idx].tso_flags.ns,
8660*5113495bSYour Name 		     seg.tso_flags.ns);
8661*5113495bSYour Name 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8662*5113495bSYour Name 		     .tso_seg[idx].tso_flags.tcp_seq_num,
8663*5113495bSYour Name 		     seg.tso_flags.tcp_seq_num);
8664*5113495bSYour Name 	DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
8665*5113495bSYour Name 		     .tso_seg[idx].tso_flags.ip_id,
8666*5113495bSYour Name 		     seg.tso_flags.ip_id);
8667*5113495bSYour Name }
8668*5113495bSYour Name 
dp_tso_packet_update(struct dp_pdev * pdev,uint32_t stats_idx,qdf_nbuf_t msdu,uint16_t num_segs)8669*5113495bSYour Name void dp_tso_packet_update(struct dp_pdev *pdev, uint32_t stats_idx,
8670*5113495bSYour Name 			  qdf_nbuf_t msdu, uint16_t num_segs)
8671*5113495bSYour Name {
8672*5113495bSYour Name 	DP_STATS_UPD(pdev,
8673*5113495bSYour Name 		     tso_stats.tso_info.tso_packet_info[stats_idx]
8674*5113495bSYour Name 		     .num_seg,
8675*5113495bSYour Name 		     num_segs);
8676*5113495bSYour Name 
8677*5113495bSYour Name 	DP_STATS_UPD(pdev,
8678*5113495bSYour Name 		     tso_stats.tso_info.tso_packet_info[stats_idx]
8679*5113495bSYour Name 		     .tso_packet_len,
8680*5113495bSYour Name 		     qdf_nbuf_get_tcp_payload_len(msdu));
8681*5113495bSYour Name }
8682*5113495bSYour Name 
dp_tso_segment_stats_update(struct dp_pdev * pdev,struct qdf_tso_seg_elem_t * stats_seg,uint32_t stats_idx)8683*5113495bSYour Name void dp_tso_segment_stats_update(struct dp_pdev *pdev,
8684*5113495bSYour Name 				 struct qdf_tso_seg_elem_t *stats_seg,
8685*5113495bSYour Name 				 uint32_t stats_idx)
8686*5113495bSYour Name {
8687*5113495bSYour Name 	uint8_t tso_seg_idx = 0;
8688*5113495bSYour Name 
8689*5113495bSYour Name 	while (stats_seg  && (tso_seg_idx < CDP_MAX_TSO_SEGMENTS)) {
8690*5113495bSYour Name 		dp_tso_segment_update(pdev, stats_idx,
8691*5113495bSYour Name 				      tso_seg_idx,
8692*5113495bSYour Name 				      stats_seg->seg);
8693*5113495bSYour Name 		++tso_seg_idx;
8694*5113495bSYour Name 		stats_seg = stats_seg->next;
8695*5113495bSYour Name 	}
8696*5113495bSYour Name }
8697*5113495bSYour Name 
dp_txrx_clear_tso_stats(struct dp_soc * soc)8698*5113495bSYour Name void dp_txrx_clear_tso_stats(struct dp_soc *soc)
8699*5113495bSYour Name {
8700*5113495bSYour Name 	uint8_t loop_pdev;
8701*5113495bSYour Name 	struct dp_pdev *pdev;
8702*5113495bSYour Name 
8703*5113495bSYour Name 	for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) {
8704*5113495bSYour Name 		pdev = soc->pdev_list[loop_pdev];
8705*5113495bSYour Name 		dp_init_tso_stats(pdev);
8706*5113495bSYour Name 	}
8707*5113495bSYour Name }
8708*5113495bSYour Name #endif /* FEATURE_TSO_STATS */
8709*5113495bSYour Name 
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*5113495bSYour Name QDF_STATUS dp_txrx_get_peer_per_pkt_stats_param(struct dp_peer *peer,
8711*5113495bSYour Name 						enum cdp_peer_stats_type type,
8712*5113495bSYour Name 						cdp_peer_stats_param_t *buf)
8713*5113495bSYour Name {
8714*5113495bSYour Name 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
8715*5113495bSYour Name 	struct dp_peer *tgt_peer;
8716*5113495bSYour Name 	struct dp_txrx_peer *txrx_peer;
8717*5113495bSYour Name 	struct dp_peer_per_pkt_stats *peer_stats;
8718*5113495bSYour Name 	uint8_t link_id = 0;
8719*5113495bSYour Name 	uint8_t idx = 0;
8720*5113495bSYour Name 	uint8_t stats_arr_size;
8721*5113495bSYour Name 	struct cdp_pkt_info pkt_info = {0};
8722*5113495bSYour Name 	struct dp_soc *soc = peer->vdev->pdev->soc;
8723*5113495bSYour Name 	struct dp_pdev *pdev = peer->vdev->pdev;
8724*5113495bSYour Name 
8725*5113495bSYour Name 	txrx_peer = dp_get_txrx_peer(peer);
8726*5113495bSYour Name 	if (!txrx_peer)
8727*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
8728*5113495bSYour Name 
8729*5113495bSYour Name 	stats_arr_size = txrx_peer->stats_arr_size;
8730*5113495bSYour Name 
8731*5113495bSYour Name 	if (IS_MLO_DP_LINK_PEER(peer))
8732*5113495bSYour Name 		link_id = dp_get_peer_hw_link_id(soc, pdev);
8733*5113495bSYour Name 
8734*5113495bSYour Name 	switch (type) {
8735*5113495bSYour Name 	case cdp_peer_tx_ucast:
8736*5113495bSYour Name 		if (link_id > 0) {
8737*5113495bSYour Name 			peer_stats = &txrx_peer->stats[link_id].per_pkt_stats;
8738*5113495bSYour Name 			buf->tx_ucast = peer_stats->tx.ucast;
8739*5113495bSYour Name 		} else {
8740*5113495bSYour Name 			for (idx = 0; idx < stats_arr_size; idx++) {
8741*5113495bSYour Name 				peer_stats =
8742*5113495bSYour Name 					&txrx_peer->stats[idx].per_pkt_stats;
8743*5113495bSYour Name 				pkt_info.num += peer_stats->tx.ucast.num;
8744*5113495bSYour Name 				pkt_info.bytes += peer_stats->tx.ucast.bytes;
8745*5113495bSYour Name 			}
8746*5113495bSYour Name 
8747*5113495bSYour Name 			buf->tx_ucast = pkt_info;
8748*5113495bSYour Name 		}
8749*5113495bSYour Name 
8750*5113495bSYour Name 		break;
8751*5113495bSYour Name 	case cdp_peer_tx_mcast:
8752*5113495bSYour Name 		if (link_id > 0) {
8753*5113495bSYour Name 			peer_stats = &txrx_peer->stats[link_id].per_pkt_stats;
8754*5113495bSYour Name 			buf->tx_mcast = peer_stats->tx.mcast;
8755*5113495bSYour Name 		} else {
8756*5113495bSYour Name 			for (idx = 0; idx < stats_arr_size; idx++) {
8757*5113495bSYour Name 				peer_stats =
8758*5113495bSYour Name 					&txrx_peer->stats[idx].per_pkt_stats;
8759*5113495bSYour Name 				pkt_info.num += peer_stats->tx.mcast.num;
8760*5113495bSYour Name 				pkt_info.bytes += peer_stats->tx.mcast.bytes;
8761*5113495bSYour Name 			}
8762*5113495bSYour Name 
8763*5113495bSYour Name 			buf->tx_mcast = pkt_info;
8764*5113495bSYour Name 		}
8765*5113495bSYour Name 
8766*5113495bSYour Name 		break;
8767*5113495bSYour Name 	case cdp_peer_tx_inactive_time:
8768*5113495bSYour Name 		tgt_peer = dp_get_tgt_peer_from_peer(peer);
8769*5113495bSYour Name 		if (tgt_peer)
8770*5113495bSYour Name 			buf->tx_inactive_time =
8771*5113495bSYour Name 					tgt_peer->stats.tx.inactive_time;
8772*5113495bSYour Name 		else
8773*5113495bSYour Name 			ret = QDF_STATUS_E_FAILURE;
8774*5113495bSYour Name 		break;
8775*5113495bSYour Name 	case cdp_peer_rx_ucast:
8776*5113495bSYour Name 		if (link_id > 0) {
8777*5113495bSYour Name 			peer_stats = &txrx_peer->stats[link_id].per_pkt_stats;
8778*5113495bSYour Name 			buf->rx_ucast = peer_stats->rx.unicast;
8779*5113495bSYour Name 		} else {
8780*5113495bSYour Name 			for (idx = 0; idx < stats_arr_size; idx++) {
8781*5113495bSYour Name 				peer_stats =
8782*5113495bSYour Name 					&txrx_peer->stats[idx].per_pkt_stats;
8783*5113495bSYour Name 				pkt_info.num += peer_stats->rx.unicast.num;
8784*5113495bSYour Name 				pkt_info.bytes += peer_stats->rx.unicast.bytes;
8785*5113495bSYour Name 			}
8786*5113495bSYour Name 
8787*5113495bSYour Name 			buf->rx_ucast = pkt_info;
8788*5113495bSYour Name 		}
8789*5113495bSYour Name 
8790*5113495bSYour Name 		break;
8791*5113495bSYour Name 	default:
8792*5113495bSYour Name 		ret = QDF_STATUS_E_FAILURE;
8793*5113495bSYour Name 		break;
8794*5113495bSYour Name 	}
8795*5113495bSYour Name 
8796*5113495bSYour Name 	return ret;
8797*5113495bSYour Name }
8798*5113495bSYour Name 
8799*5113495bSYour Name #ifdef QCA_ENHANCED_STATS_SUPPORT
8800*5113495bSYour Name #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*5113495bSYour Name QDF_STATUS dp_txrx_get_peer_extd_stats_param(struct dp_peer *peer,
8802*5113495bSYour Name 					     enum cdp_peer_stats_type type,
8803*5113495bSYour Name 					     cdp_peer_stats_param_t *buf)
8804*5113495bSYour Name {
8805*5113495bSYour Name 	QDF_STATUS ret = QDF_STATUS_E_FAILURE;
8806*5113495bSYour Name 	struct dp_soc *soc = peer->vdev->pdev->soc;
8807*5113495bSYour Name 
8808*5113495bSYour Name 	if (IS_MLO_DP_MLD_PEER(peer)) {
8809*5113495bSYour Name 		struct dp_peer *link_peer;
8810*5113495bSYour Name 		struct dp_soc *link_peer_soc;
8811*5113495bSYour Name 
8812*5113495bSYour Name 		link_peer = dp_get_primary_link_peer_by_id(soc, peer->peer_id,
8813*5113495bSYour Name 							   DP_MOD_ID_CDP);
8814*5113495bSYour Name 
8815*5113495bSYour Name 		if (link_peer) {
8816*5113495bSYour Name 			link_peer_soc = link_peer->vdev->pdev->soc;
8817*5113495bSYour Name 			ret = dp_monitor_peer_get_stats_param(link_peer_soc,
8818*5113495bSYour Name 							      link_peer,
8819*5113495bSYour Name 							      type, buf);
8820*5113495bSYour Name 			dp_peer_unref_delete(link_peer, DP_MOD_ID_CDP);
8821*5113495bSYour Name 		}
8822*5113495bSYour Name 		return ret;
8823*5113495bSYour Name 	} else {
8824*5113495bSYour Name 		return dp_monitor_peer_get_stats_param(soc, peer, type, buf);
8825*5113495bSYour Name 	}
8826*5113495bSYour Name }
8827*5113495bSYour Name #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*5113495bSYour Name QDF_STATUS dp_txrx_get_peer_extd_stats_param(struct dp_peer *peer,
8829*5113495bSYour Name 					     enum cdp_peer_stats_type type,
8830*5113495bSYour Name 					     cdp_peer_stats_param_t *buf)
8831*5113495bSYour Name {
8832*5113495bSYour Name 	struct dp_soc *soc = peer->vdev->pdev->soc;
8833*5113495bSYour Name 
8834*5113495bSYour Name 	return dp_monitor_peer_get_stats_param(soc, peer, type, buf);
8835*5113495bSYour Name }
8836*5113495bSYour Name #endif
8837*5113495bSYour Name #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*5113495bSYour Name QDF_STATUS dp_txrx_get_peer_extd_stats_param(struct dp_peer *peer,
8839*5113495bSYour Name 					     enum cdp_peer_stats_type type,
8840*5113495bSYour Name 					     cdp_peer_stats_param_t *buf)
8841*5113495bSYour Name {
8842*5113495bSYour Name 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
8843*5113495bSYour Name 	struct dp_txrx_peer *txrx_peer;
8844*5113495bSYour Name 	struct dp_peer_extd_stats *peer_stats;
8845*5113495bSYour Name 
8846*5113495bSYour Name 	txrx_peer = dp_get_txrx_peer(peer);
8847*5113495bSYour Name 	if (!txrx_peer)
8848*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
8849*5113495bSYour Name 
8850*5113495bSYour Name 	peer_stats = &txrx_peer->stats[0].extd_stats;
8851*5113495bSYour Name 
8852*5113495bSYour Name 	switch (type) {
8853*5113495bSYour Name 	case cdp_peer_tx_rate:
8854*5113495bSYour Name 		buf->tx_rate = peer_stats->tx.tx_rate;
8855*5113495bSYour Name 		break;
8856*5113495bSYour Name 	case cdp_peer_tx_last_tx_rate:
8857*5113495bSYour Name 		buf->last_tx_rate = peer_stats->tx.last_tx_rate;
8858*5113495bSYour Name 		break;
8859*5113495bSYour Name 	case cdp_peer_tx_ratecode:
8860*5113495bSYour Name 		buf->tx_ratecode = peer_stats->tx.tx_ratecode;
8861*5113495bSYour Name 		break;
8862*5113495bSYour Name 	case cdp_peer_rx_rate:
8863*5113495bSYour Name 		buf->rx_rate = peer_stats->rx.rx_rate;
8864*5113495bSYour Name 		break;
8865*5113495bSYour Name 	case cdp_peer_rx_last_rx_rate:
8866*5113495bSYour Name 		buf->last_rx_rate = peer_stats->rx.last_rx_rate;
8867*5113495bSYour Name 		break;
8868*5113495bSYour Name 	case cdp_peer_rx_ratecode:
8869*5113495bSYour Name 		buf->rx_ratecode = peer_stats->rx.rx_ratecode;
8870*5113495bSYour Name 		break;
8871*5113495bSYour Name 	case cdp_peer_rx_avg_snr:
8872*5113495bSYour Name 		buf->rx_avg_snr = peer_stats->rx.avg_snr;
8873*5113495bSYour Name 		break;
8874*5113495bSYour Name 	case cdp_peer_rx_snr:
8875*5113495bSYour Name 		buf->rx_snr = peer_stats->rx.snr;
8876*5113495bSYour Name 		break;
8877*5113495bSYour Name 	default:
8878*5113495bSYour Name 		ret = QDF_STATUS_E_FAILURE;
8879*5113495bSYour Name 		break;
8880*5113495bSYour Name 	}
8881*5113495bSYour Name 
8882*5113495bSYour Name 	return ret;
8883*5113495bSYour Name }
8884*5113495bSYour Name #endif
8885*5113495bSYour Name 
8886*5113495bSYour Name /**
8887*5113495bSYour Name  * dp_is_wds_extended() - Check if wds ext is enabled
8888*5113495bSYour Name  * @txrx_peer: DP txrx_peer handle
8889*5113495bSYour Name  *
8890*5113495bSYour Name  * Return: true if enabled, false if not
8891*5113495bSYour Name  */
8892*5113495bSYour Name #ifdef QCA_SUPPORT_WDS_EXTENDED
8893*5113495bSYour Name static inline
dp_is_wds_extended(struct dp_txrx_peer * txrx_peer)8894*5113495bSYour Name bool dp_is_wds_extended(struct dp_txrx_peer *txrx_peer)
8895*5113495bSYour Name {
8896*5113495bSYour Name 	if (qdf_atomic_test_bit(WDS_EXT_PEER_INIT_BIT,
8897*5113495bSYour Name 				&txrx_peer->wds_ext.init))
8898*5113495bSYour Name 		return true;
8899*5113495bSYour Name 
8900*5113495bSYour Name 	return false;
8901*5113495bSYour Name }
8902*5113495bSYour Name #else
8903*5113495bSYour Name static inline
dp_is_wds_extended(struct dp_txrx_peer * txrx_peer)8904*5113495bSYour Name bool dp_is_wds_extended(struct dp_txrx_peer *txrx_peer)
8905*5113495bSYour Name {
8906*5113495bSYour Name 	return false;
8907*5113495bSYour Name }
8908*5113495bSYour Name #endif /* QCA_SUPPORT_WDS_EXTENDED */
8909*5113495bSYour Name 
8910*5113495bSYour Name /**
8911*5113495bSYour Name  * dp_peer_get_hw_txrx_stats_en() - Get value of hw_txrx_stats_en
8912*5113495bSYour Name  * @txrx_peer: DP txrx_peer handle
8913*5113495bSYour Name  *
8914*5113495bSYour Name  * Return: true if enabled, false if not
8915*5113495bSYour Name  */
8916*5113495bSYour Name #ifdef QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT
8917*5113495bSYour Name static inline
dp_peer_get_hw_txrx_stats_en(struct dp_txrx_peer * txrx_peer)8918*5113495bSYour Name bool dp_peer_get_hw_txrx_stats_en(struct dp_txrx_peer *txrx_peer)
8919*5113495bSYour Name {
8920*5113495bSYour Name 	return txrx_peer->hw_txrx_stats_en;
8921*5113495bSYour Name }
8922*5113495bSYour Name #else
8923*5113495bSYour Name static inline
dp_peer_get_hw_txrx_stats_en(struct dp_txrx_peer * txrx_peer)8924*5113495bSYour Name bool dp_peer_get_hw_txrx_stats_en(struct dp_txrx_peer *txrx_peer)
8925*5113495bSYour Name {
8926*5113495bSYour Name 	return false;
8927*5113495bSYour Name }
8928*5113495bSYour Name #endif
8929*5113495bSYour Name 
8930*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO
dp_get_stats_peer(struct dp_peer * peer)8931*5113495bSYour Name static inline struct dp_peer *dp_get_stats_peer(struct dp_peer *peer)
8932*5113495bSYour Name {
8933*5113495bSYour Name 	/* ML primary link peer return mld_peer */
8934*5113495bSYour Name 	if (IS_MLO_DP_LINK_PEER(peer) && peer->primary_link)
8935*5113495bSYour Name 		return peer->mld_peer;
8936*5113495bSYour Name 
8937*5113495bSYour Name 	return peer;
8938*5113495bSYour Name }
8939*5113495bSYour Name #else
dp_get_stats_peer(struct dp_peer * peer)8940*5113495bSYour Name static inline struct dp_peer *dp_get_stats_peer(struct dp_peer *peer)
8941*5113495bSYour Name {
8942*5113495bSYour Name 	return peer;
8943*5113495bSYour Name }
8944*5113495bSYour Name #endif
8945*5113495bSYour Name 
dp_update_vdev_be_basic_stats(struct dp_txrx_peer * txrx_peer,struct dp_vdev_stats * tgtobj)8946*5113495bSYour Name void dp_update_vdev_be_basic_stats(struct dp_txrx_peer *txrx_peer,
8947*5113495bSYour Name 				   struct dp_vdev_stats *tgtobj)
8948*5113495bSYour Name {
8949*5113495bSYour Name 	if (qdf_unlikely(!txrx_peer || !tgtobj))
8950*5113495bSYour Name 		return;
8951*5113495bSYour Name 
8952*5113495bSYour Name 	if (!dp_peer_get_hw_txrx_stats_en(txrx_peer)) {
8953*5113495bSYour Name 		tgtobj->tx.comp_pkt.num += txrx_peer->comp_pkt.num;
8954*5113495bSYour Name 		tgtobj->tx.comp_pkt.bytes += txrx_peer->comp_pkt.bytes;
8955*5113495bSYour Name 		tgtobj->tx.tx_failed += txrx_peer->tx_failed;
8956*5113495bSYour Name 	}
8957*5113495bSYour Name 	tgtobj->rx.to_stack.num += txrx_peer->to_stack.num;
8958*5113495bSYour Name 	tgtobj->rx.to_stack.bytes += txrx_peer->to_stack.bytes;
8959*5113495bSYour Name }
8960*5113495bSYour Name 
dp_update_vdev_basic_stats(struct dp_txrx_peer * txrx_peer,struct cdp_vdev_stats * tgtobj)8961*5113495bSYour Name void dp_update_vdev_basic_stats(struct dp_txrx_peer *txrx_peer,
8962*5113495bSYour Name 				struct cdp_vdev_stats *tgtobj)
8963*5113495bSYour Name {
8964*5113495bSYour Name 	if (qdf_unlikely(!txrx_peer || !tgtobj))
8965*5113495bSYour Name 		return;
8966*5113495bSYour Name 
8967*5113495bSYour Name 	if (!dp_peer_get_hw_txrx_stats_en(txrx_peer)) {
8968*5113495bSYour Name 		tgtobj->tx.comp_pkt.num += txrx_peer->comp_pkt.num;
8969*5113495bSYour Name 		tgtobj->tx.comp_pkt.bytes += txrx_peer->comp_pkt.bytes;
8970*5113495bSYour Name 		tgtobj->tx.tx_failed += txrx_peer->tx_failed;
8971*5113495bSYour Name 	}
8972*5113495bSYour Name 	tgtobj->rx.to_stack.num += txrx_peer->to_stack.num;
8973*5113495bSYour Name 	tgtobj->rx.to_stack.bytes += txrx_peer->to_stack.bytes;
8974*5113495bSYour Name }
8975*5113495bSYour Name 
8976*5113495bSYour Name #ifdef QCA_ENHANCED_STATS_SUPPORT
dp_update_vdev_stats(struct dp_soc * soc,struct dp_peer * srcobj,void * arg)8977*5113495bSYour Name void dp_update_vdev_stats(struct dp_soc *soc, struct dp_peer *srcobj,
8978*5113495bSYour Name 			  void *arg)
8979*5113495bSYour Name {
8980*5113495bSYour Name 	struct dp_txrx_peer *txrx_peer;
8981*5113495bSYour Name 	struct cdp_vdev_stats *vdev_stats = (struct cdp_vdev_stats *)arg;
8982*5113495bSYour Name 	struct dp_peer_per_pkt_stats *per_pkt_stats;
8983*5113495bSYour Name 	uint8_t link_id = 0;
8984*5113495bSYour Name 	struct dp_pdev *pdev = srcobj->vdev->pdev;
8985*5113495bSYour Name 
8986*5113495bSYour Name 	txrx_peer = dp_get_txrx_peer(srcobj);
8987*5113495bSYour Name 	if (qdf_unlikely(!txrx_peer))
8988*5113495bSYour Name 		goto link_stats;
8989*5113495bSYour Name 
8990*5113495bSYour Name 	if (dp_peer_is_primary_link_peer(srcobj)) {
8991*5113495bSYour Name 		dp_update_vdev_basic_stats(txrx_peer, vdev_stats);
8992*5113495bSYour Name 		per_pkt_stats = &txrx_peer->stats[0].per_pkt_stats;
8993*5113495bSYour Name 		DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats);
8994*5113495bSYour Name 	}
8995*5113495bSYour Name 
8996*5113495bSYour Name 	if (IS_MLO_DP_LINK_PEER(srcobj)) {
8997*5113495bSYour Name 		link_id = dp_get_peer_hw_link_id(soc, pdev);
8998*5113495bSYour Name 		if (link_id > 0) {
8999*5113495bSYour Name 			per_pkt_stats = &txrx_peer->
9000*5113495bSYour Name 				stats[link_id].per_pkt_stats;
9001*5113495bSYour Name 			DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats);
9002*5113495bSYour Name 		}
9003*5113495bSYour Name 	}
9004*5113495bSYour Name 
9005*5113495bSYour Name link_stats:
9006*5113495bSYour Name 	dp_monitor_peer_get_stats(soc, srcobj, vdev_stats, UPDATE_VDEV_STATS_MLD);
9007*5113495bSYour Name }
9008*5113495bSYour Name 
dp_get_vdev_stats_for_unmap_peer_legacy(struct dp_vdev * vdev,struct dp_peer * peer)9009*5113495bSYour Name void dp_get_vdev_stats_for_unmap_peer_legacy(struct dp_vdev *vdev,
9010*5113495bSYour Name 					     struct dp_peer *peer)
9011*5113495bSYour Name {
9012*5113495bSYour Name 	struct dp_txrx_peer *txrx_peer = dp_get_txrx_peer(peer);
9013*5113495bSYour Name 	struct dp_vdev_stats *vdev_stats = &vdev->stats;
9014*5113495bSYour Name 	struct dp_soc *soc = vdev->pdev->soc;
9015*5113495bSYour Name 	struct dp_peer_per_pkt_stats *per_pkt_stats;
9016*5113495bSYour Name 
9017*5113495bSYour Name 	if (!txrx_peer)
9018*5113495bSYour Name 		goto link_stats;
9019*5113495bSYour Name 
9020*5113495bSYour Name 	dp_peer_aggregate_tid_stats(peer);
9021*5113495bSYour Name 
9022*5113495bSYour Name 	per_pkt_stats = &txrx_peer->stats[0].per_pkt_stats;
9023*5113495bSYour Name 	dp_update_vdev_be_basic_stats(txrx_peer, vdev_stats);
9024*5113495bSYour Name 	DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats);
9025*5113495bSYour Name 
9026*5113495bSYour Name link_stats:
9027*5113495bSYour Name 	dp_monitor_peer_get_stats(soc, peer, vdev_stats, UPDATE_VDEV_STATS);
9028*5113495bSYour Name }
9029*5113495bSYour Name 
dp_update_vdev_stats_on_peer_unmap(struct dp_vdev * vdev,struct dp_peer * peer)9030*5113495bSYour Name void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev,
9031*5113495bSYour Name 					struct dp_peer *peer)
9032*5113495bSYour Name {
9033*5113495bSYour Name 	struct dp_soc *soc = vdev->pdev->soc;
9034*5113495bSYour Name 
9035*5113495bSYour Name 	if (soc->arch_ops.dp_get_vdev_stats_for_unmap_peer)
9036*5113495bSYour Name 		soc->arch_ops.dp_get_vdev_stats_for_unmap_peer(vdev, peer);
9037*5113495bSYour Name }
9038*5113495bSYour Name #else
dp_update_vdev_stats(struct dp_soc * soc,struct dp_peer * srcobj,void * arg)9039*5113495bSYour Name void dp_update_vdev_stats(struct dp_soc *soc, struct dp_peer *srcobj,
9040*5113495bSYour Name 			  void *arg)
9041*5113495bSYour Name {
9042*5113495bSYour Name 	struct dp_txrx_peer *txrx_peer;
9043*5113495bSYour Name 	struct cdp_vdev_stats *vdev_stats = (struct cdp_vdev_stats *)arg;
9044*5113495bSYour Name 	struct dp_peer_per_pkt_stats *per_pkt_stats;
9045*5113495bSYour Name 	struct dp_peer_extd_stats *extd_stats;
9046*5113495bSYour Name 	uint8_t inx = 0;
9047*5113495bSYour Name 	uint8_t stats_arr_size = 0;
9048*5113495bSYour Name 
9049*5113495bSYour Name 	txrx_peer = dp_get_txrx_peer(srcobj);
9050*5113495bSYour Name 	if (qdf_unlikely(!txrx_peer))
9051*5113495bSYour Name 		return;
9052*5113495bSYour Name 
9053*5113495bSYour Name 	if (qdf_unlikely(dp_is_wds_extended(txrx_peer)))
9054*5113495bSYour Name 		return;
9055*5113495bSYour Name 
9056*5113495bSYour Name 	if (!dp_peer_is_primary_link_peer(srcobj))
9057*5113495bSYour Name 		return;
9058*5113495bSYour Name 
9059*5113495bSYour Name 	stats_arr_size = txrx_peer->stats_arr_size;
9060*5113495bSYour Name 	dp_update_vdev_basic_stats(txrx_peer, vdev_stats);
9061*5113495bSYour Name 
9062*5113495bSYour Name 	for (inx = 0; inx < stats_arr_size; inx++) {
9063*5113495bSYour Name 		per_pkt_stats = &txrx_peer->stats[inx].per_pkt_stats;
9064*5113495bSYour Name 		extd_stats = &txrx_peer->stats[inx].extd_stats;
9065*5113495bSYour Name 		DP_UPDATE_EXTD_STATS(vdev_stats, extd_stats);
9066*5113495bSYour Name 		DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats);
9067*5113495bSYour Name 	}
9068*5113495bSYour Name }
9069*5113495bSYour Name 
dp_update_vdev_stats_on_peer_unmap(struct dp_vdev * vdev,struct dp_peer * peer)9070*5113495bSYour Name void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev,
9071*5113495bSYour Name 					struct dp_peer *peer)
9072*5113495bSYour Name {
9073*5113495bSYour Name 	struct dp_txrx_peer *txrx_peer;
9074*5113495bSYour Name 	struct dp_peer_per_pkt_stats *per_pkt_stats;
9075*5113495bSYour Name 	struct dp_peer_extd_stats *extd_stats;
9076*5113495bSYour Name 	struct dp_vdev_stats *vdev_stats = &vdev->stats;
9077*5113495bSYour Name 	uint8_t inx = 0;
9078*5113495bSYour Name 	uint8_t stats_arr_size = 0;
9079*5113495bSYour Name 
9080*5113495bSYour Name 	txrx_peer = dp_get_txrx_peer(peer);
9081*5113495bSYour Name 	if (!txrx_peer)
9082*5113495bSYour Name 		return;
9083*5113495bSYour Name 
9084*5113495bSYour Name 	stats_arr_size = txrx_peer->stats_arr_size;
9085*5113495bSYour Name 	dp_update_vdev_be_basic_stats(txrx_peer, vdev_stats);
9086*5113495bSYour Name 
9087*5113495bSYour Name 	for (inx = 0; inx < stats_arr_size; inx++) {
9088*5113495bSYour Name 		per_pkt_stats = &txrx_peer->stats[inx].per_pkt_stats;
9089*5113495bSYour Name 		extd_stats = &txrx_peer->stats[inx].extd_stats;
9090*5113495bSYour Name 		DP_UPDATE_EXTD_STATS(vdev_stats, extd_stats);
9091*5113495bSYour Name 		DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats);
9092*5113495bSYour Name 	}
9093*5113495bSYour Name }
9094*5113495bSYour Name 
dp_get_vdev_stats_for_unmap_peer_legacy(struct dp_vdev * vdev,struct dp_peer * peer)9095*5113495bSYour Name void dp_get_vdev_stats_for_unmap_peer_legacy(struct dp_vdev *vdev,
9096*5113495bSYour Name 					     struct dp_peer *peer)
9097*5113495bSYour Name {
9098*5113495bSYour Name }
9099*5113495bSYour Name #endif
9100*5113495bSYour Name 
dp_update_pdev_stats(struct dp_pdev * tgtobj,struct cdp_vdev_stats * srcobj)9101*5113495bSYour Name void dp_update_pdev_stats(struct dp_pdev *tgtobj,
9102*5113495bSYour Name 			  struct cdp_vdev_stats *srcobj)
9103*5113495bSYour Name {
9104*5113495bSYour Name 	uint8_t i;
9105*5113495bSYour Name 	uint8_t pream_type;
9106*5113495bSYour Name 	uint8_t mu_type;
9107*5113495bSYour Name 	struct cdp_pdev_stats *pdev_stats = NULL;
9108*5113495bSYour Name 
9109*5113495bSYour Name 	pdev_stats = &tgtobj->stats;
9110*5113495bSYour Name 	for (pream_type = 0; pream_type < DOT11_MAX; pream_type++) {
9111*5113495bSYour Name 		for (i = 0; i < MAX_MCS; i++) {
9112*5113495bSYour Name 			tgtobj->stats.tx.pkt_type[pream_type].
9113*5113495bSYour Name 				mcs_count[i] +=
9114*5113495bSYour Name 			srcobj->tx.pkt_type[pream_type].
9115*5113495bSYour Name 				mcs_count[i];
9116*5113495bSYour Name 			tgtobj->stats.rx.pkt_type[pream_type].
9117*5113495bSYour Name 				mcs_count[i] +=
9118*5113495bSYour Name 			srcobj->rx.pkt_type[pream_type].
9119*5113495bSYour Name 				mcs_count[i];
9120*5113495bSYour Name 		}
9121*5113495bSYour Name 	}
9122*5113495bSYour Name 
9123*5113495bSYour Name 	for (i = 0; i < MAX_BW; i++) {
9124*5113495bSYour Name 		tgtobj->stats.tx.bw[i] += srcobj->tx.bw[i];
9125*5113495bSYour Name 		tgtobj->stats.rx.bw[i] += srcobj->rx.bw[i];
9126*5113495bSYour Name 	}
9127*5113495bSYour Name 
9128*5113495bSYour Name 	for (i = 0; i < SS_COUNT; i++) {
9129*5113495bSYour Name 		tgtobj->stats.tx.nss[i] += srcobj->tx.nss[i];
9130*5113495bSYour Name 		tgtobj->stats.rx.nss[i] += srcobj->rx.nss[i];
9131*5113495bSYour Name 		tgtobj->stats.rx.ppdu_nss[i] += srcobj->rx.ppdu_nss[i];
9132*5113495bSYour Name 	}
9133*5113495bSYour Name 
9134*5113495bSYour Name 	for (i = 0; i < WME_AC_MAX; i++) {
9135*5113495bSYour Name 		tgtobj->stats.tx.wme_ac_type[i] +=
9136*5113495bSYour Name 			srcobj->tx.wme_ac_type[i];
9137*5113495bSYour Name 		tgtobj->stats.tx.wme_ac_type_bytes[i] +=
9138*5113495bSYour Name 			srcobj->tx.wme_ac_type_bytes[i];
9139*5113495bSYour Name 		tgtobj->stats.rx.wme_ac_type[i] +=
9140*5113495bSYour Name 			srcobj->rx.wme_ac_type[i];
9141*5113495bSYour Name 		tgtobj->stats.rx.wme_ac_type_bytes[i] +=
9142*5113495bSYour Name 			srcobj->rx.wme_ac_type_bytes[i];
9143*5113495bSYour Name 		tgtobj->stats.tx.excess_retries_per_ac[i] +=
9144*5113495bSYour Name 			srcobj->tx.excess_retries_per_ac[i];
9145*5113495bSYour Name 	}
9146*5113495bSYour Name 
9147*5113495bSYour Name 	for (i = 0; i < MAX_GI; i++) {
9148*5113495bSYour Name 		tgtobj->stats.tx.sgi_count[i] +=
9149*5113495bSYour Name 			srcobj->tx.sgi_count[i];
9150*5113495bSYour Name 		tgtobj->stats.rx.sgi_count[i] +=
9151*5113495bSYour Name 			srcobj->rx.sgi_count[i];
9152*5113495bSYour Name 	}
9153*5113495bSYour Name 
9154*5113495bSYour Name 	for (i = 0; i < MAX_RECEPTION_TYPES; i++) {
9155*5113495bSYour Name 		tgtobj->stats.rx.reception_type[i] +=
9156*5113495bSYour Name 			srcobj->rx.reception_type[i];
9157*5113495bSYour Name 		tgtobj->stats.rx.ppdu_cnt[i] += srcobj->rx.ppdu_cnt[i];
9158*5113495bSYour Name 	}
9159*5113495bSYour Name 
9160*5113495bSYour Name 	for (i = 0; i < MAX_TRANSMIT_TYPES; i++) {
9161*5113495bSYour Name 		tgtobj->stats.tx.transmit_type[i].num_msdu +=
9162*5113495bSYour Name 				srcobj->tx.transmit_type[i].num_msdu;
9163*5113495bSYour Name 		tgtobj->stats.tx.transmit_type[i].num_mpdu +=
9164*5113495bSYour Name 				srcobj->tx.transmit_type[i].num_mpdu;
9165*5113495bSYour Name 		tgtobj->stats.tx.transmit_type[i].mpdu_tried +=
9166*5113495bSYour Name 				srcobj->tx.transmit_type[i].mpdu_tried;
9167*5113495bSYour Name 	}
9168*5113495bSYour Name 
9169*5113495bSYour Name 	for (i = 0; i < QDF_PROTO_SUBTYPE_MAX; i++)
9170*5113495bSYour Name 		tgtobj->stats.tx.no_ack_count[i] += srcobj->tx.no_ack_count[i];
9171*5113495bSYour Name 
9172*5113495bSYour Name 	for (i = 0; i < MAX_MU_GROUP_ID; i++)
9173*5113495bSYour Name 		tgtobj->stats.tx.mu_group_id[i] = srcobj->tx.mu_group_id[i];
9174*5113495bSYour Name 
9175*5113495bSYour Name 	for (i = 0; i < MAX_RU_LOCATIONS; i++) {
9176*5113495bSYour Name 		tgtobj->stats.tx.ru_loc[i].num_msdu +=
9177*5113495bSYour Name 			srcobj->tx.ru_loc[i].num_msdu;
9178*5113495bSYour Name 		tgtobj->stats.tx.ru_loc[i].num_mpdu +=
9179*5113495bSYour Name 			srcobj->tx.ru_loc[i].num_mpdu;
9180*5113495bSYour Name 		tgtobj->stats.tx.ru_loc[i].mpdu_tried +=
9181*5113495bSYour Name 			srcobj->tx.ru_loc[i].mpdu_tried;
9182*5113495bSYour Name 	}
9183*5113495bSYour Name 
9184*5113495bSYour Name 	tgtobj->stats.tx.tx_ppdus += srcobj->tx.tx_ppdus;
9185*5113495bSYour Name 	tgtobj->stats.tx.tx_mpdus_success += srcobj->tx.tx_mpdus_success;
9186*5113495bSYour Name 	tgtobj->stats.tx.tx_mpdus_tried += srcobj->tx.tx_mpdus_tried;
9187*5113495bSYour Name 	tgtobj->stats.tx.retries_mpdu += srcobj->tx.retries_mpdu;
9188*5113495bSYour Name 	tgtobj->stats.tx.mpdu_success_with_retries +=
9189*5113495bSYour Name 		srcobj->tx.mpdu_success_with_retries;
9190*5113495bSYour Name 	tgtobj->stats.tx.last_tx_ts = srcobj->tx.last_tx_ts;
9191*5113495bSYour Name 	tgtobj->stats.tx.tx_rate = srcobj->tx.tx_rate;
9192*5113495bSYour Name 	tgtobj->stats.tx.last_tx_rate = srcobj->tx.last_tx_rate;
9193*5113495bSYour Name 	tgtobj->stats.tx.last_tx_rate_mcs = srcobj->tx.last_tx_rate_mcs;
9194*5113495bSYour Name 	tgtobj->stats.tx.mcast_last_tx_rate = srcobj->tx.mcast_last_tx_rate;
9195*5113495bSYour Name 	tgtobj->stats.tx.mcast_last_tx_rate_mcs =
9196*5113495bSYour Name 		srcobj->tx.mcast_last_tx_rate_mcs;
9197*5113495bSYour Name 	tgtobj->stats.tx.rnd_avg_tx_rate = srcobj->tx.rnd_avg_tx_rate;
9198*5113495bSYour Name 	tgtobj->stats.tx.avg_tx_rate = srcobj->tx.avg_tx_rate;
9199*5113495bSYour Name 	tgtobj->stats.tx.tx_ratecode = srcobj->tx.tx_ratecode;
9200*5113495bSYour Name 	tgtobj->stats.tx.ru_start = srcobj->tx.ru_start;
9201*5113495bSYour Name 	tgtobj->stats.tx.ru_tones = srcobj->tx.ru_tones;
9202*5113495bSYour Name 	tgtobj->stats.tx.last_ack_rssi = srcobj->tx.last_ack_rssi;
9203*5113495bSYour Name 	tgtobj->stats.tx.nss_info = srcobj->tx.nss_info;
9204*5113495bSYour Name 	tgtobj->stats.tx.mcs_info = srcobj->tx.mcs_info;
9205*5113495bSYour Name 	tgtobj->stats.tx.bw_info = srcobj->tx.bw_info;
9206*5113495bSYour Name 	tgtobj->stats.tx.gi_info = srcobj->tx.gi_info;
9207*5113495bSYour Name 	tgtobj->stats.tx.preamble_info = srcobj->tx.preamble_info;
9208*5113495bSYour Name 	tgtobj->stats.tx.comp_pkt.bytes += srcobj->tx.comp_pkt.bytes;
9209*5113495bSYour Name 	tgtobj->stats.tx.comp_pkt.num += srcobj->tx.comp_pkt.num;
9210*5113495bSYour Name 	tgtobj->stats.tx.ucast.num += srcobj->tx.ucast.num;
9211*5113495bSYour Name 	tgtobj->stats.tx.ucast.bytes += srcobj->tx.ucast.bytes;
9212*5113495bSYour Name 	tgtobj->stats.tx.mcast.num += srcobj->tx.mcast.num;
9213*5113495bSYour Name 	tgtobj->stats.tx.mcast.bytes += srcobj->tx.mcast.bytes;
9214*5113495bSYour Name 	tgtobj->stats.tx.bcast.num += srcobj->tx.bcast.num;
9215*5113495bSYour Name 	tgtobj->stats.tx.bcast.bytes += srcobj->tx.bcast.bytes;
9216*5113495bSYour Name 	tgtobj->stats.tx.tx_success.num += srcobj->tx.tx_success.num;
9217*5113495bSYour Name 	tgtobj->stats.tx.tx_success.bytes +=
9218*5113495bSYour Name 		srcobj->tx.tx_success.bytes;
9219*5113495bSYour Name 	tgtobj->stats.tx.nawds_mcast.num +=
9220*5113495bSYour Name 		srcobj->tx.nawds_mcast.num;
9221*5113495bSYour Name 	tgtobj->stats.tx.nawds_mcast.bytes +=
9222*5113495bSYour Name 		srcobj->tx.nawds_mcast.bytes;
9223*5113495bSYour Name 	tgtobj->stats.tx.nawds_mcast_drop +=
9224*5113495bSYour Name 		srcobj->tx.nawds_mcast_drop;
9225*5113495bSYour Name 	tgtobj->stats.tx.num_ppdu_cookie_valid +=
9226*5113495bSYour Name 		srcobj->tx.num_ppdu_cookie_valid;
9227*5113495bSYour Name 	tgtobj->stats.tx.tx_failed += srcobj->tx.tx_failed;
9228*5113495bSYour Name 	tgtobj->stats.tx.ofdma += srcobj->tx.ofdma;
9229*5113495bSYour Name 	tgtobj->stats.tx.stbc += srcobj->tx.stbc;
9230*5113495bSYour Name 	tgtobj->stats.tx.ldpc += srcobj->tx.ldpc;
9231*5113495bSYour Name 	tgtobj->stats.tx.pream_punct_cnt += srcobj->tx.pream_punct_cnt;
9232*5113495bSYour Name 	tgtobj->stats.tx.retries += srcobj->tx.retries;
9233*5113495bSYour Name 	tgtobj->stats.tx.non_amsdu_cnt += srcobj->tx.non_amsdu_cnt;
9234*5113495bSYour Name 	tgtobj->stats.tx.amsdu_cnt += srcobj->tx.amsdu_cnt;
9235*5113495bSYour Name 	tgtobj->stats.tx.non_ampdu_cnt += srcobj->tx.non_ampdu_cnt;
9236*5113495bSYour Name 	tgtobj->stats.tx.ampdu_cnt += srcobj->tx.ampdu_cnt;
9237*5113495bSYour Name 	tgtobj->stats.tx.dropped.fw_rem.num += srcobj->tx.dropped.fw_rem.num;
9238*5113495bSYour Name 	tgtobj->stats.tx.dropped.fw_rem.bytes +=
9239*5113495bSYour Name 			srcobj->tx.dropped.fw_rem.bytes;
9240*5113495bSYour Name 	tgtobj->stats.tx.dropped.fw_rem_tx +=
9241*5113495bSYour Name 			srcobj->tx.dropped.fw_rem_tx;
9242*5113495bSYour Name 	tgtobj->stats.tx.dropped.fw_rem_notx +=
9243*5113495bSYour Name 			srcobj->tx.dropped.fw_rem_notx;
9244*5113495bSYour Name 	tgtobj->stats.tx.dropped.fw_reason1 +=
9245*5113495bSYour Name 			srcobj->tx.dropped.fw_reason1;
9246*5113495bSYour Name 	tgtobj->stats.tx.dropped.fw_reason2 +=
9247*5113495bSYour Name 			srcobj->tx.dropped.fw_reason2;
9248*5113495bSYour Name 	tgtobj->stats.tx.dropped.fw_reason3 +=
9249*5113495bSYour Name 			srcobj->tx.dropped.fw_reason3;
9250*5113495bSYour Name 	tgtobj->stats.tx.dropped.fw_rem_queue_disable +=
9251*5113495bSYour Name 				srcobj->tx.dropped.fw_rem_queue_disable;
9252*5113495bSYour Name 	tgtobj->stats.tx.dropped.fw_rem_no_match +=
9253*5113495bSYour Name 				srcobj->tx.dropped.fw_rem_no_match;
9254*5113495bSYour Name 	tgtobj->stats.tx.dropped.drop_threshold +=
9255*5113495bSYour Name 				srcobj->tx.dropped.drop_threshold;
9256*5113495bSYour Name 	tgtobj->stats.tx.dropped.drop_link_desc_na +=
9257*5113495bSYour Name 				srcobj->tx.dropped.drop_link_desc_na;
9258*5113495bSYour Name 	tgtobj->stats.tx.dropped.invalid_drop +=
9259*5113495bSYour Name 				srcobj->tx.dropped.invalid_drop;
9260*5113495bSYour Name 	tgtobj->stats.tx.dropped.mcast_vdev_drop +=
9261*5113495bSYour Name 					srcobj->tx.dropped.mcast_vdev_drop;
9262*5113495bSYour Name 	tgtobj->stats.tx.dropped.invalid_rr +=
9263*5113495bSYour Name 				srcobj->tx.dropped.invalid_rr;
9264*5113495bSYour Name 	tgtobj->stats.tx.dropped.age_out += srcobj->tx.dropped.age_out;
9265*5113495bSYour Name 	tgtobj->stats.rx.err.mic_err += srcobj->rx.err.mic_err;
9266*5113495bSYour Name 	tgtobj->stats.rx.err.decrypt_err += srcobj->rx.err.decrypt_err;
9267*5113495bSYour Name 	tgtobj->stats.rx.err.fcserr += srcobj->rx.err.fcserr;
9268*5113495bSYour Name 	tgtobj->stats.rx.err.pn_err += srcobj->rx.err.pn_err;
9269*5113495bSYour Name 	tgtobj->stats.rx.err.oor_err += srcobj->rx.err.oor_err;
9270*5113495bSYour Name 	tgtobj->stats.rx.err.jump_2k_err += srcobj->rx.err.jump_2k_err;
9271*5113495bSYour Name 	tgtobj->stats.rx.err.rxdma_wifi_parse_err +=
9272*5113495bSYour Name 				srcobj->rx.err.rxdma_wifi_parse_err;
9273*5113495bSYour Name 	if (srcobj->rx.snr != 0)
9274*5113495bSYour Name 		tgtobj->stats.rx.snr = srcobj->rx.snr;
9275*5113495bSYour Name 	tgtobj->stats.rx.rx_rate = srcobj->rx.rx_rate;
9276*5113495bSYour Name 	tgtobj->stats.rx.last_rx_rate = srcobj->rx.last_rx_rate;
9277*5113495bSYour Name 	tgtobj->stats.rx.rnd_avg_rx_rate = srcobj->rx.rnd_avg_rx_rate;
9278*5113495bSYour Name 	tgtobj->stats.rx.avg_rx_rate = srcobj->rx.avg_rx_rate;
9279*5113495bSYour Name 	tgtobj->stats.rx.rx_ratecode = srcobj->rx.rx_ratecode;
9280*5113495bSYour Name 	tgtobj->stats.rx.avg_snr = srcobj->rx.avg_snr;
9281*5113495bSYour Name 	tgtobj->stats.rx.rx_snr_measured_time = srcobj->rx.rx_snr_measured_time;
9282*5113495bSYour Name 	tgtobj->stats.rx.last_snr = srcobj->rx.last_snr;
9283*5113495bSYour Name 	tgtobj->stats.rx.nss_info = srcobj->rx.nss_info;
9284*5113495bSYour Name 	tgtobj->stats.rx.mcs_info = srcobj->rx.mcs_info;
9285*5113495bSYour Name 	tgtobj->stats.rx.bw_info = srcobj->rx.bw_info;
9286*5113495bSYour Name 	tgtobj->stats.rx.gi_info = srcobj->rx.gi_info;
9287*5113495bSYour Name 	tgtobj->stats.rx.preamble_info = srcobj->rx.preamble_info;
9288*5113495bSYour Name 	tgtobj->stats.rx.non_ampdu_cnt += srcobj->rx.non_ampdu_cnt;
9289*5113495bSYour Name 	tgtobj->stats.rx.ampdu_cnt += srcobj->rx.ampdu_cnt;
9290*5113495bSYour Name 	tgtobj->stats.rx.non_amsdu_cnt += srcobj->rx.non_amsdu_cnt;
9291*5113495bSYour Name 	tgtobj->stats.rx.amsdu_cnt += srcobj->rx.amsdu_cnt;
9292*5113495bSYour Name 	tgtobj->stats.rx.nawds_mcast_drop += srcobj->rx.nawds_mcast_drop;
9293*5113495bSYour Name 	tgtobj->stats.rx.mcast_3addr_drop += srcobj->rx.mcast_3addr_drop;
9294*5113495bSYour Name 	tgtobj->stats.rx.to_stack.num += srcobj->rx.to_stack.num;
9295*5113495bSYour Name 	tgtobj->stats.rx.to_stack.bytes += srcobj->rx.to_stack.bytes;
9296*5113495bSYour Name 
9297*5113495bSYour Name 	for (i = 0; i < CDP_MAX_RX_RINGS; i++) {
9298*5113495bSYour Name 		tgtobj->stats.rx.rcvd_reo[i].num +=
9299*5113495bSYour Name 			srcobj->rx.rcvd_reo[i].num;
9300*5113495bSYour Name 		tgtobj->stats.rx.rcvd_reo[i].bytes +=
9301*5113495bSYour Name 			srcobj->rx.rcvd_reo[i].bytes;
9302*5113495bSYour Name 	}
9303*5113495bSYour Name 
9304*5113495bSYour Name 	for (i = 0; i < CDP_MAX_LMACS; i++) {
9305*5113495bSYour Name 		tgtobj->stats.rx.rx_lmac[i].num +=
9306*5113495bSYour Name 			srcobj->rx.rx_lmac[i].num;
9307*5113495bSYour Name 		tgtobj->stats.rx.rx_lmac[i].bytes +=
9308*5113495bSYour Name 			srcobj->rx.rx_lmac[i].bytes;
9309*5113495bSYour Name 	}
9310*5113495bSYour Name 
9311*5113495bSYour Name 	if (srcobj->rx.to_stack.num >= (srcobj->rx.multicast.num))
9312*5113495bSYour Name 		srcobj->rx.unicast.num =
9313*5113495bSYour Name 			srcobj->rx.to_stack.num -
9314*5113495bSYour Name 				(srcobj->rx.multicast.num);
9315*5113495bSYour Name 	if (srcobj->rx.to_stack.bytes >= srcobj->rx.multicast.bytes)
9316*5113495bSYour Name 		srcobj->rx.unicast.bytes =
9317*5113495bSYour Name 			srcobj->rx.to_stack.bytes -
9318*5113495bSYour Name 				(srcobj->rx.multicast.bytes);
9319*5113495bSYour Name 
9320*5113495bSYour Name 	tgtobj->stats.rx.unicast.num += srcobj->rx.unicast.num;
9321*5113495bSYour Name 	tgtobj->stats.rx.unicast.bytes += srcobj->rx.unicast.bytes;
9322*5113495bSYour Name 	tgtobj->stats.rx.multicast.num += srcobj->rx.multicast.num;
9323*5113495bSYour Name 	tgtobj->stats.rx.multicast.bytes += srcobj->rx.multicast.bytes;
9324*5113495bSYour Name 	tgtobj->stats.rx.bcast.num += srcobj->rx.bcast.num;
9325*5113495bSYour Name 	tgtobj->stats.rx.bcast.bytes += srcobj->rx.bcast.bytes;
9326*5113495bSYour Name 	tgtobj->stats.rx.raw.num += srcobj->rx.raw.num;
9327*5113495bSYour Name 	tgtobj->stats.rx.raw.bytes += srcobj->rx.raw.bytes;
9328*5113495bSYour Name 	tgtobj->stats.rx.intra_bss.pkts.num +=
9329*5113495bSYour Name 			srcobj->rx.intra_bss.pkts.num;
9330*5113495bSYour Name 	tgtobj->stats.rx.intra_bss.pkts.bytes +=
9331*5113495bSYour Name 			srcobj->rx.intra_bss.pkts.bytes;
9332*5113495bSYour Name 	tgtobj->stats.rx.intra_bss.fail.num +=
9333*5113495bSYour Name 			srcobj->rx.intra_bss.fail.num;
9334*5113495bSYour Name 	tgtobj->stats.rx.intra_bss.fail.bytes +=
9335*5113495bSYour Name 			srcobj->rx.intra_bss.fail.bytes;
9336*5113495bSYour Name 
9337*5113495bSYour Name 	tgtobj->stats.tx.last_ack_rssi =
9338*5113495bSYour Name 		srcobj->tx.last_ack_rssi;
9339*5113495bSYour Name 	tgtobj->stats.rx.mec_drop.num += srcobj->rx.mec_drop.num;
9340*5113495bSYour Name 	tgtobj->stats.rx.mec_drop.bytes += srcobj->rx.mec_drop.bytes;
9341*5113495bSYour Name 	tgtobj->stats.rx.ppeds_drop.num += srcobj->rx.ppeds_drop.num;
9342*5113495bSYour Name 	tgtobj->stats.rx.ppeds_drop.bytes += srcobj->rx.ppeds_drop.bytes;
9343*5113495bSYour Name 	tgtobj->stats.rx.multipass_rx_pkt_drop +=
9344*5113495bSYour Name 		srcobj->rx.multipass_rx_pkt_drop;
9345*5113495bSYour Name 	tgtobj->stats.rx.peer_unauth_rx_pkt_drop +=
9346*5113495bSYour Name 		srcobj->rx.peer_unauth_rx_pkt_drop;
9347*5113495bSYour Name 	tgtobj->stats.rx.policy_check_drop +=
9348*5113495bSYour Name 		srcobj->rx.policy_check_drop;
9349*5113495bSYour Name 
9350*5113495bSYour Name 	for (mu_type = 0 ; mu_type < TXRX_TYPE_MU_MAX; mu_type++) {
9351*5113495bSYour Name 		tgtobj->stats.rx.rx_mu[mu_type].mpdu_cnt_fcs_ok +=
9352*5113495bSYour Name 			srcobj->rx.rx_mu[mu_type].mpdu_cnt_fcs_ok;
9353*5113495bSYour Name 		tgtobj->stats.rx.rx_mu[mu_type].mpdu_cnt_fcs_err +=
9354*5113495bSYour Name 			srcobj->rx.rx_mu[mu_type].mpdu_cnt_fcs_err;
9355*5113495bSYour Name 		for (i = 0; i < SS_COUNT; i++)
9356*5113495bSYour Name 			tgtobj->stats.rx.rx_mu[mu_type].ppdu_nss[i] +=
9357*5113495bSYour Name 				srcobj->rx.rx_mu[mu_type].ppdu_nss[i];
9358*5113495bSYour Name 		for (i = 0; i < MAX_MCS; i++)
9359*5113495bSYour Name 			tgtobj->stats.rx.rx_mu[mu_type].ppdu.mcs_count[i] +=
9360*5113495bSYour Name 				srcobj->rx.rx_mu[mu_type].ppdu.mcs_count[i];
9361*5113495bSYour Name 	}
9362*5113495bSYour Name 
9363*5113495bSYour Name 	for (i = 0; i < MAX_MCS; i++) {
9364*5113495bSYour Name 		tgtobj->stats.rx.su_ax_ppdu_cnt.mcs_count[i] +=
9365*5113495bSYour Name 			srcobj->rx.su_ax_ppdu_cnt.mcs_count[i];
9366*5113495bSYour Name 		tgtobj->stats.rx.rx_mpdu_cnt[i] += srcobj->rx.rx_mpdu_cnt[i];
9367*5113495bSYour Name 	}
9368*5113495bSYour Name 
9369*5113495bSYour Name 	tgtobj->stats.rx.mpdu_cnt_fcs_ok += srcobj->rx.mpdu_cnt_fcs_ok;
9370*5113495bSYour Name 	tgtobj->stats.rx.mpdu_cnt_fcs_err += srcobj->rx.mpdu_cnt_fcs_err;
9371*5113495bSYour Name 	tgtobj->stats.rx.rx_mpdus += srcobj->rx.rx_mpdus;
9372*5113495bSYour Name 	tgtobj->stats.rx.rx_ppdus += srcobj->rx.rx_ppdus;
9373*5113495bSYour Name 	tgtobj->stats.rx.mpdu_retry_cnt += srcobj->rx.mpdu_retry_cnt;
9374*5113495bSYour Name 	tgtobj->stats.rx.rx_retries += srcobj->rx.rx_retries;
9375*5113495bSYour Name 
9376*5113495bSYour Name 	DP_UPDATE_11BE_STATS(pdev_stats, srcobj);
9377*5113495bSYour Name }
9378*5113495bSYour Name 
dp_update_vdev_ingress_stats(struct dp_vdev * tgtobj)9379*5113495bSYour Name void dp_update_vdev_ingress_stats(struct dp_vdev *tgtobj)
9380*5113495bSYour Name {
9381*5113495bSYour Name 	uint8_t idx;
9382*5113495bSYour Name 
9383*5113495bSYour Name 	for (idx = 0; idx < DP_INGRESS_STATS_MAX_SIZE; idx++) {
9384*5113495bSYour Name 		tgtobj->stats.tx_i[idx].dropped.dropped_pkt.num +=
9385*5113495bSYour Name 			tgtobj->stats.tx_i[idx].dropped.dma_error +
9386*5113495bSYour Name 			tgtobj->stats.tx_i[idx].dropped.ring_full +
9387*5113495bSYour Name 			tgtobj->stats.tx_i[idx].dropped.enqueue_fail +
9388*5113495bSYour Name 			tgtobj->stats.tx_i[idx].dropped.fail_per_pkt_vdev_id_check +
9389*5113495bSYour Name 			tgtobj->stats.tx_i[idx].dropped.desc_na.num +
9390*5113495bSYour Name 			tgtobj->stats.tx_i[idx].dropped.res_full +
9391*5113495bSYour Name 			tgtobj->stats.tx_i[idx].dropped.drop_ingress +
9392*5113495bSYour Name 			tgtobj->stats.tx_i[idx].dropped.headroom_insufficient +
9393*5113495bSYour Name 			tgtobj->stats.tx_i[idx].dropped.invalid_peer_id_in_exc_path +
9394*5113495bSYour Name 			tgtobj->stats.tx_i[idx].dropped.tx_mcast_drop +
9395*5113495bSYour Name 			tgtobj->stats.tx_i[idx].dropped.fw2wbm_tx_drop;
9396*5113495bSYour Name 	}
9397*5113495bSYour Name }
9398*5113495bSYour Name 
9399*5113495bSYour Name #ifdef HW_TX_DELAY_STATS_ENABLE
9400*5113495bSYour Name static inline
dp_update_hw_tx_delay_stats(struct cdp_vdev_stats * vdev_stats,struct dp_vdev_stats * stats)9401*5113495bSYour Name void dp_update_hw_tx_delay_stats(struct cdp_vdev_stats *vdev_stats,
9402*5113495bSYour Name 				 struct dp_vdev_stats *stats)
9403*5113495bSYour Name {
9404*5113495bSYour Name 
9405*5113495bSYour Name 	qdf_mem_copy(&vdev_stats->tid_tx_stats, &stats->tid_tx_stats,
9406*5113495bSYour Name 		     sizeof(stats->tid_tx_stats));
9407*5113495bSYour Name 
9408*5113495bSYour Name }
9409*5113495bSYour Name #else
9410*5113495bSYour Name static inline
dp_update_hw_tx_delay_stats(struct cdp_vdev_stats * vdev_stats,struct dp_vdev_stats * stats)9411*5113495bSYour Name void dp_update_hw_tx_delay_stats(struct cdp_vdev_stats *vdev_stats,
9412*5113495bSYour Name 				 struct dp_vdev_stats *stats)
9413*5113495bSYour Name {
9414*5113495bSYour Name }
9415*5113495bSYour Name #endif
9416*5113495bSYour Name 
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*5113495bSYour Name void dp_copy_vdev_stats_to_tgt_buf(struct cdp_vdev_stats *vdev_stats,
9418*5113495bSYour Name 				   struct dp_vdev_stats *stats,
9419*5113495bSYour Name 				   enum dp_pkt_xmit_type xmit_type)
9420*5113495bSYour Name {
9421*5113495bSYour Name 	DP_UPDATE_LINK_VDEV_INGRESS_STATS(vdev_stats, stats, xmit_type);
9422*5113495bSYour Name 	qdf_mem_copy(&vdev_stats->rx_i, &stats->rx_i, sizeof(stats->rx_i));
9423*5113495bSYour Name 	qdf_mem_copy(&vdev_stats->tx, &stats->tx, sizeof(stats->tx));
9424*5113495bSYour Name 	qdf_mem_copy(&vdev_stats->rx, &stats->rx, sizeof(stats->rx));
9425*5113495bSYour Name 	qdf_mem_copy(&vdev_stats->tso_stats, &stats->tso_stats,
9426*5113495bSYour Name 		     sizeof(stats->tso_stats));
9427*5113495bSYour Name 	dp_update_hw_tx_delay_stats(vdev_stats, stats);
9428*5113495bSYour Name 
9429*5113495bSYour Name }
9430*5113495bSYour Name 
dp_update_vdev_rate_stats(struct cdp_vdev_stats * tgtobj,struct dp_vdev_stats * srcobj)9431*5113495bSYour Name void dp_update_vdev_rate_stats(struct cdp_vdev_stats *tgtobj,
9432*5113495bSYour Name 			       struct dp_vdev_stats *srcobj)
9433*5113495bSYour Name {
9434*5113495bSYour Name 	tgtobj->tx.last_tx_rate = srcobj->tx.last_tx_rate;
9435*5113495bSYour Name 	tgtobj->tx.last_tx_rate_mcs = srcobj->tx.last_tx_rate_mcs;
9436*5113495bSYour Name 	tgtobj->tx.mcast_last_tx_rate = srcobj->tx.mcast_last_tx_rate;
9437*5113495bSYour Name 	tgtobj->tx.mcast_last_tx_rate_mcs = srcobj->tx.mcast_last_tx_rate_mcs;
9438*5113495bSYour Name 	tgtobj->rx.last_rx_rate = srcobj->rx.last_rx_rate;
9439*5113495bSYour Name }
9440*5113495bSYour Name 
dp_update_pdev_ingress_stats(struct dp_pdev * tgtobj,struct dp_vdev * srcobj)9441*5113495bSYour Name void dp_update_pdev_ingress_stats(struct dp_pdev *tgtobj,
9442*5113495bSYour Name 				  struct dp_vdev *srcobj)
9443*5113495bSYour Name {
9444*5113495bSYour Name 	int idx;
9445*5113495bSYour Name 
9446*5113495bSYour Name 	for (idx = 0; idx < DP_INGRESS_STATS_MAX_SIZE; idx++) {
9447*5113495bSYour Name 		DP_STATS_AGGR_PKT_IDX(tgtobj, srcobj, tx_i, nawds_mcast, idx);
9448*5113495bSYour Name 
9449*5113495bSYour Name 		DP_STATS_AGGR_PKT_IDX(tgtobj, srcobj, tx_i, rcvd, idx);
9450*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj,
9451*5113495bSYour Name 				  tx_i, rcvd_in_fast_xmit_flow, idx);
9452*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj, tx_i, rcvd_per_core[0], idx);
9453*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj, tx_i, rcvd_per_core[1], idx);
9454*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj, tx_i, rcvd_per_core[2], idx);
9455*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj, tx_i, rcvd_per_core[3], idx);
9456*5113495bSYour Name 		DP_STATS_AGGR_PKT_IDX(tgtobj, srcobj, tx_i, processed, idx);
9457*5113495bSYour Name 		DP_STATS_AGGR_PKT_IDX(tgtobj, srcobj, tx_i, reinject_pkts, idx);
9458*5113495bSYour Name 		DP_STATS_AGGR_PKT_IDX(tgtobj, srcobj, tx_i, inspect_pkts, idx);
9459*5113495bSYour Name 		DP_STATS_AGGR_PKT_IDX(tgtobj, srcobj, tx_i, raw.raw_pkt, idx);
9460*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj, tx_i, raw.dma_map_error, idx);
9461*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj,
9462*5113495bSYour Name 				  tx_i, raw.num_frags_overflow_err, idx);
9463*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj, tx_i, sg.dropped_host.num,
9464*5113495bSYour Name 				  idx);
9465*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj, tx_i, sg.dropped_target, idx);
9466*5113495bSYour Name 		DP_STATS_AGGR_PKT_IDX(tgtobj, srcobj, tx_i, sg.sg_pkt, idx);
9467*5113495bSYour Name 		DP_STATS_AGGR_PKT_IDX(tgtobj, srcobj, tx_i, mcast_en.mcast_pkt,
9468*5113495bSYour Name 				      idx);
9469*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj,
9470*5113495bSYour Name 				  tx_i, mcast_en.dropped_map_error, idx);
9471*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj,
9472*5113495bSYour Name 				  tx_i, mcast_en.dropped_self_mac, idx);
9473*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj,
9474*5113495bSYour Name 				  tx_i, mcast_en.dropped_send_fail, idx);
9475*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj, tx_i, mcast_en.ucast, idx);
9476*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj, tx_i,
9477*5113495bSYour Name 				  igmp_mcast_en.igmp_rcvd, idx);
9478*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj, tx_i,
9479*5113495bSYour Name 				  igmp_mcast_en.igmp_ucast_converted, idx);
9480*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj, tx_i, dropped.dma_error, idx);
9481*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj, tx_i, dropped.ring_full, idx);
9482*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj, tx_i, dropped.enqueue_fail,
9483*5113495bSYour Name 				  idx);
9484*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj, tx_i,
9485*5113495bSYour Name 				  dropped.fail_per_pkt_vdev_id_check, idx);
9486*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj, tx_i, dropped.desc_na.num,
9487*5113495bSYour Name 				  idx);
9488*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj, tx_i, dropped.res_full, idx);
9489*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj, tx_i, dropped.drop_ingress,
9490*5113495bSYour Name 				  idx);
9491*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj, tx_i,
9492*5113495bSYour Name 				  dropped.headroom_insufficient, idx);
9493*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj, tx_i,
9494*5113495bSYour Name 				  dropped.invalid_peer_id_in_exc_path, idx);
9495*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj, tx_i,
9496*5113495bSYour Name 				  dropped.tx_mcast_drop, idx);
9497*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj, tx_i, dropped.fw2wbm_tx_drop,
9498*5113495bSYour Name 				  idx);
9499*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj, tx_i, cce_classified, idx);
9500*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj, tx_i, cce_classified_raw,
9501*5113495bSYour Name 				  idx);
9502*5113495bSYour Name 		DP_STATS_AGGR_PKT_IDX(tgtobj, srcobj, tx_i, sniffer_rcvd, idx);
9503*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj, tx_i, mesh.exception_fw, idx);
9504*5113495bSYour Name 		DP_STATS_AGGR_IDX(tgtobj, srcobj, tx_i, mesh.completion_fw,
9505*5113495bSYour Name 				  idx);
9506*5113495bSYour Name 	}
9507*5113495bSYour Name 	DP_STATS_AGGR_PKT(tgtobj, srcobj, rx_i.reo_rcvd_pkt);
9508*5113495bSYour Name 	DP_STATS_AGGR_PKT(tgtobj, srcobj, rx_i.null_q_desc_pkt);
9509*5113495bSYour Name 	DP_STATS_AGGR_PKT(tgtobj, srcobj, rx_i.routed_eapol_pkt);
9510*5113495bSYour Name 
9511*5113495bSYour Name 	tgtobj->stats.tx_i.dropped.dropped_pkt.num =
9512*5113495bSYour Name 		tgtobj->stats.tx_i.dropped.dma_error +
9513*5113495bSYour Name 		tgtobj->stats.tx_i.dropped.ring_full +
9514*5113495bSYour Name 		tgtobj->stats.tx_i.dropped.enqueue_fail +
9515*5113495bSYour Name 		tgtobj->stats.tx_i.dropped.fail_per_pkt_vdev_id_check +
9516*5113495bSYour Name 		tgtobj->stats.tx_i.dropped.desc_na.num +
9517*5113495bSYour Name 		tgtobj->stats.tx_i.dropped.res_full +
9518*5113495bSYour Name 		tgtobj->stats.tx_i.dropped.drop_ingress +
9519*5113495bSYour Name 		tgtobj->stats.tx_i.dropped.headroom_insufficient +
9520*5113495bSYour Name 		tgtobj->stats.tx_i.dropped.invalid_peer_id_in_exc_path +
9521*5113495bSYour Name 		tgtobj->stats.tx_i.dropped.tx_mcast_drop;
9522*5113495bSYour Name }
9523*5113495bSYour Name 
dp_txrx_get_soc_stats(struct cdp_soc_t * soc_hdl,struct cdp_soc_stats * soc_stats)9524*5113495bSYour Name QDF_STATUS dp_txrx_get_soc_stats(struct cdp_soc_t *soc_hdl,
9525*5113495bSYour Name 				 struct cdp_soc_stats *soc_stats)
9526*5113495bSYour Name {
9527*5113495bSYour Name 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9528*5113495bSYour Name 	uint8_t inx;
9529*5113495bSYour Name 	uint8_t cpus;
9530*5113495bSYour Name 
9531*5113495bSYour Name 	/* soc tx stats */
9532*5113495bSYour Name 	soc_stats->tx.egress = soc->stats.tx.egress[0];
9533*5113495bSYour Name 	soc_stats->tx.tx_invalid_peer = soc->stats.tx.tx_invalid_peer;
9534*5113495bSYour Name 	for (inx = 0; inx < CDP_MAX_TX_DATA_RINGS; inx++) {
9535*5113495bSYour Name 		soc_stats->tx.tx_hw_enq[inx] = soc->stats.tx.tcl_enq[inx];
9536*5113495bSYour Name 		soc_stats->tx.tx_hw_ring_full[inx] =
9537*5113495bSYour Name 					soc->stats.tx.tcl_ring_full[inx];
9538*5113495bSYour Name 	}
9539*5113495bSYour Name 	soc_stats->tx.desc_in_use = soc->stats.tx.desc_in_use;
9540*5113495bSYour Name 	soc_stats->tx.dropped_fw_removed = soc->stats.tx.dropped_fw_removed;
9541*5113495bSYour Name 	soc_stats->tx.invalid_release_source =
9542*5113495bSYour Name 					soc->stats.tx.invalid_release_source;
9543*5113495bSYour Name 	soc_stats->tx.invalid_tx_comp_desc =
9544*5113495bSYour Name 					soc->stats.tx.invalid_tx_comp_desc;
9545*5113495bSYour Name 	for (inx = 0; inx < CDP_MAX_WIFI_INT_ERROR_REASONS; inx++)
9546*5113495bSYour Name 		soc_stats->tx.wifi_internal_error[inx] =
9547*5113495bSYour Name 					soc->stats.tx.wbm_internal_error[inx];
9548*5113495bSYour Name 	soc_stats->tx.non_wifi_internal_err =
9549*5113495bSYour Name 					soc->stats.tx.non_wbm_internal_err;
9550*5113495bSYour Name 	soc_stats->tx.tx_comp_loop_pkt_limit_hit =
9551*5113495bSYour Name 				soc->stats.tx.tx_comp_loop_pkt_limit_hit;
9552*5113495bSYour Name 	soc_stats->tx.hp_oos2 = soc->stats.tx.hp_oos2;
9553*5113495bSYour Name 	soc_stats->tx.tx_comp_exception = soc->stats.tx.tx_comp_exception;
9554*5113495bSYour Name 	/* soc rx stats */
9555*5113495bSYour Name 	soc_stats->rx.ingress = soc->stats.rx.ingress;
9556*5113495bSYour Name 	soc_stats->rx.err_ring_pkts = soc->stats.rx.err_ring_pkts;
9557*5113495bSYour Name 	soc_stats->rx.rx_frags = soc->stats.rx.rx_frags;
9558*5113495bSYour Name 	soc_stats->rx.rx_hw_reinject = soc->stats.rx.reo_reinject;
9559*5113495bSYour Name 	soc_stats->rx.bar_frame = soc->stats.rx.bar_frame;
9560*5113495bSYour Name 	soc_stats->rx.rx_frag_err_len_error =
9561*5113495bSYour Name 					soc->stats.rx.rx_frag_err_len_error;
9562*5113495bSYour Name 	soc_stats->rx.rx_frag_err_no_peer = soc->stats.rx.rx_frag_err_no_peer;
9563*5113495bSYour Name 	soc_stats->rx.rx_frag_wait = soc->stats.rx.rx_frag_wait;
9564*5113495bSYour Name 	soc_stats->rx.rx_frag_err = soc->stats.rx.rx_frag_err;
9565*5113495bSYour Name 	soc_stats->rx.rx_frag_oor = soc->stats.rx.rx_frag_oor;
9566*5113495bSYour Name 	soc_stats->rx.reap_loop_pkt_limit_hit =
9567*5113495bSYour Name 					soc->stats.rx.reap_loop_pkt_limit_hit;
9568*5113495bSYour Name 	soc_stats->rx.hp_oos2 = soc->stats.rx.hp_oos2;
9569*5113495bSYour Name 	soc_stats->rx.near_full = soc->stats.rx.near_full;
9570*5113495bSYour Name 	soc_stats->rx.msdu_scatter_wait_break =
9571*5113495bSYour Name 					soc->stats.rx.msdu_scatter_wait_break;
9572*5113495bSYour Name 	soc_stats->rx.rx_sw_route_drop = soc->stats.rx.rxdma2rel_route_drop;
9573*5113495bSYour Name 	soc_stats->rx.rx_hw_route_drop = soc->stats.rx.reo2rel_route_drop;
9574*5113495bSYour Name 	soc_stats->rx.rx_packets.num_cpus = qdf_min((uint32_t)CDP_NR_CPUS,
9575*5113495bSYour Name 						    num_possible_cpus());
9576*5113495bSYour Name 	for (cpus = 0; cpus < soc_stats->rx.rx_packets.num_cpus; cpus++) {
9577*5113495bSYour Name 		for (inx = 0; inx < CDP_MAX_RX_DEST_RINGS; inx++)
9578*5113495bSYour Name 			soc_stats->rx.rx_packets.pkts[cpus][inx] =
9579*5113495bSYour Name 					soc->stats.rx.ring_packets[cpus][inx];
9580*5113495bSYour Name 	}
9581*5113495bSYour Name 	soc_stats->rx.err.rx_rejected = soc->stats.rx.err.rejected;
9582*5113495bSYour Name 	soc_stats->rx.err.rx_raw_frm_drop = soc->stats.rx.err.raw_frm_drop;
9583*5113495bSYour Name 	soc_stats->rx.err.phy_ring_access_fail =
9584*5113495bSYour Name 					soc->stats.rx.err.hal_ring_access_fail;
9585*5113495bSYour Name 	soc_stats->rx.err.phy_ring_access_full_fail =
9586*5113495bSYour Name 				soc->stats.rx.err.hal_ring_access_full_fail;
9587*5113495bSYour Name 	for (inx = 0; inx < CDP_MAX_RX_DEST_RINGS; inx++)
9588*5113495bSYour Name 		soc_stats->rx.err.phy_rx_hw_error[inx] =
9589*5113495bSYour Name 					soc->stats.rx.err.hal_reo_error[inx];
9590*5113495bSYour Name 	soc_stats->rx.err.phy_rx_hw_dest_dup =
9591*5113495bSYour Name 					soc->stats.rx.err.hal_reo_dest_dup;
9592*5113495bSYour Name 	soc_stats->rx.err.phy_wifi_rel_dup = soc->stats.rx.err.hal_wbm_rel_dup;
9593*5113495bSYour Name 	soc_stats->rx.err.phy_rx_sw_err_dup =
9594*5113495bSYour Name 					soc->stats.rx.err.hal_rxdma_err_dup;
9595*5113495bSYour Name 	soc_stats->rx.err.invalid_rbm = soc->stats.rx.err.invalid_rbm;
9596*5113495bSYour Name 	soc_stats->rx.err.invalid_vdev = soc->stats.rx.err.invalid_vdev;
9597*5113495bSYour Name 	soc_stats->rx.err.invalid_pdev = soc->stats.rx.err.invalid_pdev;
9598*5113495bSYour Name 	soc_stats->rx.err.pkt_delivered_no_peer =
9599*5113495bSYour Name 					soc->stats.rx.err.pkt_delivered_no_peer;
9600*5113495bSYour Name 	soc_stats->rx.err.defrag_peer_uninit =
9601*5113495bSYour Name 					soc->stats.rx.err.defrag_peer_uninit;
9602*5113495bSYour Name 	soc_stats->rx.err.invalid_sa_da_idx =
9603*5113495bSYour Name 					soc->stats.rx.err.invalid_sa_da_idx;
9604*5113495bSYour Name 	soc_stats->rx.err.msdu_done_fail = soc->stats.rx.err.msdu_done_fail;
9605*5113495bSYour Name 	soc_stats->rx.err.rx_invalid_peer = soc->stats.rx.err.rx_invalid_peer;
9606*5113495bSYour Name 	soc_stats->rx.err.rx_invalid_peer_id =
9607*5113495bSYour Name 					soc->stats.rx.err.rx_invalid_peer_id;
9608*5113495bSYour Name 	soc_stats->rx.err.rx_invalid_pkt_len =
9609*5113495bSYour Name 					soc->stats.rx.err.rx_invalid_pkt_len;
9610*5113495bSYour Name 	for (inx = 0; inx < qdf_min((uint32_t)CDP_WIFI_ERR_MAX,
9611*5113495bSYour Name 				    (uint32_t)HAL_RXDMA_ERR_MAX); inx++)
9612*5113495bSYour Name 		soc_stats->rx.err.rx_sw_error[inx] =
9613*5113495bSYour Name 					soc->stats.rx.err.rxdma_error[inx];
9614*5113495bSYour Name 	for (inx = 0; inx < qdf_min((uint32_t)CDP_RX_ERR_MAX,
9615*5113495bSYour Name 				    (uint32_t)HAL_REO_ERR_MAX); inx++)
9616*5113495bSYour Name 		soc_stats->rx.err.rx_hw_error[inx] =
9617*5113495bSYour Name 					soc->stats.rx.err.reo_error[inx];
9618*5113495bSYour Name 	soc_stats->rx.err.rx_desc_invalid_magic =
9619*5113495bSYour Name 					soc->stats.rx.err.rx_desc_invalid_magic;
9620*5113495bSYour Name 	soc_stats->rx.err.rx_hw_cmd_send_fail =
9621*5113495bSYour Name 					soc->stats.rx.err.reo_cmd_send_fail;
9622*5113495bSYour Name 	soc_stats->rx.err.rx_hw_cmd_send_drain =
9623*5113495bSYour Name 					soc->stats.rx.err.reo_cmd_send_drain;
9624*5113495bSYour Name 	soc_stats->rx.err.scatter_msdu = soc->stats.rx.err.scatter_msdu;
9625*5113495bSYour Name 	soc_stats->rx.err.invalid_cookie = soc->stats.rx.err.invalid_cookie;
9626*5113495bSYour Name 	soc_stats->rx.err.stale_cookie = soc->stats.rx.err.stale_cookie;
9627*5113495bSYour Name 	soc_stats->rx.err.rx_2k_jump_delba_sent =
9628*5113495bSYour Name 					soc->stats.rx.err.rx_2k_jump_delba_sent;
9629*5113495bSYour Name 	soc_stats->rx.err.rx_2k_jump_to_stack =
9630*5113495bSYour Name 					soc->stats.rx.err.rx_2k_jump_to_stack;
9631*5113495bSYour Name 	soc_stats->rx.err.rx_2k_jump_drop = soc->stats.rx.err.rx_2k_jump_drop;
9632*5113495bSYour Name 	soc_stats->rx.err.rx_hw_err_msdu_buf_rcved =
9633*5113495bSYour Name 				soc->stats.rx.err.reo_err_msdu_buf_rcved;
9634*5113495bSYour Name 	soc_stats->rx.err.rx_hw_err_msdu_buf_invalid_cookie =
9635*5113495bSYour Name 			soc->stats.rx.err.reo_err_msdu_buf_invalid_cookie;
9636*5113495bSYour Name 	soc_stats->rx.err.rx_hw_err_oor_drop =
9637*5113495bSYour Name 					soc->stats.rx.err.reo_err_oor_drop;
9638*5113495bSYour Name 	soc_stats->rx.err.rx_hw_err_oor_to_stack =
9639*5113495bSYour Name 					soc->stats.rx.err.reo_err_oor_to_stack;
9640*5113495bSYour Name 	soc_stats->rx.err.rx_hw_err_oor_sg_count =
9641*5113495bSYour Name 					soc->stats.rx.err.reo_err_oor_sg_count;
9642*5113495bSYour Name 	soc_stats->rx.err.msdu_count_mismatch =
9643*5113495bSYour Name 					soc->stats.rx.err.msdu_count_mismatch;
9644*5113495bSYour Name 	soc_stats->rx.err.invalid_link_cookie =
9645*5113495bSYour Name 					soc->stats.rx.err.invalid_link_cookie;
9646*5113495bSYour Name 	soc_stats->rx.err.nbuf_sanity_fail = soc->stats.rx.err.nbuf_sanity_fail;
9647*5113495bSYour Name 	soc_stats->rx.err.dup_refill_link_desc =
9648*5113495bSYour Name 					soc->stats.rx.err.dup_refill_link_desc;
9649*5113495bSYour Name 	soc_stats->rx.err.msdu_continuation_err =
9650*5113495bSYour Name 					soc->stats.rx.err.msdu_continuation_err;
9651*5113495bSYour Name 	soc_stats->rx.err.ssn_update_count = soc->stats.rx.err.ssn_update_count;
9652*5113495bSYour Name 	soc_stats->rx.err.bar_handle_fail_count =
9653*5113495bSYour Name 					soc->stats.rx.err.bar_handle_fail_count;
9654*5113495bSYour Name 	soc_stats->rx.err.intrabss_eapol_drop =
9655*5113495bSYour Name 					soc->stats.rx.err.intrabss_eapol_drop;
9656*5113495bSYour Name 	soc_stats->rx.err.pn_in_dest_check_fail =
9657*5113495bSYour Name 					soc->stats.rx.err.pn_in_dest_check_fail;
9658*5113495bSYour Name 	soc_stats->rx.err.msdu_len_err = soc->stats.rx.err.msdu_len_err;
9659*5113495bSYour Name 	soc_stats->rx.err.rx_flush_count = soc->stats.rx.err.rx_flush_count;
9660*5113495bSYour Name 	/* soc ast stats */
9661*5113495bSYour Name 	soc_stats->ast.added = soc->stats.ast.added;
9662*5113495bSYour Name 	soc_stats->ast.deleted = soc->stats.ast.deleted;
9663*5113495bSYour Name 	soc_stats->ast.aged_out = soc->stats.ast.aged_out;
9664*5113495bSYour Name 	soc_stats->ast.map_err = soc->stats.ast.map_err;
9665*5113495bSYour Name 	soc_stats->ast.ast_mismatch = soc->stats.ast.ast_mismatch;
9666*5113495bSYour Name 	/* soc mec stats */
9667*5113495bSYour Name 	soc_stats->mec.added = soc->stats.mec.added;
9668*5113495bSYour Name 	soc_stats->mec.deleted = soc->stats.mec.deleted;
9669*5113495bSYour Name 
9670*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
9671*5113495bSYour Name }
9672*5113495bSYour Name 
9673*5113495bSYour Name #ifdef QCA_PEER_EXT_STATS
9674*5113495bSYour Name 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*5113495bSYour Name dp_txrx_get_peer_delay_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
9676*5113495bSYour Name 			     uint8_t *peer_mac,
9677*5113495bSYour Name 			     struct cdp_delay_tid_stats *delay_stats)
9678*5113495bSYour Name {
9679*5113495bSYour Name 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9680*5113495bSYour Name 	struct dp_peer *peer = NULL;
9681*5113495bSYour Name 	struct dp_peer_delay_stats *pext_stats;
9682*5113495bSYour Name 	struct cdp_delay_rx_stats *rx_delay;
9683*5113495bSYour Name 	struct cdp_delay_tx_stats *tx_delay;
9684*5113495bSYour Name 	uint8_t tid;
9685*5113495bSYour Name 	struct cdp_peer_info peer_info = { 0 };
9686*5113495bSYour Name 
9687*5113495bSYour Name 	if (!wlan_cfg_is_peer_ext_stats_enabled(soc->wlan_cfg_ctx))
9688*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
9689*5113495bSYour Name 
9690*5113495bSYour Name 	DP_PEER_INFO_PARAMS_INIT(&peer_info, vdev_id, peer_mac, false,
9691*5113495bSYour Name 				 CDP_WILD_PEER_TYPE);
9692*5113495bSYour Name 
9693*5113495bSYour Name 	peer = dp_peer_hash_find_wrapper(soc, &peer_info, DP_MOD_ID_CDP);
9694*5113495bSYour Name 	if (!peer)
9695*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
9696*5113495bSYour Name 
9697*5113495bSYour Name 	if (!peer->txrx_peer) {
9698*5113495bSYour Name 		dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
9699*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
9700*5113495bSYour Name 	}
9701*5113495bSYour Name 
9702*5113495bSYour Name 	pext_stats = peer->txrx_peer->delay_stats;
9703*5113495bSYour Name 	if (!pext_stats) {
9704*5113495bSYour Name 		dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
9705*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
9706*5113495bSYour Name 	}
9707*5113495bSYour Name 
9708*5113495bSYour Name 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
9709*5113495bSYour Name 		rx_delay = &delay_stats[tid].rx_delay;
9710*5113495bSYour Name 		dp_accumulate_delay_tid_stats(soc, pext_stats->delay_tid_stats,
9711*5113495bSYour Name 					      &rx_delay->to_stack_delay, tid,
9712*5113495bSYour Name 					      CDP_HIST_TYPE_REAP_STACK);
9713*5113495bSYour Name 		tx_delay = &delay_stats[tid].tx_delay;
9714*5113495bSYour Name 		dp_accumulate_delay_avg_stats(pext_stats->delay_tid_stats,
9715*5113495bSYour Name 					      tx_delay,
9716*5113495bSYour Name 					      tid);
9717*5113495bSYour Name 		dp_accumulate_delay_tid_stats(soc, pext_stats->delay_tid_stats,
9718*5113495bSYour Name 					      &tx_delay->tx_swq_delay, tid,
9719*5113495bSYour Name 					      CDP_HIST_TYPE_SW_ENQEUE_DELAY);
9720*5113495bSYour Name 		dp_accumulate_delay_tid_stats(soc, pext_stats->delay_tid_stats,
9721*5113495bSYour Name 					      &tx_delay->hwtx_delay, tid,
9722*5113495bSYour Name 					      CDP_HIST_TYPE_HW_COMP_DELAY);
9723*5113495bSYour Name 	}
9724*5113495bSYour Name 	dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
9725*5113495bSYour Name 
9726*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
9727*5113495bSYour Name }
9728*5113495bSYour Name #else
9729*5113495bSYour Name 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*5113495bSYour Name dp_txrx_get_peer_delay_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
9731*5113495bSYour Name 			     uint8_t *peer_mac,
9732*5113495bSYour Name 			     struct cdp_delay_tid_stats *delay_stats)
9733*5113495bSYour Name {
9734*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
9735*5113495bSYour Name }
9736*5113495bSYour Name #endif /* QCA_PEER_EXT_STATS */
9737*5113495bSYour Name 
9738*5113495bSYour Name #ifdef WLAN_PEER_JITTER
9739*5113495bSYour Name 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*5113495bSYour Name dp_txrx_get_peer_jitter_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
9741*5113495bSYour Name 			      uint8_t vdev_id, uint8_t *peer_mac,
9742*5113495bSYour Name 			      struct cdp_peer_tid_stats *tid_stats)
9743*5113495bSYour Name {
9744*5113495bSYour Name 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9745*5113495bSYour Name 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
9746*5113495bSYour Name 	struct dp_peer *peer = NULL;
9747*5113495bSYour Name 	uint8_t tid;
9748*5113495bSYour Name 	struct cdp_peer_info peer_info = { 0 };
9749*5113495bSYour Name 	struct cdp_peer_tid_stats *jitter_stats;
9750*5113495bSYour Name 	uint8_t ring_id;
9751*5113495bSYour Name 
9752*5113495bSYour Name 	if (!pdev)
9753*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
9754*5113495bSYour Name 
9755*5113495bSYour Name 	if (!wlan_cfg_is_peer_jitter_stats_enabled(soc->wlan_cfg_ctx))
9756*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
9757*5113495bSYour Name 
9758*5113495bSYour Name 	DP_PEER_INFO_PARAMS_INIT(&peer_info, vdev_id, peer_mac, false,
9759*5113495bSYour Name 				 CDP_WILD_PEER_TYPE);
9760*5113495bSYour Name 
9761*5113495bSYour Name 	peer = dp_peer_hash_find_wrapper(soc, &peer_info, DP_MOD_ID_CDP);
9762*5113495bSYour Name 	if (!peer)
9763*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
9764*5113495bSYour Name 
9765*5113495bSYour Name 	if (!peer->txrx_peer || !peer->txrx_peer->jitter_stats) {
9766*5113495bSYour Name 		dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
9767*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
9768*5113495bSYour Name 	}
9769*5113495bSYour Name 
9770*5113495bSYour Name 	if (wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) {
9771*5113495bSYour Name 		for (tid = 0; tid < qdf_min(CDP_DATA_TID_MAX, DP_MAX_TIDS); tid++) {
9772*5113495bSYour Name 			struct cdp_peer_tid_stats *rx_tid =
9773*5113495bSYour Name 					&peer->txrx_peer->jitter_stats[tid];
9774*5113495bSYour Name 
9775*5113495bSYour Name 			tid_stats[tid].tx_avg_jitter = rx_tid->tx_avg_jitter;
9776*5113495bSYour Name 			tid_stats[tid].tx_avg_delay = rx_tid->tx_avg_delay;
9777*5113495bSYour Name 			tid_stats[tid].tx_avg_err = rx_tid->tx_avg_err;
9778*5113495bSYour Name 			tid_stats[tid].tx_total_success = rx_tid->tx_total_success;
9779*5113495bSYour Name 			tid_stats[tid].tx_drop = rx_tid->tx_drop;
9780*5113495bSYour Name 		}
9781*5113495bSYour Name 
9782*5113495bSYour Name 	} else {
9783*5113495bSYour Name 		jitter_stats = peer->txrx_peer->jitter_stats;
9784*5113495bSYour Name 		for (tid = 0; tid < qdf_min(CDP_DATA_TID_MAX, DP_MAX_TIDS); tid++) {
9785*5113495bSYour Name 			for (ring_id = 0; ring_id < CDP_MAX_TXRX_CTX; ring_id++) {
9786*5113495bSYour Name 				struct cdp_peer_tid_stats *rx_tid =
9787*5113495bSYour Name 					&jitter_stats[tid *
9788*5113495bSYour Name 					CDP_MAX_TXRX_CTX + ring_id];
9789*5113495bSYour Name 				tid_stats[tid].tx_avg_jitter =
9790*5113495bSYour Name 					(rx_tid->tx_avg_jitter +
9791*5113495bSYour Name 					tid_stats[tid].tx_avg_jitter) >> 1;
9792*5113495bSYour Name 				tid_stats[tid].tx_avg_delay =
9793*5113495bSYour Name 					(rx_tid->tx_avg_delay +
9794*5113495bSYour Name 					tid_stats[tid].tx_avg_delay) >> 1;
9795*5113495bSYour Name 				tid_stats[tid].tx_avg_err = (rx_tid->tx_avg_err
9796*5113495bSYour Name 					+ tid_stats[tid].tx_avg_err) >> 1;
9797*5113495bSYour Name 				tid_stats[tid].tx_total_success +=
9798*5113495bSYour Name 						rx_tid->tx_total_success;
9799*5113495bSYour Name 				tid_stats[tid].tx_drop += rx_tid->tx_drop;
9800*5113495bSYour Name 			}
9801*5113495bSYour Name 		}
9802*5113495bSYour Name 	}
9803*5113495bSYour Name 
9804*5113495bSYour Name 	dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
9805*5113495bSYour Name 
9806*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
9807*5113495bSYour Name }
9808*5113495bSYour Name #else
9809*5113495bSYour Name 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*5113495bSYour Name dp_txrx_get_peer_jitter_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
9811*5113495bSYour Name 			      uint8_t vdev_id, uint8_t *peer_mac,
9812*5113495bSYour Name 			      struct cdp_peer_tid_stats *tid_stats)
9813*5113495bSYour Name {
9814*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
9815*5113495bSYour Name }
9816*5113495bSYour Name #endif /* WLAN_PEER_JITTER */
9817*5113495bSYour Name 
9818*5113495bSYour Name #ifdef WLAN_TX_PKT_CAPTURE_ENH
9819*5113495bSYour Name 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*5113495bSYour Name dp_peer_get_tx_capture_stats(struct cdp_soc_t *soc_hdl,
9821*5113495bSYour Name 			     uint8_t vdev_id, uint8_t *peer_mac,
9822*5113495bSYour Name 			     struct cdp_peer_tx_capture_stats *stats)
9823*5113495bSYour Name {
9824*5113495bSYour Name 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9825*5113495bSYour Name 	struct dp_peer *peer = dp_peer_find_hash_find(soc, peer_mac, 0, vdev_id,
9826*5113495bSYour Name 						      DP_MOD_ID_TX_CAPTURE);
9827*5113495bSYour Name 	QDF_STATUS status;
9828*5113495bSYour Name 
9829*5113495bSYour Name 	if (!peer)
9830*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
9831*5113495bSYour Name 
9832*5113495bSYour Name 	status = dp_monitor_peer_tx_capture_get_stats(soc, peer, stats);
9833*5113495bSYour Name 	dp_peer_unref_delete(peer, DP_MOD_ID_TX_CAPTURE);
9834*5113495bSYour Name 
9835*5113495bSYour Name 	return status;
9836*5113495bSYour Name }
9837*5113495bSYour Name 
9838*5113495bSYour Name 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*5113495bSYour Name dp_pdev_get_tx_capture_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
9840*5113495bSYour Name 			     struct cdp_pdev_tx_capture_stats *stats)
9841*5113495bSYour Name {
9842*5113495bSYour Name 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9843*5113495bSYour Name 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
9844*5113495bSYour Name 
9845*5113495bSYour Name 	if (!pdev)
9846*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
9847*5113495bSYour Name 
9848*5113495bSYour Name 	return dp_monitor_pdev_tx_capture_get_stats(soc, pdev, stats);
9849*5113495bSYour Name }
9850*5113495bSYour Name #else /* WLAN_TX_PKT_CAPTURE_ENH */
9851*5113495bSYour Name 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*5113495bSYour Name dp_peer_get_tx_capture_stats(struct cdp_soc_t *soc_hdl,
9853*5113495bSYour Name 			     uint8_t vdev_id, uint8_t *peer_mac,
9854*5113495bSYour Name 			     struct cdp_peer_tx_capture_stats *stats)
9855*5113495bSYour Name {
9856*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
9857*5113495bSYour Name }
9858*5113495bSYour Name 
9859*5113495bSYour Name 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*5113495bSYour Name dp_pdev_get_tx_capture_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
9861*5113495bSYour Name 			     struct cdp_pdev_tx_capture_stats *stats)
9862*5113495bSYour Name {
9863*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
9864*5113495bSYour Name }
9865*5113495bSYour Name #endif /* WLAN_TX_PKT_CAPTURE_ENH */
9866*5113495bSYour Name 
9867*5113495bSYour Name #ifdef WLAN_CONFIG_TELEMETRY_AGENT
9868*5113495bSYour Name QDF_STATUS
dp_get_pdev_telemetry_stats(struct cdp_soc_t * soc_hdl,uint8_t pdev_id,struct cdp_pdev_telemetry_stats * stats)9869*5113495bSYour Name dp_get_pdev_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
9870*5113495bSYour Name 			    struct cdp_pdev_telemetry_stats *stats)
9871*5113495bSYour Name {
9872*5113495bSYour Name 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9873*5113495bSYour Name 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
9874*5113495bSYour Name 	uint8_t ac = 0;
9875*5113495bSYour Name 
9876*5113495bSYour Name 	if (!pdev)
9877*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
9878*5113495bSYour Name 
9879*5113495bSYour Name 	/* consumption is in micro seconds, convert it to seconds and
9880*5113495bSYour Name 	 * then calculate %age per sec
9881*5113495bSYour Name 	 */
9882*5113495bSYour Name 	for (ac = 0; ac < WME_AC_MAX; ac++) {
9883*5113495bSYour Name 		stats->link_airtime[ac] =
9884*5113495bSYour Name 			((pdev->stats.telemetry_stats.link_airtime[ac] * 100) / 1000000);
9885*5113495bSYour Name 		stats->tx_mpdu_failed[ac] = pdev->stats.telemetry_stats.tx_mpdu_failed[ac];
9886*5113495bSYour Name 		stats->tx_mpdu_total[ac] = pdev->stats.telemetry_stats.tx_mpdu_total[ac];
9887*5113495bSYour Name 	}
9888*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
9889*5113495bSYour Name }
9890*5113495bSYour Name 
9891*5113495bSYour Name QDF_STATUS
dp_get_peer_telemetry_stats(struct cdp_soc_t * soc_hdl,uint8_t * addr,struct cdp_peer_telemetry_stats * stats)9892*5113495bSYour Name dp_get_peer_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t *addr,
9893*5113495bSYour Name 			    struct cdp_peer_telemetry_stats *stats)
9894*5113495bSYour Name {
9895*5113495bSYour Name 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9896*5113495bSYour Name 	struct dp_peer *peer = dp_peer_find_hash_find(soc, addr, 0, DP_VDEV_ALL,
9897*5113495bSYour Name 						      DP_MOD_ID_MISC);
9898*5113495bSYour Name 
9899*5113495bSYour Name 	if (!peer)
9900*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
9901*5113495bSYour Name 
9902*5113495bSYour Name 	dp_monitor_peer_telemetry_stats(peer, stats);
9903*5113495bSYour Name 	dp_peer_unref_delete(peer, DP_MOD_ID_MISC);
9904*5113495bSYour Name 
9905*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
9906*5113495bSYour Name }
9907*5113495bSYour Name 
9908*5113495bSYour Name QDF_STATUS
dp_get_pdev_deter_stats(struct cdp_soc_t * soc_hdl,uint8_t pdev_id,struct cdp_pdev_deter_stats * stats)9909*5113495bSYour Name dp_get_pdev_deter_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
9910*5113495bSYour Name 			struct cdp_pdev_deter_stats *stats)
9911*5113495bSYour Name {
9912*5113495bSYour Name 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9913*5113495bSYour Name 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
9914*5113495bSYour Name 
9915*5113495bSYour Name 	if (!pdev)
9916*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
9917*5113495bSYour Name 
9918*5113495bSYour Name 	qdf_mem_copy(stats->dl_ofdma_usr, pdev->stats.deter_stats.dl_ofdma_usr,
9919*5113495bSYour Name 		     sizeof(stats->dl_ofdma_usr[0]) * CDP_MU_MAX_USERS);
9920*5113495bSYour Name 	qdf_mem_copy(stats->ul_ofdma_usr, pdev->stats.deter_stats.ul_ofdma_usr,
9921*5113495bSYour Name 		     sizeof(stats->ul_ofdma_usr[0]) * CDP_MU_MAX_USERS);
9922*5113495bSYour Name 	qdf_mem_copy(stats->dl_mimo_usr, pdev->stats.deter_stats.dl_mimo_usr,
9923*5113495bSYour Name 		     sizeof(stats->dl_mimo_usr[0]) * CDP_MU_MAX_MIMO_USERS);
9924*5113495bSYour Name 	qdf_mem_copy(stats->ul_mimo_usr, pdev->stats.deter_stats.ul_mimo_usr,
9925*5113495bSYour Name 		     sizeof(stats->ul_mimo_usr[0]) * CDP_MU_MAX_MIMO_USERS);
9926*5113495bSYour Name 
9927*5113495bSYour Name 	qdf_mem_copy(stats->ul_mode_cnt, pdev->stats.deter_stats.ul_mode_cnt,
9928*5113495bSYour Name 		     sizeof(stats->ul_mode_cnt[0]) * TX_MODE_UL_MAX);
9929*5113495bSYour Name 	qdf_mem_copy(stats->dl_mode_cnt, pdev->stats.deter_stats.dl_mode_cnt,
9930*5113495bSYour Name 		     sizeof(stats->dl_mode_cnt[0]) * TX_MODE_DL_MAX);
9931*5113495bSYour Name 	qdf_mem_copy(stats->ch_access_delay,
9932*5113495bSYour Name 		     pdev->stats.deter_stats.ch_access_delay,
9933*5113495bSYour Name 		     sizeof(stats->ch_access_delay[0]) * WME_AC_MAX);
9934*5113495bSYour Name 
9935*5113495bSYour Name 	qdf_mem_copy(stats->ts,
9936*5113495bSYour Name 		     pdev->stats.deter_stats.ts,
9937*5113495bSYour Name 		     sizeof(stats->ts[0]) * TX_MODE_UL_MAX);
9938*5113495bSYour Name 
9939*5113495bSYour Name 	stats->ch_util.ap_tx_util = pdev->stats.deter_stats.ch_util.ap_tx_util;
9940*5113495bSYour Name 	stats->ch_util.ap_rx_util = pdev->stats.deter_stats.ch_util.ap_rx_util;
9941*5113495bSYour Name 	stats->ch_util.ap_chan_util =
9942*5113495bSYour Name 			pdev->stats.deter_stats.ch_util.ap_chan_util;
9943*5113495bSYour Name 	stats->rx_su_cnt = pdev->stats.deter_stats.rx_su_cnt;
9944*5113495bSYour Name 
9945*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
9946*5113495bSYour Name }
9947*5113495bSYour Name 
9948*5113495bSYour Name 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*5113495bSYour Name dp_get_peer_deter_stats(struct cdp_soc_t *soc_hdl,
9950*5113495bSYour Name 			uint8_t vdev_id,
9951*5113495bSYour Name 			uint8_t *addr,
9952*5113495bSYour Name 			struct cdp_peer_deter_stats *stats)
9953*5113495bSYour Name {
9954*5113495bSYour Name 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9955*5113495bSYour Name 	struct dp_peer *peer = dp_peer_find_hash_find(soc, addr, 0, vdev_id,
9956*5113495bSYour Name 						      DP_MOD_ID_MISC);
9957*5113495bSYour Name 
9958*5113495bSYour Name 	if (!peer)
9959*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
9960*5113495bSYour Name 
9961*5113495bSYour Name 	dp_monitor_peer_deter_stats(peer, stats);
9962*5113495bSYour Name 	dp_peer_unref_delete(peer, DP_MOD_ID_MISC);
9963*5113495bSYour Name 
9964*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
9965*5113495bSYour Name }
9966*5113495bSYour Name 
9967*5113495bSYour Name 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*5113495bSYour Name dp_update_pdev_chan_util_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
9969*5113495bSYour Name 			       struct cdp_pdev_chan_util_stats *ch_util)
9970*5113495bSYour Name {
9971*5113495bSYour Name 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
9972*5113495bSYour Name 	struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
9973*5113495bSYour Name 
9974*5113495bSYour Name 	if (!pdev)
9975*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
9976*5113495bSYour Name 
9977*5113495bSYour Name 	pdev->stats.deter_stats.ch_util.ap_tx_util = ch_util->ap_tx_util;
9978*5113495bSYour Name 	pdev->stats.deter_stats.ch_util.ap_rx_util = ch_util->ap_rx_util;
9979*5113495bSYour Name 	pdev->stats.deter_stats.ch_util.ap_chan_util = ch_util->ap_chan_util;
9980*5113495bSYour Name 
9981*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
9982*5113495bSYour Name }
9983*5113495bSYour Name #endif
9984*5113495bSYour Name #ifndef CONFIG_AP_PLATFORM
9985*5113495bSYour Name #if defined WLAN_FEATURE_11BE_MLO && defined DP_MLO_LINK_STATS_SUPPORT
9986*5113495bSYour Name /**
9987*5113495bSYour Name  * dp_print_per_link_peer_txrx_stats() - print link peer stats
9988*5113495bSYour Name  * @peer_stats: buffer holding peer stats
9989*5113495bSYour Name  * @pdev: DP pdev handle
9990*5113495bSYour Name  *
9991*5113495bSYour Name  * return None
9992*5113495bSYour Name  */
9993*5113495bSYour Name static inline void
dp_print_per_link_peer_txrx_stats(struct cdp_peer_stats * peer_stats,struct dp_pdev * pdev)9994*5113495bSYour Name dp_print_per_link_peer_txrx_stats(struct cdp_peer_stats *peer_stats,
9995*5113495bSYour Name 				  struct dp_pdev *pdev)
9996*5113495bSYour Name {
9997*5113495bSYour Name 	uint8_t i;
9998*5113495bSYour Name 	uint32_t index;
9999*5113495bSYour Name 	uint32_t j;
10000*5113495bSYour Name 	char nss[DP_NSS_LENGTH];
10001*5113495bSYour Name 	char mu_group_id[DP_MU_GROUP_LENGTH];
10002*5113495bSYour Name 	uint32_t *pnss;
10003*5113495bSYour Name 	enum cdp_mu_packet_type rx_mu_type;
10004*5113495bSYour Name 	struct cdp_rx_mu *rx_mu;
10005*5113495bSYour Name 
10006*5113495bSYour Name 	DP_PRINT_STATS("peer_mac_addr = " QDF_MAC_ADDR_FMT,
10007*5113495bSYour Name 		       QDF_MAC_ADDR_REF(peer_stats->mac_addr.bytes));
10008*5113495bSYour Name 	DP_PRINT_STATS("Node Tx Stats:");
10009*5113495bSYour Name 	DP_PRINT_STATS("Success Packets = %llu",
10010*5113495bSYour Name 		       peer_stats->tx.tx_success.num);
10011*5113495bSYour Name 	DP_PRINT_STATS("Success Bytes = %llu",
10012*5113495bSYour Name 		       peer_stats->tx.tx_success.bytes);
10013*5113495bSYour Name 	DP_PRINT_STATS("Success Packets in TWT Session = %llu",
10014*5113495bSYour Name 		       peer_stats->tx.tx_success_twt.num);
10015*5113495bSYour Name 	DP_PRINT_STATS("Success Bytes in TWT Session = %llu",
10016*5113495bSYour Name 		       peer_stats->tx.tx_success_twt.bytes);
10017*5113495bSYour Name 	DP_PRINT_STATS("Unicast Success Packets = %llu",
10018*5113495bSYour Name 		       peer_stats->tx.ucast.num);
10019*5113495bSYour Name 	DP_PRINT_STATS("Unicast Success Bytes = %llu",
10020*5113495bSYour Name 		       peer_stats->tx.ucast.bytes);
10021*5113495bSYour Name 	DP_PRINT_STATS("Multicast Success Packets = %llu",
10022*5113495bSYour Name 		       peer_stats->tx.mcast.num);
10023*5113495bSYour Name 	DP_PRINT_STATS("Multicast Success Bytes = %llu",
10024*5113495bSYour Name 		       peer_stats->tx.mcast.bytes);
10025*5113495bSYour Name 	DP_PRINT_STATS("Broadcast Success Packets = %llu",
10026*5113495bSYour Name 		       peer_stats->tx.bcast.num);
10027*5113495bSYour Name 	DP_PRINT_STATS("Broadcast Success Bytes = %llu",
10028*5113495bSYour Name 		       peer_stats->tx.bcast.bytes);
10029*5113495bSYour Name 	DP_PRINT_STATS("Packets Successfully Sent after one or more retry = %u",
10030*5113495bSYour Name 		       peer_stats->tx.retry_count);
10031*5113495bSYour Name 	DP_PRINT_STATS("Packets  Sent Success after more than one retry = %u",
10032*5113495bSYour Name 		       peer_stats->tx.multiple_retry_count);
10033*5113495bSYour Name 	DP_PRINT_STATS("Packets Failed due to retry threshold breach = %u",
10034*5113495bSYour Name 		       peer_stats->tx.failed_retry_count);
10035*5113495bSYour Name 	DP_PRINT_STATS("Packets In OFDMA = %u",
10036*5113495bSYour Name 		       peer_stats->tx.ofdma);
10037*5113495bSYour Name 	DP_PRINT_STATS("Packets In STBC = %u",
10038*5113495bSYour Name 		       peer_stats->tx.stbc);
10039*5113495bSYour Name 	DP_PRINT_STATS("Packets In LDPC = %u",
10040*5113495bSYour Name 		       peer_stats->tx.ldpc);
10041*5113495bSYour Name 	DP_PRINT_STATS("Packet Retries = %u",
10042*5113495bSYour Name 		       peer_stats->tx.retries);
10043*5113495bSYour Name 	DP_PRINT_STATS("MSDU's Part of AMSDU = %u",
10044*5113495bSYour Name 		       peer_stats->tx.amsdu_cnt);
10045*5113495bSYour Name 	DP_PRINT_STATS("Msdu's As Part of Ampdu = %u",
10046*5113495bSYour Name 		       peer_stats->tx.non_ampdu_cnt);
10047*5113495bSYour Name 	DP_PRINT_STATS("Msdu's As Ampdu = %u",
10048*5113495bSYour Name 		       peer_stats->tx.ampdu_cnt);
10049*5113495bSYour Name 	DP_PRINT_STATS("Last Packet RSSI = %u",
10050*5113495bSYour Name 		       peer_stats->tx.last_ack_rssi);
10051*5113495bSYour Name 	DP_PRINT_STATS("Dropped At FW: Removed Pkts = %llu",
10052*5113495bSYour Name 		       peer_stats->tx.dropped.fw_rem.num);
10053*5113495bSYour Name 	DP_PRINT_STATS("Release source not TQM = %u",
10054*5113495bSYour Name 		       peer_stats->tx.release_src_not_tqm);
10055*5113495bSYour Name 	if (pdev &&
10056*5113495bSYour Name 	    !wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) {
10057*5113495bSYour Name 		DP_PRINT_STATS("Dropped At FW: Removed bytes = %llu",
10058*5113495bSYour Name 			       peer_stats->tx.dropped.fw_rem.bytes);
10059*5113495bSYour Name 	}
10060*5113495bSYour Name 	DP_PRINT_STATS("Dropped At FW: Removed transmitted = %u",
10061*5113495bSYour Name 		       peer_stats->tx.dropped.fw_rem_tx);
10062*5113495bSYour Name 	DP_PRINT_STATS("Dropped At FW: Removed Untransmitted = %u",
10063*5113495bSYour Name 		       peer_stats->tx.dropped.fw_rem_notx);
10064*5113495bSYour Name 	DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason1 = %u",
10065*5113495bSYour Name 		       peer_stats->tx.dropped.fw_reason1);
10066*5113495bSYour Name 	DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason2 = %u",
10067*5113495bSYour Name 		       peer_stats->tx.dropped.fw_reason2);
10068*5113495bSYour Name 	DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason3 = %u",
10069*5113495bSYour Name 		       peer_stats->tx.dropped.fw_reason3);
10070*5113495bSYour Name 	DP_PRINT_STATS("Dropped At FW:removed untransmitted disable queue = %u",
10071*5113495bSYour Name 		       peer_stats->tx.dropped.fw_rem_queue_disable);
10072*5113495bSYour Name 	DP_PRINT_STATS("Dropped At FW: removed untransmitted no match = %u",
10073*5113495bSYour Name 		       peer_stats->tx.dropped.fw_rem_no_match);
10074*5113495bSYour Name 	DP_PRINT_STATS("Dropped due to HW threshold criteria = %u",
10075*5113495bSYour Name 		       peer_stats->tx.dropped.drop_threshold);
10076*5113495bSYour Name 	DP_PRINT_STATS("Dropped due Link desc not available drop in HW = %u",
10077*5113495bSYour Name 		       peer_stats->tx.dropped.drop_link_desc_na);
10078*5113495bSYour Name 	DP_PRINT_STATS("Drop bit set or invalid flow = %u",
10079*5113495bSYour Name 		       peer_stats->tx.dropped.invalid_drop);
10080*5113495bSYour Name 	DP_PRINT_STATS("MCAST vdev drop in HW = %u",
10081*5113495bSYour Name 		       peer_stats->tx.dropped.mcast_vdev_drop);
10082*5113495bSYour Name 	DP_PRINT_STATS("Dropped : Age Out = %u",
10083*5113495bSYour Name 		       peer_stats->tx.dropped.age_out);
10084*5113495bSYour Name 	DP_PRINT_STATS("Dropped : Invalid Reason = %u",
10085*5113495bSYour Name 		       peer_stats->tx.dropped.invalid_rr);
10086*5113495bSYour Name 	DP_PRINT_STATS("NAWDS : ");
10087*5113495bSYour Name 	DP_PRINT_STATS("Nawds multicast Drop Tx Packet = %u",
10088*5113495bSYour Name 		       peer_stats->tx.nawds_mcast_drop);
10089*5113495bSYour Name 	DP_PRINT_STATS("	Nawds multicast  Tx Packet Count = %llu",
10090*5113495bSYour Name 		       peer_stats->tx.nawds_mcast.num);
10091*5113495bSYour Name 	DP_PRINT_STATS("	Nawds multicast Tx Packet Bytes = %llu",
10092*5113495bSYour Name 		       peer_stats->tx.nawds_mcast.bytes);
10093*5113495bSYour Name 
10094*5113495bSYour Name 	DP_PRINT_STATS("PPDU's = %u", peer_stats->tx.tx_ppdus);
10095*5113495bSYour Name 	DP_PRINT_STATS("Number of PPDU's with Punctured Preamble = %u",
10096*5113495bSYour Name 		       peer_stats->tx.pream_punct_cnt);
10097*5113495bSYour Name 	DP_PRINT_STATS("MPDU's Successful = %u",
10098*5113495bSYour Name 		       peer_stats->tx.tx_mpdus_success);
10099*5113495bSYour Name 	DP_PRINT_STATS("MPDU's Tried = %u",
10100*5113495bSYour Name 		       peer_stats->tx.tx_mpdus_tried);
10101*5113495bSYour Name 
10102*5113495bSYour Name 	DP_PRINT_STATS("Rate Info:");
10103*5113495bSYour Name 	dp_print_common_rates_info(peer_stats->tx.pkt_type);
10104*5113495bSYour Name 	DP_PRINT_STATS("SGI = 0.8us %u 0.4us %u 1.6us %u 3.2us %u",
10105*5113495bSYour Name 		       peer_stats->tx.sgi_count[0],
10106*5113495bSYour Name 		       peer_stats->tx.sgi_count[1],
10107*5113495bSYour Name 		       peer_stats->tx.sgi_count[2],
10108*5113495bSYour Name 		       peer_stats->tx.sgi_count[3]);
10109*5113495bSYour Name 
10110*5113495bSYour Name 	DP_PRINT_STATS("Wireless Mutlimedia ");
10111*5113495bSYour Name 	DP_PRINT_STATS("	 Best effort = %u",
10112*5113495bSYour Name 		       peer_stats->tx.wme_ac_type[0]);
10113*5113495bSYour Name 	DP_PRINT_STATS("	 Background= %u",
10114*5113495bSYour Name 		       peer_stats->tx.wme_ac_type[1]);
10115*5113495bSYour Name 	DP_PRINT_STATS("	 Video = %u",
10116*5113495bSYour Name 		       peer_stats->tx.wme_ac_type[2]);
10117*5113495bSYour Name 	DP_PRINT_STATS("	 Voice = %u",
10118*5113495bSYour Name 		       peer_stats->tx.wme_ac_type[3]);
10119*5113495bSYour Name 
10120*5113495bSYour Name 	DP_PRINT_STATS("Excess Retries per AC ");
10121*5113495bSYour Name 	DP_PRINT_STATS("	 Best effort = %u",
10122*5113495bSYour Name 		       peer_stats->tx.excess_retries_per_ac[0]);
10123*5113495bSYour Name 	DP_PRINT_STATS("	 Background= %u",
10124*5113495bSYour Name 		       peer_stats->tx.excess_retries_per_ac[1]);
10125*5113495bSYour Name 	DP_PRINT_STATS("	 Video = %u",
10126*5113495bSYour Name 		       peer_stats->tx.excess_retries_per_ac[2]);
10127*5113495bSYour Name 	DP_PRINT_STATS("	 Voice = %u",
10128*5113495bSYour Name 		       peer_stats->tx.excess_retries_per_ac[3]);
10129*5113495bSYour Name 
10130*5113495bSYour Name 	pnss = &peer_stats->tx.nss[0];
10131*5113495bSYour Name 	dp_print_nss(nss, pnss, SS_COUNT);
10132*5113495bSYour Name 
10133*5113495bSYour Name 	DP_PRINT_STATS("NSS(1-8) = %s", nss);
10134*5113495bSYour Name 
10135*5113495bSYour Name 	DP_PRINT_STATS("Transmit Type :");
10136*5113495bSYour Name 	DP_PRINT_STATS("MSDUs Success: SU %u, MU_MIMO %u, MU_OFDMA %u, MU_MIMO_OFDMA %u",
10137*5113495bSYour Name 		       peer_stats->tx.transmit_type[SU].num_msdu,
10138*5113495bSYour Name 		       peer_stats->tx.transmit_type[MU_MIMO].num_msdu,
10139*5113495bSYour Name 		       peer_stats->tx.transmit_type[MU_OFDMA].num_msdu,
10140*5113495bSYour Name 		       peer_stats->tx.transmit_type[MU_MIMO_OFDMA].num_msdu);
10141*5113495bSYour Name 
10142*5113495bSYour Name 	DP_PRINT_STATS("MPDUs Success: SU %u, MU_MIMO %u, MU_OFDMA %u, MU_MIMO_OFDMA %u",
10143*5113495bSYour Name 		       peer_stats->tx.transmit_type[SU].num_mpdu,
10144*5113495bSYour Name 		       peer_stats->tx.transmit_type[MU_MIMO].num_mpdu,
10145*5113495bSYour Name 		       peer_stats->tx.transmit_type[MU_OFDMA].num_mpdu,
10146*5113495bSYour Name 		       peer_stats->tx.transmit_type[MU_MIMO_OFDMA].num_mpdu);
10147*5113495bSYour Name 
10148*5113495bSYour Name 	DP_PRINT_STATS("MPDUs Tried: SU %u, MU_MIMO %u, MU_OFDMA %u, MU_MIMO_OFDMA %u",
10149*5113495bSYour Name 		       peer_stats->tx.transmit_type[SU].mpdu_tried,
10150*5113495bSYour Name 		       peer_stats->tx.transmit_type[MU_MIMO].mpdu_tried,
10151*5113495bSYour Name 		       peer_stats->tx.transmit_type[MU_OFDMA].mpdu_tried,
10152*5113495bSYour Name 		       peer_stats->tx.transmit_type[MU_MIMO_OFDMA].mpdu_tried);
10153*5113495bSYour Name 
10154*5113495bSYour Name 	for (i = 0; i < MAX_MU_GROUP_ID;) {
10155*5113495bSYour Name 		index = 0;
10156*5113495bSYour Name 		for (j = 0; j < DP_MU_GROUP_SHOW && i < MAX_MU_GROUP_ID;
10157*5113495bSYour Name 			j++) {
10158*5113495bSYour Name 			index += qdf_snprint(&mu_group_id[index],
10159*5113495bSYour Name 					     DP_MU_GROUP_LENGTH - index,
10160*5113495bSYour Name 					     " %u",
10161*5113495bSYour Name 					     peer_stats->tx.mu_group_id[i]);
10162*5113495bSYour Name 			i++;
10163*5113495bSYour Name 		}
10164*5113495bSYour Name 
10165*5113495bSYour Name 		DP_PRINT_STATS("User position list for GID %02d->%u: [%s]",
10166*5113495bSYour Name 			       i - DP_MU_GROUP_SHOW, i - 1,
10167*5113495bSYour Name 			       mu_group_id);
10168*5113495bSYour Name 	}
10169*5113495bSYour Name 
10170*5113495bSYour Name 	DP_PRINT_STATS("Last Packet RU index [%u], Size [%u]",
10171*5113495bSYour Name 		       peer_stats->tx.ru_start,
10172*5113495bSYour Name 		       peer_stats->tx.ru_tones);
10173*5113495bSYour Name 
10174*5113495bSYour Name 	DP_PRINT_STATS("Aggregation:");
10175*5113495bSYour Name 	DP_PRINT_STATS("Number of Msdu's Part of Amsdu = %u",
10176*5113495bSYour Name 		       peer_stats->tx.amsdu_cnt);
10177*5113495bSYour Name 	DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation = %u",
10178*5113495bSYour Name 		       peer_stats->tx.non_amsdu_cnt);
10179*5113495bSYour Name 
10180*5113495bSYour Name 	if (pdev && pdev->soc->arch_ops.txrx_print_peer_stats)
10181*5113495bSYour Name 		pdev->soc->arch_ops.txrx_print_peer_stats(peer_stats,
10182*5113495bSYour Name 							PEER_TX_STATS);
10183*5113495bSYour Name 
10184*5113495bSYour Name 	DP_PRINT_STATS("Node Rx Stats:");
10185*5113495bSYour Name 	for (i = 0; i <  CDP_MAX_RX_RINGS; i++) {
10186*5113495bSYour Name 		DP_PRINT_STATS("Ring Id = %u", i);
10187*5113495bSYour Name 		DP_PRINT_STATS("	Packets Received = %llu",
10188*5113495bSYour Name 			       peer_stats->rx.rcvd_reo[i].num);
10189*5113495bSYour Name 		DP_PRINT_STATS("	Bytes Received = %llu",
10190*5113495bSYour Name 			       peer_stats->rx.rcvd_reo[i].bytes);
10191*5113495bSYour Name 	}
10192*5113495bSYour Name 	for (i = 0; i < CDP_MAX_LMACS; i++)
10193*5113495bSYour Name 		DP_PRINT_STATS("Packets Received on lmac[%u] = %llu ( %llu ),",
10194*5113495bSYour Name 			       i, peer_stats->rx.rx_lmac[i].num,
10195*5113495bSYour Name 			       peer_stats->rx.rx_lmac[i].bytes);
10196*5113495bSYour Name 
10197*5113495bSYour Name 	DP_PRINT_STATS("Unicast Packets Received = %llu",
10198*5113495bSYour Name 		       peer_stats->rx.unicast.num);
10199*5113495bSYour Name 	DP_PRINT_STATS("Unicast Bytes Received = %llu",
10200*5113495bSYour Name 		       peer_stats->rx.unicast.bytes);
10201*5113495bSYour Name 	DP_PRINT_STATS("Multicast Packets Received = %llu",
10202*5113495bSYour Name 		       peer_stats->rx.multicast.num);
10203*5113495bSYour Name 	DP_PRINT_STATS("Multicast Bytes Received = %llu",
10204*5113495bSYour Name 		       peer_stats->rx.multicast.bytes);
10205*5113495bSYour Name 	DP_PRINT_STATS("Broadcast Packets Received = %llu",
10206*5113495bSYour Name 		       peer_stats->rx.bcast.num);
10207*5113495bSYour Name 	DP_PRINT_STATS("Broadcast Bytes Received = %llu",
10208*5113495bSYour Name 		       peer_stats->rx.bcast.bytes);
10209*5113495bSYour Name 	DP_PRINT_STATS("Packets Sent To Stack in TWT Session = %llu",
10210*5113495bSYour Name 		       peer_stats->rx.to_stack_twt.num);
10211*5113495bSYour Name 	DP_PRINT_STATS("Bytes Sent To Stack in TWT Session = %llu",
10212*5113495bSYour Name 		       peer_stats->rx.to_stack_twt.bytes);
10213*5113495bSYour Name 	DP_PRINT_STATS("Intra BSS Packets Received = %llu",
10214*5113495bSYour Name 		       peer_stats->rx.intra_bss.pkts.num);
10215*5113495bSYour Name 	DP_PRINT_STATS("Intra BSS Bytes Received = %llu",
10216*5113495bSYour Name 		       peer_stats->rx.intra_bss.pkts.bytes);
10217*5113495bSYour Name 	DP_PRINT_STATS("Intra BSS Packets Failed = %llu",
10218*5113495bSYour Name 		       peer_stats->rx.intra_bss.fail.num);
10219*5113495bSYour Name 	DP_PRINT_STATS("Intra BSS Bytes Failed = %llu",
10220*5113495bSYour Name 		       peer_stats->rx.intra_bss.fail.bytes);
10221*5113495bSYour Name 	DP_PRINT_STATS("Intra BSS MDNS Packets Not Forwarded  = %u",
10222*5113495bSYour Name 		       peer_stats->rx.intra_bss.mdns_no_fwd);
10223*5113495bSYour Name 	DP_PRINT_STATS("Raw Packets Received = %llu",
10224*5113495bSYour Name 		       peer_stats->rx.raw.num);
10225*5113495bSYour Name 	DP_PRINT_STATS("Raw Bytes Received = %llu",
10226*5113495bSYour Name 		       peer_stats->rx.raw.bytes);
10227*5113495bSYour Name 	DP_PRINT_STATS("Errors: MIC Errors = %u",
10228*5113495bSYour Name 		       peer_stats->rx.err.mic_err);
10229*5113495bSYour Name 	DP_PRINT_STATS("Errors: Decryption Errors = %u",
10230*5113495bSYour Name 		       peer_stats->rx.err.decrypt_err);
10231*5113495bSYour Name 	DP_PRINT_STATS("Errors: PN Errors = %u",
10232*5113495bSYour Name 		       peer_stats->rx.err.pn_err);
10233*5113495bSYour Name 	DP_PRINT_STATS("Errors: OOR Errors = %u",
10234*5113495bSYour Name 		       peer_stats->rx.err.oor_err);
10235*5113495bSYour Name 	DP_PRINT_STATS("Errors: 2k Jump Errors = %u",
10236*5113495bSYour Name 		       peer_stats->rx.err.jump_2k_err);
10237*5113495bSYour Name 	DP_PRINT_STATS("Errors: RXDMA Wifi Parse Errors = %u",
10238*5113495bSYour Name 		       peer_stats->rx.err.rxdma_wifi_parse_err);
10239*5113495bSYour Name 	DP_PRINT_STATS("Msdu's Received As Part of Ampdu = %u",
10240*5113495bSYour Name 		       peer_stats->rx.non_ampdu_cnt);
10241*5113495bSYour Name 	DP_PRINT_STATS("Msdu's Received As Ampdu = %u",
10242*5113495bSYour Name 		       peer_stats->rx.ampdu_cnt);
10243*5113495bSYour Name 	DP_PRINT_STATS("Msdu's Received Not Part of Amsdu's = %u",
10244*5113495bSYour Name 		       peer_stats->rx.non_amsdu_cnt);
10245*5113495bSYour Name 	DP_PRINT_STATS("MSDUs Received As Part of Amsdu = %u",
10246*5113495bSYour Name 		       peer_stats->rx.amsdu_cnt);
10247*5113495bSYour Name 	DP_PRINT_STATS("MSDU Rx Retries= %u",
10248*5113495bSYour Name 		       peer_stats->rx.rx_retries);
10249*5113495bSYour Name 	DP_PRINT_STATS("MPDU Rx Retries= %u",
10250*5113495bSYour Name 		       peer_stats->rx.mpdu_retry_cnt);
10251*5113495bSYour Name 	DP_PRINT_STATS("NAWDS : ");
10252*5113495bSYour Name 	DP_PRINT_STATS("	Nawds multicast Drop Rx Packet = %u",
10253*5113495bSYour Name 		       peer_stats->rx.nawds_mcast_drop);
10254*5113495bSYour Name 	DP_PRINT_STATS(" 3address multicast Drop Rx Packet = %u",
10255*5113495bSYour Name 		       peer_stats->rx.mcast_3addr_drop);
10256*5113495bSYour Name 	DP_PRINT_STATS("SGI = 0.8us %u 0.4us %u 1.6us %u 3.2us %u",
10257*5113495bSYour Name 		       peer_stats->rx.sgi_count[0],
10258*5113495bSYour Name 		       peer_stats->rx.sgi_count[1],
10259*5113495bSYour Name 		       peer_stats->rx.sgi_count[2],
10260*5113495bSYour Name 		       peer_stats->rx.sgi_count[3]);
10261*5113495bSYour Name 
10262*5113495bSYour Name 	DP_PRINT_STATS("Wireless Mutlimedia ");
10263*5113495bSYour Name 	DP_PRINT_STATS("	 Best effort = %u",
10264*5113495bSYour Name 		       peer_stats->rx.wme_ac_type[0]);
10265*5113495bSYour Name 	DP_PRINT_STATS("	 Background= %u",
10266*5113495bSYour Name 		       peer_stats->rx.wme_ac_type[1]);
10267*5113495bSYour Name 	DP_PRINT_STATS("	 Video = %u",
10268*5113495bSYour Name 		       peer_stats->rx.wme_ac_type[2]);
10269*5113495bSYour Name 	DP_PRINT_STATS("	 Voice = %u",
10270*5113495bSYour Name 		       peer_stats->rx.wme_ac_type[3]);
10271*5113495bSYour Name 
10272*5113495bSYour Name 	DP_PRINT_STATS(" Total Rx PPDU Count = %u",
10273*5113495bSYour Name 		       peer_stats->rx.rx_ppdus);
10274*5113495bSYour Name 	DP_PRINT_STATS(" Total Rx MPDU Count = %u",
10275*5113495bSYour Name 		       peer_stats->rx.rx_mpdus);
10276*5113495bSYour Name 	DP_PRINT_STATS("MSDU Reception Type");
10277*5113495bSYour Name 	DP_PRINT_STATS("SU %u MU_MIMO %u MU_OFDMA %u MU_OFDMA_MIMO %u",
10278*5113495bSYour Name 		       peer_stats->rx.reception_type[0],
10279*5113495bSYour Name 		       peer_stats->rx.reception_type[1],
10280*5113495bSYour Name 		       peer_stats->rx.reception_type[2],
10281*5113495bSYour Name 		       peer_stats->rx.reception_type[3]);
10282*5113495bSYour Name 	DP_PRINT_STATS("PPDU Reception Type");
10283*5113495bSYour Name 	DP_PRINT_STATS("SU %u MU_MIMO %u MU_OFDMA %u MU_OFDMA_MIMO %u",
10284*5113495bSYour Name 		       peer_stats->rx.ppdu_cnt[0],
10285*5113495bSYour Name 		       peer_stats->rx.ppdu_cnt[1],
10286*5113495bSYour Name 		       peer_stats->rx.ppdu_cnt[2],
10287*5113495bSYour Name 		       peer_stats->rx.ppdu_cnt[3]);
10288*5113495bSYour Name 
10289*5113495bSYour Name 	dp_print_common_rates_info(peer_stats->rx.pkt_type);
10290*5113495bSYour Name 	dp_print_common_ppdu_rates_info(&peer_stats->rx.su_ax_ppdu_cnt,
10291*5113495bSYour Name 					DOT11_AX);
10292*5113495bSYour Name 	dp_print_mu_ppdu_rates_info(&peer_stats->rx.rx_mu[0]);
10293*5113495bSYour Name 
10294*5113495bSYour Name 	pnss = &peer_stats->rx.nss[0];
10295*5113495bSYour Name 	dp_print_nss(nss, pnss, SS_COUNT);
10296*5113495bSYour Name 	DP_PRINT_STATS("MSDU Count");
10297*5113495bSYour Name 	DP_PRINT_STATS("	NSS(1-8) = %s", nss);
10298*5113495bSYour Name 
10299*5113495bSYour Name 	DP_PRINT_STATS("reception mode SU");
10300*5113495bSYour Name 	pnss = &peer_stats->rx.ppdu_nss[0];
10301*5113495bSYour Name 	dp_print_nss(nss, pnss, SS_COUNT);
10302*5113495bSYour Name 
10303*5113495bSYour Name 	DP_PRINT_STATS("	PPDU Count");
10304*5113495bSYour Name 	DP_PRINT_STATS("	NSS(1-8) = %s", nss);
10305*5113495bSYour Name 
10306*5113495bSYour Name 	DP_PRINT_STATS("	MPDU OK = %u, MPDU Fail = %u",
10307*5113495bSYour Name 		       peer_stats->rx.mpdu_cnt_fcs_ok,
10308*5113495bSYour Name 		       peer_stats->rx.mpdu_cnt_fcs_err);
10309*5113495bSYour Name 
10310*5113495bSYour Name 	for (rx_mu_type = 0; rx_mu_type < TXRX_TYPE_MU_MAX;
10311*5113495bSYour Name 	     rx_mu_type++) {
10312*5113495bSYour Name 		DP_PRINT_STATS("reception mode %s",
10313*5113495bSYour Name 			       mu_reception_mode[rx_mu_type]);
10314*5113495bSYour Name 		rx_mu = &peer_stats->rx.rx_mu[rx_mu_type];
10315*5113495bSYour Name 
10316*5113495bSYour Name 		pnss = &rx_mu->ppdu_nss[0];
10317*5113495bSYour Name 		dp_print_nss(nss, pnss, SS_COUNT);
10318*5113495bSYour Name 		DP_PRINT_STATS("	PPDU Count");
10319*5113495bSYour Name 		DP_PRINT_STATS("	NSS(1-8) = %s", nss);
10320*5113495bSYour Name 
10321*5113495bSYour Name 		DP_PRINT_STATS("	MPDU OK = %u, MPDU Fail = %u",
10322*5113495bSYour Name 			       rx_mu->mpdu_cnt_fcs_ok,
10323*5113495bSYour Name 			       rx_mu->mpdu_cnt_fcs_err);
10324*5113495bSYour Name 	}
10325*5113495bSYour Name 
10326*5113495bSYour Name 	DP_PRINT_STATS("Aggregation:");
10327*5113495bSYour Name 	DP_PRINT_STATS("   Msdu's Part of Ampdu = %u",
10328*5113495bSYour Name 		       peer_stats->rx.ampdu_cnt);
10329*5113495bSYour Name 	DP_PRINT_STATS("   Msdu's With No Mpdu Level Aggregation = %u",
10330*5113495bSYour Name 		       peer_stats->rx.non_ampdu_cnt);
10331*5113495bSYour Name 	DP_PRINT_STATS("   Msdu's Part of Amsdu = %u",
10332*5113495bSYour Name 		       peer_stats->rx.amsdu_cnt);
10333*5113495bSYour Name 	DP_PRINT_STATS("   Msdu's With No Msdu Level Aggregation = %u",
10334*5113495bSYour Name 		       peer_stats->rx.non_amsdu_cnt);
10335*5113495bSYour Name 	DP_PRINT_STATS("MEC Packet Drop = %llu",
10336*5113495bSYour Name 		       peer_stats->rx.mec_drop.num);
10337*5113495bSYour Name 	DP_PRINT_STATS("MEC Byte Drop = %llu",
10338*5113495bSYour Name 		       peer_stats->rx.mec_drop.bytes);
10339*5113495bSYour Name 	DP_PRINT_STATS("Multipass Rx Packet Drop = %u",
10340*5113495bSYour Name 		       peer_stats->rx.multipass_rx_pkt_drop);
10341*5113495bSYour Name 	DP_PRINT_STATS("Peer Unauth Rx Packet Drop = %u",
10342*5113495bSYour Name 		       peer_stats->rx.peer_unauth_rx_pkt_drop);
10343*5113495bSYour Name 	DP_PRINT_STATS("Policy Check Rx Packet Drop = %u",
10344*5113495bSYour Name 		       peer_stats->rx.policy_check_drop);
10345*5113495bSYour Name 	if (pdev && pdev->soc->arch_ops.txrx_print_peer_stats)
10346*5113495bSYour Name 		pdev->soc->arch_ops.txrx_print_peer_stats(peer_stats,
10347*5113495bSYour Name 							PEER_RX_STATS);
10348*5113495bSYour Name }
10349*5113495bSYour Name 
10350*5113495bSYour Name /**
10351*5113495bSYour Name  * dp_print_per_link_peer_stats() - print per link peer stats of MLD peer
10352*5113495bSYour Name  * @peer: MLD DP_PEER handle
10353*5113495bSYour Name  * @peer_stats: buffer holding peer stats
10354*5113495bSYour Name  * @num_links: Number of Link peers.
10355*5113495bSYour Name  *
10356*5113495bSYour Name  * This API should only be called with MLD peer and peer_stats should
10357*5113495bSYour Name  * point to buffer of size = (sizeof(*peer_stats) * num_links).
10358*5113495bSYour Name  *
10359*5113495bSYour Name  * return None
10360*5113495bSYour Name  */
10361*5113495bSYour Name static
dp_print_per_link_peer_stats(struct dp_peer * peer,struct cdp_peer_stats * peer_stats,uint8_t num_links)10362*5113495bSYour Name void dp_print_per_link_peer_stats(struct dp_peer *peer,
10363*5113495bSYour Name 				  struct cdp_peer_stats *peer_stats,
10364*5113495bSYour Name 				  uint8_t num_links)
10365*5113495bSYour Name {
10366*5113495bSYour Name 	uint8_t index;
10367*5113495bSYour Name 	struct dp_pdev *pdev = peer->vdev->pdev;
10368*5113495bSYour Name 
10369*5113495bSYour Name 	if (!IS_MLO_DP_MLD_PEER(peer))
10370*5113495bSYour Name 		return;
10371*5113495bSYour Name 
10372*5113495bSYour Name 	DP_PRINT_STATS("Node Tx ML peer Stats:\n");
10373*5113495bSYour Name 	DP_PRINT_STATS("Total Packet Completions = %llu",
10374*5113495bSYour Name 		       peer_stats->tx.comp_pkt.num);
10375*5113495bSYour Name 	DP_PRINT_STATS("Total Bytes Completions = %llu",
10376*5113495bSYour Name 		       peer_stats->tx.comp_pkt.bytes);
10377*5113495bSYour Name 	DP_PRINT_STATS("Packets Failed = %u",
10378*5113495bSYour Name 		       peer_stats->tx.tx_failed);
10379*5113495bSYour Name 	DP_PRINT_STATS("Bytes and Packets transmitted  in last one sec:");
10380*5113495bSYour Name 	DP_PRINT_STATS("	Bytes transmitted in last sec: %u",
10381*5113495bSYour Name 		       peer_stats->tx.tx_byte_rate);
10382*5113495bSYour Name 	DP_PRINT_STATS("	Data transmitted in last sec: %u",
10383*5113495bSYour Name 		       peer_stats->tx.tx_data_rate);
10384*5113495bSYour Name 
10385*5113495bSYour Name 	if (!IS_MLO_DP_LINK_PEER(peer)) {
10386*5113495bSYour Name 		dp_print_jitter_stats(peer, pdev);
10387*5113495bSYour Name 		dp_peer_print_tx_delay_stats(pdev, peer);
10388*5113495bSYour Name 	}
10389*5113495bSYour Name 
10390*5113495bSYour Name 	DP_PRINT_STATS("Node Rx ML peer Stats:\n");
10391*5113495bSYour Name 	DP_PRINT_STATS("Packets Sent To Stack = %llu",
10392*5113495bSYour Name 		       peer_stats->rx.to_stack.num);
10393*5113495bSYour Name 	DP_PRINT_STATS("Bytes Sent To Stack = %llu",
10394*5113495bSYour Name 		       peer_stats->rx.to_stack.bytes);
10395*5113495bSYour Name 	DP_PRINT_STATS("Bytes and Packets received in last one sec:");
10396*5113495bSYour Name 	DP_PRINT_STATS("	Bytes received in last sec: %u",
10397*5113495bSYour Name 		       peer_stats->rx.rx_byte_rate);
10398*5113495bSYour Name 	DP_PRINT_STATS("	Data received in last sec: %u",
10399*5113495bSYour Name 		       peer_stats->rx.rx_data_rate);
10400*5113495bSYour Name 	if (!IS_MLO_DP_LINK_PEER(peer))
10401*5113495bSYour Name 		dp_peer_print_rx_delay_stats(pdev, peer);
10402*5113495bSYour Name 
10403*5113495bSYour Name 	dp_peer_print_reo_qref_table(peer);
10404*5113495bSYour Name 	DP_PRINT_STATS("Per Link TxRx Stats:\n");
10405*5113495bSYour Name 	for (index = 0; index < num_links; index++) {
10406*5113495bSYour Name 		DP_PRINT_STATS("Link %u TxRx Stats:\n", index);
10407*5113495bSYour Name 		dp_print_per_link_peer_txrx_stats(&peer_stats[index], pdev);
10408*5113495bSYour Name 	}
10409*5113495bSYour Name }
10410*5113495bSYour Name 
dp_print_per_link_stats(struct cdp_soc_t * soc_hdl,uint8_t vdev_id)10411*5113495bSYour Name void dp_print_per_link_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id)
10412*5113495bSYour Name {
10413*5113495bSYour Name 	struct dp_mld_link_peers link_peers_info;
10414*5113495bSYour Name 	struct dp_peer *peer, *ml_peer = NULL;
10415*5113495bSYour Name 	struct cdp_peer_stats *peer_stats = NULL;
10416*5113495bSYour Name 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
10417*5113495bSYour Name 	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
10418*5113495bSYour Name 						     DP_MOD_ID_GENERIC_STATS);
10419*5113495bSYour Name 	if (!vdev) {
10420*5113495bSYour Name 		dp_err_rl("vdev is NULL, vdev_id: %u", vdev_id);
10421*5113495bSYour Name 		return;
10422*5113495bSYour Name 	}
10423*5113495bSYour Name 	peer = dp_vdev_bss_peer_ref_n_get(soc, vdev, DP_MOD_ID_GENERIC_STATS);
10424*5113495bSYour Name 
10425*5113495bSYour Name 	if (!peer) {
10426*5113495bSYour Name 		dp_err("Peer is NULL, vdev_id: %u", vdev_id);
10427*5113495bSYour Name 		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS);
10428*5113495bSYour Name 		return;
10429*5113495bSYour Name 	}
10430*5113495bSYour Name 	if (IS_MLO_DP_LINK_PEER(peer))
10431*5113495bSYour Name 		ml_peer = peer->mld_peer;
10432*5113495bSYour Name 	if (ml_peer) {
10433*5113495bSYour Name 		dp_get_link_peers_ref_from_mld_peer(soc, ml_peer,
10434*5113495bSYour Name 						    &link_peers_info,
10435*5113495bSYour Name 						    DP_MOD_ID_GENERIC_STATS);
10436*5113495bSYour Name 		peer_stats = qdf_mem_malloc(sizeof(*peer_stats) *
10437*5113495bSYour Name 					    link_peers_info.num_links);
10438*5113495bSYour Name 		if (!peer_stats) {
10439*5113495bSYour Name 			dp_err("malloc failed, vdev_id: %u, ML peer_id: %u",
10440*5113495bSYour Name 			       vdev_id, ml_peer->peer_id);
10441*5113495bSYour Name 			dp_release_link_peers_ref(&link_peers_info,
10442*5113495bSYour Name 						  DP_MOD_ID_GENERIC_STATS);
10443*5113495bSYour Name 			goto fail;
10444*5113495bSYour Name 		}
10445*5113495bSYour Name 
10446*5113495bSYour Name 		dp_get_per_link_peer_stats(ml_peer, peer_stats,
10447*5113495bSYour Name 					   ml_peer->peer_type,
10448*5113495bSYour Name 					   link_peers_info.num_links);
10449*5113495bSYour Name 		dp_print_per_link_peer_stats(ml_peer, peer_stats,
10450*5113495bSYour Name 					     link_peers_info.num_links);
10451*5113495bSYour Name 		dp_release_link_peers_ref(&link_peers_info,
10452*5113495bSYour Name 					  DP_MOD_ID_GENERIC_STATS);
10453*5113495bSYour Name 		qdf_mem_free(peer_stats);
10454*5113495bSYour Name 	} else {
10455*5113495bSYour Name 		peer_stats = qdf_mem_malloc(sizeof(*peer_stats));
10456*5113495bSYour Name 		if (!peer_stats) {
10457*5113495bSYour Name 			dp_err("malloc failed, vdev_id: %u, peer_id: %u",
10458*5113495bSYour Name 			       vdev_id, peer->peer_id);
10459*5113495bSYour Name 			goto fail;
10460*5113495bSYour Name 		}
10461*5113495bSYour Name 		dp_get_peer_stats(peer, peer_stats);
10462*5113495bSYour Name 		dp_print_peer_stats(peer, peer_stats);
10463*5113495bSYour Name 		qdf_mem_free(peer_stats);
10464*5113495bSYour Name 	}
10465*5113495bSYour Name 
10466*5113495bSYour Name fail:
10467*5113495bSYour Name 	dp_peer_unref_delete(peer, DP_MOD_ID_GENERIC_STATS);
10468*5113495bSYour Name 	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS);
10469*5113495bSYour Name }
10470*5113495bSYour Name #else
dp_print_per_link_stats(struct cdp_soc_t * soc_hdl,uint8_t vdev_id)10471*5113495bSYour Name void dp_print_per_link_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id)
10472*5113495bSYour Name {
10473*5113495bSYour Name 	struct dp_peer *peer;
10474*5113495bSYour Name 	struct cdp_peer_stats *peer_stats = NULL;
10475*5113495bSYour Name 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
10476*5113495bSYour Name 	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
10477*5113495bSYour Name 						     DP_MOD_ID_GENERIC_STATS);
10478*5113495bSYour Name 	if (!vdev) {
10479*5113495bSYour Name 		dp_err_rl("vdev is null for vdev_id: %u", vdev_id);
10480*5113495bSYour Name 		return;
10481*5113495bSYour Name 	}
10482*5113495bSYour Name 	peer = dp_vdev_bss_peer_ref_n_get(soc, vdev, DP_MOD_ID_GENERIC_STATS);
10483*5113495bSYour Name 
10484*5113495bSYour Name 	if (!peer) {
10485*5113495bSYour Name 		dp_err_rl("Peer is NULL, vdev_id: %u", vdev_id);
10486*5113495bSYour Name 		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS);
10487*5113495bSYour Name 		return;
10488*5113495bSYour Name 	}
10489*5113495bSYour Name 	peer_stats = qdf_mem_malloc(sizeof(*peer_stats));
10490*5113495bSYour Name 	if (!peer_stats) {
10491*5113495bSYour Name 		dp_err_rl("peer_stats malloc failed, vdev_id: %u, peer_id: %u",
10492*5113495bSYour Name 			  vdev_id, peer->peer_id);
10493*5113495bSYour Name 		goto fail;
10494*5113495bSYour Name 	}
10495*5113495bSYour Name 
10496*5113495bSYour Name 	dp_get_peer_stats(peer, peer_stats);
10497*5113495bSYour Name 	dp_print_peer_stats(peer, peer_stats);
10498*5113495bSYour Name 	qdf_mem_free(peer_stats);
10499*5113495bSYour Name 
10500*5113495bSYour Name fail:
10501*5113495bSYour Name 	dp_peer_unref_delete(peer, DP_MOD_ID_GENERIC_STATS);
10502*5113495bSYour Name 	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS);
10503*5113495bSYour Name }
10504*5113495bSYour Name #endif /* DP_MLO_LINK_STATS_SUPPORT */
10505*5113495bSYour Name #else
dp_print_per_link_stats(struct cdp_soc_t * soc_hdl,uint8_t vdev_id)10506*5113495bSYour Name void dp_print_per_link_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id)
10507*5113495bSYour Name {
10508*5113495bSYour Name }
10509*5113495bSYour Name #endif /* CONFIG_AP_PLATFORM */
10510