From 913ca8200ac4ec8e642acfab1929c0946dab8be3 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Tue, 2 Jun 2015 08:47:21 +0000 Subject: [PATCH] ath9k: fix an issue with stopping rx/tx dma on AR93xx Signed-off-by: Felix Fietkau SVN-Revision: 45874 --- ...h9k-fix-DMA-stop-sequence-for-AR9003.patch | 33 +++++++++++++++++++ .../patches/542-ath9k_debugfs_diag.patch | 2 +- 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 package/kernel/mac80211/patches/379-ath9k-fix-DMA-stop-sequence-for-AR9003.patch diff --git a/package/kernel/mac80211/patches/379-ath9k-fix-DMA-stop-sequence-for-AR9003.patch b/package/kernel/mac80211/patches/379-ath9k-fix-DMA-stop-sequence-for-AR9003.patch new file mode 100644 index 0000000000..814b0d7a4a --- /dev/null +++ b/package/kernel/mac80211/patches/379-ath9k-fix-DMA-stop-sequence-for-AR9003.patch @@ -0,0 +1,33 @@ +From: Felix Fietkau +Date: Tue, 2 Jun 2015 10:35:46 +0200 +Subject: [PATCH] ath9k: fix DMA stop sequence for AR9003+ + +AR93xx and newer needs to stop rx before tx to avoid getting the DMA +engine or MAC into a stuck state. +This should reduce/fix the occurence of "Failed to stop Tx DMA" logspam. + +Cc: stable@vger.kernel.org +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/wireless/ath/ath9k/main.c ++++ b/drivers/net/wireless/ath/ath9k/main.c +@@ -216,11 +216,13 @@ static bool ath_prepare_reset(struct ath + ath_stop_ani(sc); + ath9k_hw_disable_interrupts(ah); + +- if (!ath_drain_all_txq(sc)) +- ret = false; +- +- if (!ath_stoprecv(sc)) +- ret = false; ++ if (AR_SREV_9300_20_OR_LATER(ah)) { ++ ret &= ath_stoprecv(sc); ++ ret &= ath_drain_all_txq(sc); ++ } else { ++ ret &= ath_drain_all_txq(sc); ++ ret &= ath_stoprecv(sc); ++ } + + return ret; + } diff --git a/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch b/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch index 5264da018a..2803af49f3 100644 --- a/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch +++ b/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch @@ -125,7 +125,7 @@ REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON); --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c -@@ -531,6 +531,11 @@ irqreturn_t ath_isr(int irq, void *dev) +@@ -533,6 +533,11 @@ irqreturn_t ath_isr(int irq, void *dev) if (test_bit(ATH_OP_HW_RESET, &common->op_flags)) return IRQ_HANDLED;