From 7cfb502fffd79a2c7d832e8b9ba4ba8fa82df199 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Wed, 30 Jul 2014 18:44:09 +0100 Subject: [PATCH] [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 Signed-off-by: Michael Brown --- src/interface/efi/efi_snp.c | 12 ++++++++---- 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; }