How I updated my Intel i226-v NVM firmware

Intel does NOT offer a standalone NVM update for any i226 nics. Instead, they expect you to obtain their firmware from your device OEM but this is often unavailable or grossly outdated.

The Work Around. BEWARE YOU RISK BRICKING YOUR NIC => MAKE A BACKUP !!!

  1. Download & Extract -- https://www.intel.com/content/www/us/en/download/15084/intel-ethernet-adapter-complete-driver-pack.html -- look inside for NVMUpdatePackage/I225/I225.tar.gz and extract -- look further into this I225 folder until you find nvmupdate64e (updater tool). Leave this tool where it is. Make a companion I226-V work folder and copy the nvmupdate64e + nvmudate.cfg from the I225 folder to the I226-V work folder.
  2. Open a terminal inside this new folder </> sudo ./nvmupdate64e -i -l inventory.txt </> -- Take note of what this text file says the ETrackID numeric value is for your i226 NIC. This is the firmware identifier you currently have installed.
  3. Visit BillyCurtis Community Repo for I226 firmware https://github.com/BillyCurtis/Intel-I226-V-NVM-Firmware/tree/main -- find your NIC and your current ETrackID. Find the latest 1mb or 2mb firmware version for your NIC, Take note of the ETrackID for the latest 1mb or 2mb firmware version for your NIC and download it.
  4. Drop this firmware update directly into the local I226-V work folder.
  5. Open any text editor and change the nvmupdate.cfg file -- example below
  6. Open a terminal in this same folder </> sudo ./nvmupdate64e -u -l -b -c nvmupdate.cfg </>

NOTE: If by some chance you also need to update any I225 NIC, do that first if you intend to overwrite the initial I226 nvmupdate.cfg file. You can also update other Intel NICs using the other update folders respectively. In every case, you can use the same command listed in step 6 above. This will begin the process of evaluating your NIC Non-Volatile Memory chip (NVM) for update (-u). It will verbosely log its progress (-l). Make a backup (-b). Using the config file (-c) nvmupdate.cfg. If you neglect the -l flag it will proceed silently. If you neglect the -b flag there will be no backup. You can also use the update tool to inventory all your NICs and output to a text file as suggested in step 2.

I226-V Config file Process. Use ETrackId numeric values for your NIC firmware. Don't guess

A. This is the output of my initial discovery command above in step 2, minus sensitive info
</> sudo ./nvmupdate64e -i -l inventorty.txt </>
[00:005:00:00]: Intel(R) Ethernet Controller I226-V
Vendor : 8086
Device : 125C
Subvendor : 8086
Subdevice : 0000
Revision : 4
LAN MAC : ### LAN MAC is hidden by me ###
Alt MAC : 000000000000
SAN MAC : 000000000000
ETrackId : 80000308
SerialNumber : ### SerialNumber is hidden by me ###
NVM Version : 2.23(2.17)
PBA : G23456-000
VPD status : Not set
VPD size : 0
NVM update : No config file entry
checksum : Valid

B. This README file section is where I verified the correct (1MB) firmware for my i226-V NIC
-- https://github.com/BillyCurtis/Intel-I226-V-NVM-Firmware/tree/main/README.md
I226-V

1MB File Name Ver EtrackID 2MB File Name Ver EtrackID
FXVL_125C_V_1MB_2.14.bin 2.14 80000290 FXVL_125C_V_2MB_2.14.bin 2.14 8000028D
FXVL_125C_V_1MB_2.17.bin 2.17 80000308 FXVL_125C_V_2MB_2.17.bin 2.17 80000303
FXVL_125C_V_1MB_2.23.bin 2.23 8000039D FXVL_125C_V_2MB_2.22.bin 2.22 80000371
FXVL_125C_V_1MB_2.27.bin 2.27 80000425 FXVL_125C_V_2MB_2.25.bin 2.25 800003AD
FXVL_125C_V_1MB_2.32.bin 2.32 80000425 FXVL_125C_V_2MB_2.27.bin 2.27 80000422
FXVL_125C_V_2MB_2.32.bin 2.32 80000422

you can see above my intial firmware is ETRackID 80000308 which tells me I need a 1MB size version of which the latest is version 2.32, ETrackID 80000425.

