10 #define USB_STOR_TAG 'sbsu'
13 #define BooleanFlagOn(Flags, SingleFlag) ((BOOLEAN)((((Flags) & (SingleFlag)) != 0)))
17 #define SrbGetCdb(srb) ((PCDB)(srb->Cdb))
20 // Storage subclass codes
22 #define USB_SUBCLASS_RBC 0x01 // Typically, flash devices
23 #define USB_SUBCLASS_8020 0x02 // CD-ROM
24 #define USB_SUBCLASS_QIC 0x03 // QIC-157 Tapes
25 #define USB_SUBCLASS_UFI 0x04 // Floppy
26 #define USB_SUBCLASS_8070 0x05 // Removable media
27 #define USB_SUBCLASS_SCSI 0x06 // Transparent
28 #define USB_SUBCLASS_LOCKABLE 0x07 // Password-protected
30 #define USB_SUBCLASS_ISD200 0xF0 // ISD200 ATA
31 #define USB_SUBCLASS_CYP_ATACB 0xF1 // Cypress ATACB
32 #define USB_SUBCLASS_VENDOR 0xFF // Use vendor specific
34 // Storage protocol codes
36 #define USB_PROTOCOL_CBI 0x00 // Control/Bulk/Interrupt
37 #define USB_PROTOCOL_CB 0x01 // Control/Bulk w/o interrupt
38 #define USB_PROTOCOL_BULK 0x50 // bulk only
39 #define USB_PROTOCOL_UAS 0x62 // USB Attached SCSI
40 #define USB_PROTOCOL_USBAT 0x80 // SCM-ATAPI bridge
41 #define USB_PROTOCOL_EUSB_SDDR09 0x81 // SCM-SCSI bridge for SDDR-09
42 #define USB_PROTOCOL_SDDR55 0x82 // SDDR-55 (made up)
44 #define USB_PROTOCOL_DPCM_USB 0xF0 // Combination CB/SDDR09
45 #define USB_PROTOCOL_FREECOM 0xF1 // Freecom
46 #define USB_PROTOCOL_DATAFAB 0xF2 // Datafab chipsets
47 #define USB_PROTOCOL_JUMPSHOT 0xF3 // Lexar Jumpshot
48 #define USB_PROTOCOL_ALAUDA 0xF4 // Alauda chipsets
49 #define USB_PROTOCOL_KARMA 0xF5 // Rio Karma
50 #define USB_PROTOCOL_VENDOR 0xFF // Use vendor specific
52 // Mass storage class-specific commands
54 #define USB_BULK_GET_MAX_LUN 0xFE
55 #define USB_BULK_RESET_DEVICE 0xFF
57 #define USB_RECOVERABLE_ERRORS (USBD_STATUS_STALL_PID | USBD_STATUS_DEV_NOT_RESPONDING \
58 | USBD_STATUS_ENDPOINT_HALTED | USBD_STATUS_NO_BANDWIDTH)
60 #define USB_MAXCHILDREN 16
62 #define USBSTOR_DEFAULT_MAX_TRANSFER_LENGTH 0x10000
64 #define CBW_SIGNATURE 0x43425355
65 #define CSW_SIGNATURE 0x53425355
71 ULONG Signature
; // CBW signature
72 ULONG Tag
; // CBW Tag of operation
73 ULONG DataTransferLength
; // data transfer length
74 UCHAR Flags
; // CBW Flags endpoint direction
75 UCHAR LUN
; // lun unit
76 UCHAR CommandBlockLength
; // Command block length
77 UCHAR CommandBlock
[16];
80 C_ASSERT(sizeof(CBW
) == 31);
82 #define CSW_STATUS_COMMAND_PASSED 0x00
83 #define CSW_STATUS_COMMAND_FAILED 0x01
84 #define CSW_STATUS_PHASE_ERROR 0x02
88 ULONG Signature
; // CSW signature
90 ULONG DataResidue
; // CSW data transfer diff
91 UCHAR Status
; // CSW status
100 ULONG StallRetryCount
; // the number of retries after receiving USBD_STATUS_STALL_PID status
107 SCSI_REQUEST_BLOCK SenseSrb
;
108 } IRP_CONTEXT
, *PIRP_CONTEXT
;
110 typedef struct __COMMON_DEVICE_EXTENSION__
114 }USBSTOR_COMMON_DEVICE_EXTENSION
, *PUSBSTOR_COMMON_DEVICE_EXTENSION
;
116 #define USBSTOR_FDO_FLAGS_DEVICE_RESETTING 0x00000001 // hard reset is in progress
117 #define USBSTOR_FDO_FLAGS_IRP_LIST_FREEZE 0x00000002 // the irp list is freezed
121 USBSTOR_COMMON_DEVICE_EXTENSION Common
; // common device extension
123 PDEVICE_OBJECT FunctionalDeviceObject
; // functional device object
124 PDEVICE_OBJECT PhysicalDeviceObject
; // physical device object
125 PDEVICE_OBJECT LowerDeviceObject
; // lower device object
126 USB_BUS_INTERFACE_USBDI_V2 BusInterface
; // bus interface of device
127 PUSB_DEVICE_DESCRIPTOR DeviceDescriptor
; // usb device descriptor
128 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
; // usb configuration descriptor
129 PUSB_STRING_DESCRIPTOR SerialNumber
; // usb serial number
130 PUSBD_INTERFACE_INFORMATION InterfaceInformation
; // usb interface information
131 USBD_CONFIGURATION_HANDLE ConfigurationHandle
; // usb configuration handle
132 UCHAR BulkInPipeIndex
; // bulk in pipe index
133 UCHAR BulkOutPipeIndex
; // bulk out pipe index
134 UCHAR MaxLUN
; // max lun for device
135 PDEVICE_OBJECT ChildPDO
[USB_MAXCHILDREN
]; // max 16 child pdo devices
136 KSPIN_LOCK IrpListLock
; // irp list lock
137 LIST_ENTRY IrpListHead
; // irp list head
138 ULONG IrpPendingCount
; // count of irp pending
139 PSCSI_REQUEST_BLOCK ActiveSrb
; // stores the current active SRB
140 KEVENT NoPendingRequests
; // set if no pending or in progress requests
141 PSCSI_REQUEST_BLOCK LastTimerActiveSrb
; // last timer tick active srb
142 ULONG SrbErrorHandlingActive
; // error handling of srb is activated
143 ULONG TimerWorkQueueEnabled
; // timer work queue enabled
144 ULONG InstanceCount
; // pdo instance count
145 KSPIN_LOCK CommonLock
;
146 PIO_WORKITEM ResetDeviceWorkItem
;
148 IRP_CONTEXT CurrentIrpContext
;
149 }FDO_DEVICE_EXTENSION
, *PFDO_DEVICE_EXTENSION
;
153 USBSTOR_COMMON_DEVICE_EXTENSION Common
;
156 BOOLEAN Claimed
; // indicating if it has been claimed by upper driver
157 PDEVICE_OBJECT LowerDeviceObject
; // points to FDO
158 PDEVICE_OBJECT
*PDODeviceObject
; // entry in pdo list
159 PDEVICE_OBJECT Self
; // self
160 // the whole structure is not stored
161 UCHAR InquiryData
[INQUIRYDATABUFFERSIZE
]; // USB SCSI inquiry data
162 }PDO_DEVICE_EXTENSION
, *PPDO_DEVICE_EXTENSION
;
164 typedef struct _ERRORHANDLER_WORKITEM_DATA
166 PDEVICE_OBJECT DeviceObject
;
167 PIRP_CONTEXT Context
;
168 WORK_QUEUE_ITEM WorkQueueItem
;
170 } ERRORHANDLER_WORKITEM_DATA
, *PERRORHANDLER_WORKITEM_DATA
;
172 // we need this to be compatible with ReactOS' classpnp (which is compiled with NTDDI_WIN8)
173 typedef struct _STORAGE_ADAPTER_DESCRIPTOR_WIN8
{
176 ULONG MaximumTransferLength
;
177 ULONG MaximumPhysicalPages
;
179 BOOLEAN AdapterUsesPio
;
180 BOOLEAN AdapterScansDown
;
181 BOOLEAN CommandQueueing
;
182 BOOLEAN AcceleratedTransfer
;
184 USHORT BusMajorVersion
;
185 USHORT BusMinorVersion
;
188 } STORAGE_ADAPTER_DESCRIPTOR_WIN8
, *PSTORAGE_ADAPTER_DESCRIPTOR_WIN8
;
191 //---------------------------------------------------------------------
196 USBSTOR_FdoHandlePnp(
197 IN PDEVICE_OBJECT DeviceObject
,
200 //---------------------------------------------------------------------
205 USBSTOR_PdoHandlePnp(
206 IN PDEVICE_OBJECT DeviceObject
,
211 IN PDEVICE_OBJECT DeviceObject
,
214 //---------------------------------------------------------------------
220 USBSTOR_SyncForwardIrp(
221 IN PDEVICE_OBJECT DeviceObject
,
226 USBSTOR_GetBusInterface(
227 IN PDEVICE_OBJECT DeviceObject
,
228 OUT PUSB_BUS_INTERFACE_USBDI_V2 BusInterface
);
232 IN POOL_TYPE PoolType
,
240 USBSTOR_SyncUrbRequest(
241 IN PDEVICE_OBJECT DeviceObject
,
242 OUT PURB UrbRequest
);
246 IN PDEVICE_OBJECT DeviceObject
,
247 IN PFDO_DEVICE_EXTENSION DeviceExtension
);
251 USBSTOR_SyncForwardIrpCompletionRoutine(
252 PDEVICE_OBJECT DeviceObject
,
258 IN PDEVICE_OBJECT DeviceObject
,
259 IN PFDO_DEVICE_EXTENSION DeviceExtension
);
261 //---------------------------------------------------------------------
263 // descriptor.c routines
267 USBSTOR_GetDescriptors(
268 IN PDEVICE_OBJECT DeviceObject
);
271 USBSTOR_SelectConfigurationAndInterface(
272 IN PDEVICE_OBJECT DeviceObject
,
273 IN PFDO_DEVICE_EXTENSION DeviceExtension
);
276 USBSTOR_GetPipeHandles(
277 IN PFDO_DEVICE_EXTENSION DeviceExtension
);
279 //---------------------------------------------------------------------
284 USBSTOR_HandleExecuteSCSI(
285 IN PDEVICE_OBJECT DeviceObject
,
289 USBSTOR_SendCSWRequest(
290 PFDO_DEVICE_EXTENSION FDODeviceExtension
,
294 //---------------------------------------------------------------------
299 USBSTOR_HandleInternalDeviceControl(
300 IN PDEVICE_OBJECT DeviceObject
,
304 USBSTOR_HandleDeviceControl(
305 IN PDEVICE_OBJECT DeviceObject
,
308 //---------------------------------------------------------------------
315 PDEVICE_OBJECT DeviceObject
,
319 USBSTOR_QueueWaitForPendingRequests(
320 IN PDEVICE_OBJECT DeviceObject
);
323 USBSTOR_QueueRelease(
324 IN PDEVICE_OBJECT DeviceObject
);
328 IN PDEVICE_OBJECT DeviceObject
,
334 IN PDEVICE_OBJECT DeviceObject
,
338 USBSTOR_QueueInitialize(
339 PFDO_DEVICE_EXTENSION FDODeviceExtension
);
342 USBSTOR_QueueNextRequest(
343 IN PDEVICE_OBJECT DeviceObject
);
346 USBSTOR_QueueTerminateRequest(
347 IN PDEVICE_OBJECT DeviceObject
,
350 //---------------------------------------------------------------------
355 USBSTOR_GetEndpointStatus(
356 IN PDEVICE_OBJECT DeviceObject
,
357 IN UCHAR bEndpointAddress
,
361 USBSTOR_ResetPipeWithHandle(
362 IN PDEVICE_OBJECT DeviceObject
,
363 IN USBD_PIPE_HANDLE PipeHandle
);
367 USBSTOR_TimerRoutine(
368 PDEVICE_OBJECT DeviceObject
,
373 USBSTOR_QueueResetPipe(
374 IN PFDO_DEVICE_EXTENSION FDODeviceExtension
);
378 USBSTOR_QueueResetDevice(
379 IN PFDO_DEVICE_EXTENSION FDODeviceExtension
);
381 #endif // _USBSTOR_H_