Skip to content

Commit 8b6d4c6

Browse files
LorenzoBianconigregkh
authored andcommitted
wifi: mt76: mt7996: Fix NPU stop procedure
[ Upstream commit 7aed20b ] 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: 377aa17 ("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> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 4b7c92f commit 8b6d4c6

2 files changed

Lines changed: 15 additions & 11 deletions

File tree

  • drivers/net/wireless/mediatek/mt76/mt7996

drivers/net/wireless/mediatek/mt76/mt7996/mac.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2543,6 +2543,7 @@ void mt7996_mac_reset_work(struct work_struct *work)
25432543
if (mtk_wed_device_active(&dev->mt76.mmio.wed))
25442544
mtk_wed_device_stop(&dev->mt76.mmio.wed);
25452545

2546+
mt7996_npu_hw_stop(dev);
25462547
ieee80211_stop_queues(mt76_hw(dev));
25472548

25482549
set_bit(MT76_RESET, &dev->mphy.state);
@@ -2569,8 +2570,6 @@ void mt7996_mac_reset_work(struct work_struct *work)
25692570

25702571
mutex_lock(&dev->mt76.mutex);
25712572

2572-
mt7996_npu_hw_stop(dev);
2573-
25742573
mt76_wr(dev, MT_MCU_INT_EVENT, MT_MCU_INT_EVENT_DMA_STOPPED);
25752574

25762575
if (mt7996_wait_reset_state(dev, MT_MCU_CMD_RESET_DONE)) {

drivers/net/wireless/mediatek/mt76/mt7996/npu.c

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -320,33 +320,38 @@ int mt7996_npu_hw_init(struct mt7996_dev *dev)
320320
int mt7996_npu_hw_stop(struct mt7996_dev *dev)
321321
{
322322
struct airoha_npu *npu;
323-
int i, err;
323+
int i, err = 0;
324324
u32 info;
325325

326+
mutex_lock(&dev->mt76.mutex);
327+
326328
npu = rcu_dereference_protected(dev->mt76.mmio.npu, &dev->mt76.mutex);
327329
if (!npu)
328-
return 0;
330+
goto unlock;
329331

330332
err = mt76_npu_send_msg(npu, 4, WLAN_FUNC_SET_WAIT_INODE_TXRX_REG_ADDR,
331333
0, GFP_KERNEL);
332334
if (err)
333-
return err;
335+
goto unlock;
334336

335337
for (i = 0; i < 10; i++) {
336338
err = mt76_npu_get_msg(npu, 3, WLAN_FUNC_GET_WAIT_NPU_INFO,
337339
&info, GFP_KERNEL);
338-
if (err)
339-
continue;
340+
if (!err && !info)
341+
break;
340342

341-
if (info) {
342-
err = -ETIMEDOUT;
343-
continue;
344-
}
343+
err = -ETIMEDOUT;
344+
usleep_range(10000, 15000);
345345
}
346346

347347
if (!err)
348348
err = mt76_npu_send_msg(npu, 6,
349349
WLAN_FUNC_SET_WAIT_INODE_TXRX_REG_ADDR,
350350
0, GFP_KERNEL);
351+
else
352+
dev_err(dev->mt76.dev, "npu stop failed\n");
353+
unlock:
354+
mutex_unlock(&dev->mt76.mutex);
355+
351356
return err;
352357
}

0 commit comments

Comments
 (0)