C. Just above where the README file is posted, I clicked on the I226-V > 2.32 downloads folder and downloaded FXVL_125C_V_1MB_2.32.bin raw file for my 1226-V NIC
-- https://github.com/BillyCurtis/Intel-I226-V-NVM-Firmware/tree/main/I226-V/2.32 -- and dropped it into my local I226-V work folder.

D. Having copied the initial i225 config file to my I226-V work folder, I overwrote it as follows

CURRENT FAMILY: 1.0.0
CONFIG VERSION: 1.20.0

; Upgrade all 4 onboard Intel i226-V controllers
BEGIN DEVICE
DEVICENAME: Intel(R) Ethernet Controller I226-V
VENDOR: 8086
DEVICE: 125C
SUBVENDOR: 8086
SUBDEVICE: 0000
NVM IMAGE: FXVL_125C_V_1MB_2.32.bin
EEPID: 80000425
REPLACES: 80000308
RESET TYPE: NONE
END DEVICE

E. Save and open a terminal </> sudo ./nvmupdate64e -u -l -b -c nvmupdate.cfg </>

D. I'm told I can restore the backups created by the -b flag by running the following.
</> sudo ./nvmupdate64e -r -l -c nvmupdate.cfg </>
However, I've had no need to use this command and therefore don't know it it'll work or if the config file needs more info or what.

I226-V Release Notes

Version Onboard I226-V
2.32 Fixes an issue in MDI lane swap handling that caused the P (positive) and N (negative) signal polarities to be swapped incorrectly.
2.27 General Note:
1. PHY FW: 4C08_88B6
2. EFI LAN driver in 2MB: 0.10.06

Bug Fix:
• HSD 13012034657: [Foxville][NVM] QV Tools External Loopback test fails with NVM version 2.25
2.25 General Note:
1. PHY FW: 4C08_08a6
2. EFI LAN driver in 2MB: 0.10.06

Bug Fix:
• HSD 13010560068: Link Flaps with Energy Efficient Ethernet Enabled
• HSD 13011274310: Unexpected Link
2.23 General Note:
1. PHY FW: 4C08_889D
2. EFI LAN driver in 2MB: 0.10.06

Bug Fix:
• HSD 13011253836: Device Not Enumerated during power cycle (restart, power-on, etc.)
2.22 1. Update PHY FW to 4C08_889D
2. EFI LAN driver: 0.10.06 (recommend to update to the latest version in Doc ID: 615203).

Bug Fix:
#1309832919: LAN Device not enumerated after WR cycle
#13010560068: Link flaps with Energy Efficient Ethernet
o Note: Energy Efficient Ethernet Setting is controlled by OS drivers for both Windows and Linux and the default setting is Disabled.
#16020921487: [AMT provisioned] Sporadically Autowake during S3/S4

RCR:
#1309242132: Prevent NVM update between I225 and I226
#1307470158: Enable RTD3 ULP wake from LAN_DISABLE_N negation
#18022583990: [AMT provisioned] Enable DHCP server (port 67) for PreBoot Network Boot Support
#1308723082: Dynamic D3Cold support for preventing D3Cold in S0 upon request from CSME
2.17 1. Update PHY FW to 4C07_888D
2.14 Production Release
1. PHY FW to 4C08_7877
2. Management FW: 1.54
3. Energy Efficient Ethernet is enabled by the driver (Windows & Linux)
2.13 Initial Release
1. PHY FW to 4C08_7877
2. Management FW: 1.53
3. Alternative MAC address section is permanently removed
4. Energy Efficient Ethernet is disabled by default

Thanks to the author. I also successfully upgraded the firmware of i226-v.

Before upgrading:

sudo ethtool -I enp2s0

driver: igc
version: 7.0.0-30-generic
firmware-version: 2025:8a6
expansion-rom-version: 
bus-info: 0000:02:00.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: yes

cat inventory.txt

Intel(R) Ethernet NVM Update Tool
NVMUpdate version 1.41.3.1
Copyright(C) 2013 - 2024 Intel Corporation.

./nvmupdate64e -i -l inventory.txt 

Config file will not be read.
Inventory
[00:001:00:00]: Intel(R) Ethernet Controller I226-V
        Alternate MAC address is not set.
        Flash inventory started.
        Shadow RAM inventory started.
        Shadow RAM inventory finished.
        Flash inventory finished.
        OROM inventory started.
        OROM inventory finished.
