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 #pragma GCC system_header
25 #if defined(_SCSIPORT_)
31 #define DDKAPI STDCALL
33 /* Obsolete. For backward compatibility only. */
35 typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS
, *PSCSI_PHYSICAL_ADDRESS
;
37 #define SP_UNINITIALIZED_VALUE ((ULONG) ~0)
38 #define SP_UNTAGGED ((ULONG) ~0)
40 #define SRB_SIMPLE_TAG_REQUEST 0x20
41 #define SRB_HEAD_OF_QUEUE_TAG_REQUEST 0x21
42 #define SRB_ORDERED_QUEUE_TAG_REQUEST 0x22
44 /* SRB Status Masks */
46 #define SRB_STATUS_QUEUE_FROZEN 0x40
47 #define SRB_STATUS_AUTOSENSE_VALID 0x80
49 #define SRB_STATUS(Status) \
50 (Status & ~(SRB_STATUS_AUTOSENSE_VALID | SRB_STATUS_QUEUE_FROZEN))
52 #define MAXIMUM_CDB_SIZE 12
54 /* Define SCSI maximum configuration parameters. */
56 #define SCSI_MAXIMUM_LOGICAL_UNITS 8
57 #define SCSI_MAXIMUM_TARGETS_PER_BUS 32
58 #define SCSI_MAXIMUM_BUSES 8
59 #define SCSI_MINIMUM_PHYSICAL_BREAKS 16
60 #define SCSI_MAXIMUM_PHYSICAL_BREAKS 255
61 #define SCSI_MAXIMUM_TARGETS 8
65 /* Port driver error codes */
67 #define SP_BUS_PARITY_ERROR 0x0001
68 #define SP_UNEXPECTED_DISCONNECT 0x0002
69 #define SP_INVALID_RESELECTION 0x0003
70 #define SP_BUS_TIME_OUT 0x0004
71 #define SP_PROTOCOL_ERROR 0x0005
72 #define SP_INTERNAL_ADAPTER_ERROR 0x0006
73 #define SP_REQUEST_TIMEOUT 0x0007
74 #define SP_IRQ_NOT_RESPONDING 0x0008
75 #define SP_BAD_FW_WARNING 0x0009
76 #define SP_BAD_FW_ERROR 0x000a
78 /* SCSI_REQUEST_BLOCK.Function constants */
79 #define SRB_FUNCTION_EXECUTE_SCSI 0x00
80 #define SRB_FUNCTION_CLAIM_DEVICE 0x01
81 #define SRB_FUNCTION_IO_CONTROL 0x02
82 #define SRB_FUNCTION_RECEIVE_EVENT 0x03
83 #define SRB_FUNCTION_RELEASE_QUEUE 0x04
84 #define SRB_FUNCTION_ATTACH_DEVICE 0x05
85 #define SRB_FUNCTION_RELEASE_DEVICE 0x06
86 #define SRB_FUNCTION_SHUTDOWN 0x07
87 #define SRB_FUNCTION_FLUSH 0x08
88 #define SRB_FUNCTION_ABORT_COMMAND 0x10
89 #define SRB_FUNCTION_RELEASE_RECOVERY 0x11
90 #define SRB_FUNCTION_RESET_BUS 0x12
91 #define SRB_FUNCTION_RESET_DEVICE 0x13
92 #define SRB_FUNCTION_TERMINATE_IO 0x14
93 #define SRB_FUNCTION_FLUSH_QUEUE 0x15
94 #define SRB_FUNCTION_REMOVE_DEVICE 0x16
96 /* SCSI_REQUEST_BLOCK.SrbStatus constants */
97 #define SRB_STATUS_PENDING 0x00
98 #define SRB_STATUS_SUCCESS 0x01
99 #define SRB_STATUS_ABORTED 0x02
100 #define SRB_STATUS_ABORT_FAILED 0x03
101 #define SRB_STATUS_ERROR 0x04
102 #define SRB_STATUS_BUSY 0x05
103 #define SRB_STATUS_INVALID_REQUEST 0x06
104 #define SRB_STATUS_INVALID_PATH_ID 0x07
105 #define SRB_STATUS_NO_DEVICE 0x08
106 #define SRB_STATUS_TIMEOUT 0x09
107 #define SRB_STATUS_SELECTION_TIMEOUT 0x0A
108 #define SRB_STATUS_COMMAND_TIMEOUT 0x0B
109 #define SRB_STATUS_MESSAGE_REJECTED 0x0D
110 #define SRB_STATUS_BUS_RESET 0x0E
111 #define SRB_STATUS_PARITY_ERROR 0x0F
112 #define SRB_STATUS_REQUEST_SENSE_FAILED 0x10
113 #define SRB_STATUS_NO_HBA 0x11
114 #define SRB_STATUS_DATA_OVERRUN 0x12
115 #define SRB_STATUS_UNEXPECTED_BUS_FREE 0x13
116 #define SRB_STATUS_PHASE_SEQUENCE_FAILURE 0x14
117 #define SRB_STATUS_BAD_SRB_BLOCK_LENGTH 0x15
118 #define SRB_STATUS_REQUEST_FLUSHED 0x16
119 #define SRB_STATUS_INVALID_LUN 0x20
120 #define SRB_STATUS_INVALID_TARGET_ID 0x21
121 #define SRB_STATUS_BAD_FUNCTION 0x22
122 #define SRB_STATUS_ERROR_RECOVERY 0x23
124 /* SCSI_REQUEST_BLOCK.SrbFlags constants */
125 #define SRB_FLAGS_QUEUE_ACTION_ENABLE 0x00000002
126 #define SRB_FLAGS_DISABLE_DISCONNECT 0x00000004
127 #define SRB_FLAGS_DISABLE_SYNCH_TRANSFER 0x00000008
128 #define SRB_FLAGS_BYPASS_FROZEN_QUEUE 0x00000010
129 #define SRB_FLAGS_DISABLE_AUTOSENSE 0x00000020
130 #define SRB_FLAGS_DATA_IN 0x00000040
131 #define SRB_FLAGS_DATA_OUT 0x00000080
132 #define SRB_FLAGS_NO_DATA_TRANSFER 0x00000000
133 #define SRB_FLAGS_UNSPECIFIED_DIRECTION (SRB_FLAGS_DATA_IN | SRB_FLAGS_DATA_OUT)
134 #define SRB_FLAGS_NO_QUEUE_FREEZE 0x00000100
135 #define SRB_FLAGS_ADAPTER_CACHE_ENABLE 0x00000200
136 #define SRB_FLAGS_IS_ACTIVE 0x00010000
137 #define SRB_FLAGS_ALLOCATED_FROM_ZONE 0x00020000
138 #define SRB_FLAGS_SGLIST_FROM_POOL 0x00040000
140 typedef struct _SCSI_REQUEST_BLOCK
{
141 USHORT Length
; /* 0x00 */
142 UCHAR Function
; /* 0x02 */
143 UCHAR SrbStatus
; /* 0x03 */
144 UCHAR ScsiStatus
; /* 0x04 */
145 UCHAR PathId
; /* 0x05 */
146 UCHAR TargetId
; /* 0x06 */
147 UCHAR Lun
; /* 0x07 */
148 UCHAR QueueTag
; /* 0x08 */
149 UCHAR QueueAction
; /* 0x09 */
150 UCHAR CdbLength
; /* 0x0A */
151 UCHAR SenseInfoBufferLength
; /* 0x0B */
152 ULONG SrbFlags
; /* 0x0C */
153 ULONG DataTransferLength
; /* 0x10 */
154 ULONG TimeOutValue
; /* 0x14 */
155 PVOID DataBuffer
; /* 0x18 */
156 PVOID SenseInfoBuffer
; /* 0x1C */
157 struct _SCSI_REQUEST_BLOCK
*NextSrb
; /* 0x20 */
158 PVOID OriginalRequest
; /* 0x24 */
159 PVOID SrbExtension
; /* 0x28 */
160 ULONG QueueSortKey
; /* 0x2C */
161 UCHAR Cdb
[16]; /* 0x30 */
162 } SCSI_REQUEST_BLOCK
, *PSCSI_REQUEST_BLOCK
;
164 #define SCSI_REQUEST_BLOCK_SIZE sizeof(SCSI_REQUEST_BLOCK)
166 typedef struct _ACCESS_RANGE
{
167 SCSI_PHYSICAL_ADDRESS RangeStart
;
169 BOOLEAN RangeInMemory
;
170 }ACCESS_RANGE
, *PACCESS_RANGE
;
173 typedef struct _PORT_CONFIGURATION_INFORMATION
{
175 ULONG SystemIoBusNumber
;
176 INTERFACE_TYPE AdapterInterfaceType
;
177 ULONG BusInterruptLevel
;
178 ULONG BusInterruptVector
;
179 KINTERRUPT_MODE InterruptMode
;
180 ULONG MaximumTransferLength
;
181 ULONG NumberOfPhysicalBreaks
;
187 ULONG NumberOfAccessRanges
;
189 ACCESS_RANGE
*AccessRanges
;
191 ACCESS_RANGE (*AccessRanges
)[];
195 CCHAR InitiatorBusId
[8];
196 BOOLEAN ScatterGather
;
199 BOOLEAN AdapterScansDown
;
200 BOOLEAN AtdiskPrimaryClaimed
;
201 BOOLEAN AtdiskSecondaryClaimed
;
202 BOOLEAN Dma32BitAddresses
;
205 BOOLEAN NeedPhysicalAddresses
;
206 BOOLEAN TaggedQueuing
;
207 BOOLEAN AutoRequestSense
;
208 BOOLEAN MultipleRequestPerLu
;
209 BOOLEAN ReceiveEvent
;
210 BOOLEAN RealModeInitialized
;
211 BOOLEAN BufferAccessScsiPortControlled
;
212 UCHAR MaximumNumberOfTargets
;
213 UCHAR ReservedUchars
[2];
215 ULONG BusInterruptLevel2
;
216 ULONG BusInterruptVector2
;
217 KINTERRUPT_MODE InterruptMode2
;
222 ULONG DeviceExtensionSize
;
223 ULONG SpecificLuExtensionSize
;
224 ULONG SrbExtensionSize
;
225 } PORT_CONFIGURATION_INFORMATION
, *PPORT_CONFIGURATION_INFORMATION
;
227 #define CONFIG_INFO_VERSION_2 sizeof(PORT_CONFIGURATION_INFORMATION)
229 typedef enum _SCSI_NOTIFICATION_TYPE
{
234 CallDisableInterrupts
,
235 CallEnableInterrupts
,
237 } SCSI_NOTIFICATION_TYPE
, *PSCSI_NOTIFICATION_TYPE
;
240 typedef BOOLEAN DDKAPI
241 (*PHW_ADAPTER_STATE
)(
242 IN PVOID DeviceExtension
,
244 IN BOOLEAN SaveState
);
246 /* Return values for SCSI_HW_FIND_ADAPTER. */
248 #define SP_RETURN_NOT_FOUND 0
249 #define SP_RETURN_FOUND 1
250 #define SP_RETURN_ERROR 2
251 #define SP_RETURN_BAD_CONFIG 3
255 IN PVOID DeviceExtension
,
257 IN PVOID BusInformation
,
258 IN PCHAR ArgumentString
,
259 IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo
,
262 typedef BOOLEAN DDKAPI
264 IN PVOID DeviceExtension
);
266 typedef BOOLEAN DDKAPI
268 IN PVOID DeviceExtension
);
270 typedef BOOLEAN DDKAPI
272 IN PVOID DeviceExtension
,
277 IN PVOID DeviceExtension
);
279 typedef BOOLEAN DDKAPI
281 IN PVOID DeviceExtension
,
282 IN PSCSI_REQUEST_BLOCK Srb
);
286 IN PVOID DeviceExtension
);
288 typedef struct _HW_INITIALIZATION_DATA
{
289 ULONG HwInitializationDataSize
;
290 INTERFACE_TYPE AdapterInterfaceType
;
291 PHW_INITIALIZE HwInitialize
;
292 PHW_STARTIO HwStartIo
;
293 PHW_INTERRUPT HwInterrupt
;
294 PHW_FIND_ADAPTER HwFindAdapter
;
295 PHW_RESET_BUS HwResetBus
;
296 PHW_DMA_STARTED HwDmaStarted
;
297 PHW_ADAPTER_STATE HwAdapterState
;
298 ULONG DeviceExtensionSize
;
299 ULONG SpecificLuExtensionSize
;
300 ULONG SrbExtensionSize
;
301 ULONG NumberOfAccessRanges
;
304 BOOLEAN NeedPhysicalAddresses
;
305 // BOOLEAN TaggedQueuing;
306 BOOLEAN TaggedQueueing
;
307 BOOLEAN AutoRequestSense
;
308 BOOLEAN MultipleRequestPerLu
;
309 BOOLEAN ReceiveEvent
;
310 USHORT VendorIdLength
;
312 USHORT ReservedUshort
;
313 USHORT DeviceIdLength
;
315 } HW_INITIALIZATION_DATA
, *PHW_INITIALIZATION_DATA
;
318 /* FUNCTIONS ****************************************************************/
322 ScsiPortCompleteRequest(
323 IN PVOID HwDeviceExtension
,
331 ScsiPortConvertPhysicalAddressToUlong(
332 IN SCSI_PHYSICAL_ADDRESS Address
);
335 SCSI_PHYSICAL_ADDRESS
337 ScsiPortConvertUlongToPhysicalAddress(
338 IN ULONG UlongAddress
);
344 IN PVOID HwDeviceExtension
);
349 ScsiPortFreeDeviceBase(
350 IN PVOID HwDeviceExtension
,
351 IN PVOID MappedAddress
);
357 IN PVOID DeviceExtension
,
358 IN ULONG BusDataType
,
359 IN ULONG SystemIoBusNumber
,
367 ScsiPortGetDeviceBase(
368 IN PVOID HwDeviceExtension
,
369 IN INTERFACE_TYPE BusType
,
370 IN ULONG SystemIoBusNumber
,
371 IN SCSI_PHYSICAL_ADDRESS IoAddress
,
372 IN ULONG NumberOfBytes
,
373 IN BOOLEAN InIoSpace
);
378 ScsiPortGetLogicalUnit(
379 IN PVOID HwDeviceExtension
,
385 SCSI_PHYSICAL_ADDRESS
387 ScsiPortGetPhysicalAddress(
388 IN PVOID HwDeviceExtension
,
389 IN PSCSI_REQUEST_BLOCK Srb OPTIONAL
,
390 IN PVOID VirtualAddress
,
397 IN PVOID DeviceExtension
,
406 ScsiPortGetUncachedExtension(
407 IN PVOID HwDeviceExtension
,
408 IN PPORT_CONFIGURATION_INFORMATION ConfigInfo
,
409 IN ULONG NumberOfBytes
);
414 ScsiPortGetVirtualAddress(
415 IN PVOID HwDeviceExtension
,
416 IN SCSI_PHYSICAL_ADDRESS PhysicalAddress
);
424 IN
struct _HW_INITIALIZATION_DATA
*HwInitializationData
,
430 ScsiPortIoMapTransfer(
431 IN PVOID HwDeviceExtension
,
432 IN PSCSI_REQUEST_BLOCK Srb
,
433 IN ULONG LogicalAddress
,
440 IN PVOID HwDeviceExtension
,
441 IN PSCSI_REQUEST_BLOCK Srb OPTIONAL
,
452 OUT PVOID Destination
,
458 ScsiPortNotification(
459 IN SCSI_NOTIFICATION_TYPE NotificationType
,
460 IN PVOID HwDeviceExtension
,
466 ScsiPortReadPortBufferUchar(
474 ScsiPortReadPortBufferUlong(
482 ScsiPortReadPortBufferUshort(
490 ScsiPortReadPortUchar(
496 ScsiPortReadPortUlong(
502 ScsiPortReadPortUshort(
508 ScsiPortReadRegisterBufferUchar(
516 ScsiPortReadRegisterBufferUlong(
524 ScsiPortReadRegisterBufferUshort(
532 ScsiPortReadRegisterUchar(
538 ScsiPortReadRegisterUlong(
544 ScsiPortReadRegisterUshort(
545 IN PUSHORT Register
);
550 ScsiPortSetBusDataByOffset(
551 IN PVOID DeviceExtension
,
552 IN ULONG BusDataType
,
553 IN ULONG SystemIoBusNumber
,
562 ScsiPortStallExecution(
563 IN ULONG MicroSeconds
);
568 ScsiPortValidateRange(
569 IN PVOID HwDeviceExtension
,
570 IN INTERFACE_TYPE BusType
,
571 IN ULONG SystemIoBusNumber
,
572 IN SCSI_PHYSICAL_ADDRESS IoAddress
,
573 IN ULONG NumberOfBytes
,
574 IN BOOLEAN InIoSpace
);
579 ScsiPortWritePortBufferUchar(
587 ScsiPortWritePortBufferUlong(
595 ScsiPortWritePortBufferUshort(
603 ScsiPortWritePortUchar(
610 ScsiPortWritePortUlong(
617 ScsiPortWritePortUshort(
624 ScsiPortWriteRegisterBufferUchar(
632 ScsiPortWriteRegisterBufferUlong(
640 ScsiPortWriteRegisterBufferUshort(
648 ScsiPortWriteRegisterUchar(
655 ScsiPortWriteRegisterUlong(
662 ScsiPortWriteRegisterUshort(
669 IN ULONG DebugPrintLevel
,
670 IN PCHAR DebugMessage
,
679 #endif /* __STORAGE_INCLUDE_SRB_H */