]> git.dujemihanovic.xyz Git - linux.git/commitdiff
Bluetooth: HCI: Invert LE State quirk to be opt-out rather then opt-in
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Mon, 12 Aug 2024 14:43:48 +0000 (10:43 -0400)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Thu, 15 Aug 2024 17:07:55 +0000 (13:07 -0400)
This inverts the LE State quirk so by default we assume the controllers
would report valid states rather than invalid which is how quirks
normally behave, also this would result in HCI command failing it the LE
States are really broken thus exposing the controllers that are really
broken in this respect.

Link: https://github.com/bluez/bluez/issues/584
Fixes: 220915857e29 ("Bluetooth: Adding driver and quirk defs for multi-role LE")
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
drivers/bluetooth/btintel.c
drivers/bluetooth/btintel_pcie.c
drivers/bluetooth/btmtksdio.c
drivers/bluetooth/btrtl.c
drivers/bluetooth/btusb.c
drivers/bluetooth/hci_qca.c
drivers/bluetooth/hci_vhci.c
include/net/bluetooth/hci.h
include/net/bluetooth/hci_core.h
net/bluetooth/hci_event.c

index 2ebc970e6573fb2d18498aa1d811e08d1bc0bea2..7d5e4de64e3cec931af76cf197d506bee8eebe67 100644 (file)
@@ -2945,9 +2945,6 @@ static int btintel_setup_combined(struct hci_dev *hdev)
                                               INTEL_ROM_LEGACY_NO_WBS_SUPPORT))
                                set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED,
                                        &hdev->quirks);
-                       if (ver.hw_variant == 0x08 && ver.fw_variant == 0x22)
-                               set_bit(HCI_QUIRK_VALID_LE_STATES,
-                                       &hdev->quirks);
 
                        err = btintel_legacy_rom_setup(hdev, &ver);
                        break;
@@ -2956,7 +2953,6 @@ static int btintel_setup_combined(struct hci_dev *hdev)
                case 0x12:      /* ThP */
                case 0x13:      /* HrP */
                case 0x14:      /* CcP */
-                       set_bit(HCI_QUIRK_VALID_LE_STATES, &hdev->quirks);
                        fallthrough;
                case 0x0c:      /* WsP */
                        /* Apply the device specific HCI quirks
@@ -3048,9 +3044,6 @@ static int btintel_setup_combined(struct hci_dev *hdev)
                /* These variants don't seem to support LE Coded PHY */
                set_bit(HCI_QUIRK_BROKEN_LE_CODED, &hdev->quirks);
 
-               /* Set Valid LE States quirk */
-               set_bit(HCI_QUIRK_VALID_LE_STATES, &hdev->quirks);
-
                /* Setup MSFT Extension support */
                btintel_set_msft_opcode(hdev, ver.hw_variant);
 
@@ -3076,9 +3069,6 @@ static int btintel_setup_combined(struct hci_dev *hdev)
                 */
                set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks);
 
-               /* Apply LE States quirk from solar onwards */
-               set_bit(HCI_QUIRK_VALID_LE_STATES, &hdev->quirks);
-
                /* Setup MSFT Extension support */
                btintel_set_msft_opcode(hdev,
                                        INTEL_HW_VARIANT(ver_tlv.cnvi_bt));
index 0d1a0415557b2d3893c64c5b8c39fe5856b8e677..1c7631f22c522b5054f9740bbfbb9f7e06a928a9 100644 (file)
@@ -1180,9 +1180,6 @@ static int btintel_pcie_setup(struct hci_dev *hdev)
                 */
                set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks);
 
-               /* Apply LE States quirk from solar onwards */
-               set_bit(HCI_QUIRK_VALID_LE_STATES, &hdev->quirks);
-
                /* Setup MSFT Extension support */
                btintel_set_msft_opcode(hdev,
                                        INTEL_HW_VARIANT(ver_tlv.cnvi_bt));
index 39d6898497a40431171b58ba6d22a102f993ff60..497e4c87f5be56d5919f74ba4a53b20a079e0a54 100644 (file)
@@ -1148,9 +1148,6 @@ static int btmtksdio_setup(struct hci_dev *hdev)
                        }
                }
 
-               /* Valid LE States quirk for MediaTek 7921 */
-               set_bit(HCI_QUIRK_VALID_LE_STATES, &hdev->quirks);
-
                break;
        case 0x7663:
        case 0x7668:
index f2f37143c454d5c18adeba6087d97d32bea4905e..fd7991ea76726ea473906270060166cc17be66cb 100644 (file)
@@ -1287,7 +1287,6 @@ void btrtl_set_quirks(struct hci_dev *hdev, struct btrtl_device_info *btrtl_dev)
        case CHIP_ID_8852C:
        case CHIP_ID_8851B:
        case CHIP_ID_8852BT:
