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.