#include <linux/skbuff.h>
 #include <linux/if_ether.h>
+#include <net/mac80211.h>
 
 static const u8 ath_bcast_mac[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
 
 
 struct ath_common {
        void *ah;
+       struct ieee80211_hw *hw;
        u16 cachelsz;
        u16 curaid;
        u8 macaddr[ETH_ALEN];
 
        common = ath5k_hw_common(sc->ah);
        common->ops = &ath5k_common_ops;
        common->ah = sc->ah;
+       common->hw = hw;
        common->cachelsz = csz << 2; /* convert to bytes */
 
        /* Initialize device */
 
 
 static void ath9k_hw_ani_ofdm_err_trigger(struct ath_hw *ah)
 {
-       struct ieee80211_conf *conf = &ah->ah_sc->hw->conf;
+       struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf;
        struct ar5416AniState *aniState;
        int32_t rssi;
 
 
 static void ath9k_hw_ani_cck_err_trigger(struct ath_hw *ah)
 {
-       struct ieee80211_conf *conf = &ah->ah_sc->hw->conf;
+       struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf;
        struct ar5416AniState *aniState;
        int32_t rssi;
 
 
 static bool ath9k_hw_iscal_supported(struct ath_hw *ah,
                                     enum ath9k_cal_types calType)
 {
-       struct ieee80211_conf *conf = &ah->ah_sc->hw->conf;
+       struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf;
 
        switch (calType & ah->supp_cals) {
        case IQ_MISMATCH_CAL: /* Both 2 GHz and 5 GHz support OFDM */
 /* This is done for the currently configured channel */
 bool ath9k_hw_reset_calvalid(struct ath_hw *ah)
 {
-       struct ieee80211_conf *conf = &ah->ah_sc->hw->conf;
+       struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf;
        struct ath9k_cal_list *currCal = ah->cal_list_curr;
 
        if (!ah->curchan)
 
 
 static u32 ath9k_hw_mac_usec(struct ath_hw *ah, u32 clks)
 {
-       struct ieee80211_conf *conf = &ah->ah_sc->hw->conf;
+       struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf;
 
        if (!ah->curchan) /* should really check for CCK instead */
                return clks / ATH9K_CLOCK_RATE_CCK;
 
 static u32 ath9k_hw_mac_to_usec(struct ath_hw *ah, u32 clks)
 {
-       struct ieee80211_conf *conf = &ah->ah_sc->hw->conf;
+       struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf;
 
        if (conf_is_ht40(conf))
                return ath9k_hw_mac_usec(ah, clks) / 2;
 
 static u32 ath9k_hw_mac_clks(struct ath_hw *ah, u32 usecs)
 {
-       struct ieee80211_conf *conf = &ah->ah_sc->hw->conf;
+       struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf;
 
        if (!ah->curchan) /* should really check for CCK instead */
                return usecs *ATH9K_CLOCK_RATE_CCK;
 
 static u32 ath9k_hw_mac_to_clks(struct ath_hw *ah, u32 usecs)
 {
-       struct ieee80211_conf *conf = &ah->ah_sc->hw->conf;
+       struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf;
 
        if (conf_is_ht40(conf))
                return ath9k_hw_mac_clks(ah, usecs) * 2;
 
 };
 
 struct ath_hw {
+       struct ieee80211_hw *hw;
        struct ath_softc *ah_sc;
        struct ath_common common;
        struct ath9k_hw_version hw_version;
 
        common = ath9k_hw_common(ah);
        common->ops = &ath9k_common_ops;
        common->ah = ah;
+       common->hw = sc->hw;
 
        /*
         * Cache line size is used to size and align various