[USBSTOR]
[reactos.git] / drivers / usb / usbstor / usbstor.h
1
2 #pragma once
3
4 #include <ntddk.h>
5 #define NDEBUG
6 #include <debug.h>
7 #include <usbdi.h>
8 #include <hubbusif.h>
9 #include <usbbusif.h>
10 #include <usbioctl.h>
11 #include <usbiodef.h>
12 #include <usb.h>
13 #include <usbdlib.h>
14 #include <stdio.h>
15 #include <wdmguid.h>
16 #include <classpnp.h>
17 #include <scsi.h>
18
19 #define USB_STOR_TAG 'sbsu'
20 #define USB_MAXCHILDREN (16)
21
22
23
24 #define HTONS(n) (((((unsigned short)(n) & 0xFF)) << 8) | (((unsigned short)(n) & 0xFF00) >> 8))
25 #define NTOHS(n) (((((unsigned short)(n) & 0xFF)) << 8) | (((unsigned short)(n) & 0xFF00) >> 8))
26
27 #define HTONL(n) (((((unsigned long)(n) & 0xFF)) << 24) | \
28 ((((unsigned long)(n) & 0xFF00)) << 8) | \
29 ((((unsigned long)(n) & 0xFF0000)) >> 8) | \
30 ((((unsigned long)(n) & 0xFF000000)) >> 24))
31
32
33 #define NTOHL(n) (((((unsigned long)(n) & 0xFF)) << 24) | \
34 ((((unsigned long)(n) & 0xFF00)) << 8) | \
35 ((((unsigned long)(n) & 0xFF0000)) >> 8) | \
36 ((((unsigned long)(n) & 0xFF000000)) >> 24))
37
38 #define USB_RECOVERABLE_ERRORS (USBD_STATUS_STALL_PID | USBD_STATUS_DEV_NOT_RESPONDING \
39 | USBD_STATUS_ENDPOINT_HALTED | USBD_STATUS_NO_BANDWIDTH)
40
41 NTSTATUS NTAPI
42 IoAttachDeviceToDeviceStackSafe(
43 IN PDEVICE_OBJECT SourceDevice,
44 IN PDEVICE_OBJECT TargetDevice,
45 OUT PDEVICE_OBJECT *AttachedToDeviceObject);
46
47 typedef struct __COMMON_DEVICE_EXTENSION__
48 {
49 BOOLEAN IsFDO;
50
51 }USBSTOR_COMMON_DEVICE_EXTENSION, *PUSBSTOR_COMMON_DEVICE_EXTENSION;
52
53 typedef struct
54 {
55 USBSTOR_COMMON_DEVICE_EXTENSION Common; // common device extension
56
57 PDEVICE_OBJECT FunctionalDeviceObject; // functional device object
58 PDEVICE_OBJECT PhysicalDeviceObject; // physical device object
59 PDEVICE_OBJECT LowerDeviceObject; // lower device object
60 USB_BUS_INTERFACE_USBDI_V2 BusInterface; // bus interface of device
61 PUSB_DEVICE_DESCRIPTOR DeviceDescriptor; // usb device descriptor
62 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor; // usb configuration descriptor
63 PUSB_STRING_DESCRIPTOR SerialNumber; // usb serial number
64 PUSBD_INTERFACE_INFORMATION InterfaceInformation; // usb interface information
65 USBD_CONFIGURATION_HANDLE ConfigurationHandle; // usb configuration handle
66 UCHAR BulkInPipeIndex; // bulk in pipe index
67 UCHAR BulkOutPipeIndex; // bulk out pipe index
68 UCHAR MaxLUN; // max lun for device
69 PDEVICE_OBJECT ChildPDO[16]; // max 16 child pdo devices
70 KSPIN_LOCK IrpListLock; // irp list lock
71 LIST_ENTRY IrpListHead; // irp list head
72 BOOLEAN IrpListFreeze; // if true the irp list is freezed
73 BOOLEAN ResetInProgress; // if hard reset is in progress
74 ULONG IrpPendingCount; // count of irp pending
75 BOOLEAN SrbActive; // debug field if srb is pending
76 }FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
77
78 typedef struct
79 {
80 USBSTOR_COMMON_DEVICE_EXTENSION Common;
81 PDEVICE_OBJECT LowerDeviceObject; // points to FDO
82 UCHAR LUN; // lun id
83 PVOID InquiryData; // USB SCSI inquiry data
84 UCHAR Claimed; // indicating if it has been claimed by upper driver
85 ULONG BlockLength; // length of block
86 ULONG LastLogicBlockAddress; // last block address
87 }PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
88
89 //
90 // max lun command identifier
91 //
92 #define USB_BULK_GET_MAX_LUN 0xFE
93
94 #include <pshpack1.h>
95 typedef struct
96 {
97 ULONG Signature; // CBW signature
98 ULONG Tag; // CBW Tag of operation
99 ULONG DataTransferLength; // data transfer length
100 UCHAR Flags; // CBW Flags endpoint direction
101 UCHAR LUN; // lun unit
102 UCHAR CommandBlockLength; // Command block length
103 UCHAR CommandBlock[16];
104 }CBW, *PCBW;
105
106 C_ASSERT(sizeof(CBW) == 31);
107
108
109 #define CBW_SIGNATURE 0x43425355
110 #define MAX_LUN 0xF
111
112 typedef struct
113 {
114 ULONG Signature; // CSW signature
115 ULONG Tag; // CSW tag
116 ULONG DataResidue; // CSW data transfer diff
117 UCHAR Status; // CSW status
118 }CSW, *PCSW;
119
120 //--------------------------------------------------------------------------------------------------------------------------------------------
121 //
122 // UFI INQUIRY command
123 //
124 typedef struct
125 {
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;
133
134 C_ASSERT(sizeof(UFI_INQUIRY_CMD) == 12);
135
136 #define UFI_INQUIRY_CMD_LEN 0x6
137
138 //
139 // UFI INQUIRY command response
140 //
141 typedef struct
142 {
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;
153
154 C_ASSERT(sizeof(UFI_INQUIRY_RESPONSE) == 36);
155
156 //--------------------------------------------------------------------------------------------------------------------------------------------
157 //
158 // UFI read cmd
159 //
160 typedef struct
161 {
162 UCHAR Code; // operation code
163 UCHAR LUN; // lun
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 contigious logic blocks byte
170 UCHAR ContiguousLogicBlocksByte1; // msb contigious logic blocks
171 UCHAR Reserved1[3]; // reserved 0x00
172 }UFI_READ_WRITE_CMD;
173
174 C_ASSERT(sizeof(UFI_READ_WRITE_CMD) == 12);
175
176 #define UFI_READ_WRITE_CMD_LEN (0xA)
177
178 //--------------------------------------------------------------------------------------------------------------------------------------------
179 //
180 // UFI read capacity cmd
181 //
182 typedef struct
183 {
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;
191
192 C_ASSERT(sizeof(UFI_CAPACITY_CMD) == 12);
193
194 #define UFI_CAPACITY_CMD_LEN 0xA //FIXME support length 16 too if requested
195
196 //
197 // UFI Read Capcacity command response
198 //
199 typedef struct
200 {
201 ULONG LastLogicalBlockAddress; // last logical block address
202 ULONG BlockLength; // block length in bytes
203 }UFI_CAPACITY_RESPONSE, *PUFI_CAPACITY_RESPONSE;
204
205 C_ASSERT(sizeof(UFI_CAPACITY_RESPONSE) == 8);
206
207 //--------------------------------------------------------------------------------------------------------------------------------------------
208 //
209 // UFI sense mode cmd
210 //
211 typedef struct
212 {
213 UCHAR Code; // operation code
214 UCHAR LUN; // lun address
215 UCHAR PageCode:6; // page code selector
216 UCHAR PC:2; // type of parameters to be returned
217 UCHAR Reserved[4]; // reserved 0x00
218 USHORT AllocationLength; // parameters length
219 UCHAR Reserved1[3];
220 }UFI_SENSE_CMD, *PUFI_SENSE_CMD;
221
222 C_ASSERT(sizeof(UFI_SENSE_CMD) == 12);
223
224 #define UFI_SENSE_CMD_LEN (6)
225
226 typedef struct
227 {
228 USHORT ModeDataLength; // length of parameters for sense cmd
229 UCHAR MediumTypeCode; // 00 for mass storage, 0x94 for floppy
230 UCHAR WP:1; // write protect bit
231 UCHAR Reserved1:2; // reserved 00
232 UCHAR DPOFUA:1; // should be zero
233 UCHAR Reserved2:4; // reserved
234 UCHAR Reserved[4]; // reserved
235 }UFI_MODE_PARAMETER_HEADER, *PUFI_MODE_PARAMETER_HEADER;
236
237
238 C_ASSERT(sizeof(UFI_MODE_PARAMETER_HEADER) == 8);
239
240 typedef struct
241 {
242 UCHAR PC;
243 UCHAR PageLength;
244 UCHAR Reserved1;
245 UCHAR ITM;
246 UCHAR Flags;
247 UCHAR Reserved[3];
248 }UFI_TIMER_PROTECT_PAGE, *PUFI_TIMER_PROTECT_PAGE;
249 C_ASSERT(sizeof(UFI_TIMER_PROTECT_PAGE) == 8);
250
251 //--------------------------------------------------------------------------------------------------------------------------------------------
252 //
253 // UFI test unit command
254 //
255
256 typedef struct
257 {
258 UCHAR Code; // operation code 0x00
259 UCHAR LUN; // lun
260 UCHAR Reserved[10]; // reserved 0x00
261 }UFI_TEST_UNIT_CMD, *PUFI_TEST_UNIT_CMD;
262
263 C_ASSERT(sizeof(UFI_TEST_UNIT_CMD) == 12);
264
265 #define UFI_TEST_UNIT_CMD_LEN (6)
266
267 typedef struct
268 {
269 union
270 {
271 PCBW cbw;
272 PCSW csw;
273 };
274 URB Urb;
275 PIRP Irp;
276 ULONG TransferDataLength;
277 PUCHAR TransferData;
278 PFDO_DEVICE_EXTENSION FDODeviceExtension;
279 PPDO_DEVICE_EXTENSION PDODeviceExtension;
280 PMDL TransferBufferMDL;
281 PKEVENT Event;
282 }IRP_CONTEXT, *PIRP_CONTEXT;
283
284 typedef struct _ERRORHANDLER_WORKITEM_DATA
285 {
286 PDEVICE_OBJECT DeviceObject;
287 PIRP Irp;
288 PIRP_CONTEXT Context;
289 WORK_QUEUE_ITEM WorkQueueItem;
290 } ERRORHANDLER_WORKITEM_DATA, *PERRORHANDLER_WORKITEM_DATA;
291
292
293 //---------------------------------------------------------------------
294 //
295 // fdo.c routines
296 //
297 NTSTATUS
298 USBSTOR_FdoHandlePnp(
299 IN PDEVICE_OBJECT DeviceObject,
300 IN OUT PIRP Irp);
301
302 //---------------------------------------------------------------------
303 //
304 // pdo.c routines
305 //
306 NTSTATUS
307 USBSTOR_PdoHandlePnp(
308 IN PDEVICE_OBJECT DeviceObject,
309 IN OUT PIRP Irp);
310
311 NTSTATUS
312 USBSTOR_CreatePDO(
313 IN PDEVICE_OBJECT DeviceObject,
314 OUT PDEVICE_OBJECT *ChildDeviceObject);
315
316 //---------------------------------------------------------------------
317 //
318 // misc.c routines
319 //
320 NTSTATUS
321 NTAPI
322 USBSTOR_SyncForwardIrp(
323 IN PDEVICE_OBJECT DeviceObject,
324 IN OUT PIRP Irp);
325
326 NTSTATUS
327 NTAPI
328 USBSTOR_GetBusInterface(
329 IN PDEVICE_OBJECT DeviceObject,
330 OUT PUSB_BUS_INTERFACE_USBDI_V2 BusInterface);
331
332 PVOID
333 AllocateItem(
334 IN POOL_TYPE PoolType,
335 IN ULONG ItemSize);
336
337 VOID
338 FreeItem(
339 IN PVOID Item);
340
341 NTSTATUS
342 USBSTOR_SyncUrbRequest(
343 IN PDEVICE_OBJECT DeviceObject,
344 OUT PURB UrbRequest);
345
346 NTSTATUS
347 USBSTOR_GetMaxLUN(
348 IN PDEVICE_OBJECT DeviceObject,
349 IN PFDO_DEVICE_EXTENSION DeviceExtension);
350
351 NTSTATUS
352 NTAPI
353 USBSTOR_SyncForwardIrpCompletionRoutine(
354 PDEVICE_OBJECT DeviceObject,
355 PIRP Irp,
356 PVOID Context);
357
358
359 //---------------------------------------------------------------------
360 //
361 // descriptor.c routines
362 //
363
364 NTSTATUS
365 USBSTOR_GetDescriptors(
366 IN PDEVICE_OBJECT DeviceObject);
367
368 NTSTATUS
369 USBSTOR_SelectConfigurationAndInterface(
370 IN PDEVICE_OBJECT DeviceObject,
371 IN PFDO_DEVICE_EXTENSION DeviceExtension);
372
373 NTSTATUS
374 USBSTOR_GetPipeHandles(
375 IN PFDO_DEVICE_EXTENSION DeviceExtension);
376
377 //---------------------------------------------------------------------
378 //
379 // scsi.c routines
380 //
381 NTSTATUS
382 USBSTOR_HandleExecuteSCSI(
383 IN PDEVICE_OBJECT DeviceObject,
384 IN PIRP Irp);
385
386 NTSTATUS
387 USBSTOR_SendInquiryCmd(
388 IN PDEVICE_OBJECT DeviceObject);
389
390 //---------------------------------------------------------------------
391 //
392 // disk.c routines
393 //
394 NTSTATUS
395 USBSTOR_HandleInternalDeviceControl(
396 IN PDEVICE_OBJECT DeviceObject,
397 IN PIRP Irp);
398
399 NTSTATUS
400 USBSTOR_HandleDeviceControl(
401 IN PDEVICE_OBJECT DeviceObject,
402 IN PIRP Irp);
403
404 //---------------------------------------------------------------------
405 //
406 // queue.c routines
407 //
408 VOID
409 NTAPI
410 USBSTOR_StartIo(
411 PDEVICE_OBJECT DeviceObject,
412 PIRP Irp);
413
414 VOID
415 USBSTOR_QueueFlushIrps(
416 IN PDEVICE_OBJECT DeviceObject);
417
418 VOID
419 USBSTOR_QueueRelease(
420 IN PDEVICE_OBJECT DeviceObject);
421
422 BOOLEAN
423 USBSTOR_QueueAddIrp(
424 IN PDEVICE_OBJECT DeviceObject,
425 IN PIRP Irp);
426
427 VOID
428 NTAPI
429 USBSTOR_CancelIo(
430 IN PDEVICE_OBJECT DeviceObject,
431 IN PIRP Irp);
432
433 VOID
434 USBSTOR_QueueInitialize(
435 PFDO_DEVICE_EXTENSION FDODeviceExtension);
436
437 VOID
438 NTAPI
439 ErrorHandlerWorkItemRoutine(
440 PVOID Context);
441
442 VOID
443 USBSTOR_QueueNextRequest(
444 IN PDEVICE_OBJECT DeviceObject);
445
446 VOID
447 USBSTOR_QueueTerminateRequest(
448 IN PDEVICE_OBJECT DeviceObject,
449 IN BOOLEAN ModifySrbState);