]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: mt76: mt7996: Fix NPU stop procedure
authorLorenzo Bianconi <lorenzo@kernel.org>
Thu, 22 Jan 2026 10:39:45 +0000 (11:39 +0100)
committerFelix Fietkau <nbd@nbd.name>
Mon, 23 Mar 2026 09:23:00 +0000 (09:23 +0000)
Move mt7996_npu_hw_stop routine before disabling rx NAPIs in order to
fix NPU stop procedure used during device L1 SER recovery.
Add missing usleep_range in mt7996_npu_hw_stop().

Fixes: 377aa17d2aedc ("wifi: mt76: mt7996: Add NPU offload support to MT7996 driver")
Tested-by: Kang Yang <kang.yang@airoha.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Link: https://patch.msgid.link/20260122-mt76-npu-eagle-offload-v2-1-2374614c0de6@kernel.org
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7996/mac.c
drivers/net/wireless/mediatek/mt76/mt7996/npu.c

index 9c1715f4a3b8252827c963ed1efaa5451bef5606..00c6045622e3f42f8b31c62035277d7d5f6c0350 100644 (file)
@@ -2504,6 +2504,7 @@ void mt7996_mac_reset_work(struct work_struct *work)
        if (mtk_wed_device_active(&dev->mt76.mmio.wed))
                mtk_wed_device_stop(&dev->mt76.mmio.wed);
 
+       mt7996_npu_hw_stop(dev);
        ieee80211_stop_queues(mt76_hw(dev));
 
        set_bit(MT76_RESET, &dev->mphy.state);
@@ -2530,8 +2531,6 @@ void mt7996_mac_reset_work(struct work_struct *work)
 
        mutex_lock(&dev->mt76.mutex);
 
-       mt7996_npu_hw_stop(dev);
-
        mt76_wr(dev, MT_MCU_INT_EVENT, MT_MCU_INT_EVENT_DMA_STOPPED);
 
        if (mt7996_wait_reset_state(dev, MT_MCU_CMD_RESET_DONE)) {
index 1422533e59c778142cb9d486572209f6d9f368c5..9c3b241aae3891c76bda525afa03d313be444bc4 100644 (file)
@@ -320,33 +320,38 @@ unlock:
 int mt7996_npu_hw_stop(struct mt7996_dev *dev)
 {
        struct airoha_npu *npu;
-       int i, err;
+       int i, err = 0;
        u32 info;
 
+       mutex_lock(&dev->mt76.mutex);
+
        npu = rcu_dereference_protected(dev->mt76.mmio.npu, &dev->mt76.mutex);
        if (!npu)
-               return 0;
+               goto unlock;
 
        err = mt76_npu_send_msg(npu, 4, WLAN_FUNC_SET_WAIT_INODE_TXRX_REG_ADDR,
                                0, GFP_KERNEL);
        if (err)
-               return err;
+               goto unlock;
 
        for (i = 0; i < 10; i++) {
                err = mt76_npu_get_msg(npu, 3, WLAN_FUNC_GET_WAIT_NPU_INFO,
                                       &info, GFP_KERNEL);
-               if (err)
-                       continue;
+               if (!err && !info)
+                       break;
 
-               if (info) {
-                       err = -ETIMEDOUT;
-                       continue;
-               }
+               err = -ETIMEDOUT;
+               usleep_range(10000, 15000);
        }
 
        if (!err)
                err = mt76_npu_send_msg(npu, 6,
                                        WLAN_FUNC_SET_WAIT_INODE_TXRX_REG_ADDR,
                                        0, GFP_KERNEL);
+       else
+               dev_err(dev->mt76.dev, "npu stop failed\n");
+unlock:
+       mutex_unlock(&dev->mt76.mutex);
+
        return err;
 }