如何修复华硕笔记本电脑的英特尔以太网控制器 I219-V 的非易失性存储器 (NVM) 的校验和?

如何修复华硕笔记本电脑的英特尔以太网控制器 I219-V 的非易失性存储器 (NVM) 的校验和?

我对新华硕PRO B8430UA笔记本电脑:它的英特尔以太网连接 I219-V在 Linux 下无法工作。事实上,我试过两台这种型号的笔记本电脑,都遇到了同样的问题。

使用的 Linux 驱动程序是e1000e,它在 Linux(Ubuntu 16.04)启动期间会产生以下消息:

$ 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 

我尝试安装最新版本 3.3.4e1000e,但是这并没有帮助(虽然我已经污染了内核)。

我已在e1000-开发邮件列表,并建议我联系我的笔记本电脑制造商,因为“NVM 校验和无效”意味着我的以太网芯片的非易失性存储器的内容已损坏,或者至少与校验和不匹配(不幸的是,我不是专家,无法更准确地解释这一点)。

我已向英特尔客户支持提出了这个问题,他们回复说他们不负责 OEM 系统(笔记本电脑中的板载以太网芯片),我应该联系华硕:

不幸的是,由于您的系统是 OEM,因此我们的支持选项非常有限。笔记本电脑制造商可能已经更改了软件或硬件,因此此类系统的支持和驱动程序由笔记本电脑制造商直接提供。

我联系了华硕的客户支持,但他们回复说他们没有用于检查或修复 NVM 内容的工具,如果我找到这样的工具,他们会很高兴知道。他们还解释说,他们只支持原始硬件和软件配置,而这款笔记本电脑型号是随 Windows 7 出售的。在 Windows 7 下,我的以太网似乎工作正常。据我所知,Windows 根本不检查 NVM 校验和。

我发现在 2011 年的一个类似案例中,这个问题可以使用以下方法修复英特尔以太网连接启动实用程序

https://thesorcerer.wordpress.com/2011/07/01/guide-intel-82573l-gigabit-ethernet-with-ubuntu-11-04-and-fix-pxe-e05/

然而,最后一段的免责声明警告:

您可能需要知道,英特尔 (R) 以太网连接启动实用程序并非设计用于板载(也称为 OEM)局域网卡(适用于 PCI 卡),因此无法确定它与其他板载组件(如 USB 或声音控制器)的交互。

描述BootUtil 版本 1.6.13.0 似乎还表明它并不完全适用于板载以太网控制器:

英特尔(R) 以太网闪存固件实用程序 (BootUtil) 是一种实用程序,可用于对受支持的英特尔 PCI 和基于 PCI-Express 的网络适配器的闪存上的 PCI 选项 ROM 进行编程,并更新配置。

[...]

OEM 可能会为 OEM 网络适配器提供自定义闪存固件映像。请参考 OEM 提供的说明。

不过有一段我没看懂:

所有 OEM 通用适配器都支持 PXE+EFI 和 iSCSI+EFI 映像组合,但是支持仅限于支持两种技术作为独立映像的设备。

此外,在评论 52008 年的一个问题NVM 已损坏因为 e1000e 驱动程序漏洞,建议:

请不要运行 ibautil,因为网上有些网站建议尝试修复此问题。这可能会导致您必须更换主板才能恢复 LAN 功能。

IBAUTIL 是 BootUtil 的前身之一。

无论如何,我决定在 Linux 下运行 BootUtil(不使用命令行选项)来获取“系统中所有受支持的英特尔网络端口列表”。这是我得到的结果:

$ 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”是什么意思,以及我有哪些选项可以修复校验和。


更新 1。 根据我收到的一条评论e1000-开发关于“FLASH Not Present”的邮件列表,

闪存和 NVM 是两个独立的项目。闪存支持 PXE 启动和 iSCSI 等功能,而 NVM 存储网络地址等内容。


更新 2。 我发现英特尔的数据表对于 I219,第 10.3.2.2 节校验字计算说:

