How do I diagnose a Bluetooth problem on Fedora Linux?

Some things to check…

Gather information about the hardware

For example:

$ sudo dnf install inxi
$ inxi --bluetooth
Bluetooth: Device-1: Intel AX200 Bluetooth type: USB driver: btusb 
           Report: rfkill ID: hci0 state: up address: see --recommends 
$ lsusb | grep -i bluetooth
Bus 001 Device 012: ID 8087:0029 Intel Corp. AX200 Bluetooth

Check wireless radios

$ nmcli radio all
WIFI-HW  WIFI     WWAN-HW  WWAN    
enabled  enabled  enabled  enabled 
$ rfkill list all
0: hci0: Bluetooth
	Soft blocked: no
	Hard blocked: no
1: phy0: Wireless LAN
	Soft blocked: no
	Hard blocked: no

Hard blocked means “blocked by hardware,” for example by a hardware switch or BIOS setting.

Soft blocked means “blocked by software”.

If the above output indicates that Bluetooth is soft blocked, you can try unblocking it with the following command:

sudo rfkill unblock bluetooth

or

sudo rkfill unblock all

Check kernel messages

The following commands search the journal for kernel messages containing ‘blue’. The search term ‘blue’ does not contain any uppercase letters, therefore the search will be case-insensitive.

journalctl -k -b-0 -g blue # Show kernel messages containing 'blue' from the current boot
journalctl -k -b-1 -g blue # Show kernel messages containing 'blue' from the previous boot
journalctl -k -b-2 -g blue # Show kernel messages containing 'blue' from two boots ago
etc.

Equivalent with long options:

journalctl --dmesg --boot=-0 --grep blue

Or, instead of filtering the journal entries, it’s often better to utilize your pager’s search features. Remove the -g, --grep option from the above journalctl command and, when viewing the results in your pager, press / and the search term followed by ENTER to search through the results. Pressing ‘n’ or ‘N’ will move to the next or previous match, respectively. This approach has the advantage that it shows surrounding context. I recommend adding the i option to the SYSTEMD_LESS environment variable so that the search is case-insensitive unless your search term contains uppercase letters. To do this, put export SYSTEMD_LESS=FRSXMKi in your ~/.bash_profile, or equivalent wherever you like to set environment variables. Log out and back in to make the environment variable take effect.

See if there is a difference in the kernel messages between when bluetooth worked and when it didn’t.

bluetoothctl

$ bluetoothctl
Agent registered
[Logitech K810]# help

Excerpt from the help listing:

list           List available controllers
show [ctrl]    Controller information
power <on/off> Set controller power
devices        List available devices
paired-devices List paired devices
info [dev]     Device information
connect <dev>  Connect device

The show command will show detailed information about your bluetooth controller, including whether it is powered on.

7 Likes