使 Linux 为给定设备(Realtek NIC)加载特定驱动程序

使 Linux 为给定设备(Realtek NIC)加载特定驱动程序

这是运行 Linux 3.11(Mint 发行版,但我认为这并不重要)的老式机器(AMD K8、Nvidia 芯片组)上的驱动程序问题。

claudius ~ # uname -a
Linux claudius 3.11.0-12-generic #19-Ubuntu SMP Wed Oct 9 16:20:46 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
claudius ~ # lspci
00:00.0 Host bridge: NVIDIA Corporation nForce3 250Gb Host Bridge (rev a1)
00:01.0 ISA bridge: NVIDIA Corporation nForce3 250Gb LPC Bridge (rev a2)
00:01.1 SMBus: NVIDIA Corporation nForce 250Gb PCI System Management (rev a1)
00:02.0 USB controller: NVIDIA Corporation CK8S USB Controller (rev a1)
00:02.1 USB controller: NVIDIA Corporation CK8S USB Controller (rev a1)
00:02.2 USB controller: NVIDIA Corporation nForce3 EHCI USB 2.0 Controller (rev a2)
00:05.0 Bridge: NVIDIA Corporation CK8S Ethernet Controller (rev a2)
00:08.0 IDE interface: NVIDIA Corporation CK8S Parallel ATA Controller (v2.5) (rev a2)
00:0a.0 IDE interface: NVIDIA Corporation nForce3 Serial ATA Controller (rev a2)
00:0b.0 PCI bridge: NVIDIA Corporation nForce3 250Gb AGP Host to PCI Bridge (rev a2)
00:0e.0 PCI bridge: NVIDIA Corporation nForce3 250Gb PCI-to-PCI Bridge (rev a2)
00:18.0 Host bridge: Advanced Micro Devices, Inc. [AMD] K8 [Athlon64/Opteron] HyperTransport Technology Configuration
00:18.1 Host bridge: Advanced Micro Devices, Inc. [AMD] K8 [Athlon64/Opteron] Address Map
00:18.2 Host bridge: Advanced Micro Devices, Inc. [AMD] K8 [Athlon64/Opteron] DRAM Controller
00:18.3 Host bridge: Advanced Micro Devices, Inc. [AMD] K8 [Athlon64/Opteron] Miscellaneous Control
01:00.0 VGA compatible controller: NVIDIA Corporation NV34 [GeForce FX 5200] (rev a1)
02:05.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8169 PCI Gigabit Ethernet Controller (rev 10)

我希望内核为我的 Realtek 8169 PCI 以太网卡加载替代驱动程序,您可以在列表末尾看到它作为02:05.0。详细信息如下:

claudius ~ # lspci -s 02:05.0 -vv -nn
02:05.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL8169 PCI Gigabit Ethernet Controller [10ec:8169] (rev 10)
    Subsystem: Realtek Semiconductor Co., Ltd. RTL8169/8110 Family PCI Gigabit Ethernet NIC [10ec:8169]
    Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
    Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
    Interrupt: pin A routed to IRQ 19
    Region 0: I/O ports at e800 [size=256]
    Region 1: Memory at febffc00 (32-bit, non-prefetchable) [size=256]
    Expansion ROM at febc0000 [disabled] [size=128K]
    Capabilities: [dc] Power Management version 2
        Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=375mA PME(D0-,D1+,D2+,D3hot+,D3cold+)
        Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-

问题是根本r8169行不通。甚至可能导致 Linux 崩溃。我把它列入黑名单了/etc/modprobe.d/

解决方案似乎是使用r8168驱动程序代替。 (还有一个本网站的相关问题.) 你可以从 Realtek 下载源代码,编译并安装它,我就是这样做的。如果您这样做modprobe r8168,它可以正常加载,但不与硬件关联,因此该卡不会显示在ifconfig.

