Multiple fixes
[tpg/acess2.git] / Modules / Storage / FDD / fdd.c
index 86cef01..793e76c 100644 (file)
@@ -107,7 +107,7 @@ void        FDD_int_StartMotor(int disk);
  int   FDD_int_GetDims(int type, int lba, int *c, int *h, int *s, int *spt);\r
 \r
 // === GLOBALS ===\r
-MODULE_DEFINE(0, FDD_VERSION, FDD, FDD_Install, NULL, NULL);\r
+MODULE_DEFINE(0, FDD_VERSION, FDD, FDD_Install, NULL, "ISADMA", NULL);\r
 t_floppyDevice gFDD_Devices[2];\r
 tSpinlock      glFDD;\r
 volatile int   gbFDD_IrqFired = 0;\r
@@ -143,6 +143,10 @@ int FDD_Install(char **Arguments)
        \r
        Log("[FDD ] Detected Disk 0: %s and Disk 1: %s", cFDD_TYPES[data>>4], cFDD_TYPES[data&0xF]);\r
        \r
+       if( data == 0 ) {\r
+               return MODULE_ERR_NOTNEEDED;\r
+       }\r
+       \r
        // Clear FDD IRQ Flag\r
        FDD_SensInt(0x3F0, NULL, NULL);\r
        // Install IRQ6 Handler\r
@@ -347,32 +351,12 @@ int FDD_ReadSector(Uint32 Disk, Uint64 SectorAddr, void *Buffer)
         int    i;\r
         int    lba = SectorAddr;\r
        \r
-       ENTER("iDisk XSectorAddr pBuffer", disk, SectorAddr, Buffer);\r
+       ENTER("iDisk XSectorAddr pBuffer", Disk, SectorAddr, Buffer);\r
        \r
-       #if USE_CACHE\r
-       FDD_AquireCacheSpinlock();\r
-       for( i = 0; i < siFDD_SectorCacheSize; i++ )\r
-       {\r
-               if(sFDD_SectorCache[i].timestamp == 0)  continue;\r
-               if( sFDD_SectorCache[i].disk == Disk\r
-                && sFDD_SectorCache[i].sector == lba)\r
-               {\r
-                       LOG("Found %i in cache %i", lba, i);\r
-                       memcpy(Buffer, sFDD_SectorCache[i].data, 512);\r
-                       sFDD_SectorCache[i].timestamp = now();\r
-                       FDD_FreeCacheSpinlock();\r
-                       LEAVE('i', 1);\r
-                       return 1;\r
-               }\r
-       }\r
-       LOG("Read %i from Disk", lba);\r
-       FDD_FreeCacheSpinlock();\r
-       #else\r
        if( IOCache_Read( gFDD_Devices[Disk].CacheHandle, SectorAddr, Buffer ) == 1 ) {\r
                LEAVE('i', 1);\r
                return 1;\r
        }\r
-       #endif\r
        \r
        base = cPORTBASE[Disk >> 1];\r
        \r
@@ -383,20 +367,20 @@ int FDD_ReadSector(Uint32 Disk, Uint64 SectorAddr, void *Buffer)
                LEAVE('i', -1);\r
                return -1;\r
        }\r
+       LOG("Cyl=%i, Head=%i, Sector=%i", cyl, head, sec);\r
        \r
-       // Remove Old Timer\r
-       Time_RemoveTimer(gFDD_Devices[Disk].timer);\r
-       // Check if Motor is on\r
-       if(gFDD_Devices[Disk].motorState == 0)  FDD_int_StartMotor(Disk);\r
+       LOCK(&glFDD);   // Lock to stop the motor stopping on us\r
+       Time_RemoveTimer(gFDD_Devices[Disk].timer);     // Remove Old Timer\r
+       // Start motor if needed\r
+       if(gFDD_Devices[Disk].motorState != 2)  FDD_int_StartMotor(Disk);\r
+       RELEASE(&glFDD);\r
        \r
        LOG("Wait for the motor to spin up");\r
        \r
        // Wait for spinup\r
        while(gFDD_Devices[Disk].motorState == 1)       Threads_Yield();\r
        \r
-       LOG("Cyl=%i, Head=%i, Sector=%i", cyl, head, sec);\r
        LOG("Acquire Spinlock");\r
-       \r
        LOCK(&glFDD);\r
        \r
        // Seek to track\r
@@ -717,8 +701,12 @@ void FDD_int_StartMotor(int disk)
 void FDD_int_StopMotor(int disk)\r
 {\r
        Uint8   state;\r
+       if( IS_LOCKED(&glFDD) ) return ;\r
+       ENTER("iDisk", disk);\r
+       \r
        state = inb( cPORTBASE[ disk>>1 ] + PORT_DIGOUTPUT );\r
        state &= ~( 1 << (4+disk) );\r
        outb( cPORTBASE[ disk>>1 ] + PORT_DIGOUTPUT, state );\r
     gFDD_Devices[disk].motorState = 0;\r
+    LEAVE('-');\r
 }\r

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