[USBSTOR]
[reactos.git] / reactos / drivers / usb / usbstor / usbstor.h
1
2 #pragma once
3
4 #include <wdm.h>
5 #include <usbdi.h>
6 #include <usbbusif.h>
7 #include <usbdlib.h>
8 #include <classpnp.h>
9
10 #define USB_STOR_TAG 'sbsu'
11 #define USB_MAXCHILDREN (16)
12
13
14
15 #define HTONS(n) (((((unsigned short)(n) & 0xFF)) << 8) | (((unsigned short)(n) & 0xFF00) >> 8))
16 #define NTOHS(n) (((((unsigned short)(n) & 0xFF)) << 8) | (((unsigned short)(n) & 0xFF00) >> 8))
17
18 #define HTONL(n) (((((unsigned long)(n) & 0xFF)) << 24) | \
19 ((((unsigned long)(n) & 0xFF00)) << 8) | \
20 ((((unsigned long)(n) & 0xFF0000)) >> 8) | \
21 ((((unsigned long)(n) & 0xFF000000)) >> 24))
22
23
24 #define NTOHL(n) (((((unsigned long)(n) & 0xFF)) << 24) | \
25 ((((unsigned long)(n) & 0xFF00)) << 8) | \
26 ((((unsigned long)(n) & 0xFF0000)) >> 8) | \
27 ((((unsigned long)(n) & 0xFF000000)) >> 24))
28
29 #define USB_RECOVERABLE_ERRORS (USBD_STATUS_STALL_PID | USBD_STATUS_DEV_NOT_RESPONDING \
30 | USBD_STATUS_ENDPOINT_HALTED | USBD_STATUS_NO_BANDWIDTH)
31
32 typedef struct __COMMON_DEVICE_EXTENSION__
33 {
34 BOOLEAN IsFDO;
35
36 }USBSTOR_COMMON_DEVICE_EXTENSION, *PUSBSTOR_COMMON_DEVICE_EXTENSION;
37
38 typedef struct
39 {
40 USBSTOR_COMMON_DEVICE_EXTENSION Common; // common device extension
41
42 PDEVICE_OBJECT FunctionalDeviceObject; // functional device object
43 PDEVICE_OBJECT PhysicalDeviceObject; // physical device object
44 PDEVICE_OBJECT LowerDeviceObject; // lower device object
45 USB_BUS_INTERFACE_USBDI_V2 BusInterface; // bus interface of device
46 PUSB_DEVICE_DESCRIPTOR DeviceDescriptor; // usb device descriptor
47 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor; // usb configuration descriptor
48 PUSB_STRING_DESCRIPTOR SerialNumber; // usb serial number
49 PUSBD_INTERFACE_INFORMATION InterfaceInformation; // usb interface information
50 USBD_CONFIGURATION_HANDLE ConfigurationHandle; // usb configuration handle
51 UCHAR BulkInPipeIndex; // bulk in pipe index
52 UCHAR BulkOutPipeIndex; // bulk out pipe index
53 UCHAR MaxLUN; // max lun for device
54 PDEVICE_OBJECT ChildPDO[16]; // max 16 child pdo devices
55 KSPIN_LOCK IrpListLock; // irp list lock
56 LIST_ENTRY IrpListHead; // irp list head
57 BOOLEAN IrpListFreeze; // if true the irp list is freezed
58 BOOLEAN ResetInProgress; // if hard reset is in progress
59 ULONG IrpPendingCount; // count of irp pending
60 PSCSI_REQUEST_BLOCK ActiveSrb; // stores the current active SRB
61 KEVENT NoPendingRequests; // set if no pending or in progress requests
62 PSCSI_REQUEST_BLOCK LastTimerActiveSrb; // last timer tick active srb
63 ULONG SrbErrorHandlingActive; // error handling of srb is activated
64 ULONG TimerWorkQueueEnabled; // timer work queue enabled
65 ULONG InstanceCount; // pdo instance count
66 }FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
67
68 typedef struct
69 {
70 USBSTOR_COMMON_DEVICE_EXTENSION Common;
71 PDEVICE_OBJECT LowerDeviceObject; // points to FDO
72 UCHAR LUN; // lun id
73 PVOID InquiryData; // USB SCSI inquiry data
74 PUCHAR FormatData; // USB SCSI Read Format Capacity Data
75 UCHAR Claimed; // indicating if it has been claimed by upper driver
76 ULONG BlockLength; // length of block
77 ULONG LastLogicBlockAddress; // last block address
78 PDEVICE_OBJECT *PDODeviceObject; // entry in pdo list
79 PDEVICE_OBJECT Self; // self
80 UCHAR MediumTypeCode; // floppy medium type code
81 UCHAR IsFloppy; // is device floppy
82 }PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
83
84 //
85 // max lun command identifier
86 //
87 #define USB_BULK_GET_MAX_LUN 0xFE
88 #define USB_BULK_RESET_DEVICE 0xFF
89
90 #include <pshpack1.h>
91 typedef struct
92 {
93 ULONG Signature; // CBW signature
94 ULONG Tag; // CBW Tag of operation
95 ULONG DataTransferLength; // data transfer length
96 UCHAR Flags; // CBW Flags endpoint direction
97 UCHAR LUN; // lun unit
98 UCHAR CommandBlockLength; // Command block length
99 UCHAR CommandBlock[16];
100 }CBW, *PCBW;
101
102 C_ASSERT(sizeof(CBW) == 31);
103
104
105 #define CBW_SIGNATURE 0x43425355
106 #define CSW_SIGNATURE 0x53425355
107
108 #define MAX_LUN 0xF
109
110 typedef struct
111 {
112 ULONG Signature; // CSW signature
113 ULONG Tag; // CSW tag
114 ULONG DataResidue; // CSW data transfer diff
115 UCHAR Status; // CSW status
116 }CSW, *PCSW;
117
118 //--------------------------------------------------------------------------------------------------------------------------------------------
119 //
120 // UFI INQUIRY command
121 //
122 typedef struct
123 {
124 UCHAR Code; // operation code 0x12
125 UCHAR LUN; // lun address
126 UCHAR PageCode; // product data information, always 0x00
127 UCHAR Reserved; // reserved 0x00
128 UCHAR AllocationLength; // length of inquiry data to be returned, default 36 bytes
129 UCHAR Reserved1[7]; //reserved bytes 0x00
130 }UFI_INQUIRY_CMD, *PUFI_INQUIRY_CMD;
131
132 C_ASSERT(sizeof(UFI_INQUIRY_CMD) == 12);
133
134 #define UFI_INQUIRY_CMD_LEN 0x6
135
136 //
137 // UFI INQUIRY command response
138 //
139 typedef struct
140 {
141 UCHAR DeviceType; // device type
142 UCHAR RMB; // removable media bit
143 UCHAR Version; // contains version 0x00
144 UCHAR Format; // response format
145 UCHAR Length; // additional length
146 UCHAR Reserved[3]; // reserved
147 UCHAR Vendor[8]; // vendor identification string
148 UCHAR Product[16]; // product identification string
149 UCHAR Revision[4]; // product revision code
150 }UFI_INQUIRY_RESPONSE, *PUFI_INQUIRY_RESPONSE;
151
152 C_ASSERT(sizeof(UFI_INQUIRY_RESPONSE) == 36);
153
154 //--------------------------------------------------------------------------------------------------------------------------------------------
155 //
156 // UFI read cmd
157 //
158 typedef struct
159 {
160 UCHAR Code; // operation code
161 UCHAR LUN; // lun
162 UCHAR LogicalBlockByte0; // lba byte 0
163 UCHAR LogicalBlockByte1; // lba byte 1
164 UCHAR LogicalBlockByte2; // lba byte 2
165 UCHAR LogicalBlockByte3; // lba byte 3
166 UCHAR Reserved; // reserved 0x00
167 UCHAR ContiguousLogicBlocksByte0; // msb contigious logic blocks byte
168 UCHAR ContiguousLogicBlocksByte1; // msb contigious logic blocks
169 UCHAR Reserved1[3]; // reserved 0x00
170 }UFI_READ_WRITE_CMD;
171
172 C_ASSERT(sizeof(UFI_READ_WRITE_CMD) == 12);
173
174 #define UFI_READ_WRITE_CMD_LEN (0xA)
175
176 //--------------------------------------------------------------------------------------------------------------------------------------------
177 //
178 // UFI read capacity cmd
179 //
180 typedef struct
181 {
182 UCHAR Code; // operation code 0x25
183 UCHAR LUN; // lun address
184 UCHAR LBA[4]; // logical block address, should be zero
185 UCHAR Reserved1[2]; // reserved 0x00
186 UCHAR PMI; // PMI = 0x00
187 UCHAR Reserved2[3]; // reserved 0x00
188 }UFI_CAPACITY_CMD, *PUFI_CAPACITY_CMD;
189
190 C_ASSERT(sizeof(UFI_CAPACITY_CMD) == 12);
191
192 #define UFI_CAPACITY_CMD_LEN 0xA //FIXME support length 16 too if requested
193
194 //
195 // UFI Read Capcacity command response
196 //
197 typedef struct
198 {
199 ULONG LastLogicalBlockAddress; // last logical block address
200 ULONG BlockLength; // block length in bytes
201 }UFI_CAPACITY_RESPONSE, *PUFI_CAPACITY_RESPONSE;
202
203 #define UFI_READ_CAPACITY_CMD_LEN 0xA
204 C_ASSERT(sizeof(UFI_CAPACITY_RESPONSE) == 8);
205
206 //--------------------------------------------------------------------------------------------------------------------------------------------
207 //
208 // UFI sense mode cmd
209 //
210 typedef struct
211 {
212 UCHAR Code; // operation code
213 UCHAR LUN; // lun address
214 UCHAR PageCode:6; // page code selector
215 UCHAR PC:2; // type of parameters to be returned
216 UCHAR Reserved[4]; // reserved 0x00
217 USHORT AllocationLength; // parameters length
218 UCHAR Reserved1[3];
219 }UFI_SENSE_CMD, *PUFI_SENSE_CMD;
220
221 C_ASSERT(sizeof(UFI_SENSE_CMD) == 12);
222
223 #define UFI_SENSE_CMD_LEN (6)
224
225 typedef struct
226 {
227 USHORT ModeDataLength; // length of parameters for sense cmd
228 UCHAR MediumTypeCode; // 00 for mass storage, 0x94 for floppy
229 UCHAR WP:1; // write protect bit
230 UCHAR Reserved1:2; // reserved 00
231 UCHAR DPOFUA:1; // should be zero
232 UCHAR Reserved2:4; // reserved
233 UCHAR Reserved[4]; // reserved
234 }UFI_MODE_PARAMETER_HEADER, *PUFI_MODE_PARAMETER_HEADER;
235
236
237 C_ASSERT(sizeof(UFI_MODE_PARAMETER_HEADER) == 8);
238
239 typedef struct
240 {
241 UCHAR PC;
242 UCHAR PageLength;
243 UCHAR Reserved1;
244 UCHAR ITM;
245 UCHAR Flags;
246 UCHAR Reserved[3];
247 }UFI_TIMER_PROTECT_PAGE, *PUFI_TIMER_PROTECT_PAGE;
248 C_ASSERT(sizeof(UFI_TIMER_PROTECT_PAGE) == 8);
249
250 //--------------------------------------------------------------------------------------------------------------------------------------------
251 //
252 // UFI read capacity cmd
253 //
254
255 typedef struct
256 {
257 UCHAR Code;
258 UCHAR LUN;
259 UCHAR Reserved[5];
260 UCHAR AllocationLengthMsb;
261 UCHAR AllocationLengthLsb;
262 UCHAR Reserved1[3];
263 }UFI_READ_FORMAT_CAPACITY, *PUFI_READ_FORMAT_CAPACITY;
264
265 C_ASSERT(sizeof(UFI_READ_FORMAT_CAPACITY) == 12);
266
267 #define UFI_READ_FORMAT_CAPACITY_CMD_LEN (10)
268
269 typedef struct
270 {
271 UCHAR Reserved1;
272 UCHAR Reserved2;
273 UCHAR Reserved3;
274 UCHAR CapacityLength;
275 }UFI_CAPACITY_FORMAT_HEADER, *PUFI_CAPACITY_FORMAT_HEADER;
276
277 C_ASSERT(sizeof(UFI_CAPACITY_FORMAT_HEADER) == 4);
278
279 typedef struct
280 {
281 ULONG BlockCount;
282 UCHAR Code;
283 UCHAR BlockLengthByte0;
284 UCHAR BlockLengthByte1;
285 UCHAR BlockLengthByte2;
286 }UFI_CAPACITY_DESCRIPTOR, *PUFI_CAPACITY_DESCRIPTOR;
287
288 #define UNFORMATED_MEDIA_CODE_DESCRIPTORY_TYPE (1)
289 #define FORMAT_MEDIA_CODE_DESCRIPTOR_TYPE (2)
290 #define CARTRIDGE_MEDIA_CODE_DESCRIPTOR_TYPE (3)
291
292
293
294
295 //--------------------------------------------------------------------------------------------------------------------------------------------
296 //
297 // UFI test unit command
298 //
299
300 typedef struct
301 {
302 UCHAR Code; // operation code 0x00
303 UCHAR LUN; // lun
304 UCHAR Reserved[10]; // reserved 0x00
305 }UFI_TEST_UNIT_CMD, *PUFI_TEST_UNIT_CMD;
306
307 C_ASSERT(sizeof(UFI_TEST_UNIT_CMD) == 12);
308
309 #define UFI_TEST_UNIT_CMD_LEN (6)
310
311 //-------------------------------------------------------------------------------------------------------------------------------------------
312 typedef struct
313 {
314 UCHAR Bytes[16];
315 }UFI_UNKNOWN_CMD, *PUFI_UNKNOWN_CMD;
316
317 typedef struct
318 {
319 union
320 {
321 PCBW cbw;
322 PCSW csw;
323 };
324 URB Urb;
325 PIRP Irp;
326 ULONG TransferDataLength;
327 PUCHAR TransferData;
328 PFDO_DEVICE_EXTENSION FDODeviceExtension;
329 PPDO_DEVICE_EXTENSION PDODeviceExtension;
330 PMDL TransferBufferMDL;
331 ULONG ErrorIndex;
332 ULONG RetryCount;
333 }IRP_CONTEXT, *PIRP_CONTEXT;
334
335 typedef struct _ERRORHANDLER_WORKITEM_DATA
336 {
337 PDEVICE_OBJECT DeviceObject;
338 PIRP_CONTEXT Context;
339 WORK_QUEUE_ITEM WorkQueueItem;
340 PIRP Irp;
341 } ERRORHANDLER_WORKITEM_DATA, *PERRORHANDLER_WORKITEM_DATA;
342
343
344 //---------------------------------------------------------------------
345 //
346 // fdo.c routines
347 //
348 NTSTATUS
349 USBSTOR_FdoHandlePnp(
350 IN PDEVICE_OBJECT DeviceObject,
351 IN OUT PIRP Irp);
352
353 //---------------------------------------------------------------------
354 //
355 // pdo.c routines
356 //
357 NTSTATUS
358 USBSTOR_PdoHandlePnp(
359 IN PDEVICE_OBJECT DeviceObject,
360 IN OUT PIRP Irp);
361
362 NTSTATUS
363 USBSTOR_CreatePDO(
364 IN PDEVICE_OBJECT DeviceObject,
365 IN UCHAR LUN);
366
367 //---------------------------------------------------------------------
368 //
369 // misc.c routines
370 //
371 NTSTATUS
372 NTAPI
373 USBSTOR_SyncForwardIrp(
374 IN PDEVICE_OBJECT DeviceObject,
375 IN OUT PIRP Irp);
376
377 NTSTATUS
378 NTAPI
379 USBSTOR_GetBusInterface(
380 IN PDEVICE_OBJECT DeviceObject,
381 OUT PUSB_BUS_INTERFACE_USBDI_V2 BusInterface);
382
383 PVOID
384 AllocateItem(
385 IN POOL_TYPE PoolType,
386 IN ULONG ItemSize);
387
388 VOID
389 FreeItem(
390 IN PVOID Item);
391
392 NTSTATUS
393 USBSTOR_SyncUrbRequest(
394 IN PDEVICE_OBJECT DeviceObject,
395 OUT PURB UrbRequest);
396
397 NTSTATUS
398 USBSTOR_GetMaxLUN(
399 IN PDEVICE_OBJECT DeviceObject,
400 IN PFDO_DEVICE_EXTENSION DeviceExtension);
401
402 NTSTATUS
403 NTAPI
404 USBSTOR_SyncForwardIrpCompletionRoutine(
405 PDEVICE_OBJECT DeviceObject,
406 PIRP Irp,
407 PVOID Context);
408
409 NTSTATUS
410 USBSTOR_ResetDevice(
411 IN PDEVICE_OBJECT DeviceObject,
412 IN PFDO_DEVICE_EXTENSION DeviceExtension);
413
414 BOOLEAN
415 USBSTOR_IsFloppy(
416 IN PUCHAR Buffer,
417 IN ULONG BufferLength,
418 OUT PUCHAR MediumTypeCode);
419
420 //---------------------------------------------------------------------
421 //
422 // descriptor.c routines
423 //
424
425 NTSTATUS
426 USBSTOR_GetDescriptors(
427 IN PDEVICE_OBJECT DeviceObject);
428
429 NTSTATUS
430 USBSTOR_SelectConfigurationAndInterface(
431 IN PDEVICE_OBJECT DeviceObject,
432 IN PFDO_DEVICE_EXTENSION DeviceExtension);
433
434 NTSTATUS
435 USBSTOR_GetPipeHandles(
436 IN PFDO_DEVICE_EXTENSION DeviceExtension);
437
438 //---------------------------------------------------------------------
439 //
440 // scsi.c routines
441 //
442 NTSTATUS
443 USBSTOR_HandleExecuteSCSI(
444 IN PDEVICE_OBJECT DeviceObject,
445 IN PIRP Irp,
446 IN ULONG RetryCount);
447
448 NTSTATUS
449 NTAPI
450 USBSTOR_CSWCompletionRoutine(
451 PDEVICE_OBJECT DeviceObject,
452 PIRP Irp,
453 PVOID Ctx);
454
455 NTSTATUS
456 USBSTOR_SendCBW(
457 PIRP_CONTEXT Context,
458 PIRP Irp);
459
460 VOID
461 USBSTOR_SendCSW(
462 PIRP_CONTEXT Context,
463 PIRP Irp);
464
465
466 //---------------------------------------------------------------------
467 //
468 // disk.c routines
469 //
470 NTSTATUS
471 USBSTOR_HandleInternalDeviceControl(
472 IN PDEVICE_OBJECT DeviceObject,
473 IN PIRP Irp);
474
475 NTSTATUS
476 USBSTOR_HandleDeviceControl(
477 IN PDEVICE_OBJECT DeviceObject,
478 IN PIRP Irp);
479
480 //---------------------------------------------------------------------
481 //
482 // queue.c routines
483 //
484 VOID
485 NTAPI
486 USBSTOR_StartIo(
487 PDEVICE_OBJECT DeviceObject,
488 PIRP Irp);
489
490 VOID
491 USBSTOR_QueueWaitForPendingRequests(
492 IN PDEVICE_OBJECT DeviceObject);
493
494 VOID
495 USBSTOR_QueueRelease(
496 IN PDEVICE_OBJECT DeviceObject);
497
498 BOOLEAN
499 USBSTOR_QueueAddIrp(
500 IN PDEVICE_OBJECT DeviceObject,
501 IN PIRP Irp);
502
503 VOID
504 NTAPI
505 USBSTOR_CancelIo(
506 IN PDEVICE_OBJECT DeviceObject,
507 IN PIRP Irp);
508
509 VOID
510 USBSTOR_QueueInitialize(
511 PFDO_DEVICE_EXTENSION FDODeviceExtension);
512
513 VOID
514 NTAPI
515 ErrorHandlerWorkItemRoutine(
516 PVOID Context);
517
518 VOID
519 NTAPI
520 ResetHandlerWorkItemRoutine(
521 PVOID Context);
522
523
524
525 VOID
526 USBSTOR_QueueNextRequest(
527 IN PDEVICE_OBJECT DeviceObject);
528
529 VOID
530 USBSTOR_QueueTerminateRequest(
531 IN PDEVICE_OBJECT DeviceObject,
532 IN PIRP Irp);
533
534 /* error.c */
535 NTSTATUS
536 USBSTOR_GetEndpointStatus(
537 IN PDEVICE_OBJECT DeviceObject,
538 IN UCHAR bEndpointAddress,
539 OUT PUSHORT Value);
540
541 NTSTATUS
542 USBSTOR_ResetPipeWithHandle(
543 IN PDEVICE_OBJECT DeviceObject,
544 IN USBD_PIPE_HANDLE PipeHandle);
545
546 VOID
547 NTAPI
548 USBSTOR_TimerRoutine(
549 PDEVICE_OBJECT DeviceObject,
550 PVOID Context);
551