LinuxForum.Fans
Тема

Компиляция драйвера сетевой карты D-Link DUB-E100 версии C1

Автор: albert2000 9 сообщений 5903 просмотров
#306087

Имеется USB-сетевая карта D-Link DUB-E100 версии C1. Требуется установить ее на компьютер-роутер с операционной системой Vyatta Core 6.5 R1 i386. Помогите, пожалуйста, скомпилировать драйвер этой сетевой карты, у меня не получается.

Все, что я делал для этого, подробно описал здесь:

Показать
Поскольку Vyatta основана на Debian, то для начала пробую установить сетевую карту на компьютер с операционной системой Debian 6.0.6 i386.
При загрузке Debian на компьютере с подключенной сетевой картой она определяется так (файл /var/log/dmesg):
text
[    1.304511] usb 2-2: new high speed USB device using ehci_hcd
[    1.448991] usb 2-2: New USB device found, idVendor=2001, idProduct=1a02
[    1.448995] usb 2-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[    1.448998] usb 2-2: Product: DUB-E100
[    1.449000] usb 2-2: Manufacturer: D-Link
[    1.449003] usb 2-2: SerialNumber: D7409A

Однако сетевой интерфейс не появляется. В комплекте с сетевой картой имеются исходники драйвера под Linux, но в них не прописана сетевая карта с idVendor=2001 и idProduct=1a02 – D-Link не удосужился подправить исходники драйвера под новую ревизию карты. В действительности сетевая карта D-Link DUB-E100 версии C1 является картой ASIX AX88772B, которая присутствует в исходниках драйвера, но имеет другие idVendor и idProduct. Поэтому, исправляю исходники таким образом. Прописываю в файле asix.c следующую структуру:

text
static const struct driver_info dlink_dub_e100c_info = {
    .description = "D-Link DUB-E100C USB 2.0 Fast Ethernet Adapter",
    .bind = ax88772b_bind,
    .unbind = ax88772b_unbind,
    .status = ax88772b_status,
    .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_HW_IP_ALIGNMENT,
    .rx_fixup = ax88772b_rx_fixup,
    .tx_fixup = ax88772b_tx_fixup,
};

И добавляю такой блок в структуру usb_device_id:

text
… {
    // DLink DUB-E100C
    USB_DEVICE (0x2001, 0x1a02),
    .driver_info =  (unsigned long) & dlink_dub_e100c_info,
}, …

Теперь нужно скомпилировать драйвер. По умолчанию в Debian отсутствует компилятор. Устанавливаю его, предварительно обновив список пакетов:

text
apt-get update && apt-get install build-essential

Устанавливаю заголовочные файлы ядра:

text
apt-get install linux-headers

В ответ получаю:

text
Пакет linux-headers - виртуальный, его функции предоставляются пакетами:
  linux-headers-2.6.32-5-xen-686 2.6.32-48squeeze1
  linux-headers-2.6.32-5-vserver-686-bigmem 2.6.32-48squeeze1
  linux-headers-2.6.32-5-vserver-686 2.6.32-48squeeze1
  linux-headers-2.6.32-5-openvz-686 2.6.32-48squeeze1
  linux-headers-2.6.32-5-amd64 2.6.32-48squeeze1
  linux-headers-2.6.32-5-686-bigmem 2.6.32-48squeeze1
  linux-headers-2.6.32-5-686 2.6.32-48squeeze1
  linux-headers-2.6.32-5-486 2.6.32-48squeeze1
  linux-headers-2.6-xen-686 2.6.32+29
  linux-headers-2.6-vserver-686 2.6.32+29
  linux-headers-2.6-vserver-686-bigmem 2.6.32+29
  linux-headers-2.6-openvz-686 2.6.32+29
  linux-headers-2.6-amd64 2.6.32+29
  linux-headers-2.6-686 2.6.32+29
  linux-headers-2.6-686-bigmem 2.6.32+29
  linux-headers-2.6-486 2.6.32+29
Вы должны явно указать, какой именно вы хотите установить.

Определяю версию ядра:

text
uname –r

В ответ получаю:

text
2.6.32-5-686

Устанавливаю требуемый пакет:

text
apt-get install linux-headers-2.6.32-5-686

