J'ai depuis un moment un miniPC, que j'utilise énormément (plus que mon PC de bureau classique).
Machine “Full” AMD, tournant sous GNU/Linux (ArchLinux plus précisément), où tout est fonctionnel. Enfin, quasiment tout.
J'ai remarqué il y a quelques mois, d'énormes souci dans la gestion du Bluetooth, notamment depuis les versions 6.9 du noyau Linux.
La machine
Il s'agit d'un mini PC (NUC dans le monde Intel), mais à base d'un APU AMD Ryzen 7 7735 + Radeon 680M.

Le mini PC en question

Autre angle de vue du mini PC.
Je l'ai utilisé initialement comme Steam Machine avec SteamOS 3 (Holo ISO), mais quitte à l'utiliser en mode “Bureau KDE”, autant installer directement ArchLinux, ce que j'ai fini par faire.
Sous SteamOS comme sous ArchLinux, aucun souci de bluetooth, jusque vers mai 2024, et le noyau 6.8 packagé dans ArchLinux. Par contre, souci majeur rencontré avec le kernel 6.9.
Je ne reviendrai pas sur mon fort râlage quand à la très mauvaise gestion du noyau Linux avec ArchLinux Pas possible de revenir sur la version précédente. C'est connu, documenté, encore et encore… https://social.nah.re/@alex/112497422381027230
Le bluetooth
Le meilleur moyen d'identifier le chipset utilisé, c'est d'ouvrir la machine.
Rien de compliqué. On retourne, on enlève 4 vis cruciforme, et on arrive là.

mini PC ouvert
On peut constater la présence de 2×8 Go de RAM DDR5 4800 au format SODIMM, et un gros dissipateur à gauche.
Retirons alors le dissipateur et le SSD au format M.2 NVMe (Crucial P3 plus 1 To)

Le module Wifi + Bluetooth est alors visible.
Identifiation

Mediatek MT7921K.
Le chipset Mediatek MT7921 est un SOC, System on Chip, comprenant un module WiFi et un module Bluetooth, une interface PCIe 2.0 et une interface USB.

