From 038590af89eee321ea5a28e97a8aba078a7af4e2 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Tue, 25 Apr 2023 10:54:48 -0600 Subject: [PATCH] ide: Make ide_ident() return an error code Update ide_ident() to indicate whether it finds a device or not. Use that to decide whether to create a block device for it, rather than looking DEV_TYPE_UNKNOWN. Signed-off-by: Simon Glass --- drivers/block/ide.c | 101 +++++++++++++++++++++++++++------------------------- 1 file changed, 53 insertions(+), 48 deletions(-) diff --git a/drivers/block/ide.c b/drivers/block/ide.c index 835e781..16b119e 100644 --- a/drivers/block/ide.c +++ b/drivers/block/ide.c @@ -534,15 +534,21 @@ static void atapi_inquiry(struct blk_desc *desc) desc->lba48 = false; } -static void ide_ident(struct blk_desc *desc) +/** + * ide_ident() - Identify an IDE device + * + * @device: Device number to use + * @desc: Block descriptor to fill in + * Returns: 0 if OK, -ENOENT if no device is found + */ +static int ide_ident(int device, struct blk_desc *desc) { unsigned char c; hd_driveid_t iop; bool is_atapi = false; int tries = 1; - int device; - device = desc->devnum; + desc->devnum = device; printf(" Device %d: ", device); /* Select device @@ -604,7 +610,7 @@ static void ide_ident(struct blk_desc *desc) } if (!tries) /* Not found */ - return; + return -ENOENT; ide_input_swap_data(device, (ulong *)&iop, ATA_SECTORWORDS); @@ -620,7 +626,7 @@ static void ide_ident(struct blk_desc *desc) if (IS_ENABLED(CONFIG_ATAPI) && is_atapi) { desc->atapi = true; atapi_inquiry(desc); - return; + return 0; } iop.lba_capacity[0] = be16_to_cpu(iop.lba_capacity[0]); @@ -661,6 +667,8 @@ static void ide_ident(struct blk_desc *desc) udelay(50); c = ide_wait(device, IDE_TIME_OUT); /* can't take over 500 ms */ #endif + + return 0; } /** @@ -1017,64 +1025,61 @@ static int ide_probe(struct udevice *udev) schedule(); for (i = 0; i < CONFIG_SYS_IDE_MAXDEVICE; i++) { + struct blk_desc *desc; + struct udevice *blk; + lbaint_t size; + char name[20]; + int blksz; + int ret; + if (!bus_ok[IDE_BUS(i)]) continue; ide_dev_desc[i].type = DEV_TYPE_UNKNOWN; ide_dev_desc[i].uclass_id = UCLASS_IDE; - ide_dev_desc[i].devnum = i; ide_dev_desc[i].part_type = PART_TYPE_UNKNOWN; ide_dev_desc[i].blksz = 0; ide_dev_desc[i].log2blksz = LOG2_INVALID(typeof(ide_dev_desc[i].log2blksz)); ide_dev_desc[i].lba = 0; - ide_ident(&ide_dev_desc[i]); + ret = ide_ident(i, &ide_dev_desc[i]); dev_print(&ide_dev_desc[i]); - if (ide_dev_desc[i].type != DEV_TYPE_UNKNOWN) { - struct udevice *blk_dev; - struct blk_desc *desc; - lbaint_t size; - char name[20]; - int blksz; - int ret; + if (ret) + continue; - sprintf(name, "blk#%d", i); + sprintf(name, "blk#%d", i); - blksz = ide_dev_desc[i].blksz; - size = blksz * ide_dev_desc[i].lba; + blksz = ide_dev_desc[i].blksz; + size = blksz * ide_dev_desc[i].lba; - /* - * With CDROM, if there is no CD inserted, blksz will - * be zero, don't bother to create IDE block device. - */ - if (!blksz) - continue; - ret = blk_create_devicef(udev, "ide_blk", name, - UCLASS_IDE, i, - blksz, size, &blk_dev); - if (ret) - return ret; - - ret = blk_probe_or_unbind(blk_dev); - if (ret) - return ret; - - /* fill in device vendor/product/rev strings */ - desc = dev_get_uclass_plat(blk_dev); - strlcpy(desc->vendor, ide_dev_desc[desc->devnum].vendor, - BLK_VEN_SIZE); - strlcpy(desc->product, - ide_dev_desc[desc->devnum].product, - BLK_PRD_SIZE); - strlcpy(desc->revision, - ide_dev_desc[desc->devnum].revision, - BLK_REV_SIZE); - - ret = bootdev_setup_for_dev(udev, "ide_bootdev"); - if (ret) - return log_msg_ret("bootdev", ret); - } + /* + * With CDROM, if there is no CD inserted, blksz will + * be zero, don't bother to create IDE block device. + */ + if (!blksz) + continue; + ret = blk_create_devicef(udev, "ide_blk", name, UCLASS_IDE, i, + blksz, size, &blk); + if (ret) + return ret; + + ret = blk_probe_or_unbind(blk); + if (ret) + return ret; + + /* fill in device vendor/product/rev strings */ + desc = dev_get_uclass_plat(blk); + strlcpy(desc->vendor, ide_dev_desc[desc->devnum].vendor, + BLK_VEN_SIZE); + strlcpy(desc->product, ide_dev_desc[desc->devnum].product, + BLK_PRD_SIZE); + strlcpy(desc->revision, ide_dev_desc[desc->devnum].revision, + BLK_REV_SIZE); + + ret = bootdev_setup_for_dev(udev, "ide_bootdev"); + if (ret) + return log_msg_ret("bootdev", ret); } return 0; -- 2.7.4