ath9k: Handle full sleep in ps_restore.
PATCH 1/1 ath9k: Handle full sleep in ps_restore.
IDLE PS (Full Sleep) doesn't work when ifconfig up is done during Idle unassociated state.
Fix this by restoring FULL SLEEP in ps_restore if CONF_IDLE is set.
Signed-off-by Vivek Natarajan <[email protected]>
--- drivers/net/wireless/ath/ath9k/ath9k.h | 1 + drivers/net/wireless/ath/ath9k/main.c | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-)
drivers/net/wireless/ath/ath9k/ath9k.h +1 -0
@@ -480,6 +480,7 @@ struct ath_softc {u8 nbcnvifs;u16 nvifs;bool ps_enabled; +bool ps_idle;unsigned long ps_usecount;enum ath9k_int imask;
drivers/net/wireless/ath/ath9k/main.c +6 -2
@@ -143,8 +143,10 @@ void ath9k_ps_restore(struct ath_softc *sc)if (--sc->ps_usecount !=0 ) goto unlock; -if (sc->ps_enabled && - !(sc->ps_flags & (PS_WAIT_FOR_BEACON | +if (sc->ps_idle) +ath9k_hw_setpower (sc->sc_ah,ATH9K_PM_FULL_SLEEP ); +else if (sc->ps_enabled && + !(sc->ps_flags & (PS_WAIT_FOR_BEACON |PS_WAIT_FOR_CAB |PS_WAIT_FOR_PSPOLL_DATA |PS_WAIT_FOR_TX_ACK )))
@@ -1528,6 +1530,7 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)spin_unlock_bh (&sc->wiphy_lock);if (enable_radio) { + sc->ps_idle = false;ath_radio_enable (sc, hw);ath_print (common,ATH_DBG_CONFIG ,"not-idle: enabling radio\n" );
@@ -1635,6 +1638,7 @@ skip_chan_change:if (disable_radio) {ath_print (common,ATH_DBG_CONFIG ,"idle: disabling radio\n" ); + sc->ps_idle = true;ath_radio_disable (sc, hw); }
Signature · 1 line
1.6.6.1
Quoted 4 lines · Vivek Natarajan
IDLE PS (Full Sleep) doesn't work when ifconfig up is done during Idle unassociated state.
Fix this by restoring FULL SLEEP inps_restoreifCONF_IDLEis set.
Is this is stable fix too?
Luis