Faire Linux charger un pilote spécifique pour un périphérique donné (Realtek NIC)

Ceci est un problème de pilote sur une machine vintage (AMD K8, chipset Nvidia) sous Linux 3.11 (Mint distro, mais je ne pense pas que cela soit important).

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) 

Je veux que le kernel charge un autre pilote pour ma carte Ethernet PCI Realtek 8169, que vous pouvez voir à la fin de la list comme 02:05.0 . Voici le détail:

 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- 

Le problème est que le r8169 ne fonctionne tout simplement pas. Cela peut même faire planter Linux. Je l'ai mis en list noire dans /etc/modprobe.d/ .

La solution semble utiliser le pilote r8168 place . (Il y a aussi une question connexe sur ce site .) Vous pouvez download la source de Realtek, la comstackr et l'installer, ce que j'ai fait. Si vous modprobe r8168 , il se charge bien mais ne s'associe pas avec le matériel, donc la carte ne s'affiche pas dans ifconfig .

Je pense que cela a à voir avec les modalias (encode les informations matérielles) et le mappage périphérique / pilote dans /lib/modules/*/modules.alias .

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

Ceci est ma carte. Voici les mappages de pilotes Realtek dans le système:

 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 

J'ai essayé d'append cette ligne à la fin du file (sachant que vous n'êtes pas supposé faire des modifications manuelles):

 alias pci:v000010ECd00008169sv000010ECsd00008169bc02sc00i00 r8168 

Ensuite déchargé et rechargé r8168 mais cela ne configure pas la carte et il n'y a rien dans dmesg .

Quelle est la bonne façon de mapper ma carte réseau au pilote r8168 ? Est-ce que je dois rebuild le pilote pour qu'il puisse gérer ma carte? Ou y a-t-il des données de configuration que je dois append au bon endroit?

Vous pouvez forcer un périphérique à utiliser un périphérique en utilisant bind. Si l'appareil appartient déjà à un autre pilote, vous devez d'abord le détacher.

Si un ID de fournisseur PCI ( 10ec pour Realtek) et un ID d'appareil n'est pas reconnu, vous pouvez le faire reconnaître à l'exécution avec:

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

Exemple:

 # 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 

Je l'ai fait fonctionner. (Voir ci-dessous.)

Je n'aurais pas perdu autant de time si je n'avais pas sauté aux conclusions . J'ai eu une carte réseau PCI RTL8169 à laquelle Linux a assigné le pilote kernel tree r8169 . Ce pilote est dysfonctionnel pour mon PCI RTL8169 et peut même planter le système. J'ai ensuite trouvé la page Hetzner (voir le lien en question) et j'ai pris le conseil d'utiliser le Realtek r8168 appliqué à ma situation. (Ce n'est pas le cas.) Lorsque le conducteur ne voulait pas s'associer à ma carte, je pensais obstinément qu'il devrait y avoir un moyen de le faire pour que la carte fonctionne. C'était une rue sans issue.

La solution consiste à parcourir à nouveau le site Realtek . Ils ont aussi un pilote appelé r8169 , tout comme le pilote dysfonctionnel du kernel Linux. J'ai essayé ça il y a un an et demi. Apparemment, il n'a pas réussi (ne me souviens pas exactement); probablement en raison de mon incompétence. Quoi qu'il en soit, Realtek a publié un pilote mis à jour en mars 2014, et ce pilote fonctionne! Merci Realtek!

Le résultat heureux est le suivant (en utilisant 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) 

Je n'espérais pas get un débit de 100 Mo / s. Le disque dur WDC WD800AAJS-00B4A0 fait environ 95 Mo / s, mais il y a d'abord une bande passante partagée de bus PCI (pas PCIe!) De 133 Mo / s qui pourraient affecter mon installation (voir Gigabit Ethernet: Dude, Où est ma bande passante? ), et ensuite, le CPU est un ancien AMD Athlon 64 3200+ monocœur fidèle de 2003 à 2200 MHz, et il est commun dans mon expérience de voir le taux de transfert Gigabit Ethernet considérablement réduit par CPU relativement modeste, que ce soit x86 / 64 ou ARM. Donc 50 Mo / s est assez bon.