Bluetooth Gone After an Ubuntu Update? MediaTek MT7921 Kernel Crash Fix (HP EliteBook)

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 show
No 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 list
lsmod | 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_onhci_dev_do_openhci_dev_open_synchci_dev_init_synchci_dev_setup_sync
  • btusb_mtk_setupbtmtk_setup_firmware_79xxbtmtk_usb_hci_wmt_sync
  • usb_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-oem
sudo apt install linux-oem-24.04d # use whatever the newest one turns out to be
sudo update-initramfs -u -k all
sudo reboot

After rebooting, confirm you’re actually running it:

$ uname -r
6.17.0-1032-oem

Then the real test:

$ bluetoothctl show
Controller 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/grub
echo 'GRUB_SAVEDEFAULT=true' | sudo tee -a /etc/default/grub
sudo grub-set-default "Advanced options for Ubuntu>Ubuntu, with Linux 6.17.0-1032-oem"
sudo update-grub
sudo 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+F3 to 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. ModemManager can get stuck in an infinite respawn loop trying (and failing) to initialize a mtk_t7xx modem, 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

  1. Confirm the crash: journalctl -k -b 0 | grep -i -B2 -A10 "bluetooth\|hci0\|btmtk\|btusb" shows a NULL pointer Oops in btmtk_setup_firmware_79xx.
  2. Install the newest OEM kernel: sudo apt install linux-oem-24.04d (check apt search linux-oem for the current newest).
  3. Make sure GRUB actually defaults to it: GRUB_DEFAULT=saved + GRUB_SAVEDEFAULT=true in /etc/default/grub, then grub-set-default + update-grub.
  4. Reboot, confirm with uname -r, then bluetoothctl show should finally show a powered controller.

Hope this saves someone else the afternoon it cost me.