|Summary:||Cannot find ath3k bluetooth controller attached on USB|
|Product:||Drivers||Reporter:||Tianhao Chai (cth451)|
Description Tianhao Chai 2021-01-03 05:34:13 UTC
bluetoothctl (from bluez 5.55) cannot find the bluetooth controller on my ar5b22 wireless adapter. However /sys/class/bluetooth/hci0 points to the correct device. rfkill would toggle blocking/unblocking state without problem, but bluez won't be able to find the controller regardless. Steps to reproduce: 1. Boot up the system 2. Run 'bluetoothctl list'. This will print nothing on my system since this ath3012 is the only bluetooth adapter present, but wasn't found. 3. I checked /sys/class/bluetooth/hci0, where the device file pointed to the correct USB device number. Dmesg excerpt: [ 11.830504] Bluetooth: Core ver 2.22 [ 11.836192] Bluetooth: HCI device and connection manager initialized [ 11.838836] Bluetooth: HCI socket layer initialized [ 11.841382] Bluetooth: L2CAP socket layer initialized [ 11.843458] Bluetooth: SCO socket layer initialized [ 11.964674] Bluetooth: hci0: don't support firmware rome 0x11020000 [ 16.815785] Bluetooth: BNEP (Ethernet Emulation) ver 1.3 [ 16.815787] Bluetooth: BNEP filters: protocol multicast [ 16.815794] Bluetooth: BNEP socket layer initialized The specific piece of hardware from lsusb and lspci: Bus 001 Device 002: ID 13d3:3395 IMC Networks 23:00.0 Network controller: Qualcomm Atheros AR9462 Wireless Network Adapter (rev 01) Notably this issue is not present on kernel 5.9.x and looks very similar to bug ID 199271. A regression?
Comment 1 Tianhao Chai 2021-01-03 08:21:50 UTC
Apparently this ver_rom 0x11020000 has never been recorded in qca_devices_table defined in btusb.c. Before 5.10 (i.e. 5.9.x and possibly earlier), the function btusb_setup_qca() will short circuit and return 0 before querying the device table (the following from 5.9.16, btusb.c:3627): ver_rom = le32_to_cpu(ver.rom_version); /* Don't care about high ROM versions */ if (ver_rom & ~0xffffU) return 0; Since this check is removed in 5.10.x due to added support of WCN6855 (which has a high ROM version), the driver would return -ENODEV as this 0x11020000 doesn't exist in qca_devices_table in the first place. I am not sure how this should be resolved. We could check whether ver_rom == 0x11020000 and directly return 0 (and the card would work after that), but I think this is a very dirty approach.