struct ath_softc *sc; /* shared for all virtual wiphys */
        struct ieee80211_hw *hw;
        enum ath_wiphy_state {
+               ATH_WIPHY_INACTIVE,
                ATH_WIPHY_ACTIVE,
                ATH_WIPHY_PAUSING,
                ATH_WIPHY_PAUSED,
 int ath9k_wiphy_unpause(struct ath_wiphy *aphy);
 int ath9k_wiphy_select(struct ath_wiphy *aphy);
 void ath9k_wiphy_chan_work(struct work_struct *work);
+bool ath9k_wiphy_started(struct ath_softc *sc);
 
 #endif /* ATH9K_H */
 
 
        mutex_lock(&sc->mutex);
 
+       if (ath9k_wiphy_started(sc)) {
+               if (sc->chan_idx == curchan->hw_value) {
+                       /*
+                        * Already on the operational channel, the new wiphy
+                        * can be marked active.
+                        */
+                       aphy->state = ATH_WIPHY_ACTIVE;
+                       ieee80211_wake_queues(hw);
+               } else {
+                       /*
+                        * Another wiphy is on another channel, start the new
+                        * wiphy in paused state.
+                        */
+                       aphy->state = ATH_WIPHY_PAUSED;
+                       ieee80211_stop_queues(hw);
+               }
+               mutex_unlock(&sc->mutex);
+               return 0;
+       }
+       aphy->state = ATH_WIPHY_ACTIVE;
+
        /* setup initial channel */
 
        pos = curchan->hw_value;
        struct ath_wiphy *aphy = hw->priv;
        struct ath_softc *sc = aphy->sc;
 
+       aphy->state = ATH_WIPHY_INACTIVE;
+
        if (sc->sc_flags & SC_OP_INVALID) {
                DPRINTF(sc, ATH_DBG_ANY, "Device not present\n");
                return;
 
        ieee80211_stop_queues(hw);
 
+       if (ath9k_wiphy_started(sc)) {
+               mutex_unlock(&sc->mutex);
+               return; /* another wiphy still in use */
+       }
+
        /* make sure h/w will not generate any interrupt
         * before setting the invalid flag. */
        ath9k_hw_set_interrupts(sc->sc_ah, 0);
 
 
        return 0;
 }
+
+bool ath9k_wiphy_started(struct ath_softc *sc)
+{
+       int i;
+       spin_lock_bh(&sc->wiphy_lock);
+       if (sc->pri_wiphy->state != ATH_WIPHY_INACTIVE) {
+               spin_unlock_bh(&sc->wiphy_lock);
+               return true;
+       }
+       for (i = 0; i < sc->num_sec_wiphy; i++) {
+               if (sc->sec_wiphy[i] &&
+                   sc->sec_wiphy[i]->state != ATH_WIPHY_INACTIVE) {
+                       spin_unlock_bh(&sc->wiphy_lock);
+                       return true;
+               }
+       }
+       spin_unlock_bh(&sc->wiphy_lock);
+       return false;
+}