From 4602acc9271afa3c75014ab739106f3f0055565d Mon Sep 17 00:00:00 2001 From: Deren Wu Date: Tue, 27 Jul 2021 17:47:09 +0800 Subject: [PATCH] mt76: mt7921: fix dma hang in rmmod The dma would be broken after rmmod flow. There are two different cases causing this issue. 1. dma access without privilege. 2. hw access sequence borken by another context. This patch handle both cases to avoid hw crash. Fixes: 2b9ea5a8cf1bd ("mt76: mt7921: add mt7921_dma_cleanup in mt7921_unregister_device") Signed-off-by: Deren Wu Signed-off-by: Felix Fietkau --- mt7921/init.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/mt7921/init.c b/mt7921/init.c index 49725cac..1f37e64b 100644 --- a/mt7921/init.c +++ b/mt7921/init.c @@ -266,10 +266,20 @@ int mt7921_register_device(struct mt7921_dev *dev) void mt7921_unregister_device(struct mt7921_dev *dev) { + int i; + struct mt76_connac_pm *pm = &dev->pm; + mt76_unregister_device(&dev->mt76); + mt76_for_each_q_rx(&dev->mt76, i) + napi_disable(&dev->mt76.napi[i]); + cancel_delayed_work_sync(&pm->ps_work); + cancel_work_sync(&pm->wake_work); + mt7921_tx_token_put(dev); + mt7921_mcu_drv_pmctrl(dev); mt7921_dma_cleanup(dev); mt7921_mcu_exit(dev); + mt7921_mcu_fw_pmctrl(dev); tasklet_disable(&dev->irq_tasklet); mt76_free_device(&dev->mt76);