]> git.hungrycats.org Git - linux/commitdiff
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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 13 Sep 2023 07:48:44 +0000 (09:48 +0200)
[ Upstream commit 253f3399f4c09ce6f4e67350f839be0361b4d5ff ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/bluetooth/btintel.c
include/net/bluetooth/hci.h
include/net/bluetooth/hci_core.h
net/bluetooth/hci_sync.c

index d9349ba48281e2918bc42f677f2356d85648e619..7ba60151a16a620cd24f7641159a5afa14bb2a05 100644 (file)
@@ -2658,6 +2658,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);
 
@@ -2729,6 +2732,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 9ae6f60c96bf2af471353770f51cf3b95f19932c..3ff822ebb3a47449b912715433c7972d24b4980e 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 a4b3a95e531a43abf4b49c297aa8668741584ded..3190ca493bd18e7206fb0d9fd28bcc25763d6820 100644 (file)
@@ -1772,7 +1772,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 570909425618dbf1af21abbc8e1d9f4f45c717db..3177a38ef4d60dca82fb92180ec5a79d3833b234 100644 (file)
@@ -4684,7 +4684,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: