How to assign e1000e driver to Ethernet adapter

driversethernetrhel

Is there a way to instruct an Ethernet adapter to use a certain driver? Or perhaps the way it works is to have a way to instruct a driver to support a specific adapter?

I have a system running a recently installed RHEL Server 7.3 OS (kernel 3.10.0-514.el7.x86_64), where the e1000e driver is not linked to an on-board I219-LM Ethernet adapter. This condition was found while investigating why the adapter is not working properly. The other Ethernet adapter, which works fine, is a PCI card attached to the MB.

A simple lspci says:

# lspci | grep net
00:1f.6 Ethernet controller: Intel Corporation Ethernet Connection (2) I219-LM (rev 31)
06:00.0 Ethernet controller: Intel Corporation 82572EI Gigabit Ethernet Controller (Copper) (rev 06)

Verbose lspci for the I219-LM device does not report a driver in use:

# lspci -v -s 00:1f.6
00:1f.6 Ethernet controller: Intel Corporation Ethernet Connection (2) I219-LM (rev 31)
    Subsystem: Intel Corporation Device 0000
    Flags: fast devsel, IRQ 16
    Memory at a1700000 (32-bit, non-prefetchable) [size=128K]
    Capabilities: [c8] Power Management version 3
    Capabilities: [d0] MSI: Enable- Count=1/1 Maskable- 64bit+
    Capabilities: [e0] PCI Advanced Features
    Kernel modules: e1000e

Conversely, the same command for the other adapter states that e1000e is being used by the device:

# lspci -v -s 06:00.0
06:00.0 Ethernet controller: Intel Corporation 82572EI Gigabit Ethernet Controller (Copper) (rev 06)
    Subsystem: Intel Corporation PRO/1000 PT Server Adapter
    Flags: bus master, fast devsel, latency 0, IRQ 130
    Memory at a1320000 (32-bit, non-prefetchable) [size=128K]
    Memory at a1300000 (32-bit, non-prefetchable) [size=128K]
    I/O ports at 4000 [disabled] [size=32]
    Expansion ROM at a1340000 [disabled] [size=128K]
    Capabilities: [c8] Power Management version 2
    Capabilities: [d0] MSI: Enable+ Count=1/1 Maskable- 64bit+
    Capabilities: [e0] Express Endpoint, MSI 00
    Capabilities: [100] Advanced Error Reporting
    Capabilities: [140] Device Serial Number [edited]
    Kernel driver in use: e1000e
    Kernel modules: e1000e

I have another system available, using the same OS and type of on-board (and properly functioning) I219-LM adapter, where I verified that, indeed, the driver should be linked to the device.

Browsing the /sys/bus/pci/drivers/e1000e and /sys/devices/pci0000:00/0000:00:1f.6 areas has shown a couple of missing things:

  1. In the .../drivers/e1000e folder, there is a soft-link using the PCI address of the 82572EI adapter that points to the /sys/devices/ area, but none with the I219-LM adapter's one. In comparison, in the mentioned "control" system, there are links for all the adapters it has.
  2. In the /sys/devices/pci0000:00/0000:00:1f.6 area, there is no driver soft-link. However, that soft-link is present in the corresponding folder for the other adapter (../pci0000:00/0000:06:00.0), pointing to the /sys/bus/pci/drivers/e1000e path as it should.

Let me know if more info is needed to help me on this.

Thank you.

Best Answer

I think I ran into a similar situation to this in RHEL7.9 with newer hardware. What it boils down to is that Red Hat backports the new NIC drivers to their version of the driver. So newer hardware can sometimes be ahead of what they are supporting at that point in time. I know that the version of your NIC is now supported by RHEL7, since I have a workstation using that NIC and everything works. In my case a new Dell precision tower had an I219-LM NIC that needed a driver version that Red Hat would not be backporting for support in RHEL7 (supported in RHEL8 now). I was PXE booting, so it was a little extra work to get that portion working.

In order to get the PXE boot working properly I had to update the initrd image that was used to start the boot and install my image, but since that is not really in the scope of this question I'll skip over that.

You can either grab the driver from the intel website e1000e download page or you can use the kmod repo (kmod e1000e link). In my case I was PXE booting and installing packages from a Spacewalk server, so I just added the kmod-e1000e package to my repository and installed it during the build process. The kmod-e1000e package is the easier choice because it should not get overwritten on kernel upgrades going forward.

TL;DR Red Hat can be lousy about driver support, so installing a newer driver separately can work around that.

P.S. I'd be happy to write up how to make PXE boots work if needed.

Related Question