Com a ajuda da lista de discussão e1000-devel , aqui é como eu consertei a palavra Checksum NVM usando ethtool
.
ethtool
para ler um valor da região "checksummed" do NVM do meu I219-V e então para escrever de volta. A operação de escrita corrigiu a soma de verificação.
Para ter acesso ao meu chip Ethernet do Linux, tive que corrigir e1000e para pular a validação da soma de verificação da NVM. No arquivo src/netdev.c
, mudei a primeira linha de
for (i = 0;; i++) {
if (e1000_validate_nvm_checksum(&adapter->hw) >= 0)
break;
if (i == 2) {
dev_err(pci_dev_to_dev(pdev),
"The NVM Checksum Is Not Valid\n");
err = -EIO;
goto err_eeprom;
}
}
em
for (i = 0; false; i++) {
(O bloco inteiro também pode ser removido ou comentado.)
Em seguida, instalei o módulo corrigido. Do diretório /src
que fiz:
sudo make install
sudo modprobe -r e1000e
sudo modprobe e1000e
sudo update-initramfs -u
reboot
Agora, a validação da soma de verificação foi ignorada e a Ethernet começou a funcionar.
Antes de consertar a palavra Checksum, eu examinei o esboço do NVM de I219 apresentado na Seção 10 da Intel. datasheet . O uso da palavra Checksum é explicado na Seção 10.3.2.2.
Eu observei a palavra Checksum antes de gravar no NVM:
$ sudo ethtool -e enp0s31f6 offset 0x7e length 2
Offset Values
------ ------
0x007e: 60 13
( enp0s31f6
é o nome da minha interface Ethernet.) Assim, o valor da palavra Checksum errôneo era 0x1360
.
Eu olhei para o despejo de NVM com sudo ethtool -e enp0s31f6
e, em seguida, olhei novamente para o byte no deslocamento 0x10:
$ sudo ethtool -e enp0s31f6 offset 0x10 length 1
Offset Values
------ ------
0x0010: ff
(Aparentemente, qualquer local faria, mas foi-me dito que, no meu caso, o valor no offset 0x10 não era usado, então parecia "mais seguro").
Para gravar no NVM (EEPROM) com ethtool
, eu precisava de uma "chave mágica". Eu li desbrotando um Intel Pro / 1000 (e1000) interface de rede e descobri que minha chave mágica era 0x15708086
using lspci -nn
:
$ lspci -nn | grep Ethernet
00:1f.6 Ethernet controller [0200]: Intel Corporation Ethernet Connection I219-V [8086:1570] (rev 21)
Então eu escrevi 0xff
de volta para o offset 0x10 no NVM:
$ sudo ethtool -E enp0s31f6 magic 0x15708086 offset 0x10 value 0xff
Depois de comparar os dumps do NVM antes e depois da gravação, pude ver que, como esperado, a única coisa que mudou foi a palavra Checksum:
$ sudo ethtool -e enp0s31f6 offset 0x7e length 2
Offset Values
------ ------
0x007e: 60 93
O novo valor, portanto, foi 0x9360
.
Eu inicializei um kernel com e1000e sem patch, e a porta Ethernet funcionou bem.
P.S. Acho um pouco preocupante que somente o bit mais alto na palavra Checksum estivesse errado.