Почему IWD не обнаруживает мое горячее подключенное Wi-Fi устройство?

Замена NetworkManager и wpa_supplicant на iwd в Void Linux: решение проблемы с USB Wi-Fi адаптером на чипе RTL8187

Пользователи Void Linux иногда заменяют стандартные средства управления Wi-Fi, такие как NetworkManager и wpa_supplicant, на iwd (iNet wireless daemon) для упрощения настройки и повышения стабильности подключения к беспроводным сетям. Несмотря на положительный опыт работы с iwd, некоторые сталкиваются с проблемами при использовании определённых Wi-Fi устройств, особенно USB адаптеров на базе чипа RTL8187. В этой статье разберём, с чем связана подобная ошибка и как её решить.

Описание проблемы с USB Wi-Fi адаптером на базе RTL8187

Проблема особенно заметна при использовании USB Wi-Fi адаптера Trendnet с чипом RTL8187. Когда адаптер подключается после запуска сервиса iwd, он не отображается в утилите iwctl, хотя операционная система фиксирует устройство, и адаптер виден в выводе команды iwconfig.

Основной практической проблемой становится ситуация после выхода из режима сна (suspend/wake). После пробуждения адаптер исчезает из списка устройств iwctl devices, и для его повторного использования необходимо перезапустить сервис iwd.

Анализ ошибок и системных логов

В выводе системного лога dmesg можно заметить сообщение об ошибке:

ieee80211 phy0: eeprom reset timeout!

Кроме того, происходит переименование устройства для сохранения стабильных имён, например:

rtl8187 1-1:1.0 wlp0s[snip]u1: renamed from wlan0

При ручном запуске демона iwd также можно увидеть ошибки и таймауты, связанные с поднятием интерфейса. В частности, при попытке инициализации интерфейса возникает:

Error bringing interface 8 up: Connection timed out

Такие сообщения указывают, что устройство не успевает полностью инициализироваться к моменту, когда iwd пытается с ним работать.

Причина проблемы — недостаток времени для инициализации устройства

Изучение исходного кода драйвера RTL8187 показывает, что функция rtl8187_cmd_reset вызывается демоном iwd сразу после обнаружения адаптера. Если адаптер не успел завершить процесс инициализации, функция сбрасывает ошибку с таймаутом EEPROM — по сути, это аппаратный сбой, связанный с программным обращением к неподготовленному устройству.

Решение: задержка запуска iwd для обеспечения инициализации

Практическое и элегантное решение — дать устройству 5 секунд на инициализацию до старта iwd. Это можно реализовать с помощью правила udev, которое добавляет задержку для устройств с драйвером rtl8187:

bash
ACTION=="add", ENV{ID_NET_DRIVER}=="rtl8187", RUN+="/bin/sleep 5"

Важный момент: udev отправляет событие о завершении обработки правил только после выхода из всех связанных обработчиков, поэтому если iwd реагирует на сигнал udev (а не на сигналы ядра напрямую), то он увидит устройство только после задержки в 5 секунд.

Возможные улучшения и обходные пути

Кроме задержки, можно попытаться автоматизировать перезапуск iwd через скрипты, которые будут реагировать на подключение или пробуждение устройства. Например, при помощи отправки D-Bus сообщений из udev для уведомления iwd о появлении новых Wi-Fi интерфейсов.

Однако задержка в 5 секунд — самый простой и проверенный способ избежать ошибок EEPROM и таймаутов.

Итоги

  • Проблема связана с тем, что iwd начинает работу с USB адаптером RTL8187 до завершения его инициализации.
  • В результате появляется ошибка eeprom reset timeout, а устройство не отображается в iwctl.
  • Задержка в 5 секунд через udev позволяет избежать этой проблемы, обеспечив стабильно работающий Wi-Fi адаптер без необходимости перезапуска демона.
  • Этот подход применим для пользователей Void Linux и других дистрибутивов, использующих iwd в управлении беспроводными сетями.

Если у вас есть подобный USB Wi-Fi адаптер RTL8187 и вы используете iwd, внедрение такой задержки значительно повысит стабильность работы сети и избавит от необходимости ручного перезапуска сервиса.

Источник

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *