ath9k: improve the rx dma stop fix, add more debugging output in case the issue still occurs

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@26532 3c298f89-4303-0410-b956-a3cf2f4a3e73
master
Felix Fietkau 2011-04-08 12:18:43 +00:00
parent 91c6b16bed
commit 7ab0bc008c
2 changed files with 26 additions and 21 deletions

View File

@ -276,32 +276,25 @@
--- a/drivers/net/wireless/ath/ath9k/hw.c --- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -1244,6 +1244,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st @@ -1249,15 +1249,6 @@ int ath9k_hw_reset(struct ath_hw *ah, st
u32 saveDefAntenna;
u32 macStaId1;
u64 tsf = 0;
+ bool reset = false;
int i, r;
ah->txchainmask = common->tx_chainmask; ah->txchainmask = common->tx_chainmask;
@@ -1251,11 +1252,13 @@ int ath9k_hw_reset(struct ath_hw *ah, st ah->rxchainmask = common->rx_chainmask;
if ((common->bus_ops->ath_bus_type != ATH_USB) && !ah->chip_fullsleep) { - if ((common->bus_ops->ath_bus_type != ATH_USB) && !ah->chip_fullsleep) {
ath9k_hw_abortpcurecv(ah); - ath9k_hw_abortpcurecv(ah);
- if (!ath9k_hw_stopdmarecv(ah)) { - if (!ath9k_hw_stopdmarecv(ah)) {
+ if (!ath9k_hw_stopdmarecv(ah, &reset)) { - ath_dbg(common, ATH_DBG_XMIT,
ath_dbg(common, ATH_DBG_XMIT, - "Failed to stop receive dma\n");
"Failed to stop receive dma\n"); - bChannelChange = false;
bChannelChange = false; - }
} - }
+ if (reset) -
+ bChannelChange = false;
}
if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE)) if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE))
return -EIO;
--- a/drivers/net/wireless/ath/ath9k/mac.c --- a/drivers/net/wireless/ath/ath9k/mac.c
+++ b/drivers/net/wireless/ath/ath9k/mac.c +++ b/drivers/net/wireless/ath/ath9k/mac.c
@@ -710,18 +710,36 @@ void ath9k_hw_abortpcurecv(struct ath_hw @@ -710,27 +710,46 @@ void ath9k_hw_abortpcurecv(struct ath_hw
} }
EXPORT_SYMBOL(ath9k_hw_abortpcurecv); EXPORT_SYMBOL(ath9k_hw_abortpcurecv);
@ -339,6 +332,18 @@
udelay(AH_TIME_QUANTUM); udelay(AH_TIME_QUANTUM);
} }
if (i == 0) {
ath_err(common,
- "DMA failed to stop in %d ms AR_CR=0x%08x AR_DIAG_SW=0x%08x\n",
+ "DMA failed to stop in %d ms AR_CR=0x%08x AR_DIAG_SW=0x%08x DMADBG_7=0x%08x\n",
AH_RX_STOP_DMA_TIMEOUT / 1000,
REG_READ(ah, AR_CR),
- REG_READ(ah, AR_DIAG_SW));
+ REG_READ(ah, AR_DIAG_SW),
+ REG_READ(ah, AR_DMADBG_7));
return false;
} else {
return true;
--- a/drivers/net/wireless/ath/ath9k/mac.h --- a/drivers/net/wireless/ath/ath9k/mac.h
+++ b/drivers/net/wireless/ath/ath9k/mac.h +++ b/drivers/net/wireless/ath/ath9k/mac.h
@@ -695,7 +695,7 @@ bool ath9k_hw_setrxabort(struct ath_hw * @@ -695,7 +695,7 @@ bool ath9k_hw_setrxabort(struct ath_hw *

View File

@ -1,6 +1,6 @@
--- a/drivers/net/wireless/ath/ath9k/hw.c --- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -1449,8 +1449,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st @@ -1437,8 +1437,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st
REG_WRITE(ah, AR_OBS, 8); REG_WRITE(ah, AR_OBS, 8);
if (ah->config.rx_intr_mitigation) { if (ah->config.rx_intr_mitigation) {