ath9k: Protect config() callback with a mutex
authorSujith <Sujith.Manoharan@atheros.com>
Thu, 18 Dec 2008 06:10:16 +0000 (11:40 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 19 Dec 2008 20:23:50 +0000 (15:23 -0500)
This should fix the timeout issues seen when using wpa_supplicant.

Signed-off-by: Sujith <Sujith.Manoharan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath9k/core.h
drivers/net/wireless/ath9k/main.c

index e38f0331cfd5e335c7707fb6e256287f331871d8..4ca2aed236e090d081e6649f019cf81da86273c0 100644 (file)
@@ -701,6 +701,7 @@ struct ath_softc {
        struct ath_hal *sc_ah;
        void __iomem *mem;
        spinlock_t sc_resetlock;
+       struct mutex mutex;
 
        u8 sc_curbssid[ETH_ALEN];
        u8 sc_myaddr[ETH_ALEN];
index e768be4669e7ac684ce75bffba8f2b79f4fe0451..94c526669a4db68966041f8372de392f80f13f88 100644 (file)
@@ -1324,6 +1324,7 @@ static int ath_init(u16 devid, struct ath_softc *sc)
                printk(KERN_ERR "Unable to create debugfs files\n");
 
        spin_lock_init(&sc->sc_resetlock);
+       mutex_init(&sc->mutex);
        tasklet_init(&sc->intr_tq, ath9k_tasklet, (unsigned long)sc);
        tasklet_init(&sc->bcon_tasklet, ath9k_beacon_tasklet,
                     (unsigned long)sc);
@@ -2133,6 +2134,7 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
        struct ath_softc *sc = hw->priv;
        struct ieee80211_conf *conf = &hw->conf;
 
+       mutex_lock(&sc->mutex);
        if (changed & (IEEE80211_CONF_CHANGE_CHANNEL |
                       IEEE80211_CONF_CHANGE_HT)) {
                struct ieee80211_channel *curchan = hw->conf.channel;
@@ -2145,6 +2147,7 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
                if (pos == -1) {
                        DPRINTF(sc, ATH_DBG_FATAL, "Invalid channel: %d\n",
                                curchan->center_freq);
+                       mutex_unlock(&sc->mutex);
                        return -EINVAL;
                }
 
@@ -2165,6 +2168,7 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
 
                if (ath_set_channel(sc, &sc->sc_ah->ah_channels[pos]) < 0) {
                        DPRINTF(sc, ATH_DBG_FATAL, "Unable to set channel\n");
+                       mutex_unlock(&sc->mutex);
                        return -EINVAL;
                }
 
@@ -2174,6 +2178,7 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
        if (changed & IEEE80211_CONF_CHANGE_POWER)
                sc->sc_config.txpowlimit = 2 * conf->power_level;
 
+       mutex_unlock(&sc->mutex);
        return 0;
 }