GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie repariert man die Prüfsumme des nichtflüchtigen Speichers (NVM) des Intel Ethernet Controller I219-V eines ASUS-Laptops?

Bevor Sie meine Lösung ausprobieren, versuchen Sie bitte zuerst die von ppparadox.

Mit freundlicher Hilfe von e1000-devel Mailingliste, hier ist, wie ich das NVM Prüfsummenwort repariert habe mit ethtool .

tl;dr: Im Grunde habe ich zuerst e1000e gepatcht, um Zugriff auf den Ethernet-Chip in Linux zu haben, und dann ethtool verwendet einen Wert aus dem "Checksummed"-Bereich des NVM meines I219-V auszulesen und dann zurückzuschreiben. Der Schreibvorgang hat die Prüfsumme korrigiert.

Um von Linux aus auf meinen Ethernet-Chip zugreifen zu können, musste ich e1000e patchen um die NVM-Prüfsummenvalidierung zu überspringen. In Datei src/netdev.c , habe ich die erste Zeile von

geändert
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++) {

(Der ganze Block könnte auch einfach entfernt oder auskommentiert werden.)

Dann habe ich das gepatchte Modul installiert. Ab /src Verzeichnis habe ich gemacht:

sudo make install
sudo modprobe -r e1000e
sudo modprobe e1000e
sudo update-initramfs -u
reboot

Jetzt wurde die Überprüfung der Prüfsumme übersprungen und das Ethernet funktionierte.

Bevor ich das Prüfsummenwort korrigierte, habe ich mir den Umriss des NVM von I219 angesehen, der in Abschnitt 10 von Intels Datenblatt dargestellt ist. Die Verwendung des Prüfsummenworts wird in Abschnitt 10.3.2.2 erläutert.

Ich habe das Prüfsummenwort notiert, bevor ich an den NVM geschrieben habe:

$ sudo ethtool -e enp0s31f6 offset 0x7e length 2
Offset      Values
------      ------
0x007e:     60 13 

(enp0s31f6 ist der Name meiner Ethernet-Schnittstelle.) Der fehlerhafte Prüfsummenwortwert war also 0x1360 .

Ich habe mir den Dump von NVM mit sudo ethtool -e enp0s31f6 angeschaut und dann nochmal auf das Byte bei Offset 0x10 geschaut:

$ sudo ethtool -e enp0s31f6 offset 0x10 length 1
Offset      Values
------      ------
0x0010:     ff 

(Anscheinend würde es jeder Ort tun, aber mir wurde gesagt, dass in meinem Fall der Wert bei Offset 0x10 überhaupt nicht verwendet wurde, also erschien es "sicherer".)

Zum Beschreiben des NVM (EEPROM) mit ethtool , ich brauchte einen "magischen Schlüssel". Ich habe Unbricking an Intel Pro/1000 (e1000) network interface gelesen und fand heraus, dass mein magischer Schlüssel 0x15708086 war mit lspci -nn :

$ lspci -nn | grep Ethernet
00:1f.6 Ethernet controller [0200]: Intel Corporation Ethernet Connection I219-V [8086:1570] (rev 21)

Dann schrieb ich 0xff zurück zum Offset 0x10 im NVM:

$ sudo ethtool -E enp0s31f6 magic 0x15708086 offset 0x10 value 0xff

Nachdem ich die Dumps des NVM vor und nach dem Schreiben verglichen hatte, konnte ich sehen, dass sich wie erwartet nur das Prüfsummenwort geändert hatte:

$ sudo ethtool -e enp0s31f6 offset 0x7e length 2
Offset      Values
------      ------
0x007e:     60 93 

Der neue Wert war also 0x9360 .

Ich habe einen Kernel mit einem ungepatchten e1000e gebootet , und der Ethernet-Anschluss funktionierte einwandfrei.

P.S. Ich finde es etwas beunruhigend, dass nur das höchste Bit im Prüfsummenwort falsch war.


Ich habe bootutil verwendet für Linux von Intel (wie im Beitrag von 2011 vorgeschlagen) auf einer integrierten Intel-NIC auf meinem Asus Z270-A, um diesen Fehler zu beheben, ohne die Neukompilierung und die magischen Schlüssel, die in der positiven Antwort besprochen wurden. Es hat super funktioniert. Ich habe das Tool von der Intel Download-Site

heruntergeladen
chmod +x ./bootutil64e
sudo ./bootutil64e -NIC 1 -defcfg

Ich habe den gleichen Fehler auf Fedora 24 von e1000e erhalten Treiber mit ASUS ROG MAXIMUS IX HERO-Motherboard mit Intel I219-V-NIC-Adapter.

Ich finde die akzeptierte Lösung, die das Patchen des NVM erfordert, zu riskant. Es kann Ihre Hardware unbrauchbar machen.

Eine sichere Lösung besteht darin, die Standardkonfiguration mithilfe des Intel Ethernet Connections Boot Utility auf die NIC anzuwenden. Es funktioniert sofort unter Linux, es muss keine Bootdiskette erstellt werden:

$ chmod +x bootutil64e
$ sudo ./bootutil64e -NIC=1 -DEFAULTCONFIG

Das ist es. Starten Sie einfach neu (oder laden Sie e1000e erneut Treiber manuell).


Linux
  1. Wie repariere ich die Installation?

  2. So überprüfen Sie die Integrität einer Datei mit der md5-Prüfsumme

  3. Wie kann ich die tatsächliche Speichernutzung einer Anwendung oder eines Prozesses messen?

  4. Wie protokolliere ich den Speicherverbrauch unter Linux?

  5. Wie kann ich die Speichernutzung jedes Prozesses anzeigen, wenn ich ein 'ps -ef' mache?

Was ist NVM (nicht flüchtiger Speicher)?

Linux – Wie erhält man die Menge an verfügbarem Speicher portabel über Distributionen hinweg?

Wie kann man 90 % des freien Speichers füllen?

Debian – Wie repariert man den Grub auf Debian?

Wie man die Gesamtressourcen (Speicher) eines Prozesses und seiner Kinder begrenzt

Wie überprüfe ich den physischen Status eines Ethernet-Ports in Linux?