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, соединение держится. Плата за это — немного больший расход батареи: карта больше не засыпает между передачами.