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