root/dev/ic/ar5xxx.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. AH_FALSE
  2. AH_TRUE
  3. HAL_BOOL
  4. HAL_MODE_11A
  5. HAL_MODE_TURBO
  6. HAL_MODE_11B
  7. HAL_MODE_PUREG
  8. HAL_MODE_11G
  9. HAL_MODE_108G
  10. HAL_MODE_XR
  11. HAL_MODE_ALL
  12. HAL_MODE
  13. HAL_ANT_VARIABLE
  14. HAL_ANT_FIXED_A
  15. HAL_ANT_FIXED_B
  16. HAL_ANT_MAX
  17. HAL_ANT_SETTING
  18. HAL_M_STA
  19. HAL_M_IBSS
  20. HAL_M_HOSTAP
  21. HAL_M_MONITOR
  22. HAL_OPMODE
  23. HAL_TX_QUEUE_INACTIVE
  24. HAL_TX_QUEUE_DATA
  25. HAL_TX_QUEUE_BEACON
  26. HAL_TX_QUEUE_CAB
  27. HAL_TX_QUEUE_PSPOLL
  28. HAL_TX_QUEUE
  29. HAL_TX_QUEUE_ID_DATA_MIN
  30. HAL_TX_QUEUE_ID_DATA_MAX
  31. HAL_TX_QUEUE_ID_PSPOLL
  32. HAL_TX_QUEUE_ID_BEACON
  33. HAL_TX_QUEUE_ID_CAB
  34. HAL_TX_QUEUE_ID
  35. HAL_WME_AC_BK
  36. HAL_WME_AC_BE
  37. HAL_WME_AC_VI
  38. HAL_WME_AC_VO
  39. HAL_WME_UPSD
  40. HAL_TX_QUEUE_SUBTYPE
  41. HAL_TXQ_INFO
  42. HAL_PKT_TYPE_NORMAL
  43. HAL_PKT_TYPE_ATIM
  44. HAL_PKT_TYPE_PSPOLL
  45. HAL_PKT_TYPE_BEACON
  46. HAL_PKT_TYPE_PROBE_RESP
  47. HAL_PKT_TYPE_PIFS
  48. HAL_PKT_TYPE
  49. HAL_MIB_STATS
  50. HAL_BEACON_STATE
  51. HAL_PM_UNDEFINED
  52. HAL_PM_AUTO
  53. HAL_PM_AWAKE
  54. HAL_PM_FULL_SLEEP
  55. HAL_PM_NETWORK_SLEEP
  56. HAL_POWER_MODE
  57. HAL_CIPHER_WEP
  58. HAL_CIPHER_AES_CCM
  59. HAL_CIPHER_CKIP
  60. HAL_CIPHER
  61. HAL_KEYVAL
  62. HAL_RATE
  63. HAL_RATE_TABLE
  64. HAL_RFGAIN_INACTIVE
  65. HAL_RFGAIN_READ_REQUESTED
  66. HAL_RFGAIN_NEED_CHANGE
  67. HAL_RFGAIN
  68. HAL_CHANNEL
  69. HAL_CHIP_5GHZ
  70. IEEE80211_CHAN_5GHZ
  71. HAL_CHIP_2GHZ
  72. IEEE80211_CHAN_2GHZ
  73. HAL_CHIP
  74. ar5k_capabilities_t
  75. HAL_STATUS

    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 */

/* [<][>][^][v][top][bottom][index][help] */