From 990f94e1ac9975b2efd443c4f6609fef2e041b27 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Sun, 25 Aug 2024 22:47:42 +0200 Subject: [PATCH] wifi: mt76: mt7915: improve hardware recovery Do not trigger full restarts when running into timeouts during SER. Immediately abort MCU commands when firmware requests DMA restart. Signed-off-by: Felix Fietkau --- mt7915/mac.c | 5 +++++ mt7915/mcu.c | 12 +++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/mt7915/mac.c b/mt7915/mac.c index 54974ff7..cf77ce0c 100644 --- a/mt7915/mac.c +++ b/mt7915/mac.c @@ -1696,6 +1696,11 @@ void mt7915_reset(struct mt7915_dev *dev) return; } + if ((READ_ONCE(dev->recovery.state) & MT_MCU_CMD_STOP_DMA)) { + set_bit(MT76_MCU_RESET, &dev->mphy.state); + wake_up(&dev->mt76.mcu.wait); + } + queue_work(dev->mt76.wq, &dev->reset_work); wake_up(&dev->reset_wait); } diff --git a/mt7915/mcu.c b/mt7915/mcu.c index 1cd5cda1..316e224e 100644 --- a/mt7915/mcu.c +++ b/mt7915/mcu.c @@ -164,11 +164,13 @@ mt7915_mcu_parse_response(struct mt76_dev *mdev, int cmd, if (!skb) { dev_err(mdev->dev, "Message %08x (seq %d) timeout\n", cmd, seq); - dev->recovery.restart = true; - set_bit(MT76_MCU_RESET, &dev->mphy.state); - wake_up(&dev->mt76.mcu.wait); - queue_work(dev->mt76.wq, &dev->reset_work); - wake_up(&dev->reset_wait); + + if (!test_and_set_bit(MT76_MCU_RESET, &dev->mphy.state)) { + dev->recovery.restart = true; + wake_up(&dev->mt76.mcu.wait); + queue_work(dev->mt76.wq, &dev->reset_work); + wake_up(&dev->reset_wait); + } return -ETIMEDOUT; }