Bluetooth Devices Paired; Never Connecting

Ubuntu Version:
Kubuntu 25.04

Desktop Environment:
(The K in Kubuntu stands for Krying)
KDE Plasma v6.3.4
KDE Frameworks v6.12.0
Qt v6.8.3
Kernel v6.14.0-22-generic (64bit)

Problem Description:
Switched to Kubuntu back in May (was on Bazzite prior to, and Win10 prior to that). Since setting up my Ubuntu environment, I have not been able to connect to my Airpods via bluetooth. They still connect fine on Win10 and Bazzite (Win10 is dual-booting on the same nvme, Bazzite resides on a separate ssd). I’ve been troubleshooting and trying to figure it out on my own so far to no avail.

My bluetooth controller is able to scan, locate, and pair with other devices, but fails to connect successfully to anything.

From what I can tell via bluetoothctl, the device is changing class / powering off and immediately changing back / powering back on reliably after 30 seconds, then 55 seconds, then 30 seconds again, then 55, etc. the timings are not exact to the second, but they are thereabouts.

I’m not entirely sure what to make of it. Any suggestions?

Relevant System Information:

Realtek Semiconductor Co., Ltd. RTL8821CE 802.11ac PCIe Wireless Network Adapter

ASUS Prime B450M-A Baseboard
12xAMD Ryzen 5 3600X 6-Core CPU
32 GiB G.SKILL RAM
NVIDIA GeForce RTK 2060 GPU

Terminal Logs:
bluetoothctl

[bluetooth]# [CHG] Controller xx:xx:xx:xx:xx:xx Powered: yes
[bluetooth]# hci0 class of device changed: 0x000000
[bluetooth]# hci0 new_settings: connectable discoverable bondable link-security ssp br/edr secure-conn 
[bluetooth]# [CHG] Controller xx:xx:xx:xx:xx:xx Class: 0x00000000 (0)
[bluetooth]# [CHG] Controller xx:xx:xx:xx:xx:xx Powered: no
[bluetooth]# [CHG] Controller xx:xx:xx:xx:xx:xx Discovering: no
[bluetooth]# [CHG] Controller xx:xx:xx:xx:xx:xx PowerState: on
[bluetooth]# hci0 class of device changed: 0x6c0104
[bluetooth]# [CHG] Controller xx:xx:xx:xx:xx:xx Class: 0x006c0104 (7078148)
[bluetooth]# hci0 name changed: CIRCE
[bluetooth]# hci0 new_settings: powered connectable discoverable bondable link-security ssp br/edr secure-conn 
[bluetooth]# [CHG] Controller xx:xx:xx:xx:xx:xx Powered: yes

[bluetooth]# connect xx:xx:xx:xx:xx:xx

Attempting to connect to xx:xx:xx:xx:xx:xx
[bluetooth]# Failed to connect: org.bluez.Error.Failed br-connection-page-timeout

hciconfig

hci0:   Type: Primary  Bus: USB
        BD Address: 00:E9:3A:42:4B:22  ACL MTU: 820:8  SCO MTU: 255:12
        UP RUNNING PSCAN AUTH 
        RX bytes:372109 acl:36 sco:0 events:23780 errors:0
        TX bytes:363000 acl:37 sco:0 commands:23721 errors:0

What I’ve Tried:

  • bluetooth/main.conf to bredr, le, dual
  • hciconfig up, reset, piscan, iscan, pscan

What I’m Doing:

  • going over every line of each bluetooth-related file i can find
  • connect red strings on a pinboard
  • questioning whether or not i’m overlooking the obvious or going insane
  • both? maybe?

On Kubuntu the AirPods themselves are fine — it’s the Realtek
RTL8821CE Bluetooth stack.
That chip’s Linux driver still has flaky power-management; BlueZ tries to
open a link, the controller drops to low-power, BlueZ retries, and you see
the “class changed / Powered no / br-connection-page-timeout” loop.

Fastest workaround: keep the controller awake

Create a small udev rule that disables autosuspend for the dongle:

sudo nano /etc/udev/rules.d/99-bt-rtl8821ce.rules
ACTION=="add", SUBSYSTEM=="usb", ATTR{product}=="Bluetooth Radio",
  ATTR{power/autosuspend}="-1"

(If your lsusb shows a different product string, adjust it.)

Reload the rule and re-plug the adapter:

sudo udevadm control --reload
sudo udevadm trigger -s usb

Put the AirPods in pairing mode, then:

bluetoothctl
power on
scan on             # wait until you see them, then
pair XX:XX:...
connect XX:XX:...

With autosuspend off the link stays up and the connection succeeds.

Longer-term fix

Install the Realtek out-of-tree firmware that adds proper power-state
handling (and HFP audio):

sudo apt install git dkms build-essential
git clone https://github.com/lwfinger/rtw89.git
cd rtw89
sudo ./install_bt     # script builds and loads the BT part only

Reboot once; after that you can delete the udev rule.

Things that don’t matter

Switching BlueZ’s ControllerMode between dual / bredr / le won’t help.
KDE’s GUI shows “Dummy” until the controller stays powered; the moment the
autosuspend issue is gone, Plasma will pair the same way Windows does.

Try the udev tweak first 90 % of RTL8821CE “fails to connect” reports vanish
once autosuspend is disabled.