Computer refuses to boot in UEFI mode - gives error about Intel Gigabit network card
I just tried to boot my machine in UEFI mode, but got this message:
the system cannot find the UEFI driver for the add-on network devices [0x10D38086]
I'm running Debian Linux, but I'm not sure if that is relevant. I'm not sure if my system even got to the Linux part.
Here is the relevant output from lspci
for my network card
0a:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection
The motherboard itself supports UEFI, I think. Here is the output of dmidecode
for the motherboard.
dmidecode --type 2
# dmidecode 2.12
SMBIOS 2.7 present.
Handle 0x0002, DMI type 2, 15 bytes
Base Board Information
Manufacturer: ASUSTeK COMPUTER INC.
Product Name: SABERTOOTH 990FX R2.0
Version: Rev 1.xx
Serial Number: 130309723501985
Asset Tag: To be filled by O.E.M.
Features:
Board is a hosting board
Board is replaceable
Location In Chassis: To be filled by O.E.M.
Chassis Handle: 0x0003
Type: Motherboard
Contained Object Handles: 0
The problem here is that your network adapter's firmware, or option ROM, does not support UEFI.
An add-on card can have its own executable code for use in the preboot environment. The VBIOS on a graphics card, used to initialize the GPU and display at boot time, is an example of such an option ROM. On a network card, this is typically used to implement PXE. UEFI typically1 requires that the card's firmware contain a specially-made driver, but your NIC was made for legacy BIOS systems, so it doesn't contain any such driver. As such, it will not work on a UEFI system that doesn't use the Compatibility Support Module (the legacy BIOS compatibility layer) and needs to be updated.
Digging deeper, I found that the code provided in the error message, 0x10D38086
, is the network card's PCI ID. 8086:10D3 is the Intel Gigabit CT Desktop Adapter.
A search of the downloads available for this card turned up a firmware update that can be installed onto the NIC to update the option ROM so that it supports UEFI. Download and extract Preboot.tar.gz
and follow the instructions to update the firmware. Per the release notes, the option ROM includes UEFI drivers, which should fix the error you're getting.
In your case, flash the combo
firmware, which provides UEFI and PXE support:
bootutil64e -up=combo -all -FILE=BootIMG.FLB
The message the utility returns simply indicates what functionality the existing firmware provides. It will be overwritten during the flash process; this is normal.
After you've flashed the firmware, reboot the system in native UEFI mode and see if it works. If not, you'll need to replace the network adapter.
Update: You've indicated on chat that you're getting this error while trying to flash the firmware:
Connection to QV driver failed - please reinstall it!
It looks like the firmware flash program requires the iQV debug driver (iqvlinux
) to function. The driver can be downloaded here, but you'll need to compile and load the driver yourself. The install
script, which is a separate download, is necessary to perform the installation; don't just extract the driver package and run make
.
1EFI drivers can also be in the EFI System Partition or in the UEFI firmware on the motherboard itself. However, for PCI and PCIe cards, it is usually supplied on the card's firmware.
Thanks to @bwDraco for the helpful answer.
I'm adding some details here about what this process looks like in practice.
First, I downloaded and unpacked Preboot.tar.gz
. Warning - this does not unpack into its own directory, so create a directory for it first.
Note that this utility supports a number of different operating systems. However, I'll only describe how it works on Linux, since I don't run anything else. The main documentation for this utility is DOCS/Adapter_User_Guide.pdf
.
The Linux version of this utility are two binary executables, APPS/BootUtil/Linux_x64/bootutil64e
(64 bit), and
APPS/BootUtil/Linux32$ ls bootutil32
(32 bit). And the documentation for bootutil is APPS/BootUtil/Docs/bootutil.txt
.
I then copied the file APPS/BootUtil/Linux_x64/bootutil64e
to /usr/local/bin
, though I had to make it executable first. When I ran it, I got
root@orwell:/home/faheem# bootutil64e -?
Connection to QV driver failed - please reinstall it!
This then required downloading iqvlinux.tar.gz
, which is a Linux kernel module sources archive, from https://sourceforge.net/projects/e1000/files/iqvlinux/1.2.0.3/.
Note: there is an rpm there, but trying to convert it to a deb looks pretty hopeless. And it doesn't even seem to contain a binary, just source files and headers. This isn't obvious, but one also needs the install
script in that same directory. Then run
sh install
or similar as user (running a strange script as root is never a good idea), making sure that iqvlinux.tar.gz
is on the same level as the install
script.
This gives the output
faheem@orwell:/usr/local/src/iqvlinux$ sh install
Extracting archive..OK!
make: Entering directory '/usr/local/src/iqvlinux/iqvlinux/src/linux/driver'
make -C /lib/modules/3.16.0-4-amd64/build SUBDIRS=/usr/local/src/iqvlinux/iqvlinux/src/linux/driver modules
make[1]: Entering directory '/usr/src/linux-headers-3.16.0-4-amd64'
make[1]: Entering directory `/usr/src/linux-headers-3.16.0-4-amd64'
CC [M] /usr/local/src/iqvlinux/iqvlinux/src/linux/driver/nalioctldrv.o
CC [M] /usr/local/src/iqvlinux/iqvlinux/src/linux/driver/linuxnaldriver.o
CC [M] /usr/local/src/iqvlinux/iqvlinux/src/linux/driver/linuxdriveros_i.o
CC [M] /usr/local/src/iqvlinux/iqvlinux/src/linux/driver/linuxdriverpci_i.o
CC [M] /usr/local/src/iqvlinux/iqvlinux/src/linux/driver/linuxdriverdevice_i.o
CC [M] /usr/local/src/iqvlinux/iqvlinux/src/linux/driver/linuxdrivermemory_i.o
LD [M] /usr/local/src/iqvlinux/iqvlinux/src/linux/driver/iqvlinux.o
Building modules, stage 2.
MODPOST 1 modules
CC /usr/local/src/iqvlinux/iqvlinux/src/linux/driver/iqvlinux.mod.o
LD [M] /usr/local/src/iqvlinux/iqvlinux/src/linux/driver/iqvlinux.ko
make[1]: Leaving directory '/usr/src/linux-headers-3.16.0-4-amd64'
make: Leaving directory '/usr/local/src/iqvlinux/iqvlinux/src/linux/driver'
Skipping removing QV driver - it does not exist...
Copying iqvlinux.ko driver file to /lib/modules directory...cp: cannot create regular file ‘/lib/modules/3.16.0-4-amd64/kernel/drivers/net/iqvlinux.ko’: Permission denied
Error: failed to copy driver (‘/usr/local/src/iqvlinux/iqvlinux/src/linux/driver/iqvlinux.ko’ -> ‘/lib/modules/3.16.0-4-amd64/kernel/drivers/net/iqvlinux.ko’)
Copying the kernel module into place by hand makes the error go away.
Before reflashing the card, this is the output of bootutil64e
for the card:
Port Network Address Location Series WOL Flash Firmware Version
==== =============== ======== ======= === ============================= =======
1 001B213916B9 10:00.0 Gigabit YES PXE 1.3.21
Here's the session transcript of the reflashing. The combo option enables both the PXE and UEFI functionality. Note that one has to point to the location of the boot image with the FILE
option:
root@orwell:/home/faheem# bootutil64e -up=combo -all -FILE=/usr/local/src/Intel_Network_Card_Boot_Utility/APPS/BootUtil/BootIMG.FLB
Intel(R) Ethernet Flash Firmware Utility
BootUtil version 1.6.39.1
Copyright (C) 2003-2017 Intel Corporation
Programming flash on port 1 with flash firmware image
Create restore image of NIC 1 before proceeding? (Y)es or (N)o: Y
Y
Saving flash firmware image on port 1 to file 10D34008.FLB...
Filename 10D34008.FLB already exists.
(O)verwrite/proceed or (S)top execution?: O
O
saved
Updating PXE+EFI removes PXE functionality.
Would you like to continue? (Y)es or (N)o: Y
Y
/
Flash update successful
Port Network Address Location Series WOL Flash Firmware Version
==== =============== ======== ======= === ============================= =======
1 001B213916B9 10:00.0 Gigabit YES UEFI,PXE Enabled 1.5.84