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()