[BACK]Return to ar5xxx.h CVS log [TXT][DIR] Up to [local] / sys / dev / ic

Annotation of sys/dev/ic/ar5xxx.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: ar5xxx.h,v 1.41 2007/05/09 16:41:14 reyk Exp $        */
                      2:
                      3: /*
                      4:  * Copyright (c) 2004, 2005, 2006, 2007 Reyk Floeter <reyk@openbsd.org>
                      5:  *
                      6:  * Permission to use, copy, modify, and distribute this software for any
                      7:  * purpose with or without fee is hereby granted, provided that the above
                      8:  * copyright notice and this permission notice appear in all copies.
                      9:  *
                     10:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
                     11:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
                     12:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
                     13:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
                     14:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
                     15:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
                     16:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
                     17:  */
                     18:
                     19: /*
                     20:  * HAL interface for Atheros Wireless LAN devices.
                     21:  *
                     22:  * ar5k is a free replacement of the binary-only HAL used by some drivers
                     23:  * for Atheros chipsets. While using a different ABI, it tries to be
                     24:  * source-compatible with the original (non-free) HAL interface.
                     25:  *
                     26:  * Many thanks to various contributors who supported the development of
                     27:  * ar5k with hard work and useful information. And, of course, for all the
                     28:  * people who encouraged me to continue this work which has been based
                     29:  * on my initial approach found on http://team.vantronix.net/ar5k/.
                     30:  */
                     31:
                     32: #ifndef _AR5K_H
                     33: #define _AR5K_H
                     34:
                     35: #include <sys/param.h>
                     36: #include <sys/systm.h>
                     37: #include <sys/sysctl.h>
                     38: #include <sys/malloc.h>
                     39: #include <sys/lock.h>
                     40: #include <sys/kernel.h>
                     41: #include <sys/socket.h>
                     42: #include <sys/sockio.h>
                     43: #include <sys/errno.h>
                     44:
                     45: #include <machine/endian.h>
                     46: #include <machine/bus.h>
                     47:
                     48: #include <net/if.h>
                     49: #include <net/if_dl.h>
                     50: #include <net/if_media.h>
                     51: #include <net/if_arp.h>
                     52: #include <net/if_llc.h>
                     53:
                     54: #ifdef INET
                     55: #include <netinet/in.h>
                     56: #include <netinet/if_ether.h>
                     57: #endif
                     58:
                     59: #include <net80211/ieee80211_var.h>
                     60: #include <net80211/ieee80211_radiotap.h>
                     61: #include <net80211/ieee80211_regdomain.h>
                     62:
                     63: /*
                     64:  * Possible chipsets (could appear in different combinations)
                     65:  */
                     66:
                     67: enum ar5k_version {
                     68:        AR5K_AR5210     = 0,
                     69:        AR5K_AR5211     = 1,
                     70:        AR5K_AR5212     = 2,
                     71: };
                     72:
                     73: enum ar5k_radio {
                     74:        AR5K_AR5110     = 0,
                     75:        AR5K_AR5111     = 1,
                     76:        AR5K_AR5112     = 2,
                     77: };
                     78:
                     79: /*
                     80:  * Generic definitions
                     81:  */
                     82:
                     83: typedef enum {
                     84:        AH_FALSE = 0,
                     85:        AH_TRUE,
                     86: } HAL_BOOL;
                     87:
                     88: typedef enum {
                     89:        HAL_MODE_11A = 0x001,
                     90:        HAL_MODE_TURBO = 0x002,
                     91:        HAL_MODE_11B = 0x004,
                     92:        HAL_MODE_PUREG = 0x008,
                     93:        HAL_MODE_11G = 0x010,
                     94:        HAL_MODE_108G = 0x020,
                     95:        HAL_MODE_XR = 0x040,
                     96:        HAL_MODE_ALL = 0xfff
                     97: } HAL_MODE;
                     98:
                     99: typedef enum {
                    100:        HAL_ANT_VARIABLE = 0,
                    101:        HAL_ANT_FIXED_A = 1,
                    102:        HAL_ANT_FIXED_B = 2,
                    103:        HAL_ANT_MAX = 3,
                    104: } HAL_ANT_SETTING;
                    105:
                    106: typedef enum {
                    107:        HAL_M_STA = 1,
                    108:        HAL_M_IBSS = 0,
                    109:        HAL_M_HOSTAP = 6,
                    110:        HAL_M_MONITOR = 8,
                    111: } HAL_OPMODE;
                    112:
                    113: typedef int HAL_STATUS;
                    114:
                    115: #define HAL_OK         0
                    116: #define HAL_EINPROGRESS EINPROGRESS
                    117:
                    118: #define AR5K_MAX_RSSI  64
                    119:
                    120: /*
                    121:  * TX queues
                    122:  */
                    123:
                    124: typedef enum {
                    125:        HAL_TX_QUEUE_INACTIVE = 0,
                    126:        HAL_TX_QUEUE_DATA,
                    127:        HAL_TX_QUEUE_BEACON,
                    128:        HAL_TX_QUEUE_CAB,
                    129:        HAL_TX_QUEUE_PSPOLL,
                    130: } HAL_TX_QUEUE;
                    131:
                    132: #define HAL_NUM_TX_QUEUES      10
                    133:
                    134: typedef enum {
                    135:        HAL_TX_QUEUE_ID_DATA_MIN = 0,
                    136:        HAL_TX_QUEUE_ID_DATA_MAX = 6,
                    137:        HAL_TX_QUEUE_ID_PSPOLL = 7,
                    138:        HAL_TX_QUEUE_ID_BEACON = 8,
                    139:        HAL_TX_QUEUE_ID_CAB = 9,
                    140: } HAL_TX_QUEUE_ID;
                    141:
                    142: typedef enum {
                    143:        HAL_WME_AC_BK = 0,
                    144:        HAL_WME_AC_BE = 1,
                    145:        HAL_WME_AC_VI = 2,
                    146:        HAL_WME_AC_VO = 3,
                    147:        HAL_WME_UPSD = 4,
                    148: } HAL_TX_QUEUE_SUBTYPE;
                    149:
                    150: #define AR5K_TXQ_FLAG_TXINT_ENABLE             0x0001
                    151: #define AR5K_TXQ_FLAG_TXDESCINT_ENABLE         0x0002
                    152: #define AR5K_TXQ_FLAG_BACKOFF_DISABLE          0x0004
                    153: #define AR5K_TXQ_FLAG_COMPRESSION_ENABLE       0x0008
                    154: #define AR5K_TXQ_FLAG_RDYTIME_EXP_POLICY_ENABLE        0x0010
                    155: #define AR5K_TXQ_FLAG_FRAG_BURST_BACKOFF_ENABLE        0x0020
                    156: #define AR5K_TXQ_FLAG_POST_FR_BKOFF_DIS         0x0040
                    157:
                    158: typedef struct {
                    159:        u_int32_t               tqi_ver;
                    160:        HAL_TX_QUEUE            tqi_type;
                    161:        HAL_TX_QUEUE_SUBTYPE    tqi_subtype;
                    162:        u_int16_t               tqi_flags;
                    163:        u_int32_t               tqi_priority;
                    164:        u_int32_t               tqi_aifs;
                    165:        int32_t                 tqi_cw_min;
                    166:        int32_t                 tqi_cw_max;
                    167:        u_int32_t               tqi_cbr_period;
                    168:        u_int32_t               tqi_cbr_overflow_limit;
                    169:        u_int32_t               tqi_burst_time;
                    170:        u_int32_t               tqi_ready_time;
                    171: } HAL_TXQ_INFO;
                    172:
                    173: typedef enum {
                    174:        HAL_PKT_TYPE_NORMAL = 0,
                    175:        HAL_PKT_TYPE_ATIM = 1,
                    176:        HAL_PKT_TYPE_PSPOLL = 2,
                    177:        HAL_PKT_TYPE_BEACON = 3,
                    178:        HAL_PKT_TYPE_PROBE_RESP = 4,
                    179:        HAL_PKT_TYPE_PIFS = 5,
                    180: } HAL_PKT_TYPE;
                    181:
                    182: /*
                    183:  * Used to compute TX times
                    184:  */
                    185:
                    186: #define AR5K_CCK_SIFS_TIME             10
                    187: #define AR5K_CCK_PREAMBLE_BITS         144
                    188: #define AR5K_CCK_PLCP_BITS             48
                    189: #define AR5K_CCK_NUM_BITS(_frmlen) (_frmlen << 3)
                    190: #define AR5K_CCK_PHY_TIME(_sp) (_sp ?                                  \
                    191:        ((AR5K_CCK_PREAMBLE_BITS + AR5K_CCK_PLCP_BITS) >> 1) :          \
                    192:        (AR5K_CCK_PREAMBLE_BITS + AR5K_CCK_PLCP_BITS))
                    193: #define AR5K_CCK_TX_TIME(_kbps, _frmlen, _sp)                          \
                    194:        AR5K_CCK_PHY_TIME(_sp) +                                        \
                    195:        ((AR5K_CCK_NUM_BITS(_frmlen) * 1000) / _kbps) +                 \
                    196:        AR5K_CCK_SIFS_TIME
                    197:
                    198: #define AR5K_OFDM_SIFS_TIME            16
                    199: #define AR5K_OFDM_PREAMBLE_TIME        20
                    200: #define AR5K_OFDM_PLCP_BITS            22
                    201: #define AR5K_OFDM_SYMBOL_TIME          4
                    202: #define AR5K_OFDM_NUM_BITS(_frmlen) (AR5K_OFDM_PLCP_BITS + (_frmlen << 3))
                    203: #define AR5K_OFDM_NUM_BITS_PER_SYM(_kbps) ((_kbps *                    \
                    204:        AR5K_OFDM_SYMBOL_TIME) / 1000)
                    205: #define AR5K_OFDM_NUM_BITS(_frmlen) (AR5K_OFDM_PLCP_BITS + (_frmlen << 3))
                    206: #define AR5K_OFDM_NUM_SYMBOLS(_kbps, _frmlen)                          \
                    207:        howmany(AR5K_OFDM_NUM_BITS(_frmlen), AR5K_OFDM_NUM_BITS_PER_SYM(_kbps))
                    208: #define AR5K_OFDM_TX_TIME(_kbps, _frmlen)                              \
                    209:        AR5K_OFDM_PREAMBLE_TIME + AR5K_OFDM_SIFS_TIME +                 \
                    210:        (AR5K_OFDM_NUM_SYMBOLS(_kbps, _frmlen) * AR5K_OFDM_SYMBOL_TIME)
                    211:
                    212: #define AR5K_TURBO_SIFS_TIME           8
                    213: #define AR5K_TURBO_PREAMBLE_TIME       14
                    214: #define AR5K_TURBO_PLCP_BITS           22
                    215: #define AR5K_TURBO_SYMBOL_TIME         4
                    216: #define AR5K_TURBO_NUM_BITS(_frmlen) (AR5K_TURBO_PLCP_BITS + (_frmlen << 3))
                    217: #define AR5K_TURBO_NUM_BITS_PER_SYM(_kbps) (((_kbps << 1) *            \
                    218:        AR5K_TURBO_SYMBOL_TIME) / 1000)
                    219: #define AR5K_TURBO_NUM_BITS(_frmlen) (AR5K_TURBO_PLCP_BITS + (_frmlen << 3))
                    220: #define AR5K_TURBO_NUM_SYMBOLS(_kbps, _frmlen)                         \
                    221:        howmany(AR5K_TURBO_NUM_BITS(_frmlen),                           \
                    222:        AR5K_TURBO_NUM_BITS_PER_SYM(_kbps))
                    223: #define AR5K_TURBO_TX_TIME(_kbps, _frmlen)                             \
                    224:        AR5K_TURBO_PREAMBLE_TIME + AR5K_TURBO_SIFS_TIME +               \
                    225:        (AR5K_TURBO_NUM_SYMBOLS(_kbps, _frmlen) * AR5K_TURBO_SYMBOL_TIME)
                    226:
                    227: #define AR5K_XR_SIFS_TIME              16
                    228: #define AR5K_XR_PLCP_BITS              22
                    229: #define AR5K_XR_SYMBOL_TIME            4
                    230: #define AR5K_XR_PREAMBLE_TIME(_kbps) (((_kbps) < 1000) ? 173 : 76)
                    231: #define AR5K_XR_NUM_BITS_PER_SYM(_kbps) ((_kbps *                      \
                    232:        AR5K_XR_SYMBOL_TIME) / 1000)
                    233: #define AR5K_XR_NUM_BITS(_frmlen) (AR5K_XR_PLCP_BITS + (_frmlen << 3))
                    234: #define AR5K_XR_NUM_SYMBOLS(_kbps, _frmlen)                            \
                    235:        howmany(AR5K_XR_NUM_BITS(_frmlen), AR5K_XR_NUM_BITS_PER_SYM(_kbps))
                    236: #define AR5K_XR_TX_TIME(_kbps, _frmlen)                                        \
                    237:        AR5K_XR_PREAMBLE_TIME(_kbps) + AR5K_XR_SIFS_TIME +              \
                    238:        (AR5K_XR_NUM_SYMBOLS(_kbps, _frmlen) * AR5K_XR_SYMBOL_TIME)
                    239:
                    240: /*
                    241:  * RX definitions
                    242:  */
                    243:
                    244: #define HAL_RX_FILTER_UCAST    0x00000001
                    245: #define HAL_RX_FILTER_MCAST    0x00000002
                    246: #define HAL_RX_FILTER_BCAST    0x00000004
                    247: #define HAL_RX_FILTER_CONTROL  0x00000008
                    248: #define HAL_RX_FILTER_BEACON   0x00000010
                    249: #define HAL_RX_FILTER_PROM     0x00000020
                    250: #define HAL_RX_FILTER_PROBEREQ 0x00000080
                    251: #define HAL_RX_FILTER_PHYERR   0x00000100
                    252: #define HAL_RX_FILTER_PHYRADAR 0x00000200
                    253:
                    254: typedef struct {
                    255:        u_int32_t       ackrcv_bad;
                    256:        u_int32_t       rts_bad;
                    257:        u_int32_t       rts_good;
                    258:        u_int32_t       fcs_bad;
                    259:        u_int32_t       beacons;
                    260: } HAL_MIB_STATS;
                    261:
                    262: /*
                    263:  * Beacon/AP definitions
                    264:  */
                    265:
                    266: #define HAL_BEACON_PERIOD      0x0000ffff
                    267: #define HAL_BEACON_ENA         0x00800000
                    268: #define HAL_BEACON_RESET_TSF   0x01000000
                    269:
                    270: typedef struct {
                    271:        u_int32_t       bs_next_beacon;
                    272:        u_int32_t       bs_next_dtim;
                    273:        u_int32_t       bs_interval;
                    274:        u_int8_t        bs_dtim_period;
                    275:        u_int8_t        bs_cfp_period;
                    276:        u_int16_t       bs_cfp_max_duration;
                    277:        u_int16_t       bs_cfp_du_remain;
                    278:        u_int16_t       bs_tim_offset;
                    279:        u_int16_t       bs_sleep_duration;
                    280:        u_int16_t       bs_bmiss_threshold;
                    281:
                    282: #define bs_nexttbtt            bs_next_beacon
                    283: #define bs_intval              bs_interval
                    284: #define bs_nextdtim            bs_next_dtim
                    285: #define bs_bmissthreshold      bs_bmiss_threshold
                    286: #define bs_sleepduration       bs_sleep_duration
                    287: #define bs_dtimperiod          bs_dtim_period
                    288:
                    289: } HAL_BEACON_STATE;
                    290:
                    291: /*
                    292:  * Power management
                    293:  */
                    294:
                    295: typedef enum {
                    296:        HAL_PM_UNDEFINED = 0,
                    297:        HAL_PM_AUTO,
                    298:        HAL_PM_AWAKE,
                    299:        HAL_PM_FULL_SLEEP,
                    300:        HAL_PM_NETWORK_SLEEP,
                    301: } HAL_POWER_MODE;
                    302:
                    303: /*
                    304:  * Weak wireless crypto definitions (use IPsec/WLSec/...)
                    305:  */
                    306:
                    307: typedef enum {
                    308:        HAL_CIPHER_WEP = 0,
                    309:        HAL_CIPHER_AES_CCM,
                    310:        HAL_CIPHER_CKIP,
                    311: } HAL_CIPHER;
                    312:
                    313: #define AR5K_KEYVAL_LENGTH_40  5
                    314: #define AR5K_KEYVAL_LENGTH_104 13
                    315: #define AR5K_KEYVAL_LENGTH_128 16
                    316: #define AR5K_KEYVAL_LENGTH_MAX AR5K_KEYVAL_LENGTH_128
                    317:
                    318: typedef struct {
                    319:        int             wk_len;
                    320:        u_int8_t        wk_key[AR5K_KEYVAL_LENGTH_MAX];
                    321: } HAL_KEYVAL;
                    322:
                    323: #define AR5K_ASSERT_ENTRY(_e, _s) do {                                 \
                    324:        if (_e >= _s)                                                   \
                    325:                return (AH_FALSE);                                      \
                    326: } while (0)
                    327:
                    328: /*
                    329:  * PHY
                    330:  */
                    331:
                    332: #define AR5K_MAX_RATES 32
                    333:
                    334: typedef struct {
                    335:        u_int8_t        valid;
                    336:        u_int8_t        phy;
                    337:        u_int16_t       rateKbps;
                    338:        u_int8_t        rateCode;
                    339:        u_int8_t        shortPreamble;
                    340:        u_int8_t        dot11Rate;
                    341:        u_int8_t        controlRate;
                    342:
                    343: #define r_valid                        valid
                    344: #define r_phy                  phy
                    345: #define r_rate_kbps            rateKbps
                    346: #define r_rate_code            rateCode
                    347: #define r_short_preamble       shortPreamble
                    348: #define r_dot11_rate           dot11Rate
                    349: #define r_control_rate         controlRate
                    350:
                    351: } HAL_RATE;
                    352:
                    353: typedef struct {
                    354:        u_int16_t       rateCount;
                    355:        u_int8_t        rateCodeToIndex[AR5K_MAX_RATES];
                    356:        HAL_RATE        info[AR5K_MAX_RATES];
                    357:
                    358: #define rt_rate_count          rateCount
                    359: #define rt_rate_code_index     rateCodeToIndex
                    360: #define rt_info                        info
                    361:
                    362: } HAL_RATE_TABLE;
                    363:
                    364: #define AR5K_RATES_11A { 8, {                                          \
                    365:        255, 255, 255, 255, 255, 255, 255, 255, 6, 4, 2, 0,             \
                    366:        7, 5, 3, 1, 255, 255, 255, 255, 255, 255, 255, 255,             \
                    367:        255, 255, 255, 255, 255, 255, 255, 255 }, {                     \
                    368:        { 1, IEEE80211_T_OFDM, 6000, 11, 0, 140, 0 },                   \
                    369:        { 1, IEEE80211_T_OFDM, 9000, 15, 0, 18, 0 },                    \
                    370:        { 1, IEEE80211_T_OFDM, 12000, 10, 0, 152, 2 },                  \
                    371:        { 1, IEEE80211_T_OFDM, 18000, 14, 0, 36, 2 },                   \
                    372:        { 1, IEEE80211_T_OFDM, 24000, 9, 0, 176, 4 },                   \
                    373:        { 1, IEEE80211_T_OFDM, 36000, 13, 0, 72, 4 },                   \
                    374:        { 1, IEEE80211_T_OFDM, 48000, 8, 0, 96, 4 },                    \
                    375:        { 1, IEEE80211_T_OFDM, 54000, 12, 0, 108, 4 } }                 \
                    376: }
                    377:
                    378: #define AR5K_RATES_11B { 4, {                                          \
                    379:        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,     \
                    380:        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,     \
                    381:        3, 2, 1, 0, 255, 255, 255, 255 }, {                             \
                    382:        { 1, IEEE80211_T_CCK, 1000, 27, 0x00, 130, 0 },                 \
                    383:        { 1, IEEE80211_T_CCK, 2000, 26, 0x04, 132, 1 },                 \
                    384:        { 1, IEEE80211_T_CCK, 5500, 25, 0x04, 139, 1 },                 \
                    385:        { 1, IEEE80211_T_CCK, 11000, 24, 0x04, 150, 1 } }               \
                    386: }
                    387:
                    388: #define AR5K_RATES_11G { 12, {                                         \
                    389:        255, 255, 255, 255, 255, 255, 255, 255, 10, 8, 6, 4,            \
                    390:        11, 9, 7, 5, 255, 255, 255, 255, 255, 255, 255, 255,            \
                    391:        3, 2, 1, 0, 255, 255, 255, 255 }, {                             \
                    392:        { 1, IEEE80211_T_CCK, 1000, 27, 0x00, 2, 0 },                   \
                    393:        { 1, IEEE80211_T_CCK, 2000, 26, 0x04, 4, 1 },                   \
                    394:        { 1, IEEE80211_T_CCK, 5500, 25, 0x04, 11, 1 },                  \
                    395:        { 1, IEEE80211_T_CCK, 11000, 24, 0x04, 22, 1 },                 \
                    396:        { 0, IEEE80211_T_OFDM, 6000, 11, 0, 12, 4 },                    \
                    397:        { 0, IEEE80211_T_OFDM, 9000, 15, 0, 18, 4 },                    \
                    398:        { 1, IEEE80211_T_OFDM, 12000, 10, 0, 24, 6 },                   \
                    399:        { 1, IEEE80211_T_OFDM, 18000, 14, 0, 36, 6 },                   \
                    400:        { 1, IEEE80211_T_OFDM, 24000, 9, 0, 48, 8 },                    \
                    401:        { 1, IEEE80211_T_OFDM, 36000, 13, 0, 72, 8 },                   \
                    402:        { 1, IEEE80211_T_OFDM, 48000, 8, 0, 96, 8 },                    \
                    403:        { 1, IEEE80211_T_OFDM, 54000, 12, 0, 108, 8 } }                 \
                    404: }
                    405:
                    406: #define AR5K_RATES_TURBO { 8, {                                                \
                    407:        255, 255, 255, 255, 255, 255, 255, 255, 6, 4, 2, 0,             \
                    408:        7, 5, 3, 1, 255, 255, 255, 255, 255, 255, 255, 255,             \
                    409:        255, 255, 255, 255, 255, 255, 255, 255 }, {                     \
                    410:        { 1, IEEE80211_T_TURBO, 6000, 11, 0, 140, 0 },                  \
                    411:        { 1, IEEE80211_T_TURBO, 9000, 15, 0, 18, 0 },                   \
                    412:        { 1, IEEE80211_T_TURBO, 12000, 10, 0, 152, 2 },                 \
                    413:        { 1, IEEE80211_T_TURBO, 18000, 14, 0, 36, 2 },                  \
                    414:        { 1, IEEE80211_T_TURBO, 24000, 9, 0, 176, 4 },                  \
                    415:        { 1, IEEE80211_T_TURBO, 36000, 13, 0, 72, 4 },                  \
                    416:        { 1, IEEE80211_T_TURBO, 48000, 8, 0, 96, 4 },                   \
                    417:        { 1, IEEE80211_T_TURBO, 54000, 12, 0, 108, 4 } }                \
                    418: }
                    419:
                    420: #define AR5K_RATES_XR { 12, {                                          \
                    421:        255, 3, 1, 255, 255, 255, 2, 0, 10, 8, 6, 4,                    \
                    422:        11, 9, 7, 5, 255, 255, 255, 255, 255, 255, 255, 255,            \
                    423:        255, 255, 255, 255, 255, 255, 255, 255 }, {                     \
                    424:        { 1, IEEE80211_T_XR, 500, 7, 0, 129, 0 },                       \
                    425:        { 1, IEEE80211_T_XR, 1000, 2, 0, 139, 1 },                      \
                    426:        { 1, IEEE80211_T_XR, 2000, 6, 0, 150, 2 },                      \
                    427:        { 1, IEEE80211_T_XR, 3000, 1, 0, 150, 3 },                      \
                    428:        { 1, IEEE80211_T_OFDM, 6000, 11, 0, 140, 4 },                   \
                    429:        { 1, IEEE80211_T_OFDM, 9000, 15, 0, 18, 4 },                    \
                    430:        { 1, IEEE80211_T_OFDM, 12000, 10, 0, 152, 6 },                  \
                    431:        { 1, IEEE80211_T_OFDM, 18000, 14, 0, 36, 6 },                   \
                    432:        { 1, IEEE80211_T_OFDM, 24000, 9, 0, 176, 8 },                   \
                    433:        { 1, IEEE80211_T_OFDM, 36000, 13, 0, 72, 8 },                   \
                    434:        { 1, IEEE80211_T_OFDM, 48000, 8, 0, 96, 8 },                    \
                    435:        { 1, IEEE80211_T_OFDM, 54000, 12, 0, 108, 8 } }                 \
                    436: }
                    437:
                    438: typedef enum {
                    439:        HAL_RFGAIN_INACTIVE = 0,
                    440:        HAL_RFGAIN_READ_REQUESTED,
                    441:        HAL_RFGAIN_NEED_CHANGE,
                    442: } HAL_RFGAIN;
                    443:
                    444: typedef struct {
                    445:        u_int16_t       channel; /* MHz */
                    446:        u_int16_t       channelFlags;
                    447:
                    448: #define c_channel      channel
                    449: #define c_channel_flags        channelFlags
                    450:
                    451: } HAL_CHANNEL;
                    452:
                    453: #define HAL_SLOT_TIME_9                396
                    454: #define HAL_SLOT_TIME_20       880
                    455: #define HAL_SLOT_TIME_MAX      0xffff
                    456:
                    457: #define CHANNEL_A      (IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM)
                    458: #define CHANNEL_B      (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_CCK)
                    459: #define CHANNEL_G      (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_DYN)
                    460: #define CHANNEL_PUREG  (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_OFDM)
                    461: #define CHANNEL_T      (CHANNEL_A | IEEE80211_CHAN_TURBO)
                    462: #define CHANNEL_TG     (CHANNEL_PUREG | IEEE80211_CHAN_TURBO)
                    463: #define CHANNEL_XR     (CHANNEL_A | IEEE80211_CHAN_XR)
                    464: #define CHANNEL_MODES  \
                    465:        (CHANNEL_A | CHANNEL_B | CHANNEL_G | CHANNEL_PUREG | \
                    466:        CHANNEL_T | CHANNEL_TG | CHANNEL_XR)
                    467:
                    468: typedef enum {
                    469:        HAL_CHIP_5GHZ = IEEE80211_CHAN_5GHZ,
                    470:        HAL_CHIP_2GHZ = IEEE80211_CHAN_2GHZ
                    471: } HAL_CHIP;
                    472:
                    473: /*
                    474:  * The following structure will be used to map 2GHz channels to
                    475:  * 5GHz Atheros channels.
                    476:  */
                    477:
                    478: struct ar5k_athchan_2ghz {
                    479:        u_int32_t       a2_flags;
                    480:        u_int16_t       a2_athchan;
                    481: };
                    482:
                    483: /*
                    484:  * Regulation stuff
                    485:  */
                    486:
                    487: typedef enum ieee80211_countrycode HAL_CTRY_CODE;
                    488:
                    489: /*
                    490:  * HAL interrupt abstraction
                    491:  */
                    492:
                    493: #define HAL_INT_RX     0x00000001
                    494: #define HAL_INT_RXDESC 0x00000002
                    495: #define HAL_INT_RXNOFRM        0x00000008
                    496: #define HAL_INT_RXEOL  0x00000010
                    497: #define HAL_INT_RXORN  0x00000020
                    498: #define HAL_INT_TX     0x00000040
                    499: #define HAL_INT_TXDESC 0x00000080
                    500: #define HAL_INT_TXURN  0x00000800
                    501: #define HAL_INT_MIB    0x00001000
                    502: #define HAL_INT_RXPHY  0x00004000
                    503: #define HAL_INT_RXKCM  0x00008000
                    504: #define HAL_INT_SWBA   0x00010000
                    505: #define HAL_INT_BMISS  0x00040000
                    506: #define HAL_INT_BNR    0x00100000
                    507: #define HAL_INT_GPIO   0x01000000
                    508: #define HAL_INT_FATAL  0x40000000
                    509: #define HAL_INT_GLOBAL 0x80000000
                    510: #define HAL_INT_NOCARD 0xffffffff
                    511: #define HAL_INT_COMMON (                                               \
                    512:        HAL_INT_RXNOFRM | HAL_INT_RXDESC | HAL_INT_RXEOL |              \
                    513:        HAL_INT_RXORN | HAL_INT_TXURN | HAL_INT_TXDESC |                \
                    514:        HAL_INT_MIB | HAL_INT_RXPHY | HAL_INT_RXKCM |                   \
                    515:        HAL_INT_SWBA | HAL_INT_BMISS | HAL_INT_GPIO                     \
                    516: )
                    517:
                    518: typedef u_int32_t HAL_INT;
                    519:
                    520: /*
                    521:  * LED states
                    522:  */
                    523:
                    524: typedef enum ieee80211_state HAL_LED_STATE;
                    525:
                    526: #define HAL_LED_INIT   IEEE80211_S_INIT
                    527: #define HAL_LED_SCAN   IEEE80211_S_SCAN
                    528: #define HAL_LED_AUTH   IEEE80211_S_AUTH
                    529: #define HAL_LED_ASSOC  IEEE80211_S_ASSOC
                    530: #define HAL_LED_RUN    IEEE80211_S_RUN
                    531:
                    532: /* GPIO-controlled software LED */
                    533: #define AR5K_SOFTLED_PIN       0
                    534: #define AR5K_SOFTLED_ON                0
                    535: #define AR5K_SOFTLED_OFF       1
                    536:
                    537: /*
                    538:  * Gain settings
                    539:  */
                    540:
                    541: #define        AR5K_GAIN_CRN_FIX_BITS_5111     4
                    542: #define        AR5K_GAIN_CRN_FIX_BITS_5112     7
                    543: #define        AR5K_GAIN_CRN_MAX_FIX_BITS      AR5K_GAIN_CRN_FIX_BITS_5112
                    544: #define        AR5K_GAIN_DYN_ADJUST_HI_MARGIN  15
                    545: #define        AR5K_GAIN_DYN_ADJUST_LO_MARGIN  20
                    546: #define        AR5K_GAIN_CCK_PROBE_CORR        5
                    547: #define        AR5K_GAIN_CCK_OFDM_GAIN_DELTA   15
                    548: #define        AR5K_GAIN_STEP_COUNT            10
                    549: #define AR5K_GAIN_PARAM_TX_CLIP                0
                    550: #define AR5K_GAIN_PARAM_PD_90          1
                    551: #define AR5K_GAIN_PARAM_PD_84          2
                    552: #define AR5K_GAIN_PARAM_GAIN_SEL       3
                    553: #define AR5K_GAIN_PARAM_MIX_ORN                0
                    554: #define AR5K_GAIN_PARAM_PD_138         1
                    555: #define AR5K_GAIN_PARAM_PD_137         2
                    556: #define AR5K_GAIN_PARAM_PD_136         3
                    557: #define AR5K_GAIN_PARAM_PD_132         4
                    558: #define AR5K_GAIN_PARAM_PD_131         5
                    559: #define AR5K_GAIN_PARAM_PD_130         6
                    560: #define AR5K_GAIN_CHECK_ADJUST(_g)                                     \
                    561:        ((_g)->g_current <= (_g)->g_low || (_g)->g_current >= (_g)->g_high)
                    562:
                    563: struct ar5k_gain_opt_step {
                    564:        int16_t                         gos_param[AR5K_GAIN_CRN_MAX_FIX_BITS];
                    565:        int32_t                         gos_gain;
                    566: };
                    567:
                    568: struct ar5k_gain_opt {
                    569:        u_int32_t                       go_default;
                    570:        u_int32_t                       go_steps_count;
                    571:        const struct ar5k_gain_opt_step go_step[AR5K_GAIN_STEP_COUNT];
                    572: };
                    573:
                    574: struct ar5k_gain {
                    575:        u_int32_t                       g_step_idx;
                    576:        u_int32_t                       g_current;
                    577:        u_int32_t                       g_target;
                    578:        u_int32_t                       g_low;
                    579:        u_int32_t                       g_high;
                    580:        u_int32_t                       g_f_corr;
                    581:        u_int32_t                       g_active;
                    582:        const struct ar5k_gain_opt_step *g_step;
                    583: };
                    584:
                    585: #define AR5K_AR5111_GAIN_OPT   {                                       \
                    586:        4,                                                              \
                    587:        9,                                                              \
                    588:        {                                                               \
                    589:                { { 4, 1, 1, 1 }, 6 },                                  \
                    590:                { { 4, 0, 1, 1 }, 4 },                                  \
                    591:                { { 3, 1, 1, 1 }, 3 },                                  \
                    592:                { { 4, 0, 0, 1 }, 1 },                                  \
                    593:                { { 4, 1, 1, 0 }, 0 },                                  \
                    594:                { { 4, 0, 1, 0 }, -2 },                                 \
                    595:                { { 3, 1, 1, 0 }, -3 },                                 \
                    596:                { { 4, 0, 0, 0 }, -4 },                                 \
                    597:                { { 2, 1, 1, 0 }, -6 }                                  \
                    598:        }                                                               \
                    599: }
                    600:
                    601: #define AR5K_AR5112_GAIN_OPT   {                                       \
                    602:        1,                                                              \
                    603:        8,                                                              \
                    604:        {                                                               \
                    605:                { { 3, 0, 0, 0, 0, 0, 0 }, 6 },                         \
                    606:                { { 2, 0, 0, 0, 0, 0, 0 }, 0 },                         \
                    607:                { { 1, 0, 0, 0, 0, 0, 0 }, -3 },                        \
                    608:                { { 0, 0, 0, 0, 0, 0, 0 }, -6 },                        \
                    609:                { { 0, 1, 1, 0, 0, 0, 0 }, -8 },                        \
                    610:                { { 0, 1, 1, 0, 1, 1, 0 }, -10 },                       \
                    611:                { { 0, 1, 0, 1, 1, 1, 0 }, -13 },                       \
                    612:                { { 0, 1, 0, 1, 1, 0, 1 }, -16 },                       \
                    613:        }                                                               \
                    614: }
                    615:
                    616: /*
                    617:  * Common ar5xxx EEPROM data registers
                    618:  */
                    619:
                    620: #define AR5K_EEPROM_MAGIC              0x003d
                    621: #define AR5K_EEPROM_MAGIC_VALUE                0x5aa5
                    622: #define AR5K_EEPROM_PROTECT            0x003f
                    623: #define AR5K_EEPROM_PROTECT_RD_0_31    0x0001
                    624: #define AR5K_EEPROM_PROTECT_WR_0_31    0x0002
                    625: #define AR5K_EEPROM_PROTECT_RD_32_63   0x0004
                    626: #define AR5K_EEPROM_PROTECT_WR_32_63   0x0008
                    627: #define AR5K_EEPROM_PROTECT_RD_64_127  0x0010
                    628: #define AR5K_EEPROM_PROTECT_WR_64_127  0x0020
                    629: #define AR5K_EEPROM_PROTECT_RD_128_191 0x0040
                    630: #define AR5K_EEPROM_PROTECT_WR_128_191 0x0080
                    631: #define AR5K_EEPROM_PROTECT_RD_192_207 0x0100
                    632: #define AR5K_EEPROM_PROTECT_WR_192_207 0x0200
                    633: #define AR5K_EEPROM_PROTECT_RD_208_223 0x0400
                    634: #define AR5K_EEPROM_PROTECT_WR_208_223 0x0800
                    635: #define AR5K_EEPROM_PROTECT_RD_224_239 0x1000
                    636: #define AR5K_EEPROM_PROTECT_WR_224_239 0x2000
                    637: #define AR5K_EEPROM_PROTECT_RD_240_255 0x4000
                    638: #define AR5K_EEPROM_PROTECT_WR_240_255 0x8000
                    639: #define AR5K_EEPROM_REG_DOMAIN         0x00bf
                    640: #define AR5K_EEPROM_INFO_BASE          0x00c0
                    641: #define AR5K_EEPROM_INFO_MAX                                           \
                    642:        (0x400 - AR5K_EEPROM_INFO_BASE)
                    643: #define AR5K_EEPROM_INFO_CKSUM         0xffff
                    644: #define AR5K_EEPROM_INFO(_n)           (AR5K_EEPROM_INFO_BASE + (_n))
                    645:
                    646: #define AR5K_EEPROM_VERSION            AR5K_EEPROM_INFO(1)
                    647: #define AR5K_EEPROM_VERSION_3_0                0x3000
                    648: #define AR5K_EEPROM_VERSION_3_1                0x3001
                    649: #define AR5K_EEPROM_VERSION_3_2                0x3002
                    650: #define AR5K_EEPROM_VERSION_3_3                0x3003
                    651: #define AR5K_EEPROM_VERSION_3_4                0x3004
                    652: #define AR5K_EEPROM_VERSION_4_0                0x4000
                    653: #define AR5K_EEPROM_VERSION_4_1                0x4001
                    654: #define AR5K_EEPROM_VERSION_4_2                0x4002
                    655: #define AR5K_EEPROM_VERSION_4_3                0x4003
                    656: #define AR5K_EEPROM_VERSION_4_6                0x4006
                    657: #define AR5K_EEPROM_VERSION_4_7                0x3007
                    658:
                    659: #define AR5K_EEPROM_MODE_11A   0
                    660: #define AR5K_EEPROM_MODE_11B   1
                    661: #define AR5K_EEPROM_MODE_11G   2
                    662:
                    663: #define AR5K_EEPROM_HDR                        AR5K_EEPROM_INFO(2)
                    664: #define AR5K_EEPROM_HDR_11A(_v)                (((_v) >> AR5K_EEPROM_MODE_11A) & 0x1)
                    665: #define AR5K_EEPROM_HDR_11B(_v)                (((_v) >> AR5K_EEPROM_MODE_11B) & 0x1)
                    666: #define AR5K_EEPROM_HDR_11G(_v)                (((_v) >> AR5K_EEPROM_MODE_11G) & 0x1)
                    667: #define AR5K_EEPROM_HDR_T_2GHZ_DIS(_v) (((_v) >> 3) & 0x1)
                    668: #define AR5K_EEPROM_HDR_T_5GHZ_DBM(_v) (((_v) >> 4) & 0x7f)
                    669: #define AR5K_EEPROM_HDR_DEVICE(_v)     (((_v) >> 11) & 0x7)
                    670: #define AR5K_EEPROM_HDR_T_5GHZ_DIS(_v) (((_v) >> 15) & 0x1)
                    671: #define AR5K_EEPROM_HDR_RFKILL(_v)     (((_v) >> 14) & 0x1)
                    672:
                    673: #define AR5K_EEPROM_RFKILL_GPIO_SEL    0x0000001c
                    674: #define AR5K_EEPROM_RFKILL_GPIO_SEL_S  2
                    675: #define AR5K_EEPROM_RFKILL_POLARITY    0x00000002
                    676: #define AR5K_EEPROM_RFKILL_POLARITY_S  1
                    677:
                    678: /* Newer EEPROMs are using a different offset */
                    679: #define AR5K_EEPROM_OFF(_v, _v3_0, _v3_3)                                      \
                    680:        (((_v) >= AR5K_EEPROM_VERSION_3_3) ? _v3_3 : _v3_0)
                    681:
                    682: #define AR5K_EEPROM_ANT_GAIN(_v)       AR5K_EEPROM_OFF(_v, 0x00c4, 0x00c3)
                    683: #define AR5K_EEPROM_ANT_GAIN_5GHZ(_v)  ((int8_t)(((_v) >> 8) & 0xff))
                    684: #define AR5K_EEPROM_ANT_GAIN_2GHZ(_v)  ((int8_t)((_v) & 0xff))
                    685:
                    686: #define AR5K_EEPROM_MODES_11A(_v)      AR5K_EEPROM_OFF(_v, 0x00c5, 0x00d4)
                    687: #define AR5K_EEPROM_MODES_11B(_v)      AR5K_EEPROM_OFF(_v, 0x00d0, 0x00f2)
                    688: #define AR5K_EEPROM_MODES_11G(_v)      AR5K_EEPROM_OFF(_v, 0x00da, 0x010d)
                    689: #define AR5K_EEPROM_CTL(_v)            AR5K_EEPROM_OFF(_v, 0x00e4, 0x0128)
                    690:
                    691: /* Since 3.1 */
                    692: #define AR5K_EEPROM_OBDB0_2GHZ 0x00ec
                    693: #define AR5K_EEPROM_OBDB1_2GHZ 0x00ed
                    694:
                    695: /* Misc values available since EEPROM 4.0 */
                    696: #define AR5K_EEPROM_MISC0              0x00c4
                    697: #define AR5K_EEPROM_EARSTART(_v)       ((_v) & 0xfff)
                    698: #define AR5K_EEPROM_EEMAP(_v)          (((_v) >> 14) & 0x3)
                    699: #define AR5K_EEPROM_MISC1              0x00c5
                    700: #define AR5K_EEPROM_TARGET_PWRSTART(_v)        ((_v) & 0xfff)
                    701: #define AR5K_EEPROM_HAS32KHZCRYSTAL(_v)        (((_v) >> 14) & 0x1)
                    702:
                    703: /* Some EEPROM defines */
                    704: #define AR5K_EEPROM_EEP_SCALE          100
                    705: #define AR5K_EEPROM_EEP_DELTA          10
                    706: #define AR5K_EEPROM_N_MODES            3
                    707: #define AR5K_EEPROM_N_5GHZ_CHAN                10
                    708: #define AR5K_EEPROM_N_2GHZ_CHAN                3
                    709: #define AR5K_EEPROM_MAX_CHAN           10
                    710: #define AR5K_EEPROM_N_PCDAC            11
                    711: #define AR5K_EEPROM_N_TEST_FREQ                8
                    712: #define AR5K_EEPROM_N_EDGES            8
                    713: #define AR5K_EEPROM_N_INTERCEPTS       11
                    714: #define AR5K_EEPROM_FREQ_M(_v)         AR5K_EEPROM_OFF(_v, 0x7f, 0xff)
                    715: #define AR5K_EEPROM_PCDAC_M            0x3f
                    716: #define AR5K_EEPROM_PCDAC_START                1
                    717: #define AR5K_EEPROM_PCDAC_STOP         63
                    718: #define AR5K_EEPROM_PCDAC_STEP         1
                    719: #define AR5K_EEPROM_NON_EDGE_M         0x40
                    720: #define AR5K_EEPROM_CHANNEL_POWER      8
                    721: #define AR5K_EEPROM_N_OBDB             4
                    722: #define AR5K_EEPROM_OBDB_DIS           0xffff
                    723: #define AR5K_EEPROM_CHANNEL_DIS                0xff
                    724: #define AR5K_EEPROM_SCALE_OC_DELTA(_x) (((_x) * 2) / 10)
                    725: #define AR5K_EEPROM_N_CTLS(_v)         AR5K_EEPROM_OFF(_v, 16, 32)
                    726: #define AR5K_EEPROM_MAX_CTLS           32
                    727: #define AR5K_EEPROM_N_XPD_PER_CHANNEL  4
                    728: #define AR5K_EEPROM_N_XPD0_POINTS      4
                    729: #define AR5K_EEPROM_N_XPD3_POINTS      3
                    730: #define AR5K_EEPROM_N_INTERCEPT_10_2GHZ        35
                    731: #define AR5K_EEPROM_N_INTERCEPT_10_5GHZ        55
                    732: #define AR5K_EEPROM_POWER_M            0x3f
                    733: #define AR5K_EEPROM_POWER_MIN          0
                    734: #define AR5K_EEPROM_POWER_MAX          3150
                    735: #define AR5K_EEPROM_POWER_STEP         50
                    736: #define AR5K_EEPROM_POWER_TABLE_SIZE   64
                    737: #define AR5K_EEPROM_N_POWER_LOC_11B    4
                    738: #define AR5K_EEPROM_N_POWER_LOC_11G    6
                    739: #define AR5K_EEPROM_I_GAIN             10
                    740: #define AR5K_EEPROM_CCK_OFDM_DELTA     15
                    741: #define AR5K_EEPROM_N_IQ_CAL           2
                    742:
                    743: struct ar5k_eeprom_info {
                    744:        u_int16_t       ee_magic;
                    745:        u_int16_t       ee_protect;
                    746:        u_int16_t       ee_regdomain;
                    747:        u_int16_t       ee_version;
                    748:        u_int16_t       ee_header;
                    749:        u_int16_t       ee_ant_gain;
                    750:        u_int16_t       ee_misc0;
                    751:        u_int16_t       ee_misc1;
                    752:        u_int16_t       ee_cck_ofdm_gain_delta;
                    753:        u_int16_t       ee_cck_ofdm_power_delta;
                    754:        u_int16_t       ee_scaled_cck_delta;
                    755:        u_int16_t       ee_tx_clip;
                    756:        u_int16_t       ee_pwd_84;
                    757:        u_int16_t       ee_pwd_90;
                    758:        u_int16_t       ee_gain_select;
                    759:
                    760:        u_int16_t       ee_i_cal[AR5K_EEPROM_N_MODES];
                    761:        u_int16_t       ee_q_cal[AR5K_EEPROM_N_MODES];
                    762:        u_int16_t       ee_fixed_bias[AR5K_EEPROM_N_MODES];
                    763:        u_int16_t       ee_turbo_max_power[AR5K_EEPROM_N_MODES];
                    764:        u_int16_t       ee_xr_power[AR5K_EEPROM_N_MODES];
                    765:        u_int16_t       ee_switch_settling[AR5K_EEPROM_N_MODES];
                    766:        u_int16_t       ee_ant_tx_rx[AR5K_EEPROM_N_MODES];
                    767:        u_int16_t       ee_ant_control[AR5K_EEPROM_N_MODES][AR5K_EEPROM_N_PCDAC];
                    768:        u_int16_t       ee_ob[AR5K_EEPROM_N_MODES][AR5K_EEPROM_N_OBDB];
                    769:        u_int16_t       ee_db[AR5K_EEPROM_N_MODES][AR5K_EEPROM_N_OBDB];
                    770:        u_int16_t       ee_tx_end2xlna_enable[AR5K_EEPROM_N_MODES];
                    771:        u_int16_t       ee_tx_end2xpa_disable[AR5K_EEPROM_N_MODES];
                    772:        u_int16_t       ee_tx_frm2xpa_enable[AR5K_EEPROM_N_MODES];
                    773:        u_int16_t       ee_thr_62[AR5K_EEPROM_N_MODES];
                    774:        u_int16_t       ee_xlna_gain[AR5K_EEPROM_N_MODES];
                    775:        u_int16_t       ee_xpd[AR5K_EEPROM_N_MODES];
                    776:        u_int16_t       ee_x_gain[AR5K_EEPROM_N_MODES];
                    777:        u_int16_t       ee_i_gain[AR5K_EEPROM_N_MODES];
                    778:        u_int16_t       ee_margin_tx_rx[AR5K_EEPROM_N_MODES];
                    779:        u_int16_t       ee_false_detect[AR5K_EEPROM_N_MODES];
                    780:        u_int16_t       ee_cal_pier[AR5K_EEPROM_N_MODES][AR5K_EEPROM_N_2GHZ_CHAN];
                    781:        u_int16_t       ee_channel[AR5K_EEPROM_N_MODES][AR5K_EEPROM_MAX_CHAN];
                    782:
                    783:        u_int16_t       ee_ctls;
                    784:        u_int16_t       ee_ctl[AR5K_EEPROM_MAX_CTLS];
                    785:
                    786:        int16_t         ee_noise_floor_thr[AR5K_EEPROM_N_MODES];
                    787:        int8_t          ee_adc_desired_size[AR5K_EEPROM_N_MODES];
                    788:        int8_t          ee_pga_desired_size[AR5K_EEPROM_N_MODES];
                    789: };
                    790:
                    791: /*
                    792:  * Chipset capabilities
                    793:  */
                    794:
                    795: typedef struct {
                    796:        /*
                    797:         * Supported PHY modes
                    798:         * (ie. IEEE80211_CHAN_A, IEEE80211_CHAN_B, ...)
                    799:         */
                    800:        u_int16_t       cap_mode;
                    801:
                    802:        /*
                    803:         * Frequency range (without regulation restrictions)
                    804:         */
                    805:        struct {
                    806:                u_int16_t       range_2ghz_min;
                    807:                u_int16_t       range_2ghz_max;
                    808:                u_int16_t       range_5ghz_min;
                    809:                u_int16_t       range_5ghz_max;
                    810:        } cap_range;
                    811:
                    812:        /*
                    813:         * Active regulation domain settings
                    814:         */
                    815:        struct {
                    816:                ieee80211_regdomain_t   reg_current;
                    817:                ieee80211_regdomain_t   reg_hw;
                    818:        } cap_regdomain;
                    819:
                    820:        /*
                    821:         * Values stored in the EEPROM (some of them...)
                    822:         */
                    823:        struct ar5k_eeprom_info cap_eeprom;
                    824:
                    825:        /*
                    826:         * Queue information
                    827:         */
                    828:        struct {
                    829:                u_int8_t        q_tx_num;
                    830:        } cap_queues;
                    831: } ar5k_capabilities_t;
                    832:
                    833: /*
                    834:  * TX power and TPC settings
                    835:  */
                    836:
                    837: #define AR5K_TXPOWER_OFDM(_r, _v)      (                               \
                    838:        ((0 & 1) << ((_v) + 6)) |                                       \
                    839:        (((hal->ah_txpower.txp_rates[(_r)]) & 0x3f) << (_v))            \
                    840: )
                    841:
                    842: #define AR5K_TXPOWER_CCK(_r, _v)       (                               \
                    843:        (hal->ah_txpower.txp_rates[(_r)] & 0x3f) << (_v)                \
                    844: )
                    845:
                    846: /*
                    847:  * Atheros descriptor definitions
                    848:  */
                    849:
                    850: struct ath_tx_status {
                    851:        u_int16_t       ts_seqnum;
                    852:        u_int16_t       ts_tstamp;
                    853:        u_int8_t        ts_status;
                    854:        u_int8_t        ts_rate;
                    855:        int8_t          ts_rssi;
                    856:        u_int8_t        ts_shortretry;
                    857:        u_int8_t        ts_longretry;
                    858:        u_int8_t        ts_virtcol;
                    859:        u_int8_t        ts_antenna;
                    860: };
                    861:
                    862: #define HAL_TXSTAT_ALTRATE     0x80
                    863: #define HAL_TXERR_XRETRY       0x01
                    864: #define HAL_TXERR_FILT         0x02
                    865: #define HAL_TXERR_FIFO         0x04
                    866:
                    867: struct ath_rx_status {
                    868:        u_int16_t       rs_datalen;
                    869:        u_int16_t       rs_tstamp;
                    870:        u_int8_t        rs_status;
                    871:        u_int8_t        rs_phyerr;
                    872:        int8_t          rs_rssi;
                    873:        u_int8_t        rs_keyix;
                    874:        u_int8_t        rs_rate;
                    875:        u_int8_t        rs_antenna;
                    876:        u_int8_t        rs_more;
                    877: };
                    878:
                    879: #define HAL_RXERR_CRC          0x01
                    880: #define HAL_RXERR_PHY          0x02
                    881: #define HAL_RXERR_FIFO         0x04
                    882: #define HAL_RXERR_DECRYPT      0x08
                    883: #define HAL_RXERR_MIC          0x10
                    884: #define HAL_RXKEYIX_INVALID    ((u_int8_t) - 1)
                    885: #define HAL_TXKEYIX_INVALID    ((u_int32_t) - 1)
                    886:
                    887: #define HAL_PHYERR_UNDERRUN            0x00
                    888: #define HAL_PHYERR_TIMING              0x01
                    889: #define HAL_PHYERR_PARITY              0x02
                    890: #define HAL_PHYERR_RATE                        0x03
                    891: #define HAL_PHYERR_LENGTH              0x04
                    892: #define HAL_PHYERR_RADAR               0x05
                    893: #define HAL_PHYERR_SERVICE             0x06
                    894: #define HAL_PHYERR_TOR                 0x07
                    895: #define HAL_PHYERR_OFDM_TIMING         0x11
                    896: #define HAL_PHYERR_OFDM_SIGNAL_PARITY  0x12
                    897: #define HAL_PHYERR_OFDM_RATE_ILLEGAL   0x13
                    898: #define HAL_PHYERR_OFDM_LENGTH_ILLEGAL 0x14
                    899: #define HAL_PHYERR_OFDM_POWER_DROP     0x15
                    900: #define HAL_PHYERR_OFDM_SERVICE                0x16
                    901: #define HAL_PHYERR_OFDM_RESTART                0x17
                    902: #define HAL_PHYERR_CCK_TIMING          0x19
                    903: #define HAL_PHYERR_CCK_HEADER_CRC      0x1a
                    904: #define HAL_PHYERR_CCK_RATE_ILLEGAL    0x1b
                    905: #define HAL_PHYERR_CCK_SERVICE         0x1e
                    906: #define HAL_PHYERR_CCK_RESTART         0x1f
                    907:
                    908: struct ath_desc {
                    909:        u_int32_t       ds_link;
                    910:        u_int32_t       ds_data;
                    911:        u_int32_t       ds_ctl0;
                    912:        u_int32_t       ds_ctl1;
                    913:        u_int32_t       ds_hw[4];
                    914:
                    915:        union {
                    916:                struct ath_rx_status rx;
                    917:                struct ath_tx_status tx;
                    918:        } ds_us;
                    919:
                    920: #define ds_rxstat ds_us.rx
                    921: #define ds_txstat ds_us.tx
                    922:
                    923: } __packed;
                    924:
                    925: #define HAL_RXDESC_INTREQ      0x0020
                    926:
                    927: #define HAL_TXDESC_CLRDMASK    0x0001
                    928: #define HAL_TXDESC_NOACK       0x0002
                    929: #define HAL_TXDESC_RTSENA      0x0004
                    930: #define HAL_TXDESC_CTSENA      0x0008
                    931: #define HAL_TXDESC_INTREQ      0x0010
                    932: #define HAL_TXDESC_VEOL                0x0020
                    933:
                    934: /*
                    935:  * Hardware abstraction layer structure
                    936:  */
                    937:
                    938: #define AR5K_HAL_FUNCTION(_hal, _n, _f)        (_hal)->ah_##_f = ar5k_##_n##_##_f
                    939: #define AR5K_HAL_FUNCTIONS(_t, _n, _a) \
                    940:        _t const HAL_RATE_TABLE *(_a _n##_get_rate_table)(struct ath_hal *, \
                    941:            u_int mode); \
                    942:        _t void (_a _n##_detach)(struct ath_hal *); \
                    943:        /* Reset functions */ \
                    944:        _t HAL_BOOL (_a _n##_reset)(struct ath_hal *, HAL_OPMODE, \
                    945:            HAL_CHANNEL *, HAL_BOOL change_channel, HAL_STATUS *status); \
                    946:        _t void (_a _n##_set_opmode)(struct ath_hal *); \
                    947:        _t HAL_BOOL (_a _n##_calibrate)(struct ath_hal*, \
                    948:            HAL_CHANNEL *); \
                    949:        /* Transmit functions */ \
                    950:        _t HAL_BOOL (_a _n##_update_tx_triglevel)(struct ath_hal*, \
                    951:            HAL_BOOL level); \
                    952:        _t int (_a _n##_setup_tx_queue)(struct ath_hal *, HAL_TX_QUEUE, \
                    953:            const HAL_TXQ_INFO *); \
                    954:        _t HAL_BOOL (_a _n##_setup_tx_queueprops)(struct ath_hal *, int queue, \
                    955:            const HAL_TXQ_INFO *); \
                    956:        _t HAL_BOOL (_a _n##_release_tx_queue)(struct ath_hal *, u_int queue); \
                    957:        _t HAL_BOOL (_a _n##_reset_tx_queue)(struct ath_hal *, u_int queue); \
                    958:        _t u_int32_t (_a _n##_get_tx_buf)(struct ath_hal *, u_int queue); \
                    959:        _t HAL_BOOL (_a _n##_put_tx_buf)(struct ath_hal *, u_int, \
                    960:            u_int32_t phys_addr); \
                    961:        _t HAL_BOOL (_a _n##_tx_start)(struct ath_hal *, u_int queue); \
                    962:        _t HAL_BOOL (_a _n##_stop_tx_dma)(struct ath_hal *, u_int queue); \
                    963:        _t HAL_BOOL (_a _n##_setup_tx_desc)(struct ath_hal *, \
                    964:            struct ath_desc *, \
                    965:            u_int packet_length, u_int header_length, HAL_PKT_TYPE type, \
                    966:            u_int txPower, u_int tx_rate0, u_int tx_tries0, u_int key_index, \
                    967:            u_int antenna_mode, u_int flags, u_int rtscts_rate, \
                    968:            u_int rtscts_duration); \
                    969:        _t HAL_BOOL (_a _n##_setup_xtx_desc)(struct ath_hal *, \
                    970:            struct ath_desc *, \
                    971:            u_int tx_rate1, u_int tx_tries1, u_int tx_rate2, u_int tx_tries2, \
                    972:            u_int tx_rate3, u_int tx_tries3); \
                    973:        _t HAL_BOOL (_a _n##_fill_tx_desc)(struct ath_hal *, \
                    974:            struct ath_desc *, \
                    975:            u_int segLen, HAL_BOOL firstSeg, HAL_BOOL lastSeg); \
                    976:        _t HAL_STATUS (_a _n##_proc_tx_desc)(struct ath_hal *, \
                    977:            struct ath_desc *); \
                    978:        _t HAL_BOOL (_a _n##_has_veol)(struct ath_hal *); \
                    979:        /* Receive Functions */ \
                    980:        _t u_int32_t (_a _n##_get_rx_buf)(struct ath_hal*); \
                    981:        _t void (_a _n##_put_rx_buf)(struct ath_hal*, u_int32_t rxdp); \
                    982:        _t void (_a _n##_start_rx)(struct ath_hal*); \
                    983:        _t HAL_BOOL (_a _n##_stop_rx_dma)(struct ath_hal*); \
                    984:        _t void (_a _n##_start_rx_pcu)(struct ath_hal*); \
                    985:        _t void (_a _n##_stop_pcu_recv)(struct ath_hal*); \
                    986:        _t void (_a _n##_set_mcast_filter)(struct ath_hal*, \
                    987:            u_int32_t filter0, u_int32_t filter1); \
                    988:        _t HAL_BOOL (_a _n##_set_mcast_filterindex)(struct ath_hal*, \
                    989:            u_int32_t index); \
                    990:        _t HAL_BOOL (_a _n##_clear_mcast_filter_idx)(struct ath_hal*, \
                    991:            u_int32_t index); \
                    992:        _t u_int32_t (_a _n##_get_rx_filter)(struct ath_hal*); \
                    993:        _t void (_a _n##_set_rx_filter)(struct ath_hal*, u_int32_t); \
                    994:        _t HAL_BOOL (_a _n##_setup_rx_desc)(struct ath_hal *, \
                    995:            struct ath_desc *, u_int32_t size, u_int flags); \
                    996:        _t HAL_STATUS (_a _n##_proc_rx_desc)(struct ath_hal *, \
                    997:            struct ath_desc *, u_int32_t phyAddr, struct ath_desc *next); \
                    998:        _t void (_a _n##_set_rx_signal)(struct ath_hal *); \
                    999:        /* Misc Functions */ \
                   1000:        _t void (_a _n##_dump_state)(struct ath_hal *); \
                   1001:        _t HAL_BOOL (_a _n##_get_diag_state)(struct ath_hal *, int, void **, \
                   1002:            u_int *); \
                   1003:        _t void (_a _n##_get_lladdr)(struct ath_hal *, u_int8_t *); \
                   1004:        _t HAL_BOOL (_a _n##_set_lladdr)(struct ath_hal *, \
                   1005:            const u_int8_t*); \
                   1006:        _t HAL_BOOL (_a _n##_set_regdomain)(struct ath_hal*, \
                   1007:            u_int16_t, HAL_STATUS *); \
                   1008:        _t void (_a _n##_set_ledstate)(struct ath_hal*, HAL_LED_STATE); \
                   1009:        _t void (_a _n##_set_associd)(struct ath_hal*, \
                   1010:            const u_int8_t *bssid, u_int16_t assocId, u_int16_t timOffset); \
                   1011:        _t HAL_BOOL (_a _n##_set_gpio_output)(struct ath_hal *, \
                   1012:            u_int32_t gpio); \
                   1013:        _t HAL_BOOL (_a _n##_set_gpio_input)(struct ath_hal *, \
                   1014:            u_int32_t gpio); \
                   1015:        _t u_int32_t (_a _n##_get_gpio)(struct ath_hal *, u_int32_t gpio); \
                   1016:        _t HAL_BOOL (_a _n##_set_gpio)(struct ath_hal *, u_int32_t gpio, \
                   1017:            u_int32_t val); \
                   1018:        _t void (_a _n##_set_gpio_intr)(struct ath_hal*, u_int, u_int32_t); \
                   1019:        _t u_int32_t (_a _n##_get_tsf32)(struct ath_hal*); \
                   1020:        _t u_int64_t (_a _n##_get_tsf64)(struct ath_hal*); \
                   1021:        _t void (_a _n##_reset_tsf)(struct ath_hal*); \
                   1022:        _t u_int16_t (_a _n##_get_regdomain)(struct ath_hal*); \
                   1023:        _t HAL_BOOL (_a _n##_detect_card_present)(struct ath_hal*); \
                   1024:        _t void (_a _n##_update_mib_counters)(struct ath_hal*, \
                   1025:            HAL_MIB_STATS*); \
                   1026:        _t HAL_BOOL (_a _n##_is_cipher_supported)(struct ath_hal*, \
                   1027:            HAL_CIPHER); \
                   1028:        _t HAL_RFGAIN (_a _n##_get_rf_gain)(struct ath_hal*); \
                   1029:        _t HAL_BOOL (_a _n##_set_slot_time)(struct ath_hal*, u_int);    \
                   1030:        _t u_int (_a _n##_get_slot_time)(struct ath_hal*);              \
                   1031:        _t HAL_BOOL (_a _n##_set_ack_timeout)(struct ath_hal *, u_int); \
                   1032:        _t u_int (_a _n##_get_ack_timeout)(struct ath_hal*);            \
                   1033:        _t HAL_BOOL (_a _n##_set_cts_timeout)(struct ath_hal*, u_int);  \
                   1034:        _t u_int (_a _n##_get_cts_timeout)(struct ath_hal*);            \
                   1035:        /* Key Cache Functions */ \
                   1036:        _t u_int32_t (_a _n##_get_keycache_size)(struct ath_hal*); \
                   1037:        _t HAL_BOOL (_a _n##_reset_key)(struct ath_hal*, \
                   1038:            u_int16_t); \
                   1039:        _t HAL_BOOL (_a _n##_is_key_valid)(struct ath_hal *, \
                   1040:            u_int16_t); \
                   1041:        _t HAL_BOOL (_a _n##_set_key)(struct ath_hal*, u_int16_t, \
                   1042:            const HAL_KEYVAL *, const u_int8_t *, int); \
                   1043:        _t HAL_BOOL (_a _n##_set_key_lladdr)(struct ath_hal*, \
                   1044:            u_int16_t, const u_int8_t *); \
                   1045:        /* Power Management Functions */ \
                   1046:        _t HAL_BOOL (_a _n##_set_power)(struct ath_hal*, \
                   1047:            HAL_POWER_MODE mode, \
                   1048:            HAL_BOOL set_chip, u_int16_t sleep_duration); \
                   1049:        _t HAL_POWER_MODE (_a _n##_get_power_mode)(struct ath_hal*); \
                   1050:        _t HAL_BOOL (_a _n##_query_pspoll_support)(struct ath_hal*); \
                   1051:        _t HAL_BOOL (_a _n##_init_pspoll)(struct ath_hal*); \
                   1052:        _t HAL_BOOL (_a _n##_enable_pspoll)(struct ath_hal *, u_int8_t *, \
                   1053:            u_int16_t); \
                   1054:        _t HAL_BOOL (_a _n##_disable_pspoll)(struct ath_hal *); \
                   1055:        /* Beacon Management Functions */ \
                   1056:        _t void (_a _n##_init_beacon)(struct ath_hal *, u_int32_t nexttbtt, \
                   1057:            u_int32_t intval); \
                   1058:        _t void (_a _n##_set_beacon_timers)(struct ath_hal *, \
                   1059:            const HAL_BEACON_STATE *, u_int32_t tsf, u_int32_t dtimCount, \
                   1060:            u_int32_t cfpCcount); \
                   1061:        _t void (_a _n##_reset_beacon)(struct ath_hal *); \
                   1062:        _t HAL_BOOL (_a _n##_wait_for_beacon)(struct ath_hal *, \
                   1063:            bus_addr_t); \
                   1064:        /* Interrupt functions */ \
                   1065:        _t HAL_BOOL (_a _n##_is_intr_pending)(struct ath_hal *); \
                   1066:        _t HAL_BOOL (_a _n##_get_isr)(struct ath_hal *, \
                   1067:            u_int32_t *); \
                   1068:        _t u_int32_t (_a _n##_get_intr)(struct ath_hal *); \
                   1069:        _t HAL_INT (_a _n##_set_intr)(struct ath_hal *, HAL_INT); \
                   1070:        /* Chipset functions (ar5k-specific, non-HAL) */ \
                   1071:        _t HAL_BOOL (_a _n##_get_capabilities)(struct ath_hal *); \
                   1072:        _t void (_a _n##_radar_alert)(struct ath_hal *, HAL_BOOL enable); \
                   1073:        _t HAL_BOOL (_a _n##_eeprom_is_busy)(struct ath_hal *); \
                   1074:        _t int (_a _n##_eeprom_read)(struct ath_hal *, u_int32_t offset, \
                   1075:            u_int16_t *data); \
                   1076:        _t int (_a _n##_eeprom_write)(struct ath_hal *, u_int32_t offset, \
                   1077:            u_int16_t data); \
                   1078:        /* Unused functions */ \
                   1079:        _t HAL_BOOL (_a _n##_get_tx_queueprops)(struct ath_hal *, int, \
                   1080:            HAL_TXQ_INFO *); \
                   1081:        _t u_int32_t  (_a _n##_num_tx_pending)(struct ath_hal *, u_int); \
                   1082:        _t HAL_BOOL (_a _n##_phy_disable)(struct ath_hal *); \
                   1083:        _t HAL_BOOL (_a _n##_set_txpower_limit)(struct ath_hal *, u_int); \
                   1084:        _t void (_a _n##_set_def_antenna)(struct ath_hal *, u_int); \
                   1085:        _t u_int  (_a _n ##_get_def_antenna)(struct ath_hal *); \
                   1086:        _t HAL_BOOL (_a _n##_set_bssid_mask)(struct ath_hal *, \
                   1087:            const u_int8_t*);
                   1088:
                   1089: #define AR5K_MAX_GPIO          10
                   1090: #define AR5K_MAX_RF_BANKS      8
                   1091:
                   1092: struct ath_hal {
                   1093:        u_int32_t               ah_magic;
                   1094:        u_int32_t               ah_abi;
                   1095:        u_int16_t               ah_device;
                   1096:        u_int16_t               ah_sub_vendor;
                   1097:
                   1098:        void                    *ah_sc;
                   1099:        bus_space_tag_t         ah_st;
                   1100:        bus_space_handle_t      ah_sh;
                   1101:
                   1102:        HAL_INT                 ah_imr;
                   1103:
                   1104:        HAL_OPMODE              ah_op_mode;
                   1105:        HAL_POWER_MODE          ah_power_mode;
                   1106:        HAL_CHANNEL             ah_current_channel;
                   1107:        HAL_BOOL                ah_turbo;
                   1108:        HAL_BOOL                ah_calibration;
                   1109:        HAL_BOOL                ah_running;
                   1110:        HAL_BOOL                ah_single_chip;
                   1111:        HAL_RFGAIN              ah_rf_gain;
                   1112:
                   1113:        HAL_RATE_TABLE          ah_rt_11a;
                   1114:        HAL_RATE_TABLE          ah_rt_11b;
                   1115:        HAL_RATE_TABLE          ah_rt_11g;
                   1116:        HAL_RATE_TABLE          ah_rt_turbo;
                   1117:        HAL_RATE_TABLE          ah_rt_xr;
                   1118:
                   1119:        u_int32_t               ah_mac_srev;
                   1120:        u_int16_t               ah_mac_version;
                   1121:        u_int16_t               ah_mac_revision;
                   1122:        u_int16_t               ah_phy_revision;
                   1123:        u_int16_t               ah_radio_5ghz_revision;
                   1124:        u_int16_t               ah_radio_2ghz_revision;
                   1125:
                   1126:        enum ar5k_version       ah_version;
                   1127:        enum ar5k_radio         ah_radio;
                   1128:        u_int32_t               ah_phy;
                   1129:
                   1130:        HAL_BOOL                ah_5ghz;
                   1131:        HAL_BOOL                ah_2ghz;
                   1132:
                   1133: #define ah_regdomain           ah_capabilities.cap_regdomain.reg_current
                   1134: #define ah_regdomain_hw                ah_capabilities.cap_regdomain.reg_hw
                   1135: #define ah_modes               ah_capabilities.cap_mode
                   1136: #define ah_ee_version          ah_capabilities.cap_eeprom.ee_version
                   1137:
                   1138:        u_int32_t               ah_atim_window;
                   1139:        u_int32_t               ah_aifs;
                   1140:        u_int32_t               ah_cw_min;
                   1141:        u_int32_t               ah_cw_max;
                   1142:        HAL_BOOL                ah_software_retry;
                   1143:        u_int32_t               ah_limit_tx_retries;
                   1144:
                   1145:        u_int32_t               ah_antenna[AR5K_EEPROM_N_MODES][HAL_ANT_MAX];
                   1146:        HAL_BOOL                ah_ant_diversity;
                   1147:
                   1148:        u_int8_t                ah_sta_id[IEEE80211_ADDR_LEN];
                   1149:        u_int8_t                ah_bssid[IEEE80211_ADDR_LEN];
                   1150:
                   1151:        u_int32_t               ah_gpio[AR5K_MAX_GPIO];
                   1152:        int                     ah_gpio_npins;
                   1153:
                   1154:        ar5k_capabilities_t     ah_capabilities;
                   1155:
                   1156:        HAL_TXQ_INFO            ah_txq[HAL_NUM_TX_QUEUES];
                   1157:        u_int32_t               ah_txq_interrupts;
                   1158:
                   1159:        u_int32_t               *ah_rf_banks;
                   1160:        size_t                  ah_rf_banks_size;
                   1161:        struct ar5k_gain        ah_gain;
                   1162:        u_int32_t               ah_offset[AR5K_MAX_RF_BANKS];
                   1163:
                   1164:        struct {
                   1165:                u_int16_t       txp_pcdac[AR5K_EEPROM_POWER_TABLE_SIZE];
                   1166:                u_int16_t       txp_rates[AR5K_MAX_RATES];
                   1167:                int16_t         txp_min, txp_max;
                   1168:                HAL_BOOL        txp_tpc;
                   1169:                int16_t         txp_ofdm;
                   1170:        } ah_txpower;
                   1171:
                   1172:        struct {
                   1173:                HAL_BOOL        r_enabled;
                   1174:                int             r_last_alert;
                   1175:                HAL_CHANNEL     r_last_channel;
                   1176:        } ah_radar;
                   1177:
                   1178:        /*
                   1179:         * Function pointers
                   1180:         */
                   1181:        AR5K_HAL_FUNCTIONS(, ah, *);
                   1182: };
                   1183:
                   1184: /*
                   1185:  * Common silicon revision/version values
                   1186:  */
                   1187: enum ar5k_srev_type {
                   1188:        AR5K_VERSION_VER,
                   1189:        AR5K_VERSION_REV,
                   1190:        AR5K_VERSION_RAD,
                   1191:        AR5K_VERSION_DEV,
                   1192: };
                   1193:
                   1194: struct ar5k_srev_name {
                   1195:        const char              *sr_name;
                   1196:        enum ar5k_srev_type     sr_type;
                   1197:        u_int                   sr_val;
                   1198: };
                   1199:
                   1200: #define AR5K_SREV_NAME {                                               \
                   1201:        { "5210",       AR5K_VERSION_VER,       AR5K_SREV_VER_AR5210 }, \
                   1202:        { "5311",       AR5K_VERSION_VER,       AR5K_SREV_VER_AR5311 }, \
                   1203:        { "5311a",      AR5K_VERSION_VER,       AR5K_SREV_VER_AR5311A },\
                   1204:        { "5311b",      AR5K_VERSION_VER,       AR5K_SREV_VER_AR5311B },\
                   1205:        { "5211",       AR5K_VERSION_VER,       AR5K_SREV_VER_AR5211 }, \
                   1206:        { "5212",       AR5K_VERSION_VER,       AR5K_SREV_VER_AR5212 }, \
                   1207:        { "5213",       AR5K_VERSION_VER,       AR5K_SREV_VER_AR5213 }, \
                   1208:        { "xxxx",       AR5K_VERSION_VER,       AR5K_SREV_UNKNOWN },    \
                   1209:        { "5110",       AR5K_VERSION_RAD,       AR5K_SREV_RAD_5110 },   \
                   1210:        { "5111",       AR5K_VERSION_RAD,       AR5K_SREV_RAD_5111 },   \
                   1211:        { "2111",       AR5K_VERSION_RAD,       AR5K_SREV_RAD_2111 },   \
                   1212:        { "5112",       AR5K_VERSION_RAD,       AR5K_SREV_RAD_5112 },   \
                   1213:        { "5112a",      AR5K_VERSION_RAD,       AR5K_SREV_RAD_5112A },  \
                   1214:        { "2112",       AR5K_VERSION_RAD,       AR5K_SREV_RAD_2112 },   \
                   1215:        { "2112a",      AR5K_VERSION_RAD,       AR5K_SREV_RAD_2112A },  \
                   1216:        { "xxxx",       AR5K_VERSION_RAD,       AR5K_SREV_UNKNOWN },    \
                   1217:        { "2413",       AR5K_VERSION_DEV,       AR5K_DEVID_AR2413 },    \
                   1218:        { "5413",       AR5K_VERSION_DEV,       AR5K_DEVID_AR5413 },    \
                   1219:        { "5424",       AR5K_VERSION_DEV,       AR5K_DEVID_AR5424 },    \
                   1220:        { "xxxx",       AR5K_VERSION_DEV,       AR5K_SREV_UNKNOWN }     \
                   1221: }
                   1222:
                   1223: #define AR5K_SREV_UNKNOWN      0xffff
                   1224:
                   1225: #define AR5K_SREV_VER_AR5210   0x00
                   1226: #define AR5K_SREV_VER_AR5311   0x10
                   1227: #define AR5K_SREV_VER_AR5311A  0x20
                   1228: #define AR5K_SREV_VER_AR5311B  0x30
                   1229: #define AR5K_SREV_VER_AR5211   0x40
                   1230: #define AR5K_SREV_VER_AR5212   0x50
                   1231: #define AR5K_SREV_VER_AR5213   0x55
                   1232: #define AR5K_SREV_VER_UNSUPP   0x60
                   1233:
                   1234: #define AR5K_SREV_RAD_5110     0x00
                   1235: #define AR5K_SREV_RAD_5111     0x10
                   1236: #define AR5K_SREV_RAD_5111A    0x15
                   1237: #define AR5K_SREV_RAD_2111     0x20
                   1238: #define AR5K_SREV_RAD_5112     0x30
                   1239: #define AR5K_SREV_RAD_5112A    0x35
                   1240: #define AR5K_SREV_RAD_2112     0x40
                   1241: #define AR5K_SREV_RAD_2112A    0x45
                   1242: #define AR5K_SREV_RAD_UNSUPP   0x50
                   1243:
                   1244: #define AR5K_DEVID_AR2413      0x001a
                   1245: #define AR5K_DEVID_AR5413      0x001b
                   1246: #define AR5K_DEVID_AR5424      0x001c
                   1247:
                   1248: /*
                   1249:  * Misc defines
                   1250:  */
                   1251:
                   1252: #define HAL_ABI_VERSION                0x04090901 /* YYMMDDnn */
                   1253:
                   1254: #define AR5K_PRINTF(fmt, ...)  printf("%s: " fmt, __func__, ##__VA_ARGS__)
                   1255: #define AR5K_PRINT(fmt)                printf("%s: " fmt, __func__)
                   1256: #ifdef AR5K_DEBUG
                   1257: #define AR5K_TRACE             printf("%s:%d\n", __func__, __LINE__)
                   1258: #else
                   1259: #define AR5K_TRACE
                   1260: #endif
                   1261: #define AR5K_DELAY(_n)         delay(_n)
                   1262: #define AR5K_ELEMENTS(_array)  (sizeof(_array) / sizeof(_array[0]))
                   1263:
                   1264: typedef struct ath_hal * (ar5k_attach_t)
                   1265:        (u_int16_t, void *, bus_space_tag_t, bus_space_handle_t, HAL_STATUS *);
                   1266: typedef HAL_BOOL (ar5k_rfgain_t)
                   1267:        (struct ath_hal *, HAL_CHANNEL *, u_int);
                   1268:
                   1269: /*
                   1270:  * Some tuneable values (these should be changeable by the user)
                   1271:  */
                   1272:
                   1273: #define AR5K_TUNE_DMA_BEACON_RESP              2
                   1274: #define AR5K_TUNE_SW_BEACON_RESP               10
                   1275: #define AR5K_TUNE_ADDITIONAL_SWBA_BACKOFF      0
                   1276: #define AR5K_TUNE_RADAR_ALERT                  AH_FALSE
                   1277: #define AR5K_TUNE_MIN_TX_FIFO_THRES            1
                   1278: #define AR5K_TUNE_MAX_TX_FIFO_THRES            ((IEEE80211_MAX_LEN / 64) + 1)
                   1279: #define AR5K_TUNE_RSSI_THRES                   1792
                   1280: #define AR5K_TUNE_REGISTER_TIMEOUT             20000
                   1281: #define AR5K_TUNE_REGISTER_DWELL_TIME          20000
                   1282: #define AR5K_TUNE_BEACON_INTERVAL              100
                   1283: #define AR5K_TUNE_AIFS                         2
                   1284: #define AR5K_TUNE_AIFS_11B                     2
                   1285: #define AR5K_TUNE_AIFS_XR                      0
                   1286: #define AR5K_TUNE_CWMIN                                15
                   1287: #define AR5K_TUNE_CWMIN_11B                    31
                   1288: #define AR5K_TUNE_CWMIN_XR                     3
                   1289: #define AR5K_TUNE_CWMAX                                1023
                   1290: #define AR5K_TUNE_CWMAX_11B                    1023
                   1291: #define AR5K_TUNE_CWMAX_XR                     7
                   1292: #define AR5K_TUNE_NOISE_FLOOR                  -72
                   1293: #define AR5K_TUNE_MAX_TXPOWER                  60
                   1294: #define AR5K_TUNE_DEFAULT_TXPOWER              30
                   1295: #define AR5K_TUNE_TPC_TXPOWER                  AH_TRUE
                   1296: #define AR5K_TUNE_ANT_DIVERSITY                        AH_TRUE
                   1297: #define AR5K_TUNE_HWTXTRIES                    4
                   1298:
                   1299: /* Default regulation domain if stored value EEPROM value is invalid */
                   1300: #define AR5K_TUNE_REGDOMAIN    DMN_FCC2_FCCA   /* Canada */
                   1301:
                   1302: /*
                   1303:  * Common initial register values
                   1304:  */
                   1305:
                   1306: #define AR5K_INIT_MODE                         (                       \
                   1307:        IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_DYN                        \
                   1308: )
                   1309: #define AR5K_INIT_TX_LATENCY                   502
                   1310: #define AR5K_INIT_USEC                         39
                   1311: #define AR5K_INIT_USEC_TURBO                   79
                   1312: #define AR5K_INIT_USEC_32                      31
                   1313: #define AR5K_INIT_CARR_SENSE_EN                        1
                   1314: #define AR5K_INIT_PROG_IFS                     920
                   1315: #define AR5K_INIT_PROG_IFS_TURBO               960
                   1316: #define AR5K_INIT_EIFS                         3440
                   1317: #define AR5K_INIT_EIFS_TURBO                   6880
                   1318: #define AR5K_INIT_SLOT_TIME                    396
                   1319: #define AR5K_INIT_SLOT_TIME_TURBO              480
                   1320: #define AR5K_INIT_ACK_CTS_TIMEOUT              1024
                   1321: #define AR5K_INIT_ACK_CTS_TIMEOUT_TURBO                0x08000800
                   1322: #define AR5K_INIT_SIFS                         560
                   1323: #define AR5K_INIT_SIFS_TURBO                   480
                   1324: #define AR5K_INIT_SH_RETRY                     10
                   1325: #define AR5K_INIT_LG_RETRY                     AR5K_INIT_SH_RETRY
                   1326: #define AR5K_INIT_SSH_RETRY                    32
                   1327: #define AR5K_INIT_SLG_RETRY                    AR5K_INIT_SSH_RETRY
                   1328: #define AR5K_INIT_TX_RETRY                     10
                   1329: #define AR5K_INIT_TOPS                         8
                   1330: #define AR5K_INIT_RXNOFRM                      8
                   1331: #define AR5K_INIT_RPGTO                                0
                   1332: #define AR5K_INIT_TXNOFRM                      0
                   1333: #define AR5K_INIT_BEACON_PERIOD                        65535
                   1334: #define AR5K_INIT_TIM_OFFSET                   0
                   1335: #define AR5K_INIT_BEACON_EN                    0
                   1336: #define AR5K_INIT_RESET_TSF                    0
                   1337: #define AR5K_INIT_TRANSMIT_LATENCY             (                       \
                   1338:        (AR5K_INIT_TX_LATENCY << 14) | (AR5K_INIT_USEC_32 << 7) |       \
                   1339:        (AR5K_INIT_USEC)                                                \
                   1340: )
                   1341: #define AR5K_INIT_TRANSMIT_LATENCY_TURBO       (                       \
                   1342:        (AR5K_INIT_TX_LATENCY << 14) | (AR5K_INIT_USEC_32 << 7) |       \
                   1343:        (AR5K_INIT_USEC_TURBO)                                          \
                   1344: )
                   1345: #define AR5K_INIT_PROTO_TIME_CNTRL             (                       \
                   1346:        (AR5K_INIT_CARR_SENSE_EN << 26) | (AR5K_INIT_EIFS << 12) |      \
                   1347:        (AR5K_INIT_PROG_IFS)                                            \
                   1348: )
                   1349: #define AR5K_INIT_PROTO_TIME_CNTRL_TURBO       (                       \
                   1350:        (AR5K_INIT_CARR_SENSE_EN << 26) | (AR5K_INIT_EIFS_TURBO << 12) |\
                   1351:        (AR5K_INIT_PROG_IFS_TURBO)                                      \
                   1352: )
                   1353: #define AR5K_INIT_BEACON_CONTROL               (                       \
                   1354:        (AR5K_INIT_RESET_TSF << 24) | (AR5K_INIT_BEACON_EN << 23) |     \
                   1355:        (AR5K_INIT_TIM_OFFSET << 16) | (AR5K_INIT_BEACON_PERIOD)        \
                   1356: )
                   1357:
                   1358: /*
                   1359:  * AR5k register access
                   1360:  */
                   1361:
                   1362: #define AR5K_REG_WRITE(_reg, _val)                                     \
                   1363:        bus_space_write_4(hal->ah_st, hal->ah_sh, (_reg), (_val))
                   1364: #define AR5K_REG_READ(_reg)                                            \
                   1365:        bus_space_read_4(hal->ah_st, hal->ah_sh, (_reg))
                   1366:
                   1367: #define AR5K_REG_SM(_val, _flags)                                      \
                   1368:        (((_val) << _flags##_S) & (_flags))
                   1369: #define AR5K_REG_MS(_val, _flags)                                      \
                   1370:        (((_val) & (_flags)) >> _flags##_S)
                   1371: #define AR5K_REG_WRITE_BITS(_reg, _flags, _val)                                \
                   1372:        AR5K_REG_WRITE(_reg, (AR5K_REG_READ(_reg) &~ (_flags)) |        \
                   1373:            (((_val) << _flags##_S) & (_flags)))
                   1374: #define AR5K_REG_MASKED_BITS(_reg, _flags, _mask)                      \
                   1375:        AR5K_REG_WRITE(_reg, (AR5K_REG_READ(_reg) & (_mask)) | (_flags))
                   1376: #define AR5K_REG_ENABLE_BITS(_reg, _flags)                             \
                   1377:        AR5K_REG_WRITE(_reg, AR5K_REG_READ(_reg) | (_flags))
                   1378: #define AR5K_REG_DISABLE_BITS(_reg, _flags)                            \
                   1379:        AR5K_REG_WRITE(_reg, AR5K_REG_READ(_reg) &~ (_flags))
                   1380:
                   1381: #define AR5K_PHY_WRITE(_reg, _val)                                     \
                   1382:        AR5K_REG_WRITE(hal->ah_phy + ((_reg) << 2), _val)
                   1383: #define AR5K_PHY_READ(_reg)                                            \
                   1384:        AR5K_REG_READ(hal->ah_phy + ((_reg) << 2))
                   1385:
                   1386: #define AR5K_REG_WAIT(_i)                                              \
                   1387:        if (_i % 64)                                                    \
                   1388:                AR5K_DELAY(1);
                   1389:
                   1390: #define AR5K_EEPROM_READ(_o, _v)       {                               \
                   1391:        if ((ret = hal->ah_eeprom_read(hal, (_o),                       \
                   1392:                 &(_v))) != 0)                                          \
                   1393:                return (ret);                                           \
                   1394: }
                   1395: #define AR5K_EEPROM_READ_HDR(_o, _v)                                   \
                   1396:        AR5K_EEPROM_READ(_o, hal->ah_capabilities.cap_eeprom._v);       \
                   1397:
                   1398: /* Read status of selected queue */
                   1399: #define AR5K_REG_READ_Q(_reg, _queue)                                  \
                   1400:        (AR5K_REG_READ(_reg) & (1 << _queue))                           \
                   1401:
                   1402: #define AR5K_REG_WRITE_Q(_reg, _queue)                                 \
                   1403:        AR5K_REG_WRITE(_reg, (1 << _queue))
                   1404:
                   1405: #define AR5K_Q_ENABLE_BITS(_reg, _queue) do {                          \
                   1406:        _reg |= 1 << _queue;                                            \
                   1407: } while (0)
                   1408:
                   1409: #define AR5K_Q_DISABLE_BITS(_reg, _queue) do {                         \
                   1410:        _reg &= ~(1 << _queue);                                         \
                   1411: } while (0)
                   1412:
                   1413: #define AR5K_LOW_ID(_a)                (                                       \
                   1414:        (_a)[0] | (_a)[1] << 8 | (_a)[2] << 16 | (_a)[3] << 24          \
                   1415: )
                   1416: #define AR5K_HIGH_ID(_a)       ((_a)[4] | (_a)[5] << 8)
                   1417:
                   1418: /*
                   1419:  * Unaligned little endian access
                   1420:  */
                   1421:
                   1422: #define AR5K_LE_READ_2(_p)                                             \
                   1423:        (((const u_int8_t *)(_p))[0] | (((const u_int8_t *)(_p))[1] << 8))
                   1424: #define AR5K_LE_READ_4(_p) \
                   1425:        (((const u_int8_t *)(_p))[0] |                                  \
                   1426:        (((const u_int8_t *)(_p))[1] << 8) |                            \
                   1427:        (((const u_int8_t *)(_p))[2] << 16) |                           \
                   1428:        (((const u_int8_t *)(_p))[3] << 24))
                   1429: #define AR5K_LE_WRITE_2(_p, _val) \
                   1430:        ((((u_int8_t *)(_p))[0] = ((u_int32_t)(_val) & 0xff)),          \
                   1431:        (((u_int8_t *)(_p))[1] = (((u_int32_t)(_val) >> 8) & 0xff)))
                   1432: #define AR5K_LE_WRITE_4(_p, _val)                                      \
                   1433:        ((((u_int8_t *)(_p))[0] = ((u_int32_t)(_val) & 0xff)),          \
                   1434:        (((u_int8_t *)(_p))[1] = (((u_int32_t)(_val) >> 8) & 0xff)),    \
                   1435:        (((u_int8_t *)(_p))[2] = (((u_int32_t)(_val) >> 16) & 0xff)),   \
                   1436:        (((u_int8_t *)(_p))[3] = (((u_int32_t)(_val) >> 24) & 0xff)))
                   1437:
                   1438: /*
                   1439:  * Initial register values
                   1440:  */
                   1441:
                   1442: struct ar5k_ini {
                   1443:        u_int16_t       ini_register;
                   1444:        u_int32_t       ini_value;
                   1445:
                   1446:        enum {
                   1447:                AR5K_INI_WRITE = 0,
                   1448:                AR5K_INI_READ = 1,
                   1449:        } ini_mode;
                   1450: };
                   1451:
                   1452: #define AR5K_INI_VAL_11A       0
                   1453: #define AR5K_INI_VAL_11A_TURBO 1
                   1454: #define AR5K_INI_VAL_11B       2
                   1455: #define AR5K_INI_VAL_11G       3
                   1456: #define AR5K_INI_VAL_11G_TURBO 4
                   1457: #define AR5K_INI_VAL_XR                0
                   1458: #define AR5K_INI_VAL_MAX       5
                   1459:
                   1460: #define AR5K_INI_PHY_5111      0
                   1461: #define AR5K_INI_PHY_5112      1
                   1462: #define AR5K_INI_PHY_511X      1
                   1463:
                   1464: #define AR5K_AR5111_INI_RF_MAX_BANKS    AR5K_MAX_RF_BANKS
                   1465: #define AR5K_AR5112_INI_RF_MAX_BANKS   AR5K_MAX_RF_BANKS
                   1466:
                   1467: struct ar5k_ini_rf {
                   1468:        u_int8_t        rf_bank;
                   1469:        u_int16_t       rf_register;
                   1470:        u_int32_t       rf_value[5];
                   1471: };
                   1472:
                   1473: #define AR5K_AR5111_INI_RF     {                                               \
                   1474:        { 0, 0x989c,                                                            \
                   1475:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1476:        { 0, 0x989c,                                                            \
                   1477:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1478:        { 0, 0x989c,                                                            \
                   1479:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1480:        { 0, 0x989c,                                                            \
                   1481:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1482:        { 0, 0x989c,                                                            \
                   1483:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1484:        { 0, 0x989c,                                                            \
                   1485:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1486:        { 0, 0x989c,                                                            \
                   1487:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1488:        { 0, 0x989c,                                                            \
                   1489:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1490:        { 0, 0x989c,                                                            \
                   1491:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1492:        { 0, 0x989c,                                                            \
                   1493:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1494:        { 0, 0x989c,                                                            \
                   1495:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1496:        { 0, 0x989c,                                                            \
                   1497:            { 0x00380000, 0x00380000, 0x00380000, 0x00380000, 0x00380000 } },   \
                   1498:        { 0, 0x989c,                                                            \
                   1499:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1500:        { 0, 0x989c,                                                            \
                   1501:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1502:        { 0, 0x989c,                                                            \
                   1503:            { 0x00000000, 0x00000000, 0x000000c0, 0x00000080, 0x00000080 } },   \
                   1504:        { 0, 0x989c,                                                            \
                   1505:            { 0x000400f9, 0x000400f9, 0x000400ff, 0x000400fd, 0x000400fd } },   \
                   1506:        { 0, 0x98d4,                                                            \
                   1507:            { 0x00000000, 0x00000000, 0x00000004, 0x00000004, 0x00000004 } },   \
                   1508:        { 1, 0x98d4,                                                            \
                   1509:            { 0x00000020, 0x00000020, 0x00000020, 0x00000020, 0x00000020 } },   \
                   1510:        { 2, 0x98d4,                                                            \
                   1511:            { 0x00000010, 0x00000014, 0x00000010, 0x00000010, 0x00000014 } },   \
                   1512:        { 3, 0x98d8,                                                            \
                   1513:            { 0x00601068, 0x00601068, 0x00601068, 0x00601068, 0x00601068 } },   \
                   1514:        { 6, 0x989c,                                                            \
                   1515:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1516:        { 6, 0x989c,                                                            \
                   1517:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1518:        { 6, 0x989c,                                                            \
                   1519:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1520:        { 6, 0x989c,                                                            \
                   1521:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1522:        { 6, 0x989c,                                                            \
                   1523:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1524:        { 6, 0x989c,                                                            \
                   1525:            { 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000 } },   \
                   1526:        { 6, 0x989c,                                                            \
                   1527:            { 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000 } },   \
                   1528:        { 6, 0x989c,                                                            \
                   1529:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1530:        { 6, 0x989c,                                                            \
                   1531:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1532:        { 6, 0x989c,                                                            \
                   1533:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1534:        { 6, 0x989c,                                                            \
                   1535:            { 0x00000000, 0x00000000, 0x0a000000, 0x00000000, 0x00000000 } },   \
                   1536:        { 6, 0x989c,                                                            \
                   1537:            { 0x003800c0, 0x00380080, 0x023800c0, 0x003800c0, 0x003800c0 } },   \
                   1538:        { 6, 0x989c,                                                            \
                   1539:            { 0x00020006, 0x00020006, 0x00000006, 0x00020006, 0x00020006 } },   \
                   1540:        { 6, 0x989c,                                                            \
                   1541:            { 0x00000089, 0x00000089, 0x00000089, 0x00000089, 0x00000089 } },   \
                   1542:        { 6, 0x989c,                                                            \
                   1543:            { 0x000000a0, 0x000000a0, 0x000000a0, 0x000000a0, 0x000000a0 } },   \
                   1544:        { 6, 0x989c,                                                            \
                   1545:            { 0x00040007, 0x00040007, 0x00040007, 0x00040007, 0x00040007 } },   \
                   1546:        { 6, 0x98d4,                                                            \
                   1547:            { 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a } },   \
                   1548:        { 7, 0x989c,                                                            \
                   1549:            { 0x00000040, 0x00000048, 0x00000040, 0x00000040, 0x00000040 } },   \
                   1550:        { 7, 0x989c,                                                            \
                   1551:            { 0x00000010, 0x00000010, 0x00000010, 0x00000010, 0x00000010 } },   \
                   1552:        { 7, 0x989c,                                                            \
                   1553:            { 0x00000008, 0x00000008, 0x00000008, 0x00000008, 0x00000008 } },   \
                   1554:        { 7, 0x989c,                                                            \
                   1555:            { 0x0000004f, 0x0000004f, 0x0000004f, 0x0000004f, 0x0000004f } },   \
                   1556:        { 7, 0x989c,                                                            \
                   1557:            { 0x000000f1, 0x000000f1, 0x00000061, 0x000000f1, 0x000000f1 } },   \
                   1558:        { 7, 0x989c,                                                            \
                   1559:            { 0x0000904f, 0x0000904f, 0x0000904c, 0x0000904f, 0x0000904f } },   \
                   1560:        { 7, 0x989c,                                                            \
                   1561:            { 0x0000125a, 0x0000125a, 0x0000129a, 0x0000125a, 0x0000125a } },   \
                   1562:        { 7, 0x98cc,                                                            \
                   1563:            { 0x0000000e, 0x0000000e, 0x0000000f, 0x0000000e, 0x0000000e } },   \
                   1564: }
                   1565:
                   1566: #define AR5K_AR5112_INI_RF     {                                               \
                   1567:        { 1, 0x98d4,                                                            \
                   1568:            { 0x00000020, 0x00000020, 0x00000020, 0x00000020, 0x00000020 } },   \
                   1569:        { 2, 0x98d0,                                                            \
                   1570:            { 0x03060408, 0x03070408, 0x03060408, 0x03060408, 0x03070408 } },   \
                   1571:        { 3, 0x98dc,                                                            \
                   1572:            { 0x00a0c0c0, 0x00a0c0c0, 0x00e0c0c0, 0x00e0c0c0, 0x00e0c0c0 } },   \
                   1573:        { 6, 0x989c,                                                            \
                   1574:            { 0x00a00000, 0x00a00000, 0x00a00000, 0x00a00000, 0x00a00000 } },   \
                   1575:        { 6, 0x989c,                                                            \
                   1576:            { 0x000a0000, 0x000a0000, 0x000a0000, 0x000a0000, 0x000a0000 } },   \
                   1577:        { 6, 0x989c,                                                            \
                   1578:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1579:        { 6, 0x989c,                                                            \
                   1580:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1581:        { 6, 0x989c,                                                            \
                   1582:            { 0x00660000, 0x00660000, 0x00660000, 0x00660000, 0x00660000 } },   \
                   1583:        { 6, 0x989c,                                                            \
                   1584:            { 0x00db0000, 0x00db0000, 0x00db0000, 0x00db0000, 0x00db0000 } },   \
                   1585:        { 6, 0x989c,                                                            \
                   1586:            { 0x00f10000, 0x00f10000, 0x00f10000, 0x00f10000, 0x00f10000 } },   \
                   1587:        { 6, 0x989c,                                                            \
                   1588:            { 0x00120000, 0x00120000, 0x00120000, 0x00120000, 0x00120000 } },   \
                   1589:        { 6, 0x989c,                                                            \
                   1590:            { 0x00120000, 0x00120000, 0x00120000, 0x00120000, 0x00120000 } },   \
                   1591:        { 6, 0x989c,                                                            \
                   1592:            { 0x00730000, 0x00730000, 0x00730000, 0x00730000, 0x00730000 } },   \
                   1593:        { 6, 0x989c,                                                            \
                   1594:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1595:        { 6, 0x989c,                                                            \
                   1596:            { 0x000c0000, 0x000c0000, 0x000c0000, 0x000c0000, 0x000c0000 } },   \
                   1597:        { 6, 0x989c,                                                            \
                   1598:            { 0x00ff0000, 0x00ff0000, 0x00ff0000, 0x00ff0000, 0x00ff0000 } },   \
                   1599:        { 6, 0x989c,                                                            \
                   1600:            { 0x00ff0000, 0x00ff0000, 0x00ff0000, 0x00ff0000, 0x00ff0000 } },   \
                   1601:        { 6, 0x989c,                                                            \
                   1602:            { 0x008b0000, 0x008b0000, 0x008b0000, 0x008b0000, 0x008b0000 } },   \
                   1603:        { 6, 0x989c,                                                            \
                   1604:            { 0x00600000, 0x00600000, 0x00600000, 0x00600000, 0x00600000 } },   \
                   1605:        { 6, 0x989c,                                                            \
                   1606:            { 0x000c0000, 0x000c0000, 0x000c0000, 0x000c0000, 0x000c0000 } },   \
                   1607:        { 6, 0x989c,                                                            \
                   1608:            { 0x00840000, 0x00840000, 0x00840000, 0x00840000, 0x00840000 } },   \
                   1609:        { 6, 0x989c,                                                            \
                   1610:            { 0x00640000, 0x00640000, 0x00640000, 0x00640000, 0x00640000 } },   \
                   1611:        { 6, 0x989c,                                                            \
                   1612:            { 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200000 } },   \
                   1613:        { 6, 0x989c,                                                            \
                   1614:            { 0x00240000, 0x00240000, 0x00240000, 0x00240000, 0x00240000 } },   \
                   1615:        { 6, 0x989c,                                                            \
                   1616:            { 0x00250000, 0x00250000, 0x00250000, 0x00250000, 0x00250000 } },   \
                   1617:        { 6, 0x989c,                                                            \
                   1618:            { 0x00110000, 0x00110000, 0x00110000, 0x00110000, 0x00110000 } },   \
                   1619:        { 6, 0x989c,                                                            \
                   1620:            { 0x00110000, 0x00110000, 0x00110000, 0x00110000, 0x00110000 } },   \
                   1621:        { 6, 0x989c,                                                            \
                   1622:            { 0x00510000, 0x00510000, 0x00510000, 0x00510000, 0x00510000 } },   \
                   1623:        { 6, 0x989c,                                                            \
                   1624:            { 0x1c040000, 0x1c040000, 0x1c040000, 0x1c040000, 0x1c040000 } },   \
                   1625:        { 6, 0x989c,                                                            \
                   1626:            { 0x000a0000, 0x000a0000, 0x000a0000, 0x000a0000, 0x000a0000 } },   \
                   1627:        { 6, 0x989c,                                                            \
                   1628:            { 0x00a10000, 0x00a10000, 0x00a10000, 0x00a10000, 0x00a10000 } },   \
                   1629:        { 6, 0x989c,                                                            \
                   1630:            { 0x00400000, 0x00400000, 0x00400000, 0x00400000, 0x00400000 } },   \
                   1631:        { 6, 0x989c,                                                            \
                   1632:            { 0x03090000, 0x03090000, 0x03090000, 0x03090000, 0x03090000 } },   \
                   1633:        { 6, 0x989c,                                                            \
                   1634:            { 0x06000000, 0x06000000, 0x06000000, 0x06000000, 0x06000000 } },   \
                   1635:        { 6, 0x989c,                                                            \
                   1636:            { 0x000000b0, 0x000000b0, 0x000000a8, 0x000000a8, 0x000000a8 } },   \
                   1637:        { 6, 0x989c,                                                            \
                   1638:            { 0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e } },   \
                   1639:        { 6, 0x989c,                                                            \
                   1640:            { 0x006c4a41, 0x006c4a41, 0x006c4af1, 0x006c4a61, 0x006c4a61 } },   \
                   1641:        { 6, 0x989c,                                                            \
                   1642:            { 0x0050892a, 0x0050892a, 0x0050892b, 0x0050892b, 0x0050892b } },   \
                   1643:        { 6, 0x989c,                                                            \
                   1644:            { 0x00842400, 0x00842400, 0x00842400, 0x00842400, 0x00842400 } },   \
                   1645:        { 6, 0x989c,                                                            \
                   1646:            { 0x00c69200, 0x00c69200, 0x00c69200, 0x00c69200, 0x00c69200 } },   \
                   1647:        { 6, 0x98d0,                                                            \
                   1648:            { 0x0002000c, 0x0002000c, 0x0002000c, 0x0002000c, 0x0002000c } },   \
                   1649:        { 7, 0x989c,                                                            \
                   1650:            { 0x00000094, 0x00000094, 0x00000094, 0x00000094, 0x00000094 } },   \
                   1651:        { 7, 0x989c,                                                            \
                   1652:            { 0x00000091, 0x00000091, 0x00000091, 0x00000091, 0x00000091 } },   \
                   1653:        { 7, 0x989c,                                                            \
                   1654:            { 0x0000000a, 0x0000000a, 0x00000012, 0x00000012, 0x00000012 } },   \
                   1655:        { 7, 0x989c,                                                            \
                   1656:            { 0x00000080, 0x00000080, 0x00000080, 0x00000080, 0x00000080 } },   \
                   1657:        { 7, 0x989c,                                                            \
                   1658:            { 0x000000c1, 0x000000c1, 0x000000c1, 0x000000c1, 0x000000c1 } },   \
                   1659:        { 7, 0x989c,                                                            \
                   1660:            { 0x00000060, 0x00000060, 0x00000060, 0x00000060, 0x00000060 } },   \
                   1661:        { 7, 0x989c,                                                            \
                   1662:            { 0x000000f0, 0x000000f0, 0x000000f0, 0x000000f0, 0x000000f0 } },   \
                   1663:        { 7, 0x989c,                                                            \
                   1664:            { 0x00000022, 0x00000022, 0x00000022, 0x00000022, 0x00000022 } },   \
                   1665:        { 7, 0x989c,                                                            \
                   1666:            { 0x00000092, 0x00000092, 0x00000092, 0x00000092, 0x00000092 } },   \
                   1667:        { 7, 0x989c,                                                            \
                   1668:            { 0x000000d4, 0x000000d4, 0x000000d4, 0x000000d4, 0x000000d4 } },   \
                   1669:        { 7, 0x989c,                                                            \
                   1670:            { 0x000014cc, 0x000014cc, 0x000014cc, 0x000014cc, 0x000014cc } },   \
                   1671:        { 7, 0x989c,                                                            \
                   1672:            { 0x0000048c, 0x0000048c, 0x0000048c, 0x0000048c, 0x0000048c } },   \
                   1673:        { 7, 0x98c4,                                                            \
                   1674:            { 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003 } },   \
                   1675: }
                   1676:
                   1677: #define AR5K_AR5112A_INI_RF    {                                               \
                   1678:        { 1, 0x98d4,                                                            \
                   1679:            { 0x00000020, 0x00000020, 0x00000020, 0x00000020, 0x00000020 } },   \
                   1680:        { 2, 0x98d0,                                                            \
                   1681:            { 0x03060408, 0x03070408, 0x03060408, 0x03060408, 0x03070408 } },   \
                   1682:        { 3, 0x98dc,                                                            \
                   1683:            { 0x00a0c0c0, 0x00a0c0c0, 0x00e0c0c0, 0x00e0c0c0, 0x00e0c0c0 } },   \
                   1684:        { 6, 0x989c,                                                            \
                   1685:            { 0x0f000000, 0x0f000000, 0x0f000000, 0x0f000000, 0x0f000000 } },   \
                   1686:        { 6, 0x989c,                                                            \
                   1687:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1688:        { 6, 0x989c,                                                            \
                   1689:            { 0x00800000, 0x00800000, 0x00800000, 0x00800000, 0x00800000 } },   \
                   1690:        { 6, 0x989c,                                                            \
                   1691:            { 0x002a0000, 0x002a0000, 0x002a0000, 0x002a0000, 0x002a0000 } },   \
                   1692:        { 6, 0x989c,                                                            \
                   1693:            { 0x00010000, 0x00010000, 0x00010000, 0x00010000, 0x00010000 } },   \
                   1694:        { 6, 0x989c,                                                            \
                   1695:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1696:        { 6, 0x989c,                                                            \
                   1697:            { 0x00180000, 0x00180000, 0x00180000, 0x00180000, 0x00180000 } },   \
                   1698:        { 6, 0x989c,                                                            \
                   1699:            { 0x00600000, 0x00600000, 0x006e0000, 0x006e0000, 0x006e0000 } },   \
                   1700:        { 6, 0x989c,                                                            \
                   1701:            { 0x00c70000, 0x00c70000, 0x00c70000, 0x00c70000, 0x00c70000 } },   \
                   1702:        { 6, 0x989c,                                                            \
                   1703:            { 0x004b0000, 0x004b0000, 0x004b0000, 0x004b0000, 0x004b0000 } },   \
                   1704:        { 6, 0x989c,                                                            \
                   1705:            { 0x04480000, 0x04480000, 0x04480000, 0x04480000, 0x04480000 } },   \
                   1706:        { 6, 0x989c,                                                            \
                   1707:            { 0x00220000, 0x00220000, 0x00220000, 0x00220000, 0x00220000 } },   \
                   1708:        { 6, 0x989c,                                                            \
                   1709:            { 0x00e40000, 0x00e40000, 0x00e40000, 0x00e40000, 0x00e40000 } },   \
                   1710:        { 6, 0x989c,                                                            \
                   1711:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1712:        { 6, 0x989c,                                                            \
                   1713:            { 0x00fc0000, 0x00fc0000, 0x00fc0000, 0x00fc0000, 0x00fc0000 } },   \
                   1714:        { 6, 0x989c,                                                            \
                   1715:            { 0x00ff0000, 0x00ff0000, 0x00ff0000, 0x00ff0000, 0x00ff0000 } },   \
                   1716:        { 6, 0x989c,                                                            \
                   1717:            { 0x043f0000, 0x043f0000, 0x043f0000, 0x043f0000, 0x043f0000 } },   \
                   1718:        { 6, 0x989c,                                                            \
                   1719:            { 0x000c0000, 0x000c0000, 0x000c0000, 0x000c0000, 0x000c0000 } },   \
                   1720:        { 6, 0x989c,                                                            \
                   1721:            { 0x00190000, 0x00190000, 0x00190000, 0x00190000, 0x00190000 } },   \
                   1722:        { 6, 0x989c,                                                            \
                   1723:            { 0x00240000, 0x00240000, 0x00240000, 0x00240000, 0x00240000 } },   \
                   1724:        { 6, 0x989c,                                                            \
                   1725:            { 0x00b40000, 0x00b40000, 0x00b40000, 0x00b40000, 0x00b40000 } },   \
                   1726:        { 6, 0x989c,                                                            \
                   1727:            { 0x00990000, 0x00990000, 0x00990000, 0x00990000, 0x00990000 } },   \
                   1728:        { 6, 0x989c,                                                            \
                   1729:            { 0x00500000, 0x00500000, 0x00500000, 0x00500000, 0x00500000 } },   \
                   1730:        { 6, 0x989c,                                                            \
                   1731:            { 0x002a0000, 0x002a0000, 0x002a0000, 0x002a0000, 0x002a0000 } },   \
                   1732:        { 6, 0x989c,                                                            \
                   1733:            { 0x00120000, 0x00120000, 0x00120000, 0x00120000, 0x00120000 } },   \
                   1734:        { 6, 0x989c,                                                            \
                   1735:            { 0xc0320000, 0xc0320000, 0xc0320000, 0xc0320000, 0xc0320000 } },   \
                   1736:        { 6, 0x989c,                                                            \
                   1737:            { 0x01740000, 0x01740000, 0x01740000, 0x01740000, 0x01740000 } },   \
                   1738:        { 6, 0x989c,                                                            \
                   1739:            { 0x00110000, 0x00110000, 0x00110000, 0x00110000, 0x00110000 } },   \
                   1740:        { 6, 0x989c,                                                            \
                   1741:            { 0x86280000, 0x86280000, 0x86280000, 0x86280000, 0x86280000 } },   \
                   1742:        { 6, 0x989c,                                                            \
                   1743:            { 0x31840000, 0x31840000, 0x31840000, 0x31840000, 0x31840000 } },   \
                   1744:        { 6, 0x989c,                                                            \
                   1745:            { 0x00020080, 0x00020080, 0x00020080, 0x00020080, 0x00020080 } },   \
                   1746:        { 6, 0x989c,                                                            \
                   1747:            { 0x00080009, 0x00080009, 0x00080009, 0x00080009, 0x00080009 } },   \
                   1748:        { 6, 0x989c,                                                            \
                   1749:            { 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003 } },   \
                   1750:        { 6, 0x989c,                                                            \
                   1751:            { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   \
                   1752:        { 6, 0x989c,                                                            \
                   1753:            { 0x000000b2, 0x000000b2, 0x000000b2, 0x000000b2, 0x000000b2 } },   \
                   1754:        { 6, 0x989c,                                                            \
                   1755:            { 0x00b02084, 0x00b02084, 0x00b02084, 0x00b02084, 0x00b02084 } },   \
                   1756:        { 6, 0x989c,                                                            \
                   1757:            { 0x004125a4, 0x004125a4, 0x004125a4, 0x004125a4, 0x004125a4 } },   \
                   1758:        { 6, 0x989c,                                                            \
                   1759:            { 0x00119220, 0x00119220, 0x00119220, 0x00119220, 0x00119220 } },   \
                   1760:        { 6, 0x989c,                                                            \
                   1761:            { 0x001a4800, 0x001a4800, 0x001a4800, 0x001a4800, 0x001a4800 } },   \
                   1762:        { 6, 0x98d8,                                                            \
                   1763:            { 0x000b0230, 0x000b0230, 0x000b0230, 0x000b0230, 0x000b0230 } },   \
                   1764:        { 7, 0x989c,                                                            \
                   1765:            { 0x00000094, 0x00000094, 0x00000094, 0x00000094, 0x00000094 } },   \
                   1766:        { 7, 0x989c,                                                            \
                   1767:            { 0x00000091, 0x00000091, 0x00000091, 0x00000091, 0x00000091 } },   \
                   1768:        { 7, 0x989c,                                                            \
                   1769:            { 0x00000012, 0x00000012, 0x00000012, 0x00000012, 0x00000012 } },   \
                   1770:        { 7, 0x989c,                                                            \
                   1771:            { 0x00000080, 0x00000080, 0x00000080, 0x00000080, 0x00000080 } },   \
                   1772:        { 7, 0x989c,                                                            \
                   1773:            { 0x000000d9, 0x000000d9, 0x000000d9, 0x000000d9, 0x000000d9 } },   \
                   1774:        { 7, 0x989c,                                                            \
                   1775:            { 0x00000060, 0x00000060, 0x00000060, 0x00000060, 0x00000060 } },   \
                   1776:        { 7, 0x989c,                                                            \
                   1777:            { 0x000000f0, 0x000000f0, 0x000000f0, 0x000000f0, 0x000000f0 } },   \
                   1778:        { 7, 0x989c,                                                            \
                   1779:            { 0x000000a2, 0x000000a2, 0x000000a2, 0x000000a2, 0x000000a2 } },   \
                   1780:        { 7, 0x989c,                                                            \
                   1781:            { 0x00000052, 0x00000052, 0x00000052, 0x00000052, 0x00000052 } },   \
                   1782:        { 7, 0x989c,                                                            \
                   1783:            { 0x000000d4, 0x000000d4, 0x000000d4, 0x000000d4, 0x000000d4 } },   \
                   1784:        { 7, 0x989c,                                                            \
                   1785:            { 0x000014cc, 0x000014cc, 0x000014cc, 0x000014cc, 0x000014cc } },   \
                   1786:        { 7, 0x989c,                                                            \
                   1787:            { 0x0000048c, 0x0000048c, 0x0000048c, 0x0000048c, 0x0000048c } },   \
                   1788:        { 7, 0x98c4,                                                            \
                   1789:            { 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003 } },   \
                   1790: }
                   1791:
                   1792: struct ar5k_ini_rfgain {
                   1793:        u_int16_t       rfg_register;
                   1794:        u_int32_t       rfg_value[2][2];
                   1795:
                   1796: #define AR5K_INI_RFGAIN_5GHZ   0
                   1797: #define AR5K_INI_RFGAIN_2GHZ   1
                   1798: };
                   1799:
                   1800: #define AR5K_INI_RFGAIN        {                                                       \
                   1801:        { 0x9a00, {                                                             \
                   1802:                { 0x000001a9, 0x00000000 }, { 0x00000007, 0x00000007 } } },     \
                   1803:        { 0x9a04, {                                                             \
                   1804:                { 0x000001e9, 0x00000040 }, { 0x00000047, 0x00000047 } } },     \
                   1805:        { 0x9a08, {                                                             \
                   1806:                { 0x00000029, 0x00000080 }, { 0x00000087, 0x00000087 } } },     \
                   1807:        { 0x9a0c, {                                                             \
                   1808:                { 0x00000069, 0x00000150 }, { 0x000001a0, 0x000001a0 } } },     \
                   1809:        { 0x9a10, {                                                             \
                   1810:                { 0x00000199, 0x00000190 }, { 0x000001e0, 0x000001e0 } } },     \
                   1811:        { 0x9a14, {                                                             \
                   1812:                { 0x000001d9, 0x000001d0 }, { 0x00000020, 0x00000020 } } },     \
                   1813:        { 0x9a18, {                                                             \
                   1814:                { 0x00000019, 0x00000010 }, { 0x00000060, 0x00000060 } } },     \
                   1815:        { 0x9a1c, {                                                             \
                   1816:                { 0x00000059, 0x00000044 }, { 0x000001a1, 0x000001a1 } } },     \
                   1817:        { 0x9a20, {                                                             \
                   1818:                { 0x00000099, 0x00000084 }, { 0x000001e1, 0x000001e1 } } },     \
                   1819:        { 0x9a24, {                                                             \
                   1820:                { 0x000001a5, 0x00000148 }, { 0x00000021, 0x00000021 } } },     \
                   1821:        { 0x9a28, {                                                             \
                   1822:                { 0x000001e5, 0x00000188 }, { 0x00000061, 0x00000061 } } },     \
                   1823:        { 0x9a2c, {                                                             \
                   1824:                { 0x00000025, 0x000001c8 }, { 0x00000162, 0x00000162 } } },     \
                   1825:        { 0x9a30, {                                                             \
                   1826:                { 0x000001c8, 0x00000014 }, { 0x000001a2, 0x000001a2 } } },     \
                   1827:        { 0x9a34, {                                                             \
                   1828:                { 0x00000008, 0x00000042 }, { 0x000001e2, 0x000001e2 } } },     \
                   1829:        { 0x9a38, {                                                             \
                   1830:                { 0x00000048, 0x00000082 }, { 0x00000022, 0x00000022 } } },     \
                   1831:        { 0x9a3c, {                                                             \
                   1832:                { 0x00000088, 0x00000178 }, { 0x00000062, 0x00000062 } } },     \
                   1833:        { 0x9a40, {                                                             \
                   1834:                { 0x00000198, 0x000001b8 }, { 0x00000163, 0x00000163 } } },     \
                   1835:        { 0x9a44, {                                                             \
                   1836:                { 0x000001d8, 0x000001f8 }, { 0x000001a3, 0x000001a3 } } },     \
                   1837:        { 0x9a48, {                                                             \
                   1838:                { 0x00000018, 0x00000012 }, { 0x000001e3, 0x000001e3 } } },     \
                   1839:        { 0x9a4c, {                                                             \
                   1840:                { 0x00000058, 0x00000052 }, { 0x00000023, 0x00000023 } } },     \
                   1841:        { 0x9a50, {                                                             \
                   1842:                { 0x00000098, 0x00000092 }, { 0x00000063, 0x00000063 } } },     \
                   1843:        { 0x9a54, {                                                             \
                   1844:                { 0x000001a4, 0x0000017c }, { 0x00000184, 0x00000184 } } },     \
                   1845:        { 0x9a58, {                                                             \
                   1846:                { 0x000001e4, 0x000001bc }, { 0x000001c4, 0x000001c4 } } },     \
                   1847:        { 0x9a5c, {                                                             \
                   1848:                { 0x00000024, 0x000001fc }, { 0x00000004, 0x00000004 } } },     \
                   1849:        { 0x9a60, {                                                             \
                   1850:                { 0x00000064, 0x0000000a }, { 0x000001ea, 0x0000000b } } },     \
                   1851:        { 0x9a64, {                                                             \
                   1852:                { 0x000000a4, 0x0000004a }, { 0x0000002a, 0x0000004b } } },     \
                   1853:        { 0x9a68, {                                                             \
                   1854:                { 0x000000e4, 0x0000008a }, { 0x0000006a, 0x0000008b } } },     \
                   1855:        { 0x9a6c, {                                                             \
                   1856:                { 0x0000010a, 0x0000015a }, { 0x000000aa, 0x000001ac } } },     \
                   1857:        { 0x9a70, {                                                             \
                   1858:                { 0x0000014a, 0x0000019a }, { 0x000001ab, 0x000001ec } } },     \
                   1859:        { 0x9a74, {                                                             \
                   1860:                { 0x0000018a, 0x000001da }, { 0x000001eb, 0x0000002c } } },     \
                   1861:        { 0x9a78, {                                                             \
                   1862:                { 0x000001ca, 0x0000000e }, { 0x0000002b, 0x00000012 } } },     \
                   1863:        { 0x9a7c, {                                                             \
                   1864:                { 0x0000000a, 0x0000004e }, { 0x0000006b, 0x00000052 } } },     \
                   1865:        { 0x9a80, {                                                             \
                   1866:                { 0x0000004a, 0x0000008e }, { 0x000000ab, 0x00000092 } } },     \
                   1867:        { 0x9a84, {                                                             \
                   1868:                { 0x0000008a, 0x0000015e }, { 0x000001ac, 0x00000193 } } },     \
                   1869:        { 0x9a88, {                                                             \
                   1870:                { 0x000001ba, 0x0000019e }, { 0x000001ec, 0x000001d3 } } },     \
                   1871:        { 0x9a8c, {                                                             \
                   1872:                { 0x000001fa, 0x000001de }, { 0x0000002c, 0x00000013 } } },     \
                   1873:        { 0x9a90, {                                                             \
                   1874:                { 0x0000003a, 0x00000009 }, { 0x0000003a, 0x00000053 } } },     \
                   1875:        { 0x9a94, {                                                             \
                   1876:                { 0x0000007a, 0x00000049 }, { 0x0000007a, 0x00000093 } } },     \
                   1877:        { 0x9a98, {                                                             \
                   1878:                { 0x00000186, 0x00000089 }, { 0x000000ba, 0x00000194 } } },     \
                   1879:        { 0x9a9c, {                                                             \
                   1880:                { 0x000001c6, 0x00000179 }, { 0x000001bb, 0x000001d4 } } },     \
                   1881:        { 0x9aa0, {                                                             \
                   1882:                { 0x00000006, 0x000001b9 }, { 0x000001fb, 0x00000014 } } },     \
                   1883:        { 0x9aa4, {                                                             \
                   1884:                { 0x00000046, 0x000001f9 }, { 0x0000003b, 0x0000003a } } },     \
                   1885:        { 0x9aa8, {                                                             \
                   1886:                { 0x00000086, 0x00000039 }, { 0x0000007b, 0x0000007a } } },     \
                   1887:        { 0x9aac, {                                                             \
                   1888:                { 0x000000c6, 0x00000079 }, { 0x000000bb, 0x000000ba } } },     \
                   1889:        { 0x9ab0, {                                                             \
                   1890:                { 0x000000c6, 0x000000b9 }, { 0x000001bc, 0x000001bb } } },     \
                   1891:        { 0x9ab4, {                                                             \
                   1892:                { 0x000000c6, 0x000001bd }, { 0x000001fc, 0x000001fb } } },     \
                   1893:        { 0x9ab8, {                                                             \
                   1894:                { 0x000000c6, 0x000001fd }, { 0x0000003c, 0x0000003b } } },     \
                   1895:        { 0x9abc, {                                                             \
                   1896:                { 0x000000c6, 0x0000003d }, { 0x0000007c, 0x0000007b } } },     \
                   1897:        { 0x9ac0, {                                                             \
                   1898:                { 0x000000c6, 0x0000007d }, { 0x000000bc, 0x000000bb } } },     \
                   1899:        { 0x9ac4, {                                                             \
                   1900:                { 0x000000c6, 0x000000bd }, { 0x000000fc, 0x000001bc } } },     \
                   1901:        { 0x9ac8, {                                                             \
                   1902:                { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x000001fc } } },     \
                   1903:        { 0x9acc, {                                                             \
                   1904:                { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x0000003c } } },     \
                   1905:        { 0x9ad0, {                                                             \
                   1906:                { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x0000007c } } },     \
                   1907:        { 0x9ad4, {                                                             \
                   1908:                { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x000000bc } } },     \
                   1909:        { 0x9ad8, {                                                             \
                   1910:                { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x000000fc } } },     \
                   1911:        { 0x9adc, {                                                             \
                   1912:                { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x000000fc } } },     \
                   1913:        { 0x9ae0, {                                                             \
                   1914:                { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x000000fc } } },     \
                   1915:        { 0x9ae4, {                                                             \
                   1916:                { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x000000fc } } },     \
                   1917:        { 0x9ae8, {                                                             \
                   1918:                { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x000000fc } } },     \
                   1919:        { 0x9aec, {                                                             \
                   1920:                { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x000000fc } } },     \
                   1921:        { 0x9af0, {                                                             \
                   1922:                { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x000000fc } } },     \
                   1923:        { 0x9af4, {                                                             \
                   1924:                { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x000000fc } } },     \
                   1925:        { 0x9af8, {                                                             \
                   1926:                { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x000000fc } } },     \
                   1927:        { 0x9afc, {                                                             \
                   1928:                { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x000000fc } } },     \
                   1929: }
                   1930:
                   1931: /*
                   1932:  * Prototypes
                   1933:  */
                   1934:
                   1935: __BEGIN_DECLS
                   1936:
                   1937: const char             *ath_hal_probe(u_int16_t, u_int16_t);
                   1938:
                   1939: struct ath_hal         *ath_hal_attach(u_int16_t, void *, bus_space_tag_t,
                   1940:     bus_space_handle_t, u_int, HAL_STATUS *);
                   1941:
                   1942: u_int16_t               ath_hal_computetxtime(struct ath_hal *,
                   1943:     const HAL_RATE_TABLE *, u_int32_t, u_int16_t, HAL_BOOL);
                   1944:
                   1945: HAL_BOOL                ath_hal_init_channels(struct ath_hal *, HAL_CHANNEL *,
                   1946:     u_int, u_int *, u_int16_t, HAL_BOOL, HAL_BOOL);
                   1947:
                   1948: const char             *ar5k_printver(enum ar5k_srev_type, u_int32_t);
                   1949: void                    ar5k_radar_alert(struct ath_hal *);
                   1950: ieee80211_regdomain_t   ar5k_regdomain_to_ieee(u_int16_t);
                   1951: u_int16_t               ar5k_regdomain_from_ieee(ieee80211_regdomain_t);
                   1952: u_int16_t               ar5k_get_regdomain(struct ath_hal *);
                   1953:
                   1954: u_int32_t               ar5k_bitswap(u_int32_t, u_int);
                   1955: u_int                   ar5k_clocktoh(u_int, HAL_BOOL);
                   1956: u_int                   ar5k_htoclock(u_int, HAL_BOOL);
                   1957: void                    ar5k_rt_copy(HAL_RATE_TABLE *, const HAL_RATE_TABLE *);
                   1958:
                   1959: HAL_BOOL                ar5k_register_timeout(struct ath_hal *, u_int32_t,
                   1960:     u_int32_t, u_int32_t, HAL_BOOL);
                   1961:
                   1962: int                     ar5k_eeprom_init(struct ath_hal *);
                   1963: int                     ar5k_eeprom_read_mac(struct ath_hal *, u_int8_t *);
                   1964: HAL_BOOL                ar5k_eeprom_regulation_domain(struct ath_hal *,
                   1965:     HAL_BOOL, ieee80211_regdomain_t *);
                   1966:
                   1967: HAL_BOOL                ar5k_channel(struct ath_hal *, HAL_CHANNEL *);
                   1968: HAL_BOOL                ar5k_rfregs(struct ath_hal *, HAL_CHANNEL *, u_int);
                   1969: u_int32_t               ar5k_rfregs_gainf_corr(struct ath_hal *);
                   1970: HAL_BOOL                ar5k_rfregs_gain_readback(struct ath_hal *);
                   1971: int32_t                         ar5k_rfregs_gain_adjust(struct ath_hal *);
                   1972: HAL_BOOL                ar5k_rfgain(struct ath_hal *, u_int, u_int);
                   1973:
                   1974: void                    ar5k_txpower_table(struct ath_hal *, HAL_CHANNEL *,
                   1975:     int16_t);
                   1976:
                   1977: __END_DECLS
                   1978:
                   1979: #endif /* _AR5K_H */

CVSweb