1 /* $Id: srb.h,v 1.2 2002/01/14 01:44:19 ekohl 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.
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
24 // This constant is for backward compatibility.
25 // This use to be the maximum number of targets supported.
28 #define SCSI_MAXIMUM_TARGETS 8
32 #define MAXIMUM_CDB_SIZE 12
35 typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS
, *PSCSI_PHYSICAL_ADDRESS
;
38 typedef struct _ACCESS_RANGE
40 SCSI_PHYSICAL_ADDRESS RangeStart
;
42 BOOLEAN RangeInMemory
;
43 }ACCESS_RANGE
, *PACCESS_RANGE
;
46 typedef struct _PORT_CONFIGURATION_INFORMATION
49 ULONG SystemIoBusNumber
;
50 INTERFACE_TYPE AdapterInterfaceType
;
51 ULONG BusInterruptLevel
;
52 ULONG BusInterruptVector
;
53 KINTERRUPT_MODE InterruptMode
;
54 ULONG MaximumTransferLength
;
55 ULONG NumberOfPhysicalBreaks
;
61 ULONG NumberOfAccessRanges
;
62 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)
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
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
183 #define SRB_STATUS_QUEUE_FROZEN 0x40
184 #define SRB_STATUS_AUTOSENSE_VALID 0x80
186 #define SRB_STATUS(Status) (Status & ~(SRB_STATUS_AUTOSENSE_VALID | SRB_STATUS_QUEUE_FROZEN))
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
211 #define SRB_SIMPLE_TAG_REQUEST 0x20
212 #define SRB_HEAD_OF_QUEUE_TAG_REQUEST 0x21
213 #define SRB_ORDERED_QUEUE_TAG_REQUEST 0x22
217 // Port driver error codes
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
232 // Return values for SCSI_HW_FIND_ADAPTER.
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
241 typedef enum _SCSI_NOTIFICATION_TYPE
247 CallDisableInterrupts
,
248 CallEnableInterrupts
,
250 } SCSI_NOTIFICATION_TYPE
, *PSCSI_NOTIFICATION_TYPE
;
253 typedef BOOLEAN STDCALL
254 (*PHW_INITIALIZE
)(IN PVOID DeviceExtension
);
256 typedef BOOLEAN STDCALL
257 (*PHW_STARTIO
)(IN PVOID DeviceExtension
,
258 IN PSCSI_REQUEST_BLOCK Srb
);
260 typedef BOOLEAN STDCALL
261 (*PHW_INTERRUPT
)(IN PVOID DeviceExtension
);
264 (*PHW_TIMER
)(IN PVOID DeviceExtension
);
267 (*PHW_DMA_STARTED
)(IN PVOID DeviceExtension
);
269 typedef ULONG STDCALL
270 (*PHW_FIND_ADAPTER
)(IN PVOID DeviceExtension
,
272 IN PVOID BusInformation
,
273 IN PCHAR ArgumentString
,
274 IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo
,
277 typedef BOOLEAN STDCALL
278 (*PHW_RESET_BUS
)(IN PVOID DeviceExtension
,
281 typedef BOOLEAN STDCALL
282 (*PHW_ADAPTER_STATE
)(IN PVOID DeviceExtension
,
284 IN BOOLEAN SaveState
);
286 typedef struct _HW_INITIALIZATION_DATA
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
;
303 BOOLEAN NeedPhysicalAddresses
;
304 BOOLEAN TaggedQueuing
;
305 BOOLEAN AutoRequestSense
;
306 BOOLEAN MultipleRequestPerLu
;
307 BOOLEAN ReceiveEvent
;
308 USHORT VendorIdLength
;
310 USHORT ReservedUshort
;
311 USHORT DeviceIdLength
;
313 } HW_INITIALIZATION_DATA
, *PHW_INITIALIZATION_DATA
;
316 /* FUNCTIONS ****************************************************************/
319 ScsiDebugPrint(IN ULONG DebugPrintLevel
,
320 IN PCHAR DebugMessage
,
324 ScsiPortCompleteRequest(IN PVOID HwDeviceExtension
,
331 ScsiPortConvertPhysicalAddressToUlong(IN SCSI_PHYSICAL_ADDRESS Address
);
333 SCSI_PHYSICAL_ADDRESS STDCALL
334 ScsiPortConvertUlongToPhysicalAddress(IN ULONG UlongAddress
);
337 ScsiPortFlushDma(IN PVOID HwDeviceExtension
);
341 ScsiPortFreeDeviceBase (
342 IN PVOID HwDeviceExtension
,
343 IN PVOID MappedAddress
349 IN PVOID DeviceExtension
,
350 IN ULONG BusDataType
,
351 IN ULONG SystemIoBusNumber
,
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
,
370 ScsiPortGetLogicalUnit (
371 IN PVOID HwDeviceExtension
,
377 SCSI_PHYSICAL_ADDRESS
379 ScsiPortGetPhysicalAddress (
380 IN PVOID HwDeviceExtension
,
381 IN PSCSI_REQUEST_BLOCK Srb OPTIONAL
,
382 IN PVOID VirtualAddress
,
389 IN PVOID DeviceExtension
,
397 ScsiPortGetUncachedExtension (
398 IN PVOID HwDeviceExtension
,
399 IN PPORT_CONFIGURATION_INFORMATION ConfigInfo
,
400 IN ULONG NumberOfBytes
404 ScsiPortGetVirtualAddress (
405 IN PVOID HwDeviceExtension
,
406 IN SCSI_PHYSICAL_ADDRESS PhysicalAddress
413 IN
struct _HW_INITIALIZATION_DATA
*HwInitializationData
,
418 ScsiPortIoMapTransfer (
419 IN PVOID HwDeviceExtension
,
420 IN PSCSI_REQUEST_BLOCK Srb
,
421 IN ULONG LogicalAddress
,
427 IN PVOID HwDeviceExtension
,
428 IN PSCSI_REQUEST_BLOCK Srb OPTIONAL
,
437 ScsiPortMoveMemory(OUT PVOID Destination
,
442 ScsiPortNotification(IN SCSI_NOTIFICATION_TYPE NotificationType
,
443 IN PVOID HwDeviceExtension
,
447 ScsiPortReadPortBufferUchar(IN PUCHAR Port
,
452 ScsiPortReadPortBufferUlong(IN PULONG Port
,
457 ScsiPortReadPortBufferUshort(IN PUSHORT Port
,
462 ScsiPortReadPortUchar(IN PUCHAR Port
);
465 ScsiPortReadPortUlong(IN PULONG Port
);
468 ScsiPortReadPortUshort(IN PUSHORT Port
);
471 ScsiPortReadRegisterBufferUchar(IN PUCHAR Register
,
476 ScsiPortReadRegisterBufferUlong(IN PULONG Register
,
481 ScsiPortReadRegisterBufferUshort(IN PUSHORT Register
,
486 ScsiPortReadRegisterUchar(IN PUCHAR Register
);
489 ScsiPortReadRegisterUlong(IN PULONG Register
);
492 ScsiPortReadRegisterUshort(IN PUSHORT Register
);
495 ScsiPortSetBusDataByOffset(IN PVOID DeviceExtension
,
496 IN ULONG BusDataType
,
497 IN ULONG SystemIoBusNumber
,
504 ScsiPortStallExecution(IN ULONG MicroSeconds
);
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
);
515 ScsiPortWritePortBufferUchar(IN PUCHAR Port
,
520 ScsiPortWritePortBufferUlong(IN PULONG Port
,
525 ScsiPortWritePortBufferUshort(IN PUSHORT Port
,
530 ScsiPortWritePortUchar(IN PUCHAR Port
,
534 ScsiPortWritePortUlong(IN PULONG Port
,
538 ScsiPortWritePortUshort(IN PUSHORT Port
,
542 ScsiPortWriteRegisterBufferUchar(IN PUCHAR Register
,
547 ScsiPortWriteRegisterBufferUlong(IN PULONG Register
,
552 ScsiPortWriteRegisterBufferUshort(IN PUSHORT Register
,
557 ScsiPortWriteRegisterUchar(IN PUCHAR Register
,
561 ScsiPortWriteRegisterUlong(IN PULONG Register
,
565 ScsiPortWriteRegisterUshort(IN PUSHORT Register
,
568 #endif /* __STORAGE_INCLUDE_SRB_H */