Resolvendo problemas de hardware no Linux

Primeiro, vou mostrar como podemos obter um relatório completo do problema, para que outros nos fóruns da vida possam nos ajudar. Depois, aos mais aventureiros, vou mostrar como resolvi o meu problema e fiz a rede do tal PC funcionar no Ubuntu. Quem sabe você mesmo não consegue resolver seu problema também?
A maioria dos comandos abaixo precisam ser executados como root. No Ubuntu você pode executar como root adicionando o comando “sudo” antes do comando, ou usar o comando “sudo su” para se logar como root. Em outras distribuição, use o comando “su -” para ganhar acesso root.

Passo 1: coletando informações sobre o problema

A primeira coisa a fazer é descobrir como o sistema enxerga o hardware problemático. De nada adianta dizer no fórum que sua placa de rede da SIS não está funcionando. É preciso descrever o modelo, e essa informação você consegue com o comando `lspci`. Ele vai listar sua placa de rede, sua placa de vídeo, modem e outros dispositivos, coisa fina. Vamos lá:

# lspci -nn
00:04.0 Ethernet controller [0200]:Silicon Integrated Systems (SIS) 190 Gigabit Ethernet Adapter [1039:0190] (rev 01)

Viu? Coloquei só a linha da placa de rede para não poluir o texto, mas você deve obter mais umas dez linhas. Procure seu hardware problemático e guarde bem dois números em especial: o primeiro bloco de números que aparece – no caso aí de cima, o “00:04.0” – e o ID do dispositivo – no finalzinho, entre colchetes: 1039:0190.

O módulo do hardware problemático

Será que o módulo do dispositivo foi carregado? Aliás… qual é o módulo dele? Para descobrir isso vamos usar o ID do dispositivo (no meu caso, como vimos acima, é 1039:0190).
O ID do dispositivo tem duas partes: os quatro primeiros números (1039) indicam o fabricante (no nosso caso a SIS). Os quatro últimos (0190) o modelo. Para saber qual é o driver do dispositivo em questão entre com esse comando, obviamente substituindo os números do ID pelos seus:

# modprobe -c | egrep ‘1039.*0190’
alias pci:v00001039d00000190sv*sd*bc*sc*i* sis190

O módulo é esse aí no final da linha, o sis190. Será que ele está carregado? Entre com o comando “lsmod | grep sis190”. Se o comando não retornar nada, tente carregar o módulo manualmente usando o comando “modprobe sis190” (sempre como root, não se esqueça). O módulo carregou, mas a rede ainda não funciona? Então continue lendo.

Pergunte ao kernel: por quê o hardware não funciona?

Agora vamos ver o quê está acontecendo com o hardware problemático durante a inicialização do Linux. Para isso, vamos usar o comando `dmesg`, que nos mostra o log com todos os “acontecimentos” do kernel durante o boot. Mas vamos peneirar o resultado, para que só as linhas referentes ao nosso hardware esquisitão apareçam. Para isso, vou filtrar a saída do dmesg pelo grep, pedindo a ele que nos mostre apenas as linhas que contenham “00:04.0” – número que obtive lá em cima com o comando lspci -nn, lembram? Não se esqueça de trocar o “00:04.0” pelo bloco de números do seu hardware.

# dmesg | grep ’00:04.0′
0000:00:04.0: Read MAC address from APIC
0000:00:04.0: Can not find ISA bridge

A-há, a placa de rede não consegue encontrar o ISA bridge! O quê isso significa? Sei lá, o importante é que o erro é esse. Se você pretende fazer uma busca no google ou pedir ajuda nos fóruns da vida, já tem toda a informação de que precisa. Vá ao seu fórum predileto e dê aos seus amigos essas informações:

  • Hardware: Silicon Integrated Systems (SIS) 190 Gigabit Ethernet Adapter
  • ID do hardware: 1039:0190
  • Módulo do hardware: sis190
  • Mensagens do kernel relacionadas ao hardware: poste a saída do comando dmesg que vimos logo acima.

