coffee into linux machine

Wi-Fi на RTL8821CE отваливается: отключаем энергосбережение rtw88

В ноутбуке стоит Realtek RTL8821CE (10ec:c821), система — Ubuntu 26.04 с драйвером rtw88 из ядра. Время от времени Wi-Fi пропадал секунд на пять, а потом подключался снова. Вроде мелочь, но рвались SSH-сессии и созвоны.

Что в журнале

Ядро сыпало сообщениями — около двухсот в минуту:

rtw_8821ce 0000:02:00.0: failed to send h2c command
rtw_8821ce 0000:02:00.0: firmware failed to leave lps state

А wpa_supplicant раз в несколько минут терял точку доступа:

wlp2s0: CTRL-EVENT-BEACON-LOSS
wlp2s0: CTRL-EVENT-DISCONNECTED bssid=… reason=4 locally_generated=1

Посчитать у себя с момента загрузки:

journalctl -k -b | grep -c 'failed to send h2c'
journalctl -b -u wpa_supplicant | grep -c BEACON-LOSS

Почему так

LPS (low power state) — режим, в который прошивка карты уводит радиомодуль между передачами. В глубоком варианте этого режима карта иногда не успевает проснуться: драйвер не может отправить ей команду (h2c — host to chip), и соединение рвётся. Сверху добавляется ASPM — энергосбережение шины PCIe, с которым у этой карты тоже бывают проблемы.

Решение

1. Параметры модулей rtw88. Файл /etc/modprobe.d/rtw88.conf:

options rtw88_core disable_lps_deep=y
options rtw88_pci disable_aspm=y

2. Энергосбережение Wi-Fi в NetworkManager. В Ubuntu уже есть файл /etc/NetworkManager/conf.d/default-wifi-powersave-on.conf со значением wifi.powersave = 3, то есть «включено». Файлы в conf.d читаются по алфавиту, и выигрывает последний, поэтому свой файл назовём так, чтобы он шёл после: /etc/NetworkManager/conf.d/zz-wifi-powersave-off.conf.

[connection]
wifi.powersave = 2

2 — выключено, 3 — включено.

Дальше — перезагрузка. Проверить, что всё применилось:

cat /sys/module/rtw88_core/parameters/disable_lps_deep   # Y
cat /sys/module/rtw88_pci/parameters/disable_aspm        # Y
iw dev wlp2s0 get power_save                             # Power save: off

Итог

После перезагрузки в журнале ни одной ошибки h2c и ни одного BEACON-LOSS, соединение держится. Плата за это — немного больший расход батареи: карта больше не засыпает между передачами.