Enabling unsupported SFP+ transceivers on the Intel X520/Dell R720

Having recently set up a new-to-me Dell R720 in a colocation provider’s environment—in my quest to “own” the whole stack from metal to service—I ran into an issue with not being able to use generic or Cisco-coded SFP+/SFP trancseivers in the included Intel X520 network card. dmesg kept indicating that the transceiver was unsupported. Because of impatience and other factors, I decided to dig a bit and see what it would take to enable support for good ‘ol grab bag generic SFP+/SFP transceivers.

I came across this article on the ServeTheHome forums where user NathanA had already dug to the bottom of this issue, and fortunately came out the other side with a solution.

NathanA discovered—via datasheets, mailing lists, and discussion threads—that a particular bit in a particular byte of the NIC EEPROM needs to be flipped in order to allow any SFP. In the Linux ixgbe driver, the byte in question is referred to as IXGBE_DEVICE_CAPS_ALLOW_ANY_SFP.

The steps to flip this bit, and thus allowing “unsupported” SFPs, is as follows:

Note: I am in no way liable for any permanent damaged caused by running the following commands on your Intel NIC!

Identify current value of offset 0x58

$ sudo ethtool -e eno1 offset 0x58 length 1
Offset          Values
------          ------
0x0058:         fc

Write the new value to the card’s EEPROM

The new hex value below is identical to simply flipping the last binary bit in the fc hex value.

$ sudo ethtool -E eno1 magic 0x10fb8086 0x58 value 0xfd

Let’s check if we were successful

If the output of the command below returns the new value of our 0x58 offset, we should be good to go!

$ sudo ethtool -e eno1 offset 0x58 length 1
Offset          Values
------          ------
0x0058:         fd

What’s best about this EEPROM change is that is survives reboots, poweroffs, and will enable usage of unsupported SFPs in non-Unix operating systems.

And, to return the EEPROM to its original state, simply write the old hex value back to the 0x58 offset and call it a day.