如何讓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)並重新啟動。

相關內容