提交 db7ec38d 编写于 作者: M Mohammed Shafi Shajakhan 提交者: John W. Linville

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: NJouni Malinen <Jouni.Malinen@Atheros.com>
Signed-off-by: NMohammed Shafi Shajakhan <mshajakhan@atheros.com>
Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
上级 e6d8a817
...@@ -670,6 +670,7 @@ extern int ath9k_pm_qos_value; ...@@ -670,6 +670,7 @@ extern int ath9k_pm_qos_value;
extern bool is_ath9k_unloaded; extern bool is_ath9k_unloaded;
irqreturn_t ath_isr(int irq, void *dev); irqreturn_t ath_isr(int irq, void *dev);
void ath9k_init_crypto(struct ath_softc *sc);
int ath9k_init_device(u16 devid, struct ath_softc *sc, u16 subsysid, int ath9k_init_device(u16 devid, struct ath_softc *sc, u16 subsysid,
const struct ath_bus_ops *bus_ops); const struct ath_bus_ops *bus_ops);
void ath9k_deinit_device(struct ath_softc *sc); void ath9k_deinit_device(struct ath_softc *sc);
......
...@@ -373,7 +373,7 @@ int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd, ...@@ -373,7 +373,7 @@ int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd,
#undef DS2PHYS #undef DS2PHYS
} }
static void ath9k_init_crypto(struct ath_softc *sc) void ath9k_init_crypto(struct ath_softc *sc)
{ {
struct ath_common *common = ath9k_hw_common(sc->sc_ah); struct ath_common *common = ath9k_hw_common(sc->sc_ah);
int i = 0; int i = 0;
......
...@@ -311,6 +311,14 @@ static int ath_pci_resume(struct device *device) ...@@ -311,6 +311,14 @@ static int ath_pci_resume(struct device *device)
AR_GPIO_OUTPUT_MUX_AS_OUTPUT); AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 1); 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; sc->ps_idle = true;
ath9k_set_wiphy_idle(aphy, true); ath9k_set_wiphy_idle(aphy, true);
ath_radio_disable(sc, hw); ath_radio_disable(sc, hw);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册