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 typedef struct _SCSI_REQUEST_BLOCK
{
179 UCHAR SenseInfoBufferLength
;
181 ULONG DataTransferLength
;
184 PVOID SenseInfoBuffer
;
185 struct _SCSI_REQUEST_BLOCK
*NextSrb
;
186 PVOID OriginalRequest
;
188 _ANONYMOUS_UNION
union {
189 ULONG InternalStatus
;
196 } SCSI_REQUEST_BLOCK
, *PSCSI_REQUEST_BLOCK
;
198 #define SCSI_REQUEST_BLOCK_SIZE sizeof(SCSI_REQUEST_BLOCK)
200 typedef struct _ACCESS_RANGE
{
201 SCSI_PHYSICAL_ADDRESS RangeStart
;
203 BOOLEAN RangeInMemory
;
204 } ACCESS_RANGE
, *PACCESS_RANGE
;
206 /* PORT_CONFIGURATION_INFORMATION.Dma64BitAddresses constants */
207 #define SCSI_DMA64_MINIPORT_SUPPORTED 0x01
208 #define SCSI_DMA64_SYSTEM_SUPPORTED 0x80
210 typedef struct _PORT_CONFIGURATION_INFORMATION
{
212 ULONG SystemIoBusNumber
;
213 INTERFACE_TYPE AdapterInterfaceType
;
214 ULONG BusInterruptLevel
;
215 ULONG BusInterruptVector
;
216 KINTERRUPT_MODE InterruptMode
;
217 ULONG MaximumTransferLength
;
218 ULONG NumberOfPhysicalBreaks
;
224 ULONG NumberOfAccessRanges
;
225 ACCESS_RANGE (*AccessRanges
)[];
228 UCHAR InitiatorBusId
[8];
229 BOOLEAN ScatterGather
;
232 BOOLEAN AdapterScansDown
;
233 BOOLEAN AtdiskPrimaryClaimed
;
234 BOOLEAN AtdiskSecondaryClaimed
;
235 BOOLEAN Dma32BitAddresses
;
238 BOOLEAN NeedPhysicalAddresses
;
239 BOOLEAN TaggedQueuing
;
240 BOOLEAN AutoRequestSense
;
241 BOOLEAN MultipleRequestPerLu
;
242 BOOLEAN ReceiveEvent
;
243 BOOLEAN RealModeInitialized
;
244 BOOLEAN BufferAccessScsiPortControlled
;
245 UCHAR MaximumNumberOfTargets
;
246 UCHAR ReservedUchars
[2];
248 ULONG BusInterruptLevel2
;
249 ULONG BusInterruptVector2
;
250 KINTERRUPT_MODE InterruptMode2
;
255 ULONG DeviceExtensionSize
;
256 ULONG SpecificLuExtensionSize
;
257 ULONG SrbExtensionSize
;
258 UCHAR Dma64BitAddresses
;
259 BOOLEAN ResetTargetSupported
;
260 UCHAR MaximumNumberOfLogicalUnits
;
261 BOOLEAN WmiDataProvider
;
262 } PORT_CONFIGURATION_INFORMATION
, *PPORT_CONFIGURATION_INFORMATION
;
264 #define CONFIG_INFO_VERSION_2 sizeof(PORT_CONFIGURATION_INFORMATION)
266 typedef enum _SCSI_NOTIFICATION_TYPE
{
271 CallDisableInterrupts
,
272 CallEnableInterrupts
,
277 } SCSI_NOTIFICATION_TYPE
, *PSCSI_NOTIFICATION_TYPE
;
280 __extension__
/* enums limited to range of integer */
282 typedef enum _SCSI_ADAPTER_CONTROL_TYPE
{
283 ScsiQuerySupportedControlTypes
= 0,
287 ScsiSetRunningConfig
,
288 ScsiAdapterControlMax
,
289 MakeAdapterControlTypeSizeOfUlong
= 0xffffffff
290 } SCSI_ADAPTER_CONTROL_TYPE
, *PSCSI_ADAPTER_CONTROL_TYPE
;
292 typedef enum _SCSI_ADAPTER_CONTROL_STATUS
{
293 ScsiAdapterControlSuccess
= 0,
294 ScsiAdapterControlUnsuccessful
295 } SCSI_ADAPTER_CONTROL_STATUS
, *PSCSI_ADAPTER_CONTROL_STATUS
;
297 typedef struct _SCSI_SUPPORTED_CONTROL_TYPE_LIST
{
298 ULONG MaxControlType
;
299 BOOLEAN SupportedTypeList
[0];
300 } SCSI_SUPPORTED_CONTROL_TYPE_LIST
, *PSCSI_SUPPORTED_CONTROL_TYPE_LIST
;
302 typedef SCSI_ADAPTER_CONTROL_STATUS DDKAPI
303 (*PHW_ADAPTER_CONTROL
)(
304 IN PVOID DeviceExtension
,
305 IN SCSI_ADAPTER_CONTROL_TYPE ControlType
,
306 IN PVOID Parameters
);
308 typedef BOOLEAN DDKAPI
309 (*PHW_ADAPTER_STATE
)(
310 IN PVOID DeviceExtension
,
312 IN BOOLEAN SaveState
);
314 #define SP_RETURN_NOT_FOUND 0
315 #define SP_RETURN_FOUND 1
316 #define SP_RETURN_ERROR 2
317 #define SP_RETURN_BAD_CONFIG 3
321 IN PVOID DeviceExtension
,
323 IN PVOID BusInformation
,
324 IN PCHAR ArgumentString
,
325 IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo
,
328 typedef BOOLEAN DDKAPI
330 IN PVOID DeviceExtension
);
332 typedef BOOLEAN DDKAPI
334 IN PVOID DeviceExtension
);
336 typedef BOOLEAN DDKAPI
338 IN PVOID DeviceExtension
,
343 IN PVOID DeviceExtension
);
345 typedef BOOLEAN DDKAPI
347 IN PVOID DeviceExtension
,
348 IN PSCSI_REQUEST_BLOCK Srb
);
352 IN PVOID DeviceExtension
);
354 typedef struct _HW_INITIALIZATION_DATA
{
355 ULONG HwInitializationDataSize
;
356 INTERFACE_TYPE AdapterInterfaceType
;
357 PHW_INITIALIZE HwInitialize
;
358 PHW_STARTIO HwStartIo
;
359 PHW_INTERRUPT HwInterrupt
;
360 PHW_FIND_ADAPTER HwFindAdapter
;
361 PHW_RESET_BUS HwResetBus
;
362 PHW_DMA_STARTED HwDmaStarted
;
363 PHW_ADAPTER_STATE HwAdapterState
;
364 ULONG DeviceExtensionSize
;
365 ULONG SpecificLuExtensionSize
;
366 ULONG SrbExtensionSize
;
367 ULONG NumberOfAccessRanges
;
370 BOOLEAN NeedPhysicalAddresses
;
371 BOOLEAN TaggedQueuing
;
372 BOOLEAN AutoRequestSense
;
373 BOOLEAN MultipleRequestPerLu
;
374 BOOLEAN ReceiveEvent
;
375 USHORT VendorIdLength
;
377 USHORT ReservedUshort
;
378 USHORT DeviceIdLength
;
380 PHW_ADAPTER_CONTROL HwAdapterControl
;
381 } HW_INITIALIZATION_DATA
, *PHW_INITIALIZATION_DATA
;
386 ScsiPortCompleteRequest(
387 IN PVOID HwDeviceExtension
,
395 * ScsiPortConvertPhysicalAddressToUlong(
396 * IN SCSI_PHYSICAL_ADDRESS Address);
398 #define ScsiPortConvertPhysicalAddressToUlong(Address) ((Address).LowPart)
401 SCSI_PHYSICAL_ADDRESS
403 ScsiPortConvertUlongToPhysicalAddress(
404 IN ULONG UlongAddress
);
410 IN PVOID DeviceExtension
);
415 ScsiPortFreeDeviceBase(
416 IN PVOID HwDeviceExtension
,
417 IN PVOID MappedAddress
);
423 IN PVOID DeviceExtension
,
424 IN ULONG BusDataType
,
425 IN ULONG SystemIoBusNumber
,
433 ScsiPortGetDeviceBase(
434 IN PVOID HwDeviceExtension
,
435 IN INTERFACE_TYPE BusType
,
436 IN ULONG SystemIoBusNumber
,
437 IN SCSI_PHYSICAL_ADDRESS IoAddress
,
438 IN ULONG NumberOfBytes
,
439 IN BOOLEAN InIoSpace
);
444 ScsiPortGetLogicalUnit(
445 IN PVOID HwDeviceExtension
,
451 SCSI_PHYSICAL_ADDRESS
453 ScsiPortGetPhysicalAddress(
454 IN PVOID HwDeviceExtension
,
455 IN PSCSI_REQUEST_BLOCK Srb OPTIONAL
,
456 IN PVOID VirtualAddress
,
463 IN PVOID DeviceExtension
,
472 ScsiPortGetUncachedExtension(
473 IN PVOID HwDeviceExtension
,
474 IN PPORT_CONFIGURATION_INFORMATION ConfigInfo
,
475 IN ULONG NumberOfBytes
);
480 ScsiPortGetVirtualAddress(
481 IN PVOID HwDeviceExtension
,
482 IN SCSI_PHYSICAL_ADDRESS PhysicalAddress
);
490 IN
struct _HW_INITIALIZATION_DATA
*HwInitializationData
,
491 IN PVOID HwContext OPTIONAL
);
496 ScsiPortIoMapTransfer(
497 IN PVOID HwDeviceExtension
,
498 IN PSCSI_REQUEST_BLOCK Srb
,
499 IN ULONG LogicalAddress
,
506 IN PVOID HwDeviceExtension
,
507 IN PSCSI_REQUEST_BLOCK Srb OPTIONAL
,
518 IN PVOID WriteBuffer
,
525 ScsiPortNotification(
526 IN SCSI_NOTIFICATION_TYPE NotificationType
,
527 IN PVOID HwDeviceExtension
,
533 ScsiPortQuerySystemTime(
534 OUT PLARGE_INTEGER CurrentTime
);
539 ScsiPortReadPortBufferUchar(
547 ScsiPortReadPortBufferUlong(
555 ScsiPortReadPortBufferUshort(
563 ScsiPortReadPortUchar(
569 ScsiPortReadPortUlong(
575 ScsiPortReadPortUshort(
581 ScsiPortReadRegisterBufferUchar(
589 ScsiPortReadRegisterBufferUlong(
597 ScsiPortReadRegisterBufferUshort(
605 ScsiPortReadRegisterUchar(
611 ScsiPortReadRegisterUlong(
617 ScsiPortReadRegisterUshort(
618 IN PUSHORT Register
);
623 ScsiPortSetBusDataByOffset(
624 IN PVOID DeviceExtension
,
625 IN ULONG BusDataType
,
626 IN ULONG SystemIoBusNumber
,
635 ScsiPortStallExecution(
641 ScsiPortValidateRange(
642 IN PVOID HwDeviceExtension
,
643 IN INTERFACE_TYPE BusType
,
644 IN ULONG SystemIoBusNumber
,
645 IN SCSI_PHYSICAL_ADDRESS IoAddress
,
646 IN ULONG NumberOfBytes
,
647 IN BOOLEAN InIoSpace
);
652 ScsiPortWritePortBufferUchar(
660 ScsiPortWritePortBufferUlong(
668 ScsiPortWritePortBufferUshort(
676 ScsiPortWritePortUchar(
683 ScsiPortWritePortUlong(
690 ScsiPortWritePortUshort(
697 ScsiPortWriteRegisterBufferUchar(
705 ScsiPortWriteRegisterBufferUlong(
713 ScsiPortWriteRegisterBufferUshort(
721 ScsiPortWriteRegisterUchar(
728 ScsiPortWriteRegisterUlong(
735 ScsiPortWriteRegisterUshort(
743 IN ULONG DebugPrintLevel
,
744 IN PCCHAR DebugMessage
,