]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mt76: mt7921: fix dma hang in rmmod
authorDeren Wu <deren.wu@mediatek.com>
Tue, 27 Jul 2021 09:47:09 +0000 (17:47 +0800)
committerFelix Fietkau <nbd@nbd.name>
Wed, 20 Oct 2021 08:36:32 +0000 (10:36 +0200)
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 <deren.wu@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7921/init.c

index 49725caca7ed95ff0994fc8ba7f9d84c80845ec7..3e84ef8f5358770fa6ba3ce48ad32ac6810ffd4f 100644 (file)
@@ -266,8 +266,17 @@ 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);