#define USB_STOR_TAG 'sbsu'
#define USB_MAXCHILDREN (16)
+#define USBSTOR_DEFAULT_MAX_TRANSFER_LENGTH 0x10000
#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))
USBSTOR_COMMON_DEVICE_EXTENSION Common;
PDEVICE_OBJECT LowerDeviceObject; // points to FDO
UCHAR LUN; // lun id
- PVOID InquiryData; // USB SCSI inquiry data
+ PINQUIRYDATA InquiryData; // USB SCSI inquiry data
PUCHAR FormatData; // USB SCSI Read Format Capacity Data
UCHAR Claimed; // indicating if it has been claimed by upper driver
ULONG BlockLength; // length of block
#define MAX_LUN 0xF
+#define CSW_STATUS_COMMAND_PASSED 0x00
+#define CSW_STATUS_COMMAND_FAILED 0x01
+#define CSW_STATUS_PHASE_ERROR 0x02
+
typedef struct
{
ULONG Signature; // CSW signature
UCHAR Status; // CSW status
}CSW, *PCSW;
-//--------------------------------------------------------------------------------------------------------------------------------------------
-//
-// UFI INQUIRY command
-//
-typedef struct
-{
- UCHAR Code; // operation code 0x12
- UCHAR LUN; // lun address
- UCHAR PageCode; // product data information, always 0x00
- UCHAR Reserved; // reserved 0x00
- UCHAR AllocationLength; // length of inquiry data to be returned, default 36 bytes
- UCHAR Reserved1[7]; //reserved bytes 0x00
-}UFI_INQUIRY_CMD, *PUFI_INQUIRY_CMD;
-
-C_ASSERT(sizeof(UFI_INQUIRY_CMD) == 12);
-
-#define UFI_INQUIRY_CMD_LEN 0x6
-
-//
-// UFI INQUIRY command response
-//
-typedef struct
-{
- UCHAR DeviceType; // device type
- UCHAR RMB; // removable media bit
- UCHAR Version; // contains version 0x00
- UCHAR Format; // response format
- UCHAR Length; // additional length
- UCHAR Reserved[3]; // reserved
- UCHAR Vendor[8]; // vendor identification string
- UCHAR Product[16]; // product identification string
- UCHAR Revision[4]; // product revision code
-}UFI_INQUIRY_RESPONSE, *PUFI_INQUIRY_RESPONSE;
-
-C_ASSERT(sizeof(UFI_INQUIRY_RESPONSE) == 36);
-
//--------------------------------------------------------------------------------------------------------------------------------------------
//
// UFI read cmd
UCHAR LogicalBlockByte2; // lba byte 2
UCHAR LogicalBlockByte3; // lba byte 3
UCHAR Reserved; // reserved 0x00
- UCHAR ContiguousLogicBlocksByte0; // msb contigious logic blocks byte
- UCHAR ContiguousLogicBlocksByte1; // msb contigious logic blocks
+ UCHAR ContiguousLogicBlocksByte0; // msb contiguous logic blocks byte
+ UCHAR ContiguousLogicBlocksByte1; // msb contiguous logic blocks
UCHAR Reserved1[3]; // reserved 0x00
}UFI_READ_WRITE_CMD;
#define UFI_CAPACITY_CMD_LEN 0xA //FIXME support length 16 too if requested
//
-// UFI Read Capcacity command response
+// UFI Read Capacity command response
//
typedef struct
{
UCHAR BlockLengthByte2;
}UFI_CAPACITY_DESCRIPTOR, *PUFI_CAPACITY_DESCRIPTOR;
-#define UNFORMATED_MEDIA_CODE_DESCRIPTORY_TYPE (1)
+#define UNFORMATTED_MEDIA_CODE_DESCRIPTORY_TYPE (1)
#define FORMAT_MEDIA_CODE_DESCRIPTOR_TYPE (2)
#define CARTRIDGE_MEDIA_CODE_DESCRIPTOR_TYPE (3)
typedef struct
{
+ PIRP Irp;
+ PFDO_DEVICE_EXTENSION FDODeviceExtension;
+ ULONG ErrorIndex;
+ ULONG StallRetryCount; // the number of retries after receiving USBD_STATUS_STALL_PID status
union
{
- PCBW cbw;
- PCSW csw;
+ CBW cbw;
+ CSW csw;
};
URB Urb;
- PIRP Irp;
- ULONG TransferDataLength;
- PUCHAR TransferData;
- PFDO_DEVICE_EXTENSION FDODeviceExtension;
- PPDO_DEVICE_EXTENSION PDODeviceExtension;
- PMDL TransferBufferMDL;
- ULONG ErrorIndex;
- ULONG RetryCount;
-}IRP_CONTEXT, *PIRP_CONTEXT;
+ SCSI_REQUEST_BLOCK SenseSrb;
+} IRP_CONTEXT, *PIRP_CONTEXT;
typedef struct _ERRORHANDLER_WORKITEM_DATA
{
NTSTATUS
USBSTOR_HandleExecuteSCSI(
IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN ULONG RetryCount);
-
-NTSTATUS
-NTAPI
-USBSTOR_CSWCompletionRoutine(
- PDEVICE_OBJECT DeviceObject,
- PIRP Irp,
- PVOID Ctx);
+ IN PIRP Irp);
NTSTATUS
-USBSTOR_SendCBW(
- PIRP_CONTEXT Context,
- PIRP Irp);
-
-VOID
-USBSTOR_SendCSW(
+USBSTOR_SendCSWRequest(
PIRP_CONTEXT Context,
PIRP Irp);