:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / include / ddk / srb.h
1 /* $Id$
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 */