Bluetooth: HCI: Introduce HCI_QUIRK_BROKEN_LE_CODED
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Tue, 22 Aug 2023 19:02:03 +0000 (12:02 -0700)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Thu, 24 Aug 2023 19:23:46 +0000 (12:23 -0700)
This introduces HCI_QUIRK_BROKEN_LE_CODED which is used to indicate
that LE Coded PHY shall not be used, it is then set for some Intel
models that claim to support it but when used causes many problems.

Cc: stable@vger.kernel.org # 6.4.y+
Link: https://github.com/bluez/bluez/issues/577
Link: https://github.com/bluez/bluez/issues/582
Link: https://lore.kernel.org/linux-bluetooth/CABBYNZKco-v7wkjHHexxQbgwwSz-S=GZ=dZKbRE1qxT1h4fFbQ@mail.gmail.com/T/#
Fixes: 288c90224eec ("Bluetooth: Enable all supported LE PHY by default")
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
drivers/bluetooth/btintel.c
include/net/bluetooth/hci.h
include/net/bluetooth/hci_core.h
net/bluetooth/hci_sync.c

index 9b239ce96fa458dbfc2b51d533405f57c527c7ab..2462796a512a5ffc33c8648d463b3e5d1fa25ac9 100644 (file)
@@ -2787,6 +2787,9 @@ static int btintel_setup_combined(struct hci_dev *hdev)
                        set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED,
                                &hdev->quirks);
 
+                       /* These variants don't seem to support LE Coded PHY */
+                       set_bit(HCI_QUIRK_BROKEN_LE_CODED, &hdev->quirks);
+
                        /* Setup MSFT Extension support */
                        btintel_set_msft_opcode(hdev, ver.hw_variant);
 
@@ -2858,6 +2861,9 @@ static int btintel_setup_combined(struct hci_dev *hdev)
                 */
                set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks);
 
+               /* 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);
 
index c58425d4c592c9f2324b29c082dc5ffdd513589e..87d92accc26ea91e4a6c19aec906b40a3914d988 100644 (file)
@@ -319,6 +319,16 @@ enum {
         * This quirk must be set before hci_register_dev is called.
         */
        HCI_QUIRK_USE_MSFT_EXT_ADDRESS_FILTER,
+
+       /*
+        * When this quirk is set, LE Coded PHY shall not be used. This is
+        * required for some Intel controllers which erroneously claim to
+        * support it but it causes problems with extended scanning.
+        *
+        * This quirk can be set before hci_register_dev is called or
+        * during the hdev->setup vendor callback.
+        */
+       HCI_QUIRK_BROKEN_LE_CODED,
 };
 
 /* HCI device flags */
index 6e2988b11f99801b46c79beed0528b317f4cf6d5..e6359f7346f1fb4a2703e3de6bae8db475972cdb 100644 (file)
@@ -1817,7 +1817,9 @@ void hci_conn_del_sysfs(struct hci_conn *conn);
 #define scan_2m(dev) (((dev)->le_tx_def_phys & HCI_LE_SET_PHY_2M) || \
                      ((dev)->le_rx_def_phys & HCI_LE_SET_PHY_2M))
 
-#define le_coded_capable(dev) (((dev)->le_features[1] & HCI_LE_PHY_CODED))
+#define le_coded_capable(dev) (((dev)->le_features[1] & HCI_LE_PHY_CODED) && \
+                              !test_bit(HCI_QUIRK_BROKEN_LE_CODED, \
+                                        &(dev)->quirks))
 
 #define scan_coded(dev) (((dev)->le_tx_def_phys & HCI_LE_SET_PHY_CODED) || \
                         ((dev)->le_rx_def_phys & HCI_LE_SET_PHY_CODED))
index 0cb78081719837c83b907ca32906a927fea4afa0..9b93653c6197300eb5f4c8d55dd3f38557b1976d 100644 (file)
@@ -4668,7 +4668,10 @@ static const struct {
                         "advertised, but not supported."),
        HCI_QUIRK_BROKEN(SET_RPA_TIMEOUT,
                         "HCI LE Set Random Private Address Timeout command is "
-                        "advertised, but not supported.")
+                        "advertised, but not supported."),
+       HCI_QUIRK_BROKEN(LE_CODED,
+                        "HCI LE Coded PHY feature bit is set, "
+                        "but its usage is not supported.")
 };
 
 /* This function handles hdev setup stage: