aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ralink
diff options
context:
space:
mode:
authorStanislaw Gruszka <sgruszka@redhat.com>2018-04-30 09:19:17 -0400
committerKalle Valo <kvalo@codeaurora.org>2018-05-04 08:34:20 -0400
commit811a3991510735566b66069fdd4ce3ce33a2ec18 (patch)
tree1431ea28c03e0d6460ab19247f2a5f5c3deab492 /drivers/net/wireless/ralink
parent9c87758cf0893d6d3b51aac34546807b138cb3e7 (diff)
rt2x00: check against flushing empty queue
We have check if queue is not empty when start flushing queues on by mac80211 callback, but we also can start flushing queues by internal driver calls. So move check into rt2x00queue_flush_queue() to assure we do not flush empty queue anytime. Additionally add warning if we start to kick empty queue as in such situation we set wrong index in the HW queue, what can confuse the HW and have various negative consequences. Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Diffstat (limited to 'drivers/net/wireless/ralink')
-rw-r--r--drivers/net/wireless/ralink/rt2x00/rt2800mmio.c1
-rw-r--r--drivers/net/wireless/ralink/rt2x00/rt2x00mac.c3
-rw-r--r--drivers/net/wireless/ralink/rt2x00/rt2x00queue.c2
3 files changed, 4 insertions, 2 deletions
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
index 1123e2bed803..e1a7ed7e4892 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
@@ -600,6 +600,7 @@ void rt2800mmio_kick_queue(struct data_queue *queue)
600 case QID_AC_VI: 600 case QID_AC_VI:
601 case QID_AC_BE: 601 case QID_AC_BE:
602 case QID_AC_BK: 602 case QID_AC_BK:
603 WARN_ON_ONCE(rt2x00queue_empty(queue));
603 entry = rt2x00queue_get_entry(queue, Q_INDEX); 604 entry = rt2x00queue_get_entry(queue, Q_INDEX);
604 rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX(queue->qid), 605 rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX(queue->qid),
605 entry->entry_idx); 606 entry->entry_idx);
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c b/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c
index a971bc7a6b63..c380c1f56ba6 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c
@@ -739,8 +739,7 @@ void rt2x00mac_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
739 return; 739 return;
740 740
741 tx_queue_for_each(rt2x00dev, queue) 741 tx_queue_for_each(rt2x00dev, queue)
742 if (!rt2x00queue_empty(queue)) 742 rt2x00queue_flush_queue(queue, drop);
743 rt2x00queue_flush_queue(queue, drop);
744} 743}
745EXPORT_SYMBOL_GPL(rt2x00mac_flush); 744EXPORT_SYMBOL_GPL(rt2x00mac_flush);
746 745
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
index a6884e73d2ab..7c1f8f561d4a 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
@@ -1000,6 +1000,8 @@ void rt2x00queue_flush_queue(struct data_queue *queue, bool drop)
1000 (queue->qid == QID_AC_BE) || 1000 (queue->qid == QID_AC_BE) ||
1001 (queue->qid == QID_AC_BK); 1001 (queue->qid == QID_AC_BK);
1002 1002
1003 if (rt2x00queue_empty(queue))
1004 return;
1003 1005
1004 /* 1006 /*
1005 * If we are not supposed to drop any pending 1007 * If we are not supposed to drop any pending