英特尔以太网连接 I219-V 在 ASUSPRO B 笔记本电脑上的 Linux 下无法运行,e1000e 驱动程序报告:“NVM 校验和无效”

Ale*_*xey 7 hardware ethernet asus intel network-interface

我的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
Run Code Online (Sandbox Code Playgroud)

在 Windows 7 以太网端口下工作正常:我可以连接到 Internet。根据 Windows,我有Intel(R) 以太网连接 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
Run Code Online (Sandbox Code Playgroud)

我不太明白这里的“FLASH Not Present”是什么意思。

我提出了一个问题上SuperUser.SE关于固定NVM校验。在这里,我询问是否以及如何有人设法在 ASUSPRO B8430UA 笔记本电脑或任何其他带有英特尔以太网控制器的笔记本电脑上成功安装带有工作以太网的 Linux,这些笔记本电脑出现“NVM 校验和无效”错误。

gro*_*mal 6

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;
}
Run Code Online (Sandbox Code Playgroud)

NVM_SUM 在里面定义 define.h

#define NVM_SUM                         0xBABA
Run Code Online (Sandbox Code Playgroud)

如果您确信该卡可以运行(并且仅因 NVM 校验和而失败),您可以尝试将校验和函数编辑为:

s32 e1000e_validate_nvm_checksum_generic(struct e1000_hw *hw)
{
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

它会强制校验和始终成功。


额外(或多或少)值得信赖的参考:


Ale*_*xey 2

我设法修复了校验和。现在以太网在 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在 中src/netdev.c,在我访问以太网芯片后,我用 写入其 NVM ethtool,它会自动修复校验和。