qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] Re: Re: Re: Atheros Wireless Device Emulation


From: Clemens Kolbitsch
Subject: [Qemu-devel] Re: Re: Re: Atheros Wireless Device Emulation
Date: Tue, 18 Mar 2008 09:19:04 +0100
User-agent: KMail/1.9.6 (enterprise 0.20070907.709405)

Patch #9: (final)

These three files are taken from the ath5k reverse engineering project and 
include definitions
used inside the driver/IO code. Again, license and documentation unchanged.

There are many definitions that might not be used, but eliminating those is a 
time consuming
process...


diff -Naur qemu/hw/ath5k.h qemu-altered/hw/ath5k.h
--- qemu/hw/ath5k.h     1970-01-01 01:00:00.000000000 +0100
+++ qemu-altered/hw/ath5k.h     2008-03-01 13:20:07.000000000 +0100
@@ -0,0 +1,887 @@
+/*
+ * Copyright (c) 2004-2007 Reyk Floeter <address@hidden>
+ * Copyright (c) 2006-2007 Nick Kossifidis <address@hidden>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * $Id$
+ */
+
+/*
+ * HAL interface for Atheros Wireless LAN devices.
+ *
+ * ar5k is a free replacement of the binary-only HAL used by some drivers
+ * for Atheros chipsets. While using a different ABI, it tries to be
+ * source-compatible with the original (non-free) HAL interface.
+ *
+ * Many thanks to various contributors who supported the development of
+ * ar5k with hard work and useful information. And, of course, for all the
+ * people who encouraged me to continue this work which has been based
+ * on my initial approach found on http://team.vantronix.net/ar5k/.
+ */
+
+#ifndef _AR5K_H
+#define _AR5K_H
+
+
+
+
+/*
+ * Device tracing
+ */
+
+#define AR5K_TRACE_PRINTF(_trace)      AR5K_PRINTF(_trace)
+
+
+
+
+
+
+/****************************\
+  GENERIC DRIVER DEFINITIONS
+\****************************/
+
+/*
+ * C doesn't support boolean ;-(
+ * TODO: See if there is a bool definition somewere else
+ * in the kernel, we shouldn't redefine it if it does...
+ */
+#ifndef TRUE
+#define        TRUE    1
+#endif
+#ifndef FALSE
+#define        FALSE   0
+#endif
+typedef u_int8_t AR5K_BOOL;
+
+/*
+ * Error codes reported from HAL to the driver
+ */
+typedef enum {
+       AR5K_OK         = 0,    /* Everything went O.K.*/
+       AR5K_ENOMEM     = 1,    /* Unable to allocate memory for ath_hal*/
+       AR5K_EIO        = 2,    /* Hardware I/O Error*/
+       AR5K_EELOCKED   = 3,    /* Unable to access EEPROM*/
+       AR5K_EEBADSUM   = 4,    /* Invalid EEPROM checksum*/
+       AR5K_EEREAD     = 5,    /* Unable to get device caps from EEPROM */
+       AR5K_EEBADMAC   = 6,    /* Unable to read MAC address from EEPROM */
+       AR5K_EINVAL     = 7,    /* Invalid parameter to function */
+       AR5K_ENOTSUPP   = 8,    /* Hardware revision not supported */
+       AR5K_EINPROGRESS= 9,    /* Unexpected error ocured during process */
+} AR5K_STATUS;
+
+/*
+ * Some tuneable values (these should be changeable by the user)
+ */
+#define AR5K_TUNE_DMA_BEACON_RESP              2
+#define AR5K_TUNE_SW_BEACON_RESP               10
+#define AR5K_TUNE_ADDITIONAL_SWBA_BACKOFF      0
+#define AR5K_TUNE_RADAR_ALERT                  FALSE
+#define AR5K_TUNE_MIN_TX_FIFO_THRES            1
+#define AR5K_TUNE_MAX_TX_FIFO_THRES            ((MAX_PDU_LENGTH / 64) + 1)
+#define AR5K_TUNE_RSSI_THRES                   1792
+#define AR5K_TUNE_REGISTER_TIMEOUT             20000
+#define AR5K_TUNE_REGISTER_DWELL_TIME          20000
+#define AR5K_TUNE_BEACON_INTERVAL              100
+#define AR5K_TUNE_AIFS                         2
+#define AR5K_TUNE_AIFS_11B                     2
+#define AR5K_TUNE_AIFS_XR                      0
+#define AR5K_TUNE_CWMIN                                15
+#define AR5K_TUNE_CWMIN_11B                    31
+#define AR5K_TUNE_CWMIN_XR                     3
+#define AR5K_TUNE_CWMAX                                1023
+#define AR5K_TUNE_CWMAX_11B                    1023
+#define AR5K_TUNE_CWMAX_XR                     7
+#define AR5K_TUNE_NOISE_FLOOR                  -72
+#define AR5K_TUNE_MAX_TXPOWER                  60
+#define AR5K_TUNE_DEFAULT_TXPOWER              30
+#define AR5K_TUNE_TPC_TXPOWER                  TRUE
+#define AR5K_TUNE_ANT_DIVERSITY                        TRUE
+#define AR5K_TUNE_HWTXTRIES                    4
+
+/* token to use for aifs, cwmin, cwmax in MadWiFi */
+#define        AR5K_TXQ_USEDEFAULT     ((u_int32_t) -1)
+
+#define IEEE80211_ADDR_LEN      6       /* size of 802.11 address */
+#define ETHER_ADDR_LEN          6       /* length of an Ethernet address */
+static const u_char etherbroadcastaddr[ETHER_ADDR_LEN] = { 0xff, 0xff, 0xff, 
0xff, 0xff, 0xff };
+//#define etherbroadcastaddr 0xff
+
+
+
+
+/*****************************\
+  GENERIC CHIPSET DEFINITIONS
+\*****************************/
+
+/* MAC Chips*/
+enum ath5k_version {
+       AR5K_AR5210     = 0,
+       AR5K_AR5211     = 1,
+       AR5K_AR5212     = 2,
+};
+
+/*PHY Chips*/
+enum ath5k_radio {
+       AR5K_AR5110     = 0,
+       AR5K_AR5111     = 1,
+       AR5K_AR5112     = 2,
+};
+
+/*
+ * Common silicon revision/version values
+ */
+enum ath5k_srev_type {
+       AR5K_VERSION_VER,
+       AR5K_VERSION_REV,
+       AR5K_VERSION_RAD,
+       AR5K_VERSION_DEV
+};
+
+struct ath5k_srev_name {
+       const char              *sr_name;
+       enum ath5k_srev_type    sr_type;
+       u_int                   sr_val;
+};
+
+#define AR5K_SREV_NAME {                                               \
+       { "5210",       AR5K_VERSION_VER,       AR5K_SREV_VER_AR5210 }, \
+       { "5311",       AR5K_VERSION_VER,       AR5K_SREV_VER_AR5311 }, \
+       { "5311a",      AR5K_VERSION_VER,       AR5K_SREV_VER_AR5311A },\
+       { "5311b",      AR5K_VERSION_VER,       AR5K_SREV_VER_AR5311B },\
+       { "5211",       AR5K_VERSION_VER,       AR5K_SREV_VER_AR5211 }, \
+       { "5212",       AR5K_VERSION_VER,       AR5K_SREV_VER_AR5212 }, \
+       { "5213",       AR5K_VERSION_VER,       AR5K_SREV_VER_AR5213 }, \
+       { "xxxx",       AR5K_VERSION_VER,       AR5K_SREV_UNKNOWN },    \
+       { "5110",       AR5K_VERSION_RAD,       AR5K_SREV_RAD_5110 },   \
+       { "5111",       AR5K_VERSION_RAD,       AR5K_SREV_RAD_5111 },   \
+       { "2111",       AR5K_VERSION_RAD,       AR5K_SREV_RAD_2111 },   \
+       { "5112",       AR5K_VERSION_RAD,       AR5K_SREV_RAD_5112 },   \
+       { "5112a",      AR5K_VERSION_RAD,       AR5K_SREV_RAD_5112A },  \
+       { "2112",       AR5K_VERSION_RAD,       AR5K_SREV_RAD_2112 },   \
+       { "2112a",      AR5K_VERSION_RAD,       AR5K_SREV_RAD_2112A },  \
+       { "xxxx",       AR5K_VERSION_RAD,       AR5K_SREV_UNKNOWN },    \
+       { "2413",       AR5K_VERSION_DEV,       AR5K_DEVID_AR2413 },    \
+       { "5413",       AR5K_VERSION_DEV,       AR5K_DEVID_AR5413 },    \
+       { "5424",       AR5K_VERSION_DEV,       AR5K_DEVID_AR5424 },    \
+       { "xxxx",       AR5K_VERSION_DEV,       AR5K_SREV_UNKNOWN }     \
+}
+
+#define AR5K_SREV_UNKNOWN      0xffff
+
+#define AR5K_SREV_VER_AR5210   0x00
+#define AR5K_SREV_VER_AR5311   0x10
+#define AR5K_SREV_VER_AR5311A  0x20
+#define AR5K_SREV_VER_AR5311B  0x30
+#define AR5K_SREV_VER_AR5211   0x40
+#define AR5K_SREV_VER_AR5212   0x50
+#define AR5K_SREV_VER_AR5213   0x55
+#define AR5K_SREV_VER_UNSUPP   0x60
+
+#define AR5K_SREV_RAD_5110     0x00
+#define AR5K_SREV_RAD_5111     0x10
+#define AR5K_SREV_RAD_5111A    0x15
+#define AR5K_SREV_RAD_2111     0x20
+#define AR5K_SREV_RAD_5112     0x30
+#define AR5K_SREV_RAD_5112A    0x35
+#define AR5K_SREV_RAD_2112     0x40
+#define AR5K_SREV_RAD_2112A    0x45
+#define AR5K_SREV_RAD_UNSUPP   0x50
+
+
+
+
+/****************\
+  TX DEFINITIONS
+\****************/
+
+/*
+ * Tx Descriptor
+ */
+struct ath_tx_status {
+       u_int16_t       ts_seqnum;
+       u_int16_t       ts_tstamp;
+       u_int8_t        ts_status;
+       u_int8_t        ts_rate;
+       int8_t          ts_rssi;
+       u_int8_t        ts_shortretry;
+       u_int8_t        ts_longretry;
+       u_int8_t        ts_virtcol;
+       u_int8_t        ts_antenna;
+};
+
+#define AR5K_TXSTAT_ALTRATE    0x80
+#define AR5K_TXERR_XRETRY      0x01
+#define AR5K_TXERR_FILT                0x02
+#define AR5K_TXERR_FIFO                0x04
+
+/*
+ * Queue types used to classify tx queues.
+ */
+typedef enum {
+       AR5K_TX_QUEUE_INACTIVE = 0,/*This queue is not used -see 
ath_hal_releasetxqueue*/
+       AR5K_TX_QUEUE_DATA,       /*A normal data queue*/
+       AR5K_TX_QUEUE_XR_DATA,    /*An XR-data queue*/
+       AR5K_TX_QUEUE_BEACON,     /*The beacon queue*/
+       AR5K_TX_QUEUE_CAB,        /*The ater-beacon queue*/
+       AR5K_TX_QUEUE_UAPSD,      /*Unscheduled Automatic Power Save Delivery 
queue*/
+} AR5K_TX_QUEUE;
+
+#define        AR5K_NUM_TX_QUEUES      10
+
+/*
+ * Queue syb-types to classify normal data queues.
+ * These are the 4 Access Categories as defined in
+ * WME spec. 0 is the lowest priority and 4 is the
+ * highest. Normal data that hasn't been classified
+ * goes to the Best Effort AC.
+ */
+typedef enum {
+       AR5K_WME_AC_BK = 0,     /*Background traffic*/
+       AR5K_WME_AC_BE,         /*Best-effort (normal) traffic)*/
+       AR5K_WME_AC_VI,         /*Video traffic*/
+       AR5K_WME_AC_VO,         /*Voice traffic*/
+} AR5K_TX_QUEUE_SUBTYPE;
+
+/*
+ * Queue ID numbers as returned by the HAL, each number
+ * represents a hw queue. If hw does not support hw queues
+ * (eg 5210/5211) all data goes in one queue. These match
+ * d80211 definitions (net80211/MadWiFi don't use them).
+ */
+typedef enum {
+       AR5K_TX_QUEUE_ID_DATA_MIN = 0, /*IEEE80211_TX_QUEUE_DATA0*/
+       AR5K_TX_QUEUE_ID_DATA_MAX = 4, /*IEEE80211_TX_QUEUE_DATA4*/
+       AR5K_TX_QUEUE_ID_DATA_SVP = 5, /*IEEE80211_TX_QUEUE_SVP - Spectralink 
Voice Protocol*/
+       AR5K_TX_QUEUE_ID_CAB      = 6, /*IEEE80211_TX_QUEUE_AFTER_BEACON*/
+       AR5K_TX_QUEUE_ID_BEACON   = 7, /*IEEE80211_TX_QUEUE_BEACON*/
+       AR5K_TX_QUEUE_ID_UAPSD    = 8,
+       AR5K_TX_QUEUE_ID_XR_DATA  = 9,
+} AR5K_TX_QUEUE_ID;
+
+
+/*
+ * Flags to set hw queue's parameters...
+ */
+#define AR5K_TXQ_FLAG_TXINT_ENABLE             0x0001  /* Enable TXOK and 
TXERR interrupts -not used- */
+#define AR5K_TXQ_FLAG_TXDESCINT_ENABLE         0x0002  /* Enable TXDESC 
interrupt -not implemented- */
+#define AR5K_TXQ_FLAG_BACKOFF_DISABLE          0x0004  /* Disable random 
post-backoff */
+#define AR5K_TXQ_FLAG_COMPRESSION_ENABLE       0x0008  /* Enable hw 
compression -not implemented-*/
+#define AR5K_TXQ_FLAG_RDYTIME_EXP_POLICY_ENABLE        0x0010  /* Enable ready 
time expiry policy (?)*/
+#define AR5K_TXQ_FLAG_FRAG_BURST_BACKOFF_ENABLE        0x0020  /* Enable 
backoff while bursting */
+#define AR5K_TXQ_FLAG_POST_FR_BKOFF_DIS                0x0040  /* Disable 
backoff while bursting */
+#define AR5K_TXQ_FLAG_TXEOLINT_ENABLE          0x0080  /* Enable TXEOL 
interrupt -not implemented-*/
+
+/*
+ * A struct to hold tx queue's parameters
+ */
+typedef struct {
+       AR5K_TX_QUEUE                   tqi_type;       /* See AR5K_TX_QUEUE */
+       AR5K_TX_QUEUE_SUBTYPE           tqi_subtype;    /* See 
AR5K_TX_QUEUE_SUBTYPE */
+       u_int16_t                       tqi_flags;      /* Tx queue flags (see 
above) */
+       u_int32_t                       tqi_aifs;       /* Arbitrated 
Interframe Space */
+       int32_t                         tqi_cw_min;     /* Minimum Contention 
Window */
+       int32_t                         tqi_cw_max;     /* Maximum Contention 
Window */
+       u_int32_t                       tqi_cbr_period; /* Constant bit rate 
period */
+       u_int32_t                       tqi_cbr_overflow_limit;
+       u_int32_t                       tqi_burst_time;
+       u_int32_t                       tqi_ready_time; /* Not used */
+       u_int32_t                       tqi_comp_buffer;/* Compression Buffer's 
phys addr */
+} AR5K_TXQ_INFO;
+
+/*
+ * Transmit packet types.
+ * These are not fully used inside OpenHAL yet
+ */
+typedef enum {
+       AR5K_PKT_TYPE_NORMAL            = 0,
+       AR5K_PKT_TYPE_ATIM              = 1,
+       AR5K_PKT_TYPE_PSPOLL            = 2,
+       AR5K_PKT_TYPE_BEACON            = 3,
+       AR5K_PKT_TYPE_PROBE_RESP        = 4,
+       AR5K_PKT_TYPE_PIFS              = 5,
+} AR5K_PKT_TYPE;
+
+/*
+ * TX power and TPC settings
+ */
+#define AR5K_TXPOWER_OFDM(_r, _v)      (                       \
+       ((0 & 1) << ((_v) + 6)) |                               \
+       (((hal->ah_txpower.txp_rates[(_r)]) & 0x3f) << (_v))    \
+)
+
+#define AR5K_TXPOWER_CCK(_r, _v)       (                       \
+       (hal->ah_txpower.txp_rates[(_r)] & 0x3f) << (_v)        \
+)
+
+/*
+ * Used to compute TX times
+ */
+#define AR5K_CCK_SIFS_TIME             10
+#define AR5K_CCK_PREAMBLE_BITS         144
+#define AR5K_CCK_PLCP_BITS             48
+
+#define AR5K_OFDM_SIFS_TIME            16
+#define AR5K_OFDM_PREAMBLE_TIME                20
+#define AR5K_OFDM_PLCP_BITS            22
+#define AR5K_OFDM_SYMBOL_TIME          4
+
+#define AR5K_TURBO_SIFS_TIME           8
+#define AR5K_TURBO_PREAMBLE_TIME       14
+#define AR5K_TURBO_PLCP_BITS           22
+#define AR5K_TURBO_SYMBOL_TIME         4
+
+#define AR5K_XR_SIFS_TIME              16
+#define AR5K_XR_PLCP_BITS              22
+#define AR5K_XR_SYMBOL_TIME            4
+
+/* CCK */
+#define AR5K_CCK_NUM_BITS(_frmlen) (_frmlen << 3)
+
+#define AR5K_CCK_PHY_TIME(_sp) (_sp ?                                  \
+       ((AR5K_CCK_PREAMBLE_BITS + AR5K_CCK_PLCP_BITS) >> 1) :          \
+       (AR5K_CCK_PREAMBLE_BITS + AR5K_CCK_PLCP_BITS))
+
+#define AR5K_CCK_TX_TIME(_kbps, _frmlen, _sp)                          \
+       AR5K_CCK_PHY_TIME(_sp) +                                        \
+       ((AR5K_CCK_NUM_BITS(_frmlen) * 1000) / _kbps) +         \
+       AR5K_CCK_SIFS_TIME
+
+/* OFDM */
+#define AR5K_OFDM_NUM_BITS(_frmlen) (AR5K_OFDM_PLCP_BITS + (_frmlen << 3))
+
+#define AR5K_OFDM_NUM_BITS_PER_SYM(_kbps) ((_kbps *                    \
+       AR5K_OFDM_SYMBOL_TIME) / 1000)
+
+#define AR5K_OFDM_NUM_BITS(_frmlen) (AR5K_OFDM_PLCP_BITS + (_frmlen << 3))
+
+#define AR5K_OFDM_NUM_SYMBOLS(_kbps, _frmlen)                          \
+       howmany(AR5K_OFDM_NUM_BITS(_frmlen), AR5K_OFDM_NUM_BITS_PER_SYM(_kbps))
+
+#define AR5K_OFDM_TX_TIME(_kbps, _frmlen)                              \
+       AR5K_OFDM_PREAMBLE_TIME + AR5K_OFDM_SIFS_TIME +                 \
+       (AR5K_OFDM_NUM_SYMBOLS(_kbps, _frmlen) * AR5K_OFDM_SYMBOL_TIME)
+
+/* TURBO */
+#define AR5K_TURBO_NUM_BITS(_frmlen) (AR5K_TURBO_PLCP_BITS + (_frmlen << 3))
+
+#define AR5K_TURBO_NUM_BITS_PER_SYM(_kbps) (((_kbps << 1) *            \
+       AR5K_TURBO_SYMBOL_TIME) / 1000)
+
+#define AR5K_TURBO_NUM_BITS(_frmlen) (AR5K_TURBO_PLCP_BITS + (_frmlen << 3))
+
+#define AR5K_TURBO_NUM_SYMBOLS(_kbps, _frmlen)                         \
+       howmany(AR5K_TURBO_NUM_BITS(_frmlen),                           \
+       AR5K_TURBO_NUM_BITS_PER_SYM(_kbps))
+
+#define AR5K_TURBO_TX_TIME(_kbps, _frmlen)                             \
+       AR5K_TURBO_PREAMBLE_TIME + AR5K_TURBO_SIFS_TIME +               \
+       (AR5K_TURBO_NUM_SYMBOLS(_kbps, _frmlen) * AR5K_TURBO_SYMBOL_TIME)
+
+/* eXtendent Range (?)*/
+#define AR5K_XR_PREAMBLE_TIME(_kbps) (((_kbps) < 1000) ? 173 : 76)
+
+#define AR5K_XR_NUM_BITS_PER_SYM(_kbps) ((_kbps *                      \
+       AR5K_XR_SYMBOL_TIME) / 1000)
+
+#define AR5K_XR_NUM_BITS(_frmlen) (AR5K_XR_PLCP_BITS + (_frmlen << 3))
+
+#define AR5K_XR_NUM_SYMBOLS(_kbps, _frmlen)                            \
+       howmany(AR5K_XR_NUM_BITS(_frmlen), AR5K_XR_NUM_BITS_PER_SYM(_kbps))
+
+#define AR5K_XR_TX_TIME(_kbps, _frmlen)                                \
+       AR5K_XR_PREAMBLE_TIME(_kbps) + AR5K_XR_SIFS_TIME +              \
+       (AR5K_XR_NUM_SYMBOLS(_kbps, _frmlen) * AR5K_XR_SYMBOL_TIME)
+
+/*
+ * DMA size definitions (2^n+2)
+ */
+typedef enum {
+       AR5K_DMASIZE_4B = 0,
+       AR5K_DMASIZE_8B,
+       AR5K_DMASIZE_16B,
+       AR5K_DMASIZE_32B,
+       AR5K_DMASIZE_64B,
+       AR5K_DMASIZE_128B,
+       AR5K_DMASIZE_256B,
+       AR5K_DMASIZE_512B
+} ath5k_dmasize_t;
+
+
+
+/****************\
+  RX DEFINITIONS
+\****************/
+
+/*
+ * Rx Descriptor
+ */
+struct ath_rx_status {
+       u_int16_t       rs_datalen;
+       u_int16_t       rs_tstamp;
+       u_int8_t        rs_status;
+       u_int8_t        rs_phyerr;
+       int8_t          rs_rssi;
+       u_int8_t        rs_keyix;
+       u_int8_t        rs_rate;
+       u_int8_t        rs_antenna;
+       u_int8_t        rs_more;
+};
+
+#define AR5K_RXERR_CRC         0x01
+#define AR5K_RXERR_PHY         0x02
+#define AR5K_RXERR_FIFO                0x04
+#define AR5K_RXERR_DECRYPT     0x08
+#define AR5K_RXERR_MIC         0x10
+#define AR5K_RXKEYIX_INVALID   ((u_int8_t) - 1)
+#define AR5K_TXKEYIX_INVALID   ((u_int32_t) - 1)
+
+/*
+ * RX filters
+ * Most of them are not yet used inside OpenHAL
+ */
+#define        AR5K_RX_FILTER_UCAST            0x00000001      /* Don't filter 
unicast frames */
+#define        AR5K_RX_FILTER_MCAST            0x00000002      /* Don't filter 
multicast frames */
+#define        AR5K_RX_FILTER_BCAST            0x00000004      /* Don't filter 
broadcast frames */
+#define        AR5K_RX_FILTER_CONTROL          0x00000008      /* Don't filter 
control frames */
+#define        AR5K_RX_FILTER_BEACON           0x00000010      /* Don't filter 
beacon frames */
+#define        AR5K_RX_FILTER_PROM             0x00000020      /* Set 
promiscuous mode */
+#define        AR5K_RX_FILTER_XRPOLL           0x00000040      /* Don't filter 
XR poll frame */
+#define        AR5K_RX_FILTER_PROBEREQ         0x00000080      /* Don't filter 
probe requests */
+#define        AR5K_RX_FILTER_PHYERROR         0x00000100      /* Don't filter 
phy errors */
+#define        AR5K_RX_FILTER_PHYRADAR         0x00000200      /* Don't filter 
phy radar errors*/
+
+typedef struct {
+       u_int32_t       ackrcv_bad;
+       u_int32_t       rts_bad;
+       u_int32_t       rts_good;
+       u_int32_t       fcs_bad;
+       u_int32_t       beacons;
+} AR5K_MIB_STATS;
+
+
+
+
+/**************************\
+ BEACON TIMERS DEFINITIONS
+\**************************/
+
+#define AR5K_BEACON_PERIOD     0x0000ffff
+#define AR5K_BEACON_ENA                0x00800000 /*enable beacon xmit*/
+#define AR5K_BEACON_RESET_TSF  0x01000000 /*force a TSF reset*/
+
+/*
+ * Per-station beacon timer state.
+ */
+typedef struct {
+       u_int32_t       bs_next_beacon;
+       u_int32_t       bs_next_dtim;
+       u_int32_t       bs_interval;            /*in TU's -see 
net80211/ieee80211_var.h-
+                                               can also include the above 
flags*/
+       u_int8_t        bs_dtim_period;
+       u_int8_t        bs_cfp_period;
+       u_int16_t       bs_cfp_max_duration;    /*if non-zero hw is setup to 
coexist with
+                                               a Point Coordination Function 
capable AP*/
+       u_int16_t       bs_cfp_du_remain;
+       u_int16_t       bs_tim_offset;
+       u_int16_t       bs_sleep_duration;
+       u_int16_t       bs_bmiss_threshold;
+       u_int32_t       bs_cfp_next;
+} AR5K_BEACON_STATE;
+
+
+
+
+/********************\
+  COMMON DEFINITIONS
+\********************/
+
+/*
+ * Atheros descriptor
+ */
+struct ath_desc {
+       u_int32_t       ds_link;
+       u_int32_t       ds_data;
+       u_int32_t       ds_ctl0;
+       u_int32_t       ds_ctl1;
+       u_int32_t       ds_hw[4];
+
+       union {
+               struct ath_rx_status rx;
+               struct ath_tx_status tx;
+       } ds_us;
+
+#define ds_rxstat ds_us.rx
+#define ds_txstat ds_us.tx
+
+} __packed;
+
+#define AR5K_RXDESC_INTREQ     0x0020
+
+#define AR5K_TXDESC_CLRDMASK   0x0001
+#define AR5K_TXDESC_NOACK      0x0002
+#define AR5K_TXDESC_RTSENA     0x0004
+#define AR5K_TXDESC_CTSENA     0x0008
+#define AR5K_TXDESC_INTREQ     0x0010
+#define AR5K_TXDESC_VEOL       0x0020
+
+/*
+ * 802.11 operating modes...
+ */
+#define AR5K_MODE_11A          0x01
+#define AR5K_MODE_11B          0x02
+#define AR5K_MODE_11G          0x04
+#define AR5K_MODE_TURBO        0x08
+#define AR5K_MODE_108G         0x16
+#define AR5K_MODE_XR   0x32
+#define AR5K_MODE_ALL  (AR5K_MODE_11A| \
+                       AR5K_MODE_11B|  \
+                       AR5K_MODE_11G|  \
+                       AR5K_MODE_TURBO|\
+                       AR5K_MODE_108G| \
+                       AR5K_MODE_XR)
+
+/*
+ * Channel definitions
+ */
+typedef struct {
+       u_int16_t       freq;           /* setting in Mhz */
+       u_int16_t       channel_flags;
+       u_int8_t        private_flags;  /* not used in OpenHAL yet*/
+} AR5K_CHANNEL;
+
+#define AR5K_SLOT_TIME_9       396
+#define AR5K_SLOT_TIME_20      880
+#define AR5K_SLOT_TIME_MAX     0xffff
+
+/* channel_flags */
+#define        CHANNEL_CW_INT  0x0008  /* Contention Window interference 
detected */
+#define        CHANNEL_TURBO   0x0010  /* Turbo Channel */
+#define        CHANNEL_CCK     0x0020  /* CCK channel */
+#define        CHANNEL_OFDM    0x0040  /* OFDM channel */
+#define        CHANNEL_2GHZ    0x0080  /* 2GHz channel. */
+#define        CHANNEL_5GHZ    0x0100  /* 5GHz channel */
+#define        CHANNEL_PASSIVE 0x0200  /* Only passive scan allowed */
+#define        CHANNEL_DYN     0x0400  /* Dynamic CCK-OFDM channel (for g 
operation)*/
+#define        CHANNEL_XR      0x0800  /* XR channel */
+
+#define        CHANNEL_A       (CHANNEL_5GHZ|CHANNEL_OFDM)
+#define        CHANNEL_B       (CHANNEL_2GHZ|CHANNEL_CCK)
+#define        CHANNEL_PUREG   (CHANNEL_2GHZ|CHANNEL_OFDM)
+//#ifdef notdef
+#define        CHANNEL_G       (CHANNEL_2GHZ|CHANNEL_DYN)
+//#else
+//#define      CHANNEL_G       (CHANNEL_2GHZ|CHANNEL_OFDM)
+//#endif
+#define        CHANNEL_T       (CHANNEL_5GHZ|CHANNEL_OFDM|CHANNEL_TURBO)
+#define        CHANNEL_TG      (CHANNEL_2GHZ|CHANNEL_OFDM|CHANNEL_TURBO)
+#define        CHANNEL_108A    CHANNEL_T
+#define        CHANNEL_108G    CHANNEL_TG
+#define        CHANNEL_X       (CHANNEL_5GHZ|CHANNEL_OFDM|CHANNEL_XR)
+
+#define        CHANNEL_ALL     (CHANNEL_OFDM|CHANNEL_CCK| CHANNEL_2GHZ |\
+                        CHANNEL_5GHZ | CHANNEL_TURBO)
+
+#define        CHANNEL_ALL_NOTURBO     (CHANNEL_ALL &~ CHANNEL_TURBO)
+#define CHANNEL_MODES  CHANNEL_ALL
+
+/*
+ * Used internaly in OpenHAL (ar5211.c/ar5212.c
+ * for reset_tx_queue). Also see struct AR5K_CHANNEL.
+ */
+#define IS_CHAN_XR(_c) \
+        ((_c.channel_flags & CHANNEL_XR) != 0)
+
+#define IS_CHAN_B(_c) \
+        ((_c.channel_flags & CHANNEL_B) != 0)
+
+typedef enum {
+       AR5K_CHIP_5GHZ = CHANNEL_5GHZ,
+       AR5K_CHIP_2GHZ = CHANNEL_2GHZ,
+} AR5K_CHIP;
+
+/*
+ * The following structure will be used to map 2GHz channels to
+ * 5GHz Atheros channels.
+ */
+struct ath5k_athchan_2ghz {
+       u_int32_t       a2_flags;
+       u_int16_t       a2_athchan;
+};
+
+/*
+ * Rate definitions
+ */
+
+#define AR5K_MAX_RATES 32 /*max number of rates on the rate table*/
+
+typedef struct {
+       u_int8_t        valid;          /* Valid for rate control */
+       u_int32_t       modulation;
+       u_int16_t       rate_kbps;              
+       u_int8_t        rate_code;      /* Rate mapping for h/w descriptors */
+       u_int8_t        dot11_rate;
+       u_int8_t        control_rate;
+       u_int16_t       lp_ack_duration;/* long preamble ACK duration */
+       u_int16_t       sp_ack_duration;/* short preamble ACK duration*/
+} AR5K_RATE;
+
+typedef struct {
+       u_int16_t       rate_count;                             
+       u_int8_t        rate_code_to_index[AR5K_MAX_RATES];     /* Back-mapping 
*/
+       AR5K_RATE       rates[AR5K_MAX_RATES];
+} AR5K_RATE_TABLE;
+
+/*
+ * Rate tables...
+ */
+#define AR5K_RATES_11A { 8, {                                  \
+       255, 255, 255, 255, 255, 255, 255, 255, 6, 4, 2, 0,     \
+       7, 5, 3, 1, 255, 255, 255, 255, 255, 255, 255, 255,     \
+       255, 255, 255, 255, 255, 255, 255, 255 }, {             \
+       { 1, MODULATION_OFDM, 6000, 11, 140, 0 },               \
+       { 1, MODULATION_OFDM, 9000, 15, 18, 0 },                \
+       { 1, MODULATION_OFDM, 12000, 10, 152, 2 },              \
+       { 1, MODULATION_OFDM, 18000, 14, 36, 2 },               \
+       { 1, MODULATION_OFDM, 24000, 9, 176, 4 },               \
+       { 1, MODULATION_OFDM, 36000, 13, 72, 4 },               \
+       { 1, MODULATION_OFDM, 48000, 8, 96, 4 },                \
+       { 1, MODULATION_OFDM, 54000, 12, 108, 4 } }             \
+}
+
+#define AR5K_RATES_11B { 4, {                                          \
+       255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,     \
+       255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,     \
+       3, 2, 1, 0, 255, 255, 255, 255 }, {                             \
+       { 1, MODULATION_CCK, 1000, 27, 130, 0 },        \
+       { 1, MODULATION_CCK, 2000, 26, 132, 1 },        \
+       { 1, MODULATION_CCK, 5500, 25, 139, 1 },        \
+       { 1, MODULATION_CCK, 11000, 24, 150, 1 } }      \
+}
+
+#define AR5K_RATES_11G { 12, {                                 \
+       255, 255, 255, 255, 255, 255, 255, 255, 10, 8, 6, 4,    \
+       11, 9, 7, 5, 255, 255, 255, 255, 255, 255, 255, 255,    \
+       3, 2, 1, 0, 255, 255, 255, 255 }, {                     \
+       { 1, MODULATION_CCK, 1000, 27, 2, 0 },          \
+       { 1, MODULATION_CCK, 2000, 26, 4, 1 },          \
+       { 1, MODULATION_CCK, 5500, 25, 11, 1 },         \
+       { 1, MODULATION_CCK, 11000, 24, 22, 1 },        \
+       { 0, MODULATION_OFDM, 6000, 11, 12, 4 },        \
+       { 0, MODULATION_OFDM, 9000, 15, 18, 4 },        \
+       { 1, MODULATION_OFDM, 12000, 10, 24, 6 },       \
+       { 1, MODULATION_OFDM, 18000, 14, 36, 6 },       \
+       { 1, MODULATION_OFDM, 24000, 9, 48, 8 },        \
+       { 1, MODULATION_OFDM, 36000, 13, 72, 8 },       \
+       { 1, MODULATION_OFDM, 48000, 8, 96, 8 },        \
+       { 1, MODULATION_OFDM, 54000, 12, 108, 8 } }     \
+}
+
+#define AR5K_RATES_TURBO { 8, {                                        \
+       255, 255, 255, 255, 255, 255, 255, 255, 6, 4, 2, 0,     \
+       7, 5, 3, 1, 255, 255, 255, 255, 255, 255, 255, 255,     \
+       255, 255, 255, 255, 255, 255, 255, 255 }, {             \
+       { 1, MODULATION_TURBO, 6000, 11, 140, 0 },      \
+       { 1, MODULATION_TURBO, 9000, 15, 18, 0 },       \
+       { 1, MODULATION_TURBO, 12000, 10, 152, 2 },     \
+       { 1, MODULATION_TURBO, 18000, 14, 36, 2 },      \
+       { 1, MODULATION_TURBO, 24000, 9, 176, 4 },      \
+       { 1, MODULATION_TURBO, 36000, 13, 72, 4 },      \
+       { 1, MODULATION_TURBO, 48000, 8, 96, 4 },       \
+       { 1, MODULATION_TURBO, 54000, 12, 108, 4 } }    \
+}
+
+#define AR5K_RATES_XR { 12, {                                  \
+       255, 3, 1, 255, 255, 255, 2, 0, 10, 8, 6, 4,            \
+       11, 9, 7, 5, 255, 255, 255, 255, 255, 255, 255, 255,    \
+       255, 255, 255, 255, 255, 255, 255, 255 }, {             \
+       { 1, MODULATION_XR, 500, 7, 129, 0 },           \
+       { 1, MODULATION_XR, 1000, 2, 139, 1 },          \
+       { 1, MODULATION_XR, 2000, 6, 150, 2 },          \
+       { 1, MODULATION_XR, 3000, 1, 150, 3 },          \
+       { 1, MODULATION_OFDM, 6000, 11, 140, 4 },       \
+       { 1, MODULATION_OFDM, 9000, 15, 18, 4 },        \
+       { 1, MODULATION_OFDM, 12000, 10, 152, 6 },      \
+       { 1, MODULATION_OFDM, 18000, 14, 36, 6 },       \
+       { 1, MODULATION_OFDM, 24000, 9, 176, 8 },       \
+       { 1, MODULATION_OFDM, 36000, 13, 72, 8 },       \
+       { 1, MODULATION_OFDM, 48000, 8, 96, 8 },        \
+       { 1, MODULATION_OFDM, 54000, 12, 108, 8 } }     \
+}
+
+/*
+ * Crypto definitions
+ */
+
+/* key types */
+typedef enum {
+       AR5K_CIPHER_WEP         = 0,
+       AR5K_CIPHER_AES_OCB     = 1,
+       AR5K_CIPHER_AES_CCM     = 2,
+       AR5K_CIPHER_CKIP        = 3,
+       AR5K_CIPHER_TKIP        = 4,
+       AR5K_CIPHER_CLR         = 5,    /* no encryption */
+       AR5K_CIPHER_MIC         = 127   /* used for Message 
+                                          Integrity Code */
+} AR5K_CIPHER;
+
+#define AR5K_KEYVAL_LENGTH_40  5
+#define AR5K_KEYVAL_LENGTH_104 13
+#define AR5K_KEYVAL_LENGTH_128 16
+#define AR5K_KEYVAL_LENGTH_MAX AR5K_KEYVAL_LENGTH_128
+
+typedef struct {
+       int             wk_len;         /* key's length */
+       u_int8_t        wk_key[AR5K_KEYVAL_LENGTH_MAX];
+       u_int8_t        wk_type;        /* see above */
+       u_int8_t        wk_mic[8];      /* TKIP MIC key */
+} AR5K_KEYVAL;
+
+
+
+/***********************\
+ HW RELATED DEFINITIONS
+\***********************/
+
+/*
+ * Misc definitions
+ */
+#define        AR5K_RSSI_EP_MULTIPLIER (1<<7)
+
+#define AR5K_ASSERT_ENTRY(_e, _s) do {         \
+       if (_e >= _s)                           \
+               return (FALSE);                 \
+} while (0)
+
+
+typedef struct {
+       u_int32_t       ns_avgbrssi;    /* average beacon rssi */
+       u_int32_t       ns_avgrssi;     /* average data rssi */
+       u_int32_t       ns_avgtxrssi;   /* average tx rssi */
+} AR5K_NODE_STATS;
+
+typedef enum {
+       AR5K_ANT_VARIABLE       = 0,    /* variable by programming */
+       AR5K_ANT_FIXED_A        = 1,    /* fixed to 11a frequencies */
+       AR5K_ANT_FIXED_B        = 2,    /* fixed to 11b frequencies */
+       AR5K_ANT_MAX            = 3,
+} AR5K_ANT_SETTING;
+
+/*
+ * HAL interrupt abstraction
+ */
+
+/*
+ * These are maped to take advantage of some common bits
+ * between the MAC chips, to be able to set intr properties
+ * easier. Some of them are not used yet inside OpenHAL.
+ */
+typedef enum {
+       AR5K_INT_RX     = 0x00000001,
+       AR5K_INT_RXDESC = 0x00000002,
+       AR5K_INT_RXNOFRM = 0x00000008,
+       AR5K_INT_RXEOL  = 0x00000010,
+       AR5K_INT_RXORN  = 0x00000020,
+       AR5K_INT_TX     = 0x00000040,
+       AR5K_INT_TXDESC = 0x00000080,
+       AR5K_INT_TXURN  = 0x00000800,
+       AR5K_INT_MIB    = 0x00001000,
+       AR5K_INT_RXPHY  = 0x00004000,
+       AR5K_INT_RXKCM  = 0x00008000,
+       AR5K_INT_SWBA   = 0x00010000,
+       AR5K_INT_BMISS  = 0x00040000,
+       AR5K_INT_BNR    = 0x00100000,
+       AR5K_INT_GPIO   = 0x01000000,
+       AR5K_INT_FATAL  = 0x40000000,
+       AR5K_INT_GLOBAL = 0x80000000,
+
+       /*A sum of all the common bits*/
+       AR5K_INT_COMMON  = AR5K_INT_RXNOFRM
+                       | AR5K_INT_RXDESC
+                       | AR5K_INT_RXEOL
+                       | AR5K_INT_RXORN
+                       | AR5K_INT_TXURN
+                       | AR5K_INT_TXDESC
+                       | AR5K_INT_MIB
+                       | AR5K_INT_RXPHY
+                       | AR5K_INT_RXKCM
+                       | AR5K_INT_SWBA
+                       | AR5K_INT_BMISS
+                       | AR5K_INT_GPIO,
+       AR5K_INT_NOCARD = 0xffffffff /*Declare that the card 
+                                      has been removed*/
+} AR5K_INT;
+
+/*
+ * Power management
+ */
+typedef enum {
+       AR5K_PM_UNDEFINED = 0,
+       AR5K_PM_AUTO,
+       AR5K_PM_AWAKE,
+       AR5K_PM_FULL_SLEEP,
+       AR5K_PM_NETWORK_SLEEP,
+} AR5K_POWER_MODE;
+
+
+/*
+ * LED states
+ */
+typedef int AR5K_LED_STATE;
+
+/*
+ * These match net80211 definitions (not used in
+ * d80211).
+ */
+#define AR5K_LED_INIT  0 /*IEEE80211_S_INIT*/
+#define AR5K_LED_SCAN  1 /*IEEE80211_S_SCAN*/
+#define AR5K_LED_AUTH  2 /*IEEE80211_S_AUTH*/
+#define AR5K_LED_ASSOC 3 /*IEEE80211_S_ASSOC*/
+#define AR5K_LED_RUN   4 /*IEEE80211_S_RUN*/
+
+/* GPIO-controlled software LED */
+#define AR5K_SOFTLED_PIN       0
+#define AR5K_SOFTLED_ON                0
+#define AR5K_SOFTLED_OFF       1
+
+/*
+ * Chipset capabilities -see ath_hal_getcapability-
+ * get_capability function is not yet fully implemented
+ * in OpenHAL so most of these don't work yet...
+ */
+typedef enum {
+       AR5K_CAP_REG_DMN                = 0,    /* Used to get current reg. 
domain id */
+       AR5K_CAP_CIPHER                 = 1,    /* Can handle encryption */
+       AR5K_CAP_TKIP_MIC               = 2,    /* Can handle TKIP MIC in 
hardware */
+       AR5K_CAP_TKIP_SPLIT             = 3,    /* TKIP uses split keys */
+       AR5K_CAP_PHYCOUNTERS            = 4,    /* PHY error counters */
+       AR5K_CAP_DIVERSITY              = 5,    /* Supports fast diversity */
+       AR5K_CAP_NUM_TXQUEUES           = 6,    /* Used to get max number of hw 
txqueues */
+       AR5K_CAP_VEOL                   = 7,    /* Supports virtual EOL */
+       AR5K_CAP_COMPRESSION            = 8,    /* Supports compression */
+       AR5K_CAP_BURST                  = 9,    /* Supports packet bursting */
+       AR5K_CAP_FASTFRAME              = 10,   /* Supports fast frames */
+       AR5K_CAP_TXPOW                  = 11,   /* Used to get global tx power 
limit */
+       AR5K_CAP_TPC                    = 12,   /* Can do per-packet tx power 
control (needed for 802.11a) */
+       AR5K_CAP_BSSIDMASK              = 13,   /* Supports bssid mask */
+       AR5K_CAP_MCAST_KEYSRCH          = 14,   /* Supports multicast key 
search */
+       AR5K_CAP_TSF_ADJUST             = 15,   /* Supports beacon tsf adjust */
+       AR5K_CAP_XR                     = 16,   /* Supports XR mode */
+       AR5K_CAP_WME_TKIPMIC            = 17,   /* Supports TKIP MIC when using 
WMM */
+       AR5K_CAP_CHAN_HALFRATE          = 18,   /* Supports half rate channels 
*/
+       AR5K_CAP_CHAN_QUARTERRATE       = 19,   /* Supports quarter rate 
channels */
+       AR5K_CAP_RFSILENT               = 20,   /* Supports RFsilent */
+} AR5K_CAPABILITY_TYPE;
+
+
+#endif /* _AR5K_H */
diff -Naur qemu/hw/ath5k_hw.h qemu-altered/hw/ath5k_hw.h
--- qemu/hw/ath5k_hw.h  1970-01-01 01:00:00.000000000 +0100
+++ qemu-altered/hw/ath5k_hw.h  2008-03-01 13:20:07.000000000 +0100
@@ -0,0 +1,1939 @@
+/*
+ * Copyright (c) 2004-2007 Reyk Floeter <address@hidden>
+ * Copyright (c) 2006-2007 Nick Kossifidis <address@hidden>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * $Id$
+ */
+
+/*
+ * Gain settings
+ */
+
+typedef enum {
+       AR5K_RFGAIN_INACTIVE = 0,
+       AR5K_RFGAIN_READ_REQUESTED,
+       AR5K_RFGAIN_NEED_CHANGE,
+} AR5K_RFGAIN;
+
+#define AR5K_GAIN_CRN_FIX_BITS_5111            4
+#define AR5K_GAIN_CRN_FIX_BITS_5112            7
+#define AR5K_GAIN_CRN_MAX_FIX_BITS             AR5K_GAIN_CRN_FIX_BITS_5112
+#define AR5K_GAIN_DYN_ADJUST_HI_MARGIN         15
+#define AR5K_GAIN_DYN_ADJUST_LO_MARGIN         20
+#define AR5K_GAIN_CCK_PROBE_CORR               5
+#define AR5K_GAIN_CCK_OFDM_GAIN_DELTA          15
+#define AR5K_GAIN_STEP_COUNT                   10
+#define AR5K_GAIN_PARAM_TX_CLIP                        0
+#define AR5K_GAIN_PARAM_PD_90                  1
+#define AR5K_GAIN_PARAM_PD_84                  2
+#define AR5K_GAIN_PARAM_GAIN_SEL               3
+#define AR5K_GAIN_PARAM_MIX_ORN                        0
+#define AR5K_GAIN_PARAM_PD_138                 1
+#define AR5K_GAIN_PARAM_PD_137                 2
+#define AR5K_GAIN_PARAM_PD_136                 3
+#define AR5K_GAIN_PARAM_PD_132                 4
+#define AR5K_GAIN_PARAM_PD_131                 5
+#define AR5K_GAIN_PARAM_PD_130                 6
+#define AR5K_GAIN_CHECK_ADJUST(_g)             \
+       ((_g)->g_current <= (_g)->g_low || (_g)->g_current >= (_g)->g_high)
+
+struct ath5k_gain_opt_step {
+       int16_t                         gos_param[AR5K_GAIN_CRN_MAX_FIX_BITS];
+       int32_t                         gos_gain;
+};
+
+struct ath5k_gain_opt {
+       u_int32_t                       go_default;
+       u_int32_t                       go_steps_count;
+       const struct ath5k_gain_opt_step        go_step[AR5K_GAIN_STEP_COUNT];
+};
+
+struct ath5k_gain {
+       u_int32_t                       g_step_idx;
+       u_int32_t                       g_current;
+       u_int32_t                       g_target;
+       u_int32_t                       g_low;
+       u_int32_t                       g_high;
+       u_int32_t                       g_f_corr;
+       u_int32_t                       g_active;
+       const struct ath5k_gain_opt_step        *g_step;
+};
+
+/*
+ * Gain optimization tables...
+ */
+#define AR5K_AR5111_GAIN_OPT   {               \
+       4,                                      \
+       9,                                      \
+       {                                       \
+               { { 4, 1, 1, 1 }, 6 },          \
+               { { 4, 0, 1, 1 }, 4 },          \
+               { { 3, 1, 1, 1 }, 3 },          \
+               { { 4, 0, 0, 1 }, 1 },          \
+               { { 4, 1, 1, 0 }, 0 },          \
+               { { 4, 0, 1, 0 }, -2 },         \
+               { { 3, 1, 1, 0 }, -3 },         \
+               { { 4, 0, 0, 0 }, -4 },         \
+               { { 2, 1, 1, 0 }, -6 }          \
+       }                                       \
+}
+
+#define AR5K_AR5112_GAIN_OPT   {                       \
+       1,                                              \
+       8,                                              \
+       {                                               \
+               { { 3, 0, 0, 0, 0, 0, 0 }, 6 },         \
+               { { 2, 0, 0, 0, 0, 0, 0 }, 0 },         \
+               { { 1, 0, 0, 0, 0, 0, 0 }, -3 },        \
+               { { 0, 0, 0, 0, 0, 0, 0 }, -6 },        \
+               { { 0, 1, 1, 0, 0, 0, 0 }, -8 },        \
+               { { 0, 1, 1, 0, 1, 1, 0 }, -10 },       \
+               { { 0, 1, 0, 1, 1, 1, 0 }, -13 },       \
+               { { 0, 1, 0, 1, 1, 0, 1 }, -16 },       \
+       }                                               \
+}
+
+/* Some EEPROM defines */
+#define AR5K_EEPROM_EEP_SCALE          100
+#define AR5K_EEPROM_EEP_DELTA          10
+#define AR5K_EEPROM_N_MODES            3
+#define AR5K_EEPROM_N_5GHZ_CHAN                10
+#define AR5K_EEPROM_N_2GHZ_CHAN                3
+#define AR5K_EEPROM_MAX_CHAN           10
+#define AR5K_EEPROM_N_PCDAC            11
+#define AR5K_EEPROM_N_TEST_FREQ                8
+#define AR5K_EEPROM_N_EDGES            8
+#define AR5K_EEPROM_N_INTERCEPTS       11
+#define AR5K_EEPROM_FREQ_M(_v)         AR5K_EEPROM_OFF(_v, 0x7f, 0xff)
+#define AR5K_EEPROM_PCDAC_M            0x3f
+#define AR5K_EEPROM_PCDAC_START                1
+#define AR5K_EEPROM_PCDAC_STOP         63
+#define AR5K_EEPROM_PCDAC_STEP         1
+#define AR5K_EEPROM_NON_EDGE_M         0x40
+#define AR5K_EEPROM_CHANNEL_POWER      8
+#define AR5K_EEPROM_N_OBDB             4
+#define AR5K_EEPROM_OBDB_DIS           0xffff
+#define AR5K_EEPROM_CHANNEL_DIS                0xff
+#define AR5K_EEPROM_SCALE_OC_DELTA(_x) (((_x) * 2) / 10)
+#define AR5K_EEPROM_N_CTLS(_v)         AR5K_EEPROM_OFF(_v, 16, 32)
+#define AR5K_EEPROM_MAX_CTLS           32
+#define AR5K_EEPROM_N_XPD_PER_CHANNEL  4
+#define AR5K_EEPROM_N_XPD0_POINTS      4
+#define AR5K_EEPROM_N_XPD3_POINTS      3
+#define AR5K_EEPROM_N_INTERCEPT_10_2GHZ        35
+#define AR5K_EEPROM_N_INTERCEPT_10_5GHZ        55
+#define AR5K_EEPROM_POWER_M            0x3f
+#define AR5K_EEPROM_POWER_MIN          0
+#define AR5K_EEPROM_POWER_MAX          3150
+#define AR5K_EEPROM_POWER_STEP         50
+#define AR5K_EEPROM_POWER_TABLE_SIZE   64
+#define AR5K_EEPROM_N_POWER_LOC_11B    4
+#define AR5K_EEPROM_N_POWER_LOC_11G    6
+#define AR5K_EEPROM_I_GAIN             10
+#define AR5K_EEPROM_CCK_OFDM_DELTA     15
+#define AR5K_EEPROM_N_IQ_CAL           2
+
+struct ath5k_eeprom_info {
+       u_int16_t       ee_magic;
+       u_int16_t       ee_protect;
+       u_int16_t       ee_regdomain;
+       u_int16_t       ee_version;
+       u_int16_t       ee_header;
+       u_int16_t       ee_ant_gain;
+       u_int16_t       ee_misc0;
+       u_int16_t       ee_misc1;
+       u_int16_t       ee_cck_ofdm_gain_delta;
+       u_int16_t       ee_cck_ofdm_power_delta;
+       u_int16_t       ee_scaled_cck_delta;
+       u_int16_t       ee_tx_clip;
+       u_int16_t       ee_pwd_84;
+       u_int16_t       ee_pwd_90;
+       u_int16_t       ee_gain_select;
+
+       u_int16_t       ee_i_cal[AR5K_EEPROM_N_MODES];
+       u_int16_t       ee_q_cal[AR5K_EEPROM_N_MODES];
+       u_int16_t       ee_fixed_bias[AR5K_EEPROM_N_MODES];
+       u_int16_t       ee_turbo_max_power[AR5K_EEPROM_N_MODES];
+       u_int16_t       ee_xr_power[AR5K_EEPROM_N_MODES];
+       u_int16_t       ee_switch_settling[AR5K_EEPROM_N_MODES];
+       u_int16_t       ee_ant_tx_rx[AR5K_EEPROM_N_MODES];
+       u_int16_t       
ee_ant_control[AR5K_EEPROM_N_MODES][AR5K_EEPROM_N_PCDAC];
+       u_int16_t       ee_ob[AR5K_EEPROM_N_MODES][AR5K_EEPROM_N_OBDB];
+       u_int16_t       ee_db[AR5K_EEPROM_N_MODES][AR5K_EEPROM_N_OBDB];
+       u_int16_t       ee_tx_end2xlna_enable[AR5K_EEPROM_N_MODES];
+       u_int16_t       ee_tx_end2xpa_disable[AR5K_EEPROM_N_MODES];
+       u_int16_t       ee_tx_frm2xpa_enable[AR5K_EEPROM_N_MODES];
+       u_int16_t       ee_thr_62[AR5K_EEPROM_N_MODES];
+       u_int16_t       ee_xlna_gain[AR5K_EEPROM_N_MODES];
+       u_int16_t       ee_xpd[AR5K_EEPROM_N_MODES];
+       u_int16_t       ee_x_gain[AR5K_EEPROM_N_MODES];
+       u_int16_t       ee_i_gain[AR5K_EEPROM_N_MODES];
+       u_int16_t       ee_margin_tx_rx[AR5K_EEPROM_N_MODES];
+       u_int16_t       ee_false_detect[AR5K_EEPROM_N_MODES];
+       u_int16_t       
ee_cal_pier[AR5K_EEPROM_N_MODES][AR5K_EEPROM_N_2GHZ_CHAN];
+       u_int16_t       ee_channel[AR5K_EEPROM_N_MODES][AR5K_EEPROM_MAX_CHAN];
+
+       u_int16_t       ee_ctls;
+       u_int16_t       ee_ctl[AR5K_EEPROM_MAX_CTLS];
+
+       int16_t         ee_noise_floor_thr[AR5K_EEPROM_N_MODES];
+       int8_t          ee_adc_desired_size[AR5K_EEPROM_N_MODES];
+       int8_t          ee_pga_desired_size[AR5K_EEPROM_N_MODES];
+};
+
+/*
+ * AR5k register access
+ */
+
+/*Swap RX/TX Descriptor for big endian archs*/
+#if BYTE_ORDER == BIG_ENDIAN
+#define AR5K_INIT_CFG  (               \
+       AR5K_CFG_SWTD | AR5K_CFG_SWRD   \
+)
+#else
+#define AR5K_INIT_CFG  0x00000000
+#endif
+
+#define AR5K_REG_READ(_reg)    ath5k_hw_reg_read(hal, _reg)
+
+#define AR5K_REG_WRITE(_reg, _val)     ath5k_hw_reg_write(hal, _val, _reg)
+
+#define AR5K_REG_SM(_val, _flags)                                      \
+       (((_val) << _flags##_S) & (_flags))
+
+#define AR5K_REG_MS(_val, _flags)                                      \
+       (((_val) & (_flags)) >> _flags##_S)
+
+#define AR5K_REG_WRITE_BITS(_reg, _flags, _val)                                
\
+       AR5K_REG_WRITE(_reg, (AR5K_REG_READ(_reg) &~ (_flags)) |        \
+           (((_val) << _flags##_S) & (_flags)))
+
+#define AR5K_REG_MASKED_BITS(_reg, _flags, _mask)                      \
+       AR5K_REG_WRITE(_reg, (AR5K_REG_READ(_reg) & (_mask)) | (_flags))
+
+#define AR5K_REG_ENABLE_BITS(_reg, _flags)                             \
+       AR5K_REG_WRITE(_reg, AR5K_REG_READ(_reg) | (_flags))
+
+#define AR5K_REG_DISABLE_BITS(_reg, _flags)                            \
+       AR5K_REG_WRITE(_reg, AR5K_REG_READ(_reg) &~ (_flags))
+
+#define AR5K_PHY_WRITE(_reg, _val)                                     \
+       AR5K_REG_WRITE(hal->ah_phy + ((_reg) << 2), _val)
+
+#define AR5K_PHY_READ(_reg)                                            \
+       AR5K_REG_READ(hal->ah_phy + ((_reg) << 2))
+
+#define AR5K_REG_WAIT(_i)                                              \
+       if (_i % 64)                                                    \
+               AR5K_DELAY(1);
+
+#define AR5K_EEPROM_READ(_o, _v)       {                               \
+       if ((ret = hal->ah_eeprom_read(hal, (_o),                       \
+                &(_v))) != 0)                                          \
+               return (ret);                                           \
+}
+
+#define AR5K_EEPROM_READ_HDR(_o, _v)                                   \
+       AR5K_EEPROM_READ(_o, hal->ah_capabilities.cap_eeprom._v);       \
+
+/* Read status of selected queue */
+#define AR5K_REG_READ_Q(_reg, _queue)                                  \
+       (AR5K_REG_READ(_reg) & (1 << _queue))                           \
+
+#define AR5K_REG_WRITE_Q(_reg, _queue)                                 \
+       AR5K_REG_WRITE(_reg, (1 << _queue))
+
+#define AR5K_Q_ENABLE_BITS(_reg, _queue) do {                          \
+       _reg |= 1 << _queue;                                            \
+} while (0)
+
+#define AR5K_Q_DISABLE_BITS(_reg, _queue) do {                         \
+       _reg &= ~(1 << _queue);                                         \
+} while (0)
+
+/*
+ * Unaligned little endian access
+ */
+#define AR5K_LE_READ_2 ath5k_hw_read_unaligned_16
+#define AR5K_LE_READ_4 ath5k_hw_read_unaligned_32
+#define AR5K_LE_WRITE_2        ath5k_hw_write_unaligned_16
+#define AR5K_LE_WRITE_4        ath5k_hw_write_unaligned_32
+
+#define AR5K_LOW_ID(_a)(                               \
+(_a)[0] | (_a)[1] << 8 | (_a)[2] << 16 | (_a)[3] << 24 \
+)
+
+#define AR5K_HIGH_ID(_a)       ((_a)[4] | (_a)[5] << 8)
+
+/*
+ * Initial register values
+ */
+
+/*
+ * Common initial register values
+ */
+#define AR5K_INIT_MODE                         CHANNEL_B
+
+#define AR5K_INIT_TX_LATENCY                   502
+#define AR5K_INIT_USEC                         39
+#define AR5K_INIT_USEC_TURBO                   79
+#define AR5K_INIT_USEC_32                      31
+#define AR5K_INIT_CARR_SENSE_EN                        1
+#define AR5K_INIT_PROG_IFS                     920
+#define AR5K_INIT_PROG_IFS_TURBO               960
+#define AR5K_INIT_EIFS                         3440
+#define AR5K_INIT_EIFS_TURBO                   6880
+#define AR5K_INIT_SLOT_TIME                    396
+#define AR5K_INIT_SLOT_TIME_TURBO              480
+#define AR5K_INIT_ACK_CTS_TIMEOUT              1024
+#define AR5K_INIT_ACK_CTS_TIMEOUT_TURBO                0x08000800
+#define AR5K_INIT_SIFS                         560
+#define AR5K_INIT_SIFS_TURBO                   480
+#define AR5K_INIT_SH_RETRY                     10
+#define AR5K_INIT_LG_RETRY                     AR5K_INIT_SH_RETRY
+#define AR5K_INIT_SSH_RETRY                    32
+#define AR5K_INIT_SLG_RETRY                    AR5K_INIT_SSH_RETRY
+#define AR5K_INIT_TX_RETRY                     10
+#define AR5K_INIT_TOPS                         8
+#define AR5K_INIT_RXNOFRM                      8
+#define AR5K_INIT_RPGTO                                0
+#define AR5K_INIT_TXNOFRM                      0
+#define AR5K_INIT_BEACON_PERIOD                        65535
+#define AR5K_INIT_TIM_OFFSET                   0
+#define AR5K_INIT_BEACON_EN                    0
+#define AR5K_INIT_RESET_TSF                    0
+
+#define AR5K_INIT_TRANSMIT_LATENCY             (                       \
+       (AR5K_INIT_TX_LATENCY << 14) | (AR5K_INIT_USEC_32 << 7) |       \
+       (AR5K_INIT_USEC)                                                \
+)
+#define AR5K_INIT_TRANSMIT_LATENCY_TURBO       (                       \
+       (AR5K_INIT_TX_LATENCY << 14) | (AR5K_INIT_USEC_32 << 7) |       \
+       (AR5K_INIT_USEC_TURBO)                                          \
+)
+#define AR5K_INIT_PROTO_TIME_CNTRL             (                       \
+       (AR5K_INIT_CARR_SENSE_EN << 26) | (AR5K_INIT_EIFS << 12) |      \
+       (AR5K_INIT_PROG_IFS)                                            \
+)
+#define AR5K_INIT_PROTO_TIME_CNTRL_TURBO       (                       \
+       (AR5K_INIT_CARR_SENSE_EN << 26) | (AR5K_INIT_EIFS_TURBO << 12) |\
+       (AR5K_INIT_PROG_IFS_TURBO)                                      \
+)
+#define AR5K_INIT_BEACON_CONTROL               (                       \
+       (AR5K_INIT_RESET_TSF << 24) | (AR5K_INIT_BEACON_EN << 23) |     \
+       (AR5K_INIT_TIM_OFFSET << 16) | (AR5K_INIT_BEACON_PERIOD)        \
+)
+
+/*
+ * Non - common initial register values
+ */
+struct ath5k_ini {
+       u_int16_t       ini_register;
+       u_int32_t       ini_value;
+
+       enum {
+               AR5K_INI_WRITE = 0,
+               AR5K_INI_READ = 1,
+       } ini_mode;
+};
+
+#define AR5K_INI_VAL_11A               0
+#define AR5K_INI_VAL_11A_TURBO         1
+#define AR5K_INI_VAL_11B               2
+#define AR5K_INI_VAL_11G               3
+#define AR5K_INI_VAL_11G_TURBO         4
+#define AR5K_INI_VAL_XR                        0
+#define AR5K_INI_VAL_MAX               5
+
+#define AR5K_INI_PHY_5111              0
+#define AR5K_INI_PHY_5112              1
+#define AR5K_INI_PHY_511X              1
+
+#define AR5K_AR5111_INI_RF_MAX_BANKS   AR5K_MAX_RF_BANKS
+#define AR5K_AR5112_INI_RF_MAX_BANKS   AR5K_MAX_RF_BANKS
+
+struct ath5k_ini_rf {
+       u_int8_t        rf_bank;
+       u_int16_t       rf_register;
+       u_int32_t       rf_value[5];
+};
+
+#define AR5K_AR5111_INI_RF     {                                               
\
+       { 0, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 0, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 0, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 0, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 0, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 0, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 0, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 0, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 0, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 0, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 0, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 0, 0x989c,                                                            
\
+           { 0x00380000, 0x00380000, 0x00380000, 0x00380000, 0x00380000 } },   
\
+       { 0, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 0, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 0, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x000000c0, 0x00000080, 0x00000080 } },   
\
+       { 0, 0x989c,                                                            
\
+           { 0x000400f9, 0x000400f9, 0x000400ff, 0x000400fd, 0x000400fd } },   
\
+       { 0, 0x98d4,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000004, 0x00000004, 0x00000004 } },   
\
+       { 1, 0x98d4,                                                            
\
+           { 0x00000020, 0x00000020, 0x00000020, 0x00000020, 0x00000020 } },   
\
+       { 2, 0x98d4,                                                            
\
+           { 0x00000010, 0x00000014, 0x00000010, 0x00000010, 0x00000014 } },   
\
+       { 3, 0x98d8,                                                            
\
+           { 0x00601068, 0x00601068, 0x00601068, 0x00601068, 0x00601068 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x0a000000, 0x00000000, 0x00000000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x003800c0, 0x00380080, 0x023800c0, 0x003800c0, 0x003800c0 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00020006, 0x00020006, 0x00000006, 0x00020006, 0x00020006 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00000089, 0x00000089, 0x00000089, 0x00000089, 0x00000089 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x000000a0, 0x000000a0, 0x000000a0, 0x000000a0, 0x000000a0 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00040007, 0x00040007, 0x00040007, 0x00040007, 0x00040007 } },   
\
+       { 6, 0x98d4,                                                            
\
+           { 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x00000040, 0x00000048, 0x00000040, 0x00000040, 0x00000040 } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x00000010, 0x00000010, 0x00000010, 0x00000010, 0x00000010 } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x00000008, 0x00000008, 0x00000008, 0x00000008, 0x00000008 } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x0000004f, 0x0000004f, 0x0000004f, 0x0000004f, 0x0000004f } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x000000f1, 0x000000f1, 0x00000061, 0x000000f1, 0x000000f1 } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x0000904f, 0x0000904f, 0x0000904c, 0x0000904f, 0x0000904f } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x0000125a, 0x0000125a, 0x0000129a, 0x0000125a, 0x0000125a } },   
\
+       { 7, 0x98cc,                                                            
\
+           { 0x0000000e, 0x0000000e, 0x0000000f, 0x0000000e, 0x0000000e } },   
\
+}
+
+#define AR5K_AR5112_INI_RF     {                                               
\
+       { 1, 0x98d4,                                                            
\
+           { 0x00000020, 0x00000020, 0x00000020, 0x00000020, 0x00000020 } },   
\
+       { 2, 0x98d0,                                                            
\
+           { 0x03060408, 0x03070408, 0x03060408, 0x03060408, 0x03070408 } },   
\
+       { 3, 0x98dc,                                                            
\
+           { 0x00a0c0c0, 0x00a0c0c0, 0x00e0c0c0, 0x00e0c0c0, 0x00e0c0c0 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00a00000, 0x00a00000, 0x00a00000, 0x00a00000, 0x00a00000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x000a0000, 0x000a0000, 0x000a0000, 0x000a0000, 0x000a0000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00660000, 0x00660000, 0x00660000, 0x00660000, 0x00660000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00db0000, 0x00db0000, 0x00db0000, 0x00db0000, 0x00db0000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00f10000, 0x00f10000, 0x00f10000, 0x00f10000, 0x00f10000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00120000, 0x00120000, 0x00120000, 0x00120000, 0x00120000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00120000, 0x00120000, 0x00120000, 0x00120000, 0x00120000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00730000, 0x00730000, 0x00730000, 0x00730000, 0x00730000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x000c0000, 0x000c0000, 0x000c0000, 0x000c0000, 0x000c0000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00ff0000, 0x00ff0000, 0x00ff0000, 0x00ff0000, 0x00ff0000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00ff0000, 0x00ff0000, 0x00ff0000, 0x00ff0000, 0x00ff0000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x008b0000, 0x008b0000, 0x008b0000, 0x008b0000, 0x008b0000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00600000, 0x00600000, 0x00600000, 0x00600000, 0x00600000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x000c0000, 0x000c0000, 0x000c0000, 0x000c0000, 0x000c0000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00840000, 0x00840000, 0x00840000, 0x00840000, 0x00840000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00640000, 0x00640000, 0x00640000, 0x00640000, 0x00640000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00240000, 0x00240000, 0x00240000, 0x00240000, 0x00240000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00250000, 0x00250000, 0x00250000, 0x00250000, 0x00250000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00110000, 0x00110000, 0x00110000, 0x00110000, 0x00110000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00110000, 0x00110000, 0x00110000, 0x00110000, 0x00110000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00510000, 0x00510000, 0x00510000, 0x00510000, 0x00510000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x1c040000, 0x1c040000, 0x1c040000, 0x1c040000, 0x1c040000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x000a0000, 0x000a0000, 0x000a0000, 0x000a0000, 0x000a0000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00a10000, 0x00a10000, 0x00a10000, 0x00a10000, 0x00a10000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00400000, 0x00400000, 0x00400000, 0x00400000, 0x00400000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x03090000, 0x03090000, 0x03090000, 0x03090000, 0x03090000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x06000000, 0x06000000, 0x06000000, 0x06000000, 0x06000000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x000000b0, 0x000000b0, 0x000000a8, 0x000000a8, 0x000000a8 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x006c4a41, 0x006c4a41, 0x006c4af1, 0x006c4a61, 0x006c4a61 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x0050892a, 0x0050892a, 0x0050892b, 0x0050892b, 0x0050892b } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00842400, 0x00842400, 0x00842400, 0x00842400, 0x00842400 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00c69200, 0x00c69200, 0x00c69200, 0x00c69200, 0x00c69200 } },   
\
+       { 6, 0x98d0,                                                            
\
+           { 0x0002000c, 0x0002000c, 0x0002000c, 0x0002000c, 0x0002000c } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x00000094, 0x00000094, 0x00000094, 0x00000094, 0x00000094 } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x00000091, 0x00000091, 0x00000091, 0x00000091, 0x00000091 } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x0000000a, 0x0000000a, 0x00000012, 0x00000012, 0x00000012 } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x00000080, 0x00000080, 0x00000080, 0x00000080, 0x00000080 } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x000000c1, 0x000000c1, 0x000000c1, 0x000000c1, 0x000000c1 } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x00000060, 0x00000060, 0x00000060, 0x00000060, 0x00000060 } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x000000f0, 0x000000f0, 0x000000f0, 0x000000f0, 0x000000f0 } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x00000022, 0x00000022, 0x00000022, 0x00000022, 0x00000022 } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x00000092, 0x00000092, 0x00000092, 0x00000092, 0x00000092 } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x000000d4, 0x000000d4, 0x000000d4, 0x000000d4, 0x000000d4 } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x000014cc, 0x000014cc, 0x000014cc, 0x000014cc, 0x000014cc } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x0000048c, 0x0000048c, 0x0000048c, 0x0000048c, 0x0000048c } },   
\
+       { 7, 0x98c4,                                                            
\
+           { 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003 } },   
\
+       }
+        
+#define AR5K_AR5112A_INI_RF     {                                              
\
+       { 1, 0x98d4,                                                            
\
+           { 0x00000020, 0x00000020, 0x00000020, 0x00000020, 0x00000020 } },   
\
+       { 2, 0x98d0,                                                            
\
+           { 0x03060408, 0x03070408, 0x03060408, 0x03060408, 0x03070408 } },   
\
+       { 3, 0x98dc,                                                            
\
+           { 0x00a0c0c0, 0x00a0c0c0, 0x00e0c0c0, 0x00e0c0c0, 0x00e0c0c0 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x0f000000, 0x0f000000, 0x0f000000, 0x0f000000, 0x0f000000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00800000, 0x00800000, 0x00800000, 0x00800000, 0x00800000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x002a0000, 0x002a0000, 0x002a0000, 0x002a0000, 0x002a0000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00010000, 0x00010000, 0x00010000, 0x00010000, 0x00010000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00180000, 0x00180000, 0x00180000, 0x00180000, 0x00180000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00600000, 0x00600000, 0x006e0000, 0x006e0000, 0x006e0000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00c70000, 0x00c70000, 0x00c70000, 0x00c70000, 0x00c70000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x004b0000, 0x004b0000, 0x004b0000, 0x004b0000, 0x004b0000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x04480000, 0x04480000, 0x04480000, 0x04480000, 0x04480000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00220000, 0x00220000, 0x00220000, 0x00220000, 0x00220000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00e40000, 0x00e40000, 0x00e40000, 0x00e40000, 0x00e40000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00fc0000, 0x00fc0000, 0x00fc0000, 0x00fc0000, 0x00fc0000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00ff0000, 0x00ff0000, 0x00ff0000, 0x00ff0000, 0x00ff0000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x043f0000, 0x043f0000, 0x043f0000, 0x043f0000, 0x043f0000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x000c0000, 0x000c0000, 0x000c0000, 0x000c0000, 0x000c0000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00190000, 0x00190000, 0x00190000, 0x00190000, 0x00190000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00240000, 0x00240000, 0x00240000, 0x00240000, 0x00240000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00b40000, 0x00b40000, 0x00b40000, 0x00b40000, 0x00b40000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00990000, 0x00990000, 0x00990000, 0x00990000, 0x00990000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00500000, 0x00500000, 0x00500000, 0x00500000, 0x00500000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x002a0000, 0x002a0000, 0x002a0000, 0x002a0000, 0x002a0000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00120000, 0x00120000, 0x00120000, 0x00120000, 0x00120000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0xc0320000, 0xc0320000, 0xc0320000, 0xc0320000, 0xc0320000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x01740000, 0x01740000, 0x01740000, 0x01740000, 0x01740000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00110000, 0x00110000, 0x00110000, 0x00110000, 0x00110000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x86280000, 0x86280000, 0x86280000, 0x86280000, 0x86280000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x31840000, 0x31840000, 0x31840000, 0x31840000, 0x31840000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00020080, 0x00020080, 0x00020080, 0x00020080, 0x00020080 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00080009, 0x00080009, 0x00080009, 0x00080009, 0x00080009 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x000000b2, 0x000000b2, 0x000000b2, 0x000000b2, 0x000000b2 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00b02084, 0x00b02084, 0x00b02084, 0x00b02084, 0x00b02084 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x004125a4, 0x004125a4, 0x004125a4, 0x004125a4, 0x004125a4 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x00119220, 0x00119220, 0x00119220, 0x00119220, 0x00119220 } },   
\
+       { 6, 0x989c,                                                            
\
+           { 0x001a4800, 0x001a4800, 0x001a4800, 0x001a4800, 0x001a4800 } },   
\
+       { 6, 0x98d8,                                                            
\
+           { 0x000b0230, 0x000b0230, 0x000b0230, 0x000b0230, 0x000b0230 } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x00000094, 0x00000094, 0x00000094, 0x00000094, 0x00000094 } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x00000091, 0x00000091, 0x00000091, 0x00000091, 0x00000091 } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x00000012, 0x00000012, 0x00000012, 0x00000012, 0x00000012 } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x00000080, 0x00000080, 0x00000080, 0x00000080, 0x00000080 } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x000000d9, 0x000000d9, 0x000000d9, 0x000000d9, 0x000000d9 } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x00000060, 0x00000060, 0x00000060, 0x00000060, 0x00000060 } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x000000f0, 0x000000f0, 0x000000f0, 0x000000f0, 0x000000f0 } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x000000a2, 0x000000a2, 0x000000a2, 0x000000a2, 0x000000a2 } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x00000052, 0x00000052, 0x00000052, 0x00000052, 0x00000052 } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x000000d4, 0x000000d4, 0x000000d4, 0x000000d4, 0x000000d4 } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x000014cc, 0x000014cc, 0x000014cc, 0x000014cc, 0x000014cc } },   
\
+       { 7, 0x989c,                                                            
\
+           { 0x0000048c, 0x0000048c, 0x0000048c, 0x0000048c, 0x0000048c } },   
\
+       { 7, 0x98c4,                                                            
\
+           { 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003 } },   
\
+}
+
+struct ath5k_ini_rfgain {
+       u_int16_t       rfg_register;
+       u_int32_t       rfg_value[2][2];
+
+#define AR5K_INI_RFGAIN_5GHZ   0
+#define AR5K_INI_RFGAIN_2GHZ   1
+};
+
+#define AR5K_INI_RFGAIN        {                                               
        \