-               set_bit(HCI_QUIRK_VALID_LE_STATES, &hdev->quirks);
                set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks);
 
                /* RTL8852C needs to transmit mSBC data continuously without
index acdba5d77694f811be2b6c9e108ab4cf20594cf2..51d9d4532dda4ee1087879c8ee20ccf8c05b7ed3 100644 (file)
@@ -3956,8 +3956,8 @@ static int btusb_probe(struct usb_interface *intf,
        if (id->driver_info & BTUSB_WIDEBAND_SPEECH)
                set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks);
 
-       if (id->driver_info & BTUSB_VALID_LE_STATES)
-               set_bit(HCI_QUIRK_VALID_LE_STATES, &hdev->quirks);
+       if (!(id->driver_info & BTUSB_VALID_LE_STATES))
+               set_bit(HCI_QUIRK_BROKEN_LE_STATES, &hdev->quirks);
 
        if (id->driver_info & BTUSB_DIGIANSWER) {
                data->cmdreq_type = USB_TYPE_VENDOR;
index 45adc1560d949af8aff2ed7cdc717cd9c5c228d5..4b1ad7ea5b95a93ad2d48e4e1a4882651da8312c 100644 (file)
@@ -2474,8 +2474,8 @@ static int qca_serdev_probe(struct serdev_device *serdev)
                        set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED,
                                &hdev->quirks);
 
-               if (data->capabilities & QCA_CAP_VALID_LE_STATES)
-                       set_bit(HCI_QUIRK_VALID_LE_STATES, &hdev->quirks);
+               if (!(data->capabilities & QCA_CAP_VALID_LE_STATES))
+                       set_bit(HCI_QUIRK_BROKEN_LE_STATES, &hdev->quirks);
        }
 
        return 0;
index c4046f8f1985ab21ee7266818b3cda4e0a32f630..43e9ac5a3324e2d42c17100d1d6d7ab8f2adb607 100644 (file)
@@ -425,8 +425,6 @@ static int __vhci_create_device(struct vhci_data *data, __u8 opcode)
        if (opcode & 0x80)
                set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks);
 
-       set_bit(HCI_QUIRK_VALID_LE_STATES, &hdev->quirks);
-
        if (hci_register_dev(hdev) < 0) {
                BT_ERR("Can't register HCI device");
                hci_free_dev(hdev);
index e372a88e8c3f6a9a640f791ad4ddcf9be25a7947..d1d073089f384e20eeb269ab2d5192f6c18d6939 100644 (file)
@@ -206,14 +206,17 @@ enum {
         */
        HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED,
 
-       /* When this quirk is set, the controller has validated that
-        * LE states reported through the HCI_LE_READ_SUPPORTED_STATES are
-        * valid.  This mechanism is necessary as many controllers have
-        * been seen has having trouble initiating a connectable
-        * advertisement despite the state combination being reported as
-        * supported.
+       /* When this quirk is set, the LE states reported through the
+        * HCI_LE_READ_SUPPORTED_STATES are invalid/broken.
+        *
+        * This mechanism is necessary as many controllers have been seen has
+        * having trouble initiating a connectable advertisement despite the
+        * state combination being reported as supported.
+        *
+        * This quirk can be set before hci_register_dev is called or
+        * during the hdev->setup vendor callback.
         */
-       HCI_QUIRK_VALID_LE_STATES,
+       HCI_QUIRK_BROKEN_LE_STATES,
 
        /* When this quirk is set, then erroneous data reporting
         * is ignored. This is mainly due to the fact that the HCI
index 31020891fc68cde232075f41ba8f3df26e1067ac..e449dba698f35e93bacb94add158a2bdc2aa827b 100644 (file)
@@ -825,7 +825,7 @@ extern struct mutex hci_cb_list_lock;
        } while (0)
 
 #define hci_dev_le_state_simultaneous(hdev) \
-       (test_bit(HCI_QUIRK_VALID_LE_STATES, &hdev->quirks) && \
+       (!test_bit(HCI_QUIRK_BROKEN_LE_STATES, &hdev->quirks) && \
         (hdev->le_states[4] & 0x08) && /* Central */ \
         (hdev->le_states[4] & 0x40) && /* Peripheral */ \
         (hdev->le_states[3] & 0x10))   /* Simultaneous */
index d0c118c47f6c9355d3916c4912f54c930fbf2a94..1c82dcdf6e8fc76e4a0a5e690c68ad9653c2942d 100644 (file)
@@ -5920,7 +5920,7 @@ static struct hci_conn *check_pending_le_conn(struct hci_dev *hdev,
         * while we have an existing one in peripheral role.
         */
        if (hdev->conn_hash.le_num_peripheral > 0 &&
-           (!test_bit(HCI_QUIRK_VALID_LE_STATES, &hdev->quirks) ||
+           (test_bit(HCI_QUIRK_BROKEN_LE_STATES, &hdev->quirks) ||
             !(hdev->le_states[3] & 0x10)))
                return NULL;