821-v5.16-Bluetooth-btusb-Support-public-address-configuration.patch 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. From 5cb03751455c299b1bf10cb48631bf359cfb11b5 Mon Sep 17 00:00:00 2001
  2. From: "mark-yw.chen" <[email protected]>
  3. Date: Wed, 1 Sep 2021 11:32:25 +0800
  4. Subject: [PATCH 1/5] Bluetooth: btusb: Support public address configuration
  5. for MediaTek Chip.
  6. The MediaTek chip support vendor specific HCI command(0xfc1a) to
  7. change the public address. Add hdev->set_bdaddr handler for MediaTek
  8. Chip. After doing a power cycle or MediaTek Bluetooth reset, BD_ADDR
  9. will bring back the original one.
  10. Signed-off-by: mark-yw.chen <[email protected]>
  11. Signed-off-by: Marcel Holtmann <[email protected]>
  12. ---
  13. drivers/bluetooth/btusb.c | 18 ++++++++++++++++++
  14. 1 file changed, 18 insertions(+)
  15. --- a/drivers/bluetooth/btusb.c
  16. +++ b/drivers/bluetooth/btusb.c
  17. @@ -2263,6 +2263,23 @@ struct btmtk_section_map {
  18. };
  19. } __packed;
  20. +static int btusb_set_bdaddr_mtk(struct hci_dev *hdev, const bdaddr_t *bdaddr)
  21. +{
  22. + struct sk_buff *skb;
  23. + long ret;
  24. +
  25. + skb = __hci_cmd_sync(hdev, 0xfc1a, sizeof(bdaddr), bdaddr, HCI_INIT_TIMEOUT);
  26. + if (IS_ERR(skb)) {
  27. + ret = PTR_ERR(skb);
  28. + bt_dev_err(hdev, "changing Mediatek device address failed (%ld)",
  29. + ret);
  30. + return ret;
  31. + }
  32. + kfree_skb(skb);
  33. +
  34. + return 0;
  35. +}
  36. +
  37. static void btusb_mtk_wmt_recv(struct urb *urb)
  38. {
  39. struct hci_dev *hdev = urb->context;
  40. @@ -3914,6 +3931,7 @@ static int btusb_probe(struct usb_interf
  41. hdev->shutdown = btusb_mtk_shutdown;
  42. hdev->manufacturer = 70;
  43. hdev->cmd_timeout = btusb_mtk_cmd_timeout;
  44. + hdev->set_bdaddr = btusb_set_bdaddr_mtk;
  45. set_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks);
  46. data->recv_acl = btusb_recv_acl_mtk;
  47. }