Getting Intel i219-V to work in Debian 12

It works on my system, except that I am using Arch Linux.
Code:
00:1f.6 Ethernet controller: Intel Corporation Ethernet Connection (7) I219-V (rev 10)

[   23.928538] e1000e: Intel(R) PRO/1000 Network Driver
[   23.928540] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
[   23.928565] e1000e 0000:00:1f.6: enabling device (0000 -> 0002)
[   23.928754] e1000e 0000:00:1f.6: Interrupt Throttling Rate (ints/sec) set to dynamic conservative mode
[   24.137344] e1000e 0000:00:1f.6 0000:00:1f.6 (uninitialized): registered PHC clock
[   24.206072] e1000e 0000:00:1f.6 eth0: (PCI Express:2.5GT/s:Width x1) 00:d8:61:9f:f1:ad
[   24.206074] e1000e 0000:00:1f.6 eth0: Intel(R) PRO/1000 Network Connection
[   24.206179] e1000e 0000:00:1f.6 eth0: MAC: 13, PHY: 12, PBA No: FFFFFF-0FF
[   24.266281] e1000e 0000:00:1f.6 eno2: renamed from eth0
[   28.609875] e1000e 0000:00:1f.6 eno2: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
However its not recognized by system:
If it's not recognized by your system than the firmware is probably for it is probably not available on the system. So we just need to figure out what firmware blob is needed for the network card, then it will probably show up and be able to use and load the kernel driver for it.
 


Enable "non-free-firmware" in your sources, then update your source. Then install the package firmware-misc-nonfree, then reboot and check if your intel network card is recognized. If you don't have an internet connection you can just download the deb package form packages.debian.org since it doesn't have any dependencies.
 
Last edited:
I also came across this reply in another topic about the same intel network card.
i dont know why the hell this happened, i re enabled secure boot in bios and the ethernet just works, i have always disabled secure boot in linux with every pc i have had to avoid problems and now is the opposite

Code:
Network:
  Device-1: Intel Ethernet I219-V driver: e1000e
  IF: eno1 state: up speed: 1000 Mbps duplex: full mac: (my mac)
 
I also came across this reply in another topic about the same intel network card.

Thank you for trying to help! I tried the secure boot suggesion.
I have non-free-firmware enabled and firmware-misc-nonfree is already the newest version (20230210-5).
I think its debian specific binary related, but I am not sure.

Unrelated:
Just for posterity. I mentioned earlier in the thread that 'nothing is quite right with this system'. This was traced down to a bad ram module from G.Skill, which they promptly replaced and now system is perfect. Plus the CMOS battery was also dead, which was also replaced. EVGA Z590 is a good motherboard, I just wish I didn't have to drain my loop to replace CMOS battery (its under the GPU base).
 
Last edited:
Just and update, I've gotten a second GPU with intent to use it for passthrough into Windows VMs.
My standalone NIC is in the way of the card. So I gave this issue another try.

Basically the only way it will work is to compile a custom e1000e module yourself. Or use a custom kernel compilation. The reason it doesn't work (and is not loaded by kernel) is because it fails to pass NVM checksum. Windows ignores the problem, and just loads the driver anyway. Linux does not. So you can't do anything with the device even using intels native tools like bootutil64e. Kernel blocks the device.

Setting options e1000e eeprom_bad_csum_allow=1 to /etc/modprobe.d/e1000e.conf does not seem to work either. No errors reloading the module, it just doesn't do anything and checksum error is still there.

I tried compiling various sources for driver and am getting compilation errors (looks like kernel header/api mismatch) that I am just not going to waste any more of my time on.

If you're reading this sometime in the future: DO NOT BUY MOTHERBOARDS WITH ONBOARD INTEL NICs IF YOU WANT A SMOOTH LINUX EXPERIENCE.

This is clearly a hardware firmware problem, and intel has washed its hands of this chipset (among many others) and delegated it to community support. Which is why its such a pain in the ass to make this thing work.

My next solution before I can install the secondary GPU is to use a 4x pcie riser cable and move my standalone NIC (not intel) to a different slot. Hopefull the card will fit with a riser cable under it.

Things I've tried:
  • Enabling/Disabling Secure Boot
  • Enabling disabling onboard NIC between reboots
  • Setting boot device to Boot from LAN (one of suggestions that worked for someone)
  • Reloading e1000e driver.
  • Trying to use intels tools for updating/resetting the NIC from both Linux and Windows. Its cannot write to the chipset flash memory no matter what I try.
  • Trying to compile the driver from source. Errors and API mismatches. Sources seem to be ancient and do not match Debian 12 kernel.
  • Disabling checksum check using modprobe.d custom config.