+       { 0x9a00, {                                                             
\
+               { 0x000001a9, 0x00000000 }, { 0x00000007, 0x00000007 } } },     
\
+       { 0x9a04, {                                                             
\
+               { 0x000001e9, 0x00000040 }, { 0x00000047, 0x00000047 } } },     
\
+       { 0x9a08, {                                                             
\
+               { 0x00000029, 0x00000080 }, { 0x00000087, 0x00000087 } } },     
\
+       { 0x9a0c, {                                                             
\
+               { 0x00000069, 0x00000150 }, { 0x000001a0, 0x000001a0 } } },     
\
+       { 0x9a10, {                                                             
\
+               { 0x00000199, 0x00000190 }, { 0x000001e0, 0x000001e0 } } },     
\
+       { 0x9a14, {                                                             
\
+               { 0x000001d9, 0x000001d0 }, { 0x00000020, 0x00000020 } } },     
\
+       { 0x9a18, {                                                             
\
+               { 0x00000019, 0x00000010 }, { 0x00000060, 0x00000060 } } },     
\
+       { 0x9a1c, {                                                             
\
+               { 0x00000059, 0x00000044 }, { 0x000001a1, 0x000001a1 } } },     
\
+       { 0x9a20, {                                                             
\
+               { 0x00000099, 0x00000084 }, { 0x000001e1, 0x000001e1 } } },     
\
+       { 0x9a24, {                                                             
\
+               { 0x000001a5, 0x00000148 }, { 0x00000021, 0x00000021 } } },     
\
+       { 0x9a28, {                                                             
\
+               { 0x000001e5, 0x00000188 }, { 0x00000061, 0x00000061 } } },     
\
+       { 0x9a2c, {                                                             
\
+               { 0x00000025, 0x000001c8 }, { 0x00000162, 0x00000162 } } },     
\
+       { 0x9a30, {                                                             
\
+               { 0x000001c8, 0x00000014 }, { 0x000001a2, 0x000001a2 } } },     
\
+       { 0x9a34, {                                                             
\
+               { 0x00000008, 0x00000042 }, { 0x000001e2, 0x000001e2 } } },     
\
+       { 0x9a38, {                                                             
\
+               { 0x00000048, 0x00000082 }, { 0x00000022, 0x00000022 } } },     
\
+       { 0x9a3c, {                                                             
\
+               { 0x00000088, 0x00000178 }, { 0x00000062, 0x00000062 } } },     
\
+       { 0x9a40, {                                                             
\
+               { 0x00000198, 0x000001b8 }, { 0x00000163, 0x00000163 } } },     
\
+       { 0x9a44, {                                                             
\
+               { 0x000001d8, 0x000001f8 }, { 0x000001a3, 0x000001a3 } } },     
\
+       { 0x9a48, {                                                             
\
+               { 0x00000018, 0x00000012 }, { 0x000001e3, 0x000001e3 } } },     
\
+       { 0x9a4c, {                                                             
\
+               { 0x00000058, 0x00000052 }, { 0x00000023, 0x00000023 } } },     
\
+       { 0x9a50, {                                                             
\
+               { 0x00000098, 0x00000092 }, { 0x00000063, 0x00000063 } } },     
\
+       { 0x9a54, {                                                             
\
+               { 0x000001a4, 0x0000017c }, { 0x00000184, 0x00000184 } } },     
\
+       { 0x9a58, {                                                             
\
+               { 0x000001e4, 0x000001bc }, { 0x000001c4, 0x000001c4 } } },     
\
+       { 0x9a5c, {                                                             
\
+               { 0x00000024, 0x000001fc }, { 0x00000004, 0x00000004 } } },     
\
+       { 0x9a60, {                                                             
\
+               { 0x00000064, 0x0000000a }, { 0x000001ea, 0x0000000b } } },     
\
+       { 0x9a64, {                                                             
\
+               { 0x000000a4, 0x0000004a }, { 0x0000002a, 0x0000004b } } },     
\
+       { 0x9a68, {                                                             
\
+               { 0x000000e4, 0x0000008a }, { 0x0000006a, 0x0000008b } } },     
\
+       { 0x9a6c, {                                                             
\
+               { 0x0000010a, 0x0000015a }, { 0x000000aa, 0x000001ac } } },     
\
+       { 0x9a70, {                                                             
\
+               { 0x0000014a, 0x0000019a }, { 0x000001ab, 0x000001ec } } },     
\
+       { 0x9a74, {                                                             
\
+               { 0x0000018a, 0x000001da }, { 0x000001eb, 0x0000002c } } },     
\
+       { 0x9a78, {                                                             
\
+               { 0x000001ca, 0x0000000e }, { 0x0000002b, 0x00000012 } } },     
\
+       { 0x9a7c, {                                                             
\
+               { 0x0000000a, 0x0000004e }, { 0x0000006b, 0x00000052 } } },     
\
+       { 0x9a80, {                                                             
\
+               { 0x0000004a, 0x0000008e }, { 0x000000ab, 0x00000092 } } },     
\
+       { 0x9a84, {                                                             
\
+               { 0x0000008a, 0x0000015e }, { 0x000001ac, 0x00000193 } } },     
\
+       { 0x9a88, {                                                             
\
+               { 0x000001ba, 0x0000019e }, { 0x000001ec, 0x000001d3 } } },     
\
+       { 0x9a8c, {                                                             
\
+               { 0x000001fa, 0x000001de }, { 0x0000002c, 0x00000013 } } },     
\
+       { 0x9a90, {                                                             
\
+               { 0x0000003a, 0x00000009 }, { 0x0000003a, 0x00000053 } } },     
\
+       { 0x9a94, {                                                             
\
+               { 0x0000007a, 0x00000049 }, { 0x0000007a, 0x00000093 } } },     
\
+       { 0x9a98, {                                                             
\
+               { 0x00000186, 0x00000089 }, { 0x000000ba, 0x00000194 } } },     
\
+       { 0x9a9c, {                                                             
\
+               { 0x000001c6, 0x00000179 }, { 0x000001bb, 0x000001d4 } } },     
\
+       { 0x9aa0, {                                                             
\
+               { 0x00000006, 0x000001b9 }, { 0x000001fb, 0x00000014 } } },     
\
+       { 0x9aa4, {                                                             
\
+               { 0x00000046, 0x000001f9 }, { 0x0000003b, 0x0000003a } } },     
\
+       { 0x9aa8, {                                                             
\
+               { 0x00000086, 0x00000039 }, { 0x0000007b, 0x0000007a } } },     
\
+       { 0x9aac, {                                                             
\
+               { 0x000000c6, 0x00000079 }, { 0x000000bb, 0x000000ba } } },     
\
+       { 0x9ab0, {                                                             
\
+               { 0x000000c6, 0x000000b9 }, { 0x000001bc, 0x000001bb } } },     
\
+       { 0x9ab4, {                                                             
\
+               { 0x000000c6, 0x000001bd }, { 0x000001fc, 0x000001fb } } },     
\
+       { 0x9ab8, {                                                             
\
+               { 0x000000c6, 0x000001fd }, { 0x0000003c, 0x0000003b } } },     
\
+       { 0x9abc, {                                                             
\
+               { 0x000000c6, 0x0000003d }, { 0x0000007c, 0x0000007b } } },     
\
+       { 0x9ac0, {                                                             
\
+               { 0x000000c6, 0x0000007d }, { 0x000000bc, 0x000000bb } } },     
\
+       { 0x9ac4, {                                                             
\
+               { 0x000000c6, 0x000000bd }, { 0x000000fc, 0x000001bc } } },     
\
+       { 0x9ac8, {                                                             
\
+               { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x000001fc } } },     
\
+       { 0x9acc, {                                                             
\
+               { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x0000003c } } },     
\
+       { 0x9ad0, {                                                             
\
+               { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x0000007c } } },     
\
+       { 0x9ad4, {                                                             
\
+               { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x000000bc } } },     
\
+       { 0x9ad8, {                                                             
\
+               { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x000000fc } } },     
\
+       { 0x9adc, {                                                             
\
+               { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x000000fc } } },     
\
+       { 0x9ae0, {                                                             
\
+               { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x000000fc } } },     
\
+       { 0x9ae4, {                                                             
\
+               { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x000000fc } } },     
\
+       { 0x9ae8, {                                                             
\
+               { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x000000fc } } },     
\
+       { 0x9aec, {                                                             
\
+               { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x000000fc } } },     
\
+       { 0x9af0, {                                                             
\
+               { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x000000fc } } },     
\
+       { 0x9af4, {                                                             
\
+               { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x000000fc } } },     
\
+       { 0x9af8, {                                                             
\
+               { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x000000fc } } },     
\
+       { 0x9afc, {                                                             
\
+               { 0x000000c6, 0x000000fd }, { 0x000000fc, 0x000000fc } } },     
\
+}
+
+#define AR5K_DESC_RX_PHY_ERROR_NONE            0x00
+#define AR5K_DESC_RX_PHY_ERROR_TIMING          0x20
+#define AR5K_DESC_RX_PHY_ERROR_PARITY          0x40
+#define AR5K_DESC_RX_PHY_ERROR_RATE            0x60
+#define AR5K_DESC_RX_PHY_ERROR_LENGTH          0x80
+#define AR5K_DESC_RX_PHY_ERROR_64QAM           0xa0
+#define AR5K_DESC_RX_PHY_ERROR_SERVICE         0xc0
+#define AR5K_DESC_RX_PHY_ERROR_TRANSMITOVR     0xe0
+
+/*
+ * Initial register values which have to be loaded into the
+ * card at boot time and after each reset.
+ */
+
+#define AR5K_AR5211_INI {                                              \
+       { 0x000c, 0x00000000 },                                         \
+       { 0x0028, 0x84849c9c },                                         \
+       { 0x002c, 0x7c7c7c7c },                                         \
+       { 0x0034, 0x00000005 },                                         \
+       { 0x0040, 0x00000000 },                                         \
+       { 0x0044, 0x00000008 },                                         \
+       { 0x0048, 0x00000008 },                                         \
+       { 0x004c, 0x00000010 },                                         \
+       { 0x0050, 0x00000000 },                                         \
+       { 0x0054, 0x0000001f },                                         \
+       { 0x0800, 0x00000000 },                                         \
+       { 0x0804, 0x00000000 },                                         \
+       { 0x0808, 0x00000000 },                                         \
+       { 0x080c, 0x00000000 },                                         \
+       { 0x0810, 0x00000000 },                                         \
+       { 0x0814, 0x00000000 },                                         \
+       { 0x0818, 0x00000000 },                                         \
+       { 0x081c, 0x00000000 },                                         \
+       { 0x0820, 0x00000000 },                                         \
+       { 0x0824, 0x00000000 },                                         \
+       { 0x1230, 0x00000000 },                                         \
+       { 0x8004, 0x00000000 },                                         \
+       { 0x8008, 0x00000000 },                                         \
+       { 0x800c, 0x00000000 },                                         \
+       { 0x8018, 0x00000000 },                                         \
+       { 0x8024, 0x00000000 },                                         \
+       { 0x8028, 0x00000030 },                                         \
+       { 0x802c, 0x0007ffff },                                         \
+       { 0x8030, 0x01ffffff },                                         \
+       { 0x8034, 0x00000031 },                                         \
+       { 0x8038, 0x00000000 },                                         \
+       { 0x803c, 0x00000000 },                                         \
+       { 0x8040, 0x00000000 },                                         \
+       { 0x8044, 0x00000002 },                                         \
+       { 0x8048, 0x00000000 },                                         \
+       { 0x8054, 0x00000000 },                                         \
+       { 0x8058, 0x00000000 },                                         \
+        /* PHY registers */                                            \
+       { 0x9808, 0x00000000 },                                         \
+       { 0x980c, 0x2d849093 },                                         \
+       { 0x9810, 0x7d32e000 },                                         \
+       { 0x9814, 0x00000f6b },                                         \
+       { 0x981c, 0x00000000 },                                         \
+       { 0x982c, 0x00026ffe },                                         \
+       { 0x9830, 0x00000000 },                                         \
+       { 0x983c, 0x00020100 },                                         \
+       { 0x9840, 0x206a017a },                                         \
+       { 0x984c, 0x1284613c },                                         \
+       { 0x9854, 0x00000859 },                                         \
+       { 0x9868, 0x409a4190 },                                         \
+       { 0x986c, 0x050cb081 },                                         \
+       { 0x9870, 0x0000000f },                                         \
+       { 0x9874, 0x00000080 },                                         \
+       { 0x9878, 0x0000000c },                                         \
+       { 0x9900, 0x00000000 },                                         \
+       { 0x9904, 0x00000000 },                                         \
+       { 0x9908, 0x00000000 },                                         \
+       { 0x990c, 0x00800000 },                                         \
+       { 0x9910, 0x00000001 },                                         \
+       { 0x991c, 0x0000092a },                                         \
+       { 0x9920, 0x00000000 },                                         \
+       { 0x9924, 0x00058a05 },                                         \
+       { 0x9928, 0x00000001 },                                         \
+       { 0x992c, 0x00000000 },                                         \
+       { 0x9930, 0x00000000 },                                         \
+       { 0x9934, 0x00000000 },                                         \
+       { 0x9938, 0x00000000 },                                         \
+       { 0x993c, 0x0000003f },                                         \
+       { 0x9940, 0x00000004 },                                         \
+       { 0x9948, 0x00000000 },                                         \
+       { 0x994c, 0x00000000 },                                         \
+       { 0x9950, 0x00000000 },                                         \
+       { 0x9954, 0x5d50f14c },                                         \
+       { 0x9958, 0x00000018 },                                         \
+       { 0x995c, 0x004b6a8e },                                         \
+       { 0xa184, 0x06ff05ff },                                         \
+       { 0xa188, 0x07ff07ff },                                         \
+       { 0xa18c, 0x08ff08ff },                                         \
+       { 0xa190, 0x09ff09ff },                                         \
+       { 0xa194, 0x0aff0aff },                                         \
+       { 0xa198, 0x0bff0bff },                                         \
+       { 0xa19c, 0x0cff0cff },                                         \
+       { 0xa1a0, 0x0dff0dff },                                         \
+       { 0xa1a4, 0x0fff0eff },                                         \
+       { 0xa1a8, 0x12ff12ff },                                         \
+       { 0xa1ac, 0x14ff13ff },                                         \
+       { 0xa1b0, 0x16ff15ff },                                         \
+       { 0xa1b4, 0x19ff17ff },                                         \
+       { 0xa1b8, 0x1bff1aff },                                         \
+       { 0xa1bc, 0x1eff1dff },                                         \
+       { 0xa1c0, 0x23ff20ff },                                         \
+       { 0xa1c4, 0x27ff25ff },                                         \
+       { 0xa1c8, 0x2cff29ff },                                         \
+       { 0xa1cc, 0x31ff2fff },                                         \
+       { 0xa1d0, 0x37ff34ff },                                         \
+       { 0xa1d4, 0x3aff3aff },                                         \
+       { 0xa1d8, 0x3aff3aff },                                         \
+       { 0xa1dc, 0x3aff3aff },                                         \
+       { 0xa1e0, 0x3aff3aff },                                         \
+       { 0xa1e4, 0x3aff3aff },                                         \
+       { 0xa1e8, 0x3aff3aff },                                         \
+       { 0xa1ec, 0x3aff3aff },                                         \
+       { 0xa1f0, 0x3aff3aff },                                         \
+       { 0xa1f4, 0x3aff3aff },                                         \
+       { 0xa1f8, 0x3aff3aff },                                         \
+       { 0xa1fc, 0x3aff3aff },                                         \
+        /* BB gain table (64bytes) */                                  \
+       { 0x9b00, 0x00000000 },                                         \
+       { 0x9b04, 0x00000020 },                                         \
+       { 0x9b08, 0x00000010 },                                         \
+       { 0x9b0c, 0x00000030 },                                         \
+       { 0x9b10, 0x00000008 },                                         \
+       { 0x9b14, 0x00000028 },                                         \
+       { 0x9b18, 0x00000004 },                                         \
+       { 0x9b1c, 0x00000024 },                                         \
+       { 0x9b20, 0x00000014 },                                         \
+       { 0x9b24, 0x00000034 },                                         \
+       { 0x9b28, 0x0000000c },                                         \
+       { 0x9b2c, 0x0000002c },                                         \
+       { 0x9b30, 0x00000002 },                                         \
+       { 0x9b34, 0x00000022 },                                         \
+       { 0x9b38, 0x00000012 },                                         \
+       { 0x9b3c, 0x00000032 },                                         \
+       { 0x9b40, 0x0000000a },                                         \
+       { 0x9b44, 0x0000002a },                                         \
+       { 0x9b48, 0x00000006 },                                         \
+       { 0x9b4c, 0x00000026 },                                         \
+       { 0x9b50, 0x00000016 },                                         \
+       { 0x9b54, 0x00000036 },                                         \
+       { 0x9b58, 0x0000000e },                                         \
+       { 0x9b5c, 0x0000002e },                                         \
+       { 0x9b60, 0x00000001 },                                         \
+       { 0x9b64, 0x00000021 },                                         \
+       { 0x9b68, 0x00000011 },                                         \
+       { 0x9b6c, 0x00000031 },                                         \
+       { 0x9b70, 0x00000009 },                                         \
+       { 0x9b74, 0x00000029 },                                         \
+       { 0x9b78, 0x00000005 },                                         \
+       { 0x9b7c, 0x00000025 },                                         \
+       { 0x9b80, 0x00000015 },                                         \
+       { 0x9b84, 0x00000035 },                                         \
+       { 0x9b88, 0x0000000d },                                         \
+       { 0x9b8c, 0x0000002d },                                         \
+       { 0x9b90, 0x00000003 },                                         \
+       { 0x9b94, 0x00000023 },                                         \
+       { 0x9b98, 0x00000013 },                                         \
+       { 0x9b9c, 0x00000033 },                                         \
+       { 0x9ba0, 0x0000000b },                                         \
+       { 0x9ba4, 0x0000002b },                                         \
+       { 0x9ba8, 0x0000002b },                                         \
+       { 0x9bac, 0x0000002b },                                         \
+       { 0x9bb0, 0x0000002b },                                         \
+       { 0x9bb4, 0x0000002b },                                         \
+       { 0x9bb8, 0x0000002b },                                         \
+       { 0x9bbc, 0x0000002b },                                         \
+       { 0x9bc0, 0x0000002b },                                         \
+       { 0x9bc4, 0x0000002b },                                         \
+       { 0x9bc8, 0x0000002b },                                         \
+       { 0x9bcc, 0x0000002b },                                         \
+       { 0x9bd0, 0x0000002b },                                         \
+       { 0x9bd4, 0x0000002b },                                         \
+       { 0x9bd8, 0x0000002b },                                         \
+       { 0x9bdc, 0x0000002b },                                         \
+       { 0x9be0, 0x0000002b },                                         \
+       { 0x9be4, 0x0000002b },                                         \
+       { 0x9be8, 0x0000002b },                                         \
+       { 0x9bec, 0x0000002b },                                         \
+       { 0x9bf0, 0x0000002b },                                         \
+       { 0x9bf4, 0x0000002b },                                         \
+       { 0x9bf8, 0x00000002 },                                         \
+       { 0x9bfc, 0x00000016 },                                         \
+        /* PHY activation */                                           \
+       { 0x98d4, 0x00000020 },                                         \
+       { 0x98d8, 0x00601068 },                                         \
+}
+
+struct ath5k_ar5212_ini {
+       u_int8_t        ini_flags;
+       u_int16_t       ini_register;
+       u_int32_t       ini_value;
+
+#define AR5K_INI_FLAG_511X     0x00
+#define        AR5K_INI_FLAG_5111      0x01
+#define AR5K_INI_FLAG_5112     0x02
+#define AR5K_INI_FLAG_BOTH     (AR5K_INI_FLAG_5111 | AR5K_INI_FLAG_5112)
+};
+
+#define AR5K_AR5212_INI {                                              \
+       { AR5K_INI_FLAG_BOTH, 0x000c, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x0034, 0x00000005 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x0040, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x0044, 0x00000008 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x0048, 0x00000008 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x004c, 0x00000010 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x0050, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x0054, 0x0000001f },                     \
+       { AR5K_INI_FLAG_BOTH, 0x0800, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x0804, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x0808, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x080c, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x0810, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x0814, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x0818, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x081c, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x0820, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x0824, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x1230, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x1270, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x1038, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x1078, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x10b8, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x10f8, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x1138, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x1178, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x11b8, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x11f8, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x1238, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x1278, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x12b8, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x12f8, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x1338, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x1378, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x13b8, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x13f8, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x1438, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x1478, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x14b8, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x14f8, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x1538, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x1578, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x15b8, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x15f8, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x1638, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x1678, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x16b8, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x16f8, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x1738, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x1778, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x17b8, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x17f8, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x103c, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x107c, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x10bc, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x10fc, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x113c, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x117c, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x11bc, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x11fc, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x123c, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x127c, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x12bc, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x12fc, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x133c, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x137c, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x13bc, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x13fc, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x143c, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x147c, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8004, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8008, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x800c, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8018, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8020, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8024, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8028, 0x00000030 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x802c, 0x0007ffff },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8030, 0x01ffffff },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8034, 0x00000031 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8038, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x803c, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8048, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8054, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8058, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x805c, 0xffffc7ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8080, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8084, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8088, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x808c, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8090, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8094, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8098, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x80c0, 0x2a82301a },                     \
+       { AR5K_INI_FLAG_BOTH, 0x80c4, 0x05dc01e0 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x80c8, 0x1f402710 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x80cc, 0x01f40000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x80d0, 0x00001e1c },                     \
+       { AR5K_INI_FLAG_BOTH, 0x80d4, 0x0002aaaa },                     \
+       { AR5K_INI_FLAG_BOTH, 0x80d8, 0x02005555 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x80dc, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x80e0, 0xffffffff },                     \
+       { AR5K_INI_FLAG_BOTH, 0x80e4, 0x0000ffff },                     \
+       { AR5K_INI_FLAG_BOTH, 0x80e8, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x80ec, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x80f0, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x80f4, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x80f8, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x80fc, 0x00000088 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8700, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8704, 0x0000008c },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8708, 0x000000e4 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x870c, 0x000002d5 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8710, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8714, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8718, 0x000000a0 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x871c, 0x000001c9 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8720, 0x0000002c },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8724, 0x0000002c },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8728, 0x00000030 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x872c, 0x0000003c },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8730, 0x0000002c },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8734, 0x0000002c },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8738, 0x00000030 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x873c, 0x0000003c },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8740, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8744, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8748, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x874c, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8750, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8754, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8758, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x875c, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8760, 0x000000d5 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8764, 0x000000df },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8768, 0x00000102 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x876c, 0x0000013a },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8770, 0x00000075 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8774, 0x0000007f },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8778, 0x000000a2 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x877c, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8100, 0x00010002 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8104, 0x00000001 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8108, 0x000000c0 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x810c, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8110, 0x00000168 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x8114, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x87c0, 0x03020100 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x87c4, 0x07060504 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x87c8, 0x0b0a0908 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x87cc, 0x0f0e0d0c },                     \
+       { AR5K_INI_FLAG_BOTH, 0x87d0, 0x13121110 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x87d4, 0x17161514 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x87d8, 0x1b1a1918 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x87dc, 0x1f1e1d1c },                     \
+       { AR5K_INI_FLAG_BOTH, 0x87e0, 0x03020100 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x87e4, 0x07060504 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x87e8, 0x0b0a0908 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x87ec, 0x0f0e0d0c },                     \
+       { AR5K_INI_FLAG_BOTH, 0x87f0, 0x13121110 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x87f4, 0x17161514 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x87f8, 0x1b1a1918 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x87fc, 0x1f1e1d1c },                     \
+       /* PHY registers */                                             \
+       { AR5K_INI_FLAG_BOTH, 0x9808, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x980c, 0xad848e19 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x9810, 0x7d28e000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x9814, 0x9c0a9f6b },                     \
+       { AR5K_INI_FLAG_BOTH, 0x981c, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x982c, 0x00022ffe },                     \
+       { AR5K_INI_FLAG_BOTH, 0x983c, 0x00020100 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x9840, 0x206a017a },                     \
+       { AR5K_INI_FLAG_BOTH, 0x984c, 0x1284613c },                     \
+       { AR5K_INI_FLAG_BOTH, 0x9854, 0x00000859 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x9900, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x9904, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x9908, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x990c, 0x00800000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x9910, 0x00000001 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x991c, 0x0000092a },                     \
+       { AR5K_INI_FLAG_BOTH, 0x9920, 0x05100000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x9928, 0x00000001 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x992c, 0x00000004 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x9934, 0x1e1f2022 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x9938, 0x0a0b0c0d },                     \
+       { AR5K_INI_FLAG_BOTH, 0x993c, 0x0000003f },                     \
+       { AR5K_INI_FLAG_BOTH, 0x9940, 0x00000004 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x9948, 0x9280b212 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x9954, 0x5d50e188 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x9958, 0x000000ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0x995c, 0x004b6a8e },                     \
+       { AR5K_INI_FLAG_BOTH, 0x9968, 0x000003ce },                     \
+       { AR5K_INI_FLAG_BOTH, 0x9970, 0x192fb515 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x9974, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x9978, 0x00000001 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x997c, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa184, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa188, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa18c, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa190, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa194, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa198, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa19c, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa1a0, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa1a4, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa1a8, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa1ac, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa1b0, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa1b4, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa1b8, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa1bc, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa1c0, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa1c4, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa1c8, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa1cc, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa1d0, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa1d4, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa1d8, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa1dc, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa1e0, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa1e4, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa1e8, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa1ec, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa1f0, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa1f4, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa1f8, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa1fc, 0x10ff10ff },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa210, 0x0080a333 },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa214, 0x00206c10 },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa218, 0x009c4060 },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa21c, 0x1483800a },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa220, 0x01831061 },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa224, 0x00000400 },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa228, 0x000001b5 },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa22c, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa234, 0x20202020 },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa238, 0x20202020 },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa23c, 0x13c889af },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa240, 0x38490a20 },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa244, 0x00007bb6 },                     \
+       { AR5K_INI_FLAG_BOTH, 0xa248, 0x0fff3ffc },                     \
+       { AR5K_INI_FLAG_BOTH, 0x9b00, 0x00000000 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x9b28, 0x0000000c },                     \
+       { AR5K_INI_FLAG_BOTH, 0x9b38, 0x00000012 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x9b64, 0x00000021 },                     \
+       { AR5K_INI_FLAG_BOTH, 0x9b8c, 0x0000002d },                     \
+       { AR5K_INI_FLAG_BOTH, 0x9b9c, 0x00000033 },                     \
+       /* AR5111 specific */                                           \
+       { AR5K_INI_FLAG_5111, 0x9930, 0x00004883 },                     \
+       { AR5K_INI_FLAG_5111, 0xa204, 0x00000000 },                     \
+       { AR5K_INI_FLAG_5111, 0xa208, 0xd03e6788 },                     \
+       { AR5K_INI_FLAG_5111, 0xa20c, 0x6448416a },                     \
+       { AR5K_INI_FLAG_5111, 0x9b04, 0x00000020 },                     \
+       { AR5K_INI_FLAG_5111, 0x9b08, 0x00000010 },                     \
+       { AR5K_INI_FLAG_5111, 0x9b0c, 0x00000030 },                     \
+       { AR5K_INI_FLAG_5111, 0x9b10, 0x00000008 },                     \
+       { AR5K_INI_FLAG_5111, 0x9b14, 0x00000028 },                     \
+       { AR5K_INI_FLAG_5111, 0x9b18, 0x00000004 },                     \
+       { AR5K_INI_FLAG_5111, 0x9b1c, 0x00000024 },                     \
+       { AR5K_INI_FLAG_5111, 0x9b20, 0x00000014 },                     \
+       { AR5K_INI_FLAG_5111, 0x9b24, 0x00000034 },                     \
+       { AR5K_INI_FLAG_5111, 0x9b2c, 0x0000002c },                     \
+       { AR5K_INI_FLAG_5111, 0x9b30, 0x00000002 },                     \
+       { AR5K_INI_FLAG_5111, 0x9b34, 0x00000022 },                     \
+       { AR5K_INI_FLAG_5111, 0x9b3c, 0x00000032 },                     \
+       { AR5K_INI_FLAG_5111, 0x9b40, 0x0000000a },                     \
+       { AR5K_INI_FLAG_5111, 0x9b44, 0x0000002a },                     \
+       { AR5K_INI_FLAG_5111, 0x9b48, 0x00000006 },                     \
+       { AR5K_INI_FLAG_5111, 0x9b4c, 0x00000026 },                     \
+       { AR5K_INI_FLAG_5111, 0x9b50, 0x00000016 },                     \
+       { AR5K_INI_FLAG_5111, 0x9b54, 0x00000036 },                     \
+       { AR5K_INI_FLAG_5111, 0x9b58, 0x0000000e },                     \
+       { AR5K_INI_FLAG_5111, 0x9b5c, 0x0000002e },                     \
+       { AR5K_INI_FLAG_5111, 0x9b60, 0x00000001 },                     \
+       { AR5K_INI_FLAG_5111, 0x9b68, 0x00000011 },                     \
+       { AR5K_INI_FLAG_5111, 0x9b6c, 0x00000031 },                     \
+       { AR5K_INI_FLAG_5111, 0x9b70, 0x00000009 },                     \
+       { AR5K_INI_FLAG_5111, 0x9b74, 0x00000029 },                     \
+       { AR5K_INI_FLAG_5111, 0x9b78, 0x00000005 },                     \
+       { AR5K_INI_FLAG_5111, 0x9b7c, 0x00000025 },                     \
+       { AR5K_INI_FLAG_5111, 0x9b80, 0x00000015 },                     \
+       { AR5K_INI_FLAG_5111, 0x9b84, 0x00000035 },                     \
+       { AR5K_INI_FLAG_5111, 0x9b88, 0x0000000d },                     \
+       { AR5K_INI_FLAG_5111, 0x9b90, 0x00000003 },                     \
+       { AR5K_INI_FLAG_5111, 0x9b94, 0x00000023 },                     \
+       { AR5K_INI_FLAG_5111, 0x9b98, 0x00000013 },                     \
+       { AR5K_INI_FLAG_5111, 0x9ba0, 0x0000000b },                     \
+       { AR5K_INI_FLAG_5111, 0x9ba4, 0x0000002b },                     \
+       { AR5K_INI_FLAG_5111, 0x9ba8, 0x0000002b },                     \
+       { AR5K_INI_FLAG_5111, 0x9bac, 0x0000002b },                     \
+       { AR5K_INI_FLAG_5111, 0x9bb0, 0x0000002b },                     \
+       { AR5K_INI_FLAG_5111, 0x9bb4, 0x0000002b },                     \
+       { AR5K_INI_FLAG_5111, 0x9bb8, 0x0000002b },                     \
+       { AR5K_INI_FLAG_5111, 0x9bbc, 0x0000002b },                     \
+       { AR5K_INI_FLAG_5111, 0x9bc0, 0x0000002b },                     \
+       { AR5K_INI_FLAG_5111, 0x9bc4, 0x0000002b },                     \
+       { AR5K_INI_FLAG_5111, 0x9bc8, 0x0000002b },                     \
+       { AR5K_INI_FLAG_5111, 0x9bcc, 0x0000002b },                     \
+       { AR5K_INI_FLAG_5111, 0x9bd0, 0x0000002b },                     \
+       { AR5K_INI_FLAG_5111, 0x9bd4, 0x0000002b },                     \
+       { AR5K_INI_FLAG_5111, 0x9bd8, 0x0000002b },                     \
+       { AR5K_INI_FLAG_5111, 0x9bdc, 0x0000002b },                     \
+       { AR5K_INI_FLAG_5111, 0x9be0, 0x0000002b },                     \
+       { AR5K_INI_FLAG_5111, 0x9be4, 0x0000002b },                     \
+       { AR5K_INI_FLAG_5111, 0x9be8, 0x0000002b },                     \
+       { AR5K_INI_FLAG_5111, 0x9bec, 0x0000002b },                     \
+       { AR5K_INI_FLAG_5111, 0x9bf0, 0x0000002b },                     \
+       { AR5K_INI_FLAG_5111, 0x9bf4, 0x0000002b },                     \
+       { AR5K_INI_FLAG_5111, 0x9bf8, 0x00000002 },                     \
+       { AR5K_INI_FLAG_5111, 0x9bfc, 0x00000016 },                     \
+       /* AR5112 specific */                                           \
+       { AR5K_INI_FLAG_5112, 0x9930, 0x00004882 },                     \
+       { AR5K_INI_FLAG_5112, 0x9b04, 0x00000001 },                     \
+       { AR5K_INI_FLAG_5112, 0x9b08, 0x00000002 },                     \
+       { AR5K_INI_FLAG_5112, 0x9b0c, 0x00000003 },                     \
+       { AR5K_INI_FLAG_5112, 0x9b10, 0x00000004 },                     \
+       { AR5K_INI_FLAG_5112, 0x9b14, 0x00000005 },                     \
+       { AR5K_INI_FLAG_5112, 0x9b18, 0x00000008 },                     \
+       { AR5K_INI_FLAG_5112, 0x9b1c, 0x00000009 },                     \
+       { AR5K_INI_FLAG_5112, 0x9b20, 0x0000000a },                     \
+       { AR5K_INI_FLAG_5112, 0x9b24, 0x0000000b },                     \
+       { AR5K_INI_FLAG_5112, 0x9b2c, 0x0000000d },                     \
+       { AR5K_INI_FLAG_5112, 0x9b30, 0x00000010 },                     \
+       { AR5K_INI_FLAG_5112, 0x9b34, 0x00000011 },                     \
+       { AR5K_INI_FLAG_5112, 0x9b3c, 0x00000013 },                     \
+       { AR5K_INI_FLAG_5112, 0x9b40, 0x00000014 },                     \
+       { AR5K_INI_FLAG_5112, 0x9b44, 0x00000015 },                     \
+       { AR5K_INI_FLAG_5112, 0x9b48, 0x00000018 },                     \
+       { AR5K_INI_FLAG_5112, 0x9b4c, 0x00000019 },                     \
+       { AR5K_INI_FLAG_5112, 0x9b50, 0x0000001a },                     \
+       { AR5K_INI_FLAG_5112, 0x9b54, 0x0000001b },                     \
+       { AR5K_INI_FLAG_5112, 0x9b58, 0x0000001c },                     \
+       { AR5K_INI_FLAG_5112, 0x9b5c, 0x0000001d },                     \
+       { AR5K_INI_FLAG_5112, 0x9b60, 0x00000020 },                     \
+       { AR5K_INI_FLAG_5112, 0x9b68, 0x00000022 },                     \
+       { AR5K_INI_FLAG_5112, 0x9b6c, 0x00000023 },                     \
+       { AR5K_INI_FLAG_5112, 0x9b70, 0x00000024 },                     \
+       { AR5K_INI_FLAG_5112, 0x9b74, 0x00000025 },                     \
+       { AR5K_INI_FLAG_5112, 0x9b78, 0x00000028 },                     \
+       { AR5K_INI_FLAG_5112, 0x9b7c, 0x00000029 },                     \
+       { AR5K_INI_FLAG_5112, 0x9b80, 0x0000002a },                     \
+       { AR5K_INI_FLAG_5112, 0x9b84, 0x0000002b },                     \
+       { AR5K_INI_FLAG_5112, 0x9b88, 0x0000002c },                     \
+       { AR5K_INI_FLAG_5112, 0x9b90, 0x00000030 },                     \
+       { AR5K_INI_FLAG_5112, 0x9b94, 0x00000031 },                     \
+       { AR5K_INI_FLAG_5112, 0x9b98, 0x00000032 },                     \
+       { AR5K_INI_FLAG_5112, 0x9ba0, 0x00000034 },                     \
+       { AR5K_INI_FLAG_5112, 0x9ba4, 0x00000035 },                     \
+       { AR5K_INI_FLAG_5112, 0x9ba8, 0x00000035 },                     \
+       { AR5K_INI_FLAG_5112, 0x9bac, 0x00000035 },                     \
+       { AR5K_INI_FLAG_5112, 0x9bb0, 0x00000035 },                     \
+       { AR5K_INI_FLAG_5112, 0x9bb4, 0x00000035 },                     \
+       { AR5K_INI_FLAG_5112, 0x9bb8, 0x00000035 },                     \
+       { AR5K_INI_FLAG_5112, 0x9bbc, 0x00000035 },                     \
+       { AR5K_INI_FLAG_5112, 0x9bc0, 0x00000035 },                     \
+       { AR5K_INI_FLAG_5112, 0x9bc4, 0x00000035 },                     \
+       { AR5K_INI_FLAG_5112, 0x9bc8, 0x00000035 },                     \
+       { AR5K_INI_FLAG_5112, 0x9bcc, 0x00000035 },                     \
+       { AR5K_INI_FLAG_5112, 0x9bd0, 0x00000035 },                     \
+       { AR5K_INI_FLAG_5112, 0x9bd4, 0x00000035 },                     \
+       { AR5K_INI_FLAG_5112, 0x9bd8, 0x00000035 },                     \
+       { AR5K_INI_FLAG_5112, 0x9bdc, 0x00000035 },                     \
+       { AR5K_INI_FLAG_5112, 0x9be0, 0x00000035 },                     \
+       { AR5K_INI_FLAG_5112, 0x9be4, 0x00000035 },                     \
+       { AR5K_INI_FLAG_5112, 0x9be8, 0x00000035 },                     \
+       { AR5K_INI_FLAG_5112, 0x9bec, 0x00000035 },                     \
+       { AR5K_INI_FLAG_5112, 0x9bf0, 0x00000035 },                     \
+       { AR5K_INI_FLAG_5112, 0x9bf4, 0x00000035 },                     \
+       { AR5K_INI_FLAG_5112, 0x9bf8, 0x00000010 },                     \
+       { AR5K_INI_FLAG_5112, 0x9bfc, 0x0000001a },                     \
+}
+
+struct ath5k_ar5211_ini_mode {
+       u_int16_t       mode_register;
+       u_int32_t       mode_value[4];
+};
+
+#define AR5K_AR5211_INI_MODE {                                         \
+       { 0x0030, { 0x00000017, 0x00000017, 0x00000017, 0x00000017 } }, \
+       { 0x1040, { 0x002ffc0f, 0x002ffc0f, 0x002ffc1f, 0x002ffc0f } }, \
+       { 0x1044, { 0x002ffc0f, 0x002ffc0f, 0x002ffc1f, 0x002ffc0f } }, \
+       { 0x1048, { 0x002ffc0f, 0x002ffc0f, 0x002ffc1f, 0x002ffc0f } }, \
+       { 0x104c, { 0x002ffc0f, 0x002ffc0f, 0x002ffc1f, 0x002ffc0f } }, \
+       { 0x1050, { 0x002ffc0f, 0x002ffc0f, 0x002ffc1f, 0x002ffc0f } }, \
+       { 0x1054, { 0x002ffc0f, 0x002ffc0f, 0x002ffc1f, 0x002ffc0f } }, \
+       { 0x1058, { 0x002ffc0f, 0x002ffc0f, 0x002ffc1f, 0x002ffc0f } }, \
+       { 0x105c, { 0x002ffc0f, 0x002ffc0f, 0x002ffc1f, 0x002ffc0f } }, \
+       { 0x1060, { 0x002ffc0f, 0x002ffc0f, 0x002ffc1f, 0x002ffc0f } }, \
+       { 0x1064, { 0x002ffc0f, 0x002ffc0f, 0x002ffc1f, 0x002ffc0f } }, \
+       { 0x1070, { 0x00000168, 0x000001e0, 0x000001b8, 0x00000168 } }, \
+       { 0x1030, { 0x00000230, 0x000001e0, 0x000000b0, 0x00000230 } }, \
+       { 0x10b0, { 0x00000d98, 0x00001180, 0x00001f48, 0x00000d98 } }, \
+       { 0x10f0, { 0x0000a0e0, 0x00014068, 0x00005880, 0x0000a0e0 } }, \
+       { 0x8014, { 0x04000400, 0x08000800, 0x20003000, 0x04000400 } }, \
+       { 0x801c, { 0x0e8d8fa7, 0x0e8d8fcf, 0x01608f95, 0x0e8d8fa7 } }, \
+       { 0x9804, { 0x00000000, 0x00000003, 0x00000000, 0x00000000 } }, \
+       { 0x9820, { 0x02020200, 0x02020200, 0x02010200, 0x02020200 } }, \
+       { 0x9824, { 0x00000e0e, 0x00000e0e, 0x00000707, 0x00000e0e } }, \
+       { 0x9828, { 0x0a020001, 0x0a020001, 0x05010000, 0x0a020001 } }, \
+       { 0x9834, { 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e } }, \
+       { 0x9838, { 0x00000007, 0x00000007, 0x0000000b, 0x0000000b } }, \
+       { 0x9844, { 0x1372169c, 0x137216a5, 0x137216a8, 0x1372169c } }, \
+       { 0x9848, { 0x0018ba67, 0x0018ba67, 0x0018ba69, 0x0018ba69 } }, \
+       { 0x9850, { 0x0c28b4e0, 0x0c28b4e0, 0x0c28b4e0, 0x0c28b4e0 } }, \
+       { 0x9858, { 0x7e800d2e, 0x7e800d2e, 0x7ec00d2e, 0x7e800d2e } }, \
+       { 0x985c, { 0x31375d5e, 0x31375d5e, 0x313a5d5e, 0x31375d5e } }, \
+       { 0x9860, { 0x0000bd10, 0x0000bd10, 0x0000bd38, 0x0000bd10 } }, \
+       { 0x9864, { 0x0001ce00, 0x0001ce00, 0x0001ce00, 0x0001ce00 } }, \
+       { 0x9914, { 0x00002710, 0x00002710, 0x0000157c, 0x00002710 } }, \
+       { 0x9918, { 0x00000190, 0x00000190, 0x00000084, 0x00000190 } }, \
+       { 0x9944, { 0x6fe01020, 0x6fe01020, 0x6fe00920, 0x6fe01020 } }, \
+       { 0xa180, { 0x05ff14ff, 0x05ff14ff, 0x05ff14ff, 0x05ff19ff } }, \
+       { 0x98d4, { 0x00000010, 0x00000014, 0x00000010, 0x00000010 } }, \
+}
+
+struct ath5k_ar5212_ini_mode {
+       u_int16_t       mode_register;
+       u_int8_t        mode_flags;
+       u_int32_t       mode_value[2][5];
+};
+
+#define AR5K_AR5212_INI_MODE {                                                 
\
+       { 0x0030, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x00008107, 0x00008107, 0x00008107, 0x00008107, 0x00008107 }  
\
+       } },                                                                    
\
+       { 0x1040, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x002ffc0f, 0x002ffc0f, 0x002ffc1f, 0x002ffc0f, 0x002ffc0f }  
\
+       } },                                                                    
\
+       { 0x1044, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x002ffc0f, 0x002ffc0f, 0x002ffc1f, 0x002ffc0f, 0x002ffc0f }  
\
+       } },                                                                    
\
+       { 0x1048, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x002ffc0f, 0x002ffc0f, 0x002ffc1f, 0x002ffc0f, 0x002ffc0f }  
\
+       } },                                                                    
\
+       { 0x104c, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x002ffc0f, 0x002ffc0f, 0x002ffc1f, 0x002ffc0f, 0x002ffc0f }  
\
+       } },                                                                    
\
+       { 0x1050, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x002ffc0f, 0x002ffc0f, 0x002ffc1f, 0x002ffc0f, 0x002ffc0f }  
\
+       } },                                                                    
\
+       { 0x1054, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x002ffc0f, 0x002ffc0f, 0x002ffc1f, 0x002ffc0f, 0x002ffc0f }  
\
+       } },                                                                    
\
+       { 0x1058, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x002ffc0f, 0x002ffc0f, 0x002ffc1f, 0x002ffc0f, 0x002ffc0f }  
\
+       } },                                                                    
\
+       { 0x105c, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x002ffc0f, 0x002ffc0f, 0x002ffc1f, 0x002ffc0f, 0x002ffc0f }  
\
+       } },                                                                    
\
+       { 0x1060, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x002ffc0f, 0x002ffc0f, 0x002ffc1f, 0x002ffc0f, 0x002ffc0f }  
\
+       } },                                                                    
\
+       { 0x1064, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x002ffc0f, 0x002ffc0f, 0x002ffc1f, 0x002ffc0f, 0x002ffc0f }  
\
+       } },                                                                    
\
+       { 0x1030, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x00000230, 0x000001e0, 0x000000b0, 0x00000160, 0x000001e0 }  
\
+       } },                                                                    
\
+       { 0x1070, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x00000168, 0x000001e0, 0x000001b8, 0x0000018c, 0x000001e0 }  
\
+       } },                                                                    
\
+       { 0x10b0, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x00000e60, 0x00001180, 0x00001f1c, 0x00003e38, 0x00001180 }  
\
+       } },                                                                    
\
+       { 0x10f0, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x0000a0e0, 0x00014068, 0x00005880, 0x0000b0e0, 0x00014068 }  
\
+       } },                                                                    
\
+       { 0x8014, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x03e803e8, 0x06e006e0, 0x04200420, 0x08400840, 0x06e006e0 }  
\
+       } },                                                                    
\
+       { 0x9804, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x00000000, 0x00000003, 0x00000000, 0x00000000, 0x00000003 }  
\
+       } },                                                                    
\
+       { 0x9820, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x02020200, 0x02020200, 0x02010200, 0x02020200, 0x02020200 }  
\
+       } },                                                                    
\
+       { 0x9834, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e }  
\
+       } },                                                                    
\
+       { 0x9838, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x00000007, 0x00000007, 0x0000000b, 0x0000000b, 0x0000000b }  
\
+       } },                                                                    
\
+       { 0x9844, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x1372161c, 0x13721c25, 0x13721728, 0x137216a2, 0x13721c25 }  
\
+       } },                                                                    
\
+       { 0x9850, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x0de8b4e0, 0x0de8b4e0, 0x0de8b4e0, 0x0de8b4e0, 0x0de8b4e0 }  
\
+       } },                                                                    
\
+       { 0x9858, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x7e800d2e, 0x7e800d2e, 0x7ee84d2e, 0x7ee84d2e, 0x7e800d2e }  
\
+       } },                                                                    
\
+       { 0x9860, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x00009d10, 0x00009d10, 0x00009d18, 0x00009d10, 0x00009d10 }  
\
+       } },                                                                    
\
+       { 0x9864, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x0001ce00, 0x0001ce00, 0x0001ce00, 0x0001ce00, 0x0001ce00 }  
\
+       } },                                                                    
\
+       { 0x9868, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x409a4190, 0x409a4190, 0x409a4190, 0x409a4190, 0x409a4190 }  
\
+       } },                                                                    
\
+       { 0x9918, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x000001b8, 0x000001b8, 0x00000084, 0x00000108, 0x000001b8 }  
\
+       } },                                                                    
\
+       { 0x9924, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x10058a05, 0x10058a05, 0x10058a05, 0x10058a05, 0x10058a05 }  
\
+       } },                                                                    
\
+       { 0xa180, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x10ff14ff, 0x10ff14ff, 0x10ff10ff, 0x10ff19ff, 0x10ff19ff }  
\
+       } },                                                                    
\
+       { 0xa230, AR5K_INI_FLAG_511X, {                                         
\
+               { 0, },                                                         
\
+               { 0x00000000, 0x00000000, 0x00000000, 0x00000108, 0x00000000 }  
\
+       } },                                                                    
\
+       { 0x801c, AR5K_INI_FLAG_BOTH, {                                         
\
+               { 0x128d8fa7, 0x09880fcf, 0x04e00f95, 0x128d8fab, 0x09880fcf }, 
\
+               { 0x128d93a7, 0x098813cf, 0x04e01395, 0x128d93ab, 0x098813cf }  
\
+       } },                                                                    
\
+       { 0x9824, AR5K_INI_FLAG_BOTH, {                                         
\
+               { 0x00000e0e, 0x00000e0e, 0x00000707, 0x00000e0e, 0x00000e0e }, 
\
+               { 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e }  
\
+       } },                                                                    
\
+       { 0x9828, AR5K_INI_FLAG_BOTH, {                                         
\
+               { 0x0a020001, 0x0a020001, 0x05010100, 0x0a020001, 0x0a020001 }, 
\
+               { 0x0a020001, 0x0a020001, 0x05020100, 0x0a020001, 0x0a020001 }  
\
+       } },                                                                    
\
+       { 0x9848, AR5K_INI_FLAG_BOTH, {                                         
\
+               { 0x0018da5a, 0x0018da5a, 0x0018ca69, 0x0018ca69, 0x0018ca69 }, 
\
+               { 0x0018da6d, 0x0018da6d, 0x0018ca75, 0x0018ca75, 0x0018ca75 }  
\
+       } },                                                                    
\
+       { 0x985c, AR5K_INI_FLAG_BOTH, {                                         
\
+               { 0x3137665e, 0x3137665e, 0x3137665e, 0x3137665e, 0x3137615e }, 
\
+               { 0x3137665e, 0x3137665e, 0x3137665e, 0x3137665e, 0x3137665e }  
\
+       } },                                                                    
\
+       { 0x986c, AR5K_INI_FLAG_BOTH, {                                         
\
+               { 0x050cb081, 0x050cb081, 0x050cb081, 0x050cb080, 0x050cb080 }, 
\
+               { 0x050cb081, 0x050cb081, 0x050cb081, 0x050cb081, 0x050cb081 }  
\
+       } },                                                                    
\
+       { 0x9914, AR5K_INI_FLAG_BOTH, {                                         
\
+               { 0x00002710, 0x00002710, 0x0000157c, 0x00002af8, 0x00002710 }, 
\
+               { 0x000007d0, 0x000007d0, 0x0000044c, 0x00000898, 0x000007d0 }  
\
+       } },                                                                    
\
+       { 0x9944, AR5K_INI_FLAG_BOTH, {                                         
\
+               { 0xffb81020, 0xffb81020, 0xffb80d20, 0xffb81020, 0xffb81020 }, 
\
+               { 0xffb81020, 0xffb81020, 0xffb80d10, 0xffb81010, 0xffb81010 }  
\
+       } },                                                                    
\
+       { 0xa204, AR5K_INI_FLAG_5112, {                                         
\
+               { 0, },                                                         
\
+               { 0x00000000, 0x00000000, 0x00000004, 0x00000004, 0x00000004 }  
\
+       } },                                                                    
\
+       { 0xa208, AR5K_INI_FLAG_5112, {                                         
\
+               { 0, },                                                         
\
+               { 0xd6be6788, 0xd6be6788, 0xd03e6788, 0xd03e6788, 0xd03e6788 }  
\
+       } },                                                                    
\
+       { 0xa20c, AR5K_INI_FLAG_5112, {                                         
\
+               { 0, },                                                         
\
+               { 0x642c0140, 0x642c0140, 0x6442c160, 0x6442c160, 0x6442c160 }  
\
+       } },                                                                    
\
+}
+
+struct ath5k_ar5211_ini_rf {
+       u_int16_t       rf_register;
+       u_int32_t       rf_value[2];
+};
+
+#define AR5K_AR5211_INI_RF     {                                       \
+       { 0x0000a204, { 0x00000000, 0x00000000 } },                     \
+       { 0x0000a208, { 0x503e4646, 0x503e4646 } },                     \
+       { 0x0000a20c, { 0x6480416c, 0x6480416c } },                     \
+       { 0x0000a210, { 0x0199a003, 0x0199a003 } },                     \
+       { 0x0000a214, { 0x044cd610, 0x044cd610 } },                     \
+       { 0x0000a218, { 0x13800040, 0x13800040 } },                     \
+       { 0x0000a21c, { 0x1be00060, 0x1be00060 } },                     \
+       { 0x0000a220, { 0x0c53800a, 0x0c53800a } },                     \
+       { 0x0000a224, { 0x0014df3b, 0x0014df3b } },                     \
+       { 0x0000a228, { 0x000001b5, 0x000001b5 } },                     \
+       { 0x0000a22c, { 0x00000020, 0x00000020 } },                     \
+       { 0x0000989c, { 0x00000000, 0x00000000 } },                     \
+       { 0x0000989c, { 0x00000000, 0x00000000 } },                     \
+       { 0x0000989c, { 0x00000000, 0x00000000 } },                     \
+       { 0x0000989c, { 0x00000000, 0x00000000 } },                     \
+       { 0x0000989c, { 0x00000000, 0x00000000 } },                     \
+       { 0x0000989c, { 0x00000000, 0x00000000 } },                     \
+       { 0x0000989c, { 0x00000000, 0x00000000 } },                     \
+       { 0x0000989c, { 0x00000000, 0x00000000 } },                     \
+       { 0x0000989c, { 0x00000000, 0x00000000 } },                     \
+       { 0x0000989c, { 0x00000000, 0x00000000 } },                     \
+       { 0x0000989c, { 0x00000000, 0x00000000 } },                     \
+       { 0x0000989c, { 0x00380000, 0x00380000 } },                     \
+       { 0x0000989c, { 0x00000000, 0x00000000 } },                     \
+       { 0x0000989c, { 0x00000000, 0x00000000 } },                     \
+       { 0x0000989c, { 0x00000000, 0x00000000 } },                     \
+       { 0x0000989c, { 0x000400f9, 0x000400f9 } },                     \
+       { 0x000098d4, { 0x00000000, 0x00000004 } },                     \
+                                                                       \
+       { 0x0000989c, { 0x00000000, 0x00000000 } },                     \
+       { 0x0000989c, { 0x00000000, 0x00000000 } },                     \
+       { 0x0000989c, { 0x00000000, 0x00000000 } },                     \
+       { 0x0000989c, { 0x00000000, 0x00000000 } },                     \
+       { 0x0000989c, { 0x00000000, 0x00000000 } },                     \
+       { 0x0000989c, { 0x10000000, 0x10000000 } },                     \
+       { 0x0000989c, { 0x04000000, 0x04000000 } },                     \
+       { 0x0000989c, { 0x00000000, 0x00000000 } },                     \
+       { 0x0000989c, { 0x00000000, 0x00000000 } },                     \
+       { 0x0000989c, { 0x00000000, 0x00000000 } },                     \
+       { 0x0000989c, { 0x00000000, 0x0a000000 } },                     \
+       { 0x0000989c, { 0x00380080, 0x02380080 } },                     \
+       { 0x0000989c, { 0x00020006, 0x00000006 } },                     \
+       { 0x0000989c, { 0x00000092, 0x00000092 } },                     \
+       { 0x0000989c, { 0x000000a0, 0x000000a0 } },                     \
+       { 0x0000989c, { 0x00040007, 0x00040007 } },                     \
+       { 0x000098d4, { 0x0000001a, 0x0000001a } },                     \
+       { 0x0000989c, { 0x00000048, 0x00000048 } },                     \
+       { 0x0000989c, { 0x00000010, 0x00000010 } },                     \
+       { 0x0000989c, { 0x00000008, 0x00000008 } },                     \
+       { 0x0000989c, { 0x0000000f, 0x0000000f } },                     \
+       { 0x0000989c, { 0x000000f2, 0x00000062 } },                     \
+       { 0x0000989c, { 0x0000904f, 0x0000904c } },                     \
+       { 0x0000989c, { 0x0000125a, 0x0000129a } },                     \
+       { 0x000098cc, { 0x0000000e, 0x0000000f } },                     \
+}
+
+
+
+
+/*
+ * Internal RX/TX descriptor structures
+ * (rX: reserved fields possibily used by future versions of the ar5k chipset)
+ */
+
+struct ath5k_rx_desc {
+       /*
+        * RX control word 0
+        */
+       u_int32_t       rx_control_0;
+
+#define AR5K_DESC_RX_CTL0                      0x00000000
+
+       /*
+        * RX control word 1
+        */
+       u_int32_t       rx_control_1;
+
+#define AR5K_DESC_RX_CTL1_BUF_LEN              0x00000fff
+#define AR5K_DESC_RX_CTL1_INTREQ                       0x00002000
+} __attribute__((packed));
+
+struct ath5k_ar5211_rx_status {
+       /*
+        * RX status word 0
+        */
+       u_int32_t       rx_status_0;
+
+#define AR5K_AR5211_DESC_RX_STATUS0_DATA_LEN           0x00000fff
+#define AR5K_AR5211_DESC_RX_STATUS0_MORE               0x00001000
+#define AR5K_AR5211_DESC_RX_STATUS0_RECEIVE_RATE       0x00078000
+#define AR5K_AR5211_DESC_RX_STATUS0_RECEIVE_RATE_S     15
+#define AR5K_AR5211_DESC_RX_STATUS0_RECEIVE_SIGNAL     0x07f80000
+#define AR5K_AR5211_DESC_RX_STATUS0_RECEIVE_SIGNAL_S   19
+#define AR5K_AR5211_DESC_RX_STATUS0_RECEIVE_ANTENNA    0x38000000
+#define AR5K_AR5211_DESC_RX_STATUS0_RECEIVE_ANTENNA_S  27
+
+       /*
+        * RX status word 1
+        */
+       u_int32_t       rx_status_1;
+
+#define AR5K_AR5211_DESC_RX_STATUS1_DONE               0x00000001
+#define AR5K_AR5211_DESC_RX_STATUS1_FRAME_RECEIVE_OK   0x00000002
+#define AR5K_AR5211_DESC_RX_STATUS1_CRC_ERROR          0x00000004
+#define AR5K_AR5211_DESC_RX_STATUS1_FIFO_OVERRUN       0x00000008
+#define AR5K_AR5211_DESC_RX_STATUS1_DECRYPT_CRC_ERROR  0x00000010
+#define AR5K_AR5211_DESC_RX_STATUS1_PHY_ERROR          0x000000e0
+#define AR5K_AR5211_DESC_RX_STATUS1_PHY_ERROR_S                5
+#define AR5K_AR5211_DESC_RX_STATUS1_KEY_INDEX_VALID    0x00000100
+#define AR5K_AR5211_DESC_RX_STATUS1_KEY_INDEX          0x00007e00
+#define AR5K_AR5211_DESC_RX_STATUS1_KEY_INDEX_S                9
+#define AR5K_AR5211_DESC_RX_STATUS1_RECEIVE_TIMESTAMP  0x0fff8000
+#define AR5K_AR5211_DESC_RX_STATUS1_RECEIVE_TIMESTAMP_S        15
+#define AR5K_AR5211_DESC_RX_STATUS1_KEY_CACHE_MISS     0x10000000
+} __attribute__((packed));
+
+struct ath5k_ar5212_rx_status {
+       /*
+        * RX status word 0
+        */
+       u_int32_t       rx_status_0;
+
+#define AR5K_AR5212_DESC_RX_STATUS0_DATA_LEN           0x00000fff
+#define AR5K_AR5212_DESC_RX_STATUS0_MORE               0x00001000
+#define AR5K_AR5212_DESC_RX_STATUS0_DECOMP_CRC_ERROR   0x00002000
+#define AR5K_AR5212_DESC_RX_STATUS0_RECEIVE_RATE       0x000f8000
+#define AR5K_AR5212_DESC_RX_STATUS0_RECEIVE_RATE_S     15
+#define AR5K_AR5212_DESC_RX_STATUS0_RECEIVE_SIGNAL     0x0ff00000
+#define AR5K_AR5212_DESC_RX_STATUS0_RECEIVE_SIGNAL_S   20
+#define AR5K_AR5212_DESC_RX_STATUS0_RECEIVE_ANTENNA    0xf0000000
+#define AR5K_AR5212_DESC_RX_STATUS0_RECEIVE_ANTENNA_S  28
+
+       /*
+        * RX status word 1
+        */
+       u_int32_t       rx_status_1;
+
+#define AR5K_AR5212_DESC_RX_STATUS1_DONE               0x00000001
+#define AR5K_AR5212_DESC_RX_STATUS1_FRAME_RECEIVE_OK   0x00000002
+#define AR5K_AR5212_DESC_RX_STATUS1_CRC_ERROR          0x00000004
+#define AR5K_AR5212_DESC_RX_STATUS1_DECRYPT_CRC_ERROR  0x00000008
+#define AR5K_AR5212_DESC_RX_STATUS1_PHY_ERROR          0x00000010
+#define AR5K_AR5212_DESC_RX_STATUS1_MIC_ERROR          0x00000020
+#define AR5K_AR5212_DESC_RX_STATUS1_KEY_INDEX_VALID    0x00000100
+#define AR5K_AR5212_DESC_RX_STATUS1_KEY_INDEX          0x0000fe00
+#define AR5K_AR5212_DESC_RX_STATUS1_KEY_INDEX_S                9
+#define AR5K_AR5212_DESC_RX_STATUS1_RECEIVE_TIMESTAMP  0x7fff0000
+#define AR5K_AR5212_DESC_RX_STATUS1_RECEIVE_TIMESTAMP_S        16
+#define AR5K_AR5212_DESC_RX_STATUS1_KEY_CACHE_MISS     0x80000000
+} __attribute__((packed));
+
+struct ath5k_ar5212_rx_error {
+       /*
+        * RX error word 0
+        */
+       u_int32_t       rx_error_0;
+
+#define AR5K_AR5212_DESC_RX_ERROR0                     0x00000000
+
+       /*
+        * RX error word 1
+        */
+       u_int32_t       rx_error_1;
+
+#define AR5K_AR5212_DESC_RX_ERROR1_PHY_ERROR_CODE      0x0000ff00
+#define AR5K_AR5212_DESC_RX_ERROR1_PHY_ERROR_CODE_S    8
+} __attribute__((packed));
+
+#define AR5K_DESC_RX_PHY_ERROR_NONE            0x00
+#define AR5K_DESC_RX_PHY_ERROR_TIMING          0x20
+#define AR5K_DESC_RX_PHY_ERROR_PARITY          0x40
+#define AR5K_DESC_RX_PHY_ERROR_RATE            0x60
+#define AR5K_DESC_RX_PHY_ERROR_LENGTH          0x80
+#define AR5K_DESC_RX_PHY_ERROR_64QAM           0xa0
+#define AR5K_DESC_RX_PHY_ERROR_SERVICE         0xc0
+#define AR5K_DESC_RX_PHY_ERROR_TRANSMITOVR     0xe0
+
+struct ath5k_ar5211_tx_desc {
+       /*
+        * TX control word 0
+        */
+       u_int32_t       tx_control_0;
+
+#define AR5K_AR5211_DESC_TX_CTL0_FRAME_LEN             0x00000fff
+#define AR5K_AR5211_DESC_TX_CTL0_XMIT_RATE             0x003c0000
+#define AR5K_AR5211_DESC_TX_CTL0_XMIT_RATE_S           18
+#define AR5K_AR5211_DESC_TX_CTL0_RTSENA                        0x00400000
+#define AR5K_AR5211_DESC_TX_CTL0_VEOL                  0x00800000
+#define AR5K_AR5211_DESC_TX_CTL0_CLRDMASK              0x01000000
+#define AR5K_AR5211_DESC_TX_CTL0_ANT_MODE_XMIT         0x1e000000
+#define AR5K_AR5211_DESC_TX_CTL0_ANT_MODE_XMIT_S       25
+#define AR5K_AR5211_DESC_TX_CTL0_INTREQ                        0x20000000
+#define AR5K_AR5211_DESC_TX_CTL0_ENCRYPT_KEY_VALID     0x40000000
+
+       /*
+        * TX control word 1
+        */
+       u_int32_t       tx_control_1;
+
+#define AR5K_AR5211_DESC_TX_CTL1_BUF_LEN               0x00000fff
+#define AR5K_AR5211_DESC_TX_CTL1_MORE                  0x00001000
+#define AR5K_AR5211_DESC_TX_CTL1_ENCRYPT_KEY_INDEX     0x000fe000
+#define AR5K_AR5211_DESC_TX_CTL1_ENCRYPT_KEY_INDEX_S   13
+#define AR5K_AR5211_DESC_TX_CTL1_FRAME_TYPE            0x00700000
+#define AR5K_AR5211_DESC_TX_CTL1_FRAME_TYPE_S          20
+#define AR5K_AR5211_DESC_TX_CTL1_NOACK                 0x00800000
+} __attribute__((packed));
+
+struct ath5k_ar5212_tx_desc {
+       /*
+        * TX control word 0
+        */
+       u_int32_t       tx_control_0;
+
+#define AR5K_AR5212_DESC_TX_CTL0_FRAME_LEN             0x00000fff
+#define AR5K_AR5212_DESC_TX_CTL0_XMIT_POWER            0x003f0000
+#define AR5K_AR5212_DESC_TX_CTL0_XMIT_POWER_S          16
+#define AR5K_AR5212_DESC_TX_CTL0_RTSENA                        0x00400000
+#define AR5K_AR5212_DESC_TX_CTL0_VEOL                  0x00800000
+#define AR5K_AR5212_DESC_TX_CTL0_CLRDMASK              0x01000000
+#define AR5K_AR5212_DESC_TX_CTL0_ANT_MODE_XMIT         0x1e000000
+#define AR5K_AR5212_DESC_TX_CTL0_ANT_MODE_XMIT_S       25
+#define AR5K_AR5212_DESC_TX_CTL0_INTREQ                        0x20000000
+#define AR5K_AR5212_DESC_TX_CTL0_ENCRYPT_KEY_VALID     0x40000000
+#define AR5K_AR5212_DESC_TX_CTL0_CTSENA                        0x80000000
+
+       /*
+        * TX control word 1
+        */
+       u_int32_t       tx_control_1;
+
+#define AR5K_AR5212_DESC_TX_CTL1_BUF_LEN               0x00000fff
+#define AR5K_AR5212_DESC_TX_CTL1_MORE                  0x00001000
+#define AR5K_AR5212_DESC_TX_CTL1_ENCRYPT_KEY_INDEX     0x000fe000
+#define AR5K_AR5212_DESC_TX_CTL1_ENCRYPT_KEY_INDEX_S   13
+#define AR5K_AR5212_DESC_TX_CTL1_FRAME_TYPE            0x00f00000
+#define AR5K_AR5212_DESC_TX_CTL1_FRAME_TYPE_S          20
+#define AR5K_AR5212_DESC_TX_CTL1_NOACK                 0x01000000
+#define AR5K_AR5212_DESC_TX_CTL1_COMP_PROC             0x06000000
+#define AR5K_AR5212_DESC_TX_CTL1_COMP_PROC_S           25
+#define AR5K_AR5212_DESC_TX_CTL1_COMP_IV_LEN           0x18000000
+#define AR5K_AR5212_DESC_TX_CTL1_COMP_IV_LEN_S         27
+#define AR5K_AR5212_DESC_TX_CTL1_COMP_ICV_LEN          0x60000000
+#define AR5K_AR5212_DESC_TX_CTL1_COMP_ICV_LEN_S                29
+
+       /*
+        * TX control word 2
+        */
+       u_int32_t       tx_control_2;
+
+#define AR5K_AR5212_DESC_TX_CTL2_RTS_DURATION          0x00007fff
+#define AR5K_AR5212_DESC_TX_CTL2_DURATION_UPDATE_ENABLE        0x00008000
+#define AR5K_AR5212_DESC_TX_CTL2_XMIT_TRIES0           0x000f0000
+#define AR5K_AR5212_DESC_TX_CTL2_XMIT_TRIES0_S         16
+#define AR5K_AR5212_DESC_TX_CTL2_XMIT_TRIES1           0x00f00000
+#define AR5K_AR5212_DESC_TX_CTL2_XMIT_TRIES1_S         20
+#define AR5K_AR5212_DESC_TX_CTL2_XMIT_TRIES2           0x0f000000
+#define AR5K_AR5212_DESC_TX_CTL2_XMIT_TRIES2_S         24
+#define AR5K_AR5212_DESC_TX_CTL2_XMIT_TRIES3           0xf0000000
+#define AR5K_AR5212_DESC_TX_CTL2_XMIT_TRIES3_S         28
+
+       /*
+        * TX control word 3
+        */
+       u_int32_t       tx_control_3;
+
+#define AR5K_AR5212_DESC_TX_CTL3_XMIT_RATE0            0x0000001f
+#define AR5K_AR5212_DESC_TX_CTL3_XMIT_RATE1            0x000003e0
+#define AR5K_AR5212_DESC_TX_CTL3_XMIT_RATE1_S          5
+#define AR5K_AR5212_DESC_TX_CTL3_XMIT_RATE2            0x00007c00
+#define AR5K_AR5212_DESC_TX_CTL3_XMIT_RATE2_S          10
+#define AR5K_AR5212_DESC_TX_CTL3_XMIT_RATE3            0x000f8000
+#define AR5K_AR5212_DESC_TX_CTL3_XMIT_RATE3_S          15
+#define AR5K_AR5212_DESC_TX_CTL3_RTS_CTS_RATE          0x01f00000
+#define AR5K_AR5212_DESC_TX_CTL3_RTS_CTS_RATE_S                20
+} __attribute__((packed));
+
+struct ath5k_tx_status {
+       /*
+        * TX status word 0
+        */
+       u_int32_t       tx_status_0;
+
+#define AR5K_DESC_TX_STATUS0_FRAME_XMIT_OK     0x00000001
+#define AR5K_DESC_TX_STATUS0_EXCESSIVE_RETRIES 0x00000002
+#define AR5K_DESC_TX_STATUS0_FIFO_UNDERRUN     0x00000004
+#define AR5K_DESC_TX_STATUS0_FILTERED          0x00000008
+#define AR5K_DESC_TX_STATUS0_RTS_FAIL_COUNT    0x000000f0
+#define AR5K_DESC_TX_STATUS0_RTS_FAIL_COUNT_S  4
+#define AR5K_DESC_TX_STATUS0_DATA_FAIL_COUNT   0x00000f00
+#define AR5K_DESC_TX_STATUS0_DATA_FAIL_COUNT_S 8
+#define AR5K_DESC_TX_STATUS0_VIRT_COLL_COUNT   0x0000f000
+#define AR5K_DESC_TX_STATUS0_VIRT_COLL_COUNT_S 12
+#define AR5K_DESC_TX_STATUS0_SEND_TIMESTAMP    0xffff0000
+#define AR5K_DESC_TX_STATUS0_SEND_TIMESTAMP_S  16
+
+       /*
+        * TX status word 1
+        */
+       u_int32_t       tx_status_1;
+
+#define AR5K_DESC_TX_STATUS1_DONE              0x00000001
+#define AR5K_DESC_TX_STATUS1_SEQ_NUM           0x00001ffe
+#define AR5K_DESC_TX_STATUS1_SEQ_NUM_S         1
+#define AR5K_DESC_TX_STATUS1_ACK_SIG_STRENGTH  0x001fe000
+#define AR5K_DESC_TX_STATUS1_ACK_SIG_STRENGTH_S        13
+#define AR5K_DESC_TX_STATUS1_FINAL_TS_INDEX    0x00600000
+#define AR5K_DESC_TX_STATUS1_FINAL_TS_INDEX_S  21
+#define AR5K_DESC_TX_STATUS1_COMP_SUCCESS      0x00800000
+#define AR5K_DESC_TX_STATUS1_XMIT_ANTENNA      0x01000000
+} __attribute__((packed));
+
diff -Naur qemu/hw/ath5kreg.h qemu-altered/hw/ath5kreg.h
--- qemu/hw/ath5kreg.h  1970-01-01 01:00:00.000000000 +0100
+++ qemu-altered/hw/ath5kreg.h  2008-03-01 13:20:07.000000000 +0100
@@ -0,0 +1,1878 @@
+/*-
+ * Copyright (c) 2007 Nick Kossifidis <address@hidden>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer,
+ *    without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ *    similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+ *    redistribution must be conditioned upon including a substantially
+ *    similar Disclaimer requirement for further binary redistribution.
+ * 3. Neither the names of the above-listed copyright holders nor the names
+ *    of any contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * Alternatively, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") version 2 as published by the Free
+ * Software Foundation.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+ * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGES.
+ */
+
+/*
+ * Register values for Atheros 5210/5211/5212 cards from OpenBSD's ar5k
+ * maintained by Reyk Floeter
+ *
+ * I tried to document those registers by looking at ar5k code, some
+ * 802.11 (802.11e mostly) papers and by reading various public available 
+ * Atheros presentations and papers like these:
+ * 
+ * 5210 - http://nova.stanford.edu/~bbaas/ps/isscc2002_slides.pdf
+ *        http://www.it.iitb.ac.in/~janak/wifire/01222734.pdf
+ *
+ * 5211 - http://www.hotchips.org/archives/hc14/3_Tue/16_mcfarland.pdf
+ */
+
+
+#define ATH_HW_IRQ_PENDING                     0x4008
+#define ATH_HW_IRQ_PENDING_FALSE       0
+#define ATH_HW_IRQ_PENDING_TRUE                1
+
+/*====MAC DMA REGISTERS====*/
+
+/*
+ * AR5210-Specific TXDP registers
+ * 5210 has only 2 transmit queues so no DCU/QCU, just
+ * 2 transmit descriptor pointers...
+ */
+#define AR5K_NOQCU_TXDP0       0x0000          /*Queue 0 - data*/
+#define AR5K_NOQCU_TXDP1       0x0004          /*Queue 1 - beacons*/
+
+/*
+ * Mac Control Register
+ */
+#define        AR5K_CR         0x0008                  /*Register Address*/
+#define AR5K_CR_TXE0   0x00000001      /*TX Enable for queue 0 on 5210*/
+#define AR5K_CR_TXE1   0x00000002      /*TX Enable for queue 1 on 5210*/
+#define        AR5K_CR_RXE     0x00000004      /*RX Enable*/
+#define AR5K_CR_TXD0   0x00000008      /*TX Disable for queue 0 on 5210*/
+#define AR5K_CR_TXD1   0x00000010      /*TX Disable for queue 1 on 5210*/
+#define        AR5K_CR_RXD     0x00000020      /*RX Disable*/
+#define        AR5K_CR_SWI     0x00000040      
+
+/*
+ * RX Descriptor Pointer register
+ */
+#define        AR5K_RXDP       0x000c
+
+/*
+ * Configuration and status register
+ */
+#define        AR5K_CFG                0x0014                  /*Register 
Address*/
+#define        AR5K_CFG_SWTD           0x00000001      /*Bitswap TX descriptor 
(for big endian archs)*/
+#define        AR5K_CFG_SWTB           0x00000002      /*Bitswap TX buffer 
(?)*/
+#define        AR5K_CFG_SWRD           0x00000004      /*Bitswap RX 
descriptor*/
+#define        AR5K_CFG_SWRB           0x00000008      /*Bitswap RX buffer 
(?)*/
+#define        AR5K_CFG_SWRG           0x00000010      
+#define AR5K_CFG_ADHOC         0x00000020      /*not found on 5210*/
+#define AR5K_CFG_PHY_OK                0x00000100      /*not found on 5210*/
+#define AR5K_CFG_EEBS          0x00000200      /*EEPROM is busy*/
+#define        AR5K_CFG_CLKGD          0x00000400      
+#define AR5K_CFG_TXCNT         0x00007800      /*5210 only*/
+#define AR5K_CFG_TXCNT_S       11
+#define AR5K_CFG_TXFSTAT       0x00008000      /*5210 only*/
+#define AR5K_CFG_TXFSTRT       0x00010000      /*5210 only*/
+#define        AR5K_CFG_PCI_THRES      0x00060000      /*not found on 5210*/
+#define        AR5K_CFG_PCI_THRES_S    17              
+
+/*
+ * Interrupt enable register
+ */
+#define AR5K_IER               0x0024                  /*Register Address*/
+#define AR5K_IER_DISABLE       0x00000000      /*Disable card interrupts*/
+#define AR5K_IER_ENABLE                0x00000001      /*Enable card 
interrupts*/
+
+
+/*
+ * 0x0028 is Beacon Control Register on 5210
+ * and first RTS duration register on 5211
+ */
+
+/*
+ * Beacon control register -5210 only-
+ */
+#define AR5K_BCR               0x0028                  /*Register Address*/
+#define AR5K_BCR_AP            0x00000000      /*AP mode*/
+#define AR5K_BCR_ADHOC         0x00000001      /*Ad-Hoc mode*/
+#define AR5K_BCR_BDMAE         0x00000002      /*DMA enable*/
+#define AR5K_BCR_TQ1FV         0x00000004      /*Use Queue1 for CAB traffic*/
+#define AR5K_BCR_TQ1V          0x00000008      /*Use Queue1 for Beacon 
traffic*/
+#define AR5K_BCR_BCGET         0x00000010      
+
+/*
+ * First RTS duration register -5211 only-
+ */
+#define AR5K_RTSD0             0x0028                  /*Register Address*/
+#define        AR5K_RTSD0_6            0x000000ff      /*6Mb RTS duration mask 
(?)*/
+#define        AR5K_RTSD0_6_S          0               /*6Mb RTS duration 
shift (?)*/
+#define        AR5K_RTSD0_9            0x0000ff00      /*9Mb*/
+#define        AR5K_RTSD0_9_S          8
+#define        AR5K_RTSD0_12           0x00ff0000      /*12Mb*/
+#define        AR5K_RTSD0_12_S         16
+#define        AR5K_RTSD0_18           0xff000000      /*16Mb*/
+#define        AR5K_RTSD0_18_S         24
+
+
+/* 
+ * 0x002c is Beacon Status Register on 5210
+ * and second RTS duration register on 5211
+ */
+
+/*
+ * Beacon status register -5210 only-
+ *
+ * As i can see in ar5k_ar5210_tx_start Reyk uses some of the values of BCR
+ * for this register, so i guess TQ1V,TQ1FV and BDMAE have the same meaning
+ * here and SNP/SNAP means "snapshot" (so this register gets synced with BCR). 
+ * So SNAPPEDBCRVALID sould also stand for "snapped BCR -values- valid", so i
+ * renamed it to SNAPSHOTSVALID to make more sense. I realy have no idea what
+ * else can it be. I also renamed SNPBCMD to SNPADHOC to match BCR.
+ */
+#define AR5K_BSR               0x002c                  /*Register Address*/
+#define AR5K_BSR_BDLYSW                0x00000001      /*SW Beacon delay (?)*/
+#define AR5K_BSR_BDLYDMA       0x00000002      /*DMA Beacon delay (?)*/
+#define AR5K_BSR_TXQ1F         0x00000004      
+#define AR5K_BSR_ATIMDLY       0x00000008      /*ATIM delay (?)*/
+#define AR5K_BSR_SNPADHOC      0x00000100      /*Ad-hoc mode set (?)*/
+#define AR5K_BSR_SNPBDMAE      0x00000200      /*Beacon DMA enabled (?)*/
+#define AR5K_BSR_SNPTQ1FV      0x00000400      /*Queue1 is used for CAB 
traffic (?)*/
+#define AR5K_BSR_SNPTQ1V       0x00000800      /*Queue1 is used for Beacon 
traffic (?)*/
+#define AR5K_BSR_SNAPSHOTSVALID        0x00001000      /*BCR snapshots are 
valid (?)*/
+#define AR5K_BSR_SWBA_CNT      0x00ff0000      
+
+/*
+ * Second RTS duration register -5211 only-
+ */
+#define AR5K_RTSD1             0x002c                  /*Register Address*/
+#define        AR5K_RTSD1_24           0x000000ff      /*24Mb*/
+#define        AR5K_RTSD1_24_S         0
+#define        AR5K_RTSD1_36           0x0000ff00      /*36Mb*/
+#define        AR5K_RTSD1_36_S         8
+#define        AR5K_RTSD1_48           0x00ff0000      /*48Mb*/
+#define        AR5K_RTSD1_48_S         16
+#define        AR5K_RTSD1_54           0xff000000      /*54Mb*/
+#define        AR5K_RTSD1_54_S         24
+
+
+/*
+ * Transmit configuration register
+ */
+#define AR5K_TXCFG             0x0030                  /*Register Address*/
+#define AR5K_TXCFG_SDMAMR      0x00000007      /*DMA size*/
+#define AR5K_TXCFG_SDMAMR_S    0
+#define AR5K_TXCFG_B_MODE      0x00000008      /*Set b mode for 5111 (enable 
2111)*/
+#define AR5K_TXCFG_TXFSTP      0x00000008      /*TX DMA Stop -5210 only-*/
+#define AR5K_TXCFG_TXFULL      0x000003f0      /*TX Triger level mask*/
+#define AR5K_TXCFG_TXFULL_S    4
+#define AR5K_TXCFG_TXFULL_0B   0x00000000
+#define AR5K_TXCFG_TXFULL_64B  0x00000010
+#define AR5K_TXCFG_TXFULL_128B 0x00000020
+#define AR5K_TXCFG_TXFULL_192B 0x00000030
+#define AR5K_TXCFG_TXFULL_256B 0x00000040
+#define AR5K_TXCFG_TXCONT_EN   0x00000080      
+#define AR5K_TXCFG_DMASIZE     0x00000100      /*flag for passing DMA size 
-non 5210*/
+#define AR5K_TXCFG_JUMBO_TXE   0x00000400      /*enable jumbo frames 
transmition (?) -non 5210*/
+#define AR5K_TXCFG_RTSRND      0x00001000      /*non 5210*/
+#define AR5K_TXCFG_FRMPAD_DIS  0x00002000      /*non 5210*/
+#define AR5K_TXCFG_RDY_DIS     0x00004000      /*non 5210*/
+
+/*
+ * Receive configuration register
+ */
+#define AR5K_RXCFG             0x0034                  /*Register Address*/
+#define AR5K_RXCFG_SDMAMW      0x00000007      /*DMA size*/
+#define AR5K_RXCFG_SDMAMW_S    0
+#define        AR5K_RXCFG_DEF_ANTENNA  0x00000008      /*default antenna*/
+#define AR5K_RXCFG_ZLFDMA      0x00000010      /*zero-length DMA*/
+#define AR5K_RXCFG_JUMBO_RXE   0x00000020      /*enable jumbo frames recieve 
(?) -non 5210*/
+#define AR5K_RXCFG_JUMBO_WRAP  0x00000040      /*wrap jumbo frames (?) -non 
5210*/
+
+/*
+ * Receive jumbo descriptor last address register
+ * Only found in 5211 (?)
+ */
+#define AR5K_RXJLA             0x0038
+
+/*
+ * MIB control register
+ */
+#define AR5K_MIBC              0x0040                  /*Register Address*/
+#define AR5K_MIBC_COW          0x00000001      
+#define AR5K_MIBC_FMC          0x00000002      /*Freeze Mib Counters (?)*/
+#define AR5K_MIBC_CMC          0x00000004      /*Clean Mib Counters (?)*/
+#define AR5K_MIBC_MCS          0x00000008      
+
+/*
+ * Timeout prescale register
+ */
+#define AR5K_TOPS              0x0044
+#define        AR5K_TOPS_M             0x0000ffff      /*non 5210*/
+
+/*
+ * Receive timeout register (no frame received)
+ */
+#define AR5K_RXNOFRM           0x0048
+#define        AR5K_RXNOFRM_M          0x000003ff      /*non 5210*/
+
+/*
+ * Transmit timeout register (no frame sent)
+ */
+#define AR5K_TXNOFRM           0x004c
+#define        AR5K_TXNOFRM_M          0x000003ff      /*non 5210*/
+#define        AR5K_TXNOFRM_QCU        0x000ffc00      /*non 5210*/
+
+/*
+ * Receive frame gap timeout register
+ */
+#define AR5K_RPGTO             0x0050
+#define AR5K_RPGTO_M           0x000003ff      /*non 5210*/
+
+/*
+ * Receive frame count limit register
+ */
+#define AR5K_RFCNT             0x0054
+#define AR5K_RFCNT_M           0x0000001f      /*non 5210*/
+#define AR5K_RFCNT_RFCL                0x0000000f      /*5210*/
+
+/*
+ * Misc settings register
+ */
+#define AR5K_MISC              0x0058                  /*Register Address*/
+#define        AR5K_MISC_DMA_OBS_M     0x000001e0      
+#define        AR5K_MISC_DMA_OBS_S     5
+#define        AR5K_MISC_MISC_OBS_M    0x00000e00      
+#define        AR5K_MISC_MISC_OBS_S    9
+#define        AR5K_MISC_MAC_OBS_LSB_M 0x00007000      
+#define        AR5K_MISC_MAC_OBS_LSB_S 12
+#define        AR5K_MISC_MAC_OBS_MSB_M 0x00038000      
+#define        AR5K_MISC_MAC_OBS_MSB_S 15
+#define AR5K_MISC_LED_DECAY    0x001c0000      /*5210*/
+#define AR5K_MISC_LED_BLINK    0x00e00000      /*5210*/
+
+/*
+ * QCU/DCU clock gating register (5311)
+ */
+#define        AR5K_QCUDCU_CLKGT       0x005c                  /*Register 
Address (?)*/
+#define        AR5K_QCUDCU_CLKGT_QCU   0x0000ffff      /*Mask for QCU clock*/
+#define        AR5K_QCUDCU_CLKGT_DCU   0x07ff0000      /*Mask for DCU clock*/
+
+/*
+ * Interrupt Status Registers
+ *
+ * For 5210 there is only one status register but for
+ * 5211/5212 we have one primary and 4 secondary registers.
+ * So we have AR5K_ISR for 5210 and AR5K_PISR /SISRx for 5211/5212.
+ * Most of these bits are common for all chipsets.
+ */
+#define AR5K_ISR               0x001c                  /*Register Address 
(5210)*/
+#define AR5K_PISR              0x0080                  /*Register Address 
(5211/5212)*/
+#define AR5K_ISR_RXOK          0x00000001      /*Frame successfuly recieved*/
+#define AR5K_ISR_RXDESC                0x00000002      /*RX descriptor 
request*/
+#define AR5K_ISR_RXERR         0x00000004      /*Receive error*/
+#define AR5K_ISR_RXNOFRM       0x00000008      /*No frame received (receive 
timeout)*/
+#define AR5K_ISR_RXEOL         0x00000010      /*Empty RX descriptor*/
+#define AR5K_ISR_RXORN         0x00000020      /*Receive FIFO overrun*/
+#define AR5K_ISR_TXOK          0x00000040      /*Frame successfuly transmited*/
+#define AR5K_ISR_TXDESC                0x00000080      /*TX descriptor 
request*/
+#define AR5K_ISR_TXERR         0x00000100      /*Transmit error*/
+#define AR5K_ISR_TXNOFRM       0x00000200      /*No frame transmited (transmit 
timeout)*/
+#define AR5K_ISR_TXEOL         0x00000400      /*Empty TX descriptor*/
+#define AR5K_ISR_TXURN         0x00000800      /*Transmit FIFO underrun*/
+#define AR5K_ISR_MIB           0x00001000      /*Update MIB counters*/
+#define AR5K_ISR_SWI           0x00002000      
+#define AR5K_ISR_RXPHY         0x00004000      /*PHY error*/
+#define AR5K_ISR_RXKCM         0x00008000      
+#define AR5K_ISR_SWBA          0x00010000      /*Software beacon alert*/
+#define AR5K_ISR_BRSSI         0x00020000      
+#define AR5K_ISR_BMISS         0x00040000      /*Beacon missed*/
+#define AR5K_ISR_HIUERR                0x00080000      /*Host Interface Unit 
error -non 5210*/
+#define AR5K_ISR_BNR           0x00100000      /*Beacon not ready -non 5210*/
+#define AR5K_ISR_MCABT         0x00100000      /*5210*/
+#define AR5K_ISR_RXCHIRP       0x00200000      /*5212 only*/
+#define AR5K_ISR_SSERR         0x00200000      /*5210 only*/
+#define AR5K_ISR_DPERR         0x00400000      /*5210 only*/
+#define AR5K_ISR_TIM           0x00800000      /*non 5210*/
+#define AR5K_ISR_BCNMISC       0x00800000      /*5212 only*/
+#define AR5K_ISR_GPIO          0x01000000      /*GPIO (rf kill)*/
+#define AR5K_ISR_QCBRORN       0x02000000      /*CBR overrun (?) -non 5210*/
+#define AR5K_ISR_QCBRURN       0x04000000      /*CBR underrun (?) -non 5210*/
+#define AR5K_ISR_QTRIG         0x08000000      /*non 5210*/
+
+/*
+ * Secondary status registers (5211/5212) (0 - 4)
+ *
+ * I guess from the names that these give the status for each 
+ * queue, that's why only masks are defined here, haven't got
+ * any info about them (couldn't find them anywhere in ar5k code).
+ */
+#define AR5K_SISR0             0x0084                  /*Register Address 
(5211/5212)*/
+#define AR5K_SISR0_QCU_TXOK    0x000003ff      /*Mask for QCU_TXOK*/
+#define AR5K_SISR0_QCU_TXDESC  0x03ff0000      /*Mask for QCU_TXDESC*/
+
+#define AR5K_SISR1             0x0088                  /*Register Address 
(5211/5212)*/
+#define AR5K_SISR1_QCU_TXERR   0x000003ff      /*Mask for QCU_TXERR*/
+#define AR5K_SISR1_QCU_TXEOL   0x03ff0000      /*Mask for QCU_TXEOL*/
+
+#define AR5K_SISR2             0x008c                  /*Register Address 
(5211/5212)*/
+#define AR5K_SISR2_QCU_TXURN   0x000003ff      /*Mask for QCU_TXURN*/
+#define        AR5K_SISR2_MCABT        0x00100000      
+#define        AR5K_SISR2_SSERR        0x00200000      
+#define        AR5K_SISR2_DPERR        0x00400000      
+#define        AR5K_SISR2_TIM          0x01000000      /*5212 only*/
+#define        AR5K_SISR2_CAB_END      0x02000000      /*5212 only*/
+#define        AR5K_SISR2_DTIM_SYNC    0x04000000      /*5212 only*/
+#define        AR5K_SISR2_BCN_TIMEOUT  0x08000000      /*5212 only*/
+#define        AR5K_SISR2_CAB_TIMEOUT  0x10000000      /*5212 only*/
+#define        AR5K_SISR2_DTIM         0x20000000      /*5212 only*/
+
+#define AR5K_SISR3             0x0090                  /*Register Address 
(5211/5212)*/
+#define AR5K_SISR3_QCBRORN     0x000003ff      /*Mask for QCBRORN*/
+#define AR5K_SISR3_QCBRURN     0x03ff0000      /*Mask for QCBRURN*/
+
+#define AR5K_SISR4             0x0094                  /*Register Address 
(5211/5212)*/
+#define AR5K_SISR4_QTRIG       0x000003ff      /*Mask for QTRIG*/
+
+/*
+ * Shadow read-and-clear interrupt status registers (5211/5212)
+ */
+#define AR5K_RAC_PISR          0x00c0          /*Read and clear PISR*/
+#define AR5K_RAC_SISR0         0x00c4          /*Read and clear SISR0*/
+#define AR5K_RAC_SISR1         0x00c8          /*Read and clear SISR1*/
+#define AR5K_RAC_SISR2         0x00cc          /*Read and clear SISR2*/
+#define AR5K_RAC_SISR3         0x00d0          /*Read and clear SISR3*/
+#define AR5K_RAC_SISR4         0x00d4          /*Read and clear SISR4*/
+
+/*
+ * Interrupt Mask Registers
+ *
+ * As whith ISRs 5210 has one IMR (AR5K_IMR) and 5211/5212 has one primary
+ * (AR5K_PIMR) and 4 secondary IMRs (AR5K_SIMRx). Note that ISR/IMR flags 
match.
+ */
+#define        AR5K_IMR                0x0020                  /*Register 
Address (5210)*/
+#define AR5K_PIMR              0x00a0                  /*Register Address 
(5211/5212)*/
+#define AR5K_IMR_RXOK          0x00000001      /*Frame successfuly recieved*/
+#define AR5K_IMR_RXDESC                0x00000002      /*RX descriptor 
request*/
+#define AR5K_IMR_RXERR         0x00000004      /*Receive error*/
+#define AR5K_IMR_RXNOFRM       0x00000008      /*No frame received (receive 
timeout)*/
+#define AR5K_IMR_RXEOL         0x00000010      /*Empty RX descriptor*/
+#define AR5K_IMR_RXORN         0x00000020      /*Receive FIFO overrun*/
+#define AR5K_IMR_TXOK          0x00000040      /*Frame successfuly transmited*/
+#define AR5K_IMR_TXDESC                0x00000080      /*TX descriptor 
request*/
+#define AR5K_IMR_TXERR         0x00000100      /*Transmit error*/
+#define AR5K_IMR_TXNOFRM       0x00000200      /*No frame transmited (transmit 
timeout)*/
+#define AR5K_IMR_TXEOL         0x00000400      /*Empty TX descriptor*/
+#define AR5K_IMR_TXURN         0x00000800      /*Transmit FIFO underrun*/
+#define AR5K_IMR_MIB           0x00001000      /*Update MIB counters*/
+#define AR5K_IMR_SWI           0x00002000      
+#define AR5K_IMR_RXPHY         0x00004000      /*PHY error*/
+#define AR5K_IMR_RXKCM         0x00008000      
+#define AR5K_IMR_SWBA          0x00010000      /*Software beacon alert*/
+#define AR5K_IMR_BRSSI         0x00020000      
+#define AR5K_IMR_BMISS         0x00040000      /*Beacon missed*/
+#define AR5K_IMR_HIUERR                0x00080000      /*Host Interface Unit 
error -non 5210*/
+#define AR5K_IMR_BNR           0x00100000      /*Beacon not ready -non 5210*/
+#define AR5K_IMR_MCABT         0x00100000      /*5210*/
+#define AR5K_IMR_RXCHIRP       0x00200000      /*5212 only*/
+#define AR5K_IMR_SSERR         0x00200000      /*5210 only*/
+#define AR5K_IMR_DPERR         0x00400000      /*5210 only*/
+#define AR5K_IMR_TIM           0x00800000      /*non 5210*/
+#define AR5K_IMR_BCNMISC       0x00800000      /*5212 only*/
+#define AR5K_IMR_GPIO          0x01000000      /*GPIO (rf kill)*/
+#define AR5K_IMR_QCBRORN       0x02000000      /*CBR overrun (?) -non 5210*/
+#define AR5K_IMR_QCBRURN       0x04000000      /*CBR underrun (?) -non 5210*/
+#define AR5K_IMR_QTRIG         0x08000000      /*non 5210*/
+
+/*
+ * Secondary interrupt mask registers (5211/5212) (0 - 4)
+ */
+#define AR5K_SIMR0             0x00a4                  /*Register Address 
(5211/5212)*/
+#define AR5K_SIMR0_QCU_TXOK    0x000003ff      /*Mask for QCU_TXOK*/
+#define AR5K_SIMR0_QCU_TXOK_S  0
+#define AR5K_SIMR0_QCU_TXDESC  0x03ff0000      /*Mask for QCU_TXDESC*/
+#define AR5K_SIMR0_QCU_TXDESC_S        16
+
+#define AR5K_SIMR1             0x00a8                  /*Register Address 
(5211/5212)*/
+#define AR5K_SIMR1_QCU_TXERR   0x000003ff      /*Mask for QCU_TXERR*/
+#define AR5K_SIMR1_QCU_TXERR_S 0
+#define AR5K_SIMR1_QCU_TXEOL   0x03ff0000      /*Mask for QCU_TXEOL*/
+#define AR5K_SIMR1_QCU_TXEOL_S 16
+
+#define AR5K_SIMR2             0x00ac                  /*Register Address 
(5211/5212)*/
+#define AR5K_SIMR2_QCU_TXURN   0x000003ff      /*Mask for QCU_TXURN*/
+#define AR5K_SIMR2_QCU_TXURN_S 0
+#define        AR5K_SIMR2_MCABT        0x00100000      
+#define        AR5K_SIMR2_SSERR        0x00200000      
+#define        AR5K_SIMR2_DPERR        0x00400000      
+#define        AR5K_SIMR2_TIM          0x01000000      /*5212 only*/
+#define        AR5K_SIMR2_CAB_END      0x02000000      /*5212 only*/
+#define        AR5K_SIMR2_DTIM_SYNC    0x04000000      /*5212 only*/
+#define        AR5K_SIMR2_BCN_TIMEOUT  0x08000000      /*5212 only*/
+#define        AR5K_SIMR2_CAB_TIMEOUT  0x10000000      /*5212 only*/
+#define        AR5K_SIMR2_DTIM         0x20000000      /*5212 only*/
+
+#define AR5K_SIMR3             0x00b0                  /*Register Address 
(5211/5212)*/
+#define AR5K_SIMR3_QCBRORN     0x000003ff      /*Mask for QCBRORN*/
+#define AR5K_SIMR3_QCBRORN_S   0
+#define AR5K_SIMR3_QCBRURN     0x03ff0000      /*Mask for QCBRURN*/
+#define AR5K_SIMR3_QCBRURN_S   16
+
+#define AR5K_SIMR4             0x00b4                  /*Register Address 
(5211/5212)*/
+#define AR5K_SIMR4_QTRIG       0x000003ff      /*Mask for QTRIG*/
+#define AR5K_SIMR4_QTRIG_S     0
+
+
+/*
+ * Decompression mask registers (5212)
+ */
+#define AR5K_DCM_ADDR          0x0400          /*Decompression mask address 
(?)*/
+#define AR5K_DCM_DATA          0x0404          /*Decompression mask data (?)*/
+
+/*
+ * Decompression configuration registers (5212)
+ */
+#define AR5K_DCCFG             0x0420          
+
+/*
+ * Compression configuration registers (5212)
+ */
+#define AR5K_CCFG              0x0600          
+#define AR5K_CCFG_CUP          0x0604          
+
+/*
+ * Compression performance counter registers (5212)
+ */
+#define AR5K_CPC0              0x0610          /*Compression performance 
counter 0*/
+#define AR5K_CPC1              0x0614          /*Compression performance 
counter 1*/
+#define AR5K_CPC2              0x0618          /*Compression performance 
counter 2*/
+#define AR5K_CPC3              0x061c          /*Compression performance 
counter 3*/
+#define AR5K_CPCORN            0x0620          /*Compression performance 
overrun (?)*/
+
+
+/*
+ * Queue control unit (QCU) registers (5211/5212)
+ *
+ * Card has 12 TX Queues but i see that only 0-9 are used (?) 
+ * both in binary HAL (see ah.h) and ar5k. Each queue has it's own 
+ * TXDP at addresses 0x0800 - 0x082c, a CBR (Constant Bit Rate) 
+ * configuration register (0x08c0 - 0x08ec), a ready time configuration
+ * register (0x0900 - 0x092c), a misc configuration register (0x09c0 - 
+ * 0x09ec) and a status register (0x0a00 - 0x0a2c). We also have some
+ * global registers, QCU transmit enable/disable and "one shot arm (?)"
+ * set/clear, which contain status for all queues (we shift by 1 for each
+ * queue). To access these registers easily we define some macros here
+ * that are used inside HAL. For more infos check out *_tx_queue functs.
+ *
+ * TODO: Boundary checking on macros (here?)
+ */
+
+/*
+ * Generic QCU Register access macros
+ */
+#define        AR5K_QUEUE_REG(_r, _q)          (((_q) << 2) + _r)
+#define AR5K_QCU_GLOBAL_READ(_r, _q)   (AR5K_REG_READ(_r) & (1 << _q))
+#define AR5K_QCU_GLOBAL_WRITE(_r, _q)  AR5K_REG_WRITE(_r, (1 << _q))
+               
+/*
+ * QCU Transmit descriptor pointer registers
+ */
+#define AR5K_QCU_TXDP_BASE     0x0800          /*Register Address - Queue0 
TXDP*/
+#define AR5K_QUEUE_TXDP(_q)    AR5K_QUEUE_REG(AR5K_QCU_TXDP_BASE, _q)
+
+/*
+ * QCU Transmit enable register
+ */
+#define AR5K_QCU_TXE           0x0840
+#define AR5K_ENABLE_QUEUE(_q)  AR5K_QCU_GLOBAL_WRITE(AR5K_QCU_TXE, _q)
+#define AR5K_QUEUE_ENABLED(_q) AR5K_QCU_GLOBAL_READ(AR5K_QCU_TXE, _q)
+
+/*
+ * QCU Transmit disable register
+ */
+#define AR5K_QCU_TXD           0x0880
+#define AR5K_DISABLE_QUEUE(_q) AR5K_QCU_GLOBAL_WRITE(AR5K_QCU_TXD, _q)
+#define AR5K_QUEUE_DISABLED(_q)        AR5K_QCU_GLOBAL_READ(AR5K_QCU_TXD, _q)
+
+/*
+ * QCU Constant Bit Rate configuration registers
+ */
+#define        AR5K_QCU_CBRCFG_BASE            0x08c0  /*Register Address - 
Queue0 CBRCFG*/
+#define        AR5K_QCU_CBRCFG_INTVAL          0x00ffffff      /*CBR Interval 
mask*/
+#define AR5K_QCU_CBRCFG_INTVAL_S       0
+#define        AR5K_QCU_CBRCFG_ORN_THRES       0xff000000      /*CBR overrun 
threshold mask*/
+#define AR5K_QCU_CBRCFG_ORN_THRES_S    24
+#define        AR5K_QUEUE_CBRCFG(_q)           
AR5K_QUEUE_REG(AR5K_QCU_CBRCFG_BASE, _q)
+
+/*
+ * QCU Ready time configuration registers
+ */
+#define        AR5K_QCU_RDYTIMECFG_BASE        0x0900  /*Register Address - 
Queue0 RDYTIMECFG*/
+#define        AR5K_QCU_RDYTIMECFG_INTVAL      0x00ffffff      /*Ready time 
interval mask*/
+#define AR5K_QCU_RDYTIMECFG_INTVAL_S   0
+#define        AR5K_QCU_RDYTIMECFG_DURATION    0x00ffffff      /*Ready time 
duration mask*/
+#define        AR5K_QCU_RDYTIMECFG_ENABLE      0x01000000      /*Ready time 
enable mask*/
+#define AR5K_QUEUE_RDYTIMECFG(_q)      
AR5K_QUEUE_REG(AR5K_QCU_RDYTIMECFG_BASE, _q)
+
+/*
+ * QCU one shot arm set registers
+ */
+#define        AR5K_QCU_ONESHOTARM_SET         0x0940  /*Register Address -QCU 
"one shot arm set (?)"*/
+#define        AR5K_QCU_ONESHOTARM_SET_M       0x0000ffff
+
+/*
+ * QCU one shot arm clear registers
+ */
+#define        AR5K_QCU_ONESHOTARM_CLEAR       0x0980  /*Register Address -QCU 
"one shot arm clear (?)"*/
+#define        AR5K_QCU_ONESHOTARM_CLEAR_M     0x0000ffff
+
+/*
+ * QCU misc registers
+ */
+#define AR5K_QCU_MISC_BASE             0x09c0                  /*Register 
Address -Queue0 MISC*/
+#define        AR5K_QCU_MISC_FRSHED_M          0x0000000f      /*Frame 
sheduling mask*/
+#define        AR5K_QCU_MISC_FRSHED_ASAP       0               /*ASAP*/
+#define        AR5K_QCU_MISC_FRSHED_CBR        1               /*Constant Bit 
Rate*/
+#define        AR5K_QCU_MISC_FRSHED_DBA_GT     2               /*DMA Beacon 
alert (GaTed ?)*/
+#define        AR5K_QCU_MISC_FRSHED_TIM_GT     3               
+#define        AR5K_QCU_MISC_FRSHED_BCN_SENT_GT        4       /*Beacon sent 
gated (?)*/
+#define        AR5K_QCU_MISC_ONESHOT_ENABLE    0x00000010      /*Oneshot 
enable*/
+#define        AR5K_QCU_MISC_CBREXP            0x00000020      /*CBR expired 
(normal queue)*/
+#define        AR5K_QCU_MISC_CBREXP_BCN        0x00000040      /*CBR expired 
(beacon queue)*/
+#define        AR5K_QCU_MISC_BCN_ENABLE        0x00000080      /*Beacons 
enabled*/
+#define        AR5K_QCU_MISC_CBR_THRES_ENABLE  0x00000100      /*CBR threshold 
enabled (?)*/
+#define        AR5K_QCU_MISC_TXE               0x00000200      /*TXE reset 
when RDYTIME enalbed (?)*/
+#define        AR5K_QCU_MISC_CBR               0x00000400      /*CBR threshold 
reset (?)*/
+#define        AR5K_QCU_MISC_DCU_EARLY         0x00000800      /*DCU reset 
(?)*/
+#define AR5K_QUEUE_MISC(_q)            AR5K_QUEUE_REG(AR5K_QCU_MISC_BASE, _q)
+
+
+/*
+ * QCU status registers
+ */
+#define AR5K_QCU_STS_BASE      0x0a00                  /*Register Address - 
Queue0 STS*/
+#define        AR5K_QCU_STS_FRMPENDCNT 0x00000003      /*Frames pending 
counter*/
+#define        AR5K_QCU_STS_CBREXPCNT  0x0000ff00      /*CBR expired counter 
(?)*/
+#define        AR5K_QUEUE_STATUS(_q)   AR5K_QUEUE_REG(AR5K_QCU_STS_BASE, _q)
+
+/*
+ * QCU ready time shutdown register
+ */
+#define AR5K_QCU_RDYTIMESHDN   0x0a40
+#define AR5K_QCU_RDYTIMESHDN_M 0x000003ff
+
+/*
+ * QCU compression buffer base registers (5212 only)
+ */
+#define AR5K_QCU_CBB_SELECT    0x0b00
+#define AR5K_QCU_CBB_ADDR      0x0b04
+
+/*
+ * QCU compression buffer configuration register (5212 only)
+ */
+#define AR5K_QCU_CBCFG         0x0b08
+
+
+
+/*
+ * Distributed Coordination Function (DCF) control unit (DCU) 
+ * registers (5211/5212)
+ *
+ * These registers control the various characteristics of each queue
+ * for 802.11e (WME) combatibility so they go together with
+ * QCU registers in pairs. For each queue we have a QCU mask register,
+ * (0x1000 - 0x102c), a local-IFS settings register (0x1040 - 0x106c),
+ * a retry limit register (0x1080 - 0x10ac), a channel time register
+ * (0x10c0 - 0x10ec), a misc-settings register (0x1100 - 0x112c) and
+ * a sequence number register (0x1140 - 0x116c). It seems that "global"
+ * registers here afect all queues (see use of DCU_GBL_IFS_SLOT in ar5k).
+ * We use the same macros here for easier register access.
+ * 
+ */
+
+/*
+ * DCU QCU mask registers
+ */
+#define AR5K_DCU_QCUMASK_BASE  0x1000          /*Register Address -Queue0 
DCU_QCUMASK*/
+#define AR5K_DCU_QCUMASK_M     0x000003ff
+#define AR5K_QUEUE_QCUMASK(_q) AR5K_QUEUE_REG(AR5K_DCU_QCUMASK_BASE, _q)
+
+/*
+ * DCU local Inter Frame Space settings register
+ */
+#define AR5K_DCU_LCL_IFS_BASE          0x1040                  /*Register 
Address -Queue0 DCU_LCL_IFS*/
+#define        AR5K_DCU_LCL_IFS_CW_MIN         0x000003ff      /*Minimum 
Contention Window*/
+#define        AR5K_DCU_LCL_IFS_CW_MIN_S       0
+#define        AR5K_DCU_LCL_IFS_CW_MAX         0x000ffc00      /*Maximum 
Contention Window*/
+#define        AR5K_DCU_LCL_IFS_CW_MAX_S       10
+#define        AR5K_DCU_LCL_IFS_AIFS           0x0ff00000      /*Arbitrated 
Interframe Space*/
+#define        AR5K_DCU_LCL_IFS_AIFS_S         20
+#define        AR5K_QUEUE_DFS_LOCAL_IFS(_q)    
AR5K_QUEUE_REG(AR5K_DCU_LCL_IFS_BASE, _q)
+
+/*
+ * DCU retry limit registers
+ */
+#define AR5K_DCU_RETRY_LMT_BASE                0x1080                  
/*Register Address -Queue0 DCU_RETRY_LMT*/
+#define AR5K_DCU_RETRY_LMT_SH_RETRY    0x0000000f      /*Short retry limit 
mask*/
+#define AR5K_DCU_RETRY_LMT_SH_RETRY_S  0
+#define AR5K_DCU_RETRY_LMT_LG_RETRY    0x000000f0      /*Long retry limit 
mask*/
+#define AR5K_DCU_RETRY_LMT_LG_RETRY_S  4
+#define AR5K_DCU_RETRY_LMT_SSH_RETRY   0x00003f00      /*Station short retry 
limit mask (?)*/
+#define AR5K_DCU_RETRY_LMT_SSH_RETRY_S 8
+#define AR5K_DCU_RETRY_LMT_SLG_RETRY   0x000fc000      /*Station long retry 
limit mask (?)*/
+#define AR5K_DCU_RETRY_LMT_SLG_RETRY_S 14
+#define        AR5K_QUEUE_DFS_RETRY_LIMIT(_q)  
AR5K_QUEUE_REG(AR5K_DCU_RETRY_LMT_BASE, _q)
+
+/*
+ * DCU channel time registers
+ */
+#define AR5K_DCU_CHAN_TIME_BASE                0x10c0                  
/*Register Address -Queue0 DCU_CHAN_TIME*/
+#define        AR5K_DCU_CHAN_TIME_DUR          0x000fffff      /*Channel time 
duration*/
+#define        AR5K_DCU_CHAN_TIME_DUR_S        0
+#define        AR5K_DCU_CHAN_TIME_ENABLE       0x00100000      /*Enable 
channel time*/
+#define AR5K_QUEUE_DFS_CHANNEL_TIME(_q)        
AR5K_QUEUE_REG(AR5K_DCU_CHAN_TIME_BASE, _q)
+
+/*
+ * DCU misc registers
+ *
+ * For some of the registers i couldn't find in the code 
+ * (only backoff stuff is there realy) i tried to match the 
+ * names with 802.11e parameters etc, so i guess VIRTCOL here 
+ * means Virtual Collision and HCFPOLL means Hybrid Coordination
+ * factor Poll (CF- Poll). ARBLOCK_CTL_GLOBAL is used for beacon
+ * queue and CAB queue but i couldn't find any more infos.
+ */
+#define AR5K_DCU_MISC_BASE             0x1100                  /*Register 
Address -Queue0 DCU_MISC*/
+#define        AR5K_DCU_MISC_BACKOFF           0x000007ff      /*Mask for 
backoff setting (?)*/
+#define AR5K_DCU_MISC_BACKOFF_FRAG     0x00000200      /*Enable backoff while 
bursting*/
+#define        AR5K_DCU_MISC_HCFPOLL_ENABLE    0x00000800      /*CF - Poll 
(?)*/
+#define        AR5K_DCU_MISC_BACKOFF_PERSIST   0x00001000      /*Persistent 
backoff (?)*/
+#define        AR5K_DCU_MISC_FRMPRFTCH_ENABLE  0x00002000      /*Enable frame 
pre-fetch (?)*/
+#define        AR5K_DCU_MISC_VIRTCOL           0x0000c000      /*Mask for 
Virtual Collision (?)*/
+#define        AR5K_DCU_MISC_VIRTCOL_NORMAL    0
+#define        AR5K_DCU_MISC_VIRTCOL_MODIFIED  1
+#define        AR5K_DCU_MISC_VIRTCOL_IGNORE    2
+#define        AR5K_DCU_MISC_BCN_ENABLE        0x00010000      /*Beacon enable 
(?)*/
+#define        AR5K_DCU_MISC_ARBLOCK_CTL       0x00060000      
+#define        AR5K_DCU_MISC_ARBLOCK_CTL_S     17
+#define        AR5K_DCU_MISC_ARBLOCK_CTL_NONE  0
+#define        AR5K_DCU_MISC_ARBLOCK_CTL_INTFRM        1
+#define        AR5K_DCU_MISC_ARBLOCK_CTL_GLOBAL        2
+#define        AR5K_DCU_MISC_ARBLOCK_IGNORE    0x00080000      
+#define        AR5K_DCU_MISC_SEQ_NUM_INCR_DIS  0x00100000      /*Disable 
sequence number increment (?)*/
+#define        AR5K_DCU_MISC_POST_FR_BKOFF_DIS 0x00200000      /*Disable 
post-frame backoff (?)*/
+#define        AR5K_DCU_MISC_VIRT_COLL_POLICY  0x00400000      /*Virtual 
Collision policy (?)*/
+#define        AR5K_DCU_MISC_BLOWN_IFS_POLICY  0x00800000      
+#define        AR5K_DCU_MISC_SEQNUM_CTL        0x01000000      /*Sequence 
number control (?)*/
+#define AR5K_QUEUE_DFS_MISC(_q)                
AR5K_QUEUE_REG(AR5K_DCU_MISC_BASE, _q)
+
+/*
+ * DCU frame sequence number registers
+ */
+#define AR5K_DCU_SEQNUM_BASE   0x1140
+#define        AR5K_DCU_SEQNUM_M       0x00000fff
+#define        AR5K_QUEUE_DFS_SEQNUM(_q)       
AR5K_QUEUE_REG(AR5K_DCU_SEQNUM_BASE, _q)
+
+/*
+ * DCU global IFS SIFS registers
+ */
+#define AR5K_DCU_GBL_IFS_SIFS  0x1030
+#define AR5K_DCU_GBL_IFS_SIFS_M        0x0000ffff
+
+/*
+ * DCU global IFS slot interval registers
+ */
+#define AR5K_DCU_GBL_IFS_SLOT  0x1070
+#define AR5K_DCU_GBL_IFS_SLOT_M        0x0000ffff
+
+/*
+ * DCU global IFS EIFS registers
+ */
+#define AR5K_DCU_GBL_IFS_EIFS  0x10b0
+#define AR5K_DCU_GBL_IFS_EIFS_M        0x0000ffff
+
+/*
+ * DCU global IFS misc registers
+ */
+#define AR5K_DCU_GBL_IFS_MISC                  0x10f0                  
/*Register Address*/
+#define        AR5K_DCU_GBL_IFS_MISC_LFSR_SLICE        0x00000007      
+#define        AR5K_DCU_GBL_IFS_MISC_TURBO_MODE        0x00000008      /*Turbo 
mode (?)*/
+#define        AR5K_DCU_GBL_IFS_MISC_SIFS_DUR_USEC     0x000003f0      /*SIFS 
Duration mask (?)*/
+#define        AR5K_DCU_GBL_IFS_MISC_USEC_DUR          0x000ffc00      
+#define        AR5K_DCU_GBL_IFS_MISC_DCU_ARB_DELAY     0x00300000      
+
+/*
+ * DCU frame prefetch control register
+ */
+#define AR5K_DCU_FP            0x1230
+
+/*
+ * DCU transmit pause control/status register
+ */
+#define AR5K_DCU_TXP           0x1270                  /*Register Address*/
+#define        AR5K_DCU_TXP_M          0x000003ff      /*Tx pause mask (?)*/
+#define        AR5K_DCU_TXP_STATUS     0x00010000      /*Tx pause status (?)*/
+
+/*
+ * DCU transmit filter register
+ */
+#define AR5K_DCU_TX_FILTER     0x1038
+
+/*
+ * DCU clear transmit filter register
+ */
+#define AR5K_DCU_TX_FILTER_CLR 0x143c
+
+/*
+ * DCU set transmit filter register
+ */
+#define AR5K_DCU_TX_FILTER_SET 0x147c
+
+/*
+ * Reset control register
+ *
+ * 4 and 8 are not used in 5211/5212 and
+ * 2 means "baseband reset" on 5211/5212.
+ */
+#define AR5K_RESET_CTL         0x4000                  /*Register Address*/
+#define AR5K_RESET_CTL_PCU     0x00000001      /*Protocol Control Unit reset*/
+#define AR5K_RESET_CTL_DMA     0x00000002      /*DMA (Rx/Tx) reset -5210 only*/
+#define        AR5K_RESET_CTL_BASEBAND 0x00000002      /*Baseband reset 
(5211/5212)*/
+#define AR5K_RESET_CTL_MAC     0x00000004      /*MAC reset (PCU+Baseband ?) 
-5210 only*/
+#define AR5K_RESET_CTL_PHY     0x00000008      /*PHY reset -5210 only*/
+#define AR5K_RESET_CTL_PCI     0x00000010      /*PCI Core reset (interrupts 
etc)*/
+#define AR5K_RESET_CTL_CHIP    (AR5K_RESET_CTL_PCU | AR5K_RESET_CTL_DMA |      
\
+                               AR5K_RESET_CTL_MAC | AR5K_RESET_CTL_PHY)
+
+/*
+ * Sleep control register
+ */
+#define AR5K_SLEEP_CTL                 0x4004                  /*Register 
Address*/
+#define AR5K_SLEEP_CTL_SLDUR           0x0000ffff      /*Sleep duration mask*/
+#define AR5K_SLEEP_CTL_SLDUR_S         0
+#define AR5K_SLEEP_CTL_SLE             0x00030000      /*Sleep enable mask*/
+#define AR5K_SLEEP_CTL_SLE_S           16
+#define AR5K_SLEEP_CTL_SLE_WAKE                0x00000000      /*Force chip 
awake*/
+#define AR5K_SLEEP_CTL_SLE_SLP         0x00010000      /*Force chip sleep*/
+#define AR5K_SLEEP_CTL_SLE_ALLOW       0x00020000      
+#define AR5K_SLEEP_CTL_SLE_UNITS       0x00000008      /*non 5210*/
+
+/*
+ * Interrupt pending register
+ */
+#define AR5K_INTPEND   0x4008
+#define AR5K_INTPEND_M 0x00000001
+
+/*
+ * Sleep force register
+ */
+#define AR5K_SFR       0x400c
+#define AR5K_SFR_M     0x00000001
+
+/*
+ * PCI configuration register
+ *
+ * (5210) = prop is also pressent at 5210 else it's only
+ * for 5211/5212. Also some props are only present at 5210.
+ */
+#define AR5K_PCICFG                    0x4010                  /*Register 
Address*/
+#define AR5K_PCICFG_EEAE               0x00000001      /*Eeprom access enable 
-5210 only*/
+#define AR5K_PCICFG_CLKRUNEN           0x00000004      /*CLKRUN enable*/
+#define AR5K_PCICFG_EESIZE             0x00000018      /*Mask for EEPROM size*/
+#define AR5K_PCICFG_EESIZE_S           3
+#define AR5K_PCICFG_EESIZE_4K          0               /*4K*/
+#define AR5K_PCICFG_EESIZE_8K          1               /*8K*/
+#define AR5K_PCICFG_EESIZE_16K         2               /*16K*/
+#define AR5K_PCICFG_EESIZE_FAIL                3               /*Failed to get 
size (?)*/
+#define AR5K_PCICFG_LED                        0x00000060      /*Led status*/
+#define AR5K_PCICFG_LED_NONE           0x00000000      /*Default*/
+#define AR5K_PCICFG_LED_PEND           0x00000020      /*Scan / Auth pending 
(5210)*/
+#define AR5K_PCICFG_LED_ASSOC          0x00000040      /*Associated (5210)*/
+#define        AR5K_PCICFG_BUS_SEL             0x00000380      /*Mask for "bus 
select" (?)*/
+#define        AR5K_PCICFG_CBEFIX_DIS          0x00000400      /*Disable CBE 
fix (?)*/
+#define AR5K_PCICFG_SL_INTEN           0x00000800      /*Enable interrupts 
when asleep (?) (5210)*/
+#define AR5K_PCICFG_LED_BCTL           0x00001000      /*Led blink (?) -5210 
only*/
+#define AR5K_PCICFG_SL_INPEN           0x00002800      /*Sleep even whith 
pending interrupts (?) (5210)*/
+#define AR5K_PCICFG_SPWR_DN            0x00010000      /*Mask for power status 
(5210)*/
+#define AR5K_PCICFG_LEDMODE            0x000e0000      /*Ledmode*/
+#define AR5K_PCICFG_LEDMODE_PROP       0x00000000      /*Blink on standard 
traffic*/
+#define AR5K_PCICFG_LEDMODE_PROM       0x00020000      /*Default mode (blink 
on any traffic)*/
+#define AR5K_PCICFG_LEDMODE_PWR                0x00040000      /*Some other 
blinking mode  (?)*/
+#define AR5K_PCICFG_LEDMODE_RAND       0x00060000      /*Random blinking (?)*/
+#define AR5K_PCICFG_LEDBLINK           0x00700000      
+#define AR5K_PCICFG_LEDBLINK_S         20
+#define AR5K_PCICFG_LEDSLOW            0x00800000      /*Slow led blink rate 
(?)*/
+#define AR5K_PCICFG_LEDSTATE                           \
+       (AR5K_PCICFG_LED | AR5K_PCICFG_LEDMODE |        \
+       AR5K_PCICFG_LEDBLINK | AR5K_PCICFG_LEDSLOW)
+
+/*
+ * "General Purpose Input/Output" (GPIO) control register
+ *
+ * I'm not sure about this but after looking at the code
+ * for all chipsets here is what i got.
+ *
+ * We have 6 GPIOs (pins), each GPIO has 4 modes (2 bits)
+ * Mode 0 -> always input
+ * Mode 1 -> output when GPIODO for this GPIO is set to 0
+ * Mode 2 -> output when GPIODO for this GPIO is set to 1
+ * Mode 3 -> always output
+ *
+ * For more infos check out get_gpio/set_gpio and
+ * set_gpio_input/set_gpio_output functs.
+ * For more infos on gpio interrupt check out set_gpio_intr.
+ */
+#define AR5K_NUM_GPIO  6
+
+#define AR5K_GPIOCR            0x4014                          /*Register 
Address*/
+#define AR5K_GPIOCR_INT_ENA    0x00008000              /*Enable GPIO 
interrupt*/
+#define AR5K_GPIOCR_INT_SELL   0x00000000              /*Generate interrupt 
when pin is off (?)*/
+#define AR5K_GPIOCR_INT_SELH   0x00010000              /*Generate interrupt 
when pin is on*/
+#define AR5K_GPIOCR_IN(n)      (0 << ((n) * 2))        /*Mode 0 for pin n*/
+#define AR5K_GPIOCR_OUT0(n)    (1 << ((n) * 2))        /*Mode 1 for pin n*/
+#define AR5K_GPIOCR_OUT1(n)    (2 << ((n) * 2))        /*Mode 2 for pin n*/
+#define AR5K_GPIOCR_OUT(n)     (3 << ((n) * 2))        /*Mode 3 for pin n*/
+#define AR5K_GPIOCR_INT_SEL(n) ((n) << 12)             /*Interrupt for GPIO 
pin n*/
+
+/*
+ * "General Purpose Input/Output" (GPIO) data output register
+ */
+#define AR5K_GPIODO    0x4018
+
+/*
+ * "General Purpose Input/Output" (GPIO) data input register
+ */
+#define AR5K_GPIODI    0x401c
+#define AR5K_GPIODI_M  0x0000002f
+
+
+/*
+ * Silicon revision register
+ */
+#define AR5K_SREV              0x4020                  /*Register Address*/
+#define AR5K_SREV_REV          0x0000000f      /*Mask for revision*/
+#define AR5K_SREV_REV_S                0
+#define AR5K_SREV_VER          0x000000ff      /*Mask for version*/
+#define AR5K_SREV_VER_S                4
+
+
+
+/*====EEPROM REGISTERS====*/
+
+/*
+ * EEPROM access registers
+ *
+ * Here we got a difference between 5210/5211-12
+ * read data register for 5210 is at 0x6800 and
+ * status register is at 0x6c00. There is also
+ * no eeprom command register on 5210 and the
+ * offsets are different.
+ *
+ * To read eeprom data for a specific offset:
+ * 5210 - enable eeprom access (AR5K_PCICFG_EEAE)
+ *        read AR5K_EEPROM_BASE +(4 * offset)
+ *        check the eeprom status register
+ *        and read eeprom data register.
+ *
+ * 5211 - write offset to AR5K_EEPROM_BASE
+ * 5212   write AR5K_EEPROM_CMD_READ on AR5K_EEPROM_CMD
+ *        check the eeprom status register
+ *        and read eeprom data register.
+ *
+ * To write eeprom data for a specific offset:
+ * 5210 - enable eeprom access (AR5K_PCICFG_EEAE)
+ *        write data to AR5K_EEPROM_BASE +(4 * offset)
+ *        check the eeprom status register
+ * 5211 - write AR5K_EEPROM_CMD_RESET on AR5K_EEPROM_CMD
+ * 5212   write offset to AR5K_EEPROM_BASE
+ *        write data to data register
+ *       write AR5K_EEPROM_CMD_WRITE on AR5K_EEPROM_CMD
+ *        check the eeprom status register
+ *
+ * For more infos check eeprom_* functs and the ar5k.c
+ * file posted in madwifi-devel mailing list.
+ * http://sourceforge.net/mailarchive/message.php?msg_id=8966525
+ *        
+ */
+#define AR5K_EEPROM_BASE       0x6000
+
+/*
+ * Common ar5xxx EEPROM data offset (set these on AR5K_EEPROM_BASE)
+ */
+#define AR5K_EEPROM_MAGIC              0x003d
+#define AR5K_EEPROM_MAGIC_VALUE                0x5aa5
+#define AR5K_EEPROM_MAGIC_5212         0x0000145c /* 5212 */
+#define AR5K_EEPROM_MAGIC_5211         0x0000145b /* 5211 */
+#define AR5K_EEPROM_MAGIC_5210         0x0000145a /* 5210 */
+
+#define AR5K_EEPROM_PROTECT            0x003f
+#define AR5K_EEPROM_PROTECT_RD_0_31    0x0001
+#define AR5K_EEPROM_PROTECT_WR_0_31    0x0002
+#define AR5K_EEPROM_PROTECT_RD_32_63   0x0004
+#define AR5K_EEPROM_PROTECT_WR_32_63   0x0008
+#define AR5K_EEPROM_PROTECT_RD_64_127  0x0010
+#define AR5K_EEPROM_PROTECT_WR_64_127  0x0020
+#define AR5K_EEPROM_PROTECT_RD_128_191 0x0040
+#define AR5K_EEPROM_PROTECT_WR_128_191 0x0080
+#define AR5K_EEPROM_PROTECT_RD_192_207 0x0100
+#define AR5K_EEPROM_PROTECT_WR_192_207 0x0200
+#define AR5K_EEPROM_PROTECT_RD_208_223 0x0400
+#define AR5K_EEPROM_PROTECT_WR_208_223 0x0800
+#define AR5K_EEPROM_PROTECT_RD_224_239 0x1000
+#define AR5K_EEPROM_PROTECT_WR_224_239 0x2000
+#define AR5K_EEPROM_PROTECT_RD_240_255 0x4000
+#define AR5K_EEPROM_PROTECT_WR_240_255 0x8000
+#define AR5K_EEPROM_REG_DOMAIN         0x00bf
+#define AR5K_EEPROM_INFO_BASE          0x00c0
+#define AR5K_EEPROM_INFO_MAX           (0x400 - AR5K_EEPROM_INFO_BASE)
+#define AR5K_EEPROM_INFO_CKSUM         0xffff
+#define AR5K_EEPROM_INFO(_n)           (AR5K_EEPROM_INFO_BASE + (_n))
+
+#define AR5K_EEPROM_VERSION            AR5K_EEPROM_INFO(1)
+#define AR5K_EEPROM_VERSION_3_0                0x3000
+#define AR5K_EEPROM_VERSION_3_1                0x3001
+#define AR5K_EEPROM_VERSION_3_2                0x3002
+#define AR5K_EEPROM_VERSION_3_3                0x3003
+#define AR5K_EEPROM_VERSION_3_4                0x3004
+#define AR5K_EEPROM_VERSION_4_0                0x4000
+#define AR5K_EEPROM_VERSION_4_1                0x4001
+#define AR5K_EEPROM_VERSION_4_2                0x4002
+#define AR5K_EEPROM_VERSION_4_3                0x4003
+#define AR5K_EEPROM_VERSION_4_6                0x4006
+#define AR5K_EEPROM_VERSION_4_7                0x3007
+
+#define AR5K_EEPROM_MODE_11A           0
+#define AR5K_EEPROM_MODE_11B           1
+#define AR5K_EEPROM_MODE_11G           2
+
+#define AR5K_EEPROM_HDR                        AR5K_EEPROM_INFO(2)
+#define AR5K_EEPROM_HDR_11A(_v)                (((_v) >> AR5K_EEPROM_MODE_11A) 
& 0x1)
+#define AR5K_EEPROM_HDR_11B(_v)                (((_v) >> AR5K_EEPROM_MODE_11B) 
& 0x1)
+#define AR5K_EEPROM_HDR_11G(_v)                (((_v) >> AR5K_EEPROM_MODE_11G) 
& 0x1)
+#define AR5K_EEPROM_HDR_T_2GHZ_DIS(_v) (((_v) >> 3) & 0x1)
+#define AR5K_EEPROM_HDR_T_5GHZ_DBM(_v) (((_v) >> 4) & 0x7f)
+#define AR5K_EEPROM_HDR_DEVICE(_v)     (((_v) >> 11) & 0x7)
+#define AR5K_EEPROM_HDR_T_5GHZ_DIS(_v) (((_v) >> 15) & 0x1)
+#define AR5K_EEPROM_HDR_RFKILL(_v)     (((_v) >> 14) & 0x1)
+
+#define AR5K_EEPROM_RFKILL_GPIO_SEL    0x0000001c
+#define AR5K_EEPROM_RFKILL_GPIO_SEL_S  2
+#define AR5K_EEPROM_RFKILL_POLARITY    0x00000002
+#define AR5K_EEPROM_RFKILL_POLARITY_S  1
+
+/* Newer EEPROMs are using a different offset */
+#define AR5K_EEPROM_OFF(_v, _v3_0, _v3_3) \
+       (((_v) >= AR5K_EEPROM_VERSION_3_3) ? _v3_3 : _v3_0)
+
+#define AR5K_EEPROM_ANT_GAIN(_v)       AR5K_EEPROM_OFF(_v, 0x00c4, 0x00c3)
+#define AR5K_EEPROM_ANT_GAIN_5GHZ(_v)  ((int8_t)(((_v) >> 8) & 0xff))
+#define AR5K_EEPROM_ANT_GAIN_2GHZ(_v)  ((int8_t)((_v) & 0xff))
+
+#define AR5K_EEPROM_MODES_11A(_v)      AR5K_EEPROM_OFF(_v, 0x00c5, 0x00d4)
+#define AR5K_EEPROM_MODES_11B(_v)      AR5K_EEPROM_OFF(_v, 0x00d0, 0x00f2)
+#define AR5K_EEPROM_MODES_11G(_v)      AR5K_EEPROM_OFF(_v, 0x00da, 0x010d)
+#define AR5K_EEPROM_CTL(_v)            AR5K_EEPROM_OFF(_v, 0x00e4, 0x0128)
+
+/* Since 3.1 */
+#define AR5K_EEPROM_OBDB0_2GHZ         0x00ec
+#define AR5K_EEPROM_OBDB1_2GHZ         0x00ed
+
+/* Misc values available since EEPROM 4.0 */
+#define AR5K_EEPROM_MISC0              0x00c4
+#define AR5K_EEPROM_EARSTART(_v)       ((_v) & 0xfff)
+#define AR5K_EEPROM_EEMAP(_v)          (((_v) >> 14) & 0x3)
+#define AR5K_EEPROM_MISC1              0x00c5
+#define AR5K_EEPROM_TARGET_PWRSTART(_v)        ((_v) & 0xfff)
+#define AR5K_EEPROM_HAS32KHZCRYSTAL(_v)        (((_v) >> 14) & 0x1)
+
+/*
+ * EEPROM data register
+ */
+#define AR5K_EEPROM_DATA_5211  0x6004
+#define AR5K_EEPROM_DATA_5210  0x6800
+#define        AR5K_EEPROM_DATA        (hal->ah_version == AR5K_AR5210 ? \
+                               AR5K_EEPROM_DATA_5210 : AR5K_EEPROM_DATA_5211)
+
+/*
+ * EEPROM command register
+ */
+#define AR5K_EEPROM_CMD                0x6008                  /*Register 
Addres*/
+#define AR5K_EEPROM_CMD_READ   0x00000001      /*EEPROM read*/
+#define AR5K_EEPROM_CMD_WRITE  0x00000002      /*EEPROM write*/
+#define AR5K_EEPROM_CMD_RESET  0x00000004      /*EEPROM reset*/
+
+/*
+ * EEPROM status register
+ */
+#define AR5K_EEPROM_STAT_5210  0x6c00                  /*Register Address 
-5210*/
+#define AR5K_EEPROM_STAT_5211  0x600c                  /*Register Address 
-5211/5212*/
+#define        AR5K_EEPROM_STATUS      (hal->ah_version == AR5K_AR5210 ? \
+                               AR5K_EEPROM_STAT_5210 : AR5K_EEPROM_STAT_5211)
+#define AR5K_EEPROM_STAT_RDERR 0x00000001      /*EEPROM read failed*/
+#define AR5K_EEPROM_STAT_RDDONE        0x00000002      /*EEPROM read 
successful*/
+#define AR5K_EEPROM_STAT_WRERR 0x00000004      /*EEPROM write failed*/
+#define AR5K_EEPROM_STAT_WRDONE        0x00000008      /*EEPROM write 
successful*/
+
+/*
+ * EEPROM config register (?)
+ */
+#define AR5K_EEPROM_CFG        0x6010
+
+
+
+/*
+ * Protocol Control Unit (PCU) registers
+ */
+/*Used for checking initial register writes during channel reset (see reset 
func)*/
+#define AR5K_PCU_MIN   0x8000
+#define AR5K_PCU_MAX   0x8fff
+
+/*
+ * First station id register (MAC address in lower 32 bits)
+ */
+#define AR5K_STA_ID0   0x8000
+
+/*
+ * Second station id register (MAC address in upper 16 bits)
+ */
+#define AR5K_STA_ID1                   0x8004                  /*Register 
Address*/
+#define AR5K_STA_ID1_AP                        0x00010000      /*Set AP mode*/
+#define AR5K_STA_ID1_ADHOC             0x00020000      /*Set Ad-Hoc mode*/
+#define AR5K_STA_ID1_PWR_SV            0x00040000      /*Power save reporting 
(?)*/
+#define AR5K_STA_ID1_NO_KEYSRCH                0x00080000      /*No key 
search*/
+#define AR5K_STA_ID1_NO_PSPOLL         0x00100000      /*No uapsd polling 
-5210 only*/
+#define AR5K_STA_ID1_PCF_5211          0x00100000      /*Enable PCF on 
5211/5212*/
+#define AR5K_STA_ID1_PCF_5210          0x00200000      /*Enable PCF on 5210*/
+#define        AR5K_STA_ID1_PCF                (hal->ah_version == AR5K_AR5210 
? \
+                                       AR5K_STA_ID1_PCF_5210 : 
AR5K_STA_ID1_PCF_5211)
+#define AR5K_STA_ID1_DEFAULT_ANTENNA   0x00200000      /*Use default antenna 
on 5211/5212*/
+#define AR5K_STA_ID1_DESC_ANTENNA      0x00400000      /*Update antenna from 
descriptor*/
+#define AR5K_STA_ID1_RTS_DEF_ANTENNA   0x00800000      /*Use default antenna 
for RTS (?)*/
+#define AR5K_STA_ID1_ACKCTS_6MB                0x01000000      /*Use 6Mbit/s 
for ACK/CTS (?)*/
+#define AR5K_STA_ID1_BASE_RATE_11B     0x02000000      /*Use 11b base rate 
(for ACK/CTS ?) -non 5210*/
+
+/*
+ * First BSSID register (MAC address, lower 32bits)
+ */
+#define AR5K_BSS_ID0   0x8008
+
+/*
+ * Second BSSID register (MAC address in upper 16 bits)
+ *
+ * AID: Association ID
+ */
+#define AR5K_BSS_ID1           0x800c
+#define AR5K_BSS_ID1_AID       0xffff0000
+#define AR5K_BSS_ID1_AID_S     16
+
+/*
+ * Backoff slot time register
+ */
+#define AR5K_SLOT_TIME 0x8010
+
+/*
+ * ACK/CTS timeout register
+ */
+#define AR5K_TIME_OUT          0x8014                  /*Register Address*/
+#define AR5K_TIME_OUT_ACK      0x00001fff      /*ACK timeout mask*/
+#define AR5K_TIME_OUT_ACK_S    0
+#define AR5K_TIME_OUT_CTS      0x1fff0000      /*CTS timeout mask*/
+#define AR5K_TIME_OUT_CTS_S    16
+
+/*
+ * RSSI threshold register
+ */
+#define AR5K_RSSI_THR                  0x8018          /*Register Address*/
+#define AR5K_RSSI_THR_M                        0x000000ff      /*Mask for RSSI 
threshold -non 5210*/
+#define AR5K_RSSI_THR_BMISS_5210       0x00000700      /*Mask for Beacon 
Missed threshold -5210*/
+#define AR5K_RSSI_THR_BMISS_5210_S     8
+#define AR5K_RSSI_THR_BMISS_5211       0x0000ff00      /*Mask for Beacon 
Missed threshold -5211/5212*/
+#define AR5K_RSSI_THR_BMISS_5211_S     8
+#define        AR5K_RSSI_THR_BMISS             (hal->ah_version == AR5K_AR5210 
? \
+                                       AR5K_RSSI_THR_BMISS_5210 : 
AR5K_RSSI_THR_BMISS_5211)
+#define        AR5K_RSSI_THR_BMISS_S           8
+
+/*
+ * 5210 has more PCU registers because there is no QCU/DCU
+ * so queue parameters are set here, this way a lot common
+ * registers have different address for 5210. To make things
+ * easier we define a macro based on hal->ah_version for common
+ * registers with different addresses and common flags.
+ */
+
+/*
+ * Retry limit register
+ *
+ * Retry limit register for 5210 (no QCU/DCU so it's done in PCU)
+ */
+#define AR5K_NODCU_RETRY_LMT           0x801c                  /*Register 
Address*/
+#define AR5K_NODCU_RETRY_LMT_SH_RETRY  0x0000000f      /*Short retry limit 
mask*/
+#define AR5K_NODCU_RETRY_LMT_SH_RETRY_S        0
+#define AR5K_NODCU_RETRY_LMT_LG_RETRY  0x000000f0      /*Long retry mask*/
+#define AR5K_NODCU_RETRY_LMT_LG_RETRY_S        4
+#define AR5K_NODCU_RETRY_LMT_SSH_RETRY 0x00003f00      /*Station short retry 
limit mask*/
+#define AR5K_NODCU_RETRY_LMT_SSH_RETRY_S       8
+#define AR5K_NODCU_RETRY_LMT_SLG_RETRY 0x000fc000      /*Station long retry 
limit mask*/
+#define AR5K_NODCU_RETRY_LMT_SLG_RETRY_S       14
+#define AR5K_NODCU_RETRY_LMT_CW_MIN    0x3ff00000      /*Minimum contention 
window mask*/
+#define AR5K_NODCU_RETRY_LMT_CW_MIN_S  20
+
+/*
+ * Transmit latency register
+ */
+#define AR5K_USEC_5210                 0x8020                  /*Register 
Address (5210)*/
+#define AR5K_USEC_5211                 0x801c                  /*Register 
Address (5211/5212)*/
+#define AR5K_USEC                      (hal->ah_version == AR5K_AR5210 ? \
+                                       AR5K_USEC_5210 : AR5K_USEC_5211)
+#define AR5K_USEC_1                    0x0000007f
+#define AR5K_USEC_1_S                  0
+#define AR5K_USEC_32                   0x00003f80
+#define AR5K_USEC_32_S                 7
+#define AR5K_USEC_TX_LATENCY_5211      0x007fc000
+#define AR5K_USEC_TX_LATENCY_5211_S    14
+#define AR5K_USEC_RX_LATENCY_5211      0x1f800000
+#define AR5K_USEC_RX_LATENCY_5211_S    23
+#define AR5K_USEC_TX_LATENCY_5210      0x000fc000      /*also for 5311*/
+#define AR5K_USEC_TX_LATENCY_5210_S    14
+#define AR5K_USEC_RX_LATENCY_5210      0x03f00000      /*also for 5311*/
+#define AR5K_USEC_RX_LATENCY_5210_S    20
+
+/*
+ * PCU beacon control register
+ */
+#define AR5K_BEACON_5210       0x8024
+#define AR5K_BEACON_5211       0x8020
+#define AR5K_BEACON            (hal->ah_version == AR5K_AR5210 ? \
+                               AR5K_BEACON_5210 : AR5K_BEACON_5211)
+#define AR5K_BEACON_PERIOD     0x0000ffff
+#define AR5K_BEACON_PERIOD_S   0
+#define AR5K_BEACON_TIM                0x007f0000
+#define AR5K_BEACON_TIM_S      16
+#define AR5K_BEACON_ENABLE     0x00800000
+#define AR5K_BEACON_RESET_TSF  0x01000000
+
+/*
+ * CFP period register
+ */
+#define AR5K_CFP_PERIOD_5210   0x8028
+#define AR5K_CFP_PERIOD_5211   0x8024
+#define AR5K_CFP_PERIOD                (hal->ah_version == AR5K_AR5210 ? \
+                               AR5K_CFP_PERIOD_5210 : AR5K_CFP_PERIOD_5211)
+
+/*
+ * Next beacon time register
+ */
+#define AR5K_TIMER0_5210       0x802c
+#define AR5K_TIMER0_5211       0x8028
+#define AR5K_TIMER0            (hal->ah_version == AR5K_AR5210 ? \
+                               AR5K_TIMER0_5210 : AR5K_TIMER0_5211)
+
+/*
+ * Next DMA beacon alert register
+ */
+#define AR5K_TIMER1_5210       0x8030
+#define AR5K_TIMER1_5211       0x802c
+#define AR5K_TIMER1            (hal->ah_version == AR5K_AR5210 ? \
+                               AR5K_TIMER1_5210 : AR5K_TIMER1_5211)
+
+/*
+ * Next software beacon alert register
+ */
+#define AR5K_TIMER2_5210       0x8034
+#define AR5K_TIMER2_5211       0x8030
+#define AR5K_TIMER2            (hal->ah_version == AR5K_AR5210 ? \
+                               AR5K_TIMER2_5210 : AR5K_TIMER2_5211)
+
+/*
+ * Next ATIM window time register
+ */
+#define AR5K_TIMER3_5210       0x8038
+#define AR5K_TIMER3_5211       0x8034
+#define AR5K_TIMER3            (hal->ah_version == AR5K_AR5210 ? \
+                               AR5K_TIMER3_5210 : AR5K_TIMER3_5211)
+
+
+/*
+ * 5210 First inter frame spacing register (IFS)
+ */
+#define AR5K_IFS0              0x8040
+#define AR5K_IFS0_SIFS         0x000007ff
+#define AR5K_IFS0_SIFS_S       0
+#define AR5K_IFS0_DIFS         0x007ff800
+#define AR5K_IFS0_DIFS_S       11
+
+/*
+ * 5210 Second inter frame spacing register (IFS)
+ */
+#define AR5K_IFS1              0x8044
+#define AR5K_IFS1_PIFS         0x00000fff
+#define AR5K_IFS1_PIFS_S       0
+#define AR5K_IFS1_EIFS         0x03fff000
+#define AR5K_IFS1_EIFS_S       12
+#define AR5K_IFS1_CS_EN                0x04000000
+
+
+/*
+ * CFP duration register
+ */
+#define AR5K_CFP_DUR_5210      0x8048
+#define AR5K_CFP_DUR_5211      0x8038
+#define AR5K_CFP_DUR           (hal->ah_version == AR5K_AR5210 ? \
+                               AR5K_CFP_DUR_5210 : AR5K_CFP_DUR_5211)
+
+/*
+ * Receive filter register
+ * TODO: Get these out of ar5xxx.h on ath5k
+ */
+#define AR5K_RX_FILTER_5210    0x804c                  /*Register Address 
(521)*/
+#define AR5K_RX_FILTER_5211    0x803c                  /*Register Address 
(5211/5212)*/
+#define AR5K_RX_FILTER         (hal->ah_version == AR5K_AR5210 ? \
+                               AR5K_RX_FILTER_5210 : AR5K_RX_FILTER_5211)
+#define        AR5K_RX_FILTER_UCAST    0x00000001      /* Don't filter unicast 
frames */
+#define        AR5K_RX_FILTER_MCAST    0x00000002      /* Don't filter 
multicast frames */
+#define        AR5K_RX_FILTER_BCAST    0x00000004      /* Don't filter 
broadcast frames */
+#define        AR5K_RX_FILTER_CONTROL  0x00000008      /* Don't filter control 
frames */
+#define        AR5K_RX_FILTER_BEACON   0x00000010      /* Don't filter beacon 
frames */
+#define        AR5K_RX_FILTER_PROM     0x00000020      /* Set promiscuous mode 
*/
+#define        AR5K_RX_FILTER_XRPOLL   0x00000040      /* Don't filter XR poll 
frame -5212 only*/
+#define        AR5K_RX_FILTER_PROBEREQ 0x00000080      /* Don't filter probe 
requests -5212 only*/
+#define        AR5K_RX_FILTER_PHYERR_5212      0x00000100      /* Don't filter 
phy errors */
+#define        AR5K_RX_FILTER_RADARERR_5212    0x00000200      /* Don't filter 
phy radar errors*/
+#define AR5K_RX_FILTER_PHYERR_5211     0x00000040      /*5211 only*/
+#define AR5K_RX_FILTER_RADARERR_5211   0x00000080      /*5211 only*/
+#define AR5K_RX_FILTER_PHYERR  (hal->ah_version == AR5K_AR5211 ? \
+                               AR5K_RX_FILTER_PHYERR_5211 : 
AR5K_RX_FILTER_PHYERR_5212)
+#define        AR5K_RX_FILTER_RADARERR (hal->ah_version == AR5K_AR5211 ? \
+                               AR5K_RX_FILTER_RADARERR_5211 : 
AR5K_RX_FILTER_RADARERR_5212)
+/*
+ * Multicast filter register (lower 32 bits)
+ */
+#define AR5K_MCAST_FILTER0_5210        0x8050
+#define AR5K_MCAST_FILTER0_5211        0x8040
+#define AR5K_MCAST_FILTER0     (hal->ah_version == AR5K_AR5210 ? \
+                               AR5K_MCAST_FILTER0_5210 : 
AR5K_MCAST_FILTER0_5211)
+
+/*
+ * Multicast filter register (higher 16 bits)
+ */
+#define AR5K_MCAST_FILTER1_5210        0x8054
+#define AR5K_MCAST_FILTER1_5211        0x8044
+#define AR5K_MCAST_FILTER1     (hal->ah_version == AR5K_AR5210 ? \
+                               AR5K_MCAST_FILTER1_5210 : 
AR5K_MCAST_FILTER1_5211)
+
+
+/*
+ * Transmit mask register (lower 32 bits) (5210)
+ */
+#define AR5K_TX_MASK0  0x8058
+
+/*
+ * Transmit mask register (higher 16 bits) (5210)
+ */
+#define AR5K_TX_MASK1  0x805c
+
+/*
+ * Clear transmit mask (5210)
+ */
+#define AR5K_CLR_TMASK 0x8060
+
+/*
+ * Trigger level register (before transmission) (5210)
+ */
+#define AR5K_TRIG_LVL  0x8064
+
+
+/*
+ * PCU control register
+ *
+ * Only DIS_RX is used in the code, the rest i guess are
+ * for tweaking/diagnostics.
+ */
+#define AR5K_DIAG_SW_5210              0x8068                  /*Register 
Address (5210)*/
+#define AR5K_DIAG_SW_5211              0x8048                  /*Register 
Address (5211/5212)*/
+#define AR5K_DIAG_SW                   (hal->ah_version == AR5K_AR5210 ? \
+                                       AR5K_DIAG_SW_5210 : AR5K_DIAG_SW_5211)
+#define AR5K_DIAG_SW_DIS_WEP_ACK       0x00000001      
+#define AR5K_DIAG_SW_DIS_ACK           0x00000002      /*Disable ACKs (?)*/
+#define AR5K_DIAG_SW_DIS_CTS           0x00000004      /*Disable CTSs (?)*/
+#define AR5K_DIAG_SW_DIS_ENC           0x00000008      /*Disable encryption 
(?)*/
+#define AR5K_DIAG_SW_DIS_DEC           0x00000010      /*Disable decryption 
(?)*/
+#define AR5K_DIAG_SW_DIS_TX            0x00000020      /*Disable transmit 
-5210 only*/
+#define AR5K_DIAG_SW_DIS_RX_5210       0x00000040      /*Disable recieve*/
+#define AR5K_DIAG_SW_DIS_RX_5211       0x00000020
+#define        AR5K_DIAG_SW_DIS_RX             (hal->ah_version == AR5K_AR5210 
? \
+                                       AR5K_DIAG_SW_DIS_RX_5210 : 
AR5K_DIAG_SW_DIS_RX_5211)
+#define AR5K_DIAG_SW_LOOP_BACK_5210    0x00000080      /*Loopback (i guess it 
goes with DIS_TX) -5210 only*/
+#define AR5K_DIAG_SW_LOOP_BACK_5211    0x00000040
+#define AR5K_DIAG_SW_LOOP_BACK         (hal->ah_version == AR5K_AR5210 ? \
+                                       AR5K_DIAG_SW_LOOP_BACK_5210 : 
AR5K_DIAG_SW_LOOP_BACK_5211)
+#define AR5K_DIAG_SW_CORR_FCS_5210     0x00000100      
+#define AR5K_DIAG_SW_CORR_FCS_5211     0x00000080
+#define AR5K_DIAG_SW_CORR_FCS          (hal->ah_version == AR5K_AR5210 ? \
+                                       AR5K_DIAG_SW_CORR_FCS_5210 : 
AR5K_DIAG_SW_CORR_FCS_5211)
+#define AR5K_DIAG_SW_CHAN_INFO_5210    0x00000200      
+#define AR5K_DIAG_SW_CHAN_INFO_5211    0x00000100
+#define AR5K_DIAG_SW_CHAN_INFO         (hal->ah_version == AR5K_AR5210 ? \
+                                       AR5K_DIAG_SW_CHAN_INFO_5210 : 
AR5K_DIAG_SW_CHAN_INFO_5211)
+#define AR5K_DIAG_SW_EN_SCRAM_SEED_5211        0x00000200      /*Scrambler 
seed (?)*/
+#define AR5K_DIAG_SW_EN_SCRAM_SEED_5210        0x00000400
+#define AR5K_DIAG_SW_EN_SCRAM_SEED     (hal->ah_version == AR5K_AR5210 ? \
+                                       AR5K_DIAG_SW_EN_SCRAM_SEED_5210 : 
AR5K_DIAG_SW_EN_SCRAM_SEED_5211)
+#define AR5K_DIAG_SW_ECO_ENABLE                0x00000400      /*non 5210*/
+#define AR5K_DIAG_SW_SCVRAM_SEED       0x0003f800      /*5210 only*/
+#define AR5K_DIAG_SW_SCRAM_SEED_M      0x0001fc00      /*Scrambler seed mask 
(?)*/
+#define AR5K_DIAG_SW_SCRAM_SEED_S      10
+#define AR5K_DIAG_SW_DIS_SEQ_INC       0x00040000      /*Disable seqnum 
increment (?)-5210 only*/
+#define AR5K_DIAG_SW_FRAME_NV0_5210    0x00080000      
+#define AR5K_DIAG_SW_FRAME_NV0_5211    0x00020000
+#define        AR5K_DIAG_SW_FRAME_NV0          (hal->ah_version == AR5K_AR5210 
? \
+                                       AR5K_DIAG_SW_FRAME_NV0_5210 : 
AR5K_DIAG_SW_FRAME_NV0_5211)
+#define AR5K_DIAG_SW_OBSPT_M           0x000c0000      
+#define AR5K_DIAG_SW_OBSPT_S           18
+
+/*
+ * TSF (clock) register (lower 32 bits)
+ */
+#define AR5K_TSF_L32_5210      0x806c
+#define AR5K_TSF_L32_5211      0x804c
+#define        AR5K_TSF_L32            (hal->ah_version == AR5K_AR5210 ? \
+                               AR5K_TSF_L32_5210 : AR5K_TSF_L32_5211)
+
+/*
+ * TSF (clock) register (higher 32 bits)
+ */
+#define AR5K_TSF_U32_5210      0x8070
+#define AR5K_TSF_U32_5211      0x8050
+#define        AR5K_TSF_U32            (hal->ah_version == AR5K_AR5210 ? \
+                               AR5K_TSF_U32_5210 : AR5K_TSF_U32_5211)
+
+/*
+ * Last beacon timestamp register
+ */
+#define AR5K_LAST_TSTP 0x8080
+
+/*
+ * ADDAC test register (5211/5212)
+ */
+#define AR5K_ADDAC_TEST        0x8054
+
+/*
+ * Default antenna register (5211/5212)
+ */
+#define AR5K_DEFAULT_ANTENNA   0x8058
+
+
+
+/*
+ * Retry count register (5210)
+ */
+#define AR5K_RETRY_CNT         0x8084                  /*Register Address 
(5210)*/
+#define AR5K_RETRY_CNT_SSH     0x0000003f      /*Station short retry count 
(?)*/
+#define AR5K_RETRY_CNT_SLG     0x00000fc0      /*Station long retry count (?)*/
+
+/*
+ * Back-off status register (5210)
+ */
+#define AR5K_BACKOFF           0x8088                  /*Register Address 
(5210)*/
+#define AR5K_BACKOFF_CW                0x000003ff      /*Backoff Contention 
Window (?)*/
+#define AR5K_BACKOFF_CNT       0x03ff0000      /*Backoff count (?)*/
+
+
+
+/*
+ * NAV register (current)
+ */
+#define AR5K_NAV_5210          0x808c
+#define AR5K_NAV_5211          0x8084
+#define        AR5K_NAV                (hal->ah_version == AR5K_AR5210 ? \
+                               AR5K_NAV_5210 : AR5K_NAV_5211)
+
+/*
+ * RTS success register
+ */
+#define AR5K_RTS_OK_5210       0x8090
+#define AR5K_RTS_OK_5211       0x8088
+#define        AR5K_RTS_OK             (hal->ah_version == AR5K_AR5210 ? \
+                               AR5K_RTS_OK_5210 : AR5K_RTS_OK_5211)
+
+/*
+ * RTS failure register
+ */
+#define AR5K_RTS_FAIL_5210     0x8094
+#define AR5K_RTS_FAIL_5211     0x808c
+#define        AR5K_RTS_FAIL           (hal->ah_version == AR5K_AR5210 ? \
+                               AR5K_RTS_FAIL_5210 : AR5K_RTS_FAIL_5211)
+
+/*
+ * ACK failure register
+ */
+#define AR5K_ACK_FAIL_5210     0x8098
+#define AR5K_ACK_FAIL_5211     0x8090
+#define        AR5K_ACK_FAIL           (hal->ah_version == AR5K_AR5210 ? \
+                               AR5K_ACK_FAIL_5210 : AR5K_ACK_FAIL_5211)
+
+/*
+ * FCS failure register
+ */
+#define AR5K_FCS_FAIL_5210     0x809c
+#define AR5K_FCS_FAIL_5211     0x8094
+#define        AR5K_FCS_FAIL           (hal->ah_version == AR5K_AR5210 ? \
+                               AR5K_FCS_FAIL_5210 : AR5K_FCS_FAIL_5211)
+
+/*
+ * Beacon count register
+ */
+#define AR5K_BEACON_CNT_5210   0x80a0
+#define AR5K_BEACON_CNT_5211   0x8098
+#define        AR5K_BEACON_CNT         (hal->ah_version == AR5K_AR5210 ? \
+                               AR5K_BEACON_CNT_5210 : AR5K_BEACON_CNT_5211)
+
+
+/*===5212 Specific PCU registers===*/
+
+/*
+ * XR (eXtended Range) mode register
+ */
+#define AR5K_XRMODE                    0x80c0
+#define        AR5K_XRMODE_POLL_TYPE_M         0x0000003f
+#define        AR5K_XRMODE_POLL_TYPE_S         0
+#define        AR5K_XRMODE_POLL_SUBTYPE_M      0x0000003c
+#define        AR5K_XRMODE_POLL_SUBTYPE_S      2
+#define        AR5K_XRMODE_POLL_WAIT_ALL       0x00000080
+#define        AR5K_XRMODE_SIFS_DELAY          0x000fff00
+#define        AR5K_XRMODE_FRAME_HOLD_M        0xfff00000
+#define        AR5K_XRMODE_FRAME_HOLD_S        20
+
+/*
+ * XR delay register
+ */
+#define AR5K_XRDELAY                   0x80c4
+#define AR5K_XRDELAY_SLOT_DELAY_M      0x0000ffff
+#define AR5K_XRDELAY_SLOT_DELAY_S      0
+#define AR5K_XRDELAY_CHIRP_DELAY_M     0xffff0000
+#define AR5K_XRDELAY_CHIRP_DELAY_S     16
+
+/*
+ * XR timeout register
+ */
+#define AR5K_XRTIMEOUT                 0x80c8
+#define AR5K_XRTIMEOUT_CHIRP_M         0x0000ffff
+#define AR5K_XRTIMEOUT_CHIRP_S         0
+#define AR5K_XRTIMEOUT_POLL_M          0xffff0000
+#define AR5K_XRTIMEOUT_POLL_S          16
+
+/*
+ * XR chirp register
+ */
+#define AR5K_XRCHIRP                   0x80cc
+#define AR5K_XRCHIRP_SEND              0x00000001
+#define AR5K_XRCHIRP_GAP               0xffff0000
+
+/*
+ * XR stomp register
+ */
+#define AR5K_XRSTOMP                   0x80d0
+#define AR5K_XRSTOMP_TX                        0x00000001
+#define AR5K_XRSTOMP_RX_ABORT          0x00000002
+#define AR5K_XRSTOMP_RSSI_THRES                0x0000ff00
+
+/*
+ * First enhanced sleep register
+ */
+#define AR5K_SLEEP0                    0x80d4
+#define AR5K_SLEEP0_NEXT_DTIM          0x0007ffff
+#define AR5K_SLEEP0_NEXT_DTIM_S                0
+#define AR5K_SLEEP0_ASSUME_DTIM                0x00080000
+#define AR5K_SLEEP0_ENH_SLEEP_EN       0x00100000
+#define AR5K_SLEEP0_CABTO              0xff000000
+#define AR5K_SLEEP0_CABTO_S            24
+
+/*
+ * Second enhanced sleep register
+ */
+#define AR5K_SLEEP1                    0x80d8
+#define AR5K_SLEEP1_NEXT_TIM           0x0007ffff
+#define AR5K_SLEEP1_NEXT_TIM_S         0
+#define AR5K_SLEEP1_BEACON_TO          0xff000000
+#define AR5K_SLEEP1_BEACON_TO_S                24
+
+/*
+ * Third enhanced sleep register
+ */
+#define AR5K_SLEEP2                    0x80dc
+#define AR5K_SLEEP2_TIM_PER            0x0000ffff
+#define AR5K_SLEEP2_TIM_PER_S          0
+#define AR5K_SLEEP2_DTIM_PER           0xffff0000
+#define AR5K_SLEEP2_DTIM_PER_S         16
+
+/*
+ * BSSID mask registers
+ */
+#define AR5K_BSS_IDM0                  0x80e0
+#define AR5K_BSS_IDM1                  0x80e4
+
+/*
+ * TX power control (TPC) register
+ */
+#define AR5K_TXPC                      0x80e8
+#define AR5K_TXPC_ACK_M                        0x0000003f
+#define AR5K_TXPC_ACK_S                        0
+#define AR5K_TXPC_CTS_M                        0x00003f00
+#define AR5K_TXPC_CTS_S                        8
+#define AR5K_TXPC_CHIRP_M              0x003f0000
+#define AR5K_TXPC_CHIRP_S              22
+
+/*
+ * Profile count registers
+ */
+#define AR5K_PROFCNT_TX                        0x80ec
+#define AR5K_PROFCNT_RX                        0x80f0
+#define AR5K_PROFCNT_RXCLR             0x80f4
+#define AR5K_PROFCNT_CYCLE             0x80f8
+
+/*
+ * TSF parameter register
+ */
+#define AR5K_TSF_PARM                  0x8104
+#define AR5K_TSF_PARM_INC_M            0x000000ff
+#define AR5K_TSF_PARM_INC_S            0
+
+/*
+ * PHY error filter register
+ */
+#define AR5K_PHY_ERR_FIL               0x810c
+#define AR5K_PHY_ERR_FIL_RADAR         0x00000020
+#define AR5K_PHY_ERR_FIL_OFDM          0x00020000
+#define AR5K_PHY_ERR_FIL_CCK           0x02000000
+
+/*
+ * Rate duration register
+ */
+#define AR5K_RATE_DUR_BASE             0x8700
+#define AR5K_RATE_DUR(_n)              (AR5K_RATE_DUR_BASE + ((_n) << 2))
+
+/*===5212===*/
+
+/*
+ * Key table (WEP) register
+ */
+#define AR5K_KEYTABLE_0_5210           0x9000
+#define AR5K_KEYTABLE_0_5211           0x8800
+#define AR5K_KEYTABLE_5210(_n)         (AR5K_KEYTABLE_0_5210 + ((_n) << 5))
+#define AR5K_KEYTABLE_5211(_n)         (AR5K_KEYTABLE_0_5211 + ((_n) * 32))
+#define        AR5K_KEYTABLE(_n)               (hal->ah_version == AR5K_AR5210 
? \
+                                       AR5K_KEYTABLE_5210(_n) : 
AR5K_KEYTABLE_5211(_n))
+#define AR5K_KEYTABLE_OFF(_n, x)       (AR5K_KEYTABLE(_n) + (x << 2))
+#define AR5K_KEYTABLE_TYPE(_n)         AR5K_KEYTABLE_OFF(_n, 5)
+#define AR5K_KEYTABLE_TYPE_40          0x00000000
+#define AR5K_KEYTABLE_TYPE_104         0x00000001
+#define AR5K_KEYTABLE_TYPE_128         0x00000003
+#define AR5K_KEYTABLE_TYPE_TKIP                0x00000004      /*5212*/
+#define AR5K_KEYTABLE_TYPE_AES         0x00000005      /*!5210*/
+#define AR5K_KEYTABLE_TYPE_CCM         0x00000006      /*5212*/
+#define AR5K_KEYTABLE_TYPE_NULL                0x00000007      /*!5210*/
+#define AR5K_KEYTABLE_ANTENNA          0x00000008      /*5212*/
+#define AR5K_KEYTABLE_MAC0(_n)         AR5K_KEYTABLE_OFF(_n, 6)
+#define AR5K_KEYTABLE_MAC1(_n)         AR5K_KEYTABLE_OFF(_n, 7)
+#define AR5K_KEYTABLE_VALID            0x00008000
+
+#define AR5K_KEYTABLE_SIZE_5210                64
+#define AR5K_KEYTABLE_SIZE_5211                128
+#define        AR5K_KEYTABLE_SIZE              (hal->ah_version == AR5K_AR5210 
? \
+                                       AR5K_KEYTABLE_SIZE_5210 : 
AR5K_KEYTABLE_SIZE_5211)
+#define AR5K_KEYCACHE_SIZE             8
+
+
+
+/*===PHY REGISTERS===*/
+
+/*
+ * PHY register
+ */
+#define        AR5K_PHY_BASE                   0x9800
+#define        AR5K_PHY(_n)                    (AR5K_PHY_BASE + ((_n) << 2))
+#define AR5K_PHY_SHIFT_2GHZ            0x00004007
+#define AR5K_PHY_SHIFT_5GHZ            0x00000007
+
+/*
+ * PHY frame control register (5210) /turbo mode register (5211/5212)
+ *
+ * There is another frame control register for 5211/5212
+ * at address 0x9944 (see below) but the 2 first flags
+ * are common here between 5210 frame control register
+ * and 5211/5212 turbo mode register, so this also works as 
+ * a "turbo mode register" for 5210. We treat this one as 
+ * a frame control register for 5210 below.
+ */
+#define        AR5K_PHY_TURBO                  0x9804
+#define        AR5K_PHY_TURBO_MODE             0x00000001
+#define        AR5K_PHY_TURBO_SHORT            0x00000002
+
+/*
+ * PHY agility command register
+ */
+#define        AR5K_PHY_AGC                    0x9808
+#define        AR5K_PHY_AGC_DISABLE            0x08000000
+
+/*
+ * PHY timing register (5212)
+ */
+#define        AR5K_PHY_TIMING_3               0x9814
+#define        AR5K_PHY_TIMING_3_DSC_MAN       0xfffe0000
+#define        AR5K_PHY_TIMING_3_DSC_MAN_S     17
+#define        AR5K_PHY_TIMING_3_DSC_EXP       0x0001e000
+#define        AR5K_PHY_TIMING_3_DSC_EXP_S     13
+
+/*
+ * PHY chip revision register
+ */
+#define        AR5K_PHY_CHIP_ID                0x9818
+
+/*
+ * PHY activation register
+ */
+#define        AR5K_PHY_ACT                    0x981c
+#define        AR5K_PHY_ACT_ENABLE             0x00000001
+#define        AR5K_PHY_ACT_DISABLE            0x00000002
+
+/*
+ * PHY signal register (5210)
+ */
+#define        AR5K_PHY_SIG                    0x9858
+#define        AR5K_PHY_SIG_FIRSTEP            0x0003f000
+#define        AR5K_PHY_SIG_FIRSTEP_S          12
+#define        AR5K_PHY_SIG_FIRPWR             0x03fc0000
+#define        AR5K_PHY_SIG_FIRPWR_S           18
+
+/*
+ * PHY coarse agility control register (5210)
+ */
+#define        AR5K_PHY_AGCCOARSE              0x985c
+#define        AR5K_PHY_AGCCOARSE_LO           0x00007f80
+#define        AR5K_PHY_AGCCOARSE_LO_S         7
+#define        AR5K_PHY_AGCCOARSE_HI           0x003f8000
+#define        AR5K_PHY_AGCCOARSE_HI_S         15
+
+/*
+ * PHY agility control register
+ */
+#define        AR5K_PHY_AGCCTL                 0x9860
+#define        AR5K_PHY_AGCCTL_CAL             0x00000001
+#define        AR5K_PHY_AGCCTL_NF              0x00000002
+
+/*
+ * PHY noise floor status register
+ */
+#define AR5K_PHY_NF                    0x9864
+#define AR5K_PHY_NF_M                  0x000001ff
+#define AR5K_PHY_NF_ACTIVE             0x00000100
+#define AR5K_PHY_NF_RVAL(_n)           (((_n) >> 19) & AR5K_PHY_NF_M)
+#define AR5K_PHY_NF_AVAL(_n)           (-((_n) ^ AR5K_PHY_NF_M) + 1)
+#define AR5K_PHY_NF_SVAL(_n)           (((_n) & AR5K_PHY_NF_M) | (1 << 9))
+
+/*
+ * PHY ADC saturation register (5210)
+ */
+#define        AR5K_PHY_ADCSAT                 0x9868
+#define        AR5K_PHY_ADCSAT_ICNT            0x0001f800
+#define        AR5K_PHY_ADCSAT_ICNT_S          11
+#define        AR5K_PHY_ADCSAT_THR             0x000007e0
+#define        AR5K_PHY_ADCSAT_THR_S           5
+
+/*
+ * PHY sleep registers (5212)
+ */
+#define AR5K_PHY_SCR                   0x9870
+#define AR5K_PHY_SCR_32MHZ             0x0000001f
+#define AR5K_PHY_SLMT                  0x9874
+#define AR5K_PHY_SLMT_32MHZ            0x0000007f
+#define AR5K_PHY_SCAL                  0x9878
+#define AR5K_PHY_SCAL_32MHZ            0x0000000e
+
+/*
+ * PHY PLL control register (!5210)
+ */
+#define        AR5K_PHY_PLL                    0x987c
+#define        AR5K_PHY_PLL_20MHZ              0x13            /*5211 only*/
+#define        AR5K_PHY_PLL_40MHZ_5211         0x18
+#define        AR5K_PHY_PLL_40MHZ_5212         0x000000aa
+#define        AR5K_PHY_PLL_40MHZ              (hal->ah_version == AR5K_AR5211 
? \
+                                       AR5K_PHY_PLL_40MHZ_5211 : 
AR5K_PHY_PLL_40MHZ_5212)
+#define        AR5K_PHY_PLL_44MHZ_5211         0x19
+#define        AR5K_PHY_PLL_44MHZ_5212         0x000000ab
+#define        AR5K_PHY_PLL_44MHZ              (hal->ah_version == AR5K_AR5211 
? \
+                                       AR5K_PHY_PLL_44MHZ_5211 : 
AR5K_PHY_PLL_44MHZ_5212)
+#define AR5K_PHY_PLL_AR5111            0x00000000
+#define AR5K_PHY_PLL_AR5112            0x00000040
+
+/*
+ * PHY RF stage register (5210)
+ */
+#define AR5K_PHY_RFSTG                 0x98d4
+#define AR5K_PHY_RFSTG_DISABLE         0x00000021
+
+/*
+ * PHY receiver delay register (!5210)
+ */
+#define        AR5K_PHY_RX_DELAY               0x9914
+#define        AR5K_PHY_RX_DELAY_M             0x00003fff
+
+/*
+ * PHY timing IQ control register (!5210)
+ */
+#define        AR5K_PHY_IQ                     0x9920
+#define        AR5K_PHY_IQ_CORR_Q_Q_COFF       0x0000001f
+#define        AR5K_PHY_IQ_CORR_Q_I_COFF       0x000007e0
+#define        AR5K_PHY_IQ_CORR_Q_I_COFF_S     5
+#define        AR5K_PHY_IQ_CORR_ENABLE         0x00000800
+#define        AR5K_PHY_IQ_CAL_NUM_LOG_MAX     0x0000f000
+#define        AR5K_PHY_IQ_CAL_NUM_LOG_MAX_S   12
+#define        AR5K_PHY_IQ_RUN                 0x00010000
+
+
+/*
+ * PHY PAPD probe register (!5210)
+ */
+#define        AR5K_PHY_PAPD_PROBE             0x9930
+#define        AR5K_PHY_PAPD_PROBE_TXPOWER     0x00007e00
+#define        AR5K_PHY_PAPD_PROBE_TXPOWER_S   9
+#define        AR5K_PHY_PAPD_PROBE_TX_NEXT     0x00008000
+#define        AR5K_PHY_PAPD_PROBE_TYPE        0x01800000      /*5212 only*/
+#define        AR5K_PHY_PAPD_PROBE_TYPE_S      23
+#define        AR5K_PHY_PAPD_PROBE_TYPE_OFDM   0
+#define        AR5K_PHY_PAPD_PROBE_TYPE_XR     1
+#define        AR5K_PHY_PAPD_PROBE_TYPE_CCK    2
+#define        AR5K_PHY_PAPD_PROBE_GAINF       0xfe000000
+#define        AR5K_PHY_PAPD_PROBE_GAINF_S     25
+
+
+/*
+ * PHY TX power registers (5212)
+ */
+#define        AR5K_PHY_TXPOWER_RATE1                  0x9934
+#define        AR5K_PHY_TXPOWER_RATE2                  0x9938
+#define        AR5K_PHY_TXPOWER_RATE_MAX               0x993c
+#define        AR5K_PHY_TXPOWER_RATE_MAX_TPC_ENABLE    0x00000040
+#define        AR5K_PHY_TXPOWER_RATE3                  0xa234
+#define        AR5K_PHY_TXPOWER_RATE4                  0xa238
+
+/*
+ * PHY frame control register (!5210)
+ */
+#define        AR5K_PHY_FRAME_CTL_5210         0x9804
+#define        AR5K_PHY_FRAME_CTL_5211         0x9944
+#define        AR5K_PHY_FRAME_CTL              (hal->ah_version == AR5K_AR5210 
? \
+                                       AR5K_PHY_FRAME_CTL_5210 : 
AR5K_PHY_FRAME_CTL_5211)
+/*---non 5210---*/
+#define        AR5K_PHY_FRAME_CTL_TX_CLIP      0x00000038
+#define        AR5K_PHY_FRAME_CTL_TX_CLIP_S    3
+/*---5210 only---*/
+#define        AR5K_PHY_FRAME_CTL_TIMING_ERR   0x01000000
+#define        AR5K_PHY_FRAME_CTL_PARITY_ERR   0x02000000
+#define        AR5K_PHY_FRAME_CTL_ILLRATE_ERR  0x04000000
+#define        AR5K_PHY_FRAME_CTL_ILLLEN_ERR   0x08000000
+#define        AR5K_PHY_FRAME_CTL_SERVICE_ERR  0x20000000
+#define        AR5K_PHY_FRAME_CTL_TXURN_ERR    0x40000000
+
+/*
+ * PHY radar detection enable register (!5210)
+ */
+#define        AR5K_PHY_RADAR                  0x9954
+#define        AR5K_PHY_RADAR_DISABLE          0x00000000
+#define        AR5K_PHY_RADAR_ENABLE           0x00000001
+
+/*
+ * PHY antenna switch table registers (!5210)
+ */
+#define AR5K_PHY_ANT_SWITCH_TABLE_0    0x9960
+#define AR5K_PHY_ANT_SWITCH_TABLE_1    0x9964
+
+/*
+ * PHY clock sleep registers (5212)
+ */
+#define AR5K_PHY_SCLOCK                        0x99f0
+#define AR5K_PHY_SCLOCK_32MHZ          0x0000000c
+#define AR5K_PHY_SDELAY                        0x99f4
+#define AR5K_PHY_SDELAY_32MHZ          0x000000ff
+#define AR5K_PHY_SPENDING              0x99f8
+#define AR5K_PHY_SPENDING_AR5111       0x00000018
+#define AR5K_PHY_SPENDING_AR5112       0x00000014
+
+/*
+ * Misc PHY/radio registers (5210/5211)
+ */
+#define        AR5K_BB_GAIN_BASE               0x9b00
+#define AR5K_BB_GAIN(_n)               (AR5K_BB_GAIN_BASE + ((_n) << 2))
+#define        AR5K_RF_GAIN_BASE               0x9a00
+#define AR5K_RF_GAIN(_n)               (AR5K_RF_GAIN_BASE + ((_n) << 2))
+
+/*
+ * PHY timing IQ calibration result register (!5210)
+ */
+#define        AR5K_PHY_IQRES_CAL_PWR_I        0x9c10
+#define        AR5K_PHY_IQRES_CAL_PWR_Q        0x9c14
+#define        AR5K_PHY_IQRES_CAL_CORR         0x9c18
+
+/*
+ * PHY current RSSI register (!5210)
+ */
+#define        AR5K_PHY_CURRENT_RSSI           0x9c1c
+
+/*
+ * PHY PCDAC TX power register (5212)
+ */
+#define        AR5K_PHY_PCDAC_TXPOWER_BASE     0xa180
+#define        AR5K_PHY_PCDAC_TXPOWER(_n)      (AR5K_PHY_PCDAC_TXPOWER_BASE + 
((_n) << 2))
+
+/*
+ * PHY mode register (!5210)
+ */
+#define        AR5K_PHY_MODE                   0x0a200
+#define        AR5K_PHY_MODE_MOD               0x00000001
+#define AR5K_PHY_MODE_MOD_OFDM         0
+#define AR5K_PHY_MODE_MOD_CCK          1
+#define AR5K_PHY_MODE_FREQ             0x00000002
+#define        AR5K_PHY_MODE_FREQ_5GHZ         0
+#define        AR5K_PHY_MODE_FREQ_2GHZ         2
+#define AR5K_PHY_MODE_MOD_DYN          0x00000004      /*5212 only*/
+#define AR5K_PHY_MODE_RAD              0x00000008      /*5212 only*/
+#define AR5K_PHY_MODE_RAD_AR5111       0
+#define AR5K_PHY_MODE_RAD_AR5112       8
+#define AR5K_PHY_MODE_XR               0x00000010      /*5212 only*/
+
+/*
+ * PHY CCK transmit control register (5212)
+ */
+#define AR5K_PHY_CCKTXCTL              0xa204
+#define AR5K_PHY_CCKTXCTL_WORLD                0x00000000
+#define AR5K_PHY_CCKTXCTL_JAPAN                0x00000010
+        
+/*
+ * PHY 2GHz gain register (5212)
+ */
+#define        AR5K_PHY_GAIN_2GHZ              0xa20c
+#define        AR5K_PHY_GAIN_2GHZ_MARGIN_TXRX  0x00fc0000
+#define        AR5K_PHY_GAIN_2GHZ_MARGIN_TXRX_S        18





reply via email to

[Prev in Thread] Current Thread [Next in Thread]