我认为这与modalias(编码硬件信息)和/lib/modules/*/modules.alias.

claudius ~ # cat /sys/devices/pci0000\:00/0000\:00\:0e.0/0000\:02\:05.0/modalias 
pci:v000010ECd00008169sv000010ECsd00008169bc02sc00i00

这是我的卡。以下是系统中 Realtek 驱动程序的映射:

claudius ~ # grep r816 /lib/modules/3.11.0-12-generic/modules.alias
alias pci:v00001186d00004300sv00001186sd00004C00bc*sc*i* r8169
alias pci:v000010ECd00008169sv*sd*bc*sc*i* r8169
alias pci:v000010ECd00008167sv*sd*bc*sc*i* r8169
alias pci:v00001186d00004300sv00001186sd00004B10bc*sc*i* r8168
alias pci:v000010ECd00008168sv*sd*bc*sc*i* r8168

我尝试将此行添加到文件末尾(知道您不应该进行手动编辑):

alias pci:v000010ECd00008169sv000010ECsd00008169bc02sc00i00 r8168

然后卸载并重新加载r8168,但这不会配置卡,并且dmesg.

将我的网卡映射到驱动程序的正确方法是什么r8168?我是否必须重建驱动程序才能声称它可以处理我的卡?或者我必须在适当的位置添加一些配置数据吗?

答案1

您可以使用绑定强制设备使用特定设备。如果该设备已由其他驱动程序拥有,您首先必须取消绑定它。

如果无法识别 PCI 供应商 ID(10ec对于 Realtek)和设备 ID 组合,您可以使用以下命令在运行时识别它:

# echo 10ec 8169 > /sys/bus/pci/drivers/r8169/new_id

例子:

# lspci -s 04: -nnvvv
04:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL-8129 [10ec:8129] (rev 10)
        Subsystem: Coreco Inc RTL8111/8168 PCIe Gigabit Ethernet (misconfigured) [11ec:8129]
        Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
        Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
        Interrupt: pin A routed to IRQ 3
        Region 0: I/O ports at c000 [size=256]
        Region 1: Memory at f7b40000 (32-bit, non-prefetchable) [size=256]
        [virtual] Expansion ROM at f7b00000 [disabled] [size=256K]
        Capabilities: [dc] Power Management version 1
                Flags: PMEClk- DSI- D1- D2- AuxCurrent=55mA PME(D0-,D1-,D2-,D3hot-,D3cold+)
                Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
        Kernel driver in use: pci-stub

# echo 0000:04:00.0 > /sys/bus/pci/drivers/pci-stub/unbind
# echo 0000:04:00.0 > /sys/bus/pci/drivers/r8169/bind
# lspci -s 04: -nnvvv
04:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL-8129 [10ec:8129] (rev 10)
        Subsystem: Coreco Inc RTL8111/8168 PCIe Gigabit Ethernet (misconfigured) [11ec:8129]
        Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
        Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
        Latency: 32 (8000ns min, 8000ns max), Cache Line Size: 64 bytes
        Interrupt: pin A routed to IRQ 19
        Region 0: I/O ports at c000 [size=256]
        Region 1: Memory at f7b40000 (32-bit, non-prefetchable) [size=256]
        [virtual] Expansion ROM at f7b00000 [disabled] [size=256K]
        Capabilities: [dc] Power Management version 1
                Flags: PMEClk- DSI- D1- D2- AuxCurrent=55mA PME(D0-,D1-,D2-,D3hot-,D3cold+)
                Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
        Kernel driver in use: r8169

答案2

我成功了。 (见下文。)

如果我没有的话,我就不会浪费这么多时间急于下结论。我有一个 RTL8169 PCI 网卡,Linux 为其分配了内核树r8169驱动程序。该驱动程序对我的 PCI RTL8169 不起作用,甚至可能导致系统崩溃。然后,我找到了 Hetzner 页面(请参阅相关链接),并假设使用 Realtek 的建议r8168适用于我的情况。 (事实并非如此。)当驱动程序不与我的卡关联时,我固执地认为应该有一种方法让它这样做,以便让卡正常工作。那是一条死胡同。

解决办法就是浏览瑞昱网站又是它自己。他们还有一个名为 的驱动程序r8169,就像 Linux 内核中功能失调的驱动程序一样。我半年前就试过了。显然,它没有成功(具体记得不太清楚了);可能是因为我的无能。无论如何,Realtek 在 2014 年 3 月发布了更新的驱动程序,并且该驱动程序确实有效!谢谢瑞昱!

愉快的结果如下(使用smbclient):

smb: \> get "Zwölf Uhr mittags.ts"
getting file \Zwölf Uhr mittags.ts of size 4703186788 as Zwölf Uhr mittags.ts
(47839,3 KiloBytes/sec) (average 47839,3 KiloBytes/sec)

smb: \> get "Die heiße Spur.ts"
getting file \Die heiße Spur.ts of size 6841251568 as Die heiße Spur.ts
(48516,1 KiloBytes/sec) (average 48516,1 KiloBytes/sec)

我并不希望获得 100 MB/s 的吞吐量。 WDC WD800AAJS-00B4A0 硬盘的速度约为 95 MB/s ( dd if=/dev/zero of=test.out bs=8k count=200k),但首先有 PCI 总线(不是 PCIe!)共享133 MB/s 的带宽可能会影响我的设置(请参阅千兆位以太网:老兄,我的带宽在哪里?),其次,CPU 是 2003 年推出的值得信赖的老式 AMD Athlon 64 3200+ 单核,最高频率为 2200 MHz,根据我的经验,相对适中的 CPU 会显着降低千兆位以太网传输速率,无论是x86/64 或 ARM。所以 50 MB/s 就足够了。

相关内容