ath9k: serialize ath9k_hw_setpower calls
Because ath9k_setpower is called from various contexts, we have to protect it against concurrent calls. Changes-licensed-under: ISC Signed-off-by: Gabor Juhos <juhosg@openwrt.org> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
ebaa24534e
commit
04717ccd80
@ -559,6 +559,7 @@ struct ath_softc {
|
|||||||
spinlock_t sc_resetlock;
|
spinlock_t sc_resetlock;
|
||||||
spinlock_t sc_serial_rw;
|
spinlock_t sc_serial_rw;
|
||||||
spinlock_t ani_lock;
|
spinlock_t ani_lock;
|
||||||
|
spinlock_t sc_pm_lock;
|
||||||
struct mutex mutex;
|
struct mutex mutex;
|
||||||
|
|
||||||
u8 curbssid[ETH_ALEN];
|
u8 curbssid[ETH_ALEN];
|
||||||
|
@ -2728,7 +2728,8 @@ static bool ath9k_hw_set_power_awake(struct ath_hw *ah, int setChip)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode)
|
static bool ath9k_hw_setpower_nolock(struct ath_hw *ah,
|
||||||
|
enum ath9k_power_mode mode)
|
||||||
{
|
{
|
||||||
int status = true, setChip = true;
|
int status = true, setChip = true;
|
||||||
static const char *modes[] = {
|
static const char *modes[] = {
|
||||||
@ -2762,6 +2763,18 @@ bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode)
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
bool ret;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&ah->ah_sc->sc_pm_lock, flags);
|
||||||
|
ret = ath9k_hw_setpower_nolock(ah, mode);
|
||||||
|
spin_unlock_irqrestore(&ah->ah_sc->sc_pm_lock, flags);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Helper for ASPM support.
|
* Helper for ASPM support.
|
||||||
*
|
*
|
||||||
|
@ -1316,6 +1316,7 @@ static int ath_init(u16 devid, struct ath_softc *sc)
|
|||||||
spin_lock_init(&sc->sc_resetlock);
|
spin_lock_init(&sc->sc_resetlock);
|
||||||
spin_lock_init(&sc->sc_serial_rw);
|
spin_lock_init(&sc->sc_serial_rw);
|
||||||
spin_lock_init(&sc->ani_lock);
|
spin_lock_init(&sc->ani_lock);
|
||||||
|
spin_lock_init(&sc->sc_pm_lock);
|
||||||
mutex_init(&sc->mutex);
|
mutex_init(&sc->mutex);
|
||||||
tasklet_init(&sc->intr_tq, ath9k_tasklet, (unsigned long)sc);
|
tasklet_init(&sc->intr_tq, ath9k_tasklet, (unsigned long)sc);
|
||||||
tasklet_init(&sc->bcon_tasklet, ath_beacon_tasklet,
|
tasklet_init(&sc->bcon_tasklet, ath_beacon_tasklet,
|
||||||
|
Loading…
Reference in New Issue
Block a user