1*5113495bSYour Name /*
2*5113495bSYour Name * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
3*5113495bSYour Name * Copyright (c) 2022 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
20*5113495bSYour Name /**
21*5113495bSYour Name * @file htt_fw_stats.c
22*5113495bSYour Name * @brief Provide functions to process FW status retrieved from FW.
23*5113495bSYour Name */
24*5113495bSYour Name
25*5113495bSYour Name #include <htc_api.h> /* HTC_PACKET */
26*5113495bSYour Name #include <htt.h> /* HTT_T2H_MSG_TYPE, etc. */
27*5113495bSYour Name #include <qdf_nbuf.h> /* qdf_nbuf_t */
28*5113495bSYour Name #include <qdf_mem.h> /* qdf_mem_set */
29*5113495bSYour Name #include <ol_fw_tx_dbg.h> /* ol_fw_tx_dbg_ppdu_base */
30*5113495bSYour Name
31*5113495bSYour Name #include <ol_htt_rx_api.h>
32*5113495bSYour Name #include <ol_txrx_htt_api.h> /* htt_tx_status */
33*5113495bSYour Name
34*5113495bSYour Name #include <htt_internal.h>
35*5113495bSYour Name
36*5113495bSYour Name #include <wlan_defs.h>
37*5113495bSYour Name
38*5113495bSYour Name static char *bw_str_arr[] = {"20MHz", "40MHz", "80MHz", "160MHz"};
39*5113495bSYour Name
40*5113495bSYour Name /*
41*5113495bSYour Name * Defined the macro tx_rate_stats_print_cmn()
42*5113495bSYour Name * so that this could be used in both
43*5113495bSYour Name * htt_t2h_stats_tx_rate_stats_print() &
44*5113495bSYour Name * htt_t2h_stats_tx_rate_stats_print_v2().
45*5113495bSYour Name * Each of these functions take a different structure as argument,
46*5113495bSYour Name * but with common fields in the structures--so using a macro
47*5113495bSYour Name * to bypass the strong type-checking of a function seems a simple
48*5113495bSYour Name * trick to use to avoid the code duplication.
49*5113495bSYour Name */
50*5113495bSYour Name #define tx_rate_stats_print_cmn(_tx_rate_info, _concise) \
51*5113495bSYour Name do { \
52*5113495bSYour Name qdf_nofl_info("TX Rate Info:"); \
53*5113495bSYour Name \
54*5113495bSYour Name /* MCS */ \
55*5113495bSYour Name qdf_nofl_info("%s: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d",\
56*5113495bSYour Name "MCS counts (0..9)", \
57*5113495bSYour Name _tx_rate_info->mcs[0], \
58*5113495bSYour Name _tx_rate_info->mcs[1], \
59*5113495bSYour Name _tx_rate_info->mcs[2], \
60*5113495bSYour Name _tx_rate_info->mcs[3], \
61*5113495bSYour Name _tx_rate_info->mcs[4], \
62*5113495bSYour Name _tx_rate_info->mcs[5], \
63*5113495bSYour Name _tx_rate_info->mcs[6], \
64*5113495bSYour Name _tx_rate_info->mcs[7], \
65*5113495bSYour Name _tx_rate_info->mcs[8], \
66*5113495bSYour Name _tx_rate_info->mcs[9]); \
67*5113495bSYour Name \
68*5113495bSYour Name /* SGI */ \
69*5113495bSYour Name qdf_nofl_info("%s: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d",\
70*5113495bSYour Name "SGI counts (0..9)", \
71*5113495bSYour Name _tx_rate_info->sgi[0], \
72*5113495bSYour Name _tx_rate_info->sgi[1], \
73*5113495bSYour Name _tx_rate_info->sgi[2], \
74*5113495bSYour Name _tx_rate_info->sgi[3], \
75*5113495bSYour Name _tx_rate_info->sgi[4], \
76*5113495bSYour Name _tx_rate_info->sgi[5], \
77*5113495bSYour Name _tx_rate_info->sgi[6], \
78*5113495bSYour Name _tx_rate_info->sgi[7], \
79*5113495bSYour Name _tx_rate_info->sgi[8], \
80*5113495bSYour Name _tx_rate_info->sgi[9]); \
81*5113495bSYour Name \
82*5113495bSYour Name /* NSS */ \
83*5113495bSYour Name qdf_nofl_info("NSS counts: 1x1 %d, 2x2 %d, 3x3 %d", \
84*5113495bSYour Name _tx_rate_info->nss[0], \
85*5113495bSYour Name _tx_rate_info->nss[1], _tx_rate_info->nss[2]);\
86*5113495bSYour Name \
87*5113495bSYour Name /* BW */ \
88*5113495bSYour Name if (ARRAY_SIZE(_tx_rate_info->bw) == 3) \
89*5113495bSYour Name qdf_nofl_info("BW counts: %s %d, %s %d, %s %d", \
90*5113495bSYour Name bw_str_arr[0], _tx_rate_info->bw[0], \
91*5113495bSYour Name bw_str_arr[1], _tx_rate_info->bw[1], \
92*5113495bSYour Name bw_str_arr[2], _tx_rate_info->bw[2]); \
93*5113495bSYour Name else if (ARRAY_SIZE(_tx_rate_info->bw) == 4) \
94*5113495bSYour Name qdf_nofl_info("BW counts: %s %d, %s %d, %s %d, %s %d", \
95*5113495bSYour Name bw_str_arr[0], _tx_rate_info->bw[0], \
96*5113495bSYour Name bw_str_arr[1], _tx_rate_info->bw[1], \
97*5113495bSYour Name bw_str_arr[2], _tx_rate_info->bw[2], \
98*5113495bSYour Name bw_str_arr[3], _tx_rate_info->bw[3]); \
99*5113495bSYour Name \
100*5113495bSYour Name \
101*5113495bSYour Name /* Preamble */ \
102*5113495bSYour Name qdf_nofl_info("Preamble (O C H V) counts: %d, %d, %d, %d",\
103*5113495bSYour Name _tx_rate_info->pream[0], \
104*5113495bSYour Name _tx_rate_info->pream[1], \
105*5113495bSYour Name _tx_rate_info->pream[2], \
106*5113495bSYour Name _tx_rate_info->pream[3]); \
107*5113495bSYour Name \
108*5113495bSYour Name /* STBC rate counts */ \
109*5113495bSYour Name qdf_nofl_info("%s: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d",\
110*5113495bSYour Name "STBC rate counts (0..9)", \
111*5113495bSYour Name _tx_rate_info->stbc[0], \
112*5113495bSYour Name _tx_rate_info->stbc[1], \
113*5113495bSYour Name _tx_rate_info->stbc[2], \
114*5113495bSYour Name _tx_rate_info->stbc[3], \
115*5113495bSYour Name _tx_rate_info->stbc[4], \
116*5113495bSYour Name _tx_rate_info->stbc[5], \
117*5113495bSYour Name _tx_rate_info->stbc[6], \
118*5113495bSYour Name _tx_rate_info->stbc[7], \
119*5113495bSYour Name _tx_rate_info->stbc[8], \
120*5113495bSYour Name _tx_rate_info->stbc[9]); \
121*5113495bSYour Name \
122*5113495bSYour Name /* LDPC and TxBF counts */ \
123*5113495bSYour Name qdf_nofl_info("LDPC Counts: %d", _tx_rate_info->ldpc);\
124*5113495bSYour Name qdf_nofl_info("RTS Counts: %d", _tx_rate_info->rts_cnt);\
125*5113495bSYour Name /* RSSI Values for last ack frames */ \
126*5113495bSYour Name qdf_nofl_info("Ack RSSI: %d", _tx_rate_info->ack_rssi);\
127*5113495bSYour Name } while (0)
128*5113495bSYour Name
htt_t2h_stats_tx_rate_stats_print(wlan_dbg_tx_rate_info_t * tx_rate_info,int concise)129*5113495bSYour Name static void htt_t2h_stats_tx_rate_stats_print(wlan_dbg_tx_rate_info_t *
130*5113495bSYour Name tx_rate_info, int concise)
131*5113495bSYour Name {
132*5113495bSYour Name tx_rate_stats_print_cmn(tx_rate_info, concise);
133*5113495bSYour Name }
134*5113495bSYour Name
htt_t2h_stats_tx_rate_stats_print_v2(wlan_dbg_tx_rate_info_v2_t * tx_rate_info,int concise)135*5113495bSYour Name static void htt_t2h_stats_tx_rate_stats_print_v2(wlan_dbg_tx_rate_info_v2_t *
136*5113495bSYour Name tx_rate_info, int concise)
137*5113495bSYour Name {
138*5113495bSYour Name tx_rate_stats_print_cmn(tx_rate_info, concise);
139*5113495bSYour Name }
140*5113495bSYour Name
141*5113495bSYour Name /*
142*5113495bSYour Name * Defined the macro rx_rate_stats_print_cmn()
143*5113495bSYour Name * so that this could be used in both
144*5113495bSYour Name * htt_t2h_stats_rx_rate_stats_print() &
145*5113495bSYour Name * htt_t2h_stats_rx_rate_stats_print_v2().
146*5113495bSYour Name * Each of these functions take a different structure as argument,
147*5113495bSYour Name * but with common fields in the structures -- so using a macro
148*5113495bSYour Name * to bypass the strong type-checking of a function seems a simple
149*5113495bSYour Name * trick to use to avoid the code duplication.
150*5113495bSYour Name */
151*5113495bSYour Name #define rx_rate_stats_print_cmn(_rx_phy_info, _concise) \
152*5113495bSYour Name do { \
153*5113495bSYour Name qdf_nofl_info("RX Rate Info:"); \
154*5113495bSYour Name \
155*5113495bSYour Name /* MCS */ \
156*5113495bSYour Name qdf_nofl_info("%s: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d",\
157*5113495bSYour Name "MCS counts (0..9)", \
158*5113495bSYour Name _rx_phy_info->mcs[0], \
159*5113495bSYour Name _rx_phy_info->mcs[1], \
160*5113495bSYour Name _rx_phy_info->mcs[2], \
161*5113495bSYour Name _rx_phy_info->mcs[3], \
162*5113495bSYour Name _rx_phy_info->mcs[4], \
163*5113495bSYour Name _rx_phy_info->mcs[5], \
164*5113495bSYour Name _rx_phy_info->mcs[6], \
165*5113495bSYour Name _rx_phy_info->mcs[7], \
166*5113495bSYour Name _rx_phy_info->mcs[8], \
167*5113495bSYour Name _rx_phy_info->mcs[9]); \
168*5113495bSYour Name \
169*5113495bSYour Name /* SGI */ \
170*5113495bSYour Name qdf_nofl_info("%s: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d",\
171*5113495bSYour Name "SGI counts (0..9)", \
172*5113495bSYour Name _rx_phy_info->sgi[0], \
173*5113495bSYour Name _rx_phy_info->sgi[1], \
174*5113495bSYour Name _rx_phy_info->sgi[2], \
175*5113495bSYour Name _rx_phy_info->sgi[3], \
176*5113495bSYour Name _rx_phy_info->sgi[4], \
177*5113495bSYour Name _rx_phy_info->sgi[5], \
178*5113495bSYour Name _rx_phy_info->sgi[6], \
179*5113495bSYour Name _rx_phy_info->sgi[7], \
180*5113495bSYour Name _rx_phy_info->sgi[8], \
181*5113495bSYour Name _rx_phy_info->sgi[9]); \
182*5113495bSYour Name \
183*5113495bSYour Name /*
184*5113495bSYour Name * NSS \
185*5113495bSYour Name * nss[0] just holds the count of non-stbc frames that were \
186*5113495bSYour Name * sent at 1x1 rates and nsts holds the count of frames sent \
187*5113495bSYour Name * with stbc. \
188*5113495bSYour Name * It was decided to not include PPDUs sent w/ STBC in nss[0] \
189*5113495bSYour Name * since it would be easier to change the value that needs to \
190*5113495bSYour Name * be printed (from stbc+non-stbc count to only non-stbc count)\
191*5113495bSYour Name * if needed in the future. Hence the addition in the host code\
192*5113495bSYour Name * at this line.
193*5113495bSYour Name */ \
194*5113495bSYour Name qdf_nofl_info("NSS counts: 1x1 %d, 2x2 %d, 3x3 %d, 4x4 %d",\
195*5113495bSYour Name _rx_phy_info->nss[0] + _rx_phy_info->nsts,\
196*5113495bSYour Name _rx_phy_info->nss[1], \
197*5113495bSYour Name _rx_phy_info->nss[2], \
198*5113495bSYour Name _rx_phy_info->nss[3]); \
199*5113495bSYour Name \
200*5113495bSYour Name /* NSTS */ \
201*5113495bSYour Name qdf_nofl_info("NSTS count: %d", _rx_phy_info->nsts); \
202*5113495bSYour Name \
203*5113495bSYour Name /* BW */ \
204*5113495bSYour Name if (ARRAY_SIZE(_rx_phy_info->bw) == 3) \
205*5113495bSYour Name qdf_nofl_info("BW counts: %s %d, %s %d, %s %d", \
206*5113495bSYour Name bw_str_arr[0], _rx_phy_info->bw[0], \
207*5113495bSYour Name bw_str_arr[1], _rx_phy_info->bw[1], \
208*5113495bSYour Name bw_str_arr[2], _rx_phy_info->bw[2]); \
209*5113495bSYour Name else if (ARRAY_SIZE(_rx_phy_info->bw) == 4) \
210*5113495bSYour Name qdf_nofl_info("BW counts: %s %d, %s %d, %s %d, %s %d", \
211*5113495bSYour Name bw_str_arr[0], _rx_phy_info->bw[0], \
212*5113495bSYour Name bw_str_arr[1], _rx_phy_info->bw[1], \
213*5113495bSYour Name bw_str_arr[2], _rx_phy_info->bw[2], \
214*5113495bSYour Name bw_str_arr[3], _rx_phy_info->bw[3]); \
215*5113495bSYour Name \
216*5113495bSYour Name /* Preamble */ \
217*5113495bSYour Name qdf_nofl_info("Preamble counts: %d, %d, %d, %d, %d, %d",\
218*5113495bSYour Name _rx_phy_info->pream[0], \
219*5113495bSYour Name _rx_phy_info->pream[1], \
220*5113495bSYour Name _rx_phy_info->pream[2], \
221*5113495bSYour Name _rx_phy_info->pream[3], \
222*5113495bSYour Name _rx_phy_info->pream[4], \
223*5113495bSYour Name _rx_phy_info->pream[5]); \
224*5113495bSYour Name \
225*5113495bSYour Name /* STBC rate counts */ \
226*5113495bSYour Name qdf_nofl_info("%s: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d",\
227*5113495bSYour Name "STBC rate counts (0..9)", \
228*5113495bSYour Name _rx_phy_info->stbc[0], \
229*5113495bSYour Name _rx_phy_info->stbc[1], \
230*5113495bSYour Name _rx_phy_info->stbc[2], \
231*5113495bSYour Name _rx_phy_info->stbc[3], \
232*5113495bSYour Name _rx_phy_info->stbc[4], \
233*5113495bSYour Name _rx_phy_info->stbc[5], \
234*5113495bSYour Name _rx_phy_info->stbc[6], \
235*5113495bSYour Name _rx_phy_info->stbc[7], \
236*5113495bSYour Name _rx_phy_info->stbc[8], \
237*5113495bSYour Name _rx_phy_info->stbc[9]); \
238*5113495bSYour Name \
239*5113495bSYour Name /* LDPC and TxBF counts */ \
240*5113495bSYour Name qdf_nofl_info("LDPC TXBF Counts: %d, %d", \
241*5113495bSYour Name _rx_phy_info->ldpc, _rx_phy_info->txbf);\
242*5113495bSYour Name /* RSSI Values for last received frames */ \
243*5113495bSYour Name qdf_nofl_info("RSSI (data, mgmt): %d, %d", _rx_phy_info->data_rssi,\
244*5113495bSYour Name _rx_phy_info->mgmt_rssi); \
245*5113495bSYour Name \
246*5113495bSYour Name qdf_nofl_info("RSSI Chain 0 (0x%02x 0x%02x 0x%02x 0x%02x)",\
247*5113495bSYour Name ((_rx_phy_info->rssi_chain0 >> 24) & 0xff),\
248*5113495bSYour Name ((_rx_phy_info->rssi_chain0 >> 16) & 0xff),\
249*5113495bSYour Name ((_rx_phy_info->rssi_chain0 >> 8) & 0xff),\
250*5113495bSYour Name ((_rx_phy_info->rssi_chain0 >> 0) & 0xff));\
251*5113495bSYour Name \
252*5113495bSYour Name qdf_nofl_info("RSSI Chain 1 (0x%02x 0x%02x 0x%02x 0x%02x)",\
253*5113495bSYour Name ((_rx_phy_info->rssi_chain1 >> 24) & 0xff),\
254*5113495bSYour Name ((_rx_phy_info->rssi_chain1 >> 16) & 0xff),\
255*5113495bSYour Name ((_rx_phy_info->rssi_chain1 >> 8) & 0xff),\
256*5113495bSYour Name ((_rx_phy_info->rssi_chain1 >> 0) & 0xff));\
257*5113495bSYour Name \
258*5113495bSYour Name qdf_nofl_info("RSSI Chain 2 (0x%02x 0x%02x 0x%02x 0x%02x)",\
259*5113495bSYour Name ((_rx_phy_info->rssi_chain2 >> 24) & 0xff),\
260*5113495bSYour Name ((_rx_phy_info->rssi_chain2 >> 16) & 0xff),\
261*5113495bSYour Name ((_rx_phy_info->rssi_chain2 >> 8) & 0xff),\
262*5113495bSYour Name ((_rx_phy_info->rssi_chain2 >> 0) & 0xff));\
263*5113495bSYour Name } while (0)
264*5113495bSYour Name
htt_t2h_stats_rx_rate_stats_print(wlan_dbg_rx_rate_info_t * rx_phy_info,int concise)265*5113495bSYour Name static void htt_t2h_stats_rx_rate_stats_print(wlan_dbg_rx_rate_info_t *
266*5113495bSYour Name rx_phy_info, int concise)
267*5113495bSYour Name {
268*5113495bSYour Name rx_rate_stats_print_cmn(rx_phy_info, concise);
269*5113495bSYour Name }
270*5113495bSYour Name
htt_t2h_stats_rx_rate_stats_print_v2(wlan_dbg_rx_rate_info_v2_t * rx_phy_info,int concise)271*5113495bSYour Name static void htt_t2h_stats_rx_rate_stats_print_v2(wlan_dbg_rx_rate_info_v2_t *
272*5113495bSYour Name rx_phy_info, int concise)
273*5113495bSYour Name {
274*5113495bSYour Name rx_rate_stats_print_cmn(rx_phy_info, concise);
275*5113495bSYour Name }
276*5113495bSYour Name
277*5113495bSYour Name static void
htt_t2h_stats_pdev_stats_print(struct wlan_dbg_stats * wlan_pdev_stats,int concise)278*5113495bSYour Name htt_t2h_stats_pdev_stats_print(struct wlan_dbg_stats *wlan_pdev_stats,
279*5113495bSYour Name int concise)
280*5113495bSYour Name {
281*5113495bSYour Name struct wlan_dbg_tx_stats *tx = &wlan_pdev_stats->tx;
282*5113495bSYour Name struct wlan_dbg_rx_stats *rx = &wlan_pdev_stats->rx;
283*5113495bSYour Name
284*5113495bSYour Name qdf_nofl_info("WAL Pdev stats:");
285*5113495bSYour Name qdf_nofl_info("### Tx ###");
286*5113495bSYour Name
287*5113495bSYour Name /* Num HTT cookies queued to dispatch list */
288*5113495bSYour Name qdf_nofl_info("comp_queued :%d", tx->comp_queued);
289*5113495bSYour Name /* Num HTT cookies dispatched */
290*5113495bSYour Name qdf_nofl_info("comp_delivered :%d", tx->comp_delivered);
291*5113495bSYour Name /* Num MSDU queued to WAL */
292*5113495bSYour Name qdf_nofl_info("msdu_enqued :%d", tx->msdu_enqued);
293*5113495bSYour Name /* Num MPDU queued to WAL */
294*5113495bSYour Name qdf_nofl_info("mpdu_enqued :%d", tx->mpdu_enqued);
295*5113495bSYour Name /* Num MSDUs dropped by WMM limit */
296*5113495bSYour Name qdf_nofl_info("wmm_drop :%d", tx->wmm_drop);
297*5113495bSYour Name /* Num Local frames queued */
298*5113495bSYour Name qdf_nofl_info("local_enqued :%d", tx->local_enqued);
299*5113495bSYour Name /* Num Local frames done */
300*5113495bSYour Name qdf_nofl_info("local_freed :%d", tx->local_freed);
301*5113495bSYour Name /* Num queued to HW */
302*5113495bSYour Name qdf_nofl_info("hw_queued :%d", tx->hw_queued);
303*5113495bSYour Name /* Num PPDU reaped from HW */
304*5113495bSYour Name qdf_nofl_info("hw_reaped :%d", tx->hw_reaped);
305*5113495bSYour Name /* Num underruns */
306*5113495bSYour Name qdf_nofl_info("mac underrun :%d", tx->underrun);
307*5113495bSYour Name /* Num underruns */
308*5113495bSYour Name qdf_nofl_info("phy underrun :%d", tx->phy_underrun);
309*5113495bSYour Name /* Num PPDUs cleaned up in TX abort */
310*5113495bSYour Name qdf_nofl_info("tx_abort :%d", tx->tx_abort);
311*5113495bSYour Name /* Num MPDUs requed by SW */
312*5113495bSYour Name qdf_nofl_info("mpdus_requed :%d", tx->mpdus_requed);
313*5113495bSYour Name /* Excessive retries */
314*5113495bSYour Name #if defined(AR900B)
315*5113495bSYour Name qdf_nofl_info("excess retries :%d", tx->tx_xretry);
316*5113495bSYour Name #endif
317*5113495bSYour Name /* last data rate */
318*5113495bSYour Name qdf_nofl_info("last rc :%d", tx->data_rc);
319*5113495bSYour Name /* scheduler self triggers */
320*5113495bSYour Name qdf_nofl_info("sched self trig :%d", tx->self_triggers);
321*5113495bSYour Name /* SW retry failures */
322*5113495bSYour Name qdf_nofl_info("ampdu retry failed:%d", tx->sw_retry_failure);
323*5113495bSYour Name /* illegal phy rate errors */
324*5113495bSYour Name qdf_nofl_info("illegal rate errs :%d", tx->illgl_rate_phy_err);
325*5113495bSYour Name /* pdev continuous excessive retries */
326*5113495bSYour Name qdf_nofl_info("pdev cont xretry :%d", tx->pdev_cont_xretry);
327*5113495bSYour Name /* pdev continuous excessive retries */
328*5113495bSYour Name qdf_nofl_info("pdev tx timeout :%d", tx->pdev_tx_timeout);
329*5113495bSYour Name /* pdev resets */
330*5113495bSYour Name qdf_nofl_info("pdev resets :%d", tx->pdev_resets);
331*5113495bSYour Name /* PPDU > txop duration */
332*5113495bSYour Name qdf_nofl_info("ppdu txop ovf :%d", tx->txop_ovf);
333*5113495bSYour Name #if defined(AR900B)
334*5113495bSYour Name qdf_nofl_info("seq_posted :%d", tx->seq_posted);
335*5113495bSYour Name qdf_nofl_info("seq_failed_queueing :%d", tx->seq_failed_queueing);
336*5113495bSYour Name qdf_nofl_info("seq_completed :%d", tx->seq_completed);
337*5113495bSYour Name qdf_nofl_info("seq_restarted :%d", tx->seq_restarted);
338*5113495bSYour Name qdf_nofl_info("mu_seq_posted :%d", tx->mu_seq_posted);
339*5113495bSYour Name qdf_nofl_info("mpdus_sw_flush :%d", tx->mpdus_sw_flush);
340*5113495bSYour Name qdf_nofl_info("mpdus_hw_filter :%d", tx->mpdus_hw_filter);
341*5113495bSYour Name qdf_nofl_info("mpdus_truncated :%d", tx->mpdus_truncated);
342*5113495bSYour Name qdf_nofl_info("mpdus_ack_failed :%d", tx->mpdus_ack_failed);
343*5113495bSYour Name qdf_nofl_info("mpdus_expired :%d", tx->mpdus_expired);
344*5113495bSYour Name #endif
345*5113495bSYour Name
346*5113495bSYour Name qdf_nofl_info("### Rx ###");
347*5113495bSYour Name /* Cnts any change in ring routing mid-ppdu */
348*5113495bSYour Name qdf_nofl_info("ppdu_route_change :%d", rx->mid_ppdu_route_change);
349*5113495bSYour Name /* Total number of statuses processed */
350*5113495bSYour Name qdf_nofl_info("status_rcvd :%d", rx->status_rcvd);
351*5113495bSYour Name /* Extra frags on rings 0-3 */
352*5113495bSYour Name qdf_nofl_info("r0_frags :%d", rx->r0_frags);
353*5113495bSYour Name qdf_nofl_info("r1_frags :%d", rx->r1_frags);
354*5113495bSYour Name qdf_nofl_info("r2_frags :%d", rx->r2_frags);
355*5113495bSYour Name qdf_nofl_info("r3_frags :%d", rx->r3_frags);
356*5113495bSYour Name /* MSDUs / MPDUs delivered to HTT */
357*5113495bSYour Name qdf_nofl_info("htt_msdus :%d", rx->htt_msdus);
358*5113495bSYour Name qdf_nofl_info("htt_mpdus :%d", rx->htt_mpdus);
359*5113495bSYour Name /* MSDUs / MPDUs delivered to local stack */
360*5113495bSYour Name qdf_nofl_info("loc_msdus :%d", rx->loc_msdus);
361*5113495bSYour Name qdf_nofl_info("loc_mpdus :%d", rx->loc_mpdus);
362*5113495bSYour Name /* AMSDUs that have more MSDUs than the status ring size */
363*5113495bSYour Name qdf_nofl_info("oversize_amsdu :%d", rx->oversize_amsdu);
364*5113495bSYour Name /* Number of PHY errors */
365*5113495bSYour Name qdf_nofl_info("phy_errs :%d", rx->phy_errs);
366*5113495bSYour Name /* Number of PHY errors dropped */
367*5113495bSYour Name qdf_nofl_info("phy_errs dropped :%d", rx->phy_err_drop);
368*5113495bSYour Name /* Number of mpdu errors - FCS, MIC, ENC etc. */
369*5113495bSYour Name qdf_nofl_info("mpdu_errs :%d", rx->mpdu_errs);
370*5113495bSYour Name #if defined(AR900B)
371*5113495bSYour Name qdf_nofl_info("rx_ovfl_errs :%d", rx->rx_ovfl_errs);
372*5113495bSYour Name #endif
373*5113495bSYour Name
374*5113495bSYour Name }
375*5113495bSYour Name
376*5113495bSYour Name static void
htt_t2h_stats_rx_reorder_stats_print(struct rx_reorder_stats * stats_ptr,int concise)377*5113495bSYour Name htt_t2h_stats_rx_reorder_stats_print(struct rx_reorder_stats *stats_ptr,
378*5113495bSYour Name int concise)
379*5113495bSYour Name {
380*5113495bSYour Name qdf_nofl_info("Rx reorder statistics:");
381*5113495bSYour Name qdf_nofl_info(" %u non-QoS frames received",
382*5113495bSYour Name stats_ptr->deliver_non_qos);
383*5113495bSYour Name qdf_nofl_info(" %u frames received in-order",
384*5113495bSYour Name stats_ptr->deliver_in_order);
385*5113495bSYour Name qdf_nofl_info(" %u frames flushed due to timeout",
386*5113495bSYour Name stats_ptr->deliver_flush_timeout);
387*5113495bSYour Name qdf_nofl_info(" %u frames flushed due to moving out of window",
388*5113495bSYour Name stats_ptr->deliver_flush_oow);
389*5113495bSYour Name qdf_nofl_info(" %u frames flushed due to receiving DELBA",
390*5113495bSYour Name stats_ptr->deliver_flush_delba);
391*5113495bSYour Name qdf_nofl_info(" %u frames discarded due to FCS error",
392*5113495bSYour Name stats_ptr->fcs_error);
393*5113495bSYour Name qdf_nofl_info(" %u frames discarded due to invalid peer",
394*5113495bSYour Name stats_ptr->invalid_peer);
395*5113495bSYour Name qdf_nofl_info
396*5113495bSYour Name (" %u frames discarded due to duplication (non aggregation)",
397*5113495bSYour Name stats_ptr->dup_non_aggr);
398*5113495bSYour Name qdf_nofl_info(" %u frames discarded due to duplication in reorder queue",
399*5113495bSYour Name stats_ptr->dup_in_reorder);
400*5113495bSYour Name qdf_nofl_info(" %u frames discarded due to processed before",
401*5113495bSYour Name stats_ptr->dup_past);
402*5113495bSYour Name qdf_nofl_info(" %u times reorder timeout happened",
403*5113495bSYour Name stats_ptr->reorder_timeout);
404*5113495bSYour Name qdf_nofl_info(" %u times incorrect bar received",
405*5113495bSYour Name stats_ptr->invalid_bar_ssn);
406*5113495bSYour Name qdf_nofl_info(" %u times bar ssn reset happened",
407*5113495bSYour Name stats_ptr->ssn_reset);
408*5113495bSYour Name qdf_nofl_info(" %u times flushed due to peer delete",
409*5113495bSYour Name stats_ptr->deliver_flush_delpeer);
410*5113495bSYour Name qdf_nofl_info(" %u times flushed due to offload",
411*5113495bSYour Name stats_ptr->deliver_flush_offload);
412*5113495bSYour Name qdf_nofl_info(" %u times flushed due to ouf of buffer",
413*5113495bSYour Name stats_ptr->deliver_flush_oob);
414*5113495bSYour Name qdf_nofl_info(" %u MPDU's dropped due to PN check fail",
415*5113495bSYour Name stats_ptr->pn_fail);
416*5113495bSYour Name qdf_nofl_info(" %u MPDU's dropped due to lack of memory",
417*5113495bSYour Name stats_ptr->store_fail);
418*5113495bSYour Name qdf_nofl_info(" %u times tid pool alloc succeeded",
419*5113495bSYour Name stats_ptr->tid_pool_alloc_succ);
420*5113495bSYour Name qdf_nofl_info(" %u times MPDU pool alloc succeeded",
421*5113495bSYour Name stats_ptr->mpdu_pool_alloc_succ);
422*5113495bSYour Name qdf_nofl_info(" %u times MSDU pool alloc succeeded",
423*5113495bSYour Name stats_ptr->msdu_pool_alloc_succ);
424*5113495bSYour Name qdf_nofl_info(" %u times tid pool alloc failed",
425*5113495bSYour Name stats_ptr->tid_pool_alloc_fail);
426*5113495bSYour Name qdf_nofl_info(" %u times MPDU pool alloc failed",
427*5113495bSYour Name stats_ptr->mpdu_pool_alloc_fail);
428*5113495bSYour Name qdf_nofl_info(" %u times MSDU pool alloc failed",
429*5113495bSYour Name stats_ptr->msdu_pool_alloc_fail);
430*5113495bSYour Name qdf_nofl_info(" %u times tid pool freed",
431*5113495bSYour Name stats_ptr->tid_pool_free);
432*5113495bSYour Name qdf_nofl_info(" %u times MPDU pool freed",
433*5113495bSYour Name stats_ptr->mpdu_pool_free);
434*5113495bSYour Name qdf_nofl_info(" %u times MSDU pool freed",
435*5113495bSYour Name stats_ptr->msdu_pool_free);
436*5113495bSYour Name qdf_nofl_info(" %u MSDUs undelivered to HTT, queued to Rx MSDU free list",
437*5113495bSYour Name stats_ptr->msdu_queued);
438*5113495bSYour Name qdf_nofl_info(" %u MSDUs released from Rx MSDU list to MAC ring",
439*5113495bSYour Name stats_ptr->msdu_recycled);
440*5113495bSYour Name qdf_nofl_info(" %u MPDUs with invalid peer but A2 found in AST",
441*5113495bSYour Name stats_ptr->invalid_peer_a2_in_ast);
442*5113495bSYour Name qdf_nofl_info(" %u MPDUs with invalid peer but A3 found in AST",
443*5113495bSYour Name stats_ptr->invalid_peer_a3_in_ast);
444*5113495bSYour Name qdf_nofl_info(" %u MPDUs with invalid peer, Broadcast or Mulitcast frame",
445*5113495bSYour Name stats_ptr->invalid_peer_bmc_mpdus);
446*5113495bSYour Name qdf_nofl_info(" %u MSDUs with err attention word",
447*5113495bSYour Name stats_ptr->rxdesc_err_att);
448*5113495bSYour Name qdf_nofl_info(" %u MSDUs with flag of peer_idx_invalid",
449*5113495bSYour Name stats_ptr->rxdesc_err_peer_idx_inv);
450*5113495bSYour Name qdf_nofl_info(" %u MSDUs with flag of peer_idx_timeout",
451*5113495bSYour Name stats_ptr->rxdesc_err_peer_idx_to);
452*5113495bSYour Name qdf_nofl_info(" %u MSDUs with flag of overflow",
453*5113495bSYour Name stats_ptr->rxdesc_err_ov);
454*5113495bSYour Name qdf_nofl_info(" %u MSDUs with flag of msdu_length_err",
455*5113495bSYour Name stats_ptr->rxdesc_err_msdu_len);
456*5113495bSYour Name qdf_nofl_info(" %u MSDUs with flag of mpdu_length_err",
457*5113495bSYour Name stats_ptr->rxdesc_err_mpdu_len);
458*5113495bSYour Name qdf_nofl_info(" %u MSDUs with flag of tkip_mic_err",
459*5113495bSYour Name stats_ptr->rxdesc_err_tkip_mic);
460*5113495bSYour Name qdf_nofl_info(" %u MSDUs with flag of decrypt_err",
461*5113495bSYour Name stats_ptr->rxdesc_err_decrypt);
462*5113495bSYour Name qdf_nofl_info(" %u MSDUs with flag of fcs_err",
463*5113495bSYour Name stats_ptr->rxdesc_err_fcs);
464*5113495bSYour Name qdf_nofl_info(" %u Unicast frames with invalid peer handler",
465*5113495bSYour Name stats_ptr->rxdesc_uc_msdus_inv_peer);
466*5113495bSYour Name qdf_nofl_info(" %u unicast frame to DUT with invalid peer handler",
467*5113495bSYour Name stats_ptr->rxdesc_direct_msdus_inv_peer);
468*5113495bSYour Name qdf_nofl_info(" %u Broadcast/Multicast frames with invalid peer handler",
469*5113495bSYour Name stats_ptr->rxdesc_bmc_msdus_inv_peer);
470*5113495bSYour Name qdf_nofl_info(" %u MSDUs dropped due to no first MSDU flag",
471*5113495bSYour Name stats_ptr->rxdesc_no_1st_msdu);
472*5113495bSYour Name qdf_nofl_info(" %u MSDUs dropped due to ring overflow",
473*5113495bSYour Name stats_ptr->msdu_drop_ring_ov);
474*5113495bSYour Name qdf_nofl_info(" %u MSDUs dropped due to FC mismatch",
475*5113495bSYour Name stats_ptr->msdu_drop_fc_mismatch);
476*5113495bSYour Name qdf_nofl_info(" %u MSDUs dropped due to mgt frame in Remote ring",
477*5113495bSYour Name stats_ptr->msdu_drop_mgmt_remote_ring);
478*5113495bSYour Name qdf_nofl_info(" %u MSDUs dropped due to misc non error",
479*5113495bSYour Name stats_ptr->msdu_drop_misc);
480*5113495bSYour Name qdf_nofl_info(" %u MSDUs go to offload before reorder",
481*5113495bSYour Name stats_ptr->offload_msdu_wal);
482*5113495bSYour Name qdf_nofl_info(" %u data frame dropped by offload after reorder",
483*5113495bSYour Name stats_ptr->offload_msdu_reorder);
484*5113495bSYour Name qdf_nofl_info(" %u MPDUs with SN in the past & within BA window",
485*5113495bSYour Name stats_ptr->dup_past_within_window);
486*5113495bSYour Name qdf_nofl_info(" %u MPDUs with SN in the past & outside BA window",
487*5113495bSYour Name stats_ptr->dup_past_outside_window);
488*5113495bSYour Name }
489*5113495bSYour Name
490*5113495bSYour Name static void
htt_t2h_stats_rx_rem_buf_stats_print(struct rx_remote_buffer_mgmt_stats * stats_ptr,int concise)491*5113495bSYour Name htt_t2h_stats_rx_rem_buf_stats_print(
492*5113495bSYour Name struct rx_remote_buffer_mgmt_stats *stats_ptr, int concise)
493*5113495bSYour Name {
494*5113495bSYour Name qdf_nofl_info("Rx Remote Buffer Statistics:");
495*5113495bSYour Name qdf_nofl_info(" %u MSDU's reaped for Rx processing",
496*5113495bSYour Name stats_ptr->remote_reaped);
497*5113495bSYour Name qdf_nofl_info(" %u MSDU's recycled within firmware",
498*5113495bSYour Name stats_ptr->remote_recycled);
499*5113495bSYour Name qdf_nofl_info(" %u MSDU's stored by Data Rx",
500*5113495bSYour Name stats_ptr->data_rx_msdus_stored);
501*5113495bSYour Name qdf_nofl_info(" %u HTT indications from WAL Rx MSDU",
502*5113495bSYour Name stats_ptr->wal_rx_ind);
503*5113495bSYour Name qdf_nofl_info(" %u HTT indications unconsumed from WAL Rx MSDU",
504*5113495bSYour Name stats_ptr->wal_rx_ind_unconsumed);
505*5113495bSYour Name qdf_nofl_info(" %u HTT indications from Data Rx MSDU",
506*5113495bSYour Name stats_ptr->data_rx_ind);
507*5113495bSYour Name qdf_nofl_info(" %u HTT indications unconsumed from Data Rx MSDU",
508*5113495bSYour Name stats_ptr->data_rx_ind_unconsumed);
509*5113495bSYour Name qdf_nofl_info(" %u HTT indications from ATHBUF",
510*5113495bSYour Name stats_ptr->athbuf_rx_ind);
511*5113495bSYour Name qdf_nofl_info(" %u Remote buffers requested for refill",
512*5113495bSYour Name stats_ptr->refill_buf_req);
513*5113495bSYour Name qdf_nofl_info(" %u Remote buffers filled by host",
514*5113495bSYour Name stats_ptr->refill_buf_rsp);
515*5113495bSYour Name qdf_nofl_info(" %u times MAC has no buffers",
516*5113495bSYour Name stats_ptr->mac_no_bufs);
517*5113495bSYour Name qdf_nofl_info(" %u times f/w write & read indices on MAC ring are equal",
518*5113495bSYour Name stats_ptr->fw_indices_equal);
519*5113495bSYour Name qdf_nofl_info(" %u times f/w has no remote buffers to post to MAC",
520*5113495bSYour Name stats_ptr->host_no_bufs);
521*5113495bSYour Name }
522*5113495bSYour Name
523*5113495bSYour Name static void
htt_t2h_stats_txbf_info_buf_stats_print(struct wlan_dbg_txbf_data_stats * stats_ptr)524*5113495bSYour Name htt_t2h_stats_txbf_info_buf_stats_print(
525*5113495bSYour Name struct wlan_dbg_txbf_data_stats *stats_ptr)
526*5113495bSYour Name {
527*5113495bSYour Name qdf_nofl_info("TXBF data Statistics:");
528*5113495bSYour Name qdf_nofl_info("tx_txbf_vht (0..9): %u, %u, %u, %u, %u, %u, %u, %u, %u, %d",
529*5113495bSYour Name stats_ptr->tx_txbf_vht[0],
530*5113495bSYour Name stats_ptr->tx_txbf_vht[1],
531*5113495bSYour Name stats_ptr->tx_txbf_vht[2],
532*5113495bSYour Name stats_ptr->tx_txbf_vht[3],
533*5113495bSYour Name stats_ptr->tx_txbf_vht[4],
534*5113495bSYour Name stats_ptr->tx_txbf_vht[5],
535*5113495bSYour Name stats_ptr->tx_txbf_vht[6],
536*5113495bSYour Name stats_ptr->tx_txbf_vht[7],
537*5113495bSYour Name stats_ptr->tx_txbf_vht[8],
538*5113495bSYour Name stats_ptr->tx_txbf_vht[9]);
539*5113495bSYour Name qdf_nofl_info("rx_txbf_vht (0..9): %u, %u, %u, %u, %u, %u, %u, %u, %u, %u",
540*5113495bSYour Name stats_ptr->rx_txbf_vht[0],
541*5113495bSYour Name stats_ptr->rx_txbf_vht[1],
542*5113495bSYour Name stats_ptr->rx_txbf_vht[2],
543*5113495bSYour Name stats_ptr->rx_txbf_vht[3],
544*5113495bSYour Name stats_ptr->rx_txbf_vht[4],
545*5113495bSYour Name stats_ptr->rx_txbf_vht[5],
546*5113495bSYour Name stats_ptr->rx_txbf_vht[6],
547*5113495bSYour Name stats_ptr->rx_txbf_vht[7],
548*5113495bSYour Name stats_ptr->rx_txbf_vht[8],
549*5113495bSYour Name stats_ptr->rx_txbf_vht[9]);
550*5113495bSYour Name qdf_nofl_info("tx_txbf_ht (0..7): %u, %u, %u, %u, %u, %u, %u, %u",
551*5113495bSYour Name stats_ptr->tx_txbf_ht[0],
552*5113495bSYour Name stats_ptr->tx_txbf_ht[1],
553*5113495bSYour Name stats_ptr->tx_txbf_ht[2],
554*5113495bSYour Name stats_ptr->tx_txbf_ht[3],
555*5113495bSYour Name stats_ptr->tx_txbf_ht[4],
556*5113495bSYour Name stats_ptr->tx_txbf_ht[5],
557*5113495bSYour Name stats_ptr->tx_txbf_ht[6],
558*5113495bSYour Name stats_ptr->tx_txbf_ht[7]);
559*5113495bSYour Name qdf_nofl_info("tx_txbf_ofdm (0..7): %u, %u, %u, %u, %u, %u, %u, %u",
560*5113495bSYour Name stats_ptr->tx_txbf_ofdm[0],
561*5113495bSYour Name stats_ptr->tx_txbf_ofdm[1],
562*5113495bSYour Name stats_ptr->tx_txbf_ofdm[2],
563*5113495bSYour Name stats_ptr->tx_txbf_ofdm[3],
564*5113495bSYour Name stats_ptr->tx_txbf_ofdm[4],
565*5113495bSYour Name stats_ptr->tx_txbf_ofdm[5],
566*5113495bSYour Name stats_ptr->tx_txbf_ofdm[6],
567*5113495bSYour Name stats_ptr->tx_txbf_ofdm[7]);
568*5113495bSYour Name qdf_nofl_info("tx_txbf_cck (0..6): %u, %u, %u, %u, %u, %u, %u",
569*5113495bSYour Name stats_ptr->tx_txbf_cck[0],
570*5113495bSYour Name stats_ptr->tx_txbf_cck[1],
571*5113495bSYour Name stats_ptr->tx_txbf_cck[2],
572*5113495bSYour Name stats_ptr->tx_txbf_cck[3],
573*5113495bSYour Name stats_ptr->tx_txbf_cck[4],
574*5113495bSYour Name stats_ptr->tx_txbf_cck[5],
575*5113495bSYour Name stats_ptr->tx_txbf_cck[6]);
576*5113495bSYour Name }
577*5113495bSYour Name
578*5113495bSYour Name static void
htt_t2h_stats_txbf_snd_buf_stats_print(struct wlan_dbg_txbf_snd_stats * stats_ptr)579*5113495bSYour Name htt_t2h_stats_txbf_snd_buf_stats_print(
580*5113495bSYour Name struct wlan_dbg_txbf_snd_stats *stats_ptr)
581*5113495bSYour Name {
582*5113495bSYour Name qdf_nofl_info("TXBF snd Buffer Statistics:");
583*5113495bSYour Name qdf_nofl_info("cbf_20: %u, %u, %u, %u",
584*5113495bSYour Name stats_ptr->cbf_20[0],
585*5113495bSYour Name stats_ptr->cbf_20[1],
586*5113495bSYour Name stats_ptr->cbf_20[2],
587*5113495bSYour Name stats_ptr->cbf_20[3]);
588*5113495bSYour Name qdf_nofl_info("cbf_40: %u, %u, %u, %u",
589*5113495bSYour Name stats_ptr->cbf_40[0],
590*5113495bSYour Name stats_ptr->cbf_40[1],
591*5113495bSYour Name stats_ptr->cbf_40[2],
592*5113495bSYour Name stats_ptr->cbf_40[3]);
593*5113495bSYour Name qdf_nofl_info("cbf_80: %u, %u, %u, %u",
594*5113495bSYour Name stats_ptr->cbf_80[0],
595*5113495bSYour Name stats_ptr->cbf_80[1],
596*5113495bSYour Name stats_ptr->cbf_80[2],
597*5113495bSYour Name stats_ptr->cbf_80[3]);
598*5113495bSYour Name qdf_nofl_info("sounding: %u, %u, %u, %u, %u, %u, %u, %u, %u",
599*5113495bSYour Name stats_ptr->sounding[0],
600*5113495bSYour Name stats_ptr->sounding[1],
601*5113495bSYour Name stats_ptr->sounding[2],
602*5113495bSYour Name stats_ptr->sounding[3],
603*5113495bSYour Name stats_ptr->sounding[4],
604*5113495bSYour Name stats_ptr->sounding[5],
605*5113495bSYour Name stats_ptr->sounding[6],
606*5113495bSYour Name stats_ptr->sounding[7],
607*5113495bSYour Name stats_ptr->sounding[8]);
608*5113495bSYour Name }
609*5113495bSYour Name
610*5113495bSYour Name static void
htt_t2h_stats_tx_selfgen_buf_stats_print(struct wlan_dbg_tx_selfgen_stats * stats_ptr)611*5113495bSYour Name htt_t2h_stats_tx_selfgen_buf_stats_print(
612*5113495bSYour Name struct wlan_dbg_tx_selfgen_stats *stats_ptr)
613*5113495bSYour Name {
614*5113495bSYour Name qdf_nofl_info("Tx selfgen Buffer Statistics:");
615*5113495bSYour Name qdf_nofl_info(" %u su_ndpa",
616*5113495bSYour Name stats_ptr->su_ndpa);
617*5113495bSYour Name qdf_nofl_info(" %u mu_ndp",
618*5113495bSYour Name stats_ptr->mu_ndp);
619*5113495bSYour Name qdf_nofl_info(" %u mu_ndpa",
620*5113495bSYour Name stats_ptr->mu_ndpa);
621*5113495bSYour Name qdf_nofl_info(" %u mu_ndp",
622*5113495bSYour Name stats_ptr->mu_ndp);
623*5113495bSYour Name qdf_nofl_info(" %u mu_brpoll_1",
624*5113495bSYour Name stats_ptr->mu_brpoll_1);
625*5113495bSYour Name qdf_nofl_info(" %u mu_brpoll_2",
626*5113495bSYour Name stats_ptr->mu_brpoll_2);
627*5113495bSYour Name qdf_nofl_info(" %u mu_bar_1",
628*5113495bSYour Name stats_ptr->mu_bar_1);
629*5113495bSYour Name qdf_nofl_info(" %u mu_bar_2",
630*5113495bSYour Name stats_ptr->mu_bar_2);
631*5113495bSYour Name qdf_nofl_info(" %u cts_burst",
632*5113495bSYour Name stats_ptr->cts_burst);
633*5113495bSYour Name qdf_nofl_info(" %u su_ndp_err",
634*5113495bSYour Name stats_ptr->su_ndp_err);
635*5113495bSYour Name qdf_nofl_info(" %u su_ndpa_err",
636*5113495bSYour Name stats_ptr->su_ndpa_err);
637*5113495bSYour Name qdf_nofl_info(" %u mu_ndp_err",
638*5113495bSYour Name stats_ptr->mu_ndp_err);
639*5113495bSYour Name qdf_nofl_info(" %u mu_brp1_err",
640*5113495bSYour Name stats_ptr->mu_brp1_err);
641*5113495bSYour Name qdf_nofl_info(" %u mu_brp2_err",
642*5113495bSYour Name stats_ptr->mu_brp2_err);
643*5113495bSYour Name }
644*5113495bSYour Name
645*5113495bSYour Name static void
htt_t2h_stats_wifi2_error_stats_print(struct wlan_dbg_wifi2_error_stats * stats_ptr)646*5113495bSYour Name htt_t2h_stats_wifi2_error_stats_print(
647*5113495bSYour Name struct wlan_dbg_wifi2_error_stats *stats_ptr)
648*5113495bSYour Name {
649*5113495bSYour Name int i;
650*5113495bSYour Name
651*5113495bSYour Name qdf_nofl_info("Scheduler error Statistics:");
652*5113495bSYour Name qdf_nofl_info("urrn_stats: ");
653*5113495bSYour Name qdf_nofl_info("urrn_stats: %d, %d, %d",
654*5113495bSYour Name stats_ptr->urrn_stats[0],
655*5113495bSYour Name stats_ptr->urrn_stats[1],
656*5113495bSYour Name stats_ptr->urrn_stats[2]);
657*5113495bSYour Name qdf_nofl_info("flush_errs (0..%d): ",
658*5113495bSYour Name WHAL_DBG_FLUSH_REASON_MAXCNT);
659*5113495bSYour Name for (i = 0; i < WHAL_DBG_FLUSH_REASON_MAXCNT; i++)
660*5113495bSYour Name qdf_nofl_info(" %u", stats_ptr->flush_errs[i]);
661*5113495bSYour Name qdf_nofl_info("\n");
662*5113495bSYour Name qdf_nofl_info("schd_stall_errs (0..3): ");
663*5113495bSYour Name qdf_nofl_info("%d, %d, %d, %d",
664*5113495bSYour Name stats_ptr->schd_stall_errs[0],
665*5113495bSYour Name stats_ptr->schd_stall_errs[1],
666*5113495bSYour Name stats_ptr->schd_stall_errs[2],
667*5113495bSYour Name stats_ptr->schd_stall_errs[3]);
668*5113495bSYour Name qdf_nofl_info("schd_cmd_result (0..%d): ",
669*5113495bSYour Name WHAL_DBG_CMD_RESULT_MAXCNT);
670*5113495bSYour Name for (i = 0; i < WHAL_DBG_CMD_RESULT_MAXCNT; i++)
671*5113495bSYour Name qdf_nofl_info(" %u", stats_ptr->schd_cmd_result[i]);
672*5113495bSYour Name qdf_nofl_info("\n");
673*5113495bSYour Name qdf_nofl_info("sifs_status (0..%d): ",
674*5113495bSYour Name WHAL_DBG_SIFS_STATUS_MAXCNT);
675*5113495bSYour Name for (i = 0; i < WHAL_DBG_SIFS_STATUS_MAXCNT; i++)
676*5113495bSYour Name qdf_nofl_info(" %u", stats_ptr->sifs_status[i]);
677*5113495bSYour Name qdf_nofl_info("\n");
678*5113495bSYour Name qdf_nofl_info("phy_errs (0..%d): ",
679*5113495bSYour Name WHAL_DBG_PHY_ERR_MAXCNT);
680*5113495bSYour Name for (i = 0; i < WHAL_DBG_PHY_ERR_MAXCNT; i++)
681*5113495bSYour Name qdf_nofl_info(" %u", stats_ptr->phy_errs[i]);
682*5113495bSYour Name qdf_nofl_info("\n");
683*5113495bSYour Name qdf_nofl_info(" %u rx_rate_inval",
684*5113495bSYour Name stats_ptr->rx_rate_inval);
685*5113495bSYour Name }
686*5113495bSYour Name
687*5113495bSYour Name static void
htt_t2h_rx_musu_ndpa_pkts_stats_print(struct rx_txbf_musu_ndpa_pkts_stats * stats_ptr)688*5113495bSYour Name htt_t2h_rx_musu_ndpa_pkts_stats_print(
689*5113495bSYour Name struct rx_txbf_musu_ndpa_pkts_stats *stats_ptr)
690*5113495bSYour Name {
691*5113495bSYour Name qdf_nofl_info("Rx TXBF MU/SU Packets and NDPA Statistics:");
692*5113495bSYour Name qdf_nofl_info(" %u Number of TXBF MU packets received",
693*5113495bSYour Name stats_ptr->number_mu_pkts);
694*5113495bSYour Name qdf_nofl_info(" %u Number of TXBF SU packets received",
695*5113495bSYour Name stats_ptr->number_su_pkts);
696*5113495bSYour Name qdf_nofl_info(" %u Number of TXBF directed NDPA",
697*5113495bSYour Name stats_ptr->txbf_directed_ndpa_count);
698*5113495bSYour Name qdf_nofl_info(" %u Number of TXBF retried NDPA",
699*5113495bSYour Name stats_ptr->txbf_ndpa_retry_count);
700*5113495bSYour Name qdf_nofl_info(" %u Total number of TXBF NDPA",
701*5113495bSYour Name stats_ptr->txbf_total_ndpa_count);
702*5113495bSYour Name }
703*5113495bSYour Name
704*5113495bSYour Name #define HTT_TICK_TO_USEC(ticks, microsec_per_tick) (ticks * microsec_per_tick)
htt_rate_flags_to_mhz(uint8_t rate_flags)705*5113495bSYour Name static inline int htt_rate_flags_to_mhz(uint8_t rate_flags)
706*5113495bSYour Name {
707*5113495bSYour Name if (rate_flags & 0x20)
708*5113495bSYour Name return 40; /* WHAL_RC_FLAG_40MHZ */
709*5113495bSYour Name if (rate_flags & 0x40)
710*5113495bSYour Name return 80; /* WHAL_RC_FLAG_80MHZ */
711*5113495bSYour Name if (rate_flags & 0x80)
712*5113495bSYour Name return 160; /* WHAL_RC_FLAG_160MHZ */
713*5113495bSYour Name return 20;
714*5113495bSYour Name }
715*5113495bSYour Name
716*5113495bSYour Name #define HTT_FW_STATS_MAX_BLOCK_ACK_WINDOW 64
717*5113495bSYour Name
718*5113495bSYour Name static void
htt_t2h_tx_ppdu_bitmaps_pr(uint32_t * queued_ptr,uint32_t * acked_ptr)719*5113495bSYour Name htt_t2h_tx_ppdu_bitmaps_pr(uint32_t *queued_ptr, uint32_t *acked_ptr)
720*5113495bSYour Name {
721*5113495bSYour Name char queued_str[HTT_FW_STATS_MAX_BLOCK_ACK_WINDOW + 1];
722*5113495bSYour Name char acked_str[HTT_FW_STATS_MAX_BLOCK_ACK_WINDOW + 1];
723*5113495bSYour Name int i, j, word;
724*5113495bSYour Name
725*5113495bSYour Name qdf_mem_set(queued_str, HTT_FW_STATS_MAX_BLOCK_ACK_WINDOW, '0');
726*5113495bSYour Name qdf_mem_set(acked_str, HTT_FW_STATS_MAX_BLOCK_ACK_WINDOW, '-');
727*5113495bSYour Name i = 0;
728*5113495bSYour Name for (word = 0; word < 2; word++) {
729*5113495bSYour Name uint32_t queued = *(queued_ptr + word);
730*5113495bSYour Name uint32_t acked = *(acked_ptr + word);
731*5113495bSYour Name
732*5113495bSYour Name for (j = 0; j < 32; j++, i++) {
733*5113495bSYour Name if (queued & (1 << j)) {
734*5113495bSYour Name queued_str[i] = '1';
735*5113495bSYour Name acked_str[i] = (acked & (1 << j)) ? 'y' : 'N';
736*5113495bSYour Name }
737*5113495bSYour Name }
738*5113495bSYour Name }
739*5113495bSYour Name queued_str[HTT_FW_STATS_MAX_BLOCK_ACK_WINDOW] = '\0';
740*5113495bSYour Name acked_str[HTT_FW_STATS_MAX_BLOCK_ACK_WINDOW] = '\0';
741*5113495bSYour Name qdf_nofl_info("%s\n", queued_str);
742*5113495bSYour Name qdf_nofl_info("%s\n", acked_str);
743*5113495bSYour Name }
744*5113495bSYour Name
htt_msg_read16(uint16_t * p16)745*5113495bSYour Name static inline uint16_t htt_msg_read16(uint16_t *p16)
746*5113495bSYour Name {
747*5113495bSYour Name #ifdef BIG_ENDIAN_HOST
748*5113495bSYour Name /*
749*5113495bSYour Name * During upload, the bytes within each uint32_t word were
750*5113495bSYour Name * swapped by the HIF HW. This results in the lower and upper bytes
751*5113495bSYour Name * of each uint16_t to be in the correct big-endian order with
752*5113495bSYour Name * respect to each other, but for each even-index uint16_t to
753*5113495bSYour Name * have its position switched with its successor neighbor uint16_t.
754*5113495bSYour Name * Undo this uint16_t position swapping.
755*5113495bSYour Name */
756*5113495bSYour Name return (((size_t) p16) & 0x2) ? *(p16 - 1) : *(p16 + 1);
757*5113495bSYour Name #else
758*5113495bSYour Name return *p16;
759*5113495bSYour Name #endif
760*5113495bSYour Name }
761*5113495bSYour Name
htt_msg_read8(uint8_t * p8)762*5113495bSYour Name static inline uint8_t htt_msg_read8(uint8_t *p8)
763*5113495bSYour Name {
764*5113495bSYour Name #ifdef BIG_ENDIAN_HOST
765*5113495bSYour Name /*
766*5113495bSYour Name * During upload, the bytes within each uint32_t word were
767*5113495bSYour Name * swapped by the HIF HW.
768*5113495bSYour Name * Undo this byte swapping.
769*5113495bSYour Name */
770*5113495bSYour Name switch (((size_t) p8) & 0x3) {
771*5113495bSYour Name case 0:
772*5113495bSYour Name return *(p8 + 3);
773*5113495bSYour Name case 1:
774*5113495bSYour Name return *(p8 + 1);
775*5113495bSYour Name case 2:
776*5113495bSYour Name return *(p8 - 1);
777*5113495bSYour Name default /* 3 */:
778*5113495bSYour Name return *(p8 - 3);
779*5113495bSYour Name }
780*5113495bSYour Name #else
781*5113495bSYour Name return *p8;
782*5113495bSYour Name #endif
783*5113495bSYour Name }
784*5113495bSYour Name
htt_make_u8_list_str(uint32_t * aligned_data,char * buffer,int space,int max_elems)785*5113495bSYour Name static void htt_make_u8_list_str(uint32_t *aligned_data,
786*5113495bSYour Name char *buffer, int space, int max_elems)
787*5113495bSYour Name {
788*5113495bSYour Name uint8_t *p8 = (uint8_t *) aligned_data;
789*5113495bSYour Name char *buf_p = buffer;
790*5113495bSYour Name
791*5113495bSYour Name while (max_elems-- > 0) {
792*5113495bSYour Name int bytes;
793*5113495bSYour Name uint8_t val;
794*5113495bSYour Name
795*5113495bSYour Name val = htt_msg_read8(p8);
796*5113495bSYour Name if (val == 0)
797*5113495bSYour Name /* not enough data to fill the reserved msg buffer*/
798*5113495bSYour Name break;
799*5113495bSYour Name
800*5113495bSYour Name bytes = qdf_snprint(buf_p, space, "%d,", val);
801*5113495bSYour Name space -= bytes;
802*5113495bSYour Name if (space > 0)
803*5113495bSYour Name buf_p += bytes;
804*5113495bSYour Name else /* not enough print buffer space for all the data */
805*5113495bSYour Name break;
806*5113495bSYour Name p8++;
807*5113495bSYour Name }
808*5113495bSYour Name if (buf_p == buffer)
809*5113495bSYour Name *buf_p = '\0'; /* nothing was written */
810*5113495bSYour Name else
811*5113495bSYour Name *(buf_p - 1) = '\0'; /* erase the final comma */
812*5113495bSYour Name
813*5113495bSYour Name }
814*5113495bSYour Name
htt_make_u16_list_str(uint32_t * aligned_data,char * buffer,int space,int max_elems)815*5113495bSYour Name static void htt_make_u16_list_str(uint32_t *aligned_data,
816*5113495bSYour Name char *buffer, int space, int max_elems)
817*5113495bSYour Name {
818*5113495bSYour Name uint16_t *p16 = (uint16_t *) aligned_data;
819*5113495bSYour Name char *buf_p = buffer;
820*5113495bSYour Name
821*5113495bSYour Name while (max_elems-- > 0) {
822*5113495bSYour Name int bytes;
823*5113495bSYour Name uint16_t val;
824*5113495bSYour Name
825*5113495bSYour Name val = htt_msg_read16(p16);
826*5113495bSYour Name if (val == 0)
827*5113495bSYour Name /* not enough data to fill the reserved msg buffer */
828*5113495bSYour Name break;
829*5113495bSYour Name bytes = qdf_snprint(buf_p, space, "%d,", val);
830*5113495bSYour Name space -= bytes;
831*5113495bSYour Name if (space > 0)
832*5113495bSYour Name buf_p += bytes;
833*5113495bSYour Name else /* not enough print buffer space for all the data */
834*5113495bSYour Name break;
835*5113495bSYour Name
836*5113495bSYour Name p16++;
837*5113495bSYour Name }
838*5113495bSYour Name if (buf_p == buffer)
839*5113495bSYour Name *buf_p = '\0'; /* nothing was written */
840*5113495bSYour Name else
841*5113495bSYour Name *(buf_p - 1) = '\0'; /* erase the final comma */
842*5113495bSYour Name }
843*5113495bSYour Name
844*5113495bSYour Name static void
htt_t2h_tx_ppdu_log_print(struct ol_fw_tx_dbg_ppdu_msg_hdr * hdr,struct ol_fw_tx_dbg_ppdu_base * record,int length,int concise)845*5113495bSYour Name htt_t2h_tx_ppdu_log_print(struct ol_fw_tx_dbg_ppdu_msg_hdr *hdr,
846*5113495bSYour Name struct ol_fw_tx_dbg_ppdu_base *record,
847*5113495bSYour Name int length, int concise)
848*5113495bSYour Name {
849*5113495bSYour Name int i;
850*5113495bSYour Name int record_size;
851*5113495bSYour Name int calculated_record_size;
852*5113495bSYour Name int num_records;
853*5113495bSYour Name
854*5113495bSYour Name record_size = sizeof(*record);
855*5113495bSYour Name calculated_record_size = record_size +
856*5113495bSYour Name hdr->mpdu_bytes_array_len * sizeof(uint16_t);
857*5113495bSYour Name if (calculated_record_size < record_size) {
858*5113495bSYour Name qdf_err("Overflow due to record and hdr->mpdu_bytes_array_len %u",
859*5113495bSYour Name hdr->mpdu_bytes_array_len);
860*5113495bSYour Name return;
861*5113495bSYour Name }
862*5113495bSYour Name record_size = calculated_record_size;
863*5113495bSYour Name calculated_record_size += hdr->mpdu_msdus_array_len * sizeof(uint8_t);
864*5113495bSYour Name if (calculated_record_size < record_size) {
865*5113495bSYour Name qdf_err("Overflow due to hdr->mpdu_msdus_array_len %u",
866*5113495bSYour Name hdr->mpdu_msdus_array_len);
867*5113495bSYour Name return;
868*5113495bSYour Name }
869*5113495bSYour Name record_size = calculated_record_size;
870*5113495bSYour Name calculated_record_size += hdr->msdu_bytes_array_len * sizeof(uint16_t);
871*5113495bSYour Name if (calculated_record_size < record_size) {
872*5113495bSYour Name qdf_err("Overflow due to hdr->msdu_bytes_array_len %u",
873*5113495bSYour Name hdr->msdu_bytes_array_len);
874*5113495bSYour Name return;
875*5113495bSYour Name }
876*5113495bSYour Name record_size = calculated_record_size;
877*5113495bSYour Name num_records = (length - sizeof(*hdr)) / record_size;
878*5113495bSYour Name if (num_records < 0) {
879*5113495bSYour Name qdf_err("Underflow due to length %d", length);
880*5113495bSYour Name return;
881*5113495bSYour Name }
882*5113495bSYour Name qdf_nofl_info("Tx PPDU log elements: num_records %d", num_records);
883*5113495bSYour Name
884*5113495bSYour Name for (i = 0; i < num_records; i++) {
885*5113495bSYour Name uint16_t start_seq_num;
886*5113495bSYour Name uint16_t start_pn_lsbs;
887*5113495bSYour Name uint8_t num_mpdus;
888*5113495bSYour Name uint16_t peer_id;
889*5113495bSYour Name uint8_t ext_tid;
890*5113495bSYour Name uint8_t rate_code;
891*5113495bSYour Name uint8_t rate_flags;
892*5113495bSYour Name uint8_t tries;
893*5113495bSYour Name uint8_t complete;
894*5113495bSYour Name uint32_t time_enqueue_us;
895*5113495bSYour Name uint32_t time_completion_us;
896*5113495bSYour Name uint32_t *msg_word = (uint32_t *) record;
897*5113495bSYour Name
898*5113495bSYour Name /* fields used for both concise and complete printouts */
899*5113495bSYour Name start_seq_num =
900*5113495bSYour Name ((*(msg_word + OL_FW_TX_DBG_PPDU_START_SEQ_NUM_WORD)) &
901*5113495bSYour Name OL_FW_TX_DBG_PPDU_START_SEQ_NUM_M) >>
902*5113495bSYour Name OL_FW_TX_DBG_PPDU_START_SEQ_NUM_S;
903*5113495bSYour Name complete =
904*5113495bSYour Name ((*(msg_word + OL_FW_TX_DBG_PPDU_COMPLETE_WORD)) &
905*5113495bSYour Name OL_FW_TX_DBG_PPDU_COMPLETE_M) >>
906*5113495bSYour Name OL_FW_TX_DBG_PPDU_COMPLETE_S;
907*5113495bSYour Name
908*5113495bSYour Name /* fields used only for complete printouts */
909*5113495bSYour Name if (!concise) {
910*5113495bSYour Name #define BUF_SIZE 80
911*5113495bSYour Name char buf[BUF_SIZE];
912*5113495bSYour Name uint8_t *p8;
913*5113495bSYour Name uint8_t *calculated_p8;
914*5113495bSYour Name
915*5113495bSYour Name time_enqueue_us =
916*5113495bSYour Name HTT_TICK_TO_USEC(record->timestamp_enqueue,
917*5113495bSYour Name hdr->microsec_per_tick);
918*5113495bSYour Name time_completion_us =
919*5113495bSYour Name HTT_TICK_TO_USEC(record->timestamp_completion,
920*5113495bSYour Name hdr->microsec_per_tick);
921*5113495bSYour Name
922*5113495bSYour Name start_pn_lsbs =
923*5113495bSYour Name ((*(msg_word +
924*5113495bSYour Name OL_FW_TX_DBG_PPDU_START_PN_LSBS_WORD)) &
925*5113495bSYour Name OL_FW_TX_DBG_PPDU_START_PN_LSBS_M) >>
926*5113495bSYour Name OL_FW_TX_DBG_PPDU_START_PN_LSBS_S;
927*5113495bSYour Name num_mpdus =
928*5113495bSYour Name ((*(msg_word +
929*5113495bSYour Name OL_FW_TX_DBG_PPDU_NUM_MPDUS_WORD))&
930*5113495bSYour Name OL_FW_TX_DBG_PPDU_NUM_MPDUS_M) >>
931*5113495bSYour Name OL_FW_TX_DBG_PPDU_NUM_MPDUS_S;
932*5113495bSYour Name peer_id =
933*5113495bSYour Name ((*(msg_word +
934*5113495bSYour Name OL_FW_TX_DBG_PPDU_PEER_ID_WORD)) &
935*5113495bSYour Name OL_FW_TX_DBG_PPDU_PEER_ID_M) >>
936*5113495bSYour Name OL_FW_TX_DBG_PPDU_PEER_ID_S;
937*5113495bSYour Name ext_tid =
938*5113495bSYour Name ((*(msg_word +
939*5113495bSYour Name OL_FW_TX_DBG_PPDU_EXT_TID_WORD)) &
940*5113495bSYour Name OL_FW_TX_DBG_PPDU_EXT_TID_M) >>
941*5113495bSYour Name OL_FW_TX_DBG_PPDU_EXT_TID_S;
942*5113495bSYour Name rate_code =
943*5113495bSYour Name ((*(msg_word +
944*5113495bSYour Name OL_FW_TX_DBG_PPDU_RATE_CODE_WORD))&
945*5113495bSYour Name OL_FW_TX_DBG_PPDU_RATE_CODE_M) >>
946*5113495bSYour Name OL_FW_TX_DBG_PPDU_RATE_CODE_S;
947*5113495bSYour Name rate_flags =
948*5113495bSYour Name ((*(msg_word +
949*5113495bSYour Name OL_FW_TX_DBG_PPDU_RATE_FLAGS_WORD))&
950*5113495bSYour Name OL_FW_TX_DBG_PPDU_RATE_FLAGS_M) >>
951*5113495bSYour Name OL_FW_TX_DBG_PPDU_RATE_FLAGS_S;
952*5113495bSYour Name tries =
953*5113495bSYour Name ((*(msg_word +
954*5113495bSYour Name OL_FW_TX_DBG_PPDU_TRIES_WORD)) &
955*5113495bSYour Name OL_FW_TX_DBG_PPDU_TRIES_M) >>
956*5113495bSYour Name OL_FW_TX_DBG_PPDU_TRIES_S;
957*5113495bSYour Name
958*5113495bSYour Name qdf_nofl_info(" - PPDU tx to peer %d, TID %d", peer_id,
959*5113495bSYour Name ext_tid);
960*5113495bSYour Name qdf_nofl_info(" start seq num= %u, start PN LSBs= %#04x",
961*5113495bSYour Name start_seq_num, start_pn_lsbs);
962*5113495bSYour Name qdf_nofl_info(" PPDU: %d MPDUs, (?) MSDUs, %d bytes",
963*5113495bSYour Name num_mpdus,
964*5113495bSYour Name /* num_msdus-not yet computed in target */
965*5113495bSYour Name record->num_bytes);
966*5113495bSYour Name if (complete) {
967*5113495bSYour Name qdf_nofl_info(" enqueued: %u, completed: %u usec)",
968*5113495bSYour Name time_enqueue_us,
969*5113495bSYour Name time_completion_us);
970*5113495bSYour Name qdf_nofl_info(" %d tries, last tx used rate %d ",
971*5113495bSYour Name tries, rate_code);
972*5113495bSYour Name qdf_nofl_info("on %d MHz chan (flags = %#x)",
973*5113495bSYour Name htt_rate_flags_to_mhz
974*5113495bSYour Name (rate_flags), rate_flags);
975*5113495bSYour Name qdf_nofl_info(" enqueued and acked MPDU bitmaps:");
976*5113495bSYour Name htt_t2h_tx_ppdu_bitmaps_pr(msg_word +
977*5113495bSYour Name OL_FW_TX_DBG_PPDU_ENQUEUED_LSBS_WORD,
978*5113495bSYour Name msg_word +
979*5113495bSYour Name OL_FW_TX_DBG_PPDU_BLOCK_ACK_LSBS_WORD);
980*5113495bSYour Name } else {
981*5113495bSYour Name qdf_nofl_info(" enqueued: %d us, not yet completed",
982*5113495bSYour Name time_enqueue_us);
983*5113495bSYour Name }
984*5113495bSYour Name /* skip the regular msg fields to reach the tail area */
985*5113495bSYour Name p8 = (uint8_t *) record;
986*5113495bSYour Name calculated_p8 = p8 + sizeof(struct ol_fw_tx_dbg_ppdu_base);
987*5113495bSYour Name if (calculated_p8 < p8) {
988*5113495bSYour Name qdf_err("Overflow due to record %pK", p8);
989*5113495bSYour Name continue;
990*5113495bSYour Name }
991*5113495bSYour Name p8 = calculated_p8;
992*5113495bSYour Name if (hdr->mpdu_bytes_array_len) {
993*5113495bSYour Name htt_make_u16_list_str((uint32_t *) p8, buf,
994*5113495bSYour Name BUF_SIZE,
995*5113495bSYour Name hdr->
996*5113495bSYour Name mpdu_bytes_array_len);
997*5113495bSYour Name qdf_nofl_info(" MPDU bytes: %s", buf);
998*5113495bSYour Name }
999*5113495bSYour Name calculated_p8 += hdr->mpdu_bytes_array_len * sizeof(uint16_t);
1000*5113495bSYour Name if (calculated_p8 < p8) {
1001*5113495bSYour Name qdf_err("Overflow due to hdr->mpdu_bytes_array_len %u",
1002*5113495bSYour Name hdr->mpdu_bytes_array_len);
1003*5113495bSYour Name continue;
1004*5113495bSYour Name }
1005*5113495bSYour Name p8 = calculated_p8;
1006*5113495bSYour Name if (hdr->mpdu_msdus_array_len) {
1007*5113495bSYour Name htt_make_u8_list_str((uint32_t *) p8, buf,
1008*5113495bSYour Name BUF_SIZE,
1009*5113495bSYour Name hdr->mpdu_msdus_array_len);
1010*5113495bSYour Name qdf_nofl_info(" MPDU MSDUs: %s", buf);
1011*5113495bSYour Name }
1012*5113495bSYour Name calculated_p8 += hdr->mpdu_msdus_array_len * sizeof(uint8_t);
1013*5113495bSYour Name if (calculated_p8 < p8) {
1014*5113495bSYour Name qdf_err("Overflow due to hdr->mpdu_msdus_array_len %u",
1015*5113495bSYour Name hdr->mpdu_msdus_array_len);
1016*5113495bSYour Name continue;
1017*5113495bSYour Name }
1018*5113495bSYour Name p8 = calculated_p8;
1019*5113495bSYour Name if (hdr->msdu_bytes_array_len) {
1020*5113495bSYour Name htt_make_u16_list_str((uint32_t *) p8, buf,
1021*5113495bSYour Name BUF_SIZE,
1022*5113495bSYour Name hdr->
1023*5113495bSYour Name msdu_bytes_array_len);
1024*5113495bSYour Name qdf_nofl_info(" MSDU bytes: %s", buf);
1025*5113495bSYour Name }
1026*5113495bSYour Name } else {
1027*5113495bSYour Name /* concise */
1028*5113495bSYour Name qdf_nofl_info("start seq num = %u ", start_seq_num);
1029*5113495bSYour Name qdf_nofl_info("enqueued and acked MPDU bitmaps:");
1030*5113495bSYour Name if (complete) {
1031*5113495bSYour Name htt_t2h_tx_ppdu_bitmaps_pr(msg_word +
1032*5113495bSYour Name OL_FW_TX_DBG_PPDU_ENQUEUED_LSBS_WORD,
1033*5113495bSYour Name msg_word +
1034*5113495bSYour Name OL_FW_TX_DBG_PPDU_BLOCK_ACK_LSBS_WORD);
1035*5113495bSYour Name } else {
1036*5113495bSYour Name qdf_nofl_info("(not completed)");
1037*5113495bSYour Name }
1038*5113495bSYour Name }
1039*5113495bSYour Name record = (struct ol_fw_tx_dbg_ppdu_base *)
1040*5113495bSYour Name (((uint8_t *) record) + record_size);
1041*5113495bSYour Name }
1042*5113495bSYour Name }
1043*5113495bSYour Name
htt_t2h_stats_tidq_stats_print(struct wlan_dbg_tidq_stats * tidq_stats,int concise)1044*5113495bSYour Name static void htt_t2h_stats_tidq_stats_print(
1045*5113495bSYour Name struct wlan_dbg_tidq_stats *tidq_stats, int concise)
1046*5113495bSYour Name {
1047*5113495bSYour Name qdf_nofl_info("TID QUEUE STATS:");
1048*5113495bSYour Name qdf_nofl_info("tid_txq_stats: %u", tidq_stats->wlan_dbg_tid_txq_status);
1049*5113495bSYour Name qdf_nofl_info("num_pkts_queued(0..9):");
1050*5113495bSYour Name qdf_nofl_info("%u, %u, %u, %u, %u, %u, %u, %u, %u, %u",
1051*5113495bSYour Name tidq_stats->txq_st.num_pkts_queued[0],
1052*5113495bSYour Name tidq_stats->txq_st.num_pkts_queued[1],
1053*5113495bSYour Name tidq_stats->txq_st.num_pkts_queued[2],
1054*5113495bSYour Name tidq_stats->txq_st.num_pkts_queued[3],
1055*5113495bSYour Name tidq_stats->txq_st.num_pkts_queued[4],
1056*5113495bSYour Name tidq_stats->txq_st.num_pkts_queued[5],
1057*5113495bSYour Name tidq_stats->txq_st.num_pkts_queued[6],
1058*5113495bSYour Name tidq_stats->txq_st.num_pkts_queued[7],
1059*5113495bSYour Name tidq_stats->txq_st.num_pkts_queued[8],
1060*5113495bSYour Name tidq_stats->txq_st.num_pkts_queued[9]);
1061*5113495bSYour Name qdf_nofl_info("tid_hw_qdepth(0..19):");
1062*5113495bSYour Name qdf_nofl_info("%u, %u, %u, %u, %u, %u, %u, %u, %u, %u",
1063*5113495bSYour Name tidq_stats->txq_st.tid_hw_qdepth[0],
1064*5113495bSYour Name tidq_stats->txq_st.tid_hw_qdepth[1],
1065*5113495bSYour Name tidq_stats->txq_st.tid_hw_qdepth[2],
1066*5113495bSYour Name tidq_stats->txq_st.tid_hw_qdepth[3],
1067*5113495bSYour Name tidq_stats->txq_st.tid_hw_qdepth[4],
1068*5113495bSYour Name tidq_stats->txq_st.tid_hw_qdepth[5],
1069*5113495bSYour Name tidq_stats->txq_st.tid_hw_qdepth[6],
1070*5113495bSYour Name tidq_stats->txq_st.tid_hw_qdepth[7],
1071*5113495bSYour Name tidq_stats->txq_st.tid_hw_qdepth[8],
1072*5113495bSYour Name tidq_stats->txq_st.tid_hw_qdepth[9]);
1073*5113495bSYour Name qdf_nofl_info("%u, %u, %u, %u, %u, %u, %u, %u, %u, %u",
1074*5113495bSYour Name tidq_stats->txq_st.tid_hw_qdepth[10],
1075*5113495bSYour Name tidq_stats->txq_st.tid_hw_qdepth[11],
1076*5113495bSYour Name tidq_stats->txq_st.tid_hw_qdepth[12],
1077*5113495bSYour Name tidq_stats->txq_st.tid_hw_qdepth[13],
1078*5113495bSYour Name tidq_stats->txq_st.tid_hw_qdepth[14],
1079*5113495bSYour Name tidq_stats->txq_st.tid_hw_qdepth[15],
1080*5113495bSYour Name tidq_stats->txq_st.tid_hw_qdepth[16],
1081*5113495bSYour Name tidq_stats->txq_st.tid_hw_qdepth[17],
1082*5113495bSYour Name tidq_stats->txq_st.tid_hw_qdepth[18],
1083*5113495bSYour Name tidq_stats->txq_st.tid_hw_qdepth[19]);
1084*5113495bSYour Name qdf_nofl_info("tid_sw_qdepth(0..19):");
1085*5113495bSYour Name qdf_nofl_info("%u, %u, %u, %u, %u, %u, %u, %u, %u, %u",
1086*5113495bSYour Name tidq_stats->txq_st.tid_sw_qdepth[0],
1087*5113495bSYour Name tidq_stats->txq_st.tid_sw_qdepth[1],
1088*5113495bSYour Name tidq_stats->txq_st.tid_sw_qdepth[2],
1089*5113495bSYour Name tidq_stats->txq_st.tid_sw_qdepth[3],
1090*5113495bSYour Name tidq_stats->txq_st.tid_sw_qdepth[4],
1091*5113495bSYour Name tidq_stats->txq_st.tid_sw_qdepth[5],
1092*5113495bSYour Name tidq_stats->txq_st.tid_sw_qdepth[6],
1093*5113495bSYour Name tidq_stats->txq_st.tid_sw_qdepth[7],
1094*5113495bSYour Name tidq_stats->txq_st.tid_sw_qdepth[8],
1095*5113495bSYour Name tidq_stats->txq_st.tid_sw_qdepth[9]);
1096*5113495bSYour Name qdf_nofl_info("%u, %u, %u, %u, %u, %u, %u, %u, %u, %u",
1097*5113495bSYour Name tidq_stats->txq_st.tid_sw_qdepth[10],
1098*5113495bSYour Name tidq_stats->txq_st.tid_sw_qdepth[11],
1099*5113495bSYour Name tidq_stats->txq_st.tid_sw_qdepth[12],
1100*5113495bSYour Name tidq_stats->txq_st.tid_sw_qdepth[13],
1101*5113495bSYour Name tidq_stats->txq_st.tid_sw_qdepth[14],
1102*5113495bSYour Name tidq_stats->txq_st.tid_sw_qdepth[15],
1103*5113495bSYour Name tidq_stats->txq_st.tid_sw_qdepth[16],
1104*5113495bSYour Name tidq_stats->txq_st.tid_sw_qdepth[17],
1105*5113495bSYour Name tidq_stats->txq_st.tid_sw_qdepth[18],
1106*5113495bSYour Name tidq_stats->txq_st.tid_sw_qdepth[19]);
1107*5113495bSYour Name }
1108*5113495bSYour Name
htt_t2h_stats_tx_mu_stats_print(struct wlan_dbg_tx_mu_stats * tx_mu_stats,int concise)1109*5113495bSYour Name static void htt_t2h_stats_tx_mu_stats_print(
1110*5113495bSYour Name struct wlan_dbg_tx_mu_stats *tx_mu_stats, int concise)
1111*5113495bSYour Name {
1112*5113495bSYour Name qdf_nofl_info("TX MU STATS:");
1113*5113495bSYour Name qdf_nofl_info("mu_sch_nusers_2: %u", tx_mu_stats->mu_sch_nusers_2);
1114*5113495bSYour Name qdf_nofl_info("mu_sch_nusers_3: %u", tx_mu_stats->mu_sch_nusers_3);
1115*5113495bSYour Name qdf_nofl_info("mu_mpdus_queued_usr: %u, %u, %u, %u",
1116*5113495bSYour Name tx_mu_stats->mu_mpdus_queued_usr[0],
1117*5113495bSYour Name tx_mu_stats->mu_mpdus_queued_usr[1],
1118*5113495bSYour Name tx_mu_stats->mu_mpdus_queued_usr[2],
1119*5113495bSYour Name tx_mu_stats->mu_mpdus_queued_usr[3]);
1120*5113495bSYour Name qdf_nofl_info("mu_mpdus_tried_usr: %u, %u, %u, %u",
1121*5113495bSYour Name tx_mu_stats->mu_mpdus_tried_usr[0],
1122*5113495bSYour Name tx_mu_stats->mu_mpdus_tried_usr[1],
1123*5113495bSYour Name tx_mu_stats->mu_mpdus_tried_usr[2],
1124*5113495bSYour Name tx_mu_stats->mu_mpdus_tried_usr[3]);
1125*5113495bSYour Name qdf_nofl_info("mu_mpdus_failed_usr: %u, %u, %u, %u",
1126*5113495bSYour Name tx_mu_stats->mu_mpdus_failed_usr[0],
1127*5113495bSYour Name tx_mu_stats->mu_mpdus_failed_usr[1],
1128*5113495bSYour Name tx_mu_stats->mu_mpdus_failed_usr[2],
1129*5113495bSYour Name tx_mu_stats->mu_mpdus_failed_usr[3]);
1130*5113495bSYour Name qdf_nofl_info("mu_mpdus_requeued_usr: %u, %u, %u, %u",
1131*5113495bSYour Name tx_mu_stats->mu_mpdus_requeued_usr[0],
1132*5113495bSYour Name tx_mu_stats->mu_mpdus_requeued_usr[1],
1133*5113495bSYour Name tx_mu_stats->mu_mpdus_requeued_usr[2],
1134*5113495bSYour Name tx_mu_stats->mu_mpdus_requeued_usr[3]);
1135*5113495bSYour Name qdf_nofl_info("mu_err_no_ba_usr: %u, %u, %u, %u",
1136*5113495bSYour Name tx_mu_stats->mu_err_no_ba_usr[0],
1137*5113495bSYour Name tx_mu_stats->mu_err_no_ba_usr[1],
1138*5113495bSYour Name tx_mu_stats->mu_err_no_ba_usr[2],
1139*5113495bSYour Name tx_mu_stats->mu_err_no_ba_usr[3]);
1140*5113495bSYour Name qdf_nofl_info("mu_mpdu_underrun_usr: %u, %u, %u, %u",
1141*5113495bSYour Name tx_mu_stats->mu_mpdu_underrun_usr[0],
1142*5113495bSYour Name tx_mu_stats->mu_mpdu_underrun_usr[1],
1143*5113495bSYour Name tx_mu_stats->mu_mpdu_underrun_usr[2],
1144*5113495bSYour Name tx_mu_stats->mu_mpdu_underrun_usr[3]);
1145*5113495bSYour Name qdf_nofl_info("mu_ampdu_underrun_usr: %u, %u, %u, %u",
1146*5113495bSYour Name tx_mu_stats->mu_ampdu_underrun_usr[0],
1147*5113495bSYour Name tx_mu_stats->mu_ampdu_underrun_usr[1],
1148*5113495bSYour Name tx_mu_stats->mu_ampdu_underrun_usr[2],
1149*5113495bSYour Name tx_mu_stats->mu_ampdu_underrun_usr[3]);
1150*5113495bSYour Name
1151*5113495bSYour Name }
1152*5113495bSYour Name
htt_t2h_stats_sifs_resp_stats_print(struct wlan_dbg_sifs_resp_stats * sifs_stats,int concise)1153*5113495bSYour Name static void htt_t2h_stats_sifs_resp_stats_print(
1154*5113495bSYour Name struct wlan_dbg_sifs_resp_stats *sifs_stats, int concise)
1155*5113495bSYour Name {
1156*5113495bSYour Name qdf_nofl_info("SIFS RESP STATS:");
1157*5113495bSYour Name qdf_nofl_info("num of ps-poll trigger frames: %u",
1158*5113495bSYour Name sifs_stats->ps_poll_trigger);
1159*5113495bSYour Name qdf_nofl_info("num of uapsd trigger frames: %u",
1160*5113495bSYour Name sifs_stats->uapsd_trigger);
1161*5113495bSYour Name qdf_nofl_info("num of data trigger frames: %u, %u",
1162*5113495bSYour Name sifs_stats->qb_data_trigger[0],
1163*5113495bSYour Name sifs_stats->qb_data_trigger[1]);
1164*5113495bSYour Name qdf_nofl_info("num of bar trigger frames: %u, %u",
1165*5113495bSYour Name sifs_stats->qb_bar_trigger[0],
1166*5113495bSYour Name sifs_stats->qb_bar_trigger[1]);
1167*5113495bSYour Name qdf_nofl_info("num of ppdu transmitted at SIFS interval: %u",
1168*5113495bSYour Name sifs_stats->sifs_resp_data);
1169*5113495bSYour Name qdf_nofl_info("num of ppdu failed to meet SIFS resp timing: %u",
1170*5113495bSYour Name sifs_stats->sifs_resp_err);
1171*5113495bSYour Name }
1172*5113495bSYour Name
htt_t2h_stats_print(uint8_t * stats_data,int concise)1173*5113495bSYour Name void htt_t2h_stats_print(uint8_t *stats_data, int concise)
1174*5113495bSYour Name {
1175*5113495bSYour Name uint32_t *msg_word = (uint32_t *) stats_data;
1176*5113495bSYour Name enum htt_dbg_stats_type type;
1177*5113495bSYour Name enum htt_dbg_stats_status status;
1178*5113495bSYour Name int length;
1179*5113495bSYour Name
1180*5113495bSYour Name type = HTT_T2H_STATS_CONF_TLV_TYPE_GET(*msg_word);
1181*5113495bSYour Name status = HTT_T2H_STATS_CONF_TLV_STATUS_GET(*msg_word);
1182*5113495bSYour Name length = HTT_T2H_STATS_CONF_TLV_LENGTH_GET(*msg_word);
1183*5113495bSYour Name
1184*5113495bSYour Name /* check that we've been given a valid stats type */
1185*5113495bSYour Name if (status == HTT_DBG_STATS_STATUS_SERIES_DONE) {
1186*5113495bSYour Name return;
1187*5113495bSYour Name } else if (status == HTT_DBG_STATS_STATUS_INVALID) {
1188*5113495bSYour Name qdf_debug("Target doesn't support stats type %d", type);
1189*5113495bSYour Name return;
1190*5113495bSYour Name } else if (status == HTT_DBG_STATS_STATUS_ERROR) {
1191*5113495bSYour Name qdf_debug("Target couldn't upload stats type %d (no mem?)",
1192*5113495bSYour Name type);
1193*5113495bSYour Name return;
1194*5113495bSYour Name }
1195*5113495bSYour Name /* got valid (though perhaps partial) stats - process them */
1196*5113495bSYour Name switch (type) {
1197*5113495bSYour Name case HTT_DBG_STATS_WAL_PDEV_TXRX:
1198*5113495bSYour Name {
1199*5113495bSYour Name struct wlan_dbg_stats *wlan_dbg_stats_ptr;
1200*5113495bSYour Name
1201*5113495bSYour Name wlan_dbg_stats_ptr =
1202*5113495bSYour Name (struct wlan_dbg_stats *)(msg_word + 1);
1203*5113495bSYour Name htt_t2h_stats_pdev_stats_print(wlan_dbg_stats_ptr,
1204*5113495bSYour Name concise);
1205*5113495bSYour Name break;
1206*5113495bSYour Name }
1207*5113495bSYour Name case HTT_DBG_STATS_RX_REORDER:
1208*5113495bSYour Name {
1209*5113495bSYour Name struct rx_reorder_stats *rx_reorder_stats_ptr;
1210*5113495bSYour Name
1211*5113495bSYour Name rx_reorder_stats_ptr =
1212*5113495bSYour Name (struct rx_reorder_stats *)(msg_word + 1);
1213*5113495bSYour Name htt_t2h_stats_rx_reorder_stats_print
1214*5113495bSYour Name (rx_reorder_stats_ptr, concise);
1215*5113495bSYour Name break;
1216*5113495bSYour Name }
1217*5113495bSYour Name
1218*5113495bSYour Name case HTT_DBG_STATS_RX_RATE_INFO:
1219*5113495bSYour Name {
1220*5113495bSYour Name wlan_dbg_rx_rate_info_t *rx_phy_info;
1221*5113495bSYour Name
1222*5113495bSYour Name rx_phy_info = (wlan_dbg_rx_rate_info_t *) (msg_word + 1);
1223*5113495bSYour Name htt_t2h_stats_rx_rate_stats_print(rx_phy_info, concise);
1224*5113495bSYour Name break;
1225*5113495bSYour Name }
1226*5113495bSYour Name case HTT_DBG_STATS_RX_RATE_INFO_V2:
1227*5113495bSYour Name {
1228*5113495bSYour Name wlan_dbg_rx_rate_info_v2_t *rx_phy_info;
1229*5113495bSYour Name
1230*5113495bSYour Name rx_phy_info = (wlan_dbg_rx_rate_info_v2_t *) (msg_word + 1);
1231*5113495bSYour Name htt_t2h_stats_rx_rate_stats_print_v2(rx_phy_info, concise);
1232*5113495bSYour Name break;
1233*5113495bSYour Name }
1234*5113495bSYour Name case HTT_DBG_STATS_TX_PPDU_LOG:
1235*5113495bSYour Name {
1236*5113495bSYour Name struct ol_fw_tx_dbg_ppdu_msg_hdr *hdr;
1237*5113495bSYour Name struct ol_fw_tx_dbg_ppdu_base *record;
1238*5113495bSYour Name
1239*5113495bSYour Name if (status == HTT_DBG_STATS_STATUS_PARTIAL
1240*5113495bSYour Name && length == 0) {
1241*5113495bSYour Name qdf_debug("HTT_DBG_STATS_TX_PPDU_LOG -- length = 0!");
1242*5113495bSYour Name break;
1243*5113495bSYour Name }
1244*5113495bSYour Name hdr = (struct ol_fw_tx_dbg_ppdu_msg_hdr *)(msg_word + 1);
1245*5113495bSYour Name record = (struct ol_fw_tx_dbg_ppdu_base *)(hdr + 1);
1246*5113495bSYour Name htt_t2h_tx_ppdu_log_print(hdr, record, length, concise);
1247*5113495bSYour Name }
1248*5113495bSYour Name break;
1249*5113495bSYour Name case HTT_DBG_STATS_TX_RATE_INFO:
1250*5113495bSYour Name {
1251*5113495bSYour Name wlan_dbg_tx_rate_info_t *tx_rate_info;
1252*5113495bSYour Name
1253*5113495bSYour Name tx_rate_info = (wlan_dbg_tx_rate_info_t *) (msg_word + 1);
1254*5113495bSYour Name htt_t2h_stats_tx_rate_stats_print(tx_rate_info, concise);
1255*5113495bSYour Name break;
1256*5113495bSYour Name }
1257*5113495bSYour Name case HTT_DBG_STATS_TX_RATE_INFO_V2:
1258*5113495bSYour Name {
1259*5113495bSYour Name wlan_dbg_tx_rate_info_v2_t *tx_rate_info;
1260*5113495bSYour Name
1261*5113495bSYour Name tx_rate_info = (wlan_dbg_tx_rate_info_v2_t *) (msg_word + 1);
1262*5113495bSYour Name htt_t2h_stats_tx_rate_stats_print_v2(tx_rate_info, concise);
1263*5113495bSYour Name break;
1264*5113495bSYour Name }
1265*5113495bSYour Name case HTT_DBG_STATS_RX_REMOTE_RING_BUFFER_INFO:
1266*5113495bSYour Name {
1267*5113495bSYour Name struct rx_remote_buffer_mgmt_stats *rx_rem_buf;
1268*5113495bSYour Name
1269*5113495bSYour Name rx_rem_buf =
1270*5113495bSYour Name (struct rx_remote_buffer_mgmt_stats *)(msg_word + 1);
1271*5113495bSYour Name htt_t2h_stats_rx_rem_buf_stats_print(rx_rem_buf, concise);
1272*5113495bSYour Name break;
1273*5113495bSYour Name }
1274*5113495bSYour Name case HTT_DBG_STATS_TXBF_INFO:
1275*5113495bSYour Name {
1276*5113495bSYour Name struct wlan_dbg_txbf_data_stats *txbf_info_buf;
1277*5113495bSYour Name
1278*5113495bSYour Name txbf_info_buf =
1279*5113495bSYour Name (struct wlan_dbg_txbf_data_stats *)(msg_word + 1);
1280*5113495bSYour Name htt_t2h_stats_txbf_info_buf_stats_print(txbf_info_buf);
1281*5113495bSYour Name break;
1282*5113495bSYour Name }
1283*5113495bSYour Name case HTT_DBG_STATS_SND_INFO:
1284*5113495bSYour Name {
1285*5113495bSYour Name struct wlan_dbg_txbf_snd_stats *txbf_snd_buf;
1286*5113495bSYour Name
1287*5113495bSYour Name txbf_snd_buf = (struct wlan_dbg_txbf_snd_stats *)(msg_word + 1);
1288*5113495bSYour Name htt_t2h_stats_txbf_snd_buf_stats_print(txbf_snd_buf);
1289*5113495bSYour Name break;
1290*5113495bSYour Name }
1291*5113495bSYour Name case HTT_DBG_STATS_TX_SELFGEN_INFO:
1292*5113495bSYour Name {
1293*5113495bSYour Name struct wlan_dbg_tx_selfgen_stats *tx_selfgen_buf;
1294*5113495bSYour Name
1295*5113495bSYour Name tx_selfgen_buf =
1296*5113495bSYour Name (struct wlan_dbg_tx_selfgen_stats *)(msg_word + 1);
1297*5113495bSYour Name htt_t2h_stats_tx_selfgen_buf_stats_print(tx_selfgen_buf);
1298*5113495bSYour Name break;
1299*5113495bSYour Name }
1300*5113495bSYour Name case HTT_DBG_STATS_ERROR_INFO:
1301*5113495bSYour Name {
1302*5113495bSYour Name struct wlan_dbg_wifi2_error_stats *wifi2_error_buf;
1303*5113495bSYour Name
1304*5113495bSYour Name wifi2_error_buf =
1305*5113495bSYour Name (struct wlan_dbg_wifi2_error_stats *)(msg_word + 1);
1306*5113495bSYour Name htt_t2h_stats_wifi2_error_stats_print(wifi2_error_buf);
1307*5113495bSYour Name break;
1308*5113495bSYour Name }
1309*5113495bSYour Name case HTT_DBG_STATS_TXBF_MUSU_NDPA_PKT:
1310*5113495bSYour Name {
1311*5113495bSYour Name struct rx_txbf_musu_ndpa_pkts_stats *rx_musu_ndpa_stats;
1312*5113495bSYour Name
1313*5113495bSYour Name rx_musu_ndpa_stats = (struct rx_txbf_musu_ndpa_pkts_stats *)
1314*5113495bSYour Name (msg_word + 1);
1315*5113495bSYour Name htt_t2h_rx_musu_ndpa_pkts_stats_print(rx_musu_ndpa_stats);
1316*5113495bSYour Name break;
1317*5113495bSYour Name }
1318*5113495bSYour Name case HTT_DBG_STATS_TIDQ:
1319*5113495bSYour Name {
1320*5113495bSYour Name struct wlan_dbg_tidq_stats *tidq_stats;
1321*5113495bSYour Name
1322*5113495bSYour Name tidq_stats = (struct wlan_dbg_tidq_stats *)(msg_word + 1);
1323*5113495bSYour Name htt_t2h_stats_tidq_stats_print(tidq_stats, concise);
1324*5113495bSYour Name break;
1325*5113495bSYour Name }
1326*5113495bSYour Name case HTT_DBG_STATS_TX_MU_INFO:
1327*5113495bSYour Name {
1328*5113495bSYour Name struct wlan_dbg_tx_mu_stats *tx_mu_stats;
1329*5113495bSYour Name
1330*5113495bSYour Name tx_mu_stats = (struct wlan_dbg_tx_mu_stats *)(msg_word + 1);
1331*5113495bSYour Name htt_t2h_stats_tx_mu_stats_print(tx_mu_stats, concise);
1332*5113495bSYour Name break;
1333*5113495bSYour Name }
1334*5113495bSYour Name case HTT_DBG_STATS_SIFS_RESP_INFO:
1335*5113495bSYour Name {
1336*5113495bSYour Name struct wlan_dbg_sifs_resp_stats *sifs_stats;
1337*5113495bSYour Name
1338*5113495bSYour Name sifs_stats = (struct wlan_dbg_sifs_resp_stats *)(msg_word + 1);
1339*5113495bSYour Name htt_t2h_stats_sifs_resp_stats_print(sifs_stats, concise);
1340*5113495bSYour Name break;
1341*5113495bSYour Name }
1342*5113495bSYour Name default:
1343*5113495bSYour Name break;
1344*5113495bSYour Name }
1345*5113495bSYour Name }
1346