Как заставить Realtek NIC использовать драйвер r8168

Как заставить Realtek NIC использовать драйвер r8168

Я пытаюсь (безуспешно) последние несколько дней заставить работать свою сетевую карту Realtek. У меня нет проблем с беспроводным соединением: не работает только сетевое соединение.

У меня Ubuntu 16.10 на Dell Inspiron с картой RTL8101/2/6E PCI Express. Карта использовала драйвер r8169, который, похоже, глючит и ненадежен (как вздесь). Поскольку решением, по-видимому, является использование драйвера r8168, я:

  • установил пакет r8168-dkmsчерез apt-get,
  • занес r8169модуль в черный список/etc/modprobe.d/
  • перезагрузился.

Это не сработало, поскольку lsmodмодуль по-прежнему отображался как используемый, и lspci -vмне по-прежнему сообщалось, что карта использует драйвер и модуль r8169.

Мне наконец удалось внести в черный список модуль, передающий параметр grub, добавив modprobe.blacklist=r8169в командную строку по умолчанию в /etc/default/grub.

Проблема в том, что r8168модуль загружается нормально (я вижу его в lsmod), но он не связан с картой, поэтому он не отображается в ifconfig(точно так же, как это произошло слюмивЗаставить Linux загрузить определенный драйвер для данного устройства (сетевая карта Realtek)).

Это соответствующая часть моего lshw -C network:

*-network UNCLAIMED
   description: Ethernet controller
   product: RTL8101/2/6E PCI Express Fast/Gigabit Ethernet controller
   vendor: Realtek Semiconductor Co., Ltd.
   physical id: 0
   bus info: pci@0000:01:00.0
   version: 07
   width: 64 bits
   clock: 33MHz
   capabilities: pm msi pciexpress msix vpd bus_master cap_list
   configuration: latency=0
   resources: ioport:3000(size=256) memory:b0600000-b0600fff memory:b0400000-b0403fff

Мое устройство:

> lspci -v -s 01:00
01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8101/2/6E PCI Express Fast/Gigabit Ethernet controller (rev 07)
Subsystem: Dell RTL8101/2/6E PCI Express Fast/Gigabit Ethernet controller
Flags: bus master, fast devsel, latency 0, IRQ 11
I/O ports at 3000 [size=256]
Memory at b0600000 (64-bit, non-prefetchable) [size=4K]
Memory at b0400000 (64-bit, prefetchable) [size=16K]
Capabilities: <access denied>

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

Наконец, я попытался заставить свою сетевую карту использовать драйвер r8168(как описано в этомотвечать), но безрезультатно:

% sudo echo 10ec 8168 > /sys/bus/pci/drivers/r8168/new_id
/sys/bus/pci/drivers/r8168/new_id: File exists.

% sudo echo "0000:01:00.0" > /sys/bus/pci/drivers/r8168/bind
/sys/bus/pci/drivers/r8168/bind: File exists.

Что я упускаю? Есть ли другой способ указать устройству использовать драйвер? Любые ссылки, подсказки или указания о том, что читать дальше, были бы полезны и очень признательны.

решение1

Вы можете это сделать, но имейте в виду, что драйвер может быть не полностью совместим с вашим устройством!

Это также включает в себя перекомпиляцию модуля ядра, так что если это вас беспокоит, то я бы посоветовал быть осторожнее. Тем более, что большинство сетевых карт требуют загрузки специального бинарного блоба прошивки, который может сломать ваше оборудование - так что, пожалуйста, будьте осторожны и сделайте небольшую домашнюю работу, чтобы найти совместимый блоб прошивки.

Рады продолжить? Хорошо :)

Во-первых, вам нужно найти исходный код драйвера для вашего работающего ядра - я предполагаю, что, поскольку вы используете dkms, он уже есть где-то в вашей системе. Как только вы это сделаете, найдите место, где зарегистрирован MODULE_DEVICE_TABLE. В качестве примера, после быстрого поиска в Интернете, файл r8169.c содержит в себе этот раздел:

static const struct pci_device_id rtl8169_pci_tbl[] = {                                                                                                       
    { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8129), 0, 0, RTL_CFG_0 },                                                                                           
    { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8136), 0, 0, RTL_CFG_2 },                                                                                           
    { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8161), 0, 0, RTL_CFG_1 },                                                                                           
    { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8167), 0, 0, RTL_CFG_0 },                                                                                           
    { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8168), 0, 0, RTL_CFG_1 },                                                                                           
    { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8169), 0, 0, RTL_CFG_0 },                                                                                           
    { PCI_VENDOR_ID_DLINK,          0x4300,                                                                                                                   
        PCI_VENDOR_ID_DLINK, 0x4b10,         0, 0, RTL_CFG_1 },                                                                                               
    { PCI_DEVICE(PCI_VENDOR_ID_DLINK,   0x4300), 0, 0, RTL_CFG_0 },                                                                                           
    { PCI_DEVICE(PCI_VENDOR_ID_DLINK,   0x4302), 0, 0, RTL_CFG_0 },                                                                                           
    { PCI_DEVICE(PCI_VENDOR_ID_AT,      0xc107), 0, 0, RTL_CFG_0 },                                                                                           
    { PCI_DEVICE(0x16ec,            0x0116), 0, 0, RTL_CFG_0 },                                                                                               
    { PCI_VENDOR_ID_LINKSYS,        0x1032,                                                                                                                   
        PCI_ANY_ID, 0x0024, 0, 0, RTL_CFG_0 },                                                                                                                
    { 0x0001,               0x8168,                                                                                                                           
        PCI_ANY_ID, 0x2410, 0, 0, RTL_CFG_2 },                                                                                                                
    {0,},                                                                                                                                                     
};                                                                                                                                                            

MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl); 

Итак, здесь ядру сообщается, что если устройство с любым из перечисленных идентификаторов PCI будет найдено, то использовать этот драйвер. Вам нужно будет добавить дополнительную строку в эту структуру, содержащую идентификатор устройства PCI вашего сетевого адаптера, перекомпилировать (надеюсь, просто используя dkms) и перезапустить.

Связанный контент