You are not logged in.
Hi everyone,
I am trying to get Bluetooth LE Audio (ISO channels / Auracast) working on a Qualcomm WCN785x (FastConnect 7800) Wi-Fi/BT card. The card is installed in a Framework 13 Laptop running the latest Arch Kernel.
The Problem:
The bluetooth controller seems to be stuck in a fallback state. btqca detects it with the generic "Rome" ID (0x190200) instead of the proper "Hamilton" ID.
Consequently, it requests the legacy rampatch_usb_00190200.bin firmware.
Even when forcing the correct Hamilton firmware (hmtbtfw20.tlv) via symlinks to the requested legacy name, the driver loads it (Version upgrades from 12 to 13, TxPower increases), but ISO support remains broken.
I'm seeing: Bluetooth: hci0: HCI Enhanced Setup Synchronous Connection command is advertised, but not supported.
bluetoothctl show confirms missing Broadcast Audio Announcement (0x1852) UUIDs.
System Info:
Card: Qualcomm WCN785x (FastConnect 7800) - aftermarket upgrade
Kernel: 6.17.8-arch1-1 (current stable)
BlueZ: 5.79 (Daemon started with -E)
Attempts:
Cold boot (Battery disconnect) to clear controller state -> No change, stuck on ID 0x190200.
Symlink hack (mapping hmt... to rampatch...) -> Firmware loads, but ISO handshake fails.
Has anyone with a WCN785x on Arch managed to get the btqca driver to correctly identify the chip without falling back to the Rome ID?
Is this a known regression in the current kernel module for this chipset?
Thanks! And sorry that I have a 2nd question to this card.
Offline
I am in the exact same spot: I just upgrade my Framework 16 7040 laptop to the Qualcomm NCM865 chip. WiFi is working great (negotiating 6Ghz with 320Mhz channel width and getting ~2Gbits/sec on my LAN), but bluetooth is essentially not functional. As you said, the driver is trying to load the "rome" firmware instead of "hamilton", and crashing:
~ φ sudo dmesg | grep -i blue
[ 3.689180] Bluetooth: Core ver 2.22
[ 3.689204] NET: Registered PF_BLUETOOTH protocol family
[ 3.689206] Bluetooth: HCI device and connection manager initialized
[ 3.689214] Bluetooth: HCI socket layer initialized
[ 3.689217] Bluetooth: L2CAP socket layer initialized
[ 3.689222] Bluetooth: SCO socket layer initialized
[ 3.749593] Bluetooth: hci0: using rampatch file: qca/rampatch_usb_00190200.bin
[ 3.749596] Bluetooth: hci0: QCA: patch rome 0x190200 build 0x8567, firmware rome 0x190200 build 0x43fb
[ 4.401432] Bluetooth: hci0: using NVM file: qca/nvm_usb_00190200.bin
[ 4.540419] Bluetooth: hci0: HCI Enhanced Setup Synchronous Connection command is advertised, but not supported.
[ 5.436028] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
[ 5.436033] Bluetooth: BNEP filters: protocol multicast
[ 5.436038] Bluetooth: BNEP socket layer initialized
[ 5.436996] Bluetooth: MGMT ver 1.23
[ 9.380816] Bluetooth: RFCOMM TTY layer initialized
[ 9.380825] Bluetooth: RFCOMM socket layer initialized
[ 9.380827] Bluetooth: RFCOMM ver 1.11
[ 1462.580351] Bluetooth: hci0: ACL memdump size(589824)
[ 1463.150787] Bluetooth: hci0: memdump done: pkts(2418), total(589824)
[ 1463.158213] Bluetooth: hci0: hardware error 0x85
[ 1463.567296] Bluetooth: hci0: HCI reset during shutdown failed
[ 1464.082310] Bluetooth: hci1: using NVM file: qca/nvm_usb_00190200.bin
[ 1464.225423] Bluetooth: hci1: HCI Enhanced Setup Synchronous Connection command is advertised, but not supported.
[ 1464.657452] Bluetooth: MGMT ver 1.23
[ 1751.140438] Bluetooth: ISO socket layer initializedWere you ever able to get this working?
Last edited by sdmcclain (2026-01-11 20:32:36)
Offline
The problem is indeed that the USB ID for the Quectel NCM865 module (2c7c:0130) is missing from the kernel's btusb driver. Because the driver doesn't recognize this specific ID, it falls back to a generic legacy configuration. This causes it to identify as a "Rome" device (0x190200) and try to load the wrong firmware (rampatch_usb_00190200.bin) instead of the correct "Hamilton" firmware (WCN785x) needed for this chip.
I have submitted a patch to the Linux Bluetooth mailing list to fix this by explicitly adding the ID to the btusb_device_table with the correct flags (BTUSB_QCA_WCN6855 | BTUSB_WIDEBAND_SPEECH).
Until the patch lands in the mainline kernel (or the Arch package), you would need to patch the btusb module yourself (e.g., via DKMS or a custom kernel build).
Workaround: Patching btusb via DKMS
This method creates a DKMS module that survives kernel updates (as long as the internal driver API doesn't change drastically).
1. Install prerequisites:
sudo pacman -S linux-headers dkms git base-devel2. Create a workspace:
mkdir -p ~/btusb-ncm865
cd ~/btusb-ncm8653. Download the necessary source files:
This part is not tested... I used git to get the repo, but this files should be enough
Since btusb.c depends on several local headers in the kernel source tree, we need to fetch them.
# URL to the drivers/bluetooth directory in the kernel tree
BASE_URL="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/drivers/bluetooth"
wget "$BASE_URL/btusb.c"
wget "$BASE_URL/btintel.h"
wget "$BASE_URL/btrtl.h"
wget "$BASE_URL/btqca.h"
wget "$BASE_URL/btmtk.h"4. Apply the patch:
You can edit btusb.c manually to add the ID to btusb_table, or use this sed command to insert it after the Intel entry:
sed -i '/{ USB_DEVICE(0x8087, 0x0a5a),/a \ \t/* Quectel NCM865 */\n\t{ USB_DEVICE(0x2c7c, 0x0130), .driver_info = BTUSB_QCA_WCN6855 |\n\t\t\t\t\t\t BTUSB_WIDEBAND_SPEECH },' btusb.c5. Create a Makefile:
Create a file named Makefile with the following content:
obj-m += btusb.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean6. Create dkms.conf:
Create a file named dkms.conf:
PACKAGE_NAME="btusb-ncm865"
PACKAGE_VERSION="1.0"
BUILT_MODULE_NAME[0]="btusb"
DEST_MODULE_LOCATION[0]="/kernel/drivers/bluetooth"
AUTOINSTALL="yes"7. Install the module:
sudo mkdir -p /usr/src/btusb-ncm865-1.0
sudo cp * /usr/src/btusb-ncm865-1.0/
sudo dkms add -m btusb-ncm865 -v 1.0
sudo dkms build -m btusb-ncm865 -v 1.0
sudo dkms install -m btusb-ncm865 -v 1.08. Reload:
sudo modprobe -r btusb
sudo modprobe btusbOne last request:
Since I am testing this on a Framework 13 and you are on a Framework 16, it would be incredibly helpful if you could report your results to the Linux Bluetooth mailing list.
I have an ongoing patch submission there, and the maintainers are currently evaluating why this specific fix is needed despite existing entries in the kernel. Confirmation from another user with different hardware would greatly help to get this merged into the mainline kernel faster.
You can reply to the thread here:
https://lore.kernel.org/linux-bluetooth … online.de/
Offline