text: /*
   * *****************************************************************************
   *
   * Description
   *	hbaapi.h - general header file for client
   * 		 and library developers
   *
   * License:
   *	The contents of this file are subject to the SNIA Public License
   *	Version 1.0 (the "License"); you may not use this file except in
   *	compliance with the License. You may obtain a copy of the License at
   *
   *	/http://www.snia.org/English/Resources/Code/OpenSource.html
   *
   *	Software distributed under the License is distributed on an "AS IS"
   *	basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
   *	the License for the specific language governing rights and limitations
   *	under the License.
   *
   * The Original Code is  SNIA HBA API general header file
   *
   * The Initial Developer of the Original Code is:
   *	Benjamin F. Kuo, Troika Networks, Inc. (benk@troikanetworks.com)
   *
   * Contributor(s):
   *	Tuan Lam, QLogic Corp. (t_lam@qlc.com)
   *	Dan Willie, Emulex Corp. (Dan.Willie@emulex.com)
   *	Dixon Hutchinson, Legato Systems, Inc. (dhutchin@legato.com)
   *	David Dillard, VERITAS Software Corp. (david.dillard@veritas.com)
   *
   *******************************************************************************
   *
   *   Changes:
   *	03/09/2000 Initial Draft
   *	(for other changes... see the CVS logs)
   *******************************************************************************
   */
  
  /*
   * Copyright 2020 RackTop Systems, Inc.
   */
  
  #ifdef __cplusplus
  extern "C" {
  #endif
  
  
  #ifndef HBA_API_H
  #define HBA_API_H
  
  /* Library version string */
  #define HBA_LIBVERSION 2
  
  /* DLL imports for WIN32 operation */
  #ifdef WIN32
  #ifdef HBAAPI_EXPORTS
  #define HBA_API __declspec(dllexport)
  #else
  #define HBA_API __declspec(dllimport)
  #endif
  #else
  #define HBA_API
  #endif
  
  /* OS specific definitions */
  
  #ifdef WIN32
  typedef unsigned char	HBA_UINT8;	// Unsigned  8 bits
  typedef		 char	HBA_INT8;	// Signed    8 bits
  typedef unsigned short	HBA_UINT16;	// Unsigned 16 bits
  typedef		 short	HBA_INT16;	// Signed   16 bits
  typedef unsigned int	HBA_UINT32;	// Unsigned 32 bits
  typedef		 int	HBA_INT32;	// Signed   32 bits
  typedef void*		HBA_PVOID;	// Pointer  to void
  typedef HBA_UINT32	HBA_VOID32;	// Opaque   32 bits
  
  
  /* Don't confuse, _WIN32 with WIN32... OK, how do you accompish that */
  #ifdef _WIN32
  typedef			_int64		HBA_INT64;
  typedef			unsigned _int64	HBA_UINT64;
  #else
  typedef struct {
  	TN_UINT32	lo_val;
  	TN_UINT32	hi_val;
  } HBA_INT64;
  
  typedef struct {
  	TN_UINT32	lo_val;
  	TN_UINT32	hi_val;
  } HBA_UINT64;
  #endif	/*	#ifdef _WIN32	*/
  
  
  #else
  #include <time.h> /* Needed for struct tm */
  
  /* Note this section needs to be cleaned up for various Unix platforms */
  typedef unsigned char	HBA_UINT8;	/* Unsigned  8 bits */
  typedef		 char	HBA_INT8;	/* Signed    8 bits */
  typedef unsigned short	HBA_UINT16;	/* Unsigned 16 bits */
  typedef		 short	HBA_INT16;	/* Signed   16 bits */
  typedef unsigned int	HBA_UINT32;	/* Unsigned 32 bits */
  typedef		 int	HBA_INT32;	/* Signed   32 bits */
  typedef void*		HBA_PVOID;	/* Pointer  to void */
  typedef HBA_UINT32	HBA_VOID32;	/* Opaque   32 bits */
  typedef long long	HBA_INT64;
  typedef long long	HBA_UINT64;
  
  #endif  /*  #ifdef WIN32 */
  
  
  /* 4.2.1	Handle to Device */
  typedef HBA_UINT32	HBA_HANDLE;
  
  #define HBA_HANDLE_INVALID		0
  
  /* 4.2.2	Status Return Values */
  typedef HBA_UINT32	HBA_STATUS;
  
  #define HBA_STATUS_OK			0
  #define HBA_STATUS_ERROR		1   /* Error */
  #define HBA_STATUS_ERROR_NOT_SUPPORTED	2   /* Function not supported.*/
  #define HBA_STATUS_ERROR_INVALID_HANDLE	3   /* invalid handle */
  #define HBA_STATUS_ERROR_ARG		4   /* Bad argument */
  #define HBA_STATUS_ERROR_ILLEGAL_WWN	5   /* WWN not recognized */
  #define HBA_STATUS_ERROR_ILLEGAL_INDEX	6   /* Index not recognized */
  #define HBA_STATUS_ERROR_MORE_DATA	7   /* Larger buffer required */
  #define HBA_STATUS_ERROR_STALE_DATA	8   /* Information has changed since
  					     * last call to
  					     * HBA_Refreshinformation */
  #define HBA_STATUS_SCSI_CHECK_CONDITION	9   /* Obvious */
  #define HBA_STATUS_ERROR_BUSY		10  /* Adapter busy or reserved,
  					     * retry may be effective */
  #define HBA_STATUS_ERROR_TRY_AGAIN	11  /* Request timedout,
  					     * retry may be effective */
  #define HBA_STATUS_ERROR_UNAVAILABLE	12  /* Referenced HBA has been removed
  					     * or deactivated */
  #define HBA_STATUS_ERROR_ELS_REJECT	13  /* The requested ELS was rejected by
  					     * the local adapter */
  #define HBA_STATUS_ERROR_INVALID_LUN	14  /* The specified LUN is not provided 
  					     *  the specified adapter */
  #define HBA_STATUS_ERROR_INCOMPATIBLE	15  /* An incompatibility has been
  				* detected among the library and driver modules 
  				* invoked which will cause one or more functions 
  				* in the highest version that all support to 
  				* operate incorrectly.  The differing function 
  				* sets of software modules implementing different
  				* versions of the HBA API specification does not 
  				* in itself constitute an incompatibility.  Known 
  				* interoperability bugs among supposedly 
  				* compatible versions should be reported as 
  				* incompatibilities, but not all such 
  				* interoperability bugs may be known.  This value
  				* may be returned by any function that calls a 
  				* Vendor Specific Library and returns an 
  				* HBA_STATUS, and by HBA_LoadLibrary and 
  				* HBA_GetAdapterName. */
  
  #define HBA_STATUS_ERROR_AMBIGUOUS_WWN	16  /* Multiple adapters have a matching
  					     * WWN. This could occur if the
  					     * NodeWWN of multiple adapters is 
  					     * identical */
  #define HBA_STATUS_ERROR_LOCAL_BUS	17  /* A persistent binding request
  					     * included a bad local SCSI bus
  					     * number */
  #define HBA_STATUS_ERROR_LOCAL_TARGET	18  /* A persistent binding request
  					     * included a bad local SCSI target
  					     * number */
  #define HBA_STATUS_ERROR_LOCAL_LUN	19  /* A persistent binding request
  					     * included a bad local SCSI logical
  					     * unit number */
  #define HBA_STATUS_ERROR_LOCAL_SCSIID_BOUND 20
  					    /* A persistent binding set request
  					     * included a local SCSI ID that was
  					     * already bound */
  #define HBA_STATUS_ERROR_TARGET_FCID	21  /* A persistent binding request
  					     * included a bad or unlocatable FCP
  					     * Target FCID */
  #define HBA_STATUS_ERROR_TARGET_NODE_WWN 22 /* A persistent binding request 
  					     * included a bad FCP Target Node
  					     * WWN */
  #define HBA_STATUS_ERROR_TARGET_PORT_WWN 23 /* A persistent binding request
  					     * included a bad FCP Target Port
  					     * WWN */
  #define HBA_STATUS_ERROR_TARGET_LUN	24  /* A persistent binding request
  					     * included an FCP Logical Unit Number
  					     * not defined by the identified 
  					     * Target*/
  #define HBA_STATUS_ERROR_TARGET_LUID	25  /* A persistent binding request
  					     * included an undefined or otherwise
  					     * inaccessible Logical Unit Unique
  					     * Identifier */
  #define HBA_STATUS_ERROR_NO_SUCH_BINDING 26 /* A persistent binding remove request
  					     * included a binding which did not
  					     * match a binding established by the
  					     * specified port */
  #define HBA_STATUS_ERROR_NOT_A_TARGET	27  /* A SCSI command was requested to an
  					     * Nx_Port that was not a SCSI
  					     * Target Port */
  #define HBA_STATUS_ERROR_UNSUPPORTED_FC4 28 /* A request was made concerning an 
  					     * unsupported FC-4 protocol */
  
  
  #define HBA_STATUS_ERROR_INCAPABLE	29  /* A request was made to enable 
  					     * unimplemented capabilities for a 
  					     * port */ 
  
  /* 4.2.3	Port Operational Modes Values */
  typedef HBA_UINT32 HBA_PORTTYPE;
  
  #define HBA_PORTTYPE_UNKNOWN		1   /* Unknown */
  #define HBA_PORTTYPE_OTHER		2   /* Other */
  #define HBA_PORTTYPE_NOTPRESENT		3   /* Not present */
  #define HBA_PORTTYPE_NPORT		5   /* Fabric  */
  #define HBA_PORTTYPE_NLPORT		6   /* Public Loop */
  #define HBA_PORTTYPE_FLPORT		7
  #define HBA_PORTTYPE_FPORT		8   /* Fabric Port */
  #define HBA_PORTTYPE_EPORT		9   /* Fabric expansion port */
  #define HBA_PORTTYPE_GPORT		10  /* Generic Fabric Port */
  #define HBA_PORTTYPE_LPORT		20  /* Private Loop */
  #define HBA_PORTTYPE_PTP		21  /* Point to Point */
  
  
  typedef HBA_UINT32 HBA_PORTSTATE;
  #define HBA_PORTSTATE_UNKNOWN		1   /* Unknown */
  #define HBA_PORTSTATE_ONLINE		2   /* Operational */
  #define HBA_PORTSTATE_OFFLINE		3   /* User Offline */
  #define HBA_PORTSTATE_BYPASSED		4   /* Bypassed */
  #define HBA_PORTSTATE_DIAGNOSTICS	5   /* In diagnostics mode */
  #define HBA_PORTSTATE_LINKDOWN		6   /* Link Down */
  #define HBA_PORTSTATE_ERROR		7   /* Port Error */
  #define HBA_PORTSTATE_LOOPBACK		8   /* Loopback */
  
  
  typedef HBA_UINT32 HBA_PORTSPEED;
  #define HBA_PORTSPEED_UNKNOWN		0   /* Unknown - transceiver incable
  					     * of reporting */
  #define HBA_PORTSPEED_1GBIT		1   /* 1 GBit/sec */
  #define HBA_PORTSPEED_2GBIT		2   /* 2 GBit/sec */
  #define HBA_PORTSPEED_10GBIT		4   /* 10 GBit/sec */
  #define HBA_PORTSPEED_4GBIT		8   /* 4 GBit/sec */
  #define HBA_PORTSPEED_8GBIT		16  /* 8 GBit/sec */
  #define HBA_PORTSPEED_16GBIT		32  /* 16 GBit/sec */
  #define HBA_PORTSPEED_32GBIT		64  /* 32 GBit/sec */
  #define HBA_PORTSPEED_NOT_NEGOTIATED	(1<<15)   /* Speed not established */
  
  
  
  /* 4.2.4	Class of Service Values - See GS-2 Spec.*/
  
  typedef HBA_UINT32 HBA_COS;
  
  
  /* 4.2.5	Fc4Types Values */
  
  typedef struct HBA_fc4types {
      HBA_UINT8 bits[32];		/* 32 bytes of FC-4 per GS-2 */
  } HBA_FC4TYPES, *PHBA_FC4TYPES;
  
  /* 4.2.6	Basic Types */
  
  typedef struct HBA_wwn {
      HBA_UINT8 wwn[8];
  } HBA_WWN, *PHBA_WWN;
  
  typedef struct HBA_ipaddress {
      int	ipversion;		/* see enumerations in RNID */
      union
      {
  	unsigned char ipv4address[4];
  	unsigned char ipv6address[16];
      } ipaddress;
  } HBA_IPADDRESS, *PHBA_IPADDRESS;
  
  typedef HBA_INT8	HBA_BOOLEAN;
  
  /* 4.2.7	Adapter Attributes */
  typedef struct hba_AdapterAttributes {
      char	Manufacturer[64];	/*Emulex */
      char	SerialNumber[64];	/* A12345 */
      char	Model[256];		/* QLA2200 */
      char	ModelDescription[256];	/* Agilent TachLite */
      HBA_WWN	NodeWWN;
      char	NodeSymbolicName[256];	/* From GS-3 */
      char	HardwareVersion[256];	/* Vendor use */
      char	DriverVersion[256];	/* Vendor use */
      char	OptionROMVersion[256];	/* Vendor use  - i.e. hardware boot ROM*/
      char	FirmwareVersion[256];	/* Vendor use */
      HBA_UINT32	VendorSpecificID;	/* Vendor specific */
      HBA_UINT32	NumberOfPorts;
      char	DriverName[256];	/* Binary path and/or name of driver
  					 *file */
  } HBA_ADAPTERATTRIBUTES, *PHBA_ADAPTERATTRIBUTES;
  
  /* 4.2.8	Port Attributes */
  typedef struct HBA_PortAttributes {
      HBA_WWN		NodeWWN;
      HBA_WWN		PortWWN;
      HBA_UINT32		PortFcId;
      HBA_PORTTYPE	PortType;		/*PTP, Fabric, etc. */
      HBA_PORTSTATE	PortState;
      HBA_COS		PortSupportedClassofService;
      HBA_FC4TYPES	PortSupportedFc4Types;
      HBA_FC4TYPES	PortActiveFc4Types;
      char		PortSymbolicName[256];
      char		OSDeviceName[256];	/* \device\ScsiPort3  */
      HBA_PORTSPEED	PortSupportedSpeed;
      HBA_PORTSPEED	PortSpeed;
      HBA_UINT32		PortMaxFrameSize;
      HBA_WWN		FabricName;
      HBA_UINT32		NumberofDiscoveredPorts;
  } HBA_PORTATTRIBUTES, *PHBA_PORTATTRIBUTES;
  
  
  
  /* 4.2.9	Port Statistics */
  
  typedef struct HBA_PortStatistics {
      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;
  } HBA_PORTSTATISTICS, *PHBA_PORTSTATISTICS;
  
  
  
  /* 4.2.10		FCP Attributes */
  
  typedef enum HBA_fcpbindingtype { TO_D_ID, TO_WWN, TO_OTHER } HBA_FCPBINDINGTYPE;
  
  typedef struct HBA_ScsiId {
      char		OSDeviceName[256];	/* \device\ScsiPort3  */
      HBA_UINT32		ScsiBusNumber;		/* Bus on the HBA */
      HBA_UINT32		ScsiTargetNumber;	/* SCSI Target ID to OS */
      HBA_UINT32		ScsiOSLun;
  } HBA_SCSIID, *PHBA_SCSIID;
  
  typedef struct HBA_FcpId {
      HBA_UINT32		FcId;
      HBA_WWN		NodeWWN;
      HBA_WWN		PortWWN;
      HBA_UINT64		FcpLun;
  } HBA_FCPID, *PHBA_FCPID;
  
  typedef struct HBA_LUID {
      char		buffer[256];	/* Unique Device Identifier */
  } HBA_LUID, *PHBA_LUID;
  
  typedef struct HBA_FcpScsiEntry {
      HBA_SCSIID		ScsiId;
      HBA_FCPID		FcpId;
  } HBA_FCPSCSIENTRY, *PHBA_FCPSCSIENTRY;
  
  typedef struct HBA_FcpScsiEntryV2 {
      HBA_SCSIID		ScsiId;
      HBA_FCPID		FcpId;
      HBA_LUID		LUID;
  } HBA_FCPSCSIENTRYV2, *PHBA_FCPSCSIENTRYV2;
  
  typedef struct HBA_FCPTargetMapping {
      HBA_UINT32		NumberOfEntries;
      HBA_FCPSCSIENTRY	entry[1];		/* Variable length array
  						 * containing mappings */
  } HBA_FCPTARGETMAPPING, *PHBA_FCPTARGETMAPPING;
  
  typedef struct HBA_FCPTargetMappingV2 {
      HBA_UINT32		NumberOfEntries;
      HBA_FCPSCSIENTRYV2	entry[1];		/* Variable length array
  						 * containing mappings */
  } HBA_FCPTARGETMAPPINGV2, *PHBA_FCPTARGETMAPPINGV2;
  
  typedef struct HBA_FCPBindingEntry {
      HBA_FCPBINDINGTYPE	type;
      HBA_SCSIID		ScsiId;
      HBA_FCPID		FcpId;			/* WWN valid only if type is
  						 * to WWN, FcpLun always valid */
      HBA_UINT32		FcId;
  } HBA_FCPBINDINGENTRY, *PHBA_FCPBINDINGENTRY;
  
  typedef struct HBA_FCPBinding {
      HBA_UINT32		NumberOfEntries;
      HBA_FCPBINDINGENTRY	entry[1];		/* Variable length array */
  } HBA_FCPBINDING, *PHBA_FCPBINDING;
  
  /* 4.2.11	FC-3 Management Atrributes */
  
  typedef enum HBA_wwntype { NODE_WWN, PORT_WWN } HBA_WWNTYPE;
  
  typedef struct HBA_MgmtInfo {
      HBA_WWN		wwn;
      HBA_UINT32		unittype;
      HBA_UINT32		PortId;
      HBA_UINT32		NumberOfAttachedNodes;
      HBA_UINT16		IPVersion;
      HBA_UINT16		UDPPort;
      HBA_UINT8		IPAddress[16];
      HBA_UINT16		reserved;
      HBA_UINT16		TopologyDiscoveryFlags;
  } HBA_MGMTINFO, *PHBA_MGMTINFO;
  
  /* Event Codes */
  #define HBA_EVENT_LIP_OCCURRED		1
  #define HBA_EVENT_LINK_UP		2
  #define HBA_EVENT_LINK_DOWN		3
  #define HBA_EVENT_LIP_RESET_OCCURRED	4
  #define HBA_EVENT_RSCN			5
  #define HBA_EVENT_PROPRIETARY		0xFFFF
  
  typedef struct HBA_Link_EventInfo {
      HBA_UINT32		PortFcId;		/* Port where event occurred */
      HBA_UINT32		Reserved[3];
  } HBA_LINK_EVENTINFO, *PHBA_LINK_EVENTINFO;
  
  typedef struct HBA_RSCN_EventInfo {
      HBA_UINT32		PortFcId;		/* Port where event occurred */
      HBA_UINT32		NPortPage;		/* Reference FC-FS for RSCN ELS
  						 * "Affected N-Port Pages"*/
      HBA_UINT32		Reserved[2];
  } HBA_RSCN_EVENTINFO, *PHBA_RSCN_EVENTINFO;
  
  typedef struct HBA_Pty_EventInfo {
      HBA_UINT32 PtyData[4];			/* Proprietary data */
  } HBA_PTY_EVENTINFO, *PHBA_PTY_EVENTINFO;
  
  typedef struct HBA_EventInfo {
      HBA_UINT32		EventCode;
      union {
  	HBA_LINK_EVENTINFO	Link_EventInfo;
  	HBA_RSCN_EVENTINFO	RSCN_EventInfo;
  	HBA_PTY_EVENTINFO	Pty_EventInfo;
      }			Event;
  } HBA_EVENTINFO, *PHBA_EVENTINFO;
  
  typedef struct HBA_LibraryAttributes {
      HBA_BOOLEAN		final;
      char		LibPath[256];
      char		VName[256];
      char		VVersion[256];
      struct tm		build_date;
  } HBA_LIBRARYATTRIBUTES, *PHBA_LIBRARYATTRIBUTES;
  
  /* Persistant Binding... */
  typedef HBA_UINT32 HBA_BIND_TYPE;
  #define HBA_BIND_TO_D_ID		0x0001
  #define HBA_BIND_TO_WWPN		0x0002
  #define HBA_BIND_TO_WWNN		0x0004
  #define HBA_BIND_TO_LUID		0x0008
  #define HBA_BIND_TARGETS		0x0800
  
  /* A bit mask of Rev 2.0 persistent binding capabilities */
  typedef HBA_UINT32 HBA_BIND_CAPABILITY;
  /* The following are bit flags indicating persistent binding capabilities */
  #define HBA_CAN_BIND_TO_D_ID		0x0001
  #define HBA_CAN_BIND_TO_WWPN		0x0002
  #define HBA_CAN_BIND_TO_WWNN		0x0004
  #define HBA_CAN_BIND_TO_LUID		0x0008
  #define HBA_CAN_BIND_ANY_LUNS		0x0400
  #define HBA_CAN_BIND_TARGETS		0x0800
  #define HBA_CAN_BIND_AUTOMAP		0x1000
  #define HBA_CAN_BIND_CONFIGURED		0x2000
  
  #define HBA_BIND_STATUS_DISABLED	0x00
  #define HBA_BIND_STATUS_ENABLED		0x01
  
  typedef HBA_UINT32 HBA_BIND_STATUS;
  
  #define HBA_BIND_EFFECTIVE_AT_REBOOT	0x00
  #define HBA_BIND_EFFECTIVE_IMMEDIATE	0x01
  
  typedef HBA_UINT32 HBA_BIND_EFFECTIVE;
  
  typedef struct HBA_FCPBindingEntry2 {
      HBA_BIND_TYPE	type;
      HBA_SCSIID		ScsiId;
      HBA_FCPID		FcpId;
      HBA_LUID		LUID;
      HBA_STATUS		status;
  } HBA_FCPBINDINGENTRY2, *PHBA_FCPBINDINGENTRY2;
  
  typedef struct HBA_FcpBinding2 {
      HBA_UINT32		NumberOfEntries;
      HBA_FCPBINDINGENTRY2
  			entry[1];	/* Variable length array */
  } HBA_FCPBINDING2, *PHBA_FCPBINDING2;
  
  /* FC-4 Instrumentation */
  typedef struct HBA_FC4Statistics {
      HBA_INT64		InputRequests;
      HBA_INT64		OutputRequests;
      HBA_INT64		ControlRequests;
      HBA_INT64		InputMegabytes;
      HBA_INT64		OutputMegabytes;
  } HBA_FC4STATISTICS, *PHBA_FC4STATISTICS;
  
  
  typedef void *	HBA_CALLBACKHANDLE;
  /* Adapter Level Events */
  #define HBA_EVENT_ADAPTER_UNKNOWN	0x100
  #define HBA_EVENT_ADAPTER_ADD		0x101
  #define HBA_EVENT_ADAPTER_REMOVE	0x102
  #define HBA_EVENT_ADAPTER_CHANGE	0x103
  
  /* Port Level Events */
  #define HBA_EVENT_PORT_UNKNOWN		0x200
  #define HBA_EVENT_PORT_OFFLINE		0x201
  #define HBA_EVENT_PORT_ONLINE		0x202
  #define HBA_EVENT_PORT_NEW_TARGETS	0x203
  #define HBA_EVENT_PORT_FABRIC		0x204
  
  /* Port Statistics Events */
  #define HBA_EVENT_PORT_STAT_THRESHOLD	0x301
  #define HBA_EVENT_PORT_STAT_GROWTH	0x302
  
  /* Target Level Events */
  #define HBA_EVENT_TARGET_UNKNOWN	0x400
  #define HBA_EVENT_TARGET_OFFLINE	0x401
  #define HBA_EVENT_TARGET_ONLINE		0x402
  #define HBA_EVENT_TARGET_REMOVED	0x403
  
  /* Fabric Link  Events */
  #define HBA_EVENT_LINK_UNKNOWN		0x500
  #define HBA_EVENT_LINK_INCIDENT		0x501
  
  HBA_API HBA_UINT32 HBA_GetVersion();
  
  /*
   * Make sure HBA_LoadLibrary returns before any other threads
   * make calls to the library
   */
  HBA_API HBA_STATUS HBA_LoadLibrary(void);
  
  HBA_API HBA_STATUS HBA_FreeLibrary(void);
  
  HBA_API HBA_UINT32 HBA_GetNumberOfAdapters(void);
  
  HBA_API HBA_STATUS HBA_GetAdapterName(
      HBA_UINT32		adapterindex,
      char		*adaptername
      );
  
  HBA_API HBA_HANDLE HBA_OpenAdapter(
      char*		adaptername
      );
  
  HBA_API HBA_STATUS HBA_OpenAdapterByWWN(
      HBA_HANDLE		*handle,
      HBA_WWN		wwn
      );
  
  HBA_API void HBA_CloseAdapter(
      HBA_HANDLE		handle
      );
  
  HBA_API HBA_STATUS HBA_GetAdapterAttributes(
      HBA_HANDLE		handle,
      HBA_ADAPTERATTRIBUTES
  			*hbaattributes
      );
  
  HBA_API HBA_STATUS HBA_GetAdapterPortAttributes(
      HBA_HANDLE		handle,
      HBA_UINT32		portindex,
      HBA_PORTATTRIBUTES	*portattributes
      );
  
  HBA_API HBA_STATUS HBA_GetPortStatistics(
      HBA_HANDLE		handle,
      HBA_UINT32		portindex,
      HBA_PORTSTATISTICS	*portstatistics
      );
  
  HBA_API HBA_STATUS HBA_GetDiscoveredPortAttributes(
      HBA_HANDLE		handle,
      HBA_UINT32		portindex,
      HBA_UINT32		discoveredportindex,
      HBA_PORTATTRIBUTES	*portattributes
      );
  
  HBA_API HBA_STATUS HBA_GetPortAttributesByWWN(
      HBA_HANDLE		handle,
      HBA_WWN		PortWWN,
      HBA_PORTATTRIBUTES	*portattributes
      );
  
  HBA_API HBA_STATUS HBA_SendCTPassThruV2(
      HBA_HANDLE		handle,
      HBA_WWN		hbaPortWWN,
      void		*pReqBuffer,
      HBA_UINT32		ReqBufferSize,
      void		*pRspBuffer,
      HBA_UINT32		*pRspBufferSize
      );
  
  /* Depricated, but supported */
  HBA_API HBA_STATUS HBA_SendCTPassThru(
      HBA_HANDLE		handle,
      void		*pReqBuffer,
      HBA_UINT32		ReqBufferSize,
      void		*pRspBuffer,
      HBA_UINT32		RspBufferSize
      );
  
  HBA_API void HBA_RefreshAdapterConfiguration();
  
  HBA_API HBA_STATUS HBA_GetEventBuffer(
      HBA_HANDLE		handle,
      HBA_EVENTINFO	*EventBuffer,
      HBA_UINT32		*EventBufferCount
      );
  
  HBA_API HBA_STATUS HBA_SetRNIDMgmtInfo(
      HBA_HANDLE		handle,
      HBA_MGMTINFO	Info
      );
  
  HBA_API HBA_STATUS HBA_GetRNIDMgmtInfo(
      HBA_HANDLE		handle,
      HBA_MGMTINFO	*pInfo
      );
  
  HBA_API HBA_STATUS HBA_SendRNIDV2(
      HBA_HANDLE		handle,
      HBA_WWN		hbaPortWWN,
      HBA_WWN		destWWN,
      HBA_UINT32		destFCID,
      HBA_UINT32		NodeIdDataFormat,
      void		*pRspBuffer,
      HBA_UINT32		*pRspBufferSize
      );
  
  /* Depricated, but supported */
  HBA_API HBA_STATUS HBA_SendRNID(
      HBA_HANDLE		handle,
      HBA_WWN		wwn,
      HBA_WWNTYPE		wwntype,
      void		*pRspBuffer,
      HBA_UINT32		*pRspBufferSize
      );
  
  HBA_API HBA_STATUS HBA_SendRLS (
      HBA_HANDLE		handle,
      HBA_WWN		hbaPortWWN,
      HBA_WWN		destWWN,
      void		*pRspBuffer,
      HBA_UINT32		*pRspBufferSize
      );
  
  HBA_API HBA_STATUS HBA_SendRPL (
      HBA_HANDLE		handle,
      HBA_WWN		hbaPortWWN,
      HBA_WWN		agent_wwn,
      HBA_UINT32		agent_domain,
      HBA_UINT32		portindex,
      void		*pRspBuffer,
      HBA_UINT32		*pRspBufferSize
      );
  
  HBA_API HBA_STATUS HBA_SendRPS (
      HBA_HANDLE		handle,
      HBA_WWN		hbaPortWWN,
      HBA_WWN		agent_wwn,
      HBA_UINT32		agent_domain,
      HBA_WWN		object_wwn,
      HBA_UINT32		object_port_number,
      void		*pRspBuffer,
      HBA_UINT32		*pRspBufferSize
      );
  
  HBA_API HBA_STATUS HBA_SendSRL (
      HBA_HANDLE		handle,
      HBA_WWN		hbaPortWWN,
      HBA_WWN		wwn,
      HBA_UINT32		domain,
      void		*pRspBuffer,
      HBA_UINT32		*pRspBufferSize
      );
  
  HBA_API HBA_STATUS HBA_SendLIRR (
      HBA_HANDLE		handle,
      HBA_WWN		sourceWWN,
      HBA_WWN		destWWN,
      HBA_UINT8		function,
      HBA_UINT8		type,
      void		*pRspBuffer,
      HBA_UINT32		*pRspBufferSize
      );
  
  
  HBA_API HBA_STATUS HBA_GetFC4Statistics (
      HBA_HANDLE		handle,
      HBA_WWN		portWWN,
      HBA_UINT8		FC4type,
      HBA_FC4STATISTICS	*pstatistics
      );
  
  HBA_API HBA_STATUS HBA_GetFCPStatistics (
      HBA_HANDLE		handle,
      const HBA_SCSIID	*lunit,
      HBA_FC4STATISTICS	*pstatistics);
  
  HBA_API void HBA_RefreshInformation(
      HBA_HANDLE		handle
      );
  
  HBA_API void HBA_ResetStatistics(
      HBA_HANDLE		handle,
      HBA_UINT32		portindex
      );
  
  HBA_API HBA_STATUS HBA_GetFcpTargetMapping(
      HBA_HANDLE		handle,
      HBA_FCPTARGETMAPPING
  			*pmapping
      );
  
  HBA_API HBA_STATUS HBA_GetFcpTargetMappingV2(
      HBA_HANDLE		handle,
      HBA_WWN		hbaPortWWN,
      HBA_FCPTARGETMAPPINGV2
  			*pmapping
      );
  
  HBA_API HBA_STATUS HBA_GetBindingCapability(
      HBA_HANDLE		handle,
      HBA_WWN		hbaPortWWN,
      HBA_BIND_CAPABILITY *pcapability
      );
  
  HBA_API HBA_STATUS HBA_GetBindingSupport(
      HBA_HANDLE		handle,
      HBA_WWN		hbaPortWWN,
      HBA_BIND_CAPABILITY *pcapability
      );
  
  HBA_API HBA_STATUS HBA_SetBindingSupport(
      HBA_HANDLE		handle,
      HBA_WWN		hbaPortWWN,
      HBA_BIND_CAPABILITY capability
      );
  
  HBA_API HBA_STATUS HBA_SetPersistentBindingV2(
      HBA_HANDLE		handle,
      HBA_WWN		hbaPortWWN,
      const HBA_FCPBINDING2
  			*pbinding
      );
  
  HBA_API HBA_STATUS HBA_GetPersistentBindingV2(
      HBA_HANDLE		handle,
      HBA_WWN		hbaPortWWN,
      HBA_FCPBINDING2	*binding
      );
  
  HBA_API HBA_STATUS HBA_RemovePersistentBinding(
      HBA_HANDLE		handle,
      HBA_WWN		hbaPortWWN,
      const HBA_FCPBINDING2
  			*pbinding
      );
  
  /* Depricated, but supported */
  HBA_API HBA_STATUS HBA_GetFcpPersistentBinding(
      HBA_HANDLE		handle,
      HBA_FCPBINDING	*binding
      );
  
  HBA_API HBA_STATUS HBA_RemoveAllPersistentBindings(
      HBA_HANDLE		handle,
      HBA_WWN		hbaPortWWN
      );
  
  HBA_STATUS HBA_ScsiInquiryV2 (
      HBA_HANDLE		handle,
      HBA_WWN		hbaPortWWN,
      HBA_WWN		discoveredPortWWN,
      HBA_UINT64		fcLUN,
      HBA_UINT8		CDB_Byte1,
      HBA_UINT8		CDB_BYte2,
      void		*pRspBuffer,
      HBA_UINT32		*pRspBufferSize,
      HBA_UINT8		*pScsiStatus,
      void		*pSenseBuffer,
      HBA_UINT32		*pSenseBufferSize
      );
  
  /* Depricated, but supported */
  HBA_API HBA_STATUS HBA_SendScsiInquiry (
      HBA_HANDLE		handle,
      HBA_WWN		PortWWN,
      HBA_UINT64		fcLUN,
      HBA_UINT8		EVPD,
      HBA_UINT32		PageCode,
      void		*pRspBuffer,
      HBA_UINT32		RspBufferSize,
      void		*pSenseBuffer,
      HBA_UINT32		SenseBufferSize
      );
  
  HBA_API HBA_STATUS HBA_ScsiReportLUNsV2(
      HBA_HANDLE		handle,
      HBA_WWN		hbaPortWWN,
      HBA_WWN		discoveredPortWWN,
      void		*pRespBuffer,
      HBA_UINT32		*pRespBufferSize,
      HBA_UINT8		*pScsiStatus,
      void		*pSenseBuffer,
      HBA_UINT32		*pSenseBufferSize
      );
  
  /* Depricated, but supported */
  HBA_API HBA_STATUS HBA_SendReportLUNs (
      HBA_HANDLE		handle,
      HBA_WWN		portWWN,
      void		*pRspBuffer,
      HBA_UINT32		RspBufferSize,
      void		*pSenseBuffer,
      HBA_UINT32		SenseBufferSize
      );
  
  HBA_API HBA_STATUS HBA_ScsiReadCapacityV2(
      HBA_HANDLE		handle,
      HBA_WWN		hbaPortWWN,
      HBA_WWN		discoveredPortWWN,
      HBA_UINT64		fcLUN,
      void		*pRspBuffer,
      HBA_UINT32		*pRspBufferSize,
      HBA_UINT8		*pScsiStatus,
      void		*pSenseBuffer,
      HBA_UINT32		*SenseBufferSize
      );
  
  /* Depricated, but supported */
  HBA_API HBA_STATUS HBA_SendReadCapacity (
      HBA_HANDLE		handle,
      HBA_WWN		portWWN,
      HBA_UINT64		fcLUN,
      void		*pRspBuffer,
      HBA_UINT32		RspBufferSize,
      void		*pSenseBuffer,
      HBA_UINT32		SenseBufferSize
      );
  
  HBA_API HBA_UINT32 HBA_GetVendorLibraryAttributes (
      HBA_UINT32		adapter_index,
      HBA_LIBRARYATTRIBUTES
  			*attributes
      );
  
  HBA_API HBA_STATUS HBA_RemoveCallback(
      HBA_CALLBACKHANDLE	callbackHandle
      );
  
  HBA_API HBA_STATUS HBA_RegisterForAdapterAddEvents(
      void		(*callback) (
  	void		*data,
  	HBA_WWN		PortWWN,
  	HBA_UINT32	eventType
  	),
      void		*userData,
      HBA_CALLBACKHANDLE *callbackHandle
      );
  
  HBA_API HBA_STATUS HBA_RegisterForAdapterEvents(
      void		(*callback)(
  	void		*data,
  	HBA_WWN		PortWWN,
  	HBA_UINT32	eventType
  	),
      void		*userData,
      HBA_HANDLE		handle,
      HBA_CALLBACKHANDLE	*callbackHandle
      );
  
  HBA_API HBA_STATUS HBA_RegisterForAdapterPortEvents(
      void		(*callback)(
  	void		*data,
  	HBA_WWN		PortWWN,
  	HBA_UINT32	eventType,
  	HBA_UINT32	fabricPortID
  	),
      void		*userData,
      HBA_HANDLE		handle,
      HBA_WWN		PortWWN,
      HBA_CALLBACKHANDLE *callbackHandle
      );
  
  HBA_API HBA_STATUS HBA_RegisterForAdapterPortStatEvents(
      void		(*callback)(
  	void		*data,
  	HBA_WWN		PortWWN,
  	HBA_UINT32	eventType
  	),
      void		*userData,
      HBA_HANDLE		handle,
      HBA_WWN		PortWWN,
      HBA_PORTSTATISTICS	stats,
      HBA_UINT32		statType,
      HBA_CALLBACKHANDLE	*callbackHandle
      );
  
  
  HBA_API HBA_STATUS HBA_RegisterForTargetEvents(
      void		(*callback)(
  	void		*data,
  	HBA_WWN		hbaPortWWN,
  	HBA_WWN		discoveredPortWWN,
  	HBA_UINT32	eventType
  	),
      void		*userData,
      HBA_HANDLE		handle,
      HBA_WWN		hbaPortWWN,
      HBA_WWN		discoveredPortWWN,
      HBA_CALLBACKHANDLE	*callbackHandle,
      HBA_UINT32		allTargets
      );
  
  HBA_API HBA_STATUS HBA_RegisterForLinkEvents(
      void		(*callback)
      (
  	void		*data,
  	HBA_WWN		adapterWWN,
  	HBA_UINT32	eventType,
  	void		*pRLIRBuffer,
  	HBA_UINT32	RLIRBufferSize
  	),
      void		*userData,
      void		*pRLIRBuffer,
      HBA_UINT32		RLIRBufferSize,
      HBA_HANDLE		handle,
      HBA_CALLBACKHANDLE	*callbackHandle
  );
  
  /* Wrapper library specific entry points */
  
  HBA_API HBA_UINT32 HBA_GetWrapperLibraryAttributes (
      HBA_LIBRARYATTRIBUTES
  			*attributes
  );
  
  #endif /* HBA_API_H */
  
  #ifdef __cplusplus
  }
  #endif
  
  
  