ath9k: improve the rx dma stop fix, add more debugging output in case the issue still...
authorFelix Fietkau <nbd@openwrt.org>
Fri, 8 Apr 2011 12:18:43 +0000 (12:18 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Fri, 8 Apr 2011 12:18:43 +0000 (12:18 +0000)
SVN-Revision: 26532

package/mac80211/patches/300-pending_work.patch
package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch

index cc2b1c2..cf4272d 100644 (file)
  
 --- 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);
  
                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 *
index 1c9c424..c6a6122 100644 (file)
@@ -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) {