1
0
mirror of https://xff.cz/git/u-boot/ synced 2026-01-05 08:06:44 +01:00

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 <sjg@chromium.org>
This commit is contained in:
Simon Glass
2023-04-25 10:54:48 -06:00
committed by Tom Rini
parent ce99e297e5
commit 038590af89

View File

@@ -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;
/*
* 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_dev);
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_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);
/* 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);
}
ret = bootdev_setup_for_dev(udev, "ide_bootdev");
if (ret)
return log_msg_ret("bootdev", ret);
}
return 0;