Bug 211013

Summary: Cannot find ath3k bluetooth controller attached on USB
Product: Drivers Reporter: Tianhao Chai (cth451)
Component: BluetoothAssignee: linux-bluetooth (linux-bluetooth)
Severity: normal CC: aivaraslaimikis
Priority: P1    
Hardware: x86-64   
OS: Linux   
Kernel Version: 5.10.x Subsystem:
Regression: Yes Bisected commit-id:

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.
Comment 2 Tianhao Chai 2021-01-04 03:32:45 UTC

*** This bug has been marked as a duplicate of bug 210681 ***