校验和字(字 0x3F、NVM 字节 0x7E 和 0x7F)用于确保基础 NVM 映像是有效映像。应计算此字的值,使得在添加所有字(0x00-0x3F)/字节(0x00-0x7F)(包括校验和字本身)后,总和应为 0xBABA。16 位求和寄存器中的初始值应为 0x0000,每次添加后应忽略进位。

答案1

在尝试我的解决方案之前,请考虑尝试唯一的那个经过悖论第一的。


在以下机构的热情帮助下e1000-开发邮件列表,下面是我修复 NVM 的方法校验和字使用ethtool

总结: 基本上,我首先修补了 e1000e,使其能够访问 Linux 中的以太网芯片,然后ethtool从我的 I219-V 的 NVM 的“校验和”区域读取一个值,然后将其写回。写入操作修复了校验和。

为了从 Linux 访问我的以太网芯片,我必须修补e1000e跳过 NVM 校验和验证。在文件中src/netdev.c,我更改了第一行

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

进入

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

(也可以删除或注释掉整个块。)

然后我安装了修补后的模块。从/src目录中我执行了:

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

现在校验和验证已被跳过并且以太网开始工作。

在修复校验字之前,我查看了英特尔第 10 节中介绍的 I219 的 NVM 概要数据表校验和字的使用说明见10.3.2.2节。

在写入 NVM 之前,我记下了校验和字:

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

enp0s31f6是我的以太网接口的名称。)因此错误的校验和字值为0x1360

我查看了 NVM 的转储sudo ethtool -e enp0s31f6,然后再次查看了偏移量 0x10 处的字节:

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

(显然任何位置都可以,但有人告诉我,在我的情况下,偏移量 0x10 处的值根本没有被使用,因此它看起来“更安全”。)

为了使用 写入 NVM (EEPROM) ethtool,我需要一个“魔法钥匙”。我读到解除 Intel Pro/1000 (e1000) 网络接口的阻塞并发现我的魔法钥匙正在0x15708086使用lspci -nn

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

然后我将其写0xff回到NVM中的偏移量0x10:

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

比较写入前后的 NVM 转储后,我发现,正如预期的那样,唯一改变的是校验和字:

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

因此,新的值为0x9360

我启动了一个未打补丁的内核e1000e,并且以太网端口工作正常。

PS:我发现有点担心,因为校验和字中只有最高位是错误的。

答案2

我使用bootutil英特尔的 Linux(如 2011 年帖子中建议的那样)在我的华硕 Z270-A 的集成英特尔网卡上修复了这个错误,而没有使用被点赞的答案中讨论的重新编译和魔法键。效果很好。我从英特尔下载网站

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

答案3

e1000e我在 Fedora 24 上从带有 Intel I219-V NIC 适配器的 ASUS ROG MAXIMUS IX HERO 主板的驱动程序获得了同样的错误。

我发现公认的解决方案(需要修补 NVM)风险太大。它可能会导致您的硬件无法使用。

一个安全的解决方案是使用英特尔以太网连接启动实用程序。它在 Linux 中开箱即用,无需创建启动盘:

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

就是这样。只需重新启动(或e1000e手动重新加载驱动程序)。

答案4

我的解决方案更简单:

- 进入 UEFI BIOS 实用程序;
- 输入高级模式
- 导航高级\网络堆栈配置然后简单地启用网络堆栈(我只启用了 IPv4 以安全地保留在我的 NAT 后面)。

重新启动并享受您的 NIC。显然这足以以某种方式清除错误的 NVM 校验和。然后您可以返回并禁用所述堆栈。
这是华硕 Prime z270-a 主板上的 BIOS 版本 8001(Arch Linux 上的 e1000e 驱动程序,内核 4.9.11-1)。

导致此问题的原因可能是我尝试通过 EZ Flash 实用程序直接通过互联网更新固件(DHCP 和静态 IP 模式均失败)。我记得实用程序询问是否可以启用网络堆栈(默认情况下处于关闭状态)以尝试更新。

相关内容