Cómo hacer que Realtek nic use el controlador r8168

Cómo hacer que Realtek nic use el controlador r8168

He estado intentando (sin éxito) durante los últimos días hacer que mi tarjeta Ethernet Realtek funcione. No tengo problemas con mi conexión inalámbrica: sólo la conexión ethernet no funciona.

Tengo Ubuntu 16.10 en una Dell Inspiron, con una tarjeta PCI Express RTL8101/2/6E. La tarjeta utilizó el controlador r8169, que parece tener errores y no es confiable (como enaquí). Como la solución parece ser utilizar el controlador r8168, yo:

  • instaló el paquete r8168-dkmsa través de apt-get,
  • puso en la lista negra el r8169módulo/etc/modprobe.d/
  • reiniciado.

No funcionó, ya que lsmodtodavía enumeraba el módulo como en uso y lspci -vaún me decía que la tarjeta estaba usando el controlador y el módulo r8169.

Finalmente logré incluir el módulo en la lista negra pasando la opción grub, agregándolo modprobe.blacklist=r8169a la línea de comando predeterminada en /etc/default/grub.

El problema es que el r8168módulo carga bien (lo veo en lsmod), pero no está asociado a la tarjeta por lo que no aparece en ifconfig(exactamente como le pasó alumíenHaga que Linux cargue un controlador específico para un dispositivo determinado (Realtek NIC)).

Esta es la parte relevante de mi 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

Mi dispositivo:

> 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>

Tenga en cuenta que en el resultado anterior lspcino se muestran controladores ni módulos del kernel en uso.

Finalmente, intenté hacer que mi NIC usara el r8168controlador (como se explica en esterespuesta), en vano:

% 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.

¿Qué me estoy perdiendo? ¿Existe otra forma de indicarle a un dispositivo que utilice un controlador? Cualquier enlace, pista o indicación sobre qué leer a continuación sería útil y muy apreciado.

Respuesta1

Puede hacer esto, pero obviamente tenga en cuenta que es posible que el controlador no sea totalmente compatible con su dispositivo.

También implica recompilar el módulo del kernel, por lo que si eso le preocupa, le recomiendo precaución. Especialmente porque la mayoría de las NIC requieren que se cargue un blob de firmware binario personalizado que puede dañar su hardware, así que tenga cuidado y haga un poco de tarea para localizar un blob de firmware compatible.

¿Feliz de continuar? Bien :)

Primero, necesitará ubicar la fuente del controlador para su kernel en ejecución; supongo que, como está utilizando dkms, esto ya se encuentra en alguna parte de su sistema. Una vez que tengas esto, busca el lugar donde MODULE_DEVICE_TABLEestá registrado. De una búsqueda rápida en línea, como ejemplo, el archivo r8169.c tiene esta sección:

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); 

Aquí es donde se le dice al kernel que si se encuentra un dispositivo con cualquiera de los ID de PCI enumerados, utilice este controlador. Deberá agregar una línea adicional a esta estructura, que contenga el ID del dispositivo PCI de su NIC, volver a compilar (con suerte, solo usando dkms) y reiniciar.

información relacionada