| From 46047784b8cdcfc916f6c1cccee0c18dd1223dfd Mon Sep 17 00:00:00 2001 |
| From: Rajkumar Manoharan <rmanoharan@atheros.com> |
| Date: Fri, 26 Nov 2010 23:24:31 +0530 |
| Subject: ath9k: Disable SWBA interrupt on remove_interface |
| |
| From: Rajkumar Manoharan <rmanoharan@atheros.com> |
| |
| commit 46047784b8cdcfc916f6c1cccee0c18dd1223dfd upstream. |
| |
| while removing beaconing mode interface, SWBA interrupt |
| was never disabled when there are no other beaconing interfaces. |
| |
| Signed-off-by: Rajkumar Manoharan <rmanoharan@atheros.com> |
| Signed-off-by: John W. Linville <linville@tuxdriver.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/net/wireless/ath/ath9k/main.c | 11 ++++++++++- |
| 1 file changed, 10 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/net/wireless/ath/ath9k/main.c |
| +++ b/drivers/net/wireless/ath/ath9k/main.c |
| @@ -1484,6 +1484,7 @@ static void ath9k_remove_interface(struc |
| struct ath_softc *sc = aphy->sc; |
| struct ath_common *common = ath9k_hw_common(sc->sc_ah); |
| struct ath_vif *avp = (void *)vif->drv_priv; |
| + bool bs_valid = false; |
| int i; |
| |
| ath_print(common, ATH_DBG_CONFIG, "Detach Interface\n"); |
| @@ -1512,7 +1513,15 @@ static void ath9k_remove_interface(struc |
| "slot\n", __func__); |
| sc->beacon.bslot[i] = NULL; |
| sc->beacon.bslot_aphy[i] = NULL; |
| - } |
| + } else if (sc->beacon.bslot[i]) |
| + bs_valid = true; |
| + } |
| + if (!bs_valid && (sc->sc_ah->imask & ATH9K_INT_SWBA)) { |
| + /* Disable SWBA interrupt */ |
| + sc->sc_ah->imask &= ~ATH9K_INT_SWBA; |
| + ath9k_ps_wakeup(sc); |
| + ath9k_hw_set_interrupts(sc->sc_ah, sc->sc_ah->imask); |
| + ath9k_ps_restore(sc); |
| } |
| |
| sc->nvifs--; |