Bluetooth: btmtksdio: add support of processing firmware coredump and log
authorSean Wang <sean.wang@mediatek.com>
Fri, 19 Nov 2021 22:25:46 +0000 (06:25 +0800)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 24 Nov 2021 15:08:29 +0000 (16:08 +0100)
Add support of processing the firmware coredump and log for the diagnostic
purpose.

Co-developed-by: Mark-yw Chen <mark-yw.chen@mediatek.com>
Signed-off-by: Mark-yw Chen <mark-yw.chen@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
drivers/bluetooth/btmtksdio.c

index ce6a6c00ff989ef200877fda153a94a60890c137..93c47796ecfd82f0aeaa14192d967e7528f50ae0 100644 (file)
@@ -324,8 +324,29 @@ err_out:
        return err;
 }
 
+static int btmtksdio_recv_acl(struct hci_dev *hdev, struct sk_buff *skb)
+{
+       struct btmtksdio_dev *bdev = hci_get_drvdata(hdev);
+       u16 handle = le16_to_cpu(hci_acl_hdr(skb)->handle);
+
+       switch (handle) {
+       case 0xfc6f:
+               /* Firmware dump from device: when the firmware hangs, the
+                * device can no longer suspend and thus disable auto-suspend.
+                */
+               pm_runtime_forbid(bdev->dev);
+               fallthrough;
+       case 0x05ff:
+       case 0x05fe:
+               /* Firmware debug logging */
+               return hci_recv_diag(hdev, skb);
+       }
+
+       return hci_recv_frame(hdev, skb);
+}
+
 static const struct h4_recv_pkt mtk_recv_pkts[] = {
-       { H4_RECV_ACL,      .recv = hci_recv_frame },
+       { H4_RECV_ACL,      .recv = btmtksdio_recv_acl },
        { H4_RECV_SCO,      .recv = hci_recv_frame },
        { H4_RECV_EVENT,    .recv = btmtksdio_recv_event },
 };