2008-07-03 Pavel Roskin <proski@gnu.org>

* disk/ata.c (grub_ata_pio_write): Check status before writing,
	like we do in grub_ata_pio_read().
	(grub_ata_readwrite): Always write individual sectors.  Fix the
	sector count for the remainder.
	(grub_ata_write): Enable writing to ATA devices.  Correctly
	report error for ATAPI devices.
This commit is contained in:
proski 2008-07-03 20:53:00 +00:00
parent d937087388
commit 277d0de997
2 changed files with 20 additions and 8 deletions

View file

@ -1,3 +1,12 @@
2008-07-03 Pavel Roskin <proski@gnu.org>
* disk/ata.c (grub_ata_pio_write): Check status before writing,
like we do in grub_ata_pio_read().
(grub_ata_readwrite): Always write individual sectors. Fix the
sector count for the remainder.
(grub_ata_write): Enable writing to ATA devices. Correctly
report error for ATAPI devices.
2008-07-02 Pavel Roskin <proski@gnu.org> 2008-07-02 Pavel Roskin <proski@gnu.org>
* boot/i386/pc/cdboot.S: Add _start entry to fix a linker * boot/i386/pc/cdboot.S: Add _start entry to fix a linker

View file

@ -187,6 +187,9 @@ grub_ata_pio_write (struct grub_ata_device *dev, char *buf,
grub_uint16_t *buf16 = (grub_uint16_t *) buf; grub_uint16_t *buf16 = (grub_uint16_t *) buf;
unsigned int i; unsigned int i;
if (grub_ata_regget (dev, GRUB_ATA_REG_STATUS) & 1)
return grub_ata_regget (dev, GRUB_ATA_REG_ERROR);
/* Wait until the device is ready to write. */ /* Wait until the device is ready to write. */
grub_ata_wait_drq (dev); grub_ata_wait_drq (dev);
@ -562,10 +565,9 @@ grub_ata_readwrite (grub_disk_t disk, grub_disk_addr_t sector,
/* Write sectors. */ /* Write sectors. */
grub_ata_regset (dev, GRUB_ATA_REG_CMD, cmd_write); grub_ata_regset (dev, GRUB_ATA_REG_CMD, cmd_write);
grub_ata_wait (); grub_ata_wait ();
for (sect = 0; sect < batch; sect++) for (sect = 0; sect < (size % batch); sect++)
{ {
if (grub_ata_pio_write (dev, buf, if (grub_ata_pio_write (dev, buf, GRUB_DISK_SECTOR_SIZE))
(size % batch) * GRUB_DISK_SECTOR_SIZE))
return grub_error (GRUB_ERR_WRITE_ERROR, "ATA write error"); return grub_error (GRUB_ERR_WRITE_ERROR, "ATA write error");
buf += GRUB_DISK_SECTOR_SIZE; buf += GRUB_DISK_SECTOR_SIZE;
} }
@ -705,11 +707,12 @@ grub_ata_write (grub_disk_t disk,
grub_size_t size, grub_size_t size,
const char *buf) const char *buf)
{ {
#if 1 struct grub_ata_device *dev = (struct grub_ata_device *) disk->data;
return GRUB_ERR_NOT_IMPLEMENTED_YET;
#else if (! dev->atapi)
return grub_ata_readwrite (disk, sector, size, (char *) buf, 1); return grub_ata_readwrite (disk, sector, size, (char *) buf, 1);
#endif
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, "ATAPI write not supported");
} }
static struct grub_disk_dev grub_atadisk_dev = static struct grub_disk_dev grub_atadisk_dev =