diff options
author | Simon Glass | 2023-04-25 10:54:42 -0600 |
---|---|---|
committer | Tom Rini | 2023-04-27 13:51:06 -0400 |
commit | b6483ea22355b097c061bd551bfcd5eb84a39e79 (patch) | |
tree | 8133fed5c988da0120f65b6efaf271baed53581c /drivers/block | |
parent | 8b1b943a7aa3c2d071982b99220cdee49ed2c5fb (diff) |
ide: Move bus init into a function
Move this code into a separate function which returns whether the bus was
found, or not.
Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/ide.c | 87 |
1 files changed, 48 insertions, 39 deletions
diff --git a/drivers/block/ide.c b/drivers/block/ide.c index 45201333c3c..aac4462f57b 100644 --- a/drivers/block/ide.c +++ b/drivers/block/ide.c @@ -679,9 +679,55 @@ static void ide_ident(struct blk_desc *dev_desc) #endif } +/** + * ide_init_one() - Init one IDE device + * + * @bus: Bus to use + * Return: 0 iuf OK, -EIO if not available, -ETIMEDOUT if timed out + */ +static int ide_init_one(int bus) +{ + int dev = bus * CONFIG_SYS_IDE_MAXDEVICE / CONFIG_SYS_IDE_MAXBUS; + int i; + u8 c; + + printf("Bus %d: ", bus); + + /* Select device */ + mdelay(100); + ide_outb(dev, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(dev)); + mdelay(100); + i = 0; + do { + mdelay(10); + + c = ide_inb(dev, ATA_STATUS); + i++; + if (i > (ATA_RESET_TIME * 100)) { + puts("** Timeout **\n"); + return -ETIMEDOUT; + } + if (i >= 100 && !(i % 100)) + putc('.'); + } while (c & ATA_STAT_BUSY); + + if (c & (ATA_STAT_BUSY | ATA_STAT_FAULT)) { + puts("not available "); + debug("Status = 0x%02X ", c); + return -EIO; + } else if (IS_ENABLED(CONFIG_ATAPI) && !(c & ATA_STAT_READY)) { + /* ATAPI Devices do not set DRDY */ + puts("not available "); + debug("Status = 0x%02X ", c); + return -EIO; + } + puts("OK "); + + return 0; +} + static void ide_init(void) { - unsigned char c; int i, bus; schedule(); @@ -694,44 +740,7 @@ static void ide_init(void) * According to spec, this can take up to 31 seconds! */ for (bus = 0; bus < CONFIG_SYS_IDE_MAXBUS; ++bus) { - int dev = - bus * (CONFIG_SYS_IDE_MAXDEVICE / - CONFIG_SYS_IDE_MAXBUS); - - printf("Bus %d: ", bus); - - ide_bus_ok[bus] = 0; - - /* Select device */ - mdelay(100); - ide_outb(dev, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(dev)); - mdelay(100); - i = 0; - do { - mdelay(10); - - c = ide_inb(dev, ATA_STATUS); - i++; - if (i > (ATA_RESET_TIME * 100)) { - puts("** Timeout **\n"); - return; - } - if ((i >= 100) && ((i % 100) == 0)) - putc('.'); - - } while (c & ATA_STAT_BUSY); - - if (c & (ATA_STAT_BUSY | ATA_STAT_FAULT)) { - puts("not available "); - debug("Status = 0x%02X ", c); - } else if (IS_ENABLED(CONFIG_ATAPI) && !(c & ATA_STAT_READY)) { - /* ATAPI Devices do not set DRDY */ - puts("not available "); - debug("Status = 0x%02X ", c); - } else { - puts("OK "); - ide_bus_ok[bus] = 1; - } + ide_bus_ok[bus] = !ide_init_one(bus); schedule(); } |