-/* $Id$
+/*
+ * scsi.h
+ *
+ * Interface between SCSI miniport drivers and the SCSI port driver.
+ *
+ * This file is part of the w32api package.
+ *
+ * Contributors:
+ * Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: services/storage/include/srb.c
- * PURPOSE: SCSI port driver definitions
- * PROGRAMMER: Eric Kohl (ekohl@rz-online.de)
*/
-#ifndef __STORAGE_INCLUDE_SRB_H
-#define __STORAGE_INCLUDE_SRB_H
-
-#if __GNUC__ >=3
-#pragma GCC system_header
-#endif
+#ifndef __SRB_H
+#define __SRB_H
#ifdef __cplusplus
extern "C" {
#endif
-#pragma pack(push,4)
-
-#include "ntddk.h"
-
#if defined(_SCSIPORT_)
- #define SCSIPORTAPI
+ #define SCSIPORTAPI
#else
- #define SCSIPORTAPI
+ #define SCSIPORTAPI DECLSPEC_IMPORT
#endif
-#define DDKAPI STDCALL
-
-/* Obsolete. For backward compatibility only. */
+#if DBG
+#define DebugPrint(x) ScsiDebugPrint x
+#else
+#define DebugPrint(x)
+#endif
typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS, *PSCSI_PHYSICAL_ADDRESS;
-#define SP_UNINITIALIZED_VALUE ((ULONG) ~0)
-#define SP_UNTAGGED ((ULONG) ~0)
-
-#define SRB_SIMPLE_TAG_REQUEST 0x20
-#define SRB_HEAD_OF_QUEUE_TAG_REQUEST 0x21
-#define SRB_ORDERED_QUEUE_TAG_REQUEST 0x22
+#define SP_UNINITIALIZED_VALUE ((ULONG) ~0)
+#define SP_UNTAGGED ((UCHAR) ~0)
-/* SRB Status Masks */
+#define SRB_SIMPLE_TAG_REQUEST 0x20
+#define SRB_HEAD_OF_QUEUE_TAG_REQUEST 0x21
+#define SRB_ORDERED_QUEUE_TAG_REQUEST 0x22
-#define SRB_STATUS_QUEUE_FROZEN 0x40
-#define SRB_STATUS_AUTOSENSE_VALID 0x80
+#define SRB_STATUS_QUEUE_FROZEN 0x40
+#define SRB_STATUS_AUTOSENSE_VALID 0x80
#define SRB_STATUS(Status) \
(Status & ~(SRB_STATUS_AUTOSENSE_VALID | SRB_STATUS_QUEUE_FROZEN))
-#define MAXIMUM_CDB_SIZE 12
+#define MAXIMUM_CDB_SIZE 12
-/* Define SCSI maximum configuration parameters. */
+#if DBG
+#define SCSI_PORT_SIGNATURE 0x54524f50
+#endif
-#define SCSI_MAXIMUM_LOGICAL_UNITS 8
-#define SCSI_MAXIMUM_TARGETS_PER_BUS 32
-#define SCSI_MAXIMUM_BUSES 8
-#define SCSI_MINIMUM_PHYSICAL_BREAKS 16
-#define SCSI_MAXIMUM_PHYSICAL_BREAKS 255
-#define SCSI_MAXIMUM_TARGETS 8
+#define SCSI_MAXIMUM_LOGICAL_UNITS 8
+#define SCSI_MAXIMUM_TARGETS_PER_BUS 128
+#define SCSI_MAXIMUM_LUNS_PER_TARGET 255
+#define SCSI_MAXIMUM_BUSES 8
+#define SCSI_MINIMUM_PHYSICAL_BREAKS 16
+#define SCSI_MAXIMUM_PHYSICAL_BREAKS 255
+#define SCSI_MAXIMUM_TARGETS 8
+#define SRB_FUNCTION_WMI 0x17
-/* Port driver error codes */
+#define SRB_WMI_FLAGS_ADAPTER_REQUEST 0x0001
-#define SP_BUS_PARITY_ERROR 0x0001
-#define SP_UNEXPECTED_DISCONNECT 0x0002
-#define SP_INVALID_RESELECTION 0x0003
-#define SP_BUS_TIME_OUT 0x0004
-#define SP_PROTOCOL_ERROR 0x0005
-#define SP_INTERNAL_ADAPTER_ERROR 0x0006
-#define SP_REQUEST_TIMEOUT 0x0007
-#define SP_IRQ_NOT_RESPONDING 0x0008
-#define SP_BAD_FW_WARNING 0x0009
-#define SP_BAD_FW_ERROR 0x000a
+#define SP_BUS_PARITY_ERROR 0x0001
+#define SP_UNEXPECTED_DISCONNECT 0x0002
+#define SP_INVALID_RESELECTION 0x0003
+#define SP_BUS_TIME_OUT 0x0004
+#define SP_PROTOCOL_ERROR 0x0005
+#define SP_INTERNAL_ADAPTER_ERROR 0x0006
+#define SP_REQUEST_TIMEOUT 0x0007
+#define SP_IRQ_NOT_RESPONDING 0x0008
+#define SP_BAD_FW_WARNING 0x0009
+#define SP_BAD_FW_ERROR 0x000a
+#define SP_LOST_WMI_MINIPORT_REQUEST 0x000b
/* SCSI_REQUEST_BLOCK.Function constants */
-#define SRB_FUNCTION_EXECUTE_SCSI 0x00
-#define SRB_FUNCTION_CLAIM_DEVICE 0x01
-#define SRB_FUNCTION_IO_CONTROL 0x02
-#define SRB_FUNCTION_RECEIVE_EVENT 0x03
-#define SRB_FUNCTION_RELEASE_QUEUE 0x04
-#define SRB_FUNCTION_ATTACH_DEVICE 0x05
-#define SRB_FUNCTION_RELEASE_DEVICE 0x06
-#define SRB_FUNCTION_SHUTDOWN 0x07
-#define SRB_FUNCTION_FLUSH 0x08
-#define SRB_FUNCTION_ABORT_COMMAND 0x10
-#define SRB_FUNCTION_RELEASE_RECOVERY 0x11
-#define SRB_FUNCTION_RESET_BUS 0x12
-#define SRB_FUNCTION_RESET_DEVICE 0x13
-#define SRB_FUNCTION_TERMINATE_IO 0x14
-#define SRB_FUNCTION_FLUSH_QUEUE 0x15
-#define SRB_FUNCTION_REMOVE_DEVICE 0x16
+#define SRB_FUNCTION_EXECUTE_SCSI 0x00
+#define SRB_FUNCTION_CLAIM_DEVICE 0x01
+#define SRB_FUNCTION_IO_CONTROL 0x02
+#define SRB_FUNCTION_RECEIVE_EVENT 0x03
+#define SRB_FUNCTION_RELEASE_QUEUE 0x04
+#define SRB_FUNCTION_ATTACH_DEVICE 0x05
+#define SRB_FUNCTION_RELEASE_DEVICE 0x06
+#define SRB_FUNCTION_SHUTDOWN 0x07
+#define SRB_FUNCTION_FLUSH 0x08
+#define SRB_FUNCTION_ABORT_COMMAND 0x10
+#define SRB_FUNCTION_RELEASE_RECOVERY 0x11
+#define SRB_FUNCTION_RESET_BUS 0x12
+#define SRB_FUNCTION_RESET_DEVICE 0x13
+#define SRB_FUNCTION_TERMINATE_IO 0x14
+#define SRB_FUNCTION_FLUSH_QUEUE 0x15
+#define SRB_FUNCTION_REMOVE_DEVICE 0x16
+#define SRB_FUNCTION_WMI 0x17
+#define SRB_FUNCTION_LOCK_QUEUE 0x18
+#define SRB_FUNCTION_UNLOCK_QUEUE 0x19
+#define SRB_FUNCTION_RESET_LOGICAL_UNIT 0x20
/* SCSI_REQUEST_BLOCK.SrbStatus constants */
-#define SRB_STATUS_PENDING 0x00
-#define SRB_STATUS_SUCCESS 0x01
-#define SRB_STATUS_ABORTED 0x02
-#define SRB_STATUS_ABORT_FAILED 0x03
-#define SRB_STATUS_ERROR 0x04
-#define SRB_STATUS_BUSY 0x05
-#define SRB_STATUS_INVALID_REQUEST 0x06
-#define SRB_STATUS_INVALID_PATH_ID 0x07
-#define SRB_STATUS_NO_DEVICE 0x08
-#define SRB_STATUS_TIMEOUT 0x09
-#define SRB_STATUS_SELECTION_TIMEOUT 0x0A
-#define SRB_STATUS_COMMAND_TIMEOUT 0x0B
-#define SRB_STATUS_MESSAGE_REJECTED 0x0D
-#define SRB_STATUS_BUS_RESET 0x0E
-#define SRB_STATUS_PARITY_ERROR 0x0F
-#define SRB_STATUS_REQUEST_SENSE_FAILED 0x10
-#define SRB_STATUS_NO_HBA 0x11
-#define SRB_STATUS_DATA_OVERRUN 0x12
-#define SRB_STATUS_UNEXPECTED_BUS_FREE 0x13
-#define SRB_STATUS_PHASE_SEQUENCE_FAILURE 0x14
-#define SRB_STATUS_BAD_SRB_BLOCK_LENGTH 0x15
-#define SRB_STATUS_REQUEST_FLUSHED 0x16
-#define SRB_STATUS_INVALID_LUN 0x20
-#define SRB_STATUS_INVALID_TARGET_ID 0x21
-#define SRB_STATUS_BAD_FUNCTION 0x22
-#define SRB_STATUS_ERROR_RECOVERY 0x23
+#define SRB_STATUS_PENDING 0x00
+#define SRB_STATUS_SUCCESS 0x01
+#define SRB_STATUS_ABORTED 0x02
+#define SRB_STATUS_ABORT_FAILED 0x03
+#define SRB_STATUS_ERROR 0x04
+#define SRB_STATUS_BUSY 0x05
+#define SRB_STATUS_INVALID_REQUEST 0x06
+#define SRB_STATUS_INVALID_PATH_ID 0x07
+#define SRB_STATUS_NO_DEVICE 0x08
+#define SRB_STATUS_TIMEOUT 0x09
+#define SRB_STATUS_SELECTION_TIMEOUT 0x0A
+#define SRB_STATUS_COMMAND_TIMEOUT 0x0B
+#define SRB_STATUS_MESSAGE_REJECTED 0x0D
+#define SRB_STATUS_BUS_RESET 0x0E
+#define SRB_STATUS_PARITY_ERROR 0x0F
+#define SRB_STATUS_REQUEST_SENSE_FAILED 0x10
+#define SRB_STATUS_NO_HBA 0x11
+#define SRB_STATUS_DATA_OVERRUN 0x12
+#define SRB_STATUS_UNEXPECTED_BUS_FREE 0x13
+#define SRB_STATUS_PHASE_SEQUENCE_FAILURE 0x14
+#define SRB_STATUS_BAD_SRB_BLOCK_LENGTH 0x15
+#define SRB_STATUS_REQUEST_FLUSHED 0x16
+#define SRB_STATUS_INVALID_LUN 0x20
+#define SRB_STATUS_INVALID_TARGET_ID 0x21
+#define SRB_STATUS_BAD_FUNCTION 0x22
+#define SRB_STATUS_ERROR_RECOVERY 0x23
+#define SRB_STATUS_NOT_POWERED 0x24
+#define SRB_STATUS_INTERNAL_ERROR 0x30
/* SCSI_REQUEST_BLOCK.SrbFlags constants */
#define SRB_FLAGS_QUEUE_ACTION_ENABLE 0x00000002
#define SRB_FLAGS_DATA_IN 0x00000040
#define SRB_FLAGS_DATA_OUT 0x00000080
#define SRB_FLAGS_NO_DATA_TRANSFER 0x00000000
-#define SRB_FLAGS_UNSPECIFIED_DIRECTION (SRB_FLAGS_DATA_IN | SRB_FLAGS_DATA_OUT)
+#define SRB_FLAGS_UNSPECIFIED_DIRECTION (SRB_FLAGS_DATA_IN | SRB_FLAGS_DATA_OUT)
#define SRB_FLAGS_NO_QUEUE_FREEZE 0x00000100
#define SRB_FLAGS_ADAPTER_CACHE_ENABLE 0x00000200
+#define SRB_FLAGS_FREE_SENSE_BUFFER 0x00000400
#define SRB_FLAGS_IS_ACTIVE 0x00010000
#define SRB_FLAGS_ALLOCATED_FROM_ZONE 0x00020000
#define SRB_FLAGS_SGLIST_FROM_POOL 0x00040000
+#define SRB_FLAGS_BYPASS_LOCKED_QUEUE 0x00080000
+#define SRB_FLAGS_NO_KEEP_AWAKE 0x00100000
+#define SRB_FLAGS_PORT_DRIVER_ALLOCSENSE 0x00200000
+#define SRB_FLAGS_PORT_DRIVER_SENSEHASPORT 0x00400000
+#define SRB_FLAGS_DONT_START_NEXT_PACKET 0x00800000
+#define SRB_FLAGS_PORT_DRIVER_RESERVED 0x0F000000
+#define SRB_FLAGS_CLASS_DRIVER_RESERVED 0xF0000000
+
+/* Asynchronous events */
+#define SRBEV_BUS_RESET 0x0001
+#define SRBEV_SCSI_ASYNC_NOTIFICATION 0x0002
+
typedef struct _SCSI_REQUEST_BLOCK {
- USHORT Length; /* 0x00 */
- UCHAR Function; /* 0x02 */
- UCHAR SrbStatus; /* 0x03 */
- UCHAR ScsiStatus; /* 0x04 */
- UCHAR PathId; /* 0x05 */
- UCHAR TargetId; /* 0x06 */
- UCHAR Lun; /* 0x07 */
- UCHAR QueueTag; /* 0x08 */
- UCHAR QueueAction; /* 0x09 */
- UCHAR CdbLength; /* 0x0A */
- UCHAR SenseInfoBufferLength; /* 0x0B */
- ULONG SrbFlags; /* 0x0C */
- ULONG DataTransferLength; /* 0x10 */
- ULONG TimeOutValue; /* 0x14 */
- PVOID DataBuffer; /* 0x18 */
- PVOID SenseInfoBuffer; /* 0x1C */
- struct _SCSI_REQUEST_BLOCK *NextSrb; /* 0x20 */
- PVOID OriginalRequest; /* 0x24 */
- PVOID SrbExtension; /* 0x28 */
- ULONG QueueSortKey; /* 0x2C */
- UCHAR Cdb[16]; /* 0x30 */
+ USHORT Length;
+ UCHAR Function;
+ UCHAR SrbStatus;
+ UCHAR ScsiStatus;
+ UCHAR PathId;
+ UCHAR TargetId;
+ UCHAR Lun;
+ UCHAR QueueTag;
+ UCHAR QueueAction;
+ UCHAR CdbLength;
+ UCHAR SenseInfoBufferLength;
+ ULONG SrbFlags;
+ ULONG DataTransferLength;
+ ULONG TimeOutValue;
+ PVOID DataBuffer;
+ PVOID SenseInfoBuffer;
+ struct _SCSI_REQUEST_BLOCK *NextSrb;
+ PVOID OriginalRequest;
+ PVOID SrbExtension;
+ _ANONYMOUS_UNION union {
+ ULONG InternalStatus;
+ ULONG QueueSortKey;
+ } DUMMYUNIONNAME;
+#if defined(_WIN64)
+ ULONG Reserved;
+#endif
+ UCHAR Cdb[16];
} SCSI_REQUEST_BLOCK, *PSCSI_REQUEST_BLOCK;
-#define SCSI_REQUEST_BLOCK_SIZE sizeof(SCSI_REQUEST_BLOCK)
+#define SCSI_REQUEST_BLOCK_SIZE sizeof(SCSI_REQUEST_BLOCK)
typedef struct _ACCESS_RANGE {
- SCSI_PHYSICAL_ADDRESS RangeStart;
- ULONG RangeLength;
- BOOLEAN RangeInMemory;
-}ACCESS_RANGE, *PACCESS_RANGE;
+ SCSI_PHYSICAL_ADDRESS RangeStart;
+ ULONG RangeLength;
+ BOOLEAN RangeInMemory;
+} ACCESS_RANGE, *PACCESS_RANGE;
+/* PORT_CONFIGURATION_INFORMATION.Dma64BitAddresses constants */
+#define SCSI_DMA64_MINIPORT_SUPPORTED 0x01
+#define SCSI_DMA64_SYSTEM_SUPPORTED 0x80
typedef struct _PORT_CONFIGURATION_INFORMATION {
- ULONG Length;
- ULONG SystemIoBusNumber;
+ ULONG Length;
+ ULONG SystemIoBusNumber;
INTERFACE_TYPE AdapterInterfaceType;
- ULONG BusInterruptLevel;
- ULONG BusInterruptVector;
- KINTERRUPT_MODE InterruptMode;
- ULONG MaximumTransferLength;
- ULONG NumberOfPhysicalBreaks;
- ULONG DmaChannel;
- ULONG DmaPort;
- DMA_WIDTH DmaWidth;
- DMA_SPEED DmaSpeed;
- ULONG AlignmentMask;
- ULONG NumberOfAccessRanges;
-#ifdef __GNUC__
- ACCESS_RANGE *AccessRanges;
-#else
- ACCESS_RANGE (*AccessRanges)[];
-#endif
- PVOID Reserved;
- UCHAR NumberOfBuses;
- CCHAR InitiatorBusId[8];
- BOOLEAN ScatterGather;
- BOOLEAN Master;
- BOOLEAN CachesData;
- BOOLEAN AdapterScansDown;
- BOOLEAN AtdiskPrimaryClaimed;
- BOOLEAN AtdiskSecondaryClaimed;
- BOOLEAN Dma32BitAddresses;
- BOOLEAN DemandMode;
- BOOLEAN MapBuffers;
- BOOLEAN NeedPhysicalAddresses;
- BOOLEAN TaggedQueuing;
- BOOLEAN AutoRequestSense;
- BOOLEAN MultipleRequestPerLu;
- BOOLEAN ReceiveEvent;
- BOOLEAN RealModeInitialized;
- BOOLEAN BufferAccessScsiPortControlled;
- UCHAR MaximumNumberOfTargets;
- UCHAR ReservedUchars[2];
- ULONG SlotNumber;
- ULONG BusInterruptLevel2;
- ULONG BusInterruptVector2;
- KINTERRUPT_MODE InterruptMode2;
- ULONG DmaChannel2;
- ULONG DmaPort2;
- DMA_WIDTH DmaWidth2;
- DMA_SPEED DmaSpeed2;
- ULONG DeviceExtensionSize;
- ULONG SpecificLuExtensionSize;
- ULONG SrbExtensionSize;
+ ULONG BusInterruptLevel;
+ ULONG BusInterruptVector;
+ KINTERRUPT_MODE InterruptMode;
+ ULONG MaximumTransferLength;
+ ULONG NumberOfPhysicalBreaks;
+ ULONG DmaChannel;
+ ULONG DmaPort;
+ DMA_WIDTH DmaWidth;
+ DMA_SPEED DmaSpeed;
+ ULONG AlignmentMask;
+ ULONG NumberOfAccessRanges;
+ ACCESS_RANGE (*AccessRanges)[];
+ PVOID Reserved;
+ UCHAR NumberOfBuses;
+ UCHAR InitiatorBusId[8];
+ BOOLEAN ScatterGather;
+ BOOLEAN Master;
+ BOOLEAN CachesData;
+ BOOLEAN AdapterScansDown;
+ BOOLEAN AtdiskPrimaryClaimed;
+ BOOLEAN AtdiskSecondaryClaimed;
+ BOOLEAN Dma32BitAddresses;
+ BOOLEAN DemandMode;
+ BOOLEAN MapBuffers;
+ BOOLEAN NeedPhysicalAddresses;
+ BOOLEAN TaggedQueuing;
+ BOOLEAN AutoRequestSense;
+ BOOLEAN MultipleRequestPerLu;
+ BOOLEAN ReceiveEvent;
+ BOOLEAN RealModeInitialized;
+ BOOLEAN BufferAccessScsiPortControlled;
+ UCHAR MaximumNumberOfTargets;
+ UCHAR ReservedUchars[2];
+ ULONG SlotNumber;
+ ULONG BusInterruptLevel2;
+ ULONG BusInterruptVector2;
+ KINTERRUPT_MODE InterruptMode2;
+ ULONG DmaChannel2;
+ ULONG DmaPort2;
+ DMA_WIDTH DmaWidth2;
+ DMA_SPEED DmaSpeed2;
+ ULONG DeviceExtensionSize;
+ ULONG SpecificLuExtensionSize;
+ ULONG SrbExtensionSize;
+ UCHAR Dma64BitAddresses;
+ BOOLEAN ResetTargetSupported;
+ UCHAR MaximumNumberOfLogicalUnits;
+ BOOLEAN WmiDataProvider;
} PORT_CONFIGURATION_INFORMATION, *PPORT_CONFIGURATION_INFORMATION;
-#define CONFIG_INFO_VERSION_2 sizeof(PORT_CONFIGURATION_INFORMATION)
+#define CONFIG_INFO_VERSION_2 sizeof(PORT_CONFIGURATION_INFORMATION)
typedef enum _SCSI_NOTIFICATION_TYPE {
- RequestComplete,
- NextRequest,
- NextLuRequest,
- ResetDetected,
- CallDisableInterrupts,
- CallEnableInterrupts,
- RequestTimerCall
+ RequestComplete,
+ NextRequest,
+ NextLuRequest,
+ ResetDetected,
+ CallDisableInterrupts,
+ CallEnableInterrupts,
+ RequestTimerCall,
+ BusChangeDetected,
+ WMIEvent,
+ WMIReregister
} SCSI_NOTIFICATION_TYPE, *PSCSI_NOTIFICATION_TYPE;
-
-typedef BOOLEAN DDKAPI
-(*PHW_ADAPTER_STATE)(
- IN PVOID DeviceExtension,
- IN PVOID Context,
- IN BOOLEAN SaveState);
-
-/* Return values for SCSI_HW_FIND_ADAPTER. */
-
-#define SP_RETURN_NOT_FOUND 0
-#define SP_RETURN_FOUND 1
-#define SP_RETURN_ERROR 2
-#define SP_RETURN_BAD_CONFIG 3
-
-typedef ULONG DDKAPI
-(*PHW_FIND_ADAPTER)(
- IN PVOID DeviceExtension,
- IN PVOID HwContext,
- IN PVOID BusInformation,
- IN PCHAR ArgumentString,
- IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo,
- OUT PBOOLEAN Again);
-
-typedef BOOLEAN DDKAPI
-(*PHW_INITIALIZE)(
+#ifdef __GNUC__
+__extension__ /* enums limited to range of integer */
+#endif
+typedef enum _SCSI_ADAPTER_CONTROL_TYPE {
+ ScsiQuerySupportedControlTypes = 0,
+ ScsiStopAdapter,
+ ScsiRestartAdapter,
+ ScsiSetBootConfig,
+ ScsiSetRunningConfig,
+ ScsiAdapterControlMax,
+ MakeAdapterControlTypeSizeOfUlong = 0xffffffff
+} SCSI_ADAPTER_CONTROL_TYPE, *PSCSI_ADAPTER_CONTROL_TYPE;
+
+typedef enum _SCSI_ADAPTER_CONTROL_STATUS {
+ ScsiAdapterControlSuccess = 0,
+ ScsiAdapterControlUnsuccessful
+} SCSI_ADAPTER_CONTROL_STATUS, *PSCSI_ADAPTER_CONTROL_STATUS;
+
+typedef struct _SCSI_SUPPORTED_CONTROL_TYPE_LIST {
+ ULONG MaxControlType;
+ BOOLEAN SupportedTypeList[0];
+} SCSI_SUPPORTED_CONTROL_TYPE_LIST, *PSCSI_SUPPORTED_CONTROL_TYPE_LIST;
+
+typedef SCSI_ADAPTER_CONTROL_STATUS
+(DDKAPI *PHW_ADAPTER_CONTROL)(
+ IN PVOID DeviceExtension,
+ IN SCSI_ADAPTER_CONTROL_TYPE ControlType,
+ IN PVOID Parameters);
+
+typedef BOOLEAN
+(DDKAPI *PHW_ADAPTER_STATE)(
+ IN PVOID DeviceExtension,
+ IN PVOID Context,
+ IN BOOLEAN SaveState);
+
+#define SP_RETURN_NOT_FOUND 0
+#define SP_RETURN_FOUND 1
+#define SP_RETURN_ERROR 2
+#define SP_RETURN_BAD_CONFIG 3
+
+typedef ULONG
+(DDKAPI *PHW_FIND_ADAPTER)(
+ IN PVOID DeviceExtension,
+ IN PVOID HwContext,
+ IN PVOID BusInformation,
+ IN PCHAR ArgumentString,
+ IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo,
+ OUT PBOOLEAN Again);
+
+typedef BOOLEAN
+(DDKAPI *PHW_INITIALIZE)(
IN PVOID DeviceExtension);
-typedef BOOLEAN DDKAPI
-(*PHW_INTERRUPT)(
+typedef BOOLEAN
+(DDKAPI *PHW_INTERRUPT)(
IN PVOID DeviceExtension);
-typedef BOOLEAN DDKAPI
-(*PHW_RESET_BUS)(
+typedef BOOLEAN
+(DDKAPI *PHW_RESET_BUS)(
IN PVOID DeviceExtension,
IN ULONG PathId);
-typedef VOID DDKAPI
-(*PHW_DMA_STARTED)(
+typedef VOID
+(DDKAPI *PHW_DMA_STARTED)(
IN PVOID DeviceExtension);
-typedef BOOLEAN DDKAPI
-(*PHW_STARTIO)(
+typedef BOOLEAN
+(DDKAPI *PHW_STARTIO)(
IN PVOID DeviceExtension,
IN PSCSI_REQUEST_BLOCK Srb);
-typedef VOID DDKAPI
-(*PHW_TIMER)(
+typedef VOID
+(DDKAPI *PHW_TIMER)(
IN PVOID DeviceExtension);
typedef struct _HW_INITIALIZATION_DATA {
- ULONG HwInitializationDataSize;
- INTERFACE_TYPE AdapterInterfaceType;
- PHW_INITIALIZE HwInitialize;
- PHW_STARTIO HwStartIo;
- PHW_INTERRUPT HwInterrupt;
- PHW_FIND_ADAPTER HwFindAdapter;
- PHW_RESET_BUS HwResetBus;
- PHW_DMA_STARTED HwDmaStarted;
- PHW_ADAPTER_STATE HwAdapterState;
- ULONG DeviceExtensionSize;
- ULONG SpecificLuExtensionSize;
- ULONG SrbExtensionSize;
- ULONG NumberOfAccessRanges;
- PVOID Reserved;
- BOOLEAN MapBuffers;
- BOOLEAN NeedPhysicalAddresses;
-// BOOLEAN TaggedQueuing;
- BOOLEAN TaggedQueueing;
- BOOLEAN AutoRequestSense;
- BOOLEAN MultipleRequestPerLu;
- BOOLEAN ReceiveEvent;
- USHORT VendorIdLength;
- PVOID VendorId;
- USHORT ReservedUshort;
- USHORT DeviceIdLength;
- PVOID DeviceId;
+ ULONG HwInitializationDataSize;
+ INTERFACE_TYPE AdapterInterfaceType;
+ PHW_INITIALIZE HwInitialize;
+ PHW_STARTIO HwStartIo;
+ PHW_INTERRUPT HwInterrupt;
+ PHW_FIND_ADAPTER HwFindAdapter;
+ PHW_RESET_BUS HwResetBus;
+ PHW_DMA_STARTED HwDmaStarted;
+ PHW_ADAPTER_STATE HwAdapterState;
+ ULONG DeviceExtensionSize;
+ ULONG SpecificLuExtensionSize;
+ ULONG SrbExtensionSize;
+ ULONG NumberOfAccessRanges;
+ PVOID Reserved;
+ BOOLEAN MapBuffers;
+ BOOLEAN NeedPhysicalAddresses;
+ BOOLEAN TaggedQueuing;
+ BOOLEAN AutoRequestSense;
+ BOOLEAN MultipleRequestPerLu;
+ BOOLEAN ReceiveEvent;
+ USHORT VendorIdLength;
+ PVOID VendorId;
+ USHORT ReservedUshort;
+ USHORT DeviceIdLength;
+ PVOID DeviceId;
+ PHW_ADAPTER_CONTROL HwAdapterControl;
} HW_INITIALIZATION_DATA, *PHW_INITIALIZATION_DATA;
-
-/* FUNCTIONS ****************************************************************/
-
+SCSIPORTAPI
VOID
DDKAPI
ScsiPortCompleteRequest(
- IN PVOID HwDeviceExtension,
- IN UCHAR PathId,
- IN UCHAR TargetId,
- IN UCHAR Lun,
- IN UCHAR SrbStatus);
-
-ULONG
-DDKAPI
-ScsiPortConvertPhysicalAddressToUlong(
- IN SCSI_PHYSICAL_ADDRESS Address);
+ IN PVOID HwDeviceExtension,
+ IN UCHAR PathId,
+ IN UCHAR TargetId,
+ IN UCHAR Lun,
+ IN UCHAR SrbStatus);
+
+/*
+ * ULONG
+ * ScsiPortConvertPhysicalAddressToUlong(
+ * IN SCSI_PHYSICAL_ADDRESS Address);
+ */
+#define ScsiPortConvertPhysicalAddressToUlong(Address) ((Address).LowPart)
SCSIPORTAPI
SCSI_PHYSICAL_ADDRESS
DDKAPI
ScsiPortConvertUlongToPhysicalAddress(
- IN ULONG UlongAddress);
+ IN ULONG UlongAddress);
SCSIPORTAPI
VOID
DDKAPI
ScsiPortFlushDma(
- IN PVOID HwDeviceExtension);
+ IN PVOID DeviceExtension);
SCSIPORTAPI
VOID
DDKAPI
ScsiPortFreeDeviceBase(
- IN PVOID HwDeviceExtension,
- IN PVOID MappedAddress);
+ IN PVOID HwDeviceExtension,
+ IN PVOID MappedAddress);
SCSIPORTAPI
ULONG
DDKAPI
ScsiPortGetBusData(
- IN PVOID DeviceExtension,
- IN ULONG BusDataType,
- IN ULONG SystemIoBusNumber,
- IN ULONG SlotNumber,
- IN PVOID Buffer,
- IN ULONG Length);
+ IN PVOID DeviceExtension,
+ IN ULONG BusDataType,
+ IN ULONG SystemIoBusNumber,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Length);
SCSIPORTAPI
PVOID
DDKAPI
ScsiPortGetDeviceBase(
- IN PVOID HwDeviceExtension,
- IN INTERFACE_TYPE BusType,
- IN ULONG SystemIoBusNumber,
- IN SCSI_PHYSICAL_ADDRESS IoAddress,
- IN ULONG NumberOfBytes,
- IN BOOLEAN InIoSpace);
+ IN PVOID HwDeviceExtension,
+ IN INTERFACE_TYPE BusType,
+ IN ULONG SystemIoBusNumber,
+ IN SCSI_PHYSICAL_ADDRESS IoAddress,
+ IN ULONG NumberOfBytes,
+ IN BOOLEAN InIoSpace);
SCSIPORTAPI
PVOID
DDKAPI
ScsiPortGetLogicalUnit(
- IN PVOID HwDeviceExtension,
- IN UCHAR PathId,
- IN UCHAR TargetId,
- IN UCHAR Lun);
+ IN PVOID HwDeviceExtension,
+ IN UCHAR PathId,
+ IN UCHAR TargetId,
+ IN UCHAR Lun);
SCSIPORTAPI
SCSI_PHYSICAL_ADDRESS
DDKAPI
ScsiPortGetPhysicalAddress(
- IN PVOID HwDeviceExtension,
- IN PSCSI_REQUEST_BLOCK Srb OPTIONAL,
- IN PVOID VirtualAddress,
- OUT PULONG Length);
+ IN PVOID HwDeviceExtension,
+ IN PSCSI_REQUEST_BLOCK Srb OPTIONAL,
+ IN PVOID VirtualAddress,
+ OUT ULONG *Length);
SCSIPORTAPI
PSCSI_REQUEST_BLOCK
DDKAPI
ScsiPortGetSrb(
- IN PVOID DeviceExtension,
- IN UCHAR PathId,
- IN UCHAR TargetId,
- IN UCHAR Lun,
- IN LONG QueueTag);
+ IN PVOID DeviceExtension,
+ IN UCHAR PathId,
+ IN UCHAR TargetId,
+ IN UCHAR Lun,
+ IN LONG QueueTag);
SCSIPORTAPI
PVOID
DDKAPI
ScsiPortGetUncachedExtension(
- IN PVOID HwDeviceExtension,
- IN PPORT_CONFIGURATION_INFORMATION ConfigInfo,
- IN ULONG NumberOfBytes);
+ IN PVOID HwDeviceExtension,
+ IN PPORT_CONFIGURATION_INFORMATION ConfigInfo,
+ IN ULONG NumberOfBytes);
SCSIPORTAPI
PVOID
DDKAPI
ScsiPortGetVirtualAddress(
- IN PVOID HwDeviceExtension,
- IN SCSI_PHYSICAL_ADDRESS PhysicalAddress);
+ IN PVOID HwDeviceExtension,
+ IN SCSI_PHYSICAL_ADDRESS PhysicalAddress);
SCSIPORTAPI
ULONG
DDKAPI
ScsiPortInitialize(
- IN PVOID Argument1,
- IN PVOID Argument2,
- IN struct _HW_INITIALIZATION_DATA *HwInitializationData,
- IN PVOID HwContext);
+ IN PVOID Argument1,
+ IN PVOID Argument2,
+ IN struct _HW_INITIALIZATION_DATA *HwInitializationData,
+ IN PVOID HwContext OPTIONAL);
SCSIPORTAPI
VOID
DDKAPI
ScsiPortIoMapTransfer(
- IN PVOID HwDeviceExtension,
- IN PSCSI_REQUEST_BLOCK Srb,
- IN ULONG LogicalAddress,
- IN ULONG Length);
+ IN PVOID HwDeviceExtension,
+ IN PSCSI_REQUEST_BLOCK Srb,
+ IN PVOID LogicalAddress,
+ IN ULONG Length);
SCSIPORTAPI
VOID
DDKAPI
ScsiPortLogError(
- IN PVOID HwDeviceExtension,
- IN PSCSI_REQUEST_BLOCK Srb OPTIONAL,
- IN UCHAR PathId,
- IN UCHAR TargetId,
- IN UCHAR Lun,
- IN ULONG ErrorCode,
- IN ULONG UniqueId);
+ IN PVOID HwDeviceExtension,
+ IN PSCSI_REQUEST_BLOCK Srb OPTIONAL,
+ IN UCHAR PathId,
+ IN UCHAR TargetId,
+ IN UCHAR Lun,
+ IN ULONG ErrorCode,
+ IN ULONG UniqueId);
SCSIPORTAPI
VOID
DDKAPI
ScsiPortMoveMemory(
- OUT PVOID Destination,
- IN PVOID Source,
- IN ULONG Length);
+ IN PVOID WriteBuffer,
+ IN PVOID ReadBuffer,
+ IN ULONG Length);
SCSIPORTAPI
VOID
+DDKCDECLAPI
ScsiPortNotification(
- IN SCSI_NOTIFICATION_TYPE NotificationType,
- IN PVOID HwDeviceExtension,
- ...);
+ IN SCSI_NOTIFICATION_TYPE NotificationType,
+ IN PVOID HwDeviceExtension,
+ IN ...);
+
+SCSIPORTAPI
+VOID
+DDKAPI
+ScsiPortQuerySystemTime(
+ OUT PLARGE_INTEGER CurrentTime);
SCSIPORTAPI
VOID
DDKAPI
ScsiPortReadPortBufferUchar(
- IN PUCHAR Port,
- IN PUCHAR Value,
- IN ULONG Count);
+ IN PUCHAR Port,
+ IN PUCHAR Buffer,
+ IN ULONG Count);
SCSIPORTAPI
VOID
DDKAPI
ScsiPortReadPortBufferUlong(
- IN PULONG Port,
- IN PULONG Value,
- IN ULONG Count);
+ IN PULONG Port,
+ IN PULONG Buffer,
+ IN ULONG Count);
SCSIPORTAPI
VOID
DDKAPI
ScsiPortReadPortBufferUshort(
- IN PUSHORT Port,
- IN PUSHORT Value,
- IN ULONG Count);
+ IN PUSHORT Port,
+ IN PUSHORT Buffer,
+ IN ULONG Count);
SCSIPORTAPI
UCHAR
DDKAPI
ScsiPortReadPortUchar(
- IN PUCHAR Port);
+ IN PUCHAR Port);
SCSIPORTAPI
ULONG
DDKAPI
ScsiPortReadPortUlong(
- IN PULONG Port);
+ IN PULONG Port);
SCSIPORTAPI
USHORT
DDKAPI
ScsiPortReadPortUshort(
- IN PUSHORT Port);
+ IN PUSHORT Port);
SCSIPORTAPI
VOID
DDKAPI
ScsiPortReadRegisterBufferUchar(
- IN PUCHAR Register,
- IN PUCHAR Buffer,
- IN ULONG Count);
+ IN PUCHAR Register,
+ IN PUCHAR Buffer,
+ IN ULONG Count);
SCSIPORTAPI
VOID
DDKAPI
ScsiPortReadRegisterBufferUlong(
- IN PULONG Register,
- IN PULONG Buffer,
- IN ULONG Count);
+ IN PULONG Register,
+ IN PULONG Buffer,
+ IN ULONG Count);
SCSIPORTAPI
VOID
DDKAPI
ScsiPortReadRegisterBufferUshort(
- IN PUSHORT Register,
- IN PUSHORT Buffer,
- IN ULONG Count);
+ IN PUSHORT Register,
+ IN PUSHORT Buffer,
+ IN ULONG Count);
SCSIPORTAPI
UCHAR
DDKAPI
ScsiPortReadRegisterUchar(
- IN PUCHAR Register);
+ IN PUCHAR Register);
SCSIPORTAPI
ULONG
DDKAPI
ScsiPortReadRegisterUlong(
- IN PULONG Register);
+ IN PULONG Register);
SCSIPORTAPI
USHORT
DDKAPI
ScsiPortReadRegisterUshort(
- IN PUSHORT Register);
+ IN PUSHORT Register);
SCSIPORTAPI
ULONG
DDKAPI
ScsiPortSetBusDataByOffset(
- IN PVOID DeviceExtension,
- IN ULONG BusDataType,
- IN ULONG SystemIoBusNumber,
- IN ULONG SlotNumber,
- IN PVOID Buffer,
- IN ULONG Offset,
- IN ULONG Length);
+ IN PVOID DeviceExtension,
+ IN ULONG BusDataType,
+ IN ULONG SystemIoBusNumber,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length);
SCSIPORTAPI
VOID
DDKAPI
ScsiPortStallExecution(
- IN ULONG MicroSeconds);
+ IN ULONG Delay);
SCSIPORTAPI
BOOLEAN
DDKAPI
ScsiPortValidateRange(
- IN PVOID HwDeviceExtension,
- IN INTERFACE_TYPE BusType,
- IN ULONG SystemIoBusNumber,
- IN SCSI_PHYSICAL_ADDRESS IoAddress,
- IN ULONG NumberOfBytes,
- IN BOOLEAN InIoSpace);
+ IN PVOID HwDeviceExtension,
+ IN INTERFACE_TYPE BusType,
+ IN ULONG SystemIoBusNumber,
+ IN SCSI_PHYSICAL_ADDRESS IoAddress,
+ IN ULONG NumberOfBytes,
+ IN BOOLEAN InIoSpace);
SCSIPORTAPI
VOID
DDKAPI
ScsiPortWritePortBufferUchar(
- IN PUCHAR Port,
- IN PUCHAR Buffer,
- IN ULONG Count);
+ IN PUCHAR Port,
+ IN PUCHAR Buffer,
+ IN ULONG Count);
SCSIPORTAPI
VOID
DDKAPI
ScsiPortWritePortBufferUlong(
- IN PULONG Port,
- IN PULONG Buffer,
- IN ULONG Count);
+ IN PULONG Port,
+ IN PULONG Buffer,
+ IN ULONG Count);
SCSIPORTAPI
VOID
DDKAPI
ScsiPortWritePortBufferUshort(
- IN PUSHORT Port,
- IN PUSHORT Value,
- IN ULONG Count);
+ IN PUSHORT Port,
+ IN PUSHORT Buffer,
+ IN ULONG Count);
SCSIPORTAPI
VOID
DDKAPI
ScsiPortWritePortUchar(
- IN PUCHAR Port,
- IN UCHAR Value);
+ IN PUCHAR Port,
+ IN UCHAR Value);
SCSIPORTAPI
VOID
DDKAPI
ScsiPortWritePortUlong(
- IN PULONG Port,
- IN ULONG Value);
+ IN PULONG Port,
+ IN ULONG Value);
SCSIPORTAPI
VOID
DDKAPI
ScsiPortWritePortUshort(
- IN PUSHORT Port,
- IN USHORT Value);
+ IN PUSHORT Port,
+ IN USHORT Value);
SCSIPORTAPI
VOID
DDKAPI
ScsiPortWriteRegisterBufferUchar(
- IN PUCHAR Register,
- IN PUCHAR Buffer,
- IN ULONG Count);
+ IN PUCHAR Register,
+ IN PUCHAR Buffer,
+ IN ULONG Count);
SCSIPORTAPI
VOID
DDKAPI
ScsiPortWriteRegisterBufferUlong(
- IN PULONG Register,
- IN PULONG Buffer,
- IN ULONG Count);
+ IN PULONG Register,
+ IN PULONG Buffer,
+ IN ULONG Count);
SCSIPORTAPI
VOID
DDKAPI
ScsiPortWriteRegisterBufferUshort(
- IN PUSHORT Register,
- IN PUSHORT Buffer,
- IN ULONG Count);
+ IN PUSHORT Register,
+ IN PUSHORT Buffer,
+ IN ULONG Count);
SCSIPORTAPI
VOID
DDKAPI
ScsiPortWriteRegisterUchar(
- IN PUCHAR Register,
- IN ULONG Value);
+ IN PUCHAR Register,
+ IN ULONG Value);
SCSIPORTAPI
VOID
DDKAPI
ScsiPortWriteRegisterUlong(
- IN PULONG Register,
- IN ULONG Value);
+ IN PULONG Register,
+ IN ULONG Value);
SCSIPORTAPI
VOID
DDKAPI
ScsiPortWriteRegisterUshort(
- IN PUSHORT Register,
- IN USHORT Value);
+ IN PUSHORT Register,
+ IN USHORT Value);
SCSIPORTAPI
VOID
+DDKCDECLAPI
ScsiDebugPrint(
IN ULONG DebugPrintLevel,
- IN PCHAR DebugMessage,
+ IN PCCHAR DebugMessage,
IN ...);
-#pragma pack(pop)
-
#ifdef __cplusplus
}
#endif
-#endif /* __STORAGE_INCLUDE_SRB_H */
+#endif /* __SRB_H */