1 /* $Id: srb.h,v 1.6 2002/09/07 15:12:09 chorns Exp $
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)
10 #ifndef __STORAGE_INCLUDE_SRB_H
11 #define __STORAGE_INCLUDE_SRB_H
14 /* Define SCSI maximum configuration parameters. */
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
23 /* Obsolete. For backward compatibility only. */
25 #define SCSI_MAXIMUM_TARGETS 8
28 #define MAXIMUM_CDB_SIZE 12
31 typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS
, *PSCSI_PHYSICAL_ADDRESS
;
34 typedef struct _ACCESS_RANGE
36 SCSI_PHYSICAL_ADDRESS RangeStart
;
38 BOOLEAN RangeInMemory
;
39 }ACCESS_RANGE
, *PACCESS_RANGE
;
42 typedef struct _PORT_CONFIGURATION_INFORMATION
45 ULONG SystemIoBusNumber
;
46 INTERFACE_TYPE AdapterInterfaceType
;
47 ULONG BusInterruptLevel
;
48 ULONG BusInterruptVector
;
49 KINTERRUPT_MODE InterruptMode
;
50 ULONG MaximumTransferLength
;
51 ULONG NumberOfPhysicalBreaks
;
57 ULONG NumberOfAccessRanges
;
59 ACCESS_RANGE
*AccessRanges
;
61 ACCESS_RANGE (*AccessRanges
)[];
65 CCHAR InitiatorBusId
[8];
66 BOOLEAN ScatterGather
;
69 BOOLEAN AdapterScansDown
;
70 BOOLEAN AtdiskPrimaryClaimed
;
71 BOOLEAN AtdiskSecondaryClaimed
;
72 BOOLEAN Dma32BitAddresses
;
75 BOOLEAN NeedPhysicalAddresses
;
76 BOOLEAN TaggedQueuing
;
77 BOOLEAN AutoRequestSense
;
78 BOOLEAN MultipleRequestPerLu
;
80 BOOLEAN RealModeInitialized
;
81 BOOLEAN BufferAccessScsiPortControlled
;
82 UCHAR MaximumNumberOfTargets
;
83 UCHAR ReservedUchars
[2];
85 ULONG BusInterruptLevel2
;
86 ULONG BusInterruptVector2
;
87 KINTERRUPT_MODE InterruptMode2
;
92 ULONG DeviceExtensionSize
;
93 ULONG SpecificLuExtensionSize
;
94 ULONG SrbExtensionSize
;
95 } PORT_CONFIGURATION_INFORMATION
, *PPORT_CONFIGURATION_INFORMATION
;
97 #define CONFIG_INFO_VERSION_2 sizeof(PORT_CONFIGURATION_INFORMATION)
100 typedef struct _SCSI_REQUEST_BLOCK
102 USHORT Length
; // 0x00
103 UCHAR Function
; // 0x02
104 UCHAR SrbStatus
; // 0x03
105 UCHAR ScsiStatus
; // 0x04
106 UCHAR PathId
; // 0x05
107 UCHAR TargetId
; // 0x06
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
;
125 #define SCSI_REQUEST_BLOCK_SIZE sizeof(SCSI_REQUEST_BLOCK)
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
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
178 /* SRB Status Masks */
180 #define SRB_STATUS_QUEUE_FROZEN 0x40
181 #define SRB_STATUS_AUTOSENSE_VALID 0x80
183 #define SRB_STATUS(Status) (Status & ~(SRB_STATUS_AUTOSENSE_VALID | SRB_STATUS_QUEUE_FROZEN))
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
206 #define SRB_SIMPLE_TAG_REQUEST 0x20
207 #define SRB_HEAD_OF_QUEUE_TAG_REQUEST 0x21
208 #define SRB_ORDERED_QUEUE_TAG_REQUEST 0x22
211 /* Port driver error codes */
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
225 /* Return values for SCSI_HW_FIND_ADAPTER. */
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
233 typedef enum _SCSI_NOTIFICATION_TYPE
239 CallDisableInterrupts
,
240 CallEnableInterrupts
,
242 } SCSI_NOTIFICATION_TYPE
, *PSCSI_NOTIFICATION_TYPE
;
245 typedef BOOLEAN STDCALL
246 (*PHW_INITIALIZE
)(IN PVOID DeviceExtension
);
248 typedef BOOLEAN STDCALL
249 (*PHW_STARTIO
)(IN PVOID DeviceExtension
,
250 IN PSCSI_REQUEST_BLOCK Srb
);
252 typedef BOOLEAN STDCALL
253 (*PHW_INTERRUPT
)(IN PVOID DeviceExtension
);
256 (*PHW_TIMER
)(IN PVOID DeviceExtension
);
259 (*PHW_DMA_STARTED
)(IN PVOID DeviceExtension
);
261 typedef ULONG STDCALL
262 (*PHW_FIND_ADAPTER
)(IN PVOID DeviceExtension
,
264 IN PVOID BusInformation
,
265 IN PCHAR ArgumentString
,
266 IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo
,
269 typedef BOOLEAN STDCALL
270 (*PHW_RESET_BUS
)(IN PVOID DeviceExtension
,
273 typedef BOOLEAN STDCALL
274 (*PHW_ADAPTER_STATE
)(IN PVOID DeviceExtension
,
276 IN BOOLEAN SaveState
);
278 typedef struct _HW_INITIALIZATION_DATA
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
;
295 BOOLEAN NeedPhysicalAddresses
;
296 BOOLEAN TaggedQueuing
;
297 BOOLEAN AutoRequestSense
;
298 BOOLEAN MultipleRequestPerLu
;
299 BOOLEAN ReceiveEvent
;
300 USHORT VendorIdLength
;
302 USHORT ReservedUshort
;
303 USHORT DeviceIdLength
;
305 } HW_INITIALIZATION_DATA
, *PHW_INITIALIZATION_DATA
;
308 /* FUNCTIONS ****************************************************************/
311 ScsiDebugPrint(IN ULONG DebugPrintLevel
,
312 IN PCHAR DebugMessage
,
316 ScsiPortCompleteRequest(IN PVOID HwDeviceExtension
,
323 ScsiPortConvertPhysicalAddressToUlong(IN SCSI_PHYSICAL_ADDRESS Address
);
325 SCSI_PHYSICAL_ADDRESS STDCALL
326 ScsiPortConvertUlongToPhysicalAddress(IN ULONG UlongAddress
);
329 ScsiPortFlushDma(IN PVOID HwDeviceExtension
);
332 ScsiPortFreeDeviceBase(IN PVOID HwDeviceExtension
,
333 IN PVOID MappedAddress
);
336 ScsiPortGetBusData(IN PVOID DeviceExtension
,
337 IN ULONG BusDataType
,
338 IN ULONG SystemIoBusNumber
,
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
);
352 ScsiPortGetLogicalUnit(IN PVOID HwDeviceExtension
,
357 SCSI_PHYSICAL_ADDRESS STDCALL
358 ScsiPortGetPhysicalAddress(IN PVOID HwDeviceExtension
,
359 IN PSCSI_REQUEST_BLOCK Srb OPTIONAL
,
360 IN PVOID VirtualAddress
,
363 PSCSI_REQUEST_BLOCK STDCALL
364 ScsiPortGetSrb(IN PVOID DeviceExtension
,
371 ScsiPortGetUncachedExtension(IN PVOID HwDeviceExtension
,
372 IN PPORT_CONFIGURATION_INFORMATION ConfigInfo
,
373 IN ULONG NumberOfBytes
);
376 ScsiPortGetVirtualAddress(IN PVOID HwDeviceExtension
,
377 IN SCSI_PHYSICAL_ADDRESS PhysicalAddress
);
380 ScsiPortInitialize(IN PVOID Argument1
,
382 IN
struct _HW_INITIALIZATION_DATA
*HwInitializationData
,
386 ScsiPortIoMapTransfer(IN PVOID HwDeviceExtension
,
387 IN PSCSI_REQUEST_BLOCK Srb
,
388 IN ULONG LogicalAddress
,
392 ScsiPortLogError(IN PVOID HwDeviceExtension
,
393 IN PSCSI_REQUEST_BLOCK Srb OPTIONAL
,
401 ScsiPortMoveMemory(OUT PVOID Destination
,
406 ScsiPortNotification(IN SCSI_NOTIFICATION_TYPE NotificationType
,
407 IN PVOID HwDeviceExtension
,
411 ScsiPortReadPortBufferUchar(IN PUCHAR Port
,
416 ScsiPortReadPortBufferUlong(IN PULONG Port
,
421 ScsiPortReadPortBufferUshort(IN PUSHORT Port
,
426 ScsiPortReadPortUchar(IN PUCHAR Port
);
429 ScsiPortReadPortUlong(IN PULONG Port
);
432 ScsiPortReadPortUshort(IN PUSHORT Port
);
435 ScsiPortReadRegisterBufferUchar(IN PUCHAR Register
,
440 ScsiPortReadRegisterBufferUlong(IN PULONG Register
,
445 ScsiPortReadRegisterBufferUshort(IN PUSHORT Register
,
450 ScsiPortReadRegisterUchar(IN PUCHAR Register
);
453 ScsiPortReadRegisterUlong(IN PULONG Register
);
456 ScsiPortReadRegisterUshort(IN PUSHORT Register
);
459 ScsiPortSetBusDataByOffset(IN PVOID DeviceExtension
,
460 IN ULONG BusDataType
,
461 IN ULONG SystemIoBusNumber
,
468 ScsiPortStallExecution(IN ULONG MicroSeconds
);
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
);
479 ScsiPortWritePortBufferUchar(IN PUCHAR Port
,
484 ScsiPortWritePortBufferUlong(IN PULONG Port
,
489 ScsiPortWritePortBufferUshort(IN PUSHORT Port
,
494 ScsiPortWritePortUchar(IN PUCHAR Port
,
498 ScsiPortWritePortUlong(IN PULONG Port
,
502 ScsiPortWritePortUshort(IN PUSHORT Port
,
506 ScsiPortWriteRegisterBufferUchar(IN PUCHAR Register
,
511 ScsiPortWriteRegisterBufferUlong(IN PULONG Register
,
516 ScsiPortWriteRegisterBufferUshort(IN PUSHORT Register
,
521 ScsiPortWriteRegisterUchar(IN PUCHAR Register
,
525 ScsiPortWriteRegisterUlong(IN PULONG Register
,
529 ScsiPortWriteRegisterUshort(IN PUSHORT Register
,
532 #endif /* __STORAGE_INCLUDE_SRB_H */