10 #define USB_STOR_TAG 'sbsu'
11 #define USB_MAXCHILDREN (16)
13 #define HTONS(n) (((((unsigned short)(n) & 0xFF)) << 8) | (((unsigned short)(n) & 0xFF00) >> 8))
14 #define NTOHS(n) (((((unsigned short)(n) & 0xFF)) << 8) | (((unsigned short)(n) & 0xFF00) >> 8))
16 #define HTONL(n) (((((unsigned long)(n) & 0xFF)) << 24) | \
17 ((((unsigned long)(n) & 0xFF00)) << 8) | \
18 ((((unsigned long)(n) & 0xFF0000)) >> 8) | \
19 ((((unsigned long)(n) & 0xFF000000)) >> 24))
22 #define NTOHL(n) (((((unsigned long)(n) & 0xFF)) << 24) | \
23 ((((unsigned long)(n) & 0xFF00)) << 8) | \
24 ((((unsigned long)(n) & 0xFF0000)) >> 8) | \
25 ((((unsigned long)(n) & 0xFF000000)) >> 24))
27 #define USB_RECOVERABLE_ERRORS (USBD_STATUS_STALL_PID | USBD_STATUS_DEV_NOT_RESPONDING \
28 | USBD_STATUS_ENDPOINT_HALTED | USBD_STATUS_NO_BANDWIDTH)
30 typedef struct __COMMON_DEVICE_EXTENSION__
34 }USBSTOR_COMMON_DEVICE_EXTENSION
, *PUSBSTOR_COMMON_DEVICE_EXTENSION
;
38 USBSTOR_COMMON_DEVICE_EXTENSION Common
; // common device extension
40 PDEVICE_OBJECT FunctionalDeviceObject
; // functional device object
41 PDEVICE_OBJECT PhysicalDeviceObject
; // physical device object
42 PDEVICE_OBJECT LowerDeviceObject
; // lower device object
43 USB_BUS_INTERFACE_USBDI_V2 BusInterface
; // bus interface of device
44 PUSB_DEVICE_DESCRIPTOR DeviceDescriptor
; // usb device descriptor
45 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
; // usb configuration descriptor
46 PUSB_STRING_DESCRIPTOR SerialNumber
; // usb serial number
47 PUSBD_INTERFACE_INFORMATION InterfaceInformation
; // usb interface information
48 USBD_CONFIGURATION_HANDLE ConfigurationHandle
; // usb configuration handle
49 UCHAR BulkInPipeIndex
; // bulk in pipe index
50 UCHAR BulkOutPipeIndex
; // bulk out pipe index
51 UCHAR MaxLUN
; // max lun for device
52 PDEVICE_OBJECT ChildPDO
[16]; // max 16 child pdo devices
53 KSPIN_LOCK IrpListLock
; // irp list lock
54 LIST_ENTRY IrpListHead
; // irp list head
55 BOOLEAN IrpListFreeze
; // if true the irp list is freezed
56 BOOLEAN ResetInProgress
; // if hard reset is in progress
57 ULONG IrpPendingCount
; // count of irp pending
58 PSCSI_REQUEST_BLOCK ActiveSrb
; // stores the current active SRB
59 KEVENT NoPendingRequests
; // set if no pending or in progress requests
60 PSCSI_REQUEST_BLOCK LastTimerActiveSrb
; // last timer tick active srb
61 ULONG SrbErrorHandlingActive
; // error handling of srb is activated
62 ULONG TimerWorkQueueEnabled
; // timer work queue enabled
63 ULONG InstanceCount
; // pdo instance count
64 }FDO_DEVICE_EXTENSION
, *PFDO_DEVICE_EXTENSION
;
68 USBSTOR_COMMON_DEVICE_EXTENSION Common
;
69 PDEVICE_OBJECT LowerDeviceObject
; // points to FDO
71 PVOID InquiryData
; // USB SCSI inquiry data
72 PUCHAR FormatData
; // USB SCSI Read Format Capacity Data
73 UCHAR Claimed
; // indicating if it has been claimed by upper driver
74 ULONG BlockLength
; // length of block
75 ULONG LastLogicBlockAddress
; // last block address
76 PDEVICE_OBJECT
*PDODeviceObject
; // entry in pdo list
77 PDEVICE_OBJECT Self
; // self
78 UCHAR MediumTypeCode
; // floppy medium type code
79 UCHAR IsFloppy
; // is device floppy
80 }PDO_DEVICE_EXTENSION
, *PPDO_DEVICE_EXTENSION
;
83 // max lun command identifier
85 #define USB_BULK_GET_MAX_LUN 0xFE
86 #define USB_BULK_RESET_DEVICE 0xFF
91 ULONG Signature
; // CBW signature
92 ULONG Tag
; // CBW Tag of operation
93 ULONG DataTransferLength
; // data transfer length
94 UCHAR Flags
; // CBW Flags endpoint direction
95 UCHAR LUN
; // lun unit
96 UCHAR CommandBlockLength
; // Command block length
97 UCHAR CommandBlock
[16];
100 C_ASSERT(sizeof(CBW
) == 31);
103 #define CBW_SIGNATURE 0x43425355
104 #define CSW_SIGNATURE 0x53425355
108 #define CSW_STATUS_COMMAND_PASSED 0x00
109 #define CSW_STATUS_COMMAND_FAILED 0x01
110 #define CSW_STATUS_PHASE_ERROR 0x02
114 ULONG Signature
; // CSW signature
115 ULONG Tag
; // CSW tag
116 ULONG DataResidue
; // CSW data transfer diff
117 UCHAR Status
; // CSW status
120 //--------------------------------------------------------------------------------------------------------------------------------------------
122 // UFI INQUIRY command
126 UCHAR Code
; // operation code 0x12
127 UCHAR LUN
; // lun address
128 UCHAR PageCode
; // product data information, always 0x00
129 UCHAR Reserved
; // reserved 0x00
130 UCHAR AllocationLength
; // length of inquiry data to be returned, default 36 bytes
131 UCHAR Reserved1
[7]; //reserved bytes 0x00
132 }UFI_INQUIRY_CMD
, *PUFI_INQUIRY_CMD
;
134 C_ASSERT(sizeof(UFI_INQUIRY_CMD
) == 12);
136 #define UFI_INQUIRY_CMD_LEN 0x6
139 // UFI INQUIRY command response
143 UCHAR DeviceType
; // device type
144 UCHAR RMB
; // removable media bit
145 UCHAR Version
; // contains version 0x00
146 UCHAR Format
; // response format
147 UCHAR Length
; // additional length
148 UCHAR Reserved
[3]; // reserved
149 UCHAR Vendor
[8]; // vendor identification string
150 UCHAR Product
[16]; // product identification string
151 UCHAR Revision
[4]; // product revision code
152 }UFI_INQUIRY_RESPONSE
, *PUFI_INQUIRY_RESPONSE
;
154 C_ASSERT(sizeof(UFI_INQUIRY_RESPONSE
) == 36);
156 //--------------------------------------------------------------------------------------------------------------------------------------------
162 UCHAR Code
; // operation code
164 UCHAR LogicalBlockByte0
; // lba byte 0
165 UCHAR LogicalBlockByte1
; // lba byte 1
166 UCHAR LogicalBlockByte2
; // lba byte 2
167 UCHAR LogicalBlockByte3
; // lba byte 3
168 UCHAR Reserved
; // reserved 0x00
169 UCHAR ContiguousLogicBlocksByte0
; // msb contiguous logic blocks byte
170 UCHAR ContiguousLogicBlocksByte1
; // msb contiguous logic blocks
171 UCHAR Reserved1
[3]; // reserved 0x00
174 C_ASSERT(sizeof(UFI_READ_WRITE_CMD
) == 12);
176 #define UFI_READ_WRITE_CMD_LEN (0xA)
178 //--------------------------------------------------------------------------------------------------------------------------------------------
180 // UFI read capacity cmd
184 UCHAR Code
; // operation code 0x25
185 UCHAR LUN
; // lun address
186 UCHAR LBA
[4]; // logical block address, should be zero
187 UCHAR Reserved1
[2]; // reserved 0x00
188 UCHAR PMI
; // PMI = 0x00
189 UCHAR Reserved2
[3]; // reserved 0x00
190 }UFI_CAPACITY_CMD
, *PUFI_CAPACITY_CMD
;
192 C_ASSERT(sizeof(UFI_CAPACITY_CMD
) == 12);
194 #define UFI_CAPACITY_CMD_LEN 0xA //FIXME support length 16 too if requested
197 // UFI Read Capacity command response
201 ULONG LastLogicalBlockAddress
; // last logical block address
202 ULONG BlockLength
; // block length in bytes
203 }UFI_CAPACITY_RESPONSE
, *PUFI_CAPACITY_RESPONSE
;
205 #define UFI_READ_CAPACITY_CMD_LEN 0xA
206 C_ASSERT(sizeof(UFI_CAPACITY_RESPONSE
) == 8);
208 //--------------------------------------------------------------------------------------------------------------------------------------------
210 // UFI sense mode cmd
214 UCHAR Code
; // operation code
215 UCHAR LUN
; // lun address
216 UCHAR PageCode
:6; // page code selector
217 UCHAR PC
:2; // type of parameters to be returned
218 UCHAR Reserved
[4]; // reserved 0x00
219 USHORT AllocationLength
; // parameters length
221 }UFI_SENSE_CMD
, *PUFI_SENSE_CMD
;
223 C_ASSERT(sizeof(UFI_SENSE_CMD
) == 12);
225 #define UFI_SENSE_CMD_LEN (6)
229 USHORT ModeDataLength
; // length of parameters for sense cmd
230 UCHAR MediumTypeCode
; // 00 for mass storage, 0x94 for floppy
231 UCHAR WP
:1; // write protect bit
232 UCHAR Reserved1
:2; // reserved 00
233 UCHAR DPOFUA
:1; // should be zero
234 UCHAR Reserved2
:4; // reserved
235 UCHAR Reserved
[4]; // reserved
236 }UFI_MODE_PARAMETER_HEADER
, *PUFI_MODE_PARAMETER_HEADER
;
239 C_ASSERT(sizeof(UFI_MODE_PARAMETER_HEADER
) == 8);
249 }UFI_TIMER_PROTECT_PAGE
, *PUFI_TIMER_PROTECT_PAGE
;
250 C_ASSERT(sizeof(UFI_TIMER_PROTECT_PAGE
) == 8);
252 //--------------------------------------------------------------------------------------------------------------------------------------------
254 // UFI read capacity cmd
262 UCHAR AllocationLengthMsb
;
263 UCHAR AllocationLengthLsb
;
265 }UFI_READ_FORMAT_CAPACITY
, *PUFI_READ_FORMAT_CAPACITY
;
267 C_ASSERT(sizeof(UFI_READ_FORMAT_CAPACITY
) == 12);
269 #define UFI_READ_FORMAT_CAPACITY_CMD_LEN (10)
276 UCHAR CapacityLength
;
277 }UFI_CAPACITY_FORMAT_HEADER
, *PUFI_CAPACITY_FORMAT_HEADER
;
279 C_ASSERT(sizeof(UFI_CAPACITY_FORMAT_HEADER
) == 4);
285 UCHAR BlockLengthByte0
;
286 UCHAR BlockLengthByte1
;
287 UCHAR BlockLengthByte2
;
288 }UFI_CAPACITY_DESCRIPTOR
, *PUFI_CAPACITY_DESCRIPTOR
;
290 #define UNFORMATTED_MEDIA_CODE_DESCRIPTORY_TYPE (1)
291 #define FORMAT_MEDIA_CODE_DESCRIPTOR_TYPE (2)
292 #define CARTRIDGE_MEDIA_CODE_DESCRIPTOR_TYPE (3)
297 //--------------------------------------------------------------------------------------------------------------------------------------------
299 // UFI test unit command
304 UCHAR Code
; // operation code 0x00
306 UCHAR Reserved
[10]; // reserved 0x00
307 }UFI_TEST_UNIT_CMD
, *PUFI_TEST_UNIT_CMD
;
309 C_ASSERT(sizeof(UFI_TEST_UNIT_CMD
) == 12);
311 #define UFI_TEST_UNIT_CMD_LEN (6)
313 //-------------------------------------------------------------------------------------------------------------------------------------------
317 }UFI_UNKNOWN_CMD
, *PUFI_UNKNOWN_CMD
;
328 ULONG TransferDataLength
;
330 PFDO_DEVICE_EXTENSION FDODeviceExtension
;
331 PPDO_DEVICE_EXTENSION PDODeviceExtension
;
332 PMDL TransferBufferMDL
;
335 }IRP_CONTEXT
, *PIRP_CONTEXT
;
337 typedef struct _ERRORHANDLER_WORKITEM_DATA
339 PDEVICE_OBJECT DeviceObject
;
340 PIRP_CONTEXT Context
;
341 WORK_QUEUE_ITEM WorkQueueItem
;
343 } ERRORHANDLER_WORKITEM_DATA
, *PERRORHANDLER_WORKITEM_DATA
;
346 //---------------------------------------------------------------------
351 USBSTOR_FdoHandlePnp(
352 IN PDEVICE_OBJECT DeviceObject
,
355 //---------------------------------------------------------------------
360 USBSTOR_PdoHandlePnp(
361 IN PDEVICE_OBJECT DeviceObject
,
366 IN PDEVICE_OBJECT DeviceObject
,
369 //---------------------------------------------------------------------
375 USBSTOR_SyncForwardIrp(
376 IN PDEVICE_OBJECT DeviceObject
,
381 USBSTOR_GetBusInterface(
382 IN PDEVICE_OBJECT DeviceObject
,
383 OUT PUSB_BUS_INTERFACE_USBDI_V2 BusInterface
);
387 IN POOL_TYPE PoolType
,
395 USBSTOR_SyncUrbRequest(
396 IN PDEVICE_OBJECT DeviceObject
,
397 OUT PURB UrbRequest
);
401 IN PDEVICE_OBJECT DeviceObject
,
402 IN PFDO_DEVICE_EXTENSION DeviceExtension
);
406 USBSTOR_SyncForwardIrpCompletionRoutine(
407 PDEVICE_OBJECT DeviceObject
,
413 IN PDEVICE_OBJECT DeviceObject
,
414 IN PFDO_DEVICE_EXTENSION DeviceExtension
);
419 IN ULONG BufferLength
,
420 OUT PUCHAR MediumTypeCode
);
422 //---------------------------------------------------------------------
424 // descriptor.c routines
428 USBSTOR_GetDescriptors(
429 IN PDEVICE_OBJECT DeviceObject
);
432 USBSTOR_SelectConfigurationAndInterface(
433 IN PDEVICE_OBJECT DeviceObject
,
434 IN PFDO_DEVICE_EXTENSION DeviceExtension
);
437 USBSTOR_GetPipeHandles(
438 IN PFDO_DEVICE_EXTENSION DeviceExtension
);
440 //---------------------------------------------------------------------
445 USBSTOR_HandleExecuteSCSI(
446 IN PDEVICE_OBJECT DeviceObject
,
448 IN ULONG RetryCount
);
452 USBSTOR_CSWCompletionRoutine(
453 PDEVICE_OBJECT DeviceObject
,
459 PIRP_CONTEXT Context
,
464 PIRP_CONTEXT Context
,
468 //---------------------------------------------------------------------
473 USBSTOR_HandleInternalDeviceControl(
474 IN PDEVICE_OBJECT DeviceObject
,
478 USBSTOR_HandleDeviceControl(
479 IN PDEVICE_OBJECT DeviceObject
,
482 //---------------------------------------------------------------------
489 PDEVICE_OBJECT DeviceObject
,
493 USBSTOR_QueueWaitForPendingRequests(
494 IN PDEVICE_OBJECT DeviceObject
);
497 USBSTOR_QueueRelease(
498 IN PDEVICE_OBJECT DeviceObject
);
502 IN PDEVICE_OBJECT DeviceObject
,
508 IN PDEVICE_OBJECT DeviceObject
,
512 USBSTOR_QueueInitialize(
513 PFDO_DEVICE_EXTENSION FDODeviceExtension
);
517 ErrorHandlerWorkItemRoutine(
522 ResetHandlerWorkItemRoutine(
528 USBSTOR_QueueNextRequest(
529 IN PDEVICE_OBJECT DeviceObject
);
532 USBSTOR_QueueTerminateRequest(
533 IN PDEVICE_OBJECT DeviceObject
,
538 USBSTOR_GetEndpointStatus(
539 IN PDEVICE_OBJECT DeviceObject
,
540 IN UCHAR bEndpointAddress
,
544 USBSTOR_ResetPipeWithHandle(
545 IN PDEVICE_OBJECT DeviceObject
,
546 IN USBD_PIPE_HANDLE PipeHandle
);
550 USBSTOR_TimerRoutine(
551 PDEVICE_OBJECT DeviceObject
,
554 #endif /* _USBSTOR_H_ */