You’ve disabled the boneheaded Lenovo WiFi adapter whitelist using a tool like 1vyrain, installed a better adapter like the Intel Dual Band Wireless-AC 7260, and found that Bluetooth is not working as intended on your ThinkPad T430 running Linux?

Here’s a guide on what you can try to resolve some issues you may encounter.

The integrated Bluetooth adapter

The ThinkPad T430 comes with Bluetooth out of the box. Mine is this one:

Bus 001 Device 004: ID 0a5c:21e6 Broadcom Corp. BCM20702 Bluetooth 4.0 [ThinkPad]
And it looks something like this.
And it looks something like this.

I run Fedora Linux and frankly the experience with the stock adapter is horrible. Getting stuck while pairing a device or the GNOME Bluetooth settings GUI hanging isn’t a rare sight. Sometimes I’ve had to run a script to reset all USB devices to get things sorted out, or restart the machine altogether. This is not fun when a work call started 3 minutes ago and your Bluetooth headset is just not working.

After installing the new Intel WiFi adapter, I thought that I’d just disable the integrated Bluetooth controller via the UEFI settings. That should do the trick, right?

Nope. Apparently this disabled ALL bluetooth devices, including the one provided by the Intel adapter.

Well, no problem, I’ll just physically remove the Broadcom device and that should force the ThinkPad to use the Intel adapter, right?

Nope. Now the machine just shows no Bluetooth devices.

udev to the rescue

If you install the Intel adapter and don’t touch any of the settings, you’ll have two Bluetooth adapters. On my laptop, the OS used the Broadcom adapter by default, which was evident by all GUI interactions interfacing with the Broadcom one and throwing out errors in dmesg -w as a result.

Since disabling the Broadcom bluetooth adapter via other means did not work, I had to look for some solutions. One that I stumbled upon relied on udev rules.

Essentially, what you want to do is drop a file in /etc/udev/rules.d/, name it something like 81-bluetooth-hci.rules and make the contents something like this:

SUBSYSTEM=="usb", ATTRS{idVendor}=="0a5c", ATTRS{idProduct}=="21e6", ATTR{authorized}="0"

Make sure to replace the idVendor and idProduct with the correct values for your Bluetooth adapter. Output of lsusb will likely contain those values.

In my case, the output of lsusb is

Bus 001 Device 004: ID 0a5c:21e6 Broadcom Corp. BCM20702 Bluetooth 4.0 [ThinkPad]

The idVendor and idProduct info is in this string: ID 0a5c:21e6.

After making this change and restarting, you should see thatbluetoothctl list outputs only one Bluetooth device.

[host@T430 ~]$ bluetoothctl list
Controller AC:FD:CE:30:EB:BA T430 [default]

Because Bluetooth is still a hot mess in 2022, I still have to occasionally beat it with a hammer. However, the experience with the Intel adapter is much better and a simple “turn the adapter off and on again in the GUI” solved 99% of the issues I’ve encountered since then.

“Have you tried turning it off and on again?”

If for whatever reason this solution does not apply to you, and you feel like you want to hit your machine with a big hammer without having to restart it, then here’s a script that resets all the USB devices on your machine. I’ve observed that most Bluetooth adapters run over USB, which is why this script works with those as well.

It has helped me countless times when desperate for a quick Bluetooth fix on various desktops and laptops that I’ve used.

Run it at your own risk.

#!/bin/bash

for i in /sys/bus/pci/drivers/[uoex]hci_hcd/*:*; do
  [ -e "$i" ] || continue
  echo "${i##*/}" > "${i%/*}/unbind"
  echo "${i##*/}" > "${i%/*}/bind"
done