summaryrefslogtreecommitdiffstats
path: root/src/interface/efi
diff options
context:
space:
mode:
authorMichael Brown2014-07-30 19:44:09 +0200
committerMichael Brown2014-07-30 19:44:09 +0200
commit7cfb502fffd79a2c7d832e8b9ba4ba8fa82df199 (patch)
tree1351d42d13083a81beb90031a39c927797517b50 /src/interface/efi
parent[netdevice] Avoid registering duplicate network devices (diff)
downloadipxe-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.c12
-rw-r--r--src/interface/efi/efi_snp_hii.c7
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;
}