Prima di provare la mia soluzione, considera di provare prima quella di ppparadox.
Con il gentile aiuto di e1000-devel mailing list, ecco come ho corretto la parola di checksum NVM utilizzando ethtool
.
tl;dr: Fondamentalmente, ho prima patchato e1000e per avere accesso al chip Ethernet in Linux, e poi ho usato ethtool
per leggere un valore dalla regione "checksum" dell'NVM del mio I219-V e quindi riscriverlo. L'operazione di scrittura ha corretto il checksum.
Per avere accesso al mio chip Ethernet da Linux, ho dovuto patchare e1000e per saltare la convalida del checksum NVM. Nel file src/netdev.c
, ho cambiato la prima riga di
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;
}
}
in
for (i = 0; false; i++) {
(L'intero blocco potrebbe anche essere semplicemente rimosso o commentato.)
Quindi ho installato il modulo patchato. Dal /src
directory che ho fatto:
sudo make install
sudo modprobe -r e1000e
sudo modprobe e1000e
sudo update-initramfs -u
reboot
Ora la convalida del checksum è stata saltata e l'Ethernet ha iniziato a funzionare.
Prima di correggere la parola Checksum, ho esaminato lo schema dell'NVM di I219 presentato nella Sezione 10 del foglio dati di Intel. L'uso della parola Checksum è spiegato nella Sezione 10.3.2.2.
Ho annotato la parola Checksum prima di scrivere su NVM:
$ sudo ethtool -e enp0s31f6 offset 0x7e length 2
Offset Values
------ ------
0x007e: 60 13
(enp0s31f6
è il nome della mia interfaccia Ethernet.) Quindi il valore errato della parola Checksum era 0x1360
.
Ho guardato il dump di NVM con sudo ethtool -e enp0s31f6
e poi ho guardato di nuovo il byte all'offset 0x10:
$ sudo ethtool -e enp0s31f6 offset 0x10 length 1
Offset Values
------ ------
0x0010: ff
(Apparentemente qualsiasi posizione andrebbe bene, ma mi è stato detto che nel mio caso il valore all'offset 0x10 non è stato utilizzato affatto, quindi sembrava "più sicuro".)
Per scrivere nella NVM (EEPROM) con ethtool
, avevo bisogno di una "chiave magica". Ho letto Unbricking di un'interfaccia di rete Intel Pro/1000 (e1000) e ho capito che la mia chiave magica era 0x15708086
utilizzando lspci -nn
:
$ lspci -nn | grep Ethernet
00:1f.6 Ethernet controller [0200]: Intel Corporation Ethernet Connection I219-V [8086:1570] (rev 21)
Poi ho scritto 0xff
torna all'offset 0x10 nella NVM:
$ sudo ethtool -E enp0s31f6 magic 0x15708086 offset 0x10 value 0xff
Dopo aver confrontato i dump della NVM prima e dopo la scrittura, ho potuto vedere che, come previsto, l'unica cosa che è cambiata è stata la parola Checksum:
$ sudo ethtool -e enp0s31f6 offset 0x7e length 2
Offset Values
------ ------
0x007e: 60 93
Il nuovo valore quindi era 0x9360
.
Ho avviato un kernel con un e1000e senza patch e la porta Ethernet ha funzionato correttamente.
P.S. Trovo un po' preoccupante che solo il bit più alto nella parola Checksum sia sbagliato.
Ho usato bootutil
per Linux di Intel (come suggerito nel post del 2011) su una scheda NIC Intel integrata sul mio Asus Z270-A per correggere questo errore, senza la ricompilazione e le chiavi magiche discusse nella risposta votata. Ha funzionato benissimo. Ho scaricato lo strumento dal sito di download di Intel
chmod +x ./bootutil64e
sudo ./bootutil64e -NIC 1 -defcfg
Stavo ricevendo lo stesso errore su Fedora 24 da e1000e
driver con scheda madre ASUS ROG MAXIMUS IX HERO con adattatore NIC Intel I219-V.
Trovo la soluzione accettata, che richiede l'applicazione di patch alla NVM, troppo rischiosa. Potrebbe rendere inutile il tuo hardware.
Una soluzione sicura consiste nell'applicare la configurazione predefinita alla scheda NIC utilizzando Intel Ethernet Connections Boot Utility. Funziona in Linux immediatamente, non è necessario creare un disco di avvio:
$ chmod +x bootutil64e
$ sudo ./bootutil64e -NIC=1 -DEFAULTCONFIG
Questo è tutto. Basta riavviare (o ricaricare e1000e
driver manualmente).