grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] Enable writing to ATA devices, fix several bugs


From: Pavel Roskin
Subject: [PATCH] Enable writing to ATA devices, fix several bugs
Date: Wed, 02 Jul 2008 20:17:16 -0400
User-agent: StGIT/0.14.3.163.g06f9

We have save_env now, so we can use the write capability.  This also
fixes the last compiler warning in GRUB.

Sorry, Marco, please ignore the previous message, as it didn't get to
the list.

ChangeLog:

        * 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.
---

 disk/ata.c |   19 +++++++++++--------
 1 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/disk/ata.c b/disk/ata.c
index 02c4b06..c9b0498 100644
--- a/disk/ata.c
+++ b/disk/ata.c
@@ -187,6 +187,9 @@ grub_ata_pio_write (struct grub_ata_device *dev, char *buf,
   grub_uint16_t *buf16 = (grub_uint16_t *) buf;
   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.  */
   grub_ata_wait_drq (dev);
 
@@ -562,10 +565,9 @@ grub_ata_readwrite (grub_disk_t disk, grub_disk_addr_t 
sector,
       /* Write sectors.  */
       grub_ata_regset (dev, GRUB_ATA_REG_CMD, cmd_write);
       grub_ata_wait ();
-      for (sect = 0; sect < batch; sect++)
+      for (sect = 0; sect < (size % batch); sect++)
        {
-         if (grub_ata_pio_write (dev, buf,
-                                 (size % batch) * GRUB_DISK_SECTOR_SIZE))
+         if (grub_ata_pio_write (dev, buf, GRUB_DISK_SECTOR_SIZE))
            return grub_error (GRUB_ERR_WRITE_ERROR, "ATA write error");
          buf += GRUB_DISK_SECTOR_SIZE;
        }
@@ -705,11 +707,12 @@ grub_ata_write (grub_disk_t disk,
                grub_size_t size,
                const char *buf)
 {
-#if 1
-  return GRUB_ERR_NOT_IMPLEMENTED_YET;
-#else
-  return grub_ata_readwrite (disk, sector, size, (char *) buf, 1);
-#endif
+  struct grub_ata_device *dev = (struct grub_ata_device *) disk->data;
+
+  if (! dev->atapi)
+    return grub_ata_readwrite (disk, sector, size, (char *) buf, 1);
+
+  return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, "ATAPI write not 
supported");
 }
 
 static struct grub_disk_dev grub_atadisk_dev =




reply via email to

[Prev in Thread] Current Thread [Next in Thread]