xref: /wlan-driver/qcacld-3.0/core/dp/htt/htt_fw_stats.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
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