英特爾乙太網連接 I219-V 在 ASUSPRO B 筆記型電腦上的 Linux 下無法執行,e1000e 驅動程序報告:“NVM 校驗和無效”
我的ASUSPRO B8430UA 筆記型電腦有問題:當我使用 Ubuntu 16.04(或 NixOS 16.03)啟動它時,乙太網埠不工作。使用的驅動程序是e1000e,它報告:
$ dmesg | grep e1000e [ 5.643760] e1000e: Intel(R) PRO/1000 Network Driver - 3.2.6-k [ 5.643761] e1000e: Copyright(c) 1999 - 2015 Intel Corporation. [ 5.644308] e1000e 0000:00:1f.6: Interrupt Throttling Rate (ints/sec) set to dynamic conservative mode [ 5.877838] e1000e 0000:00:1f.6: The NVM Checksum Is Not Valid [ 5.907340] e1000e: probe of 0000:00:1f.6 failed with error -5
在 Windows 7 下乙太網埠工作正常:我可以連接到 Internet。根據 Windows,我有Intel(R) Ethernet Connection I219-V。
我搜尋了“官方” Linux 驅動程序,但沒有一個被列為支持 I219-V。但是,e1000e 被列為支持 I218-V,並且我從e1000-devel郵件列表中得到確認 e1000e 應該支持 I219-V。以防萬一我嘗試使用 e1000e 的最新版本 3.3.4,但錯誤是相同的:“NVM 校驗和無效。”
看起來確實存在 I219-V 的非易失性儲存器的校驗和不匹配。
我試過另一台相同型號的華碩筆記型電腦,錯誤是一樣的,所以這看起來不像是意外損壞。
華碩和英特爾客戶支持都無法提出任何解決方案。
我發現了Intel Ethernet Connections Boot Utility,但根據文件(對於版本 1.6.13.0),它僅適用於 PCI,而不是 OEM 板載乙太網卡。但是,我決定不帶參數執行它,只是為了列印英特爾網路埠列表,這就是我得到的:
$ sudo ./bootutil64e Intel(R) Ethernet Flash Firmware Utility BootUtil version 1.6.13.0 Copyright (C) 2003-2016 Intel Corporation Type BootUtil -? for help Port Network Address Location Series WOL Flash Firmware Version ==== =============== ======== ======= === ============================= ======= 1 D017C2201F59 0:31.6 Gigabit N/A FLASH Not Present
我不太明白這裡的“FLASH Not Present”是什麼意思。
我在 SuperUser.SE 上提出了一個關於修復 NVM 校驗和的問題。在這裡,我想問是否以及如何成功地在 ASUSPRO B8430UA 筆記型電腦或任何其他帶有英特爾乙太網控制器的筆記型電腦上成功安裝 Linux 和工作乙太網,這些筆記型電腦出現“NVM 校驗和無效”錯誤。
我設法修復了校驗和。現在乙太網在 Linux 下工作正常。我在對 SuperUser.SE 問題的回答中解釋了詳細資訊。
基本上,我首先修補
e1000e
以跳過 NVM 校驗和驗證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; } }
在 中
src/netdev.c
,並且在我訪問了乙太網晶片後,我用 寫入了它的 NVMethtool
,它會自動修復校驗和。
該
e1000e
驅動程序是可以執行I2xx
英特爾乙太網控制器的驅動程序。最新的e1000e 驅動程序(在撰寫本文時)能夠執行該I219
晶片。引導期間的
The NVM Checksum Is Not Valid
消息是阻止載入舊驅動程序的原因。在其他作業系統(特別是 MS windows)上,該錯誤被忽略。但 Linux 似乎更嚴格。NVM 是晶片中的 ROM(只讀儲存器),它經過校驗和,舊版本的
e1000
驅動程序不知道新晶片的 NVM 內容。由於該卡在忽略錯誤的其他作業系統上工作,另一種可能性可能是強制驅動程序忽略錯誤。校驗和在內部執行
nvm.c
,儘管其他幾個模型展示了它們自己fix_checksum
之前執行的函式e1000e_validate_nvm_checksum_generic
。s32 e1000e_validate_nvm_checksum_generic(struct e1000_hw *hw) { s32 ret_val; u16 checksum = 0; u16 i, nvm_data; for (i = 0; i < (NVM_CHECKSUM_REG + 1); i++) { ret_val = e1000_read_nvm(hw, i, 1, &nvm_data); if (ret_val) { e_dbg("NVM Read Error\n"); return ret_val; } checksum += nvm_data; } if (checksum != (u16)NVM_SUM) { e_dbg("NVM Checksum Invalid\n"); return -E1000_ERR_NVM; } return 0; }
NVM_SUM
在裡面定義define.h
#define NVM_SUM 0xBABA
如果您確信該卡可以執行(並且僅由於 NVM 校驗和而失敗),您可以嘗試將校驗和函式編輯為:
s32 e1000e_validate_nvm_checksum_generic(struct e1000_hw *hw) { return 0; }
它將強制校驗和始終成功。
額外(或多或少)值得信賴的參考資料: