summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2019-07-15 13:49:47 +0200
committerMichael Brown2019-07-15 13:49:47 +0200
commita385e2376859dc0195ec77aeab220876b201c16b (patch)
tree5c654730ac61146037965e752ef7092a0b76d89f
parent[arm] Provide dummy implementations for {in,out}[s]{b,w,l} (diff)
downloadipxe-a385e2376859dc0195ec77aeab220876b201c16b.tar.gz
ipxe-a385e2376859dc0195ec77aeab220876b201c16b.tar.xz
ipxe-a385e2376859dc0195ec77aeab220876b201c16b.zip
[efi] Return only registered EFI devices from efidev_parent()
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>
-rw-r--r--src/interface/efi/efi_driver.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/interface/efi/efi_driver.c b/src/interface/efi/efi_driver.c
index 04796414..7be2e585 100644
--- a/src/interface/efi/efi_driver.c
+++ b/src/interface/efi/efi_driver.c
@@ -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;
}