Jak naprawić zawieszanie startu systemu (boot) przez kartę Wi-Fi Broadcom na USB w systemie Linux

Jeśli używasz karty sieciowej Wi-Fi Broadcom podłączanej pod USB (np. chip BCM43143, idVendor=0a5c, idProduct=bd1e - znany jako Remote Download Wireless Adapter) na systemach z rodziny Ubuntu/Linux Mint, możesz napotkać irytujący problem. Karta potrafi zawiesić proces uruchamiania komputera na równe 60 sekund, a w dmesg pojawiają się błędy -512 oraz problemy z ładowaniem modułu brcmfmac_wcc.

Skąd bierze się problem?

Karty te nie posiadają wbudowanej pamięci Flash na oprogramowanie (firmware) – system musi wgrać je do pamięci RAM urządzenia przy każdym uruchomieniu. Podczas "ciepłego startu" (restartu) sprzęt często znajduje się w zawieszonym stanie na szynie USB, przez co jądro czeka 60 sekund na odpowiedź, blokując start systemu. Dodatkowo próba jednoczesnego wczytania firmware'u i modułów pomocniczych (wcc) tworzy tzw. zakleszczenie (deadlock) demona udev.

Rozwiązanie

Nie potrzebujemy czarnych list modułów, które blokują działanie sprzętu. Wystarczy zablokować port USB dla karty we wczesnej fazie rozruchu (initramfs), wczytać moduły do pamięci i obudzić urządzenie, gdy system jest już gotowy.

Oto instrukcja krok po kroku:

Krok 1: Blokada karty podczas wczesnego startu (ramdysk)

Musimy poinstruować udev, aby odcinał komunikację z tym urządzeniem tylko wtedy, gdy ładuje się główny system (czyli zanim środowisko systemd zostanie w pełni podniesione).

Utwórz plik /etc/udev/rules.d/99-bcm-blokada.rules (np. przez sudo nano):

ACTION=="add", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="0a5c", ATTR{idProduct}=="bd1e", TEST!="/run/systemd/system", ATTR{authorized}="0"
Uwaga: Zwróć uwagę na warunek TEST!= – dzięki niemu reguła zignoruje urządzenie, gdy podłączysz je w trakcie normalnej pracy komputera.

Przebuduj obraz ramdysku, aby uwzględnić nową regułę:

sudo update-initramfs -u

Krok 2: Wstępne wczytanie modułów

Aby uniknąć błędu -512 i zakleszczenia, moduły sterownika muszą czekać w pamięci jeszcze przed obudzeniem karty.

Utwórz plik /etc/modules-load.d/broadcom.conf:

brcmfmac
brcmfmac_wcc

Krok 3: Usługa wybudzająca urządzenie

Kiedy system się włączy i przejdzie do trybu wieloużytkownikowego, trzeba obudzić port i zainicjować wgrywanie firmware'u.

Utwórz plik /etc/systemd/system/wzbudzenie-broadcom.service:

[Unit]
Description=Aktywacja karty Broadcom po starcie
After=multi-user.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'for sciezka_urzadzenia in /sys/bus/usb/devices/*; do if [ -f "$sciezka_urzadzenia/idVendor" ] && [ "$(/bin/cat "$sciezka_urzadzenia/idVendor")" ] == "0a5c"; then /bin/echo 1 > "$sciezka_urzadzenia/authorized"; fi; done'

[Install]
WantedBy=multi-user.target

Włącz nową usługę do autostartu:

sudo systemctl daemon-reload
sudo systemctl enable wzbudzenie-broadcom.service

Gotowe!

Uruchom komputer ponownie. System wstanie błyskawicznie, interfejs Wi-Fi pojawi się na liście, a ty nadal możesz swobodnie odłączać i podłączać kartę podczas pracy ("hot-plug" zadziała bez problemów).