* xHCI TT: FS audio capture glitches when btusb SCO runs concurrently
@ 2026-07-18 10:18 Branislav Klocok
2026-07-28 7:41 ` Mathias Nyman
0 siblings, 1 reply; 2+ messages in thread
From: Branislav Klocok @ 2026-07-18 10:18 UTC (permalink / raw)
To: linux-usb; +Cc: linux-bluetooth, mathias.nyman
Hi,
I'd like to report (and ask for guidance on) an apparent conflict between
two concurrent full-speed isochronous streams on the same xHCI controller:
a full-speed USB audio device behind a hub (split transactions through the
hub's TT) and the SCO endpoints of an Intel Bluetooth controller (btusb)
on a root port.
Short version: while an HFP call is active over Bluetooth (SCO), the
capture stream of a full-speed USB headset plugged in *behind a dock hub*
is subtly corrupted. After mSBC encoding and the telephony path, the far
end hears severely "robotic" audio. Moving the same headset to a direct
root port makes the problem disappear immediately; moving it back behind
the dock brings it back. CVSD calls are perceptually unaffected.
Environment
-----------
- ThinkPad X1 Carbon 6th gen; xHCI: Intel Sunrise Point-LP [8086:9d2f]
- Kernel 7.1.3-1-default (openSUSE Tumbleweed), BlueZ 5.82,
PipeWire 1.6.8 / WirePlumber 0.5.15 (HFP native backend, laptop = HF)
- Bluetooth: Intel 8265 [8087:0a2b], full-speed, internal (bus 1 root
port 7), fw ibt-12-16
- USB headset: C-Media [0d8c:0014], full-speed, mono capture 48 kHz
- Dock: Lenovo USB dock (hubs 17ef:3071/17ef:3070, cascade incl.
067b:2586 and 05e3:0610)
- HFP counterpart: Android phone (Volla X23) as AG; a call was placed to
a second handset held at my ear, so I judged the far-end quality
directly while speaking
SCO detail during mSBC: eSCO, air mode Transparent, 60-byte RX/TX packet
length, btusb isoc alt setting 1 (9-byte packets), HCI SCO frames
dlen 24. CVSD uses alt setting 2 (17-byte packets).
Reproduction (single call, changing only the capture source / port)
-------------------------------------------------------------------
I kept the same position and speech style throughout and judged the
quality on the far-end handset:
uplink capture source far-end verdict
1. HS webcam (behind the same dock) clean
2. FS headset behind dock hub A severely "robotic"
3. same, headset moved 30 cm away severely "robotic"
(rules out mic proximity/level)
4. FS headset on a DIRECT root port clean
5. FS headset behind dock hub B severely "robotic" again
(immediately reversible)
A parallel capture of the same source during phase 5 (recording to a file
while the stream also feeds the call) contains audible subtle glitching
already at the capture side -- i.e. the corruption exists in the USB
capture data before any Bluetooth/mSBC processing. Amplitude analysis
shows no zero-runs or full-scale clicks, so the defect consists of small
sample-level discontinuities, which the frame-based mSBC codec then
amplifies into severe artifacts, while sample-based CVSD mostly masks
them.
What I ruled out
----------------
- Bluetooth host stack: btmon traces covering a clean -> robotic -> clean
cycle show the HCI SCO TX stream is byte-perfect (intact 60-byte mSBC
framing with H2 headers, ~3333 frames/10 s constant) and the write
timing pattern is identical between clean and robotic phases (bursts of
3x24 B every ~7.5 ms). The RX direction is likewise clean. So
BlueZ/PipeWire/btusb submit correct data on time; the corruption
happens elsewhere.
- Audio content/level: same speech, same position (phase 3).
- The specific adapter/hub: reproduced behind two different hub chains,
and with a different FS combo headset (Sennheiser) behind a different
(Thunderbolt) dock in another location -- there the mSBC *downlink*
died completely while CVSD kept working.
- PipeWire graph effects: an *idle* parallel capture from the FS device
behind the dock (both via PipeWire and via direct ALSA hw:) does NOT
disturb a call whose uplink comes from the HS webcam -- the corruption
only matters when the TT capture stream is the one feeding the call.
Consistent with the corruption being on the TT capture stream itself.
Possibly related: "Bluetooth: hci0: corrupted SCO packet" bursts (~14-32
messages) at SCO setup time, with both codecs, transient. Earlier this
year, on 6.18.8 with the Thunderbolt dock setup, mSBC showed frequent
decode errors but audio still flowed; I have not bisected.
Questions
---------
1. Is this a known limitation of xHCI TT split-isochronous scheduling
with two concurrent FS isoc streams (one behind a TT, one on a root
port)? EHCI had a software TT scheduler
(CONFIG_USB_EHCI_TT_NEWSCHED); as far as I can tell xHCI relies on
hardware scheduling with no equivalent knob.
2. Which captures would help most? I can provide btmon traces (a 26 MB
clean/robotic cycle), usbmon captures, xhci dynamic debug logs and
audio samples, and I'm happy to test patches.
Best regards,
--
Branislav Klocok
email: branislav.klocok@orava.sk
tel: +421908703366
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: xHCI TT: FS audio capture glitches when btusb SCO runs concurrently
2026-07-18 10:18 xHCI TT: FS audio capture glitches when btusb SCO runs concurrently Branislav Klocok
@ 2026-07-28 7:41 ` Mathias Nyman
0 siblings, 0 replies; 2+ messages in thread
From: Mathias Nyman @ 2026-07-28 7:41 UTC (permalink / raw)
To: Branislav Klocok, linux-usb; +Cc: linux-bluetooth, mathias.nyman
Hi
Back from vacation
On 7/18/26 13:18, Branislav Klocok wrote:
> Hi,
>
> I'd like to report (and ask for guidance on) an apparent conflict between
> two concurrent full-speed isochronous streams on the same xHCI controller:
> a full-speed USB audio device behind a hub (split transactions through the
> hub's TT) and the SCO endpoints of an Intel Bluetooth controller (btusb)
> on a root port.
>
> Short version: while an HFP call is active over Bluetooth (SCO), the
> capture stream of a full-speed USB headset plugged in *behind a dock hub*
> is subtly corrupted. After mSBC encoding and the telephony path, the far
> end hears severely "robotic" audio. Moving the same headset to a direct
> root port makes the problem disappear immediately; moving it back behind
> the dock brings it back. CVSD calls are perceptually unaffected.
>
> Environment
> -----------
> - ThinkPad X1 Carbon 6th gen; xHCI: Intel Sunrise Point-LP [8086:9d2f]
> - Kernel 7.1.3-1-default (openSUSE Tumbleweed), BlueZ 5.82,
> PipeWire 1.6.8 / WirePlumber 0.5.15 (HFP native backend, laptop = HF)
> - Bluetooth: Intel 8265 [8087:0a2b], full-speed, internal (bus 1 root
> port 7), fw ibt-12-16
> - USB headset: C-Media [0d8c:0014], full-speed, mono capture 48 kHz
> - Dock: Lenovo USB dock (hubs 17ef:3071/17ef:3070, cascade incl.
> 067b:2586 and 05e3:0610)
> - HFP counterpart: Android phone (Volla X23) as AG; a call was placed to
> a second handset held at my ear, so I judged the far-end quality
> directly while speaking
>
> SCO detail during mSBC: eSCO, air mode Transparent, 60-byte RX/TX packet
> length, btusb isoc alt setting 1 (9-byte packets), HCI SCO frames
> dlen 24. CVSD uses alt setting 2 (17-byte packets).
>
> Reproduction (single call, changing only the capture source / port)
> -------------------------------------------------------------------
> I kept the same position and speech style throughout and judged the
> quality on the far-end handset:
>
> uplink capture source far-end verdict
> 1. HS webcam (behind the same dock) clean
> 2. FS headset behind dock hub A severely "robotic"
> 3. same, headset moved 30 cm away severely "robotic"
> (rules out mic proximity/level)
> 4. FS headset on a DIRECT root port clean
> 5. FS headset behind dock hub B severely "robotic" again
> (immediately reversible)
>
> A parallel capture of the same source during phase 5 (recording to a file
> while the stream also feeds the call) contains audible subtle glitching
> already at the capture side -- i.e. the corruption exists in the USB
> capture data before any Bluetooth/mSBC processing. Amplitude analysis
> shows no zero-runs or full-scale clicks, so the defect consists of small
> sample-level discontinuities, which the frame-based mSBC codec then
> amplifies into severe artifacts, while sample-based CVSD mostly masks
> them.
>
> What I ruled out
> ----------------
> - Bluetooth host stack: btmon traces covering a clean -> robotic -> clean
> cycle show the HCI SCO TX stream is byte-perfect (intact 60-byte mSBC
> framing with H2 headers, ~3333 frames/10 s constant) and the write
> timing pattern is identical between clean and robotic phases (bursts of
> 3x24 B every ~7.5 ms). The RX direction is likewise clean. So
> BlueZ/PipeWire/btusb submit correct data on time; the corruption
> happens elsewhere.
> - Audio content/level: same speech, same position (phase 3).
> - The specific adapter/hub: reproduced behind two different hub chains,
> and with a different FS combo headset (Sennheiser) behind a different
> (Thunderbolt) dock in another location -- there the mSBC *downlink*
> died completely while CVSD kept working.
> - PipeWire graph effects: an *idle* parallel capture from the FS device
> behind the dock (both via PipeWire and via direct ALSA hw:) does NOT
> disturb a call whose uplink comes from the HS webcam -- the corruption
> only matters when the TT capture stream is the one feeding the call.
> Consistent with the corruption being on the TT capture stream itself.
>
> Possibly related: "Bluetooth: hci0: corrupted SCO packet" bursts (~14-32
> messages) at SCO setup time, with both codecs, transient. Earlier this
> year, on 6.18.8 with the Thunderbolt dock setup, mSBC showed frequent
> decode errors but audio still flowed; I have not bisected.
>
> Questions
> ---------
> 1. Is this a known limitation of xHCI TT split-isochronous scheduling
> with two concurrent FS isoc streams (one behind a TT, one on a root
> port)? EHCI had a software TT scheduler
> (CONFIG_USB_EHCI_TT_NEWSCHED); as far as I can tell xHCI relies on
> hardware scheduling with no equivalent knob.
> 2. Which captures would help most? I can provide btmon traces (a 26 MB
> clean/robotic cycle), usbmon captures, xhci dynamic debug logs and
> audio samples, and I'm happy to test patches.
both xhci traces, and dynamic debug of a failing case behind a hub,
and successful case behind a roothub port could reveal something.
mount -t debugfs none /sys/kernel/debug
echo 'module xhci_hcd =p' >/sys/kernel/debug/dynamic_debug/control
echo 'module usbcore =p' >/sys/kernel/debug/dynamic_debug/control
echo 81920 > /sys/kernel/debug/tracing/buffer_size_kb
echo 1 > /sys/kernel/debug/tracing/events/xhci-hcd/enable
echo 1 > /sys/kernel/debug/tracing/tracing_on
< Reproduce issue >
Send output of dmesg
Send content of /sys/kernel/debug/tracing/trace
xhci traces should show all split transaction errors, and ring
under/overrun events.
There are a couple patches related to isoc transfer scheduling that
could be worth testing. They are not directly related to split
transactions but maybe worth a shot.
https://lore.kernel.org/linux-usb/20260513143533.52992-1-mathias.nyman@linux.intel.com/
https://lore.kernel.org/linux-usb/20260513143533.52992-2-mathias.nyman@linux.intel.com/
-Mathias
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-07-28 7:41 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-18 10:18 xHCI TT: FS audio capture glitches when btusb SCO runs concurrently Branislav Klocok
2026-07-28 7:41 ` Mathias Nyman
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox