1 /****************************************************************************
2 * Defered procedure calls for floppy disk driver, reactos project, created *
3 * by Phillip Susi on 2/25/2001. This software is published under the GNU *
4 * general public license, see the README file for more details *
5 ***************************************************************************/
15 PDEVICE_OBJECT DeviceObject,
19 PCONTROLLER_OBJECT Controller = (PCONTROLLER_OBJECT)Context;
20 PFLOPPY_CONTROLLER_EXTENSION ControllerExtension = (PFLOPPY_CONTROLLER_EXTENSION)Controller->ControllerExtension;
21 ControllerExtension->DpcState( Dpc,
29 FloppyDpcDetect(PKDPC Dpc,
30 PDEVICE_OBJECT DeviceObject,
34 PCONTROLLER_OBJECT Controller = (PCONTROLLER_OBJECT)Context;
35 PFLOPPY_CONTROLLER_EXTENSION ControllerExtension = (PFLOPPY_CONTROLLER_EXTENSION)Controller->ControllerExtension;
36 KeSetEvent( &ControllerExtension->Event, 0, FALSE );
40 FloppyDpcFailIrp(PKDPC Dpc,
41 PDEVICE_OBJECT DeviceObject,
45 Irp->IoStatus.Status = STATUS_DEVICE_NOT_READY;
47 IoCompleteRequest( Irp, 0 );
51 FloppyMotorSpindownDpc(PKDPC Dpc,
56 PCONTROLLER_OBJECT Controller = (PCONTROLLER_OBJECT)Context;
57 PFLOPPY_CONTROLLER_EXTENSION ControllerExtension = (PFLOPPY_CONTROLLER_EXTENSION)Controller->ControllerExtension;
58 PFLOPPY_DEVICE_EXTENSION DeviceExtension = (PFLOPPY_DEVICE_EXTENSION)ControllerExtension->Device->DeviceExtension;
60 // queue call to turn off motor
61 IoAllocateController( Controller,
62 ControllerExtension->Device,
63 FloppyExecuteSpindown,
64 ControllerExtension );
68 FloppyMotorSpinupDpc(PKDPC Dpc,
73 PCONTROLLER_OBJECT Controller = (PCONTROLLER_OBJECT)Context;
74 PFLOPPY_CONTROLLER_EXTENSION ControllerExtension = (PFLOPPY_CONTROLLER_EXTENSION)Controller->ControllerExtension;
75 PFLOPPY_DEVICE_EXTENSION DeviceExtension = (PFLOPPY_DEVICE_EXTENSION)ControllerExtension->Device->DeviceExtension;
76 LARGE_INTEGER Timeout;
78 Timeout.QuadPart = FLOPPY_MOTOR_SPINDOWN_TIME;
79 // Motor has had time to spin up, mark motor as spun up and restart IRP
80 // don't forget to set the spindown timer
81 KeSetTimer( &ControllerExtension->SpinupTimer,
83 &ControllerExtension->MotorSpindownDpc );
84 DPRINT( "Motor spun up, retrying operation\n" );
85 ControllerExtension->MotorOn = DeviceExtension->DriveSelect;
86 IoFreeController( Controller );
87 IoAllocateController( Controller,
88 ControllerExtension->Device,
89 FloppyExecuteReadWrite,
90 ControllerExtension->Irp );
94 FloppySeekDpc(PKDPC Dpc,
95 PDEVICE_OBJECT DeviceObject,
99 PFLOPPY_DEVICE_EXTENSION DeviceExtension = (PFLOPPY_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
100 PFLOPPY_CONTROLLER_EXTENSION ControllerExtension = (PFLOPPY_CONTROLLER_EXTENSION)DeviceExtension->Controller->ControllerExtension;
102 // if the seek failed, fail the IRP
103 if( ControllerExtension->St0 & FLOPPY_ST0_GDMASK )
105 ControllerExtension->Irp->IoStatus.Status = STATUS_DISK_CORRUPT_ERROR;
106 ControllerExtension->Irp->IoStatus.Information = 0;
107 DPRINT( "Failing IRP: St0 = %2x, St1 = %2x, St2 = %2x\n",
108 ControllerExtension->St0,
109 ControllerExtension->St1,
110 ControllerExtension->St2 );
112 IoCompleteRequest( ControllerExtension->Irp, 0 );
113 IoFreeController( DeviceExtension->Controller );
116 KeStallExecutionProcessor( 10000 );
117 DPRINT( "Seek completed, now on cyl %2x\n", DeviceExtension->Cyl );
118 // now that we are on the right cyl, restart the read
119 if( FloppyExecuteReadWrite( DeviceObject,
120 ControllerExtension->Irp,
121 ControllerExtension->MapRegisterBase,
122 ControllerExtension->Irp ) == DeallocateObject )
123 IoFreeController( DeviceExtension->Controller );
127 FloppyDpcReadWrite(PKDPC Dpc,
128 PDEVICE_OBJECT DeviceObject,
132 PCONTROLLER_OBJECT Controller = (PCONTROLLER_OBJECT)Context;
133 PFLOPPY_CONTROLLER_EXTENSION ControllerExtension = (PFLOPPY_CONTROLLER_EXTENSION)Controller->ControllerExtension;
134 PFLOPPY_DEVICE_EXTENSION DeviceExtension = (PFLOPPY_DEVICE_EXTENSION)ControllerExtension->Device->DeviceExtension;
135 DWORD SectorSize = 128 << ControllerExtension->SectorSizeCode;
136 PIO_STACK_LOCATION Stk = IoGetCurrentIrpStackLocation( ControllerExtension->Irp );
137 BOOLEAN WriteToDevice = Stk->MajorFunction == IRP_MJ_WRITE ? TRUE : FALSE;
139 Irp = ControllerExtension->Irp;
140 // if the IO failed, fail the IRP
141 if( ControllerExtension->St0 & FLOPPY_ST0_GDMASK )
143 Irp->IoStatus.Status = STATUS_DISK_CORRUPT_ERROR;
144 Irp->IoStatus.Information = 0;
145 DPRINT( "Failing IRP: St0 = %2x, St1 = %2x, St2 = %2x\n",
146 ControllerExtension->St0,
147 ControllerExtension->St1,
148 ControllerExtension->St2 );
150 IoCompleteRequest( Irp, 0 );
151 IoFreeController( Controller );
154 // don't forget to flush the buffers
155 IoFlushAdapterBuffers( ControllerExtension->AdapterObject,
156 ControllerExtension->Irp->MdlAddress,
157 ControllerExtension->MapRegisterBase,
158 ControllerExtension->Irp->Tail.Overlay.DriverContext[0],
159 ControllerExtension->TransferLength,
161 DPRINT( "St0 = %2x, St1 %2x, St2 = %2x\n",
162 ControllerExtension->St0,
163 ControllerExtension->St1,
164 ControllerExtension->St2 );
165 // update buffer info
166 Stk->Parameters.Read.ByteOffset.u.LowPart += ControllerExtension->TransferLength;
167 Stk->Parameters.Read.Length -= ControllerExtension->TransferLength;
168 // drivercontext used for current va
169 (DWORD)ControllerExtension->Irp->Tail.Overlay.DriverContext[0] += ControllerExtension->TransferLength;
171 DPRINT( "First dword: %x\n", *((DWORD *)ControllerExtension->MapRegisterBase) )
173 // if there is more IO to be done, restart execute routine to issue next read
174 if( Stk->Parameters.Read.Length )
176 if( FloppyExecuteReadWrite( DeviceObject,
178 ControllerExtension->MapRegisterBase,
179 Irp ) == DeallocateObject )
180 IoFreeController( Controller );
183 IoFreeController( Controller );
184 // otherwise, complete the Irp
185 IoCompleteRequest( Irp, 0 );
190 FloppyDpcDetectMedia(PKDPC Dpc,
191 PDEVICE_OBJECT DeviceObject,
195 PCONTROLLER_OBJECT Controller = (PCONTROLLER_OBJECT)Context;
196 PFLOPPY_CONTROLLER_EXTENSION ControllerExtension = (PFLOPPY_CONTROLLER_EXTENSION)Controller->ControllerExtension;
197 // If the read ID failed, fail the irp
198 if( ControllerExtension->St1 != 0 )
200 DPRINT1( "Read ID failed: ST1 = %2x\n", ControllerExtension->St1 );
201 Irp->IoStatus.Status = STATUS_DEVICE_NOT_READY;
202 IoCompleteRequest( Irp, 0 );
205 // set media type, and restart the IRP from the beginning
206 ((PFLOPPY_DEVICE_EXTENSION)ControllerExtension->Device->DeviceExtension)->MediaType = 0;
207 DPRINT( "Media detected, restarting IRP\n" );
208 // don't forget to free the controller so that the now queued routine may execute
209 IoFreeController( Controller );
211 IoAllocateController( Controller,
213 FloppyExecuteReadWrite,