[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 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 }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 UCHAR Claimed; // indicating if it has been claimed by upper driver
75 ULONG BlockLength; // length of block
76 ULONG LastLogicBlockAddress; // last block address
77 }PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
78
79 //
80 // max lun command identifier
81 //
82 #define USB_BULK_GET_MAX_LUN 0xFE
83
84 #include <pshpack1.h>
85 typedef struct
86 {
87 ULONG Signature; // CBW signature
88 ULONG Tag; // CBW Tag of operation
89 ULONG DataTransferLength; // data transfer length
90 UCHAR Flags; // CBW Flags endpoint direction
91 UCHAR LUN; // lun unit
92 UCHAR CommandBlockLength; // Command block length
93 UCHAR CommandBlock[16];
94 }CBW, *PCBW;
95
96 C_ASSERT(sizeof(CBW) == 31);
97
98
99 #define CBW_SIGNATURE 0x43425355
100 #define MAX_LUN 0xF
101
102 typedef struct
103 {
104 ULONG Signature; // CSW signature
105 ULONG Tag; // CSW tag
106 ULONG DataResidue; // CSW data transfer diff
107 UCHAR Status; // CSW status
108 }CSW, *PCSW;
109
110 //--------------------------------------------------------------------------------------------------------------------------------------------
111 //
112 // UFI INQUIRY command
113 //
114 typedef struct
115 {
116 UCHAR Code; // operation code 0x12
117 UCHAR LUN; // lun address
118 UCHAR PageCode; // product data information, always 0x00
119 UCHAR Reserved; // reserved 0x00
120 UCHAR AllocationLength; // length of inquiry data to be returned, default 36 bytes
121 UCHAR Reserved1[7]; //reserved bytes 0x00
122 }UFI_INQUIRY_CMD, *PUFI_INQUIRY_CMD;
123
124 C_ASSERT(sizeof(UFI_INQUIRY_CMD) == 12);
125
126 #define UFI_INQUIRY_CMD_LEN 0x6
127
128 //
129 // UFI INQUIRY command response
130 //
131 typedef struct
132 {
133 UCHAR DeviceType; // device type
134 UCHAR RMB; // removable media bit
135 UCHAR Version; // contains version 0x00
136 UCHAR Format; // response format
137 UCHAR Length; // additional length
138 UCHAR Reserved[3]; // reserved
139 UCHAR Vendor[8]; // vendor identification string
140 UCHAR Product[16]; // product identification string
141 UCHAR Revision[4]; // product revision code
142 }UFI_INQUIRY_RESPONSE, *PUFI_INQUIRY_RESPONSE;
143
144 C_ASSERT(sizeof(UFI_INQUIRY_RESPONSE) == 36);
145
146 //--------------------------------------------------------------------------------------------------------------------------------------------
147 //
148 // UFI read cmd
149 //
150 typedef struct
151 {
152 UCHAR Code; // operation code
153 UCHAR LUN; // lun
154 ULONG LogicalBlockAddress; // logical block address
155 UCHAR Reserved; // reserved 0x00
156 USHORT ContiguousLogicBlocks; // num of contiguous logical blocks
157 UCHAR Reserved1[3]; // reserved 0x00
158 }UFI_READ_CMD;
159
160 C_ASSERT(sizeof(UFI_READ_CMD) == 12);
161
162 #define UFI_READ_CMD_LEN (0xA)
163
164 //--------------------------------------------------------------------------------------------------------------------------------------------
165 //
166 // UFI read capacity cmd
167 //
168 typedef struct
169 {
170 UCHAR Code; // operation code 0x25
171 UCHAR LUN; // lun address
172 UCHAR LBA[4]; // logical block address, should be zero
173 UCHAR Reserved1[2]; // reserved 0x00
174 UCHAR PMI; // PMI = 0x00
175 UCHAR Reserved2[3]; // reserved 0x00
176 }UFI_CAPACITY_CMD, *PUFI_CAPACITY_CMD;
177
178 C_ASSERT(sizeof(UFI_CAPACITY_CMD) == 12);
179
180 #define UFI_CAPACITY_CMD_LEN 0xA //FIXME support length 16 too if requested
181
182 //
183 // UFI Read Capcacity command response
184 //
185 typedef struct
186 {
187 ULONG LastLogicalBlockAddress; // last logical block address
188 ULONG BlockLength; // block length in bytes
189 }UFI_CAPACITY_RESPONSE, *PUFI_CAPACITY_RESPONSE;
190
191 C_ASSERT(sizeof(UFI_CAPACITY_RESPONSE) == 8);
192
193 //--------------------------------------------------------------------------------------------------------------------------------------------
194 //
195 // UFI sense mode cmd
196 //
197 typedef struct
198 {
199 UCHAR Code; // operation code
200 UCHAR LUN; // lun address
201 UCHAR PageCode:6; // page code selector
202 UCHAR PC:2; // type of parameters to be returned
203 UCHAR Reserved[4]; // reserved 0x00
204 USHORT AllocationLength; // parameters length
205 UCHAR Reserved1[3];
206 }UFI_SENSE_CMD, *PUFI_SENSE_CMD;
207
208 C_ASSERT(sizeof(UFI_SENSE_CMD) == 12);
209
210 #define UFI_SENSE_CMD_LEN (6)
211
212 typedef struct
213 {
214 USHORT ModeDataLength; // length of parameters for sense cmd
215 UCHAR MediumTypeCode; // 00 for mass storage, 0x94 for floppy
216 UCHAR WP:1; // write protect bit
217 UCHAR Reserved1:2; // reserved 00
218 UCHAR DPOFUA:1; // should be zero
219 UCHAR Reserved2:4; // reserved
220 UCHAR Reserved[4]; // reserved
221 }UFI_MODE_PARAMETER_HEADER, *PUFI_MODE_PARAMETER_HEADER;
222
223
224 C_ASSERT(sizeof(UFI_MODE_PARAMETER_HEADER) == 8);
225
226 typedef struct
227 {
228 UCHAR PC;
229 UCHAR PageLength;
230 UCHAR Reserved1;
231 UCHAR ITM;
232 UCHAR Flags;
233 UCHAR Reserved[3];
234 }UFI_TIMER_PROTECT_PAGE, *PUFI_TIMER_PROTECT_PAGE;
235 C_ASSERT(sizeof(UFI_TIMER_PROTECT_PAGE) == 8);
236
237 //--------------------------------------------------------------------------------------------------------------------------------------------
238 //
239 // UFI test unit command
240 //
241
242 typedef struct
243 {
244 UCHAR Code; // operation code 0x00
245 UCHAR LUN; // lun
246 UCHAR Reserved[10]; // reserved 0x00
247 }UFI_TEST_UNIT_CMD, *PUFI_TEST_UNIT_CMD;
248
249 C_ASSERT(sizeof(UFI_TEST_UNIT_CMD) == 12);
250
251 #define UFI_TEST_UNIT_CMD_LEN (6)
252
253 typedef struct
254 {
255 union
256 {
257 PCBW cbw;
258 PCSW csw;
259 };
260 URB Urb;
261 PIRP Irp;
262 ULONG TransferDataLength;
263 PUCHAR TransferData;
264 PFDO_DEVICE_EXTENSION FDODeviceExtension;
265 PPDO_DEVICE_EXTENSION PDODeviceExtension;
266 PMDL TransferBufferMDL;
267 PKEVENT Event;
268 }IRP_CONTEXT, *PIRP_CONTEXT;
269
270
271
272 //---------------------------------------------------------------------
273 //
274 // fdo.c routines
275 //
276 NTSTATUS
277 USBSTOR_FdoHandlePnp(
278 IN PDEVICE_OBJECT DeviceObject,
279 IN OUT PIRP Irp);
280
281 //---------------------------------------------------------------------
282 //
283 // pdo.c routines
284 //
285 NTSTATUS
286 USBSTOR_PdoHandlePnp(
287 IN PDEVICE_OBJECT DeviceObject,
288 IN OUT PIRP Irp);
289
290 NTSTATUS
291 USBSTOR_CreatePDO(
292 IN PDEVICE_OBJECT DeviceObject,
293 OUT PDEVICE_OBJECT *ChildDeviceObject);
294
295 //---------------------------------------------------------------------
296 //
297 // misc.c routines
298 //
299 NTSTATUS
300 NTAPI
301 USBSTOR_SyncForwardIrp(
302 IN PDEVICE_OBJECT DeviceObject,
303 IN OUT PIRP Irp);
304
305 NTSTATUS
306 NTAPI
307 USBSTOR_GetBusInterface(
308 IN PDEVICE_OBJECT DeviceObject,
309 OUT PUSB_BUS_INTERFACE_USBDI_V2 BusInterface);
310
311 PVOID
312 AllocateItem(
313 IN POOL_TYPE PoolType,
314 IN ULONG ItemSize);
315
316 VOID
317 FreeItem(
318 IN PVOID Item);
319
320 NTSTATUS
321 USBSTOR_SyncUrbRequest(
322 IN PDEVICE_OBJECT DeviceObject,
323 OUT PURB UrbRequest);
324
325 NTSTATUS
326 USBSTOR_GetMaxLUN(
327 IN PDEVICE_OBJECT DeviceObject,
328 IN PFDO_DEVICE_EXTENSION DeviceExtension);
329
330 NTSTATUS
331 NTAPI
332 USBSTOR_SyncForwardIrpCompletionRoutine(
333 PDEVICE_OBJECT DeviceObject,
334 PIRP Irp,
335 PVOID Context);
336
337
338 //---------------------------------------------------------------------
339 //
340 // descriptor.c routines
341 //
342
343 NTSTATUS
344 USBSTOR_GetDescriptors(
345 IN PDEVICE_OBJECT DeviceObject);
346
347 NTSTATUS
348 USBSTOR_SelectConfigurationAndInterface(
349 IN PDEVICE_OBJECT DeviceObject,
350 IN PFDO_DEVICE_EXTENSION DeviceExtension);
351
352 NTSTATUS
353 USBSTOR_GetPipeHandles(
354 IN PFDO_DEVICE_EXTENSION DeviceExtension);
355
356 //---------------------------------------------------------------------
357 //
358 // scsi.c routines
359 //
360 NTSTATUS
361 USBSTOR_SendInquiryCmd(
362 IN PDEVICE_OBJECT DeviceObject);
363
364 NTSTATUS
365 USBSTOR_SendCapacityCmd(
366 IN PDEVICE_OBJECT DeviceObject,
367 IN PIRP Irp);
368
369 NTSTATUS
370 USBSTOR_SendModeSenseCmd(
371 IN PDEVICE_OBJECT DeviceObject,
372 IN PIRP Irp);
373
374 NTSTATUS
375 USBSTOR_SendReadCmd(
376 IN PDEVICE_OBJECT DeviceObject,
377 IN PIRP Irp);
378
379 NTSTATUS
380 USBSTOR_SendTestUnitCmd(
381 IN PDEVICE_OBJECT DeviceObject,
382 IN PIRP Irp);
383
384 //---------------------------------------------------------------------
385 //
386 // disk.c routines
387 //
388 NTSTATUS
389 USBSTOR_HandleInternalDeviceControl(
390 IN PDEVICE_OBJECT DeviceObject,
391 IN PIRP Irp);
392
393 NTSTATUS
394 USBSTOR_HandleDeviceControl(
395 IN PDEVICE_OBJECT DeviceObject,
396 IN PIRP Irp);
397
398