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-dkms
a través de apt-get, - puso en la lista negra el
r8169
módulo/etc/modprobe.d/
- reiniciado.
No funcionó, ya que lsmod
todavía enumeraba el módulo como en uso y lspci -v
aú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=r8169
a la línea de comando predeterminada en /etc/default/grub
.
El problema es que el r8168
mó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 lspci
no se muestran controladores ni módulos del kernel en uso.
Finalmente, intenté hacer que mi NIC usara el r8168
controlador (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_TABLE
está 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.