GNU/Linux >> Linux Esercitazione >  >> Linux

Come riparare il checksum della memoria non volatile (NVM) del controller Ethernet Intel I219-V di un laptop ASUS?

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).


Linux
  1. Come riparare l'installazione?

  2. Come verificare l'integrità di un file con il checksum md5

  3. Come posso misurare l'effettivo utilizzo della memoria di un'applicazione o di un processo?

  4. Come registrare il consumo di memoria su Linux?

  5. Come rilasciare le pagine enormi dall'applicazione bloccata

Che cos'è la NVM (memoria non volatile)?

Linux:come ottenere la quantità di memoria disponibile in modo portatile attraverso le distribuzioni?

Come riempire il 90% della memoria libera?

Debian – Come riparare Grub su Debian?

Come posso ottenere la quantità di memoria disponibile in modo portabile tra le distribuzioni?

Come verificare lo stato fisico di una porta Ethernet in Linux?