Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
[safe/jmp/linux-2.6] / drivers / net / wireless / ath9k / hw.c
index 7728234..d494e98 100644 (file)
 #include <linux/io.h>
 #include <asm/unaligned.h>
 
-#include "core.h"
-#include "hw.h"
-#include "reg.h"
-#include "phy.h"
+#include "ath9k.h"
 #include "initvals.h"
 
 static int btcoex_enable;
@@ -31,62 +28,69 @@ MODULE_PARM_DESC(btcoex_enable, "Enable Bluetooth coexistence support");
 #define ATH9K_CLOCK_RATE_5GHZ_OFDM     40
 #define ATH9K_CLOCK_RATE_2GHZ_OFDM     44
 
-static bool ath9k_hw_set_reset_reg(struct ath_hal *ah, u32 type);
-static void ath9k_hw_set_regs(struct ath_hal *ah, struct ath9k_channel *chan,
+static bool ath9k_hw_set_reset_reg(struct ath_hw *ah, u32 type);
+static void ath9k_hw_set_regs(struct ath_hw *ah, struct ath9k_channel *chan,
                              enum ath9k_ht_macmode macmode);
-static u32 ath9k_hw_ini_fixup(struct ath_hal *ah,
+static u32 ath9k_hw_ini_fixup(struct ath_hw *ah,
                              struct ar5416_eeprom_def *pEepData,
                              u32 reg, u32 value);
-static void ath9k_hw_9280_spur_mitigate(struct ath_hal *ah, struct ath9k_channel *chan);
-static void ath9k_hw_spur_mitigate(struct ath_hal *ah, struct ath9k_channel *chan);
+static void ath9k_hw_9280_spur_mitigate(struct ath_hw *ah, struct ath9k_channel *chan);
+static void ath9k_hw_spur_mitigate(struct ath_hw *ah, struct ath9k_channel *chan);
 
 /********************/
 /* Helper Functions */
 /********************/
 
-static u32 ath9k_hw_mac_usec(struct ath_hal *ah, u32 clks)
+static u32 ath9k_hw_mac_usec(struct ath_hw *ah, u32 clks)
 {
        struct ieee80211_conf *conf = &ah->ah_sc->hw->conf;
-       if (!ah->ah_curchan) /* should really check for CCK instead */
+
+       if (!ah->curchan) /* should really check for CCK instead */
                return clks / ATH9K_CLOCK_RATE_CCK;
        if (conf->channel->band == IEEE80211_BAND_2GHZ)
                return clks / ATH9K_CLOCK_RATE_2GHZ_OFDM;
+
        return clks / ATH9K_CLOCK_RATE_5GHZ_OFDM;
 }
 
-static u32 ath9k_hw_mac_to_usec(struct ath_hal *ah, u32 clks)
+static u32 ath9k_hw_mac_to_usec(struct ath_hw *ah, u32 clks)
 {
        struct ieee80211_conf *conf = &ah->ah_sc->hw->conf;
+
        if (conf_is_ht40(conf))
                return ath9k_hw_mac_usec(ah, clks) / 2;
        else
                return ath9k_hw_mac_usec(ah, clks);
 }
 
-static u32 ath9k_hw_mac_clks(struct ath_hal *ah, u32 usecs)
+static u32 ath9k_hw_mac_clks(struct ath_hw *ah, u32 usecs)
 {
        struct ieee80211_conf *conf = &ah->ah_sc->hw->conf;
-       if (!ah->ah_curchan) /* should really check for CCK instead */
+
+       if (!ah->curchan) /* should really check for CCK instead */
                return usecs *ATH9K_CLOCK_RATE_CCK;
        if (conf->channel->band == IEEE80211_BAND_2GHZ)
                return usecs *ATH9K_CLOCK_RATE_2GHZ_OFDM;
        return usecs *ATH9K_CLOCK_RATE_5GHZ_OFDM;
 }
 
-static u32 ath9k_hw_mac_to_clks(struct ath_hal *ah, u32 usecs)
+static u32 ath9k_hw_mac_to_clks(struct ath_hw *ah, u32 usecs)
 {
        struct ieee80211_conf *conf = &ah->ah_sc->hw->conf;
+
        if (conf_is_ht40(conf))
                return ath9k_hw_mac_clks(ah, usecs) * 2;
        else
                return ath9k_hw_mac_clks(ah, usecs);
 }
 
-bool ath9k_hw_wait(struct ath_hal *ah, u32 reg, u32 mask, u32 val)
+bool ath9k_hw_wait(struct ath_hw *ah, u32 reg, u32 mask, u32 val, u32 timeout)
 {
        int i;
 
-       for (i = 0; i < (AH_TIMEOUT / AH_TIME_QUANTUM); i++) {
+       BUG_ON(timeout < AH_TIME_QUANTUM);
+
+       for (i = 0; i < (timeout / AH_TIME_QUANTUM); i++) {
                if ((REG_READ(ah, reg) & mask) == val)
                        return true;
 
@@ -94,8 +98,8 @@ bool ath9k_hw_wait(struct ath_hal *ah, u32 reg, u32 mask, u32 val)
        }
 
        DPRINTF(ah->ah_sc, ATH_DBG_REG_IO,
-               "timeout on reg 0x%x: 0x%08x & 0x%08x != 0x%08x\n",
-               reg, REG_READ(ah, reg), mask, val);
+               "timeout (%d us) on reg 0x%x: 0x%08x & 0x%08x != 0x%08x\n",
+               timeout, reg, REG_READ(ah, reg), mask, val);
 
        return false;
 }
@@ -112,11 +116,11 @@ u32 ath9k_hw_reverse_bits(u32 val, u32 n)
        return retval;
 }
 
-bool ath9k_get_channel_edges(struct ath_hal *ah,
+bool ath9k_get_channel_edges(struct ath_hw *ah,
                             u16 flags, u16 *low,
                             u16 *high)
 {
-       struct ath9k_hw_capabilities *pCap = &ah->ah_caps;
+       struct ath9k_hw_capabilities *pCap = &ah->caps;
 
        if (flags & CHANNEL_5GHZ) {
                *low = pCap->low_5ghz_chan;
@@ -131,7 +135,7 @@ bool ath9k_get_channel_edges(struct ath_hal *ah,
        return false;
 }
 
-u16 ath9k_hw_computetxtime(struct ath_hal *ah,
+u16 ath9k_hw_computetxtime(struct ath_hw *ah,
                           struct ath_rate_table *rates,
                           u32 frameLen, u16 rateix,
                           bool shortPreamble)
@@ -153,15 +157,15 @@ u16 ath9k_hw_computetxtime(struct ath_hal *ah,
                txTime = CCK_SIFS_TIME + phyTime + ((numBits * 1000) / kbps);
                break;
        case WLAN_RC_PHY_OFDM:
-               if (ah->ah_curchan && IS_CHAN_QUARTER_RATE(ah->ah_curchan)) {
+               if (ah->curchan && IS_CHAN_QUARTER_RATE(ah->curchan)) {
                        bitsPerSymbol = (kbps * OFDM_SYMBOL_TIME_QUARTER) / 1000;
                        numBits = OFDM_PLCP_BITS + (frameLen << 3);
                        numSymbols = DIV_ROUND_UP(numBits, bitsPerSymbol);
                        txTime = OFDM_SIFS_TIME_QUARTER
                                + OFDM_PREAMBLE_TIME_QUARTER
                                + (numSymbols * OFDM_SYMBOL_TIME_QUARTER);
-               } else if (ah->ah_curchan &&
-                          IS_CHAN_HALF_RATE(ah->ah_curchan)) {
+               } else if (ah->curchan &&
+                          IS_CHAN_HALF_RATE(ah->curchan)) {
                        bitsPerSymbol = (kbps * OFDM_SYMBOL_TIME_HALF) / 1000;
                        numBits = OFDM_PLCP_BITS + (frameLen << 3);
                        numSymbols = DIV_ROUND_UP(numBits, bitsPerSymbol);
@@ -187,12 +191,11 @@ u16 ath9k_hw_computetxtime(struct ath_hal *ah,
        return txTime;
 }
 
-void ath9k_hw_get_channel_centers(struct ath_hal *ah,
+void ath9k_hw_get_channel_centers(struct ath_hw *ah,
                                  struct ath9k_channel *chan,
                                  struct chan_centers *centers)
 {
        int8_t extoff;
-       struct ath_hal_5416 *ahp = AH5416(ah);
 
        if (!IS_CHAN_HT40(chan)) {
                centers->ctl_center = centers->ext_center =
@@ -215,16 +218,15 @@ void ath9k_hw_get_channel_centers(struct ath_hal *ah,
                centers->synth_center - (extoff * HT40_CHANNEL_CENTER_SHIFT);
        centers->ext_center =
                centers->synth_center + (extoff *
-                        ((ahp->ah_extprotspacing == ATH9K_HT_EXTPROTSPACING_20) ?
+                        ((ah->extprotspacing == ATH9K_HT_EXTPROTSPACING_20) ?
                          HT40_CHANNEL_CENTER_SHIFT : 15));
-
 }
 
 /******************/
 /* Chip Revisions */
 /******************/
 
-static void ath9k_hw_read_revisions(struct ath_hal *ah)
+static void ath9k_hw_read_revisions(struct ath_hw *ah)
 {
        u32 val;
 
@@ -232,21 +234,22 @@ static void ath9k_hw_read_revisions(struct ath_hal *ah)
 
        if (val == 0xFF) {
                val = REG_READ(ah, AR_SREV);
-               ah->ah_macVersion = (val & AR_SREV_VERSION2) >> AR_SREV_TYPE2_S;
-               ah->ah_macRev = MS(val, AR_SREV_REVISION2);
-               ah->ah_isPciExpress = (val & AR_SREV_TYPE2_HOST_MODE) ? 0 : 1;
+               ah->hw_version.macVersion =
+                       (val & AR_SREV_VERSION2) >> AR_SREV_TYPE2_S;
+               ah->hw_version.macRev = MS(val, AR_SREV_REVISION2);
+               ah->is_pciexpress = (val & AR_SREV_TYPE2_HOST_MODE) ? 0 : 1;
        } else {
                if (!AR_SREV_9100(ah))
-                       ah->ah_macVersion = MS(val, AR_SREV_VERSION);
+                       ah->hw_version.macVersion = MS(val, AR_SREV_VERSION);
 
-               ah->ah_macRev = val & AR_SREV_REVISION;
+               ah->hw_version.macRev = val & AR_SREV_REVISION;
 
-               if (ah->ah_macVersion == AR_SREV_VERSION_5416_PCIE)
-                       ah->ah_isPciExpress = true;
+               if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCIE)
+                       ah->is_pciexpress = true;
        }
 }
 
-static int ath9k_hw_get_radiorev(struct ath_hal *ah)
+static int ath9k_hw_get_radiorev(struct ath_hw *ah)
 {
        u32 val;
        int i;
@@ -265,9 +268,9 @@ static int ath9k_hw_get_radiorev(struct ath_hal *ah)
 /* HW Attach, Detach, Init Routines */
 /************************************/
 
-static void ath9k_hw_disablepcie(struct ath_hal *ah)
+static void ath9k_hw_disablepcie(struct ath_hw *ah)
 {
-       if (!AR_SREV_9100(ah))
+       if (AR_SREV_9100(ah))
                return;
 
        REG_WRITE(ah, AR_PCIE_SERDES, 0x9248fc00);
@@ -283,7 +286,7 @@ static void ath9k_hw_disablepcie(struct ath_hal *ah)
        REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000);
 }
 
-static bool ath9k_hw_chip_test(struct ath_hal *ah)
+static bool ath9k_hw_chip_test(struct ath_hw *ah)
 {
        u32 regAddr[2] = { AR_STA_ID0, AR_PHY_BASE + (8 << 2) };
        u32 regHold[2];
@@ -325,6 +328,7 @@ static bool ath9k_hw_chip_test(struct ath_hal *ah)
                REG_WRITE(ah, regAddr[i], regHold[i]);
        }
        udelay(100);
+
        return true;
 }
 
@@ -349,99 +353,110 @@ static const char *ath9k_hw_devname(u16 devid)
        return NULL;
 }
 
-static void ath9k_hw_set_defaults(struct ath_hal *ah)
+static void ath9k_hw_set_defaults(struct ath_hw *ah)
 {
        int i;
 
-       ah->ah_config.dma_beacon_response_time = 2;
-       ah->ah_config.sw_beacon_response_time = 10;
-       ah->ah_config.additional_swba_backoff = 0;
-       ah->ah_config.ack_6mb = 0x0;
-       ah->ah_config.cwm_ignore_extcca = 0;
-       ah->ah_config.pcie_powersave_enable = 0;
-       ah->ah_config.pcie_l1skp_enable = 0;
-       ah->ah_config.pcie_clock_req = 0;
-       ah->ah_config.pcie_power_reset = 0x100;
-       ah->ah_config.pcie_restore = 0;
-       ah->ah_config.pcie_waen = 0;
-       ah->ah_config.analog_shiftreg = 1;
-       ah->ah_config.ht_enable = 1;
-       ah->ah_config.ofdm_trig_low = 200;
-       ah->ah_config.ofdm_trig_high = 500;
-       ah->ah_config.cck_trig_high = 200;
-       ah->ah_config.cck_trig_low = 100;
-       ah->ah_config.enable_ani = 1;
-       ah->ah_config.noise_immunity_level = 4;
-       ah->ah_config.ofdm_weaksignal_det = 1;
-       ah->ah_config.cck_weaksignal_thr = 0;
-       ah->ah_config.spur_immunity_level = 2;
-       ah->ah_config.firstep_level = 0;
-       ah->ah_config.rssi_thr_high = 40;
-       ah->ah_config.rssi_thr_low = 7;
-       ah->ah_config.diversity_control = 0;
-       ah->ah_config.antenna_switch_swap = 0;
+       ah->config.dma_beacon_response_time = 2;
+       ah->config.sw_beacon_response_time = 10;
+       ah->config.additional_swba_backoff = 0;
+       ah->config.ack_6mb = 0x0;
+       ah->config.cwm_ignore_extcca = 0;
+       ah->config.pcie_powersave_enable = 0;
+       ah->config.pcie_l1skp_enable = 0;
+       ah->config.pcie_clock_req = 0;
+       ah->config.pcie_power_reset = 0x100;
+       ah->config.pcie_restore = 0;
+       ah->config.pcie_waen = 0;
+       ah->config.analog_shiftreg = 1;
+       ah->config.ht_enable = 1;
+       ah->config.ofdm_trig_low = 200;
+       ah->config.ofdm_trig_high = 500;
+       ah->config.cck_trig_high = 200;
+       ah->config.cck_trig_low = 100;
+       ah->config.enable_ani = 1;
+       ah->config.noise_immunity_level = 4;
+       ah->config.ofdm_weaksignal_det = 1;
+       ah->config.cck_weaksignal_thr = 0;
+       ah->config.spur_immunity_level = 2;
+       ah->config.firstep_level = 0;
+       ah->config.rssi_thr_high = 40;
+       ah->config.rssi_thr_low = 7;
+       ah->config.diversity_control = 0;
+       ah->config.antenna_switch_swap = 0;
 
        for (i = 0; i < AR_EEPROM_MODAL_SPURS; i++) {
-               ah->ah_config.spurchans[i][0] = AR_NO_SPUR;
-               ah->ah_config.spurchans[i][1] = AR_NO_SPUR;
+               ah->config.spurchans[i][0] = AR_NO_SPUR;
+               ah->config.spurchans[i][1] = AR_NO_SPUR;
        }
 
-       ah->ah_config.intr_mitigation = 1;
+       ah->config.intr_mitigation = 1;
+
+       /*
+        * We need this for PCI devices only (Cardbus, PCI, miniPCI)
+        * _and_ if on non-uniprocessor systems (Multiprocessor/HT).
+        * This means we use it for all AR5416 devices, and the few
+        * minor PCI AR9280 devices out there.
+        *
+        * Serialization is required because these devices do not handle
+        * well the case of two concurrent reads/writes due to the latency
+        * involved. During one read/write another read/write can be issued
+        * on another CPU while the previous read/write may still be working
+        * on our hardware, if we hit this case the hardware poops in a loop.
+        * We prevent this by serializing reads and writes.
+        *
+        * This issue is not present on PCI-Express devices or pre-AR5416
+        * devices (legacy, 802.11abg).
+        */
+       if (num_possible_cpus() > 1)
+               ah->config.serialize_regmode = SER_REG_MODE_AUTO;
 }
 
-static struct ath_hal_5416 *ath9k_hw_newstate(u16 devid,
-                                             struct ath_softc *sc,
-                                             void __iomem *mem,
-                                             int *status)
+static struct ath_hw *ath9k_hw_newstate(u16 devid, struct ath_softc *sc,
+                                       int *status)
 {
-       static const u8 defbssidmask[ETH_ALEN] =
-               { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
-       struct ath_hal_5416 *ahp;
-       struct ath_hal *ah;
+       struct ath_hw *ah;
 
-       ahp = kzalloc(sizeof(struct ath_hal_5416), GFP_KERNEL);
-       if (ahp == NULL) {
+       ah = kzalloc(sizeof(struct ath_hw), GFP_KERNEL);
+       if (ah == NULL) {
                DPRINTF(sc, ATH_DBG_FATAL,
                        "Cannot allocate memory for state block\n");
                *status = -ENOMEM;
                return NULL;
        }
 
-       ah = &ahp->ah;
        ah->ah_sc = sc;
-       ah->ah_sh = mem;
-       ah->ah_magic = AR5416_MAGIC;
-       ah->ah_countryCode = CTRY_DEFAULT;
-       ah->ah_devid = devid;
-       ah->ah_subvendorid = 0;
+       ah->hw_version.magic = AR5416_MAGIC;
+       ah->regulatory.country_code = CTRY_DEFAULT;
+       ah->hw_version.devid = devid;
+       ah->hw_version.subvendorid = 0;
 
        ah->ah_flags = 0;
        if ((devid == AR5416_AR9100_DEVID))
-               ah->ah_macVersion = AR_SREV_VERSION_9100;
+               ah->hw_version.macVersion = AR_SREV_VERSION_9100;
        if (!AR_SREV_9100(ah))
                ah->ah_flags = AH_USE_EEPROM;
 
-       ah->ah_powerLimit = MAX_RATE_POWER;
-       ah->ah_tpScale = ATH9K_TP_SCALE_MAX;
-       ahp->ah_atimWindow = 0;
-       ahp->ah_diversityControl = ah->ah_config.diversity_control;
-       ahp->ah_antennaSwitchSwap =
-               ah->ah_config.antenna_switch_swap;
-       ahp->ah_staId1Defaults = AR_STA_ID1_CRPT_MIC_ENABLE;
-       ahp->ah_beaconInterval = 100;
-       ahp->ah_enable32kHzClock = DONT_USE_32KHZ;
-       ahp->ah_slottime = (u32) -1;
-       ahp->ah_acktimeout = (u32) -1;
-       ahp->ah_ctstimeout = (u32) -1;
-       ahp->ah_globaltxtimeout = (u32) -1;
-       memcpy(&ahp->ah_bssidmask, defbssidmask, ETH_ALEN);
-
-       ahp->ah_gBeaconRate = 0;
+       ah->regulatory.power_limit = MAX_RATE_POWER;
+       ah->regulatory.tp_scale = ATH9K_TP_SCALE_MAX;
+       ah->atim_window = 0;
+       ah->diversity_control = ah->config.diversity_control;
+       ah->antenna_switch_swap =
+               ah->config.antenna_switch_swap;
+       ah->sta_id1_defaults = AR_STA_ID1_CRPT_MIC_ENABLE;
+       ah->beacon_interval = 100;
+       ah->enable_32kHz_clock = DONT_USE_32KHZ;
+       ah->slottime = (u32) -1;
+       ah->acktimeout = (u32) -1;
+       ah->ctstimeout = (u32) -1;
+       ah->globaltxtimeout = (u32) -1;
+
+       ah->gbeacon_rate = 0;
 
-       return ahp;
+       return ah;
 }
 
-static int ath9k_hw_rfattach(struct ath_hal *ah)
+static int ath9k_hw_rfattach(struct ath_hw *ah)
 {
        bool rfStatus = false;
        int ecode = 0;
@@ -456,7 +471,7 @@ static int ath9k_hw_rfattach(struct ath_hal *ah)
        return 0;
 }
 
-static int ath9k_hw_rf_claim(struct ath_hal *ah)
+static int ath9k_hw_rf_claim(struct ath_hw *ah)
 {
        u32 val;
 
@@ -476,88 +491,87 @@ static int ath9k_hw_rf_claim(struct ath_hal *ah)
                DPRINTF(ah->ah_sc, ATH_DBG_CHANNEL,
                        "5G Radio Chip Rev 0x%02X is not "
                        "supported by this driver\n",
-                       ah->ah_analog5GhzRev);
+                       ah->hw_version.analog5GhzRev);
                return -EOPNOTSUPP;
        }
 
-       ah->ah_analog5GhzRev = val;
+       ah->hw_version.analog5GhzRev = val;
 
        return 0;
 }
 
-static int ath9k_hw_init_macaddr(struct ath_hal *ah)
+static int ath9k_hw_init_macaddr(struct ath_hw *ah)
 {
        u32 sum;
        int i;
        u16 eeval;
-       struct ath_hal_5416 *ahp = AH5416(ah);
 
        sum = 0;
        for (i = 0; i < 3; i++) {
-               eeval = ath9k_hw_get_eeprom(ah, AR_EEPROM_MAC(i));
+               eeval = ah->eep_ops->get_eeprom(ah, AR_EEPROM_MAC(i));
                sum += eeval;
-               ahp->ah_macaddr[2 * i] = eeval >> 8;
-               ahp->ah_macaddr[2 * i + 1] = eeval & 0xff;
+               ah->macaddr[2 * i] = eeval >> 8;
+               ah->macaddr[2 * i + 1] = eeval & 0xff;
        }
        if (sum == 0 || sum == 0xffff * 3) {
                DPRINTF(ah->ah_sc, ATH_DBG_EEPROM,
                        "mac address read failed: %pM\n",
-                       ahp->ah_macaddr);
+                       ah->macaddr);
                return -EADDRNOTAVAIL;
        }
 
        return 0;
 }
 
-static void ath9k_hw_init_rxgain_ini(struct ath_hal *ah)
+static void ath9k_hw_init_rxgain_ini(struct ath_hw *ah)
 {
        u32 rxgain_type;
-       struct ath_hal_5416 *ahp = AH5416(ah);
 
-       if (ath9k_hw_get_eeprom(ah, EEP_MINOR_REV) >= AR5416_EEP_MINOR_VER_17) {
-               rxgain_type = ath9k_hw_get_eeprom(ah, EEP_RXGAIN_TYPE);
+       if (ah->eep_ops->get_eeprom(ah, EEP_MINOR_REV) >= AR5416_EEP_MINOR_VER_17) {
+               rxgain_type = ah->eep_ops->get_eeprom(ah, EEP_RXGAIN_TYPE);
 
                if (rxgain_type == AR5416_EEP_RXGAIN_13DB_BACKOFF)
-                       INIT_INI_ARRAY(&ahp->ah_iniModesRxGain,
+                       INIT_INI_ARRAY(&ah->iniModesRxGain,
                        ar9280Modes_backoff_13db_rxgain_9280_2,
                        ARRAY_SIZE(ar9280Modes_backoff_13db_rxgain_9280_2), 6);
                else if (rxgain_type == AR5416_EEP_RXGAIN_23DB_BACKOFF)
-                       INIT_INI_ARRAY(&ahp->ah_iniModesRxGain,
+                       INIT_INI_ARRAY(&ah->iniModesRxGain,
                        ar9280Modes_backoff_23db_rxgain_9280_2,
                        ARRAY_SIZE(ar9280Modes_backoff_23db_rxgain_9280_2), 6);
                else
-                       INIT_INI_ARRAY(&ahp->ah_iniModesRxGain,
+                       INIT_INI_ARRAY(&ah->iniModesRxGain,
                        ar9280Modes_original_rxgain_9280_2,
                        ARRAY_SIZE(ar9280Modes_original_rxgain_9280_2), 6);
-       } else
-               INIT_INI_ARRAY(&ahp->ah_iniModesRxGain,
+       } else {
+               INIT_INI_ARRAY(&ah->iniModesRxGain,
                        ar9280Modes_original_rxgain_9280_2,
                        ARRAY_SIZE(ar9280Modes_original_rxgain_9280_2), 6);
+       }
 }
 
-static void ath9k_hw_init_txgain_ini(struct ath_hal *ah)
+static void ath9k_hw_init_txgain_ini(struct ath_hw *ah)
 {
        u32 txgain_type;
-       struct ath_hal_5416 *ahp = AH5416(ah);
 
-       if (ath9k_hw_get_eeprom(ah, EEP_MINOR_REV) >= AR5416_EEP_MINOR_VER_19) {
-               txgain_type = ath9k_hw_get_eeprom(ah, EEP_TXGAIN_TYPE);
+       if (ah->eep_ops->get_eeprom(ah, EEP_MINOR_REV) >= AR5416_EEP_MINOR_VER_19) {
+               txgain_type = ah->eep_ops->get_eeprom(ah, EEP_TXGAIN_TYPE);
 
                if (txgain_type == AR5416_EEP_TXGAIN_HIGH_POWER)
-                       INIT_INI_ARRAY(&ahp->ah_iniModesTxGain,
+                       INIT_INI_ARRAY(&ah->iniModesTxGain,
                        ar9280Modes_high_power_tx_gain_9280_2,
                        ARRAY_SIZE(ar9280Modes_high_power_tx_gain_9280_2), 6);
                else
-                       INIT_INI_ARRAY(&ahp->ah_iniModesTxGain,
+                       INIT_INI_ARRAY(&ah->iniModesTxGain,
                        ar9280Modes_original_tx_gain_9280_2,
                        ARRAY_SIZE(ar9280Modes_original_tx_gain_9280_2), 6);
-       } else
-               INIT_INI_ARRAY(&ahp->ah_iniModesTxGain,
+       } else {
+               INIT_INI_ARRAY(&ah->iniModesTxGain,
                ar9280Modes_original_tx_gain_9280_2,
                ARRAY_SIZE(ar9280Modes_original_tx_gain_9280_2), 6);
+       }
 }
 
-static int ath9k_hw_post_attach(struct ath_hal *ah)
+static int ath9k_hw_post_attach(struct ath_hw *ah)
 {
        int ecode;
 
@@ -586,237 +600,229 @@ static int ath9k_hw_post_attach(struct ath_hal *ah)
        return 0;
 }
 
-static struct ath_hal *ath9k_hw_do_attach(u16 devid, struct ath_softc *sc,
-                                         void __iomem *mem, int *status)
+static struct ath_hw *ath9k_hw_do_attach(u16 devid, struct ath_softc *sc,
+                                        int *status)
 {
-       struct ath_hal_5416 *ahp;
-       struct ath_hal *ah;
+       struct ath_hw *ah;
        int ecode;
        u32 i, j;
 
-       ahp = ath9k_hw_newstate(devid, sc, mem, status);
-       if (ahp == NULL)
+       ah = ath9k_hw_newstate(devid, sc, status);
+       if (ah == NULL)
                return NULL;
 
-       ah = &ahp->ah;
-
        ath9k_hw_set_defaults(ah);
 
-       if (ah->ah_config.intr_mitigation != 0)
-               ahp->ah_intrMitigation = true;
+       if (ah->config.intr_mitigation != 0)
+               ah->intr_mitigation = true;
 
        if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_POWER_ON)) {
-               DPRINTF(ah->ah_sc, ATH_DBG_RESET, "Couldn't reset chip\n");
+               DPRINTF(sc, ATH_DBG_RESET, "Couldn't reset chip\n");
                ecode = -EIO;
                goto bad;
        }
 
        if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE)) {
-               DPRINTF(ah->ah_sc, ATH_DBG_RESET, "Couldn't wakeup chip\n");
+               DPRINTF(sc, ATH_DBG_RESET, "Couldn't wakeup chip\n");
                ecode = -EIO;
                goto bad;
        }
 
-       if (ah->ah_config.serialize_regmode == SER_REG_MODE_AUTO) {
-               if (ah->ah_macVersion == AR_SREV_VERSION_5416_PCI) {
-                       ah->ah_config.serialize_regmode =
+       if (ah->config.serialize_regmode == SER_REG_MODE_AUTO) {
+               if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCI ||
+                   (AR_SREV_9280(ah) && !ah->is_pciexpress)) {
+                       ah->config.serialize_regmode =
                                SER_REG_MODE_ON;
                } else {
-                       ah->ah_config.serialize_regmode =
+                       ah->config.serialize_regmode =
                                SER_REG_MODE_OFF;
                }
        }
 
-       DPRINTF(ah->ah_sc, ATH_DBG_RESET,
-               "serialize_regmode is %d\n",
-               ah->ah_config.serialize_regmode);
+       DPRINTF(sc, ATH_DBG_RESET, "serialize_regmode is %d\n",
+               ah->config.serialize_regmode);
 
-       if ((ah->ah_macVersion != AR_SREV_VERSION_5416_PCI) &&
-           (ah->ah_macVersion != AR_SREV_VERSION_5416_PCIE) &&
-           (ah->ah_macVersion != AR_SREV_VERSION_9160) &&
+       if ((ah->hw_version.macVersion != AR_SREV_VERSION_5416_PCI) &&
+           (ah->hw_version.macVersion != AR_SREV_VERSION_5416_PCIE) &&
+           (ah->hw_version.macVersion != AR_SREV_VERSION_9160) &&
            (!AR_SREV_9100(ah)) && (!AR_SREV_9280(ah)) && (!AR_SREV_9285(ah))) {
-               DPRINTF(ah->ah_sc, ATH_DBG_RESET,
+               DPRINTF(sc, ATH_DBG_RESET,
                        "Mac Chip Rev 0x%02x.%x is not supported by "
-                       "this driver\n", ah->ah_macVersion, ah->ah_macRev);
+                       "this driver\n", ah->hw_version.macVersion,
+                       ah->hw_version.macRev);
                ecode = -EOPNOTSUPP;
                goto bad;
        }
 
        if (AR_SREV_9100(ah)) {
-               ahp->ah_iqCalData.calData = &iq_cal_multi_sample;
-               ahp->ah_suppCals = IQ_MISMATCH_CAL;
-               ah->ah_isPciExpress = false;
+               ah->iq_caldata.calData = &iq_cal_multi_sample;
+               ah->supp_cals = IQ_MISMATCH_CAL;
+               ah->is_pciexpress = false;
        }
-       ah->ah_phyRev = REG_READ(ah, AR_PHY_CHIP_ID);
+       ah->hw_version.phyRev = REG_READ(ah, AR_PHY_CHIP_ID);
 
        if (AR_SREV_9160_10_OR_LATER(ah)) {
                if (AR_SREV_9280_10_OR_LATER(ah)) {
-                       ahp->ah_iqCalData.calData = &iq_cal_single_sample;
-                       ahp->ah_adcGainCalData.calData =
+                       ah->iq_caldata.calData = &iq_cal_single_sample;
+                       ah->adcgain_caldata.calData =
                                &adc_gain_cal_single_sample;
-                       ahp->ah_adcDcCalData.calData =
+                       ah->adcdc_caldata.calData =
                                &adc_dc_cal_single_sample;
-                       ahp->ah_adcDcCalInitData.calData =
+                       ah->adcdc_calinitdata.calData =
                                &adc_init_dc_cal;
                } else {
-                       ahp->ah_iqCalData.calData = &iq_cal_multi_sample;
-                       ahp->ah_adcGainCalData.calData =
+                       ah->iq_caldata.calData = &iq_cal_multi_sample;
+                       ah->adcgain_caldata.calData =
                                &adc_gain_cal_multi_sample;
-                       ahp->ah_adcDcCalData.calData =
+                       ah->adcdc_caldata.calData =
                                &adc_dc_cal_multi_sample;
-                       ahp->ah_adcDcCalInitData.calData =
+                       ah->adcdc_calinitdata.calData =
                                &adc_init_dc_cal;
                }
-               ahp->ah_suppCals = ADC_GAIN_CAL | ADC_DC_CAL | IQ_MISMATCH_CAL;
+               ah->supp_cals = ADC_GAIN_CAL | ADC_DC_CAL | IQ_MISMATCH_CAL;
        }
 
-       if (AR_SREV_9160(ah)) {
-               ah->ah_config.enable_ani = 1;
-               ahp->ah_ani_function = (ATH9K_ANI_SPUR_IMMUNITY_LEVEL |
-                                       ATH9K_ANI_FIRSTEP_LEVEL);
-       } else {
-               ahp->ah_ani_function = ATH9K_ANI_ALL;
-               if (AR_SREV_9280_10_OR_LATER(ah)) {
-                       ahp->ah_ani_function &= ~ATH9K_ANI_NOISE_IMMUNITY_LEVEL;
-               }
-       }
+       ah->ani_function = ATH9K_ANI_ALL;
+       if (AR_SREV_9280_10_OR_LATER(ah))
+               ah->ani_function &= ~ATH9K_ANI_NOISE_IMMUNITY_LEVEL;
 
-       DPRINTF(ah->ah_sc, ATH_DBG_RESET,
+       DPRINTF(sc, ATH_DBG_RESET,
                "This Mac Chip Rev 0x%02x.%x is \n",
-               ah->ah_macVersion, ah->ah_macRev);
+               ah->hw_version.macVersion, ah->hw_version.macRev);
 
        if (AR_SREV_9285_12_OR_LATER(ah)) {
-               INIT_INI_ARRAY(&ahp->ah_iniModes, ar9285Modes_9285_1_2,
+
+               INIT_INI_ARRAY(&ah->iniModes, ar9285Modes_9285_1_2,
                               ARRAY_SIZE(ar9285Modes_9285_1_2), 6);
-               INIT_INI_ARRAY(&ahp->ah_iniCommon, ar9285Common_9285_1_2,
+               INIT_INI_ARRAY(&ah->iniCommon, ar9285Common_9285_1_2,
                               ARRAY_SIZE(ar9285Common_9285_1_2), 2);
 
-               if (ah->ah_config.pcie_clock_req) {
-                       INIT_INI_ARRAY(&ahp->ah_iniPcieSerdes,
+               if (ah->config.pcie_clock_req) {
+                       INIT_INI_ARRAY(&ah->iniPcieSerdes,
                        ar9285PciePhy_clkreq_off_L1_9285_1_2,
                        ARRAY_SIZE(ar9285PciePhy_clkreq_off_L1_9285_1_2), 2);
                } else {
-                       INIT_INI_ARRAY(&ahp->ah_iniPcieSerdes,
+                       INIT_INI_ARRAY(&ah->iniPcieSerdes,
                        ar9285PciePhy_clkreq_always_on_L1_9285_1_2,
                        ARRAY_SIZE(ar9285PciePhy_clkreq_always_on_L1_9285_1_2),
                                  2);
                }
        } else if (AR_SREV_9285_10_OR_LATER(ah)) {
-               INIT_INI_ARRAY(&ahp->ah_iniModes, ar9285Modes_9285,
+               INIT_INI_ARRAY(&ah->iniModes, ar9285Modes_9285,
                               ARRAY_SIZE(ar9285Modes_9285), 6);
-               INIT_INI_ARRAY(&ahp->ah_iniCommon, ar9285Common_9285,
+               INIT_INI_ARRAY(&ah->iniCommon, ar9285Common_9285,
                               ARRAY_SIZE(ar9285Common_9285), 2);
 
-               if (ah->ah_config.pcie_clock_req) {
-                       INIT_INI_ARRAY(&ahp->ah_iniPcieSerdes,
+               if (ah->config.pcie_clock_req) {
+                       INIT_INI_ARRAY(&ah->iniPcieSerdes,
                        ar9285PciePhy_clkreq_off_L1_9285,
                        ARRAY_SIZE(ar9285PciePhy_clkreq_off_L1_9285), 2);
                } else {
-                       INIT_INI_ARRAY(&ahp->ah_iniPcieSerdes,
+                       INIT_INI_ARRAY(&ah->iniPcieSerdes,
                        ar9285PciePhy_clkreq_always_on_L1_9285,
                        ARRAY_SIZE(ar9285PciePhy_clkreq_always_on_L1_9285), 2);
                }
        } else if (AR_SREV_9280_20_OR_LATER(ah)) {
-               INIT_INI_ARRAY(&ahp->ah_iniModes, ar9280Modes_9280_2,
+               INIT_INI_ARRAY(&ah->iniModes, ar9280Modes_9280_2,
                               ARRAY_SIZE(ar9280Modes_9280_2), 6);
-               INIT_INI_ARRAY(&ahp->ah_iniCommon, ar9280Common_9280_2,
+               INIT_INI_ARRAY(&ah->iniCommon, ar9280Common_9280_2,
                               ARRAY_SIZE(ar9280Common_9280_2), 2);
 
-               if (ah->ah_config.pcie_clock_req) {
-                       INIT_INI_ARRAY(&ahp->ah_iniPcieSerdes,
+               if (ah->config.pcie_clock_req) {
+                       INIT_INI_ARRAY(&ah->iniPcieSerdes,
                               ar9280PciePhy_clkreq_off_L1_9280,
                               ARRAY_SIZE(ar9280PciePhy_clkreq_off_L1_9280),2);
                } else {
-                       INIT_INI_ARRAY(&ahp->ah_iniPcieSerdes,
+                       INIT_INI_ARRAY(&ah->iniPcieSerdes,
                               ar9280PciePhy_clkreq_always_on_L1_9280,
                               ARRAY_SIZE(ar9280PciePhy_clkreq_always_on_L1_9280), 2);
                }
-               INIT_INI_ARRAY(&ahp->ah_iniModesAdditional,
+               INIT_INI_ARRAY(&ah->iniModesAdditional,
                               ar9280Modes_fast_clock_9280_2,
                               ARRAY_SIZE(ar9280Modes_fast_clock_9280_2), 3);
        } else if (AR_SREV_9280_10_OR_LATER(ah)) {
-               INIT_INI_ARRAY(&ahp->ah_iniModes, ar9280Modes_9280,
+               INIT_INI_ARRAY(&ah->iniModes, ar9280Modes_9280,
                               ARRAY_SIZE(ar9280Modes_9280), 6);
-               INIT_INI_ARRAY(&ahp->ah_iniCommon, ar9280Common_9280,
+               INIT_INI_ARRAY(&ah->iniCommon, ar9280Common_9280,
                               ARRAY_SIZE(ar9280Common_9280), 2);
        } else if (AR_SREV_9160_10_OR_LATER(ah)) {
-               INIT_INI_ARRAY(&ahp->ah_iniModes, ar5416Modes_9160,
+               INIT_INI_ARRAY(&ah->iniModes, ar5416Modes_9160,
                               ARRAY_SIZE(ar5416Modes_9160), 6);
-               INIT_INI_ARRAY(&ahp->ah_iniCommon, ar5416Common_9160,
+               INIT_INI_ARRAY(&ah->iniCommon, ar5416Common_9160,
                               ARRAY_SIZE(ar5416Common_9160), 2);
-               INIT_INI_ARRAY(&ahp->ah_iniBank0, ar5416Bank0_9160,
+               INIT_INI_ARRAY(&ah->iniBank0, ar5416Bank0_9160,
                               ARRAY_SIZE(ar5416Bank0_9160), 2);
-               INIT_INI_ARRAY(&ahp->ah_iniBB_RfGain, ar5416BB_RfGain_9160,
+               INIT_INI_ARRAY(&ah->iniBB_RfGain, ar5416BB_RfGain_9160,
                               ARRAY_SIZE(ar5416BB_RfGain_9160), 3);
-               INIT_INI_ARRAY(&ahp->ah_iniBank1, ar5416Bank1_9160,
+               INIT_INI_ARRAY(&ah->iniBank1, ar5416Bank1_9160,
                               ARRAY_SIZE(ar5416Bank1_9160), 2);
-               INIT_INI_ARRAY(&ahp->ah_iniBank2, ar5416Bank2_9160,
+               INIT_INI_ARRAY(&ah->iniBank2, ar5416Bank2_9160,
                               ARRAY_SIZE(ar5416Bank2_9160), 2);
-               INIT_INI_ARRAY(&ahp->ah_iniBank3, ar5416Bank3_9160,
+               INIT_INI_ARRAY(&ah->iniBank3, ar5416Bank3_9160,
                               ARRAY_SIZE(ar5416Bank3_9160), 3);
-               INIT_INI_ARRAY(&ahp->ah_iniBank6, ar5416Bank6_9160,
+               INIT_INI_ARRAY(&ah->iniBank6, ar5416Bank6_9160,
                               ARRAY_SIZE(ar5416Bank6_9160), 3);
-               INIT_INI_ARRAY(&ahp->ah_iniBank6TPC, ar5416Bank6TPC_9160,
+               INIT_INI_ARRAY(&ah->iniBank6TPC, ar5416Bank6TPC_9160,
                               ARRAY_SIZE(ar5416Bank6TPC_9160), 3);
-               INIT_INI_ARRAY(&ahp->ah_iniBank7, ar5416Bank7_9160,
+               INIT_INI_ARRAY(&ah->iniBank7, ar5416Bank7_9160,
                               ARRAY_SIZE(ar5416Bank7_9160), 2);
                if (AR_SREV_9160_11(ah)) {
-                       INIT_INI_ARRAY(&ahp->ah_iniAddac,
+                       INIT_INI_ARRAY(&ah->iniAddac,
                                       ar5416Addac_91601_1,
                                       ARRAY_SIZE(ar5416Addac_91601_1), 2);
                } else {
-                       INIT_INI_ARRAY(&ahp->ah_iniAddac, ar5416Addac_9160,
+                       INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac_9160,
                                       ARRAY_SIZE(ar5416Addac_9160), 2);
                }
        } else if (AR_SREV_9100_OR_LATER(ah)) {
-               INIT_INI_ARRAY(&ahp->ah_iniModes, ar5416Modes_9100,
+               INIT_INI_ARRAY(&ah->iniModes, ar5416Modes_9100,
                               ARRAY_SIZE(ar5416Modes_9100), 6);
-               INIT_INI_ARRAY(&ahp->ah_iniCommon, ar5416Common_9100,
+               INIT_INI_ARRAY(&ah->iniCommon, ar5416Common_9100,
                               ARRAY_SIZE(ar5416Common_9100), 2);
-               INIT_INI_ARRAY(&ahp->ah_iniBank0, ar5416Bank0_9100,
+               INIT_INI_ARRAY(&ah->iniBank0, ar5416Bank0_9100,
                               ARRAY_SIZE(ar5416Bank0_9100), 2);
-               INIT_INI_ARRAY(&ahp->ah_iniBB_RfGain, ar5416BB_RfGain_9100,
+               INIT_INI_ARRAY(&ah->iniBB_RfGain, ar5416BB_RfGain_9100,
                               ARRAY_SIZE(ar5416BB_RfGain_9100), 3);
-               INIT_INI_ARRAY(&ahp->ah_iniBank1, ar5416Bank1_9100,
+               INIT_INI_ARRAY(&ah->iniBank1, ar5416Bank1_9100,
                               ARRAY_SIZE(ar5416Bank1_9100), 2);
-               INIT_INI_ARRAY(&ahp->ah_iniBank2, ar5416Bank2_9100,
+               INIT_INI_ARRAY(&ah->iniBank2, ar5416Bank2_9100,
                               ARRAY_SIZE(ar5416Bank2_9100), 2);
-               INIT_INI_ARRAY(&ahp->ah_iniBank3, ar5416Bank3_9100,
+               INIT_INI_ARRAY(&ah->iniBank3, ar5416Bank3_9100,
                               ARRAY_SIZE(ar5416Bank3_9100), 3);
-               INIT_INI_ARRAY(&ahp->ah_iniBank6, ar5416Bank6_9100,
+               INIT_INI_ARRAY(&ah->iniBank6, ar5416Bank6_9100,
                               ARRAY_SIZE(ar5416Bank6_9100), 3);
-               INIT_INI_ARRAY(&ahp->ah_iniBank6TPC, ar5416Bank6TPC_9100,
+               INIT_INI_ARRAY(&ah->iniBank6TPC, ar5416Bank6TPC_9100,
                               ARRAY_SIZE(ar5416Bank6TPC_9100), 3);
-               INIT_INI_ARRAY(&ahp->ah_iniBank7, ar5416Bank7_9100,
+               INIT_INI_ARRAY(&ah->iniBank7, ar5416Bank7_9100,
                               ARRAY_SIZE(ar5416Bank7_9100), 2);
-               INIT_INI_ARRAY(&ahp->ah_iniAddac, ar5416Addac_9100,
+               INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac_9100,
                               ARRAY_SIZE(ar5416Addac_9100), 2);
        } else {
-               INIT_INI_ARRAY(&ahp->ah_iniModes, ar5416Modes,
+               INIT_INI_ARRAY(&ah->iniModes, ar5416Modes,
                               ARRAY_SIZE(ar5416Modes), 6);
-               INIT_INI_ARRAY(&ahp->ah_iniCommon, ar5416Common,
+               INIT_INI_ARRAY(&ah->iniCommon, ar5416Common,
                               ARRAY_SIZE(ar5416Common), 2);
-               INIT_INI_ARRAY(&ahp->ah_iniBank0, ar5416Bank0,
+               INIT_INI_ARRAY(&ah->iniBank0, ar5416Bank0,
                               ARRAY_SIZE(ar5416Bank0), 2);
-               INIT_INI_ARRAY(&ahp->ah_iniBB_RfGain, ar5416BB_RfGain,
+               INIT_INI_ARRAY(&ah->iniBB_RfGain, ar5416BB_RfGain,
                               ARRAY_SIZE(ar5416BB_RfGain), 3);
-               INIT_INI_ARRAY(&ahp->ah_iniBank1, ar5416Bank1,
+               INIT_INI_ARRAY(&ah->iniBank1, ar5416Bank1,
                               ARRAY_SIZE(ar5416Bank1), 2);
-               INIT_INI_ARRAY(&ahp->ah_iniBank2, ar5416Bank2,
+               INIT_INI_ARRAY(&ah->iniBank2, ar5416Bank2,
                               ARRAY_SIZE(ar5416Bank2), 2);
-               INIT_INI_ARRAY(&ahp->ah_iniBank3, ar5416Bank3,
+               INIT_INI_ARRAY(&ah->iniBank3, ar5416Bank3,
                               ARRAY_SIZE(ar5416Bank3), 3);
-               INIT_INI_ARRAY(&ahp->ah_iniBank6, ar5416Bank6,
+               INIT_INI_ARRAY(&ah->iniBank6, ar5416Bank6,
                               ARRAY_SIZE(ar5416Bank6), 3);
-               INIT_INI_ARRAY(&ahp->ah_iniBank6TPC, ar5416Bank6TPC,
+               INIT_INI_ARRAY(&ah->iniBank6TPC, ar5416Bank6TPC,
                               ARRAY_SIZE(ar5416Bank6TPC), 3);
-               INIT_INI_ARRAY(&ahp->ah_iniBank7, ar5416Bank7,
+               INIT_INI_ARRAY(&ah->iniBank7, ar5416Bank7,
                               ARRAY_SIZE(ar5416Bank7), 2);
-               INIT_INI_ARRAY(&ahp->ah_iniAddac, ar5416Addac,
+               INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac,
                               ARRAY_SIZE(ar5416Addac), 2);
        }
 
-       if (ah->ah_isPciExpress)
+       if (ah->is_pciexpress)
                ath9k_hw_configpcipowersave(ah, 0);
        else
                ath9k_hw_disablepcie(ah);
@@ -825,6 +831,22 @@ static struct ath_hal *ath9k_hw_do_attach(u16 devid, struct ath_softc *sc,
        if (ecode != 0)
                goto bad;
 
+       if (AR_SREV_9285_12_OR_LATER(ah)) {
+               u32 txgain_type = ah->eep_ops->get_eeprom(ah, EEP_TXGAIN_TYPE);
+
+               /* txgain table */
+               if (txgain_type == AR5416_EEP_TXGAIN_HIGH_POWER) {
+                       INIT_INI_ARRAY(&ah->iniModesTxGain,
+                       ar9285Modes_high_power_tx_gain_9285_1_2,
+                       ARRAY_SIZE(ar9285Modes_high_power_tx_gain_9285_1_2), 6);
+               } else {
+                       INIT_INI_ARRAY(&ah->iniModesTxGain,
+                       ar9285Modes_original_tx_gain_9285_1_2,
+                       ARRAY_SIZE(ar9285Modes_original_tx_gain_9285_1_2), 6);
+               }
+
+       }
+
        /* rxgain table */
        if (AR_SREV_9280_20(ah))
                ath9k_hw_init_rxgain_ini(ah);
@@ -833,53 +855,55 @@ static struct ath_hal *ath9k_hw_do_attach(u16 devid, struct ath_softc *sc,
        if (AR_SREV_9280_20(ah))
                ath9k_hw_init_txgain_ini(ah);
 
-       if (ah->ah_devid == AR9280_DEVID_PCI) {
-               for (i = 0; i < ahp->ah_iniModes.ia_rows; i++) {
-                       u32 reg = INI_RA(&ahp->ah_iniModes, i, 0);
+       if (!ath9k_hw_fill_cap_info(ah)) {
+               DPRINTF(sc, ATH_DBG_RESET, "failed ath9k_hw_fill_cap_info\n");
+               ecode = -EINVAL;
+               goto bad;
+       }
 
-                       for (j = 1; j < ahp->ah_iniModes.ia_columns; j++) {
-                               u32 val = INI_RA(&ahp->ah_iniModes, i, j);
+       if ((ah->hw_version.devid == AR9280_DEVID_PCI) &&
+           test_bit(ATH9K_MODE_11A, ah->caps.wireless_modes)) {
 
-                               INI_RA(&ahp->ah_iniModes, i, j) =
+               /* EEPROM Fixup */
+               for (i = 0; i < ah->iniModes.ia_rows; i++) {
+                       u32 reg = INI_RA(&ah->iniModes, i, 0);
+
+                       for (j = 1; j < ah->iniModes.ia_columns; j++) {
+                               u32 val = INI_RA(&ah->iniModes, i, j);
+
+                               INI_RA(&ah->iniModes, i, j) =
                                        ath9k_hw_ini_fixup(ah,
-                                                          &ahp->ah_eeprom.def,
+                                                          &ah->eeprom.def,
                                                           reg, val);
                        }
                }
        }
 
-       if (!ath9k_hw_fill_cap_info(ah)) {
-               DPRINTF(ah->ah_sc, ATH_DBG_RESET,
-                       "failed ath9k_hw_fill_cap_info\n");
-               ecode = -EINVAL;
-               goto bad;
-       }
-
        ecode = ath9k_hw_init_macaddr(ah);
        if (ecode != 0) {
-               DPRINTF(ah->ah_sc, ATH_DBG_RESET,
+               DPRINTF(sc, ATH_DBG_RESET,
                        "failed initializing mac address\n");
                goto bad;
        }
 
        if (AR_SREV_9285(ah))
-               ah->ah_txTrigLevel = (AR_FTRIG_256B >> AR_FTRIG_S);
+               ah->tx_trig_level = (AR_FTRIG_256B >> AR_FTRIG_S);
        else
-               ah->ah_txTrigLevel = (AR_FTRIG_512B >> AR_FTRIG_S);
+               ah->tx_trig_level = (AR_FTRIG_512B >> AR_FTRIG_S);
 
        ath9k_init_nfcal_hist_buffer(ah);
 
        return ah;
 bad:
-       if (ahp)
-               ath9k_hw_detach((struct ath_hal *) ahp);
+       if (ah)
+               ath9k_hw_detach(ah);
        if (status)
                *status = ecode;
 
        return NULL;
 }
 
-static void ath9k_hw_init_bb(struct ath_hal *ah,
+static void ath9k_hw_init_bb(struct ath_hw *ah,
                             struct ath9k_channel *chan)
 {
        u32 synthDelay;
@@ -895,7 +919,7 @@ static void ath9k_hw_init_bb(struct ath_hal *ah,
        udelay(synthDelay + BASE_ACTIVATE_DELAY);
 }
 
-static void ath9k_hw_init_qos(struct ath_hal *ah)
+static void ath9k_hw_init_qos(struct ath_hw *ah)
 {
        REG_WRITE(ah, AR_MIC_QOS_CONTROL, 0x100aa);
        REG_WRITE(ah, AR_MIC_QOS_SELECT, 0x3210);
@@ -912,7 +936,7 @@ static void ath9k_hw_init_qos(struct ath_hal *ah)
        REG_WRITE(ah, AR_TXOP_12_15, 0xFFFFFFFF);
 }
 
-static void ath9k_hw_init_pll(struct ath_hal *ah,
+static void ath9k_hw_init_pll(struct ath_hw *ah,
                              struct ath9k_channel *chan)
 {
        u32 pll;
@@ -980,20 +1004,19 @@ static void ath9k_hw_init_pll(struct ath_hal *ah,
        REG_WRITE(ah, AR_RTC_SLEEP_CLK, AR_RTC_FORCE_DERIVED_CLK);
 }
 
-static void ath9k_hw_init_chain_masks(struct ath_hal *ah)
+static void ath9k_hw_init_chain_masks(struct ath_hw *ah)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
        int rx_chainmask, tx_chainmask;
 
-       rx_chainmask = ahp->ah_rxchainmask;
-       tx_chainmask = ahp->ah_txchainmask;
+       rx_chainmask = ah->rxchainmask;
+       tx_chainmask = ah->txchainmask;
 
        switch (rx_chainmask) {
        case 0x5:
                REG_SET_BIT(ah, AR_PHY_ANALOG_SWAP,
                            AR_PHY_SWAP_ALT_CHAIN);
        case 0x3:
-               if (((ah)->ah_macVersion <= AR_SREV_VERSION_9160)) {
+               if (((ah)->hw_version.macVersion <= AR_SREV_VERSION_9160)) {
                        REG_WRITE(ah, AR_PHY_RX_CHAINMASK, 0x7);
                        REG_WRITE(ah, AR_PHY_CAL_CHAINMASK, 0x7);
                        break;
@@ -1018,28 +1041,26 @@ static void ath9k_hw_init_chain_masks(struct ath_hal *ah)
                          REG_READ(ah, AR_PHY_ANALOG_SWAP) | 0x00000001);
 }
 
-static void ath9k_hw_init_interrupt_masks(struct ath_hal *ah,
+static void ath9k_hw_init_interrupt_masks(struct ath_hw *ah,
                                          enum nl80211_iftype opmode)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
-
-       ahp->ah_maskReg = AR_IMR_TXERR |
+       ah->mask_reg = AR_IMR_TXERR |
                AR_IMR_TXURN |
                AR_IMR_RXERR |
                AR_IMR_RXORN |
                AR_IMR_BCNMISC;
 
-       if (ahp->ah_intrMitigation)
-               ahp->ah_maskReg |= AR_IMR_RXINTM | AR_IMR_RXMINTR;
+       if (ah->intr_mitigation)
+               ah->mask_reg |= AR_IMR_RXINTM | AR_IMR_RXMINTR;
        else
-               ahp->ah_maskReg |= AR_IMR_RXOK;
+               ah->mask_reg |= AR_IMR_RXOK;
 
-       ahp->ah_maskReg |= AR_IMR_TXOK;
+       ah->mask_reg |= AR_IMR_TXOK;
 
        if (opmode == NL80211_IFTYPE_AP)
-               ahp->ah_maskReg |= AR_IMR_MIB;
+               ah->mask_reg |= AR_IMR_MIB;
 
-       REG_WRITE(ah, AR_IMR, ahp->ah_maskReg);
+       REG_WRITE(ah, AR_IMR, ah->mask_reg);
        REG_WRITE(ah, AR_IMR_S2, REG_READ(ah, AR_IMR_S2) | AR_IMR_S2_GTT);
 
        if (!AR_SREV_9100(ah)) {
@@ -1049,72 +1070,64 @@ static void ath9k_hw_init_interrupt_masks(struct ath_hal *ah,
        }
 }
 
-static bool ath9k_hw_set_ack_timeout(struct ath_hal *ah, u32 us)
+static bool ath9k_hw_set_ack_timeout(struct ath_hw *ah, u32 us)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
-
        if (us > ath9k_hw_mac_to_usec(ah, MS(0xffffffff, AR_TIME_OUT_ACK))) {
                DPRINTF(ah->ah_sc, ATH_DBG_RESET, "bad ack timeout %u\n", us);
-               ahp->ah_acktimeout = (u32) -1;
+               ah->acktimeout = (u32) -1;
                return false;
        } else {
                REG_RMW_FIELD(ah, AR_TIME_OUT,
                              AR_TIME_OUT_ACK, ath9k_hw_mac_to_clks(ah, us));
-               ahp->ah_acktimeout = us;
+               ah->acktimeout = us;
                return true;
        }
 }
 
-static bool ath9k_hw_set_cts_timeout(struct ath_hal *ah, u32 us)
+static bool ath9k_hw_set_cts_timeout(struct ath_hw *ah, u32 us)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
-
        if (us > ath9k_hw_mac_to_usec(ah, MS(0xffffffff, AR_TIME_OUT_CTS))) {
                DPRINTF(ah->ah_sc, ATH_DBG_RESET, "bad cts timeout %u\n", us);
-               ahp->ah_ctstimeout = (u32) -1;
+               ah->ctstimeout = (u32) -1;
                return false;
        } else {
                REG_RMW_FIELD(ah, AR_TIME_OUT,
                              AR_TIME_OUT_CTS, ath9k_hw_mac_to_clks(ah, us));
-               ahp->ah_ctstimeout = us;
+               ah->ctstimeout = us;
                return true;
        }
 }
 
-static bool ath9k_hw_set_global_txtimeout(struct ath_hal *ah, u32 tu)
+static bool ath9k_hw_set_global_txtimeout(struct ath_hw *ah, u32 tu)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
-
        if (tu > 0xFFFF) {
                DPRINTF(ah->ah_sc, ATH_DBG_XMIT,
                        "bad global tx timeout %u\n", tu);
-               ahp->ah_globaltxtimeout = (u32) -1;
+               ah->globaltxtimeout = (u32) -1;
                return false;
        } else {
                REG_RMW_FIELD(ah, AR_GTXTO, AR_GTXTO_TIMEOUT_LIMIT, tu);
-               ahp->ah_globaltxtimeout = tu;
+               ah->globaltxtimeout = tu;
                return true;
        }
 }
 
-static void ath9k_hw_init_user_settings(struct ath_hal *ah)
+static void ath9k_hw_init_user_settings(struct ath_hw *ah)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
-
-       DPRINTF(ah->ah_sc, ATH_DBG_RESET, "ahp->ah_miscMode 0x%x\n",
-               ahp->ah_miscMode);
+       DPRINTF(ah->ah_sc, ATH_DBG_RESET, "ah->misc_mode 0x%x\n",
+               ah->misc_mode);
 
-       if (ahp->ah_miscMode != 0)
+       if (ah->misc_mode != 0)
                REG_WRITE(ah, AR_PCU_MISC,
-                         REG_READ(ah, AR_PCU_MISC) | ahp->ah_miscMode);
-       if (ahp->ah_slottime != (u32) -1)
-               ath9k_hw_setslottime(ah, ahp->ah_slottime);
-       if (ahp->ah_acktimeout != (u32) -1)
-               ath9k_hw_set_ack_timeout(ah, ahp->ah_acktimeout);
-       if (ahp->ah_ctstimeout != (u32) -1)
-               ath9k_hw_set_cts_timeout(ah, ahp->ah_ctstimeout);
-       if (ahp->ah_globaltxtimeout != (u32) -1)
-               ath9k_hw_set_global_txtimeout(ah, ahp->ah_globaltxtimeout);
+                         REG_READ(ah, AR_PCU_MISC) | ah->misc_mode);
+       if (ah->slottime != (u32) -1)
+               ath9k_hw_setslottime(ah, ah->slottime);
+       if (ah->acktimeout != (u32) -1)
+               ath9k_hw_set_ack_timeout(ah, ah->acktimeout);
+       if (ah->ctstimeout != (u32) -1)
+               ath9k_hw_set_cts_timeout(ah, ah->ctstimeout);
+       if (ah->globaltxtimeout != (u32) -1)
+               ath9k_hw_set_global_txtimeout(ah, ah->globaltxtimeout);
 }
 
 const char *ath9k_hw_probe(u16 vendorid, u16 devid)
@@ -1123,7 +1136,7 @@ const char *ath9k_hw_probe(u16 vendorid, u16 devid)
                ath9k_hw_devname(devid) : NULL;
 }
 
-void ath9k_hw_detach(struct ath_hal *ah)
+void ath9k_hw_detach(struct ath_hw *ah)
 {
        if (!AR_SREV_9100(ah))
                ath9k_hw_ani_detach(ah);
@@ -1133,10 +1146,9 @@ void ath9k_hw_detach(struct ath_hal *ah)
        kfree(ah);
 }
 
-struct ath_hal *ath9k_hw_attach(u16 devid, struct ath_softc *sc,
-                               void __iomem *mem, int *error)
+struct ath_hw *ath9k_hw_attach(u16 devid, struct ath_softc *sc, int *error)
 {
-       struct ath_hal *ah = NULL;
+       struct ath_hw *ah = NULL;
 
        switch (devid) {
        case AR5416_DEVID_PCI:
@@ -1146,7 +1158,7 @@ struct ath_hal *ath9k_hw_attach(u16 devid, struct ath_softc *sc,
        case AR9280_DEVID_PCI:
        case AR9280_DEVID_PCIE:
        case AR9285_DEVID_PCIE:
-               ah = ath9k_hw_do_attach(devid, sc, mem, error);
+               ah = ath9k_hw_do_attach(devid, sc, error);
                break;
        default:
                *error = -ENXIO;
@@ -1160,7 +1172,7 @@ struct ath_hal *ath9k_hw_attach(u16 devid, struct ath_softc *sc,
 /* INI */
 /*******/
 
-static void ath9k_hw_override_ini(struct ath_hal *ah,
+static void ath9k_hw_override_ini(struct ath_hw *ah,
                                  struct ath9k_channel *chan)
 {
        /*
@@ -1171,20 +1183,20 @@ static void ath9k_hw_override_ini(struct ath_hal *ah,
        REG_SET_BIT(ah, AR_DIAG_SW, (AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT));
 
 
-       if (!AR_SREV_5416_V20_OR_LATER(ah) ||
+       if (!AR_SREV_5416_20_OR_LATER(ah) ||
            AR_SREV_9280_10_OR_LATER(ah))
                return;
 
        REG_WRITE(ah, 0x9800 + (651 << 2), 0x11);
 }
 
-static u32 ath9k_hw_def_ini_fixup(struct ath_hal *ah,
+static u32 ath9k_hw_def_ini_fixup(struct ath_hw *ah,
                              struct ar5416_eeprom_def *pEepData,
                              u32 reg, u32 value)
 {
        struct base_eep_header *pBase = &(pEepData->baseEepHeader);
 
-       switch (ah->ah_devid) {
+       switch (ah->hw_version.devid) {
        case AR9280_DEVID_PCI:
                if (reg == 0x7894) {
                        DPRINTF(ah->ah_sc, ATH_DBG_ANY,
@@ -1212,24 +1224,32 @@ static u32 ath9k_hw_def_ini_fixup(struct ath_hal *ah,
        return value;
 }
 
-static u32 ath9k_hw_ini_fixup(struct ath_hal *ah,
+static u32 ath9k_hw_ini_fixup(struct ath_hw *ah,
                              struct ar5416_eeprom_def *pEepData,
                              u32 reg, u32 value)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
-
-       if (ahp->ah_eep_map == EEP_MAP_4KBITS)
+       if (ah->eep_map == EEP_MAP_4KBITS)
                return value;
        else
                return ath9k_hw_def_ini_fixup(ah, pEepData, reg, value);
 }
 
-static int ath9k_hw_process_ini(struct ath_hal *ah,
+static void ath9k_olc_init(struct ath_hw *ah)
+{
+       u32 i;
+
+       for (i = 0; i < AR9280_TX_GAIN_TABLE_SIZE; i++)
+               ah->originalGain[i] =
+                       MS(REG_READ(ah, AR_PHY_TX_GAIN_TBL1 + i * 4),
+                                       AR_PHY_TX_GAIN);
+       ah->PDADCdelta = 0;
+}
+
+static int ath9k_hw_process_ini(struct ath_hw *ah,
                                struct ath9k_channel *chan,
                                enum ath9k_ht_macmode macmode)
 {
        int i, regWrites = 0;
-       struct ath_hal_5416 *ahp = AH5416(ah);
        struct ieee80211_channel *channel = chan->chan;
        u32 modesIndex, freqIndex;
        int status;
@@ -1262,40 +1282,38 @@ static int ath9k_hw_process_ini(struct ath_hal *ah,
        }
 
        REG_WRITE(ah, AR_PHY(0), 0x00000007);
-
        REG_WRITE(ah, AR_PHY_ADC_SERIAL_CTL, AR_PHY_SEL_EXTERNAL_RADIO);
+       ah->eep_ops->set_addac(ah, chan);
 
-       ath9k_hw_set_addac(ah, chan);
-
-       if (AR_SREV_5416_V22_OR_LATER(ah)) {
-               REG_WRITE_ARRAY(&ahp->ah_iniAddac, 1, regWrites);
+       if (AR_SREV_5416_22_OR_LATER(ah)) {
+               REG_WRITE_ARRAY(&ah->iniAddac, 1, regWrites);
        } else {
                struct ar5416IniArray temp;
                u32 addacSize =
-                       sizeof(u32) * ahp->ah_iniAddac.ia_rows *
-                       ahp->ah_iniAddac.ia_columns;
+                       sizeof(u32) * ah->iniAddac.ia_rows *
+                       ah->iniAddac.ia_columns;
 
-               memcpy(ahp->ah_addac5416_21,
-                      ahp->ah_iniAddac.ia_array, addacSize);
+               memcpy(ah->addac5416_21,
+                      ah->iniAddac.ia_array, addacSize);
 
-               (ahp->ah_addac5416_21)[31 * ahp->ah_iniAddac.ia_columns + 1] = 0;
+               (ah->addac5416_21)[31 * ah->iniAddac.ia_columns + 1] = 0;
 
-               temp.ia_array = ahp->ah_addac5416_21;
-               temp.ia_columns = ahp->ah_iniAddac.ia_columns;
-               temp.ia_rows = ahp->ah_iniAddac.ia_rows;
+               temp.ia_array = ah->addac5416_21;
+               temp.ia_columns = ah->iniAddac.ia_columns;
+               temp.ia_rows = ah->iniAddac.ia_rows;
                REG_WRITE_ARRAY(&temp, 1, regWrites);
        }
 
        REG_WRITE(ah, AR_PHY_ADC_SERIAL_CTL, AR_PHY_SEL_INTERNAL_ADDAC);
 
-       for (i = 0; i < ahp->ah_iniModes.ia_rows; i++) {
-               u32 reg = INI_RA(&ahp->ah_iniModes, i, 0);
-               u32 val = INI_RA(&ahp->ah_iniModes, i, modesIndex);
+       for (i = 0; i < ah->iniModes.ia_rows; i++) {
+               u32 reg = INI_RA(&ah->iniModes, i, 0);
+               u32 val = INI_RA(&ah->iniModes, i, modesIndex);
 
                REG_WRITE(ah, reg, val);
 
                if (reg >= 0x7800 && reg < 0x78a0
-                   && ah->ah_config.analog_shiftreg) {
+                   && ah->config.analog_shiftreg) {
                        udelay(100);
                }
 
@@ -1303,19 +1321,20 @@ static int ath9k_hw_process_ini(struct ath_hal *ah,
        }
 
        if (AR_SREV_9280(ah))
-               REG_WRITE_ARRAY(&ahp->ah_iniModesRxGain, modesIndex, regWrites);
+               REG_WRITE_ARRAY(&ah->iniModesRxGain, modesIndex, regWrites);
 
-       if (AR_SREV_9280(ah))
-               REG_WRITE_ARRAY(&ahp->ah_iniModesTxGain, modesIndex, regWrites);
+       if (AR_SREV_9280(ah) || (AR_SREV_9285(ah) &&
+           AR_SREV_9285_12_OR_LATER(ah)))
+               REG_WRITE_ARRAY(&ah->iniModesTxGain, modesIndex, regWrites);
 
-       for (i = 0; i < ahp->ah_iniCommon.ia_rows; i++) {
-               u32 reg = INI_RA(&ahp->ah_iniCommon, i, 0);
-               u32 val = INI_RA(&ahp->ah_iniCommon, i, 1);
+       for (i = 0; i < ah->iniCommon.ia_rows; i++) {
+               u32 reg = INI_RA(&ah->iniCommon, i, 0);
+               u32 val = INI_RA(&ah->iniCommon, i, 1);
 
                REG_WRITE(ah, reg, val);
 
                if (reg >= 0x7800 && reg < 0x78a0
-                   && ah->ah_config.analog_shiftreg) {
+                   && ah->config.analog_shiftreg) {
                        udelay(100);
                }
 
@@ -1325,7 +1344,7 @@ static int ath9k_hw_process_ini(struct ath_hal *ah,
        ath9k_hw_write_regs(ah, modesIndex, freqIndex, regWrites);
 
        if (AR_SREV_9280_20(ah) && IS_CHAN_A_5MHZ_SPACED(chan)) {
-               REG_WRITE_ARRAY(&ahp->ah_iniModesAdditional, modesIndex,
+               REG_WRITE_ARRAY(&ah->iniModesAdditional, modesIndex,
                                regWrites);
        }
 
@@ -1333,12 +1352,15 @@ static int ath9k_hw_process_ini(struct ath_hal *ah,
        ath9k_hw_set_regs(ah, chan, macmode);
        ath9k_hw_init_chain_masks(ah);
 
-       status = ath9k_hw_set_txpower(ah, chan,
-                                     ath9k_regd_get_ctl(ah, chan),
-                                     channel->max_antenna_gain * 2,
-                                     channel->max_power * 2,
-                                     min((u32) MAX_RATE_POWER,
-                                         (u32) ah->ah_powerLimit));
+       if (OLC_FOR_AR9280_20_LATER)
+               ath9k_olc_init(ah);
+
+       status = ah->eep_ops->set_txpower(ah, chan,
+                                 ath9k_regd_get_ctl(ah, chan),
+                                 channel->max_antenna_gain * 2,
+                                 channel->max_power * 2,
+                                 min((u32) MAX_RATE_POWER,
+                                     (u32) ah->regulatory.power_limit));
        if (status != 0) {
                DPRINTF(ah->ah_sc, ATH_DBG_POWER_MGMT,
                        "error init'ing transmit power\n");
@@ -1358,7 +1380,7 @@ static int ath9k_hw_process_ini(struct ath_hal *ah,
 /* Reset and Channel Switching Routines */
 /****************************************/
 
-static void ath9k_hw_set_rfmode(struct ath_hal *ah, struct ath9k_channel *chan)
+static void ath9k_hw_set_rfmode(struct ath_hw *ah, struct ath9k_channel *chan)
 {
        u32 rfMode = 0;
 
@@ -1378,12 +1400,12 @@ static void ath9k_hw_set_rfmode(struct ath_hal *ah, struct ath9k_channel *chan)
        REG_WRITE(ah, AR_PHY_MODE, rfMode);
 }
 
-static void ath9k_hw_mark_phy_inactive(struct ath_hal *ah)
+static void ath9k_hw_mark_phy_inactive(struct ath_hw *ah)
 {
        REG_WRITE(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_DIS);
 }
 
-static inline void ath9k_hw_set_dma(struct ath_hal *ah)
+static inline void ath9k_hw_set_dma(struct ath_hw *ah)
 {
        u32 regval;
 
@@ -1393,7 +1415,7 @@ static inline void ath9k_hw_set_dma(struct ath_hal *ah)
        regval = REG_READ(ah, AR_TXCFG) & ~AR_TXCFG_DMASZ_MASK;
        REG_WRITE(ah, AR_TXCFG, regval | AR_TXCFG_DMASZ_128B);
 
-       REG_RMW_FIELD(ah, AR_TXCFG, AR_FTRIG, ah->ah_txTrigLevel);
+       REG_RMW_FIELD(ah, AR_TXCFG, AR_FTRIG, ah->tx_trig_level);
 
        regval = REG_READ(ah, AR_RXCFG) & ~AR_RXCFG_DMASZ_MASK;
        REG_WRITE(ah, AR_RXCFG, regval | AR_RXCFG_DMASZ_128B);
@@ -1409,7 +1431,7 @@ static inline void ath9k_hw_set_dma(struct ath_hal *ah)
        }
 }
 
-static void ath9k_hw_set_operating_mode(struct ath_hal *ah, int opmode)
+static void ath9k_hw_set_operating_mode(struct ath_hw *ah, int opmode)
 {
        u32 val;
 
@@ -1433,7 +1455,7 @@ static void ath9k_hw_set_operating_mode(struct ath_hal *ah, int opmode)
        }
 }
 
-static inline void ath9k_hw_get_delta_slope_vals(struct ath_hal *ah,
+static inline void ath9k_hw_get_delta_slope_vals(struct ath_hw *ah,
                                                 u32 coef_scaled,
                                                 u32 *coef_mantissa,
                                                 u32 *coef_exponent)
@@ -1452,7 +1474,7 @@ static inline void ath9k_hw_get_delta_slope_vals(struct ath_hal *ah,
        *coef_exponent = coef_exp - 16;
 }
 
-static void ath9k_hw_set_delta_slope(struct ath_hal *ah,
+static void ath9k_hw_set_delta_slope(struct ath_hw *ah,
                                     struct ath9k_channel *chan)
 {
        u32 coef_scaled, ds_coef_exp, ds_coef_man;
@@ -1486,11 +1508,19 @@ static void ath9k_hw_set_delta_slope(struct ath_hal *ah,
                      AR_PHY_HALFGI_DSC_EXP, ds_coef_exp);
 }
 
-static bool ath9k_hw_set_reset(struct ath_hal *ah, int type)
+static bool ath9k_hw_set_reset(struct ath_hw *ah, int type)
 {
        u32 rst_flags;
        u32 tmpReg;
 
+       if (AR_SREV_9100(ah)) {
+               u32 val = REG_READ(ah, AR_RTC_DERIVED_CLK);
+               val &= ~AR_RTC_DERIVED_CLK_PERIOD;
+               val |= SM(1, AR_RTC_DERIVED_CLK_PERIOD);
+               REG_WRITE(ah, AR_RTC_DERIVED_CLK, val);
+               (void)REG_READ(ah, AR_RTC_DERIVED_CLK);
+       }
+
        REG_WRITE(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN |
                  AR_RTC_FORCE_WAKE_ON_INT);
 
@@ -1517,7 +1547,7 @@ static bool ath9k_hw_set_reset(struct ath_hal *ah, int type)
        udelay(50);
 
        REG_WRITE(ah, AR_RTC_RC, 0);
-       if (!ath9k_hw_wait(ah, AR_RTC_RC, AR_RTC_RC_M, 0)) {
+       if (!ath9k_hw_wait(ah, AR_RTC_RC, AR_RTC_RC_M, 0, AH_WAIT_TIMEOUT)) {
                DPRINTF(ah->ah_sc, ATH_DBG_RESET,
                        "RTC stuck in MAC reset\n");
                return false;
@@ -1534,18 +1564,20 @@ static bool ath9k_hw_set_reset(struct ath_hal *ah, int type)
        return true;
 }
 
-static bool ath9k_hw_set_reset_power_on(struct ath_hal *ah)
+static bool ath9k_hw_set_reset_power_on(struct ath_hw *ah)
 {
        REG_WRITE(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN |
                  AR_RTC_FORCE_WAKE_ON_INT);
 
        REG_WRITE(ah, AR_RTC_RESET, 0);
+       udelay(2);
        REG_WRITE(ah, AR_RTC_RESET, 1);
 
        if (!ath9k_hw_wait(ah,
                           AR_RTC_STATUS,
                           AR_RTC_STATUS_M,
-                          AR_RTC_STATUS_ON)) {
+                          AR_RTC_STATUS_ON,
+                          AH_WAIT_TIMEOUT)) {
                DPRINTF(ah->ah_sc, ATH_DBG_RESET, "RTC not waking up\n");
                return false;
        }
@@ -1555,7 +1587,7 @@ static bool ath9k_hw_set_reset_power_on(struct ath_hal *ah)
        return ath9k_hw_set_reset(ah, ATH9K_RESET_WARM);
 }
 
-static bool ath9k_hw_set_reset_reg(struct ath_hal *ah, u32 type)
+static bool ath9k_hw_set_reset_reg(struct ath_hw *ah, u32 type)
 {
        REG_WRITE(ah, AR_RTC_FORCE_WAKE,
                  AR_RTC_FORCE_WAKE_EN | AR_RTC_FORCE_WAKE_ON_INT);
@@ -1573,12 +1605,11 @@ static bool ath9k_hw_set_reset_reg(struct ath_hal *ah, u32 type)
        }
 }
 
-static void ath9k_hw_set_regs(struct ath_hal *ah, struct ath9k_channel *chan,
+static void ath9k_hw_set_regs(struct ath_hw *ah, struct ath9k_channel *chan,
                              enum ath9k_ht_macmode macmode)
 {
        u32 phymode;
        u32 enableDacFifo = 0;
-       struct ath_hal_5416 *ahp = AH5416(ah);
 
        if (AR_SREV_9285_10_OR_LATER(ah))
                enableDacFifo = (REG_READ(ah, AR_PHY_TURBO) &
@@ -1594,7 +1625,7 @@ static void ath9k_hw_set_regs(struct ath_hal *ah, struct ath9k_channel *chan,
                    (chan->chanmode == CHANNEL_G_HT40PLUS))
                        phymode |= AR_PHY_FC_DYN2040_PRI_CH;
 
-               if (ahp->ah_extprotspacing == ATH9K_HT_EXTPROTSPACING_25)
+               if (ah->extprotspacing == ATH9K_HT_EXTPROTSPACING_25)
                        phymode |= AR_PHY_FC_DYN2040_EXT_CH;
        }
        REG_WRITE(ah, AR_PHY_TURBO, phymode);
@@ -1605,27 +1636,26 @@ static void ath9k_hw_set_regs(struct ath_hal *ah, struct ath9k_channel *chan,
        REG_WRITE(ah, AR_CST, 0xF << AR_CST_TIMEOUT_LIMIT_S);
 }
 
-static bool ath9k_hw_chip_reset(struct ath_hal *ah,
+static bool ath9k_hw_chip_reset(struct ath_hw *ah,
                                struct ath9k_channel *chan)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
-
-       if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_WARM))
+       if (OLC_FOR_AR9280_20_LATER) {
+               if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_POWER_ON))
+                       return false;
+       } else if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_WARM))
                return false;
 
        if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE))
                return false;
 
-       ahp->ah_chipFullSleep = false;
-
+       ah->chip_fullsleep = false;
        ath9k_hw_init_pll(ah, chan);
-
        ath9k_hw_set_rfmode(ah, chan);
 
        return true;
 }
 
-static bool ath9k_hw_channel_change(struct ath_hal *ah,
+static bool ath9k_hw_channel_change(struct ath_hw *ah,
                                    struct ath9k_channel *chan,
                                    enum ath9k_ht_macmode macmode)
 {
@@ -1642,7 +1672,7 @@ static bool ath9k_hw_channel_change(struct ath_hal *ah,
 
        REG_WRITE(ah, AR_PHY_RFBUS_REQ, AR_PHY_RFBUS_REQ_EN);
        if (!ath9k_hw_wait(ah, AR_PHY_RFBUS_GRANT, AR_PHY_RFBUS_GRANT_EN,
-                          AR_PHY_RFBUS_GRANT_EN)) {
+                          AR_PHY_RFBUS_GRANT_EN, AH_WAIT_TIMEOUT)) {
                DPRINTF(ah->ah_sc, ATH_DBG_REG_IO,
                        "Could not kill baseband RX\n");
                return false;
@@ -1664,12 +1694,12 @@ static bool ath9k_hw_channel_change(struct ath_hal *ah,
                }
        }
 
-       if (ath9k_hw_set_txpower(ah, chan,
-                                ath9k_regd_get_ctl(ah, chan),
-                                channel->max_antenna_gain * 2,
-                                channel->max_power * 2,
-                                min((u32) MAX_RATE_POWER,
-                                    (u32) ah->ah_powerLimit)) != 0) {
+       if (ah->eep_ops->set_txpower(ah, chan,
+                            ath9k_regd_get_ctl(ah, chan),
+                            channel->max_antenna_gain * 2,
+                            channel->max_power * 2,
+                            min((u32) MAX_RATE_POWER,
+                                (u32) ah->regulatory.power_limit)) != 0) {
                DPRINTF(ah->ah_sc, ATH_DBG_EEPROM,
                        "error init'ing transmit power\n");
                return false;
@@ -1699,7 +1729,7 @@ static bool ath9k_hw_channel_change(struct ath_hal *ah,
        return true;
 }
 
-static void ath9k_hw_9280_spur_mitigate(struct ath_hal *ah, struct ath9k_channel *chan)
+static void ath9k_hw_9280_spur_mitigate(struct ath_hw *ah, struct ath9k_channel *chan)
 {
        int bb_spur = AR_NO_SPUR;
        int freq;
@@ -1733,9 +1763,9 @@ static void ath9k_hw_9280_spur_mitigate(struct ath_hal *ah, struct ath9k_channel
        ath9k_hw_get_channel_centers(ah, chan, &centers);
        freq = centers.synth_center;
 
-       ah->ah_config.spurmode = SPUR_ENABLE_EEPROM;
+       ah->config.spurmode = SPUR_ENABLE_EEPROM;
        for (i = 0; i < AR_EEPROM_MODAL_SPURS; i++) {
-               cur_bb_spur = ath9k_hw_eeprom_get_spur_chan(ah, i, is2GHz);
+               cur_bb_spur = ah->eep_ops->get_spur_channel(ah, i, is2GHz);
 
                if (is2GHz)
                        cur_bb_spur = (cur_bb_spur / 10) + AR_BASE_FREQ_2GHZ;
@@ -1949,7 +1979,7 @@ static void ath9k_hw_9280_spur_mitigate(struct ath_hal *ah, struct ath9k_channel
        REG_WRITE(ah, AR_PHY_MASK2_P_61_45, tmp_mask);
 }
 
-static void ath9k_hw_spur_mitigate(struct ath_hal *ah, struct ath9k_channel *chan)
+static void ath9k_hw_spur_mitigate(struct ath_hw *ah, struct ath9k_channel *chan)
 {
        int bb_spur = AR_NO_SPUR;
        int bin, cur_bin;
@@ -1978,7 +2008,7 @@ static void ath9k_hw_spur_mitigate(struct ath_hal *ah, struct ath9k_channel *cha
        memset(&mask_p, 0, sizeof(int8_t) * 123);
 
        for (i = 0; i < AR_EEPROM_MODAL_SPURS; i++) {
-               cur_bb_spur = ath9k_hw_eeprom_get_spur_chan(ah, i, is2GHz);
+               cur_bb_spur = ah->eep_ops->get_spur_channel(ah, i, is2GHz);
                if (AR_NO_SPUR == cur_bb_spur)
                        break;
                cur_bb_spur = cur_bb_spur - (chan->channel * 10);
@@ -2150,27 +2180,26 @@ static void ath9k_hw_spur_mitigate(struct ath_hal *ah, struct ath9k_channel *cha
        REG_WRITE(ah, AR_PHY_MASK2_P_61_45, tmp_mask);
 }
 
-int ath9k_hw_reset(struct ath_hal *ah, struct ath9k_channel *chan,
+int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
                    bool bChannelChange)
 {
        u32 saveLedState;
        struct ath_softc *sc = ah->ah_sc;
-       struct ath_hal_5416 *ahp = AH5416(ah);
-       struct ath9k_channel *curchan = ah->ah_curchan;
+       struct ath9k_channel *curchan = ah->curchan;
        u32 saveDefAntenna;
        u32 macStaId1;
        int i, rx_chainmask, r;
 
-       ahp->ah_extprotspacing = sc->sc_ht_extprotspacing;
-       ahp->ah_txchainmask = sc->sc_tx_chainmask;
-       ahp->ah_rxchainmask = sc->sc_rx_chainmask;
+       ah->extprotspacing = sc->ht_extprotspacing;
+       ah->txchainmask = sc->tx_chainmask;
+       ah->rxchainmask = sc->rx_chainmask;
 
        if (AR_SREV_9285(ah)) {
-               ahp->ah_txchainmask &= 0x1;
-               ahp->ah_rxchainmask &= 0x1;
+               ah->txchainmask &= 0x1;
+               ah->rxchainmask &= 0x1;
        } else if (AR_SREV_9280(ah)) {
-               ahp->ah_txchainmask &= 0x3;
-               ahp->ah_rxchainmask &= 0x3;
+               ah->txchainmask &= 0x3;
+               ah->rxchainmask &= 0x3;
        }
 
        if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE))
@@ -2180,16 +2209,16 @@ int ath9k_hw_reset(struct ath_hal *ah, struct ath9k_channel *chan,
                ath9k_hw_getnf(ah, curchan);
 
        if (bChannelChange &&
-           (ahp->ah_chipFullSleep != true) &&
-           (ah->ah_curchan != NULL) &&
-           (chan->channel != ah->ah_curchan->channel) &&
+           (ah->chip_fullsleep != true) &&
+           (ah->curchan != NULL) &&
+           (chan->channel != ah->curchan->channel) &&
            ((chan->channelFlags & CHANNEL_ALL) ==
-            (ah->ah_curchan->channelFlags & CHANNEL_ALL)) &&
+            (ah->curchan->channelFlags & CHANNEL_ALL)) &&
            (!AR_SREV_9280(ah) || (!IS_CHAN_A_5MHZ_SPACED(chan) &&
-                                  !IS_CHAN_A_5MHZ_SPACED(ah->ah_curchan)))) {
+                                  !IS_CHAN_A_5MHZ_SPACED(ah->curchan)))) {
 
                if (ath9k_hw_channel_change(ah, chan, sc->tx_chan_width)) {
-                       ath9k_hw_loadnf(ah, ah->ah_curchan);
+                       ath9k_hw_loadnf(ah, ah->curchan);
                        ath9k_hw_start_nfcal(ah);
                        return 0;
                }
@@ -2244,7 +2273,7 @@ int ath9k_hw_reset(struct ath_hal *ah, struct ath9k_channel *chan,
        else
                ath9k_hw_spur_mitigate(ah, chan);
 
-       if (!ath9k_hw_eeprom_set_board_values(ah, chan)) {
+       if (!ah->eep_ops->set_board_values(ah, chan)) {
                DPRINTF(ah->ah_sc, ATH_DBG_EEPROM,
                        "error setting board options\n");
                return -EIO;
@@ -2252,23 +2281,23 @@ int ath9k_hw_reset(struct ath_hal *ah, struct ath9k_channel *chan,
 
        ath9k_hw_decrease_chain_power(ah, chan);
 
-       REG_WRITE(ah, AR_STA_ID0, get_unaligned_le32(ahp->ah_macaddr));
-       REG_WRITE(ah, AR_STA_ID1, get_unaligned_le16(ahp->ah_macaddr + 4)
+       REG_WRITE(ah, AR_STA_ID0, get_unaligned_le32(ah->macaddr));
+       REG_WRITE(ah, AR_STA_ID1, get_unaligned_le16(ah->macaddr + 4)
                  | macStaId1
                  | AR_STA_ID1_RTS_USE_DEF
-                 | (ah->ah_config.
+                 | (ah->config.
                     ack_6mb ? AR_STA_ID1_ACKCTS_6MB : 0)
-                 | ahp->ah_staId1Defaults);
-       ath9k_hw_set_operating_mode(ah, ah->ah_opmode);
+                 | ah->sta_id1_defaults);
+       ath9k_hw_set_operating_mode(ah, ah->opmode);
 
-       REG_WRITE(ah, AR_BSSMSKL, get_unaligned_le32(ahp->ah_bssidmask));
-       REG_WRITE(ah, AR_BSSMSKU, get_unaligned_le16(ahp->ah_bssidmask + 4));
+       REG_WRITE(ah, AR_BSSMSKL, get_unaligned_le32(sc->bssidmask));
+       REG_WRITE(ah, AR_BSSMSKU, get_unaligned_le16(sc->bssidmask + 4));
 
        REG_WRITE(ah, AR_DEF_ANTENNA, saveDefAntenna);
 
-       REG_WRITE(ah, AR_BSS_ID0, get_unaligned_le32(ahp->ah_bssid));
-       REG_WRITE(ah, AR_BSS_ID1, get_unaligned_le16(ahp->ah_bssid + 4) |
-                 ((ahp->ah_assocId & 0x3fff) << AR_BSS_ID1_AID_S));
+       REG_WRITE(ah, AR_BSS_ID0, get_unaligned_le32(sc->curbssid));
+       REG_WRITE(ah, AR_BSS_ID1, get_unaligned_le16(sc->curbssid + 4) |
+                 ((sc->curaid & 0x3fff) << AR_BSS_ID1_AID_S));
 
        REG_WRITE(ah, AR_ISR, ~0);
 
@@ -2285,15 +2314,15 @@ int ath9k_hw_reset(struct ath_hal *ah, struct ath9k_channel *chan,
        for (i = 0; i < AR_NUM_DCU; i++)
                REG_WRITE(ah, AR_DQCUMASK(i), 1 << i);
 
-       ahp->ah_intrTxqs = 0;
-       for (i = 0; i < ah->ah_caps.total_queues; i++)
+       ah->intr_txqs = 0;
+       for (i = 0; i < ah->caps.total_queues; i++)
                ath9k_hw_resettxqueue(ah, i);
 
-       ath9k_hw_init_interrupt_masks(ah, ah->ah_opmode);
+       ath9k_hw_init_interrupt_masks(ah, ah->opmode);
        ath9k_hw_init_qos(ah);
 
 #if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
-       if (ah->ah_caps.hw_caps & ATH9K_HW_CAP_RFSILENT)
+       if (ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT)
                ath9k_enable_rfkill(ah);
 #endif
        ath9k_hw_init_user_settings(ah);
@@ -2305,7 +2334,7 @@ int ath9k_hw_reset(struct ath_hal *ah, struct ath9k_channel *chan,
 
        REG_WRITE(ah, AR_OBS, 8);
 
-       if (ahp->ah_intrMitigation) {
+       if (ah->intr_mitigation) {
 
                REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_LAST, 500);
                REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_FIRST, 2000);
@@ -2316,7 +2345,7 @@ int ath9k_hw_reset(struct ath_hal *ah, struct ath9k_channel *chan,
        if (!ath9k_hw_init_cal(ah, chan))
                return -EIO;;
 
-       rx_chainmask = ahp->ah_rxchainmask;
+       rx_chainmask = ah->rxchainmask;
        if ((rx_chainmask == 0x5) || (rx_chainmask == 0x3)) {
                REG_WRITE(ah, AR_PHY_RX_CHAINMASK, rx_chainmask);
                REG_WRITE(ah, AR_PHY_CAL_CHAINMASK, rx_chainmask);
@@ -2350,11 +2379,11 @@ int ath9k_hw_reset(struct ath_hal *ah, struct ath9k_channel *chan,
 /* Key Cache Management */
 /************************/
 
-bool ath9k_hw_keyreset(struct ath_hal *ah, u16 entry)
+bool ath9k_hw_keyreset(struct ath_hw *ah, u16 entry)
 {
        u32 keyType;
 
-       if (entry >= ah->ah_caps.keycache_size) {
+       if (entry >= ah->caps.keycache_size) {
                DPRINTF(ah->ah_sc, ATH_DBG_KEYCACHE,
                        "entry %u out of range\n", entry);
                return false;
@@ -2381,17 +2410,17 @@ bool ath9k_hw_keyreset(struct ath_hal *ah, u16 entry)
 
        }
 
-       if (ah->ah_curchan == NULL)
+       if (ah->curchan == NULL)
                return true;
 
        return true;
 }
 
-bool ath9k_hw_keysetmac(struct ath_hal *ah, u16 entry, const u8 *mac)
+bool ath9k_hw_keysetmac(struct ath_hw *ah, u16 entry, const u8 *mac)
 {
        u32 macHi, macLo;
 
-       if (entry >= ah->ah_caps.keycache_size) {
+       if (entry >= ah->caps.keycache_size) {
                DPRINTF(ah->ah_sc, ATH_DBG_KEYCACHE,
                        "entry %u out of range\n", entry);
                return false;
@@ -2415,17 +2444,13 @@ bool ath9k_hw_keysetmac(struct ath_hal *ah, u16 entry, const u8 *mac)
        return true;
 }
 
-bool ath9k_hw_set_keycache_entry(struct ath_hal *ah, u16 entry,
+bool ath9k_hw_set_keycache_entry(struct ath_hw *ah, u16 entry,
                                 const struct ath9k_keyval *k,
-                                const u8 *mac, int xorKey)
+                                const u8 *mac)
 {
-       const struct ath9k_hw_capabilities *pCap = &ah->ah_caps;
+       const struct ath9k_hw_capabilities *pCap = &ah->caps;
        u32 key0, key1, key2, key3, key4;
        u32 keyType;
-       u32 xorMask = xorKey ?
-               (ATH9K_KEY_XOR << 24 | ATH9K_KEY_XOR << 16 | ATH9K_KEY_XOR << 8
-                | ATH9K_KEY_XOR) : 0;
-       struct ath_hal_5416 *ahp = AH5416(ah);
 
        if (entry >= pCap->keycache_size) {
                DPRINTF(ah->ah_sc, ATH_DBG_KEYCACHE,
@@ -2441,7 +2466,7 @@ bool ath9k_hw_set_keycache_entry(struct ath_hal *ah, u16 entry,
                if (!(pCap->hw_caps & ATH9K_HW_CAP_CIPHER_AESCCM)) {
                        DPRINTF(ah->ah_sc, ATH_DBG_KEYCACHE,
                                "AES-CCM not supported by mac rev 0x%x\n",
-                               ah->ah_macRev);
+                               ah->hw_version.macRev);
                        return false;
                }
                keyType = AR_KEYTABLE_TYPE_CCM;
@@ -2477,26 +2502,57 @@ bool ath9k_hw_set_keycache_entry(struct ath_hal *ah, u16 entry,
                return false;
        }
 
-       key0 = get_unaligned_le32(k->kv_val + 0) ^ xorMask;
-       key1 = (get_unaligned_le16(k->kv_val + 4) ^ xorMask) & 0xffff;
-       key2 = get_unaligned_le32(k->kv_val + 6) ^ xorMask;
-       key3 = (get_unaligned_le16(k->kv_val + 10) ^ xorMask) & 0xffff;
-       key4 = get_unaligned_le32(k->kv_val + 12) ^ xorMask;
+       key0 = get_unaligned_le32(k->kv_val + 0);
+       key1 = get_unaligned_le16(k->kv_val + 4);
+       key2 = get_unaligned_le32(k->kv_val + 6);
+       key3 = get_unaligned_le16(k->kv_val + 10);
+       key4 = get_unaligned_le32(k->kv_val + 12);
        if (k->kv_len <= LEN_WEP104)
                key4 &= 0xff;
 
+       /*
+        * Note: Key cache registers access special memory area that requires
+        * two 32-bit writes to actually update the values in the internal
+        * memory. Consequently, the exact order and pairs used here must be
+        * maintained.
+        */
+
        if (keyType == AR_KEYTABLE_TYPE_TKIP && ATH9K_IS_MIC_ENABLED(ah)) {
                u16 micentry = entry + 64;
 
+               /*
+                * Write inverted key[47:0] first to avoid Michael MIC errors
+                * on frames that could be sent or received at the same time.
+                * The correct key will be written in the end once everything
+                * else is ready.
+                */
                REG_WRITE(ah, AR_KEYTABLE_KEY0(entry), ~key0);
                REG_WRITE(ah, AR_KEYTABLE_KEY1(entry), ~key1);
+
+               /* Write key[95:48] */
                REG_WRITE(ah, AR_KEYTABLE_KEY2(entry), key2);
                REG_WRITE(ah, AR_KEYTABLE_KEY3(entry), key3);
+
+               /* Write key[127:96] and key type */
                REG_WRITE(ah, AR_KEYTABLE_KEY4(entry), key4);
                REG_WRITE(ah, AR_KEYTABLE_TYPE(entry), keyType);
+
+               /* Write MAC address for the entry */
                (void) ath9k_hw_keysetmac(ah, entry, mac);
 
-               if (ahp->ah_miscMode & AR_PCU_MIC_NEW_LOC_ENA) {
+               if (ah->misc_mode & AR_PCU_MIC_NEW_LOC_ENA) {
+                       /*
+                        * TKIP uses two key cache entries:
+                        * Michael MIC TX/RX keys in the same key cache entry
+                        * (idx = main index + 64):
+                        * key0 [31:0] = RX key [31:0]
+                        * key1 [15:0] = TX key [31:16]
+                        * key1 [31:16] = reserved
+                        * key2 [31:0] = RX key [63:32]
+                        * key3 [15:0] = TX key [15:0]
+                        * key3 [31:16] = reserved
+                        * key4 [31:0] = TX key [63:32]
+                        */
                        u32 mic0, mic1, mic2, mic3, mic4;
 
                        mic0 = get_unaligned_le32(k->kv_mic + 0);
@@ -2504,51 +2560,90 @@ bool ath9k_hw_set_keycache_entry(struct ath_hal *ah, u16 entry,
                        mic1 = get_unaligned_le16(k->kv_txmic + 2) & 0xffff;
                        mic3 = get_unaligned_le16(k->kv_txmic + 0) & 0xffff;
                        mic4 = get_unaligned_le32(k->kv_txmic + 4);
+
+                       /* Write RX[31:0] and TX[31:16] */
                        REG_WRITE(ah, AR_KEYTABLE_KEY0(micentry), mic0);
                        REG_WRITE(ah, AR_KEYTABLE_KEY1(micentry), mic1);
+
+                       /* Write RX[63:32] and TX[15:0] */
                        REG_WRITE(ah, AR_KEYTABLE_KEY2(micentry), mic2);
                        REG_WRITE(ah, AR_KEYTABLE_KEY3(micentry), mic3);
+
+                       /* Write TX[63:32] and keyType(reserved) */
                        REG_WRITE(ah, AR_KEYTABLE_KEY4(micentry), mic4);
                        REG_WRITE(ah, AR_KEYTABLE_TYPE(micentry),
                                  AR_KEYTABLE_TYPE_CLR);
 
                } else {
+                       /*
+                        * TKIP uses four key cache entries (two for group
+                        * keys):
+                        * Michael MIC TX/RX keys are in different key cache
+                        * entries (idx = main index + 64 for TX and
+                        * main index + 32 + 96 for RX):
+                        * key0 [31:0] = TX/RX MIC key [31:0]
+                        * key1 [31:0] = reserved
+                        * key2 [31:0] = TX/RX MIC key [63:32]
+                        * key3 [31:0] = reserved
+                        * key4 [31:0] = reserved
+                        *
+                        * Upper layer code will call this function separately
+                        * for TX and RX keys when these registers offsets are
+                        * used.
+                        */
                        u32 mic0, mic2;
 
                        mic0 = get_unaligned_le32(k->kv_mic + 0);
                        mic2 = get_unaligned_le32(k->kv_mic + 4);
+
+                       /* Write MIC key[31:0] */
                        REG_WRITE(ah, AR_KEYTABLE_KEY0(micentry), mic0);
                        REG_WRITE(ah, AR_KEYTABLE_KEY1(micentry), 0);
+
+                       /* Write MIC key[63:32] */
                        REG_WRITE(ah, AR_KEYTABLE_KEY2(micentry), mic2);
                        REG_WRITE(ah, AR_KEYTABLE_KEY3(micentry), 0);
+
+                       /* Write TX[63:32] and keyType(reserved) */
                        REG_WRITE(ah, AR_KEYTABLE_KEY4(micentry), 0);
                        REG_WRITE(ah, AR_KEYTABLE_TYPE(micentry),
                                  AR_KEYTABLE_TYPE_CLR);
                }
+
+               /* MAC address registers are reserved for the MIC entry */
                REG_WRITE(ah, AR_KEYTABLE_MAC0(micentry), 0);
                REG_WRITE(ah, AR_KEYTABLE_MAC1(micentry), 0);
+
+               /*
+                * Write the correct (un-inverted) key[47:0] last to enable
+                * TKIP now that all other registers are set with correct
+                * values.
+                */
                REG_WRITE(ah, AR_KEYTABLE_KEY0(entry), key0);
                REG_WRITE(ah, AR_KEYTABLE_KEY1(entry), key1);
        } else {
+               /* Write key[47:0] */
                REG_WRITE(ah, AR_KEYTABLE_KEY0(entry), key0);
                REG_WRITE(ah, AR_KEYTABLE_KEY1(entry), key1);
+
+               /* Write key[95:48] */
                REG_WRITE(ah, AR_KEYTABLE_KEY2(entry), key2);
                REG_WRITE(ah, AR_KEYTABLE_KEY3(entry), key3);
+
+               /* Write key[127:96] and key type */
                REG_WRITE(ah, AR_KEYTABLE_KEY4(entry), key4);
                REG_WRITE(ah, AR_KEYTABLE_TYPE(entry), keyType);
 
+               /* Write MAC address for the entry */
                (void) ath9k_hw_keysetmac(ah, entry, mac);
        }
 
-       if (ah->ah_curchan == NULL)
-               return true;
-
        return true;
 }
 
-bool ath9k_hw_keyisvalid(struct ath_hal *ah, u16 entry)
+bool ath9k_hw_keyisvalid(struct ath_hw *ah, u16 entry)
 {
-       if (entry < ah->ah_caps.keycache_size) {
+       if (entry < ah->caps.keycache_size) {
                u32 val = REG_READ(ah, AR_KEYTABLE_MAC1(entry));
                if (val & AR_KEYTABLE_VALID)
                        return true;
@@ -2560,7 +2655,7 @@ bool ath9k_hw_keyisvalid(struct ath_hal *ah, u16 entry)
 /* Power Management (Chipset) */
 /******************************/
 
-static void ath9k_set_power_sleep(struct ath_hal *ah, int setChip)
+static void ath9k_set_power_sleep(struct ath_hw *ah, int setChip)
 {
        REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV);
        if (setChip) {
@@ -2574,11 +2669,11 @@ static void ath9k_set_power_sleep(struct ath_hal *ah, int setChip)
        }
 }
 
-static void ath9k_set_power_network_sleep(struct ath_hal *ah, int setChip)
+static void ath9k_set_power_network_sleep(struct ath_hw *ah, int setChip)
 {
        REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV);
        if (setChip) {
-               struct ath9k_hw_capabilities *pCap = &ah->ah_caps;
+               struct ath9k_hw_capabilities *pCap = &ah->caps;
 
                if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) {
                        REG_WRITE(ah, AR_RTC_FORCE_WAKE,
@@ -2590,8 +2685,7 @@ static void ath9k_set_power_network_sleep(struct ath_hal *ah, int setChip)
        }
 }
 
-static bool ath9k_hw_set_power_awake(struct ath_hal *ah,
-                                    int setChip)
+static bool ath9k_hw_set_power_awake(struct ath_hw *ah, int setChip)
 {
        u32 val;
        int i;
@@ -2632,20 +2726,18 @@ static bool ath9k_hw_set_power_awake(struct ath_hal *ah,
        return true;
 }
 
-bool ath9k_hw_setpower(struct ath_hal *ah,
-                      enum ath9k_power_mode mode)
+bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
+       int status = true, setChip = true;
        static const char *modes[] = {
                "AWAKE",
                "FULL-SLEEP",
                "NETWORK SLEEP",
                "UNDEFINED"
        };
-       int status = true, setChip = true;
 
        DPRINTF(ah->ah_sc, ATH_DBG_POWER_MGMT, "%s -> %s (%s)\n",
-               modes[ah->ah_power_mode], modes[mode],
+               modes[ah->power_mode], modes[mode],
                setChip ? "set chip " : "");
 
        switch (mode) {
@@ -2654,7 +2746,7 @@ bool ath9k_hw_setpower(struct ath_hal *ah,
                break;
        case ATH9K_PM_FULL_SLEEP:
                ath9k_set_power_sleep(ah, setChip);
-               ahp->ah_chipFullSleep = true;
+               ah->chip_fullsleep = true;
                break;
        case ATH9K_PM_NETWORK_SLEEP:
                ath9k_set_power_network_sleep(ah, setChip);
@@ -2664,41 +2756,57 @@ bool ath9k_hw_setpower(struct ath_hal *ah,
                        "Unknown power mode %u\n", mode);
                return false;
        }
-       ah->ah_power_mode = mode;
+       ah->power_mode = mode;
 
        return status;
 }
 
-void ath9k_hw_configpcipowersave(struct ath_hal *ah, int restore)
+/*
+ * Helper for ASPM support.
+ *
+ * Disable PLL when in L0s as well as receiver clock when in L1.
+ * This power saving option must be enabled through the SerDes.
+ *
+ * Programming the SerDes must go through the same 288 bit serial shift
+ * register as the other analog registers.  Hence the 9 writes.
+ */
+void ath9k_hw_configpcipowersave(struct ath_hw *ah, int restore)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
        u8 i;
 
-       if (ah->ah_isPciExpress != true)
+       if (ah->is_pciexpress != true)
                return;
 
-       if (ah->ah_config.pcie_powersave_enable == 2)
+       /* Do not touch SerDes registers */
+       if (ah->config.pcie_powersave_enable == 2)
                return;
 
+       /* Nothing to do on restore for 11N */
        if (restore)
                return;
 
        if (AR_SREV_9280_20_OR_LATER(ah)) {
-               for (i = 0; i < ahp->ah_iniPcieSerdes.ia_rows; i++) {
-                       REG_WRITE(ah, INI_RA(&ahp->ah_iniPcieSerdes, i, 0),
-                                 INI_RA(&ahp->ah_iniPcieSerdes, i, 1));
+               /*
+                * AR9280 2.0 or later chips use SerDes values from the
+                * initvals.h initialized depending on chipset during
+                * ath9k_hw_do_attach()
+                */
+               for (i = 0; i < ah->iniPcieSerdes.ia_rows; i++) {
+                       REG_WRITE(ah, INI_RA(&ah->iniPcieSerdes, i, 0),
+                                 INI_RA(&ah->iniPcieSerdes, i, 1));
                }
-               udelay(1000);
        } else if (AR_SREV_9280(ah) &&
-                  (ah->ah_macRev == AR_SREV_REVISION_9280_10)) {
+                  (ah->hw_version.macRev == AR_SREV_REVISION_9280_10)) {
                REG_WRITE(ah, AR_PCIE_SERDES, 0x9248fd00);
                REG_WRITE(ah, AR_PCIE_SERDES, 0x24924924);
 
+               /* RX shut off when elecidle is asserted */
                REG_WRITE(ah, AR_PCIE_SERDES, 0xa8000019);
                REG_WRITE(ah, AR_PCIE_SERDES, 0x13160820);
                REG_WRITE(ah, AR_PCIE_SERDES, 0xe5980560);
 
-               if (ah->ah_config.pcie_clock_req)
+               /* Shut off CLKREQ active in L1 */
+               if (ah->config.pcie_clock_req)
                        REG_WRITE(ah, AR_PCIE_SERDES, 0x401deffc);
                else
                        REG_WRITE(ah, AR_PCIE_SERDES, 0x401deffd);
@@ -2707,42 +2815,59 @@ void ath9k_hw_configpcipowersave(struct ath_hal *ah, int restore)
                REG_WRITE(ah, AR_PCIE_SERDES, 0xbe105554);
                REG_WRITE(ah, AR_PCIE_SERDES, 0x00043007);
 
+               /* Load the new settings */
                REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000);
 
-               udelay(1000);
        } else {
                REG_WRITE(ah, AR_PCIE_SERDES, 0x9248fc00);
                REG_WRITE(ah, AR_PCIE_SERDES, 0x24924924);
+
+               /* RX shut off when elecidle is asserted */
                REG_WRITE(ah, AR_PCIE_SERDES, 0x28000039);
                REG_WRITE(ah, AR_PCIE_SERDES, 0x53160824);
                REG_WRITE(ah, AR_PCIE_SERDES, 0xe5980579);
+
+               /*
+                * Ignore ah->ah_config.pcie_clock_req setting for
+                * pre-AR9280 11n
+                */
                REG_WRITE(ah, AR_PCIE_SERDES, 0x001defff);
+
                REG_WRITE(ah, AR_PCIE_SERDES, 0x1aaabe40);
                REG_WRITE(ah, AR_PCIE_SERDES, 0xbe105554);
                REG_WRITE(ah, AR_PCIE_SERDES, 0x000e3007);
+
+               /* Load the new settings */
                REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000);
        }
 
+       udelay(1000);
+
+       /* set bit 19 to allow forcing of pcie core into L1 state */
        REG_SET_BIT(ah, AR_PCIE_PM_CTRL, AR_PCIE_PM_CTRL_ENA);
 
-       if (ah->ah_config.pcie_waen) {
-               REG_WRITE(ah, AR_WA, ah->ah_config.pcie_waen);
+       /* Several PCIe massages to ensure proper behaviour */
+       if (ah->config.pcie_waen) {
+               REG_WRITE(ah, AR_WA, ah->config.pcie_waen);
        } else {
                if (AR_SREV_9285(ah))
                        REG_WRITE(ah, AR_WA, AR9285_WA_DEFAULT);
+               /*
+                * On AR9280 chips bit 22 of 0x4004 needs to be set to
+                * otherwise card may disappear.
+                */
                else if (AR_SREV_9280(ah))
                        REG_WRITE(ah, AR_WA, AR9280_WA_DEFAULT);
                else
                        REG_WRITE(ah, AR_WA, AR_WA_DEFAULT);
        }
-
 }
 
 /**********************/
 /* Interrupt Handling */
 /**********************/
 
-bool ath9k_hw_intrpend(struct ath_hal *ah)
+bool ath9k_hw_intrpend(struct ath_hw *ah)
 {
        u32 host_isr;
 
@@ -2761,14 +2886,13 @@ bool ath9k_hw_intrpend(struct ath_hal *ah)
        return false;
 }
 
-bool ath9k_hw_getisr(struct ath_hal *ah, enum ath9k_int *masked)
+bool ath9k_hw_getisr(struct ath_hw *ah, enum ath9k_int *masked)
 {
        u32 isr = 0;
        u32 mask2 = 0;
-       struct ath9k_hw_capabilities *pCap = &ah->ah_caps;
+       struct ath9k_hw_capabilities *pCap = &ah->caps;
        u32 sync_cause = 0;
        bool fatal_int = false;
-       struct ath_hal_5416 *ahp = AH5416(ah);
 
        if (!AR_SREV_9100(ah)) {
                if (REG_READ(ah, AR_INTR_ASYNC_CAUSE) & AR_INTR_MAC_IRQ) {
@@ -2806,6 +2930,8 @@ bool ath9k_hw_getisr(struct ath_hal *ah, enum ath9k_int *masked)
                                mask2 |= ATH9K_INT_GTT;
                        if (isr2 & AR_ISR_S2_CST)
                                mask2 |= ATH9K_INT_CST;
+                       if (isr2 & AR_ISR_S2_TSFOOR)
+                               mask2 |= ATH9K_INT_TSFOOR;
                }
 
                isr = REG_READ(ah, AR_ISR_RAC);
@@ -2816,7 +2942,7 @@ bool ath9k_hw_getisr(struct ath_hal *ah, enum ath9k_int *masked)
 
                *masked = isr & ATH9K_INT_COMMON;
 
-               if (ahp->ah_intrMitigation) {
+               if (ah->intr_mitigation) {
                        if (isr & (AR_ISR_RXMINTR | AR_ISR_RXINTM))
                                *masked |= ATH9K_INT_RX;
                }
@@ -2831,12 +2957,12 @@ bool ath9k_hw_getisr(struct ath_hal *ah, enum ath9k_int *masked)
                        *masked |= ATH9K_INT_TX;
 
                        s0_s = REG_READ(ah, AR_ISR_S0_S);
-                       ahp->ah_intrTxqs |= MS(s0_s, AR_ISR_S0_QCU_TXOK);
-                       ahp->ah_intrTxqs |= MS(s0_s, AR_ISR_S0_QCU_TXDESC);
+                       ah->intr_txqs |= MS(s0_s, AR_ISR_S0_QCU_TXOK);
+                       ah->intr_txqs |= MS(s0_s, AR_ISR_S0_QCU_TXDESC);
 
                        s1_s = REG_READ(ah, AR_ISR_S1_S);
-                       ahp->ah_intrTxqs |= MS(s1_s, AR_ISR_S1_QCU_TXERR);
-                       ahp->ah_intrTxqs |= MS(s1_s, AR_ISR_S1_QCU_TXEOL);
+                       ah->intr_txqs |= MS(s1_s, AR_ISR_S1_QCU_TXERR);
+                       ah->intr_txqs |= MS(s1_s, AR_ISR_S1_QCU_TXEOL);
                }
 
                if (isr & AR_ISR_RXORN) {
@@ -2893,17 +3019,16 @@ bool ath9k_hw_getisr(struct ath_hal *ah, enum ath9k_int *masked)
        return true;
 }
 
-enum ath9k_int ath9k_hw_intrget(struct ath_hal *ah)
+enum ath9k_int ath9k_hw_intrget(struct ath_hw *ah)
 {
-       return AH5416(ah)->ah_maskReg;
+       return ah->mask_reg;
 }
 
-enum ath9k_int ath9k_hw_set_interrupts(struct ath_hal *ah, enum ath9k_int ints)
+enum ath9k_int ath9k_hw_set_interrupts(struct ath_hw *ah, enum ath9k_int ints)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
-       u32 omask = ahp->ah_maskReg;
+       u32 omask = ah->mask_reg;
        u32 mask, mask2;
-       struct ath9k_hw_capabilities *pCap = &ah->ah_caps;
+       struct ath9k_hw_capabilities *pCap = &ah->caps;
 
        DPRINTF(ah->ah_sc, ATH_DBG_INTERRUPT, "0x%x => 0x%x\n", omask, ints);
 
@@ -2924,18 +3049,18 @@ enum ath9k_int ath9k_hw_set_interrupts(struct ath_hal *ah, enum ath9k_int ints)
        mask2 = 0;
 
        if (ints & ATH9K_INT_TX) {
-               if (ahp->ah_txOkInterruptMask)
+               if (ah->txok_interrupt_mask)
                        mask |= AR_IMR_TXOK;
-               if (ahp->ah_txDescInterruptMask)
+               if (ah->txdesc_interrupt_mask)
                        mask |= AR_IMR_TXDESC;
-               if (ahp->ah_txErrInterruptMask)
+               if (ah->txerr_interrupt_mask)
                        mask |= AR_IMR_TXERR;
-               if (ahp->ah_txEolInterruptMask)
+               if (ah->txeol_interrupt_mask)
                        mask |= AR_IMR_TXEOL;
        }
        if (ints & ATH9K_INT_RX) {
                mask |= AR_IMR_RXERR;
-               if (ahp->ah_intrMitigation)
+               if (ah->intr_mitigation)
                        mask |= AR_IMR_RXMINTR | AR_IMR_RXINTM;
                else
                        mask |= AR_IMR_RXOK | AR_IMR_RXDESC;
@@ -2952,7 +3077,9 @@ enum ath9k_int ath9k_hw_set_interrupts(struct ath_hal *ah, enum ath9k_int ints)
                if (ints & ATH9K_INT_DTIMSYNC)
                        mask2 |= AR_IMR_S2_DTIMSYNC;
                if (ints & ATH9K_INT_CABEND)
-                       mask2 |= (AR_IMR_S2_CABEND);
+                       mask2 |= AR_IMR_S2_CABEND;
+               if (ints & ATH9K_INT_TSFOOR)
+                       mask2 |= AR_IMR_S2_TSFOOR;
        }
 
        if (ints & (ATH9K_INT_GTT | ATH9K_INT_CST)) {
@@ -2973,7 +3100,7 @@ enum ath9k_int ath9k_hw_set_interrupts(struct ath_hal *ah, enum ath9k_int ints)
                                           AR_IMR_S2_TSFOOR |
                                           AR_IMR_S2_GTT | AR_IMR_S2_CST);
        REG_WRITE(ah, AR_IMR_S2, mask | mask2);
-       ahp->ah_maskReg = ints;
+       ah->mask_reg = ints;
 
        if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) {
                if (ints & ATH9K_INT_TIM_TIMER)
@@ -3007,14 +3134,13 @@ enum ath9k_int ath9k_hw_set_interrupts(struct ath_hal *ah, enum ath9k_int ints)
 /* Beacon Handling */
 /*******************/
 
-void ath9k_hw_beaconinit(struct ath_hal *ah, u32 next_beacon, u32 beacon_period)
+void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
        int flags = 0;
 
-       ahp->ah_beaconInterval = beacon_period;
+       ah->beacon_interval = beacon_period;
 
-       switch (ah->ah_opmode) {
+       switch (ah->opmode) {
        case NL80211_IFTYPE_STATION:
        case NL80211_IFTYPE_MONITOR:
                REG_WRITE(ah, AR_NEXT_TBTT_TIMER, TU_TO_USEC(next_beacon));
@@ -3027,18 +3153,18 @@ void ath9k_hw_beaconinit(struct ath_hal *ah, u32 next_beacon, u32 beacon_period)
                            AR_TXCFG_ADHOC_BEACON_ATIM_TX_POLICY);
                REG_WRITE(ah, AR_NEXT_NDP_TIMER,
                          TU_TO_USEC(next_beacon +
-                                    (ahp->ah_atimWindow ? ahp->
-                                     ah_atimWindow : 1)));
+                                    (ah->atim_window ? ah->
+                                     atim_window : 1)));
                flags |= AR_NDP_TIMER_EN;
        case NL80211_IFTYPE_AP:
                REG_WRITE(ah, AR_NEXT_TBTT_TIMER, TU_TO_USEC(next_beacon));
                REG_WRITE(ah, AR_NEXT_DMA_BEACON_ALERT,
                          TU_TO_USEC(next_beacon -
-                                    ah->ah_config.
+                                    ah->config.
                                     dma_beacon_response_time));
                REG_WRITE(ah, AR_NEXT_SWBA,
                          TU_TO_USEC(next_beacon -
-                                    ah->ah_config.
+                                    ah->config.
                                     sw_beacon_response_time));
                flags |=
                        AR_TBTT_TIMER_EN | AR_DBA_TIMER_EN | AR_SWBA_TIMER_EN;
@@ -3046,7 +3172,7 @@ void ath9k_hw_beaconinit(struct ath_hal *ah, u32 next_beacon, u32 beacon_period)
        default:
                DPRINTF(ah->ah_sc, ATH_DBG_BEACON,
                        "%s: unsupported opmode: %d\n",
-                       __func__, ah->ah_opmode);
+                       __func__, ah->opmode);
                return;
                break;
        }
@@ -3065,11 +3191,11 @@ void ath9k_hw_beaconinit(struct ath_hal *ah, u32 next_beacon, u32 beacon_period)
        REG_SET_BIT(ah, AR_TIMER_MODE, flags);
 }
 
-void ath9k_hw_set_sta_beacon_timers(struct ath_hal *ah,
+void ath9k_hw_set_sta_beacon_timers(struct ath_hw *ah,
                                    const struct ath9k_beacon_state *bs)
 {
        u32 nextTbtt, beaconintval, dtimperiod, beacontimeout;
-       struct ath9k_hw_capabilities *pCap = &ah->ah_caps;
+       struct ath9k_hw_capabilities *pCap = &ah->caps;
 
        REG_WRITE(ah, AR_NEXT_TBTT_TIMER, TU_TO_USEC(bs->bs_nexttbtt));
 
@@ -3123,43 +3249,46 @@ void ath9k_hw_set_sta_beacon_timers(struct ath_hal *ah,
                    AR_TBTT_TIMER_EN | AR_TIM_TIMER_EN |
                    AR_DTIM_TIMER_EN);
 
+       /* TSF Out of Range Threshold */
+       REG_WRITE(ah, AR_TSFOOR_THRESHOLD, bs->bs_tsfoor_threshold);
 }
 
 /*******************/
 /* HW Capabilities */
 /*******************/
 
-bool ath9k_hw_fill_cap_info(struct ath_hal *ah)
+bool ath9k_hw_fill_cap_info(struct ath_hw *ah)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
-       struct ath9k_hw_capabilities *pCap = &ah->ah_caps;
+       struct ath9k_hw_capabilities *pCap = &ah->caps;
        u16 capField = 0, eeval;
 
-       eeval = ath9k_hw_get_eeprom(ah, EEP_REG_0);
+       eeval = ah->eep_ops->get_eeprom(ah, EEP_REG_0);
+       ah->regulatory.current_rd = eeval;
 
-       ah->ah_currentRD = eeval;
-
-       eeval = ath9k_hw_get_eeprom(ah, EEP_REG_1);
-       ah->ah_currentRDExt = eeval;
-
-       capField = ath9k_hw_get_eeprom(ah, EEP_OP_CAP);
-
-       if (ah->ah_opmode != NL80211_IFTYPE_AP &&
-           ah->ah_subvendorid == AR_SUBVENDOR_ID_NEW_A) {
-               if (ah->ah_currentRD == 0x64 || ah->ah_currentRD == 0x65)
-                       ah->ah_currentRD += 5;
-               else if (ah->ah_currentRD == 0x41)
-                       ah->ah_currentRD = 0x43;
+       eeval = ah->eep_ops->get_eeprom(ah, EEP_REG_1);
+       if (AR_SREV_9285_10_OR_LATER(ah))
+               eeval |= AR9285_RDEXT_DEFAULT;
+       ah->regulatory.current_rd_ext = eeval;
+
+       capField = ah->eep_ops->get_eeprom(ah, EEP_OP_CAP);
+
+       if (ah->opmode != NL80211_IFTYPE_AP &&
+           ah->hw_version.subvendorid == AR_SUBVENDOR_ID_NEW_A) {
+               if (ah->regulatory.current_rd == 0x64 ||
+                   ah->regulatory.current_rd == 0x65)
+                       ah->regulatory.current_rd += 5;
+               else if (ah->regulatory.current_rd == 0x41)
+                       ah->regulatory.current_rd = 0x43;
                DPRINTF(ah->ah_sc, ATH_DBG_REGULATORY,
-                       "regdomain mapped to 0x%x\n", ah->ah_currentRD);
+                       "regdomain mapped to 0x%x\n", ah->regulatory.current_rd);
        }
 
-       eeval = ath9k_hw_get_eeprom(ah, EEP_OP_MODE);
+       eeval = ah->eep_ops->get_eeprom(ah, EEP_OP_MODE);
        bitmap_zero(pCap->wireless_modes, ATH9K_MODE_MAX);
 
        if (eeval & AR5416_OPFLAGS_11A) {
                set_bit(ATH9K_MODE_11A, pCap->wireless_modes);
-               if (ah->ah_config.ht_enable) {
+               if (ah->config.ht_enable) {
                        if (!(eeval & AR5416_OPFLAGS_N_5G_HT20))
                                set_bit(ATH9K_MODE_11NA_HT20,
                                        pCap->wireless_modes);
@@ -3175,7 +3304,7 @@ bool ath9k_hw_fill_cap_info(struct ath_hal *ah)
        if (eeval & AR5416_OPFLAGS_11G) {
                set_bit(ATH9K_MODE_11B, pCap->wireless_modes);
                set_bit(ATH9K_MODE_11G, pCap->wireless_modes);
-               if (ah->ah_config.ht_enable) {
+               if (ah->config.ht_enable) {
                        if (!(eeval & AR5416_OPFLAGS_N_2G_HT20))
                                set_bit(ATH9K_MODE_11NG_HT20,
                                        pCap->wireless_modes);
@@ -3188,18 +3317,15 @@ bool ath9k_hw_fill_cap_info(struct ath_hal *ah)
                }
        }
 
-       pCap->tx_chainmask = ath9k_hw_get_eeprom(ah, EEP_TX_MASK);
-       if ((ah->ah_isPciExpress)
-           || (eeval & AR5416_OPFLAGS_11A)) {
-               pCap->rx_chainmask =
-                       ath9k_hw_get_eeprom(ah, EEP_RX_MASK);
-       } else {
-               pCap->rx_chainmask =
-                       (ath9k_hw_gpio_get(ah, 0)) ? 0x5 : 0x7;
-       }
+       pCap->tx_chainmask = ah->eep_ops->get_eeprom(ah, EEP_TX_MASK);
+       if ((ah->hw_version.devid == AR5416_DEVID_PCI) &&
+           !(eeval & AR5416_OPFLAGS_11A))
+               pCap->rx_chainmask = ath9k_hw_gpio_get(ah, 0) ? 0x5 : 0x7;
+       else
+               pCap->rx_chainmask = ah->eep_ops->get_eeprom(ah, EEP_RX_MASK);
 
-       if (!(AR_SREV_9280(ah) && (ah->ah_macRev == 0)))
-               ahp->ah_miscMode |= AR_PCU_MIC_NEW_LOC_ENA;
+       if (!(AR_SREV_9280(ah) && (ah->hw_version.macRev == 0)))
+               ah->misc_mode |= AR_PCU_MIC_NEW_LOC_ENA;
 
        pCap->low_2ghz_chan = 2312;
        pCap->high_2ghz_chan = 2732;
@@ -3217,7 +3343,7 @@ bool ath9k_hw_fill_cap_info(struct ath_hal *ah)
 
        pCap->hw_caps |= ATH9K_HW_CAP_CHAN_SPREAD;
 
-       if (ah->ah_config.ht_enable)
+       if (ah->config.ht_enable)
                pCap->hw_caps |= ATH9K_HW_CAP_HT;
        else
                pCap->hw_caps &= ~ATH9K_HW_CAP_HT;
@@ -3268,22 +3394,22 @@ bool ath9k_hw_fill_cap_info(struct ath_hal *ah)
        pCap->hw_caps |= ATH9K_HW_CAP_ENHANCEDPM;
 
 #if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
-       ah->ah_rfsilent = ath9k_hw_get_eeprom(ah, EEP_RF_SILENT);
-       if (ah->ah_rfsilent & EEP_RFSILENT_ENABLED) {
-               ah->ah_rfkill_gpio =
-                       MS(ah->ah_rfsilent, EEP_RFSILENT_GPIO_SEL);
-               ah->ah_rfkill_polarity =
-                       MS(ah->ah_rfsilent, EEP_RFSILENT_POLARITY);
+       ah->rfsilent = ah->eep_ops->get_eeprom(ah, EEP_RF_SILENT);
+       if (ah->rfsilent & EEP_RFSILENT_ENABLED) {
+               ah->rfkill_gpio =
+                       MS(ah->rfsilent, EEP_RFSILENT_GPIO_SEL);
+               ah->rfkill_polarity =
+                       MS(ah->rfsilent, EEP_RFSILENT_POLARITY);
 
                pCap->hw_caps |= ATH9K_HW_CAP_RFSILENT;
        }
 #endif
 
-       if ((ah->ah_macVersion == AR_SREV_VERSION_5416_PCI) ||
-           (ah->ah_macVersion == AR_SREV_VERSION_5416_PCIE) ||
-           (ah->ah_macVersion == AR_SREV_VERSION_9160) ||
-           (ah->ah_macVersion == AR_SREV_VERSION_9100) ||
-           (ah->ah_macVersion == AR_SREV_VERSION_9280))
+       if ((ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCI) ||
+           (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCIE) ||
+           (ah->hw_version.macVersion == AR_SREV_VERSION_9160) ||
+           (ah->hw_version.macVersion == AR_SREV_VERSION_9100) ||
+           (ah->hw_version.macVersion == AR_SREV_VERSION_9280))
                pCap->hw_caps &= ~ATH9K_HW_CAP_AUTOSLEEP;
        else
                pCap->hw_caps |= ATH9K_HW_CAP_AUTOSLEEP;
@@ -3293,7 +3419,7 @@ bool ath9k_hw_fill_cap_info(struct ath_hal *ah)
        else
                pCap->hw_caps |= ATH9K_HW_CAP_4KB_SPLITTRANS;
 
-       if (ah->ah_currentRDExt & (1 << REG_EXT_JAPAN_MIDBAND)) {
+       if (ah->regulatory.current_rd_ext & (1 << REG_EXT_JAPAN_MIDBAND)) {
                pCap->reg_cap =
                        AR_EEPROM_EEREGCAP_EN_KK_NEW_11A |
                        AR_EEPROM_EEREGCAP_EN_KK_U1_EVEN |
@@ -3308,25 +3434,22 @@ bool ath9k_hw_fill_cap_info(struct ath_hal *ah)
        pCap->reg_cap |= AR_EEPROM_EEREGCAP_EN_FCC_MIDBAND;
 
        pCap->num_antcfg_5ghz =
-               ath9k_hw_get_num_ant_config(ah, ATH9K_HAL_FREQ_BAND_5GHZ);
+               ah->eep_ops->get_num_ant_config(ah, ATH9K_HAL_FREQ_BAND_5GHZ);
        pCap->num_antcfg_2ghz =
-               ath9k_hw_get_num_ant_config(ah, ATH9K_HAL_FREQ_BAND_2GHZ);
+               ah->eep_ops->get_num_ant_config(ah, ATH9K_HAL_FREQ_BAND_2GHZ);
 
        if (AR_SREV_9280_10_OR_LATER(ah) && btcoex_enable) {
                pCap->hw_caps |= ATH9K_HW_CAP_BT_COEX;
-               ah->ah_btactive_gpio = 6;
-               ah->ah_wlanactive_gpio = 5;
+               ah->btactive_gpio = 6;
+               ah->wlanactive_gpio = 5;
        }
 
        return true;
 }
 
-bool ath9k_hw_getcapability(struct ath_hal *ah, enum ath9k_capability_type type,
+bool ath9k_hw_getcapability(struct ath_hw *ah, enum ath9k_capability_type type,
                            u32 capability, u32 *result)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
-       const struct ath9k_hw_capabilities *pCap = &ah->ah_caps;
-
        switch (type) {
        case ATH9K_CAP_CIPHER:
                switch (capability) {
@@ -3345,23 +3468,17 @@ bool ath9k_hw_getcapability(struct ath_hal *ah, enum ath9k_capability_type type,
                case 0:
                        return true;
                case 1:
-                       return (ahp->ah_staId1Defaults &
+                       return (ah->sta_id1_defaults &
                                AR_STA_ID1_CRPT_MIC_ENABLE) ? true :
                        false;
                }
        case ATH9K_CAP_TKIP_SPLIT:
-               return (ahp->ah_miscMode & AR_PCU_MIC_NEW_LOC_ENA) ?
+               return (ah->misc_mode & AR_PCU_MIC_NEW_LOC_ENA) ?
                        false : true;
-       case ATH9K_CAP_WME_TKIPMIC:
-               return 0;
-       case ATH9K_CAP_PHYCOUNTERS:
-               return ahp->ah_hasHwPhyCounters ? 0 : -ENXIO;
        case ATH9K_CAP_DIVERSITY:
                return (REG_READ(ah, AR_PHY_CCK_DETECT) &
                        AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV) ?
                        true : false;
-       case ATH9K_CAP_PHYDIAG:
-               return true;
        case ATH9K_CAP_MCAST_KEYSRCH:
                switch (capability) {
                case 0:
@@ -3370,57 +3487,48 @@ bool ath9k_hw_getcapability(struct ath_hal *ah, enum ath9k_capability_type type,
                        if (REG_READ(ah, AR_STA_ID1) & AR_STA_ID1_ADHOC) {
                                return false;
                        } else {
-                               return (ahp->ah_staId1Defaults &
+                               return (ah->sta_id1_defaults &
                                        AR_STA_ID1_MCAST_KSRCH) ? true :
                                        false;
                        }
                }
                return false;
-       case ATH9K_CAP_TSF_ADJUST:
-               return (ahp->ah_miscMode & AR_PCU_TX_ADD_TSF) ?
-                       true : false;
-       case ATH9K_CAP_RFSILENT:
-               if (capability == 3)
-                       return false;
-       case ATH9K_CAP_ANT_CFG_2GHZ:
-               *result = pCap->num_antcfg_2ghz;
-               return true;
-       case ATH9K_CAP_ANT_CFG_5GHZ:
-               *result = pCap->num_antcfg_5ghz;
-               return true;
        case ATH9K_CAP_TXPOW:
                switch (capability) {
                case 0:
                        return 0;
                case 1:
-                       *result = ah->ah_powerLimit;
+                       *result = ah->regulatory.power_limit;
                        return 0;
                case 2:
-                       *result = ah->ah_maxPowerLevel;
+                       *result = ah->regulatory.max_power_level;
                        return 0;
                case 3:
-                       *result = ah->ah_tpScale;
+                       *result = ah->regulatory.tp_scale;
                        return 0;
                }
                return false;
+       case ATH9K_CAP_DS:
+               return (AR_SREV_9280_20_OR_LATER(ah) &&
+                       (ah->eep_ops->get_eeprom(ah, EEP_RC_CHAIN_MASK) == 1))
+                       ? false : true;
        default:
                return false;
        }
 }
 
-bool ath9k_hw_setcapability(struct ath_hal *ah, enum ath9k_capability_type type,
+bool ath9k_hw_setcapability(struct ath_hw *ah, enum ath9k_capability_type type,
                            u32 capability, u32 setting, int *status)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
        u32 v;
 
        switch (type) {
        case ATH9K_CAP_TKIP_MIC:
                if (setting)
-                       ahp->ah_staId1Defaults |=
+                       ah->sta_id1_defaults |=
                                AR_STA_ID1_CRPT_MIC_ENABLE;
                else
-                       ahp->ah_staId1Defaults &=
+                       ah->sta_id1_defaults &=
                                ~AR_STA_ID1_CRPT_MIC_ENABLE;
                return true;
        case ATH9K_CAP_DIVERSITY:
@@ -3433,15 +3541,9 @@ bool ath9k_hw_setcapability(struct ath_hal *ah, enum ath9k_capability_type type,
                return true;
        case ATH9K_CAP_MCAST_KEYSRCH:
                if (setting)
-                       ahp->ah_staId1Defaults |= AR_STA_ID1_MCAST_KSRCH;
-               else
-                       ahp->ah_staId1Defaults &= ~AR_STA_ID1_MCAST_KSRCH;
-               return true;
-       case ATH9K_CAP_TSF_ADJUST:
-               if (setting)
-                       ahp->ah_miscMode |= AR_PCU_TX_ADD_TSF;
+                       ah->sta_id1_defaults |= AR_STA_ID1_MCAST_KSRCH;
                else
-                       ahp->ah_miscMode &= ~AR_PCU_TX_ADD_TSF;
+                       ah->sta_id1_defaults &= ~AR_STA_ID1_MCAST_KSRCH;
                return true;
        default:
                return false;
@@ -3452,7 +3554,7 @@ bool ath9k_hw_setcapability(struct ath_hal *ah, enum ath9k_capability_type type,
 /* GPIO / RFKILL / Antennae */
 /****************************/
 
-static void ath9k_hw_gpio_cfg_output_mux(struct ath_hal *ah,
+static void ath9k_hw_gpio_cfg_output_mux(struct ath_hw *ah,
                                         u32 gpio, u32 type)
 {
        int addr;
@@ -3480,11 +3582,11 @@ static void ath9k_hw_gpio_cfg_output_mux(struct ath_hal *ah,
        }
 }
 
-void ath9k_hw_cfg_gpio_input(struct ath_hal *ah, u32 gpio)
+void ath9k_hw_cfg_gpio_input(struct ath_hw *ah, u32 gpio)
 {
        u32 gpio_shift;
 
-       ASSERT(gpio < ah->ah_caps.num_gpio_pins);
+       ASSERT(gpio < ah->caps.num_gpio_pins);
 
        gpio_shift = gpio << 1;
 
@@ -3494,12 +3596,12 @@ void ath9k_hw_cfg_gpio_input(struct ath_hal *ah, u32 gpio)
                (AR_GPIO_OE_OUT_DRV << gpio_shift));
 }
 
-u32 ath9k_hw_gpio_get(struct ath_hal *ah, u32 gpio)
+u32 ath9k_hw_gpio_get(struct ath_hw *ah, u32 gpio)
 {
 #define MS_REG_READ(x, y) \
        (MS(REG_READ(ah, AR_GPIO_IN_OUT), x##_GPIO_IN_VAL) & (AR_GPIO_BIT(y)))
 
-       if (gpio >= ah->ah_caps.num_gpio_pins)
+       if (gpio >= ah->caps.num_gpio_pins)
                return 0xffffffff;
 
        if (AR_SREV_9285_10_OR_LATER(ah))
@@ -3510,7 +3612,7 @@ u32 ath9k_hw_gpio_get(struct ath_hal *ah, u32 gpio)
                return MS_REG_READ(AR, gpio) != 0;
 }
 
-void ath9k_hw_cfg_output(struct ath_hal *ah, u32 gpio,
+void ath9k_hw_cfg_output(struct ath_hw *ah, u32 gpio,
                         u32 ah_signal_type)
 {
        u32 gpio_shift;
@@ -3525,14 +3627,14 @@ void ath9k_hw_cfg_output(struct ath_hal *ah, u32 gpio,
                (AR_GPIO_OE_OUT_DRV << gpio_shift));
 }
 
-void ath9k_hw_set_gpio(struct ath_hal *ah, u32 gpio, u32 val)
+void ath9k_hw_set_gpio(struct ath_hw *ah, u32 gpio, u32 val)
 {
        REG_RMW(ah, AR_GPIO_IN_OUT, ((val & 1) << gpio),
                AR_GPIO_BIT(gpio));
 }
 
 #if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
-void ath9k_enable_rfkill(struct ath_hal *ah)
+void ath9k_enable_rfkill(struct ath_hw *ah)
 {
        REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL,
                    AR_GPIO_INPUT_EN_VAL_RFSILENT_BB);
@@ -3540,29 +3642,28 @@ void ath9k_enable_rfkill(struct ath_hal *ah)
        REG_CLR_BIT(ah, AR_GPIO_INPUT_MUX2,
                    AR_GPIO_INPUT_MUX2_RFSILENT);
 
-       ath9k_hw_cfg_gpio_input(ah, ah->ah_rfkill_gpio);
+       ath9k_hw_cfg_gpio_input(ah, ah->rfkill_gpio);
        REG_SET_BIT(ah, AR_PHY_TEST, RFSILENT_BB);
 }
 #endif
 
-u32 ath9k_hw_getdefantenna(struct ath_hal *ah)
+u32 ath9k_hw_getdefantenna(struct ath_hw *ah)
 {
        return REG_READ(ah, AR_DEF_ANTENNA) & 0x7;
 }
 
-void ath9k_hw_setantenna(struct ath_hal *ah, u32 antenna)
+void ath9k_hw_setantenna(struct ath_hw *ah, u32 antenna)
 {
        REG_WRITE(ah, AR_DEF_ANTENNA, (antenna & 0x7));
 }
 
-bool ath9k_hw_setantennaswitch(struct ath_hal *ah,
+bool ath9k_hw_setantennaswitch(struct ath_hw *ah,
                               enum ath9k_ant_setting settings,
                               struct ath9k_channel *chan,
                               u8 *tx_chainmask,
                               u8 *rx_chainmask,
                               u8 *antenna_cfgd)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
        static u8 tx_chainmask_cfg, rx_chainmask_cfg;
 
        if (AR_SREV_9280(ah)) {
@@ -3579,7 +3680,7 @@ bool ath9k_hw_setantennaswitch(struct ath_hal *ah,
                        *antenna_cfgd = true;
                        break;
                case ATH9K_ANT_FIXED_B:
-                       if (ah->ah_caps.tx_chainmask >
+                       if (ah->caps.tx_chainmask >
                            ATH9K_ANTENNA1_CHAINMASK) {
                                *tx_chainmask = ATH9K_ANTENNA1_CHAINMASK;
                        }
@@ -3595,7 +3696,7 @@ bool ath9k_hw_setantennaswitch(struct ath_hal *ah,
                        break;
                }
        } else {
-               ahp->ah_diversityControl = settings;
+               ah->diversity_control = settings;
        }
 
        return true;
@@ -3605,7 +3706,7 @@ bool ath9k_hw_setantennaswitch(struct ath_hal *ah,
 /* General Operation */
 /*********************/
 
-u32 ath9k_hw_getrxfilter(struct ath_hal *ah)
+u32 ath9k_hw_getrxfilter(struct ath_hw *ah)
 {
        u32 bits = REG_READ(ah, AR_RX_FILTER);
        u32 phybits = REG_READ(ah, AR_PHY_ERR);
@@ -3618,7 +3719,7 @@ u32 ath9k_hw_getrxfilter(struct ath_hal *ah)
        return bits;
 }
 
-void ath9k_hw_setrxfilter(struct ath_hal *ah, u32 bits)
+void ath9k_hw_setrxfilter(struct ath_hw *ah, u32 bits)
 {
        u32 phybits;
 
@@ -3638,12 +3739,12 @@ void ath9k_hw_setrxfilter(struct ath_hal *ah, u32 bits)
                          REG_READ(ah, AR_RXCFG) & ~AR_RXCFG_ZLFDMA);
 }
 
-bool ath9k_hw_phy_disable(struct ath_hal *ah)
+bool ath9k_hw_phy_disable(struct ath_hw *ah)
 {
        return ath9k_hw_set_reset_reg(ah, ATH9K_RESET_WARM);
 }
 
-bool ath9k_hw_disable(struct ath_hal *ah)
+bool ath9k_hw_disable(struct ath_hw *ah)
 {
        if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE))
                return false;
@@ -3651,83 +3752,54 @@ bool ath9k_hw_disable(struct ath_hal *ah)
        return ath9k_hw_set_reset_reg(ah, ATH9K_RESET_COLD);
 }
 
-bool ath9k_hw_set_txpowerlimit(struct ath_hal *ah, u32 limit)
+bool ath9k_hw_set_txpowerlimit(struct ath_hw *ah, u32 limit)
 {
-       struct ath9k_channel *chan = ah->ah_curchan;
+       struct ath9k_channel *chan = ah->curchan;
        struct ieee80211_channel *channel = chan->chan;
 
-       ah->ah_powerLimit = min(limit, (u32) MAX_RATE_POWER);
+       ah->regulatory.power_limit = min(limit, (u32) MAX_RATE_POWER);
 
-       if (ath9k_hw_set_txpower(ah, chan,
-                                ath9k_regd_get_ctl(ah, chan),
-                                channel->max_antenna_gain * 2,
-                                channel->max_power * 2,
-                                min((u32) MAX_RATE_POWER,
-                                    (u32) ah->ah_powerLimit)) != 0)
+       if (ah->eep_ops->set_txpower(ah, chan,
+                            ath9k_regd_get_ctl(ah, chan),
+                            channel->max_antenna_gain * 2,
+                            channel->max_power * 2,
+                            min((u32) MAX_RATE_POWER,
+                                (u32) ah->regulatory.power_limit)) != 0)
                return false;
 
        return true;
 }
 
-void ath9k_hw_getmac(struct ath_hal *ah, u8 *mac)
-{
-       struct ath_hal_5416 *ahp = AH5416(ah);
-
-       memcpy(mac, ahp->ah_macaddr, ETH_ALEN);
-}
-
-bool ath9k_hw_setmac(struct ath_hal *ah, const u8 *mac)
+void ath9k_hw_setmac(struct ath_hw *ah, const u8 *mac)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
-
-       memcpy(ahp->ah_macaddr, mac, ETH_ALEN);
-
-       return true;
+       memcpy(ah->macaddr, mac, ETH_ALEN);
 }
 
-void ath9k_hw_setopmode(struct ath_hal *ah)
+void ath9k_hw_setopmode(struct ath_hw *ah)
 {
-       ath9k_hw_set_operating_mode(ah, ah->ah_opmode);
+       ath9k_hw_set_operating_mode(ah, ah->opmode);
 }
 
-void ath9k_hw_setmcastfilter(struct ath_hal *ah, u32 filter0, u32 filter1)
+void ath9k_hw_setmcastfilter(struct ath_hw *ah, u32 filter0, u32 filter1)
 {
        REG_WRITE(ah, AR_MCAST_FIL0, filter0);
        REG_WRITE(ah, AR_MCAST_FIL1, filter1);
 }
 
-void ath9k_hw_getbssidmask(struct ath_hal *ah, u8 *mask)
+void ath9k_hw_setbssidmask(struct ath_softc *sc)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
-
-       memcpy(mask, ahp->ah_bssidmask, ETH_ALEN);
+       REG_WRITE(sc->sc_ah, AR_BSSMSKL, get_unaligned_le32(sc->bssidmask));
+       REG_WRITE(sc->sc_ah, AR_BSSMSKU, get_unaligned_le16(sc->bssidmask + 4));
 }
 
-bool ath9k_hw_setbssidmask(struct ath_hal *ah, const u8 *mask)
+void ath9k_hw_write_associd(struct ath_softc *sc)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
-
-       memcpy(ahp->ah_bssidmask, mask, ETH_ALEN);
-
-       REG_WRITE(ah, AR_BSSMSKL, get_unaligned_le32(ahp->ah_bssidmask));
-       REG_WRITE(ah, AR_BSSMSKU, get_unaligned_le16(ahp->ah_bssidmask + 4));
-
-       return true;
+       REG_WRITE(sc->sc_ah, AR_BSS_ID0, get_unaligned_le32(sc->curbssid));
+       REG_WRITE(sc->sc_ah, AR_BSS_ID1, get_unaligned_le16(sc->curbssid + 4) |
+                 ((sc->curaid & 0x3fff) << AR_BSS_ID1_AID_S));
 }
 
-void ath9k_hw_write_associd(struct ath_hal *ah, const u8 *bssid, u16 assocId)
-{
-       struct ath_hal_5416 *ahp = AH5416(ah);
-
-       memcpy(ahp->ah_bssid, bssid, ETH_ALEN);
-       ahp->ah_assocId = assocId;
-
-       REG_WRITE(ah, AR_BSS_ID0, get_unaligned_le32(ahp->ah_bssid));
-       REG_WRITE(ah, AR_BSS_ID1, get_unaligned_le16(ahp->ah_bssid + 4) |
-                 ((assocId & 0x3fff) << AR_BSS_ID1_AID_S));
-}
-
-u64 ath9k_hw_gettsf64(struct ath_hal *ah)
+u64 ath9k_hw_gettsf64(struct ath_hw *ah)
 {
        u64 tsf;
 
@@ -3737,14 +3809,13 @@ u64 ath9k_hw_gettsf64(struct ath_hal *ah)
        return tsf;
 }
 
-void ath9k_hw_settsf64(struct ath_hal *ah, u64 tsf64)
+void ath9k_hw_settsf64(struct ath_hw *ah, u64 tsf64)
 {
-       REG_WRITE(ah, AR_TSF_L32, 0x00000000);
-       REG_WRITE(ah, AR_TSF_U32, (tsf64 >> 32) & 0xffffffff);
        REG_WRITE(ah, AR_TSF_L32, tsf64 & 0xffffffff);
+       REG_WRITE(ah, AR_TSF_U32, (tsf64 >> 32) & 0xffffffff);
 }
 
-void ath9k_hw_reset_tsf(struct ath_hal *ah)
+void ath9k_hw_reset_tsf(struct ath_hw *ah)
 {
        int count;
 
@@ -3761,39 +3832,35 @@ void ath9k_hw_reset_tsf(struct ath_hal *ah)
        REG_WRITE(ah, AR_RESET_TSF, AR_RESET_TSF_ONCE);
 }
 
-bool ath9k_hw_set_tsfadjust(struct ath_hal *ah, u32 setting)
+bool ath9k_hw_set_tsfadjust(struct ath_hw *ah, u32 setting)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
-
        if (setting)
-               ahp->ah_miscMode |= AR_PCU_TX_ADD_TSF;
+               ah->misc_mode |= AR_PCU_TX_ADD_TSF;
        else
-               ahp->ah_miscMode &= ~AR_PCU_TX_ADD_TSF;
+               ah->misc_mode &= ~AR_PCU_TX_ADD_TSF;
 
        return true;
 }
 
-bool ath9k_hw_setslottime(struct ath_hal *ah, u32 us)
+bool ath9k_hw_setslottime(struct ath_hw *ah, u32 us)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
-
        if (us < ATH9K_SLOT_TIME_9 || us > ath9k_hw_mac_to_usec(ah, 0xffff)) {
                DPRINTF(ah->ah_sc, ATH_DBG_RESET, "bad slot time %u\n", us);
-               ahp->ah_slottime = (u32) -1;
+               ah->slottime = (u32) -1;
                return false;
        } else {
                REG_WRITE(ah, AR_D_GBL_IFS_SLOT, ath9k_hw_mac_to_clks(ah, us));
-               ahp->ah_slottime = us;
+               ah->slottime = us;
                return true;
        }
 }
 
-void ath9k_hw_set11nmac2040(struct ath_hal *ah, enum ath9k_ht_macmode mode)
+void ath9k_hw_set11nmac2040(struct ath_hw *ah, enum ath9k_ht_macmode mode)
 {
        u32 macmode;
 
        if (mode == ATH9K_HT_MACMODE_2040 &&
-           !ah->ah_config.cwm_ignore_extcca)
+           !ah->config.cwm_ignore_extcca)
                macmode = AR_2040_JOINED_RX_CLEAR;
        else
                macmode = 0;
@@ -3805,7 +3872,7 @@ void ath9k_hw_set11nmac2040(struct ath_hal *ah, enum ath9k_ht_macmode mode)
 /*  Bluetooth Coexistence  */
 /***************************/
 
-void ath9k_hw_btcoex_enable(struct ath_hal *ah)
+void ath9k_hw_btcoex_enable(struct ath_hw *ah)
 {
        /* connect bt_active to baseband */
        REG_CLR_BIT(ah, AR_GPIO_INPUT_EN_VAL,
@@ -3818,12 +3885,12 @@ void ath9k_hw_btcoex_enable(struct ath_hal *ah)
        /* Set input mux for bt_active to gpio pin */
        REG_RMW_FIELD(ah, AR_GPIO_INPUT_MUX1,
                        AR_GPIO_INPUT_MUX1_BT_ACTIVE,
-                       ah->ah_btactive_gpio);
+                       ah->btactive_gpio);
 
        /* Configure the desired gpio port for input */
-       ath9k_hw_cfg_gpio_input(ah, ah->ah_btactive_gpio);
+       ath9k_hw_cfg_gpio_input(ah, ah->btactive_gpio);
 
        /* Configure the desired GPIO port for TX_FRAME output */
-       ath9k_hw_cfg_output(ah, ah->ah_wlanactive_gpio,
+       ath9k_hw_cfg_output(ah, ah->wlanactive_gpio,
                            AR_GPIO_OUTPUT_MUX_AS_TX_FRAME);
 }