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