From a86fdbe9713b75ad1d9b3b8bcbfb88f87c000ea2 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Thu, 8 Sep 2011 08:20:51 +0800 Subject: [PATCH] Modules/ATA - Hack/fix for x86-64 ATA - If ATA times out, but an interrupt is on the queue, an error is printed but the data is returned. --- Modules/Storage/ATA/io.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Modules/Storage/ATA/io.c b/Modules/Storage/ATA/io.c index de6bf96b..b1342c64 100644 --- a/Modules/Storage/ATA/io.c +++ b/Modules/Storage/ATA/io.c @@ -4,7 +4,7 @@ * * Disk Input/Output control */ -#define DEBUG 0 +#define DEBUG 1 #include #include // Needed for error codes #include @@ -378,8 +378,16 @@ int ATA_ReadDMA(Uint8 Disk, Uint64 Address, Uint Count, void *Buffer) LOG("Status byte = 0x%02x, Controller Status = 0x%02x", val, ATA_int_BusMasterReadByte(cont * 8 + 2)); - if( gaATA_IRQs[cont] == 0 ) { - + if( gaATA_IRQs[cont] == 0 ) + { + if( ATA_int_BusMasterReadByte(cont * 8 + 2) & 0x4 ) { + Log_Error("ATA", "BM Status reports an interrupt, but none recieved"); + ATA_int_BusMasterWriteByte(cont*8 + 2, 4); // Clear interrupt + memcpy( Buffer, gATA_Buffers[cont], Count*SECTOR_SIZE ); + Mutex_Release( &glaATA_ControllerLock[ cont ] ); + LEAVE_RET('i', 0); + } + #if 1 Debug_HexDump("ATA", Buffer, 512); #endif -- 2.20.1