[USBSTOR]

- Start implementing write command
- Disabled for now as it causes corruptions

svn path=/branches/usb-bringup/; revision=51695
This commit is contained in:
Johannes Anderwald 2011-05-13 14:44:24 +00:00
parent 89aa9d3264
commit 3f8c058a07
3 changed files with 42 additions and 16 deletions

View file

@ -50,14 +50,14 @@ USBSTOR_HandleExecuteSCSI(
// //
Status = USBSTOR_SendModeSenseCmd(DeviceObject, Irp); Status = USBSTOR_SendModeSenseCmd(DeviceObject, Irp);
} }
else if (pCDB->MODE_SENSE.OperationCode == SCSIOP_READ) else if (pCDB->MODE_SENSE.OperationCode == SCSIOP_READ /*|| pCDB->MODE_SENSE.OperationCode == SCSIOP_WRITE*/)
{ {
DPRINT1("SCSIOP_READ DataTransferLength %lu\n", Request->DataTransferLength); DPRINT1("SCSIOP_READ / SCSIOP_WRITE DataTransferLength %lu\n", Request->DataTransferLength);
// //
// send read command // send read / write command
// //
Status = USBSTOR_SendReadCmd(DeviceObject, Irp); Status = USBSTOR_SendReadWriteCmd(DeviceObject, Irp);
} }
else if (pCDB->AsByte[0] == SCSIOP_MEDIUM_REMOVAL) else if (pCDB->AsByte[0] == SCSIOP_MEDIUM_REMOVAL)
{ {

View file

@ -332,6 +332,8 @@ USBSTOR_CBWCompletionRoutine(
{ {
PIRP_CONTEXT Context; PIRP_CONTEXT Context;
PIO_STACK_LOCATION IoStack; PIO_STACK_LOCATION IoStack;
UCHAR Code;
USBD_PIPE_HANDLE PipeHandle;
DPRINT1("USBSTOR_CBWCompletionRoutine Irp %p Ctx %p\n", Irp, Ctx); DPRINT1("USBSTOR_CBWCompletionRoutine Irp %p Ctx %p\n", Irp, Ctx);
@ -350,13 +352,32 @@ USBSTOR_CBWCompletionRoutine(
// //
if (Context->TransferDataLength) if (Context->TransferDataLength)
{ {
//
// get command code
//
Code = Context->cbw->CommandBlock[0];
if (Code == SCSIOP_WRITE)
{
//
// write request use bulk out pipe
//
PipeHandle = Context->FDODeviceExtension->InterfaceInformation->Pipes[Context->FDODeviceExtension->BulkOutPipeIndex].PipeHandle;
}
else
{
//
// default bulk in pipe
//
PipeHandle = Context->FDODeviceExtension->InterfaceInformation->Pipes[Context->FDODeviceExtension->BulkInPipeIndex].PipeHandle;
}
// //
// now initialize the urb for sending data // now initialize the urb for sending data
// //
UsbBuildInterruptOrBulkTransferRequest(&Context->Urb, UsbBuildInterruptOrBulkTransferRequest(&Context->Urb,
sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER), sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER),
Context->FDODeviceExtension->InterfaceInformation->Pipes[Context->FDODeviceExtension->BulkInPipeIndex].PipeHandle, PipeHandle,
NULL, NULL,
Context->TransferBufferMDL, Context->TransferBufferMDL,
Context->TransferDataLength, Context->TransferDataLength,
@ -871,11 +892,11 @@ USBSTOR_SendModeSenseCmd(
} }
NTSTATUS NTSTATUS
USBSTOR_SendReadCmd( USBSTOR_SendReadWriteCmd(
IN PDEVICE_OBJECT DeviceObject, IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp) IN PIRP Irp)
{ {
UFI_READ_CMD Cmd; UFI_READ_WRITE_CMD Cmd;
NTSTATUS Status; NTSTATUS Status;
PPDO_DEVICE_EXTENSION PDODeviceExtension; PPDO_DEVICE_EXTENSION PDODeviceExtension;
PCDB pCDB; PCDB pCDB;
@ -907,7 +928,12 @@ USBSTOR_SendReadCmd(
// //
// informal debug print // informal debug print
// //
DPRINT1("USBSTOR_SendReadCmd DataTransferLength %x, BlockLength %x\n", Request->DataTransferLength, PDODeviceExtension->BlockLength); DPRINT1("USBSTOR_SendReadWriteCmd DataTransferLength %x, BlockLength %x\n", Request->DataTransferLength, PDODeviceExtension->BlockLength);
//
// sanity check
//
ASSERT(PDODeviceExtension->BlockLength);
// //
// block count // block count
@ -917,8 +943,8 @@ USBSTOR_SendReadCmd(
// //
// initialize read cmd // initialize read cmd
// //
RtlZeroMemory(&Cmd, sizeof(UFI_READ_CMD)); RtlZeroMemory(&Cmd, sizeof(UFI_READ_WRITE_CMD));
Cmd.Code = SCSIOP_READ; Cmd.Code = pCDB->AsByte[0];
Cmd.LUN = (PDODeviceExtension->LUN & MAX_LUN); Cmd.LUN = (PDODeviceExtension->LUN & MAX_LUN);
Cmd.ContiguousLogicBlocks = _byteswap_ushort(BlockCount); Cmd.ContiguousLogicBlocks = _byteswap_ushort(BlockCount);
Cmd.LogicalBlockByte0 = pCDB->CDB10.LogicalBlockByte0; Cmd.LogicalBlockByte0 = pCDB->CDB10.LogicalBlockByte0;
@ -931,7 +957,7 @@ USBSTOR_SendReadCmd(
// //
// send request // send request
// //
return USBSTOR_SendRequest(DeviceObject, Irp, NULL, UFI_READ_CMD_LEN, (PUCHAR)&Cmd, Request->DataTransferLength, (PUCHAR)Request->DataBuffer); return USBSTOR_SendRequest(DeviceObject, Irp, NULL, UFI_READ_WRITE_CMD_LEN, (PUCHAR)&Cmd, Request->DataTransferLength, (PUCHAR)Request->DataBuffer);
} }
NTSTATUS NTSTATUS

View file

@ -158,11 +158,11 @@ typedef struct
UCHAR Reserved; // reserved 0x00 UCHAR Reserved; // reserved 0x00
USHORT ContiguousLogicBlocks; // num of contiguous logical blocks USHORT ContiguousLogicBlocks; // num of contiguous logical blocks
UCHAR Reserved1[3]; // reserved 0x00 UCHAR Reserved1[3]; // reserved 0x00
}UFI_READ_CMD; }UFI_READ_WRITE_CMD;
C_ASSERT(sizeof(UFI_READ_CMD) == 12); C_ASSERT(sizeof(UFI_READ_WRITE_CMD) == 12);
#define UFI_READ_CMD_LEN (0xA) #define UFI_READ_WRITE_CMD_LEN (0xA)
//-------------------------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------------------------
// //
@ -375,7 +375,7 @@ USBSTOR_SendModeSenseCmd(
IN PIRP Irp); IN PIRP Irp);
NTSTATUS NTSTATUS
USBSTOR_SendReadCmd( USBSTOR_SendReadWriteCmd(
IN PDEVICE_OBJECT DeviceObject, IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp); IN PIRP Irp);