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.
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.
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:
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"
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
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
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
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).