Files
QualcommWireless/QualcommWifi
Erwan 2fb2450e11 fix(wifi): eliminate boot loop by removing synchronous 20s BHI delay and incompatible IOEthernetInterface
- Breakthroughs & Rétro-ingénierie :
  * Analyse de la cause racine du boot loop survenu lors du démarrage :
    1. Dans le commit précédent, IO80211Controller::start a réussi pour la première fois grâce à l allocation de IO80211WorkQueue.
    2. Cela a déclenché l exécution de QualcommWifi::start jusqu à l appel IOEthernetController::attachInterface((IONetworkInterface **)&fNetif, true) et registerService().
    3. L attachement BSD d une interface Ethernet avec attach=true a provoqué l appel immédiat et synchrone de QualcommWifi::enable(netif) au tout début du boot XNU.
    4. QualcommWifi::enable invoquait directement loadBhiFirmware(), qui contenait 5 boucles de spin IODelay(1000) cumulant jusqu à 20 000 ms (20 secondes) de blocage CPU ininterrompu dans le contexte noyau !
    5. Dans XNU, toute attente active par IODelay dépassant le seuil de 5 à 10 secondes déclenche inévitablement le Watchdog Kernel matériel (IOWatchdogx86 / thread_call watchdog), entraînant un hard reboot immédiat sans écriture de panic log (d où la boucle de redémarrage infinie).
    6. Par ailleurs, la rétro-ingénierie du désassemblage de IO80211Controller::attachInterface (0xffffff8002295fce) a confirmé qu en macOS Tahoe (architecture Skywalk), IO80211Controller n utilise pas IOEthernetInterface mais attend IO80211SkywalkInterface (signalant 'invalid skywalk interface' en cas de cast invalide). L attachement forcé d une interface Ethernet au niveau du contrôleur Wi-Fi corrompait la hiérarchie Skywalk attendue par airportd.

- Modifications apportées :
  * QualcommWifi/QualcommWifi.cpp :
    - Suppression de l appel à IOEthernetController::attachInterface dans QualcommWifi::start() pour laisser le contrôleur s enregistrer proprement auprès d IOKit sans créer d interface Ethernet concurrente ni déclencher enable() prématurément.
    - Réduction de tous les délais dans loadBhiFirmware() à des valeurs sécurisées de 100 µs (50 itérations max par phase, soit 30 ms au total), totalement transparentes pour le watchdog noyau.
    - Découplage de loadBhiFirmware() du chemin critique de boot enable() : l initialisation radio et l allocation DMA sont désormais déclenchées sur demande d alimentation Wi-Fi (setPOWER) lorsque le système ou l utilisateur active le composant.
    - Maintien du Bluetooth (QualcommWireless.kext) strictement intact et fonctionnel.

- Validation :
  * Compilation sans erreur via ./build_wifi.sh.
  * Validation kmutil libraries -p QualcommWifi.kext réussie à 100% contre BootKernelExtensions.kc.
  * Alignement strict de la vtable confirmé : 464 slots (3728 octets), correspondant exactement à __ZTV17IO80211Controller.
  * Kext déployé dans /Volumes/EFI/EFI/OC/Kexts/QualcommWifi.kext.
  * Réactivation de QualcommWifi.kext dans /Volumes/EFI/EFI/OC/config.plist (<Enabled><true/>).
2026-10-16 14:32:17 +02:00
..