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

Ale*_*xey 7 linux ethernet drivers oem asus-laptop

我在使用新的ASUSPRO 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 
Run Code Online (Sandbox Code Playgroud)

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

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

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

不幸的是,由于您的系统是 OEM,我们的支持选项极其有限。膝上型电脑制造商可能已经更改了软件或硬件,这就是膝上型电脑制造商直接提供此类系统的支持和驱动程序的原因。

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

我发现在 2011 年的一个类似案例中,可以使用Intel Ethernet Connections Boot Utility解决该问题:

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

但是,最后一段中的免责声明警告说:

您可能需要知道 Intel(R) Ethernet Connections Boot Utility 并非设计为与板载(也称为 OEM)LAN 卡(用于 PCI 卡)一起使用,因此没有确定的方法来预测它与其他板载组件,如 USB 或 SOUND 控制器。

BootUtil 版本 1.6.13.0的描述似乎还说它并不完全适合与板载以太网控制器一起使用:

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

[...]

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

但是有一段我没看懂:

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

此外,在关于 2008 年NVM由于 e1000e 驱动程序错误而损坏的问题的评论 5 中,建议:

请不要运行 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
Run Code Online (Sandbox Code Playgroud)

我想了解在这种情况下“FLASH Not Present”是什么意思,以及我有哪些修复校验和的选项。


更新 1. 根据我从e1000-devel邮件列表收到的关于“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,每次加法后应忽略进位位。

Ale*_*xey 11

想我的解决方案之前,请考虑尝试了一个ppparadox第一。


从热心帮助E1000-devel的邮件列表,这里就是我的固定NVM校验字使用ethtool

tl; dr: 基本上,我首先修补 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

进入

for (i = 0; false; i++) {
Run Code Online (Sandbox Code Playgroud)

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

然后我安装了补丁模块。从/src我做的目录:

sudo make install
sudo modprobe -r e1000e
sudo modprobe e1000e
sudo update-initramfs -u
reboot
Run Code Online (Sandbox Code Playgroud)

现在跳过校验和验证,以太网开始工作。

在修复 Checksum 字之前,我查看了 Intel数据表第 10 节中介绍的 I219 的 NVM 的概要。校验和字的使用在第 10.3.2.2 节中解释。

在写入 NVM 之前,我记下了 Checksum 字样:

$ sudo ethtool -e enp0s31f6 offset 0x7e length 2
Offset      Values
------      ------
0x007e:     60 13 
Run Code Online (Sandbox Code Playgroud)

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

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

$ sudo ethtool -e enp0s31f6 offset 0x10 length 1
Offset      Values
------      ------
0x0010:     ff 
Run Code Online (Sandbox Code Playgroud)

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

为了使用 写入 NVM (EEPROM) ethtool,我需要一个“魔法钥匙”。我阅读了Unbricking an 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)
Run Code Online (Sandbox Code Playgroud)

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

$ sudo ethtool -E enp0s31f6 magic 0x15708086 offset 0x10 value 0xff
Run Code Online (Sandbox Code Playgroud)

在比较写入前后 NVM 的转储后,我可以看到,正如预期的那样,唯一改变的是 Checksum 字:

$ sudo ethtool -e enp0s31f6 offset 0x7e length 2
Offset      Values
------      ------
0x007e:     60 93 
Run Code Online (Sandbox Code Playgroud)

因此,新值是0x9360

我用未打补丁的e1000e启动内核,以太网端口工作正常。

PS 我有点担心只有校验和字中的最高位是错误的。

  • 我可以确认此修复适用于 [e1000e 版本 3.5.3.3](https://sourceforge.net/projects/e1000/files/e1000e%20stable/3.3.5.3/) 在台式机主板 Asus Maximus IX Hero 上,在 Ubuntu 16.04 .1 (2认同)

小智 6

bootutil在华硕 Z270-A 上的集成英特尔 NIC 上使用了来自英特尔的 Linux(如 2011 年的帖子中所建议)来修复此错误,而没有在赞成的答案中讨论的重新编译和魔术键。它工作得很好。我从英特尔下载站点下载了该工具

chmod +x ./bootutil64e
sudo ./bootutil64e -NIC 1 -defcfg
Run Code Online (Sandbox Code Playgroud)