ath9k: enable dynack using set_coverage_class codepath
authorLorenzo Bianconi <lorenzo.bianconi83@gmail.com>
Tue, 16 Sep 2014 00:13:15 +0000 (02:13 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 16 Sep 2014 20:18:40 +0000 (16:18 -0400)
Enable ACK timeout estimation algorithm if set_coverage_class routine has been
called with negative coverage_class parameter. Dynack is automatically disabled
setting valid value for coverage class

Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/main.c

index 6083359579744cc7064a6179ef5b4a869be725f9..6969aba6ab819acadf375122db413410bdc6de14 100644 (file)
@@ -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);
 }