Wednesday, June 5, 2013

Fix Intel I350 igb driver "NVM Checksum Is Not Valid" error on Linux

On Ubuntu 12.04 LTS x86_64 (not 12.04.2), I got an error blocking the system from loading this specific ethernet driver, but there is actually no big issue and the network adapter is able to run properly in other system (SLES 11 SP1). The idea is to download the latest intel igb driver source and modify it, then rebuild and insert the new module.
  1. Download Intel igb driver source from
    https://downloadcenter.intel.com/Detail_Desc.aspx?DwnldID=13663
  2. Decompress the source
    tar zxvf igb-[VERSION].tar.gz
    cd igb-[VERSION]/src
    
  3. Delete the following entire piece of code in src/igb_main.c at line 2418 (as of igb-4.2.16) using your preferred text editor
    /* make sure the NVM is good */
    if (e1000_validate_nvm_checksum(hw) < 0) {
        dev_err(pci_dev_to_dev(pdev), "The NVM Checksum Is Not"
        " Valid\n");
        err = -EIO;
        goto err_eeprom;
    }
  4. Run the following commands inside src folder,
    sudo modprobe -r igb
    sudo make install
    sudo modprobe igb
    sudo update-initramfs -u
  5. "The last command updates the existing initramfs. initramfs is a gzipped cpio archive. At boot time, the kernel unpacks that archive into RAM disk, mounts and uses it as initial root file system"
    At this point, the error should be fixed and after a reboot the module should be loaded correctly
Note: (OPTIONAL) Once you have done the above mentioned steps, with the igb.ko inside your igb-[VERSION]/src directory. At some point (maybe later in another Ubuntu installation using live CD), you may need to manually install the kernel module without having to rebuild it again, then the following commands may help,
sudo -s
modprobe -r igb
rm /lib/modules/3.2.0-23-generic/kernel/drivers/net/ethernet/intel/igb/igb.ko
install -D -m 644 igb-[VERSION]/src/igb.ko /lib/modules/3.2.0-23-generic/kernel/drivers/net/igb/igb.ko
depmod -a
modprobe igb
update-initramfs -u