89 lines
2.8 KiB
Diff
89 lines
2.8 KiB
Diff
|
From 56646adf9cd60b488ddc5633a2d9aa1f30efa5db Mon Sep 17 00:00:00 2001
|
||
|
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
||
|
Date: Wed, 15 Feb 2017 10:25:07 +0100
|
||
|
Subject: [PATCH 11/19] rt2x00: separte clearing entry from rt2x00lib_txdone
|
||
|
|
||
|
This makes rt2x00lib_txdone a bit simpler and will allow to reuse
|
||
|
code in different variant of txdone which I'm preparing.
|
||
|
|
||
|
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||
|
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||
|
---
|
||
|
drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | 51 +++++++++++++++-----------
|
||
|
1 file changed, 29 insertions(+), 22 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||
|
index b5d90fefc96b..03b368ac9cb6 100644
|
||
|
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||
|
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||
|
@@ -391,6 +391,32 @@ static void rt2x00lib_fill_tx_status(struct rt2x00_dev *rt2x00dev,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
+static void rt2x00lib_clear_entry(struct rt2x00_dev *rt2x00dev,
|
||
|
+ struct queue_entry *entry)
|
||
|
+{
|
||
|
+ /*
|
||
|
+ * Make this entry available for reuse.
|
||
|
+ */
|
||
|
+ entry->skb = NULL;
|
||
|
+ entry->flags = 0;
|
||
|
+
|
||
|
+ rt2x00dev->ops->lib->clear_entry(entry);
|
||
|
+
|
||
|
+ rt2x00queue_index_inc(entry, Q_INDEX_DONE);
|
||
|
+
|
||
|
+ /*
|
||
|
+ * If the data queue was below the threshold before the txdone
|
||
|
+ * handler we must make sure the packet queue in the mac80211 stack
|
||
|
+ * is reenabled when the txdone handler has finished. This has to be
|
||
|
+ * serialized with rt2x00mac_tx(), otherwise we can wake up queue
|
||
|
+ * before it was stopped.
|
||
|
+ */
|
||
|
+ spin_lock_bh(&entry->queue->tx_lock);
|
||
|
+ if (!rt2x00queue_threshold(entry->queue))
|
||
|
+ rt2x00queue_unpause_queue(entry->queue);
|
||
|
+ spin_unlock_bh(&entry->queue->tx_lock);
|
||
|
+}
|
||
|
+
|
||
|
void rt2x00lib_txdone(struct queue_entry *entry,
|
||
|
struct txdone_entry_desc *txdesc)
|
||
|
{
|
||
|
@@ -471,30 +497,11 @@ void rt2x00lib_txdone(struct queue_entry *entry,
|
||
|
ieee80211_tx_status(rt2x00dev->hw, entry->skb);
|
||
|
else
|
||
|
ieee80211_tx_status_ni(rt2x00dev->hw, entry->skb);
|
||
|
- } else
|
||
|
+ } else {
|
||
|
dev_kfree_skb_any(entry->skb);
|
||
|
+ }
|
||
|
|
||
|
- /*
|
||
|
- * Make this entry available for reuse.
|
||
|
- */
|
||
|
- entry->skb = NULL;
|
||
|
- entry->flags = 0;
|
||
|
-
|
||
|
- rt2x00dev->ops->lib->clear_entry(entry);
|
||
|
-
|
||
|
- rt2x00queue_index_inc(entry, Q_INDEX_DONE);
|
||
|
-
|
||
|
- /*
|
||
|
- * If the data queue was below the threshold before the txdone
|
||
|
- * handler we must make sure the packet queue in the mac80211 stack
|
||
|
- * is reenabled when the txdone handler has finished. This has to be
|
||
|
- * serialized with rt2x00mac_tx(), otherwise we can wake up queue
|
||
|
- * before it was stopped.
|
||
|
- */
|
||
|
- spin_lock_bh(&entry->queue->tx_lock);
|
||
|
- if (!rt2x00queue_threshold(entry->queue))
|
||
|
- rt2x00queue_unpause_queue(entry->queue);
|
||
|
- spin_unlock_bh(&entry->queue->tx_lock);
|
||
|
+ rt2x00lib_clear_entry(rt2x00dev, entry);
|
||
|
}
|
||
|
EXPORT_SYMBOL_GPL(rt2x00lib_txdone);
|
||
|
|
||
|
--
|
||
|
2.12.1
|
||
|
|