Diagramme du MT7921. Source : Mediatek.
Caractéristiques
WiFi :
- Support IEEE 802.11 a/b/g/n/ac/ax
- Support 20MHz/40MHz bandwidth in 2.4GHz band and 20/40/80M bandwidth in 5GHz band
- MT7921 supports MU-MIMO RX and DBDC (dual band dual concurrent)
- IEEE 802.11 d/e/h/i/j/k/mc/r/v/w support
Bluetooth :
- Bluetooth specification 2.1+EDR
- Bluetooth 4.2 Low Energy (LE)
- Bluetooth 5.2
- Up do 7 BT link + 16 BLE link
Bref, support des normes WiFi 6E et Bluetooth 5.2.
Le wifi est vu comme étant connecté en PCIexpress, et le Bluetooth est vu comme étant connecté en USB.
C'est vérifiable via lspci et lsusb
lspci | grep MT 02:00.0 Network controller: MEDIATEK Corp. MT7921K (RZ608) Wi-Fi 6E 80MHz lsusb | grep MediaTek Bus 003 Device 002: ID 0e8d:0608 MediaTek Inc. Wireless_Device
Noyau Linux
Ce module MT7921K est parfaitement supporté sous GNU/Linux, que cela soit aussi bien le WiFi que le Bluetooth. Mais ça, c'était jusqu'à la version 6.9.
La principale problématique, c'est qu'un firmware (blob) doit être chargé dans le MT7921. Celui-ci est géré directement par Mediatek et fourni dans le pack de firmwares pour Linux.
Pendant un moment, des versions problématiques de ces firmwares ont été fournis, concordant avec des corrections côté BTUSB (le “pilote” Bluetooth USB).
Avec le noyau 6.10, le MT7921K fonctionnait de nouveau, avec le firmware 20240930.
Exemple ici avec le noyau 6.10.7 et le firmware en version 20241106
deck@Asuka ~> sudo dmesg | grep Bluetooth [ 2.163332] [ T379] Bluetooth: Core ver 2.22 [ 2.164446] [ T379] Bluetooth: HCI device and connection manager initialized [ 2.165094] [ T379] Bluetooth: HCI socket layer initialized [ 2.166064] [ T379] Bluetooth: L2CAP socket layer initialized [ 2.166384] [ T379] Bluetooth: SCO socket layer initialized [ 2.173897] [ T162] Bluetooth: hci0: HW/SW Version: 0x008a008a, Build Time: 20241106151414 [ 3.006925] [ T601] Bluetooth: BNEP (Ethernet Emulation) ver 1.3 [ 3.007299] [ T601] Bluetooth: BNEP filters: protocol multicast [ 3.007619] [ T601] Bluetooth: BNEP socket layer initialized [ 4.692839] [ T162] Bluetooth: hci0: Device setup in 2462553 usecs [ 4.692859] [ T162] Bluetooth: hci0: HCI Enhanced Setup Synchronous Connection command is advertised, but not supported. [ 4.759733] [ T162] Bluetooth: hci0: AOSP extensions version v1.00 [ 4.759745] [ T162] Bluetooth: hci0: AOSP quality report is supported [ 4.759899] [ T583] Bluetooth: MGMT ver 1.22 [ 64.207174] [ T1210] Bluetooth: RFCOMM TTY layer initialized [ 64.207185] [ T1210] Bluetooth: RFCOMM socket layer initialized [ 64.207189] [ T1210] Bluetooth: RFCOMM ver 1.11 deck@Asuka ~> uname -a Linux Asuka 6.10.7-asuka #5 SMP PREEMPT_DYNAMIC Tue Sep 3 13:30:09 CEST 2024 x86_64 GNU/Linux deck@Asuka ~>
Par contre, avec ce firmware et absolument tous les noyaux Linux supérieurs à 6.10 provoquaient une erreur lors de la tentative d'initialisation du bluetooth pour le chipset, et rendait non seulement le Bluetooth inutilisable (non détecté) mais en plus, pouvait carrément provoquer un crash côté gestion USB.
Par exemple, avec le noyau 6.13.2
deck@Asuka ~> sudo dmesg | grep Bluetooth [ 2.149103] [ T386] Bluetooth: Core ver 2.22 [ 2.149124] [ T386] Bluetooth: HCI device and connection manager initialized [ 2.149129] [ T386] Bluetooth: HCI socket layer initialized [ 2.149133] [ T386] Bluetooth: L2CAP socket layer initialized [ 2.149141] [ T386] Bluetooth: SCO socket layer initialized [ 3.207742] [ T681] Bluetooth: BNEP (Ethernet Emulation) ver 1.3 [ 3.207746] [ T681] Bluetooth: BNEP filters: protocol multicast [ 3.207750] [ T681] Bluetooth: BNEP socket layer initialized [ 7.191861] [ T128] Bluetooth: hci0: Failed to write uhw reg(-110) [ 7.194444] [ T128] Bluetooth: hci0: HW/SW Version: 0x008a008a, Build Time: 20241106151414 [ 26.135457] [ T128] Bluetooth: hci0: Execution of wmt command timed out [ 26.135470] [ T128] Bluetooth: hci0: Failed to send wmt patch dwnld (-110) [ 26.135493] [ T128] Bluetooth: hci0: Failed to set up firmware (-110) [ 26.135497] [ T128] Bluetooth: hci0: HCI Enhanced Setup Synchronous Connection command is advertised, but not supported. deck@Asuka ~> uname -a Linux Asuka 6.13.2-asuka #5 SMP PREEMPT_DYNAMIC Sat Feb 8 13:49:43 CET 2025 x86_64 GNU/Linux deck@Asuka ~>
Cette erreur est systématique avec tous les noyaux problématiques
hci0: Failed to write uhw reg(-110)
-110 : timeout error.
En cherchant, j'ai fini par trouver un bout d'explication sur la ML Linux.
En résumé, lors du démarrage, le noyau Linux fait la détection du matériel, charge les modules (les “pilotes”) et initialise le matériel.
Ici, au moment d'initialiser le module Bluetooth, une instruction RESET est envoyée avant de tenter de charger le firmware. Dans les anciennes versions du noyau, si une erreur arrivait, on l'ignorait et on poursuivait. Dans les nouvelles versions, on traite les erreurs. Et si une erreur arrive, on arrête le traitement.
Et c'est ce qui arrive ici avec le MT7921K. Un Reset est envoyé, et un timeout est retourné.
Ce problème a été isolé et un patch correctif est disponible, mais ne semble pas intégré dans le noyau vanilla (version kernel.org sans aucun patch ajouté par la distribution Linux).
https://lore.kernel.org/linux-bluetooth/643d8055-5a9f-4f5b-865b-830d33651dfe@leemhuis.info/T/
drivers/bluetooth/btmtk.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/bluetooth/btmtk.c b/drivers/bluetooth/btmtk.c index 2b7c80043aa2..a46f70135cbd 100644 --- a/drivers/bluetooth/btmtk.c +++ b/drivers/bluetooth/btmtk.c @@ -1326,7 +1326,6 @@ int btmtk_usb_setup(struct hci_dev *hdev) fwname = FIRMWARE_MT7668; break; case 0x7922: - case 0x7961: case 0x7925: /* Reset the device to ensure it's in the initial state before * downloading the firmware to ensure. @@ -1334,7 +1333,8 @@ int btmtk_usb_setup(struct hci_dev *hdev) if (!test_bit(BTMTK_FIRMWARE_LOADED, &btmtk_data->flags)) btmtk_usb_subsys_reset(hdev, dev_id); - + fallthrough; + case 0x7961: btmtk_fw_get_filename(fw_bin_name, sizeof(fw_bin_name), dev_id, fw_version, fw_flavor); --
Concrètement, le patch exclut le module bluetooth 0x7961 du bloc de code demandant le Reset du chipset. L'étiquette 0x7961 est ajoutée un peu plus bas pour pouvoir charger le firmware.
L'instruction fallthroug, c'est pour ignorer l'étiquette 0x7961 si on a un module Bluetooth correspondant à 0x7922 et 0x7925.
C'est bon ? On patche ?
Du coup, application du patch sur le noyau 6.13.2, compilation, signature MOK (Machine Owner Key) pour SecureBoot, extinction et débranchement du miniPC (requis pour effacer correctement la RAM du MT7921). Démarrage, login, et là…
deck@Asuka ~> sudo dmesg | grep Bluetooth [ 1.504568] [ T359] Bluetooth: Core ver 2.22 [ 1.504585] [ T359] Bluetooth: HCI device and connection manager initialized [ 1.504590] [ T359] Bluetooth: HCI socket layer initialized [ 1.504594] [ T359] Bluetooth: L2CAP socket layer initialized [ 1.504598] [ T359] Bluetooth: SCO socket layer initialized [ 1.511256] [ T128] Bluetooth: hci0: HW/SW Version: 0x008a008a, Build Time: 20241106151414 [ 2.028739] [ T614] Bluetooth: BNEP (Ethernet Emulation) ver 1.3 [ 2.028745] [ T614] Bluetooth: BNEP filters: protocol multicast [ 2.028751] [ T614] Bluetooth: BNEP socket layer initialized [ 3.950710] [ T128] Bluetooth: hci0: Device setup in 2385174 usecs [ 3.950723] [ T128] Bluetooth: hci0: HCI Enhanced Setup Synchronous Connection command is advertised, but not supported. [ 4.018900] [ T128] Bluetooth: hci0: AOSP extensions version v1.00 [ 4.018910] [ T128] Bluetooth: hci0: AOSP quality report is supported [ 4.019034] [ T596] Bluetooth: MGMT ver 1.23 [ 11.030208] [ T1141] Bluetooth: RFCOMM TTY layer initialized [ 11.030220] [ T1141] Bluetooth: RFCOMM socket layer initialized [ 11.030225] [ T1141] Bluetooth: RFCOMM ver 1.11 deck@Asuka ~> uname -a Linux Asuka 6.13.2-asuka #6 SMP PREEMPT_DYNAMIC Sat Feb 8 14:29:25 CET 2025 x86_64 GNU/Linux deck@Asuka ~>
Avec en plus, le retour de l'icône Bluetooth en bas à droite dans le bureau KDE.
Conclusion
Ce patch permet de corriger le problème de chargement du firmware pour le module Bluetooth du chipset MediaTek MT7921K, pour les noyaux supérieurs ou égaux à 6.11.