Запуск 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 и т.д.


Комментарии