#ifndef _SMHBAAPI_H_
#define _SMHBAAPI_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <hbaapi.h>
#define SMHBA_LIBVERSION 1
#define HBA_STATUS_ERROR_TARGET_BUSY 30
#define HBA_STATUS_ERROR_NOT_LOADED 31
#define HBA_STATUS_ERROR_ALREADY_LOADED 32
#define HBA_STATUS_ERROR_ILLEGAL_FCID 33
#define HBA_STATUS_ERROR_NOT_ASCSIDEVICE 34
#define HBA_STATUS_ERROR_INVALID_PROTOCOL_TYPE 35
#define HBA_STATUS_ERROR_BAD_EVENT_TYPE 36
#define HBA_PORTTYPE_SASDEVICE 30
#define HBA_PORTTYPE_SATADEVICE 31
#define HBA_PORTTYPE_SASEXPANDER 32
#define HBA_PORTSTATE_DEGRADED 9
#define HBA_PORTSPEED_4GBIT 8
typedef struct SMHBA_scsilun {HBA_UINT8 lun[8]; }
SMHBA_SCSILUN, *PSMHBA_SCSILUN;
typedef unsigned long HBA_SCSILUN;
typedef struct SMHBA_AdapterAttributes {
char Manufacturer[64];
char SerialNumber[64];
char Model[256];
char ModelDescription[256];
char HardwareVersion[256];
char DriverVersion[256];
char OptionROMVersion[256];
char FirmwareVersion[256];
HBA_UINT32 VendorSpecificID;
char DriverName[256];
char HBASymbolicName[256];
char RedundantOptionROMVersion[256];
char RedundantFirmwareVersion[256];
} SMHBA_ADAPTERATTRIBUTES, *PSMHBA_ADAPTERATTRIBUTES;
typedef struct SMHBA_FC_Port {
HBA_WWN NodeWWN;
HBA_WWN PortWWN;
HBA_UINT32 FcId;
HBA_COS PortSupportedClassofService;
HBA_FC4TYPES PortSupportedFc4Types;
HBA_FC4TYPES PortActiveFc4Types;
HBA_WWN FabricName;
char PortSymbolicName[256];
HBA_UINT32 NumberofDiscoveredPorts;
HBA_UINT8 NumberofPhys;
}SMHBA_FC_PORT, *PSMHBA_FC_PORT;
typedef HBA_UINT32 HBA_SASPORTPROTOCOL;
#define HBA_SASPORTPROTOCOL_SSP 1
#define HBA_SASPORTPROTOCOL_STP 2
#define HBA_SASPORTPROTOCOL_SMP 4
#define HBA_SASPORTPROTOCOL_SATA 8
typedef struct SMHBA_SAS_Port {
HBA_SASPORTPROTOCOL PortProtocol;
HBA_WWN LocalSASAddress;
HBA_WWN AttachedSASAddress;
HBA_UINT32 NumberofDiscoveredPorts;
HBA_UINT32 NumberofPhys;
} SMHBA_SAS_PORT, *PSMHBA_SAS_PORT;
typedef union SMHBA_Port {
SMHBA_FC_PORT *FCPort;
SMHBA_SAS_PORT *SASPort;
} SMHBA_PORT, *PSMHBA_PORT;
typedef struct SMHBA_PortAttributes {
HBA_PORTTYPE PortType;
HBA_PORTSTATE PortState;
char OSDeviceName[256];
SMHBA_PORT PortSpecificAttribute;
} SMHBA_PORTATTRIBUTES, *PSMHBA_PORTATTRIBUTES;
typedef HBA_UINT32 HBA_FCPHYSPEED;
#define HBA_FCSPEED_UNKNOWN 0
#define HBA_FCPHYSPEED_8GBIT 16
#define HBA_FCPHYSPEED_16GBIT 32
typedef HBA_UINT8 HBA_FCPHYTYPE;
#define HBA_FCPHYTYPE_UNKNOWN 1
#define HBA_FCPHYTYPE_OPTICAL 2
#define HBA_FCPHYTYPE_COPPER 4
typedef struct SMHBA_FC_Phy {
HBA_FCPHYSPEED PhySupportedSpeed;
HBA_FCPHYSPEED PhySpeed;
HBA_FCPHYTYPE PhyType;
HBA_UINT32 MaxFrameSize;
} SMHBA_FC_PHY, *PSMHBA_FC_PHY;
typedef HBA_UINT32 HBA_SASPHYSPEED;
#define HBA_SASSTATE_UNKNOWN 0x00
#define HBA_SASSTATE_DISABLED 0x01
#define HBA_SASSTATE_FAILED 0x02
#define HBA_SASSTATE_SATASPINUP 0x03
#define HBA_SASSTATE_SATAPORTSEL 0x04
#define HBA_SASSPEED_1_5GBIT 0x08
#define HBA_SASSPEED_3GBIT 0x09
#define HBA_SASSPEED_6GBIT 0x0a
#define HBA_SASSPEED_12GBIT 0x0b
typedef struct SMHBA_SAS_Phy {
HBA_UINT8 PhyIdentifier;
HBA_SASPHYSPEED NegotiatedLinkRate;
HBA_SASPHYSPEED ProgrammedMinLinkRate;
HBA_SASPHYSPEED HardwareMinLinkRate;
HBA_SASPHYSPEED ProgrammedMaxLinkRate;
HBA_SASPHYSPEED HardwareMaxLinkRate;
HBA_WWN domainPortWWN;
} SMHBA_SAS_PHY, *PSMHBA_SAS_PHY;
typedef struct SMHBA_ProtocolStatistics {
HBA_INT64 SecondsSinceLastReset;
HBA_INT64 InputRequests;
HBA_INT64 OutputRequests;
HBA_INT64 ControlRequests;
HBA_INT64 InputMegabytes;
HBA_INT64 OutputMegabytes;
} SMHBA_PROTOCOLSTATISTICS, *PSMHBA_PROTOCOLSTATISTICS;
typedef struct SMHBA_PortStatistics {
HBA_INT64 SecondsSinceLastReset;
HBA_INT64 TxFrames;
HBA_INT64 TxWords;
HBA_INT64 RxFrames;
HBA_INT64 RxWords;
}SMHBA_PORTSTATISTICS, *PSMHBA_PORTSTATISTICS;
typedef struct SMHBA_SASPhyStatistics {
HBA_INT64 SecondsSinceLastReset;
HBA_INT64 TxFrames;
HBA_INT64 TxWords;
HBA_INT64 RxFrames;
HBA_INT64 RxWords;
HBA_INT64 InvalidDwordCount;
HBA_INT64 RunningDisparityErrorCount;
HBA_INT64 LossofDwordSyncCount;
HBA_INT64 PhyResetProblemCount;
} SMHBA_SASPHYSTATISTICS, *PSMHBA_SASPHYSTATISTICS;
typedef struct SMHBA_FCPhyStatistics {
HBA_INT64 SecondsSinceLastReset;
HBA_INT64 TxFrames;
HBA_INT64 TxWords;
HBA_INT64 RxFrames;
HBA_INT64 RxWords;
HBA_INT64 LIPCount;
HBA_INT64 NOSCount;
HBA_INT64 ErrorFrames;
HBA_INT64 DumpedFrames;
HBA_INT64 LinkFailureCount;
HBA_INT64 LossOfSyncCount;
HBA_INT64 LossOfSignalCount;
HBA_INT64 PrimitiveSeqProtocolErrCount;
HBA_INT64 InvalidTxWordCount;
HBA_INT64 InvalidCRCCount;
}SMHBA_FCPHYSTATISTICS, *PSMHBA_FCPHYSTATISTICS;
typedef union SMHBA_PhyStatistics {
SMHBA_SASPHYSTATISTICS *SASPhyStatistics;
SMHBA_FCPHYSTATISTICS *FCPhyStatistics;
} SMHBA_PHYSTATISTICS, *PSMHBA_PHYSTATISTICS;
typedef HBA_UINT32 SMHBA_BIND_CAPABILITY;
#define SMHBA_CAN_BIND_TO_WWPN 0x0001
#define SMHBA_CAN_BIND_TO_LUID 0x0002
#define SMHBA_CAN_BIND_ANY_LUNS 0x0400
#define SMHBA_CAN_BIND_AUTOMAP 0x0800
typedef HBA_UINT32 SMHBA_BIND_TYPE;
#define SMHBA_BIND_TO_WWPN 0x0001
#define SMHBA_BIND_TO_LUID 0x0002
typedef struct SMHBA_ScsiId {
char OSDeviceName[256];
HBA_UINT32 ScsiBusNumber;
HBA_UINT32 ScsiTargetNumber;
HBA_UINT32 ScsiOSLun;
} SMHBA_SCSIID, *PSMHBA_SCSIID;
typedef struct SMHBA_LUID {
char buffer[256];
} SMHBA_LUID, *PSMHBA_LUID;
typedef struct SMHBA_PORTLUN {
HBA_WWN PortWWN;
HBA_WWN domainPortWWN;
SMHBA_SCSILUN TargetLun;
} SMHBA_PORTLUN, *PSMHBA_PORTLUN;
typedef struct SMHBA_ScsiEntry {
SMHBA_SCSIID ScsiId;
SMHBA_PORTLUN PortLun;
SMHBA_LUID LUID;
} SMHBA_SCSIENTRY, *PSMHBA_SCSIENTRY;
typedef struct SMHBA_TargetMapping {
HBA_UINT32 NumberOfEntries;
SMHBA_SCSIENTRY entry[1];
} SMHBA_TARGETMAPPING, *PSMHBA_TARGETMAPPING;
typedef struct SMHBA_BindingEntry {
SMHBA_BIND_TYPE type;
SMHBA_SCSIID ScsiId;
SMHBA_PORTLUN PortLun;
SMHBA_LUID LUID;
HBA_STATUS Status;
} SMHBA_BINDINGENTRY, *PSMHBA_BINDINGENTRY;
typedef struct SMHBA_Binding {
HBA_UINT32 NumberOfEntries;
SMHBA_BINDINGENTRY entry[1];
} SMHBA_BINDING, *PSMHBA_BINDING;
typedef struct SMHBA_LibraryAttributes {
char LibPath[256];
char VName[256];
char VVersion[256];
struct {
int tm_mday;
int tm_mon;
int tm_year;
} build_date;
} SMHBA_LIBRARYATTRIBUTES, *PSMHBA_LIBRARYATTRIBUTES;
#define HBA_EVENT_PORT_BROADCAST_CHANGE 0x205
#define HBA_EVENT_PORT_BROADCAST_SES 0x208
#define HBA_EVENT_PORT_BROADCAST_D24_0 0x206
#define HBA_EVENT_PORT_BROADCAST_D27_4 0x207
#define HBA_EVENT_PORT_BROADCAST_D01_4 0x209
#define HBA_EVENT_PORT_BROADCAST_D04_7 0x20A
#define HBA_EVENT_PORT_BROADCAST_D16_7 0x20B
#define HBA_EVENT_PORT_BROADCAST_D29_7 0x20C
#define HBA_EVENT_PORT_ALL 0x2FF
HBA_UINT32 SMHBA_GetVersion();
HBA_UINT32 SMHBA_GetWrapperLibraryAttributes(
SMHBA_LIBRARYATTRIBUTES *attributes
);
HBA_UINT32 SMHBA_GetVendorLibraryAttributes(
HBA_UINT32 adapter_index,
SMHBA_LIBRARYATTRIBUTES *attributes
);
HBA_STATUS SMHBA_GetAdapterAttributes(
HBA_HANDLE handle,
SMHBA_ADAPTERATTRIBUTES *pAdapterAttributes
);
HBA_STATUS SMHBA_GetNumberOfPorts(
HBA_HANDLE handle,
HBA_UINT32 *numberofports
);
HBA_STATUS SMHBA_GetPortType(
HBA_HANDLE handle,
HBA_UINT32 portindex,
HBA_PORTTYPE *porttype
);
HBA_STATUS SMHBA_GetAdapterPortAttributes(
HBA_HANDLE handle,
HBA_UINT32 portindex,
SMHBA_PORTATTRIBUTES *portattributes
);
HBA_STATUS SMHBA_GetDiscoveredPortAttributes(
HBA_HANDLE handle,
HBA_UINT32 portindex,
HBA_UINT32 discoveredportindex,
SMHBA_PORTATTRIBUTES *porattributes
);
HBA_STATUS SMHBA_GetPortAttributesByWWN(
HBA_HANDLE handle,
HBA_WWN portWWN,
HBA_WWN domainPortWWN,
SMHBA_PORTATTRIBUTES *portattributes
);
HBA_STATUS SMHBA_GetPortAttributesByWWN(
HBA_HANDLE handle,
HBA_WWN portWWN,
HBA_WWN domainPortWWN,
SMHBA_PORTATTRIBUTES *portattributes
);
HBA_STATUS SMHBA_GetFCPhyAttributes(
HBA_HANDLE handle,
HBA_UINT32 portindex,
HBA_UINT32 phyindex,
SMHBA_FC_PHY *phytype
);
HBA_STATUS SMHBA_GetSASPhyAttributes(
HBA_HANDLE handle,
HBA_UINT32 portindex,
HBA_UINT32 phyindex,
SMHBA_SAS_PHY *phytype
);
HBA_STATUS SMHBA_GetProtocolStatistics(
HBA_HANDLE handle,
HBA_UINT32 portindex,
HBA_UINT32 protocoltype,
SMHBA_PROTOCOLSTATISTICS *pProtocolStatistics
);
HBA_STATUS SMHBA_GetPhyStatistics(
HBA_HANDLE handle,
HBA_UINT32 portindex,
HBA_UINT32 phyindex,
SMHBA_PHYSTATISTICS *pPhyStatistics
);
HBA_STATUS SMHBA_SendTEST(
HBA_HANDLE handle,
HBA_WWN hbaPortWWN,
HBA_WWN destWWN,
HBA_UINT32 destFCID,
void *pReqBuffer,
HBA_UINT32 ReqBufferSize
);
HBA_STATUS SMHBA_SendECHO(
HBA_HANDLE handle,
HBA_WWN hbaPortWWN,
HBA_WWN destWWN,
HBA_UINT32 destFCID,
void *pReqBuffer,
HBA_UINT32 ReqBufferSize,
void *pRspBuffer,
HBA_UINT32 *pRspBufferSize
);
HBA_UINT32 SMHBA_SendSMPPassThru(
HBA_HANDLE handle,
HBA_WWN hbaportWWN,
HBA_WWN destportWWN,
HBA_WWN domainPortWWN,
void *pReqBuffer,
HBA_UINT32 ReqBufferSize,
void *pRspBuffer,
HBA_UINT32 *pRspBufferSize
);
HBA_STATUS SMHBA_GetBindingCapability(
HBA_HANDLE handle,
HBA_WWN hbaPortWWN,
HBA_WWN domainPortWWN,
SMHBA_BIND_CAPABILITY *pFlags
);
HBA_STATUS SMHBA_GetBindingSupport(
HBA_HANDLE handle,
HBA_WWN hbaPortWWN,
HBA_WWN domainPortWWN,
SMHBA_BIND_CAPABILITY *pFlags
);
HBA_STATUS SMHBA_SetBindingSupport(
HBA_HANDLE handle,
HBA_WWN hbaPortWWN,
HBA_WWN domainPortWWN,
SMHBA_BIND_CAPABILITY flags
);
HBA_STATUS SMHBA_GetTargetMapping(
HBA_HANDLE handle,
HBA_WWN hbaPortWWN,
HBA_WWN domainPortWWN,
SMHBA_TARGETMAPPING *pMapping
);
HBA_STATUS SMHBA_GetPersistentBinding(
HBA_HANDLE handle,
HBA_WWN hbaPortWWN,
HBA_WWN domainPortWWN,
SMHBA_BINDING *binding
);
HBA_STATUS SMHBA_SetPersistentBinding(
HBA_HANDLE handle,
HBA_WWN hbaPortWWN,
HBA_WWN domainPortWWN,
const SMHBA_BINDING *binding
);
HBA_STATUS SMHBA_RemovePersistentBinding(
HBA_HANDLE handle,
HBA_WWN hbaPortWWN,
HBA_WWN domainPortWWN,
const SMHBA_BINDING *binding
);
HBA_STATUS SMHBA_RemoveAllPersistentBindings(
HBA_HANDLE handle,
HBA_WWN hbaPortWWN,
HBA_WWN domainPortWWN
);
HBA_STATUS SMHBA_GetLUNStatistics(
HBA_HANDLE handle,
const HBA_SCSIID *lunit,
SMHBA_PROTOCOLSTATISTICS *statistics
);
HBA_STATUS SMHBA_ScsiInquiry(
HBA_HANDLE handle,
HBA_WWN hbaPortWWN,
HBA_WWN discoveredPortWWN,
HBA_WWN domainPortWWN,
SMHBA_SCSILUN smhbaLUN,
HBA_UINT8 CDB_Byte1,
HBA_UINT8 CDB_Byte2,
void *pRspBuffer,
HBA_UINT32 *pRspBufferSize,
HBA_UINT8 *pScsiStatus,
void *pSenseBuffer,
HBA_UINT32 *pSenseBufferSize
);
HBA_STATUS SMHBA_ScsiReportLUNs(
HBA_HANDLE handle,
HBA_WWN hbaPortWWN,
HBA_WWN discoveredPortWWN,
HBA_WWN domainPortWWN,
void *pRspBuffer,
HBA_UINT32 *pRspBufferSize,
HBA_UINT8 *pScsiStatus,
void *pSenseBuffer,
HBA_UINT32 *pSenseBufferSize
);
HBA_STATUS SMHBA_ScsiReadCapacity(
HBA_HANDLE handle,
HBA_WWN hbaPortWWN,
HBA_WWN discoveredPortWWN,
HBA_WWN domainPortWWN,
SMHBA_SCSILUN smhbaLUN,
void *pRspBuffer,
HBA_UINT32 *pRspBufferSize,
HBA_UINT8 *pScsiStatus,
void *pSenseBuffer,
HBA_UINT32 *pSenseBufferSize
);
HBA_STATUS SMHBA_RegisterForAdapterAddEvents(
void (*pCallback) (
void *pData,
HBA_WWN portWWN,
HBA_UINT32 eventType),
void *pUserData,
HBA_CALLBACKHANDLE *pCallbackHandle
);
HBA_STATUS SMHBA_RegisterForAdapterEvents(
void (*pCallback) (
void *pData,
HBA_WWN portWWN,
HBA_UINT32 eventType),
void *pUserData,
HBA_HANDLE handle,
HBA_CALLBACKHANDLE *pCallbackHandle
);
HBA_STATUS SMHBA_RegisterForAdapterPortEvents(
void (*pCallback) (
void *pData,
HBA_WWN portWWN,
HBA_UINT32 eventType,
HBA_UINT32 fabricPortID),
void *pUserData,
HBA_HANDLE handle,
HBA_WWN portWWN,
HBA_UINT32 specificEventType,
HBA_CALLBACKHANDLE *pCallbackHandle
);
HBA_STATUS SMHBA_RegisterForAdapterPortStatEvents(
void (*pCallback) (
void *pData,
HBA_WWN portWWN,
HBA_UINT32 protocolType,
HBA_UINT32 eventType),
void *pUserData,
HBA_HANDLE handle,
HBA_WWN portWWN,
HBA_UINT32 protocolType,
SMHBA_PROTOCOLSTATISTICS stats,
HBA_UINT32 statType,
HBA_CALLBACKHANDLE *pCallbackHandle
);
HBA_STATUS SMHBA_RegisterForAdapterPhyStatEvents(
void (*pCallback) (
void *pData,
HBA_WWN portWWN,
HBA_UINT32 phyIndex,
HBA_UINT32 eventType),
void *pUserData,
HBA_HANDLE handle,
HBA_WWN portWWN,
HBA_UINT32 phyIndex,
SMHBA_PHYSTATISTICS stats,
HBA_UINT32 statType,
HBA_CALLBACKHANDLE *pCallbackHandle
);
HBA_STATUS SMHBA_RegisterForTargetEvents(
void (*pCallback) (
void *pData,
HBA_WWN hbaPortWWN,
HBA_WWN discoveredPortWWN,
HBA_WWN domainPortWWN,
HBA_UINT32 eventType),
void *pUserData,
HBA_HANDLE handle,
HBA_WWN hbaPortWWN,
HBA_WWN discoveredPortWWN,
HBA_WWN domainPortWWN,
HBA_CALLBACKHANDLE *pCallbackHandle,
HBA_UINT32 allTargets
);
#ifdef __cplusplus
}
#endif
#endif