Message ID | 20210726180206.49703-1-pav@iki.fi |
---|---|
State | Accepted |
Commit | 55981d3541812234e687062926ff199c83f79a39 |
Headers | show |
Series | [v3] Bluetooth: btusb: check conditions before enabling USB ALT 3 for WBS | expand |
Hi, On Mon, Jul 26, 2021 at 09:02:06PM +0300, Pauli Virtanen wrote: > Some USB BT adapters don't satisfy the MTU requirement mentioned in > commit e848dbd364ac ("Bluetooth: btusb: Add support USB ALT 3 for WBS") > and have ALT 3 setting that produces no/garbled audio. Some adapters > with larger MTU were also reported to have problems with ALT 3. > > Add a flag and check it and MTU before selecting ALT 3, falling back to > ALT 1. Enable the flag for Realtek, restoring the previous behavior for > non-Realtek devices. > > Tested with USB adapters (mtu<72, no/garbled sound with ALT3, ALT1 > works) BCM20702A1 0b05:17cb, CSR8510A10 0a12:0001, and (mtu>=72, ALT3 > works) RTL8761BU 0bda:8771, Intel AX200 8087:0029 (after disabling > ALT6). Also got reports for (mtu>=72, ALT 3 reported to produce bad > audio) Intel 8087:0a2b. > > Signed-off-by: Pauli Virtanen <pav@iki.fi> > Fixes: e848dbd364ac ("Bluetooth: btusb: Add support USB ALT 3 for WBS") > Tested-by: Michał Kępień <kernel@kempniu.pl> > --- > This probably also should have CC stable@kernel.org, as users have started reporting this bug as distros have started shipping kernels with the faulty patch in it.. so it'd be nice to have the fix backported to stable kernel trees. Thanks, -- Pasi > > Changes in v3: > - Rename flag to BTUSB_USE_ALT3_FOR_WBS. > - No spaces in indent. > - Added Tested-by: Michał Kępień > > Changes in v2: > - Explain magic number 72 in a comment; didn't add the table for them, > because it's not used elsewhere and we need just one number from it. > - Add flag for ALT3 support, restoring the behavior > for non-Realtek devices the same as before e848dbd364ac, due to > the problems reported on an Intel adapter. Don't have the device > myself. >
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index 6d23308119d1..e8062d0b7d4d 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c @@ -516,6 +516,7 @@ static const struct dmi_system_id btusb_needs_reset_resume_table[] = { #define BTUSB_HW_RESET_ACTIVE 12 #define BTUSB_TX_WAIT_VND_EVT 13 #define BTUSB_WAKEUP_DISABLE 14 +#define BTUSB_USE_ALT3_FOR_WBS 15 struct btusb_data { struct hci_dev *hdev; @@ -1748,16 +1749,20 @@ static void btusb_work(struct work_struct *work) /* Bluetooth USB spec recommends alt 6 (63 bytes), but * many adapters do not support it. Alt 1 appears to * work for all adapters that do not have alt 6, and - * which work with WBS at all. + * which work with WBS at all. Some devices prefer + * alt 3 (HCI payload >= 60 Bytes let air packet + * data satisfy 60 bytes), requiring + * MTU >= 3 (packets) * 25 (size) - 3 (headers) = 72 + * see also Core spec 5, vol 4, B 2.1.1 & Table 2.1. */ - new_alts = btusb_find_altsetting(data, 6) ? 6 : 1; - /* Because mSBC frames do not need to be aligned to the - * SCO packet boundary. If support the Alt 3, use the - * Alt 3 for HCI payload >= 60 Bytes let air packet - * data satisfy 60 bytes. - */ - if (new_alts == 1 && btusb_find_altsetting(data, 3)) + if (btusb_find_altsetting(data, 6)) + new_alts = 6; + else if (test_bit(BTUSB_USE_ALT3_FOR_WBS, &data->flags) && + hdev->sco_mtu >= 72 && + btusb_find_altsetting(data, 3)) new_alts = 3; + else + new_alts = 1; } if (btusb_switch_alt_setting(hdev, new_alts) < 0) @@ -4733,6 +4738,7 @@ static int btusb_probe(struct usb_interface *intf, * (DEVICE_REMOTE_WAKEUP) */ set_bit(BTUSB_WAKEUP_DISABLE, &data->flags); + set_bit(BTUSB_USE_ALT3_FOR_WBS, &data->flags); } if (!reset)