Added required defines and typedefs for ntoskrnl/io modules.
[reactos.git] / reactos / include / ddk / srb.h
1 /* $Id: srb.h,v 1.2 2002/10/03 18:33:47 sedwards Exp $
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: services/storage/include/srb.c
6 * PURPOSE: SCSI port driver definitions
7 * PROGRAMMER: Eric Kohl (ekohl@rz-online.de)
8 */
9
10 #ifndef __STORAGE_INCLUDE_SRB_H
11 #define __STORAGE_INCLUDE_SRB_H
12
13
14 /* Define SCSI maximum configuration parameters. */
15
16 #define SCSI_MAXIMUM_LOGICAL_UNITS 8
17 #define SCSI_MAXIMUM_TARGETS_PER_BUS 32
18 #define SCSI_MAXIMUM_BUSES 8
19 #define SCSI_MINIMUM_PHYSICAL_BREAKS 16
20 #define SCSI_MAXIMUM_PHYSICAL_BREAKS 255
21
22
23 /* Obsolete. For backward compatibility only. */
24
25 #define SCSI_MAXIMUM_TARGETS 8
26
27
28 #define MAXIMUM_CDB_SIZE 12
29
30
31 typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS, *PSCSI_PHYSICAL_ADDRESS;
32
33
34 typedef struct _ACCESS_RANGE
35 {
36 SCSI_PHYSICAL_ADDRESS RangeStart;
37 ULONG RangeLength;
38 BOOLEAN RangeInMemory;
39 }ACCESS_RANGE, *PACCESS_RANGE;
40
41
42 typedef struct _PORT_CONFIGURATION_INFORMATION
43 {
44 ULONG Length;
45 ULONG SystemIoBusNumber;
46 INTERFACE_TYPE AdapterInterfaceType;
47 ULONG BusInterruptLevel;
48 ULONG BusInterruptVector;
49 KINTERRUPT_MODE InterruptMode;
50 ULONG MaximumTransferLength;
51 ULONG NumberOfPhysicalBreaks;
52 ULONG DmaChannel;
53 ULONG DmaPort;
54 DMA_WIDTH DmaWidth;
55 DMA_SPEED DmaSpeed;
56 ULONG AlignmentMask;
57 ULONG NumberOfAccessRanges;
58 #ifdef __GNUC__
59 ACCESS_RANGE *AccessRanges;
60 #else
61 ACCESS_RANGE (*AccessRanges)[];
62 #endif
63 PVOID Reserved;
64 UCHAR NumberOfBuses;
65 CCHAR InitiatorBusId[8];
66 BOOLEAN ScatterGather;
67 BOOLEAN Master;
68 BOOLEAN CachesData;
69 BOOLEAN AdapterScansDown;
70 BOOLEAN AtdiskPrimaryClaimed;
71 BOOLEAN AtdiskSecondaryClaimed;
72 BOOLEAN Dma32BitAddresses;
73 BOOLEAN DemandMode;
74 BOOLEAN MapBuffers;
75 BOOLEAN NeedPhysicalAddresses;
76 BOOLEAN TaggedQueuing;
77 BOOLEAN AutoRequestSense;
78 BOOLEAN MultipleRequestPerLu;
79 BOOLEAN ReceiveEvent;
80 BOOLEAN RealModeInitialized;
81 BOOLEAN BufferAccessScsiPortControlled;
82 UCHAR MaximumNumberOfTargets;
83 UCHAR ReservedUchars[2];
84 ULONG SlotNumber;
85 ULONG BusInterruptLevel2;
86 ULONG BusInterruptVector2;
87 KINTERRUPT_MODE InterruptMode2;
88 ULONG DmaChannel2;
89 ULONG DmaPort2;
90 DMA_WIDTH DmaWidth2;
91 DMA_SPEED DmaSpeed2;
92 ULONG DeviceExtensionSize;
93 ULONG SpecificLuExtensionSize;
94 ULONG SrbExtensionSize;
95 } PORT_CONFIGURATION_INFORMATION, *PPORT_CONFIGURATION_INFORMATION;
96
97 #define CONFIG_INFO_VERSION_2 sizeof(PORT_CONFIGURATION_INFORMATION)
98
99
100 typedef struct _SCSI_REQUEST_BLOCK
101 {
102 USHORT Length; // 0x00
103 UCHAR Function; // 0x02
104 UCHAR SrbStatus; // 0x03
105 UCHAR ScsiStatus; // 0x04
106 UCHAR PathId; // 0x05
107 UCHAR TargetId; // 0x06
108 UCHAR Lun; // 0x07
109 UCHAR QueueTag; // 0x08
110 UCHAR QueueAction; // 0x09
111 UCHAR CdbLength; // 0x0A
112 UCHAR SenseInfoBufferLength; // 0x0B
113 ULONG SrbFlags; // 0x0C
114 ULONG DataTransferLength; // 0x10
115 ULONG TimeOutValue; // 0x14
116 PVOID DataBuffer; // 0x18
117 PVOID SenseInfoBuffer; // 0x1C
118 struct _SCSI_REQUEST_BLOCK *NextSrb; // 0x20
119 PVOID OriginalRequest; // 0x24
120 PVOID SrbExtension; // 0x28
121 ULONG QueueSortKey; // 0x2C
122 UCHAR Cdb[16]; // 0x30
123 } SCSI_REQUEST_BLOCK, *PSCSI_REQUEST_BLOCK;
124
125 #define SCSI_REQUEST_BLOCK_SIZE sizeof(SCSI_REQUEST_BLOCK)
126
127
128 /* SRB Functions */
129
130 #define SRB_FUNCTION_EXECUTE_SCSI 0x00
131 #define SRB_FUNCTION_CLAIM_DEVICE 0x01
132 #define SRB_FUNCTION_IO_CONTROL 0x02
133 #define SRB_FUNCTION_RECEIVE_EVENT 0x03
134 #define SRB_FUNCTION_RELEASE_QUEUE 0x04
135 #define SRB_FUNCTION_ATTACH_DEVICE 0x05
136 #define SRB_FUNCTION_RELEASE_DEVICE 0x06
137 #define SRB_FUNCTION_SHUTDOWN 0x07
138 #define SRB_FUNCTION_FLUSH 0x08
139 #define SRB_FUNCTION_ABORT_COMMAND 0x10
140 #define SRB_FUNCTION_RELEASE_RECOVERY 0x11
141 #define SRB_FUNCTION_RESET_BUS 0x12
142 #define SRB_FUNCTION_RESET_DEVICE 0x13
143 #define SRB_FUNCTION_TERMINATE_IO 0x14
144 #define SRB_FUNCTION_FLUSH_QUEUE 0x15
145 #define SRB_FUNCTION_REMOVE_DEVICE 0x16
146
147
148 /* SRB Status */
149
150 #define SRB_STATUS_PENDING 0x00
151 #define SRB_STATUS_SUCCESS 0x01
152 #define SRB_STATUS_ABORTED 0x02
153 #define SRB_STATUS_ABORT_FAILED 0x03
154 #define SRB_STATUS_ERROR 0x04
155 #define SRB_STATUS_BUSY 0x05
156 #define SRB_STATUS_INVALID_REQUEST 0x06
157 #define SRB_STATUS_INVALID_PATH_ID 0x07
158 #define SRB_STATUS_NO_DEVICE 0x08
159 #define SRB_STATUS_TIMEOUT 0x09
160 #define SRB_STATUS_SELECTION_TIMEOUT 0x0A
161 #define SRB_STATUS_COMMAND_TIMEOUT 0x0B
162 #define SRB_STATUS_MESSAGE_REJECTED 0x0D
163 #define SRB_STATUS_BUS_RESET 0x0E
164 #define SRB_STATUS_PARITY_ERROR 0x0F
165 #define SRB_STATUS_REQUEST_SENSE_FAILED 0x10
166 #define SRB_STATUS_NO_HBA 0x11
167 #define SRB_STATUS_DATA_OVERRUN 0x12
168 #define SRB_STATUS_UNEXPECTED_BUS_FREE 0x13
169 #define SRB_STATUS_PHASE_SEQUENCE_FAILURE 0x14
170 #define SRB_STATUS_BAD_SRB_BLOCK_LENGTH 0x15
171 #define SRB_STATUS_REQUEST_FLUSHED 0x16
172 #define SRB_STATUS_INVALID_LUN 0x20
173 #define SRB_STATUS_INVALID_TARGET_ID 0x21
174 #define SRB_STATUS_BAD_FUNCTION 0x22
175 #define SRB_STATUS_ERROR_RECOVERY 0x23
176
177
178 /* SRB Status Masks */
179
180 #define SRB_STATUS_QUEUE_FROZEN 0x40
181 #define SRB_STATUS_AUTOSENSE_VALID 0x80
182
183 #define SRB_STATUS(Status) (Status & ~(SRB_STATUS_AUTOSENSE_VALID | SRB_STATUS_QUEUE_FROZEN))
184
185
186 /* SRB Flag Bits */
187
188 #define SRB_FLAGS_QUEUE_ACTION_ENABLE 0x00000002
189 #define SRB_FLAGS_DISABLE_DISCONNECT 0x00000004
190 #define SRB_FLAGS_DISABLE_SYNCH_TRANSFER 0x00000008
191 #define SRB_FLAGS_BYPASS_FROZEN_QUEUE 0x00000010
192 #define SRB_FLAGS_DISABLE_AUTOSENSE 0x00000020
193 #define SRB_FLAGS_DATA_IN 0x00000040
194 #define SRB_FLAGS_DATA_OUT 0x00000080
195 #define SRB_FLAGS_NO_DATA_TRANSFER 0x00000000
196 #define SRB_FLAGS_UNSPECIFIED_DIRECTION (SRB_FLAGS_DATA_IN | SRB_FLAGS_DATA_OUT)
197 #define SRB_FLAGS_NO_QUEUE_FREEZE 0x00000100
198 #define SRB_FLAGS_ADAPTER_CACHE_ENABLE 0x00000200
199 #define SRB_FLAGS_IS_ACTIVE 0x00010000
200 #define SRB_FLAGS_ALLOCATED_FROM_ZONE 0x00020000
201 #define SRB_FLAGS_SGLIST_FROM_POOL 0x00040000
202
203
204 /* Queue Action */
205
206 #define SRB_SIMPLE_TAG_REQUEST 0x20
207 #define SRB_HEAD_OF_QUEUE_TAG_REQUEST 0x21
208 #define SRB_ORDERED_QUEUE_TAG_REQUEST 0x22
209
210
211 /* Port driver error codes */
212
213 #define SP_BUS_PARITY_ERROR 0x0001
214 #define SP_UNEXPECTED_DISCONNECT 0x0002
215 #define SP_INVALID_RESELECTION 0x0003
216 #define SP_BUS_TIME_OUT 0x0004
217 #define SP_PROTOCOL_ERROR 0x0005
218 #define SP_INTERNAL_ADAPTER_ERROR 0x0006
219 #define SP_REQUEST_TIMEOUT 0x0007
220 #define SP_IRQ_NOT_RESPONDING 0x0008
221 #define SP_BAD_FW_WARNING 0x0009
222 #define SP_BAD_FW_ERROR 0x000a
223
224
225 /* Return values for SCSI_HW_FIND_ADAPTER. */
226
227 #define SP_RETURN_NOT_FOUND 0
228 #define SP_RETURN_FOUND 1
229 #define SP_RETURN_ERROR 2
230 #define SP_RETURN_BAD_CONFIG 3
231
232
233 typedef enum _SCSI_NOTIFICATION_TYPE
234 {
235 RequestComplete,
236 NextRequest,
237 NextLuRequest,
238 ResetDetected,
239 CallDisableInterrupts,
240 CallEnableInterrupts,
241 RequestTimerCall
242 } SCSI_NOTIFICATION_TYPE, *PSCSI_NOTIFICATION_TYPE;
243
244
245 typedef BOOLEAN STDCALL
246 (*PHW_INITIALIZE)(IN PVOID DeviceExtension);
247
248 typedef BOOLEAN STDCALL
249 (*PHW_STARTIO)(IN PVOID DeviceExtension,
250 IN PSCSI_REQUEST_BLOCK Srb);
251
252 typedef BOOLEAN STDCALL
253 (*PHW_INTERRUPT)(IN PVOID DeviceExtension);
254
255 typedef VOID STDCALL
256 (*PHW_TIMER)(IN PVOID DeviceExtension);
257
258 typedef VOID STDCALL
259 (*PHW_DMA_STARTED)(IN PVOID DeviceExtension);
260
261 typedef ULONG STDCALL
262 (*PHW_FIND_ADAPTER)(IN PVOID DeviceExtension,
263 IN PVOID HwContext,
264 IN PVOID BusInformation,
265 IN PCHAR ArgumentString,
266 IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo,
267 OUT PBOOLEAN Again);
268
269 typedef BOOLEAN STDCALL
270 (*PHW_RESET_BUS)(IN PVOID DeviceExtension,
271 IN ULONG PathId);
272
273 typedef BOOLEAN STDCALL
274 (*PHW_ADAPTER_STATE)(IN PVOID DeviceExtension,
275 IN PVOID Context,
276 IN BOOLEAN SaveState);
277
278 typedef struct _HW_INITIALIZATION_DATA
279 {
280 ULONG HwInitializationDataSize;
281 INTERFACE_TYPE AdapterInterfaceType;
282 PHW_INITIALIZE HwInitialize;
283 PHW_STARTIO HwStartIo;
284 PHW_INTERRUPT HwInterrupt;
285 PHW_FIND_ADAPTER HwFindAdapter;
286 PHW_RESET_BUS HwResetBus;
287 PHW_DMA_STARTED HwDmaStarted;
288 PHW_ADAPTER_STATE HwAdapterState;
289 ULONG DeviceExtensionSize;
290 ULONG SpecificLuExtensionSize;
291 ULONG SrbExtensionSize;
292 ULONG NumberOfAccessRanges;
293 PVOID Reserved;
294 BOOLEAN MapBuffers;
295 BOOLEAN NeedPhysicalAddresses;
296 BOOLEAN TaggedQueuing;
297 BOOLEAN AutoRequestSense;
298 BOOLEAN MultipleRequestPerLu;
299 BOOLEAN ReceiveEvent;
300 USHORT VendorIdLength;
301 PVOID VendorId;
302 USHORT ReservedUshort;
303 USHORT DeviceIdLength;
304 PVOID DeviceId;
305 } HW_INITIALIZATION_DATA, *PHW_INITIALIZATION_DATA;
306
307
308 /* FUNCTIONS ****************************************************************/
309
310 VOID
311 ScsiDebugPrint(IN ULONG DebugPrintLevel,
312 IN PCHAR DebugMessage,
313 ...);
314
315 VOID STDCALL
316 ScsiPortCompleteRequest(IN PVOID HwDeviceExtension,
317 IN UCHAR PathId,
318 IN UCHAR TargetId,
319 IN UCHAR Lun,
320 IN UCHAR SrbStatus);
321
322 ULONG STDCALL
323 ScsiPortConvertPhysicalAddressToUlong(IN SCSI_PHYSICAL_ADDRESS Address);
324
325 SCSI_PHYSICAL_ADDRESS STDCALL
326 ScsiPortConvertUlongToPhysicalAddress(IN ULONG UlongAddress);
327
328 VOID STDCALL
329 ScsiPortFlushDma(IN PVOID HwDeviceExtension);
330
331 VOID STDCALL
332 ScsiPortFreeDeviceBase(IN PVOID HwDeviceExtension,
333 IN PVOID MappedAddress);
334
335 ULONG STDCALL
336 ScsiPortGetBusData(IN PVOID DeviceExtension,
337 IN ULONG BusDataType,
338 IN ULONG SystemIoBusNumber,
339 IN ULONG SlotNumber,
340 IN PVOID Buffer,
341 IN ULONG Length);
342
343 PVOID STDCALL
344 ScsiPortGetDeviceBase(IN PVOID HwDeviceExtension,
345 IN INTERFACE_TYPE BusType,
346 IN ULONG SystemIoBusNumber,
347 IN SCSI_PHYSICAL_ADDRESS IoAddress,
348 IN ULONG NumberOfBytes,
349 IN BOOLEAN InIoSpace);
350
351 PVOID STDCALL
352 ScsiPortGetLogicalUnit(IN PVOID HwDeviceExtension,
353 IN UCHAR PathId,
354 IN UCHAR TargetId,
355 IN UCHAR Lun);
356
357 SCSI_PHYSICAL_ADDRESS STDCALL
358 ScsiPortGetPhysicalAddress(IN PVOID HwDeviceExtension,
359 IN PSCSI_REQUEST_BLOCK Srb OPTIONAL,
360 IN PVOID VirtualAddress,
361 OUT PULONG Length);
362
363 PSCSI_REQUEST_BLOCK STDCALL
364 ScsiPortGetSrb(IN PVOID DeviceExtension,
365 IN UCHAR PathId,
366 IN UCHAR TargetId,
367 IN UCHAR Lun,
368 IN LONG QueueTag);
369
370 PVOID STDCALL
371 ScsiPortGetUncachedExtension(IN PVOID HwDeviceExtension,
372 IN PPORT_CONFIGURATION_INFORMATION ConfigInfo,
373 IN ULONG NumberOfBytes);
374
375 PVOID STDCALL
376 ScsiPortGetVirtualAddress(IN PVOID HwDeviceExtension,
377 IN SCSI_PHYSICAL_ADDRESS PhysicalAddress);
378
379 ULONG STDCALL
380 ScsiPortInitialize(IN PVOID Argument1,
381 IN PVOID Argument2,
382 IN struct _HW_INITIALIZATION_DATA *HwInitializationData,
383 IN PVOID HwContext);
384
385 VOID STDCALL
386 ScsiPortIoMapTransfer(IN PVOID HwDeviceExtension,
387 IN PSCSI_REQUEST_BLOCK Srb,
388 IN ULONG LogicalAddress,
389 IN ULONG Length);
390
391 VOID STDCALL
392 ScsiPortLogError(IN PVOID HwDeviceExtension,
393 IN PSCSI_REQUEST_BLOCK Srb OPTIONAL,
394 IN UCHAR PathId,
395 IN UCHAR TargetId,
396 IN UCHAR Lun,
397 IN ULONG ErrorCode,
398 IN ULONG UniqueId);
399
400 VOID STDCALL
401 ScsiPortMoveMemory(OUT PVOID Destination,
402 IN PVOID Source,
403 IN ULONG Length);
404
405 VOID
406 ScsiPortNotification(IN SCSI_NOTIFICATION_TYPE NotificationType,
407 IN PVOID HwDeviceExtension,
408 ...);
409
410 VOID STDCALL
411 ScsiPortReadPortBufferUchar(IN PUCHAR Port,
412 IN PUCHAR Value,
413 IN ULONG Count);
414
415 VOID STDCALL
416 ScsiPortReadPortBufferUlong(IN PULONG Port,
417 IN PULONG Value,
418 IN ULONG Count);
419
420 VOID STDCALL
421 ScsiPortReadPortBufferUshort(IN PUSHORT Port,
422 IN PUSHORT Value,
423 IN ULONG Count);
424
425 UCHAR STDCALL
426 ScsiPortReadPortUchar(IN PUCHAR Port);
427
428 ULONG STDCALL
429 ScsiPortReadPortUlong(IN PULONG Port);
430
431 USHORT STDCALL
432 ScsiPortReadPortUshort(IN PUSHORT Port);
433
434 VOID STDCALL
435 ScsiPortReadRegisterBufferUchar(IN PUCHAR Register,
436 IN PUCHAR Buffer,
437 IN ULONG Count);
438
439 VOID STDCALL
440 ScsiPortReadRegisterBufferUlong(IN PULONG Register,
441 IN PULONG Buffer,
442 IN ULONG Count);
443
444 VOID STDCALL
445 ScsiPortReadRegisterBufferUshort(IN PUSHORT Register,
446 IN PUSHORT Buffer,
447 IN ULONG Count);
448
449 UCHAR STDCALL
450 ScsiPortReadRegisterUchar(IN PUCHAR Register);
451
452 ULONG STDCALL
453 ScsiPortReadRegisterUlong(IN PULONG Register);
454
455 USHORT STDCALL
456 ScsiPortReadRegisterUshort(IN PUSHORT Register);
457
458 ULONG STDCALL
459 ScsiPortSetBusDataByOffset(IN PVOID DeviceExtension,
460 IN ULONG BusDataType,
461 IN ULONG SystemIoBusNumber,
462 IN ULONG SlotNumber,
463 IN PVOID Buffer,
464 IN ULONG Offset,
465 IN ULONG Length);
466
467 VOID STDCALL
468 ScsiPortStallExecution(IN ULONG MicroSeconds);
469
470 BOOLEAN STDCALL
471 ScsiPortValidateRange(IN PVOID HwDeviceExtension,
472 IN INTERFACE_TYPE BusType,
473 IN ULONG SystemIoBusNumber,
474 IN SCSI_PHYSICAL_ADDRESS IoAddress,
475 IN ULONG NumberOfBytes,
476 IN BOOLEAN InIoSpace);
477
478 VOID STDCALL
479 ScsiPortWritePortBufferUchar(IN PUCHAR Port,
480 IN PUCHAR Buffer,
481 IN ULONG Count);
482
483 VOID STDCALL
484 ScsiPortWritePortBufferUlong(IN PULONG Port,
485 IN PULONG Buffer,
486 IN ULONG Count);
487
488 VOID STDCALL
489 ScsiPortWritePortBufferUshort(IN PUSHORT Port,
490 IN PUSHORT Value,
491 IN ULONG Count);
492
493 VOID STDCALL
494 ScsiPortWritePortUchar(IN PUCHAR Port,
495 IN UCHAR Value);
496
497 VOID STDCALL
498 ScsiPortWritePortUlong(IN PULONG Port,
499 IN ULONG Value);
500
501 VOID STDCALL
502 ScsiPortWritePortUshort(IN PUSHORT Port,
503 IN USHORT Value);
504
505 VOID STDCALL
506 ScsiPortWriteRegisterBufferUchar(IN PUCHAR Register,
507 IN PUCHAR Buffer,
508 IN ULONG Count);
509
510 VOID STDCALL
511 ScsiPortWriteRegisterBufferUlong(IN PULONG Register,
512 IN PULONG Buffer,
513 IN ULONG Count);
514
515 VOID STDCALL
516 ScsiPortWriteRegisterBufferUshort(IN PUSHORT Register,
517 IN PUSHORT Buffer,
518 IN ULONG Count);
519
520 VOID STDCALL
521 ScsiPortWriteRegisterUchar(IN PUCHAR Register,
522 IN ULONG Value);
523
524 VOID STDCALL
525 ScsiPortWriteRegisterUlong(IN PULONG Register,
526 IN ULONG Value);
527
528 VOID STDCALL
529 ScsiPortWriteRegisterUshort(IN PUSHORT Register,
530 IN USHORT Value);
531
532 #endif /* __STORAGE_INCLUDE_SRB_H */
533
534 /* EOF */