xref: /OK3568_Linux_fs/external/rkwifibt/drivers/infineon/bcm_app_utils.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Misc utility routines used by kernel or app-level.
3*4882a593Smuzhiyun  * Contents are wifi-specific, used by any kernel or app-level
4*4882a593Smuzhiyun  * software that might want wifi things as it grows.
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * Portions of this code are copyright (c) 2021 Cypress Semiconductor Corporation
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * Copyright (C) 1999-2017, Broadcom Corporation
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  *      Unless you and Broadcom execute a separate written software license
11*4882a593Smuzhiyun  * agreement governing use of this software, this software is licensed to you
12*4882a593Smuzhiyun  * under the terms of the GNU General Public License version 2 (the "GPL"),
13*4882a593Smuzhiyun  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
14*4882a593Smuzhiyun  * following added to such license:
15*4882a593Smuzhiyun  *
16*4882a593Smuzhiyun  *      As a special exception, the copyright holders of this software give you
17*4882a593Smuzhiyun  * permission to link this software with independent modules, and to copy and
18*4882a593Smuzhiyun  * distribute the resulting executable under terms of your choice, provided that
19*4882a593Smuzhiyun  * you also meet, for each linked independent module, the terms and conditions of
20*4882a593Smuzhiyun  * the license of that module.  An independent module is a module which is not
21*4882a593Smuzhiyun  * derived from this software.  The special exception does not apply to any
22*4882a593Smuzhiyun  * modifications of the software.
23*4882a593Smuzhiyun  *
24*4882a593Smuzhiyun  *      Notwithstanding the above, under no circumstances may you combine this
25*4882a593Smuzhiyun  * software in any way with any other Broadcom software provided under a license
26*4882a593Smuzhiyun  * other than the GPL, without Broadcom's express prior written consent.
27*4882a593Smuzhiyun  *
28*4882a593Smuzhiyun  *
29*4882a593Smuzhiyun  * <<Broadcom-WL-IPTag/Open:>>
30*4882a593Smuzhiyun  *
31*4882a593Smuzhiyun  * $Id: bcm_app_utils.c 667243 2016-10-26 11:37:48Z $
32*4882a593Smuzhiyun  */
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #include <typedefs.h>
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun #ifdef BCMDRIVER
37*4882a593Smuzhiyun #include <osl.h>
38*4882a593Smuzhiyun #define strtoul(nptr, endptr, base) bcm_strtoul((nptr), (endptr), (base))
39*4882a593Smuzhiyun #define tolower(c) (bcm_isupper((c)) ? ((c) + 'a' - 'A') : (c))
40*4882a593Smuzhiyun #else /* BCMDRIVER */
41*4882a593Smuzhiyun #include <stdio.h>
42*4882a593Smuzhiyun #include <string.h>
43*4882a593Smuzhiyun #include <stdlib.h>
44*4882a593Smuzhiyun #include <ctype.h>
45*4882a593Smuzhiyun #ifndef ASSERT
46*4882a593Smuzhiyun #define ASSERT(exp)
47*4882a593Smuzhiyun #endif // endif
48*4882a593Smuzhiyun #endif /* BCMDRIVER */
49*4882a593Smuzhiyun #include <bcmwifi_channels.h>
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun #if defined(WIN32) && (defined(BCMDLL) || defined(WLMDLL))
52*4882a593Smuzhiyun #include <bcmstdlib.h>	/* For wl/exe/GNUmakefile.brcm_wlu and GNUmakefile.wlm_dll */
53*4882a593Smuzhiyun #endif // endif
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #include <bcmutils.h>
56*4882a593Smuzhiyun #include <wlioctl.h>
57*4882a593Smuzhiyun #include <wlioctl_utils.h>
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun #ifndef BCMDRIVER
60*4882a593Smuzhiyun /*	Take an array of measurments representing a single channel over time and return
61*4882a593Smuzhiyun 	a summary. Currently implemented as a simple average but could easily evolve
62*4882a593Smuzhiyun 	into more cpomplex alogrithms.
63*4882a593Smuzhiyun */
64*4882a593Smuzhiyun cca_congest_channel_req_t *
cca_per_chan_summary(cca_congest_channel_req_t * input,cca_congest_channel_req_t * avg,bool percent)65*4882a593Smuzhiyun cca_per_chan_summary(cca_congest_channel_req_t *input, cca_congest_channel_req_t *avg, bool percent)
66*4882a593Smuzhiyun {
67*4882a593Smuzhiyun 	int sec;
68*4882a593Smuzhiyun 	cca_congest_t totals;
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun 	totals.duration  = 0;
71*4882a593Smuzhiyun 	totals.congest_ibss  = 0;
72*4882a593Smuzhiyun 	totals.congest_obss  = 0;
73*4882a593Smuzhiyun 	totals.interference  = 0;
74*4882a593Smuzhiyun 	avg->num_secs = 0;
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun 	for (sec = 0; sec < input->num_secs; sec++) {
77*4882a593Smuzhiyun 		if (input->secs[sec].duration) {
78*4882a593Smuzhiyun 			totals.duration += input->secs[sec].duration;
79*4882a593Smuzhiyun 			totals.congest_ibss += input->secs[sec].congest_ibss;
80*4882a593Smuzhiyun 			totals.congest_obss += input->secs[sec].congest_obss;
81*4882a593Smuzhiyun 			totals.interference += input->secs[sec].interference;
82*4882a593Smuzhiyun 			avg->num_secs++;
83*4882a593Smuzhiyun 		}
84*4882a593Smuzhiyun 	}
85*4882a593Smuzhiyun 	avg->chanspec = input->chanspec;
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun 	if (!avg->num_secs || !totals.duration)
88*4882a593Smuzhiyun 		return (avg);
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun 	if (percent) {
91*4882a593Smuzhiyun 		avg->secs[0].duration = totals.duration / avg->num_secs;
92*4882a593Smuzhiyun 		avg->secs[0].congest_ibss = totals.congest_ibss * 100/totals.duration;
93*4882a593Smuzhiyun 		avg->secs[0].congest_obss = totals.congest_obss * 100/totals.duration;
94*4882a593Smuzhiyun 		avg->secs[0].interference = totals.interference * 100/totals.duration;
95*4882a593Smuzhiyun 	} else {
96*4882a593Smuzhiyun 		avg->secs[0].duration = totals.duration / avg->num_secs;
97*4882a593Smuzhiyun 		avg->secs[0].congest_ibss = totals.congest_ibss / avg->num_secs;
98*4882a593Smuzhiyun 		avg->secs[0].congest_obss = totals.congest_obss / avg->num_secs;
99*4882a593Smuzhiyun 		avg->secs[0].interference = totals.interference / avg->num_secs;
100*4882a593Smuzhiyun 	}
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun 	return (avg);
103*4882a593Smuzhiyun }
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun static void
cca_info(uint8 * bitmap,int num_bits,int * left,int * bit_pos)106*4882a593Smuzhiyun cca_info(uint8 *bitmap, int num_bits, int *left, int *bit_pos)
107*4882a593Smuzhiyun {
108*4882a593Smuzhiyun 	int i;
109*4882a593Smuzhiyun 	for (*left = 0, i = 0; i < num_bits; i++) {
110*4882a593Smuzhiyun 		if (isset(bitmap, i)) {
111*4882a593Smuzhiyun 			(*left)++;
112*4882a593Smuzhiyun 			*bit_pos = i;
113*4882a593Smuzhiyun 		}
114*4882a593Smuzhiyun 	}
115*4882a593Smuzhiyun }
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun static uint8
spec_to_chan(chanspec_t chspec)118*4882a593Smuzhiyun spec_to_chan(chanspec_t chspec)
119*4882a593Smuzhiyun {
120*4882a593Smuzhiyun 	uint8 center_ch, edge, primary, sb;
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun 	center_ch = CHSPEC_CHANNEL(chspec);
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun 	if (CHSPEC_BW_LE20(chspec)) {
125*4882a593Smuzhiyun 		return center_ch;
126*4882a593Smuzhiyun 	} else {
127*4882a593Smuzhiyun 		/* the lower edge of the wide channel is half the bw from
128*4882a593Smuzhiyun 		 * the center channel.
129*4882a593Smuzhiyun 		 */
130*4882a593Smuzhiyun 		if (CHSPEC_IS40(chspec)) {
131*4882a593Smuzhiyun 			edge = center_ch - CH_20MHZ_APART;
132*4882a593Smuzhiyun 		} else {
133*4882a593Smuzhiyun 			/* must be 80MHz (until we support more) */
134*4882a593Smuzhiyun 			ASSERT(CHSPEC_IS80(chspec));
135*4882a593Smuzhiyun 			edge = center_ch - CH_40MHZ_APART;
136*4882a593Smuzhiyun 		}
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun 		/* find the channel number of the lowest 20MHz primary channel */
139*4882a593Smuzhiyun 		primary = edge + CH_10MHZ_APART;
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun 		/* select the actual subband */
142*4882a593Smuzhiyun 		sb = (chspec & WL_CHANSPEC_CTL_SB_MASK) >> WL_CHANSPEC_CTL_SB_SHIFT;
143*4882a593Smuzhiyun 		primary = primary + sb * CH_20MHZ_APART;
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun 		return primary;
146*4882a593Smuzhiyun 	}
147*4882a593Smuzhiyun }
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun /*
150*4882a593Smuzhiyun 	Take an array of measumrements representing summaries of different channels.
151*4882a593Smuzhiyun 	Return a recomended channel.
152*4882a593Smuzhiyun 	Interference is evil, get rid of that first.
153*4882a593Smuzhiyun 	Then hunt for lowest Other bss traffic.
154*4882a593Smuzhiyun 	Don't forget that channels with low duration times may not have accurate readings.
155*4882a593Smuzhiyun 	For the moment, do not overwrite input array.
156*4882a593Smuzhiyun */
157*4882a593Smuzhiyun int
cca_analyze(cca_congest_channel_req_t * input[],int num_chans,uint flags,chanspec_t * answer)158*4882a593Smuzhiyun cca_analyze(cca_congest_channel_req_t *input[], int num_chans, uint flags, chanspec_t *answer)
159*4882a593Smuzhiyun {
160*4882a593Smuzhiyun 	uint8 *bitmap = NULL;	/* 38 Max channels needs 5 bytes  = 40 */
161*4882a593Smuzhiyun 	int i, left, winner, ret_val = 0;
162*4882a593Smuzhiyun 	uint32 min_obss = 1 << 30;
163*4882a593Smuzhiyun 	uint bitmap_sz;
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun 	bitmap_sz = CEIL(num_chans, NBBY);
166*4882a593Smuzhiyun 	bitmap = (uint8 *)malloc(bitmap_sz);
167*4882a593Smuzhiyun 	if (bitmap == NULL) {
168*4882a593Smuzhiyun 		printf("unable to allocate memory\n");
169*4882a593Smuzhiyun 		return BCME_NOMEM;
170*4882a593Smuzhiyun 	}
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun 	memset(bitmap, 0, bitmap_sz);
173*4882a593Smuzhiyun 	/* Initially, all channels are up for consideration */
174*4882a593Smuzhiyun 	for (i = 0; i < num_chans; i++) {
175*4882a593Smuzhiyun 		if (input[i]->chanspec)
176*4882a593Smuzhiyun 			setbit(bitmap, i);
177*4882a593Smuzhiyun 	}
178*4882a593Smuzhiyun 	cca_info(bitmap, num_chans, &left, &i);
179*4882a593Smuzhiyun 	if (!left) {
180*4882a593Smuzhiyun 		ret_val = CCA_ERRNO_TOO_FEW;
181*4882a593Smuzhiyun 		goto f_exit;
182*4882a593Smuzhiyun 	}
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun 	/* Filter for 2.4 GHz Band */
185*4882a593Smuzhiyun 	if (flags & CCA_FLAG_2G_ONLY) {
186*4882a593Smuzhiyun 		for (i = 0; i < num_chans; i++) {
187*4882a593Smuzhiyun 			if (!CHSPEC_IS2G(input[i]->chanspec))
188*4882a593Smuzhiyun 				clrbit(bitmap, i);
189*4882a593Smuzhiyun 		}
190*4882a593Smuzhiyun 	}
191*4882a593Smuzhiyun 	cca_info(bitmap, num_chans, &left, &i);
192*4882a593Smuzhiyun 	if (!left) {
193*4882a593Smuzhiyun 		ret_val = CCA_ERRNO_BAND;
194*4882a593Smuzhiyun 		goto f_exit;
195*4882a593Smuzhiyun 	}
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun 	/* Filter for 5 GHz Band */
198*4882a593Smuzhiyun 	if (flags & CCA_FLAG_5G_ONLY) {
199*4882a593Smuzhiyun 		for (i = 0; i < num_chans; i++) {
200*4882a593Smuzhiyun 			if (!CHSPEC_IS5G(input[i]->chanspec))
201*4882a593Smuzhiyun 				clrbit(bitmap, i);
202*4882a593Smuzhiyun 		}
203*4882a593Smuzhiyun 	}
204*4882a593Smuzhiyun 	cca_info(bitmap, num_chans, &left, &i);
205*4882a593Smuzhiyun 	if (!left) {
206*4882a593Smuzhiyun 		ret_val = CCA_ERRNO_BAND;
207*4882a593Smuzhiyun 		goto f_exit;
208*4882a593Smuzhiyun 	}
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun 	/* Filter for Duration */
211*4882a593Smuzhiyun 	if (!(flags & CCA_FLAG_IGNORE_DURATION)) {
212*4882a593Smuzhiyun 		for (i = 0; i < num_chans; i++) {
213*4882a593Smuzhiyun 			if (input[i]->secs[0].duration < CCA_THRESH_MILLI)
214*4882a593Smuzhiyun 				clrbit(bitmap, i);
215*4882a593Smuzhiyun 		}
216*4882a593Smuzhiyun 	}
217*4882a593Smuzhiyun 	cca_info(bitmap, num_chans, &left, &i);
218*4882a593Smuzhiyun 	if (!left) {
219*4882a593Smuzhiyun 		ret_val = CCA_ERRNO_DURATION;
220*4882a593Smuzhiyun 		goto f_exit;
221*4882a593Smuzhiyun 	}
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun 	/* Filter for 1 6 11 on 2.4 Band */
224*4882a593Smuzhiyun 	if (flags &  CCA_FLAGS_PREFER_1_6_11) {
225*4882a593Smuzhiyun 		int tmp_channel = spec_to_chan(input[i]->chanspec);
226*4882a593Smuzhiyun 		int is2g = CHSPEC_IS2G(input[i]->chanspec);
227*4882a593Smuzhiyun 		for (i = 0; i < num_chans; i++) {
228*4882a593Smuzhiyun 			if (is2g && tmp_channel != 1 && tmp_channel != 6 && tmp_channel != 11)
229*4882a593Smuzhiyun 				clrbit(bitmap, i);
230*4882a593Smuzhiyun 		}
231*4882a593Smuzhiyun 	}
232*4882a593Smuzhiyun 	cca_info(bitmap, num_chans, &left, &i);
233*4882a593Smuzhiyun 	if (!left) {
234*4882a593Smuzhiyun 		ret_val = CCA_ERRNO_PREF_CHAN;
235*4882a593Smuzhiyun 		goto f_exit;
236*4882a593Smuzhiyun 	}
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun 	/* Toss high interference interference */
239*4882a593Smuzhiyun 	if (!(flags & CCA_FLAG_IGNORE_INTERFER)) {
240*4882a593Smuzhiyun 		for (i = 0; i < num_chans; i++) {
241*4882a593Smuzhiyun 			if (input[i]->secs[0].interference > CCA_THRESH_INTERFERE)
242*4882a593Smuzhiyun 				clrbit(bitmap, i);
243*4882a593Smuzhiyun 		}
244*4882a593Smuzhiyun 		cca_info(bitmap, num_chans, &left, &i);
245*4882a593Smuzhiyun 		if (!left) {
246*4882a593Smuzhiyun 			ret_val = CCA_ERRNO_INTERFER;
247*4882a593Smuzhiyun 			goto f_exit;
248*4882a593Smuzhiyun 		}
249*4882a593Smuzhiyun 	}
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun 	/* Now find lowest obss */
252*4882a593Smuzhiyun 	winner = 0;
253*4882a593Smuzhiyun 	for (i = 0; i < num_chans; i++) {
254*4882a593Smuzhiyun 		if (isset(bitmap, i) && input[i]->secs[0].congest_obss < min_obss) {
255*4882a593Smuzhiyun 			winner = i;
256*4882a593Smuzhiyun 			min_obss = input[i]->secs[0].congest_obss;
257*4882a593Smuzhiyun 		}
258*4882a593Smuzhiyun 	}
259*4882a593Smuzhiyun 	*answer = input[winner]->chanspec;
260*4882a593Smuzhiyun 	f_exit:
261*4882a593Smuzhiyun 	free(bitmap);	/* free the allocated memory for bitmap */
262*4882a593Smuzhiyun 	return ret_val;
263*4882a593Smuzhiyun }
264*4882a593Smuzhiyun #endif /* !BCMDRIVER */
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun /* offset of cntmember by sizeof(uint32) from the first cnt variable, txframe. */
267*4882a593Smuzhiyun #define IDX_IN_WL_CNT_VER_6_T(cntmember)		\
268*4882a593Smuzhiyun 	((OFFSETOF(wl_cnt_ver_6_t, cntmember) - OFFSETOF(wl_cnt_ver_6_t, txframe)) / sizeof(uint32))
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun #define IDX_IN_WL_CNT_VER_11_T(cntmember)		\
271*4882a593Smuzhiyun 	((OFFSETOF(wl_cnt_ver_11_t, cntmember) - OFFSETOF(wl_cnt_ver_11_t, txframe))	\
272*4882a593Smuzhiyun 	/ sizeof(uint32))
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun /* Exclude version and length fields */
275*4882a593Smuzhiyun #define NUM_OF_CNT_IN_WL_CNT_VER_6_T	\
276*4882a593Smuzhiyun 	((sizeof(wl_cnt_ver_6_t) - 2 * sizeof(uint16)) / sizeof(uint32))
277*4882a593Smuzhiyun /* Exclude macstat cnt variables. wl_cnt_ver_6_t only has 62 macstat cnt variables. */
278*4882a593Smuzhiyun #define NUM_OF_WLCCNT_IN_WL_CNT_VER_6_T			\
279*4882a593Smuzhiyun 	(NUM_OF_CNT_IN_WL_CNT_VER_6_T - (WL_CNT_MCST_VAR_NUM - 2))
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun /* Exclude version and length fields */
282*4882a593Smuzhiyun #define NUM_OF_CNT_IN_WL_CNT_VER_11_T	\
283*4882a593Smuzhiyun 	((sizeof(wl_cnt_ver_11_t) - 2 * sizeof(uint16)) / sizeof(uint32))
284*4882a593Smuzhiyun /* Exclude 64 macstat cnt variables. */
285*4882a593Smuzhiyun #define NUM_OF_WLCCNT_IN_WL_CNT_VER_11_T	\
286*4882a593Smuzhiyun 	((sizeof(wl_cnt_wlc_t)) / sizeof(uint32))
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun /* Index conversion table from wl_cnt_ver_6_t to wl_cnt_wlc_t */
289*4882a593Smuzhiyun static const uint8 wlcntver6t_to_wlcntwlct[NUM_OF_WLCCNT_IN_WL_CNT_VER_6_T] = {
290*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txframe),
291*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txbyte),
292*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txretrans),
293*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txerror),
294*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txctl),
295*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txprshort),
296*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txserr),
297*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txnobuf),
298*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txnoassoc),
299*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txrunt),
300*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txchit),
301*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txcmiss),
302*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txuflo),
303*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txphyerr),
304*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txphycrs),
305*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxframe),
306*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxbyte),
307*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxerror),
308*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxctl),
309*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxnobuf),
310*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxnondata),
311*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxbadds),
312*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxbadcm),
313*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxfragerr),
314*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxrunt),
315*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxgiant),
316*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxnoscb),
317*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxbadproto),
318*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxbadsrcmac),
319*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxbadda),
320*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxfilter),
321*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxoflo),
322*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxuflo),
323*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxuflo) + 1,
324*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxuflo) + 2,
325*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxuflo) + 3,
326*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxuflo) + 4,
327*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxuflo) + 5,
328*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(d11cnt_txrts_off),
329*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(d11cnt_rxcrc_off),
330*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(d11cnt_txnocts_off),
331*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(dmade),
332*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(dmada),
333*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(dmape),
334*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(reset),
335*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(tbtt),
336*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txdmawar),
337*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(pkt_callback_reg_fail),
338*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txfrag),
339*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txmulti),
340*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txfail),
341*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txretry),
342*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txretrie),
343*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxdup),
344*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txrts),
345*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txnocts),
346*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txnoack),
347*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxfrag),
348*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxmulti),
349*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxcrc),
350*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txfrmsnt),
351*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxundec),
352*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(tkipmicfaill),
353*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(tkipcntrmsr),
354*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(tkipreplay),
355*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(ccmpfmterr),
356*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(ccmpreplay),
357*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(ccmpundec),
358*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(fourwayfail),
359*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(wepundec),
360*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(wepicverr),
361*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(decsuccess),
362*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(tkipicverr),
363*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(wepexcluded),
364*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txchanrej),
365*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(psmwds),
366*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(phywatchdog),
367*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(prq_entries_handled),
368*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(prq_undirected_entries),
369*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(prq_bad_entries),
370*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(atim_suppress_count),
371*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(bcn_template_not_ready),
372*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(bcn_template_not_ready_done),
373*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(late_tbtt_dpc),
374*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rx1mbps),
375*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rx2mbps),
376*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rx5mbps5),
377*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rx6mbps),
378*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rx9mbps),
379*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rx11mbps),
380*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rx12mbps),
381*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rx18mbps),
382*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rx24mbps),
383*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rx36mbps),
384*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rx48mbps),
385*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rx54mbps),
386*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rx108mbps),
387*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rx162mbps),
388*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rx216mbps),
389*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rx270mbps),
390*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rx324mbps),
391*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rx378mbps),
392*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rx432mbps),
393*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rx486mbps),
394*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rx540mbps),
395*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rfdisable),
396*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txexptime),
397*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txmpdu_sgi),
398*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxmpdu_sgi),
399*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txmpdu_stbc),
400*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxmpdu_stbc),
401*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxundec_mcst),
402*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(tkipmicfaill_mcst),
403*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(tkipcntrmsr_mcst),
404*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(tkipreplay_mcst),
405*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(ccmpfmterr_mcst),
406*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(ccmpreplay_mcst),
407*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(ccmpundec_mcst),
408*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(fourwayfail_mcst),
409*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(wepundec_mcst),
410*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(wepicverr_mcst),
411*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(decsuccess_mcst),
412*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(tkipicverr_mcst),
413*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(wepexcluded_mcst)
414*4882a593Smuzhiyun };
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun #define INVALID_IDX ((uint8)(-1))
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun /* Index conversion table from wl_cnt_ver_11_t to wl_cnt_wlc_t */
419*4882a593Smuzhiyun static const uint8 wlcntver11t_to_wlcntwlct[NUM_OF_WLCCNT_IN_WL_CNT_VER_11_T] = {
420*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txframe),
421*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txbyte),
422*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txretrans),
423*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txerror),
424*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txctl),
425*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txprshort),
426*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txserr),
427*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txnobuf),
428*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txnoassoc),
429*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txrunt),
430*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txchit),
431*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txcmiss),
432*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txuflo),
433*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txphyerr),
434*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txphycrs),
435*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxframe),
436*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxbyte),
437*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxerror),
438*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxctl),
439*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxnobuf),
440*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxnondata),
441*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxbadds),
442*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxbadcm),
443*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxfragerr),
444*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxrunt),
445*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxgiant),
446*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxnoscb),
447*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxbadproto),
448*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxbadsrcmac),
449*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxbadda),
450*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxfilter),
451*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxoflo),
452*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxuflo),
453*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxuflo) + 1,
454*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxuflo) + 2,
455*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxuflo) + 3,
456*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxuflo) + 4,
457*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxuflo) + 5,
458*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(d11cnt_txrts_off),
459*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(d11cnt_rxcrc_off),
460*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(d11cnt_txnocts_off),
461*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(dmade),
462*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(dmada),
463*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(dmape),
464*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(reset),
465*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(tbtt),
466*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txdmawar),
467*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(pkt_callback_reg_fail),
468*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txfrag),
469*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txmulti),
470*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txfail),
471*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txretry),
472*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txretrie),
473*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxdup),
474*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txrts),
475*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txnocts),
476*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txnoack),
477*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxfrag),
478*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxmulti),
479*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxcrc),
480*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txfrmsnt),
481*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxundec),
482*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(tkipmicfaill),
483*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(tkipcntrmsr),
484*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(tkipreplay),
485*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(ccmpfmterr),
486*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(ccmpreplay),
487*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(ccmpundec),
488*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(fourwayfail),
489*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(wepundec),
490*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(wepicverr),
491*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(decsuccess),
492*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(tkipicverr),
493*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(wepexcluded),
494*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txchanrej),
495*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(psmwds),
496*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(phywatchdog),
497*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(prq_entries_handled),
498*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(prq_undirected_entries),
499*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(prq_bad_entries),
500*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(atim_suppress_count),
501*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(bcn_template_not_ready),
502*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(bcn_template_not_ready_done),
503*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(late_tbtt_dpc),
504*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rx1mbps),
505*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rx2mbps),
506*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rx5mbps5),
507*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rx6mbps),
508*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rx9mbps),
509*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rx11mbps),
510*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rx12mbps),
511*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rx18mbps),
512*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rx24mbps),
513*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rx36mbps),
514*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rx48mbps),
515*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rx54mbps),
516*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rx108mbps),
517*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rx162mbps),
518*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rx216mbps),
519*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rx270mbps),
520*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rx324mbps),
521*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rx378mbps),
522*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rx432mbps),
523*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rx486mbps),
524*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rx540mbps),
525*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rfdisable),
526*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txexptime),
527*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txmpdu_sgi),
528*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxmpdu_sgi),
529*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txmpdu_stbc),
530*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxmpdu_stbc),
531*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxundec_mcst),
532*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(tkipmicfaill_mcst),
533*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(tkipcntrmsr_mcst),
534*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(tkipreplay_mcst),
535*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(ccmpfmterr_mcst),
536*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(ccmpreplay_mcst),
537*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(ccmpundec_mcst),
538*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(fourwayfail_mcst),
539*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(wepundec_mcst),
540*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(wepicverr_mcst),
541*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(decsuccess_mcst),
542*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(tkipicverr_mcst),
543*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(wepexcluded_mcst),
544*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(dma_hang),
545*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(reinit),
546*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(pstatxucast),
547*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(pstatxnoassoc),
548*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(pstarxucast),
549*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(pstarxbcmc),
550*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(pstatxbcmc),
551*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(cso_passthrough),
552*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(cso_normal),
553*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(chained),
554*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(chainedsz1),
555*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(unchained),
556*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(maxchainsz),
557*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(currchainsz),
558*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(pciereset),
559*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(cfgrestore),
560*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(reinitreason),
561*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(reinitreason) + 1,
562*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(reinitreason) + 2,
563*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(reinitreason) + 3,
564*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(reinitreason) + 4,
565*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(reinitreason) + 5,
566*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(reinitreason) + 6,
567*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(reinitreason) + 7,
568*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxrtry),
569*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxmpdu_mu),
570*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txbar),
571*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxbar),
572*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txpspoll),
573*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxpspoll),
574*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txnull),
575*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxnull),
576*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txqosnull),
577*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxqosnull),
578*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txassocreq),
579*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxassocreq),
580*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txreassocreq),
581*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxreassocreq),
582*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txdisassoc),
583*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxdisassoc),
584*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txassocrsp),
585*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxassocrsp),
586*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txreassocrsp),
587*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxreassocrsp),
588*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txauth),
589*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxauth),
590*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txdeauth),
591*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxdeauth),
592*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txprobereq),
593*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxprobereq),
594*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txprobersp),
595*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxprobersp),
596*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txaction),
597*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxaction),
598*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(ampdu_wds),
599*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txlost),
600*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txdatamcast),
601*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txdatabcast),
602*4882a593Smuzhiyun 	INVALID_IDX,
603*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxback),
604*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txback),
605*4882a593Smuzhiyun 	INVALID_IDX,
606*4882a593Smuzhiyun 	INVALID_IDX,
607*4882a593Smuzhiyun 	INVALID_IDX,
608*4882a593Smuzhiyun 	INVALID_IDX,
609*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txbcast),
610*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txdropped),
611*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxbcast),
612*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxdropped)
613*4882a593Smuzhiyun };
614*4882a593Smuzhiyun 
615*4882a593Smuzhiyun /* Index conversion table from wl_cnt_ver_11_t to
616*4882a593Smuzhiyun  * either wl_cnt_ge40mcst_v1_t or wl_cnt_lt40mcst_v1_t
617*4882a593Smuzhiyun  */
618*4882a593Smuzhiyun static const uint8 wlcntver11t_to_wlcntXX40mcstv1t[WL_CNT_MCST_VAR_NUM] = {
619*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txallfrm),
620*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txrtsfrm),
621*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txctsfrm),
622*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txackfrm),
623*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txdnlfrm),
624*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txbcnfrm),
625*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txfunfl),
626*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txfunfl) + 1,
627*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txfunfl) + 2,
628*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txfunfl) + 3,
629*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txfunfl) + 4,
630*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txfunfl) + 5,
631*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txfbw),
632*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txmpdu),
633*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txtplunfl),
634*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txphyerror),
635*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(pktengrxducast),
636*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(pktengrxdmcast),
637*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxfrmtoolong),
638*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxfrmtooshrt),
639*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxinvmachdr),
640*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxbadfcs),
641*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxbadplcp),
642*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxcrsglitch),
643*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxstrt),
644*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxdfrmucastmbss),
645*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxmfrmucastmbss),
646*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxcfrmucast),
647*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxrtsucast),
648*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxctsucast),
649*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxackucast),
650*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxdfrmocast),
651*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxmfrmocast),
652*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxcfrmocast),
653*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxrtsocast),
654*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxctsocast),
655*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxdfrmmcast),
656*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxmfrmmcast),
657*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxcfrmmcast),
658*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxbeaconmbss),
659*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxdfrmucastobss),
660*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxbeaconobss),
661*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxrsptmout),
662*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(bcntxcancl),
663*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxnodelim),
664*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxf0ovfl),
665*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxf1ovfl),
666*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxf2ovfl),
667*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txsfovfl),
668*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(pmqovfl),
669*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxcgprqfrm),
670*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxcgprsqovfl),
671*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txcgprsfail),
672*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txcgprssuc),
673*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(prs_timeout),
674*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxnack),
675*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(frmscons),
676*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txnack),
677*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxback),
678*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txback),
679*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(bphy_rxcrsglitch),
680*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxdrop20s),
681*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxtoolate),
682*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(bphy_badplcp)
683*4882a593Smuzhiyun };
684*4882a593Smuzhiyun 
685*4882a593Smuzhiyun /* For mcst offsets that were not used. (2 Pads) */
686*4882a593Smuzhiyun #define INVALID_MCST_IDX ((uint8)(-1))
687*4882a593Smuzhiyun /* Index conversion table from wl_cnt_ver_11_t to wl_cnt_v_le10_mcst_t */
688*4882a593Smuzhiyun static const uint8 wlcntver11t_to_wlcntvle10mcstt[WL_CNT_MCST_VAR_NUM] = {
689*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txallfrm),
690*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txrtsfrm),
691*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txctsfrm),
692*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txackfrm),
693*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txdnlfrm),
694*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txbcnfrm),
695*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txfunfl),
696*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txfunfl) + 1,
697*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txfunfl) + 2,
698*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txfunfl) + 3,
699*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txfunfl) + 4,
700*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txfunfl) + 5,
701*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txfbw),
702*4882a593Smuzhiyun 	INVALID_MCST_IDX,
703*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txtplunfl),
704*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txphyerror),
705*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(pktengrxducast),
706*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(pktengrxdmcast),
707*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxfrmtoolong),
708*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxfrmtooshrt),
709*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxinvmachdr),
710*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxbadfcs),
711*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxbadplcp),
712*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxcrsglitch),
713*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxstrt),
714*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxdfrmucastmbss),
715*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxmfrmucastmbss),
716*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxcfrmucast),
717*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxrtsucast),
718*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxctsucast),
719*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxackucast),
720*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxdfrmocast),
721*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxmfrmocast),
722*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxcfrmocast),
723*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxrtsocast),
724*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxctsocast),
725*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxdfrmmcast),
726*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxmfrmmcast),
727*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxcfrmmcast),
728*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxbeaconmbss),
729*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxdfrmucastobss),
730*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxbeaconobss),
731*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxrsptmout),
732*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(bcntxcancl),
733*4882a593Smuzhiyun 	INVALID_MCST_IDX,
734*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxf0ovfl),
735*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxf1ovfl),
736*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxf2ovfl),
737*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txsfovfl),
738*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(pmqovfl),
739*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxcgprqfrm),
740*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxcgprsqovfl),
741*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txcgprsfail),
742*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txcgprssuc),
743*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(prs_timeout),
744*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxnack),
745*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(frmscons),
746*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txnack),
747*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxback),
748*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(txback),
749*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(bphy_rxcrsglitch),
750*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxdrop20s),
751*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(rxtoolate),
752*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_11_T(bphy_badplcp)
753*4882a593Smuzhiyun };
754*4882a593Smuzhiyun 
755*4882a593Smuzhiyun /* Index conversion table from wl_cnt_ver_6_t to wl_cnt_v_le10_mcst_t */
756*4882a593Smuzhiyun static const uint8 wlcntver6t_to_wlcntvle10mcstt[WL_CNT_MCST_VAR_NUM] = {
757*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txallfrm),
758*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txrtsfrm),
759*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txctsfrm),
760*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txackfrm),
761*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txdnlfrm),
762*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txbcnfrm),
763*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txfunfl),
764*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txfunfl) + 1,
765*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txfunfl) + 2,
766*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txfunfl) + 3,
767*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txfunfl) + 4,
768*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txfunfl) + 5,
769*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txfbw),
770*4882a593Smuzhiyun 	INVALID_MCST_IDX,
771*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txtplunfl),
772*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txphyerror),
773*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(pktengrxducast),
774*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(pktengrxdmcast),
775*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxfrmtoolong),
776*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxfrmtooshrt),
777*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxinvmachdr),
778*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxbadfcs),
779*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxbadplcp),
780*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxcrsglitch),
781*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxstrt),
782*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxdfrmucastmbss),
783*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxmfrmucastmbss),
784*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxcfrmucast),
785*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxrtsucast),
786*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxctsucast),
787*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxackucast),
788*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxdfrmocast),
789*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxmfrmocast),
790*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxcfrmocast),
791*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxrtsocast),
792*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxctsocast),
793*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxdfrmmcast),
794*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxmfrmmcast),
795*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxcfrmmcast),
796*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxbeaconmbss),
797*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxdfrmucastobss),
798*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxbeaconobss),
799*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxrsptmout),
800*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(bcntxcancl),
801*4882a593Smuzhiyun 	INVALID_MCST_IDX,
802*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxf0ovfl),
803*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxf1ovfl),
804*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxf2ovfl),
805*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txsfovfl),
806*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(pmqovfl),
807*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxcgprqfrm),
808*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxcgprsqovfl),
809*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txcgprsfail),
810*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txcgprssuc),
811*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(prs_timeout),
812*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxnack),
813*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(frmscons),
814*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txnack),
815*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxback),
816*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(txback),
817*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(bphy_rxcrsglitch),
818*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxdrop20s),
819*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(rxtoolate),
820*4882a593Smuzhiyun 	IDX_IN_WL_CNT_VER_6_T(bphy_badplcp)
821*4882a593Smuzhiyun };
822*4882a593Smuzhiyun 
823*4882a593Smuzhiyun /* copy wlc layer counters from old type cntbuf to wl_cnt_wlc_t type. */
824*4882a593Smuzhiyun static int
wl_copy_wlccnt(uint16 cntver,uint32 * dst,uint32 * src,uint8 src_max_idx)825*4882a593Smuzhiyun wl_copy_wlccnt(uint16 cntver, uint32 *dst, uint32 *src, uint8 src_max_idx)
826*4882a593Smuzhiyun {
827*4882a593Smuzhiyun 	uint i;
828*4882a593Smuzhiyun 	if (dst == NULL || src == NULL) {
829*4882a593Smuzhiyun 		return BCME_ERROR;
830*4882a593Smuzhiyun 	}
831*4882a593Smuzhiyun 
832*4882a593Smuzhiyun 	/* Init wlccnt with invalid value. Unchanged value will not be printed out */
833*4882a593Smuzhiyun 	for (i = 0; i < (sizeof(wl_cnt_wlc_t) / sizeof(uint32)); i++) {
834*4882a593Smuzhiyun 		dst[i] = INVALID_CNT_VAL;
835*4882a593Smuzhiyun 	}
836*4882a593Smuzhiyun 
837*4882a593Smuzhiyun 	if (cntver == WL_CNT_VERSION_6) {
838*4882a593Smuzhiyun 		for (i = 0; i < NUM_OF_WLCCNT_IN_WL_CNT_VER_6_T; i++) {
839*4882a593Smuzhiyun 			if (wlcntver6t_to_wlcntwlct[i] >= src_max_idx) {
840*4882a593Smuzhiyun 				/* src buffer does not have counters from here */
841*4882a593Smuzhiyun 				break;
842*4882a593Smuzhiyun 			}
843*4882a593Smuzhiyun 			dst[i] = src[wlcntver6t_to_wlcntwlct[i]];
844*4882a593Smuzhiyun 		}
845*4882a593Smuzhiyun 	} else {
846*4882a593Smuzhiyun 		for (i = 0; i < NUM_OF_WLCCNT_IN_WL_CNT_VER_11_T; i++) {
847*4882a593Smuzhiyun 			if (wlcntver11t_to_wlcntwlct[i] >= src_max_idx) {
848*4882a593Smuzhiyun 				if (wlcntver11t_to_wlcntwlct[i] == INVALID_IDX) {
849*4882a593Smuzhiyun 					continue;
850*4882a593Smuzhiyun 				}
851*4882a593Smuzhiyun 				else {
852*4882a593Smuzhiyun 					/* src buffer does not have counters from here */
853*4882a593Smuzhiyun 					break;
854*4882a593Smuzhiyun 				}
855*4882a593Smuzhiyun 			}
856*4882a593Smuzhiyun 			dst[i] = src[wlcntver11t_to_wlcntwlct[i]];
857*4882a593Smuzhiyun 		}
858*4882a593Smuzhiyun 	}
859*4882a593Smuzhiyun 	return BCME_OK;
860*4882a593Smuzhiyun }
861*4882a593Smuzhiyun 
862*4882a593Smuzhiyun /* copy macstat counters from old type cntbuf to wl_cnt_v_le10_mcst_t type. */
863*4882a593Smuzhiyun static int
wl_copy_macstat_upto_ver10(uint16 cntver,uint32 * dst,uint32 * src)864*4882a593Smuzhiyun wl_copy_macstat_upto_ver10(uint16 cntver, uint32 *dst, uint32 *src)
865*4882a593Smuzhiyun {
866*4882a593Smuzhiyun 	uint i;
867*4882a593Smuzhiyun 
868*4882a593Smuzhiyun 	if (dst == NULL || src == NULL) {
869*4882a593Smuzhiyun 		return BCME_ERROR;
870*4882a593Smuzhiyun 	}
871*4882a593Smuzhiyun 
872*4882a593Smuzhiyun 	if (cntver == WL_CNT_VERSION_6) {
873*4882a593Smuzhiyun 		for (i = 0; i < WL_CNT_MCST_VAR_NUM; i++) {
874*4882a593Smuzhiyun 			if (wlcntver6t_to_wlcntvle10mcstt[i] == INVALID_MCST_IDX) {
875*4882a593Smuzhiyun 				/* This mcst counter does not exist in wl_cnt_ver_6_t */
876*4882a593Smuzhiyun 				dst[i] = INVALID_CNT_VAL;
877*4882a593Smuzhiyun 			} else {
878*4882a593Smuzhiyun 				dst[i] = src[wlcntver6t_to_wlcntvle10mcstt[i]];
879*4882a593Smuzhiyun 			}
880*4882a593Smuzhiyun 		}
881*4882a593Smuzhiyun 	} else {
882*4882a593Smuzhiyun 		for (i = 0; i < WL_CNT_MCST_VAR_NUM; i++) {
883*4882a593Smuzhiyun 			if (wlcntver11t_to_wlcntvle10mcstt[i] == INVALID_MCST_IDX) {
884*4882a593Smuzhiyun 				/* This mcst counter does not exist in wl_cnt_ver_11_t */
885*4882a593Smuzhiyun 				dst[i] = INVALID_CNT_VAL;
886*4882a593Smuzhiyun 			} else {
887*4882a593Smuzhiyun 				dst[i] = src[wlcntver11t_to_wlcntvle10mcstt[i]];
888*4882a593Smuzhiyun 			}
889*4882a593Smuzhiyun 		}
890*4882a593Smuzhiyun 	}
891*4882a593Smuzhiyun 	return BCME_OK;
892*4882a593Smuzhiyun }
893*4882a593Smuzhiyun 
894*4882a593Smuzhiyun static int
wl_copy_macstat_ver11(uint32 * dst,uint32 * src)895*4882a593Smuzhiyun wl_copy_macstat_ver11(uint32 *dst, uint32 *src)
896*4882a593Smuzhiyun {
897*4882a593Smuzhiyun 	uint i;
898*4882a593Smuzhiyun 
899*4882a593Smuzhiyun 	if (dst == NULL || src == NULL) {
900*4882a593Smuzhiyun 		return BCME_ERROR;
901*4882a593Smuzhiyun 	}
902*4882a593Smuzhiyun 
903*4882a593Smuzhiyun 	for (i = 0; i < WL_CNT_MCST_VAR_NUM; i++) {
904*4882a593Smuzhiyun 		dst[i] = src[wlcntver11t_to_wlcntXX40mcstv1t[i]];
905*4882a593Smuzhiyun 	}
906*4882a593Smuzhiyun 	return BCME_OK;
907*4882a593Smuzhiyun }
908*4882a593Smuzhiyun 
909*4882a593Smuzhiyun /**
910*4882a593Smuzhiyun  * Translate non-xtlv 'wl counters' IOVar buffer received by old driver/FW to xtlv format.
911*4882a593Smuzhiyun  * Parameters:
912*4882a593Smuzhiyun  *	cntbuf: pointer to non-xtlv 'wl counters' IOVar buffer received by old driver/FW.
913*4882a593Smuzhiyun  *		Newly translated xtlv format is written to this pointer.
914*4882a593Smuzhiyun  *	buflen: length of the "cntbuf" without any padding.
915*4882a593Smuzhiyun  *	corerev: chip core revision of the driver/FW.
916*4882a593Smuzhiyun  */
917*4882a593Smuzhiyun int
wl_cntbuf_to_xtlv_format(void * ctx,void * cntbuf,int buflen,uint32 corerev)918*4882a593Smuzhiyun wl_cntbuf_to_xtlv_format(void *ctx, void *cntbuf, int buflen, uint32 corerev)
919*4882a593Smuzhiyun {
920*4882a593Smuzhiyun 	wl_cnt_wlc_t *wlccnt = NULL;
921*4882a593Smuzhiyun 	uint32 *macstat = NULL;
922*4882a593Smuzhiyun 	xtlv_desc_t xtlv_desc[3];
923*4882a593Smuzhiyun 	uint16 mcst_xtlv_id;
924*4882a593Smuzhiyun 	int res = BCME_OK;
925*4882a593Smuzhiyun 	wl_cnt_info_t *cntinfo = cntbuf;
926*4882a593Smuzhiyun 	uint8 *xtlvbuf_p = cntinfo->data;
927*4882a593Smuzhiyun 	uint16 ver = cntinfo->version;
928*4882a593Smuzhiyun 	uint16 xtlvbuflen = (uint16)buflen;
929*4882a593Smuzhiyun 	uint16 src_max_idx;
930*4882a593Smuzhiyun #ifdef BCMDRIVER
931*4882a593Smuzhiyun 	osl_t *osh = ctx;
932*4882a593Smuzhiyun #else
933*4882a593Smuzhiyun 	BCM_REFERENCE(ctx);
934*4882a593Smuzhiyun #endif // endif
935*4882a593Smuzhiyun 
936*4882a593Smuzhiyun 	if (ver >= WL_CNT_VERSION_XTLV) {
937*4882a593Smuzhiyun 		/* Already in xtlv format. */
938*4882a593Smuzhiyun 		goto exit;
939*4882a593Smuzhiyun 	}
940*4882a593Smuzhiyun 
941*4882a593Smuzhiyun #ifdef BCMDRIVER
942*4882a593Smuzhiyun 	wlccnt = MALLOC(osh, sizeof(*wlccnt));
943*4882a593Smuzhiyun 	macstat = MALLOC(osh, WL_CNT_MCST_STRUCT_SZ);
944*4882a593Smuzhiyun #else
945*4882a593Smuzhiyun 	wlccnt = (wl_cnt_wlc_t *)malloc(sizeof(*wlccnt));
946*4882a593Smuzhiyun 	macstat = (uint32 *)malloc(WL_CNT_MCST_STRUCT_SZ);
947*4882a593Smuzhiyun #endif // endif
948*4882a593Smuzhiyun 	if (!wlccnt || !macstat) {
949*4882a593Smuzhiyun 		printf("%s: malloc fail!\n", __FUNCTION__);
950*4882a593Smuzhiyun 		res = BCME_NOMEM;
951*4882a593Smuzhiyun 		goto exit;
952*4882a593Smuzhiyun 	}
953*4882a593Smuzhiyun 
954*4882a593Smuzhiyun 	/* Check if the max idx in the struct exceeds the boundary of uint8 */
955*4882a593Smuzhiyun 	if (NUM_OF_CNT_IN_WL_CNT_VER_6_T > ((uint8)(-1) + 1) ||
956*4882a593Smuzhiyun 		NUM_OF_CNT_IN_WL_CNT_VER_11_T > ((uint8)(-1) + 1)) {
957*4882a593Smuzhiyun 		printf("wlcntverXXt_to_wlcntwlct and src_max_idx need"
958*4882a593Smuzhiyun 			" to be of uint16 instead of uint8\n");
959*4882a593Smuzhiyun 		res = BCME_ERROR;
960*4882a593Smuzhiyun 		goto exit;
961*4882a593Smuzhiyun 	}
962*4882a593Smuzhiyun 
963*4882a593Smuzhiyun 	/* Exclude version and length fields in either wlc_cnt_ver_6_t or wlc_cnt_ver_11_t */
964*4882a593Smuzhiyun 	src_max_idx = (cntinfo->datalen - OFFSETOF(wl_cnt_info_t, data)) / sizeof(uint32);
965*4882a593Smuzhiyun 	if (src_max_idx > (uint8)(-1)) {
966*4882a593Smuzhiyun 		printf("wlcntverXXt_to_wlcntwlct and src_max_idx need"
967*4882a593Smuzhiyun 			" to be of uint16 instead of uint8\n"
968*4882a593Smuzhiyun 			"Try updating wl utility to the latest.\n");
969*4882a593Smuzhiyun 		src_max_idx = (uint8)(-1);
970*4882a593Smuzhiyun 	}
971*4882a593Smuzhiyun 
972*4882a593Smuzhiyun 	/* Copy wlc layer counters to wl_cnt_wlc_t */
973*4882a593Smuzhiyun 	res = wl_copy_wlccnt(ver, (uint32 *)wlccnt, (uint32 *)cntinfo->data, (uint8)src_max_idx);
974*4882a593Smuzhiyun 	if (res != BCME_OK) {
975*4882a593Smuzhiyun 		printf("wl_copy_wlccnt fail!\n");
976*4882a593Smuzhiyun 		goto exit;
977*4882a593Smuzhiyun 	}
978*4882a593Smuzhiyun 
979*4882a593Smuzhiyun 	/* Copy macstat counters to wl_cnt_wlc_t */
980*4882a593Smuzhiyun 	if (ver == WL_CNT_VERSION_11) {
981*4882a593Smuzhiyun 		res = wl_copy_macstat_ver11(macstat, (uint32 *)cntinfo->data);
982*4882a593Smuzhiyun 		if (res != BCME_OK) {
983*4882a593Smuzhiyun 			printf("wl_copy_macstat_ver11 fail!\n");
984*4882a593Smuzhiyun 			goto exit;
985*4882a593Smuzhiyun 		}
986*4882a593Smuzhiyun 		if (corerev >= 40) {
987*4882a593Smuzhiyun 			mcst_xtlv_id = WL_CNT_XTLV_GE40_UCODE_V1;
988*4882a593Smuzhiyun 		} else {
989*4882a593Smuzhiyun 			mcst_xtlv_id = WL_CNT_XTLV_LT40_UCODE_V1;
990*4882a593Smuzhiyun 		}
991*4882a593Smuzhiyun 	} else {
992*4882a593Smuzhiyun 		res = wl_copy_macstat_upto_ver10(ver, macstat, (uint32 *)cntinfo->data);
993*4882a593Smuzhiyun 		if (res != BCME_OK) {
994*4882a593Smuzhiyun 			printf("wl_copy_macstat_upto_ver10 fail!\n");
995*4882a593Smuzhiyun 			goto exit;
996*4882a593Smuzhiyun 		}
997*4882a593Smuzhiyun 		mcst_xtlv_id = WL_CNT_XTLV_CNTV_LE10_UCODE;
998*4882a593Smuzhiyun 	}
999*4882a593Smuzhiyun 
1000*4882a593Smuzhiyun 	xtlv_desc[0].type = WL_CNT_XTLV_WLC;
1001*4882a593Smuzhiyun 	xtlv_desc[0].len = sizeof(*wlccnt);
1002*4882a593Smuzhiyun 	xtlv_desc[0].ptr = wlccnt;
1003*4882a593Smuzhiyun 
1004*4882a593Smuzhiyun 	xtlv_desc[1].type = mcst_xtlv_id;
1005*4882a593Smuzhiyun 	xtlv_desc[1].len = WL_CNT_MCST_STRUCT_SZ;
1006*4882a593Smuzhiyun 	xtlv_desc[1].ptr = macstat;
1007*4882a593Smuzhiyun 
1008*4882a593Smuzhiyun 	xtlv_desc[2].type = 0;
1009*4882a593Smuzhiyun 	xtlv_desc[2].len = 0;
1010*4882a593Smuzhiyun 	xtlv_desc[2].ptr = NULL;
1011*4882a593Smuzhiyun 
1012*4882a593Smuzhiyun 	memset(cntbuf, 0, buflen);
1013*4882a593Smuzhiyun 
1014*4882a593Smuzhiyun 	res = bcm_pack_xtlv_buf_from_mem(&xtlvbuf_p, &xtlvbuflen,
1015*4882a593Smuzhiyun 		xtlv_desc, BCM_XTLV_OPTION_ALIGN32);
1016*4882a593Smuzhiyun 	cntinfo->datalen = (buflen - xtlvbuflen);
1017*4882a593Smuzhiyun exit:
1018*4882a593Smuzhiyun #ifdef BCMDRIVER
1019*4882a593Smuzhiyun 	if (wlccnt) {
1020*4882a593Smuzhiyun 		MFREE(osh, wlccnt, sizeof(*wlccnt));
1021*4882a593Smuzhiyun 	}
1022*4882a593Smuzhiyun 	if (macstat) {
1023*4882a593Smuzhiyun 		MFREE(osh, macstat, WL_CNT_MCST_STRUCT_SZ);
1024*4882a593Smuzhiyun 	}
1025*4882a593Smuzhiyun #else
1026*4882a593Smuzhiyun 	if (wlccnt) {
1027*4882a593Smuzhiyun 		free(wlccnt);
1028*4882a593Smuzhiyun 	}
1029*4882a593Smuzhiyun 	if (macstat) {
1030*4882a593Smuzhiyun 		free(macstat);
1031*4882a593Smuzhiyun 	}
1032*4882a593Smuzhiyun #endif // endif
1033*4882a593Smuzhiyun 	return res;
1034*4882a593Smuzhiyun }
1035