[00:002:00:00]: Intel(R) Ethernet Controller I226-V
        Alternate MAC address is not set.
        Flash inventory started.
        Shadow RAM inventory started.
        Shadow RAM inventory finished.
        Flash inventory finished.
        OROM inventory started.
        OROM inventory finished.
[00:001:00:00]: Intel(R) Ethernet Controller I226-V
        Vendor                 : 8086
        Device                 : 125C
        Subvendor              : 8086
        Subdevice              : 0000
        Revision               : 4
        LAN MAC                : BADBADBADBAA
        Alt MAC                : 000000000000
        SAN MAC                : 000000000000
        ETrackId               : 800003AD
        SerialNumber           : BADBADBADBAAAAAA
        NVM Version            : 2.37(2.25)
        PBA                    : G23456-000
        VPD status             : Not set
        VPD size               : 0
        NVM update             : No config file entry
          checksum             : Valid
        OROM update            : No config file entry
          CIVD                 : 0.0.0
          EFI                  : 0.1.5, checksum None
[00:002:00:00]: Intel(R) Ethernet Controller I226-V
        Vendor                 : 8086
        Device                 : 125C
        Subvendor              : 8086
        Subdevice              : 0000
        Revision               : 4
        LAN MAC                : BADBADBADBAB
        Alt MAC                : 000000000000
        SAN MAC                : 000000000000
        ETrackId               : 800003AD
        SerialNumber           : BADBADBADBABBBBB
        NVM Version            : 2.37(2.25)
        PBA                    : G23456-000
        VPD status             : Not set
        VPD size               : 0
        NVM update             : No config file entry
          checksum             : Valid
        OROM update            : No config file entry
          CIVD                 : 0.0.0
          EFI                  : 0.1.5, checksum None

Intel's official readme.txt is written:

nvmupdate64e -u -l -o results.xml -b -c nvmupdate.cfg

Because I connect through ssh, in order to avoid ssh disconnection and refresh failure, I adopted the following script:

sudo ./nvmupdate64e -u -l -o results.xml -b -c nvmupdate.cfg && echo "Update finished, shutting down in 10 seconds..." && sleep 10 && sudo poweroff

After the system is turned off, unplug the power cord and wait for 10 seconds to turn it on again and get the updated result:
cat results.xml

<?xml version="1.0" encoding="UTF-8"?>
<DeviceUpdate lang="en">
        <Instance vendor="8086" device="125C" subdevice="0000" subvendor="8086" bus="1" dev="0" func="0" PBA="G23456-000" port_id="Port 1 of 1" display="Intel(R) Ethernet Controller I226-V">
                <Module type="EFI" version="0.1.5" previous_version="0.1.5">
                        <Status result="Success" id="0">All operations completed successfully.</Status>
                </Module>
                <Module type="NVM" version="80000422" previous_version="800003AD">
                        <Status result="Success" id="0">All operations completed successfully.</Status>
                </Module>
                <MACAddresses>
                        <MAC address="BADBADBADBAA">
                        </MAC>
                </MACAddresses>
        </Instance>
        <Instance vendor="8086" device="125C" subdevice="0000" subvendor="8086" bus="2" dev="0" func="0" PBA="G23456-000" port_id="Port 1 of 1" display="Intel(R) Ethernet Controller I226-V">
                <Module type="EFI" version="0.1.5" previous_version="0.1.5">
                        <Status result="Success" id="0">All operations completed successfully.</Status>
                </Module>
                <Module type="NVM" version="80000422" previous_version="800003AD">
                        <Status result="Success" id="0">All operations completed successfully.</Status>
                </Module>
                <MACAddresses>
                        <MAC address="BADBADBADBAB">
                        </MAC>
                </MACAddresses>
        </Instance>
        <NextUpdateAvailable> 0 </NextUpdateAvailable>
        <RebootRequired> 0 </RebootRequired>
        <PowerCycleRequired> 0 </PowerCycleRequired>
</DeviceUpdate>

sudo ethtool -i enp2s0

driver: igc
version: 7.0.0-30-generic
firmware-version: 2032:88b6
expansion-rom-version: 
bus-info: 0000:02:00.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: yes

