USBSTOR_QueueInitialize(
PFDO_DEVICE_EXTENSION FDODeviceExtension)
{
+ //
+ // sanity check
+ //
+ ASSERT(FDODeviceExtension->Common.IsFDO);
//
// initialize queue lock
{
PDRIVER_CANCEL OldDriverCancel;
KIRQL OldLevel;
- PPDO_DEVICE_EXTENSION PDODeviceExtension;
PFDO_DEVICE_EXTENSION FDODeviceExtension;
BOOLEAN IrpListFreeze;
BOOLEAN SrbProcessing;
//
- // get pdo device extension
+ // get FDO device extension
//
- PDODeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- ASSERT(PDODeviceExtension->Common.IsFDO == FALSE);
+ FDODeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
//
- // get FDO device extension
+ // sanity check
//
- FDODeviceExtension = (PFDO_DEVICE_EXTENSION)PDODeviceExtension->LowerDeviceObject->DeviceExtension;
+ ASSERT(FDODeviceExtension->Common.IsFDO);
//
// mark irp pending
IN PDEVICE_OBJECT DeviceObject)
{
KIRQL OldLevel;
- PPDO_DEVICE_EXTENSION PDODeviceExtension;
PFDO_DEVICE_EXTENSION FDODeviceExtension;
PLIST_ENTRY Entry;
PIRP Irp = NULL;
//
- // get pdo device extension
+ // get FDO device extension
//
- PDODeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ FDODeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
//
// sanity check
//
- ASSERT(PDODeviceExtension->Common.IsFDO == FALSE);
-
- //
- // get FDO device extension
- //
- FDODeviceExtension = (PFDO_DEVICE_EXTENSION)PDODeviceExtension->LowerDeviceObject->DeviceExtension;
+ ASSERT(FDODeviceExtension->Common.IsFDO);
//
// acquire lock
IN PDEVICE_OBJECT DeviceObject)
{
KIRQL OldLevel;
- PPDO_DEVICE_EXTENSION PDODeviceExtension;
PFDO_DEVICE_EXTENSION FDODeviceExtension;
PLIST_ENTRY Entry;
PIRP Irp;
PSCSI_REQUEST_BLOCK Request;
//
- // get pdo device extension
+ // get FDO device extension
//
- PDODeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ FDODeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
//
// sanity check
//
- ASSERT(PDODeviceExtension->Common.IsFDO == FALSE);
-
- //
- // get FDO device extension
- //
- FDODeviceExtension = (PFDO_DEVICE_EXTENSION)PDODeviceExtension->LowerDeviceObject->DeviceExtension;
+ ASSERT(FDODeviceExtension->Common.IsFDO);
//
// acquire lock
KeReleaseSpinLock(&FDODeviceExtension->IrpListLock, OldLevel);
}
+VOID
+USBSTOR_QueueTerminateRequest(
+ IN PDEVICE_OBJECT FDODeviceObject,
+ IN BOOLEAN ModifySrbState)
+{
+ KIRQL OldLevel;
+ PFDO_DEVICE_EXTENSION FDODeviceExtension;
+
+ //
+ // get FDO device extension
+ //
+ FDODeviceExtension = (PFDO_DEVICE_EXTENSION)FDODeviceObject->DeviceExtension;
+
+ //
+ // sanity check
+ //
+ ASSERT(FDODeviceExtension->Common.IsFDO);
+
+ //
+ // acquire lock
+ //
+ KeAcquireSpinLock(&FDODeviceExtension->IrpListLock, &OldLevel);
+
+ //
+ // decrement pending irp count
+ //
+ FDODeviceExtension->IrpPendingCount--;
+
+ if (ModifySrbState)
+ {
+ //
+ // sanity check
+ //
+ ASSERT(FDODeviceExtension->SrbActive == TRUE);
+
+ //
+ // indicate processing is completed
+ //
+ FDODeviceExtension->SrbActive = FALSE;
+ }
+
+ //
+ // release lock
+ //
+ KeReleaseSpinLock(&FDODeviceExtension->IrpListLock, OldLevel);
+
+}
+
VOID
USBSTOR_QueueNextRequest(
IN PDEVICE_OBJECT DeviceObject)
{
- PPDO_DEVICE_EXTENSION PDODeviceExtension;
+ PFDO_DEVICE_EXTENSION FDODeviceExtension;
PIRP Irp;
PIO_STACK_LOCATION IoStack;
PSCSI_REQUEST_BLOCK Request;
//
// get pdo device extension
//
- PDODeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ FDODeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
//
// sanity check
//
- ASSERT(PDODeviceExtension->Common.IsFDO == FALSE);
+ ASSERT(FDODeviceExtension->Common.IsFDO);
//
// remove first irp from list
//
// no work to do
//
+ IoStartNextPacket(DeviceObject, TRUE);
return;
}
//
Request = (PSCSI_REQUEST_BLOCK)IoStack->Parameters.Others.Argument1;
+ //
+ // sanity check
+ //
+ ASSERT(Request);
+
//
// start next packet
//
- IoStartPacket(PDODeviceExtension->LowerDeviceObject, Irp, &Request->QueueSortKey, USBSTOR_CancelIo);
+ IoStartPacket(DeviceObject, Irp, &Request->QueueSortKey, USBSTOR_CancelIo);
+
+ //
+ // start next request
+ //
+ IoStartNextPacket(DeviceObject, TRUE);
}
VOID
USBSTOR_QueueRelease(
IN PDEVICE_OBJECT DeviceObject)
{
- PPDO_DEVICE_EXTENSION PDODeviceExtension;
PFDO_DEVICE_EXTENSION FDODeviceExtension;
PIRP Irp;
KIRQL OldLevel;
PSCSI_REQUEST_BLOCK Request;
//
- // get pdo device extension
+ // get FDO device extension
//
- PDODeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ FDODeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
//
// sanity check
//
- ASSERT(PDODeviceExtension->Common.IsFDO == FALSE);
-
- //
- // get FDO device extension
- //
- FDODeviceExtension = (PFDO_DEVICE_EXTENSION)PDODeviceExtension->LowerDeviceObject->DeviceExtension;
+ ASSERT(FDODeviceExtension->Common.IsFDO);
//
// acquire lock
//
// start new packet
//
- IoStartPacket(PDODeviceExtension->LowerDeviceObject, // FDO
+ IoStartPacket(DeviceObject,
Irp,
&Request->QueueSortKey,
USBSTOR_CancelIo);
//
// queue next request
//
+ USBSTOR_QueueTerminateRequest(DeviceObject, FALSE);
USBSTOR_QueueNextRequest(DeviceObject);
-
- //
- // start next request
- //
- IoStartNextPacket(DeviceObject, TRUE);
}
//
ResetInProgress = FDODeviceExtension->ResetInProgress;
ASSERT(ResetInProgress == FALSE);
+ //
+ // sanity check
+ //
+ ASSERT(FDODeviceExtension->SrbActive == FALSE);
+ FDODeviceExtension->SrbActive = TRUE;
+
//
// release lock
//
Irp->IoStatus.Information = 0;
Irp->IoStatus.Status = STATUS_DEVICE_DOES_NOT_EXIST;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
- }
- else
- {
- //
- // execute scsi
- //
- Status = USBSTOR_HandleExecuteSCSI(IoStack->DeviceObject, Irp);
-
- //
- // acquire lock
- //
- KeAcquireSpinLock(&FDODeviceExtension->IrpListLock, &OldLevel);
-
- //
- // FIXME: synchronize with error handler
- //
- FDODeviceExtension->IrpPendingCount--;
-
- //
- // release lock
- //
- KeReleaseSpinLock(&FDODeviceExtension->IrpListLock, OldLevel);
+ USBSTOR_QueueTerminateRequest(DeviceObject, TRUE);
+ return;
}
//
- // FIXME: synchronize action with error handling
+ // execute scsi
//
- USBSTOR_QueueNextRequest(IoStack->DeviceObject);
+ Status = USBSTOR_HandleExecuteSCSI(IoStack->DeviceObject, Irp);
//
- // start next request
+ // FIXME: handle error
//
- IoStartNextPacket(DeviceObject, TRUE);
}
// complete request
//
IoCompleteRequest(Context->Irp, IO_NO_INCREMENT);
+
+ //
+ // terminate current request
+ //
+ USBSTOR_QueueTerminateRequest(Context->PDODeviceExtension->LowerDeviceObject, TRUE);
+
+ //
+ // start next request
+ //
+ USBSTOR_QueueNextRequest(Context->PDODeviceExtension->LowerDeviceObject);
}
if (Context->Event)
IN PDEVICE_OBJECT DeviceObject,
IN PIRP OriginalRequest,
IN OPTIONAL PKEVENT Event,
- IN ULONG CommandLength,
+ IN UCHAR CommandLength,
IN PUCHAR Command,
IN ULONG TransferDataLength,
IN PUCHAR TransferData)
UFI_SENSE_CMD Cmd;
NTSTATUS Status;
PVOID Response;
- PPDO_DEVICE_EXTENSION PDODeviceExtension;
PCBW OutControl;
PCDB pCDB;
PUFI_MODE_PARAMETER_HEADER Header;
#endif
+ PPDO_DEVICE_EXTENSION PDODeviceExtension;
PIO_STACK_LOCATION IoStack;
PSCSI_REQUEST_BLOCK Request;
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ //
+ // get PDO device extension
+ //
+ PDODeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ //
+ // sanity check
+ //
+ ASSERT(PDODeviceExtension->Common.IsFDO == FALSE);
+
+ //
+ // terminate current request
+ //
+ USBSTOR_QueueTerminateRequest(PDODeviceExtension->LowerDeviceObject, TRUE);
+
+ //
+ // start next request
+ //
+ USBSTOR_QueueNextRequest(PDODeviceExtension->LowerDeviceObject);
+
return STATUS_SUCCESS;
#if 0
RtlZeroMemory(&Cmd, sizeof(UFI_READ_WRITE_CMD));
Cmd.Code = pCDB->AsByte[0];
Cmd.LUN = (PDODeviceExtension->LUN & MAX_LUN);
- Cmd.ContiguousLogicBlocks = _byteswap_ushort(BlockCount);
+ Cmd.ContiguousLogicBlocksByte0 = pCDB->CDB10.TransferBlocksMsb;
+ Cmd.ContiguousLogicBlocksByte1 = pCDB->CDB10.TransferBlocksLsb;
Cmd.LogicalBlockByte0 = pCDB->CDB10.LogicalBlockByte0;
Cmd.LogicalBlockByte1 = pCDB->CDB10.LogicalBlockByte1;
Cmd.LogicalBlockByte2 = pCDB->CDB10.LogicalBlockByte2;
NTSTATUS Status;
PIO_STACK_LOCATION IoStack;
PSCSI_REQUEST_BLOCK Request;
+ PPDO_DEVICE_EXTENSION PDODeviceExtension;
+
+ //
+ // get PDO device extension
+ //
+ PDODeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ //
+ // sanity check
+ //
+ ASSERT(PDODeviceExtension->Common.IsFDO == FALSE);
//
// get current stack location
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = Request->DataTransferLength;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ //
+ // terminate current request
+ //
+ USBSTOR_QueueTerminateRequest(PDODeviceExtension->LowerDeviceObject, TRUE);
+
+ //
+ // start next request
+ //
+ USBSTOR_QueueNextRequest(PDODeviceExtension->LowerDeviceObject);
+
return STATUS_SUCCESS;
}
else if (pCDB->MODE_SENSE.OperationCode == SCSIOP_TEST_UNIT_READY)