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
38 #if defined(_SCSIPORT_)
39 #define SCSIPORTAPI DECLSPEC_EXPORT
41 #define SCSIPORTAPI DECLSPEC_IMPORT
45 #define DebugPrint(x) ScsiDebugPrint x
50 typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS
, *PSCSI_PHYSICAL_ADDRESS
;
52 #define SP_UNINITIALIZED_VALUE ((ULONG) ~0)
53 #define SP_UNTAGGED ((UCHAR) ~0)
55 #define SRB_SIMPLE_TAG_REQUEST 0x20
56 #define SRB_HEAD_OF_QUEUE_TAG_REQUEST 0x21
57 #define SRB_ORDERED_QUEUE_TAG_REQUEST 0x22
59 #define SRB_STATUS_QUEUE_FROZEN 0x40
60 #define SRB_STATUS_AUTOSENSE_VALID 0x80
62 #define SRB_STATUS(Status) \
63 (Status & ~(SRB_STATUS_AUTOSENSE_VALID | SRB_STATUS_QUEUE_FROZEN))
65 #define MAXIMUM_CDB_SIZE 12
68 #define SCSI_PORT_SIGNATURE 0x54524f50
72 #define SCSI_MAXIMUM_LOGICAL_UNITS 8
73 #define SCSI_MAXIMUM_TARGETS_PER_BUS 128
74 #define SCSI_MAXIMUM_LUNS_PER_TARGET 255
75 #define SCSI_MAXIMUM_BUSES 8
76 #define SCSI_MINIMUM_PHYSICAL_BREAKS 16
77 #define SCSI_MAXIMUM_PHYSICAL_BREAKS 255
78 #define SCSI_MAXIMUM_TARGETS 8
80 #define SRB_FUNCTION_WMI 0x17
82 #define SRB_WMI_FLAGS_ADAPTER_REQUEST 0x0001
84 #define SP_BUS_PARITY_ERROR 0x0001
85 #define SP_UNEXPECTED_DISCONNECT 0x0002
86 #define SP_INVALID_RESELECTION 0x0003
87 #define SP_BUS_TIME_OUT 0x0004
88 #define SP_PROTOCOL_ERROR 0x0005
89 #define SP_INTERNAL_ADAPTER_ERROR 0x0006
90 #define SP_REQUEST_TIMEOUT 0x0007
91 #define SP_IRQ_NOT_RESPONDING 0x0008
92 #define SP_BAD_FW_WARNING 0x0009
93 #define SP_BAD_FW_ERROR 0x000a
94 #define SP_LOST_WMI_MINIPORT_REQUEST 0x000b
96 /* SCSI_REQUEST_BLOCK.Function constants */
97 #define SRB_FUNCTION_EXECUTE_SCSI 0x00
98 #define SRB_FUNCTION_CLAIM_DEVICE 0x01
99 #define SRB_FUNCTION_IO_CONTROL 0x02
100 #define SRB_FUNCTION_RECEIVE_EVENT 0x03
101 #define SRB_FUNCTION_RELEASE_QUEUE 0x04
102 #define SRB_FUNCTION_ATTACH_DEVICE 0x05
103 #define SRB_FUNCTION_RELEASE_DEVICE 0x06
104 #define SRB_FUNCTION_SHUTDOWN 0x07
105 #define SRB_FUNCTION_FLUSH 0x08
106 #define SRB_FUNCTION_ABORT_COMMAND 0x10
107 #define SRB_FUNCTION_RELEASE_RECOVERY 0x11
108 #define SRB_FUNCTION_RESET_BUS 0x12
109 #define SRB_FUNCTION_RESET_DEVICE 0x13
110 #define SRB_FUNCTION_TERMINATE_IO 0x14
111 #define SRB_FUNCTION_FLUSH_QUEUE 0x15
112 #define SRB_FUNCTION_REMOVE_DEVICE 0x16
113 #define SRB_FUNCTION_WMI 0x17
114 #define SRB_FUNCTION_LOCK_QUEUE 0x18
115 #define SRB_FUNCTION_UNLOCK_QUEUE 0x19
116 #define SRB_FUNCTION_RESET_LOGICAL_UNIT 0x20
118 /* SCSI_REQUEST_BLOCK.SrbStatus constants */
119 #define SRB_STATUS_PENDING 0x00
120 #define SRB_STATUS_SUCCESS 0x01
121 #define SRB_STATUS_ABORTED 0x02
122 #define SRB_STATUS_ABORT_FAILED 0x03
123 #define SRB_STATUS_ERROR 0x04
124 #define SRB_STATUS_BUSY 0x05
125 #define SRB_STATUS_INVALID_REQUEST 0x06
126 #define SRB_STATUS_INVALID_PATH_ID 0x07
127 #define SRB_STATUS_NO_DEVICE 0x08
128 #define SRB_STATUS_TIMEOUT 0x09
129 #define SRB_STATUS_SELECTION_TIMEOUT 0x0A
130 #define SRB_STATUS_COMMAND_TIMEOUT 0x0B
131 #define SRB_STATUS_MESSAGE_REJECTED 0x0D
132 #define SRB_STATUS_BUS_RESET 0x0E
133 #define SRB_STATUS_PARITY_ERROR 0x0F
134 #define SRB_STATUS_REQUEST_SENSE_FAILED 0x10
135 #define SRB_STATUS_NO_HBA 0x11
136 #define SRB_STATUS_DATA_OVERRUN 0x12
137 #define SRB_STATUS_UNEXPECTED_BUS_FREE 0x13
138 #define SRB_STATUS_PHASE_SEQUENCE_FAILURE 0x14
139 #define SRB_STATUS_BAD_SRB_BLOCK_LENGTH 0x15
140 #define SRB_STATUS_REQUEST_FLUSHED 0x16
141 #define SRB_STATUS_INVALID_LUN 0x20
142 #define SRB_STATUS_INVALID_TARGET_ID 0x21
143 #define SRB_STATUS_BAD_FUNCTION 0x22
144 #define SRB_STATUS_ERROR_RECOVERY 0x23
145 #define SRB_STATUS_NOT_POWERED 0x24
146 #define SRB_STATUS_INTERNAL_ERROR 0x30
148 /* SCSI_REQUEST_BLOCK.SrbFlags constants */
149 #define SRB_FLAGS_QUEUE_ACTION_ENABLE 0x00000002
150 #define SRB_FLAGS_DISABLE_DISCONNECT 0x00000004
151 #define SRB_FLAGS_DISABLE_SYNCH_TRANSFER 0x00000008
152 #define SRB_FLAGS_BYPASS_FROZEN_QUEUE 0x00000010
153 #define SRB_FLAGS_DISABLE_AUTOSENSE 0x00000020
154 #define SRB_FLAGS_DATA_IN 0x00000040
155 #define SRB_FLAGS_DATA_OUT 0x00000080
156 #define SRB_FLAGS_NO_DATA_TRANSFER 0x00000000
157 #define SRB_FLAGS_UNSPECIFIED_DIRECTION (SRB_FLAGS_DATA_IN | SRB_FLAGS_DATA_OUT)
158 #define SRB_FLAGS_NO_QUEUE_FREEZE 0x00000100
159 #define SRB_FLAGS_ADAPTER_CACHE_ENABLE 0x00000200
160 #define SRB_FLAGS_FREE_SENSE_BUFFER 0x00000400
161 #define SRB_FLAGS_IS_ACTIVE 0x00010000
162 #define SRB_FLAGS_ALLOCATED_FROM_ZONE 0x00020000
163 #define SRB_FLAGS_SGLIST_FROM_POOL 0x00040000
164 #define SRB_FLAGS_BYPASS_LOCKED_QUEUE 0x00080000
165 #define SRB_FLAGS_NO_KEEP_AWAKE 0x00100000
166 #define SRB_FLAGS_PORT_DRIVER_ALLOCSENSE 0x00200000
167 #define SRB_FLAGS_PORT_DRIVER_SENSEHASPORT 0x00400000
168 #define SRB_FLAGS_DONT_START_NEXT_PACKET 0x00800000
169 #define SRB_FLAGS_PORT_DRIVER_RESERVED 0x0F000000
170 #define SRB_FLAGS_CLASS_DRIVER_RESERVED 0xF0000000
172 typedef struct _SCSI_REQUEST_BLOCK
{
183 UCHAR SenseInfoBufferLength
;
185 ULONG DataTransferLength
;
188 PVOID SenseInfoBuffer
;
189 struct _SCSI_REQUEST_BLOCK
*NextSrb
;
190 PVOID OriginalRequest
;
192 _ANONYMOUS_UNION
union {
193 ULONG InternalStatus
;
200 } SCSI_REQUEST_BLOCK
, *PSCSI_REQUEST_BLOCK
;
202 #define SCSI_REQUEST_BLOCK_SIZE sizeof(SCSI_REQUEST_BLOCK)
204 typedef struct _ACCESS_RANGE
{
205 SCSI_PHYSICAL_ADDRESS RangeStart
;
207 BOOLEAN RangeInMemory
;
208 } ACCESS_RANGE
, *PACCESS_RANGE
;
210 /* PORT_CONFIGURATION_INFORMATION.Dma64BitAddresses constants */
211 #define SCSI_DMA64_MINIPORT_SUPPORTED 0x01
212 #define SCSI_DMA64_SYSTEM_SUPPORTED 0x80
214 typedef struct _PORT_CONFIGURATION_INFORMATION
{
216 ULONG SystemIoBusNumber
;
217 INTERFACE_TYPE AdapterInterfaceType
;
218 ULONG BusInterruptLevel
;
219 ULONG BusInterruptVector
;
220 KINTERRUPT_MODE InterruptMode
;
221 ULONG MaximumTransferLength
;
222 ULONG NumberOfPhysicalBreaks
;
228 ULONG NumberOfAccessRanges
;
229 ACCESS_RANGE (*AccessRanges
)[];
232 UCHAR InitiatorBusId
[8];
233 BOOLEAN ScatterGather
;
236 BOOLEAN AdapterScansDown
;
237 BOOLEAN AtdiskPrimaryClaimed
;
238 BOOLEAN AtdiskSecondaryClaimed
;
239 BOOLEAN Dma32BitAddresses
;
242 BOOLEAN NeedPhysicalAddresses
;
243 BOOLEAN TaggedQueueing
;
244 BOOLEAN AutoRequestSense
;
245 BOOLEAN MultipleRequestPerLu
;
246 BOOLEAN ReceiveEvent
;
247 BOOLEAN RealModeInitialized
;
248 BOOLEAN BufferAccessScsiPortControlled
;
249 UCHAR MaximumNumberOfTargets
;
250 UCHAR ReservedUchars
[2];
252 ULONG BusInterruptLevel2
;
253 ULONG BusInterruptVector2
;
254 KINTERRUPT_MODE InterruptMode2
;
259 ULONG DeviceExtensionSize
;
260 ULONG SpecificLuExtensionSize
;
261 ULONG SrbExtensionSize
;
262 UCHAR Dma64BitAddresses
;
263 BOOLEAN ResetTargetSupported
;
264 UCHAR MaximumNumberOfLogicalUnits
;
265 BOOLEAN WmiDataProvider
;
266 } PORT_CONFIGURATION_INFORMATION
, *PPORT_CONFIGURATION_INFORMATION
;
268 #define CONFIG_INFO_VERSION_2 sizeof(PORT_CONFIGURATION_INFORMATION)
270 typedef enum _SCSI_NOTIFICATION_TYPE
{
275 CallDisableInterrupts
,
276 CallEnableInterrupts
,
281 } SCSI_NOTIFICATION_TYPE
, *PSCSI_NOTIFICATION_TYPE
;
284 __extension__
/* enums limited to range of integer */
286 typedef enum _SCSI_ADAPTER_CONTROL_TYPE
{
287 ScsiQuerySupportedControlTypes
= 0,
291 ScsiSetRunningConfig
,
292 ScsiAdapterControlMax
,
293 MakeAdapterControlTypeSizeOfUlong
= 0xffffffff
294 } SCSI_ADAPTER_CONTROL_TYPE
, *PSCSI_ADAPTER_CONTROL_TYPE
;
296 typedef enum _SCSI_ADAPTER_CONTROL_STATUS
{
297 ScsiAdapterControlSuccess
= 0,
298 ScsiAdapterControlUnsuccessful
299 } SCSI_ADAPTER_CONTROL_STATUS
, *PSCSI_ADAPTER_CONTROL_STATUS
;
301 typedef struct _SCSI_SUPPORTED_CONTROL_TYPE_LIST
{
302 ULONG MaxControlType
;
303 BOOLEAN SupportedTypeList
[0];
304 } SCSI_SUPPORTED_CONTROL_TYPE_LIST
, *PSCSI_SUPPORTED_CONTROL_TYPE_LIST
;
306 typedef SCSI_ADAPTER_CONTROL_STATUS DDKAPI
307 (*PHW_ADAPTER_CONTROL
)(
308 IN PVOID DeviceExtension
,
309 IN SCSI_ADAPTER_CONTROL_TYPE ControlType
,
310 IN PVOID Parameters
);
312 typedef BOOLEAN DDKAPI
313 (*PHW_ADAPTER_STATE
)(
314 IN PVOID DeviceExtension
,
316 IN BOOLEAN SaveState
);
318 #define SP_RETURN_NOT_FOUND 0
319 #define SP_RETURN_FOUND 1
320 #define SP_RETURN_ERROR 2
321 #define SP_RETURN_BAD_CONFIG 3
325 IN PVOID DeviceExtension
,
327 IN PVOID BusInformation
,
328 IN PCHAR ArgumentString
,
329 IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo
,
332 typedef BOOLEAN DDKAPI
334 IN PVOID DeviceExtension
);
336 typedef BOOLEAN DDKAPI
338 IN PVOID DeviceExtension
);
340 typedef BOOLEAN DDKAPI
342 IN PVOID DeviceExtension
,
347 IN PVOID DeviceExtension
);
349 typedef BOOLEAN DDKAPI
351 IN PVOID DeviceExtension
,
352 IN PSCSI_REQUEST_BLOCK Srb
);
356 IN PVOID DeviceExtension
);
358 typedef struct _HW_INITIALIZATION_DATA
{
359 ULONG HwInitializationDataSize
;
360 INTERFACE_TYPE AdapterInterfaceType
;
361 PHW_INITIALIZE HwInitialize
;
362 PHW_STARTIO HwStartIo
;
363 PHW_INTERRUPT HwInterrupt
;
364 PHW_FIND_ADAPTER HwFindAdapter
;
365 PHW_RESET_BUS HwResetBus
;
366 PHW_DMA_STARTED HwDmaStarted
;
367 PHW_ADAPTER_STATE HwAdapterState
;
368 ULONG DeviceExtensionSize
;
369 ULONG SpecificLuExtensionSize
;
370 ULONG SrbExtensionSize
;
371 ULONG NumberOfAccessRanges
;
374 BOOLEAN NeedPhysicalAddresses
;
375 BOOLEAN TaggedQueueing
;
376 BOOLEAN AutoRequestSense
;
377 BOOLEAN MultipleRequestPerLu
;
378 BOOLEAN ReceiveEvent
;
379 USHORT VendorIdLength
;
381 USHORT ReservedUshort
;
382 USHORT DeviceIdLength
;
384 PHW_ADAPTER_CONTROL HwAdapterControl
;
385 } HW_INITIALIZATION_DATA
, *PHW_INITIALIZATION_DATA
;
390 ScsiPortCompleteRequest(
391 IN PVOID HwDeviceExtension
,
399 * ScsiPortConvertPhysicalAddressToUlong(
400 * IN SCSI_PHYSICAL_ADDRESS Address);
402 #define ScsiPortConvertPhysicalAddressToUlong(Address) ((Address).LowPart)
405 SCSI_PHYSICAL_ADDRESS
407 ScsiPortConvertUlongToPhysicalAddress(
408 IN ULONG UlongAddress
);
414 IN PVOID DeviceExtension
);
419 ScsiPortFreeDeviceBase(
420 IN PVOID HwDeviceExtension
,
421 IN PVOID MappedAddress
);
427 IN PVOID DeviceExtension
,
428 IN ULONG BusDataType
,
429 IN ULONG SystemIoBusNumber
,
437 ScsiPortGetDeviceBase(
438 IN PVOID HwDeviceExtension
,
439 IN INTERFACE_TYPE BusType
,
440 IN ULONG SystemIoBusNumber
,
441 IN SCSI_PHYSICAL_ADDRESS IoAddress
,
442 IN ULONG NumberOfBytes
,
443 IN BOOLEAN InIoSpace
);
448 ScsiPortGetLogicalUnit(
449 IN PVOID HwDeviceExtension
,
455 SCSI_PHYSICAL_ADDRESS
457 ScsiPortGetPhysicalAddress(
458 IN PVOID HwDeviceExtension
,
459 IN PSCSI_REQUEST_BLOCK Srb OPTIONAL
,
460 IN PVOID VirtualAddress
,
467 IN PVOID DeviceExtension
,
476 ScsiPortGetUncachedExtension(
477 IN PVOID HwDeviceExtension
,
478 IN PPORT_CONFIGURATION_INFORMATION ConfigInfo
,
479 IN ULONG NumberOfBytes
);
484 ScsiPortGetVirtualAddress(
485 IN PVOID HwDeviceExtension
,
486 IN SCSI_PHYSICAL_ADDRESS PhysicalAddress
);
494 IN
struct _HW_INITIALIZATION_DATA
*HwInitializationData
,
495 IN PVOID HwContext OPTIONAL
);
500 ScsiPortIoMapTransfer(
501 IN PVOID HwDeviceExtension
,
502 IN PSCSI_REQUEST_BLOCK Srb
,
503 IN ULONG LogicalAddress
,
510 IN PVOID HwDeviceExtension
,
511 IN PSCSI_REQUEST_BLOCK Srb OPTIONAL
,
522 IN PVOID WriteBuffer
,
529 ScsiPortNotification(
530 IN SCSI_NOTIFICATION_TYPE NotificationType
,
531 IN PVOID HwDeviceExtension
,
537 ScsiPortQuerySystemTime(
538 OUT PLARGE_INTEGER CurrentTime
);
543 ScsiPortReadPortBufferUchar(
551 ScsiPortReadPortBufferUlong(
559 ScsiPortReadPortBufferUshort(
567 ScsiPortReadPortUchar(
573 ScsiPortReadPortUlong(
579 ScsiPortReadPortUshort(
585 ScsiPortReadRegisterBufferUchar(
593 ScsiPortReadRegisterBufferUlong(
601 ScsiPortReadRegisterBufferUshort(
609 ScsiPortReadRegisterUchar(
615 ScsiPortReadRegisterUlong(
621 ScsiPortReadRegisterUshort(
622 IN PUSHORT Register
);
627 ScsiPortSetBusDataByOffset(
628 IN PVOID DeviceExtension
,
629 IN ULONG BusDataType
,
630 IN ULONG SystemIoBusNumber
,
639 ScsiPortStallExecution(
645 ScsiPortValidateRange(
646 IN PVOID HwDeviceExtension
,
647 IN INTERFACE_TYPE BusType
,
648 IN ULONG SystemIoBusNumber
,
649 IN SCSI_PHYSICAL_ADDRESS IoAddress
,
650 IN ULONG NumberOfBytes
,
651 IN BOOLEAN InIoSpace
);
656 ScsiPortWritePortBufferUchar(
664 ScsiPortWritePortBufferUlong(
672 ScsiPortWritePortBufferUshort(
680 ScsiPortWritePortUchar(
687 ScsiPortWritePortUlong(
694 ScsiPortWritePortUshort(
701 ScsiPortWriteRegisterBufferUchar(
709 ScsiPortWriteRegisterBufferUlong(
717 ScsiPortWriteRegisterBufferUshort(
725 ScsiPortWriteRegisterUchar(
732 ScsiPortWriteRegisterUlong(
739 ScsiPortWriteRegisterUshort(
747 IN ULONG DebugPrintLevel
,
748 IN PCCHAR DebugMessage
,