[PATCH mt76 01/11] wifi: mt76: mt7996: Fix NPU stop procedure
Lorenzo Bianconi
lorenzo at kernel.org
Thu Dec 4 00:10:43 PST 2025
Fix NPU stop procedure used during device L1 SER recovery moving
mt7996_npu_hw_stop routine before disabling rx NAPIs.
Add missing usleep_range in mt7996_npu_hw_stop().
Tested-by: Hui Ma <hui.ma at airoha.com>
Fixes: 377aa17d2aedc ("wifi: mt76: mt7996: Add NPU offload support to MT7996 driver")
Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
---
drivers/net/wireless/mediatek/mt76/mt7996/mac.c | 3 +--
drivers/net/wireless/mediatek/mt76/mt7996/npu.c | 23 ++++++++++++++---------
2 files changed, 15 insertions(+), 11 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mac.c b/drivers/net/wireless/mediatek/mt76/mt7996/mac.c
index 2560e2f46e89a4bc46e21d796fca80b7decefa5c..2a8e91f59b0cafd46c97a9ac73b78f1ba087b5d8 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/mac.c
@@ -2543,6 +2543,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);
@@ -2569,8 +2570,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)) {
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/npu.c b/drivers/net/wireless/mediatek/mt76/mt7996/npu.c
index 29bb735da4cb8f5998c9483567c65f3e3530c771..067ef647e404073173833aad3a2800d6591a5188 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/npu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/npu.c
@@ -320,33 +320,38 @@ int mt7996_npu_hw_init(struct mt7996_dev *dev)
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;
}
--
2.52.0
More information about the Linux-mediatek
mailing list