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á:
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:
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.
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:
# 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:
Opa, veja só o que eu achei no meio do código do módulo:
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.
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:
Vamos para o diretório do fonte e vamos usar alguns comandos básicos para podermos compilar o driver:
# make menuconfig
Após o último comando, escolha exit e yes. E a compilação propriamente dita:
Pronto, o novo driver foi compilado. Vamos descarregar o módulo antigo, copiar o novo no lugar dele e carrega-lo:
# 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 🙂