10 #define USB_STOR_TAG 'sbsu'
11 #define USB_MAXCHILDREN (16)
12 #define USBSTOR_DEFAULT_MAX_TRANSFER_LENGTH 0x10000
14 #define HTONS(n) (((((unsigned short)(n) & 0xFF)) << 8) | (((unsigned short)(n) & 0xFF00) >> 8))
15 #define NTOHS(n) (((((unsigned short)(n) & 0xFF)) << 8) | (((unsigned short)(n) & 0xFF00) >> 8))
17 #define HTONL(n) (((((unsigned long)(n) & 0xFF)) << 24) | \
18 ((((unsigned long)(n) & 0xFF00)) << 8) | \
19 ((((unsigned long)(n) & 0xFF0000)) >> 8) | \
20 ((((unsigned long)(n) & 0xFF000000)) >> 24))
23 #define NTOHL(n) (((((unsigned long)(n) & 0xFF)) << 24) | \
24 ((((unsigned long)(n) & 0xFF00)) << 8) | \
25 ((((unsigned long)(n) & 0xFF0000)) >> 8) | \
26 ((((unsigned long)(n) & 0xFF000000)) >> 24))
28 #define USB_RECOVERABLE_ERRORS (USBD_STATUS_STALL_PID | USBD_STATUS_DEV_NOT_RESPONDING \
29 | USBD_STATUS_ENDPOINT_HALTED | USBD_STATUS_NO_BANDWIDTH)
31 typedef struct __COMMON_DEVICE_EXTENSION__
35 }USBSTOR_COMMON_DEVICE_EXTENSION
, *PUSBSTOR_COMMON_DEVICE_EXTENSION
;
39 USBSTOR_COMMON_DEVICE_EXTENSION Common
; // common device extension
41 PDEVICE_OBJECT FunctionalDeviceObject
; // functional device object
42 PDEVICE_OBJECT PhysicalDeviceObject
; // physical device object
43 PDEVICE_OBJECT LowerDeviceObject
; // lower device object
44 USB_BUS_INTERFACE_USBDI_V2 BusInterface
; // bus interface of device
45 PUSB_DEVICE_DESCRIPTOR DeviceDescriptor
; // usb device descriptor
46 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
; // usb configuration descriptor
47 PUSB_STRING_DESCRIPTOR SerialNumber
; // usb serial number
48 PUSBD_INTERFACE_INFORMATION InterfaceInformation
; // usb interface information
49 USBD_CONFIGURATION_HANDLE ConfigurationHandle
; // usb configuration handle
50 UCHAR BulkInPipeIndex
; // bulk in pipe index
51 UCHAR BulkOutPipeIndex
; // bulk out pipe index
52 UCHAR MaxLUN
; // max lun for device
53 PDEVICE_OBJECT ChildPDO
[16]; // max 16 child pdo devices
54 KSPIN_LOCK IrpListLock
; // irp list lock
55 LIST_ENTRY IrpListHead
; // irp list head
56 BOOLEAN IrpListFreeze
; // if true the irp list is freezed
57 BOOLEAN ResetInProgress
; // if hard reset is in progress
58 ULONG IrpPendingCount
; // count of irp pending
59 PSCSI_REQUEST_BLOCK ActiveSrb
; // stores the current active SRB
60 KEVENT NoPendingRequests
; // set if no pending or in progress requests
61 PSCSI_REQUEST_BLOCK LastTimerActiveSrb
; // last timer tick active srb
62 ULONG SrbErrorHandlingActive
; // error handling of srb is activated
63 ULONG TimerWorkQueueEnabled
; // timer work queue enabled
64 ULONG InstanceCount
; // pdo instance count
65 }FDO_DEVICE_EXTENSION
, *PFDO_DEVICE_EXTENSION
;
69 USBSTOR_COMMON_DEVICE_EXTENSION Common
;
70 PDEVICE_OBJECT LowerDeviceObject
; // points to FDO
72 PINQUIRYDATA InquiryData
; // USB SCSI inquiry data
73 PUCHAR FormatData
; // USB SCSI Read Format Capacity Data
74 UCHAR Claimed
; // indicating if it has been claimed by upper driver
75 ULONG BlockLength
; // length of block
76 ULONG LastLogicBlockAddress
; // last block address
77 PDEVICE_OBJECT
*PDODeviceObject
; // entry in pdo list
78 PDEVICE_OBJECT Self
; // self
79 UCHAR MediumTypeCode
; // floppy medium type code
80 UCHAR IsFloppy
; // is device floppy
81 }PDO_DEVICE_EXTENSION
, *PPDO_DEVICE_EXTENSION
;
84 // max lun command identifier
86 #define USB_BULK_GET_MAX_LUN 0xFE
87 #define USB_BULK_RESET_DEVICE 0xFF
92 ULONG Signature
; // CBW signature
93 ULONG Tag
; // CBW Tag of operation
94 ULONG DataTransferLength
; // data transfer length
95 UCHAR Flags
; // CBW Flags endpoint direction
96 UCHAR LUN
; // lun unit
97 UCHAR CommandBlockLength
; // Command block length
98 UCHAR CommandBlock
[16];
101 C_ASSERT(sizeof(CBW
) == 31);
104 #define CBW_SIGNATURE 0x43425355
105 #define CSW_SIGNATURE 0x53425355
109 #define CSW_STATUS_COMMAND_PASSED 0x00
110 #define CSW_STATUS_COMMAND_FAILED 0x01
111 #define CSW_STATUS_PHASE_ERROR 0x02
115 ULONG Signature
; // CSW signature
116 ULONG Tag
; // CSW tag
117 ULONG DataResidue
; // CSW data transfer diff
118 UCHAR Status
; // CSW status
121 //--------------------------------------------------------------------------------------------------------------------------------------------
127 UCHAR Code
; // operation code
129 UCHAR LogicalBlockByte0
; // lba byte 0
130 UCHAR LogicalBlockByte1
; // lba byte 1
131 UCHAR LogicalBlockByte2
; // lba byte 2
132 UCHAR LogicalBlockByte3
; // lba byte 3
133 UCHAR Reserved
; // reserved 0x00
134 UCHAR ContiguousLogicBlocksByte0
; // msb contiguous logic blocks byte
135 UCHAR ContiguousLogicBlocksByte1
; // msb contiguous logic blocks
136 UCHAR Reserved1
[3]; // reserved 0x00
139 C_ASSERT(sizeof(UFI_READ_WRITE_CMD
) == 12);
141 #define UFI_READ_WRITE_CMD_LEN (0xA)
143 //--------------------------------------------------------------------------------------------------------------------------------------------
145 // UFI read capacity cmd
149 UCHAR Code
; // operation code 0x25
150 UCHAR LUN
; // lun address
151 UCHAR LBA
[4]; // logical block address, should be zero
152 UCHAR Reserved1
[2]; // reserved 0x00
153 UCHAR PMI
; // PMI = 0x00
154 UCHAR Reserved2
[3]; // reserved 0x00
155 }UFI_CAPACITY_CMD
, *PUFI_CAPACITY_CMD
;
157 C_ASSERT(sizeof(UFI_CAPACITY_CMD
) == 12);
159 #define UFI_CAPACITY_CMD_LEN 0xA //FIXME support length 16 too if requested
162 // UFI Read Capacity command response
166 ULONG LastLogicalBlockAddress
; // last logical block address
167 ULONG BlockLength
; // block length in bytes
168 }UFI_CAPACITY_RESPONSE
, *PUFI_CAPACITY_RESPONSE
;
170 #define UFI_READ_CAPACITY_CMD_LEN 0xA
171 C_ASSERT(sizeof(UFI_CAPACITY_RESPONSE
) == 8);
173 //--------------------------------------------------------------------------------------------------------------------------------------------
175 // UFI sense mode cmd
179 UCHAR Code
; // operation code
180 UCHAR LUN
; // lun address
181 UCHAR PageCode
:6; // page code selector
182 UCHAR PC
:2; // type of parameters to be returned
183 UCHAR Reserved
[4]; // reserved 0x00
184 USHORT AllocationLength
; // parameters length
186 }UFI_SENSE_CMD
, *PUFI_SENSE_CMD
;
188 C_ASSERT(sizeof(UFI_SENSE_CMD
) == 12);
190 #define UFI_SENSE_CMD_LEN (6)
194 USHORT ModeDataLength
; // length of parameters for sense cmd
195 UCHAR MediumTypeCode
; // 00 for mass storage, 0x94 for floppy
196 UCHAR WP
:1; // write protect bit
197 UCHAR Reserved1
:2; // reserved 00
198 UCHAR DPOFUA
:1; // should be zero
199 UCHAR Reserved2
:4; // reserved
200 UCHAR Reserved
[4]; // reserved
201 }UFI_MODE_PARAMETER_HEADER
, *PUFI_MODE_PARAMETER_HEADER
;
204 C_ASSERT(sizeof(UFI_MODE_PARAMETER_HEADER
) == 8);
214 }UFI_TIMER_PROTECT_PAGE
, *PUFI_TIMER_PROTECT_PAGE
;
215 C_ASSERT(sizeof(UFI_TIMER_PROTECT_PAGE
) == 8);
217 //--------------------------------------------------------------------------------------------------------------------------------------------
219 // UFI read capacity cmd
227 UCHAR AllocationLengthMsb
;
228 UCHAR AllocationLengthLsb
;
230 }UFI_READ_FORMAT_CAPACITY
, *PUFI_READ_FORMAT_CAPACITY
;
232 C_ASSERT(sizeof(UFI_READ_FORMAT_CAPACITY
) == 12);
234 #define UFI_READ_FORMAT_CAPACITY_CMD_LEN (10)
241 UCHAR CapacityLength
;
242 }UFI_CAPACITY_FORMAT_HEADER
, *PUFI_CAPACITY_FORMAT_HEADER
;
244 C_ASSERT(sizeof(UFI_CAPACITY_FORMAT_HEADER
) == 4);
250 UCHAR BlockLengthByte0
;
251 UCHAR BlockLengthByte1
;
252 UCHAR BlockLengthByte2
;
253 }UFI_CAPACITY_DESCRIPTOR
, *PUFI_CAPACITY_DESCRIPTOR
;
255 #define UNFORMATTED_MEDIA_CODE_DESCRIPTORY_TYPE (1)
256 #define FORMAT_MEDIA_CODE_DESCRIPTOR_TYPE (2)
257 #define CARTRIDGE_MEDIA_CODE_DESCRIPTOR_TYPE (3)
262 //--------------------------------------------------------------------------------------------------------------------------------------------
264 // UFI test unit command
269 UCHAR Code
; // operation code 0x00
271 UCHAR Reserved
[10]; // reserved 0x00
272 }UFI_TEST_UNIT_CMD
, *PUFI_TEST_UNIT_CMD
;
274 C_ASSERT(sizeof(UFI_TEST_UNIT_CMD
) == 12);
276 #define UFI_TEST_UNIT_CMD_LEN (6)
278 //-------------------------------------------------------------------------------------------------------------------------------------------
282 }UFI_UNKNOWN_CMD
, *PUFI_UNKNOWN_CMD
;
293 ULONG TransferDataLength
;
295 PFDO_DEVICE_EXTENSION FDODeviceExtension
;
296 PPDO_DEVICE_EXTENSION PDODeviceExtension
;
297 PMDL TransferBufferMDL
;
300 }IRP_CONTEXT
, *PIRP_CONTEXT
;
302 typedef struct _ERRORHANDLER_WORKITEM_DATA
304 PDEVICE_OBJECT DeviceObject
;
305 PIRP_CONTEXT Context
;
306 WORK_QUEUE_ITEM WorkQueueItem
;
308 } ERRORHANDLER_WORKITEM_DATA
, *PERRORHANDLER_WORKITEM_DATA
;
311 //---------------------------------------------------------------------
316 USBSTOR_FdoHandlePnp(
317 IN PDEVICE_OBJECT DeviceObject
,
320 //---------------------------------------------------------------------
325 USBSTOR_PdoHandlePnp(
326 IN PDEVICE_OBJECT DeviceObject
,
331 IN PDEVICE_OBJECT DeviceObject
,
334 //---------------------------------------------------------------------
340 USBSTOR_SyncForwardIrp(
341 IN PDEVICE_OBJECT DeviceObject
,
346 USBSTOR_GetBusInterface(
347 IN PDEVICE_OBJECT DeviceObject
,
348 OUT PUSB_BUS_INTERFACE_USBDI_V2 BusInterface
);
352 IN POOL_TYPE PoolType
,
360 USBSTOR_SyncUrbRequest(
361 IN PDEVICE_OBJECT DeviceObject
,
362 OUT PURB UrbRequest
);
366 IN PDEVICE_OBJECT DeviceObject
,
367 IN PFDO_DEVICE_EXTENSION DeviceExtension
);
371 USBSTOR_SyncForwardIrpCompletionRoutine(
372 PDEVICE_OBJECT DeviceObject
,
378 IN PDEVICE_OBJECT DeviceObject
,
379 IN PFDO_DEVICE_EXTENSION DeviceExtension
);
384 IN ULONG BufferLength
,
385 OUT PUCHAR MediumTypeCode
);
387 //---------------------------------------------------------------------
389 // descriptor.c routines
393 USBSTOR_GetDescriptors(
394 IN PDEVICE_OBJECT DeviceObject
);
397 USBSTOR_SelectConfigurationAndInterface(
398 IN PDEVICE_OBJECT DeviceObject
,
399 IN PFDO_DEVICE_EXTENSION DeviceExtension
);
402 USBSTOR_GetPipeHandles(
403 IN PFDO_DEVICE_EXTENSION DeviceExtension
);
405 //---------------------------------------------------------------------
410 USBSTOR_HandleExecuteSCSI(
411 IN PDEVICE_OBJECT DeviceObject
,
413 IN ULONG RetryCount
);
417 USBSTOR_CSWCompletionRoutine(
418 PDEVICE_OBJECT DeviceObject
,
424 PIRP_CONTEXT Context
,
429 PIRP_CONTEXT Context
,
433 //---------------------------------------------------------------------
438 USBSTOR_HandleInternalDeviceControl(
439 IN PDEVICE_OBJECT DeviceObject
,
443 USBSTOR_HandleDeviceControl(
444 IN PDEVICE_OBJECT DeviceObject
,
447 //---------------------------------------------------------------------
454 PDEVICE_OBJECT DeviceObject
,
458 USBSTOR_QueueWaitForPendingRequests(
459 IN PDEVICE_OBJECT DeviceObject
);
462 USBSTOR_QueueRelease(
463 IN PDEVICE_OBJECT DeviceObject
);
467 IN PDEVICE_OBJECT DeviceObject
,
473 IN PDEVICE_OBJECT DeviceObject
,
477 USBSTOR_QueueInitialize(
478 PFDO_DEVICE_EXTENSION FDODeviceExtension
);
482 ErrorHandlerWorkItemRoutine(
487 ResetHandlerWorkItemRoutine(
493 USBSTOR_QueueNextRequest(
494 IN PDEVICE_OBJECT DeviceObject
);
497 USBSTOR_QueueTerminateRequest(
498 IN PDEVICE_OBJECT DeviceObject
,
503 USBSTOR_GetEndpointStatus(
504 IN PDEVICE_OBJECT DeviceObject
,
505 IN UCHAR bEndpointAddress
,
509 USBSTOR_ResetPipeWithHandle(
510 IN PDEVICE_OBJECT DeviceObject
,
511 IN USBD_PIPE_HANDLE PipeHandle
);
515 USBSTOR_TimerRoutine(
516 PDEVICE_OBJECT DeviceObject
,
519 #endif /* _USBSTOR_H_ */