]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[efi] Return only registered EFI devices from efidev_parent()
authorMichael Brown <mcb30@ipxe.org>
Mon, 15 Jul 2019 11:49:47 +0000 (12:49 +0100)
committerMichael Brown <mcb30@ipxe.org>
Mon, 15 Jul 2019 11:49:47 +0000 (12:49 +0100)
efidev_parent() currently assumes that any device with BUS_TYPE_EFI is
part of a struct efi_device.  This assumption is not valid, since the
code in efi_device_info() may also create a device with BUS_TYPE_EFI.

Fix by searching through the list of registered EFI devices when
looking for a match, instead of relying on the bus type value.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/interface/efi/efi_driver.c

index 04796414a2e0e2d9d4bc8806cb2710777ea14aa2..7be2e585d6edb54da69b3b673ae332576f1c5a77 100644 (file)
@@ -73,11 +73,14 @@ static struct efi_device * efidev_find ( EFI_HANDLE device ) {
  */
 struct efi_device * efidev_parent ( struct device *dev ) {
        struct device *parent;
+       struct efi_device *efidev;
 
-       /* Walk upwards until we find an EFI device */
+       /* Walk upwards until we find a registered EFI device */
        while ( ( parent = dev->parent ) ) {
-               if ( parent->desc.bus_type == BUS_TYPE_EFI )
-                       return container_of ( parent, struct efi_device, dev );
+               list_for_each_entry ( efidev, &efi_devices, dev.siblings ) {
+                       if ( parent == &efidev->dev )
+                               return efidev;
+               }
                dev = parent;
        }