aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Jones <davej@redhat.com>2010-07-02 23:04:44 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2010-07-08 16:25:30 -0400
commit2addf798e4507f29276d0b00f318a603c57e4a8a (patch)
tree5c381f36d1e7ba4c3fda046f1376e46aaf1aa6b8
parent8e72c6411552b3ba25da7d983cb68f214b4886ac (diff)
Staging: rtl8192u: remove a copy of 80211.h
We had a request to enable one of the realtek network drivers in staging in Fedora. After a quick lookover, I decided this wasn't such a great idea. In doing so though, I noticed we have 6 copies of ieee80211.h there now, Two drivers even have two copies of it. (Even worse, cleanups have been pointlessly happening to both files). The patch below removes one of them, which is asides from whitespace, identical afaics. With a change of filename to the #include, it all still compiles for me. A better fix would be to remove both, and have them use the core ieee80211 stuff, but this is at least a tiny step in the right direction. Signed-off-by: Dave Jones <davej@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/staging/rtl8192u/dot11d.h2
-rw-r--r--drivers/staging/rtl8192u/ieee80211.h2595
-rw-r--r--drivers/staging/rtl8192u/r8192U.h2
-rw-r--r--drivers/staging/rtl8192u/r8192U_wx.h2
-rw-r--r--drivers/staging/rtl8192u/r819xU_firmware.c2
5 files changed, 4 insertions, 2599 deletions
diff --git a/drivers/staging/rtl8192u/dot11d.h b/drivers/staging/rtl8192u/dot11d.h
index 0851b9db17a..d99cc030ec7 100644
--- a/drivers/staging/rtl8192u/dot11d.h
+++ b/drivers/staging/rtl8192u/dot11d.h
@@ -2,7 +2,7 @@
2#define __INC_DOT11D_H 2#define __INC_DOT11D_H
3 3
4#ifdef ENABLE_DOT11D 4#ifdef ENABLE_DOT11D
5#include "ieee80211.h" 5#include "ieee80211/ieee80211.h"
6 6
7 7
8typedef struct _CHNL_TXPOWER_TRIPLE { 8typedef struct _CHNL_TXPOWER_TRIPLE {
diff --git a/drivers/staging/rtl8192u/ieee80211.h b/drivers/staging/rtl8192u/ieee80211.h
deleted file mode 100644
index 9c726113214..00000000000
--- a/drivers/staging/rtl8192u/ieee80211.h
+++ /dev/null
@@ -1,2595 +0,0 @@
1/*
2 * Merged with mainline ieee80211.h in Aug 2004. Original ieee802_11
3 * remains copyright by the original authors
4 *
5 * Portions of the merged code are based on Host AP (software wireless
6 * LAN access point) driver for Intersil Prism2/2.5/3.
7 *
8 * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
9 * <jkmaline@cc.hut.fi>
10 * Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
11 *
12 * Adaption to a generic IEEE 802.11 stack by James Ketrenos
13 * <jketreno@linux.intel.com>
14 * Copyright (c) 2004, Intel Corporation
15 *
16 * Modified for Realtek's wi-fi cards by Andrea Merello
17 * <andreamrl@tiscali.it>
18 *
19 * This program is free software; you can redistribute it and/or modify
20 * it under the terms of the GNU General Public License version 2 as
21 * published by the Free Software Foundation. See README and COPYING for
22 * more details.
23 */
24#ifndef IEEE80211_H
25#define IEEE80211_H
26#include <linux/if_ether.h> /* ETH_ALEN */
27#include <linux/kernel.h> /* ARRAY_SIZE */
28#include <linux/version.h>
29#include <linux/module.h>
30#include <linux/jiffies.h>
31#include <linux/timer.h>
32#include <linux/sched.h>
33
34#include <linux/delay.h>
35#include <linux/wireless.h>
36
37#include "ieee80211/rtl819x_HT.h"
38#include "ieee80211/rtl819x_BA.h"
39#include "ieee80211/rtl819x_TS.h"
40
41
42#ifndef IW_MODE_MONITOR
43#define IW_MODE_MONITOR 6
44#endif
45
46#ifndef IWEVCUSTOM
47#define IWEVCUSTOM 0x8c02
48#endif
49
50
51#ifndef container_of
52/**
53 * container_of - cast a member of a structure out to the containing structure
54 *
55 * @ptr: the pointer to the member.
56 * @type: the type of the container struct this is embedded in.
57 * @member: the name of the member within the struct.
58 *
59 */
60#define container_of(ptr, type, member) ({ \
61 const typeof(((type *)0)->member) (*__mptr = (ptr)); \
62 (type *)((char *)__mptr - offsetof(type, member)); })
63#endif
64
65#define KEY_TYPE_NA 0x0
66#define KEY_TYPE_WEP40 0x1
67#define KEY_TYPE_TKIP 0x2
68#define KEY_TYPE_CCMP 0x4
69#define KEY_TYPE_WEP104 0x5
70
71/* added for rtl819x tx procedure */
72#define MAX_QUEUE_SIZE 0x10
73
74/*
75 * 8190 queue mapping
76 */
77#define BK_QUEUE 0
78#define BE_QUEUE 1
79#define VI_QUEUE 2
80#define VO_QUEUE 3
81#define HCCA_QUEUE 4
82#define TXCMD_QUEUE 5
83#define MGNT_QUEUE 6
84#define HIGH_QUEUE 7
85#define BEACON_QUEUE 8
86
87#define LOW_QUEUE BE_QUEUE
88#define NORMAL_QUEUE MGNT_QUEUE
89
90/* added by amy for ps */
91#define SWRF_TIMEOUT 50
92
93/* added by amy for LEAP related */
94#define IE_CISCO_FLAG_POSITION 0x08 /* Flag byte: byte 8, numbered from 0. */
95#define SUPPORT_CKIP_MIC 0x08 /* bit3 */
96#define SUPPORT_CKIP_PK 0x10 /* bit4 */
97/* defined for skb cb field */
98/* At most 28 byte */
99typedef struct cb_desc {
100 /* Tx Desc Related flags (8-9) */
101 u8 bLastIniPkt:1;
102 u8 bCmdOrInit:1;
103 u8 bFirstSeg:1;
104 u8 bLastSeg:1;
105 u8 bEncrypt:1;
106 u8 bTxDisableRateFallBack:1;
107 u8 bTxUseDriverAssingedRate:1;
108 u8 bHwSec:1; /* indicate whether use Hw security. WB */
109
110 u8 reserved1;
111
112 /* Tx Firmware Relaged flags (10-11)*/
113 u8 bCTSEnable:1;
114 u8 bRTSEnable:1;
115 u8 bUseShortGI:1;
116 u8 bUseShortPreamble:1;
117 u8 bTxEnableFwCalcDur:1;
118 u8 bAMPDUEnable:1;
119 u8 bRTSSTBC:1;
120 u8 RTSSC:1;
121
122 u8 bRTSBW:1;
123 u8 bPacketBW:1;
124 u8 bRTSUseShortPreamble:1;
125 u8 bRTSUseShortGI:1;
126 u8 bMulticast:1;
127 u8 bBroadcast:1;
128 u8 drv_agg_enable:1;
129 u8 reserved2:1;
130
131 /* Tx Desc related element(12-19) */
132 u8 rata_index;
133 u8 queue_index;
134 u16 txbuf_size;
135 u8 RATRIndex;
136 u8 reserved6;
137 u8 reserved7;
138 u8 reserved8;
139
140 /* Tx firmware related element(20-27) */
141 u8 data_rate;
142 u8 rts_rate;
143 u8 ampdu_factor;
144 u8 ampdu_density;
145 u8 DrvAggrNum;
146 u16 pkt_size;
147 u8 reserved12;
148} cb_desc, *pcb_desc;
149
150/*--------------------------Define -------------------------------------------*/
151#define MGN_1M 0x02
152#define MGN_2M 0x04
153#define MGN_5_5M 0x0b
154#define MGN_11M 0x16
155
156#define MGN_6M 0x0c
157#define MGN_9M 0x12
158#define MGN_12M 0x18
159#define MGN_18M 0x24
160#define MGN_24M 0x30
161#define MGN_36M 0x48
162#define MGN_48M 0x60
163#define MGN_54M 0x6c
164
165#define MGN_MCS0 0x80
166#define MGN_MCS1 0x81
167#define MGN_MCS2 0x82
168#define MGN_MCS3 0x83
169#define MGN_MCS4 0x84
170#define MGN_MCS5 0x85
171#define MGN_MCS6 0x86
172#define MGN_MCS7 0x87
173#define MGN_MCS8 0x88
174#define MGN_MCS9 0x89
175#define MGN_MCS10 0x8a
176#define MGN_MCS11 0x8b
177#define MGN_MCS12 0x8c
178#define MGN_MCS13 0x8d
179#define MGN_MCS14 0x8e
180#define MGN_MCS15 0x8f
181
182/*
183 * 802.11 Management frame Reason Code field
184 */
185enum _ReasonCode{
186 unspec_reason = 0x1,
187 auth_not_valid = 0x2,
188 deauth_lv_ss = 0x3,
189 inactivity = 0x4,
190 ap_overload = 0x5,
191 class2_err = 0x6,
192 class3_err = 0x7,
193 disas_lv_ss = 0x8,
194 asoc_not_auth = 0x9,
195
196 /* ----MIC_CHECK */
197 mic_failure = 0xe,
198 /* ----END MIC_CHECK */
199
200 /* Reason code defined in 802.11i D10.0 p.28. */
201 invalid_IE = 0x0d,
202 four_way_tmout = 0x0f,
203 two_way_tmout = 0x10,
204 IE_dismatch = 0x11,
205 invalid_Gcipher = 0x12,
206 invalid_Pcipher = 0x13,
207 invalid_AKMP = 0x14,
208 unsup_RSNIEver = 0x15,
209 invalid_RSNIE = 0x16,
210 auth_802_1x_fail = 0x17,
211 ciper_reject = 0x18,
212
213 /* Reason code defined in 7.3.1.7, 802.1e D13.0, p.42. */
214 QoS_unspec = 0x20, /* 32 */
215 QAP_bandwidth = 0x21, /* 33 */
216 poor_condition = 0x22, /* 34 */
217 no_facility = 0x23, /* 35 */
218 /* Where is 36??? */
219 req_declined = 0x25, /* 37 */
220 invalid_param = 0x26, /* 38 */
221 req_not_honored = 0x27, /* 39 */
222 TS_not_created = 0x2F, /* 47 */
223 DL_not_allowed = 0x30, /* 48 */
224 dest_not_exist = 0x31, /* 49 */
225 dest_not_QSTA = 0x32, /* 50 */
226};
227
228
229
230#define aSifsTime ((priv->ieee80211->current_network.mode == IEEE_A) || \
231 (priv->ieee80211->current_network.mode == IEEE_N_24G) || \
232 (priv->ieee80211->current_network.mode == IEEE_N_5G)) ? 16 : 10
233
234#define MGMT_QUEUE_NUM 5
235
236#define IEEE_CMD_SET_WPA_PARAM 1
237#define IEEE_CMD_SET_WPA_IE 2
238#define IEEE_CMD_SET_ENCRYPTION 3
239#define IEEE_CMD_MLME 4
240
241#define IEEE_PARAM_WPA_ENABLED 1
242#define IEEE_PARAM_TKIP_COUNTERMEASURES 2
243#define IEEE_PARAM_DROP_UNENCRYPTED 3
244#define IEEE_PARAM_PRIVACY_INVOKED 4
245#define IEEE_PARAM_AUTH_ALGS 5
246#define IEEE_PARAM_IEEE_802_1X 6
247/* It should consistent with the driver_XXX.c */
248#define IEEE_PARAM_WPAX_SELECT 7
249/* Added for notify the encryption type selection */
250#define IEEE_PROTO_WPA 1
251#define IEEE_PROTO_RSN 2
252/* Added for notify the encryption type selection */
253#define IEEE_WPAX_USEGROUP 0
254#define IEEE_WPAX_WEP40 1
255#define IEEE_WPAX_TKIP 2
256#define IEEE_WPAX_WRAP 3
257#define IEEE_WPAX_CCMP 4
258#define IEEE_WPAX_WEP104 5
259
260#define IEEE_KEY_MGMT_IEEE8021X 1
261#define IEEE_KEY_MGMT_PSK 2
262
263#define IEEE_MLME_STA_DEAUTH 1
264#define IEEE_MLME_STA_DISASSOC 2
265
266
267#define IEEE_CRYPT_ERR_UNKNOWN_ALG 2
268#define IEEE_CRYPT_ERR_UNKNOWN_ADDR 3
269#define IEEE_CRYPT_ERR_CRYPT_INIT_FAILED 4
270#define IEEE_CRYPT_ERR_KEY_SET_FAILED 5
271#define IEEE_CRYPT_ERR_TX_KEY_SET_FAILED 6
272#define IEEE_CRYPT_ERR_CARD_CONF_FAILED 7
273
274
275#define IEEE_CRYPT_ALG_NAME_LEN 16
276
277#define MAX_IE_LEN 0xff
278
279/* added for kernel conflict */
280#define ieee80211_crypt_deinit_entries ieee80211_crypt_deinit_entries_rsl
281#define ieee80211_crypt_deinit_handler ieee80211_crypt_deinit_handler_rsl
282#define ieee80211_crypt_delayed_deinit ieee80211_crypt_delayed_deinit_rsl
283#define ieee80211_register_crypto_ops ieee80211_register_crypto_ops_rsl
284#define ieee80211_unregister_crypto_ops ieee80211_unregister_crypto_ops_rsl
285#define ieee80211_get_crypto_ops ieee80211_get_crypto_ops_rsl
286
287#define ieee80211_ccmp_null ieee80211_ccmp_null_rsl
288
289#define ieee80211_tkip_null ieee80211_tkip_null_rsl
290
291#define ieee80211_wep_null ieee80211_wep_null_rsl
292
293#define free_ieee80211 free_ieee80211_rsl
294#define alloc_ieee80211 alloc_ieee80211_rsl
295
296#define ieee80211_rx ieee80211_rx_rsl
297#define ieee80211_rx_mgt ieee80211_rx_mgt_rsl
298
299#define ieee80211_get_beacon ieee80211_get_beacon_rsl
300#define ieee80211_wake_queue ieee80211_wake_queue_rsl
301#define ieee80211_stop_queue ieee80211_stop_queue_rsl
302#define ieee80211_reset_queue ieee80211_reset_queue_rsl
303#define ieee80211_softmac_stop_protocol ieee80211_softmac_stop_protocol_rsl
304#define ieee80211_softmac_start_protocol ieee80211_softmac_start_protocol_rsl
305#define ieee80211_is_shortslot ieee80211_is_shortslot_rsl
306#define ieee80211_is_54g ieee80211_is_54g_rsl
307#define ieee80211_wpa_supplicant_ioctl ieee80211_wpa_supplicant_ioctl_rsl
308#define ieee80211_ps_tx_ack ieee80211_ps_tx_ack_rsl
309#define ieee80211_softmac_xmit ieee80211_softmac_xmit_rsl
310#define ieee80211_stop_send_beacons ieee80211_stop_send_beacons_rsl
311#define notify_wx_assoc_event notify_wx_assoc_event_rsl
312#define SendDisassociation SendDisassociation_rsl
313#define ieee80211_disassociate ieee80211_disassociate_rsl
314#define ieee80211_start_send_beacons ieee80211_start_send_beacons_rsl
315#define ieee80211_stop_scan ieee80211_stop_scan_rsl
316#define ieee80211_send_probe_requests ieee80211_send_probe_requests_rsl
317#define ieee80211_softmac_scan_syncro ieee80211_softmac_scan_syncro_rsl
318#define ieee80211_start_scan_syncro ieee80211_start_scan_syncro_rsl
319
320#define ieee80211_wx_get_essid ieee80211_wx_get_essid_rsl
321#define ieee80211_wx_set_essid ieee80211_wx_set_essid_rsl
322#define ieee80211_wx_set_rate ieee80211_wx_set_rate_rsl
323#define ieee80211_wx_get_rate ieee80211_wx_get_rate_rsl
324#define ieee80211_wx_set_wap ieee80211_wx_set_wap_rsl
325#define ieee80211_wx_get_wap ieee80211_wx_get_wap_rsl
326#define ieee80211_wx_set_mode ieee80211_wx_set_mode_rsl
327#define ieee80211_wx_get_mode ieee80211_wx_get_mode_rsl
328#define ieee80211_wx_set_scan ieee80211_wx_set_scan_rsl
329#define ieee80211_wx_get_freq ieee80211_wx_get_freq_rsl
330#define ieee80211_wx_set_freq ieee80211_wx_set_freq_rsl
331#define ieee80211_wx_set_rawtx ieee80211_wx_set_rawtx_rsl
332#define ieee80211_wx_get_name ieee80211_wx_get_name_rsl
333#define ieee80211_wx_set_power ieee80211_wx_set_power_rsl
334#define ieee80211_wx_get_power ieee80211_wx_get_power_rsl
335#define ieee80211_wlan_frequencies ieee80211_wlan_frequencies_rsl
336#define ieee80211_wx_set_rts ieee80211_wx_set_rts_rsl
337#define ieee80211_wx_get_rts ieee80211_wx_get_rts_rsl
338
339#define ieee80211_txb_free ieee80211_txb_free_rsl
340
341#define ieee80211_wx_set_gen_ie ieee80211_wx_set_gen_ie_rsl
342#define ieee80211_wx_get_scan ieee80211_wx_get_scan_rsl
343#define ieee80211_wx_set_encode ieee80211_wx_set_encode_rsl
344#define ieee80211_wx_get_encode ieee80211_wx_get_encode_rsl
345#if WIRELESS_EXT >= 18
346#define ieee80211_wx_set_mlme ieee80211_wx_set_mlme_rsl
347#define ieee80211_wx_set_auth ieee80211_wx_set_auth_rsl
348#define ieee80211_wx_set_encode_ext ieee80211_wx_set_encode_ext_rsl
349#define ieee80211_wx_get_encode_ext ieee80211_wx_get_encode_ext_rsl
350#endif
351
352
353typedef struct ieee_param {
354 u32 cmd;
355 u8 sta_addr[ETH_ALEN];
356 union {
357 struct {
358 u8 name;
359 u32 value;
360 } wpa_param;
361 struct {
362 u32 len;
363 u8 reserved[32];
364 u8 data[0];
365 } wpa_ie;
366 struct{
367 int command;
368 int reason_code;
369 } mlme;
370 struct {
371 u8 alg[IEEE_CRYPT_ALG_NAME_LEN];
372 u8 set_tx;
373 u32 err;
374 u8 idx;
375 u8 seq[8]; /* sequence counter (set: RX, get: TX) */
376 u16 key_len;
377 u8 key[0];
378 } crypt;
379 } u;
380} ieee_param;
381
382
383#if WIRELESS_EXT < 17
384#define IW_QUAL_QUAL_INVALID 0x10
385#define IW_QUAL_LEVEL_INVALID 0x20
386#define IW_QUAL_NOISE_INVALID 0x40
387#define IW_QUAL_QUAL_UPDATED 0x1
388#define IW_QUAL_LEVEL_UPDATED 0x2
389#define IW_QUAL_NOISE_UPDATED 0x4
390#endif
391
392
393/* linux under 2.6.9 release may not support it, so modify it for common use */
394#define MSECS(t) msecs_to_jiffies(t)
395#define msleep_interruptible_rsl msleep_interruptible
396
397#define IEEE80211_DATA_LEN 2304
398/* Maximum size for the MA-UNITDATA primitive, 802.11 standard section
399 6.2.1.1.2.
400
401 The figure in section 7.1.2 suggests a body size of up to 2312
402 bytes is allowed, which is a bit confusing, I suspect this
403 represents the 2304 bytes of real data, plus a possible 8 bytes of
404 WEP IV and ICV. (this interpretation suggested by Ramiro Barreiro) */
405#define IEEE80211_1ADDR_LEN 10
406#define IEEE80211_2ADDR_LEN 16
407#define IEEE80211_3ADDR_LEN 24
408#define IEEE80211_4ADDR_LEN 30
409#define IEEE80211_FCS_LEN 4
410#define IEEE80211_HLEN (IEEE80211_4ADDR_LEN)
411#define IEEE80211_FRAME_LEN (IEEE80211_DATA_LEN + IEEE80211_HLEN)
412#define IEEE80211_MGMT_HDR_LEN 24
413#define IEEE80211_DATA_HDR3_LEN 24
414#define IEEE80211_DATA_HDR4_LEN 30
415
416#define MIN_FRAG_THRESHOLD 256U
417#define MAX_FRAG_THRESHOLD 2346U
418
419
420/* Frame control field constants */
421#define IEEE80211_FCTL_VERS 0x0003
422#define IEEE80211_FCTL_FTYPE 0x000c
423#define IEEE80211_FCTL_STYPE 0x00f0
424#define IEEE80211_FCTL_FRAMETYPE 0x00fc
425#define IEEE80211_FCTL_TODS 0x0100
426#define IEEE80211_FCTL_FROMDS 0x0200
427#define IEEE80211_FCTL_DSTODS 0x0300
428#define IEEE80211_FCTL_MOREFRAGS 0x0400
429#define IEEE80211_FCTL_RETRY 0x0800
430#define IEEE80211_FCTL_PM 0x1000
431#define IEEE80211_FCTL_MOREDATA 0x2000
432#define IEEE80211_FCTL_WEP 0x4000
433#define IEEE80211_FCTL_ORDER 0x8000
434
435#define IEEE80211_FTYPE_MGMT 0x0000
436#define IEEE80211_FTYPE_CTL 0x0004
437#define IEEE80211_FTYPE_DATA 0x0008
438
439/* management */
440#define IEEE80211_STYPE_ASSOC_REQ 0x0000
441#define IEEE80211_STYPE_ASSOC_RESP 0x0010
442#define IEEE80211_STYPE_REASSOC_REQ 0x0020
443#define IEEE80211_STYPE_REASSOC_RESP 0x0030
444#define IEEE80211_STYPE_PROBE_REQ 0x0040
445#define IEEE80211_STYPE_PROBE_RESP 0x0050
446#define IEEE80211_STYPE_BEACON 0x0080
447#define IEEE80211_STYPE_ATIM 0x0090
448#define IEEE80211_STYPE_DISASSOC 0x00A0
449#define IEEE80211_STYPE_AUTH 0x00B0
450#define IEEE80211_STYPE_DEAUTH 0x00C0
451#define IEEE80211_STYPE_MANAGE_ACT 0x00D0
452
453/* control */
454#define IEEE80211_STYPE_PSPOLL 0x00A0
455#define IEEE80211_STYPE_RTS 0x00B0
456#define IEEE80211_STYPE_CTS 0x00C0
457#define IEEE80211_STYPE_ACK 0x00D0
458#define IEEE80211_STYPE_CFEND 0x00E0
459#define IEEE80211_STYPE_CFENDACK 0x00F0
460#define IEEE80211_STYPE_BLOCKACK 0x0094
461
462/* data */
463#define IEEE80211_STYPE_DATA 0x0000
464#define IEEE80211_STYPE_DATA_CFACK 0x0010
465#define IEEE80211_STYPE_DATA_CFPOLL 0x0020
466#define IEEE80211_STYPE_DATA_CFACKPOLL 0x0030
467#define IEEE80211_STYPE_NULLFUNC 0x0040
468#define IEEE80211_STYPE_CFACK 0x0050
469#define IEEE80211_STYPE_CFPOLL 0x0060
470#define IEEE80211_STYPE_CFACKPOLL 0x0070
471#define IEEE80211_STYPE_QOS_DATA 0x0080
472#define IEEE80211_STYPE_QOS_NULL 0x00C0
473
474#define IEEE80211_SCTL_FRAG 0x000F
475#define IEEE80211_SCTL_SEQ 0xFFF0
476
477/* QOS control */
478#define IEEE80211_QCTL_TID 0x000F
479
480#define FC_QOS_BIT BIT7
481#define IsDataFrame(pdu) (((pdu[0] & 0x0C) == 0x08) ? true : false)
482#define IsLegacyDataFrame(pdu) (IsDataFrame(pdu) && (!(pdu[0]&FC_QOS_BIT)))
483
484#define IsQoSDataFrame(pframe) ((*(u16 *)pframe&(IEEE80211_STYPE_QOS_DATA|IEEE80211_FTYPE_DATA)) == (IEEE80211_STYPE_QOS_DATA|IEEE80211_FTYPE_DATA))
485#define Frame_Order(pframe) (*(u16 *)pframe&IEEE80211_FCTL_ORDER)
486#define SN_LESS(a, b) (((a-b)&0x800) != 0)
487#define SN_EQUAL(a, b) (a == b)
488#define MAX_DEV_ADDR_SIZE 8
489typedef enum _ACT_CATEGORY{
490 ACT_CAT_QOS = 1,
491 ACT_CAT_DLS = 2,
492 ACT_CAT_BA = 3,
493 ACT_CAT_HT = 7,
494 ACT_CAT_WMM = 17,
495} ACT_CATEGORY, *PACT_CATEGORY;
496
497typedef enum _TS_ACTION{
498 ACT_ADDTSREQ = 0,
499 ACT_ADDTSRSP = 1,
500 ACT_DELTS = 2,
501 ACT_SCHEDULE = 3,
502} TS_ACTION, *PTS_ACTION;
503
504typedef enum _BA_ACTION{
505 ACT_ADDBAREQ = 0,
506 ACT_ADDBARSP = 1,
507 ACT_DELBA = 2,
508} BA_ACTION, *PBA_ACTION;
509
510typedef enum _InitialGainOpType{
511 IG_Backup = 0,
512 IG_Restore,
513 IG_Max
514} InitialGainOpType;
515
516/* debug macros */
517#define CONFIG_IEEE80211_DEBUG
518#ifdef CONFIG_IEEE80211_DEBUG
519extern u32 ieee80211_debug_level;
520#define IEEE80211_DEBUG(level, fmt, args...) \
521do { if (ieee80211_debug_level & (level)) \
522 printk(KERN_DEBUG "ieee80211: " fmt, ## args); } while (0)
523/* wb added to debug out data buf
524 * if you want print DATA buffer related BA, please set ieee80211_debug_level
525 * to DATA|BA
526 */
527#define IEEE80211_DEBUG_DATA(level, data, datalen) \
528 do { if ((ieee80211_debug_level & (level)) == (level)) { \
529 int i; \
530 u8* pdata = (u8 *) data; \
531 printk(KERN_DEBUG "ieee80211: %s()\n", __FUNCTION__); \
532 for (i = 0; i < (int)(datalen); i++) { \
533 printk("%2x ", pdata[i]); \
534 if ((i+1)%16 == 0) \
535 printk("\n"); \
536 } \
537 printk("\n"); \
538 } \
539 } while (0)
540#else
541#define IEEE80211_DEBUG(level, fmt, args...) do {} while (0)
542#define IEEE80211_DEBUG_DATA(level, data, datalen) do {} while (0)
543#endif /* CONFIG_IEEE80211_DEBUG */
544
545/* debug macros not dependent on CONFIG_IEEE80211_DEBUG */
546
547/*
548 * To use the debug system;
549 *
550 * If you are defining a new debug classification, simply add it to the #define
551 * list here in the form of:
552 *
553 * #define IEEE80211_DL_xxxx VALUE
554 *
555 * shifting value to the left one bit from the previous entry. xxxx should be
556 * the name of the classification (for example, WEP)
557 *
558 * You then need to either add a IEEE80211_xxxx_DEBUG() macro definition for your
559 * classification, or use IEEE80211_DEBUG(IEEE80211_DL_xxxx, ...) whenever you want
560 * to send output to that classification.
561 *
562 * To add your debug level to the list of levels seen when you perform
563 *
564 * % cat /proc/net/ipw/debug_level
565 *
566 * you simply need to add your entry to the ipw_debug_levels array.
567 *
568 * If you do not see debug_level in /proc/net/ipw then you do not have
569 * CONFIG_IEEE80211_DEBUG defined in your kernel configuration
570 *
571 */
572
573#define IEEE80211_DL_INFO (1<<0)
574#define IEEE80211_DL_WX (1<<1)
575#define IEEE80211_DL_SCAN (1<<2)
576#define IEEE80211_DL_STATE (1<<3)
577#define IEEE80211_DL_MGMT (1<<4)
578#define IEEE80211_DL_FRAG (1<<5)
579#define IEEE80211_DL_EAP (1<<6)
580#define IEEE80211_DL_DROP (1<<7)
581
582#define IEEE80211_DL_TX (1<<8)
583#define IEEE80211_DL_RX (1<<9)
584
585#define IEEE80211_DL_HT (1<<10) /* HT */
586#define IEEE80211_DL_BA (1<<11) /* ba */
587#define IEEE80211_DL_TS (1<<12) /* TS */
588#define IEEE80211_DL_QOS (1<<13)
589#define IEEE80211_DL_REORDER (1<<14)
590#define IEEE80211_DL_IOT (1<<15)
591#define IEEE80211_DL_IPS (1<<16)
592#define IEEE80211_DL_TRACE (1<<29) /* trace function, need to user net_ratelimit() together in order not to print too much to the screen */
593#define IEEE80211_DL_DATA (1<<30) /* use this flag to control whether print data buf out. */
594#define IEEE80211_DL_ERR (1<<31) /* always open */
595#define IEEE80211_ERROR(f, a...) printk(KERN_ERR "ieee80211: " f, ## a)
596#define IEEE80211_WARNING(f, a...) printk(KERN_WARNING "ieee80211: " f, ## a)
597#define IEEE80211_DEBUG_INFO(f, a...) IEEE80211_DEBUG(IEEE80211_DL_INFO, f, ## a)
598
599#define IEEE80211_DEBUG_WX(f, a...) IEEE80211_DEBUG(IEEE80211_DL_WX, f, ## a)
600#define IEEE80211_DEBUG_SCAN(f, a...) IEEE80211_DEBUG(IEEE80211_DL_SCAN, f, ## a)
601#define IEEE80211_DEBUG_STATE(f, a...) IEEE80211_DEBUG(IEEE80211_DL_STATE, f, ## a)
602#define IEEE80211_DEBUG_MGMT(f, a...) IEEE80211_DEBUG(IEEE80211_DL_MGMT, f, ## a)
603#define IEEE80211_DEBUG_FRAG(f, a...) IEEE80211_DEBUG(IEEE80211_DL_FRAG, f, ## a)
604#define IEEE80211_DEBUG_EAP(f, a...) IEEE80211_DEBUG(IEEE80211_DL_EAP, f, ## a)
605#define IEEE80211_DEBUG_DROP(f, a...) IEEE80211_DEBUG(IEEE80211_DL_DROP, f, ## a)
606#define IEEE80211_DEBUG_TX(f, a...) IEEE80211_DEBUG(IEEE80211_DL_TX, f, ## a)
607#define IEEE80211_DEBUG_RX(f, a...) IEEE80211_DEBUG(IEEE80211_DL_RX, f, ## a)
608#define IEEE80211_DEBUG_QOS(f, a...) IEEE80211_DEBUG(IEEE80211_DL_QOS, f, ## a)
609
610#ifdef CONFIG_IEEE80211_DEBUG
611/* Added by Annie, 2005-11-22. */
612#define MAX_STR_LEN 64
613/* I want to see ASCII 33 to 126 only. Otherwise, I print '?'. Annie, 2005-11-22.*/
614#define PRINTABLE(_ch) (_ch > '!' && _ch < '~')
615#define IEEE80211_PRINT_STR(_Comp, _TitleString, _Ptr, _Len) \
616 if ((_Comp) & level) { \
617 int __i; \
618 u8 buffer[MAX_STR_LEN]; \
619 int length = (_Len < MAX_STR_LEN) ? _Len : (MAX_STR_LEN - 1); \
620 memset(buffer, 0, MAX_STR_LEN); \
621 memcpy(buffer, (u8 *)_Ptr, length); \
622 for (__i = 0; __i < MAX_STR_LEN; __i++) { \
623 if (!PRINTABLE(buffer[__i])) \
624 buffer[__i] = '?'; \
625 } \
626 buffer[length] = '\0'; \
627 printk("Rtl819x: "); \
628 printk(_TitleString); \
629 printk(": %d, <%s>\n", _Len, buffer); \
630 }
631#else
632#define IEEE80211_PRINT_STR(_Comp, _TitleString, _Ptr, _Len) do {} while (0)
633#endif
634
635#include <linux/netdevice.h>
636#include <linux/if_arp.h> /* ARPHRD_ETHER */
637
638#ifndef WIRELESS_SPY
639#define WIRELESS_SPY /* enable iwspy support */
640#endif
641#include <net/iw_handler.h> /* new driver API */
642
643#ifndef ETH_P_PAE
644#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */
645#endif /* ETH_P_PAE */
646
647#define ETH_P_PREAUTH 0x88C7 /* IEEE 802.11i pre-authentication */
648
649#ifndef ETH_P_80211_RAW
650#define ETH_P_80211_RAW (ETH_P_ECONET + 1)
651#endif
652
653/* IEEE 802.11 defines */
654
655#define P80211_OUI_LEN 3
656
657struct ieee80211_snap_hdr {
658
659 u8 dsap; /* always 0xAA */
660 u8 ssap; /* always 0xAA */
661 u8 ctrl; /* always 0x03 */
662 u8 oui[P80211_OUI_LEN]; /* organizational universal id */
663
664} __attribute__ ((packed));
665
666#define SNAP_SIZE sizeof(struct ieee80211_snap_hdr)
667
668#define WLAN_FC_GET_VERS(fc) ((fc) & IEEE80211_FCTL_VERS)
669#define WLAN_FC_GET_TYPE(fc) ((fc) & IEEE80211_FCTL_FTYPE)
670#define WLAN_FC_GET_STYPE(fc) ((fc) & IEEE80211_FCTL_STYPE)
671
672#define WLAN_FC_GET_FRAMETYPE(fc) ((fc) & IEEE80211_FCTL_FRAMETYPE)
673#define WLAN_GET_SEQ_FRAG(seq) ((seq) & IEEE80211_SCTL_FRAG)
674#define WLAN_GET_SEQ_SEQ(seq) (((seq) & IEEE80211_SCTL_SEQ) >> 4)
675
676/* Authentication algorithms */
677#define WLAN_AUTH_OPEN 0
678#define WLAN_AUTH_SHARED_KEY 1
679#define WLAN_AUTH_LEAP 2
680
681#define WLAN_AUTH_CHALLENGE_LEN 128
682
683#define WLAN_CAPABILITY_BSS (1<<0)
684#define WLAN_CAPABILITY_IBSS (1<<1)
685#define WLAN_CAPABILITY_CF_POLLABLE (1<<2)
686#define WLAN_CAPABILITY_CF_POLL_REQUEST (1<<3)
687#define WLAN_CAPABILITY_PRIVACY (1<<4)
688#define WLAN_CAPABILITY_SHORT_PREAMBLE (1<<5)
689#define WLAN_CAPABILITY_PBCC (1<<6)
690#define WLAN_CAPABILITY_CHANNEL_AGILITY (1<<7)
691#define WLAN_CAPABILITY_SPECTRUM_MGMT (1<<8)
692#define WLAN_CAPABILITY_QOS (1<<9)
693#define WLAN_CAPABILITY_SHORT_SLOT (1<<10)
694#define WLAN_CAPABILITY_DSSS_OFDM (1<<13)
695
696/* 802.11g ERP information element */
697#define WLAN_ERP_NON_ERP_PRESENT (1<<0)
698#define WLAN_ERP_USE_PROTECTION (1<<1)
699#define WLAN_ERP_BARKER_PREAMBLE (1<<2)
700
701/* Status codes */
702enum ieee80211_statuscode {
703 WLAN_STATUS_SUCCESS = 0,
704 WLAN_STATUS_UNSPECIFIED_FAILURE = 1,
705 WLAN_STATUS_CAPS_UNSUPPORTED = 10,
706 WLAN_STATUS_REASSOC_NO_ASSOC = 11,
707 WLAN_STATUS_ASSOC_DENIED_UNSPEC = 12,
708 WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG = 13,
709 WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION = 14,
710 WLAN_STATUS_CHALLENGE_FAIL = 15,
711 WLAN_STATUS_AUTH_TIMEOUT = 16,
712 WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA = 17,
713 WLAN_STATUS_ASSOC_DENIED_RATES = 18,
714 /* 802.11b */
715 WLAN_STATUS_ASSOC_DENIED_NOSHORTPREAMBLE = 19,
716 WLAN_STATUS_ASSOC_DENIED_NOPBCC = 20,
717 WLAN_STATUS_ASSOC_DENIED_NOAGILITY = 21,
718 /* 802.11h */
719 WLAN_STATUS_ASSOC_DENIED_NOSPECTRUM = 22,
720 WLAN_STATUS_ASSOC_REJECTED_BAD_POWER = 23,
721 WLAN_STATUS_ASSOC_REJECTED_BAD_SUPP_CHAN = 24,
722 /* 802.11g */
723 WLAN_STATUS_ASSOC_DENIED_NOSHORTTIME = 25,
724 WLAN_STATUS_ASSOC_DENIED_NODSSSOFDM = 26,
725 /* 802.11i */
726 WLAN_STATUS_INVALID_IE = 40,
727 WLAN_STATUS_INVALID_GROUP_CIPHER = 41,
728 WLAN_STATUS_INVALID_PAIRWISE_CIPHER = 42,
729 WLAN_STATUS_INVALID_AKMP = 43,
730 WLAN_STATUS_UNSUPP_RSN_VERSION = 44,
731 WLAN_STATUS_INVALID_RSN_IE_CAP = 45,
732 WLAN_STATUS_CIPHER_SUITE_REJECTED = 46,
733};
734
735/* Reason codes */
736enum ieee80211_reasoncode {
737 WLAN_REASON_UNSPECIFIED = 1,
738 WLAN_REASON_PREV_AUTH_NOT_VALID = 2,
739 WLAN_REASON_DEAUTH_LEAVING = 3,
740 WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY = 4,
741 WLAN_REASON_DISASSOC_AP_BUSY = 5,
742 WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA = 6,
743 WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA = 7,
744 WLAN_REASON_DISASSOC_STA_HAS_LEFT = 8,
745 WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH = 9,
746 /* 802.11h */
747 WLAN_REASON_DISASSOC_BAD_POWER = 10,
748 WLAN_REASON_DISASSOC_BAD_SUPP_CHAN = 11,
749 /* 802.11i */
750 WLAN_REASON_INVALID_IE = 13,
751 WLAN_REASON_MIC_FAILURE = 14,
752 WLAN_REASON_4WAY_HANDSHAKE_TIMEOUT = 15,
753 WLAN_REASON_GROUP_KEY_HANDSHAKE_TIMEOUT = 16,
754 WLAN_REASON_IE_DIFFERENT = 17,
755 WLAN_REASON_INVALID_GROUP_CIPHER = 18,
756 WLAN_REASON_INVALID_PAIRWISE_CIPHER = 19,
757 WLAN_REASON_INVALID_AKMP = 20,
758 WLAN_REASON_UNSUPP_RSN_VERSION = 21,
759 WLAN_REASON_INVALID_RSN_IE_CAP = 22,
760 WLAN_REASON_IEEE8021X_FAILED = 23,
761 WLAN_REASON_CIPHER_SUITE_REJECTED = 24,
762};
763
764#define IEEE80211_STATMASK_SIGNAL (1<<0)
765#define IEEE80211_STATMASK_RSSI (1<<1)
766#define IEEE80211_STATMASK_NOISE (1<<2)
767#define IEEE80211_STATMASK_RATE (1<<3)
768#define IEEE80211_STATMASK_WEMASK 0x7
769
770#define IEEE80211_CCK_MODULATION (1<<0)
771#define IEEE80211_OFDM_MODULATION (1<<1)
772
773#define IEEE80211_24GHZ_BAND (1<<0)
774#define IEEE80211_52GHZ_BAND (1<<1)
775
776#define IEEE80211_CCK_RATE_LEN 4
777#define IEEE80211_CCK_RATE_1MB 0x02
778#define IEEE80211_CCK_RATE_2MB 0x04
779#define IEEE80211_CCK_RATE_5MB 0x0B
780#define IEEE80211_CCK_RATE_11MB 0x16
781#define IEEE80211_OFDM_RATE_LEN 8
782#define IEEE80211_OFDM_RATE_6MB 0x0C
783#define IEEE80211_OFDM_RATE_9MB 0x12
784#define IEEE80211_OFDM_RATE_12MB 0x18
785#define IEEE80211_OFDM_RATE_18MB 0x24
786#define IEEE80211_OFDM_RATE_24MB 0x30
787#define IEEE80211_OFDM_RATE_36MB 0x48
788#define IEEE80211_OFDM_RATE_48MB 0x60
789#define IEEE80211_OFDM_RATE_54MB 0x6C
790#define IEEE80211_BASIC_RATE_MASK 0x80
791
792#define IEEE80211_CCK_RATE_1MB_MASK (1<<0)
793#define IEEE80211_CCK_RATE_2MB_MASK (1<<1)
794#define IEEE80211_CCK_RATE_5MB_MASK (1<<2)
795#define IEEE80211_CCK_RATE_11MB_MASK (1<<3)
796#define IEEE80211_OFDM_RATE_6MB_MASK (1<<4)
797#define IEEE80211_OFDM_RATE_9MB_MASK (1<<5)
798#define IEEE80211_OFDM_RATE_12MB_MASK (1<<6)
799#define IEEE80211_OFDM_RATE_18MB_MASK (1<<7)
800#define IEEE80211_OFDM_RATE_24MB_MASK (1<<8)
801#define IEEE80211_OFDM_RATE_36MB_MASK (1<<9)
802#define IEEE80211_OFDM_RATE_48MB_MASK (1<<10)
803#define IEEE80211_OFDM_RATE_54MB_MASK (1<<11)
804
805#define IEEE80211_CCK_RATES_MASK 0x0000000F
806#define IEEE80211_CCK_BASIC_RATES_MASK (IEEE80211_CCK_RATE_1MB_MASK | \
807 IEEE80211_CCK_RATE_2MB_MASK)
808#define IEEE80211_CCK_DEFAULT_RATES_MASK (IEEE80211_CCK_BASIC_RATES_MASK | \
809 IEEE80211_CCK_RATE_5MB_MASK | \
810 IEEE80211_CCK_RATE_11MB_MASK)
811
812#define IEEE80211_OFDM_RATES_MASK 0x00000FF0
813#define IEEE80211_OFDM_BASIC_RATES_MASK (IEEE80211_OFDM_RATE_6MB_MASK | \
814 IEEE80211_OFDM_RATE_12MB_MASK | \
815 IEEE80211_OFDM_RATE_24MB_MASK)
816#define IEEE80211_OFDM_DEFAULT_RATES_MASK (IEEE80211_OFDM_BASIC_RATES_MASK | \
817 IEEE80211_OFDM_RATE_9MB_MASK | \
818 IEEE80211_OFDM_RATE_18MB_MASK | \
819 IEEE80211_OFDM_RATE_36MB_MASK | \
820 IEEE80211_OFDM_RATE_48MB_MASK | \
821 IEEE80211_OFDM_RATE_54MB_MASK)
822#define IEEE80211_DEFAULT_RATES_MASK (IEEE80211_OFDM_DEFAULT_RATES_MASK | \
823 IEEE80211_CCK_DEFAULT_RATES_MASK)
824
825#define IEEE80211_NUM_OFDM_RATES 8
826#define IEEE80211_NUM_CCK_RATES 4
827#define IEEE80211_OFDM_SHIFT_MASK_A 4
828
829
830/* this is stolen and modified from the madwifi driver*/
831#define IEEE80211_FC0_TYPE_MASK 0x0c
832#define IEEE80211_FC0_TYPE_DATA 0x08
833#define IEEE80211_FC0_SUBTYPE_MASK 0xB0
834#define IEEE80211_FC0_SUBTYPE_QOS 0x80
835
836#define IEEE80211_QOS_HAS_SEQ(fc) \
837 (((fc) & (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_MASK)) == \
838 (IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_QOS))
839
840/* this is stolen from ipw2200 driver */
841#define IEEE_IBSS_MAC_HASH_SIZE 31
842struct ieee_ibss_seq {
843 u8 mac[ETH_ALEN];
844 u16 seq_num[17];
845 u16 frag_num[17];
846 unsigned long packet_time[17];
847 struct list_head list;
848};
849
850/* NOTE: This data is for statistical purposes; not all hardware provides this
851 * information for frames received. Not setting these will not cause
852 * any adverse affects. */
853struct ieee80211_rx_stats {
854 u32 mac_time[2];
855 s8 rssi;
856 u8 signal;
857 u8 noise;
858 u16 rate; /* in 100 kbps */
859 u8 received_channel;
860 u8 control;
861 u8 mask;
862 u8 freq;
863 u16 len;
864 u64 tsf;
865 u32 beacon_time;
866 u8 nic_type;
867 u16 Length;
868 u8 SignalQuality; /* in 0-100 index. */
869 s32 RecvSignalPower; /* Real power in dBm for this packet, no beautification and aggregation. */
870 s8 RxPower; /* in dBm Translate from PWdB */
871 u8 SignalStrength; /* in 0-100 index. */
872 u16 bHwError:1;
873 u16 bCRC:1;
874 u16 bICV:1;
875 u16 bShortPreamble:1;
876 u16 Antenna:1; /* for rtl8185 */
877 u16 Decrypted:1; /* for rtl8185, rtl8187 */
878 u16 Wakeup:1; /* for rtl8185 */
879 u16 Reserved0:1; /* for rtl8185 */
880 u8 AGC;
881 u32 TimeStampLow;
882 u32 TimeStampHigh;
883 bool bShift;
884 bool bIsQosData;
885 u8 UserPriority;
886
887 /*
888 * 1Attention Please!!!<11n or 8190 specific code should be put below this line>
889 */
890
891 u8 RxDrvInfoSize;
892 u8 RxBufShift;
893 bool bIsAMPDU;
894 bool bFirstMPDU;
895 bool bContainHTC;
896 bool RxIs40MHzPacket;
897 u32 RxPWDBAll;
898 u8 RxMIMOSignalStrength[4]; /* in 0~100 index */
899 s8 RxMIMOSignalQuality[2];
900 bool bPacketMatchBSSID;
901 bool bIsCCK;
902 bool bPacketToSelf;
903 u8 *virtual_address;
904 u16 packetlength; /* Total packet length: Must equal to sum of all FragLength */
905 u16 fraglength; /* FragLength should equal to PacketLength in non-fragment case */
906 u16 fragoffset; /* Data offset for this fragment */
907 u16 ntotalfrag;
908 bool bisrxaggrsubframe;
909 bool bPacketBeacon; /* cosa add for rssi */
910 bool bToSelfBA; /* cosa add for rssi */
911 char cck_adc_pwdb[4]; /* cosa add for rx path selection */
912 u16 Seq_Num;
913
914};
915
916/* IEEE 802.11 requires that STA supports concurrent reception of at least
917 * three fragmented frames. This define can be increased to support more
918 * concurrent frames, but it should be noted that each entry can consume about
919 * 2 kB of RAM and increasing cache size will slow down frame reassembly. */
920#define IEEE80211_FRAG_CACHE_LEN 4
921
922struct ieee80211_frag_entry {
923 unsigned long first_frag_time;
924 unsigned int seq;
925 unsigned int last_frag;
926 struct sk_buff *skb;
927 u8 src_addr[ETH_ALEN];
928 u8 dst_addr[ETH_ALEN];
929};
930
931struct ieee80211_stats {
932 unsigned int tx_unicast_frames;
933 unsigned int tx_multicast_frames;
934 unsigned int tx_fragments;
935 unsigned int tx_unicast_octets;
936 unsigned int tx_multicast_octets;
937 unsigned int tx_deferred_transmissions;
938 unsigned int tx_single_retry_frames;
939 unsigned int tx_multiple_retry_frames;
940 unsigned int tx_retry_limit_exceeded;
941 unsigned int tx_discards;
942 unsigned int rx_unicast_frames;
943 unsigned int rx_multicast_frames;
944 unsigned int rx_fragments;
945 unsigned int rx_unicast_octets;
946 unsigned int rx_multicast_octets;
947 unsigned int rx_fcs_errors;
948 unsigned int rx_discards_no_buffer;
949 unsigned int tx_discards_wrong_sa;
950 unsigned int rx_discards_undecryptable;
951 unsigned int rx_message_in_msg_fragments;
952 unsigned int rx_message_in_bad_msg_fragments;
953};
954
955struct ieee80211_device;
956
957#include "ieee80211_crypt.h"
958
959#define SEC_KEY_1 (1<<0)
960#define SEC_KEY_2 (1<<1)
961#define SEC_KEY_3 (1<<2)
962#define SEC_KEY_4 (1<<3)
963#define SEC_ACTIVE_KEY (1<<4)
964#define SEC_AUTH_MODE (1<<5)
965#define SEC_UNICAST_GROUP (1<<6)
966#define SEC_LEVEL (1<<7)
967#define SEC_ENABLED (1<<8)
968#define SEC_ENCRYPT (1<<9)
969
970#define SEC_LEVEL_0 0 /* None */
971#define SEC_LEVEL_1 1 /* WEP 40 and 104 bit */
972#define SEC_LEVEL_2 2 /* Level 1 + TKIP */
973#define SEC_LEVEL_2_CKIP 3 /* Level 1 + CKIP */
974#define SEC_LEVEL_3 4 /* Level 2 + CCMP */
975
976#define SEC_ALG_NONE 0
977#define SEC_ALG_WEP 1
978#define SEC_ALG_TKIP 2
979#define SEC_ALG_CCMP 3
980
981#define WEP_KEYS 4
982#define WEP_KEY_LEN 13
983#define SCM_KEY_LEN 32
984#define SCM_TEMPORAL_KEY_LENGTH 16
985
986struct ieee80211_security {
987 u16 active_key:2,
988 enabled:1,
989 auth_mode:2,
990 auth_algo:4,
991 unicast_uses_group:1,
992 encrypt:1;
993 u8 key_sizes[WEP_KEYS];
994 u8 keys[WEP_KEYS][SCM_KEY_LEN];
995 u8 level;
996 u16 flags;
997} __attribute__ ((packed));
998
999
1000/*
1001 802.11 data frame from AP
1002 ,-------------------------------------------------------------------.
1003Bytes | 2 | 2 | 6 | 6 | 6 | 2 | 0..2312 | 4 |
1004 |------|------|---------|---------|---------|------|---------|------|
1005Desc. | ctrl | dura | DA/RA | TA | SA | Sequ | frame | fcs |
1006 | | tion | (BSSID) | | | ence | data | |
1007 `-------------------------------------------------------------------'
1008Total: 28-2340 bytes
1009*/
1010
1011/* Management Frame Information Element Types */
1012enum ieee80211_mfie {
1013 MFIE_TYPE_SSID = 0,
1014 MFIE_TYPE_RATES = 1,
1015 MFIE_TYPE_FH_SET = 2,
1016 MFIE_TYPE_DS_SET = 3,
1017 MFIE_TYPE_CF_SET = 4,
1018 MFIE_TYPE_TIM = 5,
1019 MFIE_TYPE_IBSS_SET = 6,
1020 MFIE_TYPE_COUNTRY = 7,
1021 MFIE_TYPE_HOP_PARAMS = 8,
1022 MFIE_TYPE_HOP_TABLE = 9,
1023 MFIE_TYPE_REQUEST = 10,
1024 MFIE_TYPE_CHALLENGE = 16,
1025 MFIE_TYPE_POWER_CONSTRAINT = 32,
1026 MFIE_TYPE_POWER_CAPABILITY = 33,
1027 MFIE_TYPE_TPC_REQUEST = 34,
1028 MFIE_TYPE_TPC_REPORT = 35,
1029 MFIE_TYPE_SUPP_CHANNELS = 36,
1030 MFIE_TYPE_CSA = 37,
1031 MFIE_TYPE_MEASURE_REQUEST = 38,
1032 MFIE_TYPE_MEASURE_REPORT = 39,
1033 MFIE_TYPE_QUIET = 40,
1034 MFIE_TYPE_IBSS_DFS = 41,
1035 MFIE_TYPE_ERP = 42,
1036 MFIE_TYPE_RSN = 48,
1037 MFIE_TYPE_RATES_EX = 50,
1038 MFIE_TYPE_HT_CAP = 45,
1039 MFIE_TYPE_HT_INFO = 61,
1040 MFIE_TYPE_AIRONET = 133,
1041 MFIE_TYPE_GENERIC = 221,
1042 MFIE_TYPE_QOS_PARAMETER = 222,
1043};
1044
1045/* Minimal header; can be used for passing 802.11 frames with sufficient
1046 * information to determine what type of underlying data type is actually
1047 * stored in the data. */
1048struct ieee80211_hdr {
1049 __le16 frame_ctl;
1050 __le16 duration_id;
1051 u8 payload[0];
1052} __attribute__ ((packed));
1053
1054struct ieee80211_hdr_1addr {
1055 __le16 frame_ctl;
1056 __le16 duration_id;
1057 u8 addr1[ETH_ALEN];
1058 u8 payload[0];
1059} __attribute__ ((packed));
1060
1061struct ieee80211_hdr_2addr {
1062 __le16 frame_ctl;
1063 __le16 duration_id;
1064 u8 addr1[ETH_ALEN];
1065 u8 addr2[ETH_ALEN];
1066 u8 payload[0];
1067} __attribute__ ((packed));
1068
1069struct ieee80211_hdr_3addr {
1070 __le16 frame_ctl;
1071 __le16 duration_id;
1072 u8 addr1[ETH_ALEN];
1073 u8 addr2[ETH_ALEN];
1074 u8 addr3[ETH_ALEN];
1075 __le16 seq_ctl;
1076 u8 payload[0];
1077} __attribute__ ((packed));
1078
1079struct ieee80211_hdr_4addr {
1080 __le16 frame_ctl;
1081 __le16 duration_id;
1082 u8 addr1[ETH_ALEN];
1083 u8 addr2[ETH_ALEN];
1084 u8 addr3[ETH_ALEN];
1085 __le16 seq_ctl;
1086 u8 addr4[ETH_ALEN];
1087 u8 payload[0];
1088} __attribute__ ((packed));
1089
1090struct ieee80211_hdr_3addrqos {
1091 __le16 frame_ctl;
1092 __le16 duration_id;
1093 u8 addr1[ETH_ALEN];
1094 u8 addr2[ETH_ALEN];
1095 u8 addr3[ETH_ALEN];
1096 __le16 seq_ctl;
1097 u8 payload[0];
1098 __le16 qos_ctl;
1099} __attribute__ ((packed));
1100
1101struct ieee80211_hdr_4addrqos {
1102 __le16 frame_ctl;
1103 __le16 duration_id;
1104 u8 addr1[ETH_ALEN];
1105 u8 addr2[ETH_ALEN];
1106 u8 addr3[ETH_ALEN];
1107 __le16 seq_ctl;
1108 u8 addr4[ETH_ALEN];
1109 u8 payload[0];
1110 __le16 qos_ctl;
1111} __attribute__ ((packed));
1112
1113struct ieee80211_info_element {
1114 u8 id;
1115 u8 len;
1116 u8 data[0];
1117} __attribute__ ((packed));
1118
1119struct ieee80211_authentication {
1120 struct ieee80211_hdr_3addr header;
1121 __le16 algorithm;
1122 __le16 transaction;
1123 __le16 status;
1124 /*challenge*/
1125 struct ieee80211_info_element info_element[0];
1126} __attribute__ ((packed));
1127
1128struct ieee80211_disassoc {
1129 struct ieee80211_hdr_3addr header;
1130 __le16 reason;
1131} __attribute__ ((packed));
1132
1133struct ieee80211_probe_request {
1134 struct ieee80211_hdr_3addr header;
1135 /* SSID, supported rates */
1136 struct ieee80211_info_element info_element[0];
1137} __attribute__ ((packed));
1138
1139struct ieee80211_probe_response {
1140 struct ieee80211_hdr_3addr header;
1141 u32 time_stamp[2];
1142 __le16 beacon_interval;
1143 __le16 capability;
1144 /* SSID, supported rates, FH params, DS params,
1145 * CF params, IBSS params, TIM (if beacon), RSN */
1146 struct ieee80211_info_element info_element[0];
1147} __attribute__ ((packed));
1148
1149/* Alias beacon for probe_response */
1150#define ieee80211_beacon ieee80211_probe_response
1151
1152struct ieee80211_assoc_request_frame {
1153 struct ieee80211_hdr_3addr header;
1154 __le16 capability;
1155 __le16 listen_interval;
1156 /* SSID, supported rates, RSN */
1157 struct ieee80211_info_element info_element[0];
1158} __attribute__ ((packed));
1159
1160struct ieee80211_reassoc_request_frame {
1161 struct ieee80211_hdr_3addr header;
1162 __le16 capability;
1163 __le16 listen_interval;
1164 u8 current_ap[ETH_ALEN];
1165 /* SSID, supported rates, RSN */
1166 struct ieee80211_info_element info_element[0];
1167} __attribute__ ((packed));
1168
1169struct ieee80211_assoc_response_frame {
1170 struct ieee80211_hdr_3addr header;
1171 __le16 capability;
1172 __le16 status;
1173 __le16 aid;
1174 struct ieee80211_info_element info_element[0]; /* supported rates */
1175} __attribute__ ((packed));
1176
1177struct ieee80211_txb {
1178 u8 nr_frags;
1179 u8 encrypted;
1180 u8 queue_index;
1181 u8 rts_included;
1182 u16 reserved;
1183 __le16 frag_size;
1184 __le16 payload_size;
1185 struct sk_buff *fragments[0];
1186};
1187
1188#define MAX_TX_AGG_COUNT 16
1189struct ieee80211_drv_agg_txb {
1190 u8 nr_drv_agg_frames;
1191 struct sk_buff *tx_agg_frames[MAX_TX_AGG_COUNT];
1192} __attribute__((packed));
1193
1194#define MAX_SUBFRAME_COUNT 64
1195struct ieee80211_rxb {
1196 u8 nr_subframes;
1197 struct sk_buff *subframes[MAX_SUBFRAME_COUNT];
1198 u8 dst[ETH_ALEN];
1199 u8 src[ETH_ALEN];
1200} __attribute__((packed));
1201
1202typedef union _frameqos {
1203 u16 shortdata;
1204 u8 chardata[2];
1205 struct {
1206 u16 tid:4;
1207 u16 eosp:1;
1208 u16 ack_policy:2;
1209 u16 reserved:1;
1210 u16 txop:8;
1211 } field;
1212} frameqos, *pframeqos;
1213
1214/* SWEEP TABLE ENTRIES NUMBER*/
1215#define MAX_SWEEP_TAB_ENTRIES 42
1216#define MAX_SWEEP_TAB_ENTRIES_PER_PACKET 7
1217/* MAX_RATES_LENGTH needs to be 12. The spec says 8, and many APs
1218 * only use 8, and then use extended rates for the remaining supported
1219 * rates. Other APs, however, stick all of their supported rates on the
1220 * main rates information element... */
1221#define MAX_RATES_LENGTH ((u8)12)
1222#define MAX_RATES_EX_LENGTH ((u8)16)
1223#define MAX_NETWORK_COUNT 128
1224
1225#define MAX_CHANNEL_NUMBER 161
1226#define IEEE80211_SOFTMAC_SCAN_TIME 100
1227/* (HZ / 2) */
1228#define IEEE80211_SOFTMAC_ASSOC_RETRY_TIME (HZ * 2)
1229
1230#define CRC_LENGTH 4U
1231
1232#define MAX_WPA_IE_LEN 64
1233
1234#define NETWORK_EMPTY_ESSID (1<<0)
1235#define NETWORK_HAS_OFDM (1<<1)
1236#define NETWORK_HAS_CCK (1<<2)
1237
1238/* QoS structure */
1239#define NETWORK_HAS_QOS_PARAMETERS (1<<3)
1240#define NETWORK_HAS_QOS_INFORMATION (1<<4)
1241#define NETWORK_HAS_QOS_MASK (NETWORK_HAS_QOS_PARAMETERS | \
1242 NETWORK_HAS_QOS_INFORMATION)
1243/* 802.11h */
1244#define NETWORK_HAS_POWER_CONSTRAINT (1<<5)
1245#define NETWORK_HAS_CSA (1<<6)
1246#define NETWORK_HAS_QUIET (1<<7)
1247#define NETWORK_HAS_IBSS_DFS (1<<8)
1248#define NETWORK_HAS_TPC_REPORT (1<<9)
1249
1250#define NETWORK_HAS_ERP_VALUE (1<<10)
1251
1252#define QOS_QUEUE_NUM 4
1253#define QOS_OUI_LEN 3
1254#define QOS_OUI_TYPE 2
1255#define QOS_ELEMENT_ID 221
1256#define QOS_OUI_INFO_SUB_TYPE 0
1257#define QOS_OUI_PARAM_SUB_TYPE 1
1258#define QOS_VERSION_1 1
1259#define QOS_AIFSN_MIN_VALUE 2
1260struct ieee80211_qos_information_element {
1261 u8 elementID;
1262 u8 length;
1263 u8 qui[QOS_OUI_LEN];
1264 u8 qui_type;
1265 u8 qui_subtype;
1266 u8 version;
1267 u8 ac_info;
1268} __attribute__ ((packed));
1269
1270struct ieee80211_qos_ac_parameter {
1271 u8 aci_aifsn;
1272 u8 ecw_min_max;
1273 __le16 tx_op_limit;
1274} __attribute__ ((packed));
1275
1276struct ieee80211_qos_parameter_info {
1277 struct ieee80211_qos_information_element info_element;
1278 u8 reserved;
1279 struct ieee80211_qos_ac_parameter ac_params_record[QOS_QUEUE_NUM];
1280} __attribute__ ((packed));
1281
1282struct ieee80211_qos_parameters {
1283 __le16 cw_min[QOS_QUEUE_NUM];
1284 __le16 cw_max[QOS_QUEUE_NUM];
1285 u8 aifs[QOS_QUEUE_NUM];
1286 u8 flag[QOS_QUEUE_NUM];
1287 __le16 tx_op_limit[QOS_QUEUE_NUM];
1288} __attribute__ ((packed));
1289
1290struct ieee80211_qos_data {
1291 struct ieee80211_qos_parameters parameters;
1292 int active;
1293 int supported;
1294 u8 param_count;
1295 u8 old_param_count;
1296};
1297
1298struct ieee80211_tim_parameters {
1299 u8 tim_count;
1300 u8 tim_period;
1301} __attribute__ ((packed));
1302
1303struct ieee80211_wmm_ac_param {
1304 u8 ac_aci_acm_aifsn;
1305 u8 ac_ecwmin_ecwmax;
1306 u16 ac_txop_limit;
1307};
1308
1309struct ieee80211_wmm_ts_info {
1310 u8 ac_dir_tid;
1311 u8 ac_up_psb;
1312 u8 reserved;
1313} __attribute__ ((packed));
1314
1315struct ieee80211_wmm_tspec_elem {
1316 struct ieee80211_wmm_ts_info ts_info;
1317 u16 norm_msdu_size;
1318 u16 max_msdu_size;
1319 u32 min_serv_inter;
1320 u32 max_serv_inter;
1321 u32 inact_inter;
1322 u32 suspen_inter;
1323 u32 serv_start_time;
1324 u32 min_data_rate;
1325 u32 mean_data_rate;
1326 u32 peak_data_rate;
1327 u32 max_burst_size;
1328 u32 delay_bound;
1329 u32 min_phy_rate;
1330 u16 surp_band_allow;
1331 u16 medium_time;
1332} __attribute__((packed));
1333enum eap_type {
1334 EAP_PACKET = 0,
1335 EAPOL_START,
1336 EAPOL_LOGOFF,
1337 EAPOL_KEY,
1338 EAPOL_ENCAP_ASF_ALERT
1339};
1340
1341static const char *eap_types[] = {
1342 [EAP_PACKET] = "EAP-Packet",
1343 [EAPOL_START] = "EAPOL-Start",
1344 [EAPOL_LOGOFF] = "EAPOL-Logoff",
1345 [EAPOL_KEY] = "EAPOL-Key",
1346 [EAPOL_ENCAP_ASF_ALERT] = "EAPOL-Encap-ASF-Alert"
1347};
1348
1349static inline const char *eap_get_type(int type)
1350{
1351 return ((u32)type >= ARRAY_SIZE(eap_types)) ? "Unknown" : eap_types[type];
1352}
1353static inline u8 Frame_QoSTID(u8 *buf)
1354{
1355 struct ieee80211_hdr_3addr *hdr;
1356 u16 fc;
1357 hdr = (struct ieee80211_hdr_3addr *)buf;
1358 fc = le16_to_cpu(hdr->frame_ctl);
1359 return (u8)((frameqos *)(buf + (((fc & IEEE80211_FCTL_TODS) && (fc & IEEE80211_FCTL_FROMDS)) ? 30 : 24)))->field.tid;
1360}
1361
1362
1363struct eapol {
1364 u8 snap[6];
1365 u16 ethertype;
1366 u8 version;
1367 u8 type;
1368 u16 length;
1369} __attribute__ ((packed));
1370
1371struct ieee80211_softmac_stats{
1372 unsigned int rx_ass_ok;
1373 unsigned int rx_ass_err;
1374 unsigned int rx_probe_rq;
1375 unsigned int tx_probe_rs;
1376 unsigned int tx_beacons;
1377 unsigned int rx_auth_rq;
1378 unsigned int rx_auth_rs_ok;
1379 unsigned int rx_auth_rs_err;
1380 unsigned int tx_auth_rq;
1381 unsigned int no_auth_rs;
1382 unsigned int no_ass_rs;
1383 unsigned int tx_ass_rq;
1384 unsigned int rx_ass_rq;
1385 unsigned int tx_probe_rq;
1386 unsigned int reassoc;
1387 unsigned int swtxstop;
1388 unsigned int swtxawake;
1389 unsigned char CurrentShowTxate;
1390 unsigned char last_packet_rate;
1391 unsigned int txretrycount;
1392};
1393
1394#define BEACON_PROBE_SSID_ID_POSITION 12
1395
1396struct ieee80211_info_element_hdr {
1397 u8 id;
1398 u8 len;
1399} __attribute__ ((packed));
1400
1401/*
1402 * These are the data types that can make up management packets
1403 *
1404 u16 auth_algorithm;
1405 u16 auth_sequence;
1406 u16 beacon_interval;
1407 u16 capability;
1408 u8 current_ap[ETH_ALEN];
1409 u16 listen_interval;
1410 struct {
1411 u16 association_id:14, reserved:2;
1412 } __attribute__ ((packed));
1413 u32 time_stamp[2];
1414 u16 reason;
1415 u16 status;
1416*/
1417
1418#define IEEE80211_DEFAULT_TX_ESSID "Penguin"
1419#define IEEE80211_DEFAULT_BASIC_RATE 2 /* 1Mbps */
1420
1421enum {WMM_all_frame, WMM_two_frame, WMM_four_frame, WMM_six_frame};
1422#define MAX_SP_Len (WMM_all_frame << 4)
1423#define IEEE80211_QOS_TID 0x0f
1424#define QOS_CTL_NOTCONTAIN_ACK (0x01 << 5)
1425
1426#define IEEE80211_DTIM_MBCAST 4
1427#define IEEE80211_DTIM_UCAST 2
1428#define IEEE80211_DTIM_VALID 1
1429#define IEEE80211_DTIM_INVALID 0
1430
1431#define IEEE80211_PS_DISABLED 0
1432#define IEEE80211_PS_UNICAST IEEE80211_DTIM_UCAST
1433#define IEEE80211_PS_MBCAST IEEE80211_DTIM_MBCAST
1434
1435
1436#ifdef WMM_Hang_8187
1437#undef WMM_Hang_8187
1438#endif
1439
1440#define WME_AC_BK 0x00
1441#define WME_AC_BE 0x01
1442#define WME_AC_VI 0x02
1443#define WME_AC_VO 0x03
1444#define WME_ACI_MASK 0x03
1445#define WME_AIFSN_MASK 0x03
1446#define WME_AC_PRAM_LEN 16
1447
1448#define MAX_RECEIVE_BUFFER_SIZE 9100
1449
1450/* UP Mapping to AC, using in MgntQuery_SequenceNumber() and maybe for DSCP */
1451#define UP2AC(up) ( \
1452 ((up) < 1) ? WME_AC_BE : \
1453 ((up) < 3) ? WME_AC_BK : \
1454 ((up) < 4) ? WME_AC_BE : \
1455 ((up) < 6) ? WME_AC_VI : \
1456 WME_AC_VO)
1457/* AC Mapping to UP, using in Tx part for selecting the corresponding TX queue */
1458#define AC2UP(_ac) ( \
1459 ((_ac) == WME_AC_VO) ? 6 : \
1460 ((_ac) == WME_AC_VI) ? 5 : \
1461 ((_ac) == WME_AC_BK) ? 1 : \
1462 0)
1463
1464#define ETHER_ADDR_LEN 6 /* length of an Ethernet address */
1465#define ETHERNET_HEADER_SIZE 14 /* length of two Ethernet address plus ether type*/
1466
1467struct ether_header {
1468 u8 ether_dhost[ETHER_ADDR_LEN];
1469 u8 ether_shost[ETHER_ADDR_LEN];
1470 u16 ether_type;
1471} __attribute__((packed));
1472
1473#ifndef ETHERTYPE_PAE
1474#define ETHERTYPE_PAE 0x888e /* EAPOL PAE/802.1x */
1475#endif
1476#ifndef ETHERTYPE_IP
1477#define ETHERTYPE_IP 0x0800 /* IP protocol */
1478#endif
1479
1480typedef struct _bss_ht{
1481
1482 bool support_ht;
1483
1484 /* HT related elements */
1485 u8 ht_cap_buf[32];
1486 u16 ht_cap_len;
1487 u8 ht_info_buf[32];
1488 u16 ht_info_len;
1489
1490 HT_SPEC_VER ht_spec_ver;
1491 /* HT_CAPABILITY_ELE bdHTCapEle; */
1492 /* HT_INFORMATION_ELE bdHTInfoEle; */
1493
1494 bool aggregation;
1495 bool long_slot_time;
1496} bss_ht, *pbss_ht;
1497
1498typedef enum _erp_t{
1499 ERP_NonERPpresent = 0x01,
1500 ERP_UseProtection = 0x02,
1501 ERP_BarkerPreambleMode = 0x04,
1502} erp_t;
1503
1504
1505struct ieee80211_network {
1506 /* These entries are used to identify a unique network */
1507 u8 bssid[ETH_ALEN];
1508 u8 channel;
1509 /* Ensure null-terminated for any debug msgs */
1510 u8 ssid[IW_ESSID_MAX_SIZE + 1];
1511 u8 ssid_len;
1512 struct ieee80211_qos_data qos_data;
1513 bool bWithAironetIE;
1514 bool bCkipSupported;
1515 bool bCcxRmEnable;
1516 u16 CcxRmState[2];
1517 /* CCXv4 S59, MBSSID. */
1518 bool bMBssidValid;
1519 u8 MBssidMask;
1520 u8 MBssid[6];
1521 /* CCX 2 S38, WLAN Device Version Number element. */
1522 bool bWithCcxVerNum;
1523 u8 BssCcxVerNumber;
1524 /* These are network statistics */
1525 struct ieee80211_rx_stats stats;
1526 u16 capability;
1527 u8 rates[MAX_RATES_LENGTH];
1528 u8 rates_len;
1529 u8 rates_ex[MAX_RATES_EX_LENGTH];
1530 u8 rates_ex_len;
1531 unsigned long last_scanned;
1532 u8 mode;
1533 u32 flags;
1534 u32 last_associate;
1535 u32 time_stamp[2];
1536 u16 beacon_interval;
1537 u16 listen_interval;
1538 u16 atim_window;
1539 u8 erp_value;
1540 u8 wpa_ie[MAX_WPA_IE_LEN];
1541 size_t wpa_ie_len;
1542 u8 rsn_ie[MAX_WPA_IE_LEN];
1543 size_t rsn_ie_len;
1544
1545 struct ieee80211_tim_parameters tim;
1546 u8 dtim_period;
1547 u8 dtim_data;
1548 u32 last_dtim_sta_time[2];
1549
1550 /* appeded for QoS */
1551 u8 wmm_info;
1552 struct ieee80211_wmm_ac_param wmm_param[4];
1553 u8 QoS_Enable;
1554#ifdef THOMAS_TURBO
1555 u8 Turbo_Enable;/* enable turbo mode, added by thomas */
1556#endif
1557#ifdef ENABLE_DOT11D
1558 u16 CountryIeLen;
1559 u8 CountryIeBuf[MAX_IE_LEN];
1560#endif
1561 /* HT Related */
1562 BSS_HT bssht;
1563 /* Add to handle broadcom AP management frame CCK rate. */
1564 bool broadcom_cap_exist;
1565 bool ralink_cap_exist;
1566 bool atheros_cap_exist;
1567 bool cisco_cap_exist;
1568 bool unknown_cap_exist;
1569 bool berp_info_valid;
1570 bool buseprotection;
1571 /* put at the end of the structure. */
1572 struct list_head list;
1573};
1574
1575enum ieee80211_state {
1576
1577 /* the card is not linked at all */
1578 IEEE80211_NOLINK = 0,
1579
1580 /* IEEE80211_ASSOCIATING* are for BSS client mode
1581 * the driver shall not perform RX filtering unless
1582 * the state is LINKED.
1583 * The driver shall just check for the state LINKED and
1584 * defaults to NOLINK for ALL the other states (including
1585 * LINKED_SCANNING)
1586 */
1587
1588 /* the association procedure will start (wq scheduling)*/
1589 IEEE80211_ASSOCIATING,
1590 IEEE80211_ASSOCIATING_RETRY,
1591
1592 /* the association procedure is sending AUTH request*/
1593 IEEE80211_ASSOCIATING_AUTHENTICATING,
1594
1595 /* the association procedure has successfully authentcated
1596 * and is sending association request
1597 */
1598 IEEE80211_ASSOCIATING_AUTHENTICATED,
1599
1600 /* the link is ok. the card associated to a BSS or linked
1601 * to a ibss cell or acting as an AP and creating the bss
1602 */
1603 IEEE80211_LINKED,
1604
1605 /* same as LINKED, but the driver shall apply RX filter
1606 * rules as we are in NO_LINK mode. As the card is still
1607 * logically linked, but it is doing a syncro site survey
1608 * then it will be back to LINKED state.
1609 */
1610 IEEE80211_LINKED_SCANNING,
1611
1612};
1613
1614#define DEFAULT_MAX_SCAN_AGE (15 * HZ)
1615#define DEFAULT_FTS 2346
1616
1617#define CFG_IEEE80211_RESERVE_FCS (1<<0)
1618#define CFG_IEEE80211_COMPUTE_FCS (1<<1)
1619#define CFG_IEEE80211_RTS (1<<2)
1620
1621#define IEEE80211_24GHZ_MIN_CHANNEL 1
1622#define IEEE80211_24GHZ_MAX_CHANNEL 14
1623#define IEEE80211_24GHZ_CHANNELS (IEEE80211_24GHZ_MAX_CHANNEL - \
1624 IEEE80211_24GHZ_MIN_CHANNEL + 1)
1625
1626#define IEEE80211_52GHZ_MIN_CHANNEL 34
1627#define IEEE80211_52GHZ_MAX_CHANNEL 165
1628#define IEEE80211_52GHZ_CHANNELS (IEEE80211_52GHZ_MAX_CHANNEL - \
1629 IEEE80211_52GHZ_MIN_CHANNEL + 1)
1630
1631
1632
1633typedef struct tx_pending_t{
1634 int frag;
1635 struct ieee80211_txb *txb;
1636} tx_pending_t;
1637
1638typedef struct _bandwidth_autoswitch {
1639 long threshold_20Mhzto40Mhz;
1640 long threshold_40Mhzto20Mhz;
1641 bool bforced_tx20Mhz;
1642 bool bautoswitch_enable;
1643} bandwidth_autoswitch, *pbandwidth_autoswitch;
1644
1645
1646
1647#define REORDER_WIN_SIZE 128
1648#define REORDER_ENTRY_NUM 128
1649typedef struct _RX_REORDER_ENTRY {
1650 struct list_head List;
1651 u16 SeqNum;
1652 struct ieee80211_rxb *prxb;
1653} RX_REORDER_ENTRY, *PRX_REORDER_ENTRY;
1654
1655typedef enum _Fsync_State {
1656 Default_Fsync,
1657 HW_Fsync,
1658 SW_Fsync
1659} Fsync_State;
1660
1661/* Power save mode configured. */
1662typedef enum _RT_PS_MODE {
1663 eActive, /* Active/Continuous access. */
1664 eMaxPs, /* Max power save mode. */
1665 eFastPs /* Fast power save mode. */
1666} RT_PS_MODE;
1667
1668typedef enum _IPS_CALLBACK_FUNCION {
1669 IPS_CALLBACK_NONE = 0,
1670 IPS_CALLBACK_MGNT_LINK_REQUEST = 1,
1671 IPS_CALLBACK_JOIN_REQUEST = 2,
1672} IPS_CALLBACK_FUNCION;
1673
1674typedef enum _RT_JOIN_ACTION {
1675 RT_JOIN_INFRA = 1,
1676 RT_JOIN_IBSS = 2,
1677 RT_START_IBSS = 3,
1678 RT_NO_ACTION = 4,
1679} RT_JOIN_ACTION;
1680
1681typedef struct _IbssParms {
1682 u16 atimWin;
1683} IbssParms, *PIbssParms;
1684#define MAX_NUM_RATES 264 /* Max num of support rates element: 8, Max num of ext. support rate: 255. 061122, by rcnjko. */
1685
1686/* RF state. */
1687typedef enum _RT_RF_POWER_STATE {
1688 eRfOn,
1689 eRfSleep,
1690 eRfOff
1691} RT_RF_POWER_STATE;
1692
1693typedef struct _RT_POWER_SAVE_CONTROL {
1694
1695 /* Inactive Power Save(IPS) : Disable RF when disconnected */
1696 bool bInactivePs;
1697 bool bIPSModeBackup;
1698 bool bSwRfProcessing;
1699 RT_RF_POWER_STATE eInactivePowerState;
1700 struct work_struct InactivePsWorkItem;
1701 struct timer_list InactivePsTimer;
1702
1703 /* Return point for join action */
1704 IPS_CALLBACK_FUNCION ReturnPoint;
1705
1706 /* Recored Parameters for rescheduled JoinRequest */
1707 bool bTmpBssDesc;
1708 RT_JOIN_ACTION tmpJoinAction;
1709 struct ieee80211_network tmpBssDesc;
1710
1711 /* Recored Parameters for rescheduled MgntLinkRequest */
1712 bool bTmpScanOnly;
1713 bool bTmpActiveScan;
1714 bool bTmpFilterHiddenAP;
1715 bool bTmpUpdateParms;
1716 u8 tmpSsidBuf[33];
1717 OCTET_STRING tmpSsid2Scan;
1718 bool bTmpSsid2Scan;
1719 u8 tmpNetworkType;
1720 u8 tmpChannelNumber;
1721 u16 tmpBcnPeriod;
1722 u8 tmpDtimPeriod;
1723 u16 tmpmCap;
1724 OCTET_STRING tmpSuppRateSet;
1725 u8 tmpSuppRateBuf[MAX_NUM_RATES];
1726 bool bTmpSuppRate;
1727 IbssParms tmpIbpm;
1728 bool bTmpIbpm;
1729
1730 /* Leisre Poswer Save : Disable RF if connected but traffic is not busy */
1731 bool bLeisurePs;
1732
1733} RT_POWER_SAVE_CONTROL, *PRT_POWER_SAVE_CONTROL;
1734
1735typedef u32 RT_RF_CHANGE_SOURCE;
1736#define RF_CHANGE_BY_SW BIT31
1737#define RF_CHANGE_BY_HW BIT30
1738#define RF_CHANGE_BY_PS BIT29
1739#define RF_CHANGE_BY_IPS BIT28
1740#define RF_CHANGE_BY_INIT 0 /* Do not change the RFOff reason. */
1741
1742#ifdef ENABLE_DOT11D
1743typedef enum {
1744 COUNTRY_CODE_FCC = 0,
1745 COUNTRY_CODE_IC = 1,
1746 COUNTRY_CODE_ETSI = 2,
1747 COUNTRY_CODE_SPAIN = 3,
1748 COUNTRY_CODE_FRANCE = 4,
1749 COUNTRY_CODE_MKK = 5,
1750 COUNTRY_CODE_MKK1 = 6,
1751 COUNTRY_CODE_ISRAEL = 7,
1752 COUNTRY_CODE_TELEC,
1753 COUNTRY_CODE_MIC,
1754 COUNTRY_CODE_GLOBAL_DOMAIN
1755} country_code_type_t;
1756#endif
1757
1758#define RT_MAX_LD_SLOT_NUM 10
1759typedef struct _RT_LINK_DETECT_T {
1760
1761 u32 NumRecvBcnInPeriod;
1762 u32 NumRecvDataInPeriod;
1763
1764 u32 RxBcnNum[RT_MAX_LD_SLOT_NUM]; /* number of Rx beacon / CheckForHang_period to determine link status */
1765 u32 RxDataNum[RT_MAX_LD_SLOT_NUM]; /* number of Rx data / CheckForHang_period to determine link status */
1766 u16 SlotNum; /* number of CheckForHang period to determine link status */
1767 u16 SlotIndex;
1768
1769 u32 NumTxOkInPeriod;
1770 u32 NumRxOkInPeriod;
1771 bool bBusyTraffic;
1772} RT_LINK_DETECT_T, *PRT_LINK_DETECT_T;
1773
1774
1775struct ieee80211_device {
1776 struct net_device *dev;
1777 struct ieee80211_security sec;
1778
1779 /* hw security related */
1780 u8 hwsec_active; /* hw security active. */
1781 bool is_silent_reset;
1782 bool ieee_up;
1783 bool bSupportRemoteWakeUp;
1784 RT_PS_MODE dot11PowerSaveMode; /* Power save mode configured. */
1785 bool actscanning;
1786 bool beinretry;
1787 RT_RF_POWER_STATE eRFPowerState;
1788 RT_RF_CHANGE_SOURCE RfOffReason;
1789 bool is_set_key;
1790 /* 11n spec related I wonder if These info structure need to be moved out of ieee80211_device */
1791
1792 /* 11n HT below */
1793 PRT_HIGH_THROUGHPUT pHTInfo;
1794 spinlock_t bw_spinlock;
1795
1796 spinlock_t reorder_spinlock;
1797 /* for HT operation rate set. we use this one for HT data rate to
1798 * separate different descriptors
1799 * the way fill this is the same as in the IE
1800 */
1801 u8 Regdot11HTOperationalRateSet[16]; /* use RATR format */
1802 u8 dot11HTOperationalRateSet[16]; /* use RATR format */
1803 u8 RegHTSuppRateSet[16];
1804 u8 HTCurrentOperaRate;
1805 u8 HTHighestOperaRate;
1806 /* wb added for rate operation mode to firmware */
1807 u8 bTxDisableRateFallBack;
1808 u8 bTxUseDriverAssingedRate;
1809 atomic_t atm_chnlop;
1810 atomic_t atm_swbw;
1811
1812 /* 802.11e and WMM Traffic Stream Info (TX) */
1813 struct list_head Tx_TS_Admit_List;
1814 struct list_head Tx_TS_Pending_List;
1815 struct list_head Tx_TS_Unused_List;
1816 TX_TS_RECORD TxTsRecord[TOTAL_TS_NUM];
1817 /* 802.11e and WMM Traffic Stream Info (RX) */
1818 struct list_head Rx_TS_Admit_List;
1819 struct list_head Rx_TS_Pending_List;
1820 struct list_head Rx_TS_Unused_List;
1821 RX_TS_RECORD RxTsRecord[TOTAL_TS_NUM];
1822 RX_REORDER_ENTRY RxReorderEntry[128];
1823 struct list_head RxReorder_Unused_List;
1824 /* Qos related. */
1825/* PSTA_QOS pStaQos; */
1826 u8 ForcedPriority; /* Force per-packet priority 1~7. (default: 0, not to force it.) */
1827
1828
1829 /* Bookkeeping structures */
1830 struct net_device_stats stats;
1831 struct ieee80211_stats ieee_stats;
1832 struct ieee80211_softmac_stats softmac_stats;
1833
1834 /* Probe / Beacon management */
1835 struct list_head network_free_list;
1836 struct list_head network_list;
1837 struct ieee80211_network *networks;
1838 int scans;
1839 int scan_age;
1840
1841 int iw_mode; /* operating mode (IW_MODE_*) */
1842 struct iw_spy_data spy_data;
1843
1844 spinlock_t lock;
1845 spinlock_t wpax_suitlist_lock;
1846
1847 int tx_headroom; /* Set to size of any additional room needed at front
1848 * of allocated Tx SKBs */
1849 u32 config;
1850
1851 /* WEP and other encryption related settings at the device level */
1852 int open_wep; /* Set to 1 to allow unencrypted frames */
1853 int auth_mode;
1854 int reset_on_keychange; /* Set to 1 if the HW needs to be reset on
1855 * WEP key changes */
1856
1857 /* If the host performs {en,de}cryption, then set to 1 */
1858 int host_encrypt;
1859 int host_encrypt_msdu;
1860 int host_decrypt;
1861 /* host performs multicast decryption */
1862 int host_mc_decrypt;
1863
1864 /* host should strip IV and ICV from protected frames */
1865 /* meaningful only when hardware decryption is being used */
1866 int host_strip_iv_icv;
1867
1868 int host_open_frag;
1869 int host_build_iv;
1870 int ieee802_1x; /* is IEEE 802.1X used */
1871
1872 /* WPA data */
1873 bool bHalfWirelessN24GMode;
1874 int wpa_enabled;
1875 int drop_unencrypted;
1876 int tkip_countermeasures;
1877 int privacy_invoked;
1878 size_t wpa_ie_len;
1879 u8 *wpa_ie;
1880 u8 ap_mac_addr[6];
1881 u16 pairwise_key_type;
1882 u16 group_key_type;
1883 struct list_head crypt_deinit_list;
1884 struct ieee80211_crypt_data *crypt[WEP_KEYS];
1885 int tx_keyidx; /* default TX key index (crypt[tx_keyidx]) */
1886 struct timer_list crypt_deinit_timer;
1887 int crypt_quiesced;
1888
1889 int bcrx_sta_key; /* use individual keys to override default keys even
1890 * with RX of broad/multicast frames */
1891
1892 /* Fragmentation structures */
1893 /* each streaming contain a entry */
1894 struct ieee80211_frag_entry frag_cache[17][IEEE80211_FRAG_CACHE_LEN];
1895 unsigned int frag_next_idx[17];
1896 u16 fts; /* Fragmentation Threshold */
1897#define DEFAULT_RTS_THRESHOLD 2346U
1898#define MIN_RTS_THRESHOLD 1
1899#define MAX_RTS_THRESHOLD 2346U
1900 u16 rts; /* RTS threshold */
1901
1902 /* Association info */
1903 u8 bssid[ETH_ALEN];
1904
1905 /* This stores infos for the current network.
1906 * Either the network we are associated in INFRASTRUCTURE
1907 * or the network that we are creating in MASTER mode.
1908 * ad-hoc is a mixture ;-).
1909 * Note that in infrastructure mode, even when not associated,
1910 * fields bssid and essid may be valid (if wpa_set and essid_set
1911 * are true) as thy carry the value set by the user via iwconfig
1912 */
1913 struct ieee80211_network current_network;
1914
1915 enum ieee80211_state state;
1916
1917 int short_slot;
1918 int reg_mode;
1919 int mode; /* A, B, G */
1920 int modulation; /* CCK, OFDM */
1921 int freq_band; /* 2.4Ghz, 5.2Ghz, Mixed */
1922 int abg_true; /* ABG flag */
1923
1924 /* used for forcing the ibss workqueue to terminate
1925 * without wait for the syncro scan to terminate
1926 */
1927 short sync_scan_hurryup;
1928
1929 int perfect_rssi;
1930 int worst_rssi;
1931
1932 u16 prev_seq_ctl; /* used to drop duplicate frames */
1933
1934 /* map of allowed channels. 0 is dummy */
1935 /* FIXME: remeber to default to a basic channel plan depending of the PHY type */
1936#ifdef ENABLE_DOT11D
1937 void *pDot11dInfo;
1938 bool bGlobalDomain;
1939#else
1940 int channel_map[MAX_CHANNEL_NUMBER+1];
1941#endif
1942 int rate; /* current rate */
1943 int basic_rate;
1944 /* FIXME: pleace callback, see if redundant with softmac_features */
1945 short active_scan;
1946
1947 /* this contains flags for selectively enable softmac support */
1948 u16 softmac_features;
1949
1950 /* if the sequence control field is not filled by HW */
1951 u16 seq_ctrl[5];
1952
1953 /* association procedure transaction sequence number */
1954 u16 associate_seq;
1955
1956 /* AID for RTXed association responses */
1957 u16 assoc_id;
1958
1959 /* power save mode related*/
1960 short ps;
1961 short sta_sleep;
1962 int ps_timeout;
1963 int ps_period;
1964 struct tasklet_struct ps_task;
1965 u32 ps_th;
1966 u32 ps_tl;
1967
1968 short raw_tx;
1969 /* used if IEEE_SOFTMAC_TX_QUEUE is set */
1970 short queue_stop;
1971 short scanning;
1972 short proto_started;
1973
1974 struct semaphore wx_sem;
1975 struct semaphore scan_sem;
1976
1977 spinlock_t mgmt_tx_lock;
1978 spinlock_t beacon_lock;
1979
1980 short beacon_txing;
1981
1982 short wap_set;
1983 short ssid_set;
1984
1985 u8 wpax_type_set;
1986 u32 wpax_type_notify;
1987
1988 /* QoS related flag */
1989 char init_wmmparam_flag;
1990 /* set on initialization */
1991 u8 qos_support;
1992
1993 /* for discarding duplicated packets in IBSS */
1994 struct list_head ibss_mac_hash[IEEE_IBSS_MAC_HASH_SIZE];
1995
1996 /* for discarding duplicated packets in BSS */
1997 u16 last_rxseq_num[17]; /* rx seq previous per-tid */
1998 u16 last_rxfrag_num[17];/* tx frag previous per-tid */
1999 unsigned long last_packet_time[17];
2000
2001 /* for PS mode */
2002 unsigned long last_rx_ps_time;
2003
2004 /* used if IEEE_SOFTMAC_SINGLE_QUEUE is set */
2005 struct sk_buff *mgmt_queue_ring[MGMT_QUEUE_NUM];
2006 int mgmt_queue_head;
2007 int mgmt_queue_tail;
2008/* added for rtl819x */
2009#define IEEE80211_QUEUE_LIMIT 128
2010 u8 AsocRetryCount;
2011 unsigned int hw_header;
2012 struct sk_buff_head skb_waitQ[MAX_QUEUE_SIZE];
2013 struct sk_buff_head skb_aggQ[MAX_QUEUE_SIZE];
2014 struct sk_buff_head skb_drv_aggQ[MAX_QUEUE_SIZE];
2015 u32 sta_edca_param[4];
2016 bool aggregation;
2017 /* Enable/Disable Rx immediate BA capability. */
2018 bool enable_rx_imm_BA;
2019 bool bibsscoordinator;
2020
2021 /*+by amy for DM ,080515 */
2022 /* Dynamic Tx power for near/far range enable/Disable */
2023 bool bdynamic_txpower_enable;
2024
2025 bool bCTSToSelfEnable;
2026 u8 CTSToSelfTH;
2027
2028 u32 fsync_time_interval;
2029 u32 fsync_rate_bitmap;
2030 u8 fsync_rssi_threshold;
2031 bool bfsync_enable;
2032
2033 u8 fsync_multiple_timeinterval; /* FsyncMultipleTimeInterval * FsyncTimeInterval */
2034 u32 fsync_firstdiff_ratethreshold; /* low threshold */
2035 u32 fsync_seconddiff_ratethreshold; /* decrease threshold */
2036 Fsync_State fsync_state;
2037 bool bis_any_nonbepkts;
2038 /* 20Mhz 40Mhz AutoSwitch Threshold */
2039 bandwidth_autoswitch bandwidth_auto_switch;
2040 /* for txpower tracking */
2041 bool FwRWRF;
2042
2043 /* added by amy for AP roaming */
2044 RT_LINK_DETECT_T LinkDetectInfo;
2045 /* added by amy for ps */
2046 RT_POWER_SAVE_CONTROL PowerSaveControl;
2047 /* used if IEEE_SOFTMAC_TX_QUEUE is set */
2048 struct tx_pending_t tx_pending;
2049
2050 /* used if IEEE_SOFTMAC_ASSOCIATE is set */
2051 struct timer_list associate_timer;
2052
2053 /* used if IEEE_SOFTMAC_BEACONS is set */
2054 struct timer_list beacon_timer;
2055 struct work_struct associate_complete_wq;
2056 struct work_struct associate_procedure_wq;
2057 struct delayed_work softmac_scan_wq;
2058 struct delayed_work associate_retry_wq;
2059 struct delayed_work start_ibss_wq;
2060 struct work_struct wx_sync_scan_wq;
2061 struct workqueue_struct *wq;
2062 /* Qos related. Added by Annie, 2005-11-01. */
2063 /* STA_QOS StaQos; */
2064
2065
2066 /* Callback functions */
2067 void (*set_security)(struct net_device *dev,
2068 struct ieee80211_security *sec);
2069
2070 /* Used to TX data frame by using txb structs.
2071 * this is not used if in the softmac_features
2072 * is set the flag IEEE_SOFTMAC_TX_QUEUE
2073 */
2074 int (*hard_start_xmit)(struct ieee80211_txb *txb,
2075 struct net_device *dev);
2076
2077 int (*reset_port)(struct net_device *dev);
2078 int (*is_queue_full) (struct net_device *dev, int pri);
2079
2080 int (*handle_management) (struct net_device *dev,
2081 struct ieee80211_network *network, u16 type);
2082 int (*is_qos_active) (struct net_device *dev, struct sk_buff *skb);
2083
2084 /* Softmac-generated frames (mamagement) are TXed via this
2085 * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is
2086 * not set. As some cards may have different HW queues that
2087 * one might want to use for data and management frames
2088 * the option to have two callbacks might be useful.
2089 * This fucntion can't sleep.
2090 */
2091 int (*softmac_hard_start_xmit)(struct sk_buff *skb,
2092 struct net_device *dev);
2093
2094 /* used instead of hard_start_xmit (not softmac_hard_start_xmit)
2095 * if the IEEE_SOFTMAC_TX_QUEUE feature is used to TX data
2096 * frames. I the option IEEE_SOFTMAC_SINGLE_QUEUE is also set
2097 * then also management frames are sent via this callback.
2098 * This function can't sleep.
2099 */
2100 void (*softmac_data_hard_start_xmit)(struct sk_buff *skb,
2101 struct net_device *dev, int rate);
2102
2103 /* stops the HW queue for DATA frames. Useful to avoid
2104 * waste time to TX data frame when we are reassociating
2105 * This function can sleep.
2106 */
2107 void (*data_hard_stop)(struct net_device *dev);
2108
2109 /* OK this is complementar to data_poll_hard_stop */
2110 void (*data_hard_resume)(struct net_device *dev);
2111
2112 /* ask to the driver to retune the radio .
2113 * This function can sleep. the driver should ensure
2114 * the radio has been swithced before return.
2115 */
2116 void (*set_chan)(struct net_device *dev, short ch);
2117
2118 /* These are not used if the ieee stack takes care of
2119 * scanning (IEEE_SOFTMAC_SCAN feature set).
2120 * In this case only the set_chan is used.
2121 *
2122 * The syncro version is similar to the start_scan but
2123 * does not return until all channels has been scanned.
2124 * this is called in user context and should sleep,
2125 * it is called in a work_queue when swithcing to ad-hoc mode
2126 * or in behalf of iwlist scan when the card is associated
2127 * and root user ask for a scan.
2128 * the fucntion stop_scan should stop both the syncro and
2129 * background scanning and can sleep.
2130 * The fucntion start_scan should initiate the background
2131 * scanning and can't sleep.
2132 */
2133 void (*scan_syncro)(struct net_device *dev);
2134 void (*start_scan)(struct net_device *dev);
2135 void (*stop_scan)(struct net_device *dev);
2136
2137 /* indicate the driver that the link state is changed
2138 * for example it may indicate the card is associated now.
2139 * Driver might be interested in this to apply RX filter
2140 * rules or simply light the LINK led
2141 */
2142 void (*link_change)(struct net_device *dev);
2143
2144 /* these two function indicates to the HW when to start
2145 * and stop to send beacons. This is used when the
2146 * IEEE_SOFTMAC_BEACONS is not set. For now the
2147 * stop_send_bacons is NOT guaranteed to be called only
2148 * after start_send_beacons.
2149 */
2150 void (*start_send_beacons) (struct net_device *dev, u16 tx_rate);
2151 void (*stop_send_beacons) (struct net_device *dev);
2152
2153 /* power save mode related */
2154 void (*sta_wake_up) (struct net_device *dev);
2155 void (*ps_request_tx_ack) (struct net_device *dev);
2156 void (*enter_sleep_state) (struct net_device *dev, u32 th, u32 tl);
2157 short (*ps_is_queue_empty) (struct net_device *dev);
2158 int (*handle_beacon) (struct net_device *dev, struct ieee80211_beacon *beacon, struct ieee80211_network *network);
2159 int (*handle_assoc_response) (struct net_device *dev, struct ieee80211_assoc_response_frame *resp, struct ieee80211_network *network);
2160
2161
2162 /* check whether Tx hw resouce available */
2163 short (*check_nic_enough_desc)(struct net_device *dev, int queue_index);
2164 /* added by wb for HT related */
2165 void (*SetBWModeHandler)(struct net_device *dev, HT_CHANNEL_WIDTH Bandwidth, HT_EXTCHNL_OFFSET Offset);
2166 bool (*GetNmodeSupportBySecCfg)(struct net_device *dev);
2167 void (*SetWirelessMode)(struct net_device *dev, u8 wireless_mode);
2168 bool (*GetHalfNmodeSupportByAPsHandler)(struct net_device *dev);
2169 void (*InitialGainHandler)(struct net_device *dev, u8 Operation);
2170
2171 /* This must be the last item so that it points to the data
2172 * allocated beyond this structure by alloc_ieee80211 */
2173 u8 priv[0];
2174};
2175
2176#define IEEE_A (1<<0)
2177#define IEEE_B (1<<1)
2178#define IEEE_G (1<<2)
2179#define IEEE_N_24G (1<<4)
2180#define IEEE_N_5G (1<<5)
2181#define IEEE_MODE_MASK (IEEE_A|IEEE_B|IEEE_G)
2182
2183/* Generate a 802.11 header */
2184
2185/* Uses the channel change callback directly
2186 * instead of [start/stop] scan callbacks
2187 */
2188#define IEEE_SOFTMAC_SCAN (1<<2)
2189
2190/* Perform authentication and association handshake */
2191#define IEEE_SOFTMAC_ASSOCIATE (1<<3)
2192
2193/* Generate probe requests */
2194#define IEEE_SOFTMAC_PROBERQ (1<<4)
2195
2196/* Generate respones to probe requests */
2197#define IEEE_SOFTMAC_PROBERS (1<<5)
2198
2199/* The ieee802.11 stack will manages the netif queue
2200 * wake/stop for the driver, taking care of 802.11
2201 * fragmentation. See softmac.c for details. */
2202#define IEEE_SOFTMAC_TX_QUEUE (1<<7)
2203
2204/* Uses only the softmac_data_hard_start_xmit
2205 * even for TX management frames.
2206 */
2207#define IEEE_SOFTMAC_SINGLE_QUEUE (1<<8)
2208
2209/* Generate beacons. The stack will enqueue beacons
2210 * to the card
2211 */
2212#define IEEE_SOFTMAC_BEACONS (1<<6)
2213
2214static inline void *ieee80211_priv(struct net_device *dev)
2215{
2216 return ((struct ieee80211_device *)netdev_priv(dev))->priv;
2217}
2218
2219extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len)
2220{
2221 /* Single white space is for Linksys APs */
2222 if (essid_len == 1 && essid[0] == ' ')
2223 return 1;
2224
2225 /* Otherwise, if the entire essid is 0, we assume it is hidden */
2226 while (essid_len) {
2227 essid_len--;
2228 if (essid[essid_len] != '\0')
2229 return 0;
2230 }
2231
2232 return 1;
2233}
2234
2235extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode)
2236{
2237 /*
2238 * It is possible for both access points and our device to support
2239 * combinations of modes, so as long as there is one valid combination
2240 * of ap/device supported modes, then return success
2241 *
2242 */
2243 if ((mode & IEEE_A) &&
2244 (ieee->modulation & IEEE80211_OFDM_MODULATION) &&
2245 (ieee->freq_band & IEEE80211_52GHZ_BAND))
2246 return 1;
2247
2248 if ((mode & IEEE_G) &&
2249 (ieee->modulation & IEEE80211_OFDM_MODULATION) &&
2250 (ieee->freq_band & IEEE80211_24GHZ_BAND))
2251 return 1;
2252
2253 if ((mode & IEEE_B) &&
2254 (ieee->modulation & IEEE80211_CCK_MODULATION) &&
2255 (ieee->freq_band & IEEE80211_24GHZ_BAND))
2256 return 1;
2257
2258 return 0;
2259}
2260
2261extern inline int ieee80211_get_hdrlen(u16 fc)
2262{
2263 int hdrlen = IEEE80211_3ADDR_LEN;
2264
2265 switch (WLAN_FC_GET_TYPE(fc)) {
2266 case IEEE80211_FTYPE_DATA:
2267 if ((fc & IEEE80211_FCTL_FROMDS) && (fc & IEEE80211_FCTL_TODS))
2268 hdrlen = IEEE80211_4ADDR_LEN; /* Addr4 */
2269 if (IEEE80211_QOS_HAS_SEQ(fc))
2270 hdrlen += 2; /* QOS ctrl*/
2271 break;
2272 case IEEE80211_FTYPE_CTL:
2273 switch (WLAN_FC_GET_STYPE(fc)) {
2274 case IEEE80211_STYPE_CTS:
2275 case IEEE80211_STYPE_ACK:
2276 hdrlen = IEEE80211_1ADDR_LEN;
2277 break;
2278 default:
2279 hdrlen = IEEE80211_2ADDR_LEN;
2280 break;
2281 }
2282 break;
2283 }
2284
2285 return hdrlen;
2286}
2287
2288static inline u8 *ieee80211_get_payload(struct ieee80211_hdr *hdr)
2289{
2290 switch (ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl))) {
2291 case IEEE80211_1ADDR_LEN:
2292 return ((struct ieee80211_hdr_1addr *)hdr)->payload;
2293 case IEEE80211_2ADDR_LEN:
2294 return ((struct ieee80211_hdr_2addr *)hdr)->payload;
2295 case IEEE80211_3ADDR_LEN:
2296 return ((struct ieee80211_hdr_3addr *)hdr)->payload;
2297 case IEEE80211_4ADDR_LEN:
2298 return ((struct ieee80211_hdr_4addr *)hdr)->payload;
2299 }
2300 return NULL;
2301}
2302
2303static inline int ieee80211_is_ofdm_rate(u8 rate)
2304{
2305 switch (rate & ~IEEE80211_BASIC_RATE_MASK) {
2306 case IEEE80211_OFDM_RATE_6MB:
2307 case IEEE80211_OFDM_RATE_9MB:
2308 case IEEE80211_OFDM_RATE_12MB:
2309 case IEEE80211_OFDM_RATE_18MB:
2310 case IEEE80211_OFDM_RATE_24MB:
2311 case IEEE80211_OFDM_RATE_36MB:
2312 case IEEE80211_OFDM_RATE_48MB:
2313 case IEEE80211_OFDM_RATE_54MB:
2314 return 1;
2315 }
2316 return 0;
2317}
2318
2319static inline int ieee80211_is_cck_rate(u8 rate)
2320{
2321 switch (rate & ~IEEE80211_BASIC_RATE_MASK) {
2322 case IEEE80211_CCK_RATE_1MB:
2323 case IEEE80211_CCK_RATE_2MB:
2324 case IEEE80211_CCK_RATE_5MB:
2325 case IEEE80211_CCK_RATE_11MB:
2326 return 1;
2327 }
2328 return 0;
2329}
2330
2331
2332/* ieee80211.c */
2333extern void free_ieee80211(struct net_device *dev);
2334extern struct net_device *alloc_ieee80211(int sizeof_priv);
2335
2336extern int ieee80211_set_encryption(struct ieee80211_device *ieee);
2337
2338/* ieee80211_tx.c */
2339
2340extern int ieee80211_encrypt_fragment(
2341 struct ieee80211_device *ieee,
2342 struct sk_buff *frag,
2343 int hdr_len);
2344
2345extern int ieee80211_xmit(struct sk_buff *skb,
2346 struct net_device *dev);
2347extern void ieee80211_txb_free(struct ieee80211_txb *);
2348
2349
2350/* ieee80211_rx.c */
2351extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
2352 struct ieee80211_rx_stats *rx_stats);
2353extern void ieee80211_rx_mgt(struct ieee80211_device *ieee,
2354 struct ieee80211_hdr_4addr *header,
2355 struct ieee80211_rx_stats *stats);
2356
2357/* ieee80211_wx.c */
2358extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee,
2359 struct iw_request_info *info,
2360 union iwreq_data *wrqu, char *key);
2361extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee,
2362 struct iw_request_info *info,
2363 union iwreq_data *wrqu, char *key);
2364extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee,
2365 struct iw_request_info *info,
2366 union iwreq_data *wrqu, char *key);
2367#if WIRELESS_EXT >= 18
2368extern int ieee80211_wx_get_encode_ext(struct ieee80211_device *ieee,
2369 struct iw_request_info *info,
2370 union iwreq_data *wrqu, char *extra);
2371extern int ieee80211_wx_set_encode_ext(struct ieee80211_device *ieee,
2372 struct iw_request_info *info,
2373 union iwreq_data *wrqu, char *extra);
2374extern int ieee80211_wx_set_auth(struct ieee80211_device *ieee,
2375 struct iw_request_info *info,
2376 struct iw_param *data, char *extra);
2377extern int ieee80211_wx_set_mlme(struct ieee80211_device *ieee,
2378 struct iw_request_info *info,
2379 union iwreq_data *wrqu, char *extra);
2380#endif
2381extern int ieee80211_wx_set_gen_ie(struct ieee80211_device *ieee, u8 *ie, size_t len);
2382
2383/* ieee80211_softmac.c */
2384extern short ieee80211_is_54g(struct ieee80211_network net);
2385extern short ieee80211_is_shortslot(struct ieee80211_network net);
2386extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb,
2387 struct ieee80211_rx_stats *rx_stats, u16 type,
2388 u16 stype);
2389extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net);
2390
2391void SendDisassociation(struct ieee80211_device *ieee, u8* asSta, u8 asRsn);
2392extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee);
2393
2394extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee);
2395extern void notify_wx_assoc_event(struct ieee80211_device *ieee);
2396extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee);
2397extern void ieee80211_start_bss(struct ieee80211_device *ieee);
2398extern void ieee80211_start_master_bss(struct ieee80211_device *ieee);
2399extern void ieee80211_start_ibss(struct ieee80211_device *ieee);
2400extern void ieee80211_softmac_init(struct ieee80211_device *ieee);
2401extern void ieee80211_softmac_free(struct ieee80211_device *ieee);
2402extern void ieee80211_associate_abort(struct ieee80211_device *ieee);
2403extern void ieee80211_disassociate(struct ieee80211_device *ieee);
2404extern void ieee80211_stop_scan(struct ieee80211_device *ieee);
2405extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee);
2406extern void ieee80211_check_all_nets(struct ieee80211_device *ieee);
2407extern void ieee80211_start_protocol(struct ieee80211_device *ieee);
2408extern void ieee80211_stop_protocol(struct ieee80211_device *ieee);
2409extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee);
2410extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee);
2411extern void ieee80211_reset_queue(struct ieee80211_device *ieee);
2412extern void ieee80211_wake_queue(struct ieee80211_device *ieee);
2413extern void ieee80211_stop_queue(struct ieee80211_device *ieee);
2414extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee);
2415extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee);
2416extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee);
2417extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p);
2418extern void notify_wx_assoc_event(struct ieee80211_device *ieee);
2419extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success);
2420
2421extern void softmac_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee);
2422
2423/* ieee80211_crypt_ccmp&tkip&wep.c */
2424extern void ieee80211_tkip_null(void);
2425extern void ieee80211_wep_null(void);
2426extern void ieee80211_ccmp_null(void);
2427
2428/* ieee80211_softmac_wx.c */
2429
2430extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee,
2431 struct iw_request_info *info,
2432 union iwreq_data *wrqu, char *ext);
2433
2434extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee,
2435 struct iw_request_info *info,
2436 union iwreq_data *awrq,
2437 char *extra);
2438
2439extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee,
2440 struct iw_request_info *a,
2441 union iwreq_data *wrqu, char *b);
2442
2443extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee,
2444 struct iw_request_info *info,
2445 union iwreq_data *wrqu, char *extra);
2446
2447extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee,
2448 struct iw_request_info *info,
2449 union iwreq_data *wrqu, char *extra);
2450
2451extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a,
2452 union iwreq_data *wrqu, char *b);
2453
2454extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a,
2455 union iwreq_data *wrqu, char *b);
2456
2457extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee,
2458 struct iw_request_info *a,
2459 union iwreq_data *wrqu, char *extra);
2460
2461extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a,
2462 union iwreq_data *wrqu, char *b);
2463
2464extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a,
2465 union iwreq_data *wrqu, char *b);
2466
2467extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a,
2468 union iwreq_data *wrqu, char *b);
2469
2470extern void ieee80211_wx_sync_scan_wq(struct work_struct *work);
2471
2472
2473extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee,
2474 struct iw_request_info *info,
2475 union iwreq_data *wrqu, char *extra);
2476
2477extern int ieee80211_wx_get_name(struct ieee80211_device *ieee,
2478 struct iw_request_info *info,
2479 union iwreq_data *wrqu, char *extra);
2480
2481extern int ieee80211_wx_set_power(struct ieee80211_device *ieee,
2482 struct iw_request_info *info,
2483 union iwreq_data *wrqu, char *extra);
2484
2485extern int ieee80211_wx_get_power(struct ieee80211_device *ieee,
2486 struct iw_request_info *info,
2487 union iwreq_data *wrqu, char *extra);
2488
2489extern int ieee80211_wx_set_rts(struct ieee80211_device *ieee,
2490 struct iw_request_info *info,
2491 union iwreq_data *wrqu, char *extra);
2492
2493extern int ieee80211_wx_get_rts(struct ieee80211_device *ieee,
2494 struct iw_request_info *info,
2495 union iwreq_data *wrqu, char *extra);
2496/* HT */
2497#define MAX_RECEIVE_BUFFER_SIZE 9100
2498extern void HTDebugHTCapability(u8 *CapIE, u8 *TitleString);
2499extern void HTDebugHTInfo(u8 *InfoIE, u8 *TitleString);
2500
2501void HTSetConnectBwMode(struct ieee80211_device *ieee, HT_CHANNEL_WIDTH Bandwidth, HT_EXTCHNL_OFFSET Offset);
2502extern void HTUpdateDefaultSetting(struct ieee80211_device *ieee);
2503extern void HTConstructCapabilityElement(struct ieee80211_device *ieee, u8 *posHTCap, u8 *len, u8 isEncrypt);
2504extern void HTConstructInfoElement(struct ieee80211_device *ieee, u8 *posHTInfo, u8 *len, u8 isEncrypt);
2505extern void HTConstructRT2RTAggElement(struct ieee80211_device *ieee, u8 *posRT2RTAgg, u8 *len);
2506extern void HTOnAssocRsp(struct ieee80211_device *ieee);
2507extern void HTInitializeHTInfo(struct ieee80211_device *ieee);
2508extern void HTInitializeBssDesc(PBSS_HT pBssHT);
2509extern void HTResetSelfAndSavePeerSetting(struct ieee80211_device *ieee, struct ieee80211_network *pNetwork);
2510extern void HTUpdateSelfAndPeerSetting(struct ieee80211_device *ieee, struct ieee80211_network *pNetwork);
2511extern u8 HTGetHighestMCSRate(struct ieee80211_device *ieee, u8 *pMCSRateSet, u8 *pMCSFilter);
2512extern u8 MCS_FILTER_ALL[];
2513extern u16 MCS_DATA_RATE[2][2][77] ;
2514extern u8 HTCCheck(struct ieee80211_device *ieee, u8 *pFrame);
2515extern void HTResetIOTSetting(PRT_HIGH_THROUGHPUT pHTInfo);
2516extern bool IsHTHalfNmodeAPs(struct ieee80211_device *ieee);
2517extern u16 HTHalfMcsToDataRate(struct ieee80211_device *ieee, u8 nMcsRate);
2518extern u16 HTMcsToDataRate(struct ieee80211_device *ieee, u8 nMcsRate);
2519extern u16 TxCountToDataRate(struct ieee80211_device *ieee, u8 nDataRate);
2520/* function in BAPROC.c */
2521extern int ieee80211_rx_ADDBAReq(struct ieee80211_device *ieee, struct sk_buff *skb);
2522extern int ieee80211_rx_ADDBARsp(struct ieee80211_device *ieee, struct sk_buff *skb);
2523extern int ieee80211_rx_DELBA(struct ieee80211_device *ieee, struct sk_buff *skb);
2524extern void TsInitAddBA(struct ieee80211_device *ieee, PTX_TS_RECORD pTS, u8 Policy, u8 bOverwritePending);
2525extern void TsInitDelBA(struct ieee80211_device *ieee, PTS_COMMON_INFO pTsCommonInfo, TR_SELECT TxRxSelect);
2526extern void BaSetupTimeOut(unsigned long data);
2527extern void TxBaInactTimeout(unsigned long data);
2528extern void RxBaInactTimeout(unsigned long data);
2529extern void ResetBaEntry(PBA_RECORD pBA);
2530/* function in TS.c */
2531extern bool GetTs(
2532 struct ieee80211_device *ieee,
2533 PTS_COMMON_INFO *ppTS,
2534 u8 *Addr,
2535 u8 TID,
2536 TR_SELECT TxRxSelect, /* Rx:1, Tx:0 */
2537 bool bAddNewTs
2538 );
2539extern void TSInitialize(struct ieee80211_device *ieee);
2540extern void TsStartAddBaProcess(struct ieee80211_device *ieee, PTX_TS_RECORD pTxTS);
2541extern void RemovePeerTS(struct ieee80211_device *ieee, u8 *Addr);
2542extern void RemoveAllTS(struct ieee80211_device *ieee);
2543void ieee80211_softmac_scan_syncro(struct ieee80211_device *ieee);
2544
2545extern const long ieee80211_wlan_frequencies[];
2546
2547extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee)
2548{
2549 ieee->scans++;
2550}
2551
2552extern inline int ieee80211_get_scans(struct ieee80211_device *ieee)
2553{
2554 return ieee->scans;
2555}
2556
2557static inline const char *escape_essid(const char *essid, u8 essid_len)
2558{
2559 static char escaped[IW_ESSID_MAX_SIZE * 2 + 1];
2560 const char *s = essid;
2561 char *d = escaped;
2562
2563 if (ieee80211_is_empty_essid(essid, essid_len)) {
2564 memcpy(escaped, "<hidden>", sizeof("<hidden>"));
2565 return escaped;
2566 }
2567
2568 essid_len = min(essid_len, (u8)IW_ESSID_MAX_SIZE);
2569 while (essid_len--) {
2570 if (*s == '\0') {
2571 *d++ = '\\';
2572 *d++ = '0';
2573 s++;
2574 } else {
2575 *d++ = *s++;
2576 }
2577 }
2578 *d = '\0';
2579 return escaped;
2580}
2581
2582/* For the function is more related to hardware setting, it's better to use the
2583 * ieee handler to refer to it.
2584 */
2585extern short check_nic_enough_desc(struct net_device *dev, int queue_index);
2586extern int ieee80211_data_xmit(struct sk_buff *skb, struct net_device *dev);
2587extern int ieee80211_parse_info_param(struct ieee80211_device *ieee,
2588 struct ieee80211_info_element *info_element,
2589 u16 length,
2590 struct ieee80211_network *network,
2591 struct ieee80211_rx_stats *stats);
2592
2593void ieee80211_indicate_packets(struct ieee80211_device *ieee, struct ieee80211_rxb **prxbIndicateArray, u8 index);
2594#define RT_ASOC_RETRY_LIMIT 5
2595#endif /* IEEE80211_H */
diff --git a/drivers/staging/rtl8192u/r8192U.h b/drivers/staging/rtl8192u/r8192U.h
index 69a2721e850..6206f929a65 100644
--- a/drivers/staging/rtl8192u/r8192U.h
+++ b/drivers/staging/rtl8192u/r8192U.h
@@ -39,7 +39,7 @@
39#include <linux/random.h> 39#include <linux/random.h>
40#include <linux/version.h> 40#include <linux/version.h>
41#include <asm/io.h> 41#include <asm/io.h>
42#include "ieee80211.h" 42#include "ieee80211/ieee80211.h"
43 43
44#define RTL8192U 44#define RTL8192U
45#define RTL819xU_MODULE_NAME "rtl819xU" 45#define RTL819xU_MODULE_NAME "rtl819xU"
diff --git a/drivers/staging/rtl8192u/r8192U_wx.h b/drivers/staging/rtl8192u/r8192U_wx.h
index b2f7a571b1c..f4cf2801136 100644
--- a/drivers/staging/rtl8192u/r8192U_wx.h
+++ b/drivers/staging/rtl8192u/r8192U_wx.h
@@ -15,7 +15,7 @@
15#ifndef R8180_WX_H 15#ifndef R8180_WX_H
16#define R8180_WX_H 16#define R8180_WX_H
17//#include <linux/wireless.h> 17//#include <linux/wireless.h>
18//#include "ieee80211.h" 18
19extern struct iw_handler_def r8192_wx_handlers_def; 19extern struct iw_handler_def r8192_wx_handlers_def;
20/* Enable the rtl819x_core.c to share this function, david 2008.9.22 */ 20/* Enable the rtl819x_core.c to share this function, david 2008.9.22 */
21extern struct iw_statistics *r8192_get_wireless_stats(struct net_device *dev); 21extern struct iw_statistics *r8192_get_wireless_stats(struct net_device *dev);
diff --git a/drivers/staging/rtl8192u/r819xU_firmware.c b/drivers/staging/rtl8192u/r819xU_firmware.c
index 3cc2d571f9b..b136ee48828 100644
--- a/drivers/staging/rtl8192u/r819xU_firmware.c
+++ b/drivers/staging/rtl8192u/r819xU_firmware.c
@@ -11,7 +11,7 @@
11 * NDIS_STATUS_FAILURE - the following initialization process should be terminated 11 * NDIS_STATUS_FAILURE - the following initialization process should be terminated
12 * NDIS_STATUS_SUCCESS - if firmware initialization process success 12 * NDIS_STATUS_SUCCESS - if firmware initialization process success
13**************************************************************************************************/ 13**************************************************************************************************/
14//#include "ieee80211.h" 14
15#include "r8192U.h" 15#include "r8192U.h"
16#include "r8192U_hw.h" 16#include "r8192U_hw.h"
17#include "r819xU_firmware_img.h" 17#include "r819xU_firmware_img.h"