Bluetooth: btmtksdio: Do close if SDIO card removed without close
authorChris Lu <chris.lu@mediatek.com>
Tue, 22 Apr 2025 01:21:56 +0000 (09:21 +0800)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Fri, 25 Apr 2025 19:03:19 +0000 (15:03 -0400)
To prevent Bluetooth SDIO card from be physically removed suddenly,
driver needs to ensure btmtksdio_close is called before
btmtksdio_remove to disable interrupts and txrx workqueue.

Fixes: 6ac4233afb9a ("Bluetooth: btmtksdio: Prevent enabling interrupts after IRQ handler removal")
Signed-off-by: Chris Lu <chris.lu@mediatek.com>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
drivers/bluetooth/btmtksdio.c

index e5a119ca724350216aeeab9aa9a6c9adb7f714f7..1d26207b2ba70a51a4a44d4112e7c8d43e9b5416 100644 (file)
@@ -1447,11 +1447,15 @@ static void btmtksdio_remove(struct sdio_func *func)
        if (!bdev)
                return;
 
+       hdev = bdev->hdev;
+
+       /* Make sure to call btmtksdio_close before removing sdio card */
+       if (test_bit(BTMTKSDIO_FUNC_ENABLED, &bdev->tx_state))
+               btmtksdio_close(hdev);
+
        /* Be consistent the state in btmtksdio_probe */
        pm_runtime_get_noresume(bdev->dev);
 
-       hdev = bdev->hdev;
-
        sdio_set_drvdata(func, NULL);
        hci_unregister_dev(hdev);
        hci_free_dev(hdev);