ATA 48bit LBA should only be activated on read/write commands.
authorKevin O'Connor <kevin@koconnor.net>
Sun, 13 Dec 2009 17:02:55 +0000 (12:02 -0500)
committerKevin O'Connor <kevin@koconnor.net>
Sun, 13 Dec 2009 17:02:55 +0000 (12:02 -0500)
Check explicitly for an extended read/write command instead of 0x04
    bit set.  The identify command has that bit set, but doesn't need
    the 48bit lba registers set.

src/ata.c
src/ata.h

index 6c2fc989ca8c0ab40f4d0ae129c56e095e1d6dea..d87072df91b52a03cd9ac4b06380c49d9cb4aa9f 100644 (file)
--- a/src/ata.c
+++ b/src/ata.c
@@ -209,7 +209,8 @@ send_cmd(struct drive_s *drive_g, struct ata_pio_command *cmd)
             return status;
     }
 
-    if (cmd->command & 0x04) {
+    if (cmd->command == ATA_CMD_READ_SECTORS_EXT
+        || cmd->command == ATA_CMD_WRITE_SECTORS_EXT) {
         outb(0x00, iobase1 + ATA_CB_FR);
         outb(cmd->sector_count2, iobase1 + ATA_CB_SC);
         outb(cmd->lba_low2, iobase1 + ATA_CB_SN);
index f8d86aa8e7f99a3a72fa4017e214a7b04bd05b9c..d0a2f8bbaae4b7015daccf358a9c075e590b8af8 100644 (file)
--- a/src/ata.h
+++ b/src/ata.h
@@ -112,6 +112,7 @@ void describe_atapi(struct drive_s *drive_g);
 #define ATA_CMD_READ_DMA_QUEUED              0xC7
 #define ATA_CMD_READ_MULTIPLE                0xC4
 #define ATA_CMD_READ_SECTORS                 0x20
+#define ATA_CMD_READ_SECTORS_EXT             0x24
 #define ATA_CMD_READ_VERIFY_SECTORS          0x40
 #define ATA_CMD_RECALIBRATE                  0x10
 #define ATA_CMD_REQUEST_SENSE                0x03
@@ -129,6 +130,7 @@ void describe_atapi(struct drive_s *drive_g);
 #define ATA_CMD_WRITE_DMA_QUEUED             0xCC
 #define ATA_CMD_WRITE_MULTIPLE               0xC5
 #define ATA_CMD_WRITE_SECTORS                0x30
+#define ATA_CMD_WRITE_SECTORS_EXT            0x34
 #define ATA_CMD_WRITE_VERIFY                 0x3C
 
 #endif // ata.h