Índice das dicas

Resolvendo problemas de hardware no Linux

Roberto Bechtlufft criou 25/jul/2007 às 16h59

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

3 comentáriosPor Roberto Bechtlufft. Revisado 13/ago/2010 às 15h50

Comentários