Bluetooth: btbcm: disable read tx power for some Macs with the T2 Security chip
authorAditya Garg <gargaditya08@live.com>
Thu, 2 Dec 2021 12:42:59 +0000 (12:42 +0000)
committerMarcel Holtmann <marcel@holtmann.org>
Tue, 7 Dec 2021 16:05:51 +0000 (17:05 +0100)
Some Macs with the T2 security chip had Bluetooth not working.
To fix it we add DMI based quirks to disable querying of LE Tx power.

Signed-off-by: Aditya Garg <gargaditya08@live.com>
Reported-by: Orlando Chamberlain <redecorating@protonmail.com>
Tested-by: Orlando Chamberlain <redecorating@protonmail.com>
Link:
https://lore.kernel.org/r/4970a940-211b-25d6-edab-21a815313954@protonmail.com
Fixes: 7c395ea521e6 ("Bluetooth: Query LE tx power on startup")
Cc: stable@vger.kernel.org
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
drivers/bluetooth/btbcm.c

index e4182ac..07fabaa 100644 (file)
@@ -8,6 +8,7 @@
 
 #include <linux/module.h>
 #include <linux/firmware.h>
+#include <linux/dmi.h>
 #include <asm/unaligned.h>
 
 #include <net/bluetooth/bluetooth.h>
@@ -343,6 +344,40 @@ static struct sk_buff *btbcm_read_usb_product(struct hci_dev *hdev)
        return skb;
 }
 
+static const struct dmi_system_id disable_broken_read_transmit_power[] = {
+       {
+                .matches = {
+                       DMI_MATCH(DMI_BOARD_VENDOR, "Apple Inc."),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro16,1"),
+               },
+       },
+       {
+                .matches = {
+                       DMI_MATCH(DMI_BOARD_VENDOR, "Apple Inc."),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro16,2"),
+               },
+       },
+       {
+                .matches = {
+                       DMI_MATCH(DMI_BOARD_VENDOR, "Apple Inc."),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro16,4"),
+               },
+       },
+       {
+                .matches = {
+                       DMI_MATCH(DMI_BOARD_VENDOR, "Apple Inc."),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "iMac20,1"),
+               },
+       },
+       {
+                .matches = {
+                       DMI_MATCH(DMI_BOARD_VENDOR, "Apple Inc."),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "iMac20,2"),
+               },
+       },
+       { }
+};
+
 static int btbcm_read_info(struct hci_dev *hdev)
 {
        struct sk_buff *skb;
@@ -363,6 +398,10 @@ static int btbcm_read_info(struct hci_dev *hdev)
        bt_dev_info(hdev, "BCM: features 0x%2.2x", skb->data[1]);
        kfree_skb(skb);
 
+       /* Read DMI and disable broken Read LE Min/Max Tx Power */
+       if (dmi_first_match(disable_broken_read_transmit_power))
+               set_bit(HCI_QUIRK_BROKEN_READ_TRANSMIT_POWER, &hdev->quirks);
+
        return 0;
 }