Re: [PATCH v2] Bluetooth: btusb: Add support USB ALT 3 for WBS
From: Pauli Virtanen <hidden>
Date: 2021-07-11 15:34:12
Hi, pe, 2021-05-14 kello 11:19 +0800, hildawu@realtek.com kirjoitti:
From: Hilda Wu <redacted> Because mSBC frames do not need to be aligned to the SCO packet boundary. Using USB ALT 3 let HCI payload >= 60 bytes, let mSBC data satisfy 60 Bytes avoid payload unaligned situation and fixed some headset no voise issue. USB Alt 3 supported also need HFP support transparent MTU in 72 Bytes. Signed-off-by: Hilda Wu <redacted> --- Changes in v2: - Updated signed off name. - Adjusted coding style. ---
This change seemed to break msbc audio on some non-realtek adapters I have. Tested Pipewire on BCM20702A1 (0b05:17cb), CSR8510A10 (0a12:0001) -> no sound output and input appears garbled. Reverting this patch makes it work again. Indeed these adapters report SCO mtu=64 which is less than 72. On the other hand, with RTL8761BU (0bda:8771) msbc audio works fine with this patch out of the box, indeed reading/writing 72 byte packets to/from the sco socket. ALT 3 on RTL8761BU does appear to address garbled audio with some headsets. Maybe the altsetting should be determined based on a quirk, the mtu requirement be checked, or something similar? AFAIK, userspace can't do anything to fix this. Best, Pauli Virtanen
quoted hunk ↗ jump to hunk
--- drivers/bluetooth/btusb.c | 7 +++++++ 1 file changed, 7 insertions(+)diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index 6f253378e893..1e98f985740b 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c@@ -1752,6 +1752,13 @@ static void btusb_work(struct work_struct*work) * which work with WBS at all. */ 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)) + new_alts = 3; } if (btusb_switch_alt_setting(hdev, new_alts) < 0)