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)
 {
                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);
 }