If Bluetooth silently disappeared on your laptop after a big apt full-upgrade — the toggle in your desktop’s quick settings is greyed out, and bluetoothctl show just says No default controller available — this post walks through how to confirm the exact cause and fix it. It cost me a full afternoon of debugging on an HP EliteBook 865 16″ G11, so hopefully this saves someone else the trouble.
The symptom
Bluetooth just isn’t there. Not blocked, not disabled — actually missing. Your desktop environment shows the Bluetooth control as unavailable, and the command line agrees:
$ bluetoothctl showNo default controller available
Confirm it’s this exact bug
First, rule out the boring causes — a hardware/software rfkill block, or the driver simply not being loaded:
rfkill listlsmod | grep -i btusb
If hci0 shows up unblocked and the btusb/btmtk/btintel/btrtl/btbcm modules are all loaded, the hardware and driver stack look fine on paper — so the real story is in the kernel log. Note that plain dmesg often won’t show it anymore once the system has been up for a while (its ring buffer rotates and evicts early-boot messages), so go straight to the persistent journal for the current boot:
journalctl -k -b 0 | grep -i -B2 -A10 "bluetooth\|hci0\|btmtk\|btusb"
If you’re hitting the same bug, you’ll see a full kernel Oops right after hci0: HW/SW Version is logged — a BUG: kernel NULL pointer dereference inside a workqueue called hci_power_on, with a call trace running through:
hci_power_on→hci_dev_do_open→hci_dev_open_sync→hci_dev_init_sync→hci_dev_setup_syncbtusb_mtk_setup→btmtk_setup_firmware_79xx→btmtk_usb_hci_wmt_syncusb_autopm_get_interface→__pm_runtime_resume(crash here)
The crash is fully deterministic — it happens on every single boot, the moment bluetoothd tries to power the adapter on, before it can ever register a controller. This is not something caused by the update itself breaking a config; the update was just a red herring that happened to coincide with when I noticed it.
Affected hardware: laptops with a MediaTek MT7921/MT7922 Wi-Fi+Bluetooth combo chip (the btusb/btmtk driver, “79xx” firmware family). Confirmed on an HP EliteBook 865 16″ G11 running Ubuntu 24.04 “Noble” on the generic kernel track (6.8.0-139-generic) — but this is a driver bug, not something HP- or EliteBook-specific, so it likely affects other MT7921/MT7922 laptops too.
Root cause
It’s a known bug in the kernel’s btmtk driver — uninitialized/mismanaged state in the MediaTek firmware setup path around USB power management. Ubuntu already tracks a closely related fix (Launchpad bug #2092473, “Fix system hang issue caused by the btmtk driver”) which cherry-picks upstream commit 61c5a3def90a (“Bluetooth: btmtk: adjust the position to init iso data anchor”). The important detail: that fix landed in Ubuntu’s linux-oem kernel line, not the generic one most desktop installs run — the OEM kernel track gets hardware-enablement and driver fixes for newer laptop models well before they trickle down to generic.
The fix: switch to the OEM kernel
Check what’s available for your release, and grab the newest one:
apt search linux-oemsudo apt install linux-oem-24.04d # use whatever the newest one turns out to besudo update-initramfs -u -k allsudo reboot
After rebooting, confirm you’re actually running it:
$ uname -r6.17.0-1032-oem
Then the real test:
$ bluetoothctl showController XX:XX:XX:XX:XX:XX (public) ... Powered: yes
A real controller with Powered: yes — that’s the fix confirmed.
Make sure it actually boots into it
Installing the OEM kernel doesn’t automatically make GRUB default to it. Check this first:
cat /etc/default/grub | grep -i grub_default
If it shows GRUB_DEFAULT=0 (or any fixed number), GRUB will always boot the first menu entry no matter what you set as the saved default — so fix that first, then point it at the new kernel:
sudo sed -i 's/^GRUB_DEFAULT=.*/GRUB_DEFAULT=saved/' /etc/default/grubecho 'GRUB_SAVEDEFAULT=true' | sudo tee -a /etc/default/grubsudo grub-set-default "Advanced options for Ubuntu>Ubuntu, with Linux 6.17.0-1032-oem"sudo update-grubsudo reboot
Adjust the exact kernel version and menu entry text to match your own system — list what’s actually in your GRUB menu with:
awk -F\' '/menuentry / {print $2}' /boot/grub/grub.cfg
One more gotcha: if GRUB_TIMEOUT_STYLE=hidden is set, GRUB won’t even show you a menu — it just silently boots the saved entry after the timeout. If you’re used to pressing a key during boot (say, from an earlier recovery-mode session), you might end up hand-picking a kernel out of habit even though the saved default was already correct. Check /boot/grub/grubenv for saved_entry to see what’s actually set before assuming it’s broken.
One more thing: a “frozen” boot right after a big upgrade
Separately from the Bluetooth issue — if your screen seems to hang forever on the boot splash logo right after a large apt full-upgrade, don’t panic and don’t force a hard power-off immediately. Two things worth checking first:
- Press
Ctrl+Alt+F3to switch to a text console. If you land on a working login prompt, the system actually finished booting — it’s just the graphical splash (Plymouth) that’s stuck on-screen, which is purely cosmetic. - If you have a SIM/WWAN-equipped laptop with the same MediaTek family of chips, check
journalctl -b 0 | grep -i modem.ModemManagercan get stuck in an infinite respawn loop trying (and failing) to initialize amtk_t7xxmodem, spawning a new modem object every couple of seconds — noisy and wasteful, but not usually what’s actually blocking the boot.
Neither of these turned out to be related to the Bluetooth crash above — but they showed up in the same troubleshooting session and are worth ruling out before assuming your system is broken.
tl;dr
- Confirm the crash:
journalctl -k -b 0 | grep -i -B2 -A10 "bluetooth\|hci0\|btmtk\|btusb"shows a NULL pointer Oops inbtmtk_setup_firmware_79xx. - Install the newest OEM kernel:
sudo apt install linux-oem-24.04d(checkapt search linux-oemfor the current newest). - Make sure GRUB actually defaults to it:
GRUB_DEFAULT=saved+GRUB_SAVEDEFAULT=truein/etc/default/grub, thengrub-set-default+update-grub. - Reboot, confirm with
uname -r, thenbluetoothctl showshould finally show a powered controller.
Hope this saves someone else the afternoon it cost me.











