More MP work (now APs start and use the LAPIC timer)
[tpg/acess2.git] / Modules / Storage / FDD / fdd.c
index 6ad2b1a..cc75bfc 100644 (file)
@@ -105,9 +105,9 @@ void        FDD_int_SendByte(int base, char byte);
 void   FDD_Reset(int id);
 void   FDD_Recalibrate(int disk);
  int   FDD_int_SeekTrack(int disk, int head, int track);
-void   FDD_int_TimerCallback(int arg);
-void   FDD_int_StopMotor(int disk);
-void   FDD_int_StartMotor(int disk);
+void   FDD_int_TimerCallback(void *Arg);
+void   FDD_int_StopMotor(void *Arg);
+void   FDD_int_StartMotor(int Disk);
  int   FDD_int_GetDims(int type, int lba, int *c, int *h, int *s, int *spt);
 
 // === GLOBALS ===
@@ -136,6 +136,7 @@ tDevFS_Driver       gFDD_DriverInfo = {
 int FDD_Install(char **Arguments)
 {
        Uint8 data;
+       char    **args = Arguments;
        
        // Determine Floppy Types (From CMOS)
        outb(0x70, 0x10);
@@ -145,6 +146,14 @@ int FDD_Install(char **Arguments)
        gFDD_Devices[0].track[0] = -1;
        gFDD_Devices[1].track[1] = -1;
        
+       if(args) {
+               for(;*args;args++)
+               {
+                       if(strcmp(*args, "disable")==0)
+                               return MODULE_ERR_NOTNEEDED;
+               }
+       }
+       
        Log_Log("FDD", "Detected Disk 0: %s and Disk 1: %s", cFDD_TYPES[data>>4], cFDD_TYPES[data&0xF]);
        
        if( data == 0 ) {
@@ -208,7 +217,7 @@ void FDD_UnloadModule()
        LOCK(&glFDD);
        for(i=0;i<4;i++) {
                Time_RemoveTimer(gFDD_Devices[i].timer);
-               FDD_int_StopMotor(i);
+               FDD_int_StopMotor((void *)(Uint)i);
        }
        RELEASE(&glFDD);
        //IRQ_Clear(6);
@@ -726,7 +735,7 @@ void FDD_Recalibrate(int disk)
        FDD_SensInt(cPORTBASE[disk>>1], NULL, NULL);
        
        LOG("Stopping Motor");
-       FDD_int_StopMotor(disk);
+       gFDD_Devices[disk].timer = Time_CreateTimer(MOTOR_OFF_DELAY, FDD_int_StopMotor, (void*)(Uint)disk);
        LEAVE('-');
 }
 
@@ -766,13 +775,14 @@ void FDD_Reset(int id)
  * \fn void FDD_int_TimerCallback()
  * \brief Called by timer
  */
-void FDD_int_TimerCallback(int arg)
+void FDD_int_TimerCallback(void *Arg)
 {
-       ENTER("iarg", arg);
-       if(gFDD_Devices[arg].motorState == 1)
-               gFDD_Devices[arg].motorState = 2;
-       Time_RemoveTimer(gFDD_Devices[arg].timer);
-       gFDD_Devices[arg].timer = -1;
+        int    disk = (Uint)Arg;
+       ENTER("iarg", disk);
+       if(gFDD_Devices[disk].motorState == 1)
+               gFDD_Devices[disk].motorState = 2;
+       Time_RemoveTimer(gFDD_Devices[disk].timer);
+       gFDD_Devices[disk].timer = -1;
        LEAVE('-');
 }
 
@@ -787,16 +797,16 @@ void FDD_int_StartMotor(int disk)
        state |= 1 << (4+disk);
        outb( cPORTBASE[ disk>>1 ] + PORT_DIGOUTPUT, state );
        gFDD_Devices[disk].motorState = 1;
-       gFDD_Devices[disk].timer = Time_CreateTimer(MOTOR_ON_DELAY, FDD_int_TimerCallback, (void*)(tVAddr)disk);
+       gFDD_Devices[disk].timer = Time_CreateTimer(MOTOR_ON_DELAY, FDD_int_TimerCallback, (void*)(Uint)disk);
 }
 
 /**
  * \fn void FDD_int_StopMotor(int disk)
  * \brief Stops FDD Motor
  */
-void FDD_int_StopMotor(int disk)
+void FDD_int_StopMotor(void *Arg)
 {
-       Uint8   state;
+       Uint8   state, disk = (Uint)Arg;
        if( IS_LOCKED(&glFDD) ) return ;
        ENTER("iDisk", disk);
        

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