diff options
author | Guido Guenther <agx@sigxcpu.org> | 2007-03-02 23:40:41 +0100 |
---|---|---|
committer | Guido Guenther <agx@bogon.sigxcpu.org> | 2007-03-02 23:40:41 +0100 |
commit | dc96bd56324ce0b7c8c0fdb658ed2ba64d19265c (patch) | |
tree | 527ae13b85943909fa5c2dedb8c952123fe4a16e | |
parent | 904fc50bb39072b726a9bb31e09869b7ac255e61 (diff) |
move code around a bit for better readability, remove superflous macros and match the code layout to other (wireless) drivers
-rw-r--r-- | at76c503.c | 901 | ||||
-rw-r--r-- | at76c503.h | 180 |
2 files changed, 470 insertions, 611 deletions
@@ -1,4 +1,3 @@ -/* -*- linux-c -*- */ /* * USB at76c503/at76c505 driver * @@ -6,22 +5,19 @@ * Copyright (c) 2004 Joerg Albert <joerg.albert@gmx.de> * Copyright (c) 2004 Nick Jones * Copyright (c) 2004 Balint Seeber <n0_5p4m_p13453@hotmail.com> + * Copyritht (c) 2007 Guido Guenther <agx@sigxcpu.org> * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. * * This file is part of the Berlios driver for WLAN USB devices based on the - * Atmel AT76C503A/505/505A. See at76c503.h for details. + * Atmel AT76C503A/505/505A. * * Some iw_handler code was taken from airo.c, (C) 1999 Benjamin Reed */ -#ifndef AUTOCONF_INCLUDED -#include <linux/config.h> -#endif - #include <linux/init.h> #include <linux/kernel.h> #include <linux/version.h> @@ -51,239 +47,258 @@ #include "at76c503.h" -/* number of endpoints of an interface */ -#define NUM_EP(intf) (intf)->altsetting[0].desc.bNumEndpoints -#define EP(intf,nr) (intf)->altsetting[0].endpoint[(nr)].desc - -#define set_eth_hdr(s,p) (s)->mac.raw=(unsigned char *)(p) - -/* wireless extension level this source currently supports */ -#define WIRELESS_EXT_SUPPORTED 21 +/* Version Information */ +#define DRIVER_NAME "at76_usb" +#define DRIVER_AUTHOR "Oliver Kurth <oku@masqmail.cx>, Joerg Albert <joerg.albert@gmx.de>, Alex <alex@foogod.com>, Nick Jones, Balint Seeber <n0_5p4m_p13453@hotmail.com>" +#define DRIVER_DESC "Atmel at76x USB Wireless LAN Driver" -#define FILL_BULK_URB(a,b,c,d,e,f,g) usb_fill_bulk_urb(a,b,c,d,e,f,g) +/* USB Device IDs supported by this driver */ +#define VENDOR_ID_3COM 0x0506 +#define VENDOR_ID_ACTIONTEC 0x1668 +#define VENDOR_ID_ADDTRON 0x05dd +#define VENDOR_ID_ARESCOM 0x0d8e +#define VENDOR_ID_ATMEL 0x03eb +#define VENDOR_ID_BELKIN 0x0d5c +#define VENDOR_ID_BELKIN_2 0x050d +#define VENDOR_ID_BENQ 0x04a5 +#define VENDOR_ID_BLITZ 0x07b8 +#define VENDOR_ID_BT 0x069a +#define VENDOR_ID_CNET 0x1371 +#define VENDOR_ID_COMPAQ 0x049f +#define VENDOR_ID_CONCEPTRONIC 0x0d8e +#define VENDOR_ID_COREGA 0x07aa +#define VENDOR_ID_DICK_SMITH_ELECTR 0x1371 /* Dick Smith Electronics */ +#define VENDOR_ID_DLINK 0x2001 +#define VENDOR_ID_DYNALINK 0x069a +#define VENDOR_ID_GIGABYTE 0x1044 +#define VENDOR_ID_GIGASET 0x1690 +#define VENDOR_ID_HP 0x03f0 +#define VENDOR_ID_INTEL 0x8086 +#define VENDOR_ID_IO_DATA 0x04bb +#define VENDOR_ID_LINKSYS 0x077b +#define VENDOR_ID_LINKSYS_1915 0x1915 +#define VENDOR_ID_LINKSYS_OLD 0x066b +#define VENDOR_ID_MSI 0x0db0 +#define VENDOR_ID_M4Y750 0x0cde /* Unknown Vendor ID */ +#define VENDOR_ID_NETGEAR 0x0864 +#define VENDOR_ID_SAMSUNG 0x055d +#define VENDOR_ID_SIEMENS 0x0681 +#define VENDOR_ID_SMC 0x083a +#define VENDOR_ID_SMC_OLD 0x0d5c +#define VENDOR_ID_PLANEX 0x2019 +#define VENDOR_ID_TEKRAM 0x0b3b +#define VENDOR_ID_XTERASYS 0x12fd + +#define PRODUCT_ID_ATMEL_503I 0x7603 /* Generic AT76C503/3861 device */ +#define PRODUCT_ID_LINKSYS_WUSB11_V21 0x2211 /* Linksys WUSB11 v2.1/v2.6 */ +#define PRODUCT_ID_NETGEAR_MA101A 0x4100 /* Netgear MA 101 Rev. A */ +#define PRODUCT_ID_TEKRAM_U300C 0x1612 /* Tekram U-300C / Allnet ALL0193 */ +#define PRODUCT_ID_HP_HN210W 0x011c /* HP HN210W PKW-J7801A */ +#define PRODUCT_ID_M4Y750 0x0001 /* Sitecom/Z-Com/Zyxel M4Y-750 */ +#define PRODUCT_ID_DYNALINK_WLL013_I 0x0320 /* Dynalink/Askey WLL013 (intersil) */ +#define PRODUCT_ID_SMC2662W_V1 0xa001 /* EZ connect 11Mpbs + Wireless USB Adapter SMC2662W (v1) */ +#define PRODUCT_ID_BENQ_AWL_300 0x9000 /* AWL-300 */ +#define PRODUCT_ID_ADDTRON_AWU120 0xff31 /* AWU-120, Compex WLU11 */ +#define PRODUCT_ID_INTEL_AP310 0x0200 /* AP310 AnyPoint II USB */ +#define PRODUCT_ID_CONCEPTRONIC_C11U 0x7100 /* also Dynalink L11U */ +#define PRODUCT_ID_WL_210 0x7110 /* Arescom WL-210, + FCC id 07J-GL2411USB */ +#define PRODUCT_ID_IO_DATA_WN_B11_USB 0x0919 /* IO-DATA WN-B11/USB */ +#define PRODUCT_ID_BT_VOYAGER_1010 0x0821 /* BT Voyager 1010 */ +#define PRODUCT_ID_ATMEL_503_I3863 0x7604 /* Generic AT76C503/3863 device */ +#define PRODUCT_ID_SAMSUNG_SWL2100U 0xa000 /* Samsung SWL-2100U */ +#define PRODUCT_ID_ATMEL_503R 0x7605 /* Generic AT76C503/RFMD device */ +#define PRODUCT_ID_W_BUDDIE_WN210 0x4102 /* AirVast W-Buddie WN210 */ +#define PRODUCT_ID_DYNALINK_WLL013_R 0x0321 /* Dynalink/Askey WLL013 (rfmd) */ +#define PRODUCT_ID_LINKSYS_WUSB11_V26 0x2219 /* Linksys WUSB11 v2.6 */ +#define PRODUCT_ID_NE_NWU11B 0x2227 /* Network Everywhere NWU11B */ +#define PRODUCT_ID_NETGEAR_MA101B 0x4102 /* Netgear MA 101 Rev. B */ +#define PRODUCT_ID_ACTIONTEC_802UAT1 0x7605 /* Actiontec 802UAT1, HWU01150-01UK */ +#define PRODUCT_ID_DLINK_DWL120 0x3200 /* DWL-120 rev. E */ +#define PRODUCT_ID_DSE_XH1153 0x5743 /* XH1153 802.11b USB adapter */ +#define PRODUCT_ID_WL_200U 0x0002 /* WL-200U */ +#define PRODUCT_ID_BENQ_AWL_400 0x9001 /* BenQ AWL-400 USB stick */ +#define PRODUCT_ID_3COM_3CRSHEW696 0x0a01 /* 3COM 3CRSHEW696 */ +#define PRODUCT_ID_SIEMENS_SANTIS_WLL013 0x001b /* Siemens Santis ADSL WLAN + USB adapter WLL 013 */ +#define PRODUCT_ID_BELKIN_F5D6050_V2 0x0050 /* Belkin F5D6050, version 2 */ +#define PRODUCT_ID_BLITZ_NETWAVE_BWU613 0xb000 /* iBlitzz, BWU613 (not *B or *SB) */ +#define PRODUCT_ID_GIGABYTE_GN_WLBM101 0x8003 /* Gigabyte GN-WLBM101 */ +#define PRODUCT_ID_PLANEX_GW_US11S 0x3220 /* Planex GW-US11S */ +#define PRODUCT_ID_IPAQ_INT_WLAN 0x0032 /* internal WLAN adapter in h5[4,5]xx series iPAQs */ +#define PRODUCT_ID_BELKIN_F5D6050 0xa002 /* Belkin F5D6050 / SMC 2662W v2 / SMC 2662W-AR */ +#define PRODUCT_ID_SMC_2664W 0x3501 +#define PRODUCT_ID_ATMEL_505R 0x7606 /* Generic AT76C505/RFMD */ +#define PRODUCT_ID_ATMEL_505R2958 0x7613 /* Generic AT76C505/RFMD, OvisLink WL-1130USB */ +#define PRODUCT_ID_CNET_CNUSB611G 0x0013 /* CNet CNUSB 611G */ +#define PRODUCT_ID_FL_WL240U 0x0014 /* Fiberline WL-240U with CNet vendor id */ +#define PRODUCT_ID_LINKSYS_WUSB11V28 0x2233 /* Linksys WUSB11 v2.8 */ +#define PRODUCT_ID_XTERASYS_XN_2122B 0x1001 /* Xterasys XN-2122B, + IBlitzz BWU613B/BWU613SB */ +#define PRODUCT_ID_COREGA_USB_STICK_11_KK 0x7613 /* Corega WLAN USB Stick 11 (K.K.) */ +#define PRODUCT_ID_MSI_MS6978_WLAN_BOX_PC2PC 0x1020 +#define PRODUCT_ID_ATMEL_505A 0x7614 /* Generic AT76C505A device */ +#define PRODUCT_ID_ATMEL_505AS 0x7617 /* Generic AT76C505AS device */ +#define PRODUCT_ID_GIGASET_11 0x0701 +#define PRODUCT_ID_ATMEL_505AMX 0x7615 /* Generic AT76C505AMX device */ + +#define BOARDTYPE_503_INTERSIL_3861 1 +#define BOARDTYPE_503_INTERSIL_3863 2 +#define BOARDTYPE_503_RFMD 3 +#define BOARDTYPE_503_RFMD_ACC 4 +#define BOARDTYPE_505_RFMD 5 +#define BOARDTYPE_505_RFMD_2958 6 +#define BOARDTYPE_505A_RFMD_2958 7 +#define BOARDTYPE_505AMX_RFMD 8 static int at76_debug = DBG_DEFAULTS; -/* how often do we re-try these packets ? */ -#define AUTH_RETRIES 3 -#define ASSOC_RETRIES 3 -#define DISASSOC_RETRIES 3 - -static unsigned long spin_l_istate_flags; -#define LOCK_ISTATE() spin_lock_irqsave(&dev->istate_spinlock,spin_l_istate_flags); -#define UNLOCK_ISTATE() spin_unlock_irqrestore(&dev->istate_spinlock,spin_l_istate_flags); - -#define NEW_STATE(dev,newstate) \ - do {\ - scan_hook(newstate == SCANNING); \ - LOCK_ISTATE() \ - dbg(DBG_PROGRESS, "%s: state %d -> %d (" #newstate ")",\ - dev->netdev->name, dev->istate, newstate);\ - dev->istate = newstate;\ - UNLOCK_ISTATE() \ - } while (0) - -/* the beacon timeout in infra mode when we are connected (in seconds) */ -#define BEACON_TIMEOUT 10 - -/* the interval in ticks we poll if scan is completed */ -#define SCAN_POLL_INTERVAL (HZ/4) +/* Firmware names - this must be in sync with boardtype definitions */ +static struct fwentry { + const char *const fwname; + const struct firmware *fw; +} firmwares[] = { + { "" }, + { "atmel_at76c503-i3861.bin" }, + { "atmel_at76c503-i3863.bin" }, + { "atmel_at76c503-rfmd.bin" }, + { "atmel_at76c503-rfmd-acc.bin" }, + { "atmel_at76c505-rfmd.bin" }, + { "atmel_at76c505-rfmd2958.bin" }, + { "atmel_at76c505a-rfmd2958.bin" }, + { "atmel_at76c505amx-rfmd.bin" } +}; -/* Version Information */ -#define DRIVER_NAME "at76_usb" -#define DRIVER_AUTHOR \ -"Oliver Kurth <oku@masqmail.cx>, Joerg Albert <joerg.albert@gmx.de>, " \ -"Alex <alex@foogod.com>, Nick Jones, Balint Seeber <n0_5p4m_p13453@hotmail.com>" -#define DRIVER_DESC "Atmel at76c50x USB Wireless LAN Driver" +static struct usb_device_id dev_table[] = { + /* at76c503-i3861 */ + { USB_DEVICE(VENDOR_ID_ATMEL, PRODUCT_ID_ATMEL_503I), + .driver_info = BOARDTYPE_503_INTERSIL_3861 }, + { USB_DEVICE(VENDOR_ID_LINKSYS_OLD, PRODUCT_ID_LINKSYS_WUSB11_V21), + .driver_info = BOARDTYPE_503_INTERSIL_3861 }, + { USB_DEVICE(VENDOR_ID_NETGEAR, PRODUCT_ID_NETGEAR_MA101A), + .driver_info = BOARDTYPE_503_INTERSIL_3861 }, + { USB_DEVICE(VENDOR_ID_TEKRAM, PRODUCT_ID_TEKRAM_U300C), + .driver_info = BOARDTYPE_503_INTERSIL_3861 }, + { USB_DEVICE(VENDOR_ID_HP, PRODUCT_ID_HP_HN210W), + .driver_info = BOARDTYPE_503_INTERSIL_3861 }, + { USB_DEVICE(VENDOR_ID_M4Y750, PRODUCT_ID_M4Y750), + .driver_info = BOARDTYPE_503_INTERSIL_3861 }, + { USB_DEVICE(VENDOR_ID_DYNALINK, PRODUCT_ID_DYNALINK_WLL013_I), + .driver_info = BOARDTYPE_503_INTERSIL_3861 }, + { USB_DEVICE(VENDOR_ID_SMC_OLD, PRODUCT_ID_SMC2662W_V1), + .driver_info = BOARDTYPE_503_INTERSIL_3861 }, + { USB_DEVICE(VENDOR_ID_BENQ, PRODUCT_ID_BENQ_AWL_300), + .driver_info = BOARDTYPE_503_INTERSIL_3861 }, + { USB_DEVICE(VENDOR_ID_ADDTRON, PRODUCT_ID_ADDTRON_AWU120), + .driver_info = BOARDTYPE_503_INTERSIL_3861 }, + { USB_DEVICE(VENDOR_ID_INTEL, PRODUCT_ID_INTEL_AP310), + .driver_info = BOARDTYPE_503_INTERSIL_3861 }, + { USB_DEVICE(VENDOR_ID_CONCEPTRONIC,PRODUCT_ID_CONCEPTRONIC_C11U), + .driver_info = BOARDTYPE_503_INTERSIL_3861 }, + { USB_DEVICE(VENDOR_ID_ARESCOM, PRODUCT_ID_WL_210), + .driver_info = BOARDTYPE_503_INTERSIL_3861 }, + { USB_DEVICE(VENDOR_ID_IO_DATA, PRODUCT_ID_IO_DATA_WN_B11_USB), + .driver_info = BOARDTYPE_503_INTERSIL_3861 }, + { USB_DEVICE(VENDOR_ID_BT, PRODUCT_ID_BT_VOYAGER_1010), + .driver_info = BOARDTYPE_503_INTERSIL_3861 }, + /* at76c503-i3863 */ + { USB_DEVICE(VENDOR_ID_ATMEL, PRODUCT_ID_ATMEL_503_I3863), + .driver_info = BOARDTYPE_503_INTERSIL_3863 }, + { USB_DEVICE(VENDOR_ID_SAMSUNG, PRODUCT_ID_SAMSUNG_SWL2100U), + .driver_info = BOARDTYPE_503_INTERSIL_3863 }, + /* at76c503-rfmd */ + { USB_DEVICE(VENDOR_ID_ATMEL, PRODUCT_ID_ATMEL_503R), + .driver_info = BOARDTYPE_503_RFMD }, + { USB_DEVICE(VENDOR_ID_DYNALINK, PRODUCT_ID_DYNALINK_WLL013_R), + .driver_info = BOARDTYPE_503_RFMD }, + { USB_DEVICE(VENDOR_ID_LINKSYS, PRODUCT_ID_LINKSYS_WUSB11_V26), + .driver_info = BOARDTYPE_503_RFMD }, + { USB_DEVICE(VENDOR_ID_LINKSYS, PRODUCT_ID_NE_NWU11B), + .driver_info = BOARDTYPE_503_RFMD }, + { USB_DEVICE(VENDOR_ID_NETGEAR, PRODUCT_ID_NETGEAR_MA101B), + .driver_info = BOARDTYPE_503_RFMD }, + { USB_DEVICE(VENDOR_ID_DLINK, PRODUCT_ID_DLINK_DWL120), + .driver_info = BOARDTYPE_503_RFMD }, + { USB_DEVICE(VENDOR_ID_ACTIONTEC,PRODUCT_ID_ACTIONTEC_802UAT1), + .driver_info = BOARDTYPE_503_RFMD }, + { USB_DEVICE(VENDOR_ID_ATMEL, PRODUCT_ID_W_BUDDIE_WN210), + .driver_info = BOARDTYPE_503_RFMD }, + { USB_DEVICE(VENDOR_ID_DICK_SMITH_ELECTR, PRODUCT_ID_DSE_XH1153), + .driver_info = BOARDTYPE_503_RFMD }, + { USB_DEVICE(VENDOR_ID_DICK_SMITH_ELECTR, PRODUCT_ID_WL_200U), + .driver_info = BOARDTYPE_503_RFMD }, + { USB_DEVICE(VENDOR_ID_BENQ, PRODUCT_ID_BENQ_AWL_400), + .driver_info = BOARDTYPE_503_RFMD }, + { USB_DEVICE(VENDOR_ID_3COM, PRODUCT_ID_3COM_3CRSHEW696), + .driver_info = BOARDTYPE_503_RFMD }, + { USB_DEVICE(VENDOR_ID_SIEMENS, PRODUCT_ID_SIEMENS_SANTIS_WLL013), + .driver_info = BOARDTYPE_503_RFMD }, + { USB_DEVICE(VENDOR_ID_BELKIN_2, PRODUCT_ID_BELKIN_F5D6050_V2), + .driver_info = BOARDTYPE_503_RFMD }, + { USB_DEVICE(VENDOR_ID_BLITZ, PRODUCT_ID_BLITZ_NETWAVE_BWU613), + .driver_info = BOARDTYPE_503_RFMD }, + { USB_DEVICE(VENDOR_ID_GIGABYTE, PRODUCT_ID_GIGABYTE_GN_WLBM101), + .driver_info = BOARDTYPE_503_RFMD }, + { USB_DEVICE(VENDOR_ID_PLANEX, PRODUCT_ID_PLANEX_GW_US11S), + .driver_info = BOARDTYPE_503_RFMD }, + { USB_DEVICE(VENDOR_ID_COMPAQ, PRODUCT_ID_IPAQ_INT_WLAN), + .driver_info = BOARDTYPE_503_RFMD }, + /* at76c503-rfmd-acc */ + { USB_DEVICE(VENDOR_ID_SMC, PRODUCT_ID_SMC_2664W), + .driver_info = BOARDTYPE_503_RFMD_ACC }, + { USB_DEVICE(VENDOR_ID_BELKIN, PRODUCT_ID_BELKIN_F5D6050), + .driver_info = BOARDTYPE_503_RFMD_ACC }, + /* at76c505-rfmd */ + { USB_DEVICE(VENDOR_ID_ATMEL, PRODUCT_ID_ATMEL_505R), + .driver_info = BOARDTYPE_505_RFMD }, + /* at76c505-rfmd2958 */ + { USB_DEVICE(VENDOR_ID_ATMEL, PRODUCT_ID_ATMEL_505R2958), + .driver_info = BOARDTYPE_505_RFMD_2958 }, + { USB_DEVICE(VENDOR_ID_CNET, PRODUCT_ID_FL_WL240U), + .driver_info = BOARDTYPE_505_RFMD_2958 }, + { USB_DEVICE(VENDOR_ID_CNET, PRODUCT_ID_CNET_CNUSB611G), + .driver_info = BOARDTYPE_505_RFMD_2958 }, + { USB_DEVICE(VENDOR_ID_LINKSYS_1915, PRODUCT_ID_LINKSYS_WUSB11V28), + .driver_info = BOARDTYPE_505_RFMD_2958 }, + { USB_DEVICE(VENDOR_ID_XTERASYS, PRODUCT_ID_XTERASYS_XN_2122B), + .driver_info = BOARDTYPE_505_RFMD_2958 }, + { USB_DEVICE(VENDOR_ID_COREGA, PRODUCT_ID_COREGA_USB_STICK_11_KK), + .driver_info = BOARDTYPE_505_RFMD_2958 }, + { USB_DEVICE(VENDOR_ID_MSI, PRODUCT_ID_MSI_MS6978_WLAN_BOX_PC2PC), + .driver_info = BOARDTYPE_505_RFMD_2958 }, + /* at76c505a-rfmd2958 */ + { USB_DEVICE(VENDOR_ID_ATMEL, PRODUCT_ID_ATMEL_505A), + .driver_info = BOARDTYPE_505A_RFMD_2958 }, + { USB_DEVICE(VENDOR_ID_ATMEL, PRODUCT_ID_ATMEL_505AS), + .driver_info = BOARDTYPE_505A_RFMD_2958 }, + { USB_DEVICE(VENDOR_ID_GIGASET, PRODUCT_ID_GIGASET_11), + .driver_info = BOARDTYPE_505A_RFMD_2958 }, + /* at76c505amx-rfmd */ + { USB_DEVICE(VENDOR_ID_ATMEL, PRODUCT_ID_ATMEL_505AMX), + .driver_info = BOARDTYPE_505AMX_RFMD }, + { } +}; -/* Module paramaters */ -module_param_named(debug, at76_debug, int, 0600); -MODULE_PARM_DESC(debug, "Debugging level"); +MODULE_DEVICE_TABLE (usb, dev_table); +/* module parameters */ static int rx_copybreak = 200; -module_param(rx_copybreak, int, 0400); -MODULE_PARM_DESC(rx_copybreak, "rx packet copy threshold"); - static int scan_min_time = 10; -module_param(scan_min_time, int, 0400); -MODULE_PARM_DESC(scan_min_time, "scan min channel time (default: 10)"); - static int scan_max_time = 120; -module_param(scan_max_time, int, 0400); -MODULE_PARM_DESC(scan_max_time, "scan max channel time (default: 120)"); - static int scan_mode = SCAN_TYPE_ACTIVE; -module_param(scan_mode, int, 0400); -MODULE_PARM_DESC(scan_mode, "scan mode: 0 active (with ProbeReq, default), 1 passive"); - static int preamble_type = PREAMBLE_TYPE_LONG; -module_param(preamble_type, int, 0400); -MODULE_PARM_DESC(preamble_type, "preamble type: 0 long (default), 1 short"); - static int auth_mode = 0; -module_param(auth_mode, int, 0400); -MODULE_PARM_DESC(auth_mode, "authentication mode: 0 open system (default), " - "1 shared secret"); - static int pm_mode = PM_ACTIVE; -module_param(pm_mode, int, 0400); -MODULE_PARM_DESC(pm_mode, "power management mode: 1 active (def.), 2 powersave, 3 smart save"); - static int pm_period = 0; -module_param(pm_period, int, 0400); -MODULE_PARM_DESC(pm_period, "period of waking up the device in usec"); - static int international_roaming = IR_OFF; -module_param(international_roaming, int, 0400); -MODULE_PARM_DESC(international_roaming, "enable international roaming: 0 (no, default), 1 (yes)"); - static int default_iw_mode = IW_MODE_INFRA; -module_param(default_iw_mode, int, 0400); -MODULE_PARM_DESC(default_iw_mode, "default IW mode for a new device: " - "1 (ad-hoc), 2 (infrastructure, def.), 6 (monitor mode)"); - static int monitor_scan_min_time = 50; -module_param(monitor_scan_min_time, int, 0400); -MODULE_PARM_DESC(monitor_scan_min_time, "scan min channel time in MONITOR MODE (default: 50)"); - static int monitor_scan_max_time = 600; -module_param(monitor_scan_max_time, int, 0400); -MODULE_PARM_DESC(monitor_scan_max_time, "scan max channel time in MONITOR MODE (default: 600)"); - static char* netdev_name = "wlan%d"; -module_param(netdev_name, charp, 0400); -MODULE_PARM_DESC(netdev_name, "network device name (default is wlan%d)"); - - -#define DEF_RTS_THRESHOLD 1536 -#define DEF_FRAG_THRESHOLD 1536 -#define DEF_SHORT_RETRY_LIMIT 8 -#define DEF_CHANNEL 10 - -#define MAX_RTS_THRESHOLD (MAX_FRAG_THRESHOLD + 1) - -/* The frequency of each channel in MHz */ -static const long channel_frequency[] = { - 2412, 2417, 2422, 2427, 2432, 2437, 2442, - 2447, 2452, 2457, 2462, 2467, 2472, 2484 -}; -#define NUM_CHANNELS ( sizeof(channel_frequency) / sizeof(channel_frequency[0]) ) - -/* the broadcast address */ -static const u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; -static const u8 off_addr[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -/* the supported rates of this hardware, bit7 marks a basic rate */ -static const u8 hw_rates[4] = {0x82,0x84,0x0b,0x16}; - -/* the max padding size for tx in bytes (see calc_padding)*/ -#define MAX_PADDING_SIZE 53 - -/* the size of the ieee802.11 header (excl. the at76c503 tx header) */ -#define IEEE802_11_MGMT_HEADER_SIZE offsetof(struct ieee80211_hdr_3addr, payload) -#define BEACON_MAX_DATA_LENGTH 1500 -/* beacon in ieee80211_hdr_3addr.payload */ -struct ieee802_11_beacon_data { - u8 timestamp[8]; /* TSFTIMER */ - __le16 beacon_interval; /* Kms between TBTTs (Target Beacon Transmission Times) */ - __le16 capability_information; - u8 data[BEACON_MAX_DATA_LENGTH]; /* contains: SSID (tag,length,value), - Supported Rates (tlv), channel */ -} __attribute__ ((packed)); - -/* disassoc frame in ieee80211_hdr_3addr.payload */ -struct ieee802_11_disassoc_frame { - __le16 reason; -} __attribute__ ((packed)); -#define DISASSOC_FRAME_SIZE \ - (AT76C503_TX_HDRLEN + IEEE802_11_MGMT_HEADER_SIZE +\ - sizeof(struct ieee802_11_disassoc_frame)) - -/* assoc request in ieee80211_hdr_3addr.payload */ -struct ieee802_11_assoc_req { - __le16 capability; - __le16 listen_interval; - u8 data[1]; /* variable number of bytes for SSID - and supported rates (tlv coded) */ -}; -/* the maximum size of an AssocReq packet */ -#define ASSOCREQ_MAX_SIZE \ - (AT76C503_TX_HDRLEN + IEEE802_11_MGMT_HEADER_SIZE +\ - offsetof(struct ieee802_11_assoc_req,data) +\ - 1+1+IW_ESSID_MAX_SIZE + 1+1+4) - -/* reassoc request in ieee80211_hdr_3addr.payload */ -struct ieee802_11_reassoc_req { - __le16 capability; - __le16 listen_interval; - u8 curr_ap[ETH_ALEN]; /* the bssid of the AP we are - currently associated to */ - u8 data[1]; /* variable number of bytes for SSID - and supported rates (tlv coded) */ -} __attribute__ ((packed)); - -/* the maximum size of an AssocReq packet */ -#define REASSOCREQ_MAX_SIZE \ - (AT76C503_TX_HDRLEN + IEEE802_11_MGMT_HEADER_SIZE +\ - offsetof(struct ieee802_11_reassoc_req,data) +\ - 1+1+IW_ESSID_MAX_SIZE + 1+1+4) - - -/* assoc/reassoc response */ -struct ieee802_11_assoc_resp { - __le16 capability; - __le16 status; - __le16 assoc_id; - u8 data[1]; /* variable number of bytes for - supported rates (tlv coded) */ -} __attribute__ ((packed)); - -/* auth. request/response in ieee80211_hdr_3addr.payload */ -struct ieee802_11_auth_frame { - __le16 algorithm; - __le16 seq_nr; - __le16 status; - u8 challenge[0]; -} __attribute__ ((packed)); -/* for shared secret auth, add the challenge text size */ -#define AUTH_FRAME_SIZE \ - (AT76C503_TX_HDRLEN + IEEE802_11_MGMT_HEADER_SIZE +\ - sizeof(struct ieee802_11_auth_frame)) - -/* deauth frame in ieee80211_hdr_3addr.payload */ -struct ieee802_11_deauth_frame { - __le16 reason; -} __attribute__ ((packed)); -#define DEAUTH_FRAME_SIZE \ - (AT76C503_TX_HDRLEN + IEEE802_11_MGMT_HEADER_SIZE +\ - sizeof(struct ieee802_11_disauth_frame)) - - -#define KEVENT_CTRL_HALT 1 -#define KEVENT_NEW_BSS 2 -#define KEVENT_SET_PROMISC 3 -#define KEVENT_MGMT_TIMEOUT 4 -#define KEVENT_SCAN 5 -#define KEVENT_JOIN 6 -#define KEVENT_STARTIBSS 7 -#define KEVENT_SUBMIT_RX 8 -#define KEVENT_RESTART 9 /* restart the device */ -#define KEVENT_ASSOC_DONE 10 /* execute the power save settings: - listen interval, pm mode, assoc id */ -#define KEVENT_EXTERNAL_FW 11 -#define KEVENT_INTERNAL_FW 12 -#define KEVENT_RESET_DEVICE 13 - - -static u8 snapsig[] = {0xaa, 0xaa, 0x03}; -/* RFC 1042 encapsulates Ethernet frames in 802.2 SNAP (0xaa, 0xaa, 0x03) with - * a SNAP OID of 0 (0x00, 0x00, 0x00) */ -static u8 rfc1042sig[] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00}; - -/* local function prototypes */ +/* Function prototypes */ static void iwspy_update(struct at76c503 *dev, struct at76c503_rx_buffer *buf); - static void at76c503_read_bulk_callback (struct urb *urb); static void at76c503_write_bulk_callback(struct urb *urb); static void defer_kevent (struct at76c503 *dev, int flag); @@ -298,13 +313,30 @@ static int reassoc_req(struct at76c503 *dev, struct bss_info *curr, static void dump_bss_table(struct at76c503 *dev, int force_output); static int submit_rx_urb(struct at76c503 *dev); static int startup_device(struct at76c503 *dev); - static int set_iroaming(struct at76c503 *dev, int onoff); static void set_monitor_mode(struct at76c503 *dev, int use_prism); - /* second step of initialization (after fw download) */ static int init_new_device(struct at76c503 *dev); +/* number of endpoints of an interface */ +#define NUM_EP(intf) (intf)->altsetting[0].desc.bNumEndpoints +#define EP(intf,nr) (intf)->altsetting[0].endpoint[(nr)].desc + +static unsigned long spin_l_istate_flags; +#define LOCK_ISTATE() spin_lock_irqsave(&dev->istate_spinlock,spin_l_istate_flags); +#define UNLOCK_ISTATE() spin_unlock_irqrestore(&dev->istate_spinlock,spin_l_istate_flags); + +#define NEW_STATE(dev,newstate) \ + do {\ + scan_hook(newstate == SCANNING);\ + LOCK_ISTATE();\ + dbg(DBG_PROGRESS, "%s: state %d -> %d (" #newstate ")",\ + dev->netdev->name, dev->istate, newstate);\ + dev->istate = newstate;\ + UNLOCK_ISTATE();\ + } while (0) + +/* Firmware download */ /* DFU states */ #define STATE_IDLE 0x00 #define STATE_DETACH 0x01 @@ -328,8 +360,7 @@ static int init_new_device(struct at76c503 *dev); #define DFU_ABORT 6 #define DFU_PACKETSIZE 1024 - -#define USB_SUCCESS(a) ((a) >= 0) +#define DFU_USB_SUCCESS(a) ((a) >= 0) struct dfu_status { unsigned char bStatus; @@ -346,7 +377,6 @@ struct dfu_ctx { u8 *buf; }; - static int dfu_download_block(struct dfu_ctx *ctx, u8 *buffer, int bytes, int block) @@ -387,7 +417,6 @@ int dfu_get_status(struct dfu_ctx *ctx, struct dfu_status *status) status, /* Buffer */ sizeof(struct dfu_status), /* Size */ HZ); - return result; } @@ -404,7 +433,6 @@ u8 dfu_get_state(struct usb_device *udev, u8 *state) state, /* Buffer */ 1, /* Size */ HZ); - return result; } @@ -416,7 +444,6 @@ u32 __get_timeout(struct dfu_status *s) ret = (unsigned long) (s->bwPollTimeout[2] << 16); ret |= (unsigned long) (s->bwPollTimeout[1] << 8); ret |= (unsigned long) (s->bwPollTimeout[0]); - return ret; } @@ -466,7 +493,7 @@ static int usbdfu_download(struct usb_device *udev, u8 *dfu_buffer, do { if (need_dfu_state) { status = dfu_get_state(ctx->udev, &ctx->dfu_state); - if (!USB_SUCCESS(status)) { + if (!DFU_USB_SUCCESS(status)) { err("DFU: Failed to get DFU state: %d", status); goto exit; } @@ -478,7 +505,7 @@ static int usbdfu_download(struct usb_device *udev, u8 *dfu_buffer, case STATE_DFU_DOWNLOAD_SYNC: dbg(DBG_DFU, "STATE_DFU_DOWNLOAD_SYNC"); status = dfu_get_status(ctx, dfu_stat_buf); - if (USB_SUCCESS(status)) { + if (DFU_USB_SUCCESS(status)) { dfu_state = dfu_stat_buf->bState; dfu_timeout = __get_timeout(dfu_stat_buf); need_dfu_state = 0; @@ -519,7 +546,7 @@ static int usbdfu_download(struct usb_device *udev, u8 *dfu_buffer, dfu_buffer_offset += dfu_block_bytes; dfu_block_cnt++; - if (!USB_SUCCESS(status)) + if (!DFU_USB_SUCCESS(status)) err("dfu_download_block failed with %d", status); need_dfu_state = 1; break; @@ -529,7 +556,7 @@ static int usbdfu_download(struct usb_device *udev, u8 *dfu_buffer, status = dfu_get_status(ctx, dfu_stat_buf); - if (USB_SUCCESS(status)) { + if (DFU_USB_SUCCESS(status)) { dfu_state = dfu_stat_buf->bState; dfu_timeout = __get_timeout(dfu_stat_buf); need_dfu_state = 0; @@ -573,7 +600,7 @@ static int usbdfu_download(struct usb_device *udev, u8 *dfu_buffer, status = -EINVAL; break; } - } while (!is_done && USB_SUCCESS(status)); + } while (!is_done && DFU_USB_SUCCESS(status)); exit: kfree(ctx); @@ -1750,7 +1777,6 @@ static void handle_mgmt_timeout_scan(struct at76c503 *dev) return; } - if ((ret=get_cmd_status(dev->udev, CMD_SCAN, cmd_status)) < 0) { err("%s: %s: get_cmd_status failed with %d", dev->netdev->name, __FUNCTION__, ret); @@ -1810,10 +1836,6 @@ static void handle_mgmt_timeout_scan(struct at76c503 *dev) /* report the end of scan to user space */ iwevent_scan_complete(dev->netdev); NEW_STATE(dev,JOINING); -#if 0 - assert(dev->curr_bss == NULL); /* done in free_bss_list, - find_bss will start with first bss */ -#endif /* call join_bss immediately after re-run of all other threads in kevent */ defer_kevent(dev,KEVENT_JOIN); @@ -2034,14 +2056,14 @@ static int send_mgmt_bulk(struct at76c503 *dev, struct at76c503_tx_buffer *txbuf /* txbuf was not consumed above -> send mgmt msg immediately */ memcpy(dev->bulk_out_buffer, txbuf, le16_to_cpu(txbuf->wlength) + AT76C503_TX_HDRLEN); - FILL_BULK_URB(dev->write_urb, dev->udev, - usb_sndbulkpipe(dev->udev, + usb_fill_bulk_urb(dev->write_urb, dev->udev, + usb_sndbulkpipe(dev->udev, dev->bulk_out_endpointAddr), - dev->bulk_out_buffer, - le16_to_cpu(txbuf->wlength) + - txbuf->padding + - AT76C503_TX_HDRLEN, - (usb_complete_t)at76c503_write_bulk_callback, dev); + dev->bulk_out_buffer, + le16_to_cpu(txbuf->wlength) + + txbuf->padding + + AT76C503_TX_HDRLEN, + (usb_complete_t)at76c503_write_bulk_callback, dev); ret = usb_submit_urb(dev->write_urb, GFP_ATOMIC); if (ret) { err("%s: %s error in tx submit urb: %d", @@ -2279,7 +2301,6 @@ static int reassoc_req(struct at76c503 *dev, struct bss_info *curr_bss, memcpy(req->curr_ap, curr_bss->bssid, ETH_ALEN); /* write TLV data elements */ - *tlv++ = MFIE_TYPE_SSID; *tlv++ = new_bss->ssid_len; memcpy(tlv,new_bss->ssid, new_bss->ssid_len); @@ -2518,12 +2539,12 @@ end_join: if (test_bit(KEVENT_SCAN, &dev->kevent_flags)) { clear_bit(KEVENT_SCAN, &dev->kevent_flags); + LOCK_ISTATE() assert(dev->istate == SCANNING); - /* only clear the bss list when a scan is actively initiated, * otherwise simply rely on bss_list_timeout */ - if ( dev->site_survey_state == SITE_SURVEY_IN_PROGRESS) + if (dev->site_survey_state == SITE_SURVEY_IN_PROGRESS) free_bss_list(dev); UNLOCK_ISTATE() @@ -3591,7 +3612,7 @@ static void ieee80211_to_eth(struct sk_buff *skb, int iw_mode) } eth_hdr_p = (struct ethhdr *)(skb->data-sizeof(struct ethhdr)); - set_eth_hdr(skb, eth_hdr_p); + skb->mac.raw=(unsigned char *)eth_hdr_p; if (build_ethhdr) { /* This needs to be done in this order (eth_hdr_p->h_dest may * overlap src_addr) */ @@ -3971,10 +3992,10 @@ static int submit_rx_urb(struct at76c503 *dev) } size = skb_tailroom(skb); - FILL_BULK_URB(dev->read_urb, dev->udev, - usb_rcvbulkpipe(dev->udev, dev->bulk_in_endpointAddr), - skb_put(skb, size), size, - (usb_complete_t)at76c503_read_bulk_callback, dev); + usb_fill_bulk_urb(dev->read_urb, dev->udev, + usb_rcvbulkpipe(dev->udev, dev->bulk_in_endpointAddr), + skb_put(skb, size), size, + (usb_complete_t)at76c503_read_bulk_callback, dev); ret = usb_submit_urb(dev->read_urb, GFP_ATOMIC); if (ret < 0) { if (ret == -ENODEV) @@ -4259,13 +4280,13 @@ static void at76c503_write_bulk_callback (struct urb *urb) memcpy(dev->bulk_out_buffer, mgmt_buf, le16_to_cpu(mgmt_buf->wlength) + offsetof(struct at76c503_tx_buffer,packet)); - FILL_BULK_URB(dev->write_urb, dev->udev, - usb_sndbulkpipe(dev->udev, - dev->bulk_out_endpointAddr), - dev->bulk_out_buffer, - le16_to_cpu(mgmt_buf->wlength) + - mgmt_buf->padding + AT76C503_TX_HDRLEN, - (usb_complete_t)at76c503_write_bulk_callback, dev); + usb_fill_bulk_urb(dev->write_urb, dev->udev, + usb_sndbulkpipe(dev->udev, + dev->bulk_out_endpointAddr), + dev->bulk_out_buffer, + le16_to_cpu(mgmt_buf->wlength) + + mgmt_buf->padding + AT76C503_TX_HDRLEN, + (usb_complete_t)at76c503_write_bulk_callback, dev); ret = usb_submit_urb(dev->write_urb, GFP_ATOMIC); if (ret) { err("%s: %s error in tx submit urb: %d", @@ -4291,7 +4312,6 @@ static void ipaq_blink_led (void) { ipaq_led_on (RED_LED_2); - mod_timer (&led_timer, jiffies + (HZ / 25)); } @@ -4299,7 +4319,6 @@ static void ipaq_init_led (void) { led_timer.function = ipaq_clear_led; - init_timer (&led_timer); } @@ -4427,10 +4446,10 @@ static int at76c503_tx(struct sk_buff *skb, struct net_device *netdev) netif_stop_queue(netdev); netdev->trans_start = jiffies; - FILL_BULK_URB(dev->write_urb, dev->udev, - usb_sndbulkpipe(dev->udev, dev->bulk_out_endpointAddr), - tx_buffer, submit_len, - (usb_complete_t)at76c503_write_bulk_callback, dev); + usb_fill_bulk_urb(dev->write_urb, dev->udev, + usb_sndbulkpipe(dev->udev, dev->bulk_out_endpointAddr), + tx_buffer, submit_len, + (usb_complete_t)at76c503_write_bulk_callback, dev); ret = usb_submit_urb(dev->write_urb, GFP_ATOMIC); if (ret) { stats->tx_errors++; @@ -4672,7 +4691,6 @@ static int at76c503_stop(struct net_device *netdev) dev->open_count--; up(&dev->sem); - dbg(DBG_DEVSTART, "%s: EXIT", __FUNCTION__); return 0; @@ -4681,7 +4699,6 @@ static int at76c503_stop(struct net_device *netdev) static struct net_device_stats *at76c503_get_stats(struct net_device *netdev) { struct at76c503 *dev = (struct at76c503 *)netdev->priv; - return &dev->stats; } @@ -4794,11 +4811,7 @@ static int at76c503_iw_handler_commit(struct net_device *netdev, dbg(DBG_IOCTL, "%s %s: restarting the device", netdev->name, __FUNCTION__); - /* stop any pending tx bulk urb - TODO */ - - /* jal: TODO: protect access to dev->istate by a spinlock - (ISR's on other processors may read/write it) */ + /* TODO: stop any pending tx bulk urb */ LOCK_ISTATE() if (dev->istate != INIT) { UNLOCK_ISTATE() @@ -4831,9 +4844,7 @@ static int at76c503_iw_handler_get_name(struct net_device *netdev, char *extra) { strcpy(name, "IEEE 802.11b"); - dbg(DBG_IOCTL, "%s: SIOCGIWNAME - name %s", netdev->name, name); - return 0; } @@ -5012,7 +5023,7 @@ static int at76c503_iw_handler_get_range(struct net_device *netdev, range->num_txpower = 1; range->txpower_capa = IW_TXPOW_DBM; - range->we_version_source = WIRELESS_EXT_SUPPORTED; + range->we_version_source = WIRELESS_EXT; range->we_version_compiled = WIRELESS_EXT; /* same as the values used in atmel.c */ @@ -6101,9 +6112,7 @@ static const iw_handler at76c503_handlers[] = [SIOCGIWPOWER -SIOCIWFIRST] = (iw_handler) at76c503_iw_handler_get_power, }; -/******************************************************************************* - * structure that advertises the private iw handlers of this driver - */ +/*structure that advertises the private iw handlers of this driver */ static const iw_handler at76c503_priv_handlers[] = { (iw_handler) at76c503_iw_handler_PRIV_IOCTL_SET_SHORT_PREAMBLE, @@ -6165,7 +6174,6 @@ static struct ethtool_ops at76c503_ethtool_ops = { .get_link = at76c503_ethtool_get_link, }; - static void at76c503_delete_device(struct at76c503 *dev) { int i; @@ -6241,6 +6249,7 @@ static void at76c503_delete_device(struct at76c503 *dev) dbg(DBG_PROC_ENTRY, "%s: EXIT", __FUNCTION__); } + static int at76c503_alloc_urbs(struct at76c503 *dev) { struct usb_interface *interface = dev->interface; @@ -6290,11 +6299,11 @@ static int at76c503_alloc_urbs(struct at76c503 *dev) err("couldn't allocate bulk_out_buffer"); return -1; } - FILL_BULK_URB(dev->write_urb, udev, - usb_sndbulkpipe(udev, + usb_fill_bulk_urb(dev->write_urb, udev, + usb_sndbulkpipe(udev, endpoint->bEndpointAddress), - dev->bulk_out_buffer, buffer_size, - (usb_complete_t)at76c503_write_bulk_callback, dev); + dev->bulk_out_buffer, buffer_size, + (usb_complete_t)at76c503_write_bulk_callback, dev); } } @@ -6705,299 +6714,6 @@ error: return ret; } - -/* Firmware names - this must be in sync with boardtype definitions */ -static struct fwentry { - const char *const fwname; - const struct firmware *fw; -} firmwares[] = { - { "" }, - { "atmel_at76c503-i3861.bin" }, - { "atmel_at76c503-i3863.bin" }, - { "atmel_at76c503-rfmd.bin" }, - { "atmel_at76c503-rfmd-acc.bin" }, - { "atmel_at76c505-rfmd.bin" }, - { "atmel_at76c505-rfmd2958.bin" }, - { "atmel_at76c505a-rfmd2958.bin" }, - { "atmel_at76c505amx-rfmd.bin" } -}; - -/* USB Device IDs supported by this driver */ - -/* at76c503-i3861 */ -#define VENDOR_ID_ATMEL 0x03eb -#define PRODUCT_ID_ATMEL_503I 0x7603 /* Generic AT76C503/3861 device */ - -#define VENDOR_ID_LINKSYS_OLD 0x066b -#define PRODUCT_ID_LINKSYS_WUSB11_V21 0x2211 /* Linksys WUSB11 v2.1/v2.6 */ - -#define VENDOR_ID_NETGEAR 0x0864 -#define PRODUCT_ID_NETGEAR_MA101A 0x4100 /* Netgear MA 101 Rev. A */ - -#define VENDOR_ID_TEKRAM 0x0b3b -#define PRODUCT_ID_TEKRAM_U300C 0x1612 /* Tekram U-300C / Allnet ALL0193 */ - -#define VENDOR_ID_HP 0x03f0 -#define PRODUCT_ID_HP_HN210W 0x011c /* HP HN210W PKW-J7801A */ - -#define VENDOR_ID_M4Y750 0x0cde /* Unknown Vendor ID! */ -#define PRODUCT_ID_M4Y750 0x0001 /* Sitecom/Z-Com/Zyxel M4Y-750 */ - -#define VENDOR_ID_DYNALINK 0x069a -#define PRODUCT_ID_DYNALINK_WLL013_I 0x0320 /* Dynalink/Askey WLL013 (intersil) */ - -#define VENDOR_ID_SMC_OLD 0x0d5c -#define PRODUCT_ID_SMC2662W_V1 0xa001 /* EZ connect 11Mpbs -Wireless USB Adapter SMC2662W (v1) */ - -#define VENDOR_ID_BENQ 0x04a5 /* BenQ (Acer) */ -#define PRODUCT_ID_BENQ_AWL_300 0x9000 /* AWL-300 */ - -/* this adapter contains flash */ -#define VENDOR_ID_ADDTRON 0x05dd /* Addtron */ -#define PRODUCT_ID_ADDTRON_AWU120 0xff31 /* AWU-120 */ -/* also Compex WLU11 */ - -#define VENDOR_ID_INTEL 0x8086 /* Intel */ -#define PRODUCT_ID_INTEL_AP310 0x0200 /* AP310 AnyPoint II USB */ - -#define VENDOR_ID_CONCEPTRONIC 0x0d8e -#define PRODUCT_ID_CONCEPTRONIC_C11U 0x7100 /* also Dynalink L11U */ - -#define VENDOR_ID_ARESCOM 0xd8e -#define PRODUCT_ID_WL_210 0x7110 /* Arescom WL-210, - FCC id 07J-GL2411USB */ -#define VENDOR_ID_IO_DATA 0x04bb -#define PRODUCT_ID_IO_DATA_WN_B11_USB 0x0919 /* IO-DATA WN-B11/USB */ - -#define VENDOR_ID_BT 0x069a -#define PRODUCT_ID_BT_VOYAGER_1010 0x0821 /* BT Voyager 1010 */ - - -/* at76c503-i3863 */ -#define VENDOR_ID_ATMEL 0x03eb -#define PRODUCT_ID_ATMEL_503_I3863 0x7604 /* Generic AT76C503/3863 device */ - -#define VENDOR_ID_SAMSUNG 0x055d -#define PRODUCT_ID_SAMSUNG_SWL2100U 0xa000 /* Samsung SWL-2100U */ - - -/* at76c503-rfmd */ -#define VENDOR_ID_ATMEL 0x03eb -#define PRODUCT_ID_ATMEL_503R 0x7605 /* Generic AT76C503/RFMD device */ -#define PRODUCT_ID_W_BUDDIE_WN210 0x4102 /* AirVast W-Buddie WN210 */ - -#define VENDOR_ID_DYNALINK 0x069a -#define PRODUCT_ID_DYNALINK_WLL013_R 0x0321 /* Dynalink/Askey WLL013 (rfmd) */ - -#define VENDOR_ID_LINKSYS 0x077b -#define PRODUCT_ID_LINKSYS_WUSB11_V26 0x2219 /* Linksys WUSB11 v2.6 */ -#define PRODUCT_ID_NE_NWU11B 0x2227 /* Network Everywhere NWU11B */ - -#define VENDOR_ID_NETGEAR 0x0864 -#define PRODUCT_ID_NETGEAR_MA101B 0x4102 /* Netgear MA 101 Rev. B */ - -#define VENDOR_ID_ACTIONTEC 0x1668 -#define PRODUCT_ID_ACTIONTEC_802UAT1 0x7605 /* Actiontec 802UAT1, HWU01150-01UK */ - -#define VENDOR_ID_DLINK 0x2001 /* D-Link */ -#define PRODUCT_ID_DLINK_DWL120 0x3200 /* DWL-120 rev. E */ - -#define VENDOR_ID_DICK_SMITH_ELECTR 0x1371 /* Dick Smith Electronics */ -#define PRODUCT_ID_DSE_XH1153 0x5743 /* XH1153 802.11b USB adapter */ - /* also: CNet CNUSB611 (D) */ -#define PRODUCT_ID_WL_200U 0x0002 /* WL-200U */ - -#define VENDOR_ID_BENQ 0x04a5 /* BenQ (Acer) */ -#define PRODUCT_ID_BENQ_AWL_400 0x9001 /* BenQ AWL-400 USB stick */ - -#define VENDOR_ID_3COM 0x506 -#define PRODUCT_ID_3COM_3CRSHEW696 0xa01 /* 3COM 3CRSHEW696 */ - -#define VENDOR_ID_SIEMENS 0x681 -#define PRODUCT_ID_SIEMENS_SANTIS_WLL013 0x1b /* Siemens Santis ADSL WLAN - USB adapter WLL 013 */ - -#define VENDOR_ID_BELKIN_2 0x50d -#define PRODUCT_ID_BELKIN_F5D6050_V2 0x50 /* Belkin F5D6050, version 2 */ - -#define VENDOR_ID_BLITZ 0x07b8 -#define PRODUCT_ID_BLITZ_NETWAVE_BWU613 0xb000 /* iBlitzz, BWU613 (not *B or *SB !) */ - -#define VENDOR_ID_GIGABYTE 0x1044 -#define PRODUCT_ID_GIGABYTE_GN_WLBM101 0x8003 /* Gigabyte GN-WLBM101 */ - -#define VENDOR_ID_PLANEX 0x2019 -#define PRODUCT_ID_PLANEX_GW_US11S 0x3220 /* Planex GW-US11S */ - -#define VENDOR_ID_COMPAQ 0x049f -#define PRODUCT_ID_IPAQ_INT_WLAN 0x0032 /* internal WLAN adapter in h5[4,5]xx series iPAQs */ - - -/* at76c503-rfmd-acc */ -#define VENDOR_ID_BELKIN 0x0d5c -#define PRODUCT_ID_BELKIN_F5D6050 0xa002 /* Belkin F5D6050 / SMC 2662W v2 / SMC 2662W-AR */ - -#define VENDOR_ID_SMC 0x083a -#define PRODUCT_ID_SMC_2664W 0x3501 - - -/* at76c505-rfmd */ -#define VENDOR_ID_ATMEL 0x03eb -#define PRODUCT_ID_ATMEL_505R 0x7606 /* Generic AT76C505/RFMD device */ - - -/* at76c505-rfmd2958 */ -#define VENDOR_ID_ATMEL 0x03eb -#define PRODUCT_ID_ATMEL_505R2958 0x7613 /* Generic AT76C505/RFMD device - also OvisLink WL-1130USB */ - -#define VENDOR_ID_CNET 0x1371 -#define PRODUCT_ID_CNET_CNUSB611G 0x0013 /* CNet CNUSB 611G */ -#define PRODUCT_ID_FL_WL240U 0x0014 /* Fiberline WL-240U with the - CNet vendor id */ - -#define VENDOR_ID_LINKSYS_1915 0x1915 -#define PRODUCT_ID_LINKSYS_WUSB11V28 0x2233 /* Linksys WUSB11 v2.8 */ - -#define VENDOR_ID_XTERASYS 0x12fd -#define PRODUCT_ID_XTERASYS_XN_2122B 0x1001 /* Xterasys XN-2122B, also - IBlitzz BWU613B / BWU613SB */ - -#define VENDOR_ID_COREGA 0x07aa -#define PRODUCT_ID_COREGA_USB_STICK_11_KK 0x7613 /* Corega WLAN USB Stick 11 (K.K.) */ - -#define VENDOR_ID_MSI 0x0db0 -#define PRODUCT_ID_MSI_MS6978_WLAN_BOX_PC2PC 0x1020 - - -/* at76c505a-rfmd2958 */ -#define VENDOR_ID_ATMEL 0x03eb -#define PRODUCT_ID_ATMEL_505A 0x7614 /* Generic AT76C505A device */ -#define PRODUCT_ID_ATMEL_505AS 0x7617 /* Generic AT76C505AS device */ - -#define VENDOR_ID_GIGASET 0x1690 -#define PRODUCT_ID_GIGASET_11 0x0701 - - -/* at76c505amx-rfmd */ -#define VENDOR_ID_ATMEL 0x03eb -#define PRODUCT_ID_ATMEL_505AMX 0x7615 /* Generic AT76C505AMX device */ - - -static struct usb_device_id dev_table[] = { - { USB_DEVICE(VENDOR_ID_ATMEL, PRODUCT_ID_ATMEL_503I ), - .driver_info = BOARDTYPE_503_INTERSIL_3861 }, - { USB_DEVICE(VENDOR_ID_LINKSYS_OLD, PRODUCT_ID_LINKSYS_WUSB11_V21), - .driver_info = BOARDTYPE_503_INTERSIL_3861 }, - { USB_DEVICE(VENDOR_ID_NETGEAR, PRODUCT_ID_NETGEAR_MA101A ), - .driver_info = BOARDTYPE_503_INTERSIL_3861 }, - { USB_DEVICE(VENDOR_ID_TEKRAM, PRODUCT_ID_TEKRAM_U300C ), - .driver_info = BOARDTYPE_503_INTERSIL_3861 }, - { USB_DEVICE(VENDOR_ID_HP, PRODUCT_ID_HP_HN210W ), - .driver_info = BOARDTYPE_503_INTERSIL_3861 }, - { USB_DEVICE(VENDOR_ID_M4Y750, PRODUCT_ID_M4Y750 ), - .driver_info = BOARDTYPE_503_INTERSIL_3861 }, - { USB_DEVICE(VENDOR_ID_DYNALINK, PRODUCT_ID_DYNALINK_WLL013_I ), - .driver_info = BOARDTYPE_503_INTERSIL_3861 }, - { USB_DEVICE(VENDOR_ID_SMC_OLD, PRODUCT_ID_SMC2662W_V1 ), - .driver_info = BOARDTYPE_503_INTERSIL_3861 }, - { USB_DEVICE(VENDOR_ID_BENQ, PRODUCT_ID_BENQ_AWL_300 ), - .driver_info = BOARDTYPE_503_INTERSIL_3861 }, - { USB_DEVICE(VENDOR_ID_ADDTRON, PRODUCT_ID_ADDTRON_AWU120 ), - .driver_info = BOARDTYPE_503_INTERSIL_3861 }, - { USB_DEVICE(VENDOR_ID_INTEL, PRODUCT_ID_INTEL_AP310 ), - .driver_info = BOARDTYPE_503_INTERSIL_3861 }, - { USB_DEVICE(VENDOR_ID_CONCEPTRONIC,PRODUCT_ID_CONCEPTRONIC_C11U), - .driver_info = BOARDTYPE_503_INTERSIL_3861 }, - { USB_DEVICE(VENDOR_ID_ARESCOM, PRODUCT_ID_WL_210), - .driver_info = BOARDTYPE_503_INTERSIL_3861 }, - { USB_DEVICE(VENDOR_ID_IO_DATA, PRODUCT_ID_IO_DATA_WN_B11_USB), - .driver_info = BOARDTYPE_503_INTERSIL_3861 }, - { USB_DEVICE(VENDOR_ID_BT, PRODUCT_ID_BT_VOYAGER_1010 ), - .driver_info = BOARDTYPE_503_INTERSIL_3861 }, - - { USB_DEVICE(VENDOR_ID_ATMEL, PRODUCT_ID_ATMEL_503_I3863 ), - .driver_info = BOARDTYPE_503_INTERSIL_3863 }, - { USB_DEVICE(VENDOR_ID_SAMSUNG, PRODUCT_ID_SAMSUNG_SWL2100U), - .driver_info = BOARDTYPE_503_INTERSIL_3863 }, - - { USB_DEVICE(VENDOR_ID_ATMEL, PRODUCT_ID_ATMEL_503R ), - .driver_info = BOARDTYPE_503_RFMD }, - { USB_DEVICE(VENDOR_ID_DYNALINK, PRODUCT_ID_DYNALINK_WLL013_R ), - .driver_info = BOARDTYPE_503_RFMD }, - { USB_DEVICE(VENDOR_ID_LINKSYS, PRODUCT_ID_LINKSYS_WUSB11_V26), - .driver_info = BOARDTYPE_503_RFMD }, - { USB_DEVICE(VENDOR_ID_LINKSYS, PRODUCT_ID_NE_NWU11B ), - .driver_info = BOARDTYPE_503_RFMD }, - { USB_DEVICE(VENDOR_ID_NETGEAR, PRODUCT_ID_NETGEAR_MA101B ), - .driver_info = BOARDTYPE_503_RFMD }, - { USB_DEVICE(VENDOR_ID_DLINK, PRODUCT_ID_DLINK_DWL120 ), - .driver_info = BOARDTYPE_503_RFMD }, - { USB_DEVICE(VENDOR_ID_ACTIONTEC,PRODUCT_ID_ACTIONTEC_802UAT1 ), - .driver_info = BOARDTYPE_503_RFMD }, - { USB_DEVICE(VENDOR_ID_ATMEL, PRODUCT_ID_W_BUDDIE_WN210 ), - .driver_info = BOARDTYPE_503_RFMD }, - { USB_DEVICE(VENDOR_ID_DICK_SMITH_ELECTR, PRODUCT_ID_DSE_XH1153), - .driver_info = BOARDTYPE_503_RFMD }, - { USB_DEVICE(VENDOR_ID_DICK_SMITH_ELECTR, PRODUCT_ID_WL_200U), - .driver_info = BOARDTYPE_503_RFMD }, - { USB_DEVICE(VENDOR_ID_BENQ, PRODUCT_ID_BENQ_AWL_400), - .driver_info = BOARDTYPE_503_RFMD }, - { USB_DEVICE(VENDOR_ID_3COM, PRODUCT_ID_3COM_3CRSHEW696), - .driver_info = BOARDTYPE_503_RFMD }, - { USB_DEVICE(VENDOR_ID_SIEMENS, PRODUCT_ID_SIEMENS_SANTIS_WLL013), - .driver_info = BOARDTYPE_503_RFMD }, - { USB_DEVICE(VENDOR_ID_BELKIN_2, PRODUCT_ID_BELKIN_F5D6050_V2 ), - .driver_info = BOARDTYPE_503_RFMD }, - { USB_DEVICE(VENDOR_ID_BLITZ, PRODUCT_ID_BLITZ_NETWAVE_BWU613 ), - .driver_info = BOARDTYPE_503_RFMD }, - { USB_DEVICE(VENDOR_ID_GIGABYTE, PRODUCT_ID_GIGABYTE_GN_WLBM101 ), - .driver_info = BOARDTYPE_503_RFMD }, - { USB_DEVICE(VENDOR_ID_PLANEX, PRODUCT_ID_PLANEX_GW_US11S ), - .driver_info = BOARDTYPE_503_RFMD }, - { USB_DEVICE(VENDOR_ID_COMPAQ, PRODUCT_ID_IPAQ_INT_WLAN), - .driver_info = BOARDTYPE_503_RFMD }, - - { USB_DEVICE(VENDOR_ID_SMC, PRODUCT_ID_SMC_2664W), - .driver_info = BOARDTYPE_503_RFMD_ACC }, - { USB_DEVICE(VENDOR_ID_BELKIN, PRODUCT_ID_BELKIN_F5D6050 ), - .driver_info = BOARDTYPE_503_RFMD_ACC }, - - { USB_DEVICE(VENDOR_ID_ATMEL, PRODUCT_ID_ATMEL_505R ), - .driver_info = BOARDTYPE_505_RFMD }, - - { USB_DEVICE(VENDOR_ID_ATMEL, PRODUCT_ID_ATMEL_505R2958 ), - .driver_info = BOARDTYPE_505_RFMD_2958 }, - { USB_DEVICE(VENDOR_ID_CNET, PRODUCT_ID_FL_WL240U ), - .driver_info = BOARDTYPE_505_RFMD_2958 }, - { USB_DEVICE(VENDOR_ID_CNET, PRODUCT_ID_CNET_CNUSB611G ), - .driver_info = BOARDTYPE_505_RFMD_2958 }, - { USB_DEVICE(VENDOR_ID_LINKSYS_1915, PRODUCT_ID_LINKSYS_WUSB11V28 ), - .driver_info = BOARDTYPE_505_RFMD_2958 }, - { USB_DEVICE(VENDOR_ID_XTERASYS, PRODUCT_ID_XTERASYS_XN_2122B ), - .driver_info = BOARDTYPE_505_RFMD_2958 }, - { USB_DEVICE(VENDOR_ID_COREGA, PRODUCT_ID_COREGA_USB_STICK_11_KK ), - .driver_info = BOARDTYPE_505_RFMD_2958 }, - { USB_DEVICE(VENDOR_ID_MSI, PRODUCT_ID_MSI_MS6978_WLAN_BOX_PC2PC), - .driver_info = BOARDTYPE_505_RFMD_2958 }, - - { USB_DEVICE(VENDOR_ID_ATMEL, PRODUCT_ID_ATMEL_505A ), - .driver_info = BOARDTYPE_505A_RFMD_2958 }, - { USB_DEVICE(VENDOR_ID_ATMEL, PRODUCT_ID_ATMEL_505AS ), - .driver_info = BOARDTYPE_505A_RFMD_2958 }, - { USB_DEVICE(VENDOR_ID_GIGASET, PRODUCT_ID_GIGASET_11 ), - .driver_info = BOARDTYPE_505A_RFMD_2958 }, - - { USB_DEVICE(VENDOR_ID_ATMEL, PRODUCT_ID_ATMEL_505AMX ), - .driver_info = BOARDTYPE_505AMX_RFMD }, - - { } -}; - -MODULE_DEVICE_TABLE (usb, dev_table); - - static int at76c50x_probe(struct usb_interface *interface, const struct usb_device_id *id) { @@ -7049,7 +6765,6 @@ static struct usb_driver module_usb = { .id_table = dev_table, }; - static int __init mod_init(void) { int result; @@ -7095,6 +6810,34 @@ static void __exit mod_exit(void) #endif } +module_param_named(debug, at76_debug, int, 0600); +MODULE_PARM_DESC(debug, "Debugging level"); +module_param(rx_copybreak, int, 0400); +MODULE_PARM_DESC(rx_copybreak, "rx packet copy threshold"); +module_param(scan_min_time, int, 0400); +MODULE_PARM_DESC(scan_min_time, "scan min channel time (default: 10)"); +module_param(scan_max_time, int, 0400); +MODULE_PARM_DESC(scan_max_time, "scan max channel time (default: 120)"); +module_param(scan_mode, int, 0400); +MODULE_PARM_DESC(scan_mode, "scan mode: 0 active (with ProbeReq, default), 1 passive"); +module_param(preamble_type, int, 0400); +MODULE_PARM_DESC(preamble_type, "preamble type: 0 long (default), 1 short"); +module_param(auth_mode, int, 0400); +MODULE_PARM_DESC(auth_mode, "authentication mode: 0 open system (default), 1 shared secret"); +module_param(pm_mode, int, 0400); +MODULE_PARM_DESC(pm_mode, "power management mode: 1 active (def.), 2 powersave, 3 smart save"); +module_param(pm_period, int, 0400); +MODULE_PARM_DESC(pm_period, "period of waking up the device in usec"); +module_param(international_roaming, int, 0400); +MODULE_PARM_DESC(international_roaming, "enable international roaming: 0 (no, default), 1 (yes)"); +module_param(default_iw_mode, int, 0400); +MODULE_PARM_DESC(default_iw_mode, "default IW mode for a new device: 1 (ad-hoc), 2 (infrastructure, def.), 6 (monitor mode)"); +module_param(monitor_scan_min_time, int, 0400); +MODULE_PARM_DESC(monitor_scan_min_time, "scan min channel time in MONITOR MODE (default: 50)"); +module_param(monitor_scan_max_time, int, 0400); +MODULE_PARM_DESC(monitor_scan_max_time, "scan max channel time in MONITOR MODE (default: 600)"); +module_param(netdev_name, charp, 0400); + module_init(mod_init); module_exit(mod_exit); @@ -1,26 +1,22 @@ -/* -*- linux-c -*- */ /* - * Copyright (c) 2002 - 2003 Oliver Kurth - * (c) 2003 - 2004 Jörg Albert <joerg.albert@gmx.de> + * Copyright (c) 2002,2003 Oliver Kurth + * (c) 2003,2004 Jörg Albert <joerg.albert@gmx.de> + * (c) 2007 Guido Guenther <agx@sigxcpu.org> * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. * - * This driver was based on information from the Sourceforge driver - * released and maintained by Atmel: + * This driver was based on information from the Sourceforge driver + * released and maintained by Atmel: * * http://sourceforge.net/projects/atmelwlandriver/ * - * Although the code was completely re-written, - * it would have been impossible without Atmel's decision to - * release an Open Source driver (unfortunately the firmware was - * kept binary only). Thanks for that decision to Atmel! - * - * For the latest version of this driver, mailinglists - * and other info, please check - * http://at76c503a.berlios.de/ + * Although the code was completely re-written, + * it would have been impossible without Atmel's decision to + * release an Open Source driver (unfortunately the firmware was + * kept binary only). Thanks for that decision to Atmel! */ #ifndef _AT76C503_H @@ -29,8 +25,7 @@ #include <net/ieee80211.h> /* current driver version */ -#define DRIVER_VERSION "0.14dev" - +#define DRIVER_VERSION "0.15dev" /* our private ioctl's */ /* set preamble length*/ @@ -137,15 +132,6 @@ #define PRIVACY_OPT_IMPL offsetof(struct mib_mac_mgmt, privacy_option_implemented) -#define BOARDTYPE_503_INTERSIL_3861 1 -#define BOARDTYPE_503_INTERSIL_3863 2 -#define BOARDTYPE_503_RFMD 3 -#define BOARDTYPE_503_RFMD_ACC 4 -#define BOARDTYPE_505_RFMD 5 -#define BOARDTYPE_505_RFMD_2958 6 -#define BOARDTYPE_505A_RFMD_2958 7 -#define BOARDTYPE_505AMX_RFMD 8 - struct hwcfg_r505 { u8 cr39_values[14]; u8 reserved1[14]; @@ -379,6 +365,11 @@ struct mib_mdomain { u8 channel_list[14]; /* 0 for invalid channels */ } __attribute__ ((packed)); +static u8 snapsig[] = {0xaa, 0xaa, 0x03}; +/* RFC 1042 encapsulates Ethernet frames in 802.2 SNAP (0xaa, 0xaa, 0x03) with + * a SNAP OID of 0 (0x00, 0x00, 0x00) */ +static u8 rfc1042sig[] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00}; + /* states in infrastructure mode */ enum infra_state { INIT, @@ -396,6 +387,21 @@ enum infra_state { MONITORING, }; +#define KEVENT_CTRL_HALT 1 +#define KEVENT_NEW_BSS 2 +#define KEVENT_SET_PROMISC 3 +#define KEVENT_MGMT_TIMEOUT 4 +#define KEVENT_SCAN 5 +#define KEVENT_JOIN 6 +#define KEVENT_STARTIBSS 7 +#define KEVENT_SUBMIT_RX 8 +#define KEVENT_RESTART 9 /* restart the device */ +#define KEVENT_ASSOC_DONE 10 /* execute the power save settings: + listen interval, pm mode, assoc id */ +#define KEVENT_EXTERNAL_FW 11 +#define KEVENT_INTERNAL_FW 12 +#define KEVENT_RESET_DEVICE 13 + /* a description of a regulatory domain and the allowed channels */ struct reg_domain { u16 code; @@ -408,7 +414,6 @@ struct reg_domain { (by iwlist ?) after the device started, because all entries from other channels than the one the device locks on get removed, too */ #define BSS_LIST_TIMEOUT (120*HZ) - /* struct to store BSS info found during scan */ #define BSS_LIST_MAX_RATE_LEN 32 /* 32 rates should be enough ... */ @@ -451,7 +456,6 @@ struct rx_data_buf { }; #define NR_RX_DATA_BUF 8 - /* how often do we try to submit a rx urb until giving up */ #define NR_SUBMIT_RX_TRIES 8 @@ -636,8 +640,8 @@ typedef struct p80211msg uint8_t devname[IFNAMSIZ]; } __attribute__ ((packed)) p80211msg_t; -#define P80211ENUM_msgitem_status_data_ok 0 -#define P80211ENUM_msgitem_status_no_value 1 +#define P80211ENUM_msgitem_status_data_ok 0 +#define P80211ENUM_msgitem_status_no_value 1 #define P80211ENUM_truth_false 0 #define P80211ENUM_truth_true 1 @@ -670,6 +674,118 @@ typedef struct p80211msg_lnxind_wlansniffrm p80211item_uint32_t frmlen; } __attribute__ ((packed)) p80211msg_lnxind_wlansniffrm_t; +#define BEACON_MAX_DATA_LENGTH 1500 +/* beacon in ieee80211_hdr_3addr.payload */ +struct ieee802_11_beacon_data { + u8 timestamp[8]; /* TSFTIMER */ + __le16 beacon_interval; /* Kms between TBTTs (Target Beacon Transmission Times) */ + __le16 capability_information; + u8 data[BEACON_MAX_DATA_LENGTH]; /* contains: SSID (tag,length,value), + Supported Rates (tlv), channel */ +} __attribute__ ((packed)); + +/* disassoc frame in ieee80211_hdr_3addr.payload */ +struct ieee802_11_disassoc_frame { + __le16 reason; +} __attribute__ ((packed)); +#define DISASSOC_FRAME_SIZE \ + (AT76C503_TX_HDRLEN + IEEE802_11_MGMT_HEADER_SIZE +\ + sizeof(struct ieee802_11_disassoc_frame)) + +/* assoc request in ieee80211_hdr_3addr.payload */ +struct ieee802_11_assoc_req { + __le16 capability; + __le16 listen_interval; + u8 data[1]; /* variable number of bytes for SSID + and supported rates (tlv coded) */ +}; +/* the maximum size of an AssocReq packet */ +#define ASSOCREQ_MAX_SIZE \ + (AT76C503_TX_HDRLEN + IEEE802_11_MGMT_HEADER_SIZE +\ + offsetof(struct ieee802_11_assoc_req,data) +\ + 1+1+IW_ESSID_MAX_SIZE + 1+1+4) + +/* reassoc request in ieee80211_hdr_3addr.payload */ +struct ieee802_11_reassoc_req { + __le16 capability; + __le16 listen_interval; + u8 curr_ap[ETH_ALEN]; /* the bssid of the AP we are + currently associated to */ + u8 data[1]; /* variable number of bytes for SSID + and supported rates (tlv coded) */ +} __attribute__ ((packed)); + +/* the maximum size of an AssocReq packet */ +#define REASSOCREQ_MAX_SIZE \ + (AT76C503_TX_HDRLEN + IEEE802_11_MGMT_HEADER_SIZE +\ + offsetof(struct ieee802_11_reassoc_req,data) +\ + 1+1+IW_ESSID_MAX_SIZE + 1+1+4) + +/* assoc/reassoc response */ +struct ieee802_11_assoc_resp { + __le16 capability; + __le16 status; + __le16 assoc_id; + u8 data[1]; /* variable number of bytes for + supported rates (tlv coded) */ +} __attribute__ ((packed)); + +/* auth. request/response in ieee80211_hdr_3addr.payload */ +struct ieee802_11_auth_frame { + __le16 algorithm; + __le16 seq_nr; + __le16 status; + u8 challenge[0]; +} __attribute__ ((packed)); +/* for shared secret auth, add the challenge text size */ +#define AUTH_FRAME_SIZE \ + (AT76C503_TX_HDRLEN + IEEE802_11_MGMT_HEADER_SIZE +\ + sizeof(struct ieee802_11_auth_frame)) + +/* deauth frame in ieee80211_hdr_3addr.payload */ +struct ieee802_11_deauth_frame { + __le16 reason; +} __attribute__ ((packed)); +#define DEAUTH_FRAME_SIZE \ + (AT76C503_TX_HDRLEN + IEEE802_11_MGMT_HEADER_SIZE +\ + sizeof(struct ieee802_11_disauth_frame)) + +/* how often do we re-try these packets ? */ +#define AUTH_RETRIES 3 +#define ASSOC_RETRIES 3 +#define DISASSOC_RETRIES 3 + +/* the beacon timeout in infra mode when we are connected (in seconds) */ +#define BEACON_TIMEOUT 10 +/* the interval in ticks we poll if scan is completed */ +#define SCAN_POLL_INTERVAL (HZ/4) + +#define DEF_RTS_THRESHOLD 1536 +#define DEF_FRAG_THRESHOLD 1536 +#define DEF_SHORT_RETRY_LIMIT 8 +#define DEF_CHANNEL 10 + +#define MAX_RTS_THRESHOLD (MAX_FRAG_THRESHOLD + 1) + +/* The frequency of each channel in MHz */ +static const long channel_frequency[] = { + 2412, 2417, 2422, 2427, 2432, 2437, 2442, + 2447, 2452, 2457, 2462, 2467, 2472, 2484 +}; +#define NUM_CHANNELS ( sizeof(channel_frequency) / sizeof(channel_frequency[0]) ) + +/* the broadcast address */ +static const u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; +static const u8 off_addr[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +/* the supported rates of this hardware, bit7 marks a basic rate */ +static const u8 hw_rates[4] = {0x82,0x84,0x0b,0x16}; + +/* the max padding size for tx in bytes (see calc_padding) */ +#define MAX_PADDING_SIZE 53 + +/* the size of the ieee802.11 header (excl. the at76c503 tx header) */ +#define IEEE802_11_MGMT_HEADER_SIZE offsetof(struct ieee80211_hdr_3addr, payload) + /* at76_debug bits */ #define DBG_PROGRESS 0x00000001 /* progress of scan-join-(auth-assoc)-connected */ #define DBG_BSS_TABLE 0x00000002 /* show the bss table after scans */ |