a1938625b20ce7770bf1ab18f209377bea4f1b67
[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 NTSTATUS NTAPI
39 IoAttachDeviceToDeviceStackSafe(
40 IN PDEVICE_OBJECT SourceDevice,
41 IN PDEVICE_OBJECT TargetDevice,
42 OUT PDEVICE_OBJECT *AttachedToDeviceObject);
43
44 typedef struct __COMMON_DEVICE_EXTENSION__
45 {
46 BOOLEAN IsFDO;
47
48 }USBSTOR_COMMON_DEVICE_EXTENSION, *PUSBSTOR_COMMON_DEVICE_EXTENSION;
49
50 typedef struct
51 {
52 USBSTOR_COMMON_DEVICE_EXTENSION Common; // common device extension
53
54 PDEVICE_OBJECT FunctionalDeviceObject; // functional device object
55 PDEVICE_OBJECT PhysicalDeviceObject; // physical device object
56 PDEVICE_OBJECT LowerDeviceObject; // lower device object
57 USB_BUS_INTERFACE_USBDI_V2 BusInterface; // bus interface of device
58 PUSB_DEVICE_DESCRIPTOR DeviceDescriptor; // usb device descriptor
59 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor; // usb configuration descriptor
60 PUSBD_INTERFACE_INFORMATION InterfaceInformation; // usb interface information
61 USBD_CONFIGURATION_HANDLE ConfigurationHandle; // usb configuration handle
62 UCHAR BulkInPipeIndex; // bulk in pipe index
63 UCHAR BulkOutPipeIndex; // bulk out pipe index
64 UCHAR MaxLUN; // max lun for device
65 PDEVICE_OBJECT ChildPDO[16]; // max 16 child pdo devices
66 KSPIN_LOCK IrpListLock; // irp list lock
67 LIST_ENTRY IrpListHead; // irp list head
68 BOOLEAN IrpListFreeze; // if true the irp list is freezed
69 }FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
70
71 typedef struct
72 {
73 USBSTOR_COMMON_DEVICE_EXTENSION Common;
74 PDEVICE_OBJECT LowerDeviceObject; // points to FDO
75 UCHAR LUN; // lun id
76 PVOID InquiryData; // USB SCSI inquiry data
77 UCHAR Claimed; // indicating if it has been claimed by upper driver
78 ULONG BlockLength; // length of block
79 ULONG LastLogicBlockAddress; // last block address
80 }PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
81
82
83
84
85 //
86 // max lun command identifier
87 //
88 #define USB_BULK_GET_MAX_LUN 0xFE
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 MAX_LUN 0xF
107
108 typedef struct
109 {
110 ULONG Signature; // CSW signature
111 ULONG Tag; // CSW tag
112 ULONG DataResidue; // CSW data transfer diff
113 UCHAR Status; // CSW status
114 }CSW, *PCSW;
115
116 //--------------------------------------------------------------------------------------------------------------------------------------------
117 //
118 // UFI INQUIRY command
119 //
120 typedef struct
121 {
122 UCHAR Code; // operation code 0x12
123 UCHAR LUN; // lun address
124 UCHAR PageCode; // product data information, always 0x00
125 UCHAR Reserved; // reserved 0x00
126 UCHAR AllocationLength; // length of inquiry data to be returned, default 36 bytes
127 UCHAR Reserved1[7]; //reserved bytes 0x00
128 }UFI_INQUIRY_CMD, *PUFI_INQUIRY_CMD;
129
130 C_ASSERT(sizeof(UFI_INQUIRY_CMD) == 12);
131
132 #define UFI_INQUIRY_CMD_LEN 0x6
133
134 //
135 // UFI INQUIRY command response
136 //
137 typedef struct
138 {
139 UCHAR DeviceType; // device type
140 UCHAR RMB; // removable media bit
141 UCHAR Version; // contains version 0x00
142 UCHAR Format; // response format
143 UCHAR Length; // additional length
144 UCHAR Reserved[3]; // reserved
145 UCHAR Vendor[8]; // vendor identification string
146 UCHAR Product[16]; // product identification string
147 UCHAR Revision[4]; // product revision code
148 }UFI_INQUIRY_RESPONSE, *PUFI_INQUIRY_RESPONSE;
149
150 C_ASSERT(sizeof(UFI_INQUIRY_RESPONSE) == 36);
151
152 //--------------------------------------------------------------------------------------------------------------------------------------------
153 //
154 // UFI read cmd
155 //
156 typedef struct
157 {
158 UCHAR Code; // operation code
159 UCHAR LUN; // lun
160 UCHAR LogicalBlockByte0; // lba byte 0
161 UCHAR LogicalBlockByte1; // lba byte 1
162 UCHAR LogicalBlockByte2; // lba byte 2
163 UCHAR LogicalBlockByte3; // lba byte 3
164 UCHAR Reserved; // reserved 0x00
165 USHORT ContiguousLogicBlocks; // num of contiguous logical blocks
166 UCHAR Reserved1[3]; // reserved 0x00
167 }UFI_READ_WRITE_CMD;
168
169 C_ASSERT(sizeof(UFI_READ_WRITE_CMD) == 12);
170
171 #define UFI_READ_WRITE_CMD_LEN (0xA)
172
173 //--------------------------------------------------------------------------------------------------------------------------------------------
174 //
175 // UFI read capacity cmd
176 //
177 typedef struct
178 {
179 UCHAR Code; // operation code 0x25
180 UCHAR LUN; // lun address
181 UCHAR LBA[4]; // logical block address, should be zero
182 UCHAR Reserved1[2]; // reserved 0x00
183 UCHAR PMI; // PMI = 0x00
184 UCHAR Reserved2[3]; // reserved 0x00
185 }UFI_CAPACITY_CMD, *PUFI_CAPACITY_CMD;
186
187 C_ASSERT(sizeof(UFI_CAPACITY_CMD) == 12);
188
189 #define UFI_CAPACITY_CMD_LEN 0xA //FIXME support length 16 too if requested
190
191 //
192 // UFI Read Capcacity command response
193 //
194 typedef struct
195 {
196 ULONG LastLogicalBlockAddress; // last logical block address
197 ULONG BlockLength; // block length in bytes
198 }UFI_CAPACITY_RESPONSE, *PUFI_CAPACITY_RESPONSE;
199
200 C_ASSERT(sizeof(UFI_CAPACITY_RESPONSE) == 8);
201
202 //--------------------------------------------------------------------------------------------------------------------------------------------
203 //
204 // UFI sense mode cmd
205 //
206 typedef struct
207 {
208 UCHAR Code; // operation code
209 UCHAR LUN; // lun address
210 UCHAR PageCode:6; // page code selector
211 UCHAR PC:2; // type of parameters to be returned
212 UCHAR Reserved[4]; // reserved 0x00
213 USHORT AllocationLength; // parameters length
214 UCHAR Reserved1[3];
215 }UFI_SENSE_CMD, *PUFI_SENSE_CMD;
216
217 C_ASSERT(sizeof(UFI_SENSE_CMD) == 12);
218
219 #define UFI_SENSE_CMD_LEN (6)
220
221 typedef struct
222 {
223 USHORT ModeDataLength; // length of parameters for sense cmd
224 UCHAR MediumTypeCode; // 00 for mass storage, 0x94 for floppy
225 UCHAR WP:1; // write protect bit
226 UCHAR Reserved1:2; // reserved 00
227 UCHAR DPOFUA:1; // should be zero
228 UCHAR Reserved2:4; // reserved
229 UCHAR Reserved[4]; // reserved
230 }UFI_MODE_PARAMETER_HEADER, *PUFI_MODE_PARAMETER_HEADER;
231
232
233 C_ASSERT(sizeof(UFI_MODE_PARAMETER_HEADER) == 8);
234
235 typedef struct
236 {
237 UCHAR PC;
238 UCHAR PageLength;
239 UCHAR Reserved1;
240 UCHAR ITM;
241 UCHAR Flags;
242 UCHAR Reserved[3];
243 }UFI_TIMER_PROTECT_PAGE, *PUFI_TIMER_PROTECT_PAGE;
244 C_ASSERT(sizeof(UFI_TIMER_PROTECT_PAGE) == 8);
245
246 //--------------------------------------------------------------------------------------------------------------------------------------------
247 //
248 // UFI test unit command
249 //
250
251 typedef struct
252 {
253 UCHAR Code; // operation code 0x00
254 UCHAR LUN; // lun
255 UCHAR Reserved[10]; // reserved 0x00
256 }UFI_TEST_UNIT_CMD, *PUFI_TEST_UNIT_CMD;
257
258 C_ASSERT(sizeof(UFI_TEST_UNIT_CMD) == 12);
259
260 #define UFI_TEST_UNIT_CMD_LEN (6)
261
262 typedef struct
263 {
264 union
265 {
266 PCBW cbw;
267 PCSW csw;
268 };
269 URB Urb;
270 PIRP Irp;
271 ULONG TransferDataLength;
272 PUCHAR TransferData;
273 PFDO_DEVICE_EXTENSION FDODeviceExtension;
274 PPDO_DEVICE_EXTENSION PDODeviceExtension;
275 PMDL TransferBufferMDL;
276 PKEVENT Event;
277 }IRP_CONTEXT, *PIRP_CONTEXT;
278
279
280
281 //---------------------------------------------------------------------
282 //
283 // fdo.c routines
284 //
285 NTSTATUS
286 USBSTOR_FdoHandlePnp(
287 IN PDEVICE_OBJECT DeviceObject,
288 IN OUT PIRP Irp);
289
290 //---------------------------------------------------------------------
291 //
292 // pdo.c routines
293 //
294 NTSTATUS
295 USBSTOR_PdoHandlePnp(
296 IN PDEVICE_OBJECT DeviceObject,
297 IN OUT PIRP Irp);
298
299 NTSTATUS
300 USBSTOR_CreatePDO(
301 IN PDEVICE_OBJECT DeviceObject,
302 OUT PDEVICE_OBJECT *ChildDeviceObject);
303
304 //---------------------------------------------------------------------
305 //
306 // misc.c routines
307 //
308 NTSTATUS
309 NTAPI
310 USBSTOR_SyncForwardIrp(
311 IN PDEVICE_OBJECT DeviceObject,
312 IN OUT PIRP Irp);
313
314 NTSTATUS
315 NTAPI
316 USBSTOR_GetBusInterface(
317 IN PDEVICE_OBJECT DeviceObject,
318 OUT PUSB_BUS_INTERFACE_USBDI_V2 BusInterface);
319
320 PVOID
321 AllocateItem(
322 IN POOL_TYPE PoolType,
323 IN ULONG ItemSize);
324
325 VOID
326 FreeItem(
327 IN PVOID Item);
328
329 NTSTATUS
330 USBSTOR_SyncUrbRequest(
331 IN PDEVICE_OBJECT DeviceObject,
332 OUT PURB UrbRequest);
333
334 NTSTATUS
335 USBSTOR_GetMaxLUN(
336 IN PDEVICE_OBJECT DeviceObject,
337 IN PFDO_DEVICE_EXTENSION DeviceExtension);
338
339 NTSTATUS
340 NTAPI
341 USBSTOR_SyncForwardIrpCompletionRoutine(
342 PDEVICE_OBJECT DeviceObject,
343 PIRP Irp,
344 PVOID Context);
345
346
347 //---------------------------------------------------------------------
348 //
349 // descriptor.c routines
350 //
351
352 NTSTATUS
353 USBSTOR_GetDescriptors(
354 IN PDEVICE_OBJECT DeviceObject);
355
356 NTSTATUS
357 USBSTOR_SelectConfigurationAndInterface(
358 IN PDEVICE_OBJECT DeviceObject,
359 IN PFDO_DEVICE_EXTENSION DeviceExtension);
360
361 NTSTATUS
362 USBSTOR_GetPipeHandles(
363 IN PFDO_DEVICE_EXTENSION DeviceExtension);
364
365 //---------------------------------------------------------------------
366 //
367 // scsi.c routines
368 //
369 NTSTATUS
370 USBSTOR_HandleExecuteSCSI(
371 IN PDEVICE_OBJECT DeviceObject,
372 IN PIRP Irp);
373
374 //---------------------------------------------------------------------
375 //
376 // disk.c routines
377 //
378 NTSTATUS
379 USBSTOR_HandleInternalDeviceControl(
380 IN PDEVICE_OBJECT DeviceObject,
381 IN PIRP Irp);
382
383 NTSTATUS
384 USBSTOR_HandleDeviceControl(
385 IN PDEVICE_OBJECT DeviceObject,
386 IN PIRP Irp);
387
388 //---------------------------------------------------------------------
389 //
390 // queue.c routines
391 //
392 VOID
393 NTAPI
394 USBSTOR_StartIo(
395 PDEVICE_OBJECT DeviceObject,
396 PIRP Irp);
397
398 VOID
399 USBSTOR_QueueFlushIrps(
400 IN PDEVICE_OBJECT DeviceObject);
401
402 VOID
403 USBSTOR_QueueRelease(
404 IN PDEVICE_OBJECT DeviceObject);
405
406 BOOLEAN
407 USBSTOR_QueueAddIrp(
408 IN PDEVICE_OBJECT DeviceObject,
409 IN PIRP Irp);
410
411 VOID
412 NTAPI
413 USBSTOR_CancelIo(
414 IN PDEVICE_OBJECT DeviceObject,
415 IN PIRP Irp);
416
417 VOID
418 USBSTOR_QueueInitialize(
419 PFDO_DEVICE_EXTENSION FDODeviceExtension);