Fix for Realtek RTL8821CE Bluetooth (USB ID 13d3:3558, IMC Networks / AzureWave) on
Bazzite and other Fedora Atomic systems, where AirPods (tested: AirPods Pro 3) pair but never
get working audio.
🇷🇺 Russian version: README.ru.md
- AirPods show up as
"<Name>'s AirPods Pro – Find My"; Connect does nothing. bluetoothctl pairsucceeds, butconnectfails withbr-connection-busy,br-connection-canceled,br-connection-refused,br-connection-page-timeoutorConnection timeout.pactl list cards shortnever shows abluez_card.…for the AirPods; no output device in the sound menu.journalctl -u bluetoothshowsavdtp_connect_cb() … Permission denied (13)/Host is down (112).- Without firmware loaded (cause 1 below),
btmonshowsEncryption Change … Status: LMP Response Timeout (0x22)followed byDisconnect … Reason: Authentication Failure (0x05), plusunexpected start framegarbage. - With the linux-firmware blob loaded (cause 2), pairing completes but connections drop with
Connection Timeout (0x08), A2DP is never set up, and later attempts end inPage Timeout (0x04). - Other Bluetooth devices (keyboard, speaker) work fine.
Check whether you have this adapter:
lsusb | grep -i 13d3:3558
journalctl -k -b | grep -i "RTL:"
Two separate problems:
- The kernel does not recognise
13d3:3558as Realtek, sobtusbnever uploads the controller firmware (noRTL: loading rtl_bt/rtl8821c_fw.binlines in the log). An upstream patch exists — "Bluetooth: btusb: Add Realtek RTL8821CE device 13d3:3558", bluetooth-next commit809a66378e9e— but has not reached the Bazzite kernel yet (7.2.7 at the time of writing). - With the RTL8821C firmware from linux-firmware (
0x75b8f098, December 2022) AirPods Pro 3 still don't work: pairing completes, but connections time out and A2DP is never established. Realtek's current Windows driver (16.4033.2312.2503, which explicitly listsUSB\VID_13D3&PID_3558) ships a newer firmware (0xd7c83bcf) in the same format. With it the adapter reports Bluetooth 5.0 instead of 4.2 and AirPods connect with audio.
- Downloads the Realtek Windows driver from Microsoft's own Update Catalog, extracts the RTL8821C firmware and verifies its SHA-256. Nothing proprietary is redistributed in this repository.
- Adds the kernel argument
firmware_class.path=/var/lib/airpods-bt/fw, so the kernel prefers that firmware. Onlyrtl8821c_fw.binis overridden; everything else still comes from/usr/lib/firmware. - If the running kernel does not know
13d3:3558, buildsbtusbwith the ID added inside a Podman container (sources from kernel.org for your exact kernel version, headers from the preinstalledkernel-devel) and loads it at boot. - After every kernel update the module is rebuilt automatically on the next boot. Once your kernel includes the upstream patch, the module step switches itself off and only the firmware is used.
- Nothing in
/usris modified. Secure Boot must be disabled (the module is unsigned).
git clone https://github.com/olegoonline/bazzite-rtl8821ce-airpods-fix
cd bazzite-rtl8821ce-airpods-fix
sudo ./install.sh
The first run downloads a Fedora build container and the driver (a few minutes). Then shut the computer down completely (not reboot), wait 10 seconds and power it on. The controller keeps the old firmware in RAM across warm reboots.
Verify:
journalctl -k -b | grep -i "RTL:" | tail -3 # → fw version 0xd7c83bcf
systemctl status airpods-bt-fix.service
Then pair the AirPods from scratch. Type the commands one at a time and keep the case lid open, with the setup button held until the light flashes white. Turn Bluetooth off on your iPhone first:
bluetoothctl remove <AIRPODS_MAC>
bluetoothctl
[bluetoothctl]> scan on # wait for "AirPods Pro"
[bluetoothctl]> scan off
[bluetoothctl]> pair <AIRPODS_MAC> # wait for "Pairing successful"
[bluetoothctl]> trust <AIRPODS_MAC>
[bluetoothctl]> connect <AIRPODS_MAC>
pactl list cards short # bluez_card.XX_XX_… should appear
pactl set-card-profile bluez_card.XX_XX_XX_XX_XX_XX a2dp-sink
sudo ./uninstall.sh
Then shut down and power on.
- Don't use the KDE "Add device" wizard and
bluetoothctlat the same time, and don't leavescan onrunning while connecting. Both causebr-connection-busy. ControllerMode = bredrin/etc/bluetooth/main.confhides the BLE "Find My" duplicates, but it is not required.- After the first pairing, connect from the Bluetooth applet in the panel (or just take the AirPods out of the case: they are trusted and reconnect by themselves). Don't use the "+" pairing wizard for already-paired AirPods, because it tries to pair them again. If the applet's Connect fails, the AirPods were probably asleep in the case. Take them out and try again.
- Keep Bluetooth off on a nearby iPhone, or the AirPods will switch back to it.
- Connecting takes about 10–15 seconds. That's normal for AirPods on Linux: they have to wake up,
and BlueZ sets up both the music (A2DP) and headset (HFP) profiles. Apple's faster
reconnection is iOS/macOS-only. To shave off a few seconds, enable fast connectable mode:
If connecting takes 30 s or more and
sudo sed -i 's/^#\?\s*FastConnectable\s*=.*/FastConnectable = true/' /etc/bluetooth/main.conf grep -q '^FastConnectable' /etc/bluetooth/main.conf || sudo sed -i '/^\[General\]/a FastConnectable = true' /etc/bluetooth/main.conf sudo systemctl restart bluetoothjournalctl -u bluetoothshowsHands-Free … timed out, you can disable the headset profile. The AirPods microphone will stop working:mkdir -p ~/.config/wireplumber/wireplumber.conf.d printf 'monitor.bluez.properties = {\n bluez5.roles = [ a2dp_sink a2dp_source ]\n}\n' > ~/.config/wireplumber/wireplumber.conf.d/51-a2dp-only.conf systemctl --user restart wireplumber - Logs:
journalctl -u airpods-bt-fix -b.
Bazzite 44 (kernel 7.2.7-ogc1.1.fc44), BlueZ 5.87, PipeWire, KDE Plasma, AirPods Pro 3,
adapter 13d3:3558 (RTL8821CE, lmp_subver 0x8821, hci_rev 0x000c).
Reports for other RTL8821CE IDs (0bda:c821, 13d3:3529, …) are welcome.
The firmware part may help them too, but the module part only applies to 13d3:3558.
Provided as is. The firmware is loaded into the controller's RAM only; nothing is flashed, and
uninstall.sh plus a cold boot restores the stock state.