Теперь создаю каталог /tmp/d, копирую в него исходники драйвера и компилирую его:

text
make

Компиляция проходит успешно:

text
make -C /lib/modules/2.6.32-5-686/build SUBDIRS=/tmp/d modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.32-5-686'
  CC [M]  /tmp/d/asix.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /tmp/d/asix.mod.o
  LD [M]  /tmp/d/asix.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-5-686'

В каталоге /tmp/d образуется файл драйвера asix.ko. Устанавливаю драйвер:

text
make install

Установка проходит нормально:

text
su -c "cp -v asix.ko /lib/modules/2.6.32-5-686/kernel/drivers/net/usb && /sbin/depmod -a"
«asix.ko» -> «/lib/modules/2.6.32-5-686/kernel/drivers/net/usb/asix.ko»

Перегружаю компьютер и вижу, что сетевой интерфейс появился!
Вдохновленный успехом перехожу ко второму этапу – подключению карты к Vyatta.
Пакет build-essential отсутствует в репозитории Vyatta, поэтому сначала подключаю репозиторий Debian. Для этого в конфигурационном режиме Vyatta выполняю команды:

text
set system package repository debian
set system package repository debian components main
set system package repository debian distribution stable
set system package repository debian url http://http.us.debian.org/debian
commit

После этого устанавливаю пакет обычным образом:

text
sudo apt-get update && sudo apt-get install build-essential

Далее определяю версию ядра:

text
uname –r

В ответ получаю:

text
3.3.8-1-586-vyatta

В репозитории Debian пакет заголовочных файлов для этого ядра конечно же отсутствует. А пакеты из репозитория Vyatta не устанавливаются командой apt-get, их нужно скачивать через wget и устанавливать через dpkg. Захожу в описание пакетов для Vyatta Core 6.5: http://packages.vyatta.com/vyatta/dists/VC6.5/main/binary-i386/Packages и обнаруживаю там пакет linux-vyatta-kbuild, в описании которого указано: “Header/support files of Vyatta kernel build”. Скачиваю этот пакет:

text
sudo wget http://packages.vyatta.com/vyatta/pool/main/linux-vyatta-kbuild_3.3.8-1+vyatta+14+pacifica2_i386.deb

Затем устанавливаю его:

text
sudo dpkg -i linux-vyatta-kbuild_3.3.8-1+vyatta+14+pacifica2_i386.deb

Просмотрев содержимое пакета, вижу, что заголовочные файлы в пакете располагаются в каталоге /usr/src/linux-image/debian/build/build-i386-none-586-vyatta. Так как Makefile исходников драйвера ищет заголовочные файлы ядра по пути /lib/modules/$(CURRENT)/build, где CURRENT – версия ядра, то создаю соответствующий симлинк, ссылающийся на каталог /usr/src/linux-image/debian/build/build-i386-none-586-vyatta:

