[USBSTOR] Do not create a new Irp for USB requests - use the original one
[reactos.git] / drivers / usb / usbstor / usbstor.h
1 #ifndef _USBSTOR_H_
2 #define _USBSTOR_H_
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 #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))
15
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))
20
21
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))
26
27 #define USB_RECOVERABLE_ERRORS (USBD_STATUS_STALL_PID | USBD_STATUS_DEV_NOT_RESPONDING \
28 | USBD_STATUS_ENDPOINT_HALTED | USBD_STATUS_NO_BANDWIDTH)
29
30 typedef struct __COMMON_DEVICE_EXTENSION__
31 {
32 BOOLEAN IsFDO;
33
34 }USBSTOR_COMMON_DEVICE_EXTENSION, *PUSBSTOR_COMMON_DEVICE_EXTENSION;
35
36 typedef struct
37 {
38 USBSTOR_COMMON_DEVICE_EXTENSION Common; // common device extension
39
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;
65
66 typedef struct
67 {
68 USBSTOR_COMMON_DEVICE_EXTENSION Common;
69 PDEVICE_OBJECT LowerDeviceObject; // points to FDO
70 UCHAR LUN; // lun id
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;
81
82 //
83 // max lun command identifier
84 //
85 #define USB_BULK_GET_MAX_LUN 0xFE
86 #define USB_BULK_RESET_DEVICE 0xFF
87
88 #include <pshpack1.h>
89 typedef struct
90 {
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];
98 }CBW, *PCBW;
99
100 C_ASSERT(sizeof(CBW) == 31);
101
102
103 #define CBW_SIGNATURE 0x43425355
104 #define CSW_SIGNATURE 0x53425355
105
106 #define MAX_LUN 0xF
107
108 #define CSW_STATUS_COMMAND_PASSED 0x00
109 #define CSW_STATUS_COMMAND_FAILED 0x01
110 #define CSW_STATUS_PHASE_ERROR 0x02
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 contiguous logic blocks byte
170 UCHAR ContiguousLogicBlocksByte1; // msb contiguous 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 Capacity 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 #define UFI_READ_CAPACITY_CMD_LEN 0xA
206 C_ASSERT(sizeof(UFI_CAPACITY_RESPONSE) == 8);
207
208 //--------------------------------------------------------------------------------------------------------------------------------------------
209 //
210 // UFI sense mode cmd
211 //
212 typedef struct
213 {
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
220 UCHAR Reserved1[3];
221 }UFI_SENSE_CMD, *PUFI_SENSE_CMD;
222
223 C_ASSERT(sizeof(UFI_SENSE_CMD) == 12);
224
225 #define UFI_SENSE_CMD_LEN (6)
226
227 typedef struct
228 {
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;
237
238
239 C_ASSERT(sizeof(UFI_MODE_PARAMETER_HEADER) == 8);
240
241 typedef struct
242 {
243 UCHAR PC;
244 UCHAR PageLength;
245 UCHAR Reserved1;
246 UCHAR ITM;
247 UCHAR Flags;
248 UCHAR Reserved[3];
249 }UFI_TIMER_PROTECT_PAGE, *PUFI_TIMER_PROTECT_PAGE;
250 C_ASSERT(sizeof(UFI_TIMER_PROTECT_PAGE) == 8);
251
252 //--------------------------------------------------------------------------------------------------------------------------------------------
253 //
254 // UFI read capacity cmd
255 //
256
257 typedef struct
258 {
259 UCHAR Code;
260 UCHAR LUN;
261 UCHAR Reserved[5];
262 UCHAR AllocationLengthMsb;
263 UCHAR AllocationLengthLsb;
264 UCHAR Reserved1[3];
265 }UFI_READ_FORMAT_CAPACITY, *PUFI_READ_FORMAT_CAPACITY;
266
267 C_ASSERT(sizeof(UFI_READ_FORMAT_CAPACITY) == 12);
268
269 #define UFI_READ_FORMAT_CAPACITY_CMD_LEN (10)
270
271 typedef struct
272 {
273 UCHAR Reserved1;
274 UCHAR Reserved2;
275 UCHAR Reserved3;
276 UCHAR CapacityLength;
277 }UFI_CAPACITY_FORMAT_HEADER, *PUFI_CAPACITY_FORMAT_HEADER;
278
279 C_ASSERT(sizeof(UFI_CAPACITY_FORMAT_HEADER) == 4);
280
281 typedef struct
282 {
283 ULONG BlockCount;
284 UCHAR Code;
285 UCHAR BlockLengthByte0;
286 UCHAR BlockLengthByte1;
287 UCHAR BlockLengthByte2;
288 }UFI_CAPACITY_DESCRIPTOR, *PUFI_CAPACITY_DESCRIPTOR;
289
290 #define UNFORMATTED_MEDIA_CODE_DESCRIPTORY_TYPE (1)
291 #define FORMAT_MEDIA_CODE_DESCRIPTOR_TYPE (2)
292 #define CARTRIDGE_MEDIA_CODE_DESCRIPTOR_TYPE (3)
293
294
295
296
297 //--------------------------------------------------------------------------------------------------------------------------------------------
298 //
299 // UFI test unit command
300 //
301
302 typedef struct
303 {
304 UCHAR Code; // operation code 0x00
305 UCHAR LUN; // lun
306 UCHAR Reserved[10]; // reserved 0x00
307 }UFI_TEST_UNIT_CMD, *PUFI_TEST_UNIT_CMD;
308
309 C_ASSERT(sizeof(UFI_TEST_UNIT_CMD) == 12);
310
311 #define UFI_TEST_UNIT_CMD_LEN (6)
312
313 //-------------------------------------------------------------------------------------------------------------------------------------------
314 typedef struct
315 {
316 UCHAR Bytes[16];
317 }UFI_UNKNOWN_CMD, *PUFI_UNKNOWN_CMD;
318
319 typedef struct
320 {
321 union
322 {
323 PCBW cbw;
324 PCSW csw;
325 };
326 URB Urb;
327 PIRP Irp;
328 ULONG TransferDataLength;
329 PUCHAR TransferData;
330 PFDO_DEVICE_EXTENSION FDODeviceExtension;
331 PPDO_DEVICE_EXTENSION PDODeviceExtension;
332 PMDL TransferBufferMDL;
333 ULONG ErrorIndex;
334 ULONG RetryCount;
335 }IRP_CONTEXT, *PIRP_CONTEXT;
336
337 typedef struct _ERRORHANDLER_WORKITEM_DATA
338 {
339 PDEVICE_OBJECT DeviceObject;
340 PIRP_CONTEXT Context;
341 WORK_QUEUE_ITEM WorkQueueItem;
342 PIRP Irp;
343 } ERRORHANDLER_WORKITEM_DATA, *PERRORHANDLER_WORKITEM_DATA;
344
345
346 //---------------------------------------------------------------------
347 //
348 // fdo.c routines
349 //
350 NTSTATUS
351 USBSTOR_FdoHandlePnp(
352 IN PDEVICE_OBJECT DeviceObject,
353 IN OUT PIRP Irp);
354
355 //---------------------------------------------------------------------
356 //
357 // pdo.c routines
358 //
359 NTSTATUS
360 USBSTOR_PdoHandlePnp(
361 IN PDEVICE_OBJECT DeviceObject,
362 IN OUT PIRP Irp);
363
364 NTSTATUS
365 USBSTOR_CreatePDO(
366 IN PDEVICE_OBJECT DeviceObject,
367 IN UCHAR LUN);
368
369 //---------------------------------------------------------------------
370 //
371 // misc.c routines
372 //
373 NTSTATUS
374 NTAPI
375 USBSTOR_SyncForwardIrp(
376 IN PDEVICE_OBJECT DeviceObject,
377 IN OUT PIRP Irp);
378
379 NTSTATUS
380 NTAPI
381 USBSTOR_GetBusInterface(
382 IN PDEVICE_OBJECT DeviceObject,
383 OUT PUSB_BUS_INTERFACE_USBDI_V2 BusInterface);
384
385 PVOID
386 AllocateItem(
387 IN POOL_TYPE PoolType,
388 IN ULONG ItemSize);
389
390 VOID
391 FreeItem(
392 IN PVOID Item);
393
394 NTSTATUS
395 USBSTOR_SyncUrbRequest(
396 IN PDEVICE_OBJECT DeviceObject,
397 OUT PURB UrbRequest);
398
399 NTSTATUS
400 USBSTOR_GetMaxLUN(
401 IN PDEVICE_OBJECT DeviceObject,
402 IN PFDO_DEVICE_EXTENSION DeviceExtension);
403
404 NTSTATUS
405 NTAPI
406 USBSTOR_SyncForwardIrpCompletionRoutine(
407 PDEVICE_OBJECT DeviceObject,
408 PIRP Irp,
409 PVOID Context);
410
411 NTSTATUS
412 USBSTOR_ResetDevice(
413 IN PDEVICE_OBJECT DeviceObject,
414 IN PFDO_DEVICE_EXTENSION DeviceExtension);
415
416 BOOLEAN
417 USBSTOR_IsFloppy(
418 IN PUCHAR Buffer,
419 IN ULONG BufferLength,
420 OUT PUCHAR MediumTypeCode);
421
422 //---------------------------------------------------------------------
423 //
424 // descriptor.c routines
425 //
426
427 NTSTATUS
428 USBSTOR_GetDescriptors(
429 IN PDEVICE_OBJECT DeviceObject);
430
431 NTSTATUS
432 USBSTOR_SelectConfigurationAndInterface(
433 IN PDEVICE_OBJECT DeviceObject,
434 IN PFDO_DEVICE_EXTENSION DeviceExtension);
435
436 NTSTATUS
437 USBSTOR_GetPipeHandles(
438 IN PFDO_DEVICE_EXTENSION DeviceExtension);
439
440 //---------------------------------------------------------------------
441 //
442 // scsi.c routines
443 //
444 NTSTATUS
445 USBSTOR_HandleExecuteSCSI(
446 IN PDEVICE_OBJECT DeviceObject,
447 IN PIRP Irp,
448 IN ULONG RetryCount);
449
450 NTSTATUS
451 NTAPI
452 USBSTOR_CSWCompletionRoutine(
453 PDEVICE_OBJECT DeviceObject,
454 PIRP Irp,
455 PVOID Ctx);
456
457 NTSTATUS
458 USBSTOR_SendCBW(
459 PIRP_CONTEXT Context,
460 PIRP Irp);
461
462 VOID
463 USBSTOR_SendCSW(
464 PIRP_CONTEXT Context,
465 PIRP Irp);
466
467
468 //---------------------------------------------------------------------
469 //
470 // disk.c routines
471 //
472 NTSTATUS
473 USBSTOR_HandleInternalDeviceControl(
474 IN PDEVICE_OBJECT DeviceObject,
475 IN PIRP Irp);
476
477 NTSTATUS
478 USBSTOR_HandleDeviceControl(
479 IN PDEVICE_OBJECT DeviceObject,
480 IN PIRP Irp);
481
482 //---------------------------------------------------------------------
483 //
484 // queue.c routines
485 //
486 VOID
487 NTAPI
488 USBSTOR_StartIo(
489 PDEVICE_OBJECT DeviceObject,
490 PIRP Irp);
491
492 VOID
493 USBSTOR_QueueWaitForPendingRequests(
494 IN PDEVICE_OBJECT DeviceObject);
495
496 VOID
497 USBSTOR_QueueRelease(
498 IN PDEVICE_OBJECT DeviceObject);
499
500 BOOLEAN
501 USBSTOR_QueueAddIrp(
502 IN PDEVICE_OBJECT DeviceObject,
503 IN PIRP Irp);
504
505 VOID
506 NTAPI
507 USBSTOR_CancelIo(
508 IN PDEVICE_OBJECT DeviceObject,
509 IN PIRP Irp);
510
511 VOID
512 USBSTOR_QueueInitialize(
513 PFDO_DEVICE_EXTENSION FDODeviceExtension);
514
515 VOID
516 NTAPI
517 ErrorHandlerWorkItemRoutine(
518 PVOID Context);
519
520 VOID
521 NTAPI
522 ResetHandlerWorkItemRoutine(
523 PVOID Context);
524
525
526
527 VOID
528 USBSTOR_QueueNextRequest(
529 IN PDEVICE_OBJECT DeviceObject);
530
531 VOID
532 USBSTOR_QueueTerminateRequest(
533 IN PDEVICE_OBJECT DeviceObject,
534 IN PIRP Irp);
535
536 /* error.c */
537 NTSTATUS
538 USBSTOR_GetEndpointStatus(
539 IN PDEVICE_OBJECT DeviceObject,
540 IN UCHAR bEndpointAddress,
541 OUT PUSHORT Value);
542
543 NTSTATUS
544 USBSTOR_ResetPipeWithHandle(
545 IN PDEVICE_OBJECT DeviceObject,
546 IN USBD_PIPE_HANDLE PipeHandle);
547
548 VOID
549 NTAPI
550 USBSTOR_TimerRoutine(
551 PDEVICE_OBJECT DeviceObject,
552 PVOID Context);
553
554 #endif /* _USBSTOR_H_ */