Bluetooth: mt7921s: fix firmware coredump retrieve
authorMark Chen <mark-yw.chen@mediatek.com>
Wed, 12 Jan 2022 07:39:11 +0000 (15:39 +0800)
committerMarcel Holtmann <marcel@holtmann.org>
Fri, 21 Jan 2022 22:49:27 +0000 (23:49 +0100)
According to the MCU firmware behavior, as the driver is aware of the
notification of the interrupt source FW_MAILBOX_INT that shows the MCU
completed delivered a core dump piece to the host, the driver must
acknowledge the MCU with the register PH2DSM0R bit PH2DSM0R_DRIVER_OWN
to notify the MCU to handle the next core dump piece.

Fixes: db57b625912a ("Bluetooth: btmtksdio: add support of processing firmware coredump and log")
Co-developed-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Mark Chen <mark-yw.chen@mediatek.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
drivers/bluetooth/btmtksdio.c

index 25fb9c79b1f42e84495924cafa699c09f85d526a..784e65c3fdddb460e3f8ee36f6ed6834856f9bb0 100644 (file)
@@ -87,8 +87,12 @@ MODULE_DEVICE_TABLE(sdio, btmtksdio_table);
 #define RX_DONE_INT            BIT(1)
 #define TX_EMPTY               BIT(2)
 #define TX_FIFO_OVERFLOW       BIT(8)
+#define FW_MAILBOX_INT         BIT(15)
 #define RX_PKT_LEN             GENMASK(31, 16)
 
+#define MTK_REG_PH2DSM0R       0xc4
+#define PH2DSM0R_DRIVER_OWN    BIT(0)
+
 #define MTK_REG_CTDR           0x18
 
 #define MTK_REG_CRDR           0x1c
@@ -481,6 +485,12 @@ static void btmtksdio_txrx_work(struct work_struct *work)
                 */
                sdio_writel(bdev->func, int_status, MTK_REG_CHISR, NULL);
 
+               if ((int_status & FW_MAILBOX_INT) &&
+                   bdev->data->chipid == 0x7921) {
+                       sdio_writel(bdev->func, PH2DSM0R_DRIVER_OWN,
+                                   MTK_REG_PH2DSM0R, 0);
+               }
+
                if (int_status & FW_OWN_BACK_INT)
                        bt_dev_dbg(bdev->hdev, "Get fw own back");