}
static grub_err_t
-grub_ata_device_initialize (int port, int device, int addr, int addr2)
+check_device (struct grub_ata_device *dev)
{
- struct grub_ata_device *dev;
- struct grub_ata_device **devp;
-
- grub_dprintf ("ata", "detecting device %d,%d (0x%x, 0x%x)\n",
- port, device, addr, addr2);
-
- dev = grub_malloc (sizeof(*dev));
- if (! dev)
- return grub_errno;
-
- /* Setup the device information. */
- dev->port = port;
- dev->device = device;
- dev->ioaddress = addr + GRUB_MACHINE_PCI_IO_BASE;
- dev->ioaddress2 = addr2 + GRUB_MACHINE_PCI_IO_BASE;
- dev->next = NULL;
-
grub_ata_regset (dev, GRUB_ATA_REG_DISK, dev->device << 4);
grub_ata_wait ();
grub_uint8_t sec = grub_ata_regget (dev, GRUB_ATA_REG_SECTORS);
grub_dprintf ("ata", "sectors=0x%x\n", sec);
if (sec != 0x5A)
- {
- grub_free(dev);
- return 0;
- }
+ return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "no device connected");
/* The above test may detect a second (slave) device
connected to a SATA controller which supports only one
ATAPI commands (RESET, DIAGNOSTIC) may clear this bit. */
/* Use the IDENTIFY DEVICE command to query the device. */
- if (grub_ata_identify (dev))
- {
- grub_free (dev);
- return 0;
- }
+ return grub_ata_identify (dev);
+}
+
+static grub_err_t
+grub_ata_device_initialize (int port, int device, int addr, int addr2)
+{
+ struct grub_ata_device *dev;
+ struct grub_ata_device **devp;
+ grub_err_t err;
+
+ grub_dprintf ("ata", "detecting device %d,%d (0x%x, 0x%x)\n",
+ port, device, addr, addr2);
+
+ dev = grub_malloc (sizeof(*dev));
+ if (! dev)
+ return grub_errno;
+
+ /* Setup the device information. */
+ dev->port = port;
+ dev->device = device;
+ dev->ioaddress = addr + GRUB_MACHINE_PCI_IO_BASE;
+ dev->ioaddress2 = addr2 + GRUB_MACHINE_PCI_IO_BASE;
+ dev->next = NULL;
/* Register the device. */
for (devp = &grub_ata_devices; *devp; devp = &(*devp)->next);
*devp = dev;
+ err = check_device (dev);
+ if (err)
+ grub_print_error ();
+
return 0;
}
for (dev = grub_ata_devices; dev; dev = dev->next)
{
char devname[10];
+ grub_err_t err;
+
+ err = check_device (dev);
+ if (err)
+ {
+ grub_errno = GRUB_ERR_NONE;
+ continue;
+ }
if (dev->atapi)
continue;
grub_ata_open (const char *name, grub_disk_t disk)
{
struct grub_ata_device *dev;
+ grub_err_t err;
for (dev = grub_ata_devices; dev; dev = dev->next)
{
if (dev->atapi)
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "not an ATA harddisk");
+ err = check_device (dev);
+
+ if (err)
+ return err;
+
disk->total_sectors = dev->size;
disk->id = (unsigned long) dev;
for (dev = grub_ata_devices; dev; dev = dev->next)
{
char devname[10];
+
+ grub_err_t err;
+
+ err = check_device (dev);
+ if (err)
+ {
+ grub_errno = GRUB_ERR_NONE;
+ continue;
+ }
+
grub_snprintf (devname, sizeof (devname),
"ata%d", dev->port * 2 + dev->device);
{
struct grub_ata_device *dev;
struct grub_ata_device *devfnd = 0;
+ grub_err_t err;
for (dev = grub_ata_devices; dev; dev = dev->next)
{
if (! devfnd)
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "no such ATAPI device");
+ err = check_device (devfnd);
+ if (err)
+ return err;
+
+ if (! devfnd->atapi)
+ return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "no such ATAPI device");
+
scsi->data = devfnd;
return GRUB_ERR_NONE;