static int select_wiphy(struct ath_softc *sc, const char *name) { struct ath_wiphy *aphy = get_wiphy(sc, name); if (!aphy) return -ENOENT; return ath9k_wiphy_select(aphy); }
void ath9k_wiphy_work(struct work_struct *work) { struct ath_softc *sc = container_of(work, struct ath_softc, wiphy_work.work); struct ath_wiphy *aphy = NULL; bool first = true; spin_lock_bh(&sc->wiphy_lock); if (sc->wiphy_scheduler_int == 0) { /* wiphy scheduler is disabled */ spin_unlock_bh(&sc->wiphy_lock); return; } try_again: sc->wiphy_scheduler_index++; while (sc->wiphy_scheduler_index <= sc->num_sec_wiphy) { aphy = sc->sec_wiphy[sc->wiphy_scheduler_index - 1]; if (aphy && aphy->state != ATH_WIPHY_INACTIVE) break; sc->wiphy_scheduler_index++; aphy = NULL; } if (aphy == NULL) { sc->wiphy_scheduler_index = 0; if (sc->pri_wiphy->state == ATH_WIPHY_INACTIVE) { if (first) { first = false; goto try_again; } /* No wiphy is ready to be scheduled */ } else aphy = sc->pri_wiphy; } spin_unlock_bh(&sc->wiphy_lock); if (aphy && aphy->state != ATH_WIPHY_ACTIVE && aphy->state != ATH_WIPHY_SCAN && ath9k_wiphy_select(aphy)) { printk(KERN_DEBUG "ath9k: Failed to schedule virtual wiphy " "change\n"); } ieee80211_queue_delayed_work(sc->hw, &sc->wiphy_work, sc->wiphy_scheduler_int); }