// 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;
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
&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 )
{
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 );
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;
}