Como fazer o Realtek nic usar o driver r8168

Como fazer o Realtek nic usar o driver r8168

Tenho tentado (sem sucesso) nos últimos dias fazer minha placa Ethernet Realtek funcionar. Não tenho problemas com minha conexão wireless: apenas a conexão Ethernet não funciona.

Eu tenho o Ubuntu 16.10 em um Dell Inspiron, com uma placa PCI Express RTL8101/2/6E. A placa usava o driver r8169, que parece ter bugs e não ser confiável (como emaqui). Como a solução parece ser usar o driver r8168, eu:

  • instalei o pacote r8168-dkmsvia apt-get,
  • colocou o r8169módulo na lista negra em/etc/modprobe.d/
  • reiniciado.

Não funcionou, pois lsmodainda listei o módulo como em uso, e lspci -vainda me disse que a placa estava usando o driver e módulo r8169.

Finalmente consegui colocar o módulo na lista negra passando a opção para grub, adicionando modprobe.blacklist=r8169à linha de comando padrão em /etc/default/grub.

O problema é que o r8168módulo carrega bem (vejo isso em lsmod), mas não está associado ao cartão, então não aparece ifconfig(exatamente como aconteceu comluzemFaça o Linux carregar driver específico para determinado dispositivo (Realtek NIC)).

Esta é a parte relevante do meu 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

O meu aparelho:

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

Observe que a saída acima lspcinão mostra nenhum driver nem módulo do kernel em uso.

Finalmente, tentei fazer com que minha NIC usasse o r8168driver (conforme explicado nesteresponder), para nenhum proveito:

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

o que estou perdendo? Existe outra maneira de dizer a um dispositivo para usar um driver? Quaisquer links, pistas ou indicações sobre o que ler a seguir serão úteis e muito apreciados.

Responder1

Você pode fazer isso, mas obviamente esteja avisado que o driver pode não ser totalmente compatível com o seu dispositivo!

Também envolve a recompilação do módulo do kernel, portanto, se isso o preocupa, aconselho cautela. Especialmente porque a maioria das NICs exige o carregamento de um blob de firmware binário personalizado que pode danificar seu hardware - portanto, esteja avisado e faça um pouco de lição de casa para localizar um blob de firmware compatível.

Feliz em continuar? Bom :)

Primeiro, você precisará localizar a fonte do driver para o seu kernel em execução - presumo que, como você está usando o dkms, ele já está em algum lugar do seu sistema. Depois de fazer isso, encontre o local onde MODULE_DEVICE_TABLEestá registrado. A partir de uma rápida pesquisa online, por exemplo, o arquivo r8169.c contém esta seção:

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

Portanto, é aqui que o kernel é informado de que, se um dispositivo com qualquer um dos IDs PCI listados for encontrado, use este driver. Você precisará adicionar uma linha extra a esta estrutura, contendo o ID do dispositivo PCI da sua NIC, recompilar (esperançosamente usando dkms) e reiniciar.

informação relacionada