GNU/Linux >> Znalost Linux >  >> Linux

Jak opravit kontrolní součet energeticky nezávislé paměti (NVM) řadiče Intel Ethernet Controller I219-V notebooku ASUS?

Než vyzkoušíte mé řešení, zvažte prosím nejprve vyzkoušení řešení od ppparadox.

S laskavou pomocí od e1000-devel mailing listu, zde je návod, jak jsem opravil slovo kontrolního součtu NVM pomocí ethtool .

tl;dr: V zásadě jsem nejprve opravil e1000e, abych měl přístup k ethernetovému čipu v Linuxu, a poté jsem použil ethtool přečíst hodnotu z oblasti "kontrolního součtu" NVM mého I219-V a poté ji zapsat zpět. Operace zápisu opravila kontrolní součet.

Abych měl přístup ke svému ethernetovému čipu z Linuxu, musel jsem opravit e1000e přeskočit ověření kontrolního součtu NVM. V souboru src/netdev.c , změnil jsem první řádek

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;
    }
}

do

for (i = 0; false; i++) {

(Celý blok lze také jen odstranit nebo okomentovat.)

Poté jsem nainstaloval opravený modul. Z /src adresář, který jsem udělal:

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

Nyní bylo ověření kontrolního součtu přeskočeno a Ethernet začal fungovat.

Před opravou slova kontrolního součtu jsem se podíval na obrys NVM I219 uvedený v části 10 datového listu společnosti Intel. Použití slova kontrolního součtu je vysvětleno v části 10.3.2.2.

Před zápisem do NVM jsem si poznamenal kontrolní součet:

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

(enp0s31f6 je název mého ethernetového rozhraní.) Chybná hodnota kontrolního součtu tedy byla 0x1360 .

Podíval jsem se na výpis NVM s sudo ethtool -e enp0s31f6 a pak se znovu podíval na bajt s offsetem 0x10:

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

(Zřejmě by stačilo jakékoli umístění, ale bylo mi řečeno, že v mém případě nebyla hodnota na offsetu 0x10 vůbec použita, takže se to zdálo "bezpečnější.")

Pro zápis do NVM (EEPROM) s ethtool , potřeboval jsem "magický klíč." Přečetl jsem si Uvolnění síťového rozhraní Intel Pro/1000 (e1000) a zjistil jsem, že můj magický klíč je 0x15708086 pomocí lspci -nn :

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

Pak jsem napsal 0xff zpět na offset 0x10 v NVM:

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

Po porovnání výpisů paměti NVM před a po zápisu jsem viděl, že podle očekávání jediná věc, která se změnila, bylo slovo kontrolního součtu:

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

Nová hodnota tedy byla 0x9360 .

Zavedl jsem jádro s neopraveným e1000e a ethernetový port fungoval dobře.

P.S. Připadá mi trochu znepokojivé, že pouze nejvyšší bit ve slově kontrolního součtu byl špatný.


Použil jsem bootutil pro Linux od Intelu (jak je navrženo v příspěvku z roku 2011) na integrovaném Intel NIC na mém Asus Z270-A, abyste tuto chybu opravili, bez rekompilace a magických klíčů, o kterých se mluví v kladné odpovědi. Fungovalo to skvěle. Nástroj jsem stáhl ze stránek pro stahování Intel

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

Dostával jsem stejnou chybu na Fedoře 24 z e1000e ovladač se základní deskou ASUS ROG MAXIMUS IX HERO, která má adaptér Intel I219-V NIC.

Přijímané řešení, které vyžaduje opravu NVM, považuji za příliš riskantní. Může to způsobit, že váš hardware nebude k ničemu.

Jedním z bezpečných řešení je použít výchozí konfiguraci na NIC pomocí Intel Ethernet Connections Boot Utility. Funguje v Linuxu ihned po vybalení, není třeba vytvářet spouštěcí disk:

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

To je vše. Stačí restartovat (nebo znovu načíst e1000e ovladač ručně).


Linux
  1. Jak ověřit integritu souboru pomocí kontrolního součtu md5

  2. Jak mohu měřit skutečné využití paměti aplikací nebo procesem?

  3. Jak zaznamenat spotřebu paměti v Linuxu?

  1. Jak mohu zobrazit využití paměti každého procesu, když udělám 'ps -ef'?

  2. Jak sledovat využití paměti vyhrazené jádru?

  3. Jak omezit celkové zdroje (paměť) procesu a jeho potomků

  1. Linux – Jak získat množství dostupné paměti přenositelně napříč distribucemi?

  2. Jak mohu získat množství dostupné paměti přenosně napříč distribucemi?

  3. Jak zkontrolovat fyzický stav ethernetového portu v Linuxu?