]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
Bluetooth: hci_ll: Enable BROKEN_ENHANCED_SETUP_SYNC_CONN for WL183x
authorStefano Radaelli <stefano.r@variscite.com>
Thu, 2 Apr 2026 18:47:03 +0000 (20:47 +0200)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Mon, 13 Apr 2026 13:19:42 +0000 (09:19 -0400)
TI WL183x controllers advertise support for the HCI Enhanced Setup
Synchronous Connection command, but SCO setup fails when the enhanced
path is used. The only working configuration is to fall back to the
legacy HCI Setup Synchronous Connection (0x0028).

This matches the scenario described in commit 05abad857277
("Bluetooth: HCI: Add HCI_QUIRK_BROKEN_ENHANCED_SETUP_SYNC_CONN quirk").

Enable HCI_QUIRK_BROKEN_ENHANCED_SETUP_SYNC_CONN automatically for
devices compatible with:
  - ti,wl1831-st
  - ti,wl1835-st
  - ti,wl1837-st

Signed-off-by: Stefano Radaelli <stefano.r@variscite.com>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
drivers/bluetooth/hci_ll.c

index 91c96ad123422193c60fe4daf6a96aa0e1bd0b59..ab744001dafc4322bceb9f4e36db0db10c2f2eb7 100644 (file)
@@ -68,6 +68,7 @@ struct ll_device {
        struct gpio_desc *enable_gpio;
        struct clk *ext_clk;
        bdaddr_t bdaddr;
+       bool broken_enhanced_setup;
 };
 
 struct ll_struct {
@@ -658,6 +659,10 @@ static int ll_setup(struct hci_uart *hu)
                        hci_set_quirk(hu->hdev, HCI_QUIRK_INVALID_BDADDR);
        }
 
+       if (lldev->broken_enhanced_setup)
+               hci_set_quirk(hu->hdev,
+                             HCI_QUIRK_BROKEN_ENHANCED_SETUP_SYNC_CONN);
+
        /* Operational speed if any */
        if (hu->oper_speed)
                speed = hu->oper_speed;
@@ -712,6 +717,11 @@ static int hci_ti_probe(struct serdev_device *serdev)
        of_property_read_u32(serdev->dev.of_node, "max-speed", &max_speed);
        hci_uart_set_speeds(hu, 115200, max_speed);
 
+       if (of_device_is_compatible(serdev->dev.of_node, "ti,wl1831-st") ||
+           of_device_is_compatible(serdev->dev.of_node, "ti,wl1835-st") ||
+           of_device_is_compatible(serdev->dev.of_node, "ti,wl1837-st"))
+               lldev->broken_enhanced_setup = true;
+
        /* optional BD address from nvram */
        bdaddr_cell = nvmem_cell_get(&serdev->dev, "bd-address");
        if (IS_ERR(bdaddr_cell)) {