From 5505e8f61e586902dfff2b6c5f97de054faaadfe Mon Sep 17 00:00:00 2001
From: Felix Fietkau <nbd@openwrt.org>
Date: Fri, 8 Apr 2011 12:18:43 +0000
Subject: [PATCH] ath9k: improve the rx dma stop fix, add more debugging output
 in case the issue still occurs

SVN-Revision: 26532
---
 .../mac80211/patches/300-pending_work.patch   | 45 ++++++++++---------
 .../510-ath9k_intr_mitigation_tweak.patch     |  2 +-
 2 files changed, 26 insertions(+), 21 deletions(-)

diff --git a/package/mac80211/patches/300-pending_work.patch b/package/mac80211/patches/300-pending_work.patch
index cc2b1c2be1..cf4272d92b 100644
--- a/package/mac80211/patches/300-pending_work.patch
+++ b/package/mac80211/patches/300-pending_work.patch
@@ -276,32 +276,25 @@
  
 --- a/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
- 	u32 saveDefAntenna;
- 	u32 macStaId1;
- 	u64 tsf = 0;
-+	bool reset = false;
- 	int i, r;
- 
+@@ -1249,15 +1249,6 @@ int ath9k_hw_reset(struct ath_hw *ah, st
  	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) {
- 		ath9k_hw_abortpcurecv(ah);
+-	if ((common->bus_ops->ath_bus_type != ATH_USB) && !ah->chip_fullsleep) {
+-		ath9k_hw_abortpcurecv(ah);
 -		if (!ath9k_hw_stopdmarecv(ah)) {
-+		if (!ath9k_hw_stopdmarecv(ah, &reset)) {
- 			ath_dbg(common, ATH_DBG_XMIT,
- 				"Failed to stop receive dma\n");
- 			bChannelChange = false;
- 		}
-+		if (reset)
-+			bChannelChange = false;
- 	}
- 
+-			ath_dbg(common, ATH_DBG_XMIT,
+-				"Failed to stop receive dma\n");
+-			bChannelChange = false;
+-		}
+-	}
+-
  	if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE))
+ 		return -EIO;
+ 
 --- a/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);
  
@@ -339,6 +332,18 @@
  		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
 +++ b/drivers/net/wireless/ath/ath9k/mac.h
 @@ -695,7 +695,7 @@ bool ath9k_hw_setrxabort(struct ath_hw *
diff --git a/package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch b/package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch
index 1c9c424507..c6a61224b5 100644
--- a/package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch
+++ b/package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch
@@ -1,6 +1,6 @@
 --- a/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);
  
  	if (ah->config.rx_intr_mitigation) {
-- 
2.30.2