Se alguém souber resolver o problema, não vai ser por falta de informação que vai deixar de te ajudar. Agora, se você quer entender o que está acontecendo e quer tentar resolver o problema por conta própria, continue lendo.

Passo 2: resolvendo o problema

O comando dmesg mostrou o problema que o kernel está tendo com nosso hardware: “0000:00:04.0: Can not find ISA bridge”. O quê isso significa?
Eu estava usando uma placa relativamente recente da ECS, com chipset SIS (os chipsets da SIS costumam ser problemáticos no Linux). O módulo que dá suporte a minha placa de rede é o sis190. Supostamente a rede deveria estar funcionando, mas nossa placa de rede favorita está tendo problemas para encontrar o ISA bridge. Por quê será?
Para resolver o problema, vamos dar uma olhada no código-fonte do módulo. Provavelmente poderemos acertar o problema e compilar o módulo novamente, já corrigido. Não é tão difícil quanto parece.

Obtendo os fontes do kernel

O módulo de rede sis190 vem embutido no kernel. Então vamos baixar e descompactar o código fonte do kernel, que traz consigo o fonte do sis190, o módulo problemático:

# sudo apt-get install linux-source-`uname -r`
# tar jxvf /usr/src/linux-source-`uname -r`.tar.bz2

Agora vamos dar uma espiada no código-fonte do módulo em questão:

# gedit /usr/src/linux-source-`uname -r`/drivers/net/sis190.c

Opa, veja só o que eu achei no meio do código do módulo:

isa_bridge = pci_get_device(PCI_VENDOR_ID_SI, 0x0965, NULL);
if (!isa_bridge) {
net_probe(tp, KERN_INFO “%s: Can not find ISA bridge.n”,
pci_name(pdev));
return -EIO;
}

Olha só, a mensagem de erro “Can not find ISA bridge”! Aí está o problema que meu kernel estava acusando – lembram de quando usei o comando dmesg? Neste caso, é bom obter informações sobre o meu ISA Bridge para saber porque o driver não está encontrando ele.

# lspci -nn
00:02.0 ISA bridge [0601]: Silicon Integrated Systems [SiS] Unknown device 0966 [1039:0966] (rev 59)

De novo o comando lspci -nn, mas desta vez destaco a linha que me interessa. Hmm… veja que estranho: o ID que o lspci acusa para meu ISA bridge é 1039:0966. Mas lá no código do driver temos essa linha que diz isa_bridge = pci_get_device(PCI_VENDOR_ID_SI, 0x0965, NULL); Reparou? O driver diz à placa de rede que meu ISA bridge é um modelo 0965, mas o lspci mostrou que o meu modelo é o 0966! O módulo está apontando para o lugar errado!!! Vamos mudar esse 0965 para 0966 no código do módulo, salvar o arquivo modificado e compilá-lo.

Compilando o novo driver

Para compilar o driver vamos precisar do pacote build-essential. Dê um:

sudo apt-get install build-essential

Vamos para o diretório do fonte e vamos usar alguns comandos básicos para podermos compilar o driver:

# cd /usr/src/linux-source-`uname -r`
# make menuconfig

Após o último comando, escolha exit e yes. E a compilação propriamente dita:

# make drivers/net/sis190.ko

Pronto, o novo driver foi compilado. Vamos descarregar o módulo antigo, copiar o novo no lugar dele e carrega-lo:

# rmmod sis190.ko
# cp drivers/net/sis190.ko /lib/modules/`uname -r`/kernel/drivers/net/
# modprobe sis190

Se tudo correu bem, você resolveu o problema e sua rede está funcionando! Pode ir contar aos seus amigos 🙂

Roberto M Bechtlufft é administrador de sistemas Linux e editor do site Linux Para o Resgate (http://www.linuxparaoresgate.com), que publica dicas para administradores de sistemas em apuros. Iniciou na informática com os velhos micros MSX, e até hoje se diverte com games da era dos 8 e 16 bits. Arrisca um pouco de Shell-script, Python e PHP. Pode ser contactado através do “robertobech em linuxparaoresgate.com”

Sobre o Autor

Redes Sociais:

Deixe seu comentário

X