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