EFI device paths for block devices must be unique. If a non-unique device path is discovered, probing of the block device fails.
Currently we use UsbClass() device path nodes. As multiple devices may have the same vendor and product id these are non-unique. Instead we should use Usb() device path nodes. They include the USB port on the parent hub and hence are unique. A USB storage device may contain multiple logical units. These can be modeled as Ctrl() nodes. Given a driver model tree root 0 root_driver root_driver usb 0 ehci_generic |-- usb@1c1a000 usb_hub 0 usb_hub `-- usb_hub usb_hub 1 usb_hub `-- usb_hub usb_mass_s 2 usb_mass_storage `-- usb_mass_storage blk 4 usb_storage_blk |-- usb_mass_storage.lun0 where the USB mass storage device is connected to port 4 of the 2nd hub, the device path for LUN 0 will be: /VenHw()/USB(0x0,0x0)/USB(0x1,0x0)/USB(0x4,0x0)/Ctrl(0x0) Heinrich Schuchardt (2): efi_loader: support for Ctrl() device path node efi_loader: fix device-path for USB devices include/efi_api.h | 6 ++++ lib/efi_loader/efi_device_path.c | 45 +++++++++++++++++------- lib/efi_loader/efi_device_path_to_text.c | 7 ++++ 3 files changed, 46 insertions(+), 12 deletions(-) -- 2.39.2