diff options
author | Mohammed Shafi Shajakhan <mshajakhan@atheros.com> | 2010-12-22 12:20:12 +0530 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-12-22 15:44:22 -0500 |
commit | db7ec38d8e99f449856c11ffaef363a8eb5af90f (patch) | |
tree | 41f0833fff19d7e7127a0cc795cedc9f465f8208 /drivers/net/wireless/ath/ath9k/pci.c | |
parent | e6d8a817d00793eecd063b1548bbc954ab62b124 (diff) | |
download | linux-3.10-db7ec38d8e99f449856c11ffaef363a8eb5af90f.tar.gz linux-3.10-db7ec38d8e99f449856c11ffaef363a8eb5af90f.tar.bz2 linux-3.10-db7ec38d8e99f449856c11ffaef363a8eb5af90f.zip |
ath9k: Reset keycache on resume
It looks like some hardware registers are left into undefined state
after suspend/resume. At minimum, this can cause odd issues related to
key cache and hardware trying to encrypt/decrypt frames unexpectedly.
This seems to happen even when there is no keys configured, i.e., hardware
can end up touching TX frames just based of invalid key cache context
even if the driver is not asking a specific entry to be used. In
addition, RX can likely be affected. This patch fixes this issue.
Signed-off-by: Jouni Malinen <Jouni.Malinen@Atheros.com>
Signed-off-by: Mohammed Shafi Shajakhan <mshajakhan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/pci.c')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/pci.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/ath9k/pci.c b/drivers/net/wireless/ath/ath9k/pci.c index 545aa1c650c..78ef1f13386 100644 --- a/drivers/net/wireless/ath/ath9k/pci.c +++ b/drivers/net/wireless/ath/ath9k/pci.c @@ -311,6 +311,14 @@ static int ath_pci_resume(struct device *device) AR_GPIO_OUTPUT_MUX_AS_OUTPUT); ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 1); + /* + * Reset key cache to sane defaults (all entries cleared) instead of + * semi-random values after suspend/resume. + */ + ath9k_ps_wakeup(sc); + ath9k_init_crypto(sc); + ath9k_ps_restore(sc); + sc->ps_idle = true; ath9k_set_wiphy_idle(aphy, true); ath_radio_disable(sc, hw); |