4 * Interface between SCSI miniport drivers and the SCSI port driver.
6 * This file is part of the w32api package.
9 * Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
11 * THIS SOFTWARE IS NOT COPYRIGHTED
13 * This source code is offered for use in the public domain. You may
14 * use, modify or distribute it freely.
16 * This code is distributed in the hope that it will be useful but
17 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
18 * DISCLAIMED. This includes but is not limited to warranties of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
27 #pragma GCC system_header
34 #if defined(_SCSIPORT_)
35 #define SCSIPORTAPI DECLSPEC_EXPORT
37 #define SCSIPORTAPI DECLSPEC_IMPORT
41 #define DebugPrint(x) ScsiDebugPrint x
46 typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS
, *PSCSI_PHYSICAL_ADDRESS
;
48 #define SP_UNINITIALIZED_VALUE ((ULONG) ~0)
49 #define SP_UNTAGGED ((UCHAR) ~0)
51 #define SRB_SIMPLE_TAG_REQUEST 0x20
52 #define SRB_HEAD_OF_QUEUE_TAG_REQUEST 0x21
53 #define SRB_ORDERED_QUEUE_TAG_REQUEST 0x22
55 #define SRB_STATUS_QUEUE_FROZEN 0x40
56 #define SRB_STATUS_AUTOSENSE_VALID 0x80
58 #define SRB_STATUS(Status) \
59 (Status & ~(SRB_STATUS_AUTOSENSE_VALID | SRB_STATUS_QUEUE_FROZEN))
61 #define MAXIMUM_CDB_SIZE 12
64 #define SCSI_PORT_SIGNATURE 0x54524f50
68 #define SCSI_MAXIMUM_LOGICAL_UNITS 8
69 #define SCSI_MAXIMUM_TARGETS_PER_BUS 128
70 #define SCSI_MAXIMUM_LUNS_PER_TARGET 255
71 #define SCSI_MAXIMUM_BUSES 8
72 #define SCSI_MINIMUM_PHYSICAL_BREAKS 16
73 #define SCSI_MAXIMUM_PHYSICAL_BREAKS 255
74 #define SCSI_MAXIMUM_TARGETS 8
76 #define SRB_FUNCTION_WMI 0x17
78 #define SRB_WMI_FLAGS_ADAPTER_REQUEST 0x0001
80 #define SP_BUS_PARITY_ERROR 0x0001
81 #define SP_UNEXPECTED_DISCONNECT 0x0002
82 #define SP_INVALID_RESELECTION 0x0003
83 #define SP_BUS_TIME_OUT 0x0004
84 #define SP_PROTOCOL_ERROR 0x0005
85 #define SP_INTERNAL_ADAPTER_ERROR 0x0006
86 #define SP_REQUEST_TIMEOUT 0x0007
87 #define SP_IRQ_NOT_RESPONDING 0x0008
88 #define SP_BAD_FW_WARNING 0x0009
89 #define SP_BAD_FW_ERROR 0x000a
90 #define SP_LOST_WMI_MINIPORT_REQUEST 0x000b
92 /* SCSI_REQUEST_BLOCK.Function constants */
93 #define SRB_FUNCTION_EXECUTE_SCSI 0x00
94 #define SRB_FUNCTION_CLAIM_DEVICE 0x01
95 #define SRB_FUNCTION_IO_CONTROL 0x02
96 #define SRB_FUNCTION_RECEIVE_EVENT 0x03
97 #define SRB_FUNCTION_RELEASE_QUEUE 0x04
98 #define SRB_FUNCTION_ATTACH_DEVICE 0x05
99 #define SRB_FUNCTION_RELEASE_DEVICE 0x06
100 #define SRB_FUNCTION_SHUTDOWN 0x07
101 #define SRB_FUNCTION_FLUSH 0x08
102 #define SRB_FUNCTION_ABORT_COMMAND 0x10
103 #define SRB_FUNCTION_RELEASE_RECOVERY 0x11
104 #define SRB_FUNCTION_RESET_BUS 0x12
105 #define SRB_FUNCTION_RESET_DEVICE 0x13
106 #define SRB_FUNCTION_TERMINATE_IO 0x14
107 #define SRB_FUNCTION_FLUSH_QUEUE 0x15
108 #define SRB_FUNCTION_REMOVE_DEVICE 0x16
109 #define SRB_FUNCTION_WMI 0x17
110 #define SRB_FUNCTION_LOCK_QUEUE 0x18
111 #define SRB_FUNCTION_UNLOCK_QUEUE 0x19
112 #define SRB_FUNCTION_RESET_LOGICAL_UNIT 0x20
114 /* SCSI_REQUEST_BLOCK.SrbStatus constants */
115 #define SRB_STATUS_PENDING 0x00
116 #define SRB_STATUS_SUCCESS 0x01
117 #define SRB_STATUS_ABORTED 0x02
118 #define SRB_STATUS_ABORT_FAILED 0x03
119 #define SRB_STATUS_ERROR 0x04
120 #define SRB_STATUS_BUSY 0x05
121 #define SRB_STATUS_INVALID_REQUEST 0x06
122 #define SRB_STATUS_INVALID_PATH_ID 0x07
123 #define SRB_STATUS_NO_DEVICE 0x08
124 #define SRB_STATUS_TIMEOUT 0x09
125 #define SRB_STATUS_SELECTION_TIMEOUT 0x0A
126 #define SRB_STATUS_COMMAND_TIMEOUT 0x0B
127 #define SRB_STATUS_MESSAGE_REJECTED 0x0D
128 #define SRB_STATUS_BUS_RESET 0x0E
129 #define SRB_STATUS_PARITY_ERROR 0x0F
130 #define SRB_STATUS_REQUEST_SENSE_FAILED 0x10
131 #define SRB_STATUS_NO_HBA 0x11
132 #define SRB_STATUS_DATA_OVERRUN 0x12
133 #define SRB_STATUS_UNEXPECTED_BUS_FREE 0x13
134 #define SRB_STATUS_PHASE_SEQUENCE_FAILURE 0x14
135 #define SRB_STATUS_BAD_SRB_BLOCK_LENGTH 0x15
136 #define SRB_STATUS_REQUEST_FLUSHED 0x16
137 #define SRB_STATUS_INVALID_LUN 0x20
138 #define SRB_STATUS_INVALID_TARGET_ID 0x21
139 #define SRB_STATUS_BAD_FUNCTION 0x22
140 #define SRB_STATUS_ERROR_RECOVERY 0x23
141 #define SRB_STATUS_NOT_POWERED 0x24
142 #define SRB_STATUS_INTERNAL_ERROR 0x30
144 /* SCSI_REQUEST_BLOCK.SrbFlags constants */
145 #define SRB_FLAGS_QUEUE_ACTION_ENABLE 0x00000002
146 #define SRB_FLAGS_DISABLE_DISCONNECT 0x00000004
147 #define SRB_FLAGS_DISABLE_SYNCH_TRANSFER 0x00000008
148 #define SRB_FLAGS_BYPASS_FROZEN_QUEUE 0x00000010
149 #define SRB_FLAGS_DISABLE_AUTOSENSE 0x00000020
150 #define SRB_FLAGS_DATA_IN 0x00000040
151 #define SRB_FLAGS_DATA_OUT 0x00000080
152 #define SRB_FLAGS_NO_DATA_TRANSFER 0x00000000
153 #define SRB_FLAGS_UNSPECIFIED_DIRECTION (SRB_FLAGS_DATA_IN | SRB_FLAGS_DATA_OUT)
154 #define SRB_FLAGS_NO_QUEUE_FREEZE 0x00000100
155 #define SRB_FLAGS_ADAPTER_CACHE_ENABLE 0x00000200
156 #define SRB_FLAGS_FREE_SENSE_BUFFER 0x00000400
157 #define SRB_FLAGS_IS_ACTIVE 0x00010000
158 #define SRB_FLAGS_ALLOCATED_FROM_ZONE 0x00020000
159 #define SRB_FLAGS_SGLIST_FROM_POOL 0x00040000
160 #define SRB_FLAGS_BYPASS_LOCKED_QUEUE 0x00080000
161 #define SRB_FLAGS_NO_KEEP_AWAKE 0x00100000
162 #define SRB_FLAGS_PORT_DRIVER_ALLOCSENSE 0x00200000
163 #define SRB_FLAGS_PORT_DRIVER_SENSEHASPORT 0x00400000
164 #define SRB_FLAGS_DONT_START_NEXT_PACKET 0x00800000
165 #define SRB_FLAGS_PORT_DRIVER_RESERVED 0x0F000000
166 #define SRB_FLAGS_CLASS_DRIVER_RESERVED 0xF0000000
168 /* Asynchronous events */
169 #define SRBEV_BUS_RESET 0x0001
170 #define SRBEV_SCSI_ASYNC_NOTIFICATION 0x0002
173 typedef struct _SCSI_REQUEST_BLOCK
{
184 UCHAR SenseInfoBufferLength
;
186 ULONG DataTransferLength
;
189 PVOID SenseInfoBuffer
;
190 struct _SCSI_REQUEST_BLOCK
*NextSrb
;
191 PVOID OriginalRequest
;
193 _ANONYMOUS_UNION
union {
194 ULONG InternalStatus
;
201 } SCSI_REQUEST_BLOCK
, *PSCSI_REQUEST_BLOCK
;
203 #define SCSI_REQUEST_BLOCK_SIZE sizeof(SCSI_REQUEST_BLOCK)
205 typedef struct _ACCESS_RANGE
{
206 SCSI_PHYSICAL_ADDRESS RangeStart
;
208 BOOLEAN RangeInMemory
;
209 } ACCESS_RANGE
, *PACCESS_RANGE
;
211 /* PORT_CONFIGURATION_INFORMATION.Dma64BitAddresses constants */
212 #define SCSI_DMA64_MINIPORT_SUPPORTED 0x01
213 #define SCSI_DMA64_SYSTEM_SUPPORTED 0x80
215 typedef struct _PORT_CONFIGURATION_INFORMATION
{
217 ULONG SystemIoBusNumber
;
218 INTERFACE_TYPE AdapterInterfaceType
;
219 ULONG BusInterruptLevel
;
220 ULONG BusInterruptVector
;
221 KINTERRUPT_MODE InterruptMode
;
222 ULONG MaximumTransferLength
;
223 ULONG NumberOfPhysicalBreaks
;
229 ULONG NumberOfAccessRanges
;
230 ACCESS_RANGE (*AccessRanges
)[];
233 UCHAR InitiatorBusId
[8];
234 BOOLEAN ScatterGather
;
237 BOOLEAN AdapterScansDown
;
238 BOOLEAN AtdiskPrimaryClaimed
;
239 BOOLEAN AtdiskSecondaryClaimed
;
240 BOOLEAN Dma32BitAddresses
;
243 BOOLEAN NeedPhysicalAddresses
;
244 BOOLEAN TaggedQueuing
;
245 BOOLEAN AutoRequestSense
;
246 BOOLEAN MultipleRequestPerLu
;
247 BOOLEAN ReceiveEvent
;
248 BOOLEAN RealModeInitialized
;
249 BOOLEAN BufferAccessScsiPortControlled
;
250 UCHAR MaximumNumberOfTargets
;
251 UCHAR ReservedUchars
[2];
253 ULONG BusInterruptLevel2
;
254 ULONG BusInterruptVector2
;
255 KINTERRUPT_MODE InterruptMode2
;
260 ULONG DeviceExtensionSize
;
261 ULONG SpecificLuExtensionSize
;
262 ULONG SrbExtensionSize
;
263 UCHAR Dma64BitAddresses
;
264 BOOLEAN ResetTargetSupported
;
265 UCHAR MaximumNumberOfLogicalUnits
;
266 BOOLEAN WmiDataProvider
;
267 } PORT_CONFIGURATION_INFORMATION
, *PPORT_CONFIGURATION_INFORMATION
;
269 #define CONFIG_INFO_VERSION_2 sizeof(PORT_CONFIGURATION_INFORMATION)
271 typedef enum _SCSI_NOTIFICATION_TYPE
{
276 CallDisableInterrupts
,
277 CallEnableInterrupts
,
282 } SCSI_NOTIFICATION_TYPE
, *PSCSI_NOTIFICATION_TYPE
;
285 __extension__
/* enums limited to range of integer */
287 typedef enum _SCSI_ADAPTER_CONTROL_TYPE
{
288 ScsiQuerySupportedControlTypes
= 0,
292 ScsiSetRunningConfig
,
293 ScsiAdapterControlMax
,
294 MakeAdapterControlTypeSizeOfUlong
= 0xffffffff
295 } SCSI_ADAPTER_CONTROL_TYPE
, *PSCSI_ADAPTER_CONTROL_TYPE
;
297 typedef enum _SCSI_ADAPTER_CONTROL_STATUS
{
298 ScsiAdapterControlSuccess
= 0,
299 ScsiAdapterControlUnsuccessful
300 } SCSI_ADAPTER_CONTROL_STATUS
, *PSCSI_ADAPTER_CONTROL_STATUS
;
302 typedef struct _SCSI_SUPPORTED_CONTROL_TYPE_LIST
{
303 ULONG MaxControlType
;
304 BOOLEAN SupportedTypeList
[0];
305 } SCSI_SUPPORTED_CONTROL_TYPE_LIST
, *PSCSI_SUPPORTED_CONTROL_TYPE_LIST
;
307 typedef SCSI_ADAPTER_CONTROL_STATUS DDKAPI
308 (*PHW_ADAPTER_CONTROL
)(
309 IN PVOID DeviceExtension
,
310 IN SCSI_ADAPTER_CONTROL_TYPE ControlType
,
311 IN PVOID Parameters
);
313 typedef BOOLEAN DDKAPI
314 (*PHW_ADAPTER_STATE
)(
315 IN PVOID DeviceExtension
,
317 IN BOOLEAN SaveState
);
319 #define SP_RETURN_NOT_FOUND 0
320 #define SP_RETURN_FOUND 1
321 #define SP_RETURN_ERROR 2
322 #define SP_RETURN_BAD_CONFIG 3
326 IN PVOID DeviceExtension
,
328 IN PVOID BusInformation
,
329 IN PCHAR ArgumentString
,
330 IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo
,
333 typedef BOOLEAN DDKAPI
335 IN PVOID DeviceExtension
);
337 typedef BOOLEAN DDKAPI
339 IN PVOID DeviceExtension
);
341 typedef BOOLEAN DDKAPI
343 IN PVOID DeviceExtension
,
348 IN PVOID DeviceExtension
);
350 typedef BOOLEAN DDKAPI
352 IN PVOID DeviceExtension
,
353 IN PSCSI_REQUEST_BLOCK Srb
);
357 IN PVOID DeviceExtension
);
359 typedef struct _HW_INITIALIZATION_DATA
{
360 ULONG HwInitializationDataSize
;
361 INTERFACE_TYPE AdapterInterfaceType
;
362 PHW_INITIALIZE HwInitialize
;
363 PHW_STARTIO HwStartIo
;
364 PHW_INTERRUPT HwInterrupt
;
365 PHW_FIND_ADAPTER HwFindAdapter
;
366 PHW_RESET_BUS HwResetBus
;
367 PHW_DMA_STARTED HwDmaStarted
;
368 PHW_ADAPTER_STATE HwAdapterState
;
369 ULONG DeviceExtensionSize
;
370 ULONG SpecificLuExtensionSize
;
371 ULONG SrbExtensionSize
;
372 ULONG NumberOfAccessRanges
;
375 BOOLEAN NeedPhysicalAddresses
;
376 BOOLEAN TaggedQueuing
;
377 BOOLEAN AutoRequestSense
;
378 BOOLEAN MultipleRequestPerLu
;
379 BOOLEAN ReceiveEvent
;
380 USHORT VendorIdLength
;
382 USHORT ReservedUshort
;
383 USHORT DeviceIdLength
;
385 PHW_ADAPTER_CONTROL HwAdapterControl
;
386 } HW_INITIALIZATION_DATA
, *PHW_INITIALIZATION_DATA
;
391 ScsiPortCompleteRequest(
392 IN PVOID HwDeviceExtension
,
400 * ScsiPortConvertPhysicalAddressToUlong(
401 * IN SCSI_PHYSICAL_ADDRESS Address);
403 #define ScsiPortConvertPhysicalAddressToUlong(Address) ((Address).LowPart)
406 SCSI_PHYSICAL_ADDRESS
408 ScsiPortConvertUlongToPhysicalAddress(
409 IN ULONG UlongAddress
);
415 IN PVOID DeviceExtension
);
420 ScsiPortFreeDeviceBase(
421 IN PVOID HwDeviceExtension
,
422 IN PVOID MappedAddress
);
428 IN PVOID DeviceExtension
,
429 IN ULONG BusDataType
,
430 IN ULONG SystemIoBusNumber
,
438 ScsiPortGetDeviceBase(
439 IN PVOID HwDeviceExtension
,
440 IN INTERFACE_TYPE BusType
,
441 IN ULONG SystemIoBusNumber
,
442 IN SCSI_PHYSICAL_ADDRESS IoAddress
,
443 IN ULONG NumberOfBytes
,
444 IN BOOLEAN InIoSpace
);
449 ScsiPortGetLogicalUnit(
450 IN PVOID HwDeviceExtension
,
456 SCSI_PHYSICAL_ADDRESS
458 ScsiPortGetPhysicalAddress(
459 IN PVOID HwDeviceExtension
,
460 IN PSCSI_REQUEST_BLOCK Srb OPTIONAL
,
461 IN PVOID VirtualAddress
,
468 IN PVOID DeviceExtension
,
477 ScsiPortGetUncachedExtension(
478 IN PVOID HwDeviceExtension
,
479 IN PPORT_CONFIGURATION_INFORMATION ConfigInfo
,
480 IN ULONG NumberOfBytes
);
485 ScsiPortGetVirtualAddress(
486 IN PVOID HwDeviceExtension
,
487 IN SCSI_PHYSICAL_ADDRESS PhysicalAddress
);
495 IN
struct _HW_INITIALIZATION_DATA
*HwInitializationData
,
496 IN PVOID HwContext OPTIONAL
);
501 ScsiPortIoMapTransfer(
502 IN PVOID HwDeviceExtension
,
503 IN PSCSI_REQUEST_BLOCK Srb
,
504 IN PVOID LogicalAddress
,
511 IN PVOID HwDeviceExtension
,
512 IN PSCSI_REQUEST_BLOCK Srb OPTIONAL
,
523 IN PVOID WriteBuffer
,
530 ScsiPortNotification(
531 IN SCSI_NOTIFICATION_TYPE NotificationType
,
532 IN PVOID HwDeviceExtension
,
538 ScsiPortQuerySystemTime(
539 OUT PLARGE_INTEGER CurrentTime
);
544 ScsiPortReadPortBufferUchar(
552 ScsiPortReadPortBufferUlong(
560 ScsiPortReadPortBufferUshort(
568 ScsiPortReadPortUchar(
574 ScsiPortReadPortUlong(
580 ScsiPortReadPortUshort(
586 ScsiPortReadRegisterBufferUchar(
594 ScsiPortReadRegisterBufferUlong(
602 ScsiPortReadRegisterBufferUshort(
610 ScsiPortReadRegisterUchar(
616 ScsiPortReadRegisterUlong(
622 ScsiPortReadRegisterUshort(
623 IN PUSHORT Register
);
628 ScsiPortSetBusDataByOffset(
629 IN PVOID DeviceExtension
,
630 IN ULONG BusDataType
,
631 IN ULONG SystemIoBusNumber
,
640 ScsiPortStallExecution(
646 ScsiPortValidateRange(
647 IN PVOID HwDeviceExtension
,
648 IN INTERFACE_TYPE BusType
,
649 IN ULONG SystemIoBusNumber
,
650 IN SCSI_PHYSICAL_ADDRESS IoAddress
,
651 IN ULONG NumberOfBytes
,
652 IN BOOLEAN InIoSpace
);
657 ScsiPortWritePortBufferUchar(
665 ScsiPortWritePortBufferUlong(
673 ScsiPortWritePortBufferUshort(
681 ScsiPortWritePortUchar(
688 ScsiPortWritePortUlong(
695 ScsiPortWritePortUshort(
702 ScsiPortWriteRegisterBufferUchar(
710 ScsiPortWriteRegisterBufferUlong(
718 ScsiPortWriteRegisterBufferUshort(
726 ScsiPortWriteRegisterUchar(
733 ScsiPortWriteRegisterUlong(
740 ScsiPortWriteRegisterUshort(
748 IN ULONG DebugPrintLevel
,
749 IN PCCHAR DebugMessage
,