Author: janderwald Date: Sun May 8 19:33:41 2011 New Revision: 51649
URL: http://svn.reactos.org/svn/reactos?rev=51649&view=rev Log: [USBEHCI_NEW] - Fix retrieving drive capacity - Fix ufi command structures
Modified: branches/usb-bringup/drivers/usb/usbstor/disk.c branches/usb-bringup/drivers/usb/usbstor/scsi.c branches/usb-bringup/drivers/usb/usbstor/usbstor.h
Modified: branches/usb-bringup/drivers/usb/usbstor/disk.c URL: http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbstor/... ============================================================================== --- branches/usb-bringup/drivers/usb/usbstor/disk.c [iso-8859-1] (original) +++ branches/usb-bringup/drivers/usb/usbstor/disk.c [iso-8859-1] Sun May 8 19:33:41 2011 @@ -97,7 +97,7 @@ else { // - // failed to retrieve capacity + // failed to retrieve sense data // Irp->IoStatus.Information = 0; Request->SrbStatus = SRB_STATUS_ERROR;
Modified: branches/usb-bringup/drivers/usb/usbstor/scsi.c URL: http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbstor/... ============================================================================== --- branches/usb-bringup/drivers/usb/usbstor/scsi.c [iso-8859-1] (original) +++ branches/usb-bringup/drivers/usb/usbstor/scsi.c [iso-8859-1] Sun May 8 19:33:41 2011 @@ -410,7 +410,7 @@ OUT PREAD_CAPACITY_DATA_EX CapacityDataEx, OUT PREAD_CAPACITY_DATA CapacityData) { - UFI_INQUIRY_CMD Cmd; + UFI_CAPACITY_CMD Cmd; CSW CSW; NTSTATUS Status; PUFI_CAPACITY_RESPONSE Response; @@ -438,9 +438,8 @@ // initialize capacity cmd // RtlZeroMemory(&Cmd, sizeof(UFI_INQUIRY_CMD)); - Cmd.Code = SCSIOP_INQUIRY; + Cmd.Code = SCSIOP_READ_CAPACITY; Cmd.LUN = (PDODeviceExtension->LUN & MAX_LUN); - Cmd.AllocationLength = sizeof(UFI_INQUIRY_RESPONSE);
// // now send capacity cmd @@ -472,9 +471,9 @@ return Status; }
- DPRINT1("LastLogicalBlockAddress %lu\n", Response->LastLogicalBlockAddress); - DPRINT1("BlockLength %lu\n", Response->BlockLength); - DPRINT1("Medium Length %lu\n", Response->BlockLength * Response->LastLogicalBlockAddress); + DPRINT1("LastLogicalBlockAddress %lu\n", NTOHL(Response->LastLogicalBlockAddress)); + DPRINT1("BlockLength %lu\n", NTOHL(Response->BlockLength)); + DPRINT1("Medium Length %lu\n", NTOHL(Response->BlockLength) * NTOHL(Response->LastLogicalBlockAddress));
// // store response @@ -536,6 +535,7 @@ PPDO_DEVICE_EXTENSION PDODeviceExtension; PCBW OutControl; PCDB pCDB; + PUFI_MODE_PARAMETER_HEADER Header;
// // get SCSI command data block @@ -558,6 +558,18 @@ // 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 @@ -567,12 +579,15 @@ Cmd.LUN = (PDODeviceExtension->LUN & MAX_LUN); Cmd.PageCode = pCDB->MODE_SENSE.PageCode; 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 // - 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)) { // @@ -598,6 +613,20 @@ ASSERT(FALSE); 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
Modified: branches/usb-bringup/drivers/usb/usbstor/usbstor.h URL: http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbstor/... ============================================================================== --- branches/usb-bringup/drivers/usb/usbstor/usbstor.h [iso-8859-1] (original) +++ branches/usb-bringup/drivers/usb/usbstor/usbstor.h [iso-8859-1] Sun May 8 19:33:41 2011 @@ -63,7 +63,7 @@ // #define USB_BULK_GET_MAX_LUN 0xFE
- +#include <pshpack1.h> typedef struct { ULONG Signature; // CBW signature @@ -75,6 +75,9 @@ UCHAR CommandBlock[16]; }CBW, *PCBW;
+C_ASSERT(sizeof(CBW) == 31); + + #define CBW_SIGNATURE 0x43425355 #define MAX_LUN 0xF
@@ -114,7 +117,7 @@ UCHAR Version; // contains version 0x00 UCHAR Format; // response format UCHAR Length; // additional length - USHORT Reserved; // reserved + UCHAR Reserved[3]; // reserved UCHAR Vendor[8]; // vendor identification string UCHAR Product[16]; // product identification string UCHAR Revision[4]; // product revision code @@ -148,6 +151,24 @@ ULONG LastLogicalBlockAddress; // last logical block address ULONG BlockLength; // block length in bytes }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)) + +
//-------------------------------------------------------------------------------------------------------------------------------------------- // @@ -164,7 +185,34 @@ UCHAR Reserved1[3]; }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);
//--------------------------------------------------------------------- //