2015-07-02 11:45:08 +00:00
|
|
|
From: Felix Fietkau <nbd@openwrt.org>
|
|
|
|
Date: Thu, 2 Jul 2015 13:35:05 +0200
|
|
|
|
Subject: [PATCH] ath9k: make DMA stop related messages debug-only
|
|
|
|
|
|
|
|
A long time ago, ath9k had issues during reset where the DMA engine
|
|
|
|
would stay active and could potentially corrupt memory.
|
|
|
|
To debug those issues, the driver would print warnings whenever they
|
|
|
|
occur.
|
|
|
|
|
|
|
|
Nowadays, these issues are gone and the primary cause of these messages
|
|
|
|
is if the MAC is stuck during reset or busy processing a long
|
|
|
|
transmission. This is fairly harmless, yet these messages continue to
|
|
|
|
worry users.
|
|
|
|
|
|
|
|
To reduce the number of bogus bug reports, turn these messages into
|
|
|
|
debug messages and count their occurence in the "reset" debugfs file.
|
|
|
|
|
|
|
|
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
|
|
|
---
|
|
|
|
|
|
|
|
--- a/drivers/net/wireless/ath/ath9k/debug.c
|
|
|
|
+++ b/drivers/net/wireless/ath/ath9k/debug.c
|
|
|
|
@@ -765,6 +765,8 @@ static int read_file_reset(struct seq_fi
|
|
|
|
[RESET_TYPE_BEACON_STUCK] = "Stuck Beacon",
|
|
|
|
[RESET_TYPE_MCI] = "MCI Reset",
|
|
|
|
[RESET_TYPE_CALIBRATION] = "Calibration error",
|
|
|
|
+ [RESET_TX_DMA_ERROR] = "Tx DMA stop error",
|
|
|
|
+ [RESET_RX_DMA_ERROR] = "Rx DMA stop error",
|
|
|
|
};
|
|
|
|
int i;
|
|
|
|
|
|
|
|
--- a/drivers/net/wireless/ath/ath9k/debug.h
|
|
|
|
+++ b/drivers/net/wireless/ath/ath9k/debug.h
|
|
|
|
@@ -50,6 +50,8 @@ enum ath_reset_type {
|
|
|
|
RESET_TYPE_BEACON_STUCK,
|
|
|
|
RESET_TYPE_MCI,
|
|
|
|
RESET_TYPE_CALIBRATION,
|
|
|
|
+ RESET_TX_DMA_ERROR,
|
|
|
|
+ RESET_RX_DMA_ERROR,
|
|
|
|
__RESET_TYPE_MAX
|
|
|
|
};
|
|
|
|
|
|
|
|
--- a/drivers/net/wireless/ath/ath9k/recv.c
|
|
|
|
+++ b/drivers/net/wireless/ath/ath9k/recv.c
|
2015-07-06 16:26:34 +00:00
|
|
|
@@ -491,10 +491,9 @@ bool ath_stoprecv(struct ath_softc *sc)
|
2015-07-02 11:45:08 +00:00
|
|
|
|
|
|
|
if (!(ah->ah_flags & AH_UNPLUGGED) &&
|
|
|
|
unlikely(!stopped)) {
|
|
|
|
- ath_err(ath9k_hw_common(sc->sc_ah),
|
|
|
|
- "Could not stop RX, we could be "
|
|
|
|
- "confusing the DMA engine when we start RX up\n");
|
|
|
|
- ATH_DBG_WARN_ON_ONCE(!stopped);
|
|
|
|
+ ath_dbg(ath9k_hw_common(sc->sc_ah), RESET,
|
|
|
|
+ "Failed to stop Rx DMA\n");
|
|
|
|
+ RESET_STAT_INC(sc, RESET_RX_DMA_ERROR);
|
|
|
|
}
|
|
|
|
return stopped && !reset;
|
|
|
|
}
|
|
|
|
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
|
|
|
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
2015-07-06 16:26:34 +00:00
|
|
|
@@ -1883,8 +1883,11 @@ bool ath_drain_all_txq(struct ath_softc
|
2015-07-02 11:45:08 +00:00
|
|
|
npend |= BIT(i);
|
|
|
|
}
|
|
|
|
|
|
|
|
- if (npend)
|
|
|
|
- ath_err(common, "Failed to stop TX DMA, queues=0x%03x!\n", npend);
|
|
|
|
+ if (npend) {
|
|
|
|
+ RESET_STAT_INC(sc, RESET_TX_DMA_ERROR);
|
|
|
|
+ ath_dbg(common, RESET,
|
|
|
|
+ "Failed to stop TX DMA, queues=0x%03x!\n", npend);
|
|
|
|
+ }
|
|
|
|
|
|
|
|
for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
|
|
|
|
if (!ATH_TXQ_SETUP(sc, i))
|