2019-02-13 18:47:18 +00:00
|
|
|
From f6a9618198e190a2ba09ce3f0aa8e9ee1763bd38 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
|
|
|
Date: Sat, 9 Feb 2019 12:08:34 +0100
|
2019-03-01 02:34:40 +00:00
|
|
|
X-Patchwork-Submitter: Stanislaw Gruszka <sgruszka@redhat.com>
|
|
|
|
X-Patchwork-Id: 10804443
|
|
|
|
X-Patchwork-Delegate: kvalo@adurom.com
|
2019-02-13 18:47:18 +00:00
|
|
|
Subject: [PATCH 24/28] rt2800mmio: fetch tx status changes
|
|
|
|
|
|
|
|
Prepare to use rt2800mmio_fetch_txstatus() in concurrent manner and drop
|
|
|
|
return value since is not longer needed.
|
|
|
|
|
|
|
|
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
|
|
|
---
|
|
|
|
drivers/net/wireless/ralink/rt2x00/rt2800mmio.c | 17 +++++++++--------
|
|
|
|
1 file changed, 9 insertions(+), 8 deletions(-)
|
|
|
|
|
|
|
|
--- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
|
|
|
|
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
|
|
|
|
@@ -255,12 +255,12 @@ void rt2800mmio_autowake_tasklet(unsigne
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(rt2800mmio_autowake_tasklet);
|
|
|
|
|
|
|
|
-static bool rt2800mmio_fetch_txstatus(struct rt2x00_dev *rt2x00dev)
|
|
|
|
+static void rt2800mmio_fetch_txstatus(struct rt2x00_dev *rt2x00dev)
|
|
|
|
{
|
|
|
|
u32 status;
|
|
|
|
- bool more = false;
|
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
|
|
- /* FIXEME: rewrite this comment
|
|
|
|
+ /*
|
|
|
|
* The TX_FIFO_STATUS interrupt needs special care. We should
|
|
|
|
* read TX_STA_FIFO but we should do it immediately as otherwise
|
|
|
|
* the register can overflow and we would lose status reports.
|
|
|
|
@@ -271,20 +271,21 @@ static bool rt2800mmio_fetch_txstatus(st
|
|
|
|
* because we can schedule the tasklet multiple times (when the
|
|
|
|
* interrupt fires again during tx status processing).
|
|
|
|
*
|
|
|
|
- * txstatus tasklet is called with INT_SOURCE_CSR_TX_FIFO_STATUS
|
|
|
|
- * disabled so have only one producer and one consumer - we don't
|
|
|
|
- * need to lock the kfifo.
|
|
|
|
+ * We also read statuses from tx status timeout timer, use
|
|
|
|
+ * lock to prevent concurent writes to fifo.
|
|
|
|
*/
|
|
|
|
+
|
|
|
|
+ spin_lock_irqsave(&rt2x00dev->irqmask_lock, flags);
|
|
|
|
+
|
|
|
|
while (!kfifo_is_full(&rt2x00dev->txstatus_fifo)) {
|
|
|
|
status = rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO);
|
|
|
|
if (!rt2x00_get_field32(status, TX_STA_FIFO_VALID))
|
|
|
|
break;
|
|
|
|
|
|
|
|
kfifo_put(&rt2x00dev->txstatus_fifo, status);
|
|
|
|
- more = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
- return more;
|
|
|
|
+ spin_unlock_irqrestore(&rt2x00dev->irqmask_lock, flags);
|
|
|
|
}
|
|
|
|
|
|
|
|
void rt2800mmio_txstatus_tasklet(unsigned long data)
|