如何让Realtek网卡使用r8168驱动

如何让Realtek网卡使用r8168驱动

在过去的几天里,我一直在尝试(但没有成功)让我的 Realtek 以太网卡正常工作。我的无线连接没有任何问题:只有以太网连接不起作用。

我在 Dell Inspiron 上安装了 Ubuntu 16.10,并配有 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 NIC)加载特定驱动程序)。

这是我的相关部分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

您可以执行此操作,但显然要注意该驱动程序可能与您的设备不完全兼容!

它还涉及重新编译内核模块,所以如果您担心的话,那么我建议您小心。特别是大多数 NIC 需要加载定制的二进制固件 blob,这可能会破坏您的硬件 - 因此请注意,并做一些功课来找到兼容的固件 blob。

高兴继续吗?好的 :)

首先,您需要找到正在运行的内核的驱动程序源 - 我假设,当您使用 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 ID 的设备,则使用此驱动程序。您需要向该结构添加一行额外的行,其中包含您的 NIC 的 PCI 设备 ID,重新编译(希望只是使用 dkms)并重新启动。

相关内容