if (addressing == GRUB_ATA_LBA48 && ((sector + size) >> 28) != 0)
{
batch = 65536;
- cmd = GRUB_ATA_CMD_READ_SECTORS_EXT;
- cmd_write = GRUB_ATA_CMD_WRITE_SECTORS_EXT;
+ if (ata->dma)
+ {
+ cmd = GRUB_ATA_CMD_READ_SECTORS_DMA_EXT;
+ cmd_write = GRUB_ATA_CMD_WRITE_SECTORS_DMA_EXT;
+ }
+ else
+ {
+ cmd = GRUB_ATA_CMD_READ_SECTORS_EXT;
+ cmd_write = GRUB_ATA_CMD_WRITE_SECTORS_EXT;
+ }
}
else
{
batch = 256;
else
batch = 1;
- cmd = GRUB_ATA_CMD_READ_SECTORS;
- cmd_write = GRUB_ATA_CMD_WRITE_SECTORS;
- }
+ if (ata->dma)
+ {
+ cmd = GRUB_ATA_CMD_READ_SECTORS_DMA;
+ cmd_write = GRUB_ATA_CMD_WRITE_SECTORS_DMA;
+ }
+ else
+ {
+ cmd = GRUB_ATA_CMD_READ_SECTORS;
+ cmd_write = GRUB_ATA_CMD_WRITE_SECTORS;
+ }
+ }
grub_size_t nsectors = 0;
while (nsectors < size)
parms.taskfile.cmd = (! rw ? cmd : cmd_write);
parms.buffer = buf;
parms.size = batch * GRUB_DISK_SECTOR_SIZE;
+ if (ata->dma)
+ parms.dma = 1;
err = ata->dev->readwrite (ata, &parms);
if (err)
GRUB_ATA_CMD_PACKET = 0xa0,
GRUB_ATA_CMD_READ_SECTORS = 0x20,
GRUB_ATA_CMD_READ_SECTORS_EXT = 0x24,
+ GRUB_ATA_CMD_READ_SECTORS_DMA = 0xc8,
+ GRUB_ATA_CMD_READ_SECTORS_DMA_EXT = 0x25,
+
GRUB_ATA_CMD_SECURITY_FREEZE_LOCK = 0xf5,
GRUB_ATA_CMD_SET_FEATURES = 0xef,
GRUB_ATA_CMD_SLEEP = 0xe6,
GRUB_ATA_CMD_STANDBY_IMMEDIATE = 0xe0,
GRUB_ATA_CMD_WRITE_SECTORS = 0x30,
GRUB_ATA_CMD_WRITE_SECTORS_EXT = 0x34,
+ GRUB_ATA_CMD_WRITE_SECTORS_DMA_EXT = 0x35,
+ GRUB_ATA_CMD_WRITE_SECTORS_DMA = 0xca,
};
enum grub_ata_timeout_milliseconds
int write;
void *cmd;
int cmdsize;
+ int dma;
};
struct grub_ata
/* Set to 0 for ATA, set to 1 for ATAPI. */
int atapi;
+ int dma;
+
void *data;
struct grub_ata_dev *dev;