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