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 */