Установка Wi-FI адаптера Mercusys MW300UM на чипе RTL8192EU

Предыстория — после 9 лет работы полетела встроенная сетевая карта на материнской плате. Печально. Нужно покупать новую и всё такое. Тут я вспомнил, что где-то у меня припасена сетевая карта, которую я покупал ещё 10 лет назад. Начал рыться в закромах, и вот она. Сдул с неё многолетнюю пыль, прочитал название — Dlink DFE-520.

Ок, попробуем. Воткнул, включил поддержку в ядре, карточка завелась. Но есть две не совсем приятные вещи — 1 — карта после выхода из сна не подхватывается, какие-то проблемы или с модулем или с самой картой. Ну и скорость. После гигабитной карты чувствуется задержка даже при переключении дорожек в плеере.

Поэтому посетила мысль — а не купить ли Wi-FI адаптер? Открыл свой любимый магазин электроники, начал выбирать. Выбор пал на Mercusys MW300UM, невысокая цена (гигабитная сетевая карта от DEXP стоит столько же, но почитав о чипе, который на ней стоит, перехотел брать), скорость в 300 Мб/с, и высокая мощность передатчика, плюс беспроводное соединение. Почитал про чип — RTL8192EU, в линуксе должен работать, даже судя по комментариям к адаптеру. Отправился в магазин, нашёл адаптер (осталось 2 коробочки), жадно схватил одну и метнулся на кассу. Заплатив бабло и получив чек (кстати, гарантия 3 года), на второй передаче понёсся домой.

Придя домой, предвкушал, что сейчас по быстрому воткну адаптер, ну максимум подключу модуль к ядру и всё будет кошерно. Но самое интересное было ещё впереди.

Итак, воткнув адаптер в комп, запустил lsusb, дабы глянуть, что же известно про этот адаптер. А собственно всего ничего, lsusb выдал вот это:

Bus 002 Device 005: ID 2c4e:0100

Ну ок, мы пойдём другим путём — полезем в гугль. Итак, гугл сообщает, что есть несколько вариантов — собрать модуль из ядра, либо скачать с гитхаба, собрать и присовокупить к ядру.

Конечно, проще собрать модуль самого ядра. Полез в ядро, подключил модуль RTL8XXXU и RTL8XXXU_UNTESTED. Собрал ядро, перезагрузился. Ничего. Модуль не загрузился. Сделал это вручную — всё равно тишина, устройство wlan0 не появилось. Dmesg конечно сыпет сообщениями, что типа устройство подключено, производитель такой-то и всё прочее, но это как-то не помогает обеспечить работу устройства.

Ну ладно, хорошо. Соберём и поставим сторонний модуль. На выбор есть 4 (на самом деле больше):

https://github.com/Mange/rtl8192eu-linux-driver
https://github.com/masterzorag/RTL8192EU-linux
https://github.com/jeremyb31/rtl8192eu-linux-driver
https://github.com/ZeeRooo/RTL8192EU

В общем общем после всех плясок выяснилось одно — в коде модуля нет нашего идентификатора устройства (2c4e:0100), поэтому, даже когда модуль загружался, он не работал с адаптером. Что нужно сделать, чтобы всё было прекрасно? Добавить строчку в исходники. Покажу на примере ядра — в моём случае это 5.0.3 и модуля, который я взял с https://github.com/ZeeRooo/RTL8192EU. И да, в некоторых репозиториях, например jeremyb31 и Mange есть возможность поставить модуль через DKMS, что актуально для пользователей Debian-подобных дистрибутивов.

Но хочу сказать сразу, после добавления в ядро идентификатора, устройство wlan0 появилось, ближайшие сети нашлись, но вот подключиться не получилось. В dmesg сыпались ошибки "rtl8192eu_rx_iqk_path_b: Path B RX IQK failed!" и невозможности аутентификации. Там же была почта, на которую просили написать про работу модуля, что я собственно и сделал, ждём ответа (если он вообще будет).

Итак, модуль ядра. Открываем файл (уже в каталоге с ядром, например /usr/src/linux) drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c и ищем в самом конце такие строчки, (должно быть заглавие #ifdef CONFIG_RTL8192E):

{USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0107, 0xff, 0xff, 0xff), .driver_info = (unsigned long)&rtl8192eu_fops},

0x2357, 0x0107 — это и есть идентификатор устройства. Добавляем туда такую строчку

{USB_DEVICE_AND_INTERFACE_INFO(0x2c4e, 0x0100, 0xff, 0xff, 0xff), .driver_info = (unsigned long)&rtl8192eu_fops},

0x2c4e, 0x0100 — это мы взяли из вывода lsusb.

Сохраняем файл, не забываем включить модуль rtl8xxxu и rtl8xxxu_untested и собираем ядро, теперь адаптер будет автоматом подхватываться ядром.

Сейчас соберём сторонний модуль ядра. Я бы рекомендовал качать с https://github.com/ZeeRooo/RTL8192EU, т. к. судя по логам он активно поддерживается.

$ git clone https://github.com/ZeeRooo/RTL8192EU.git

$ cd RTL8192EU

Редактируем файл os_dep/linux/usb_intf.c, в нём так же ищем строчки типа {USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0107, 0xff, 0xff, 0xff), .driver_info = (unsigned long)&rtl8192eu_fops}, под заглавием #ifdef CONFIG_RTL8192E, только здесь они практически в самом начале файла.

Добавляем туда нашу строку:

{USB_DEVICE_AND_INTERFACE_INFO(0x2c4e, 0x0100, 0xff, 0xff, 0xff), .driver_info = (unsigned long)&rtl8192eu_fops},

Ну и дальше

$ make

# make install

Модуль будет называться 8192eu.

После установки модуля, для его загрузки нужно выполнить modprobe 8192eu, или вытащить и вставить адаптер.

И да, если используется сторонний модуль, ядерный модуль (rtl8xxxu) должен быть выгружен и наоборот.

Пока адаптер работает нормально, не глючит, дальше видно будет. Будем посмотреть, будут ли допиливать поддержку в ядре.

Добавить комментарий

Ваш e-mail не будет опубликован.