]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: mt76: Move mt76_abort_scan out of mt76_reset_device()
authorLorenzo Bianconi <lorenzo@kernel.org>
Fri, 14 Nov 2025 13:16:23 +0000 (14:16 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 18 Dec 2025 13:03:15 +0000 (14:03 +0100)
[ Upstream commit 6aaaaeacf18b2dc2b0f78f241800e0ea680938c7 ]

Move mt76_abort_scan routine out of mt76_reset_device() in order to
avoid a possible deadlock since mt76_reset_device routine is running
with mt76 mutex help and mt76_abort_scan_complete() can grab mt76 mutex
in some cases.

Fixes: b36d55610215a ("wifi: mt76: abort scan/roc on hw restart")
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Tested-by: Ben Greear <greearb@candelatech.com>
Link: https://patch.msgid.link/20251114-mt76-fix-missing-mtx-v1-3-259ebf11f654@kernel.org
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/wireless/mediatek/mt76/mac80211.c
drivers/net/wireless/mediatek/mt76/mt7915/mac.c
drivers/net/wireless/mediatek/mt76/mt7996/mac.c

index 5ceaf78c9ea064bf898c347c611a7ccdf9cb9ebc..5e75861bf6f990dc5745b81224faf705395e894d 100644 (file)
@@ -847,8 +847,6 @@ void mt76_reset_device(struct mt76_dev *dev)
        }
        rcu_read_unlock();
 
-       mt76_abort_scan(dev);
-
        INIT_LIST_HEAD(&dev->wcid_list);
        INIT_LIST_HEAD(&dev->sta_poll_list);
        dev->vif_mask = 0;
index 1c0d310146d63bc39357d604b549c83e37c8da35..5caf818e8283438ee3c79124384636cbdd641780 100644 (file)
@@ -1451,6 +1451,8 @@ mt7915_mac_full_reset(struct mt7915_dev *dev)
        if (ext_phy)
                cancel_delayed_work_sync(&ext_phy->mac_work);
 
+       mt76_abort_scan(&dev->mt76);
+
        mutex_lock(&dev->mt76.mutex);
        for (i = 0; i < 10; i++) {
                if (!mt7915_mac_restart(dev))
index b06728a98a6917ce376781be6af2544a0dde1562..cfad46a532bb794d7b4177e32642d8cda258c0a8 100644 (file)
@@ -2424,6 +2424,8 @@ mt7996_mac_full_reset(struct mt7996_dev *dev)
        mt7996_for_each_phy(dev, phy)
                cancel_delayed_work_sync(&phy->mt76->mac_work);
 
+       mt76_abort_scan(&dev->mt76);
+
        mutex_lock(&dev->mt76.mutex);
        for (i = 0; i < 10; i++) {
                if (!mt7996_mac_restart(dev))