Improved disk driver stack.
[reactos.git] / reactos / drivers / storage / include / srb.h
1 /* $Id: srb.h,v 1.2 2002/01/14 01:44:19 ekohl 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
17 #define SCSI_MAXIMUM_LOGICAL_UNITS 8
18 #define SCSI_MAXIMUM_TARGETS_PER_BUS 32
19 #define SCSI_MAXIMUM_BUSES 8
20 #define SCSI_MINIMUM_PHYSICAL_BREAKS 16
21 #define SCSI_MAXIMUM_PHYSICAL_BREAKS 255
22
23 //
24 // This constant is for backward compatibility.
25 // This use to be the maximum number of targets supported.
26 //
27
28 #define SCSI_MAXIMUM_TARGETS 8
29
30 // begin_ntminitape
31
32 #define MAXIMUM_CDB_SIZE 12
33
34
35 typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS, *PSCSI_PHYSICAL_ADDRESS;
36
37
38 typedef struct _ACCESS_RANGE
39 {
40 SCSI_PHYSICAL_ADDRESS RangeStart;
41 ULONG RangeLength;
42 BOOLEAN RangeInMemory;
43 }ACCESS_RANGE, *PACCESS_RANGE;
44
45
46 typedef struct _PORT_CONFIGURATION_INFORMATION
47 {
48 ULONG Length;
49 ULONG SystemIoBusNumber;
50 INTERFACE_TYPE AdapterInterfaceType;
51 ULONG BusInterruptLevel;
52 ULONG BusInterruptVector;
53 KINTERRUPT_MODE InterruptMode;
54 ULONG MaximumTransferLength;
55 ULONG NumberOfPhysicalBreaks;
56 ULONG DmaChannel;
57 ULONG DmaPort;
58 DMA_WIDTH DmaWidth;
59 DMA_SPEED DmaSpeed;
60 ULONG AlignmentMask;
61 ULONG NumberOfAccessRanges;
62 ACCESS_RANGE (*AccessRanges)[];
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
131 #define SRB_FUNCTION_EXECUTE_SCSI 0x00
132 #define SRB_FUNCTION_CLAIM_DEVICE 0x01
133 #define SRB_FUNCTION_IO_CONTROL 0x02
134 #define SRB_FUNCTION_RECEIVE_EVENT 0x03
135 #define SRB_FUNCTION_RELEASE_QUEUE 0x04
136 #define SRB_FUNCTION_ATTACH_DEVICE 0x05
137 #define SRB_FUNCTION_RELEASE_DEVICE 0x06
138 #define SRB_FUNCTION_SHUTDOWN 0x07
139 #define SRB_FUNCTION_FLUSH 0x08
140 #define SRB_FUNCTION_ABORT_COMMAND 0x10
141 #define SRB_FUNCTION_RELEASE_RECOVERY 0x11
142 #define SRB_FUNCTION_RESET_BUS 0x12
143 #define SRB_FUNCTION_RESET_DEVICE 0x13
144 #define SRB_FUNCTION_TERMINATE_IO 0x14
145 #define SRB_FUNCTION_FLUSH_QUEUE 0x15
146 #define SRB_FUNCTION_REMOVE_DEVICE 0x16
147
148 //
149 // SRB Status
150 //
151
152 #define SRB_STATUS_PENDING 0x00
153 #define SRB_STATUS_SUCCESS 0x01
154 #define SRB_STATUS_ABORTED 0x02
155 #define SRB_STATUS_ABORT_FAILED 0x03
156 #define SRB_STATUS_ERROR 0x04
157 #define SRB_STATUS_BUSY 0x05
158 #define SRB_STATUS_INVALID_REQUEST 0x06
159 #define SRB_STATUS_INVALID_PATH_ID 0x07
160 #define SRB_STATUS_NO_DEVICE 0x08
161 #define SRB_STATUS_TIMEOUT 0x09
162 #define SRB_STATUS_SELECTION_TIMEOUT 0x0A
163 #define SRB_STATUS_COMMAND_TIMEOUT 0x0B
164 #define SRB_STATUS_MESSAGE_REJECTED 0x0D
165 #define SRB_STATUS_BUS_RESET 0x0E
166 #define SRB_STATUS_PARITY_ERROR 0x0F
167 #define SRB_STATUS_REQUEST_SENSE_FAILED 0x10
168 #define SRB_STATUS_NO_HBA 0x11
169 #define SRB_STATUS_DATA_OVERRUN 0x12
170 #define SRB_STATUS_UNEXPECTED_BUS_FREE 0x13
171 #define SRB_STATUS_PHASE_SEQUENCE_FAILURE 0x14
172 #define SRB_STATUS_BAD_SRB_BLOCK_LENGTH 0x15
173 #define SRB_STATUS_REQUEST_FLUSHED 0x16
174 #define SRB_STATUS_INVALID_LUN 0x20
175 #define SRB_STATUS_INVALID_TARGET_ID 0x21
176 #define SRB_STATUS_BAD_FUNCTION 0x22
177 #define SRB_STATUS_ERROR_RECOVERY 0x23
178
179 //
180 // SRB Status Masks
181 //
182
183 #define SRB_STATUS_QUEUE_FROZEN 0x40
184 #define SRB_STATUS_AUTOSENSE_VALID 0x80
185
186 #define SRB_STATUS(Status) (Status & ~(SRB_STATUS_AUTOSENSE_VALID | SRB_STATUS_QUEUE_FROZEN))
187
188 //
189 // SRB Flag Bits
190 //
191
192 #define SRB_FLAGS_QUEUE_ACTION_ENABLE 0x00000002
193 #define SRB_FLAGS_DISABLE_DISCONNECT 0x00000004
194 #define SRB_FLAGS_DISABLE_SYNCH_TRANSFER 0x00000008
195 #define SRB_FLAGS_BYPASS_FROZEN_QUEUE 0x00000010
196 #define SRB_FLAGS_DISABLE_AUTOSENSE 0x00000020
197 #define SRB_FLAGS_DATA_IN 0x00000040
198 #define SRB_FLAGS_DATA_OUT 0x00000080
199 #define SRB_FLAGS_NO_DATA_TRANSFER 0x00000000
200 #define SRB_FLAGS_UNSPECIFIED_DIRECTION (SRB_FLAGS_DATA_IN | SRB_FLAGS_DATA_OUT)
201 #define SRB_FLAGS_NO_QUEUE_FREEZE 0x00000100
202 #define SRB_FLAGS_ADAPTER_CACHE_ENABLE 0x00000200
203 #define SRB_FLAGS_IS_ACTIVE 0x00010000
204 #define SRB_FLAGS_ALLOCATED_FROM_ZONE 0x00020000
205 #define SRB_FLAGS_SGLIST_FROM_POOL 0x00040000
206
207 //
208 // Queue Action
209 //
210
211 #define SRB_SIMPLE_TAG_REQUEST 0x20
212 #define SRB_HEAD_OF_QUEUE_TAG_REQUEST 0x21
213 #define SRB_ORDERED_QUEUE_TAG_REQUEST 0x22
214
215
216 //
217 // Port driver error codes
218 //
219
220 #define SP_BUS_PARITY_ERROR 0x0001
221 #define SP_UNEXPECTED_DISCONNECT 0x0002
222 #define SP_INVALID_RESELECTION 0x0003
223 #define SP_BUS_TIME_OUT 0x0004
224 #define SP_PROTOCOL_ERROR 0x0005
225 #define SP_INTERNAL_ADAPTER_ERROR 0x0006
226 #define SP_REQUEST_TIMEOUT 0x0007
227 #define SP_IRQ_NOT_RESPONDING 0x0008
228 #define SP_BAD_FW_WARNING 0x0009
229 #define SP_BAD_FW_ERROR 0x000a
230
231 //
232 // Return values for SCSI_HW_FIND_ADAPTER.
233 //
234
235 #define SP_RETURN_NOT_FOUND 0
236 #define SP_RETURN_FOUND 1
237 #define SP_RETURN_ERROR 2
238 #define SP_RETURN_BAD_CONFIG 3
239
240
241 typedef enum _SCSI_NOTIFICATION_TYPE
242 {
243 RequestComplete,
244 NextRequest,
245 NextLuRequest,
246 ResetDetected,
247 CallDisableInterrupts,
248 CallEnableInterrupts,
249 RequestTimerCall
250 } SCSI_NOTIFICATION_TYPE, *PSCSI_NOTIFICATION_TYPE;
251
252
253 typedef BOOLEAN STDCALL
254 (*PHW_INITIALIZE)(IN PVOID DeviceExtension);
255
256 typedef BOOLEAN STDCALL
257 (*PHW_STARTIO)(IN PVOID DeviceExtension,
258 IN PSCSI_REQUEST_BLOCK Srb);
259
260 typedef BOOLEAN STDCALL
261 (*PHW_INTERRUPT)(IN PVOID DeviceExtension);
262
263 typedef VOID STDCALL
264 (*PHW_TIMER)(IN PVOID DeviceExtension);
265
266 typedef VOID STDCALL
267 (*PHW_DMA_STARTED)(IN PVOID DeviceExtension);
268
269 typedef ULONG STDCALL
270 (*PHW_FIND_ADAPTER)(IN PVOID DeviceExtension,
271 IN PVOID HwContext,
272 IN PVOID BusInformation,
273 IN PCHAR ArgumentString,
274 IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo,
275 OUT PBOOLEAN Again);
276
277 typedef BOOLEAN STDCALL
278 (*PHW_RESET_BUS)(IN PVOID DeviceExtension,
279 IN ULONG PathId);
280
281 typedef BOOLEAN STDCALL
282 (*PHW_ADAPTER_STATE)(IN PVOID DeviceExtension,
283 IN PVOID Context,
284 IN BOOLEAN SaveState);
285
286 typedef struct _HW_INITIALIZATION_DATA
287 {
288 ULONG HwInitializationDataSize;
289 INTERFACE_TYPE AdapterInterfaceType;
290 PHW_INITIALIZE HwInitialize;
291 PHW_STARTIO HwStartIo;
292 PHW_INTERRUPT HwInterrupt;
293 PHW_FIND_ADAPTER HwFindAdapter;
294 PHW_RESET_BUS HwResetBus;
295 PHW_DMA_STARTED HwDmaStarted;
296 PHW_ADAPTER_STATE HwAdapterState;
297 ULONG DeviceExtensionSize;
298 ULONG SpecificLuExtensionSize;
299 ULONG SrbExtensionSize;
300 ULONG NumberOfAccessRanges;
301 PVOID Reserved;
302 BOOLEAN MapBuffers;
303 BOOLEAN NeedPhysicalAddresses;
304 BOOLEAN TaggedQueuing;
305 BOOLEAN AutoRequestSense;
306 BOOLEAN MultipleRequestPerLu;
307 BOOLEAN ReceiveEvent;
308 USHORT VendorIdLength;
309 PVOID VendorId;
310 USHORT ReservedUshort;
311 USHORT DeviceIdLength;
312 PVOID DeviceId;
313 } HW_INITIALIZATION_DATA, *PHW_INITIALIZATION_DATA;
314
315
316 /* FUNCTIONS ****************************************************************/
317
318 VOID
319 ScsiDebugPrint(IN ULONG DebugPrintLevel,
320 IN PCHAR DebugMessage,
321 ...);
322
323 VOID STDCALL
324 ScsiPortCompleteRequest(IN PVOID HwDeviceExtension,
325 IN UCHAR PathId,
326 IN UCHAR TargetId,
327 IN UCHAR Lun,
328 IN UCHAR SrbStatus);
329
330 ULONG STDCALL
331 ScsiPortConvertPhysicalAddressToUlong(IN SCSI_PHYSICAL_ADDRESS Address);
332
333 SCSI_PHYSICAL_ADDRESS STDCALL
334 ScsiPortConvertUlongToPhysicalAddress(IN ULONG UlongAddress);
335
336 VOID STDCALL
337 ScsiPortFlushDma(IN PVOID HwDeviceExtension);
338
339 VOID
340 STDCALL
341 ScsiPortFreeDeviceBase (
342 IN PVOID HwDeviceExtension,
343 IN PVOID MappedAddress
344 );
345
346 ULONG
347 STDCALL
348 ScsiPortGetBusData (
349 IN PVOID DeviceExtension,
350 IN ULONG BusDataType,
351 IN ULONG SystemIoBusNumber,
352 IN ULONG SlotNumber,
353 IN PVOID Buffer,
354 IN ULONG Length
355 );
356
357 PVOID
358 STDCALL
359 ScsiPortGetDeviceBase (
360 IN PVOID HwDeviceExtension,
361 IN INTERFACE_TYPE BusType,
362 IN ULONG SystemIoBusNumber,
363 IN SCSI_PHYSICAL_ADDRESS IoAddress,
364 IN ULONG NumberOfBytes,
365 IN BOOLEAN InIoSpace
366 );
367
368 PVOID
369 STDCALL
370 ScsiPortGetLogicalUnit (
371 IN PVOID HwDeviceExtension,
372 IN UCHAR PathId,
373 IN UCHAR TargetId,
374 IN UCHAR Lun
375 );
376
377 SCSI_PHYSICAL_ADDRESS
378 STDCALL
379 ScsiPortGetPhysicalAddress (
380 IN PVOID HwDeviceExtension,
381 IN PSCSI_REQUEST_BLOCK Srb OPTIONAL,
382 IN PVOID VirtualAddress,
383 OUT PULONG Length
384 );
385
386 PSCSI_REQUEST_BLOCK
387 STDCALL
388 ScsiPortGetSrb (
389 IN PVOID DeviceExtension,
390 IN UCHAR PathId,
391 IN UCHAR TargetId,
392 IN UCHAR Lun,
393 IN LONG QueueTag
394 );
395
396 PVOID STDCALL
397 ScsiPortGetUncachedExtension (
398 IN PVOID HwDeviceExtension,
399 IN PPORT_CONFIGURATION_INFORMATION ConfigInfo,
400 IN ULONG NumberOfBytes
401 );
402
403 PVOID STDCALL
404 ScsiPortGetVirtualAddress (
405 IN PVOID HwDeviceExtension,
406 IN SCSI_PHYSICAL_ADDRESS PhysicalAddress
407 );
408
409 ULONG STDCALL
410 ScsiPortInitialize (
411 IN PVOID Argument1,
412 IN PVOID Argument2,
413 IN struct _HW_INITIALIZATION_DATA *HwInitializationData,
414 IN PVOID HwContext
415 );
416
417 VOID STDCALL
418 ScsiPortIoMapTransfer (
419 IN PVOID HwDeviceExtension,
420 IN PSCSI_REQUEST_BLOCK Srb,
421 IN ULONG LogicalAddress,
422 IN ULONG Length
423 );
424
425 VOID STDCALL
426 ScsiPortLogError (
427 IN PVOID HwDeviceExtension,
428 IN PSCSI_REQUEST_BLOCK Srb OPTIONAL,
429 IN UCHAR PathId,
430 IN UCHAR TargetId,
431 IN UCHAR Lun,
432 IN ULONG ErrorCode,
433 IN ULONG UniqueId
434 );
435
436 VOID STDCALL
437 ScsiPortMoveMemory(OUT PVOID Destination,
438 IN PVOID Source,
439 IN ULONG Length);
440
441 VOID
442 ScsiPortNotification(IN SCSI_NOTIFICATION_TYPE NotificationType,
443 IN PVOID HwDeviceExtension,
444 ...);
445
446 VOID STDCALL
447 ScsiPortReadPortBufferUchar(IN PUCHAR Port,
448 IN PUCHAR Value,
449 IN ULONG Count);
450
451 VOID STDCALL
452 ScsiPortReadPortBufferUlong(IN PULONG Port,
453 IN PULONG Value,
454 IN ULONG Count);
455
456 VOID STDCALL
457 ScsiPortReadPortBufferUshort(IN PUSHORT Port,
458 IN PUSHORT Value,
459 IN ULONG Count);
460
461 UCHAR STDCALL
462 ScsiPortReadPortUchar(IN PUCHAR Port);
463
464 ULONG STDCALL
465 ScsiPortReadPortUlong(IN PULONG Port);
466
467 USHORT STDCALL
468 ScsiPortReadPortUshort(IN PUSHORT Port);
469
470 VOID STDCALL
471 ScsiPortReadRegisterBufferUchar(IN PUCHAR Register,
472 IN PUCHAR Buffer,
473 IN ULONG Count);
474
475 VOID STDCALL
476 ScsiPortReadRegisterBufferUlong(IN PULONG Register,
477 IN PULONG Buffer,
478 IN ULONG Count);
479
480 VOID STDCALL
481 ScsiPortReadRegisterBufferUshort(IN PUSHORT Register,
482 IN PUSHORT Buffer,
483 IN ULONG Count);
484
485 UCHAR STDCALL
486 ScsiPortReadRegisterUchar(IN PUCHAR Register);
487
488 ULONG STDCALL
489 ScsiPortReadRegisterUlong(IN PULONG Register);
490
491 USHORT STDCALL
492 ScsiPortReadRegisterUshort(IN PUSHORT Register);
493
494 ULONG STDCALL
495 ScsiPortSetBusDataByOffset(IN PVOID DeviceExtension,
496 IN ULONG BusDataType,
497 IN ULONG SystemIoBusNumber,
498 IN ULONG SlotNumber,
499 IN PVOID Buffer,
500 IN ULONG Offset,
501 IN ULONG Length);
502
503 VOID STDCALL
504 ScsiPortStallExecution(IN ULONG MicroSeconds);
505
506 BOOLEAN STDCALL
507 ScsiPortValidateRange(IN PVOID HwDeviceExtension,
508 IN INTERFACE_TYPE BusType,
509 IN ULONG SystemIoBusNumber,
510 IN SCSI_PHYSICAL_ADDRESS IoAddress,
511 IN ULONG NumberOfBytes,
512 IN BOOLEAN InIoSpace);
513
514 VOID STDCALL
515 ScsiPortWritePortBufferUchar(IN PUCHAR Port,
516 IN PUCHAR Buffer,
517 IN ULONG Count);
518
519 VOID STDCALL
520 ScsiPortWritePortBufferUlong(IN PULONG Port,
521 IN PULONG Buffer,
522 IN ULONG Count);
523
524 VOID STDCALL
525 ScsiPortWritePortBufferUshort(IN PUSHORT Port,
526 IN PUSHORT Value,
527 IN ULONG Count);
528
529 VOID STDCALL
530 ScsiPortWritePortUchar(IN PUCHAR Port,
531 IN UCHAR Value);
532
533 VOID STDCALL
534 ScsiPortWritePortUlong(IN PULONG Port,
535 IN ULONG Value);
536
537 VOID STDCALL
538 ScsiPortWritePortUshort(IN PUSHORT Port,
539 IN USHORT Value);
540
541 VOID STDCALL
542 ScsiPortWriteRegisterBufferUchar(IN PUCHAR Register,
543 IN PUCHAR Buffer,
544 IN ULONG Count);
545
546 VOID STDCALL
547 ScsiPortWriteRegisterBufferUlong(IN PULONG Register,
548 IN PULONG Buffer,
549 IN ULONG Count);
550
551 VOID STDCALL
552 ScsiPortWriteRegisterBufferUshort(IN PUSHORT Register,
553 IN PUSHORT Buffer,
554 IN ULONG Count);
555
556 VOID STDCALL
557 ScsiPortWriteRegisterUchar(IN PUCHAR Register,
558 IN ULONG Value);
559
560 VOID STDCALL
561 ScsiPortWriteRegisterUlong(IN PULONG Register,
562 IN ULONG Value);
563
564 VOID STDCALL
565 ScsiPortWriteRegisterUshort(IN PUSHORT Register,
566 IN USHORT Value);
567
568 #endif /* __STORAGE_INCLUDE_SRB_H */
569
570 /* EOF */