Intel Ethernet Connection I219-V not working under Linux on an ASUSPRO B laptop, e1000e driver reports: “The NVM Checksum Is Not Valid”

I have a problem with an ASUSPRO B8430UA laptop: when I boot it with Ubuntu 16.04 (or NixOS 16.03) the Ethernet port does not work. The driver used is e1000e, it reports:

$ 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

Under Windows 7 Ethernet port works fine: I can connect to the Internet.
According to Windows, I have Intel(R) Ethernet Connection I219-V.

I have searched for “official” Linux drivers, but none is listed as supporting I219-V. However, e1000e is listed as supporting I218-V, and I’ve got a confirmation from e1000-devel mailing list that e1000e should support I219-V. Just in case I tried using the latest version 3.3.4 of e1000e, but the error was the same: “The NVM Checksum Is Not Valid.”

It looks like indeed there is a mismatch of the checksum of the non-volatile memory of I219-V.

I have tried another ASUS laptop of the same model, and the error was the same, so this does not look like an accidental corruption.

Neither ASUS nor Intel customer support could suggest any solution.

I have discovered Intel Ethernet Connections Boot Utility, but according to the documentation (for version 1.6.13.0) it is only intended for PCI, not OEM on-board, Ethernet cards. However, I decided to run it without parameters just to print the list of Intel network ports, and this is what I’ve got:

$ 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

I do not quite understand what “FLASH Not Present” means here.

I posed a question on SuperUser.SE about fixing the NVM checksum.
Here I am asking if and how anyone managed to successfully install Linux with working Ethernet on an ASUSPRO B8430UA laptop or on any other laptops with Intel Ethernet Controllers which had “The NVM Checksum Is Not Valid” error.

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

The e1000e driver is the one that can run the I2xx intel Ethernet Controllers. And the latest e1000e driver (as of this writing) is capable of running the I219 chip.

The The NVM Checksum Is Not Valid message during boot is what was preventing the older drivers from being loaded. On other OSes (notably MS windows) that error is ignored. But Linux appears to be stricter.

NVM is a ROM (read only memory) in the chip, which undergoes a checksum, and the older version of the e1000 driver was not aware of the NVM contents of the newer chips. Since the card works on other OSes that ignore the error another possibility could have been to force the driver to ignore the error.

The checksum is performed inside nvm.c, although other several models present their own fix_checksum functions that run before 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 Errorn");
                        return ret_val;
                }
                checksum += nvm_data;
        }

        if (checksum != (u16)NVM_SUM) {
                e_dbg("NVM Checksum Invalidn");
                return -E1000_ERR_NVM;
        }

        return 0;
}

NVM_SUM is defined inside define.h

#define NVM_SUM                         0xBABA

If you are confident that the card runs (and only fails because of the NVM checksum) you can try to edit the checksum function to:

s32 e1000e_validate_nvm_checksum_generic(struct e1000_hw *hw)
{
        return 0;
}

And it will force the checksum to be always successful.


Extra (more-or-less) trustworthy references:

Method 2

I managed to fix the checksum. Now Ethernet works fine under Linux. I explained the details in my answer to my SuperUser.SE question.

Basically, I first patched e1000e to skip the NVM checksum validation

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 Validn");
        err = -EIO;
        goto err_eeprom;
    }
}

in src/netdev.c, and after I had access to the Ethernet chip, I wrote to its NVM with ethtool, which automatically fixed the checksum.

Method 3

Here’s a detailed guide
Ubuntu 18.04.1 LTS- support for Intel I219-V

  1. Download driver from
    https://downloadcenter.intel.com/download/15817/Intel-Network-Adapter-Driver-for-PCI-E-Gigabit-Network-Connections-under-Linux-?product=71307
    (Testet on version 3.4.0.2)
  2. Unpack zip to folder of your choice
  3. Change to the driver src directory,
    e.g. cd e1000e-3.4.2.1/src/
  4. Make sure that any older e1000e drivers are removed from the kernel before loading the new module
    sudo rmmod e1000e
  5. Compile the driver module:
    sudo make install
  6. Load the module using the modprobe command:
    sudo modprobe e1000e
    The binary will be installed as:
    /lib/modules//updates/drivers/net/ethernet/intel/e1000e/e1000e.ko
  7. Verify that the interface works. Enter the following, where IP_address
    is the IP address for another machine on the same subnet as the interface
    that is being tested:
    ping
  8. Make the driver persistent
    sudo dpkg-reconfigure linux-image-$(uname -r)

I think this is what pkt 8 does::….
Note: For certain distributions like (but not limited to) RedHat Enterprise
Linux 7 and Ubuntu, once the driver is installed the initrd/initramfs file may
need to be updated to prevent the OS loading old versions of the e1000e driver.
For Ubuntu:
# update-initramfs -u


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x