diff --git a/reactos/drivers/dd/floppy/floppy.c b/reactos/drivers/dd/floppy/floppy.c index d191972f0fc..b6b5f45ce6a 100644 --- a/reactos/drivers/dd/floppy/floppy.c +++ b/reactos/drivers/dd/floppy/floppy.c @@ -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 ) diff --git a/reactos/drivers/dd/floppy/floppy.h b/reactos/drivers/dd/floppy/floppy.h index b882d881693..165e8b5d685 100644 --- a/reactos/drivers/dd/floppy/floppy.h +++ b/reactos/drivers/dd/floppy/floppy.h @@ -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)) diff --git a/reactos/drivers/dd/floppy/isr.c b/reactos/drivers/dd/floppy/isr.c index 0a3fdba1e02..22de14e4c0d 100644 --- a/reactos/drivers/dd/floppy/isr.c +++ b/reactos/drivers/dd/floppy/isr.c @@ -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; }