[USBEHCI_NEW]

- Fix retrieving drive capacity
- Fix ufi command structures

svn path=/branches/usb-bringup/; revision=51649
This commit is contained in:
Johannes Anderwald 2011-05-08 19:33:41 +00:00
parent 741b7ea0aa
commit 45f27e8b8c
3 changed files with 89 additions and 12 deletions

View file

@ -97,7 +97,7 @@ USBSTOR_HandleExecuteSCSI(
else else
{ {
// //
// failed to retrieve capacity // failed to retrieve sense data
// //
Irp->IoStatus.Information = 0; Irp->IoStatus.Information = 0;
Request->SrbStatus = SRB_STATUS_ERROR; Request->SrbStatus = SRB_STATUS_ERROR;

View file

@ -410,7 +410,7 @@ USBSTOR_SendCapacityCmd(
OUT PREAD_CAPACITY_DATA_EX CapacityDataEx, OUT PREAD_CAPACITY_DATA_EX CapacityDataEx,
OUT PREAD_CAPACITY_DATA CapacityData) OUT PREAD_CAPACITY_DATA CapacityData)
{ {
UFI_INQUIRY_CMD Cmd; UFI_CAPACITY_CMD Cmd;
CSW CSW; CSW CSW;
NTSTATUS Status; NTSTATUS Status;
PUFI_CAPACITY_RESPONSE Response; PUFI_CAPACITY_RESPONSE Response;
@ -438,9 +438,8 @@ USBSTOR_SendCapacityCmd(
// initialize capacity cmd // initialize capacity cmd
// //
RtlZeroMemory(&Cmd, sizeof(UFI_INQUIRY_CMD)); RtlZeroMemory(&Cmd, sizeof(UFI_INQUIRY_CMD));
Cmd.Code = SCSIOP_INQUIRY; Cmd.Code = SCSIOP_READ_CAPACITY;
Cmd.LUN = (PDODeviceExtension->LUN & MAX_LUN); Cmd.LUN = (PDODeviceExtension->LUN & MAX_LUN);
Cmd.AllocationLength = sizeof(UFI_INQUIRY_RESPONSE);
// //
// now send capacity cmd // now send capacity cmd
@ -472,9 +471,9 @@ USBSTOR_SendCapacityCmd(
return Status; return Status;
} }
DPRINT1("LastLogicalBlockAddress %lu\n", Response->LastLogicalBlockAddress); DPRINT1("LastLogicalBlockAddress %lu\n", NTOHL(Response->LastLogicalBlockAddress));
DPRINT1("BlockLength %lu\n", Response->BlockLength); DPRINT1("BlockLength %lu\n", NTOHL(Response->BlockLength));
DPRINT1("Medium Length %lu\n", Response->BlockLength * Response->LastLogicalBlockAddress); DPRINT1("Medium Length %lu\n", NTOHL(Response->BlockLength) * NTOHL(Response->LastLogicalBlockAddress));
// //
// store response // store response
@ -536,6 +535,7 @@ USBSTOR_SendModeSenseCmd(
PPDO_DEVICE_EXTENSION PDODeviceExtension; PPDO_DEVICE_EXTENSION PDODeviceExtension;
PCBW OutControl; PCBW OutControl;
PCDB pCDB; PCDB pCDB;
PUFI_MODE_PARAMETER_HEADER Header;
// //
// get SCSI command data block // get SCSI command data block
@ -559,6 +559,18 @@ USBSTOR_SendModeSenseCmd(
return STATUS_INSUFFICIENT_RESOURCES; return STATUS_INSUFFICIENT_RESOURCES;
} }
//
// sanity check
//
// Supported pages
// MODE_PAGE_ERROR_RECOVERY
// MODE_PAGE_FLEXIBILE
// MODE_PAGE_LUN_MAPPING
// MODE_PAGE_FAULT_REPORTING
// MODE_SENSE_RETURN_ALL
// //
// initialize mode sense cmd // initialize mode sense cmd
// //
@ -567,12 +579,15 @@ USBSTOR_SendModeSenseCmd(
Cmd.LUN = (PDODeviceExtension->LUN & MAX_LUN); Cmd.LUN = (PDODeviceExtension->LUN & MAX_LUN);
Cmd.PageCode = pCDB->MODE_SENSE.PageCode; Cmd.PageCode = pCDB->MODE_SENSE.PageCode;
Cmd.PC = pCDB->MODE_SENSE.Pc; Cmd.PC = pCDB->MODE_SENSE.Pc;
Cmd.AllocationLength = pCDB->MODE_SENSE.AllocationLength; Cmd.AllocationLength = HTONS(pCDB->MODE_SENSE.AllocationLength);
DPRINT1("PageCode %x\n", pCDB->MODE_SENSE.PageCode);
DPRINT1("PC %x\n", pCDB->MODE_SENSE.Pc);
// //
// now send mode sense cmd // now send mode sense cmd
// //
Status = USBSTOR_SendCBW(DeviceObject, UFI_CAPACITY_CMD_LEN, (PUCHAR)&Cmd, Request->DataTransferLength, &OutControl); Status = USBSTOR_SendCBW(DeviceObject, UFI_SENSE_CMD_LEN, (PUCHAR)&Cmd, Request->DataTransferLength, &OutControl);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
// //
@ -599,6 +614,20 @@ USBSTOR_SendModeSenseCmd(
return Status; return Status;
} }
Header = (PUFI_MODE_PARAMETER_HEADER)Response;
//
// TODO: build layout
//
// first struct is the header
// MODE_PARAMETER_HEADER / _MODE_PARAMETER_HEADER10
//
// followed by
// MODE_PARAMETER_BLOCK
//
//
DbgBreakPoint();
// //
// send csw // send csw
// //

View file

@ -63,7 +63,7 @@ typedef struct
// //
#define USB_BULK_GET_MAX_LUN 0xFE #define USB_BULK_GET_MAX_LUN 0xFE
#include <pshpack1.h>
typedef struct typedef struct
{ {
ULONG Signature; // CBW signature ULONG Signature; // CBW signature
@ -75,6 +75,9 @@ typedef struct
UCHAR CommandBlock[16]; UCHAR CommandBlock[16];
}CBW, *PCBW; }CBW, *PCBW;
C_ASSERT(sizeof(CBW) == 31);
#define CBW_SIGNATURE 0x43425355 #define CBW_SIGNATURE 0x43425355
#define MAX_LUN 0xF #define MAX_LUN 0xF
@ -114,7 +117,7 @@ typedef struct
UCHAR Version; // contains version 0x00 UCHAR Version; // contains version 0x00
UCHAR Format; // response format UCHAR Format; // response format
UCHAR Length; // additional length UCHAR Length; // additional length
USHORT Reserved; // reserved UCHAR Reserved[3]; // reserved
UCHAR Vendor[8]; // vendor identification string UCHAR Vendor[8]; // vendor identification string
UCHAR Product[16]; // product identification string UCHAR Product[16]; // product identification string
UCHAR Revision[4]; // product revision code UCHAR Revision[4]; // product revision code
@ -149,6 +152,24 @@ typedef struct
ULONG BlockLength; // block length in bytes ULONG BlockLength; // block length in bytes
}UFI_CAPACITY_RESPONSE, *PUFI_CAPACITY_RESPONSE; }UFI_CAPACITY_RESPONSE, *PUFI_CAPACITY_RESPONSE;
C_ASSERT(sizeof(UFI_CAPACITY_RESPONSE) == 8);
#define HTONS(n) (((((unsigned short)(n) & 0xFF)) << 8) | (((unsigned short)(n) & 0xFF00) >> 8))
#define NTOHS(n) (((((unsigned short)(n) & 0xFF)) << 8) | (((unsigned short)(n) & 0xFF00) >> 8))
#define HTONL(n) (((((unsigned long)(n) & 0xFF)) << 24) | \
((((unsigned long)(n) & 0xFF00)) << 8) | \
((((unsigned long)(n) & 0xFF0000)) >> 8) | \
((((unsigned long)(n) & 0xFF000000)) >> 24))
#define NTOHL(n) (((((unsigned long)(n) & 0xFF)) << 24) | \
((((unsigned long)(n) & 0xFF00)) << 8) | \
((((unsigned long)(n) & 0xFF0000)) >> 8) | \
((((unsigned long)(n) & 0xFF000000)) >> 24))
//-------------------------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------------------------
// //
// UFI sense mode cmd // UFI sense mode cmd
@ -164,7 +185,34 @@ typedef struct
UCHAR Reserved1[3]; UCHAR Reserved1[3];
}UFI_SENSE_CMD, *PUFI_SENSE_CMD; }UFI_SENSE_CMD, *PUFI_SENSE_CMD;
C_ASSERT(sizeof(UFI_CAPACITY_CMD) == 12); C_ASSERT(sizeof(UFI_SENSE_CMD) == 12);
#define UFI_SENSE_CMD_LEN (6)
typedef struct
{
USHORT ModeDataLength; // length of parameters for sense cmd
UCHAR MediumTypeCode; // 00 for mass storage, 0x94 for floppy
UCHAR WP:1; // write protect bit
UCHAR Reserved1:2; // reserved 00
UCHAR DPOFUA:1; // should be zero
UCHAR Reserved2:4; // reserved
UCHAR Reserved[4]; // reserved
}UFI_MODE_PARAMETER_HEADER, *PUFI_MODE_PARAMETER_HEADER;
C_ASSERT(sizeof(UFI_MODE_PARAMETER_HEADER) == 8);
typedef struct
{
UCHAR PC;
UCHAR PageLength;
UCHAR Reserved1;
UCHAR ITM;
UCHAR Flags;
UCHAR Reserved[3];
}UFI_TIMER_PROTECT_PAGE, *PUFI_TIMER_PROTECT_PAGE;
C_ASSERT(sizeof(UFI_TIMER_PROTECT_PAGE) == 8);
//--------------------------------------------------------------------- //---------------------------------------------------------------------
// //