Hoje pela manhã (ou quase isso), fui surpreendido pelo mau funcionamento da minha placa de rede cabeada, uma placa gigabit.  Não é uma placa que eu tenha escolhido, pois faz parte do notebook, um Sony Vaio VPC-S110GB.

Como a placa não tem led de indicação de funcionamento, eu só consegui identificar que não estava operando pela mensagem abaixo:


root@shibboleet:~# dmesg | grep -i eth
[45263.845838] ADDRCONF(NETDEV_UP): eth0: link is not ready

Após algumas tentativas infrutíferas de colocar e tirar o cabo (acabei até quebro o clipezinho que segura o cabo), dei uma olhada como estava a camada de enlace ethernet.


root@shibboleet:~# mii-tool eth0
SIOCGMIIREG on eth0 failed: Input/output error
SIOCGMIIREG on eth0 failed: Input/output error
SIOCGMIIREG on eth0 failed: Input/output error
SIOCGMIIREG on eth0 failed: Input/output error
SIOCGMIIREG on eth0 failed: Input/output error
SIOCGMIIREG on eth0 failed: Input/output error
SIOCGMIIREG on eth0 failed: Input/output error
SIOCGMIIREG on eth0 failed: Input/output error
SIOCGMIIREG on eth0 failed: Input/output error
SIOCGMIIREG on eth0 failed: Input/output error
SIOCGMIIREG on eth0 failed: Input/output error
SIOCGMIIREG on eth0 failed: Input/output error
eth0: negotiated 1000baseT-HD flow-control, link ok

Esse "Input/output error" já me deu uma dica que algo tinha acontecido com o driver da placa.  Como estou usando um kernel-pf, e compilado por mim, esse tipo de erro pode mesmo surgir.  Claro que existe a possibilidade de ser um defeito da placa, mas prefiro acreditar que o erro é meu, pois esse eu consigo consertar.

Então dei uma olhada na placa de rede.


root@shibboleet:~# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:24:be:65:5a:ab  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:4294957164 errors:4294906502 dropped:4294947030 overruns:4294957163 frame:4294967295
          TX packets:4294957163 errors:4294926764 dropped:0 overruns:4294957163 carrier:4294967295
          collisions:4294916631 txqueuelen:1000 
          RX bytes:4294957164 (4.2 GB)  TX bytes:4294957163 (4.2 GB)
          Interrupt:43 

É notável a quantidade de colisões na placa, além de erros, que mostram que realmente alguma coisa não estava certa.

Em outros sistemas (nem preciso mencionar), a única solução seria a de... rebootar.  Mas como é um Linux, com kernel modular, bastou fazer o seguinte:


root@shibboleet:~# ifconfig eth0 down
root@shibboleet:~# rmmod atl1c
root@shibboleet:~# modprobe atl1c
root@shibboleet:~# ifconfig eth0 up

Em seguinda, testando o meio físico...


root@shibboleet:~# mii-tool eth0
eth0: negotiated 1000baseT-FD flow-control, link ok

E nada de reboot.  Nada como usar unix.  Pode não ser perfeito, mas também não é windows.