diff options
Diffstat (limited to 'package/mac80211')
| -rw-r--r-- | package/mac80211/patches/527-ath9k_ps_survey_fix.patch | 54 | 
1 files changed, 54 insertions, 0 deletions
| diff --git a/package/mac80211/patches/527-ath9k_ps_survey_fix.patch b/package/mac80211/patches/527-ath9k_ps_survey_fix.patch new file mode 100644 index 000000000..f130f4132 --- /dev/null +++ b/package/mac80211/patches/527-ath9k_ps_survey_fix.patch @@ -0,0 +1,54 @@ +--- a/drivers/net/wireless/ath/ath9k/main.c ++++ b/drivers/net/wireless/ath/ath9k/main.c +@@ -122,6 +122,7 @@ bool ath9k_setpower(struct ath_softc *sc +  + void ath9k_ps_wakeup(struct ath_softc *sc) + { ++	struct ath_common *common = ath9k_hw_common(sc->sc_ah); + 	unsigned long flags; +  + 	spin_lock_irqsave(&sc->sc_pm_lock, flags); +@@ -130,18 +131,33 @@ void ath9k_ps_wakeup(struct ath_softc *s +  + 	ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_AWAKE); +  ++	/* ++	 * While the hardware is asleep, the cycle counters contain no ++	 * useful data. Better clear them now so that they don't mess up the ++	 * ANI or survey data results. ++	 */ ++	spin_lock(&common->cc_lock); ++	ath_hw_cycle_counters_update(common); ++	memset(&common->cc_survey, 0, sizeof(common->cc_survey)); ++	spin_unlock(&common->cc_lock); ++ +  unlock: + 	spin_unlock_irqrestore(&sc->sc_pm_lock, flags); + } +  + void ath9k_ps_restore(struct ath_softc *sc) + { ++	struct ath_common *common = ath9k_hw_common(sc->sc_ah); + 	unsigned long flags; +  + 	spin_lock_irqsave(&sc->sc_pm_lock, flags); + 	if (--sc->ps_usecount != 0) + 		goto unlock; +  ++	spin_lock(&common->cc_lock); ++	ath_hw_cycle_counters_update(common); ++	spin_unlock(&common->cc_lock); ++ + 	if (sc->ps_idle) + 		ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_FULL_SLEEP); + 	else if (sc->ps_enabled && +@@ -197,7 +213,8 @@ static void ath_update_survey_stats(stru + 	struct ath_cycle_counters *cc = &common->cc_survey; + 	unsigned int div = common->clockrate * 1000; +  +-	ath_hw_cycle_counters_update(common); ++	if (ah->power_mode == ATH9K_PM_AWAKE) ++		ath_hw_cycle_counters_update(common); +  + 	if (cc->cycles > 0) { + 		survey->filled |= SURVEY_INFO_CHANNEL_TIME | | 
