From: Daniel Golle <daniel@makrotopia.org>
To: linux-wireless@vger.kernel.org
Cc: Johannes Berg <johannes@sipsolutions.net>,
Stanislaw Gruszka <sgruszka@redhat.com>,
roman@advem.lv, michel.stempin@wanadoo.fr, c.mignanti@gmail.com,
evaxige@qq.com, Kalle Valo <kvalo@codeaurora.org>,
Felix Fietkau <nbd@nbd.name>, John Crispin <john@phrozen.org>,
Gabor Juhos <juhosg@openwrt.org>
Subject: [PATCH v2 08/14] rt2x00: rt2800mmio: add a workaround for spurious TX_FIFO_STATUS interrupts
Date: Mon, 16 Jan 2017 04:05:47 +0100 [thread overview]
Message-ID: <20170116030535.GA32238@makrotopia.org> (raw)
In-Reply-To: <874m114lwq.fsf@codeaurora.org>
From: Gabor Juhos <juhosg@openwrt.org>
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
---
drivers/net/wireless/ralink/rt2x00/rt2800mmio.c | 72 ++++++++++++++++++++-----
drivers/net/wireless/ralink/rt2x00/rt2x00.h | 5 ++
2 files changed, 65 insertions(+), 12 deletions(-)
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
index 5f1936aa8fa7..750a9425b5be 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
@@ -415,9 +415,9 @@ void rt2800mmio_autowake_tasklet(unsigned long data)
}
EXPORT_SYMBOL_GPL(rt2800mmio_autowake_tasklet);
-static void rt2800mmio_txstatus_interrupt(struct rt2x00_dev *rt2x00dev)
+static void rt2800mmio_txstatus_interrupt(struct rt2x00_dev *rt2x00dev,
+ u32 status)
{
- u32 status;
int i;
/*
@@ -438,29 +438,77 @@ static void rt2800mmio_txstatus_interrupt(struct rt2x00_dev *rt2x00dev)
* Since we have only one producer and one consumer we don't
* need to lock the kfifo.
*/
- for (i = 0; i < rt2x00dev->tx->limit; i++) {
- rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO, &status);
-
- if (!rt2x00_get_field32(status, TX_STA_FIFO_VALID))
- break;
-
+ i = 0;
+ do {
if (!kfifo_put(&rt2x00dev->txstatus_fifo, status)) {
- rt2x00_warn(rt2x00dev, "TX status FIFO overrun, drop tx status report\n");
+ rt2x00_warn(rt2x00dev,
+ "TX status FIFO overrun, drop TX status report\n");
break;
}
- }
+
+ if (++i >= rt2x00dev->tx->limit)
+ break;
+
+ rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO, &status);
+ } while (rt2x00_get_field32(status, TX_STA_FIFO_VALID));
/* Schedule the tasklet for processing the tx status. */
tasklet_schedule(&rt2x00dev->txstatus_tasklet);
}
+#define RT2800MMIO_TXSTATUS_IRQ_MAX_RETRIES 4
+
+static bool rt2800mmio_txstatus_is_spurious(struct rt2x00_dev *rt2x00dev,
+ u32 txstatus)
+{
+ if (likely(rt2x00_get_field32(txstatus, TX_STA_FIFO_VALID))) {
+ rt2x00dev->txstatus_irq_retries = 0;
+ return false;
+ }
+
+ rt2x00dev->txstatus_irq_retries++;
+
+ /* Ensure that we don't go into an infinite IRQ loop. */
+ if (rt2x00dev->txstatus_irq_retries >=
+ RT2800MMIO_TXSTATUS_IRQ_MAX_RETRIES) {
+ rt2x00_warn(rt2x00dev,
+ "%u spurious TX_FIFO_STATUS interrupt(s)\n",
+ rt2x00dev->txstatus_irq_retries);
+ rt2x00dev->txstatus_irq_retries = 0;
+ return false;
+ }
+
+ return true;
+}
+
irqreturn_t rt2800mmio_interrupt(int irq, void *dev_instance)
{
struct rt2x00_dev *rt2x00dev = dev_instance;
u32 reg, mask;
+ u32 txstatus = 0;
- /* Read status and ACK all interrupts */
+ /* Read status */
rt2x00mmio_register_read(rt2x00dev, INT_SOURCE_CSR, ®);
+
+ if (rt2x00_get_field32(reg, INT_SOURCE_CSR_TX_FIFO_STATUS)) {
+ /* Due to unknown reason the hardware generates a
+ * TX_FIFO_STATUS interrupt before the TX_STA_FIFO
+ * register contain valid data. Read the TX status
+ * here to see if we have to process the actual
+ * request.
+ */
+ rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO, &txstatus);
+ if (rt2800mmio_txstatus_is_spurious(rt2x00dev, txstatus)) {
+ /* Remove the TX_FIFO_STATUS bit so it won't be
+ * processed in this turn. The hardware will
+ * generate another IRQ for us.
+ */
+ rt2x00_set_field32(®,
+ INT_SOURCE_CSR_TX_FIFO_STATUS, 0);
+ }
+ }
+
+ /* ACK interrupts */
rt2x00mmio_register_write(rt2x00dev, INT_SOURCE_CSR, reg);
if (!reg)
@@ -477,7 +525,7 @@ irqreturn_t rt2800mmio_interrupt(int irq, void *dev_instance)
mask = ~reg;
if (rt2x00_get_field32(reg, INT_SOURCE_CSR_TX_FIFO_STATUS)) {
- rt2800mmio_txstatus_interrupt(rt2x00dev);
+ rt2800mmio_txstatus_interrupt(rt2x00dev, txstatus);
/*
* Never disable the TX_FIFO_STATUS interrupt.
*/
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00.h b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
index 034a07273038..c27408b494ef 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
@@ -995,6 +995,11 @@ struct rt2x00_dev {
int rf_channel;
/*
+ * Counter for tx status irq retries (rt2800pci).
+ */
+ unsigned int txstatus_irq_retries;
+
+ /*
* Protect the interrupt mask register.
*/
spinlock_t irqmask_lock;
--
2.11.0
next prev parent reply other threads:[~2017-01-16 3:06 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-13 21:20 [PATCH 04/40] rt2x00: rt2800lib: fix beacon generation on RT3593 Daniel Golle
2017-01-14 17:00 ` Kalle Valo
2017-01-16 2:53 ` [PATCH v2 00/14] rt2x00 patches from OpenWrt.org Daniel Golle
2017-01-16 2:55 ` [PATCH v2 01/14] rt2x00: rt2800lib: move rt2800_drv_data declaration into rt2800lib.h Daniel Golle
2017-01-28 8:48 ` [v2, " Kalle Valo
2017-01-16 2:55 ` [PATCH v2 02/14] rt2x00: rt2800lib: introduce RT2800_HAS_HIGH_SHARED_MEM flag Daniel Golle
2017-01-16 2:58 ` [PATCH v2 03/14] rt2x00: rt2800: serialize shared memory access Daniel Golle
2017-01-16 3:01 ` [PATCH v2 04/14] rt2x00: rt2800lib: fix beacon generation on RT3593 Daniel Golle
2017-01-16 10:04 ` Stanislaw Gruszka
2017-01-16 3:02 ` [PATCH v2 05/14] rt2x00: rt2800lib: add hw_beacon_count field to struct rt2800_drv_data Daniel Golle
2017-01-16 3:03 ` [PATCH v2 06/14] rt2x00: rt2800lib: init additional beacon offset registers Daniel Golle
2017-01-16 3:03 ` [PATCH v2 07/14] rt2x00: rt2800lib: fix max supported beacon count for RT3593 Daniel Golle
2017-01-16 3:05 ` Daniel Golle [this message]
2017-01-18 14:44 ` [PATCH v2 08/14] rt2x00: rt2800mmio: add a workaround for spurious TX_FIFO_STATUS interrupts Stanislaw Gruszka
2017-01-18 15:13 ` Stanislaw Gruszka
2017-01-16 3:06 ` [PATCH v2 09/14] rt2x00: rt2x00pci: set PCI MWI only if supported Daniel Golle
2017-01-16 10:08 ` Stanislaw Gruszka
2017-01-17 1:56 ` Daniel Golle
2017-01-17 7:34 ` John Crispin
2017-01-16 3:08 ` [PATCH v2 10/14] rt2x00: rt2800lib: correctly set HT20/HT40 filter Daniel Golle
2017-01-16 10:12 ` Stanislaw Gruszka
2017-01-19 12:49 ` [v2,10/14] " Kalle Valo
2017-01-16 3:13 ` [PATCH v2 11/14] rt2x00: rt2800lib: fix rf id for RT3352 Daniel Golle
2017-01-16 10:12 ` Stanislaw Gruszka
2017-01-16 3:14 ` [PATCH v2 12/14] rt2x00: rt2800lib: support for for RT3352 with external PA Daniel Golle
2017-01-16 10:14 ` Stanislaw Gruszka
2017-01-16 3:15 ` [PATCH v2 13/14] rt2x00: rt2800lib: add support for RT3352 with 20MHz crystal Daniel Golle
2017-01-18 14:30 ` Stanislaw Gruszka
2017-01-19 13:30 ` Daniel Golle
2017-01-19 13:30 ` Daniel Golle
2017-01-19 13:30 ` Daniel Golle
2017-01-19 20:52 ` Daniel Golle
2017-01-19 23:42 ` [PATCH v3] " Daniel Golle
2017-01-20 13:16 ` Stanislaw Gruszka
2017-01-16 3:17 ` [PATCH v2 14/14] rt2x00: add support for RT5350 WiSoC Daniel Golle
2017-01-16 10:17 ` Stanislaw Gruszka
2017-01-17 1:48 ` Daniel Golle
2017-01-18 14:47 ` Stanislaw Gruszka
2017-01-19 13:38 ` [PATCH v3] " Daniel Golle
2017-01-19 19:08 ` Kalle Valo
2017-01-19 20:37 ` Daniel Golle
2017-01-20 2:21 ` kbuild test robot
2017-01-20 13:19 ` Stanislaw Gruszka
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170116030535.GA32238@makrotopia.org \
--to=daniel@makrotopia.org \
--cc=c.mignanti@gmail.com \
--cc=evaxige@qq.com \
--cc=johannes@sipsolutions.net \
--cc=john@phrozen.org \
--cc=juhosg@openwrt.org \
--cc=kvalo@codeaurora.org \
--cc=linux-wireless@vger.kernel.org \
--cc=michel.stempin@wanadoo.fr \
--cc=nbd@nbd.name \
--cc=roman@advem.lv \
--cc=sgruszka@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.