summaryrefslogtreecommitdiffstats
path: root/src/interface/efi/efi_autoboot.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/interface/efi/efi_autoboot.c')
-rw-r--r--src/interface/efi/efi_autoboot.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/src/interface/efi/efi_autoboot.c b/src/interface/efi/efi_autoboot.c
index a9e807e23..08d67f761 100644
--- a/src/interface/efi/efi_autoboot.c
+++ b/src/interface/efi/efi_autoboot.c
@@ -23,6 +23,8 @@
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
+#include <string.h>
+#include <errno.h>
#include <ipxe/efi/efi.h>
#include <ipxe/efi/efi_autoboot.h>
#include <ipxe/efi/Protocol/SimpleNetwork.h>
@@ -37,8 +39,10 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
/**
* Identify autoboot device
*
+ * @v device Device handle
+ * @ret rc Return status code
*/
-void efi_set_autoboot ( void ) {
+int efi_set_autoboot_ll_addr ( EFI_HANDLE device ) {
EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
union {
EFI_SIMPLE_NETWORK_PROTOCOL *snp;
@@ -46,26 +50,30 @@ void efi_set_autoboot ( void ) {
} snp;
EFI_SIMPLE_NETWORK_MODE *mode;
EFI_STATUS efirc;
+ int rc;
/* Look for an SNP instance on the image's device handle */
- if ( ( efirc = bs->OpenProtocol ( efi_loaded_image->DeviceHandle,
+ if ( ( efirc = bs->OpenProtocol ( device,
&efi_simple_network_protocol_guid,
&snp.interface, efi_image_handle,
NULL,
EFI_OPEN_PROTOCOL_GET_PROTOCOL ))!=0){
- DBGC ( efi_loaded_image, "EFI found no autoboot device\n" );
- return;
+ rc = -EEFI ( efirc );
+ DBGC ( device, "EFI %s has no SNP instance: %s\n",
+ efi_handle_name ( device ), strerror ( rc ) );
+ return rc;
}
/* Record autoboot device */
mode = snp.snp->Mode;
set_autoboot_ll_addr ( &mode->CurrentAddress, mode->HwAddressSize );
- DBGC ( efi_loaded_image, "EFI found autoboot link-layer address:\n" );
- DBGC_HDA ( efi_loaded_image, 0, &mode->CurrentAddress,
- mode->HwAddressSize );
+ DBGC ( device, "EFI %s found autoboot link-layer address:\n",
+ efi_handle_name ( device ) );
+ DBGC_HDA ( device, 0, &mode->CurrentAddress, mode->HwAddressSize );
/* Close protocol */
- bs->CloseProtocol ( efi_loaded_image->DeviceHandle,
- &efi_simple_network_protocol_guid,
+ bs->CloseProtocol ( device, &efi_simple_network_protocol_guid,
efi_image_handle, NULL );
+
+ return 0;
}