1*9113SPengcheng.Chen@Sun.COM /* 2*9113SPengcheng.Chen@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 3*9113SPengcheng.Chen@Sun.COM * Use is subject to license terms. 4*9113SPengcheng.Chen@Sun.COM */ 5*9113SPengcheng.Chen@Sun.COM 6*9113SPengcheng.Chen@Sun.COM /* 7*9113SPengcheng.Chen@Sun.COM * Copyright (c) 2003 8*9113SPengcheng.Chen@Sun.COM * Daan Vreeken <Danovitsch@Vitsch.net>. All rights reserved. 9*9113SPengcheng.Chen@Sun.COM * 10*9113SPengcheng.Chen@Sun.COM * Redistribution and use in source and binary forms, with or without 11*9113SPengcheng.Chen@Sun.COM * modification, are permitted provided that the following conditions 12*9113SPengcheng.Chen@Sun.COM * are met: 13*9113SPengcheng.Chen@Sun.COM * 1. Redistributions of source code must retain the above copyright 14*9113SPengcheng.Chen@Sun.COM * notice, this list of conditions and the following disclaimer. 15*9113SPengcheng.Chen@Sun.COM * 2. Redistributions in binary form must reproduce the above copyright 16*9113SPengcheng.Chen@Sun.COM * notice, this list of conditions and the following disclaimer in the 17*9113SPengcheng.Chen@Sun.COM * documentation and/or other materials provided with the distribution. 18*9113SPengcheng.Chen@Sun.COM * 3. All advertising materials mentioning features or use of this software 19*9113SPengcheng.Chen@Sun.COM * must display the following acknowledgement: 20*9113SPengcheng.Chen@Sun.COM * This product includes software developed by Daan Vreeken. 21*9113SPengcheng.Chen@Sun.COM * 4. Neither the name of the author nor the names of any co-contributors 22*9113SPengcheng.Chen@Sun.COM * may be used to endorse or promote products derived from this software 23*9113SPengcheng.Chen@Sun.COM * without specific prior written permission. 24*9113SPengcheng.Chen@Sun.COM * 25*9113SPengcheng.Chen@Sun.COM * THIS SOFTWARE IS PROVIDED BY DAAN VREEKEN AND CONTRIBUTORS ``AS IS'' AND 26*9113SPengcheng.Chen@Sun.COM * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27*9113SPengcheng.Chen@Sun.COM * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28*9113SPengcheng.Chen@Sun.COM * ARE DISCLAIMED. IN NO EVENT SHALL Daan Vreeken OR THE VOICES IN HIS HEAD 29*9113SPengcheng.Chen@Sun.COM * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 30*9113SPengcheng.Chen@Sun.COM * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 31*9113SPengcheng.Chen@Sun.COM * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 32*9113SPengcheng.Chen@Sun.COM * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 33*9113SPengcheng.Chen@Sun.COM * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 34*9113SPengcheng.Chen@Sun.COM * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 35*9113SPengcheng.Chen@Sun.COM * THE POSSIBILITY OF SUCH DAMAGE. 36*9113SPengcheng.Chen@Sun.COM * 37*9113SPengcheng.Chen@Sun.COM */ 38*9113SPengcheng.Chen@Sun.COM 39*9113SPengcheng.Chen@Sun.COM #ifndef _ATU_H 40*9113SPengcheng.Chen@Sun.COM #define _ATU_H 41*9113SPengcheng.Chen@Sun.COM 42*9113SPengcheng.Chen@Sun.COM #ifdef __cplusplus 43*9113SPengcheng.Chen@Sun.COM extern "C" { 44*9113SPengcheng.Chen@Sun.COM #endif 45*9113SPengcheng.Chen@Sun.COM 46*9113SPengcheng.Chen@Sun.COM enum atu_radio_type { 47*9113SPengcheng.Chen@Sun.COM RadioRFMD, 48*9113SPengcheng.Chen@Sun.COM RadioRFMD2958, 49*9113SPengcheng.Chen@Sun.COM RadioRFMD2958_SMC, 50*9113SPengcheng.Chen@Sun.COM RadioIntersil, 51*9113SPengcheng.Chen@Sun.COM AT76C503_i3863, 52*9113SPengcheng.Chen@Sun.COM AT76C503_RFMD_ACC, 53*9113SPengcheng.Chen@Sun.COM AT76C505_RFMD 54*9113SPengcheng.Chen@Sun.COM }; 55*9113SPengcheng.Chen@Sun.COM 56*9113SPengcheng.Chen@Sun.COM struct atu_dev_type { 57*9113SPengcheng.Chen@Sun.COM uint16_t atu_vid; 58*9113SPengcheng.Chen@Sun.COM uint16_t atu_pid; 59*9113SPengcheng.Chen@Sun.COM enum atu_radio_type atu_radio; 60*9113SPengcheng.Chen@Sun.COM uint16_t atu_quirk; 61*9113SPengcheng.Chen@Sun.COM }; 62*9113SPengcheng.Chen@Sun.COM 63*9113SPengcheng.Chen@Sun.COM struct atu_firmware { 64*9113SPengcheng.Chen@Sun.COM enum atu_radio_type atur_type; 65*9113SPengcheng.Chen@Sun.COM uint8_t *atur_int; 66*9113SPengcheng.Chen@Sun.COM uint8_t *atur_ext; 67*9113SPengcheng.Chen@Sun.COM uint_t atur_int_size; 68*9113SPengcheng.Chen@Sun.COM uint_t atur_ext_size; 69*9113SPengcheng.Chen@Sun.COM uint8_t max_rssi; 70*9113SPengcheng.Chen@Sun.COM }; 71*9113SPengcheng.Chen@Sun.COM 72*9113SPengcheng.Chen@Sun.COM struct atu_softc { 73*9113SPengcheng.Chen@Sun.COM struct ieee80211com sc_ic; 74*9113SPengcheng.Chen@Sun.COM 75*9113SPengcheng.Chen@Sun.COM char sc_name[16]; 76*9113SPengcheng.Chen@Sun.COM uint32_t sc_flags; 77*9113SPengcheng.Chen@Sun.COM enum atu_radio_type sc_radio; 78*9113SPengcheng.Chen@Sun.COM uint16_t sc_quirk; 79*9113SPengcheng.Chen@Sun.COM 80*9113SPengcheng.Chen@Sun.COM dev_info_t *sc_dip; 81*9113SPengcheng.Chen@Sun.COM usb_client_dev_data_t *sc_udev; 82*9113SPengcheng.Chen@Sun.COM usb_pipe_handle_t sc_rx_pipe; 83*9113SPengcheng.Chen@Sun.COM usb_pipe_handle_t sc_tx_pipe; 84*9113SPengcheng.Chen@Sun.COM 85*9113SPengcheng.Chen@Sun.COM kmutex_t sc_genlock; 86*9113SPengcheng.Chen@Sun.COM kmutex_t sc_txlock; 87*9113SPengcheng.Chen@Sun.COM kmutex_t sc_rxlock; 88*9113SPengcheng.Chen@Sun.COM 89*9113SPengcheng.Chen@Sun.COM boolean_t sc_need_sched; 90*9113SPengcheng.Chen@Sun.COM int tx_queued; 91*9113SPengcheng.Chen@Sun.COM int rx_queued; 92*9113SPengcheng.Chen@Sun.COM 93*9113SPengcheng.Chen@Sun.COM uint32_t sc_tx_nobuf; 94*9113SPengcheng.Chen@Sun.COM uint32_t sc_rx_nobuf; 95*9113SPengcheng.Chen@Sun.COM uint32_t sc_rx_err; 96*9113SPengcheng.Chen@Sun.COM 97*9113SPengcheng.Chen@Sun.COM timeout_id_t sc_scan_timer; 98*9113SPengcheng.Chen@Sun.COM 99*9113SPengcheng.Chen@Sun.COM int (*sc_newstate)(struct ieee80211com *, 100*9113SPengcheng.Chen@Sun.COM enum ieee80211_state, int); 101*9113SPengcheng.Chen@Sun.COM }; 102*9113SPengcheng.Chen@Sun.COM 103*9113SPengcheng.Chen@Sun.COM #define ATU_FLAG_RUNNING (1<<0) 104*9113SPengcheng.Chen@Sun.COM #define ATU_FLAG_REATTACH (1<<1) 105*9113SPengcheng.Chen@Sun.COM #define ATU_FLAG_RADIO_ON (1<<2) 106*9113SPengcheng.Chen@Sun.COM 107*9113SPengcheng.Chen@Sun.COM #define ATU_RUNNING(sc) ((sc)->sc_flags & ATU_FLAG_RUNNING) 108*9113SPengcheng.Chen@Sun.COM #define ATU_REATTACH(sc) ((sc)->sc_flags & ATU_FLAG_REATTACH) 109*9113SPengcheng.Chen@Sun.COM #define ATU_RADIO_ON(sc) ((sc)->sc_flags & ATU_FLAG_RADIO_ON) 110*9113SPengcheng.Chen@Sun.COM 111*9113SPengcheng.Chen@Sun.COM #define ATU_LOCK(sc) mutex_enter(&(sc)->sc_genlock) 112*9113SPengcheng.Chen@Sun.COM #define ATU_UNLOCK(sc) mutex_exit(&(sc)->sc_genlock) 113*9113SPengcheng.Chen@Sun.COM 114*9113SPengcheng.Chen@Sun.COM #define ATU_RX_LIST_CNT 1 115*9113SPengcheng.Chen@Sun.COM #define ATU_TX_LIST_CNT 8 116*9113SPengcheng.Chen@Sun.COM #define ATU_MIN_FRAMELEN sizeof (struct ieee80211_frame_min) 117*9113SPengcheng.Chen@Sun.COM 118*9113SPengcheng.Chen@Sun.COM #define ATU_RX_BUFSZ \ 119*9113SPengcheng.Chen@Sun.COM (ATU_RX_HDRLEN + \ 120*9113SPengcheng.Chen@Sun.COM sizeof (struct ieee80211_frame_addr4) + \ 121*9113SPengcheng.Chen@Sun.COM 2312 + 4) 122*9113SPengcheng.Chen@Sun.COM #define ATU_TX_BUFSZ \ 123*9113SPengcheng.Chen@Sun.COM (ATU_TX_HDRLEN + \ 124*9113SPengcheng.Chen@Sun.COM sizeof (struct ieee80211_frame_addr4) + 2312) 125*9113SPengcheng.Chen@Sun.COM 126*9113SPengcheng.Chen@Sun.COM #define ATU_DEF_CHAN 10 127*9113SPengcheng.Chen@Sun.COM #define ATU_DEF_TX_RATE 3 128*9113SPengcheng.Chen@Sun.COM #define ATU_JOIN_TIMEOUT 2000 129*9113SPengcheng.Chen@Sun.COM 130*9113SPengcheng.Chen@Sun.COM #define ATU_QUIRK_NONE 0x0000 131*9113SPengcheng.Chen@Sun.COM #define ATU_QUIRK_NO_REMAP 0x0001 132*9113SPengcheng.Chen@Sun.COM #define ATU_QUIRK_FW_DELAY 0x0002 133*9113SPengcheng.Chen@Sun.COM 134*9113SPengcheng.Chen@Sun.COM #define ATU_ENC_NONE 0 135*9113SPengcheng.Chen@Sun.COM #define ATU_ENC_WEP40 1 136*9113SPengcheng.Chen@Sun.COM #define ATU_ENC_WEP104 2 137*9113SPengcheng.Chen@Sun.COM 138*9113SPengcheng.Chen@Sun.COM #define ATU_MODE_IBSS 1 139*9113SPengcheng.Chen@Sun.COM #define ATU_MODE_STA 2 140*9113SPengcheng.Chen@Sun.COM 141*9113SPengcheng.Chen@Sun.COM #define ATU_POWER_ACTIVE 1 142*9113SPengcheng.Chen@Sun.COM #define ATU_POWER_SAVE 2 143*9113SPengcheng.Chen@Sun.COM #define ATU_POWER_SMART 3 144*9113SPengcheng.Chen@Sun.COM 145*9113SPengcheng.Chen@Sun.COM #define ATU_PREAMBLE_LONG 0 146*9113SPengcheng.Chen@Sun.COM #define ATU_PREAMBLE_SHORT 1 147*9113SPengcheng.Chen@Sun.COM 148*9113SPengcheng.Chen@Sun.COM /* AT76c503 operating modes */ 149*9113SPengcheng.Chen@Sun.COM #define ATU_DEV_UNKNOWN 0x00 150*9113SPengcheng.Chen@Sun.COM #define ATU_DEV_READY 0x01 151*9113SPengcheng.Chen@Sun.COM #define ATU_DEV_CONFIG 0x02 152*9113SPengcheng.Chen@Sun.COM #define ATU_DEV_DFU 0x03 153*9113SPengcheng.Chen@Sun.COM #define ATU_DEV_STAGE2 0x04 154*9113SPengcheng.Chen@Sun.COM 155*9113SPengcheng.Chen@Sun.COM /* AT76c503 commands */ 156*9113SPengcheng.Chen@Sun.COM #define CMD_SET_MIB 0x01 157*9113SPengcheng.Chen@Sun.COM #define CMD_START_SCAN 0x03 158*9113SPengcheng.Chen@Sun.COM #define CMD_JOIN 0x04 159*9113SPengcheng.Chen@Sun.COM #define CMD_START_IBSS 0x05 160*9113SPengcheng.Chen@Sun.COM #define CMD_RADIO 0x06 161*9113SPengcheng.Chen@Sun.COM #define CMD_RADIO_ON 0x06 162*9113SPengcheng.Chen@Sun.COM #define CMD_RADIO_OFF 0x07 163*9113SPengcheng.Chen@Sun.COM #define CMD_STARTUP 0x0b 164*9113SPengcheng.Chen@Sun.COM 165*9113SPengcheng.Chen@Sun.COM /* AT76c503 wait status */ 166*9113SPengcheng.Chen@Sun.COM #define STATUS_IDLE 0x00 167*9113SPengcheng.Chen@Sun.COM #define STATUS_COMPLETE 0x01 168*9113SPengcheng.Chen@Sun.COM #define STATUS_UNKNOWN 0x02 169*9113SPengcheng.Chen@Sun.COM #define STATUS_INVALID_PARAMETER 0x03 170*9113SPengcheng.Chen@Sun.COM #define STATUS_FUNCTION_NOT_SUPPORTED 0x04 171*9113SPengcheng.Chen@Sun.COM #define STATUS_TIME_OUT 0x07 172*9113SPengcheng.Chen@Sun.COM #define STATUS_IN_PROGRESS 0x08 173*9113SPengcheng.Chen@Sun.COM #define STATUS_HOST_FAILURE 0xff 174*9113SPengcheng.Chen@Sun.COM #define STATUS_SCAN_FAILED 0xf0 175*9113SPengcheng.Chen@Sun.COM 176*9113SPengcheng.Chen@Sun.COM /* Name Type Size Index */ 177*9113SPengcheng.Chen@Sun.COM #define MIB_LOCAL 0x01 178*9113SPengcheng.Chen@Sun.COM #define MIB_LOCAL_BEACON_ENABLE MIB_LOCAL, 1, 2 179*9113SPengcheng.Chen@Sun.COM #define MIB_LOCAL_AUTO_RATE_FALLBACK MIB_LOCAL, 1, 3 180*9113SPengcheng.Chen@Sun.COM #define MIB_LOCAL_SSID_SIZE MIB_LOCAL, 1, 5 181*9113SPengcheng.Chen@Sun.COM #define MIB_LOCAL_PREAMBLE MIB_LOCAL, 1, 9 182*9113SPengcheng.Chen@Sun.COM #define MIB_MAC_ADDR 0x02 183*9113SPengcheng.Chen@Sun.COM #define MIB_MAC_ADDR_STA MIB_MAC_ADDR, 6, 0 184*9113SPengcheng.Chen@Sun.COM #define MIB_MAC 0x03 185*9113SPengcheng.Chen@Sun.COM #define MIB_MAC_FRAG MIB_MAC, 2, 8 186*9113SPengcheng.Chen@Sun.COM #define MIB_MAC_RTS MIB_MAC, 2, 10 187*9113SPengcheng.Chen@Sun.COM #define MIB_MAC_DESIRED_SSID MIB_MAC, 32, 28 188*9113SPengcheng.Chen@Sun.COM #define MIB_MAC_MGMT 0x05 189*9113SPengcheng.Chen@Sun.COM #define MIB_MAC_MGMT_BEACON_PERIOD MIB_MAC_MGMT, 2, 0 190*9113SPengcheng.Chen@Sun.COM #define MIB_MAC_MGMT_CURRENT_BSSID MIB_MAC_MGMT, 6, 14 191*9113SPengcheng.Chen@Sun.COM #define MIB_MAC_MGMT_CURRENT_ESSID MIB_MAC_MGMT, 32, 20 192*9113SPengcheng.Chen@Sun.COM #define MIB_MAC_MGMT_POWER_MODE MIB_MAC_MGMT, 1, 53 193*9113SPengcheng.Chen@Sun.COM #define MIB_MAC_MGMT_IBSS_CHANGE MIB_MAC_MGMT, 1, 54 194*9113SPengcheng.Chen@Sun.COM #define MIB_MAC_WEP 0x06 195*9113SPengcheng.Chen@Sun.COM #define MIB_MAC_WEP_PRIVACY_INVOKED MIB_MAC_WEP, 1, 0 196*9113SPengcheng.Chen@Sun.COM #define MIB_MAC_WEP_KEY_ID MIB_MAC_WEP, 1, 1 197*9113SPengcheng.Chen@Sun.COM #define MIB_MAC_WEP_ICV_ERROR_COUNT MIB_MAC_WEP, 4, 4 198*9113SPengcheng.Chen@Sun.COM #define MIB_MAC_WEP_EXCLUDED_COUNT MIB_MAC_WEP, 4, 8 199*9113SPengcheng.Chen@Sun.COM #define MIB_MAC_WEP_KEYS(nr) MIB_MAC_WEP, 13, 12+(nr)*13 200*9113SPengcheng.Chen@Sun.COM #define MIB_MAC_WEP_ENCR_LEVEL MIB_MAC_WEP, 1, 64 201*9113SPengcheng.Chen@Sun.COM #define MIB_PHY 0x07 202*9113SPengcheng.Chen@Sun.COM #define MIB_PHY_CHANNEL MIB_PHY, 1, 20 203*9113SPengcheng.Chen@Sun.COM #define MIB_PHY_REG_DOMAIN MIB_PHY, 1, 23 204*9113SPengcheng.Chen@Sun.COM #define MIB_FW_VERSION 0x08 205*9113SPengcheng.Chen@Sun.COM #define MIB_DOMAIN 0x09 206*9113SPengcheng.Chen@Sun.COM #define MIB_DOMAIN_POWER_LEVELS MIB_DOMAIN, 14, 0 207*9113SPengcheng.Chen@Sun.COM #define MIB_DOMAIN_CHANNELS MIB_DOMAIN, 14, 14 208*9113SPengcheng.Chen@Sun.COM 209*9113SPengcheng.Chen@Sun.COM /* USB request types */ 210*9113SPengcheng.Chen@Sun.COM #define ATU_CLASS_IF_IN \ 211*9113SPengcheng.Chen@Sun.COM (USB_DEV_REQ_DEV_TO_HOST | \ 212*9113SPengcheng.Chen@Sun.COM USB_DEV_REQ_TYPE_CLASS | \ 213*9113SPengcheng.Chen@Sun.COM USB_DEV_REQ_RCPT_IF) 214*9113SPengcheng.Chen@Sun.COM 215*9113SPengcheng.Chen@Sun.COM #define ATU_VENDOR_IF_IN \ 216*9113SPengcheng.Chen@Sun.COM (USB_DEV_REQ_DEV_TO_HOST | \ 217*9113SPengcheng.Chen@Sun.COM USB_DEV_REQ_TYPE_VENDOR | \ 218*9113SPengcheng.Chen@Sun.COM USB_DEV_REQ_RCPT_IF) 219*9113SPengcheng.Chen@Sun.COM 220*9113SPengcheng.Chen@Sun.COM #define ATU_VENDOR_DEV_OUT \ 221*9113SPengcheng.Chen@Sun.COM (USB_DEV_REQ_HOST_TO_DEV | \ 222*9113SPengcheng.Chen@Sun.COM USB_DEV_REQ_TYPE_VENDOR | \ 223*9113SPengcheng.Chen@Sun.COM USB_DEV_REQ_RCPT_DEV) 224*9113SPengcheng.Chen@Sun.COM 225*9113SPengcheng.Chen@Sun.COM #define ATU_CLASS_IF_OUT \ 226*9113SPengcheng.Chen@Sun.COM (USB_DEV_REQ_HOST_TO_DEV | \ 227*9113SPengcheng.Chen@Sun.COM USB_DEV_REQ_TYPE_CLASS | \ 228*9113SPengcheng.Chen@Sun.COM USB_DEV_REQ_RCPT_IF) 229*9113SPengcheng.Chen@Sun.COM 230*9113SPengcheng.Chen@Sun.COM #define ATU_VENDOR_IF_OUT \ 231*9113SPengcheng.Chen@Sun.COM (USB_DEV_REQ_HOST_TO_DEV | \ 232*9113SPengcheng.Chen@Sun.COM USB_DEV_REQ_TYPE_VENDOR | \ 233*9113SPengcheng.Chen@Sun.COM USB_DEV_REQ_RCPT_IF) 234*9113SPengcheng.Chen@Sun.COM 235*9113SPengcheng.Chen@Sun.COM /* standard DFU commands */ 236*9113SPengcheng.Chen@Sun.COM #define DFU_DNLOAD ATU_CLASS_IF_OUT, 0x01 237*9113SPengcheng.Chen@Sun.COM #define DFU_GETSTATUS ATU_CLASS_IF_IN, 0x03 238*9113SPengcheng.Chen@Sun.COM #define DFU_GETSTATE ATU_CLASS_IF_IN, 0x05 239*9113SPengcheng.Chen@Sun.COM #define DFU_REMAP ATU_VENDOR_IF_OUT, 0x0a 240*9113SPengcheng.Chen@Sun.COM 241*9113SPengcheng.Chen@Sun.COM /* DFU states */ 242*9113SPengcheng.Chen@Sun.COM #define DFUState_AppIdle 0 243*9113SPengcheng.Chen@Sun.COM #define DFUState_AppDetach 1 244*9113SPengcheng.Chen@Sun.COM #define DFUState_DFUIdle 2 245*9113SPengcheng.Chen@Sun.COM #define DFUState_DnLoadSync 3 246*9113SPengcheng.Chen@Sun.COM #define DFUState_DnLoadBusy 4 247*9113SPengcheng.Chen@Sun.COM #define DFUState_DnLoadIdle 5 248*9113SPengcheng.Chen@Sun.COM #define DFUState_ManifestSync 6 249*9113SPengcheng.Chen@Sun.COM #define DFUState_Manifest 7 250*9113SPengcheng.Chen@Sun.COM #define DFUState_ManifestWait 8 251*9113SPengcheng.Chen@Sun.COM #define DFUState_UploadIdle 9 252*9113SPengcheng.Chen@Sun.COM #define DFUState_DFUError 10 253*9113SPengcheng.Chen@Sun.COM #define DFU_MaxBlockSize 1024 254*9113SPengcheng.Chen@Sun.COM 255*9113SPengcheng.Chen@Sun.COM #pragma pack(1) 256*9113SPengcheng.Chen@Sun.COM /* AT76c503 command header */ 257*9113SPengcheng.Chen@Sun.COM struct atu_cmd { 258*9113SPengcheng.Chen@Sun.COM uint8_t Cmd; 259*9113SPengcheng.Chen@Sun.COM uint8_t Reserved; 260*9113SPengcheng.Chen@Sun.COM uint16_t Size; 261*9113SPengcheng.Chen@Sun.COM }; 262*9113SPengcheng.Chen@Sun.COM 263*9113SPengcheng.Chen@Sun.COM /* CMD_SET_MIB command (0x01) */ 264*9113SPengcheng.Chen@Sun.COM struct atu_cmd_set_mib { 265*9113SPengcheng.Chen@Sun.COM /* AT76c503 command header */ 266*9113SPengcheng.Chen@Sun.COM uint8_t AtCmd; 267*9113SPengcheng.Chen@Sun.COM uint8_t AtReserved; 268*9113SPengcheng.Chen@Sun.COM uint16_t AtSize; 269*9113SPengcheng.Chen@Sun.COM /* MIB header */ 270*9113SPengcheng.Chen@Sun.COM uint8_t MIBType; 271*9113SPengcheng.Chen@Sun.COM uint8_t MIBSize; 272*9113SPengcheng.Chen@Sun.COM uint8_t MIBIndex; 273*9113SPengcheng.Chen@Sun.COM uint8_t MIBReserved; 274*9113SPengcheng.Chen@Sun.COM /* MIB data */ 275*9113SPengcheng.Chen@Sun.COM uint8_t data[72]; 276*9113SPengcheng.Chen@Sun.COM }; 277*9113SPengcheng.Chen@Sun.COM 278*9113SPengcheng.Chen@Sun.COM /* CMD_STARTUP command (0x0b) */ 279*9113SPengcheng.Chen@Sun.COM struct atu_cmd_card_config { 280*9113SPengcheng.Chen@Sun.COM uint8_t Cmd; 281*9113SPengcheng.Chen@Sun.COM uint8_t Reserved; 282*9113SPengcheng.Chen@Sun.COM uint16_t Size; 283*9113SPengcheng.Chen@Sun.COM 284*9113SPengcheng.Chen@Sun.COM uint8_t ExcludeUnencrypted; 285*9113SPengcheng.Chen@Sun.COM uint8_t PromiscuousMode; 286*9113SPengcheng.Chen@Sun.COM uint8_t ShortRetryLimit; 287*9113SPengcheng.Chen@Sun.COM uint8_t EncryptionType; 288*9113SPengcheng.Chen@Sun.COM uint16_t RTS_Threshold; 289*9113SPengcheng.Chen@Sun.COM uint16_t FragThreshold; 290*9113SPengcheng.Chen@Sun.COM uint8_t BasicRateSet[4]; 291*9113SPengcheng.Chen@Sun.COM uint8_t AutoRateFallback; 292*9113SPengcheng.Chen@Sun.COM uint8_t Channel; 293*9113SPengcheng.Chen@Sun.COM uint8_t PrivacyInvoked; 294*9113SPengcheng.Chen@Sun.COM uint8_t WEP_DefaultKeyID; 295*9113SPengcheng.Chen@Sun.COM uint8_t SSID[IEEE80211_NWID_LEN]; 296*9113SPengcheng.Chen@Sun.COM uint8_t WEP_DefaultKey[4][13]; 297*9113SPengcheng.Chen@Sun.COM uint8_t SSID_Len; 298*9113SPengcheng.Chen@Sun.COM uint8_t ShortPreamble; 299*9113SPengcheng.Chen@Sun.COM uint16_t BeaconPeriod; 300*9113SPengcheng.Chen@Sun.COM }; 301*9113SPengcheng.Chen@Sun.COM 302*9113SPengcheng.Chen@Sun.COM /* CMD_SCAN command (0x03) */ 303*9113SPengcheng.Chen@Sun.COM struct atu_cmd_do_scan { 304*9113SPengcheng.Chen@Sun.COM uint8_t Cmd; 305*9113SPengcheng.Chen@Sun.COM uint8_t Reserved; 306*9113SPengcheng.Chen@Sun.COM uint16_t Size; 307*9113SPengcheng.Chen@Sun.COM 308*9113SPengcheng.Chen@Sun.COM uint8_t BSSID[IEEE80211_ADDR_LEN]; 309*9113SPengcheng.Chen@Sun.COM uint8_t SSID[IEEE80211_NWID_LEN]; 310*9113SPengcheng.Chen@Sun.COM uint8_t ScanType; 311*9113SPengcheng.Chen@Sun.COM uint8_t Channel; 312*9113SPengcheng.Chen@Sun.COM uint16_t ProbeDelay; 313*9113SPengcheng.Chen@Sun.COM uint16_t MinChannelTime; 314*9113SPengcheng.Chen@Sun.COM uint16_t MaxChannelTime; 315*9113SPengcheng.Chen@Sun.COM uint8_t SSID_Len; 316*9113SPengcheng.Chen@Sun.COM uint8_t InternationalScan; 317*9113SPengcheng.Chen@Sun.COM }; 318*9113SPengcheng.Chen@Sun.COM #define ATU_SCAN_ACTIVE 0x00 319*9113SPengcheng.Chen@Sun.COM #define ATU_SCAN_PASSIVE 0x01 320*9113SPengcheng.Chen@Sun.COM 321*9113SPengcheng.Chen@Sun.COM /* CMD_JOIN command (0x04) */ 322*9113SPengcheng.Chen@Sun.COM struct atu_cmd_join { 323*9113SPengcheng.Chen@Sun.COM uint8_t Cmd; 324*9113SPengcheng.Chen@Sun.COM uint8_t Reserved; 325*9113SPengcheng.Chen@Sun.COM uint16_t Size; 326*9113SPengcheng.Chen@Sun.COM 327*9113SPengcheng.Chen@Sun.COM uint8_t bssid[IEEE80211_ADDR_LEN]; 328*9113SPengcheng.Chen@Sun.COM uint8_t essid[32]; 329*9113SPengcheng.Chen@Sun.COM uint8_t bss_type; 330*9113SPengcheng.Chen@Sun.COM uint8_t channel; 331*9113SPengcheng.Chen@Sun.COM uint16_t timeout; 332*9113SPengcheng.Chen@Sun.COM uint8_t essid_size; 333*9113SPengcheng.Chen@Sun.COM uint8_t reserved; 334*9113SPengcheng.Chen@Sun.COM }; 335*9113SPengcheng.Chen@Sun.COM 336*9113SPengcheng.Chen@Sun.COM /* CMD_START_IBSS (0x05) */ 337*9113SPengcheng.Chen@Sun.COM struct atu_cmd_start_ibss { 338*9113SPengcheng.Chen@Sun.COM uint8_t Cmd; 339*9113SPengcheng.Chen@Sun.COM uint8_t Reserved; 340*9113SPengcheng.Chen@Sun.COM uint16_t Size; 341*9113SPengcheng.Chen@Sun.COM 342*9113SPengcheng.Chen@Sun.COM uint8_t BSSID[IEEE80211_ADDR_LEN]; 343*9113SPengcheng.Chen@Sun.COM uint8_t SSID[32]; 344*9113SPengcheng.Chen@Sun.COM uint8_t BSSType; 345*9113SPengcheng.Chen@Sun.COM uint8_t Channel; 346*9113SPengcheng.Chen@Sun.COM uint8_t SSIDSize; 347*9113SPengcheng.Chen@Sun.COM uint8_t Res[3]; 348*9113SPengcheng.Chen@Sun.COM }; 349*9113SPengcheng.Chen@Sun.COM 350*9113SPengcheng.Chen@Sun.COM /* 351*9113SPengcheng.Chen@Sun.COM * The At76c503 adapters come with different types of radios on them. 352*9113SPengcheng.Chen@Sun.COM * At this moment the driver supports adapters with RFMD and Intersil radios. 353*9113SPengcheng.Chen@Sun.COM */ 354*9113SPengcheng.Chen@Sun.COM 355*9113SPengcheng.Chen@Sun.COM /* The config structure of an RFMD radio */ 356*9113SPengcheng.Chen@Sun.COM struct atu_rfmd_conf { 357*9113SPengcheng.Chen@Sun.COM uint8_t CR20[14]; 358*9113SPengcheng.Chen@Sun.COM uint8_t CR21[14]; 359*9113SPengcheng.Chen@Sun.COM uint8_t BB_CR[14]; 360*9113SPengcheng.Chen@Sun.COM uint8_t PidVid[4]; 361*9113SPengcheng.Chen@Sun.COM uint8_t MACAddr[IEEE80211_ADDR_LEN]; 362*9113SPengcheng.Chen@Sun.COM uint8_t RegulatoryDomain; 363*9113SPengcheng.Chen@Sun.COM uint8_t LowPowerValues[14]; 364*9113SPengcheng.Chen@Sun.COM uint8_t NormalPowerValues[14]; 365*9113SPengcheng.Chen@Sun.COM uint8_t Reserved[3]; 366*9113SPengcheng.Chen@Sun.COM /* then we have 84 bytes, somehow Windows reads 95?? */ 367*9113SPengcheng.Chen@Sun.COM uint8_t Rest[11]; 368*9113SPengcheng.Chen@Sun.COM }; 369*9113SPengcheng.Chen@Sun.COM 370*9113SPengcheng.Chen@Sun.COM /* The config structure of an Intersil radio */ 371*9113SPengcheng.Chen@Sun.COM struct atu_intersil_conf { 372*9113SPengcheng.Chen@Sun.COM uint8_t MACAddr[IEEE80211_ADDR_LEN]; 373*9113SPengcheng.Chen@Sun.COM /* From the HFA3861B manual : */ 374*9113SPengcheng.Chen@Sun.COM /* Manual TX power control (7bit : -64 to 63) */ 375*9113SPengcheng.Chen@Sun.COM uint8_t CR31[14]; 376*9113SPengcheng.Chen@Sun.COM /* TX power measurement */ 377*9113SPengcheng.Chen@Sun.COM uint8_t CR58[14]; 378*9113SPengcheng.Chen@Sun.COM uint8_t PidVid[4]; 379*9113SPengcheng.Chen@Sun.COM uint8_t RegulatoryDomain; 380*9113SPengcheng.Chen@Sun.COM uint8_t Reserved[1]; 381*9113SPengcheng.Chen@Sun.COM }; 382*9113SPengcheng.Chen@Sun.COM 383*9113SPengcheng.Chen@Sun.COM struct atu_rx_hdr { 384*9113SPengcheng.Chen@Sun.COM uint16_t length; 385*9113SPengcheng.Chen@Sun.COM uint8_t rx_rate; 386*9113SPengcheng.Chen@Sun.COM uint8_t newbss; 387*9113SPengcheng.Chen@Sun.COM uint8_t fragmentation; 388*9113SPengcheng.Chen@Sun.COM uint8_t rssi; 389*9113SPengcheng.Chen@Sun.COM uint8_t link_quality; 390*9113SPengcheng.Chen@Sun.COM uint8_t noise_level; 391*9113SPengcheng.Chen@Sun.COM uint32_t rx_time; 392*9113SPengcheng.Chen@Sun.COM }; 393*9113SPengcheng.Chen@Sun.COM #define ATU_RX_HDRLEN sizeof (struct atu_rx_hdr) 394*9113SPengcheng.Chen@Sun.COM 395*9113SPengcheng.Chen@Sun.COM struct atu_tx_hdr { 396*9113SPengcheng.Chen@Sun.COM uint16_t length; 397*9113SPengcheng.Chen@Sun.COM uint8_t tx_rate; 398*9113SPengcheng.Chen@Sun.COM uint8_t padding; 399*9113SPengcheng.Chen@Sun.COM uint8_t reserved[4]; 400*9113SPengcheng.Chen@Sun.COM }; 401*9113SPengcheng.Chen@Sun.COM #define ATU_TX_HDRLEN sizeof (struct atu_tx_hdr) 402*9113SPengcheng.Chen@Sun.COM #pragma pack() 403*9113SPengcheng.Chen@Sun.COM 404*9113SPengcheng.Chen@Sun.COM static struct atu_dev_type atu_dev_table[] = { 405*9113SPengcheng.Chen@Sun.COM { 0x0506, 0x0a01, RadioRFMD, ATU_QUIRK_NONE }, 406*9113SPengcheng.Chen@Sun.COM { 0x07b8, 0xb000, RadioRFMD, ATU_QUIRK_NONE }, 407*9113SPengcheng.Chen@Sun.COM { 0x083a, 0x3501, AT76C503_RFMD_ACC, ATU_QUIRK_NONE }, 408*9113SPengcheng.Chen@Sun.COM { 0x04a5, 0x9000, RadioIntersil, ATU_QUIRK_NONE }, 409*9113SPengcheng.Chen@Sun.COM { 0x04a5, 0x9001, RadioRFMD, ATU_QUIRK_NONE }, 410*9113SPengcheng.Chen@Sun.COM { 0x1668, 0x7605, RadioRFMD, ATU_QUIRK_NONE }, 411*9113SPengcheng.Chen@Sun.COM { 0x05dd, 0xff31, RadioIntersil, ATU_QUIRK_NONE }, 412*9113SPengcheng.Chen@Sun.COM { 0x12fd, 0x1001, RadioRFMD2958, ATU_QUIRK_NONE }, 413*9113SPengcheng.Chen@Sun.COM { 0x069a, 0x0821, RadioIntersil, ATU_QUIRK_NONE }, 414*9113SPengcheng.Chen@Sun.COM { 0x069a, 0x0320, RadioIntersil, ATU_QUIRK_NONE }, 415*9113SPengcheng.Chen@Sun.COM { 0x069a, 0x0321, RadioRFMD, ATU_QUIRK_NONE }, 416*9113SPengcheng.Chen@Sun.COM { 0x03eb, 0x7603, RadioIntersil, ATU_QUIRK_NONE }, 417*9113SPengcheng.Chen@Sun.COM { 0x03eb, 0x7604, AT76C503_i3863, ATU_QUIRK_NONE }, 418*9113SPengcheng.Chen@Sun.COM { 0x03eb, 0x7605, RadioRFMD, ATU_QUIRK_NONE }, 419*9113SPengcheng.Chen@Sun.COM { 0x03eb, 0x7606, AT76C505_RFMD, ATU_QUIRK_NONE }, 420*9113SPengcheng.Chen@Sun.COM { 0x03eb, 0x7613, RadioRFMD2958, ATU_QUIRK_NONE }, 421*9113SPengcheng.Chen@Sun.COM { 0x03eb, 0x7614, RadioRFMD2958_SMC, 422*9113SPengcheng.Chen@Sun.COM ATU_QUIRK_NO_REMAP | ATU_QUIRK_FW_DELAY }, 423*9113SPengcheng.Chen@Sun.COM { 0x03eb, 0x7617, RadioRFMD2958_SMC, 424*9113SPengcheng.Chen@Sun.COM ATU_QUIRK_NO_REMAP | ATU_QUIRK_FW_DELAY }, 425*9113SPengcheng.Chen@Sun.COM { 0x03eb, 0x3301, RadioRFMD, ATU_QUIRK_NONE }, 426*9113SPengcheng.Chen@Sun.COM { 0x050d, 0x0050, RadioRFMD, ATU_QUIRK_NONE }, 427*9113SPengcheng.Chen@Sun.COM { 0x0d8e, 0x7100, RadioIntersil, ATU_QUIRK_NONE }, 428*9113SPengcheng.Chen@Sun.COM { 0x0d8e, 0x7110, RadioIntersil, ATU_QUIRK_NONE }, 429*9113SPengcheng.Chen@Sun.COM { 0x049f, 0x0032, RadioRFMD, ATU_QUIRK_NONE }, 430*9113SPengcheng.Chen@Sun.COM { 0x07aa, 0x7613, RadioRFMD2958, ATU_QUIRK_NONE }, 431*9113SPengcheng.Chen@Sun.COM { 0x1371, 0x0013, RadioRFMD2958, ATU_QUIRK_NONE }, 432*9113SPengcheng.Chen@Sun.COM { 0x1371, 0x0002, RadioRFMD, ATU_QUIRK_NONE }, 433*9113SPengcheng.Chen@Sun.COM { 0x1371, 0x0014, RadioRFMD2958, ATU_QUIRK_NONE }, 434*9113SPengcheng.Chen@Sun.COM { 0x1371, 0x5743, RadioRFMD, ATU_QUIRK_NONE }, 435*9113SPengcheng.Chen@Sun.COM { 0x2001, 0x3200, RadioRFMD, ATU_QUIRK_NONE }, 436*9113SPengcheng.Chen@Sun.COM { 0x1044, 0x8003, RadioRFMD, ATU_QUIRK_NONE }, 437*9113SPengcheng.Chen@Sun.COM { 0x1690, 0x0701, RadioRFMD2958_SMC, 438*9113SPengcheng.Chen@Sun.COM ATU_QUIRK_NO_REMAP | ATU_QUIRK_FW_DELAY }, 439*9113SPengcheng.Chen@Sun.COM { 0x03f0, 0x011c, RadioIntersil, ATU_QUIRK_NONE }, 440*9113SPengcheng.Chen@Sun.COM { 0x8086, 0x0200, RadioIntersil, ATU_QUIRK_NONE }, 441*9113SPengcheng.Chen@Sun.COM { 0x04bb, 0x0919, RadioIntersil, ATU_QUIRK_NONE }, 442*9113SPengcheng.Chen@Sun.COM { 0x05dc, 0xa002, RadioRFMD, ATU_QUIRK_NONE }, 443*9113SPengcheng.Chen@Sun.COM { 0x066b, 0x2211, RadioIntersil, ATU_QUIRK_NONE }, 444*9113SPengcheng.Chen@Sun.COM { 0x077b, 0x2219, RadioRFMD, ATU_QUIRK_NONE }, 445*9113SPengcheng.Chen@Sun.COM { 0x077b, 0x2219, RadioRFMD, ATU_QUIRK_NONE }, 446*9113SPengcheng.Chen@Sun.COM { 0x1915, 0x2233, RadioRFMD2958, ATU_QUIRK_NONE }, 447*9113SPengcheng.Chen@Sun.COM { 0x0db0, 0x1020, RadioRFMD2958, ATU_QUIRK_NONE }, 448*9113SPengcheng.Chen@Sun.COM { 0x0864, 0x4100, RadioIntersil, ATU_QUIRK_NONE }, 449*9113SPengcheng.Chen@Sun.COM { 0x0864, 0x4102, RadioRFMD, ATU_QUIRK_NONE }, 450*9113SPengcheng.Chen@Sun.COM { 0x1557, 0x0002, RadioRFMD2958_SMC, 451*9113SPengcheng.Chen@Sun.COM ATU_QUIRK_NO_REMAP | ATU_QUIRK_FW_DELAY }, 452*9113SPengcheng.Chen@Sun.COM { 0x2019, 0x3220, RadioRFMD, ATU_QUIRK_NONE }, 453*9113SPengcheng.Chen@Sun.COM { 0x055d, 0xa000, AT76C503_i3863, ATU_QUIRK_NONE }, 454*9113SPengcheng.Chen@Sun.COM { 0x0681, 0x001b, RadioRFMD, ATU_QUIRK_NONE }, 455*9113SPengcheng.Chen@Sun.COM { 0x0d5c, 0xa001, RadioIntersil, ATU_QUIRK_NONE }, 456*9113SPengcheng.Chen@Sun.COM { 0x0d5c, 0xa002, AT76C503_RFMD_ACC, ATU_QUIRK_NONE }, 457*9113SPengcheng.Chen@Sun.COM { 0x0b3b, 0x1612, RadioIntersil, ATU_QUIRK_NONE }, 458*9113SPengcheng.Chen@Sun.COM { 0x0cde, 0x0001, RadioIntersil, ATU_QUIRK_NONE }, 459*9113SPengcheng.Chen@Sun.COM }; 460*9113SPengcheng.Chen@Sun.COM 461*9113SPengcheng.Chen@Sun.COM static struct atu_firmware atu_fw_table[] = { 462*9113SPengcheng.Chen@Sun.COM { 463*9113SPengcheng.Chen@Sun.COM RadioRFMD, 464*9113SPengcheng.Chen@Sun.COM atmel_fw_rfmd_int, 465*9113SPengcheng.Chen@Sun.COM atmel_fw_rfmd_ext, 466*9113SPengcheng.Chen@Sun.COM sizeof (atmel_fw_rfmd_int), 467*9113SPengcheng.Chen@Sun.COM sizeof (atmel_fw_rfmd_ext), 468*9113SPengcheng.Chen@Sun.COM 0 469*9113SPengcheng.Chen@Sun.COM }, 470*9113SPengcheng.Chen@Sun.COM { 471*9113SPengcheng.Chen@Sun.COM RadioRFMD2958, 472*9113SPengcheng.Chen@Sun.COM atmel_fw_rfmd2958_int, 473*9113SPengcheng.Chen@Sun.COM atmel_fw_rfmd2958_ext, 474*9113SPengcheng.Chen@Sun.COM sizeof (atmel_fw_rfmd2958_int), 475*9113SPengcheng.Chen@Sun.COM sizeof (atmel_fw_rfmd2958_ext), 476*9113SPengcheng.Chen@Sun.COM 81 477*9113SPengcheng.Chen@Sun.COM }, 478*9113SPengcheng.Chen@Sun.COM { 479*9113SPengcheng.Chen@Sun.COM RadioRFMD2958_SMC, 480*9113SPengcheng.Chen@Sun.COM atmel_fw_rfmd2958_smc_int, 481*9113SPengcheng.Chen@Sun.COM atmel_fw_rfmd2958_smc_ext, 482*9113SPengcheng.Chen@Sun.COM sizeof (atmel_fw_rfmd2958_smc_int), 483*9113SPengcheng.Chen@Sun.COM sizeof (atmel_fw_rfmd2958_smc_ext), 484*9113SPengcheng.Chen@Sun.COM 0 485*9113SPengcheng.Chen@Sun.COM }, 486*9113SPengcheng.Chen@Sun.COM { 487*9113SPengcheng.Chen@Sun.COM RadioIntersil, 488*9113SPengcheng.Chen@Sun.COM atmel_fw_intersil_int, 489*9113SPengcheng.Chen@Sun.COM atmel_fw_intersil_ext, 490*9113SPengcheng.Chen@Sun.COM sizeof (atmel_fw_intersil_int), 491*9113SPengcheng.Chen@Sun.COM sizeof (atmel_fw_intersil_ext), 492*9113SPengcheng.Chen@Sun.COM 0 493*9113SPengcheng.Chen@Sun.COM }, 494*9113SPengcheng.Chen@Sun.COM { 495*9113SPengcheng.Chen@Sun.COM AT76C503_i3863, 496*9113SPengcheng.Chen@Sun.COM atmel_at76c503_i3863_fw_int, 497*9113SPengcheng.Chen@Sun.COM atmel_at76c503_i3863_fw_ext, 498*9113SPengcheng.Chen@Sun.COM sizeof (atmel_at76c503_i3863_fw_int), 499*9113SPengcheng.Chen@Sun.COM sizeof (atmel_at76c503_i3863_fw_ext), 500*9113SPengcheng.Chen@Sun.COM 0 501*9113SPengcheng.Chen@Sun.COM }, 502*9113SPengcheng.Chen@Sun.COM { 503*9113SPengcheng.Chen@Sun.COM AT76C503_RFMD_ACC, 504*9113SPengcheng.Chen@Sun.COM atmel_at76c503_rfmd_acc_fw_int, 505*9113SPengcheng.Chen@Sun.COM atmel_at76c503_rfmd_acc_fw_ext, 506*9113SPengcheng.Chen@Sun.COM sizeof (atmel_at76c503_rfmd_acc_fw_int), 507*9113SPengcheng.Chen@Sun.COM sizeof (atmel_at76c503_rfmd_acc_fw_ext), 508*9113SPengcheng.Chen@Sun.COM 0 509*9113SPengcheng.Chen@Sun.COM }, 510*9113SPengcheng.Chen@Sun.COM { 511*9113SPengcheng.Chen@Sun.COM AT76C505_RFMD, 512*9113SPengcheng.Chen@Sun.COM atmel_at76c505_rfmd_fw_int, 513*9113SPengcheng.Chen@Sun.COM atmel_at76c505_rfmd_fw_ext, 514*9113SPengcheng.Chen@Sun.COM sizeof (atmel_at76c505_rfmd_fw_int), 515*9113SPengcheng.Chen@Sun.COM sizeof (atmel_at76c505_rfmd_fw_ext), 516*9113SPengcheng.Chen@Sun.COM 0 517*9113SPengcheng.Chen@Sun.COM } 518*9113SPengcheng.Chen@Sun.COM }; 519*9113SPengcheng.Chen@Sun.COM 520*9113SPengcheng.Chen@Sun.COM #ifdef __cplusplus 521*9113SPengcheng.Chen@Sun.COM } 522*9113SPengcheng.Chen@Sun.COM #endif 523*9113SPengcheng.Chen@Sun.COM 524*9113SPengcheng.Chen@Sun.COM #endif /* _ATU_H */ 525