From: Iaroslav Voitovych <yaroslav.voytovych@gmail.com>
To: linux-bluetooth@vger.kernel.org
Cc: Marcel Holtmann <marcel@holtmann.org>,
Luiz Augusto von Dentz <luiz.dentz@gmail.com>,
Zijun Hu <zijun.hu@oss.qualcomm.com>,
Shuai Zhang <shuai.zhang@oss.qualcomm.com>,
Bartosz Golaszewski <brgl@kernel.org>,
Tibor Harcsa <silurust@gmail.com>
Subject: [REPORT] btusb: QCA9377 13d3:3503 on ROM firmware: HCI hang during mSBC SCO
Date: Thu, 29 Oct 2026 02:33:50 +0100 [thread overview]
Message-ID: <20261029013350.360574-1-yaroslav.voytovych@gmail.com> (raw)
Hi,
A report with two questions, mainly for Qualcomm; not a patch. For
13d3:3503 the kernel side is already fixed: dc16388d45ec ("Bluetooth:
btusb: Add IMC Networks QCA9377 to quirks table") is in v7.3 and in
stable releases, so I am not asking for another fix for this ID. The
entry was sent for BLE-scan errors; in my tests it also avoided the
controller-wide hang below.
Summary
-------
Without a btusb entry this QCA9377 runs its ROM firmware (ROM 0x302,
build 0x111). In twelve recorded failures, the first HCI command
issued after a transparent (mSBC) SCO link came up got no reply, and
later commands timed out too. With the QCA setup path, which loads
qca/rampatch_usb_00000302.bin and qca/nvm_usb_00000302.bin, 74 SCO
links logged no command timeout. What goes wrong inside the
controller I do not know.
Questions
---------
1. Is this known for ROME ROM 0x302 build 0x111? Is there an erratum,
an affected ROM range, or a rampatch/NVM revision that addresses
it?
2. Is there a list of ROME-based USB IDs, or a reliable way to
identify such adapters, that could be compared with btusb's table?
This year three were added one at a time, each after a user ran
into the 0x2005 BLE-scan errors: 13d3:3503 (dc16388d45ec),
0b05:1868 (d54601f21faf) and 0b05:1825 (cfa67a1dbfd9). An
earlier, unmerged submission for 0b05:1825 (2026-07-21) also
reported SCO audio broken on the ROM firmware ("corrupted SCO
packet", no HFP microphone).
On the ROM firmware
-------------------
The device has isochronous alternate settings 1-5 (wMaxPacketSize
9/17/25/33/49) and no alt 6. On the transparent links recorded here
btusb selected alt 1 (read live from sysfs), and the captures show
each 27-byte SCO buffer sent as three 9-byte USB packets. Setup
Synchronous Connection (0x0428) is answered and the link streams.
One of the twelve failures (kernel log, Bluetooth dynamic debug on;
"evt 5" is HCI_NOTIFY_ENABLE_SCO_TRANSP in btusb_notify()):
02:09:36.646940 hci0 opcode 0x0428 plen 17
02:09:36.718906 hci0 evt 5
02:09:44.049893 hci0: handle 0x06 reason 0x13
02:09:44.049956 hci0: Opcode 0x0406
02:09:46.067797 Bluetooth: hci0: command 0x0406 tx timeout
Here the stream ran about 7.3 s before the Disconnect. In all twelve
failures the first command after link-up timed out about 2 s after
it was issued; where the delay from link-up is recorded, it was
34 ms to 9.65 s. The command was 0x0406 Disconnect in six, 0x0c1a
Write Scan Enable in one, the bare "command tx timeout" in five.
Whether the command causes the hang or only finds it, I cannot tell
from the host side.
No later command was answered. In one failure I probed the USB side:
two GET_DESCRIPTOR transfers timed out with -110 while the device
stayed enumerated. Removing power recovered the controller; a warm
reboot did not always.
The twelve were on Ubuntu 7.0.0-29, -30, -31 and -34 kernels with
stock btusb and three headset models from three vendors. I have no
count of ROM-firmware links that did not fail, so no failure rate.
With the QCA setup path
-----------------------
Before setup the controller reports ROM 0x302, build 0x111 and a
status with neither QCA_PATCH_UPDATED nor QCA_SYSCFG_UPDATED set, so
btusb_setup_qca() loads both files; both loads return 0, and a later
version read reports patch build 0x3e8. On the same laptop, across
the same three headset models, 74 SCO links then logged no command
timeout: 50 mSBC, still on alt 1 with the legacy 0x0428
(btusb_setup_qca() sets HCI_QUIRK_BROKEN_ENHANCED_SETUP_SYNC_CONN),
and 24 CVSD. Of these,
58 ran on a diagnostic build giving this ID BTUSB_QCA_ROME without
BTUSB_WIDEBAND_SPEECH and without the reset callback, so no
reset could have hidden a timeout;
16 ran with the exact dc16388d45ec entry.
This does not separate the rampatch from the NVM. Nor does it
separate the firmware from BTUSB_QCA_ROME's other host-side effects,
which the diagnostic build kept: the shutdown handler, set_bdaddr,
the simultaneous-discovery quirk and the reset-resume check.
For anyone searching the archive with a similar failure on a QCA
ROME USB controller: check whether its USB ID selects btusb's QCA
setup path and whether the rampatch and NVM load.
Kernel log extracts, with the commands that produced them:
https://github.com/ivoitovych/qca9377-bt-hang/blob/4b56813d311d/contributions/CO-25-qualcomm-rom-report/EVIDENCE.md
Thanks,
Iaroslav Voitovych
next reply other threads:[~2026-10-29 1:33 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-29 1:33 Iaroslav Voitovych [this message]
2026-10-29 10:42 ` [REPORT] btusb: QCA9377 13d3:3503 on ROM firmware: HCI hang during mSBC SCO Zijun Hu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261029013350.360574-1-yaroslav.voytovych@gmail.com \
--to=yaroslav.voytovych@gmail.com \
--cc=brgl@kernel.org \
--cc=linux-bluetooth@vger.kernel.org \
--cc=luiz.dentz@gmail.com \
--cc=marcel@holtmann.org \
--cc=shuai.zhang@oss.qualcomm.com \
--cc=silurust@gmail.com \
--cc=zijun.hu@oss.qualcomm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox