Arch Linux, Niri, MT7925 Bluetooth, and the Kernel From Hell
I only wanted to update my machine.
You know. Normal Linux user hubris.
A little pacman -Syu, a reboot, maybe five minutes of smug satisfaction because the system came back up. Instead I got the classic Linux desktop experience: login weirdness, missing panels, Bluetooth vanishing into the void, and me yelling at a computer like it personally betrayed my bloodline.
This is the story of how I fixed my Arch install by not trusting the new kernel.
The machine#
My little archbox an ASUS ProArt PX13 / AI MAX system running Arch Linux with Wayland and niri.
The important hardware villain:
MediaTek MT7925 Wi-Fi 7 / Bluetooth combo chip
Wi-Fi PCI device: 14c3:7925
Bluetooth USB device: 13d3:3602 IMC Networks Wireless_Device
The working kernel:
7.0.5-arch1-1
The bastard kernel:
7.0.7-arch1-1
First problem: Niri login was cursed#
After rebooting, SDDM would let me log in, then dump me back, or I would need to log in twice. Then Waybar was gone. Or worse: Waybar existed, but not on the session I was actually looking at.
Very cool. Very normal. Very “desktop Linux is ready for everyone”.
The logs showed Niri starting through the packaged session wrapper:
/usr/bin/niri-session
That wrapper goes through user systemd. On my setup it could start Niri before the SDDM/logind seat was ready, so Niri tried to touch DRM and got smacked:
/dev/dri/card1
Permission denied
session is not active
So the workaround was a local shim:
~/.local/bin/niri-session
with:
#!/bin/sh
exec /usr/bin/niri --session
And SDDM needed to actually find that first, so ~/.zprofile now has:
export PATH="$HOME/.local/bin:$PATH"
This made Niri login again.
Then came the second punch.
Waybar was starting a ghost Niri#
My waybar.service was enabled in default.target and had this wonderful little footgun:
Requires=niri.service
So user systemd started Waybar, Waybar required Niri, systemd spawned a second Niri, and then I had one real SDDM-launched Niri plus one cursed headless/early Niri. Waybar attached to the wrong one.
Absolute clown circus.
The fix:
- remove
Requires=niri.service - stop enabling Waybar from
default.target - start/restart Waybar from the actual Niri startup after the real session environment exists
The Niri config now imports the real Wayland environment and restarts Waybar from inside the real session:
systemctl --user import-environment WAYLAND_DISPLAY DISPLAY XDG_CURRENT_DESKTOP XDG_SESSION_TYPE NIRI_SOCKET
systemctl --user restart waybar.service
Now I get one Niri and one Waybar. Revolutionary technology.
Second problem: Bluetooth went to hell#
After the kernel update, Bluetooth just stopped being Bluetooth.
On 7.0.7-arch1-1:
bluetoothctl show
said:
No default controller available
The kernel log said:
Bluetooth: hci0: Failed to send wmt func ctrl (-22)
Bluetooth: hci0: HCI Enhanced Setup Synchronous Connection command is advertised, but not supported.
The device was physically there:
13d3:3602 IMC Networks Wireless_Device
The driver was there:
btusb
btmtk
bluetooth
The service was running. The chip showed up. But BlueZ had no usable controller.
So, yes, the machine could see the Bluetooth chip. It just could not use the damn thing.
The forum rabbit hole#
This is not just me. MT7925 Bluetooth is apparently a small festival of pain.
Useful links I found:
- Arch forum: Mediatek MT7925 Bluetooth Controller Not Working
- Arch forum: MT7925 bluetooth vanished after dual-boot
- Arch forum: Bluetooth stopped working, again!
- Fedora bug: MT7925 Bluetooth functionality lost after firmware update
- Bazzite issue: Bluetooth (MediaTek MT7925) not working after updates
- CachyOS forum: MT7925 initializes twice but Bluetooth won’t work after boot
- Linux commit: btusb: Add support Mediatek MT7925
- Anecdotal but relevant: The Bluetooth Nightmare on Linux Kernel 7.0
Common symptoms in the threads:
Execution of wmt command timed out
Failed to send wmt func ctrl
Failed to send wmt patch dwnld
No default controller available
Bluetooth disappears until full power cycle
People mention power cycling, firmware weirdness, autosuspend, kernel regressions, and the chip holding onto broken state like it has emotional trauma.
Autosuspend mitigation#
The first mitigation was to stop USB autosuspend from poking the Bluetooth side of the MT7925.
Module option:
/etc/modprobe.d/btusb-no-autosuspend.conf
options btusb enable_autosuspend=0
Targeted udev rule:
/etc/udev/rules.d/99-mt7925-bt-no-autosuspend.rules
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="13d3", ATTR{idProduct}=="3602", TEST=="power/control", ATTR{power/control}="on"
Then:
sudo udevadm control --reload-rules
sudo udevadm trigger -s usb
sudo mkinitcpio -P
The settings applied:
But on 7.0.7, Bluetooth was still dead.
So no, autosuspend was not enough.
The actual fix: roll back the kernel#
The moment of clarity was simple:
7.0.7: Bluetooth dead- roll back to
7.0.5
Then Bluetooth was visible again:
bluetoothctl show
Controller EC:3A:56:11:91:B3 (public)
Powered: yes
PowerState: on
Moral of the story#
Arch did exactly what Arch does: gave me the new shiny thing immediately.
And now the machine works again.
For today.