What an absolute rock in my shoe. Thanks intel.
 
Last edited:
I couldn't live with this wart of a NIC, which led me to figure out a fix. Here is a detailed how in case anyone else wants to do it themselves.

You don't need to hunt down and download some source code somewhere, if you run debian (or other compatible/similar distro) you can just use kernel source that comes with it, then edit the source and re-compile the one module you need.

A lot of these i219-V devices (which intel sells for ~$2 per chip) are in motherboards sold to this day, and they were somehow shipped with corrupted firmware that doesn't validate itself. Windows just ignores the NVM checksum failure so it works on windows. Linux module code errors out the device if NVM checksum doesn't pass.

Luckily the only thing you need to do is comment out a block of driver code that errors out the device. Then recompile the module, overwrite your existing module and your less than perfect Intel NIC will work without a reboot.

Here is a how-to.

Prepare for kernel compilation (we will only compile a module). I am on Debian Testing (trixie), but this should work on pretty much any debian.

Code:
sudo apt update
sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev bc

get the source

Code:
sudo apt install linux-source

unzip it.
you may have sudo this command, and chmod the unzipped folder after so you don't have to run build tools with sudo

Code:
tar -xvf /usr/src/linux-source-<version>.tar.xz -C ~/Documents/Dev/kernel/

Code:
cd ~/Documents/Dev/kernel/linux-source-<version>/

now go to the drivers/net/ethernet/intel/e1000e/netdev.c and comment out or delete this code (~ line 7561):

C:
    /* systems with ASPM and others may see the checksum fail on the first
     * attempt. Let's give it a few tries
     */
    for (i = 0;; i++) {
        if (e1000_validate_nvm_checksum(&adapter->hw) >= 0)
            break;
        if (i == 2) {
            dev_err(&pdev->dev, "The NVM Checksum Is Not Valid\n");
            err = -EIO;
            goto err_eeprom;
        }
    }

Save the file.
Make sure you're back to ~/Documents/Dev/kernel/linux-source-<version>/(or wherever you unzipped the kernel source)
Copy your current config over.

Code:
cp /boot/config-$(uname -r) .config

Code:
make oldconfig

Press enter for all the defaults.

Code:
make prepare

Code:
make modules_prepare

Now copy /usr/src/linux-headers-<version>/Module.symvers to your ~/Documents/Dev/kernel/linux-source-<version>/
You can also do this automatically if you run make modules, but that takes a very long time.

You should be in the root directory of your kernel source ie ~/Documents/Dev/kernel/linux-source-<version>/
Now build the module.

Code:
make M=drivers/net/ethernet/intel/e1000e

Install it
Code:
sudo cp drivers/net/ethernet/intel/e1000e/e1000e.ko /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/intel/e1000e/

load the patched module
Code:
sudo depmod
sudo modprobe -r e1000e
sudo modprobe e1000e

Your i219-v NIC should immediately activate and connect, provided its plugged in. Suck it intel.

If its working, add module to boot and update your ramfs (where copies of modules are kept, so it still has old module)

Code:
echo "e1000e" | sudo tee /etc/modules-load.d/e1000e.conf
sudo update-initramfs -u
 
Last edited:
Got tired of doing this by hand every time Debian testing updates a kernel, so here is automated script.
Change the variables at the top to your spec.

Code:
kernel_version="6.5"
kernel_minor_version="0-5"
headers_version="$kernel_version.$kernel_minor_version"
source_copy_location=~/Documents/Dev/kernel
target_src_dir=$source_copy_location/linux-source-${kernel_version}
sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev bc
sudo apt install linux-source
if [ ! -d $target_src_dir ]; then
    tar -xvf "/usr/src/linux-source-${kernel_version}.tar.xz" -C $source_copy_location/
    chmod 777 $target_src_dir
else
    echo "Directory $target_src_dir already exists, skipping tar extraction."
fi
cd $target_src_dir
cp /boot/config-$(uname -r) .config
make oldconfig
make prepare
make modules_prepare
cp /usr/src/linux-headers-$headers_version-amd64/Module.symvers .
sudo cp drivers/net/ethernet/intel/e1000e/e1000e.ko /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/intel/e1000e/
sudo depmod
sudo modprobe -r e1000e
sudo modprobe e1000e
 
00:1f.6 Ethernet controller: Intel Corporation Ethernet Connection (7) I219-V (rev 10)

This is a pretty standard controller. I have 3 computers that use it.
I believe this has been in the Linux Kernel since around 3.8.x.

~# lspci | grep -i Ethernet

