+2013-11-03 Vladimir Serbinenko <phcoder@gmail.com>
+
+ * grub-core/disk/ahci.c (grub_ahci_pciinit): Detect ATAPI devices.
+ * grub-core/disk/ata.c (grub_ata_identify): Use atapi_identify if
+ device is known to be ATAPI.
+
2013-11-03 Mike Frysinger <vapier>
* configure.ac: Don't add target-prefix.
volatile struct grub_ahci_cmd_table *command_table;
struct grub_pci_dma_chunk *rfis;
int present;
+ int atapi;
};
static grub_err_t
grub_dma_free (failed_adevs[i]->rfis);
}
+ for (i = 0; i < nports; i++)
+ if (adevs[i] && (adevs[i]->hba->ports[adevs[i]->port].sig >> 16) == 0xeb14)
+ adevs[i]->atapi = 1;
+
for (i = 0; i < nports; i++)
if (adevs[i])
{
ata->data = dev;
ata->dma = 1;
+ ata->atapi = dev->atapi;
ata->maxbuffer = GRUB_AHCI_PRDT_MAX_CHUNK_LENGTH;
ata->present = &dev->present;
grub_uint16_t *info16;
grub_err_t err;
+ if (dev->atapi)
+ return grub_atapi_identify (dev);
+
info64 = grub_malloc (GRUB_DISK_SECTOR_SIZE);
info32 = (grub_uint32_t *) info64;
info16 = (grub_uint16_t *) info64;
grub_free (info16);
grub_errno = GRUB_ERR_NONE;
if ((sts & (GRUB_ATA_STATUS_BUSY | GRUB_ATA_STATUS_DRQ
- | GRUB_ATA_STATUS_ERR)) == GRUB_ATA_STATUS_ERR
+ | GRUB_ATA_STATUS_ERR)) == GRUB_ATA_STATUS_ERR
&& (parms.taskfile.error & 0x04 /* ABRT */))
/* Device without ATA IDENTIFY, try ATAPI. */
return grub_atapi_identify (dev);
struct grub_ata *ata;
grub_ata_dev_t p;
- ata = grub_malloc (sizeof (*ata));
+ ata = grub_zalloc (sizeof (*ata));
if (!ata)
return NULL;
for (p = grub_ata_dev_list; p; p = p->next)