unix
February 4, 2023

FreeBSD на ноутбуке: приключения с iwm

Решение одной конкретной проблемы по горячим следам.

Типичное утро нового дня.

Есть такой замечательный чип от Intel: AC 9560. Отвечает за WiFi и Bluetooth. Часто встречается в новых ноутбуках, и как и все новое — порождает проблемы.

Если проще: WiFi карта нах#й отваливается.

Либо сразу при запуске, либо после suspend/resume либо в произвольный момент времени — все как мы любим.

Конечно проблема известная, уже завели баг:

https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=243992

Вообщем единственным вариантом восстановления было полное отключение ноутбука из под Windows. Не засыпание и именно выключение.

Перезагрузка из-под Linux — все также зависание прошивки.

В чем проблема

Как обычно в новых фичах:

MSI-X interrupt mode is enable by default

Вот правильное решение:

I have fix this issue in OpenIntelWireless/itlwm project:
https://github.com/OpenIntelWireless/itlwm/commit/1fc63d576975d56578ce2048f00f83e7ca550d97

I am not sure if it is a hardware bug for newer intel wireless card, 
for 9560ac-cnvi and later Gen2 cards, MSI-X interrupt mode is enable 
by default, Intel wireless drivers on linux/Windows are supported and 
using MSI-X interrupt default, when rebooting to freebsd, iwm on freebsd 
only support MSI interrupt but the hardware is configure as MSI-X, 
so the interrupt will never happened and caused the issue.
Here are two solutions:
1. Implement MSI-X interrupt mode on iwm.
2. Disable MSI-X when init the hardware, and it is the solution
 what I am using.

Я честно пробовал портировать эту логику в iwm драйвер — не сработало. Поэтому пришлось перейти на альтернативный драйвер iwlwifi

Из /etc/rc.conf:

wlans_iwlwifi0="wlan0"
ifconfig_wlan0="WPA DHCP"
# отключаем iwm - он инициализируется по-умолчанию
devmatch_blocklist="if_iwm"

Второй важный момент:

этот же чип отвечает еще и за bluetooth, прошивка к которому точно также скачивается из сети.

Получается плохо, поэтому пришлось отключить автоматическую активацию:

Из /etc/devd.conf

Итого

Наконец-то этот цирк работает: нет затыков при большой нагрузке на сеть, нет зависаний, чип переживает suspend/resume цикл и перезагрузки из линукса: