aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath9k
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/ath9k')
-rw-r--r--drivers/net/wireless/ath9k/core.c9
-rw-r--r--drivers/net/wireless/ath9k/core.h1
-rw-r--r--drivers/net/wireless/ath9k/main.c12
-rw-r--r--drivers/net/wireless/ath9k/xmit.c6
4 files changed, 20 insertions, 8 deletions
diff --git a/drivers/net/wireless/ath9k/core.c b/drivers/net/wireless/ath9k/core.c
index 690f7c56af3d..6c433a4d003e 100644
--- a/drivers/net/wireless/ath9k/core.c
+++ b/drivers/net/wireless/ath9k/core.c
@@ -678,6 +678,12 @@ int ath_open(struct ath_softc *sc, struct ath9k_channel *initial_chan)
678 if (ah->ah_caps.hw_caps & ATH9K_HW_CAP_HT) 678 if (ah->ah_caps.hw_caps & ATH9K_HW_CAP_HT)
679 sc->sc_imask |= ATH9K_INT_CST; 679 sc->sc_imask |= ATH9K_INT_CST;
680 680
681 /* Note: We disable MIB interrupts for now as we don't yet
682 * handle processing ANI, otherwise you will get an interrupt
683 * storm after about 7 hours of usage making the system unusable
684 * with huge latency. Once we do have ANI processing included
685 * we can re-enable this interrupt. */
686#if 0
681 /* 687 /*
682 * Enable MIB interrupts when there are hardware phy counters. 688 * Enable MIB interrupts when there are hardware phy counters.
683 * Note we only do this (at the moment) for station mode. 689 * Note we only do this (at the moment) for station mode.
@@ -686,6 +692,7 @@ int ath_open(struct ath_softc *sc, struct ath9k_channel *initial_chan)
686 ((sc->sc_ah->ah_opmode == ATH9K_M_STA) || 692 ((sc->sc_ah->ah_opmode == ATH9K_M_STA) ||
687 (sc->sc_ah->ah_opmode == ATH9K_M_IBSS))) 693 (sc->sc_ah->ah_opmode == ATH9K_M_IBSS)))
688 sc->sc_imask |= ATH9K_INT_MIB; 694 sc->sc_imask |= ATH9K_INT_MIB;
695#endif
689 /* 696 /*
690 * Some hardware processes the TIM IE and fires an 697 * Some hardware processes the TIM IE and fires an
691 * interrupt when the TIM bit is set. For hardware 698 * interrupt when the TIM bit is set. For hardware
@@ -1184,6 +1191,8 @@ void ath_deinit(struct ath_softc *sc)
1184 1191
1185 DPRINTF(sc, ATH_DBG_CONFIG, "%s\n", __func__); 1192 DPRINTF(sc, ATH_DBG_CONFIG, "%s\n", __func__);
1186 1193
1194 tasklet_kill(&sc->intr_tq);
1195 tasklet_kill(&sc->bcon_tasklet);
1187 ath_stop(sc); 1196 ath_stop(sc);
1188 if (!(sc->sc_flags & SC_OP_INVALID)) 1197 if (!(sc->sc_flags & SC_OP_INVALID))
1189 ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_AWAKE); 1198 ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_AWAKE);
diff --git a/drivers/net/wireless/ath9k/core.h b/drivers/net/wireless/ath9k/core.h
index 6ff3befe39f7..872f0c5a0b0e 100644
--- a/drivers/net/wireless/ath9k/core.h
+++ b/drivers/net/wireless/ath9k/core.h
@@ -976,7 +976,6 @@ struct ath_softc {
976 u32 sc_keymax; /* size of key cache */ 976 u32 sc_keymax; /* size of key cache */
977 DECLARE_BITMAP(sc_keymap, ATH_KEYMAX); /* key use bit map */ 977 DECLARE_BITMAP(sc_keymap, ATH_KEYMAX); /* key use bit map */
978 u8 sc_splitmic; /* split TKIP MIC keys */ 978 u8 sc_splitmic; /* split TKIP MIC keys */
979 int sc_keytype;
980 979
981 /* RX */ 980 /* RX */
982 struct list_head sc_rxbuf; 981 struct list_head sc_rxbuf;
diff --git a/drivers/net/wireless/ath9k/main.c b/drivers/net/wireless/ath9k/main.c
index 1ba18006f475..2caba4403167 100644
--- a/drivers/net/wireless/ath9k/main.c
+++ b/drivers/net/wireless/ath9k/main.c
@@ -204,8 +204,6 @@ static int ath_key_config(struct ath_softc *sc,
204 if (!ret) 204 if (!ret)
205 return -EIO; 205 return -EIO;
206 206
207 if (mac)
208 sc->sc_keytype = hk.kv_type;
209 return 0; 207 return 0;
210} 208}
211 209
@@ -1507,7 +1505,6 @@ static int ath9k_set_key(struct ieee80211_hw *hw,
1507 case DISABLE_KEY: 1505 case DISABLE_KEY:
1508 ath_key_delete(sc, key); 1506 ath_key_delete(sc, key);
1509 clear_bit(key->keyidx, sc->sc_keymap); 1507 clear_bit(key->keyidx, sc->sc_keymap);
1510 sc->sc_keytype = ATH9K_CIPHER_CLR;
1511 break; 1508 break;
1512 default: 1509 default:
1513 ret = -EINVAL; 1510 ret = -EINVAL;
@@ -1784,10 +1781,17 @@ static void ath_pci_remove(struct pci_dev *pdev)
1784{ 1781{
1785 struct ieee80211_hw *hw = pci_get_drvdata(pdev); 1782 struct ieee80211_hw *hw = pci_get_drvdata(pdev);
1786 struct ath_softc *sc = hw->priv; 1783 struct ath_softc *sc = hw->priv;
1784 enum ath9k_int status;
1787 1785
1788 if (pdev->irq) 1786 if (pdev->irq) {
1787 ath9k_hw_set_interrupts(sc->sc_ah, 0);
1788 /* clear the ISR */
1789 ath9k_hw_getisr(sc->sc_ah, &status);
1790 sc->sc_flags |= SC_OP_INVALID;
1789 free_irq(pdev->irq, sc); 1791 free_irq(pdev->irq, sc);
1792 }
1790 ath_detach(sc); 1793 ath_detach(sc);
1794
1791 pci_iounmap(pdev, sc->mem); 1795 pci_iounmap(pdev, sc->mem);
1792 pci_release_region(pdev, 0); 1796 pci_release_region(pdev, 0);
1793 pci_disable_device(pdev); 1797 pci_disable_device(pdev);
diff --git a/drivers/net/wireless/ath9k/xmit.c b/drivers/net/wireless/ath9k/xmit.c
index 3fc6641e8bf7..25929059c7dc 100644
--- a/drivers/net/wireless/ath9k/xmit.c
+++ b/drivers/net/wireless/ath9k/xmit.c
@@ -239,11 +239,11 @@ static int ath_tx_prepare(struct ath_softc *sc,
239 txctl->keyix = tx_info->control.hw_key->hw_key_idx; 239 txctl->keyix = tx_info->control.hw_key->hw_key_idx;
240 txctl->frmlen += tx_info->control.icv_len; 240 txctl->frmlen += tx_info->control.icv_len;
241 241
242 if (sc->sc_keytype == ATH9K_CIPHER_WEP) 242 if (tx_info->control.hw_key->alg == ALG_WEP)
243 txctl->keytype = ATH9K_KEY_TYPE_WEP; 243 txctl->keytype = ATH9K_KEY_TYPE_WEP;
244 else if (sc->sc_keytype == ATH9K_CIPHER_TKIP) 244 else if (tx_info->control.hw_key->alg == ALG_TKIP)
245 txctl->keytype = ATH9K_KEY_TYPE_TKIP; 245 txctl->keytype = ATH9K_KEY_TYPE_TKIP;
246 else if (sc->sc_keytype == ATH9K_CIPHER_AES_CCM) 246 else if (tx_info->control.hw_key->alg == ALG_CCMP)
247 txctl->keytype = ATH9K_KEY_TYPE_AES; 247 txctl->keytype = ATH9K_KEY_TYPE_AES;
248 } 248 }
249 249