From: Michael Brown Date: Mon, 7 Sep 2015 00:25:41 +0000 (+0100) Subject: [efi] Allow efidev_parent() to traverse multiple device generations X-Git-Tag: v1.20.1~701 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5cea7bdb2af44a5e6b652c302f2761dc8fa1048f;p=thirdparty%2Fipxe.git [efi] Allow efidev_parent() to traverse multiple device generations Signed-off-by: Michael Brown --- diff --git a/src/interface/efi/efi_driver.c b/src/interface/efi/efi_driver.c index 2a59257b8..b59362c64 100644 --- a/src/interface/efi/efi_driver.c +++ b/src/interface/efi/efi_driver.c @@ -68,18 +68,16 @@ static struct efi_device * efidev_find ( EFI_HANDLE device ) { * @ret efidev Parent EFI device, or NULL */ struct efi_device * efidev_parent ( struct device *dev ) { - struct device *parent = dev->parent; - struct efi_device *efidev; + struct device *parent; - /* Check that parent exists and is an EFI device */ - if ( ! parent ) - return NULL; - if ( parent->desc.bus_type != BUS_TYPE_EFI ) - return NULL; + /* Walk upwards until we find an EFI device */ + while ( ( parent = dev->parent ) ) { + if ( parent->desc.bus_type == BUS_TYPE_EFI ) + return container_of ( parent, struct efi_device, dev ); + dev = parent; + } - /* Get containing EFI device */ - efidev = container_of ( parent, struct efi_device, dev ); - return efidev; + return NULL; } /**