text
cd /lib/modules/*
sudo ln -s /usr/src/linux-image/debian/build/build-i386-none-586-vyatta build

Теперь вроде бы все готово к компиляции драйвера. Создаю каталог /tmp/d, копирую в него исходники драйвера, перехожу в этот каталог и компилирую:

text
make

В результате получаю кучу ошибок:

text
make -C /lib/modules/3.3.8-1-586-vyatta/build SUBDIRS=/tmp/d modules
make[1]: Entering directory `/usr/src/linux-image/debian/build/build-i386-none-586-vyatta'
  CC [M]  /tmp/d/asix.o
/tmp/d/asix.c:840: error: unknown field 'ndo_set_multicast_list' specified in initializer
/tmp/d/asix.c:840: warning: initialization from incompatible pointer type
/tmp/d/asix.c: In function 'ax88772b_set_tx_csum':
/tmp/d/asix.c:1500: error: implicit declaration of function 'ethtool_op_set_tx_csum'
/tmp/d/asix.c: At top level:
/tmp/d/asix.c:1516: error: unknown field 'set_tx_csum' specified in initializer
/tmp/d/asix.c:1516: warning: initialization from incompatible pointer type
/tmp/d/asix.c:1517: error: unknown field 'get_tx_csum' specified in initializer
/tmp/d/asix.c:1517: warning: initialization from incompatible pointer type
/tmp/d/asix.c:1518: error: unknown field 'get_rx_csum' specified in initializer
/tmp/d/asix.c:1518: warning: initialization from incompatible pointer type
/tmp/d/asix.c:1519: error: unknown field 'set_rx_csum' specified in initializer
/tmp/d/asix.c:1519: warning: initialization from incompatible pointer type
/tmp/d/asix.c:1533: error: unknown field 'ndo_set_multicast_list' specified in initializer
/tmp/d/asix.c:1533: warning: initialization from incompatible pointer type
make[2]: *** [/tmp/d/asix.o] Error 1
make[1]: *** [_module_/tmp/d] Error 2
make[1]: Leaving directory `/usr/src/linux-image/debian/build/build-i386-none-586-vyatta'
make: *** [default] Error 2

Что с этим делать дальше не знаю.

Исправленные исходники драйвера закачал сюда: http://webfiles.ru/files/35268500

#306137

Информацию находил по крупицам поиском и все законспектировал для себя, дабы не забыть.
В теме, где фигурирует такая же сетевая карта, задействован встроенный в Ubuntu драйвер asix.ko, он видимо кривой.
Встроенный в Debian драйвер asix.ko вообще не грузится:

text
insmod: error inserting 'asix.ko': -1 Unknown symbol in module

А скомпилированный отредактированный драйвер, который был на диске в комплекте с сетевой картой, работает нормально.
Информацию про то, что исходник нужно подправить, нашел в комментариях к продаваемой карточке в сети магазинов DNS
Но вот в Vyatta Core 6.5 скомпилировать драйвер пока не получается :(

#306142

А, ну так это проблема Vyatta Core, и его ядра, а другое ядро на нее можно поставить? И чем обоснован выбор Vyatta?

#306169

Компьютер используется в качестве роутера, конфигурить его хочется простым способом, не вдаваясь в специфику операционной системы и в реализацию тех или иных механизмов - просто понятными командами, как в аппаратных роутерах типа Cisco и т. п., чтобы все настройки были собраны в одном месте. Vyatta Core как раз такая система, к тому же бесплатная. Проект этот с открытым кодом и скомпилировать можно на разных системах, только я ни разу этим не занимался, наверняка там множество подводных камней. Я взял готовый образ для CD и установил с него - это дело трех минут, хотелось бы обойтись малой кровью.

#306195
albert2000 написал:
конфигурить его хочется простым способом, не вдаваясь в специфику операционной системы и в реализацию тех или иных механизмов - просто понятными командами, как в аппаратных роутерах типа Cisco и т. п., чтобы все настройки были собраны в одном месте. Vyatta Core как раз такая система...

Есть такое - любители надстроек над настройками, для меня это сложнее и разбираться в том как интерпритирует настройку сетевых интерфейсов Debian например Vyatta нет никакого желания.
Кстати отсюда и возможные ошибки.
По поводу настроек в одном месте - так они так в одном - /etc

#306205

Так в том то как раз и вся прелесть Vyatta, что в ней нет необходимости думать об интерпретации команд в настройки линукса, там думаешь на уровне этих команд и не нужно быть гуру в линуксе. Это примерно как программирование на ассемблере и на C#. А все настройки в одном месте - это в одном файле и в структурированном виде. Можно долго спорить какой подход лучше и так и не прийти к общему мнению - наверное это вопрос религии :) Только мы от темы отклонились - как все-таки скомпилировать драйвер сетевой карты в Vyatta?

#306228

Почему я упоминул настройку интерфейсов, - я посмотрел как это реализовано в Vayatta, и .... мне не понравилось, тогда как в Debian это сделано очень просто, понятно и удобно, также и с остальным.
И второй момент в Linux на самом деле и так все настройки интуитивно понятны.
Едем далее - Vayatta - не сильно распространен, поэтому помощи у сообщества найти сложнее, скорее дадут ответ где-нибудь у них на ресурсе, это кстати еще один минус, а чтобы разобраться самому почему что-то не работает, надо разбираться и в Debian тоже...

#306308

Вы не соберете драйвер на версии ядра 3.x.
Попробуйте наложить патч на исходник текущей версии ядра.

Войдите или зарегистрируйтесь, чтобы ответить.