Como fazer com que o Realtek nic use o driver r8168

1

Eu tenho tentado (sem sucesso) nos últimos dias fazer minha placa ethernet Realtek funcionar. Não tenho problemas com minha conexão sem fio: somente 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 ser buggy e não confiável (como em aqui ). Como a solução parece ser usar o driver r8168, eu:

  • instalou o pacote r8168-dkms via apt-get,
  • na lista negra do módulo r8169 em /etc/modprobe.d/
  • reinicializado.

Não funcionou, pois lsmod ainda listou o módulo como em uso e lspci -v ainda me disse que o cartão estava usando o driver e o módulo r8169.

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

O problema é que o módulo r8168 carrega bem (eu vejo isso em lsmod ), mas não está associado ao cartão, então ele não aparece em ifconfig (exatamente como aconteceu com lumi em Faça com que o Linux carregue um 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

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

Por favor, note que na saída acima lspci não mostra nenhum driver nem módulos do kernel em uso.

Por fim, tentei fazer com que meu NIC usasse o driver r8168 (conforme explicado nesta resposta ), sem sucesso:

% 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 em seguida seria útil e muito apreciado.

    
por Tama 29.05.2017 / 19:12

1 resposta

0

Você pode fazer isso, mas obviamente esteja avisado de 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, então, se isso o incomoda, aconselho cautela. Especialmente porque a maioria dos NICs exige que um blob de firmware binário personalizado seja carregado, o que pode danificar seu hardware - por isso, 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 kernel em execução - presumo que, como você está usando o dkms, isso já está em seu sistema em algum lugar. Depois de ter isso, encontre o local onde o MODULE_DEVICE_TABLE está registrado. De uma rápida pesquisa online, por exemplo, o arquivo r8169.c tem 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 informa que, se um dispositivo com qualquer uma das IDs PCI listadas for encontrado, use este driver. Você precisará adicionar uma linha extra a essa estrutura, contendo o ID do dispositivo PCI da sua NIC, recompilar (esperamos que apenas usando dkms) e reiniciar.

    
por 29.05.2017 / 20:09