00:1f.6 Ethernet controller: Intel Corporation Ethernet Connection (7) I219-V (rev 10)
02:00.0 Ethernet controller: Intel Corporation I211 Gigabit Network Connection (rev 03)

~# ethtool -i eno1
driver: e1000e
version: 6.6.8-200.fc39.x86_64
firmware-version: 0.5-4
expansion-rom-version:
bus-info: 0000:00:1f.6
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: yes

( Make sure this matches the bus location from the previous command )

~# lsmod | grep e1000e
e1000e 368640 0

~# nmcli dev show eno1
GENERAL.DEVICE: eno1
GENERAL.TYPE: ethernet
GENERAL.HWADDR: 70:85:C2:D5:88:C7
GENERAL.MTU: 1500
GENERAL.STATE: 20 (unavailable)
GENERAL.CONNECTION: --
GENERAL.CON-PATH: --
WIRED-PROPERTIES.CARRIER: off
IP4.GATEWAY: --
IP6.GATEWAY: --

If for some reason, you don't have this driver in your kernel, you can download it.
I never have any trouble with it.

 
Last edited:
00:1f.6 Ethernet controller: Intel Corporation Ethernet Connection (7) I219-V (rev 10)

This is a pretty standard controller. I have 3 computers that use it.
I believe this has been in the Linux Kernel since around 3.8.x.

~# lspci | grep -i Ethernet

00:1f.6 Ethernet controller: Intel Corporation Ethernet Connection (7) I219-V (rev 10)
02:00.0 Ethernet controller: Intel Corporation I211 Gigabit Network Connection (rev 03)

~# ethtool -i eno1
driver: e1000e
version: 6.6.8-200.fc39.x86_64
firmware-version: 0.5-4
expansion-rom-version:
bus-info: 0000:00:1f.6
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: yes

( Make sure this matches the bus location from the previous command )

~# lsmod | grep e1000e
e1000e 368640 0

~# nmcli dev show eno1
GENERAL.DEVICE: eno1
GENERAL.TYPE: ethernet
GENERAL.HWADDR: 70:85:C2:D5:88:C7
GENERAL.MTU: 1500
GENERAL.STATE: 20 (unavailable)
GENERAL.CONNECTION: --
GENERAL.CON-PATH: --
WIRED-PROPERTIES.CARRIER: off
IP4.GATEWAY: --
IP6.GATEWAY: --

If for some reason, you don't have this driver in your kernel, you can download it.
I never have any trouble with it.


Yes, you're just lucky your checksum is not corrupted like so many of us have. Its not an absence of driver problem, the problem is that a lot of this hardware was shipped with mismatching firmware checksum value, and the fix discussed above involves commenting out the part of the driver that checks for it.
 
Got tired of doing this by hand every time Debian testing updates a kernel, so here is automated script.
Change the variables at the top to your spec.

Code:
kernel_version="6.5"
kernel_minor_version="0-5"
headers_version="$kernel_version.$kernel_minor_version"
source_copy_location=~/Documents/Dev/kernel
target_src_dir=$source_copy_location/linux-source-${kernel_version}
sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev bc
sudo apt install linux-source
if [ ! -d $target_src_dir ]; then
    tar -xvf "/usr/src/linux-source-${kernel_version}.tar.xz" -C $source_copy_location/
    chmod 777 $target_src_dir
else
    echo "Directory $target_src_dir already exists, skipping tar extraction."
fi
cd $target_src_dir
cp /boot/config-$(uname -r) .config
make oldconfig
make prepare
make modules_prepare
cp /usr/src/linux-headers-$headers_version-amd64/Module.symvers .
sudo cp drivers/net/ethernet/intel/e1000e/e1000e.ko /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/intel/e1000e/
sudo depmod
sudo modprobe -r e1000e
sudo modprobe e1000e
Many thanks for this posting and also your October 24 posting. I apparently also had one of the non-working i219-V chips on an MSI Pro H610M-G DDR4 I bought from Newegg in July 2023. Your fix worked great.

There is a minor typo in your earlier October 24 posting. About 3/4 of the way down there is a reference to /usr/src/linux-source-<version>.tar.xz that should be /usr/src/linux-source-<version>-amd64.tar.xz. It is corrected in the script of this December 29 posting. It won't cause anyone following along with what is going on any problems, but might cause difficulties for anyone following blindly.

Unfortunately this fix is of no value until you get Linux somehow installed. I did that by buying a $10 USB to Ethernet adapter. It is an interesting issue as to whether the code distributed by default with distributions should incorporate a fix like this. The high-road answer is "no". But it sure caused me a lot of grief. Ideally Intel would have fixed their chip and quit selling the non-working.
 

Members online


Latest posts

Top