So you are talking about a NIC and not an NVM?

I would kindly asked that you both review your post for typos and try to fix the formatting and keep in mind to not overuse styling.

I see the point in updating hardware firmware on OpenWrt and not a "full and proper" OS and if that content was missing, thanks for providing it, but in the end it should be live in the wiki and even a forum guide should be helpful and at best with out errors.

Tldr. Please clean up the posts a little bit. Thanks

NVM refers to "Non-Volatile Memory", the ICs/EEPROMs that Intel (and other) NICs use to store firmware.

That said, I would appreciate this content, modified for OpenWrt specifically, in the Wiki very much :slight_smile:

I will be following this guide to update a bunch of 219, 225 and 226 devices over the weekend.

Maybe I got confused during my first coffee because of NVMe and NVM.
So yes no error or issue.. pardon me.

Yes it the same with mellanox cards.... And SSDs/NVMe cards sometimes too

Nice, it didn't even occur to me that the firmware might be outdated on my i226-V NICs - despite I did notice various issues over the time, especially when using them against MT7621/MT7530 based OpenWrt devices (link loss, no link at all, ...).

I have a bunch of single- and dual-port i226-V cards from AliExpress plugged into my PCs, all had the initial firmware 2.13 installed (EtrackID 80000286).

For the record, I could update them all to 2.32 using the 1MB NVM file only - the 2MB one didn't work, despite the NVM backup creating 2MB dumps. In addition, updating both ports of my dual-port NICs only worked when running the update on a Win10(!) box - otherwise, one of the ports would consistently fail to update (and also, to backup, for that matter).

YMMV!

I tried on a Fenvi PCI NIC. Couldn’t get it to flash. The 2MB one fails immediately while the 1MB stalls at 30%

You may need to use the OEM firmware instead of the community firmware. In either case, be careful to rerun the discovery command to confirm whether the ETrackID for the installed firmware is the same as before or has changed. If it has changed, edit the config script so it uses the new ETrackID value so it targets what needs to be replaced. However, if you're trying to replace 2MB firmware with 1MB firmware this may be the reason why it stops part of the way through.
Also be careful to put any backups into a separate save folder with a time stamp so you don't mix them up if you produce multiple backups of the same NIC.

Thank you. What I posted was just a crude makeshift I came up with on the fly. Your follow up is more elegant and expansive. I was frustrated trying to research how to do this only to find examples of people who reported their failed attempts in help blogs but never got any reply.

Thank you, I wasn't aware if the 1MB is useful to replace 2MB firmware. I suspect the 2MB contains something extra for the Wake-on-LAN feature which is something I can do without and would prefer to avoid on a router.

They don't post OEM firmwares as far as I'm aware.
The device actually runs v 2.19 (or is it 2.13) for which the which the ETrackId is not on the github (so I assume it's either 2.13 which wouldnt need to be there, or an unreleased version?), but yes, I worked with the correct to-be firmware file.. No go on my device.

./nvmupdate64e -i -l inventory.txt

Config file will not be read.
Unsupported device found - DeviceId: 10EF.
Inventory
[00:001:00:00]: Intel(R) Ethernet Controller I226-V
Alternate MAC address is not set.
Flash inventory started.
Shadow RAM inventory started.
Shadow RAM inventory finished.
Flash inventory finished.
[00:001:00:00]: Intel(R) Ethernet Controller I226-V
Vendor                 : 8086
Device                 : 125C
Subvendor              : 8086
Subdevice              : 0000
Revision               : 4
LAN MAC                : XXXXXXXXXXX
Alt MAC                : 000000000000
SAN MAC                : 000000000000
ETrackId               : 80000286
SerialNumber           : XXXXXXXXXXXX
NVM Version            : 2.19(2.13)
PBA                    : XXXXX-000
VPD status             : Not set
VPD size               : 0
NVM update             : No config file entry
checksum             : Valid

WoL works fine with the 1MB firmware. So it's probably more like the PXE feature that's missing from the 1MB one. At least I don't see a i226 Option ROM entry in the BIOS setup. Don't know whether it was there before, though.

Intel is using hex notation for the firmware version, decimal in brackets (or the other way round). Ie. 2.13 (hex) is the same as 2.19 (decimal).