fixed two race conditions with motor power-off; now handles disk change detection and no-disk-in-drive correctly

svn path=/trunk/; revision=8679
This commit is contained in:
Vizzini 2004-03-13 07:04:54 +00:00
parent 2207df1ae4
commit 007814383b

View file

@ -115,14 +115,16 @@ VOID NTAPI StartMotor(PDRIVE_INFO DriveInfo)
KdPrint(("floppy: StartMotor called\n"));
if(DriveInfo->ControllerInfo->StopDpcQueued &&
!KeCancelTimer(&DriveInfo->ControllerInfo->MotorTimer))
if(DriveInfo->ControllerInfo->StopDpcQueued && !KeCancelTimer(&DriveInfo->ControllerInfo->MotorTimer))
{
/* Motor turner-offer is already running; wait for it to finish */
KdPrint(("floppy: StartMotor: motor turner-offer is already running; waiting for it\n"));
KeWaitForSingleObject(&DriveInfo->ControllerInfo->MotorStoppedEvent, Executive, KernelMode, FALSE, NULL);
DriveInfo->ControllerInfo->StopDpcQueued = FALSE;
KdPrint(("floppy: StartMotor: wait satisfied\n"));
}
DriveInfo->ControllerInfo->StopDpcQueued = FALSE;
if(HwTurnOnMotor(DriveInfo) != STATUS_SUCCESS)
KdPrint(("floppy: StartMotor(): warning: HwTurnOnMotor failed\n"));
}
@ -768,7 +770,7 @@ static NTSTATUS NTAPI InitController(PCONTROLLER_INFO ControllerInfo)
/* Init the stop stuff */
KeInitializeDpc(&ControllerInfo->MotorStopDpc, MotorStopDpcFunc, ControllerInfo);
KeInitializeTimer(&ControllerInfo->MotorTimer);
KeInitializeEvent(&ControllerInfo->MotorStoppedEvent, SynchronizationEvent, FALSE);
KeInitializeEvent(&ControllerInfo->MotorStoppedEvent, NotificationEvent, FALSE);
ControllerInfo->StopDpcQueued = FALSE;
/*