struct ath_common {
        u16 cachelsz;
+       u16 curaid;
+       u8 macaddr[ETH_ALEN];
+       u8 curbssid[ETH_ALEN];
+       u8 bssidmask[ETH_ALEN];
        struct ath_regulatory regulatory;
 };
 
 
        spinlock_t sc_pm_lock;
        struct mutex mutex;
 
-       u8 curbssid[ETH_ALEN];
-       u8 bssidmask[ETH_ALEN];
        u32 intrstatus;
        u32 sc_flags; /* SC_OP_* */
        u16 curtxpow;
-       u16 curaid;
        u8 nbcnvifs;
        u16 nvifs;
        u8 tx_chainmask;
 
 
 static int ath9k_hw_init_macaddr(struct ath_hw *ah)
 {
+       struct ath_common *common = ath9k_hw_common(ah);
        u32 sum;
        int i;
        u16 eeval;
        for (i = 0; i < 3; i++) {
                eeval = ah->eep_ops->get_eeprom(ah, AR_EEPROM_MAC(i));
                sum += eeval;
-               ah->macaddr[2 * i] = eeval >> 8;
-               ah->macaddr[2 * i + 1] = eeval & 0xff;
+               common->macaddr[2 * i] = eeval >> 8;
+               common->macaddr[2 * i + 1] = eeval & 0xff;
        }
        if (sum == 0 || sum == 0xffff * 3)
                return -EADDRNOTAVAIL;
 int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
                    bool bChannelChange)
 {
+       struct ath_common *common = ath9k_hw_common(ah);
        u32 saveLedState;
        struct ath_softc *sc = ah->ah_sc;
        struct ath9k_channel *curchan = ah->curchan;
 
        ath9k_hw_decrease_chain_power(ah, chan);
 
-       REG_WRITE(ah, AR_STA_ID0, get_unaligned_le32(ah->macaddr));
-       REG_WRITE(ah, AR_STA_ID1, get_unaligned_le16(ah->macaddr + 4)
+       REG_WRITE(ah, AR_STA_ID0, get_unaligned_le32(common->macaddr));
+       REG_WRITE(ah, AR_STA_ID1, get_unaligned_le16(common->macaddr + 4)
                  | macStaId1
                  | AR_STA_ID1_RTS_USE_DEF
                  | (ah->config.
 
 void ath9k_hw_setmac(struct ath_hw *ah, const u8 *mac)
 {
-       memcpy(ah->macaddr, mac, ETH_ALEN);
+       memcpy(ath9k_hw_common(ah)->macaddr, mac, ETH_ALEN);
 }
 
 void ath9k_hw_setopmode(struct ath_hw *ah)
 
 void ath9k_hw_setbssidmask(struct ath_hw *ah)
 {
-       REG_WRITE(ah, AR_BSSMSKL, get_unaligned_le32(ah->ah_sc->bssidmask));
-       REG_WRITE(ah, AR_BSSMSKU, get_unaligned_le16(ah->ah_sc->bssidmask + 4));
+       struct ath_common *common = ath9k_hw_common(ah);
+
+       REG_WRITE(ah, AR_BSSMSKL, get_unaligned_le32(common->bssidmask));
+       REG_WRITE(ah, AR_BSSMSKU, get_unaligned_le16(common->bssidmask + 4));
 }
 
 void ath9k_hw_write_associd(struct ath_hw *ah)
 {
-       REG_WRITE(ah, AR_BSS_ID0, get_unaligned_le32(ah->ah_sc->curbssid));
-       REG_WRITE(ah, AR_BSS_ID1, get_unaligned_le16(ah->ah_sc->curbssid + 4) |
-                 ((ah->ah_sc->curaid & 0x3fff) << AR_BSS_ID1_AID_S));
+       struct ath_common *common = ath9k_hw_common(ah);
+
+       REG_WRITE(ah, AR_BSS_ID0, get_unaligned_le32(common->curbssid));
+       REG_WRITE(ah, AR_BSS_ID1, get_unaligned_le16(common->curbssid + 4) |
+                 ((common->curaid & 0x3fff) << AR_BSS_ID1_AID_S));
 }
 
 u64 ath9k_hw_gettsf64(struct ath_hw *ah)
 
 
        bool sw_mgmt_crypto;
        bool is_pciexpress;
-       u8 macaddr[ETH_ALEN];
        u16 tx_trig_level;
        u16 rfsilent;
        u32 rfkill_gpio;
 
                                 struct ieee80211_bss_conf *bss_conf)
 {
        struct ath_hw *ah = sc->sc_ah;
+       struct ath_common *common = ath9k_hw_common(ah);
 
        if (bss_conf->assoc) {
                DPRINTF(ah, ATH_DBG_CONFIG, "Bss Info ASSOC %d, bssid: %pM\n",
-                       bss_conf->aid, sc->curbssid);
+                       bss_conf->aid, common->curbssid);
 
                /* New association, store aid */
-               sc->curaid = bss_conf->aid;
+               common->curaid = bss_conf->aid;
                ath9k_hw_write_associd(ah);
 
                /*
                ath_start_ani(sc);
        } else {
                DPRINTF(ah, ATH_DBG_CONFIG, "Bss Info DISASSOC\n");
-               sc->curaid = 0;
+               common->curaid = 0;
                /* Stop ANI */
                del_timer_sync(&sc->ani.timer);
        }
 static int ath_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid)
 {
        struct ath_hw *ah = NULL;
+       struct ath_common *common;
        int r = 0, i;
        int csz = 0;
        int qnum;
        ath9k_hw_setcapability(ah, ATH9K_CAP_DIVERSITY, 1, true, NULL);
        sc->rx.defant = ath9k_hw_getdefantenna(ah);
 
+       common = ath9k_hw_common(ah);
+
        if (ah->caps.hw_caps & ATH9K_HW_CAP_BSSIDMASK)
-               memcpy(sc->bssidmask, ath_bcast_mac, ETH_ALEN);
+               memcpy(common->bssidmask, ath_bcast_mac, ETH_ALEN);
 
        sc->beacon.slottime = ATH9K_SLOT_TIME_9;        /* default to short slot time */
 
 int ath_init_device(u16 devid, struct ath_softc *sc, u16 subsysid)
 {
        struct ieee80211_hw *hw = sc->hw;
+       struct ath_common *common;
        struct ath_hw *ah;
        int error = 0, i;
        struct ath_regulatory *reg;
                return error;
 
        ah = sc->sc_ah;
+       common = ath9k_hw_common(ah);
 
        /* get mac address from hardware and set in mac80211 */
 
-       SET_IEEE80211_PERM_ADDR(hw, ah->macaddr);
+       SET_IEEE80211_PERM_ADDR(hw, common->macaddr);
 
        ath_set_hw_capab(sc, hw);
 
-       error = ath_regd_init(&sc->common.regulatory, sc->hw->wiphy,
+       error = ath_regd_init(&common->regulatory, sc->hw->wiphy,
                              ath9k_reg_notifier);
        if (error)
                return error;
 
-       reg = &sc->common.regulatory;
+       reg = &common->regulatory;
 
        if (ah->caps.hw_caps & ATH9K_HW_CAP_HT) {
                setup_ht_cap(sc, &sc->sbands[IEEE80211_BAND_2GHZ].ht_cap);
        struct ath_wiphy *aphy = hw->priv;
        struct ath_softc *sc = aphy->sc;
        struct ath_hw *ah = sc->sc_ah;
+       struct ath_common *common = ath9k_hw_common(ah);
        struct ath_vif *avp = (void *)vif->drv_priv;
        u32 rfilt = 0;
        int error, i;
            ah->opmode != NL80211_IFTYPE_AP) {
                ah->opmode = NL80211_IFTYPE_STATION;
                ath9k_hw_setopmode(ah);
-               memcpy(sc->curbssid, sc->sc_ah->macaddr, ETH_ALEN);
-               sc->curaid = 0;
+               memcpy(common->curbssid, common->macaddr, ETH_ALEN);
+               common->curaid = 0;
                ath9k_hw_write_associd(ah);
                /* Request full reset to get hw opmode changed properly */
                sc->sc_flags |= SC_OP_FULL_RESET;
                case NL80211_IFTYPE_ADHOC:
                case NL80211_IFTYPE_MESH_POINT:
                        /* Set BSSID */
-                       memcpy(sc->curbssid, bss_conf->bssid, ETH_ALEN);
+                       memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);
                        memcpy(avp->bssid, bss_conf->bssid, ETH_ALEN);
-                       sc->curaid = 0;
+                       common->curaid = 0;
                        ath9k_hw_write_associd(ah);
 
                        /* Set aggregation protection mode parameters */
 
                        DPRINTF(sc->sc_ah, ATH_DBG_CONFIG,
                                "RX filter 0x%x bssid %pM aid 0x%x\n",
-                               rfilt, sc->curbssid, sc->curaid);
+                               rfilt, common->curbssid, common->curaid);
 
                        /* need to reconfigure the beacon */
                        sc->sc_flags &= ~SC_OP_BEACONS ;
                        if (ath9k_hw_keyisvalid(sc->sc_ah, (u16)i))
                                ath9k_hw_keysetmac(sc->sc_ah,
                                                   (u16)i,
-                                                  sc->curbssid);
+                                                  common->curbssid);
        }
 
        /* Only legacy IBSS for now */
 
 static void ath_opmode_init(struct ath_softc *sc)
 {
        struct ath_hw *ah = sc->sc_ah;
+       struct ath_common *common = ath9k_hw_common(ah);
+
        u32 rfilt, mfilt[2];
 
        /* configure rx filter */
        ath9k_hw_setopmode(ah);
 
        /* Handle any link-level address change. */
-       ath9k_hw_setmac(ah, sc->sc_ah->macaddr);
+       ath9k_hw_setmac(ah, common->macaddr);
 
        /* calculate and install multicast filter */
        mfilt[0] = mfilt[1] = ~0;
 static void ath_rx_ps_beacon(struct ath_softc *sc, struct sk_buff *skb)
 {
        struct ieee80211_mgmt *mgmt;
+       struct ath_common *common = ath9k_hw_common(sc->sc_ah);
 
        if (skb->len < 24 + 8 + 2 + 2)
                return;
 
        mgmt = (struct ieee80211_mgmt *)skb->data;
-       if (memcmp(sc->curbssid, mgmt->bssid, ETH_ALEN) != 0)
+       if (memcmp(common->curbssid, mgmt->bssid, ETH_ALEN) != 0)
                return; /* not from our current AP */
 
        sc->sc_flags &= ~SC_OP_WAIT_FOR_BEACON;
 
 {
        struct ath_wiphy *aphy = hw->priv;
        struct ath_softc *sc = aphy->sc;
+       struct ath_common *common = ath9k_hw_common(sc->sc_ah);
        struct ath9k_vif_iter_data iter_data;
        int i, j;
        u8 mask[ETH_ALEN];
         */
        iter_data.addr = kmalloc(ETH_ALEN, GFP_ATOMIC);
        if (iter_data.addr) {
-               memcpy(iter_data.addr, sc->sc_ah->macaddr, ETH_ALEN);
+               memcpy(iter_data.addr, common->macaddr, ETH_ALEN);
                iter_data.count = 1;
        } else
                iter_data.count = 0;
        kfree(iter_data.addr);
 
        /* Invert the mask and configure hardware */
-       sc->bssidmask[0] = ~mask[0];
-       sc->bssidmask[1] = ~mask[1];
-       sc->bssidmask[2] = ~mask[2];
-       sc->bssidmask[3] = ~mask[3];
-       sc->bssidmask[4] = ~mask[4];
-       sc->bssidmask[5] = ~mask[5];
+       common->bssidmask[0] = ~mask[0];
+       common->bssidmask[1] = ~mask[1];
+       common->bssidmask[2] = ~mask[2];
+       common->bssidmask[3] = ~mask[3];
+       common->bssidmask[4] = ~mask[4];
+       common->bssidmask[5] = ~mask[5];
 
        ath9k_hw_setbssidmask(sc->sc_ah);
 }
 {
        int i, error;
        struct ath_wiphy *aphy;
+       struct ath_common *common = ath9k_hw_common(sc->sc_ah);
        struct ieee80211_hw *hw;
        u8 addr[ETH_ALEN];
 
        sc->sec_wiphy[i] = aphy;
        spin_unlock_bh(&sc->wiphy_lock);
 
-       memcpy(addr, sc->sc_ah->macaddr, ETH_ALEN);
+       memcpy(addr, common->macaddr, ETH_ALEN);
        addr[0] |= 0x02; /* Locally managed address */
        /*
         * XOR virtual wiphy index into the least significant bits to generate