kernel: backport MediaTek USB Bluetooth additions
[openwrt/staging/aparcar.git] / target / linux / generic / backport-5.15 / 821-v5.16-Bluetooth-btusb-Support-public-address-configuration.patch
diff --git a/target/linux/generic/backport-5.15/821-v5.16-Bluetooth-btusb-Support-public-address-configuration.patch b/target/linux/generic/backport-5.15/821-v5.16-Bluetooth-btusb-Support-public-address-configuration.patch
new file mode 100644 (file)
index 0000000..feaabc9
--- /dev/null
@@ -0,0 +1,51 @@
+From 5cb03751455c299b1bf10cb48631bf359cfb11b5 Mon Sep 17 00:00:00 2001
+From: "mark-yw.chen" <mark-yw.chen@mediatek.com>
+Date: Wed, 1 Sep 2021 11:32:25 +0800
+Subject: [PATCH 1/5] Bluetooth: btusb: Support public address configuration
+ for MediaTek Chip.
+
+The MediaTek chip support vendor specific HCI command(0xfc1a) to
+change the public address. Add hdev->set_bdaddr handler for MediaTek
+Chip. After doing a power cycle or MediaTek Bluetooth reset, BD_ADDR
+will bring back the original one.
+
+Signed-off-by: mark-yw.chen <mark-yw.chen@mediatek.com>
+Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
+---
+ drivers/bluetooth/btusb.c | 18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
+--- a/drivers/bluetooth/btusb.c
++++ b/drivers/bluetooth/btusb.c
+@@ -2263,6 +2263,23 @@ struct btmtk_section_map {
+       };
+ } __packed;
++static int btusb_set_bdaddr_mtk(struct hci_dev *hdev, const bdaddr_t *bdaddr)
++{
++      struct sk_buff *skb;
++      long ret;
++
++      skb = __hci_cmd_sync(hdev, 0xfc1a, sizeof(bdaddr), bdaddr, HCI_INIT_TIMEOUT);
++      if (IS_ERR(skb)) {
++              ret = PTR_ERR(skb);
++              bt_dev_err(hdev, "changing Mediatek device address failed (%ld)",
++                         ret);
++              return ret;
++      }
++      kfree_skb(skb);
++
++      return 0;
++}
++
+ static void btusb_mtk_wmt_recv(struct urb *urb)
+ {
+       struct hci_dev *hdev = urb->context;
+@@ -3900,6 +3917,7 @@ static int btusb_probe(struct usb_interf
+               hdev->shutdown = btusb_mtk_shutdown;
+               hdev->manufacturer = 70;
+               hdev->cmd_timeout = btusb_mtk_cmd_timeout;
++              hdev->set_bdaddr = btusb_set_bdaddr_mtk;
+               set_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks);
+               data->recv_acl = btusb_recv_acl_mtk;
+       }