|
@@ -1876,6 +1876,20 @@ static int ath9k_get_survey(struct ieee80211_hw *hw, int idx,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void ath9k_enable_dynack(struct ath_softc *sc)
|
|
|
+{
|
|
|
+#ifdef CONFIG_ATH9K_DYNACK
|
|
|
+ u32 rfilt;
|
|
|
+ struct ath_hw *ah = sc->sc_ah;
|
|
|
+
|
|
|
+ ath_dynack_reset(ah);
|
|
|
+
|
|
|
+ ah->dynack.enabled = true;
|
|
|
+ rfilt = ath_calcrxfilter(sc);
|
|
|
+ ath9k_hw_setrxfilter(ah, rfilt);
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
static void ath9k_set_coverage_class(struct ieee80211_hw *hw,
|
|
|
s16 coverage_class)
|
|
|
{
|
|
@@ -1886,11 +1900,22 @@ static void ath9k_set_coverage_class(struct ieee80211_hw *hw,
|
|
|
return;
|
|
|
|
|
|
mutex_lock(&sc->mutex);
|
|
|
- ah->coverage_class = coverage_class;
|
|
|
|
|
|
- ath9k_ps_wakeup(sc);
|
|
|
- ath9k_hw_init_global_settings(ah);
|
|
|
- ath9k_ps_restore(sc);
|
|
|
+ if (coverage_class >= 0) {
|
|
|
+ ah->coverage_class = coverage_class;
|
|
|
+ if (ah->dynack.enabled) {
|
|
|
+ u32 rfilt;
|
|
|
+
|
|
|
+ ah->dynack.enabled = false;
|
|
|
+ rfilt = ath_calcrxfilter(sc);
|
|
|
+ ath9k_hw_setrxfilter(ah, rfilt);
|
|
|
+ }
|
|
|
+ ath9k_ps_wakeup(sc);
|
|
|
+ ath9k_hw_init_global_settings(ah);
|
|
|
+ ath9k_ps_restore(sc);
|
|
|
+ } else if (!ah->dynack.enabled) {
|
|
|
+ ath9k_enable_dynack(sc);
|
|
|
+ }
|
|
|
|
|
|
mutex_unlock(&sc->mutex);
|
|
|
}
|