Fix error handling in ATA PIO
diff --git a/include/kernel/dri/ata_pio/ata_pio.h b/include/kernel/dri/ata_pio/ata_pio.h
index 667ed3b..2fd8623 100644
--- a/include/kernel/dri/ata_pio/ata_pio.h
+++ b/include/kernel/dri/ata_pio/ata_pio.h
@@ -35,9 +35,12 @@
// Commands
enum
{
- ATA_CMD_READ = 0x20,
- ATA_CMD_WRITE = 0x30,
+ /// Do not retry
+ ATA_CMD_READ = 0x21,
+ /// Do not retry
+ ATA_CMD_WRITE = 0x31,
ATA_CMD_IDENTIFY = 0xec,
+ ATA_CMD_FLUSH_CACHE = 0xe7,
};
void ata_pio_wait_bsy();
@@ -48,4 +51,4 @@
void test_ata_pio();
-void init_ata_pio();
\ No newline at end of file
+void init_ata_pio();
diff --git a/src/kernel/dri/ata_pio/ata_pio.c b/src/kernel/dri/ata_pio/ata_pio.c
index cd426ef..54db487 100644
--- a/src/kernel/dri/ata_pio/ata_pio.c
+++ b/src/kernel/dri/ata_pio/ata_pio.c
@@ -39,17 +39,27 @@
void ata_pio_read_sectors(void *buffer, uint lba, uchar num_sectors)
{
- ata_pio_wait_bsy();
+ ushort *word_buffer = buffer;
+ ata_pio_wait_bsy();
ata_pio_send_init(lba, num_sectors);
outb(ATA_PORT_CMD, ATA_CMD_READ);
ata_pio_wait_bsy();
+
+ if (inb(ATA_PORT_CMD) & ATA_ERR)
+ {
+ kprintf(ERROR "ATA_ERR on read\n");
+ kpanic("Failed to read");
+ }
- asm volatile("rep insw" ::"c"(num_sectors * 256), "d"(ATA_PORT_DATA),
- "D"(buffer));
+ for (int i = 0; i < num_sectors * 256; i++)
+ {
+ word_buffer[i] = inw(ATA_PORT_DATA);
+ }
ata_pio_wait_bsy();
+ outw(ATA_PORT_CMD, ATA_CMD_FLUSH_CACHE);
}
void ata_pio_write_sectors(uint lba, uchar num_sectors, ushort *buffer)
@@ -65,6 +75,9 @@
{
outw(ATA_PORT_DATA, buffer[i]);
}
+
+ ata_pio_wait_bsy();
+ outw(ATA_PORT_CMD, ATA_CMD_FLUSH_CACHE);
}
static void print_buffer()