Misc - Cleaning up logging output
[tpg/acess2.git] / Modules / Storage / ATA / io.c
index 73c33b2..b8a15d0 100644 (file)
@@ -79,8 +79,8 @@ Uint16        ATA_GetBasePort(int Disk);
  int   ATA_ReadDMA(Uint8 Disk, Uint64 Address, Uint Count, void *Buffer);
  int   ATA_WriteDMA(Uint8 Disk, Uint64 Address, Uint Count, const void *Buffer);
 // IRQs
-void   ATA_IRQHandlerPri(int UNUSED(IRQ));
-void   ATA_IRQHandlerSec(int UNUSED(IRQ));
+void   ATA_IRQHandlerPri(int UNUSED(IRQ), void *UNUSED(Ptr));
+void   ATA_IRQHandlerSec(int UNUSED(IRQ), void *UNUSED(Ptr));
 // Controller IO
 Uint8  ATA_int_BusMasterReadByte(int Ofs);
 Uint32 ATA_int_BusMasterReadDWord(int Ofs);
@@ -117,9 +117,9 @@ int ATA_SetupIO(void)
        ENTER("");
 
        // Get IDE Controller's PCI Entry
-       ent = PCI_GetDeviceByClass(0x0101, 0xFFFF, -1);
+       ent = PCI_GetDeviceByClass(0x010100, 0xFFFF00, -1);
        LOG("ent = %i", ent);
-       gATA_BusMasterBase = PCI_GetBAR4( ent );
+       gATA_BusMasterBase = PCI_GetBAR(ent, 4);
        if( gATA_BusMasterBase == 0 ) {
                Log_Warning("ATA", "It seems that there is no Bus Master Controller on this machine. Get one");
                // TODO: Use PIO mode instead
@@ -127,8 +127,8 @@ int ATA_SetupIO(void)
                return MODULE_ERR_NOTNEEDED;
        }
        
-       LOG("BAR5 = 0x%x", PCI_GetBAR5( ent ));
-       LOG("IRQ = %i", PCI_GetIRQ( ent ));
+       LOG("BAR5 = 0x%x", PCI_GetBAR(ent, 5));
+       LOG("IRQ = %i", PCI_GetIRQ(ent));
        
        // Map memory
        if( !(gATA_BusMasterBase & 1) )
@@ -141,12 +141,12 @@ int ATA_SetupIO(void)
        }
        else {
                // Bit 0 is left set as a flag to other functions
-               LOG("gATA_BusMasterBase = 0x%x", gATA_BusMasterBase & ~1);
+               LOG("gATA_BusMasterBase = IO 0x%x", gATA_BusMasterBase & ~1);
        }
 
        // Register IRQs and get Buffers
-       IRQ_AddHandler( gATA_IRQPri, ATA_IRQHandlerPri );
-       IRQ_AddHandler( gATA_IRQSec, ATA_IRQHandlerSec );
+       IRQ_AddHandler( gATA_IRQPri, ATA_IRQHandlerPri, NULL );
+       IRQ_AddHandler( gATA_IRQSec, ATA_IRQHandlerSec, NULL );
 
        gATA_PRDTs[0].PBufAddr = MM_GetPhysAddr( (tVAddr)&gATA_Buffers[0] );
        gATA_PRDTs[1].PBufAddr = MM_GetPhysAddr( (tVAddr)&gATA_Buffers[1] );
@@ -164,6 +164,8 @@ int ATA_SetupIO(void)
        // Enable controllers
        outb(IDE_PRI_BASE+1, 1);
        outb(IDE_SEC_BASE+1, 1);
+       outb(IDE_PRI_CTRL, 0);
+       outb(IDE_SEC_CTRL, 0);
        
        // Make sure interrupts are ACKed
        ATA_int_BusMasterWriteByte(2, 0x4);
@@ -283,7 +285,6 @@ int ATA_ReadDMA(Uint8 Disk, Uint64 Address, Uint Count, void *Buffer)
         int    disk = Disk & 1;
        Uint16  base;
        Sint64  timeoutTime;
-       Uint8   val;
 
        ENTER("iDisk XAddress iCount pBuffer", Disk, Address, Count, Buffer);
 
@@ -314,14 +315,14 @@ int ATA_ReadDMA(Uint8 Disk, Uint64 Address, Uint Count, void *Buffer)
 
        #if 1
        if( cont == 0 ) {
-               outb(base+IDE_PRI_CTRL, 4);
+               outb(IDE_PRI_CTRL, 4);
                IO_DELAY();
-               outb(base+IDE_PRI_CTRL, 0);
+               outb(IDE_PRI_CTRL, 0);
        }
        else {
-               outb(base+IDE_SEC_CTRL, 4);
+               outb(IDE_SEC_CTRL, 4);
                IO_DELAY();
-               outb(base+IDE_SEC_CTRL, 0);
+               outb(IDE_SEC_CTRL, 0);
        }
        #endif
 
@@ -353,7 +354,8 @@ int ATA_ReadDMA(Uint8 Disk, Uint64 Address, Uint Count, void *Buffer)
        
        // HACK: Ensure the PRDT is reset
        ATA_int_BusMasterWriteDWord(cont*8+4, gaATA_PRDT_PAddrs[cont]);
-               
+       ATA_int_BusMasterWriteByte(cont*8, 4);  // Reset IRQ
+       
        LOG("gATA_PRDTs[%i].Bytes = %i", cont, gATA_PRDTs[cont].Bytes);
        if( Address > 0x0FFFFFFF )
                outb(base+0x07, HDD_DMA_R48);   // Read Command (LBA48)
@@ -373,12 +375,27 @@ int ATA_ReadDMA(Uint8 Disk, Uint64 Address, Uint Count, void *Buffer)
        // Complete Transfer
        ATA_int_BusMasterWriteByte( cont * 8, 8 );      // Read and stop
 
-       val = inb(base+0x7);
-       LOG("Status byte = 0x%02x, Controller Status = 0x%02x",
-               val, ATA_int_BusMasterReadByte(cont * 8 + 2));
+       #if DEBUG
+       {
+               Uint8   val = inb(base+0x7);
+               LOG("Status byte = 0x%02x, Controller Status = 0x%02x",
+                       val, ATA_int_BusMasterReadByte(cont * 8 + 2));
+       }
+       #else
+       inb(base+0x7);
+       #endif
+
+       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('i', 0);
+                       return 0;
+               }
 
-       if( gaATA_IRQs[cont] == 0 ) {
-               
                #if 1
                Debug_HexDump("ATA", Buffer, 512);
                #endif
@@ -491,7 +508,7 @@ int ATA_WriteDMA(Uint8 Disk, Uint64 Address, Uint Count, const void *Buffer)
 /**
  * \brief Primary ATA Channel IRQ handler
  */
-void ATA_IRQHandlerPri(int UNUSED(IRQ))
+void ATA_IRQHandlerPri(int UNUSED(IRQ), void *UNUSED(Ptr))
 {
        Uint8   val;
 
@@ -509,7 +526,7 @@ void ATA_IRQHandlerPri(int UNUSED(IRQ))
 /**
  * \brief Second ATA Channel IRQ handler
  */
-void ATA_IRQHandlerSec(int UNUSED(IRQ))
+void ATA_IRQHandlerSec(int UNUSED(IRQ), void *UNUSED(Ptr))
 {
        Uint8   val;
        // IRQ bit set for Secondary Controller

UCC git Repository :: git.ucc.asn.au