
From: Simon Glass <sjg@chromium.org> Binding a new efi_media device uses a placeholder name which is then changed after the device is bound. But binding the device immediately causes a child block device to be bound, which uses this placeholder name as its base, rather than the eventual name of the efi_media device. To fix, decide on the name earlier (based on the number of existing devices), then pass that name to device_bind() Signed-off-by: Simon Glass <sjg@chromium.org> --- lib/efi_client/efi_app_init.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/lib/efi_client/efi_app_init.c b/lib/efi_client/efi_app_init.c index 7d30e79528f..b5421dc5a91 100644 --- a/lib/efi_client/efi_app_init.c +++ b/lib/efi_client/efi_app_init.c @@ -50,7 +50,7 @@ int efi_bind_block(efi_handle_t handle, struct efi_block_io *blkio, { struct efi_media_plat *plat; struct udevice *dev; - char name[18]; + char name[18], *str; int ret; size_t device_path_len = device_path_length(device_path); @@ -63,13 +63,20 @@ int efi_bind_block(efi_handle_t handle, struct efi_block_io *blkio, if (!plat->device_path) return log_msg_ret("path", -ENOMEM); memcpy(plat->device_path, device_path, device_path_len); - ret = device_bind(dm_root(), DM_DRIVER_GET(efi_media), "efi_media", - plat, ofnode_null(), &dev); - if (ret) - return log_msg_ret("bind", ret); - snprintf(name, sizeof(name), "efi_media_%x", dev_seq(dev)); - device_set_name(dev, name); + snprintf(name, sizeof(name), "efi_media_%x", + uclass_id_count(UCLASS_EFI_MEDIA)); + str = strdup(name); + if (!str) + return -ENOMEM; + + ret = device_bind(dm_root(), DM_DRIVER_GET(efi_media), str, plat, + ofnode_null(), &dev); + if (ret) { + free(str); + return log_msg_ret("bind", ret); + } + device_set_name_alloced(dev); *devp = dev; return 0; -- 2.43.0