Issue SPECIFY command upon initialization.
authorEric Kohl <eric.kohl@reactos.org>
Tue, 4 Nov 2003 23:30:59 +0000 (23:30 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Tue, 4 Nov 2003 23:30:59 +0000 (23:30 +0000)
svn path=/trunk/; revision=6529

reactos/drivers/dd/floppy/floppy.c
reactos/drivers/dd/floppy/floppy.h
reactos/drivers/dd/floppy/isr.c

index d191972..b6b5f45 100644 (file)
@@ -185,6 +185,16 @@ FloppyCreateController(PDRIVER_OBJECT DriverObject,
    // point we should get the bios disk parameters passed in to the kernel at boot
    // and stored in the HARDWARE registry key for us to pick up here.
 
+   // Issue SPECIFY command
+   FloppyWriteDATA (ControllerExtension->PortBase, FLOPPY_CMD_SPEC_CHARS);
+   KeStallExecutionProcessor (100);
+   FloppyWriteDATA (ControllerExtension->PortBase, 0xD1);
+   KeStallExecutionProcessor (100);
+   FloppyWriteDATA (ControllerExtension->PortBase, 0x02);
+   KeStallExecutionProcessor (10000);
+   FloppyWriteMSTAT (ControllerExtension->PortBase, 0x00);
+
+
    // turn on motor, wait for spinup time, and recalibrate the drive
    FloppyWriteDOR( ControllerExtension->PortBase, FLOPPY_DRIVE0_ON );
    Timeout.QuadPart = FLOPPY_MOTOR_SPINUP_TIME;
@@ -292,15 +302,16 @@ FloppyExecuteReadWrite(PDEVICE_OBJECT DeviceObject,
    PFLOPPY_CONTROLLER_EXTENSION ControllerExtension = (PFLOPPY_CONTROLLER_EXTENSION)DeviceExtension->Controller->ControllerExtension;
    LARGE_INTEGER Timeout;
    BOOLEAN WriteToDevice;
-   DWORD Cyl, Sector, Head;
+   ULONG Cyl, Sector, Head;
    PIO_STACK_LOCATION Stk;
-   DWORD Length;
+   ULONG Length;
+
+   DPRINT( "FloppyExecuteReadWrite()\n" );
 
    ControllerExtension->Irp = Irp = (PIRP)Context;
    Stk = IoGetCurrentIrpStackLocation( Irp );
    ControllerExtension->Device = DeviceObject;
    Timeout.QuadPart = FLOPPY_MOTOR_SPINUP_TIME;
-   DPRINT( "FloppyExecuteReadWrite()\n" );
    CHECKPOINT;
    WriteToDevice = Stk->MajorFunction == IRP_MJ_WRITE ? TRUE : FALSE;
    // verify drive is spun up and selected
@@ -319,14 +330,15 @@ FloppyExecuteReadWrite(PDEVICE_OBJECT DeviceObject,
                       &ControllerExtension->MotorSpinupDpc );
         return KeepObject;
       }
-   else {
-     Timeout.QuadPart = FLOPPY_MOTOR_SPINDOWN_TIME;
-     // motor is already spinning, so reset the spindown timer
-     KeCancelTimer( &ControllerExtension->SpinupTimer );
-     KeSetTimer( &ControllerExtension->SpinupTimer,
-                Timeout,
-                &ControllerExtension->MotorSpindownDpc );
-   }
+   else
+      {
+        Timeout.QuadPart = FLOPPY_MOTOR_SPINDOWN_TIME;
+        // motor is already spinning, so reset the spindown timer
+        KeCancelTimer( &ControllerExtension->SpinupTimer );
+        KeSetTimer( &ControllerExtension->SpinupTimer,
+                    Timeout,
+                    &ControllerExtension->MotorSpindownDpc );
+      }
 #if 0
    /* Handle disk change, doesn't work correctly */
    if( FloppyReadDIR( ControllerExtension->PortBase ) & FLOPPY_DI_DSKCHNG )
index b882d88..165e8b5 100644 (file)
@@ -85,6 +85,7 @@
 //
 #define FloppyWriteDOR(A, V) (WRITE_PORT_UCHAR((PVOID)(A) + FLOPPY_REG_DOR, (V)))
 #define FloppyReadMSTAT(A) (READ_PORT_UCHAR((PVOID)(A) + FLOPPY_REG_MSTAT))
+#define FloppyWriteMSTAT(A, V) (WRITE_PORT_UCHAR((PVOID)(A) + FLOPPY_REG_MSTAT, (V)))
 #define FloppyReadDATA(A) (READ_PORT_UCHAR((PVOID)(A) + FLOPPY_REG_DATA))
 #define FloppyWriteDATA(A, V) (WRITE_PORT_UCHAR((PVOID)(A) + FLOPPY_REG_DATA, (V)))
 #define FloppyReadDIR(A) (READ_PORT_UCHAR((PVOID)(A) + FLOPPY_REG_DIR))
index 0a3fdba..22de14e 100644 (file)
@@ -49,6 +49,9 @@ BOOLEAN FloppyIsrDetectMedia( PCONTROLLER_OBJECT Controller )
 {
   PFLOPPY_CONTROLLER_EXTENSION ControllerExtension = (PFLOPPY_CONTROLLER_EXTENSION)Controller->ControllerExtension;
   BYTE SectorSize;
+
+  DPRINT("FloppyIsrDetectMedia() called\n");
+
   // media detect in progress, read ID command already issued
   // first, read result registers
   KeStallExecutionProcessor( 1000 );
@@ -74,47 +77,50 @@ BOOLEAN FloppyIsrDetectMedia( PCONTROLLER_OBJECT Controller )
                ControllerExtension->Irp,
                Controller );
   return TRUE;
-} 
-    
+}
+
 BOOLEAN FloppyIsrRecal( PCONTROLLER_OBJECT Controller )
 {
-   PFLOPPY_CONTROLLER_EXTENSION ControllerExtension = (PFLOPPY_CONTROLLER_EXTENSION)Controller->ControllerExtension;
-   // issue sense interrupt status, and read St0 and cyl
+  PFLOPPY_CONTROLLER_EXTENSION ControllerExtension = (PFLOPPY_CONTROLLER_EXTENSION)Controller->ControllerExtension;
+  // issue sense interrupt status, and read St0 and cyl
 
-   FloppyWriteDATA( ControllerExtension->PortBase, FLOPPY_CMD_SNS_INTR );
-   KeStallExecutionProcessor( 1000 );
-   ControllerExtension->St0 = FloppyReadDATA( ControllerExtension->PortBase );
-   KeStallExecutionProcessor( 1000 );
-   FloppyReadDATA( ControllerExtension->PortBase );  // ignore cyl number
-   if (FLOPPY_MS_DATARDYR ==
-       (FloppyReadMSTAT( ControllerExtension->PortBase ) & FLOPPY_MS_RDYMASK))
-      {
-        /* There's something still to be read (what is it???? only happens on some
-           controllers). Ignore it. */
-        (void) FloppyReadDATA( ControllerExtension->PortBase );
-      }
-   DPRINT( "Recal St0: %2x\n", ControllerExtension->St0 );
+  DPRINT("FloppyIsrRecal() called\n");
 
-   // If recalibrate worked, issue read ID for each media type untill one works
-   if( ControllerExtension->St0 != FLOPPY_ST0_SEEKGD )
-      {
+  FloppyWriteDATA( ControllerExtension->PortBase, FLOPPY_CMD_SNS_INTR );
+  KeStallExecutionProcessor( 1000 );
+  ControllerExtension->St0 = FloppyReadDATA( ControllerExtension->PortBase );
+  KeStallExecutionProcessor( 1000 );
+  FloppyReadDATA( ControllerExtension->PortBase );  // ignore cyl number
+  if (FLOPPY_MS_DATARDYR ==
+      (FloppyReadMSTAT( ControllerExtension->PortBase ) & FLOPPY_MS_RDYMASK))
+    {
+      /* There's something still to be read (what is it???? only happens on some
+         controllers). Ignore it. */
+      (void) FloppyReadDATA( ControllerExtension->PortBase );
+    }
+  DPRINT( "Recal St0: %2x\n", ControllerExtension->St0 );
+
+  // If recalibrate worked, issue read ID for each media type untill one works
+  if ( ControllerExtension->St0 != FLOPPY_ST0_SEEKGD )
+    {
         DPRINT( "Recalibrate failed, ST0 = %2x\n", ControllerExtension->St0 );
         // queue DPC to fail IRP
         ControllerExtension->DpcState = FloppyDpcFailIrp;
         IoRequestDpc( ControllerExtension->Device,
                       ControllerExtension->Irp,
                       Controller );
-      }
-   else {
-     // issue first read id, FloppyIsrDetectMedia will handle
-     DPRINT( "Recalibrate worked, issuing read ID mark command\n" );
-     ControllerExtension->IsrState = FloppyIsrDetectMedia;
-     KeStallExecutionProcessor( 1000 );
-     FloppyWriteDATA( ControllerExtension->PortBase, FLOPPY_CMD_RD_ID | FLOPPY_C0M_MFM );
-     KeStallExecutionProcessor( 1000 );
-     FloppyWriteDATA( ControllerExtension->PortBase, ((PFLOPPY_DEVICE_EXTENSION)ControllerExtension->Device->DeviceExtension)->DriveSelect );
-   }
-   
+    }
+  else
+    {
+      // issue first read id, FloppyIsrDetectMedia will handle
+      DPRINT( "Recalibrate worked, issuing read ID mark command\n" );
+      ControllerExtension->IsrState = FloppyIsrDetectMedia;
+      KeStallExecutionProcessor( 1000 );
+      FloppyWriteDATA( ControllerExtension->PortBase, FLOPPY_CMD_RD_ID | FLOPPY_C0M_MFM );
+      KeStallExecutionProcessor( 1000 );
+      FloppyWriteDATA( ControllerExtension->PortBase, ((PFLOPPY_DEVICE_EXTENSION)ControllerExtension->Device->DeviceExtension)->DriveSelect );
+    }
+
    return TRUE;
 }