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-dkms
via apt-get, - colocou o
r8169
módulo na lista negra em/etc/modprobe.d/
- reiniciado.
Não funcionou, pois lsmod
ainda listei o módulo como em uso, e lspci -v
ainda 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 r8168
mó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 lspci
não mostra nenhum driver nem módulo do kernel em uso.
Finalmente, tentei fazer com que minha NIC usasse o r8168
driver (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_TABLE
está 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.