1 /*
2  * Copyright (c) 2010 Broadcom Corporation
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
11  * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
13  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 #ifndef _wlioctl_h_
18 #define	_wlioctl_h_
19 
20 #include <linux/ieee80211.h>
21 #ifdef BRCM_FULLMAC
22 #include <proto/bcmeth.h>
23 #endif
24 #include <proto/bcmevent.h>
25 #include <proto/802.11.h>
26 #include <bcmwifi.h>
27 
28 #ifndef INTF_NAME_SIZ
29 #define INTF_NAME_SIZ	16
30 #endif
31 
32 #ifdef BRCM_FULLMAC
33 
34 #define	WL_BSS_INFO_VERSION	108	/* current ver of wl_bss_info struct */
35 
36 /* BSS info structure
37  * Applications MUST CHECK ie_offset field and length field to access IEs and
38  * next bss_info structure in a vector (in wl_scan_results_t)
39  */
40 typedef struct wl_bss_info {
41 	u32 version;		/* version field */
42 	u32 length;		/* byte length of data in this record,
43 				 * starting at version and including IEs
44 				 */
45 	u8 BSSID[ETH_ALEN];
46 	u16 beacon_period;	/* units are Kusec */
47 	u16 capability;	/* Capability information */
48 	u8 SSID_len;
49 	u8 SSID[32];
50 	struct {
51 		uint count;	/* # rates in this set */
52 		u8 rates[16];	/* rates in 500kbps units w/hi bit set if basic */
53 	} rateset;		/* supported rates */
54 	chanspec_t chanspec;	/* chanspec for bss */
55 	u16 atim_window;	/* units are Kusec */
56 	u8 dtim_period;	/* DTIM period */
57 	s16 RSSI;		/* receive signal strength (in dBm) */
58 	s8 phy_noise;		/* noise (in dBm) */
59 
60 	u8 n_cap;		/* BSS is 802.11N Capable */
61 	u32 nbss_cap;	/* 802.11N BSS Capabilities (based on HT_CAP_*) */
62 	u8 ctl_ch;		/* 802.11N BSS control channel number */
63 	u32 reserved32[1];	/* Reserved for expansion of BSS properties */
64 	u8 flags;		/* flags */
65 	u8 reserved[3];	/* Reserved for expansion of BSS properties */
66 	u8 basic_mcs[MCSSET_LEN];	/* 802.11N BSS required MCS set */
67 
68 	u16 ie_offset;	/* offset at which IEs start, from beginning */
69 	u32 ie_length;	/* byte length of Information Elements */
70 	s16 SNR;		/* average SNR of during frame reception */
71 	/* Add new fields here */
72 	/* variable length Information Elements */
73 } wl_bss_info_t;
74 #endif /* BRCM_FULLMAC */
75 
76 typedef struct wlc_ssid {
77 	u32 SSID_len;
78 	unsigned char SSID[32];
79 } wlc_ssid_t;
80 
81 #ifdef BRCM_FULLMAC
82 typedef struct chan_scandata {
83 	u8 txpower;
84 	u8 pad;
85 	chanspec_t channel;	/* Channel num, bw, ctrl_sb and band */
86 	u32 channel_mintime;
87 	u32 channel_maxtime;
88 } chan_scandata_t;
89 
90 typedef enum wl_scan_type {
91 	EXTDSCAN_FOREGROUND_SCAN,
92 	EXTDSCAN_BACKGROUND_SCAN,
93 	EXTDSCAN_FORCEDBACKGROUND_SCAN
94 } wl_scan_type_t;
95 
96 #define WLC_EXTDSCAN_MAX_SSID		5
97 
98 #define WL_BSS_FLAGS_FROM_BEACON	0x01	/* bss_info derived from beacon */
99 #define WL_BSS_FLAGS_FROM_CACHE		0x02	/* bss_info collected from cache */
100 #define WL_BSS_FLAGS_RSSI_ONCHANNEL     0x04	/* rssi info was received on channel (vs offchannel) */
101 
102 typedef struct wl_extdscan_params {
103 	s8 nprobes;		/* 0, passive, otherwise active */
104 	s8 split_scan;	/* split scan */
105 	s8 band;		/* band */
106 	s8 pad;
107 	wlc_ssid_t ssid[WLC_EXTDSCAN_MAX_SSID];	/* ssid list */
108 	u32 tx_rate;		/* in 500ksec units */
109 	wl_scan_type_t scan_type;	/* enum */
110 	s32 channel_num;
111 	chan_scandata_t channel_list[1];	/* list of chandata structs */
112 } wl_extdscan_params_t;
113 
114 #define WL_EXTDSCAN_PARAMS_FIXED_SIZE 	(sizeof(wl_extdscan_params_t) - sizeof(chan_scandata_t))
115 
116 #define WL_BSSTYPE_INFRA 1
117 #define WL_BSSTYPE_INDEP 0
118 #define WL_BSSTYPE_ANY   2
119 
120 /* Bitmask for scan_type */
121 #define WL_SCANFLAGS_PASSIVE 0x01	/* force passive scan */
122 #define WL_SCANFLAGS_RESERVED 0x02	/* Reserved */
123 #define WL_SCANFLAGS_PROHIBITED 0x04	/* allow scanning prohibited channels */
124 
125 typedef struct wl_scan_params {
126 	wlc_ssid_t ssid;	/* default: {0, ""} */
127 	u8 bssid[ETH_ALEN];	/* default: bcast */
128 	s8 bss_type;		/* default: any,
129 				 * DOT11_BSSTYPE_ANY/INFRASTRUCTURE/INDEPENDENT
130 				 */
131 	u8 scan_type;	/* flags, 0 use default */
132 	s32 nprobes;		/* -1 use default, number of probes per channel */
133 	s32 active_time;	/* -1 use default, dwell time per channel for
134 				 * active scanning
135 				 */
136 	s32 passive_time;	/* -1 use default, dwell time per channel
137 				 * for passive scanning
138 				 */
139 	s32 home_time;	/* -1 use default, dwell time for the home channel
140 				 * between channel scans
141 				 */
142 	s32 channel_num;	/* count of channels and ssids that follow
143 				 *
144 				 * low half is count of channels in channel_list, 0
145 				 * means default (use all available channels)
146 				 *
147 				 * high half is entries in wlc_ssid_t array that
148 				 * follows channel_list, aligned for s32 (4 bytes)
149 				 * meaning an odd channel count implies a 2-byte pad
150 				 * between end of channel_list and first ssid
151 				 *
152 				 * if ssid count is zero, single ssid in the fixed
153 				 * parameter portion is assumed, otherwise ssid in
154 				 * the fixed portion is ignored
155 				 */
156 	u16 channel_list[1];	/* list of chanspecs */
157 } wl_scan_params_t;
158 
159 /* size of wl_scan_params not including variable length array */
160 #define WL_SCAN_PARAMS_FIXED_SIZE 64
161 
162 /* masks for channel and ssid count */
163 #define WL_SCAN_PARAMS_COUNT_MASK 0x0000ffff
164 #define WL_SCAN_PARAMS_NSSID_SHIFT 16
165 
166 #define WL_SCAN_ACTION_START      1
167 #define WL_SCAN_ACTION_CONTINUE   2
168 #define WL_SCAN_ACTION_ABORT      3
169 
170 #define ISCAN_REQ_VERSION 1
171 
172 /* incremental scan struct */
173 typedef struct wl_iscan_params {
174 	u32 version;
175 	u16 action;
176 	u16 scan_duration;
177 	wl_scan_params_t params;
178 } wl_iscan_params_t;
179 
180 /* 3 fields + size of wl_scan_params, not including variable length array */
181 #define WL_ISCAN_PARAMS_FIXED_SIZE (offsetof(wl_iscan_params_t, params) + sizeof(wlc_ssid_t))
182 
183 typedef struct wl_scan_results {
184 	u32 buflen;
185 	u32 version;
186 	u32 count;
187 	wl_bss_info_t bss_info[1];
188 } wl_scan_results_t;
189 
190 /* size of wl_scan_results not including variable length array */
191 #define WL_SCAN_RESULTS_FIXED_SIZE (sizeof(wl_scan_results_t) - sizeof(wl_bss_info_t))
192 
193 /* wl_iscan_results status values */
194 #define WL_SCAN_RESULTS_SUCCESS	0
195 #define WL_SCAN_RESULTS_PARTIAL	1
196 #define WL_SCAN_RESULTS_PENDING	2
197 #define WL_SCAN_RESULTS_ABORTED	3
198 #define WL_SCAN_RESULTS_NO_MEM	4
199 
200 #define ESCAN_REQ_VERSION 1
201 
202 typedef struct wl_escan_params {
203 	u32 version;
204 	u16 action;
205 	u16 sync_id;
206 	wl_scan_params_t params;
207 } wl_escan_params_t;
208 
209 #define WL_ESCAN_PARAMS_FIXED_SIZE (offsetof(wl_escan_params_t, params) + sizeof(wlc_ssid_t))
210 
211 typedef struct wl_escan_result {
212 	u32 buflen;
213 	u32 version;
214 	u16 sync_id;
215 	u16 bss_count;
216 	wl_bss_info_t bss_info[1];
217 } wl_escan_result_t;
218 
219 #define WL_ESCAN_RESULTS_FIXED_SIZE (sizeof(wl_escan_result_t) - sizeof(wl_bss_info_t))
220 
221 /* incremental scan results struct */
222 typedef struct wl_iscan_results {
223 	u32 status;
224 	wl_scan_results_t results;
225 } wl_iscan_results_t;
226 
227 /* size of wl_iscan_results not including variable length array */
228 #define WL_ISCAN_RESULTS_FIXED_SIZE \
229 	(WL_SCAN_RESULTS_FIXED_SIZE + offsetof(wl_iscan_results_t, results))
230 
231 typedef struct wl_probe_params {
232 	wlc_ssid_t ssid;
233 	u8 bssid[ETH_ALEN];
234 	u8 mac[ETH_ALEN];
235 } wl_probe_params_t;
236 #endif /* BRCM_FULLMAC */
237 
238 #define WL_NUMRATES		16	/* max # of rates in a rateset */
239 typedef struct wl_rateset {
240 	u32 count;		/* # rates in this set */
241 	u8 rates[WL_NUMRATES];	/* rates in 500kbps units w/hi bit set if basic */
242 } wl_rateset_t;
243 
244 #ifdef BRCM_FULLMAC
245 typedef struct wl_rateset_args {
246 	u32 count;		/* # rates in this set */
247 	u8 rates[WL_NUMRATES];	/* rates in 500kbps units w/hi bit set if basic */
248 	u8 mcs[MCSSET_LEN];	/* supported mcs index bit map */
249 } wl_rateset_args_t;
250 
251 /* u32 list */
252 typedef struct wl_u32_list {
253 	/* in - # of elements, out - # of entries */
254 	u32 count;
255 	/* variable length u32 list */
256 	u32 element[1];
257 } wl_u32_list_t;
258 
259 /* used for association with a specific BSSID and chanspec list */
260 typedef struct wl_assoc_params {
261 	u8 bssid[ETH_ALEN];	/* 00:00:00:00:00:00: broadcast scan */
262 	s32 chanspec_num;	/* 0: all available channels,
263 				 * otherwise count of chanspecs in chanspec_list
264 				 */
265 	chanspec_t chanspec_list[1];	/* list of chanspecs */
266 } wl_assoc_params_t;
267 #define WL_ASSOC_PARAMS_FIXED_SIZE 	(sizeof(wl_assoc_params_t) - sizeof(chanspec_t))
268 
269 /* used for reassociation/roam to a specific BSSID and channel */
270 typedef wl_assoc_params_t wl_reassoc_params_t;
271 #define WL_REASSOC_PARAMS_FIXED_SIZE	WL_ASSOC_PARAMS_FIXED_SIZE
272 
273 /* used for join with or without a specific bssid and channel list */
274 typedef struct wl_join_params {
275 	wlc_ssid_t ssid;
276 	wl_assoc_params_t params;	/* optional field, but it must include the fixed portion
277 					 * of the wl_assoc_params_t struct when it does present.
278 					 */
279 } wl_join_params_t;
280 #define WL_JOIN_PARAMS_FIXED_SIZE 	(sizeof(wl_join_params_t) - sizeof(chanspec_t))
281 
282 #endif /* BRCM_FULLMAC */
283 
284 /* defines used by the nrate iovar */
285 #define NRATE_MCS_INUSE	0x00000080	/* MSC in use,indicates b0-6 holds an mcs */
286 #define NRATE_RATE_MASK 0x0000007f	/* rate/mcs value */
287 #define NRATE_STF_MASK	0x0000ff00	/* stf mode mask: siso, cdd, stbc, sdm */
288 #define NRATE_STF_SHIFT	8	/* stf mode shift */
289 #define NRATE_OVERRIDE	0x80000000	/* bit indicates override both rate & mode */
290 #define NRATE_OVERRIDE_MCS_ONLY 0x40000000	/* bit indicate to override mcs only */
291 #define NRATE_SGI_MASK  0x00800000	/* sgi mode */
292 #define NRATE_SGI_SHIFT 23	/* sgi mode */
293 #define NRATE_LDPC_CODING 0x00400000	/* bit indicates adv coding in use */
294 #define NRATE_LDPC_SHIFT 22	/* ldpc shift */
295 
296 #define NRATE_STF_SISO	0	/* stf mode SISO */
297 #define NRATE_STF_CDD	1	/* stf mode CDD */
298 #define NRATE_STF_STBC	2	/* stf mode STBC */
299 #define NRATE_STF_SDM	3	/* stf mode SDM */
300 
301 #define ANTENNA_NUM_1	1	/* total number of antennas to be used */
302 #define ANTENNA_NUM_2	2
303 #define ANTENNA_NUM_3	3
304 #define ANTENNA_NUM_4	4
305 
306 #define ANT_SELCFG_AUTO		0x80	/* bit indicates antenna sel AUTO */
307 #define ANT_SELCFG_MASK		0x33	/* antenna configuration mask */
308 #define ANT_SELCFG_MAX		4	/* max number of antenna configurations */
309 #define ANT_SELCFG_TX_UNICAST	0	/* unicast tx antenna configuration */
310 #define ANT_SELCFG_RX_UNICAST	1	/* unicast rx antenna configuration */
311 #define ANT_SELCFG_TX_DEF	2	/* default tx antenna configuration */
312 #define ANT_SELCFG_RX_DEF	3	/* default rx antenna configuration */
313 
314 #define MAX_STREAMS_SUPPORTED	4	/* max number of streams supported */
315 
316 typedef struct {
317 	u8 ant_config[ANT_SELCFG_MAX];	/* antenna configuration */
318 	u8 num_antcfg;	/* number of available antenna configurations */
319 } wlc_antselcfg_t;
320 
321 #define HIGHEST_SINGLE_STREAM_MCS	7	/* MCS values greater than this enable multiple streams */
322 
323 #ifdef BRCM_FULLMAC
324 #define MAX_CCA_CHANNELS 38	/* Max number of 20 Mhz wide channels */
325 #define MAX_CCA_SECS     60	/* CCA keeps this many seconds history */
326 
327 #define IBSS_MED        15	/* Mediom in-bss congestion percentage */
328 #define IBSS_HI         25	/* Hi in-bss congestion percentage */
329 #define OBSS_MED        12
330 #define OBSS_HI         25
331 #define INTERFER_MED    5
332 #define INTERFER_HI     10
333 
334 #define  CCA_FLAG_2G_ONLY		0x01	/* Return a channel from 2.4 Ghz band */
335 #define  CCA_FLAG_5G_ONLY		0x02	/* Return a channel from 2.4 Ghz band */
336 #define  CCA_FLAG_IGNORE_DURATION	0x04	/* Ignore dwell time for each channel */
337 #define  CCA_FLAGS_PREFER_1_6_11	0x10
338 #define  CCA_FLAG_IGNORE_INTERFER 	0x20	/* do not exlude channel based on interfer level */
339 
340 #define CCA_ERRNO_BAND 		1	/* After filtering for band pref, no choices left */
341 #define CCA_ERRNO_DURATION	2	/* After filtering for duration, no choices left */
342 #define CCA_ERRNO_PREF_CHAN	3	/* After filtering for chan pref, no choices left */
343 #define CCA_ERRNO_INTERFER	4	/* After filtering for interference, no choices left */
344 #define CCA_ERRNO_TOO_FEW	5	/* Only 1 channel was input */
345 
346 typedef struct {
347 	u32 duration;	/* millisecs spent sampling this channel */
348 	u32 congest_ibss;	/* millisecs in our bss (presumably this traffic will */
349 	/*  move if cur bss moves channels) */
350 	u32 congest_obss;	/* traffic not in our bss */
351 	u32 interference;	/* millisecs detecting a non 802.11 interferer. */
352 	u32 timestamp;	/* second timestamp */
353 } cca_congest_t;
354 
355 typedef struct {
356 	chanspec_t chanspec;	/* Which channel? */
357 	u8 num_secs;		/* How many secs worth of data */
358 	cca_congest_t secs[1];	/* Data */
359 } cca_congest_channel_req_t;
360 
361 #endif /* BRCM_FULLMAC */
362 
363 #define WLC_CNTRY_BUF_SZ	4	/* Country string is 3 bytes + NUL */
364 
365 #ifdef BRCM_FULLMAC
366 typedef struct wl_country {
367 	char country_abbrev[WLC_CNTRY_BUF_SZ];	/* nul-terminated country code used in
368 						 * the Country IE
369 						 */
370 	s32 rev;		/* revision specifier for ccode
371 				 * on set, -1 indicates unspecified.
372 				 * on get, rev >= 0
373 				 */
374 	char ccode[WLC_CNTRY_BUF_SZ];	/* nul-terminated built-in country code.
375 					 * variable length, but fixed size in
376 					 * struct allows simple allocation for
377 					 * expected country strings <= 3 chars.
378 					 */
379 } wl_country_t;
380 
381 typedef struct wl_channels_in_country {
382 	u32 buflen;
383 	u32 band;
384 	char country_abbrev[WLC_CNTRY_BUF_SZ];
385 	u32 count;
386 	u32 channel[1];
387 } wl_channels_in_country_t;
388 
389 typedef struct wl_country_list {
390 	u32 buflen;
391 	u32 band_set;
392 	u32 band;
393 	u32 count;
394 	char country_abbrev[1];
395 } wl_country_list_t;
396 
397 #define WL_NUM_RPI_BINS		8
398 #define WL_RM_TYPE_BASIC	1
399 #define WL_RM_TYPE_CCA		2
400 #define WL_RM_TYPE_RPI		3
401 
402 #define WL_RM_FLAG_PARALLEL	(1<<0)
403 
404 #define WL_RM_FLAG_LATE		(1<<1)
405 #define WL_RM_FLAG_INCAPABLE	(1<<2)
406 #define WL_RM_FLAG_REFUSED	(1<<3)
407 
408 typedef struct wl_rm_req_elt {
409 	s8 type;
410 	s8 flags;
411 	chanspec_t chanspec;
412 	u32 token;		/* token for this measurement */
413 	u32 tsf_h;		/* TSF high 32-bits of Measurement start time */
414 	u32 tsf_l;		/* TSF low 32-bits */
415 	u32 dur;		/* TUs */
416 } wl_rm_req_elt_t;
417 
418 typedef struct wl_rm_req {
419 	u32 token;		/* overall measurement set token */
420 	u32 count;		/* number of measurement requests */
421 	void *cb;		/* completion callback function: may be NULL */
422 	void *cb_arg;		/* arg to completion callback function */
423 	wl_rm_req_elt_t req[1];	/* variable length block of requests */
424 } wl_rm_req_t;
425 #define WL_RM_REQ_FIXED_LEN	offsetof(wl_rm_req_t, req)
426 
427 typedef struct wl_rm_rep_elt {
428 	s8 type;
429 	s8 flags;
430 	chanspec_t chanspec;
431 	u32 token;		/* token for this measurement */
432 	u32 tsf_h;		/* TSF high 32-bits of Measurement start time */
433 	u32 tsf_l;		/* TSF low 32-bits */
434 	u32 dur;		/* TUs */
435 	u32 len;		/* byte length of data block */
436 	u8 data[1];		/* variable length data block */
437 } wl_rm_rep_elt_t;
438 #define WL_RM_REP_ELT_FIXED_LEN	24	/* length excluding data block */
439 
440 #define WL_RPI_REP_BIN_NUM 8
441 typedef struct wl_rm_rpi_rep {
442 	u8 rpi[WL_RPI_REP_BIN_NUM];
443 	s8 rpi_max[WL_RPI_REP_BIN_NUM];
444 } wl_rm_rpi_rep_t;
445 
446 typedef struct wl_rm_rep {
447 	u32 token;		/* overall measurement set token */
448 	u32 len;		/* length of measurement report block */
449 	wl_rm_rep_elt_t rep[1];	/* variable length block of reports */
450 } wl_rm_rep_t;
451 #define WL_RM_REP_FIXED_LEN	8
452 #endif /* BRCM_FULLMAC */
453 
454 /* Enumerate crypto algorithms */
455 #define	CRYPTO_ALGO_OFF			0
456 #define	CRYPTO_ALGO_WEP1		1
457 #define	CRYPTO_ALGO_TKIP		2
458 #define	CRYPTO_ALGO_WEP128		3
459 #define CRYPTO_ALGO_AES_CCM		4
460 #define CRYPTO_ALGO_AES_RESERVED1	5
461 #define CRYPTO_ALGO_AES_RESERVED2	6
462 #define CRYPTO_ALGO_NALG		7
463 
464 #define WSEC_GEN_MIC_ERROR	0x0001
465 #define WSEC_GEN_REPLAY		0x0002
466 #define WSEC_GEN_ICV_ERROR	0x0004
467 
468 #define WL_SOFT_KEY	(1 << 0)	/* Indicates this key is using soft encrypt */
469 #define WL_PRIMARY_KEY	(1 << 1)	/* Indicates this key is the primary (ie tx) key */
470 #define WL_KF_RES_4	(1 << 4)	/* Reserved for backward compat */
471 #define WL_KF_RES_5	(1 << 5)	/* Reserved for backward compat */
472 #define WL_IBSS_PEER_GROUP_KEY	(1 << 6)	/* Indicates a group key for a IBSS PEER */
473 
474 typedef struct wl_wsec_key {
475 	u32 index;		/* key index */
476 	u32 len;		/* key length */
477 	u8 data[WLAN_MAX_KEY_LEN];	/* key data */
478 	u32 pad_1[18];
479 	u32 algo;		/* CRYPTO_ALGO_AES_CCM, CRYPTO_ALGO_WEP128, etc */
480 	u32 flags;		/* misc flags */
481 	u32 pad_2[2];
482 	int pad_3;
483 	int iv_initialized;	/* has IV been initialized already? */
484 	int pad_4;
485 	/* Rx IV */
486 	struct {
487 		u32 hi;	/* upper 32 bits of IV */
488 		u16 lo;	/* lower 16 bits of IV */
489 	} rxiv;
490 	u32 pad_5[2];
491 	u8 ea[ETH_ALEN];	/* per station */
492 } wl_wsec_key_t;
493 
494 #define WSEC_MIN_PSK_LEN	8
495 #define WSEC_MAX_PSK_LEN	64
496 
497 /* Flag for key material needing passhash'ing */
498 #define WSEC_PASSPHRASE		(1<<0)
499 
500 /* receptacle for WLC_SET_WSEC_PMK parameter */
501 typedef struct {
502 	unsigned short key_len;		/* octets in key material */
503 	unsigned short flags;		/* key handling qualification */
504 	u8 key[WSEC_MAX_PSK_LEN];	/* PMK material */
505 } wsec_pmk_t;
506 
507 /* wireless security bitvec */
508 #define WEP_ENABLED		0x0001
509 #define TKIP_ENABLED		0x0002
510 #define AES_ENABLED		0x0004
511 #define WSEC_SWFLAG		0x0008
512 #define SES_OW_ENABLED		0x0040	/* to go into transition mode without setting wep */
513 
514 /* WPA authentication mode bitvec */
515 #define WPA_AUTH_DISABLED	0x0000	/* Legacy (i.e., non-WPA) */
516 #define WPA_AUTH_NONE		0x0001	/* none (IBSS) */
517 #define WPA_AUTH_UNSPECIFIED	0x0002	/* over 802.1x */
518 #define WPA_AUTH_PSK		0x0004	/* Pre-shared key */
519 #define WPA_AUTH_RESERVED1	0x0008
520 #define WPA_AUTH_RESERVED2	0x0010
521 					/* #define WPA_AUTH_8021X 0x0020 *//* 802.1x, reserved */
522 #define WPA2_AUTH_RESERVED1	0x0020
523 #define WPA2_AUTH_UNSPECIFIED	0x0040	/* over 802.1x */
524 #define WPA2_AUTH_PSK		0x0080	/* Pre-shared key */
525 #define WPA2_AUTH_RESERVED3	0x0200
526 #define WPA2_AUTH_RESERVED4	0x0400
527 #define WPA2_AUTH_RESERVED5	0x0800
528 
529 /* pmkid */
530 #define	MAXPMKID		16
531 
532 typedef struct _pmkid {
533 	u8 BSSID[ETH_ALEN];
534 	u8 PMKID[WLAN_PMKID_LEN];
535 } pmkid_t;
536 
537 typedef struct _pmkid_list {
538 	u32 npmkid;
539 	pmkid_t pmkid[1];
540 } pmkid_list_t;
541 
542 typedef struct _pmkid_cand {
543 	u8 BSSID[ETH_ALEN];
544 	u8 preauth;
545 } pmkid_cand_t;
546 
547 typedef struct _pmkid_cand_list {
548 	u32 npmkid_cand;
549 	pmkid_cand_t pmkid_cand[1];
550 } pmkid_cand_list_t;
551 
552 typedef struct wl_led_info {
553 	u32 index;		/* led index */
554 	u32 behavior;
555 	u8 activehi;
556 } wl_led_info_t;
557 
558 /* R_REG and W_REG struct passed through ioctl */
559 typedef struct {
560 	u32 byteoff;		/* byte offset of the field in d11regs_t */
561 	u32 val;		/* read/write value of the field */
562 	u32 size;		/* sizeof the field */
563 	uint band;		/* band (optional) */
564 } rw_reg_t;
565 
566 
567 #ifdef BRCM_FULLMAC
568 /* Used to get specific STA parameters */
569 typedef struct {
570 	u32 val;
571 	u8 ea[ETH_ALEN];
572 } scb_val_t;
573 #endif /* BRCM_FULLMAC */
574 
575 /* channel encoding */
576 typedef struct channel_info {
577 	int hw_channel;
578 	int target_channel;
579 	int scan_channel;
580 } channel_info_t;
581 
582 /* For ioctls that take a list of MAC addresses */
583 struct maclist {
584 	uint count;		/* number of MAC addresses */
585 	u8 ea[1][ETH_ALEN];	/* variable length array of MAC addresses */
586 };
587 
588 /* get pkt count struct passed through ioctl */
589 typedef struct get_pktcnt {
590 	uint rx_good_pkt;
591 	uint rx_bad_pkt;
592 	uint tx_good_pkt;
593 	uint tx_bad_pkt;
594 	uint rx_ocast_good_pkt;	/* unicast packets destined for others */
595 } get_pktcnt_t;
596 
597 #ifdef BRCM_FULLMAC
598 /* Linux network driver ioctl encoding */
599 typedef struct wl_ioctl {
600 	uint cmd;		/* common ioctl definition */
601 	void *buf;		/* pointer to user buffer */
602 	uint len;		/* length of user buffer */
603 	u8 set;		/* get or set request (optional) */
604 	uint used;		/* bytes read or written (optional) */
605 	uint needed;		/* bytes needed (optional) */
606 } wl_ioctl_t;
607 #endif /* BRCM_FULLMAC */
608 
609 
610 /*
611  * Structure for passing hardware and software
612  * revision info up from the driver.
613  */
614 typedef struct wlc_rev_info {
615 	uint vendorid;		/* PCI vendor id */
616 	uint deviceid;		/* device id of chip */
617 	uint radiorev;		/* radio revision */
618 	uint chiprev;		/* chip revision */
619 	uint corerev;		/* core revision */
620 	uint boardid;		/* board identifier (usu. PCI sub-device id) */
621 	uint boardvendor;	/* board vendor (usu. PCI sub-vendor id) */
622 	uint boardrev;		/* board revision */
623 	uint driverrev;		/* driver version */
624 	uint ucoderev;		/* microcode version */
625 	uint bus;		/* bus type */
626 	uint chipnum;		/* chip number */
627 	uint phytype;		/* phy type */
628 	uint phyrev;		/* phy revision */
629 	uint anarev;		/* anacore rev */
630 	uint chippkg;		/* chip package info */
631 } wlc_rev_info_t;
632 
633 #define WL_REV_INFO_LEGACY_LENGTH	48
634 
635 #ifdef BRCM_FULLMAC
636 #define	WLC_IOCTL_SMLEN			256	/* "small" length ioctl buffer required */
637 #define WLC_IOCTL_MEDLEN		1536	/* "med" length ioctl buffer required */
638 #define	WLC_IOCTL_MAXLEN	8192
639 #endif
640 
641 /* common ioctl definitions */
642 #define WLC_GET_MAGIC				0
643 #define WLC_GET_VERSION				1
644 #define WLC_UP					2
645 #define WLC_DOWN				3
646 #define WLC_GET_LOOP				4
647 #define WLC_SET_LOOP				5
648 #define WLC_DUMP				6
649 #define WLC_GET_MSGLEVEL			7
650 #define WLC_SET_MSGLEVEL			8
651 #define WLC_GET_PROMISC				9
652 #define WLC_SET_PROMISC				10
653 #define WLC_OVERLAY_IOCTL			11
654 #define WLC_GET_RATE				12
655 						      /* #define WLC_SET_RATE				13 *//* no longer supported */
656 #define WLC_GET_INSTANCE			14
657 						      /* #define WLC_GET_FRAG				15 *//* no longer supported */
658 						      /* #define WLC_SET_FRAG				16 *//* no longer supported */
659 						      /* #define WLC_GET_RTS				17 *//* no longer supported */
660 						      /* #define WLC_SET_RTS				18 *//* no longer supported */
661 #define WLC_GET_INFRA				19
662 #define WLC_SET_INFRA				20
663 #define WLC_GET_AUTH				21
664 #define WLC_SET_AUTH				22
665 #define WLC_GET_BSSID				23
666 #define WLC_SET_BSSID				24
667 #define WLC_GET_SSID				25
668 #define WLC_SET_SSID				26
669 #define WLC_RESTART				27
670 						      /* #define WLC_DUMP_SCB				28 *//* no longer supported */
671 #define WLC_GET_CHANNEL				29
672 #define WLC_SET_CHANNEL				30
673 #define WLC_GET_SRL				31
674 #define WLC_SET_SRL				32
675 #define WLC_GET_LRL				33
676 #define WLC_SET_LRL				34
677 #define WLC_GET_PLCPHDR				35
678 #define WLC_SET_PLCPHDR				36
679 #define WLC_GET_RADIO				37
680 #define WLC_SET_RADIO				38
681 #define WLC_GET_PHYTYPE				39
682 #define WLC_DUMP_RATE				40
683 #define WLC_SET_RATE_PARAMS			41
684 #define WLC_GET_FIXRATE				42
685 #define WLC_SET_FIXRATE				43
686 						      /* #define WLC_GET_WEP				42 *//* no longer supported */
687 						      /* #define WLC_SET_WEP				43 *//* no longer supported */
688 #define WLC_GET_KEY				44
689 #define WLC_SET_KEY				45
690 #define WLC_GET_REGULATORY			46
691 #define WLC_SET_REGULATORY			47
692 #define WLC_GET_PASSIVE_SCAN			48
693 #define WLC_SET_PASSIVE_SCAN			49
694 #define WLC_SCAN				50
695 #define WLC_SCAN_RESULTS			51
696 #define WLC_DISASSOC				52
697 #define WLC_REASSOC				53
698 #define WLC_GET_ROAM_TRIGGER			54
699 #define WLC_SET_ROAM_TRIGGER			55
700 #define WLC_GET_ROAM_DELTA			56
701 #define WLC_SET_ROAM_DELTA			57
702 #define WLC_GET_ROAM_SCAN_PERIOD		58
703 #define WLC_SET_ROAM_SCAN_PERIOD		59
704 #define WLC_EVM					60	/* diag */
705 #define WLC_GET_TXANT				61
706 #define WLC_SET_TXANT				62
707 #define WLC_GET_ANTDIV				63
708 #define WLC_SET_ANTDIV				64
709 						      /* #define WLC_GET_TXPWR			65 *//* no longer supported */
710 						      /* #define WLC_SET_TXPWR			66 *//* no longer supported */
711 #define WLC_GET_CLOSED				67
712 #define WLC_SET_CLOSED				68
713 #define WLC_GET_MACLIST				69
714 #define WLC_SET_MACLIST				70
715 #define WLC_GET_RATESET				71
716 #define WLC_SET_RATESET				72
717 						      /* #define WLC_GET_LOCALE			73 *//* no longer supported */
718 #define WLC_LONGTRAIN				74
719 #define WLC_GET_BCNPRD				75
720 #define WLC_SET_BCNPRD				76
721 #define WLC_GET_DTIMPRD				77
722 #define WLC_SET_DTIMPRD				78
723 #define WLC_GET_SROM				79
724 #define WLC_SET_SROM				80
725 #define WLC_GET_WEP_RESTRICT			81
726 #define WLC_SET_WEP_RESTRICT			82
727 #define WLC_GET_COUNTRY				83
728 #define WLC_SET_COUNTRY				84
729 #define WLC_GET_PM				85
730 #define WLC_SET_PM				86
731 #define WLC_GET_WAKE				87
732 #define WLC_SET_WAKE				88
733 						      /* #define WLC_GET_D11CNTS			89 *//* -> "counters" iovar */
734 #define WLC_GET_FORCELINK			90	/* ndis only */
735 #define WLC_SET_FORCELINK			91	/* ndis only */
736 #define WLC_FREQ_ACCURACY			92	/* diag */
737 #define WLC_CARRIER_SUPPRESS			93	/* diag */
738 #define WLC_GET_PHYREG				94
739 #define WLC_SET_PHYREG				95
740 #define WLC_GET_RADIOREG			96
741 #define WLC_SET_RADIOREG			97
742 #define WLC_GET_REVINFO				98
743 #define WLC_GET_UCANTDIV			99
744 #define WLC_SET_UCANTDIV			100
745 #define WLC_R_REG				101
746 #define WLC_W_REG				102
747 /* #define WLC_DIAG_LOOPBACK			103	old tray diag */
748 						       /* #define WLC_RESET_D11CNTS			104 *//* -> "reset_d11cnts" iovar */
749 #define WLC_GET_MACMODE				105
750 #define WLC_SET_MACMODE				106
751 #define WLC_GET_MONITOR				107
752 #define WLC_SET_MONITOR				108
753 #define WLC_GET_GMODE				109
754 #define WLC_SET_GMODE				110
755 #define WLC_GET_LEGACY_ERP			111
756 #define WLC_SET_LEGACY_ERP			112
757 #define WLC_GET_RX_ANT				113
758 #define WLC_GET_CURR_RATESET			114	/* current rateset */
759 #define WLC_GET_SCANSUPPRESS			115
760 #define WLC_SET_SCANSUPPRESS			116
761 #define WLC_GET_AP				117
762 #define WLC_SET_AP				118
763 #define WLC_GET_EAP_RESTRICT			119
764 #define WLC_SET_EAP_RESTRICT			120
765 #define WLC_SCB_AUTHORIZE			121
766 #define WLC_SCB_DEAUTHORIZE			122
767 #define WLC_GET_WDSLIST				123
768 #define WLC_SET_WDSLIST				124
769 #define WLC_GET_ATIM				125
770 #define WLC_SET_ATIM				126
771 #define WLC_GET_RSSI				127
772 #define WLC_GET_PHYANTDIV			128
773 #define WLC_SET_PHYANTDIV			129
774 #define WLC_AP_RX_ONLY				130
775 #define WLC_GET_TX_PATH_PWR			131
776 #define WLC_SET_TX_PATH_PWR			132
777 #define WLC_GET_WSEC				133
778 #define WLC_SET_WSEC				134
779 #define WLC_GET_PHY_NOISE			135
780 #define WLC_GET_BSS_INFO			136
781 #define WLC_GET_PKTCNTS				137
782 #define WLC_GET_LAZYWDS				138
783 #define WLC_SET_LAZYWDS				139
784 #define WLC_GET_BANDLIST			140
785 #define WLC_GET_BAND				141
786 #define WLC_SET_BAND				142
787 #define WLC_SCB_DEAUTHENTICATE			143
788 #define WLC_GET_SHORTSLOT			144
789 #define WLC_GET_SHORTSLOT_OVERRIDE		145
790 #define WLC_SET_SHORTSLOT_OVERRIDE		146
791 #define WLC_GET_SHORTSLOT_RESTRICT		147
792 #define WLC_SET_SHORTSLOT_RESTRICT		148
793 #define WLC_GET_GMODE_PROTECTION		149
794 #define WLC_GET_GMODE_PROTECTION_OVERRIDE	150
795 #define WLC_SET_GMODE_PROTECTION_OVERRIDE	151
796 #define WLC_UPGRADE				152
797 						       /* #define WLC_GET_MRATE			153 *//* no longer supported */
798 						       /* #define WLC_SET_MRATE			154 *//* no longer supported */
799 #define WLC_GET_IGNORE_BCNS			155
800 #define WLC_SET_IGNORE_BCNS			156
801 #define WLC_GET_SCB_TIMEOUT			157
802 #define WLC_SET_SCB_TIMEOUT			158
803 #define WLC_GET_ASSOCLIST			159
804 #define WLC_GET_CLK				160
805 #define WLC_SET_CLK				161
806 #define WLC_GET_UP				162
807 #define WLC_OUT					163
808 #define WLC_GET_WPA_AUTH			164
809 #define WLC_SET_WPA_AUTH			165
810 #define WLC_GET_UCFLAGS				166
811 #define WLC_SET_UCFLAGS				167
812 #define WLC_GET_PWRIDX				168
813 #define WLC_SET_PWRIDX				169
814 #define WLC_GET_TSSI				170
815 #define WLC_GET_SUP_RATESET_OVERRIDE		171
816 #define WLC_SET_SUP_RATESET_OVERRIDE		172
817 						       /* #define WLC_SET_FAST_TIMER			173 *//* no longer supported */
818 						       /* #define WLC_GET_FAST_TIMER			174 *//* no longer supported */
819 						       /* #define WLC_SET_SLOW_TIMER			175 *//* no longer supported */
820 						       /* #define WLC_GET_SLOW_TIMER			176 *//* no longer supported */
821 						       /* #define WLC_DUMP_PHYREGS			177 *//* no longer supported */
822 #define WLC_GET_PROTECTION_CONTROL		178
823 #define WLC_SET_PROTECTION_CONTROL		179
824 #define WLC_GET_PHYLIST				180
825 #define WLC_ENCRYPT_STRENGTH			181	/* ndis only */
826 #define WLC_DECRYPT_STATUS			182	/* ndis only */
827 #define WLC_GET_KEY_SEQ				183
828 #define WLC_GET_SCAN_CHANNEL_TIME		184
829 #define WLC_SET_SCAN_CHANNEL_TIME		185
830 #define WLC_GET_SCAN_UNASSOC_TIME		186
831 #define WLC_SET_SCAN_UNASSOC_TIME		187
832 #define WLC_GET_SCAN_HOME_TIME			188
833 #define WLC_SET_SCAN_HOME_TIME			189
834 #define WLC_GET_SCAN_NPROBES			190
835 #define WLC_SET_SCAN_NPROBES			191
836 #define WLC_GET_PRB_RESP_TIMEOUT		192
837 #define WLC_SET_PRB_RESP_TIMEOUT		193
838 #define WLC_GET_ATTEN				194
839 #define WLC_SET_ATTEN				195
840 #define WLC_GET_SHMEM				196	/* diag */
841 #define WLC_SET_SHMEM				197	/* diag */
842 						       /* #define WLC_GET_GMODE_PROTECTION_CTS		198 *//* no longer supported */
843 						       /* #define WLC_SET_GMODE_PROTECTION_CTS		199 *//* no longer supported */
844 #define WLC_SET_WSEC_TEST			200
845 #define WLC_SCB_DEAUTHENTICATE_FOR_REASON	201
846 #define WLC_TKIP_COUNTERMEASURES		202
847 #define WLC_GET_PIOMODE				203
848 #define WLC_SET_PIOMODE				204
849 #define WLC_SET_ASSOC_PREFER			205
850 #define WLC_GET_ASSOC_PREFER			206
851 #define WLC_SET_ROAM_PREFER			207
852 #define WLC_GET_ROAM_PREFER			208
853 #define WLC_SET_LED				209
854 #define WLC_GET_LED				210
855 #define WLC_RESERVED6				211
856 #define WLC_RESERVED7				212
857 #define WLC_GET_CHANNEL_QA			213
858 #define WLC_START_CHANNEL_QA			214
859 #define WLC_GET_CHANNEL_SEL			215
860 #define WLC_START_CHANNEL_SEL			216
861 #define WLC_GET_VALID_CHANNELS			217
862 #define WLC_GET_FAKEFRAG			218
863 #define WLC_SET_FAKEFRAG			219
864 #define WLC_GET_PWROUT_PERCENTAGE		220
865 #define WLC_SET_PWROUT_PERCENTAGE		221
866 #define WLC_SET_BAD_FRAME_PREEMPT		222
867 #define WLC_GET_BAD_FRAME_PREEMPT		223
868 #define WLC_SET_LEAP_LIST			224
869 #define WLC_GET_LEAP_LIST			225
870 #define WLC_GET_CWMIN				226
871 #define WLC_SET_CWMIN				227
872 #define WLC_GET_CWMAX				228
873 #define WLC_SET_CWMAX				229
874 #define WLC_GET_WET				230
875 #define WLC_SET_WET				231
876 #define WLC_GET_PUB				232
877 						       /* #define WLC_SET_GLACIAL_TIMER		233 *//* no longer supported */
878 						       /* #define WLC_GET_GLACIAL_TIMER		234 *//* no longer supported */
879 #define WLC_GET_KEY_PRIMARY			235
880 #define WLC_SET_KEY_PRIMARY			236
881 						       /* #define WLC_DUMP_RADIOREGS			237 *//* no longer supported */
882 #define WLC_RESERVED4				238
883 #define WLC_RESERVED5				239
884 #define WLC_UNSET_CALLBACK			240
885 #define WLC_SET_CALLBACK			241
886 #define WLC_GET_RADAR				242
887 #define WLC_SET_RADAR				243
888 #define WLC_SET_SPECT_MANAGMENT			244
889 #define WLC_GET_SPECT_MANAGMENT			245
890 #define WLC_WDS_GET_REMOTE_HWADDR		246	/* handled in wl_linux.c/wl_vx.c */
891 #define WLC_WDS_GET_WPA_SUP			247
892 #define WLC_SET_CS_SCAN_TIMER			248
893 #define WLC_GET_CS_SCAN_TIMER			249
894 #define WLC_MEASURE_REQUEST			250
895 #define WLC_INIT				251
896 #define WLC_SEND_QUIET				252
897 #define WLC_KEEPALIVE			253
898 #define WLC_SEND_PWR_CONSTRAINT			254
899 #define WLC_UPGRADE_STATUS			255
900 #define WLC_CURRENT_PWR				256
901 #define WLC_GET_SCAN_PASSIVE_TIME		257
902 #define WLC_SET_SCAN_PASSIVE_TIME		258
903 #define WLC_LEGACY_LINK_BEHAVIOR		259
904 #define WLC_GET_CHANNELS_IN_COUNTRY		260
905 #define WLC_GET_COUNTRY_LIST			261
906 #define WLC_GET_VAR				262	/* get value of named variable */
907 #define WLC_SET_VAR				263	/* set named variable to value */
908 #define WLC_NVRAM_GET				264	/* deprecated */
909 #define WLC_NVRAM_SET				265
910 #define WLC_NVRAM_DUMP				266
911 #define WLC_REBOOT				267
912 #define WLC_SET_WSEC_PMK			268
913 #define WLC_GET_AUTH_MODE			269
914 #define WLC_SET_AUTH_MODE			270
915 #define WLC_GET_WAKEENTRY			271
916 #define WLC_SET_WAKEENTRY			272
917 #define WLC_NDCONFIG_ITEM			273	/* currently handled in wl_oid.c */
918 #define WLC_NVOTPW				274
919 #define WLC_OTPW				275
920 #define WLC_IOV_BLOCK_GET			276
921 #define WLC_IOV_MODULES_GET			277
922 #define WLC_SOFT_RESET				278
923 #define WLC_GET_ALLOW_MODE			279
924 #define WLC_SET_ALLOW_MODE			280
925 #define WLC_GET_DESIRED_BSSID			281
926 #define WLC_SET_DESIRED_BSSID			282
927 #define	WLC_DISASSOC_MYAP			283
928 #define WLC_GET_RESERVED10			284
929 #define WLC_GET_RESERVED11			285
930 #define WLC_GET_RESERVED12			286
931 #define WLC_GET_RESERVED13			287
932 #define WLC_GET_RESERVED14			288
933 #define WLC_SET_RESERVED15			289
934 #define WLC_SET_RESERVED16			290
935 #define WLC_GET_RESERVED17			291
936 #define WLC_GET_RESERVED18			292
937 #define WLC_GET_RESERVED19			293
938 #define WLC_SET_RESERVED1A			294
939 #define WLC_GET_RESERVED1B			295
940 #define WLC_GET_RESERVED1C			296
941 #define WLC_GET_RESERVED1D			297
942 #define WLC_SET_RESERVED1E			298
943 #define WLC_GET_RESERVED1F			299
944 #define WLC_GET_RESERVED20			300
945 #define WLC_GET_RESERVED21			301
946 #define WLC_GET_RESERVED22			302
947 #define WLC_GET_RESERVED23			303
948 #define WLC_GET_RESERVED24			304
949 #define WLC_SET_RESERVED25			305
950 #define WLC_GET_RESERVED26			306
951 #define WLC_NPHY_SAMPLE_COLLECT			307	/* Nphy sample collect mode */
952 #define WLC_UM_PRIV				308	/* for usermode driver private ioctl */
953 #define WLC_GET_CMD				309
954 							/* #define WLC_LAST				310 *//* Never used - can be reused */
955 #define WLC_RESERVED8				311
956 #define WLC_RESERVED9				312
957 #define WLC_RESERVED1				313
958 #define WLC_RESERVED2				314
959 #define WLC_RESERVED3				315
960 #define WLC_LAST				316
961 
962 #ifndef EPICTRL_COOKIE
963 #define EPICTRL_COOKIE		0xABADCEDE
964 #endif
965 
966 #define WL_DECRYPT_STATUS_SUCCESS	1
967 #define WL_DECRYPT_STATUS_FAILURE	2
968 #define WL_DECRYPT_STATUS_UNKNOWN	3
969 
970 /* allows user-mode app to poll the status of USB image upgrade */
971 #define WLC_UPGRADE_SUCCESS			0
972 #define WLC_UPGRADE_PENDING			1
973 
974 /* WLC_GET_AUTH, WLC_SET_AUTH values */
975 #define WL_AUTH_OPEN_SYSTEM		0	/* d11 open authentication */
976 #define WL_AUTH_SHARED_KEY		1	/* d11 shared authentication */
977 #define WL_AUTH_OPEN_SHARED		2	/* try open, then shared if open failed w/rc 13 */
978 
979 /* Bit masks for radio disabled status - returned by WL_GET_RADIO */
980 #define WL_RADIO_SW_DISABLE		(1<<0)
981 #define WL_RADIO_HW_DISABLE		(1<<1)
982 #define WL_RADIO_MPC_DISABLE		(1<<2)
983 #define WL_RADIO_COUNTRY_DISABLE	(1<<3)	/* some countries don't support any channel */
984 
985 #define	WL_SPURAVOID_OFF	0
986 #define	WL_SPURAVOID_ON1	1
987 #define	WL_SPURAVOID_ON2	2
988 
989 /* Override bit for WLC_SET_TXPWR.  if set, ignore other level limits */
990 #define WL_TXPWR_OVERRIDE	(1U<<31)
991 
992 #define WL_PHY_PAVARS_LEN	6	/* Phy type, Band range, chain, a1, b0, b1 */
993 
994 typedef struct wl_po {
995 	u16 phy_type;	/* Phy type */
996 	u16 band;
997 	u16 cckpo;
998 	u32 ofdmpo;
999 	u16 mcspo[8];
1000 } wl_po_t;
1001 
1002 /* a large TX Power as an init value to factor out of min() calculations,
1003  * keep low enough to fit in an s8, units are .25 dBm
1004  */
1005 #define WLC_TXPWR_MAX		(127)	/* ~32 dBm = 1,500 mW */
1006 
1007 /* "diag" iovar argument and error code */
1008 #define WL_DIAG_INTERRUPT			1	/* d11 loopback interrupt test */
1009 #define WL_DIAG_LOOPBACK			2	/* d11 loopback data test */
1010 #define WL_DIAG_MEMORY				3	/* d11 memory test */
1011 #define WL_DIAG_LED				4	/* LED test */
1012 #define WL_DIAG_REG				5	/* d11/phy register test */
1013 #define WL_DIAG_SROM				6	/* srom read/crc test */
1014 #define WL_DIAG_DMA				7	/* DMA test */
1015 
1016 #define WL_DIAGERR_SUCCESS			0
1017 #define WL_DIAGERR_FAIL_TO_RUN			1	/* unable to run requested diag */
1018 #define WL_DIAGERR_NOT_SUPPORTED		2	/* diag requested is not supported */
1019 #define WL_DIAGERR_INTERRUPT_FAIL		3	/* loopback interrupt test failed */
1020 #define WL_DIAGERR_LOOPBACK_FAIL		4	/* loopback data test failed */
1021 #define WL_DIAGERR_SROM_FAIL			5	/* srom read failed */
1022 #define WL_DIAGERR_SROM_BADCRC			6	/* srom crc failed */
1023 #define WL_DIAGERR_REG_FAIL			7	/* d11/phy register test failed */
1024 #define WL_DIAGERR_MEMORY_FAIL			8	/* d11 memory test failed */
1025 #define WL_DIAGERR_NOMEM			9	/* diag test failed due to no memory */
1026 #define WL_DIAGERR_DMA_FAIL			10	/* DMA test failed */
1027 
1028 #define WL_DIAGERR_MEMORY_TIMEOUT		11	/* d11 memory test didn't finish in time */
1029 #define WL_DIAGERR_MEMORY_BADPATTERN		12	/* d11 memory test result in bad pattern */
1030 
1031 /* band types */
1032 #define	WLC_BAND_AUTO		0	/* auto-select */
1033 #define	WLC_BAND_5G		1	/* 5 Ghz */
1034 #define	WLC_BAND_2G		2	/* 2.4 Ghz */
1035 #define	WLC_BAND_ALL		3	/* all bands */
1036 
1037 /* band range returned by band_range iovar */
1038 #define WL_CHAN_FREQ_RANGE_2G      0
1039 #define WL_CHAN_FREQ_RANGE_5GL     1
1040 #define WL_CHAN_FREQ_RANGE_5GM     2
1041 #define WL_CHAN_FREQ_RANGE_5GH     3
1042 
1043 /* phy types (returned by WLC_GET_PHYTPE) */
1044 #define	WLC_PHY_TYPE_A		0
1045 #define	WLC_PHY_TYPE_B		1
1046 #define	WLC_PHY_TYPE_G		2
1047 #define	WLC_PHY_TYPE_N		4
1048 #define	WLC_PHY_TYPE_LP		5
1049 #define	WLC_PHY_TYPE_SSN	6
1050 #define	WLC_PHY_TYPE_HT		7
1051 #define	WLC_PHY_TYPE_LCN	8
1052 #define	WLC_PHY_TYPE_NULL	0xf
1053 
1054 /* MAC list modes */
1055 #define WLC_MACMODE_DISABLED	0	/* MAC list disabled */
1056 #define WLC_MACMODE_DENY	1	/* Deny specified (i.e. allow unspecified) */
1057 #define WLC_MACMODE_ALLOW	2	/* Allow specified (i.e. deny unspecified) */
1058 
1059 /*
1060  * 54g modes (basic bits may still be overridden)
1061  *
1062  * GMODE_LEGACY_B			Rateset: 1b, 2b, 5.5, 11
1063  *					Preamble: Long
1064  *					Shortslot: Off
1065  * GMODE_AUTO				Rateset: 1b, 2b, 5.5b, 11b, 18, 24, 36, 54
1066  *					Extended Rateset: 6, 9, 12, 48
1067  *					Preamble: Long
1068  *					Shortslot: Auto
1069  * GMODE_ONLY				Rateset: 1b, 2b, 5.5b, 11b, 18, 24b, 36, 54
1070  *					Extended Rateset: 6b, 9, 12b, 48
1071  *					Preamble: Short required
1072  *					Shortslot: Auto
1073  * GMODE_B_DEFERRED			Rateset: 1b, 2b, 5.5b, 11b, 18, 24, 36, 54
1074  *					Extended Rateset: 6, 9, 12, 48
1075  *					Preamble: Long
1076  *					Shortslot: On
1077  * GMODE_PERFORMANCE			Rateset: 1b, 2b, 5.5b, 6b, 9, 11b, 12b, 18, 24b, 36, 48, 54
1078  *					Preamble: Short required
1079  *					Shortslot: On and required
1080  * GMODE_LRS				Rateset: 1b, 2b, 5.5b, 11b
1081  *					Extended Rateset: 6, 9, 12, 18, 24, 36, 48, 54
1082  *					Preamble: Long
1083  *					Shortslot: Auto
1084  */
1085 #define GMODE_LEGACY_B		0
1086 #define GMODE_AUTO		1
1087 #define GMODE_ONLY		2
1088 #define GMODE_B_DEFERRED	3
1089 #define GMODE_PERFORMANCE	4
1090 #define GMODE_LRS		5
1091 #define GMODE_MAX		6
1092 
1093 /* values for PLCPHdr_override */
1094 #define WLC_PLCP_AUTO	-1
1095 #define WLC_PLCP_SHORT	0
1096 #define WLC_PLCP_LONG	1
1097 
1098 /* values for g_protection_override and n_protection_override */
1099 #define WLC_PROTECTION_AUTO		-1
1100 #define WLC_PROTECTION_OFF		0
1101 #define WLC_PROTECTION_ON		1
1102 #define WLC_PROTECTION_MMHDR_ONLY	2
1103 #define WLC_PROTECTION_CTS_ONLY		3
1104 
1105 /* values for g_protection_control and n_protection_control */
1106 #define WLC_PROTECTION_CTL_OFF		0
1107 #define WLC_PROTECTION_CTL_LOCAL	1
1108 #define WLC_PROTECTION_CTL_OVERLAP	2
1109 
1110 /* values for n_protection */
1111 #define WLC_N_PROTECTION_OFF		0
1112 #define WLC_N_PROTECTION_OPTIONAL	1
1113 #define WLC_N_PROTECTION_20IN40		2
1114 #define WLC_N_PROTECTION_MIXEDMODE	3
1115 
1116 /* values for n_preamble_type */
1117 #define WLC_N_PREAMBLE_MIXEDMODE	0
1118 #define WLC_N_PREAMBLE_GF		1
1119 #define WLC_N_PREAMBLE_GF_BRCM          2
1120 
1121 /* values for band specific 40MHz capabilities */
1122 #define WLC_N_BW_20ALL			0
1123 #define WLC_N_BW_40ALL			1
1124 #define WLC_N_BW_20IN2G_40IN5G		2
1125 
1126 /* values to force tx/rx chain */
1127 #define WLC_N_TXRX_CHAIN0		0
1128 #define WLC_N_TXRX_CHAIN1		1
1129 
1130 /* bitflags for SGI support (sgi_rx iovar) */
1131 #define WLC_N_SGI_20			0x01
1132 #define WLC_N_SGI_40			0x02
1133 
1134 /* Values for PM */
1135 #define PM_OFF	0
1136 #define PM_MAX	1
1137 
1138 /* interference mitigation options */
1139 #define	INTERFERE_OVRRIDE_OFF	-1	/* interference override off */
1140 #define	INTERFERE_NONE	0	/* off */
1141 #define	NON_WLAN	1	/* foreign/non 802.11 interference, no auto detect */
1142 #define	WLAN_MANUAL	2	/* ACI: no auto detection */
1143 #define	WLAN_AUTO	3	/* ACI: auto detect */
1144 #define	WLAN_AUTO_W_NOISE	4	/* ACI: auto - detect and non 802.11 interference */
1145 #define	AUTO_ACTIVE	(1 << 7)	/* Auto is currently active */
1146 
1147 #define WL_RSSI_ANT_VERSION	1	/* current version of wl_rssi_ant_t */
1148 #define WL_ANT_RX_MAX		2	/* max 2 receive antennas */
1149 #define WL_ANT_HT_RX_MAX	3	/* max 3 receive antennas/cores */
1150 #define WL_ANT_IDX_1		0	/* antenna index 1 */
1151 #define WL_ANT_IDX_2		1	/* antenna index 2 */
1152 
1153 #ifndef WL_RSSI_ANT_MAX
1154 #define WL_RSSI_ANT_MAX		4	/* max possible rx antennas */
1155 #elif WL_RSSI_ANT_MAX != 4
1156 #error "WL_RSSI_ANT_MAX does not match"
1157 #endif
1158 
1159 /* RSSI per antenna */
1160 typedef struct {
1161 	u32 version;		/* version field */
1162 	u32 count;		/* number of valid antenna rssi */
1163 	s8 rssi_ant[WL_RSSI_ANT_MAX];	/* rssi per antenna */
1164 } wl_rssi_ant_t;
1165 
1166 #define NUM_PWRCTRL_RATES 12
1167 
1168 typedef struct {
1169 	u8 txpwr_band_max[NUM_PWRCTRL_RATES];	/* User set target */
1170 	u8 txpwr_limit[NUM_PWRCTRL_RATES];	/* reg and local power limit */
1171 	u8 txpwr_local_max;	/* local max according to the AP */
1172 	u8 txpwr_local_constraint;	/* local constraint according to the AP */
1173 	u8 txpwr_chan_reg_max;	/* Regulatory max for this channel */
1174 	u8 txpwr_target[2][NUM_PWRCTRL_RATES];	/* Latest target for 2.4 and 5 Ghz */
1175 	u8 txpwr_est_Pout[2];	/* Latest estimate for 2.4 and 5 Ghz */
1176 	u8 txpwr_opo[NUM_PWRCTRL_RATES];	/* On G phy, OFDM power offset */
1177 	u8 txpwr_bphy_cck_max[NUM_PWRCTRL_RATES];	/* Max CCK power for this band (SROM) */
1178 	u8 txpwr_bphy_ofdm_max;	/* Max OFDM power for this band (SROM) */
1179 	u8 txpwr_aphy_max[NUM_PWRCTRL_RATES];	/* Max power for A band (SROM) */
1180 	s8 txpwr_antgain[2];	/* Ant gain for each band - from SROM */
1181 	u8 txpwr_est_Pout_gofdm;	/* Pwr estimate for 2.4 OFDM */
1182 } tx_power_legacy_t;
1183 
1184 #define WL_TX_POWER_RATES_LEGACY	45
1185 #define WL_TX_POWER_MCS20_FIRST	        12
1186 #define WL_TX_POWER_MCS20_NUM	        16
1187 #define WL_TX_POWER_MCS40_FIRST	        28
1188 #define WL_TX_POWER_MCS40_NUM	        17
1189 
1190 
1191 #define WL_TX_POWER_RATES	       101
1192 #define WL_TX_POWER_CCK_FIRST	       0
1193 #define WL_TX_POWER_CCK_NUM	       4
1194 #define WL_TX_POWER_OFDM_FIRST	       4	/* Index for first 20MHz OFDM SISO rate */
1195 #define WL_TX_POWER_OFDM20_CDD_FIRST   12	/* Index for first 20MHz OFDM CDD rate */
1196 #define WL_TX_POWER_OFDM40_SISO_FIRST  52	/* Index for first 40MHz OFDM SISO rate */
1197 #define WL_TX_POWER_OFDM40_CDD_FIRST   60	/* Index for first 40MHz OFDM CDD rate */
1198 #define WL_TX_POWER_OFDM_NUM	       8
1199 #define WL_TX_POWER_MCS20_SISO_FIRST   20	/* Index for first 20MHz MCS SISO rate */
1200 #define WL_TX_POWER_MCS20_CDD_FIRST    28	/* Index for first 20MHz MCS CDD rate */
1201 #define WL_TX_POWER_MCS20_STBC_FIRST   36	/* Index for first 20MHz MCS STBC rate */
1202 #define WL_TX_POWER_MCS20_SDM_FIRST    44	/* Index for first 20MHz MCS SDM rate */
1203 #define WL_TX_POWER_MCS40_SISO_FIRST   68	/* Index for first 40MHz MCS SISO rate */
1204 #define WL_TX_POWER_MCS40_CDD_FIRST    76	/* Index for first 40MHz MCS CDD rate */
1205 #define WL_TX_POWER_MCS40_STBC_FIRST   84	/* Index for first 40MHz MCS STBC rate */
1206 #define WL_TX_POWER_MCS40_SDM_FIRST    92	/* Index for first 40MHz MCS SDM rate */
1207 #define WL_TX_POWER_MCS_1_STREAM_NUM   8
1208 #define WL_TX_POWER_MCS_2_STREAM_NUM   8
1209 #define WL_TX_POWER_MCS_32	       100	/* Index for 40MHz rate MCS 32 */
1210 #define WL_TX_POWER_MCS_32_NUM	       1
1211 
1212 /* sslpnphy specifics */
1213 #define WL_TX_POWER_MCS20_SISO_FIRST_SSN   12	/* Index for first 20MHz MCS SISO rate */
1214 
1215 /* tx_power_t.flags bits */
1216 #define WL_TX_POWER_F_ENABLED	1
1217 #define WL_TX_POWER_F_HW	2
1218 #define WL_TX_POWER_F_MIMO	4
1219 #define WL_TX_POWER_F_SISO	8
1220 
1221 typedef struct {
1222 	u32 flags;
1223 	chanspec_t chanspec;	/* txpwr report for this channel */
1224 	chanspec_t local_chanspec;	/* channel on which we are associated */
1225 	u8 local_max;	/* local max according to the AP */
1226 	u8 local_constraint;	/* local constraint according to the AP */
1227 	s8 antgain[2];	/* Ant gain for each band - from SROM */
1228 	u8 rf_cores;		/* count of RF Cores being reported */
1229 	u8 est_Pout[4];	/* Latest tx power out estimate per RF chain */
1230 	u8 est_Pout_act[4];	/* Latest tx power out estimate per RF chain
1231 				 * without adjustment
1232 				 */
1233 	u8 est_Pout_cck;	/* Latest CCK tx power out estimate */
1234 	u8 tx_power_max[4];	/* Maximum target power among all rates */
1235 	u8 tx_power_max_rate_ind[4];	/* Index of the rate with the max target power */
1236 	u8 user_limit[WL_TX_POWER_RATES];	/* User limit */
1237 	u8 reg_limit[WL_TX_POWER_RATES];	/* Regulatory power limit */
1238 	u8 board_limit[WL_TX_POWER_RATES];	/* Max power board can support (SROM) */
1239 	u8 target[WL_TX_POWER_RATES];	/* Latest target power */
1240 } tx_power_t;
1241 
1242 typedef struct tx_inst_power {
1243 	u8 txpwr_est_Pout[2];	/* Latest estimate for 2.4 and 5 Ghz */
1244 	u8 txpwr_est_Pout_gofdm;	/* Pwr estimate for 2.4 OFDM */
1245 } tx_inst_power_t;
1246 
1247 /* Message levels */
1248 #define WL_ERROR_VAL		0x00000001
1249 #define WL_TRACE_VAL		0x00000002
1250 #define WL_AMPDU_VAL		0x20000000
1251 #define WL_FFPLD_VAL		0x40000000
1252 
1253 /* maximum channels returned by the get valid channels iovar */
1254 #define WL_NUMCHANNELS		64
1255 #define WL_NUMCHANSPECS		100
1256 
1257 struct tsinfo_arg {
1258 	u8 octets[3];
1259 };
1260 
1261 #define	NFIFO			6	/* # tx/rx fifopairs */
1262 
1263 #define	WL_CNT_T_VERSION	7	/* current version of wl_cnt_t struct */
1264 
1265 struct wl_cnt {
1266 	u16 version;		/* see definition of WL_CNT_T_VERSION */
1267 	u16 length;		/* length of entire structure */
1268 
1269 	/* transmit stat counters */
1270 	u32 txframe;		/* tx data frames */
1271 	u32 txbyte;		/* tx data bytes */
1272 	u32 txretrans;	/* tx mac retransmits */
1273 	u32 txerror;		/* tx data errors (derived: sum of others) */
1274 	u32 txctl;		/* tx management frames */
1275 	u32 txprshort;	/* tx short preamble frames */
1276 	u32 txserr;		/* tx status errors */
1277 	u32 txnobuf;		/* tx out of buffers errors */
1278 	u32 txnoassoc;	/* tx discard because we're not associated */
1279 	u32 txrunt;		/* tx runt frames */
1280 	u32 txchit;		/* tx header cache hit (fastpath) */
1281 	u32 txcmiss;		/* tx header cache miss (slowpath) */
1282 	u32 ieee_tx_status;	/* calls to ieee80211_tx_status */
1283 	u32 ieee_tx;		/* tx calls frm mac0211 */
1284 	u32 ieee_rx;		/* calls to ieee_rx */
1285 
1286 	/* transmit chip error counters */
1287 	u32 txuflo;		/* tx fifo underflows */
1288 	u32 txphyerr;	/* tx phy errors (indicated in tx status) */
1289 	u32 txphycrs;
1290 
1291 	/* receive stat counters */
1292 	u32 rxframe;		/* rx data frames */
1293 	u32 rxbyte;		/* rx data bytes */
1294 	u32 rxerror;		/* rx data errors (derived: sum of others) */
1295 	u32 rxctl;		/* rx management frames */
1296 	u32 rxnobuf;		/* rx out of buffers errors */
1297 	u32 rxnondata;	/* rx non data frames in the data channel errors */
1298 	u32 rxbadds;		/* rx bad DS errors */
1299 	u32 rxbadcm;		/* rx bad control or management frames */
1300 	u32 rxfragerr;	/* rx fragmentation errors */
1301 	u32 rxrunt;		/* rx runt frames */
1302 	u32 rxgiant;		/* rx giant frames */
1303 	u32 rxnoscb;		/* rx no scb error */
1304 	u32 rxbadproto;	/* rx invalid frames */
1305 	u32 rxbadsrcmac;	/* rx frames with Invalid Src Mac */
1306 	u32 rxbadda;		/* rx frames tossed for invalid da */
1307 	u32 rxfilter;	/* rx frames filtered out */
1308 
1309 	/* receive chip error counters */
1310 	u32 rxoflo;		/* rx fifo overflow errors */
1311 	u32 rxuflo[NFIFO];	/* rx dma descriptor underflow errors */
1312 
1313 	u32 d11cnt_txrts_off;	/* d11cnt txrts value when reset d11cnt */
1314 	u32 d11cnt_rxcrc_off;	/* d11cnt rxcrc value when reset d11cnt */
1315 	u32 d11cnt_txnocts_off;	/* d11cnt txnocts value when reset d11cnt */
1316 
1317 	/* misc counters */
1318 	u32 dmade;		/* tx/rx dma descriptor errors */
1319 	u32 dmada;		/* tx/rx dma data errors */
1320 	u32 dmape;		/* tx/rx dma descriptor protocol errors */
1321 	u32 reset;		/* reset count */
1322 	u32 tbtt;		/* cnts the TBTT int's */
1323 	u32 txdmawar;
1324 	u32 pkt_callback_reg_fail;	/* callbacks register failure */
1325 
1326 	/* MAC counters: 32-bit version of d11.h's macstat_t */
1327 	u32 txallfrm;	/* total number of frames sent, incl. Data, ACK, RTS, CTS,
1328 				 * Control Management (includes retransmissions)
1329 				 */
1330 	u32 txrtsfrm;	/* number of RTS sent out by the MAC */
1331 	u32 txctsfrm;	/* number of CTS sent out by the MAC */
1332 	u32 txackfrm;	/* number of ACK frames sent out */
1333 	u32 txdnlfrm;	/* Not used */
1334 	u32 txbcnfrm;	/* beacons transmitted */
1335 	u32 txfunfl[8];	/* per-fifo tx underflows */
1336 	u32 txtplunfl;	/* Template underflows (mac was too slow to transmit ACK/CTS
1337 				 * or BCN)
1338 				 */
1339 	u32 txphyerror;	/* Transmit phy error, type of error is reported in tx-status for
1340 				 * driver enqueued frames
1341 				 */
1342 	u32 rxfrmtoolong;	/* Received frame longer than legal limit (2346 bytes) */
1343 	u32 rxfrmtooshrt;	/* Received frame did not contain enough bytes for its frame type */
1344 	u32 rxinvmachdr;	/* Either the protocol version != 0 or frame type not
1345 				 * data/control/management
1346 				 */
1347 	u32 rxbadfcs;	/* number of frames for which the CRC check failed in the MAC */
1348 	u32 rxbadplcp;	/* parity check of the PLCP header failed */
1349 	u32 rxcrsglitch;	/* PHY was able to correlate the preamble but not the header */
1350 	u32 rxstrt;		/* Number of received frames with a good PLCP
1351 				 * (i.e. passing parity check)
1352 				 */
1353 	u32 rxdfrmucastmbss;	/* Number of received DATA frames with good FCS and matching RA */
1354 	u32 rxmfrmucastmbss;	/* number of received mgmt frames with good FCS and matching RA */
1355 	u32 rxcfrmucast;	/* number of received CNTRL frames with good FCS and matching RA */
1356 	u32 rxrtsucast;	/* number of unicast RTS addressed to the MAC (good FCS) */
1357 	u32 rxctsucast;	/* number of unicast CTS addressed to the MAC (good FCS) */
1358 	u32 rxackucast;	/* number of ucast ACKS received (good FCS) */
1359 	u32 rxdfrmocast;	/* number of received DATA frames (good FCS and not matching RA) */
1360 	u32 rxmfrmocast;	/* number of received MGMT frames (good FCS and not matching RA) */
1361 	u32 rxcfrmocast;	/* number of received CNTRL frame (good FCS and not matching RA) */
1362 	u32 rxrtsocast;	/* number of received RTS not addressed to the MAC */
1363 	u32 rxctsocast;	/* number of received CTS not addressed to the MAC */
1364 	u32 rxdfrmmcast;	/* number of RX Data multicast frames received by the MAC */
1365 	u32 rxmfrmmcast;	/* number of RX Management multicast frames received by the MAC */
1366 	u32 rxcfrmmcast;	/* number of RX Control multicast frames received by the MAC
1367 				 * (unlikely to see these)
1368 				 */
1369 	u32 rxbeaconmbss;	/* beacons received from member of BSS */
1370 	u32 rxdfrmucastobss;	/* number of unicast frames addressed to the MAC from
1371 				 * other BSS (WDS FRAME)
1372 				 */
1373 	u32 rxbeaconobss;	/* beacons received from other BSS */
1374 	u32 rxrsptmout;	/* Number of response timeouts for transmitted frames
1375 				 * expecting a response
1376 				 */
1377 	u32 bcntxcancl;	/* transmit beacons canceled due to receipt of beacon (IBSS) */
1378 	u32 rxf0ovfl;	/* Number of receive fifo 0 overflows */
1379 	u32 rxf1ovfl;	/* Number of receive fifo 1 overflows (obsolete) */
1380 	u32 rxf2ovfl;	/* Number of receive fifo 2 overflows (obsolete) */
1381 	u32 txsfovfl;	/* Number of transmit status fifo overflows (obsolete) */
1382 	u32 pmqovfl;		/* Number of PMQ overflows */
1383 	u32 rxcgprqfrm;	/* Number of received Probe requests that made it into
1384 				 * the PRQ fifo
1385 				 */
1386 	u32 rxcgprsqovfl;	/* Rx Probe Request Que overflow in the AP */
1387 	u32 txcgprsfail;	/* Tx Probe Response Fail. AP sent probe response but did
1388 				 * not get ACK
1389 				 */
1390 	u32 txcgprssuc;	/* Tx Probe Response Success (ACK was received) */
1391 	u32 prs_timeout;	/* Number of probe requests that were dropped from the PRQ
1392 				 * fifo because a probe response could not be sent out within
1393 				 * the time limit defined in M_PRS_MAXTIME
1394 				 */
1395 	u32 rxnack;
1396 	u32 frmscons;
1397 	u32 txnack;
1398 	u32 txglitch_nack;	/* obsolete */
1399 	u32 txburst;		/* obsolete */
1400 
1401 	/* 802.11 MIB counters, pp. 614 of 802.11 reaff doc. */
1402 	u32 txfrag;		/* dot11TransmittedFragmentCount */
1403 	u32 txmulti;		/* dot11MulticastTransmittedFrameCount */
1404 	u32 txfail;		/* dot11FailedCount */
1405 	u32 txretry;		/* dot11RetryCount */
1406 	u32 txretrie;	/* dot11MultipleRetryCount */
1407 	u32 rxdup;		/* dot11FrameduplicateCount */
1408 	u32 txrts;		/* dot11RTSSuccessCount */
1409 	u32 txnocts;		/* dot11RTSFailureCount */
1410 	u32 txnoack;		/* dot11ACKFailureCount */
1411 	u32 rxfrag;		/* dot11ReceivedFragmentCount */
1412 	u32 rxmulti;		/* dot11MulticastReceivedFrameCount */
1413 	u32 rxcrc;		/* dot11FCSErrorCount */
1414 	u32 txfrmsnt;	/* dot11TransmittedFrameCount (bogus MIB?) */
1415 	u32 rxundec;		/* dot11WEPUndecryptableCount */
1416 
1417 	/* WPA2 counters (see rxundec for DecryptFailureCount) */
1418 	u32 tkipmicfaill;	/* TKIPLocalMICFailures */
1419 	u32 tkipcntrmsr;	/* TKIPCounterMeasuresInvoked */
1420 	u32 tkipreplay;	/* TKIPReplays */
1421 	u32 ccmpfmterr;	/* CCMPFormatErrors */
1422 	u32 ccmpreplay;	/* CCMPReplays */
1423 	u32 ccmpundec;	/* CCMPDecryptErrors */
1424 	u32 fourwayfail;	/* FourWayHandshakeFailures */
1425 	u32 wepundec;	/* dot11WEPUndecryptableCount */
1426 	u32 wepicverr;	/* dot11WEPICVErrorCount */
1427 	u32 decsuccess;	/* DecryptSuccessCount */
1428 	u32 tkipicverr;	/* TKIPICVErrorCount */
1429 	u32 wepexcluded;	/* dot11WEPExcludedCount */
1430 
1431 	u32 rxundec_mcst;	/* dot11WEPUndecryptableCount */
1432 
1433 	/* WPA2 counters (see rxundec for DecryptFailureCount) */
1434 	u32 tkipmicfaill_mcst;	/* TKIPLocalMICFailures */
1435 	u32 tkipcntrmsr_mcst;	/* TKIPCounterMeasuresInvoked */
1436 	u32 tkipreplay_mcst;	/* TKIPReplays */
1437 	u32 ccmpfmterr_mcst;	/* CCMPFormatErrors */
1438 	u32 ccmpreplay_mcst;	/* CCMPReplays */
1439 	u32 ccmpundec_mcst;	/* CCMPDecryptErrors */
1440 	u32 fourwayfail_mcst;	/* FourWayHandshakeFailures */
1441 	u32 wepundec_mcst;	/* dot11WEPUndecryptableCount */
1442 	u32 wepicverr_mcst;	/* dot11WEPICVErrorCount */
1443 	u32 decsuccess_mcst;	/* DecryptSuccessCount */
1444 	u32 tkipicverr_mcst;	/* TKIPICVErrorCount */
1445 	u32 wepexcluded_mcst;	/* dot11WEPExcludedCount */
1446 
1447 	u32 txchanrej;	/* Tx frames suppressed due to channel rejection */
1448 	u32 txexptime;	/* Tx frames suppressed due to timer expiration */
1449 	u32 psmwds;		/* Count PSM watchdogs */
1450 	u32 phywatchdog;	/* Count Phy watchdogs (triggered by ucode) */
1451 
1452 	/* MBSS counters, AP only */
1453 	u32 prq_entries_handled;	/* PRQ entries read in */
1454 	u32 prq_undirected_entries;	/*    which were bcast bss & ssid */
1455 	u32 prq_bad_entries;	/*    which could not be translated to info */
1456 	u32 atim_suppress_count;	/* TX suppressions on ATIM fifo */
1457 	u32 bcn_template_not_ready;	/* Template marked in use on send bcn ... */
1458 	u32 bcn_template_not_ready_done;	/* ...but "DMA done" interrupt rcvd */
1459 	u32 late_tbtt_dpc;	/* TBTT DPC did not happen in time */
1460 
1461 	/* per-rate receive stat counters */
1462 	u32 rx1mbps;		/* packets rx at 1Mbps */
1463 	u32 rx2mbps;		/* packets rx at 2Mbps */
1464 	u32 rx5mbps5;	/* packets rx at 5.5Mbps */
1465 	u32 rx6mbps;		/* packets rx at 6Mbps */
1466 	u32 rx9mbps;		/* packets rx at 9Mbps */
1467 	u32 rx11mbps;	/* packets rx at 11Mbps */
1468 	u32 rx12mbps;	/* packets rx at 12Mbps */
1469 	u32 rx18mbps;	/* packets rx at 18Mbps */
1470 	u32 rx24mbps;	/* packets rx at 24Mbps */
1471 	u32 rx36mbps;	/* packets rx at 36Mbps */
1472 	u32 rx48mbps;	/* packets rx at 48Mbps */
1473 	u32 rx54mbps;	/* packets rx at 54Mbps */
1474 	u32 rx108mbps;	/* packets rx at 108mbps */
1475 	u32 rx162mbps;	/* packets rx at 162mbps */
1476 	u32 rx216mbps;	/* packets rx at 216 mbps */
1477 	u32 rx270mbps;	/* packets rx at 270 mbps */
1478 	u32 rx324mbps;	/* packets rx at 324 mbps */
1479 	u32 rx378mbps;	/* packets rx at 378 mbps */
1480 	u32 rx432mbps;	/* packets rx at 432 mbps */
1481 	u32 rx486mbps;	/* packets rx at 486 mbps */
1482 	u32 rx540mbps;	/* packets rx at 540 mbps */
1483 
1484 	/* pkteng rx frame stats */
1485 	u32 pktengrxducast;	/* unicast frames rxed by the pkteng code */
1486 	u32 pktengrxdmcast;	/* multicast frames rxed by the pkteng code */
1487 
1488 	u32 rfdisable;	/* count of radio disables */
1489 	u32 bphy_rxcrsglitch;	/* PHY count of bphy glitches */
1490 
1491 	u32 txmpdu_sgi;	/* count for sgi transmit */
1492 	u32 rxmpdu_sgi;	/* count for sgi received */
1493 	u32 txmpdu_stbc;	/* count for stbc transmit */
1494 	u32 rxmpdu_stbc;	/* count for stbc received */
1495 };
1496 
1497 #define	WL_DELTA_STATS_T_VERSION	1	/* current version of wl_delta_stats_t struct */
1498 
1499 typedef struct {
1500 	u16 version;		/* see definition of WL_DELTA_STATS_T_VERSION */
1501 	u16 length;		/* length of entire structure */
1502 
1503 	/* transmit stat counters */
1504 	u32 txframe;		/* tx data frames */
1505 	u32 txbyte;		/* tx data bytes */
1506 	u32 txretrans;	/* tx mac retransmits */
1507 	u32 txfail;		/* tx failures */
1508 
1509 	/* receive stat counters */
1510 	u32 rxframe;		/* rx data frames */
1511 	u32 rxbyte;		/* rx data bytes */
1512 
1513 	/* per-rate receive stat counters */
1514 	u32 rx1mbps;		/* packets rx at 1Mbps */
1515 	u32 rx2mbps;		/* packets rx at 2Mbps */
1516 	u32 rx5mbps5;	/* packets rx at 5.5Mbps */
1517 	u32 rx6mbps;		/* packets rx at 6Mbps */
1518 	u32 rx9mbps;		/* packets rx at 9Mbps */
1519 	u32 rx11mbps;	/* packets rx at 11Mbps */
1520 	u32 rx12mbps;	/* packets rx at 12Mbps */
1521 	u32 rx18mbps;	/* packets rx at 18Mbps */
1522 	u32 rx24mbps;	/* packets rx at 24Mbps */
1523 	u32 rx36mbps;	/* packets rx at 36Mbps */
1524 	u32 rx48mbps;	/* packets rx at 48Mbps */
1525 	u32 rx54mbps;	/* packets rx at 54Mbps */
1526 	u32 rx108mbps;	/* packets rx at 108mbps */
1527 	u32 rx162mbps;	/* packets rx at 162mbps */
1528 	u32 rx216mbps;	/* packets rx at 216 mbps */
1529 	u32 rx270mbps;	/* packets rx at 270 mbps */
1530 	u32 rx324mbps;	/* packets rx at 324 mbps */
1531 	u32 rx378mbps;	/* packets rx at 378 mbps */
1532 	u32 rx432mbps;	/* packets rx at 432 mbps */
1533 	u32 rx486mbps;	/* packets rx at 486 mbps */
1534 	u32 rx540mbps;	/* packets rx at 540 mbps */
1535 } wl_delta_stats_t;
1536 
1537 #define WL_WME_CNT_VERSION	1	/* current version of wl_wme_cnt_t */
1538 
1539 typedef struct {
1540 	u32 packets;
1541 	u32 bytes;
1542 } wl_traffic_stats_t;
1543 
1544 typedef struct {
1545 	u16 version;		/* see definition of WL_WME_CNT_VERSION */
1546 	u16 length;		/* length of entire structure */
1547 
1548 	wl_traffic_stats_t tx[AC_COUNT];	/* Packets transmitted */
1549 	wl_traffic_stats_t tx_failed[AC_COUNT];	/* Packets dropped or failed to transmit */
1550 	wl_traffic_stats_t rx[AC_COUNT];	/* Packets received */
1551 	wl_traffic_stats_t rx_failed[AC_COUNT];	/* Packets failed to receive */
1552 
1553 	wl_traffic_stats_t forward[AC_COUNT];	/* Packets forwarded by AP */
1554 
1555 	wl_traffic_stats_t tx_expired[AC_COUNT];	/* packets dropped due to lifetime expiry */
1556 
1557 } wl_wme_cnt_t;
1558 
1559 struct wl_msglevel2 {
1560 	u32 low;
1561 	u32 high;
1562 };
1563 
1564 #ifdef WLBA
1565 
1566 #define	WLC_BA_CNT_VERSION	1	/* current version of wlc_ba_cnt_t */
1567 
1568 /* block ack related stats */
1569 typedef struct wlc_ba_cnt {
1570 	u16 version;		/* WLC_BA_CNT_VERSION */
1571 	u16 length;		/* length of entire structure */
1572 
1573 	/* transmit stat counters */
1574 	u32 txpdu;		/* pdus sent */
1575 	u32 txsdu;		/* sdus sent */
1576 	u32 txfc;		/* tx side flow controlled packets */
1577 	u32 txfci;		/* tx side flow control initiated */
1578 	u32 txretrans;	/* retransmitted pdus */
1579 	u32 txbatimer;	/* ba resend due to timer */
1580 	u32 txdrop;		/* dropped packets */
1581 	u32 txaddbareq;	/* addba req sent */
1582 	u32 txaddbaresp;	/* addba resp sent */
1583 	u32 txdelba;		/* delba sent */
1584 	u32 txba;		/* ba sent */
1585 	u32 txbar;		/* bar sent */
1586 	u32 txpad[4];	/* future */
1587 
1588 	/* receive side counters */
1589 	u32 rxpdu;		/* pdus recd */
1590 	u32 rxqed;		/* pdus buffered before sending up */
1591 	u32 rxdup;		/* duplicate pdus */
1592 	u32 rxnobuf;		/* pdus discarded due to no buf */
1593 	u32 rxaddbareq;	/* addba req recd */
1594 	u32 rxaddbaresp;	/* addba resp recd */
1595 	u32 rxdelba;		/* delba recd */
1596 	u32 rxba;		/* ba recd */
1597 	u32 rxbar;		/* bar recd */
1598 	u32 rxinvba;		/* invalid ba recd */
1599 	u32 rxbaholes;	/* ba recd with holes */
1600 	u32 rxunexp;		/* unexpected packets */
1601 	u32 rxpad[4];	/* future */
1602 } wlc_ba_cnt_t;
1603 #endif				/* WLBA */
1604 
1605 /* structure for per-tid ampdu control */
1606 struct ampdu_tid_control {
1607 	u8 tid;		/* tid */
1608 	u8 enable;		/* enable/disable */
1609 };
1610 
1611 /* structure for identifying ea/tid for sending addba/delba */
1612 struct ampdu_ea_tid {
1613 	u8 ea[ETH_ALEN];	/* Station address */
1614 	u8 tid;		/* tid */
1615 };
1616 /* structure for identifying retry/tid for retry_limit_tid/rr_retry_limit_tid */
1617 struct ampdu_retry_tid {
1618 	u8 tid;		/* tid */
1619 	u8 retry;		/* retry value */
1620 };
1621 
1622 
1623 /* Software feature flag defines used by wlfeatureflag */
1624 #define WL_SWFL_NOHWRADIO	0x0004
1625 #define WL_SWFL_FLOWCONTROL     0x0008	/* Enable backpressure to OS stack */
1626 #define WL_SWFL_WLBSSSORT	0x0010	/* Per-port supports sorting of BSS */
1627 
1628 #define WL_LIFETIME_MAX 0xFFFF	/* Max value in ms */
1629 
1630 
1631 /* Pattern matching filter. Specifies an offset within received packets to
1632  * start matching, the pattern to match, the size of the pattern, and a bitmask
1633  * that indicates which bits within the pattern should be matched.
1634  */
1635 typedef struct wl_pkt_filter_pattern {
1636 	u32 offset;		/* Offset within received packet to start pattern matching.
1637 				 * Offset '0' is the first byte of the ethernet header.
1638 				 */
1639 	u32 size_bytes;	/* Size of the pattern.  Bitmask must be the same size. */
1640 	u8 mask_and_pattern[1];	/* Variable length mask and pattern data.  mask starts
1641 					 * at offset 0.  Pattern immediately follows mask.
1642 					 */
1643 } wl_pkt_filter_pattern_t;
1644 
1645 /* IOVAR "pkt_filter_add" parameter. Used to install packet filters. */
1646 typedef struct wl_pkt_filter {
1647 	u32 id;		/* Unique filter id, specified by app. */
1648 	u32 type;		/* Filter type (WL_PKT_FILTER_TYPE_xxx). */
1649 	u32 negate_match;	/* Negate the result of filter matches */
1650 	union {			/* Filter definitions */
1651 		wl_pkt_filter_pattern_t pattern;	/* Pattern matching filter */
1652 	} u;
1653 } wl_pkt_filter_t;
1654 
1655 #define WL_PKT_FILTER_FIXED_LEN		  offsetof(wl_pkt_filter_t, u)
1656 #define WL_PKT_FILTER_PATTERN_FIXED_LEN	  offsetof(wl_pkt_filter_pattern_t, mask_and_pattern)
1657 
1658 /* IOVAR "pkt_filter_enable" parameter. */
1659 typedef struct wl_pkt_filter_enable {
1660 	u32 id;		/* Unique filter id */
1661 	u32 enable;		/* Enable/disable bool */
1662 } wl_pkt_filter_enable_t;
1663 
1664 
1665 #define	WLC_RSSI_INVALID	 0	/* invalid RSSI value */
1666 
1667 /* n-mode support capability */
1668 /* 2x2 includes both 1x1 & 2x2 devices
1669  * reserved #define 2 for future when we want to separate 1x1 & 2x2 and
1670  * control it independently
1671  */
1672 #define WL_11N_2x2			1
1673 #define WL_11N_3x3			3
1674 #define WL_11N_4x4			4
1675 
1676 /* define 11n feature disable flags */
1677 #define WLFEATURE_DISABLE_11N		0x00000001
1678 #define WLFEATURE_DISABLE_11N_STBC_TX	0x00000002
1679 #define WLFEATURE_DISABLE_11N_STBC_RX	0x00000004
1680 #define WLFEATURE_DISABLE_11N_SGI_TX	0x00000008
1681 #define WLFEATURE_DISABLE_11N_SGI_RX	0x00000010
1682 #define WLFEATURE_DISABLE_11N_AMPDU_TX	0x00000020
1683 #define WLFEATURE_DISABLE_11N_AMPDU_RX	0x00000040
1684 #define WLFEATURE_DISABLE_11N_GF	0x00000080
1685 
1686 #define WL_EVENTING_MASK_LEN	16
1687 
1688 #define TOE_TX_CSUM_OL		0x00000001
1689 #define TOE_RX_CSUM_OL		0x00000002
1690 
1691 #define PM_OFF	0
1692 #define PM_MAX	1
1693 #define PM_FAST 2
1694 
1695 typedef enum sup_auth_status {
1696 	WLC_SUP_DISCONNECTED = 0,
1697 	WLC_SUP_CONNECTING,
1698 	WLC_SUP_IDREQUIRED,
1699 	WLC_SUP_AUTHENTICATING,
1700 	WLC_SUP_AUTHENTICATED,
1701 	WLC_SUP_KEYXCHANGE,
1702 	WLC_SUP_KEYED,
1703 	WLC_SUP_TIMEOUT,
1704 	WLC_SUP_LAST_BASIC_STATE,
1705 	WLC_SUP_KEYXCHANGE_WAIT_M1 = WLC_SUP_AUTHENTICATED,
1706 	WLC_SUP_KEYXCHANGE_PREP_M2 = WLC_SUP_KEYXCHANGE,
1707 	WLC_SUP_KEYXCHANGE_WAIT_M3 = WLC_SUP_LAST_BASIC_STATE,
1708 	WLC_SUP_KEYXCHANGE_PREP_M4,
1709 	WLC_SUP_KEYXCHANGE_WAIT_G1,
1710 	WLC_SUP_KEYXCHANGE_PREP_G2
1711 } sup_auth_status_t;
1712 #endif				/* _wlioctl_h_ */
1713