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

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

我有一个问题华硕 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 下以太网端口工作正常:我可以连接到互联网。根据Windows,我有英特尔(R) 以太网连接 I219-V

我搜索过“官方”Linux驱动程序,但没有被列为支持 I219-V。但是,e1000e 被列为支持 I218-V,并且我已得到来自e1000-开发邮件列表表明 e1000e 应支持 I219-V。以防万一,我尝试使用 e1000e 的最新版本 3.3.4,但错误是相同的:“NVM 校验和无效。”

看来I219-V的非易失性存储器的校验和确实不匹配。

我尝试过另一台同型号的华硕笔记本电脑,错误是相同的,所以这看起来不像是意外损坏。

华硕和英特尔客户支持都无法提出任何解决方案。

我发现了英特尔以太网连接启动实用程序,但根据文档(对于版本 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”在这里是什么意思。

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

答案1

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

并且它将强制校验和始终成功。


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

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

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

答案3

这是Ubuntu 18.04.1 LTS-支持Intel I219-V的详细指南

  1. 从以下位置下载驱动程序
    https://downloadcenter.intel.com/download/15817/Intel-Network-Adapter-Driver-for-PCI-E-Gigabit-Network-Connections-under-Linux-?product=71307 (3.4.0.2版本测试)

  2. 将 zip 解压到您选择的文件夹

  3. 更改到驱动程序 src 目录,
    例如 cd e1000e-3.4.2.1/src/

  4. 确保在加载新模块之前从内核中删除所有旧版 e1000e 驱动程序 sudo rmmod e1000e

  5. 编译驱动模块: sudo make install

  6. 使用 modprobe 命令加载模块: sudo modprobe e1000e 二进制文件将安装为:/lib/modules//updates/drivers/net/ethernet/intel/e1000e/e1000e.ko

  7. 验证接口是否正常工作。输入以下内容,其中 IP_address 是与正在测试的接口位于同一子网上的另一台计算机的 IP 地址: ping

  8. 让司机坚持不懈 sudo dpkg-reconfigure linux-image-$(uname -r)

我认为这就是 pkt 8 所做的::.... 注意:对于某些发行版,例如(但不限于)RedHat Enterprise Linux 7 和 Ubuntu,安装驱动程序后,可能需要更新 initrd/initramfs 文件以防止操作系统加载旧版本的 e1000e 驱动程序。对于 Ubuntu:# update-initramfs -u

相关内容