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; }