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 76a3497a..7fc0e967 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; }