Browse Source

mt76: only stop tx queues on offchannel, not during the entire scan

During scans, mac80211 frequently switches back to the home channel to
minimize interruption of ongoing traffic. Keep regular tx queues active
during that time.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Felix Fietkau 7 years ago
parent
commit
89bc67e3a9

+ 5 - 0
drivers/net/wireless/mediatek/mt76/mac80211.c

@@ -366,6 +366,11 @@ void mt76_set_channel(struct mt76_dev *dev)
 	struct mt76_channel_state *state;
 	struct mt76_channel_state *state;
 	bool offchannel = hw->conf.flags & IEEE80211_CONF_OFFCHANNEL;
 	bool offchannel = hw->conf.flags & IEEE80211_CONF_OFFCHANNEL;
 
 
+	if (offchannel)
+		set_bit(MT76_OFFCHANNEL, &dev->state);
+	else
+		clear_bit(MT76_OFFCHANNEL, &dev->state);
+
 	if (dev->drv->update_survey)
 	if (dev->drv->update_survey)
 		dev->drv->update_survey(dev);
 		dev->drv->update_survey(dev);
 
 

+ 1 - 0
drivers/net/wireless/mediatek/mt76/mt76.h

@@ -189,6 +189,7 @@ enum {
 	MT76_STATE_RUNNING,
 	MT76_STATE_RUNNING,
 	MT76_SCANNING,
 	MT76_SCANNING,
 	MT76_RESET,
 	MT76_RESET,
+	MT76_OFFCHANNEL,
 };
 };
 
 
 struct mt76_hw_cap {
 struct mt76_hw_cap {

+ 2 - 2
drivers/net/wireless/mediatek/mt76/tx.c

@@ -332,7 +332,7 @@ mt76_txq_send_burst(struct mt76_dev *dev, struct mt76_queue *hwq,
 		if (probe)
 		if (probe)
 			break;
 			break;
 
 
-		if (test_bit(MT76_SCANNING, &dev->state) ||
+		if (test_bit(MT76_OFFCHANNEL, &dev->state) ||
 		    test_bit(MT76_RESET, &dev->state))
 		    test_bit(MT76_RESET, &dev->state))
 			return -EBUSY;
 			return -EBUSY;
 
 
@@ -385,7 +385,7 @@ restart:
 		bool empty = false;
 		bool empty = false;
 		int cur;
 		int cur;
 
 
-		if (test_bit(MT76_SCANNING, &dev->state) ||
+		if (test_bit(MT76_OFFCHANNEL, &dev->state) ||
 		    test_bit(MT76_RESET, &dev->state))
 		    test_bit(MT76_RESET, &dev->state))
 			return -EBUSY;
 			return -EBUSY;