static int ath9k_start(struct ieee80211_hw *hw)
 {
-       struct ath_softc *sc = hw->priv;
+       struct ath_wiphy *aphy = hw->priv;
+       struct ath_softc *sc = aphy->sc;
        struct ieee80211_channel *curchan = hw->conf.channel;
        struct ath9k_channel *init_channel;
        int r, pos;
        sc->imask &= ~(ATH9K_INT_SWBA | ATH9K_INT_BMISS);
        ath9k_hw_set_interrupts(sc->sc_ah, sc->imask);
 
-       ieee80211_wake_queues(sc->hw);
+       ieee80211_wake_queues(hw);
 
 #if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
        r = ath_start_rfkill_poll(sc);
                    struct sk_buff *skb)
 {
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
-       struct ath_softc *sc = hw->priv;
+       struct ath_wiphy *aphy = hw->priv;
+       struct ath_softc *sc = aphy->sc;
        struct ath_tx_control txctl;
        int hdrlen, padsize;
 
 
 static void ath9k_stop(struct ieee80211_hw *hw)
 {
-       struct ath_softc *sc = hw->priv;
+       struct ath_wiphy *aphy = hw->priv;
+       struct ath_softc *sc = aphy->sc;
 
        if (sc->sc_flags & SC_OP_INVALID) {
                DPRINTF(sc, ATH_DBG_ANY, "Device not present\n");
 
        mutex_lock(&sc->mutex);
 
-       ieee80211_stop_queues(sc->hw);
+       ieee80211_stop_queues(hw);
 
        /* make sure h/w will not generate any interrupt
         * before setting the invalid flag. */
 static int ath9k_add_interface(struct ieee80211_hw *hw,
                               struct ieee80211_if_init_conf *conf)
 {
-       struct ath_softc *sc = hw->priv;
+       struct ath_wiphy *aphy = hw->priv;
+       struct ath_softc *sc = aphy->sc;
        struct ath_vif *avp = (void *)conf->vif->drv_priv;
        enum nl80211_iftype ic_opmode = NL80211_IFTYPE_UNSPECIFIED;
        int ret = 0;
 static void ath9k_remove_interface(struct ieee80211_hw *hw,
                                   struct ieee80211_if_init_conf *conf)
 {
-       struct ath_softc *sc = hw->priv;
+       struct ath_wiphy *aphy = hw->priv;
+       struct ath_softc *sc = aphy->sc;
        struct ath_vif *avp = (void *)conf->vif->drv_priv;
        int i;
 
 
 static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
 {
-       struct ath_softc *sc = hw->priv;
+       struct ath_wiphy *aphy = hw->priv;
+       struct ath_softc *sc = aphy->sc;
        struct ieee80211_conf *conf = &hw->conf;
 
        mutex_lock(&sc->mutex);
                                  struct ieee80211_vif *vif,
                                  struct ieee80211_if_conf *conf)
 {
-       struct ath_softc *sc = hw->priv;
+       struct ath_wiphy *aphy = hw->priv;
+       struct ath_softc *sc = aphy->sc;
        struct ath_hw *ah = sc->sc_ah;
        struct ath_vif *avp = (void *)vif->drv_priv;
        u32 rfilt = 0;
                                   int mc_count,
                                   struct dev_mc_list *mclist)
 {
-       struct ath_softc *sc = hw->priv;
+       struct ath_wiphy *aphy = hw->priv;
+       struct ath_softc *sc = aphy->sc;
        u32 rfilt;
 
        changed_flags &= SUPPORTED_FILTERS;
                             enum sta_notify_cmd cmd,
                             struct ieee80211_sta *sta)
 {
-       struct ath_softc *sc = hw->priv;
+       struct ath_wiphy *aphy = hw->priv;
+       struct ath_softc *sc = aphy->sc;
 
        switch (cmd) {
        case STA_NOTIFY_ADD:
 static int ath9k_conf_tx(struct ieee80211_hw *hw, u16 queue,
                         const struct ieee80211_tx_queue_params *params)
 {
-       struct ath_softc *sc = hw->priv;
+       struct ath_wiphy *aphy = hw->priv;
+       struct ath_softc *sc = aphy->sc;
        struct ath9k_tx_queue_info qi;
        int ret = 0, qnum;
 
                         struct ieee80211_sta *sta,
                         struct ieee80211_key_conf *key)
 {
-       struct ath_softc *sc = hw->priv;
+       struct ath_wiphy *aphy = hw->priv;
+       struct ath_softc *sc = aphy->sc;
        int ret = 0;
 
        if (modparam_nohwcrypt)
                                   struct ieee80211_bss_conf *bss_conf,
                                   u32 changed)
 {
-       struct ath_softc *sc = hw->priv;
+       struct ath_wiphy *aphy = hw->priv;
+       struct ath_softc *sc = aphy->sc;
 
        mutex_lock(&sc->mutex);
 
 static u64 ath9k_get_tsf(struct ieee80211_hw *hw)
 {
        u64 tsf;
-       struct ath_softc *sc = hw->priv;
+       struct ath_wiphy *aphy = hw->priv;
+       struct ath_softc *sc = aphy->sc;
 
        mutex_lock(&sc->mutex);
        tsf = ath9k_hw_gettsf64(sc->sc_ah);
 
 static void ath9k_set_tsf(struct ieee80211_hw *hw, u64 tsf)
 {
-       struct ath_softc *sc = hw->priv;
+       struct ath_wiphy *aphy = hw->priv;
+       struct ath_softc *sc = aphy->sc;
 
        mutex_lock(&sc->mutex);
        ath9k_hw_settsf64(sc->sc_ah, tsf);
 
 static void ath9k_reset_tsf(struct ieee80211_hw *hw)
 {
-       struct ath_softc *sc = hw->priv;
+       struct ath_wiphy *aphy = hw->priv;
+       struct ath_softc *sc = aphy->sc;
 
        mutex_lock(&sc->mutex);
        ath9k_hw_reset_tsf(sc->sc_ah);
                              struct ieee80211_sta *sta,
                              u16 tid, u16 *ssn)
 {
-       struct ath_softc *sc = hw->priv;
+       struct ath_wiphy *aphy = hw->priv;
+       struct ath_softc *sc = aphy->sc;
        int ret = 0;
 
        switch (action) {
 
 static void ath9k_sw_scan_start(struct ieee80211_hw *hw)
 {
-       struct ath_softc *sc = hw->priv;
+       struct ath_wiphy *aphy = hw->priv;
+       struct ath_softc *sc = aphy->sc;
 
        mutex_lock(&sc->mutex);
        sc->sc_flags |= SC_OP_SCANNING;
 
 static void ath9k_sw_scan_complete(struct ieee80211_hw *hw)
 {
-       struct ath_softc *sc = hw->priv;
+       struct ath_wiphy *aphy = hw->priv;
+       struct ath_softc *sc = aphy->sc;
 
        mutex_lock(&sc->mutex);
        sc->sc_flags &= ~SC_OP_SCANNING;
 
 static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        void __iomem *mem;
+       struct ath_wiphy *aphy;
        struct ath_softc *sc;
        struct ieee80211_hw *hw;
        u8 csz;
                goto bad1;
        }
 
-       hw = ieee80211_alloc_hw(sizeof(struct ath_softc), &ath9k_ops);
+       hw = ieee80211_alloc_hw(sizeof(struct ath_wiphy) +
+                               sizeof(struct ath_softc), &ath9k_ops);
        if (hw == NULL) {
                printk(KERN_ERR "ath_pci: no memory for ieee80211_hw\n");
                goto bad2;
        SET_IEEE80211_DEV(hw, &pdev->dev);
        pci_set_drvdata(pdev, hw);
 
-       sc = hw->priv;
+       aphy = hw->priv;
+       sc = (struct ath_softc *) (aphy + 1);
+       aphy->sc = sc;
+       aphy->hw = hw;
+       sc->pri_wiphy = aphy;
        sc->hw = hw;
        sc->dev = &pdev->dev;
        sc->mem = mem;
 static void ath_pci_remove(struct pci_dev *pdev)
 {
        struct ieee80211_hw *hw = pci_get_drvdata(pdev);
-       struct ath_softc *sc = hw->priv;
+       struct ath_wiphy *aphy = hw->priv;
+       struct ath_softc *sc = aphy->sc;
 
        ath_cleanup(sc);
 }
 static int ath_pci_suspend(struct pci_dev *pdev, pm_message_t state)
 {
        struct ieee80211_hw *hw = pci_get_drvdata(pdev);
-       struct ath_softc *sc = hw->priv;
+       struct ath_wiphy *aphy = hw->priv;
+       struct ath_softc *sc = aphy->sc;
 
        ath9k_hw_set_gpio(sc->sc_ah, ATH_LED_PIN, 1);
 
 static int ath_pci_resume(struct pci_dev *pdev)
 {
        struct ieee80211_hw *hw = pci_get_drvdata(pdev);
-       struct ath_softc *sc = hw->priv;
+       struct ath_wiphy *aphy = hw->priv;
+       struct ath_softc *sc = aphy->sc;
        u32 val;
        int err;
 
 
 
 #include "ath9k.h"
 
+static struct ieee80211_hw * ath_get_virt_hw(struct ath_softc *sc,
+                                            struct ieee80211_hdr *hdr)
+{
+       return sc->pri_wiphy->hw;
+}
+
 /*
  * Setup and link descriptors.
  *
        struct ieee80211_hdr *hdr;
        u8 ratecode;
        __le16 fc;
+       struct ieee80211_hw *hw;
 
        hdr = (struct ieee80211_hdr *)skb->data;
        fc = hdr->frame_control;
        memset(rx_status, 0, sizeof(struct ieee80211_rx_status));
+       hw = ath_get_virt_hw(sc, hdr);
 
        if (ds->ds_rxstat.rs_more) {
                /*
                rx_status->rate_idx = ratecode & 0x7f;
        } else {
                int i = 0, cur_band, n_rates;
-               struct ieee80211_hw *hw = sc->hw;
 
                cur_band = hw->conf.channel->band;
                n_rates = sc->sbands[cur_band].n_bitrates;
        }
 
        rx_status->mactime = ath_extend_tsf(sc, ds->ds_rxstat.rs_tstamp);
-       rx_status->band = sc->hw->conf.channel->band;
-       rx_status->freq =  sc->hw->conf.channel->center_freq;
+       rx_status->band = hw->conf.channel->band;
+       rx_status->freq = hw->conf.channel->center_freq;
        rx_status->noise = sc->ani.noise_floor;
        rx_status->signal = rx_status->noise + ds->ds_rxstat.rs_rssi;
        rx_status->antenna = ds->ds_rxstat.rs_antenna;
                }
 
                /* Send the frame to mac80211 */
-               __ieee80211_rx(sc->hw, skb, &rx_status);
+               __ieee80211_rx(ath_get_virt_hw(sc, hdr), skb, &rx_status);
 
                /* We will now give hardware our shiny new allocated skb */
                bf->bf_mpdu = requeue_skb;