Запуск Wifi на донгле от Mediatek
Дешевые WiFi-модули с AliExpress, собранные на базе чипа от Mediatek часто не определяются в линукс. При подключения такого модуля в syslog начинают сыпаться ошибки типа таких:
[ 103.395708] mt7601u 3-3:1.0: Error: RX urb failed:-71
[ 103.395743] mt7601u 3-3:1.0: Error: RX urb failed:-71
[ 103.395763] mt7601u 3-3:1.0: Error: MCU resp urb failed:-71
[ 103.395767] mt7601u 3-3:1.0: Error: MCU resp evt:0 seq:4-3!
[ 103.395788] mt7601u 3-3:1.0: Error: RX urb failed:-71
[ 103.395802] mt7601u 3-3:1.0: Error: MCU resp urb failed:-71
[ 103.395805] mt7601u 3-3:1.0: Error: MCU resp evt:0 seq:4-3!
[ 103.395833] mt7601u 3-3:1.0: Error: RX urb failed:-71
[ 103.395850] mt7601u 3-3:1.0: Error: MCU resp urb failed:-71
[ 103.395853] mt7601u 3-3:1.0: Error: MCU resp evt:0 seq:4-3!
[ 103.395859] mt7601u 3-3:1.0: Error: RX urb failed:-71
[ 103.395871] mt7601u 3-3:1.0: Error: MCU resp urb failed:-71
[ 103.395874] mt7601u 3-3:1.0: Error: MCU resp evt:0 seq:4-3!
[ 103.395937] mt7601u 3-3:1.0: Error: RX urb failed:-71
[ 103.395962] mt7601u 3-3:1.0: Error: RX urb failed:-71
[ 103.395974] mt7601u 3-3:1.0: Error: MCU resp urb failed:-71
[ 103.395977] mt7601u 3-3:1.0: Error: MCU resp evt:0 seq:4-3!
[ 103.395980] mt7601u 3-3:1.0: Error: mt7601u_mcu_wait_resp timed out
[ 103.531572] mt7601u 3-3:1.0: Vendor request req:07 off:0080 failed:-71
[ 103.664926] mt7601u 3-3:1.0: Vendor request req:02 off:0080 failed:-71
[ 103.798251] mt7601u 3-3:1.0: Vendor request req:02 off:0080 failed:-71
[ 103.798294] mt7601u: probe of 3-3:1.0 failed with error -110
[ 103.798472] usb 3-3: USB disconnect, device number 3
Эти ошибки сыпятся бесконечно, до тех пор пока устройство не будет извлечено. Даже корректно завершить работу системы не удается.
Проблема по-видимому кроется в аппаратной части, т.к. путем отладки и трассировки кода выяснилось, что у устройства не проходит процесс калибровки. Решить проблему можно слегка пропатчив модуль ядра. Итак…
Сперва определяем версию ядра, установленного в системе:
uname -r
получаем что-то типа 4.15.0-34-generic. Значит версия ядра 4.15.0. Отправляемся в интернет и выкачиваем архив с исходниками ядра своей версии.
Из архива извлекаем только одну папку drivers/net/wireless/mediatek/mt7601u
В извлеченной папке находим файл phy.c и в нем находим функцию mt7601u_init_cal. У меня она начинается в 1117 строке.
Внутри функции ищем такой код:
ret = mt7601u_mcu_calibrate(dev, MCU_CAL_RXIQ, 0);
if (ret)
return ret;
ret = mt7601u_mcu_calibrate(dev, MCU_CAL_DPD, dev->dpd_temp);
if (ret)
return ret;
Весь этот блок кода нужно закомментировать или удалить.
Далее ищем функцию mt7601u_phy_recalibrate_after_assoc и в ней комментируем (или удаляем) вызов функции mt7601u_mcu_calibrate(dev, MCU_CAL_DPD, dev->curr_temp);
Сохраняем изменения.
В папке, где находится phy.c выполняем команду:
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
Далее извлекаем устройство, если оно было вставлено в USB и выполняем выгрузку текущего (нерабочего) модуля:
sudo rmmod mt7601u
И загружаем новый (пропатченный) модуль:
sudo modprobe mac80211
sudo insmod ./mt7601u.ko
Вставляем устройство в разъем USB и проверяем, что в логах больше нет ошибок, а система теперь видит все доступные точки WiFi.
Если все работает корректно, то можно заменить модуль в составе ядра нашим пропатченным, чтобы после перезагрузки не приходилось каждый раз отключать кривой и подключать исправленный модуль.
Для этого сперва определяем, где именно находится требуемый модуль ядра - выполняем команду:
modinfo mt7601u
первая строчка выдачи (filename: …) показывает нам абсолютный путь к файлу модуля. Этот файл нужно заменить на тот, который мы создали. В моем случае я использовал команду:
sudo cp ./mt7601u.ko /lib/modules/4.15.0-34-generic/kernel/drivers/net/wireless/mediatek/mt7601u/mt7601u.ko
Примечание
При сборке модуля компилятор предложил установить пакет libelf-dev. Не знаю, насколько он обязателен, т.к. модуль собирается и с ним, и без него. Я у себя его устанавливал.
Естественное, для успешной сборки в системе должны быть установлены linux-headers, make, gcc и т.д.
Комментарии