https://git.reactos.org/?p=reactos.git;a=commitdiff;h=94e61c3080fe83efcc613…
commit 94e61c3080fe83efcc613d0d77ade45cb0848808
Author: Victor Perevertkin <victor.perevertkin(a)reactos.org>
AuthorDate: Fri Jun 12 16:51:42 2020 +0300
Commit: Victor Perevertkin <victor.perevertkin(a)reactos.org>
CommitDate: Fri Jun 12 16:55:27 2020 +0300
[USBSTOR] Move PDO's Inquiry data and FDO's SCSI context
to their Device Extensions.
This way the driver can better handle low memory situations
---
drivers/usb/usbstor/disk.c | 5 +-
drivers/usb/usbstor/error.c | 11 ++---
drivers/usb/usbstor/pdo.c | 35 ++++----------
drivers/usb/usbstor/scsi.c | 109 +++++++++++++++++-------------------------
drivers/usb/usbstor/usbstor.h | 101 +++++++++++++++++++-------------------
5 files changed, 113 insertions(+), 148 deletions(-)
diff --git a/drivers/usb/usbstor/disk.c b/drivers/usb/usbstor/disk.c
index b73ca91292c..1e5bd1299fb 100644
--- a/drivers/usb/usbstor/disk.c
+++ b/drivers/usb/usbstor/disk.c
@@ -283,8 +283,7 @@ USBSTOR_HandleQueryProperty(
ASSERT(FDODeviceExtension);
ASSERT(FDODeviceExtension->Common.IsFDO);
- InquiryData = PDODeviceExtension->InquiryData;
- ASSERT(InquiryData);
+ InquiryData = (PINQUIRYDATA)&PDODeviceExtension->InquiryData;
// compute extra parameters length
FieldLengthVendor = USBSTOR_GetFieldLength(InquiryData->VendorId, 8);
@@ -507,7 +506,7 @@ USBSTOR_HandleDeviceControl(
// Note: INQUIRYDATA structure is larger than INQUIRYDATABUFFERSIZE
RtlZeroMemory(InquiryData, sizeof(INQUIRYDATA));
- RtlCopyMemory(InquiryData, PDODeviceExtension->InquiryData,
INQUIRYDATABUFFERSIZE);
+ RtlCopyMemory(InquiryData, &PDODeviceExtension->InquiryData,
sizeof(PDODeviceExtension->InquiryData));
InquiryData->Versions = 0x04;
InquiryData->ResponseDataFormat = 0x02; // some devices set this to 1
diff --git a/drivers/usb/usbstor/error.c b/drivers/usb/usbstor/error.c
index 3964b2c7b4d..1c773ab6709 100644
--- a/drivers/usb/usbstor/error.c
+++ b/drivers/usb/usbstor/error.c
@@ -77,15 +77,15 @@ USBSTOR_ResetPipeWorkItemRoutine(
IN PVOID Ctx)
{
NTSTATUS Status;
- PIRP_CONTEXT Context = (PIRP_CONTEXT)Ctx;
- PFDO_DEVICE_EXTENSION FDODeviceExtension =
(PFDO_DEVICE_EXTENSION)FdoDevice->DeviceExtension;
+ PFDO_DEVICE_EXTENSION FDODeviceExtension = (PFDO_DEVICE_EXTENSION)Ctx;
+ PIRP_CONTEXT Context = &FDODeviceExtension->CurrentIrpContext;
// clear stall on the corresponding pipe
Status = USBSTOR_ResetPipeWithHandle(FDODeviceExtension->LowerDeviceObject,
Context->Urb.UrbBulkOrInterruptTransfer.PipeHandle);
DPRINT1("USBSTOR_ResetPipeWithHandle Status %x\n", Status);
// now resend the csw as the stall got cleared
- USBSTOR_SendCSWRequest(Context, Context->Irp);
+ USBSTOR_SendCSWRequest(FDODeviceExtension, Context->Irp);
}
VOID
@@ -133,15 +133,14 @@ USBSTOR_ResetDeviceWorkItemRoutine(
VOID
NTAPI
USBSTOR_QueueResetPipe(
- IN PFDO_DEVICE_EXTENSION FDODeviceExtension,
- IN PIRP_CONTEXT Context)
+ IN PFDO_DEVICE_EXTENSION FDODeviceExtension)
{
DPRINT("USBSTOR_QueueResetPipe\n");
IoQueueWorkItem(FDODeviceExtension->ResetDeviceWorkItem,
USBSTOR_ResetPipeWorkItemRoutine,
CriticalWorkQueue,
- Context);
+ FDODeviceExtension);
}
VOID
diff --git a/drivers/usb/usbstor/pdo.c b/drivers/usb/usbstor/pdo.c
index 50996e396c6..e89eb45d382 100644
--- a/drivers/usb/usbstor/pdo.c
+++ b/drivers/usb/usbstor/pdo.c
@@ -137,8 +137,7 @@ USBSTOR_PdoHandleQueryDeviceText(
IoStack = IoGetCurrentIrpStackLocation(Irp);
DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- ASSERT(DeviceExtension->InquiryData);
- InquiryData = DeviceExtension->InquiryData;
+ InquiryData = (PINQUIRYDATA)&DeviceExtension->InquiryData;
switch (IoStack->Parameters.QueryDeviceText.DeviceTextType)
{
@@ -191,8 +190,7 @@ USBSTOR_PdoHandleQueryDeviceId(
UNICODE_STRING DeviceId;
DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- ASSERT(DeviceExtension->InquiryData);
- InquiryData = DeviceExtension->InquiryData;
+ InquiryData = (PINQUIRYDATA)&DeviceExtension->InquiryData;
DeviceType = USBSTOR_GetDeviceType(InquiryData);
@@ -282,7 +280,7 @@ USBSTOR_PdoHandleQueryHardwareId(
PDODeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
FDODeviceExtension =
(PFDO_DEVICE_EXTENSION)PDODeviceExtension->LowerDeviceObject->DeviceExtension;
ASSERT(FDODeviceExtension->DeviceDescriptor);
- InquiryData = PDODeviceExtension->InquiryData;
+ InquiryData = (PINQUIRYDATA)&PDODeviceExtension->InquiryData;
DeviceType = USBSTOR_GetDeviceType(InquiryData);
GenericType = USBSTOR_GetGenericType(InquiryData);
@@ -404,7 +402,7 @@ USBSTOR_PdoHandleQueryCompatibleId(
PDODeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
FDODeviceExtension =
(PFDO_DEVICE_EXTENSION)PDODeviceExtension->LowerDeviceObject->DeviceExtension;
ASSERT(FDODeviceExtension->DeviceDescriptor);
- DeviceType = USBSTOR_GetDeviceType(PDODeviceExtension->InquiryData);
+ DeviceType =
USBSTOR_GetDeviceType((PINQUIRYDATA)&PDODeviceExtension->InquiryData);
// format instance id
Length = sprintf(Buffer, "USBSTOR\\%s", DeviceType) + 1;
@@ -573,10 +571,6 @@ USBSTOR_PdoHandlePnp(
bDelete = FALSE;
}
- // clean up the device extension
- ASSERT(DeviceExtension->InquiryData);
- ExFreePoolWithTag(DeviceExtension->InquiryData, USB_STOR_TAG);
-
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
@@ -804,19 +798,10 @@ USBSTOR_FillInquiryData(
IN PDEVICE_OBJECT PDODeviceObject)
{
NTSTATUS Status = STATUS_INSUFFICIENT_RESOURCES;
- PPDO_DEVICE_EXTENSION PDODeviceExtension;
+ PPDO_DEVICE_EXTENSION PDODeviceExtension =
(PPDO_DEVICE_EXTENSION)PDODeviceObject->DeviceExtension;
CDB Cdb;
ULONG DataTransferLength = INQUIRYDATABUFFERSIZE;
- PINQUIRYDATA InquiryData;
-
- PDODeviceExtension = (PPDO_DEVICE_EXTENSION)PDODeviceObject->DeviceExtension;
- InquiryData = ExAllocatePoolWithTag(NonPagedPool, INQUIRYDATABUFFERSIZE,
USB_STOR_TAG);
-
- if (!InquiryData)
- {
- DPRINT1("USBSTOR_FillInquiryData failed with %x\n", Status);
- return Status;
- }
+ PINQUIRYDATA InquiryData = (PINQUIRYDATA)&PDODeviceExtension->InquiryData;
RtlZeroMemory(&Cdb, sizeof(Cdb));
Cdb.CDB6INQUIRY.OperationCode = SCSIOP_INQUIRY;
@@ -827,7 +812,6 @@ USBSTOR_FillInquiryData(
if (!NT_SUCCESS(Status))
{
DPRINT1("USBSTOR_FillInquiryData failed with %x\n", Status);
- ExFreePoolWithTag(InquiryData, USB_STOR_TAG);
return Status;
}
@@ -846,7 +830,6 @@ USBSTOR_FillInquiryData(
DPRINT("Revision %c%c%c%c\n", InquiryData->ProductRevisionLevel[0],
InquiryData->ProductRevisionLevel[1], InquiryData->ProductRevisionLevel[2],
InquiryData->ProductRevisionLevel[3]);
- PDODeviceExtension->InquiryData = InquiryData;
return Status;
}
@@ -859,6 +842,7 @@ USBSTOR_CreatePDO(
NTSTATUS Status;
PPDO_DEVICE_EXTENSION PDODeviceExtension;
PFDO_DEVICE_EXTENSION FDODeviceExtension;
+ PINQUIRYDATA InquiryData;
FDODeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
@@ -874,6 +858,7 @@ USBSTOR_CreatePDO(
PDO->StackSize = DeviceObject->StackSize;
PDODeviceExtension = (PPDO_DEVICE_EXTENSION)PDO->DeviceExtension;
+ InquiryData = (PINQUIRYDATA)&PDODeviceExtension->InquiryData;
// initialize device extension
RtlZeroMemory(PDODeviceExtension, sizeof(PDO_DEVICE_EXTENSION));
@@ -899,8 +884,8 @@ USBSTOR_CreatePDO(
return Status;
}
- if (PDODeviceExtension->InquiryData->DeviceType != DIRECT_ACCESS_DEVICE
&&
- PDODeviceExtension->InquiryData->DeviceType !=
READ_ONLY_DIRECT_ACCESS_DEVICE)
+ if (InquiryData->DeviceType != DIRECT_ACCESS_DEVICE &&
+ InquiryData->DeviceType != READ_ONLY_DIRECT_ACCESS_DEVICE)
{
return STATUS_NOT_SUPPORTED;
}
diff --git a/drivers/usb/usbstor/scsi.c b/drivers/usb/usbstor/scsi.c
index 946065649dd..d32aa0941cd 100644
--- a/drivers/usb/usbstor/scsi.c
+++ b/drivers/usb/usbstor/scsi.c
@@ -65,10 +65,10 @@ USBSTOR_IssueBulkOrInterruptRequest(
IN ULONG TransferBufferLength,
IN PVOID TransferBuffer,
IN PMDL TransferBufferMDL,
- IN PIO_COMPLETION_ROUTINE CompletionRoutine,
- IN PIRP_CONTEXT Context)
+ IN PIO_COMPLETION_ROUTINE CompletionRoutine)
{
PIO_STACK_LOCATION NextStack;
+ PIRP_CONTEXT Context = &FDODeviceExtension->CurrentIrpContext;
RtlZeroMemory(&Context->Urb, sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER));
@@ -88,7 +88,7 @@ USBSTOR_IssueBulkOrInterruptRequest(
IoSetCompletionRoutine(Irp,
CompletionRoutine,
- Context,
+ FDODeviceExtension,
TRUE,
TRUE,
TRUE);
@@ -107,9 +107,9 @@ USBSTOR_IsCSWValid(
return FALSE;
}
- if (Context->csw.Tag != PtrToUlong(&Context->csw))
+ if (Context->csw.Tag != PtrToUlong(Context->Irp))
{
- DPRINT1("[USBSTOR] Expected Tag %Ix but got %x\n",
PtrToUlong(&Context->csw), Context->csw.Tag);
+ DPRINT1("[USBSTOR] Expected Tag %Ix but got %x\n",
PtrToUlong(Context->Irp), Context->csw.Tag);
return FALSE;
}
@@ -120,8 +120,7 @@ static
NTSTATUS
USBSTOR_IssueRequestSense(
IN PFDO_DEVICE_EXTENSION FDODeviceExtension,
- IN PIRP Irp,
- IN PIRP_CONTEXT Context);
+ IN PIRP Irp);
IO_COMPLETION_ROUTINE USBSTOR_CSWCompletionRoutine;
@@ -138,13 +137,12 @@ USBSTOR_CSWCompletionRoutine(
PFDO_DEVICE_EXTENSION FDODeviceExtension;
PSCSI_REQUEST_BLOCK Request;
- Context = (PIRP_CONTEXT)Ctx;
-
DPRINT("USBSTOR_CSWCompletionRoutine Irp %p Ctx %p Status %x\n", Irp, Ctx,
Irp->IoStatus.Status);
IoStack = IoGetCurrentIrpStackLocation(Irp);
PDODeviceExtension =
(PPDO_DEVICE_EXTENSION)IoStack->DeviceObject->DeviceExtension;
- FDODeviceExtension = Context->FDODeviceExtension;
+ FDODeviceExtension = (PFDO_DEVICE_EXTENSION)Ctx;
+ Context = &FDODeviceExtension->CurrentIrpContext;
Request = IoStack->Parameters.Scsi.Srb;
ASSERT(Request);
@@ -158,7 +156,7 @@ USBSTOR_CSWCompletionRoutine(
++Context->StallRetryCount;
// clear stall and resend cbw
- USBSTOR_QueueResetPipe(FDODeviceExtension, Context);
+ USBSTOR_QueueResetPipe(FDODeviceExtension);
return STATUS_MORE_PROCESSING_REQUIRED;
}
@@ -211,7 +209,7 @@ USBSTOR_CSWCompletionRoutine(
Request->SenseInfoBufferLength &&
Request->SenseInfoBuffer)
{
- USBSTOR_IssueRequestSense(FDODeviceExtension, Irp, Context);
+ USBSTOR_IssueRequestSense(FDODeviceExtension, Irp);
return STATUS_MORE_PROCESSING_REQUIRED;
}
@@ -224,7 +222,6 @@ USBSTOR_CSWCompletionRoutine(
USBSTOR_QueueTerminateRequest(PDODeviceExtension->LowerDeviceObject, Irp);
USBSTOR_QueueNextRequest(PDODeviceExtension->LowerDeviceObject);
- ExFreePoolWithTag(Context, USB_STOR_TAG);
return STATUS_CONTINUE_COMPLETION;
ResetRecovery:
@@ -238,24 +235,22 @@ ResetRecovery:
USBSTOR_QueueTerminateRequest(PDODeviceExtension->LowerDeviceObject, Irp);
USBSTOR_QueueResetDevice(FDODeviceExtension);
- ExFreePoolWithTag(Context, USB_STOR_TAG);
return STATUS_CONTINUE_COMPLETION;
}
NTSTATUS
USBSTOR_SendCSWRequest(
- PIRP_CONTEXT Context,
+ PFDO_DEVICE_EXTENSION FDODeviceExtension,
PIRP Irp)
{
- return USBSTOR_IssueBulkOrInterruptRequest(Context->FDODeviceExtension,
+ return USBSTOR_IssueBulkOrInterruptRequest(FDODeviceExtension,
Irp,
-
Context->FDODeviceExtension->InterfaceInformation->Pipes[Context->FDODeviceExtension->BulkInPipeIndex].PipeHandle,
+
FDODeviceExtension->InterfaceInformation->Pipes[FDODeviceExtension->BulkInPipeIndex].PipeHandle,
USBD_TRANSFER_DIRECTION_IN,
sizeof(CSW),
- &Context->csw,
+
&FDODeviceExtension->CurrentIrpContext.csw,
NULL,
- USBSTOR_CSWCompletionRoutine,
- Context);
+ USBSTOR_CSWCompletionRoutine);
}
IO_COMPLETION_ROUTINE USBSTOR_DataCompletionRoutine;
@@ -270,17 +265,19 @@ USBSTOR_DataCompletionRoutine(
PIRP_CONTEXT Context;
PIO_STACK_LOCATION IoStack;
PSCSI_REQUEST_BLOCK Request;
+ PFDO_DEVICE_EXTENSION FDODeviceExtension;
PPDO_DEVICE_EXTENSION PDODeviceExtension;
DPRINT("USBSTOR_DataCompletionRoutine Irp %p Ctx %p Status %x\n", Irp, Ctx,
Irp->IoStatus.Status);
- Context = (PIRP_CONTEXT)Ctx;
+ FDODeviceExtension = (PFDO_DEVICE_EXTENSION)Ctx;
+ Context = &FDODeviceExtension->CurrentIrpContext;
IoStack = IoGetCurrentIrpStackLocation(Irp);
Request = IoStack->Parameters.Scsi.Srb;
PDODeviceExtension =
(PPDO_DEVICE_EXTENSION)IoStack->DeviceObject->DeviceExtension;
// for Sense Request a partial MDL was already freed (if existed)
- if (Request == Context->FDODeviceExtension->ActiveSrb &&
+ if (Request == FDODeviceExtension->ActiveSrb &&
Context->Urb.UrbBulkOrInterruptTransfer.TransferBufferMDL !=
Irp->MdlAddress)
{
IoFreeMdl(Context->Urb.UrbBulkOrInterruptTransfer.TransferBufferMDL);
@@ -298,7 +295,7 @@ USBSTOR_DataCompletionRoutine(
}
Request->DataTransferLength =
Context->Urb.UrbBulkOrInterruptTransfer.TransferBufferLength;
- USBSTOR_SendCSWRequest(Context, Irp);
+ USBSTOR_SendCSWRequest(FDODeviceExtension, Irp);
}
else if (USBD_STATUS(Context->Urb.UrbHeader.Status) ==
USBD_STATUS(USBD_STATUS_STALL_PID))
{
@@ -308,7 +305,7 @@ USBSTOR_DataCompletionRoutine(
Request->DataTransferLength =
Context->Urb.UrbBulkOrInterruptTransfer.TransferBufferLength;
// clear stall and resend cbw
- USBSTOR_QueueResetPipe(Context->FDODeviceExtension, Context);
+ USBSTOR_QueueResetPipe(FDODeviceExtension);
}
else
{
@@ -317,9 +314,8 @@ USBSTOR_DataCompletionRoutine(
Request->SrbStatus = SRB_STATUS_BUS_RESET;
USBSTOR_QueueTerminateRequest(PDODeviceExtension->LowerDeviceObject, Irp);
- USBSTOR_QueueResetDevice(Context->FDODeviceExtension);
+ USBSTOR_QueueResetDevice(FDODeviceExtension);
- ExFreePoolWithTag(Context, USB_STOR_TAG);
return STATUS_CONTINUE_COMPLETION;
}
@@ -339,6 +335,7 @@ USBSTOR_CBWCompletionRoutine(
PIO_STACK_LOCATION IoStack;
PSCSI_REQUEST_BLOCK Request;
PPDO_DEVICE_EXTENSION PDODeviceExtension;
+ PFDO_DEVICE_EXTENSION FDODeviceExtension;
USBD_PIPE_HANDLE PipeHandle;
ULONG TransferFlags;
PMDL Mdl = NULL;
@@ -346,7 +343,8 @@ USBSTOR_CBWCompletionRoutine(
DPRINT("USBSTOR_CBWCompletionRoutine Irp %p Ctx %p Status %x\n", Irp, Ctx,
Irp->IoStatus.Status);
- Context = (PIRP_CONTEXT)Ctx;
+ FDODeviceExtension = (PFDO_DEVICE_EXTENSION)Ctx;
+ Context = &FDODeviceExtension->CurrentIrpContext;
IoStack = IoGetCurrentIrpStackLocation(Irp);
Request = IoStack->Parameters.Scsi.Srb;
PDODeviceExtension =
(PPDO_DEVICE_EXTENSION)IoStack->DeviceObject->DeviceExtension;
@@ -358,10 +356,10 @@ USBSTOR_CBWCompletionRoutine(
// a request without the buffer AND not a sense request
// for a sense request we provide just a TransferBuffer, an Mdl will be allocated by
usbport (see below)
- if (!Irp->MdlAddress && Request ==
Context->FDODeviceExtension->ActiveSrb)
+ if (!Irp->MdlAddress && Request == FDODeviceExtension->ActiveSrb)
{
Request->SrbStatus = SRB_STATUS_SUCCESS;
- USBSTOR_SendCSWRequest(Context, Irp);
+ USBSTOR_SendCSWRequest(FDODeviceExtension, Irp);
return STATUS_MORE_PROCESSING_REQUIRED;
}
@@ -369,12 +367,12 @@ USBSTOR_CBWCompletionRoutine(
if ((Request->SrbFlags & SRB_FLAGS_UNSPECIFIED_DIRECTION) ==
SRB_FLAGS_DATA_IN)
{
- PipeHandle =
Context->FDODeviceExtension->InterfaceInformation->Pipes[Context->FDODeviceExtension->BulkInPipeIndex].PipeHandle;
+ PipeHandle =
FDODeviceExtension->InterfaceInformation->Pipes[FDODeviceExtension->BulkInPipeIndex].PipeHandle;
TransferFlags = USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK;
}
else if ((Request->SrbFlags & SRB_FLAGS_UNSPECIFIED_DIRECTION) ==
SRB_FLAGS_DATA_OUT)
{
- PipeHandle =
Context->FDODeviceExtension->InterfaceInformation->Pipes[Context->FDODeviceExtension->BulkOutPipeIndex].PipeHandle;
+ PipeHandle =
FDODeviceExtension->InterfaceInformation->Pipes[FDODeviceExtension->BulkOutPipeIndex].PipeHandle;
TransferFlags = USBD_TRANSFER_DIRECTION_OUT;
}
else
@@ -385,7 +383,7 @@ USBSTOR_CBWCompletionRoutine(
}
// if it is not a Sense Request
- if (Request == Context->FDODeviceExtension->ActiveSrb)
+ if (Request == FDODeviceExtension->ActiveSrb)
{
if (MmGetMdlVirtualAddress(Irp->MdlAddress) == Request->DataBuffer)
{
@@ -420,29 +418,27 @@ USBSTOR_CBWCompletionRoutine(
TransferBuffer = Request->DataBuffer;
}
- USBSTOR_IssueBulkOrInterruptRequest(Context->FDODeviceExtension,
+ USBSTOR_IssueBulkOrInterruptRequest(FDODeviceExtension,
Irp,
PipeHandle,
TransferFlags,
Request->DataTransferLength,
TransferBuffer,
Mdl,
- USBSTOR_DataCompletionRoutine,
- Context);
+ USBSTOR_DataCompletionRoutine);
return STATUS_MORE_PROCESSING_REQUIRED;
ResetRecovery:
- Request = Context->FDODeviceExtension->ActiveSrb;
+ Request = FDODeviceExtension->ActiveSrb;
IoStack->Parameters.Scsi.Srb = Request;
Irp->IoStatus.Information = 0;
Irp->IoStatus.Status = STATUS_IO_DEVICE_ERROR;
Request->SrbStatus = SRB_STATUS_BUS_RESET;
USBSTOR_QueueTerminateRequest(PDODeviceExtension->LowerDeviceObject, Irp);
- USBSTOR_QueueResetDevice(Context->FDODeviceExtension);
+ USBSTOR_QueueResetDevice(FDODeviceExtension);
- ExFreePoolWithTag(Context, USB_STOR_TAG);
return STATUS_CONTINUE_COMPLETION;
}
@@ -461,12 +457,12 @@ static
NTSTATUS
USBSTOR_SendCBWRequest(
IN PFDO_DEVICE_EXTENSION FDODeviceExtension,
- IN PIRP Irp,
- IN PIRP_CONTEXT Context)
+ IN PIRP Irp)
{
PPDO_DEVICE_EXTENSION PDODeviceExtension;
PIO_STACK_LOCATION IoStack;
PSCSI_REQUEST_BLOCK Request;
+ PIRP_CONTEXT Context = &FDODeviceExtension->CurrentIrpContext;
RtlZeroMemory(&Context->cbw, sizeof(CBW));
RtlZeroMemory(&Context->Urb, sizeof(URB));
@@ -475,8 +471,9 @@ USBSTOR_SendCBWRequest(
PDODeviceExtension = IoStack->DeviceObject->DeviceExtension;
Request = IoStack->Parameters.Scsi.Srb;
+ // Make a CBW structure from SCSI request block
Context->cbw.Signature = CBW_SIGNATURE;
- Context->cbw.Tag = PtrToUlong(&Context->cbw);
+ Context->cbw.Tag = PtrToUlong(Irp);
Context->cbw.DataTransferLength = Request->DataTransferLength;
Context->cbw.Flags = ((UCHAR)Request->SrbFlags &
SRB_FLAGS_UNSPECIFIED_DIRECTION) << 1;
Context->cbw.LUN = PDODeviceExtension->LUN;
@@ -489,7 +486,6 @@ USBSTOR_SendCBWRequest(
// initialize rest of context
Context->Irp = Irp;
- Context->FDODeviceExtension = FDODeviceExtension;
Context->StallRetryCount = 0;
return USBSTOR_IssueBulkOrInterruptRequest(
@@ -500,16 +496,14 @@ USBSTOR_SendCBWRequest(
sizeof(CBW),
&Context->cbw,
NULL,
- USBSTOR_CBWCompletionRoutine,
- Context);
+ USBSTOR_CBWCompletionRoutine);
}
static
NTSTATUS
USBSTOR_IssueRequestSense(
IN PFDO_DEVICE_EXTENSION FDODeviceExtension,
- IN PIRP Irp,
- IN PIRP_CONTEXT Context)
+ IN PIRP Irp)
{
PIO_STACK_LOCATION IoStack;
PSCSI_REQUEST_BLOCK CurrentSrb;
@@ -518,7 +512,7 @@ USBSTOR_IssueRequestSense(
DPRINT("USBSTOR_IssueRequestSense: \n");
CurrentSrb = FDODeviceExtension->ActiveSrb;
- SenseSrb = &Context->SenseSrb;
+ SenseSrb = &FDODeviceExtension->CurrentIrpContext.SenseSrb;
IoStack = IoGetCurrentIrpStackLocation(Irp);
IoStack->Parameters.Scsi.Srb = SenseSrb;
@@ -541,7 +535,7 @@ USBSTOR_IssueRequestSense(
SrbGetCdb(SenseSrb)->CDB6GENERIC.OperationCode = SCSIOP_REQUEST_SENSE;
SrbGetCdb(SenseSrb)->AsByte[4] = CurrentSrb->SenseInfoBufferLength;
- return USBSTOR_SendCBWRequest(FDODeviceExtension, Irp, Context);
+ return USBSTOR_SendCBWRequest(FDODeviceExtension, Irp);
}
NTSTATUS
@@ -549,13 +543,10 @@ USBSTOR_HandleExecuteSCSI(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
- NTSTATUS Status;
PIO_STACK_LOCATION IoStack;
PSCSI_REQUEST_BLOCK Request;
- PPDO_DEVICE_EXTENSION PDODeviceExtension;
- PIRP_CONTEXT Context;
+ PPDO_DEVICE_EXTENSION PDODeviceExtension =
(PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- PDODeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
ASSERT(PDODeviceExtension->Common.IsFDO == FALSE);
IoStack = IoGetCurrentIrpStackLocation(Irp);
@@ -564,17 +555,7 @@ USBSTOR_HandleExecuteSCSI(
DPRINT("USBSTOR_HandleExecuteSCSI Operation Code %x, Length %lu\n",
SrbGetCdb(Request)->CDB10.OperationCode, Request->DataTransferLength);
// check that we're sending to the right LUN
- ASSERT(SrbGetCdb(Request)->CDB10.LogicalUnitNumber == (PDODeviceExtension->LUN
& MAX_LUN));
- Context = ExAllocatePoolWithTag(NonPagedPool, sizeof(IRP_CONTEXT), USB_STOR_TAG);
-
- if (!Context)
- {
- Status = STATUS_INSUFFICIENT_RESOURCES;
- }
- else
- {
- Status =
USBSTOR_SendCBWRequest(PDODeviceExtension->LowerDeviceObject->DeviceExtension, Irp,
Context);
- }
+ ASSERT(SrbGetCdb(Request)->CDB10.LogicalUnitNumber ==
PDODeviceExtension->LUN);
- return Status;
+ return
USBSTOR_SendCBWRequest(PDODeviceExtension->LowerDeviceObject->DeviceExtension,
Irp);
}
diff --git a/drivers/usb/usbstor/usbstor.h b/drivers/usb/usbstor/usbstor.h
index 9e8b50e5701..71e90708311 100644
--- a/drivers/usb/usbstor/usbstor.h
+++ b/drivers/usb/usbstor/usbstor.h
@@ -61,6 +61,52 @@
#define MAX_LUN 0xF
#define USBSTOR_DEFAULT_MAX_TRANSFER_LENGTH 0x10000
+#define CBW_SIGNATURE 0x43425355
+#define CSW_SIGNATURE 0x53425355
+
+#include <pshpack1.h>
+
+typedef struct
+{
+ ULONG Signature; // CBW signature
+ ULONG Tag; // CBW Tag of
operation
+ ULONG DataTransferLength; // data transfer
length
+ UCHAR Flags; // CBW Flags
endpoint direction
+ UCHAR LUN; // lun unit
+ UCHAR CommandBlockLength; // Command block
length
+ UCHAR CommandBlock[16];
+} CBW, *PCBW;
+
+C_ASSERT(sizeof(CBW) == 31);
+
+#define CSW_STATUS_COMMAND_PASSED 0x00
+#define CSW_STATUS_COMMAND_FAILED 0x01
+#define CSW_STATUS_PHASE_ERROR 0x02
+
+typedef struct
+{
+ ULONG Signature; // CSW signature
+ ULONG Tag; // CSW tag
+ ULONG DataResidue; // CSW data transfer
diff
+ UCHAR Status; // CSW status
+} CSW, *PCSW;
+
+#include <poppack.h>
+
+typedef struct
+{
+ PIRP Irp;
+ ULONG ErrorIndex;
+ ULONG StallRetryCount; // the number of
retries after receiving USBD_STATUS_STALL_PID status
+ union
+ {
+ CBW cbw;
+ CSW csw;
+ };
+ URB Urb;
+ SCSI_REQUEST_BLOCK SenseSrb;
+} IRP_CONTEXT, *PIRP_CONTEXT;
+
typedef struct __COMMON_DEVICE_EXTENSION__
{
BOOLEAN IsFDO;
@@ -99,6 +145,7 @@ typedef struct
KSPIN_LOCK CommonLock;
PIO_WORKITEM ResetDeviceWorkItem;
ULONG Flags;
+ IRP_CONTEXT CurrentIrpContext;
}FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
typedef struct
@@ -108,57 +155,12 @@ typedef struct
UCHAR LUN;
// lun id
BOOLEAN Claimed;
// indicating if it has been claimed by upper driver
PDEVICE_OBJECT LowerDeviceObject;
// points to FDO
- PINQUIRYDATA InquiryData;
// USB SCSI inquiry data
PDEVICE_OBJECT *PDODeviceObject;
// entry in pdo list
PDEVICE_OBJECT Self;
// self
+ // the whole structure is not stored
+ UCHAR InquiryData[INQUIRYDATABUFFERSIZE];
// USB SCSI inquiry data
}PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
-#define CBW_SIGNATURE 0x43425355
-#define CSW_SIGNATURE 0x53425355
-
-#include <pshpack1.h>
-typedef struct
-{
- ULONG Signature; // CBW signature
- ULONG Tag; // CBW Tag of
operation
- ULONG DataTransferLength; // data transfer
length
- UCHAR Flags; // CBW Flags
endpoint direction
- UCHAR LUN; // lun unit
- UCHAR CommandBlockLength; // Command block
length
- UCHAR CommandBlock[16];
-}CBW, *PCBW;
-
-C_ASSERT(sizeof(CBW) == 31);
-
-#define CSW_STATUS_COMMAND_PASSED 0x00
-#define CSW_STATUS_COMMAND_FAILED 0x01
-#define CSW_STATUS_PHASE_ERROR 0x02
-
-typedef struct
-{
- ULONG Signature; // CSW signature
- ULONG Tag; // CSW tag
- ULONG DataResidue; // CSW data transfer
diff
- UCHAR Status; // CSW status
-}CSW, *PCSW;
-
-#include <poppack.h>
-
-typedef struct
-{
- PIRP Irp;
- PFDO_DEVICE_EXTENSION FDODeviceExtension;
- ULONG ErrorIndex;
- ULONG StallRetryCount; // the number of
retries after receiving USBD_STATUS_STALL_PID status
- union
- {
- CBW cbw;
- CSW csw;
- };
- URB Urb;
- SCSI_REQUEST_BLOCK SenseSrb;
-} IRP_CONTEXT, *PIRP_CONTEXT;
-
typedef struct _ERRORHANDLER_WORKITEM_DATA
{
PDEVICE_OBJECT DeviceObject;
@@ -267,7 +269,7 @@ USBSTOR_HandleExecuteSCSI(
NTSTATUS
USBSTOR_SendCSWRequest(
- PIRP_CONTEXT Context,
+ PFDO_DEVICE_EXTENSION FDODeviceExtension,
PIRP Irp);
@@ -351,8 +353,7 @@ USBSTOR_TimerRoutine(
VOID
NTAPI
USBSTOR_QueueResetPipe(
- IN PFDO_DEVICE_EXTENSION FDODeviceExtension,
- IN PIRP_CONTEXT Context);
+ IN PFDO_DEVICE_EXTENSION FDODeviceExtension);
VOID
NTAPI