diff options
| author | Michael Brown | 2014-07-30 19:44:09 +0200 |
|---|---|---|
| committer | Michael Brown | 2014-07-30 19:44:09 +0200 |
| commit | 7cfb502fffd79a2c7d832e8b9ba4ba8fa82df199 (patch) | |
| tree | 1351d42d13083a81beb90031a39c927797517b50 /src/interface/efi | |
| parent | [netdevice] Avoid registering duplicate network devices (diff) | |
| download | ipxe-7cfb502fffd79a2c7d832e8b9ba4ba8fa82df199.tar.gz ipxe-7cfb502fffd79a2c7d832e8b9ba4ba8fa82df199.tar.xz ipxe-7cfb502fffd79a2c7d832e8b9ba4ba8fa82df199.zip | |
[efi] Ignore failures when attempting to install SNP HII protocol
HII seems to fail on several systems. Since it is non-essential,
treat HII problems as non-fatal.
Debugged-by: Curtis Larsen <larsen@dixie.edu>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/interface/efi')
| -rw-r--r-- | src/interface/efi/efi_snp.c | 12 | ||||
| -rw-r--r-- | src/interface/efi/efi_snp_hii.c | 7 |
2 files changed, 13 insertions, 6 deletions
diff --git a/src/interface/efi/efi_snp.c b/src/interface/efi/efi_snp.c index a301f3b48..d869c30f8 100644 --- a/src/interface/efi/efi_snp.c +++ b/src/interface/efi/efi_snp.c @@ -1053,7 +1053,10 @@ static int efi_snp_probe ( struct net_device *netdev ) { if ( ( rc = efi_snp_hii_install ( snpdev ) ) != 0 ) { DBGC ( snpdev, "SNPDEV %p could not install HII: %s\n", snpdev, strerror ( rc ) ); - goto err_hii_install; + /* HII fails on several platforms. It's + * non-essential, so treat this as a non-fatal + * error. + */ } /* Add to list of SNP devices */ @@ -1064,8 +1067,8 @@ static int efi_snp_probe ( struct net_device *netdev ) { efi_devpath_text ( &snpdev->path ) ); return 0; - efi_snp_hii_uninstall ( snpdev ); - err_hii_install: + if ( snpdev->package_list ) + efi_snp_hii_uninstall ( snpdev ); efidev_child_del ( efidev, snpdev->handle ); err_efidev_child_add: bs->UninstallMultipleProtocolInterfaces ( @@ -1130,7 +1133,8 @@ static void efi_snp_remove ( struct net_device *netdev ) { } /* Uninstall the SNP */ - efi_snp_hii_uninstall ( snpdev ); + if ( snpdev->package_list ) + efi_snp_hii_uninstall ( snpdev ); efidev_child_del ( snpdev->efidev, snpdev->handle ); list_del ( &snpdev->list ); bs->UninstallMultipleProtocolInterfaces ( diff --git a/src/interface/efi/efi_snp_hii.c b/src/interface/efi/efi_snp_hii.c index 51634a092..f300de436 100644 --- a/src/interface/efi/efi_snp_hii.c +++ b/src/interface/efi/efi_snp_hii.c @@ -649,8 +649,10 @@ int efi_snp_hii_install ( struct efi_snp_device *snpdev ) { int rc; /* Do nothing if HII database protocol is not supported */ - if ( ! efihii ) - return 0; + if ( ! efihii ) { + rc = -ENOTSUP; + goto err_no_hii; + } /* Initialise HII protocol */ memcpy ( &snpdev->hii, &efi_snp_device_hii, sizeof ( snpdev->hii ) ); @@ -697,6 +699,7 @@ int efi_snp_hii_install ( struct efi_snp_device *snpdev ) { free ( snpdev->package_list ); snpdev->package_list = NULL; err_build_package_list: + err_no_hii: return rc; } |
