Issue SPECIFY command upon initialization.

svn path=/trunk/; revision=6529
This commit is contained in:
Eric Kohl 2003-11-04 23:30:59 +00:00
parent f1259f48fe
commit 3911ce2391
3 changed files with 61 additions and 42 deletions

View 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 )

View 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))

View 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;
}