Unlocking Vendor-Locked SFP Modules on Intel X710-DA2 10GbE SFP+ NIC
If you’ve ever tried plugging a third-party SFP transceiver into an Intel X710-DA2 10GbE SFP+ NIC, you’ve probably run into the frustrating reality that Intel locks these cards down by default, meaning they’ll only play nicely with Intel-approved modules. Not ideal when you’re trying to save some money or use hardware you already have lying around.
The good news is that this lock isn’t permanent or even particularly hard to remove. While driver-based workarounds exist, they need reapplying every time. There’s a cleaner, permanent fix straight at the hardware level. Intel actually documents the mechanism themselves in their official datasheet (Intel® Ethernet Controller X710/XXV710/XL710 Datasheet). There’s a specific register sitting at bit 11 of the X710-DA2 controller that acts as a simple on/off switch for module authentication. Flip it off, and the card stops caring where your transceiver came from.
Even better, the whole process can be done with a handful of basic Linux commands, thanks to a handy tool available on Github. No firmware flashing wizardry, no soldering iron required.
Before running the unlocker, we’ll need to install a few tools, specifically make, gcc, git, and net-tools. Once those are in place, we clone the xl710-unlocker repository from GitHub, navigate into the project folder, and run make to build and execute it.
apt-get install make
apt-get install gcc
apt-get install git
apt-get install net-tools
cd ~
git clone https://github.com/bibigon812/xl710-unlocker.git
cd ~/xl710-unlocker
makeAfter compiling the tool, the following files should be listed in the folder, including the xl710_unlock tool itself.
root@ubuntu-server:~/xl710-unlocker# ls
Makefile README.md syscalls.h xl710_unlock xl710_unlock.cWe check the NIC details, looking for the interface port names. In this case enp1s0f0np0 and enp1s0f1np1.
root@ubuntu-server:~/xl710-unlocker# lspci -nn | grep Ethernet
00:1f.6 Ethernet controller [0200]: Intel Corporation Ethernet Connection (7) I219-V [8086:15bc] (rev 10)
01:00.0 Ethernet controller [0200]: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ [8086:1572] (rev 02)
01:00.1 Ethernet controller [0200]: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ [8086:1572] (rev 02)
root@ubuntu-server:~/xl710-unlocker# ifconfig
eno1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.1.1.243 netmask 255.255.255.0 broadcast 10.1.1.255
inet6 fe80::ea6a:64ff:fe9a:6a85 prefixlen 64 scopeid 0x20<link>
ether e8:6a:64:9a:6a:85 txqueuelen 1000 (Ethernet)
RX packets 40071 bytes 56404955 (56.4 MB)
RX errors 0 dropped 4 overruns 0 frame 0
TX packets 5105 bytes 477978 (477.9 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 17 memory 0xb4200000-b4220000
enp1s0f0np0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether 3c:fd:fe:36:32:a0 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
enp1s0f1np1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether 3c:fd:fe:36:32:a2 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 268 bytes 22501 (22.5 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 268 bytes 22501 (22.5 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0Finally we run the tool to check the status and modify the value of the register in the EEPROM of the NIC that controls whether or not module authentication is enabled.
root@ubuntu-server:~/xl710-unlocker# ./xl710_unlock -n enp1s0f0np0
EMP SR offset: 0x66ac
PHY offset: 0x67fa
PHY data struct size: 0x000b
MISC: 0x2b0c <- locked
MISC: 0x2b0c <- locked
MISC: 0x2b0c <- locked
MISC: 0x2b0c <- locked
Ready to fix it? [y/N]: yOnce the tool has run, you can execute the command again to verify the register value has changed, confirming the bit has been flipped and the card is now unlocked.
root@ubuntu-server:~/xl710-unlocker# ./xl710_unlock -n enp1s0f0np0
EMP SR offset: 0x66ac
PHY offset: 0x67fa
PHY data struct size: 0x000b
MISC: 0x230c <- unlocked
MISC: 0x230c <- unlocked
MISC: 0x230c <- unlocked
MISC: 0x230c <- unlocked
Ready to fix it? [y/N]: n
root@ubuntu-server:~/xl710-unlocker# ./xl710_unlock -n enp1s0f1np1
EMP SR offset: 0x66ac
PHY offset: 0x67fa
PHY data struct size: 0x000b
MISC: 0x230c <- unlocked
MISC: 0x230c <- unlocked
MISC: 0x230c <- unlocked
MISC: 0x230c <- unlocked
Ready to fix it? [y/N]: nYour Intel X710-DA2 will now happily accept third-party SFP modules from here on out.

