ath9k: do not enable interrupt on set interrupt mask
authorRajkumar Manoharan <rmanohar@qca.qualcomm.com>
Fri, 5 Aug 2011 13:29:40 +0000 (18:59 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 9 Aug 2011 19:52:05 +0000 (15:52 -0400)
At preset set_interrupt also enables interrupt after changing
mask. This is not necessary in all cases and also sometime it
breaks the assumption that interrupt was disabled. So let us
enable the interrupt explicity if it was disabled earlier.
This could also avoid unnecessary register ops and also helps
the follow up patch to have global ref count for interrupts ops.

Signed-off-by: Rajkumar Manoharan <rmanohar@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/beacon.c
drivers/net/wireless/ath/ath9k/gpio.c
drivers/net/wireless/ath/ath9k/mac.c
drivers/net/wireless/ath/ath9k/main.c

index 0d13ff74a68be4b55dd7150dc3bf85971a489f12..f1d66abc367fda6cef1d1384de2c39e70b15c0fd 100644 (file)
@@ -522,6 +522,7 @@ static void ath_beacon_config_ap(struct ath_softc *sc,
        ath9k_beacon_init(sc, nexttbtt, intval);
        sc->beacon.bmisscnt = 0;
        ath9k_hw_set_interrupts(ah, ah->imask);
+       ath9k_hw_enable_interrupts(ah);
 }
 
 /*
@@ -652,8 +653,10 @@ static void ath_beacon_config_sta(struct ath_softc *sc,
         * If the beacon config is called beacause of TSFOOR,
         * Interrupts will be enabled back at the end of ath9k_tasklet
         */
-       if (!(sc->ps_flags & PS_TSFOOR_SYNC))
+       if (!(sc->ps_flags & PS_TSFOOR_SYNC)) {
                ath9k_hw_set_interrupts(ah, ah->imask);
+               ath9k_hw_enable_interrupts(ah);
+       }
 }
 
 static void ath_beacon_config_adhoc(struct ath_softc *sc,
@@ -691,8 +694,10 @@ static void ath_beacon_config_adhoc(struct ath_softc *sc,
         * If the beacon config is called beacause of TSFOOR,
         * Interrupts will be enabled back at the end of ath9k_tasklet
         */
-       if (!(sc->ps_flags & PS_TSFOOR_SYNC))
+       if (!(sc->ps_flags & PS_TSFOOR_SYNC)) {
                ath9k_hw_set_interrupts(ah, ah->imask);
+               ath9k_hw_enable_interrupts(ah);
+       }
 }
 
 static bool ath9k_allow_beacon_config(struct ath_softc *sc,
index bc713fc28191b2baf4e1992365902cfbce25fd07..5113dd80c99fb707946f69e073f59fbcc0f6613e 100644 (file)
@@ -149,6 +149,7 @@ static void ath9k_gen_timer_start(struct ath_hw *ah,
                ath9k_hw_disable_interrupts(ah);
                ah->imask |= ATH9K_INT_GENTIMER;
                ath9k_hw_set_interrupts(ah, ah->imask);
+               ath9k_hw_enable_interrupts(ah);
        }
 }
 
@@ -163,6 +164,7 @@ static void ath9k_gen_timer_stop(struct ath_hw *ah, struct ath_gen_timer *timer)
                ath9k_hw_disable_interrupts(ah);
                ah->imask &= ~ATH9K_INT_GENTIMER;
                ath9k_hw_set_interrupts(ah, ah->imask);
+               ath9k_hw_enable_interrupts(ah);
        }
 }
 
index b6b523a897e54db4f2673e9597583576da145917..c3af61e38bd524ba22d1d1935fef5520df83555e 100644 (file)
@@ -929,9 +929,6 @@ void ath9k_hw_set_interrupts(struct ath_hw *ah, enum ath9k_int ints)
                        REG_CLR_BIT(ah, AR_IMR_S5, AR_IMR_S5_TIM_TIMER);
        }
 
-       if (ints & ATH9K_INT_GLOBAL)
-               ath9k_hw_enable_interrupts(ah);
-
        return;
 }
 EXPORT_SYMBOL(ath9k_hw_set_interrupts);
index b602447b0a880e5d9cba1b9891fde90012dd376e..3050d83673b2e05b8155fd58fe0c01ffa2cba6a7 100644 (file)
@@ -294,6 +294,7 @@ static int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
        ath9k_cmn_update_txpow(ah, sc->curtxpow,
                               sc->config.txpowlimit, &sc->curtxpow);
        ath9k_hw_set_interrupts(ah, ah->imask);
+       ath9k_hw_enable_interrupts(ah);
 
        if (!(sc->sc_flags & (SC_OP_OFFCHANNEL))) {
                if (sc->sc_flags & SC_OP_BEACONS)
@@ -910,6 +911,7 @@ static void ath_radio_enable(struct ath_softc *sc, struct ieee80211_hw *hw)
 
        /* Re-Enable  interrupts */
        ath9k_hw_set_interrupts(ah, ah->imask);
+       ath9k_hw_enable_interrupts(ah);
 
        /* Enable LED */
        ath9k_hw_cfg_output(ah, ah->led_pin,
@@ -1016,6 +1018,7 @@ int ath_reset(struct ath_softc *sc, bool retry_tx)
                ath_set_beacon(sc);     /* restart beacons */
 
        ath9k_hw_set_interrupts(ah, ah->imask);
+       ath9k_hw_enable_interrupts(ah);
 
        if (retry_tx) {
                int i;
@@ -1130,6 +1133,7 @@ static int ath9k_start(struct ieee80211_hw *hw)
        /* Disable BMISS interrupt when we're not associated */
        ah->imask &= ~(ATH9K_INT_SWBA | ATH9K_INT_BMISS);
        ath9k_hw_set_interrupts(ah, ah->imask);
+       ath9k_hw_enable_interrupts(ah);
 
        ieee80211_wake_queues(hw);