1 /*
   2  * *****************************************************************************
   3  *
   4  * Description
   5  *      hbaapi.h - general header file for client
   6  *               and library developers
   7  *
   8  * License:
   9  *      The contents of this file are subject to the SNIA Public License
  10  *      Version 1.0 (the "License"); you may not use this file except in
  11  *      compliance with the License. You may obtain a copy of the License at
  12  *
  13  *      /http://www.snia.org/English/Resources/Code/OpenSource.html
  14  *
  15  *      Software distributed under the License is distributed on an "AS IS"
  16  *      basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17  *      the License for the specific language governing rights and limitations
  18  *      under the License.
  19  *
  20  * The Original Code is  SNIA HBA API general header file
  21  *
  22  * The Initial Developer of the Original Code is:
  23  *      Benjamin F. Kuo, Troika Networks, Inc. (benk@troikanetworks.com)
  24  *
  25  * Contributor(s):
  26  *      Tuan Lam, QLogic Corp. (t_lam@qlc.com)
  27  *      Dan Willie, Emulex Corp. (Dan.Willie@emulex.com)
  28  *      Dixon Hutchinson, Legato Systems, Inc. (dhutchin@legato.com)
  29  *      David Dillard, VERITAS Software Corp. (david.dillard@veritas.com)
  30  *
  31  *******************************************************************************
  32  *
  33  *   Changes:
  34  *      03/09/2000 Initial Draft
  35  *      (for other changes... see the CVS logs)
  36  *******************************************************************************
  37  */
  38 
  39 #ifndef _EMLXS_HBAAPI_H
  40 #define _EMLXS_HBAAPI_H
  41 
  42 #ifdef __cplusplus
  43 extern "C" {
  44 #endif
  45 
  46 /* Library version string */
  47 #define HBA_LIBVERSION 2
  48 
  49 /* DLL imports for WIN32 operation */
  50 #ifdef WIN32
  51 #ifdef HBAAPI_EXPORTS
  52 #define HBA_API __declspec(dllexport)
  53 #else
  54 #define HBA_API __declspec(dllimport)
  55 #endif
  56 #else
  57 #define HBA_API
  58 #endif
  59 
  60 /* OS specific definitions */
  61 
  62 #ifdef WIN32
  63 typedef unsigned char   HBA_UINT8;      // Unsigned  8 bits
  64 typedef          char   HBA_INT8;       // Signed    8 bits
  65 typedef unsigned short  HBA_UINT16;     // Unsigned 16 bits
  66 typedef          short  HBA_INT16;      // Signed   16 bits
  67 typedef unsigned int    HBA_UINT32;     // Unsigned 32 bits
  68 typedef          int    HBA_INT32;      // Signed   32 bits
  69 typedef void*           HBA_PVOID;      // Pointer  to void
  70 typedef HBA_UINT32      HBA_VOID32;     // Opaque   32 bits
  71 
  72 
  73 /* Don't confuse, _WIN32 with WIN32... OK, how do you accompish that */
  74 #ifdef _WIN32
  75 typedef                 _int64          HBA_INT64;
  76 typedef                 unsigned _int64 HBA_UINT64;
  77 #else
  78 typedef struct {
  79         TN_UINT32       lo_val;
  80         TN_UINT32       hi_val;
  81 } HBA_INT64;
  82 
  83 typedef struct {
  84         TN_UINT32       lo_val;
  85         TN_UINT32       hi_val;
  86 } HBA_UINT64;
  87 #endif  /*      #ifdef _WIN32   */
  88 
  89 
  90 #else
  91 #ifndef _KERNEL
  92 #include <time.h> /* Needed for struct tm */
  93 #endif /* ifndef _KERNEL */
  94 
  95 /* Note this section needs to be cleaned up for various Unix platforms */
  96 typedef unsigned char   HBA_UINT8;      /* Unsigned  8 bits */
  97 typedef          char   HBA_INT8;       /* Signed    8 bits */
  98 typedef unsigned short  HBA_UINT16;     /* Unsigned 16 bits */
  99 typedef          short  HBA_INT16;      /* Signed   16 bits */
 100 typedef unsigned int    HBA_UINT32;     /* Unsigned 32 bits */
 101 typedef          int    HBA_INT32;      /* Signed   32 bits */
 102 typedef void*           HBA_PVOID;      /* Pointer  to void */
 103 typedef HBA_UINT32      HBA_VOID32;     /* Opaque   32 bits */
 104 typedef long long       HBA_INT64;
 105 typedef long long       HBA_UINT64;
 106 
 107 #endif  /*  #ifdef WIN32 */
 108 
 109 
 110 /* 4.2.1        Handle to Device */
 111 typedef HBA_UINT32      HBA_HANDLE;
 112 
 113 #define HBA_HANDLE_INVALID              0
 114 
 115 /* 4.2.2        Status Return Values */
 116 typedef HBA_UINT32      HBA_STATUS;
 117 
 118 #define HBA_STATUS_OK                   0
 119 #define HBA_STATUS_ERROR                1   /* Error */
 120 #define HBA_STATUS_ERROR_NOT_SUPPORTED  2   /* Function not supported.*/
 121 #define HBA_STATUS_ERROR_INVALID_HANDLE 3   /* invalid handle */
 122 #define HBA_STATUS_ERROR_ARG            4   /* Bad argument */
 123 #define HBA_STATUS_ERROR_ILLEGAL_WWN    5   /* WWN not recognized */
 124 #define HBA_STATUS_ERROR_ILLEGAL_INDEX  6   /* Index not recognized */
 125 #define HBA_STATUS_ERROR_MORE_DATA      7   /* Larger buffer required */
 126 #define HBA_STATUS_ERROR_STALE_DATA     8   /* Information has changed since
 127                                              * last call to
 128                                              * HBA_Refreshinformation */
 129 #define HBA_STATUS_SCSI_CHECK_CONDITION 9   /* Obvious */
 130 #define HBA_STATUS_ERROR_BUSY           10  /* Adapter busy or reserved,
 131                                              * retry may be effective */
 132 #define HBA_STATUS_ERROR_TRY_AGAIN      11  /* Request timedout,
 133                                              * retry may be effective */
 134 #define HBA_STATUS_ERROR_UNAVAILABLE    12  /* Referenced HBA has been removed
 135                                              * or deactivated */
 136 #define HBA_STATUS_ERROR_ELS_REJECT     13  /* The requested ELS was rejected by
 137                                              * the local adapter */
 138 #define HBA_STATUS_ERROR_INVALID_LUN    14  /* The specified LUN is not provided 
 139                                              *  the specified adapter */
 140 #define HBA_STATUS_ERROR_INCOMPATIBLE   15  /* An incompatibility has been
 141                                 * detected among the library and driver modules 
 142                                 * invoked which will cause one or more functions 
 143                                 * in the highest version that all support to 
 144                                 * operate incorrectly.  The differing function 
 145                                 * sets of software modules implementing different
 146                                 * versions of the HBA API specification does not 
 147                                 * in itself constitute an incompatibility.  Known 
 148                                 * interoperability bugs among supposedly 
 149                                 * compatible versions should be reported as 
 150                                 * incompatibilities, but not all such 
 151                                 * interoperability bugs may be known.  This value
 152                                 * may be returned by any function that calls a 
 153                                 * Vendor Specific Library and returns an 
 154                                 * HBA_STATUS, and by HBA_LoadLibrary and 
 155                                 * HBA_GetAdapterName. */
 156 
 157 #define HBA_STATUS_ERROR_AMBIGUOUS_WWN  16  /* Multiple adapters have a matching
 158                                              * WWN. This could occur if the
 159                                              * NodeWWN of multiple adapters is 
 160                                              * identical */
 161 #define HBA_STATUS_ERROR_LOCAL_BUS      17  /* A persistent binding request
 162                                              * included a bad local SCSI bus
 163                                              * number */
 164 #define HBA_STATUS_ERROR_LOCAL_TARGET   18  /* A persistent binding request
 165                                              * included a bad local SCSI target
 166                                              * number */
 167 #define HBA_STATUS_ERROR_LOCAL_LUN      19  /* A persistent binding request
 168                                              * included a bad local SCSI logical
 169                                              * unit number */
 170 #define HBA_STATUS_ERROR_LOCAL_SCSIID_BOUND 20
 171                                             /* A persistent binding set request
 172                                              * included a local SCSI ID that was
 173                                              * already bound */
 174 #define HBA_STATUS_ERROR_TARGET_FCID    21  /* A persistent binding request
 175                                              * included a bad or unlocatable FCP
 176                                              * Target FCID */
 177 #define HBA_STATUS_ERROR_TARGET_NODE_WWN 22 /* A persistent binding request 
 178                                              * included a bad FCP Target Node
 179                                              * WWN */
 180 #define HBA_STATUS_ERROR_TARGET_PORT_WWN 23 /* A persistent binding request
 181                                              * included a bad FCP Target Port
 182                                              * WWN */
 183 #define HBA_STATUS_ERROR_TARGET_LUN     24  /* A persistent binding request
 184                                              * included an FCP Logical Unit Number
 185                                              * not defined by the identified 
 186                                              * Target*/
 187 #define HBA_STATUS_ERROR_TARGET_LUID    25  /* A persistent binding request
 188                                              * included an undefined or otherwise
 189                                              * inaccessible Logical Unit Unique
 190                                              * Identifier */
 191 #define HBA_STATUS_ERROR_NO_SUCH_BINDING 26 /* A persistent binding remove request
 192                                              * included a binding which did not
 193                                              * match a binding established by the
 194                                              * specified port */
 195 #define HBA_STATUS_ERROR_NOT_A_TARGET   27  /* A SCSI command was requested to an
 196                                              * Nx_Port that was not a SCSI
 197                                              * Target Port */
 198 #define HBA_STATUS_ERROR_UNSUPPORTED_FC4 28 /* A request was made concerning an 
 199                                              * unsupported FC-4 protocol */
 200 
 201 
 202 #define HBA_STATUS_ERROR_INCAPABLE      29  /* A request was made to enable 
 203                                              * unimplemented capabilities for a 
 204                                              * port */ 
 205 
 206 /* 4.2.3        Port Operational Modes Values */
 207 typedef HBA_UINT32 HBA_PORTTYPE;
 208 
 209 #define HBA_PORTTYPE_UNKNOWN            1   /* Unknown */
 210 #define HBA_PORTTYPE_OTHER              2   /* Other */
 211 #define HBA_PORTTYPE_NOTPRESENT         3   /* Not present */
 212 #define HBA_PORTTYPE_NPORT              5   /* Fabric  */
 213 #define HBA_PORTTYPE_NLPORT             6   /* Public Loop */
 214 #define HBA_PORTTYPE_FLPORT             7
 215 #define HBA_PORTTYPE_FPORT              8   /* Fabric Port */
 216 #define HBA_PORTTYPE_EPORT              9   /* Fabric expansion port */
 217 #define HBA_PORTTYPE_GPORT              10  /* Generic Fabric Port */
 218 #define HBA_PORTTYPE_LPORT              20  /* Private Loop */
 219 #define HBA_PORTTYPE_PTP                21  /* Point to Point */
 220 
 221 
 222 typedef HBA_UINT32 HBA_PORTSTATE;
 223 #define HBA_PORTSTATE_UNKNOWN           1   /* Unknown */
 224 #define HBA_PORTSTATE_ONLINE            2   /* Operational */
 225 #define HBA_PORTSTATE_OFFLINE           3   /* User Offline */
 226 #define HBA_PORTSTATE_BYPASSED          4   /* Bypassed */
 227 #define HBA_PORTSTATE_DIAGNOSTICS       5   /* In diagnostics mode */
 228 #define HBA_PORTSTATE_LINKDOWN          6   /* Link Down */
 229 #define HBA_PORTSTATE_ERROR             7   /* Port Error */
 230 #define HBA_PORTSTATE_LOOPBACK          8   /* Loopback */
 231 
 232 
 233 typedef HBA_UINT32 HBA_PORTSPEED;
 234 #define HBA_PORTSPEED_UNKNOWN           0   /* Unknown - transceiver incable
 235                                              * of reporting */
 236 #define HBA_PORTSPEED_1GBIT             1   /* 1 GBit/sec */
 237 #define HBA_PORTSPEED_2GBIT             2   /* 2 GBit/sec */
 238 #define HBA_PORTSPEED_10GBIT            4   /* 10 GBit/sec */
 239 #define HBA_PORTSPEED_4GBIT             8   /* 4 GBit/sec */
 240 #define HBA_PORTSPEED_8GBIT             16  /* 8 GBit/sec */
 241 #define HBA_PORTSPEED_16GBIT            32  /* 16 GBit/sec */
 242 #define HBA_PORTSPEED_NOT_NEGOTIATED    (1<<15)   /* Speed not established */
 243 
 244 
 245 
 246 /* 4.2.4        Class of Service Values - See GS-2 Spec.*/
 247 
 248 typedef HBA_UINT32 HBA_COS;
 249 
 250 
 251 /* 4.2.5        Fc4Types Values */
 252 
 253 typedef struct HBA_fc4types {
 254     HBA_UINT8 bits[32];         /* 32 bytes of FC-4 per GS-2 */
 255 } HBA_FC4TYPES, *PHBA_FC4TYPES;
 256 
 257 /* 4.2.6        Basic Types */
 258 
 259 typedef struct HBA_wwn {
 260     HBA_UINT8 wwn[8];
 261 } HBA_WWN, *PHBA_WWN;
 262 
 263 typedef struct HBA_ipaddress {
 264     int ipversion;              /* see enumerations in RNID */
 265     union
 266     {
 267         unsigned char ipv4address[4];
 268         unsigned char ipv6address[16];
 269     } ipaddress;
 270 } HBA_IPADDRESS, *PHBA_IPADDRESS;
 271 
 272 typedef HBA_INT8        HBA_BOOLEAN;
 273 
 274 /* 4.2.7        Adapter Attributes */
 275 typedef struct hba_AdapterAttributes {
 276     char        Manufacturer[64];       /*Emulex */
 277     char        SerialNumber[64];       /* A12345 */
 278     char        Model[256];             /* QLA2200 */
 279     char        ModelDescription[256];  /* Agilent TachLite */
 280     HBA_WWN     NodeWWN;
 281     char        NodeSymbolicName[256];  /* From GS-3 */
 282     char        HardwareVersion[256];   /* Vendor use */
 283     char        DriverVersion[256];     /* Vendor use */
 284     char        OptionROMVersion[256];  /* Vendor use  - i.e. hardware boot ROM*/
 285     char        FirmwareVersion[256];   /* Vendor use */
 286     HBA_UINT32  VendorSpecificID;       /* Vendor specific */
 287     HBA_UINT32  NumberOfPorts;
 288     char        DriverName[256];        /* Binary path and/or name of driver
 289                                          *file */
 290 } HBA_ADAPTERATTRIBUTES, *PHBA_ADAPTERATTRIBUTES;
 291 
 292 /* 4.2.8        Port Attributes */
 293 typedef struct HBA_PortAttributes {
 294     HBA_WWN             NodeWWN;
 295     HBA_WWN             PortWWN;
 296     HBA_UINT32          PortFcId;
 297     HBA_PORTTYPE        PortType;               /*PTP, Fabric, etc. */
 298     HBA_PORTSTATE       PortState;
 299     HBA_COS             PortSupportedClassofService;
 300     HBA_FC4TYPES        PortSupportedFc4Types;
 301     HBA_FC4TYPES        PortActiveFc4Types;
 302     char                PortSymbolicName[256];
 303     char                OSDeviceName[256];      /* \device\ScsiPort3  */
 304     HBA_PORTSPEED       PortSupportedSpeed;
 305     HBA_PORTSPEED       PortSpeed;
 306     HBA_UINT32          PortMaxFrameSize;
 307     HBA_WWN             FabricName;
 308     HBA_UINT32          NumberofDiscoveredPorts;
 309 } HBA_PORTATTRIBUTES, *PHBA_PORTATTRIBUTES;
 310 
 311 
 312 
 313 /* 4.2.9        Port Statistics */
 314 
 315 typedef struct HBA_PortStatistics {
 316     HBA_INT64           SecondsSinceLastReset;
 317     HBA_INT64           TxFrames;
 318     HBA_INT64           TxWords;
 319     HBA_INT64           RxFrames;
 320     HBA_INT64           RxWords;
 321     HBA_INT64           LIPCount;
 322     HBA_INT64           NOSCount;
 323     HBA_INT64           ErrorFrames;
 324     HBA_INT64           DumpedFrames;
 325     HBA_INT64           LinkFailureCount;
 326     HBA_INT64           LossOfSyncCount;
 327     HBA_INT64           LossOfSignalCount;
 328     HBA_INT64           PrimitiveSeqProtocolErrCount;
 329     HBA_INT64           InvalidTxWordCount;
 330     HBA_INT64           InvalidCRCCount;
 331 } HBA_PORTSTATISTICS, *PHBA_PORTSTATISTICS;
 332 
 333 
 334 
 335 /* 4.2.10               FCP Attributes */
 336 
 337 typedef enum HBA_fcpbindingtype { TO_D_ID, TO_WWN, TO_OTHER } HBA_FCPBINDINGTYPE;
 338 
 339 typedef struct HBA_ScsiId {
 340     char                OSDeviceName[256];      /* \device\ScsiPort3  */
 341     HBA_UINT32          ScsiBusNumber;          /* Bus on the HBA */
 342     HBA_UINT32          ScsiTargetNumber;       /* SCSI Target ID to OS */
 343     HBA_UINT32          ScsiOSLun;
 344 } HBA_SCSIID, *PHBA_SCSIID;
 345 
 346 typedef struct HBA_FcpId {
 347     HBA_UINT32          FcId;
 348     HBA_WWN             NodeWWN;
 349     HBA_WWN             PortWWN;
 350     HBA_UINT64          FcpLun;
 351 } HBA_FCPID, *PHBA_FCPID;
 352 
 353 typedef struct HBA_LUID {
 354     char                buffer[256];    /* Unique Device Identifier */
 355 } HBA_LUID, *PHBA_LUID;
 356 
 357 typedef struct HBA_FcpScsiEntry {
 358     HBA_SCSIID          ScsiId;
 359     HBA_FCPID           FcpId;
 360 } HBA_FCPSCSIENTRY, *PHBA_FCPSCSIENTRY;
 361 
 362 typedef struct HBA_FcpScsiEntryV2 {
 363     HBA_SCSIID          ScsiId;
 364     HBA_FCPID           FcpId;
 365     HBA_LUID            LUID;
 366 } HBA_FCPSCSIENTRYV2, *PHBA_FCPSCSIENTRYV2;
 367 
 368 typedef struct HBA_FCPTargetMapping {
 369     HBA_UINT32          NumberOfEntries;
 370     HBA_FCPSCSIENTRY    entry[1];               /* Variable length array
 371                                                  * containing mappings */
 372 } HBA_FCPTARGETMAPPING, *PHBA_FCPTARGETMAPPING;
 373 
 374 typedef struct HBA_FCPTargetMappingV2 {
 375     HBA_UINT32          NumberOfEntries;
 376     HBA_FCPSCSIENTRYV2  entry[1];               /* Variable length array
 377                                                  * containing mappings */
 378 } HBA_FCPTARGETMAPPINGV2, *PHBA_FCPTARGETMAPPINGV2;
 379 
 380 typedef struct HBA_FCPBindingEntry {
 381     HBA_FCPBINDINGTYPE  type;
 382     HBA_SCSIID          ScsiId;
 383     HBA_FCPID           FcpId;                  /* WWN valid only if type is
 384                                                  * to WWN, FcpLun always valid */
 385     HBA_UINT32          FcId;
 386 } HBA_FCPBINDINGENTRY, *PHBA_FCPBINDINGENTRY;
 387 
 388 typedef struct HBA_FCPBinding {
 389     HBA_UINT32          NumberOfEntries;
 390     HBA_FCPBINDINGENTRY entry[1];               /* Variable length array */
 391 } HBA_FCPBINDING, *PHBA_FCPBINDING;
 392 
 393 /* 4.2.11       FC-3 Management Atrributes */
 394 
 395 typedef enum HBA_wwntype { NODE_WWN, PORT_WWN } HBA_WWNTYPE;
 396 
 397 typedef struct HBA_MgmtInfo {
 398     HBA_WWN             wwn;
 399     HBA_UINT32          unittype;
 400     HBA_UINT32          PortId;
 401     HBA_UINT32          NumberOfAttachedNodes;
 402     HBA_UINT16          IPVersion;
 403     HBA_UINT16          UDPPort;
 404     HBA_UINT8           IPAddress[16];
 405     HBA_UINT16          reserved;
 406     HBA_UINT16          TopologyDiscoveryFlags;
 407 } HBA_MGMTINFO, *PHBA_MGMTINFO;
 408 
 409 /* Event Codes */
 410 #define HBA_EVENT_LIP_OCCURRED          1
 411 #define HBA_EVENT_LINK_UP               2
 412 #define HBA_EVENT_LINK_DOWN             3
 413 #define HBA_EVENT_LIP_RESET_OCCURRED    4
 414 #define HBA_EVENT_RSCN                  5
 415 #define HBA_EVENT_PROPRIETARY           0xFFFF
 416 
 417 typedef struct HBA_Link_EventInfo {
 418     HBA_UINT32          PortFcId;               /* Port where event occurred */
 419     HBA_UINT32          Reserved[3];
 420 } HBA_LINK_EVENTINFO, *PHBA_LINK_EVENTINFO;
 421 
 422 typedef struct HBA_RSCN_EventInfo {
 423     HBA_UINT32          PortFcId;               /* Port where event occurred */
 424     HBA_UINT32          NPortPage;              /* Reference FC-FS for RSCN ELS
 425                                                  * "Affected N-Port Pages"*/
 426     HBA_UINT32          Reserved[2];
 427 } HBA_RSCN_EVENTINFO, *PHBA_RSCN_EVENTINFO;
 428 
 429 typedef struct HBA_Pty_EventInfo {
 430     HBA_UINT32 PtyData[4];                      /* Proprietary data */
 431 } HBA_PTY_EVENTINFO, *PHBA_PTY_EVENTINFO;
 432 
 433 typedef struct HBA_EventInfo {
 434     HBA_UINT32          EventCode;
 435     union {
 436         HBA_LINK_EVENTINFO      Link_EventInfo;
 437         HBA_RSCN_EVENTINFO      RSCN_EventInfo;
 438         HBA_PTY_EVENTINFO       Pty_EventInfo;
 439     }                   Event;
 440 } HBA_EVENTINFO, *PHBA_EVENTINFO;
 441 
 442 #ifndef _KERNEL
 443 typedef struct HBA_LibraryAttributes {
 444     HBA_BOOLEAN         final;
 445     char                LibPath[256];
 446     char                VName[256];
 447     char                VVersion[256];
 448     struct tm           build_date;
 449 } HBA_LIBRARYATTRIBUTES, *PHBA_LIBRARYATTRIBUTES;
 450 #endif /* ifndef _KERNEL */
 451 
 452 /* Persistant Binding... */
 453 typedef HBA_UINT32 HBA_BIND_TYPE;
 454 #define HBA_BIND_TO_D_ID                0x0001
 455 #define HBA_BIND_TO_WWPN                0x0002
 456 #define HBA_BIND_TO_WWNN                0x0004
 457 #define HBA_BIND_TO_LUID                0x0008
 458 #define HBA_BIND_TARGETS                0x0800
 459 
 460 /* A bit mask of Rev 2.0 persistent binding capabilities */
 461 typedef HBA_UINT32 HBA_BIND_CAPABILITY;
 462 /* The following are bit flags indicating persistent binding capabilities */
 463 #define HBA_CAN_BIND_TO_D_ID            0x0001
 464 #define HBA_CAN_BIND_TO_WWPN            0x0002
 465 #define HBA_CAN_BIND_TO_WWNN            0x0004
 466 #define HBA_CAN_BIND_TO_LUID            0x0008
 467 #define HBA_CAN_BIND_ANY_LUNS           0x0400
 468 #define HBA_CAN_BIND_TARGETS            0x0800
 469 #define HBA_CAN_BIND_AUTOMAP            0x1000
 470 #define HBA_CAN_BIND_CONFIGURED         0x2000
 471 
 472 #define HBA_BIND_STATUS_DISABLED        0x00
 473 #define HBA_BIND_STATUS_ENABLED         0x01
 474 
 475 typedef HBA_UINT32 HBA_BIND_STATUS;
 476 
 477 #define HBA_BIND_EFFECTIVE_AT_REBOOT    0x00
 478 #define HBA_BIND_EFFECTIVE_IMMEDIATE    0x01
 479 
 480 typedef HBA_UINT32 HBA_BIND_EFFECTIVE;
 481 
 482 typedef struct HBA_FCPBindingEntry2 {
 483     HBA_BIND_TYPE       type;
 484     HBA_SCSIID          ScsiId;
 485     HBA_FCPID           FcpId;
 486     HBA_LUID            LUID;
 487     HBA_STATUS          status;
 488 } HBA_FCPBINDINGENTRY2, *PHBA_FCPBINDINGENTRY2;
 489 
 490 typedef struct HBA_FcpBinding2 {
 491     HBA_UINT32          NumberOfEntries;
 492     HBA_FCPBINDINGENTRY2
 493                         entry[1];       /* Variable length array */
 494 } HBA_FCPBINDING2, *PHBA_FCPBINDING2;
 495 
 496 /* FC-4 Instrumentation */
 497 typedef struct HBA_FC4Statistics {
 498     HBA_INT64           InputRequests;
 499     HBA_INT64           OutputRequests;
 500     HBA_INT64           ControlRequests;
 501     HBA_INT64           InputMegabytes;
 502     HBA_INT64           OutputMegabytes;
 503 } HBA_FC4STATISTICS, *PHBA_FC4STATISTICS;
 504 
 505 
 506 typedef void *  HBA_CALLBACKHANDLE;
 507 /* Adapter Level Events */
 508 #define HBA_EVENT_ADAPTER_UNKNOWN       0x100
 509 #define HBA_EVENT_ADAPTER_ADD           0x101
 510 #define HBA_EVENT_ADAPTER_REMOVE        0x102
 511 #define HBA_EVENT_ADAPTER_CHANGE        0x103
 512 
 513 /* Port Level Events */
 514 #define HBA_EVENT_PORT_UNKNOWN          0x200
 515 #define HBA_EVENT_PORT_OFFLINE          0x201
 516 #define HBA_EVENT_PORT_ONLINE           0x202
 517 #define HBA_EVENT_PORT_NEW_TARGETS      0x203
 518 #define HBA_EVENT_PORT_FABRIC           0x204
 519 
 520 /* Port Statistics Events */
 521 #define HBA_EVENT_PORT_STAT_THRESHOLD   0x301
 522 #define HBA_EVENT_PORT_STAT_GROWTH      0x302
 523 
 524 /* Target Level Events */
 525 #define HBA_EVENT_TARGET_UNKNOWN        0x400
 526 #define HBA_EVENT_TARGET_OFFLINE        0x401
 527 #define HBA_EVENT_TARGET_ONLINE         0x402
 528 #define HBA_EVENT_TARGET_REMOVED        0x403
 529 
 530 /* Fabric Link  Events */
 531 #define HBA_EVENT_LINK_UNKNOWN          0x500
 532 #define HBA_EVENT_LINK_INCIDENT         0x501
 533 
 534 HBA_API HBA_UINT32 HBA_GetVersion();
 535 
 536 /*
 537  * Make sure HBA_LoadLibrary returns before any other threads
 538  * make calls to the library
 539  */
 540 HBA_API HBA_STATUS HBA_LoadLibrary();
 541 
 542 HBA_API HBA_STATUS HBA_FreeLibrary();
 543 
 544 HBA_API HBA_UINT32 HBA_GetNumberOfAdapters();
 545 
 546 HBA_API HBA_STATUS HBA_GetAdapterName(
 547     HBA_UINT32          adapterindex,
 548     char                *adaptername
 549     );
 550 
 551 HBA_API HBA_HANDLE HBA_OpenAdapter(
 552     char*               adaptername
 553     );
 554 
 555 HBA_API HBA_STATUS HBA_OpenAdapterByWWN(
 556     HBA_HANDLE          *handle,
 557     HBA_WWN             wwn
 558     );
 559 
 560 HBA_API void HBA_CloseAdapter(
 561     HBA_HANDLE          handle
 562     );
 563 
 564 HBA_API HBA_STATUS HBA_GetAdapterAttributes(
 565     HBA_HANDLE          handle,
 566     HBA_ADAPTERATTRIBUTES
 567                         *hbaattributes
 568     );
 569 
 570 HBA_API HBA_STATUS HBA_GetAdapterPortAttributes(
 571     HBA_HANDLE          handle,
 572     HBA_UINT32          portindex,
 573     HBA_PORTATTRIBUTES  *portattributes
 574     );
 575 
 576 HBA_API HBA_STATUS HBA_GetPortStatistics(
 577     HBA_HANDLE          handle,
 578     HBA_UINT32          portindex,
 579     HBA_PORTSTATISTICS  *portstatistics
 580     );
 581 
 582 HBA_API HBA_STATUS HBA_GetDiscoveredPortAttributes(
 583     HBA_HANDLE          handle,
 584     HBA_UINT32          portindex,
 585     HBA_UINT32          discoveredportindex,
 586     HBA_PORTATTRIBUTES  *portattributes
 587     );
 588 
 589 HBA_API HBA_STATUS HBA_GetPortAttributesByWWN(
 590     HBA_HANDLE          handle,
 591     HBA_WWN             PortWWN,
 592     HBA_PORTATTRIBUTES  *portattributes
 593     );
 594 
 595 HBA_API HBA_STATUS HBA_SendCTPassThruV2(
 596     HBA_HANDLE          handle,
 597     HBA_WWN             hbaPortWWN,
 598     void                *pReqBuffer,
 599     HBA_UINT32          ReqBufferSize,
 600     void                *pRspBuffer,
 601     HBA_UINT32          *pRspBufferSize
 602     );
 603 
 604 /* Depricated, but supported */
 605 HBA_API HBA_STATUS HBA_SendCTPassThru(
 606     HBA_HANDLE          handle,
 607     void                *pReqBuffer,
 608     HBA_UINT32          ReqBufferSize,
 609     void                *pRspBuffer,
 610     HBA_UINT32          RspBufferSize
 611     );
 612 
 613 HBA_API void HBA_RefreshAdapterConfiguration();
 614 
 615 HBA_API HBA_STATUS HBA_GetEventBuffer(
 616     HBA_HANDLE          handle,
 617     HBA_EVENTINFO       *EventBuffer,
 618     HBA_UINT32          *EventBufferCount
 619     );
 620 
 621 HBA_API HBA_STATUS HBA_SetRNIDMgmtInfo(
 622     HBA_HANDLE          handle,
 623     HBA_MGMTINFO        Info
 624     );
 625 
 626 HBA_API HBA_STATUS HBA_GetRNIDMgmtInfo(
 627     HBA_HANDLE          handle,
 628     HBA_MGMTINFO        *pInfo
 629     );
 630 
 631 HBA_API HBA_STATUS HBA_SendRNIDV2(
 632     HBA_HANDLE          handle,
 633     HBA_WWN             hbaPortWWN,
 634     HBA_WWN             destWWN,
 635     HBA_UINT32          destFCID,
 636     HBA_UINT32          NodeIdDataFormat,
 637     void                *pRspBuffer,
 638     HBA_UINT32          *pRspBufferSize
 639     );
 640 
 641 /* Depricated, but supported */
 642 HBA_API HBA_STATUS HBA_SendRNID(
 643     HBA_HANDLE          handle,
 644     HBA_WWN             wwn,
 645     HBA_WWNTYPE         wwntype,
 646     void                *pRspBuffer,
 647     HBA_UINT32          *pRspBufferSize
 648     );
 649 
 650 HBA_API HBA_STATUS HBA_SendRLS (
 651     HBA_HANDLE          handle,
 652     HBA_WWN             hbaPortWWN,
 653     HBA_WWN             destWWN,
 654     void                *pRspBuffer,
 655     HBA_UINT32          *pRspBufferSize
 656     );
 657 
 658 HBA_API HBA_STATUS HBA_SendRPL (
 659     HBA_HANDLE          handle,
 660     HBA_WWN             hbaPortWWN,
 661     HBA_WWN             agent_wwn,
 662     HBA_UINT32          agent_domain,
 663     HBA_UINT32          portindex,
 664     void                *pRspBuffer,
 665     HBA_UINT32          *pRspBufferSize
 666     );
 667 
 668 HBA_API HBA_STATUS HBA_SendRPS (
 669     HBA_HANDLE          handle,
 670     HBA_WWN             hbaPortWWN,
 671     HBA_WWN             agent_wwn,
 672     HBA_UINT32          agent_domain,
 673     HBA_WWN             object_wwn,
 674     HBA_UINT32          object_port_number,
 675     void                *pRspBuffer,
 676     HBA_UINT32          *pRspBufferSize
 677     );
 678 
 679 HBA_API HBA_STATUS HBA_SendSRL (
 680     HBA_HANDLE          handle,
 681     HBA_WWN             hbaPortWWN,
 682     HBA_WWN             wwn,
 683     HBA_UINT32          domain,
 684     void                *pRspBuffer,
 685     HBA_UINT32          *pRspBufferSize
 686     );
 687 
 688 HBA_API HBA_STATUS HBA_SendLIRR (
 689     HBA_HANDLE          handle,
 690     HBA_WWN             sourceWWN,
 691     HBA_WWN             destWWN,
 692     HBA_UINT8           function,
 693     HBA_UINT8           type,
 694     void                *pRspBuffer,
 695     HBA_UINT32          *pRspBufferSize
 696     );
 697 
 698 
 699 HBA_API HBA_STATUS HBA_GetFC4Statistics (
 700     HBA_HANDLE          handle,
 701     HBA_WWN             portWWN,
 702     HBA_UINT8           FC4type,
 703     HBA_FC4STATISTICS   *pstatistics
 704     );
 705 
 706 HBA_API HBA_STATUS HBA_GetFCPStatistics (
 707     HBA_HANDLE          handle,
 708     const HBA_SCSIID    *lunit,
 709     HBA_FC4STATISTICS   *pstatistics);
 710 
 711 HBA_API void HBA_RefreshInformation(
 712     HBA_HANDLE          handle
 713     );
 714 
 715 HBA_API void HBA_ResetStatistics(
 716     HBA_HANDLE          handle,
 717     HBA_UINT32          portindex
 718     );
 719 
 720 HBA_API HBA_STATUS HBA_GetFcpTargetMapping(
 721     HBA_HANDLE          handle,
 722     HBA_FCPTARGETMAPPING
 723                         *pmapping
 724     );
 725 
 726 HBA_API HBA_STATUS HBA_GetFcpTargetMappingV2(
 727     HBA_HANDLE          handle,
 728     HBA_WWN             hbaPortWWN,
 729     HBA_FCPTARGETMAPPINGV2
 730                         *pmapping
 731     );
 732 
 733 HBA_API HBA_STATUS HBA_GetBindingCapability(
 734     HBA_HANDLE          handle,
 735     HBA_WWN             hbaPortWWN,
 736     HBA_BIND_CAPABILITY *pcapability
 737     );
 738 
 739 HBA_API HBA_STATUS HBA_GetBindingSupport(
 740     HBA_HANDLE          handle,
 741     HBA_WWN             hbaPortWWN,
 742     HBA_BIND_CAPABILITY *pcapability
 743     );
 744 
 745 HBA_API HBA_STATUS HBA_SetBindingSupport(
 746     HBA_HANDLE          handle,
 747     HBA_WWN             hbaPortWWN,
 748     HBA_BIND_CAPABILITY capability
 749     );
 750 
 751 HBA_API HBA_STATUS HBA_SetPersistentBindingV2(
 752     HBA_HANDLE          handle,
 753     HBA_WWN             hbaPortWWN,
 754     const HBA_FCPBINDING2
 755                         *pbinding
 756     );
 757 
 758 HBA_API HBA_STATUS HBA_GetPersistentBindingV2(
 759     HBA_HANDLE          handle,
 760     HBA_WWN             hbaPortWWN,
 761     HBA_FCPBINDING2     *binding
 762     );
 763 
 764 HBA_API HBA_STATUS HBA_RemovePersistentBinding(
 765     HBA_HANDLE          handle,
 766     HBA_WWN             hbaPortWWN,
 767     const HBA_FCPBINDING2
 768                         *pbinding
 769     );
 770 
 771 /* Depricated, but supported */
 772 HBA_API HBA_STATUS HBA_GetFcpPersistentBinding(
 773     HBA_HANDLE          handle,
 774     HBA_FCPBINDING      *binding
 775     );
 776 
 777 HBA_API HBA_STATUS HBA_RemoveAllPersistentBindings(
 778     HBA_HANDLE          handle,
 779     HBA_WWN             hbaPortWWN
 780     );
 781 
 782 HBA_STATUS HBA_ScsiInquiryV2 (
 783     HBA_HANDLE          handle,
 784     HBA_WWN             hbaPortWWN,
 785     HBA_WWN             discoveredPortWWN,
 786     HBA_UINT64          fcLUN,
 787     HBA_UINT8           CDB_Byte1,
 788     HBA_UINT8           CDB_BYte2,
 789     void                *pRspBuffer,
 790     HBA_UINT32          *pRspBufferSize,
 791     HBA_UINT8           *pScsiStatus,
 792     void                *pSenseBuffer,
 793     HBA_UINT32          *pSenseBufferSize
 794     );
 795 
 796 /* Depricated, but supported */
 797 HBA_API HBA_STATUS HBA_SendScsiInquiry (
 798     HBA_HANDLE          handle,
 799     HBA_WWN             PortWWN,
 800     HBA_UINT64          fcLUN,
 801     HBA_UINT8           EVPD,
 802     HBA_UINT32          PageCode,
 803     void                *pRspBuffer,
 804     HBA_UINT32          RspBufferSize,
 805     void                *pSenseBuffer,
 806     HBA_UINT32          SenseBufferSize
 807     );
 808 
 809 HBA_API HBA_STATUS HBA_ScsiReportLUNsV2(
 810     HBA_HANDLE          handle,
 811     HBA_WWN             hbaPortWWN,
 812     HBA_WWN             discoveredPortWWN,
 813     void                *pRespBuffer,
 814     HBA_UINT32          *pRespBufferSize,
 815     HBA_UINT8           *pScsiStatus,
 816     void                *pSenseBuffer,
 817     HBA_UINT32          *pSenseBufferSize
 818     );
 819 
 820 /* Depricated, but supported */
 821 HBA_API HBA_STATUS HBA_SendReportLUNs (
 822     HBA_HANDLE          handle,
 823     HBA_WWN             portWWN,
 824     void                *pRspBuffer,
 825     HBA_UINT32          RspBufferSize,
 826     void                *pSenseBuffer,
 827     HBA_UINT32          SenseBufferSize
 828     );
 829 
 830 HBA_API HBA_STATUS HBA_ScsiReadCapacityV2(
 831     HBA_HANDLE          handle,
 832     HBA_WWN             hbaPortWWN,
 833     HBA_WWN             discoveredPortWWN,
 834     HBA_UINT64          fcLUN,
 835     void                *pRspBuffer,
 836     HBA_UINT32          *pRspBufferSize,
 837     HBA_UINT8           *pScsiStatus,
 838     void                *pSenseBuffer,
 839     HBA_UINT32          *SenseBufferSize
 840     );
 841 
 842 /* Depricated, but supported */
 843 HBA_API HBA_STATUS HBA_SendReadCapacity (
 844     HBA_HANDLE          handle,
 845     HBA_WWN             portWWN,
 846     HBA_UINT64          fcLUN,
 847     void                *pRspBuffer,
 848     HBA_UINT32          RspBufferSize,
 849     void                *pSenseBuffer,
 850     HBA_UINT32          SenseBufferSize
 851     );
 852 
 853 #ifndef _KERNEL
 854 HBA_API HBA_UINT32 HBA_GetVendorLibraryAttributes (
 855     HBA_UINT32          adapter_index,
 856     HBA_LIBRARYATTRIBUTES
 857                         *attributes
 858     );
 859 #endif /* ifndef _KERNEL */
 860 
 861 HBA_API HBA_STATUS HBA_RemoveCallback(
 862     HBA_CALLBACKHANDLE  callbackHandle
 863     );
 864 
 865 HBA_API HBA_STATUS HBA_RegisterForAdapterAddEvents(
 866     void                (*callback) (
 867         void            *data,
 868         HBA_WWN         PortWWN,
 869         HBA_UINT32      eventType
 870         ),
 871     void                *userData,
 872     HBA_CALLBACKHANDLE *callbackHandle
 873     );
 874 
 875 HBA_API HBA_STATUS HBA_RegisterForAdapterEvents(
 876     void                (*callback)(
 877         void            *data,
 878         HBA_WWN         PortWWN,
 879         HBA_UINT32      eventType
 880         ),
 881     void                *userData,
 882     HBA_HANDLE          handle,
 883     HBA_CALLBACKHANDLE  *callbackHandle
 884     );
 885 
 886 HBA_API HBA_STATUS HBA_RegisterForAdapterPortEvents(
 887     void                (*callback)(
 888         void            *data,
 889         HBA_WWN         PortWWN,
 890         HBA_UINT32      eventType,
 891         HBA_UINT32      fabricPortID
 892         ),
 893     void                *userData,
 894     HBA_HANDLE          handle,
 895     HBA_WWN             PortWWN,
 896     HBA_CALLBACKHANDLE *callbackHandle
 897     );
 898 
 899 HBA_API HBA_STATUS HBA_RegisterForAdapterPortStatEvents(
 900     void                (*callback)(
 901         void            *data,
 902         HBA_WWN         PortWWN,
 903         HBA_UINT32      eventType
 904         ),
 905     void                *userData,
 906     HBA_HANDLE          handle,
 907     HBA_WWN             PortWWN,
 908     HBA_PORTSTATISTICS  stats,
 909     HBA_UINT32          statType,
 910     HBA_CALLBACKHANDLE  *callbackHandle
 911     );
 912 
 913 
 914 HBA_API HBA_STATUS HBA_RegisterForTargetEvents(
 915     void                (*callback)(
 916         void            *data,
 917         HBA_WWN         hbaPortWWN,
 918         HBA_WWN         discoveredPortWWN,
 919         HBA_UINT32      eventType
 920         ),
 921     void                *userData,
 922     HBA_HANDLE          handle,
 923     HBA_WWN             hbaPortWWN,
 924     HBA_WWN             discoveredPortWWN,
 925     HBA_CALLBACKHANDLE  *callbackHandle,
 926     HBA_UINT32          allTargets
 927     );
 928 
 929 HBA_API HBA_STATUS HBA_RegisterForLinkEvents(
 930     void                (*callback)
 931     (
 932         void            *data,
 933         HBA_WWN         adapterWWN,
 934         HBA_UINT32      eventType,
 935         void            *pRLIRBuffer,
 936         HBA_UINT32      RLIRBufferSize
 937         ),
 938     void                *userData,
 939     void                *pRLIRBuffer,
 940     HBA_UINT32          RLIRBufferSize,
 941     HBA_HANDLE          handle,
 942     HBA_CALLBACKHANDLE  *callbackHandle
 943 );
 944 
 945 /* Wrapper library specific entry points */
 946 
 947 #ifndef _KERNEL
 948 HBA_API HBA_UINT32 HBA_GetWrapperLibraryAttributes (
 949     HBA_LIBRARYATTRIBUTES
 950                         *attributes
 951 );
 952 #endif /* ifndef _KERNEL */
 953 
 954 #ifdef __cplusplus
 955 }
 956 #endif
 957 
 958 #endif /* _EMLXS_HBAAPI_H */