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