From 90f731f6c90d5de0986601225ec006ae7409dab7 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Tue, 18 Aug 2026 12:58:24 +0000 Subject: [PATCH] wifi: mt76: clear offchannel state if a scan has no channel to restore mt76_scan_complete() restores the operating channel only if the phy has one. __mt76_set_channel() is the only function that clears phy->offchannel. A phy can run a scan while it has no operating channel. A 6 GHz radio with no configured interface is one example. After such a scan, the flag stays set. mt76_txq_schedule_list() skips each TXQ whose wcid points to a phy in this state. All traffic for the stations on that band stops. The frames stay in the mac80211 queues. They do not reach the hardware, and no counter shows them. Only an unrelated channel set clears the flag. Link: https://patch.msgid.link/20260818125825.395538-4-nbd@nbd.name Signed-off-by: Felix Fietkau --- channel.c | 2 ++ scan.c | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/channel.c b/channel.c index 1d263567..903f3a42 100644 --- a/channel.c +++ b/channel.c @@ -330,6 +330,8 @@ void mt76_roc_complete(struct mt76_phy *phy) !test_bit(MT76_MCU_RESET, &dev->phy.state)) { __mt76_set_channel(phy, &phy->main_chandef, false); mt76_offchannel_notify(phy, false); + } else { + phy->offchannel = false; } mt76_put_vif_phy_link(phy, phy->roc_vif, phy->roc_link); phy->roc_vif = NULL; diff --git a/scan.c b/scan.c index 3594b599..c8c4d096 100644 --- a/scan.c +++ b/scan.c @@ -29,6 +29,13 @@ static void mt76_scan_complete(struct mt76_dev *dev, bool abort) __mt76_set_channel(phy, &phy->main_chandef, false); if (offchannel) mt76_offchannel_notify(phy, false); + } else { + /* A phy that has no operating channel has nothing to restore, + * but the flag also gates the TX queues of every station whose + * wcid points at this band, so leaving it set stalls them until + * something else happens to set a channel. + */ + phy->offchannel = false; } mt76_put_vif_phy_link(phy, dev->scan.vif, dev->scan.mlink); memset(&dev->scan, 0, sizeof(dev->scan));