- Remove ALL the unneeded "author date id revision" svn properties.
[reactos.git] / reactos / drivers / storage / class / include / class2.h
1 /* $Id: class2.h 49129 2010-10-12 20:17:55Z pschweitzer $
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: services/storage/include/class2.h
6 * PURPOSE: SCSI class driver definitions
7 * PROGRAMMER: Eric Kohl
8 */
9
10 #pragma once
11
12 #include "ntddscsi.h"
13 #include "srb.h"
14
15 #define MAXIMUM_RETRIES 15
16 #define RETRY_WAIT 2000000 /* 200 ms in units of 100 ns */
17
18 //
19 // Indicates that the device has write caching enabled.
20 //
21
22 #define DEV_WRITE_CACHE 0x00000001
23
24
25 //
26 // Build SCSI 1 or SCSI 2 CDBs
27 //
28
29 #define DEV_USE_SCSI1 0x00000002
30
31 //
32 // Indicates whether is is safe to send StartUnit commands
33 // to this device. It will only be off for some removeable devices.
34 //
35
36 #define DEV_SAFE_START_UNIT 0x00000004
37
38 //
39 // Indicates whether it is unsafe to send SCSIOP_MECHANISM_STATUS commands to
40 // this device. Some devices don't like these 12 byte commands
41 //
42
43 #define DEV_NO_12BYTE_CDB 0x00000008
44
45
46 struct _CLASS_INIT_DATA;
47
48 typedef VOID
49 (NTAPI *PCLASS_ERROR)(IN PDEVICE_OBJECT DeviceObject,
50 IN PSCSI_REQUEST_BLOCK Srb,
51 IN OUT NTSTATUS *Status,
52 IN OUT BOOLEAN *Retry);
53
54 typedef BOOLEAN
55 (NTAPI *PCLASS_DEVICE_CALLBACK)(IN PINQUIRYDATA);
56
57 typedef NTSTATUS
58 (NTAPI *PCLASS_READ_WRITE)(IN PDEVICE_OBJECT DeviceObject,
59 IN PIRP Irp);
60
61 typedef BOOLEAN
62 (NTAPI *PCLASS_FIND_DEVICES)(IN PDRIVER_OBJECT DriverObject,
63 IN PUNICODE_STRING RegistryPath,
64 IN struct _CLASS_INIT_DATA *InitializationData,
65 IN PDEVICE_OBJECT PortDeviceObject,
66 IN ULONG PortNumber);
67
68 typedef NTSTATUS
69 (NTAPI *PCLASS_DEVICE_CONTROL)(IN PDEVICE_OBJECT DeviceObject,
70 IN PIRP Irp);
71
72 typedef NTSTATUS
73 (NTAPI *PCLASS_SHUTDOWN_FLUSH)(IN PDEVICE_OBJECT DeviceObject,
74 IN PIRP Irp);
75
76 typedef NTSTATUS
77 (NTAPI *PCLASS_CREATE_CLOSE)(IN PDEVICE_OBJECT DeviceObject,
78 IN PIRP Irp);
79
80
81 typedef struct _CLASS_INIT_DATA
82 {
83 ULONG InitializationDataSize;
84 ULONG DeviceExtensionSize;
85 DEVICE_TYPE DeviceType;
86 ULONG DeviceCharacteristics;
87 PCLASS_ERROR ClassError;
88 PCLASS_READ_WRITE ClassReadWriteVerification;
89 PCLASS_DEVICE_CALLBACK ClassFindDeviceCallBack;
90 PCLASS_FIND_DEVICES ClassFindDevices;
91 PCLASS_DEVICE_CONTROL ClassDeviceControl;
92 PCLASS_SHUTDOWN_FLUSH ClassShutdownFlush;
93 PCLASS_CREATE_CLOSE ClassCreateClose;
94 PDRIVER_STARTIO ClassStartIo;
95 } CLASS_INIT_DATA, *PCLASS_INIT_DATA;
96
97
98 typedef struct _DEVICE_EXTENSION
99 {
100 PDEVICE_OBJECT DeviceObject;
101 PDEVICE_OBJECT PortDeviceObject;
102 LARGE_INTEGER PartitionLength;
103 LARGE_INTEGER StartingOffset;
104 ULONG DMByteSkew;
105 ULONG DMSkew;
106 BOOLEAN DMActive;
107 PCLASS_ERROR ClassError;
108 PCLASS_READ_WRITE ClassReadWriteVerification;
109 PCLASS_FIND_DEVICES ClassFindDevices;
110 PCLASS_DEVICE_CONTROL ClassDeviceControl;
111 PCLASS_SHUTDOWN_FLUSH ClassShutdownFlush;
112 PCLASS_CREATE_CLOSE ClassCreateClose;
113 PDRIVER_STARTIO ClassStartIo;
114 PIO_SCSI_CAPABILITIES PortCapabilities;
115 PDISK_GEOMETRY_EX DiskGeometry;
116 PDEVICE_OBJECT PhysicalDevice;
117 PSENSE_DATA SenseData;
118 ULONG TimeOutValue;
119 ULONG DeviceNumber;
120 ULONG SrbFlags;
121 ULONG ErrorCount;
122 KSPIN_LOCK SplitRequestSpinLock;
123 NPAGED_LOOKASIDE_LIST SrbLookasideListHead;
124 LONG LockCount;
125 UCHAR PortNumber;
126 UCHAR PathId;
127 UCHAR TargetId;
128 UCHAR Lun;
129 UCHAR SectorShift;
130 UCHAR ReservedByte;
131 USHORT DeviceFlags;
132 PKEVENT MediaChangeEvent;
133 HANDLE MediaChangeEventHandle;
134 BOOLEAN MediaChangeNoMedia;
135 ULONG MediaChangeCount;
136 } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
137
138
139 typedef struct _COMPLETION_CONTEXT
140 {
141 PDEVICE_OBJECT DeviceObject;
142 SCSI_REQUEST_BLOCK Srb;
143 } COMPLETION_CONTEXT, *PCOMPLETION_CONTEXT;
144
145
146 /* FUNCTIONS ****************************************************************/
147
148 IO_COMPLETION_ROUTINE ScsiClassAsynchronousCompletion;
149 NTSTATUS NTAPI
150 ScsiClassAsynchronousCompletion(IN PDEVICE_OBJECT DeviceObject,
151 IN PIRP Irp,
152 IN PVOID Context);
153
154 VOID NTAPI
155 ScsiClassBuildRequest(IN PDEVICE_OBJECT DeviceObject,
156 IN PIRP Irp);
157
158 NTSTATUS NTAPI
159 ScsiClassClaimDevice(IN PDEVICE_OBJECT PortDeviceObject,
160 IN PSCSI_INQUIRY_DATA LunInfo,
161 IN BOOLEAN Release,
162 OUT PDEVICE_OBJECT *NewPortDeviceObject OPTIONAL);
163
164 NTSTATUS NTAPI
165 ScsiClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject,
166 IN PCCHAR ObjectNameBuffer,
167 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
168 IN OUT PDEVICE_OBJECT *DeviceObject,
169 IN PCLASS_INIT_DATA InitializationData);
170
171 NTSTATUS NTAPI
172 ScsiClassDeviceControl(IN PDEVICE_OBJECT DeviceObject,
173 IN PIRP Irp);
174
175 PVOID NTAPI
176 ScsiClassFindModePage(IN PCHAR ModeSenseBuffer,
177 IN ULONG Length,
178 IN UCHAR PageMode,
179 IN BOOLEAN Use6Byte);
180
181 ULONG NTAPI
182 ScsiClassFindUnclaimedDevices(IN PCLASS_INIT_DATA InitializationData,
183 OUT PSCSI_ADAPTER_BUS_INFO AdapterInformation);
184
185 NTSTATUS NTAPI
186 ScsiClassGetCapabilities(IN PDEVICE_OBJECT PortDeviceObject,
187 OUT PIO_SCSI_CAPABILITIES *PortCapabilities);
188
189 NTSTATUS NTAPI
190 ScsiClassGetInquiryData(IN PDEVICE_OBJECT PortDeviceObject,
191 OUT PSCSI_ADAPTER_BUS_INFO *ConfigInfo);
192
193 ULONG NTAPI
194 ScsiClassInitialize(IN PVOID Argument1,
195 IN PVOID Argument2,
196 IN PCLASS_INIT_DATA InitializationData);
197
198 VOID NTAPI
199 ScsiClassInitializeSrbLookasideList(IN PDEVICE_EXTENSION DeviceExtension,
200 IN ULONG NumberElements);
201
202 NTSTATUS NTAPI
203 ScsiClassInternalIoControl(IN PDEVICE_OBJECT DeviceObject,
204 IN PIRP Irp);
205
206 BOOLEAN NTAPI
207 ScsiClassInterpretSenseInfo(IN PDEVICE_OBJECT DeviceObject,
208 IN PSCSI_REQUEST_BLOCK Srb,
209 IN UCHAR MajorFunctionCode,
210 IN ULONG IoDeviceCode,
211 IN ULONG RetryCount,
212 OUT NTSTATUS *Status);
213
214 NTSTATUS NTAPI
215 ScsiClassIoComplete(IN PDEVICE_OBJECT DeviceObject,
216 IN PIRP Irp,
217 IN PVOID Context);
218
219 NTSTATUS NTAPI
220 ScsiClassIoCompleteAssociated(IN PDEVICE_OBJECT DeviceObject,
221 IN PIRP Irp,
222 IN PVOID Context);
223
224 ULONG NTAPI
225 ScsiClassModeSense(IN PDEVICE_OBJECT DeviceObject,
226 IN PCHAR ModeSenseBuffer,
227 IN ULONG Length,
228 IN UCHAR PageMode);
229
230 ULONG NTAPI
231 ScsiClassQueryTimeOutRegistryValue(IN PUNICODE_STRING RegistryPath);
232
233 NTSTATUS NTAPI
234 ScsiClassReadDriveCapacity(IN PDEVICE_OBJECT DeviceObject);
235
236 VOID NTAPI
237 ScsiClassReleaseQueue(IN PDEVICE_OBJECT DeviceObject);
238
239 NTSTATUS NTAPI
240 ScsiClassSendSrbAsynchronous(PDEVICE_OBJECT DeviceObject,
241 PSCSI_REQUEST_BLOCK Srb,
242 PIRP Irp,
243 PVOID BufferAddress,
244 ULONG BufferLength,
245 BOOLEAN WriteToDevice);
246
247 NTSTATUS NTAPI
248 ScsiClassSendSrbSynchronous(PDEVICE_OBJECT DeviceObject,
249 PSCSI_REQUEST_BLOCK Srb,
250 PVOID BufferAddress,
251 ULONG BufferLength,
252 BOOLEAN WriteToDevice);
253
254 VOID NTAPI
255 ScsiClassSplitRequest(IN PDEVICE_OBJECT DeviceObject,
256 IN PIRP Irp,
257 IN ULONG MaximumBytes);
258
259 NTSTATUS
260 NTAPI
261 ScsiClassCheckVerifyComplete(
262 IN PDEVICE_OBJECT DeviceObject,
263 IN PIRP Irp,
264 IN PVOID Context
265 );
266
267 /* EOF */