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_32GBIT            64  /* 32 GBit/sec */
 243 #define HBA_PORTSPEED_NOT_NEGOTIATED    (1<<15)   /* Speed not established */
 244 
 245 
 246 
 247 /* 4.2.4        Class of Service Values - See GS-2 Spec.*/
 248 
 249 typedef HBA_UINT32 HBA_COS;
 250 
 251 
 252 /* 4.2.5        Fc4Types Values */
 253 
 254 typedef struct HBA_fc4types {
 255     HBA_UINT8 bits[32];         /* 32 bytes of FC-4 per GS-2 */
 256 } HBA_FC4TYPES, *PHBA_FC4TYPES;
 257 
 258 /* 4.2.6        Basic Types */
 259 
 260 typedef struct HBA_wwn {
 261     HBA_UINT8 wwn[8];
 262 } HBA_WWN, *PHBA_WWN;
 263 
 264 typedef struct HBA_ipaddress {
 265     int ipversion;              /* see enumerations in RNID */
 266     union
 267     {
 268         unsigned char ipv4address[4];
 269         unsigned char ipv6address[16];
 270     } ipaddress;
 271 } HBA_IPADDRESS, *PHBA_IPADDRESS;
 272 
 273 typedef HBA_INT8        HBA_BOOLEAN;
 274 
 275 /* 4.2.7        Adapter Attributes */
 276 typedef struct hba_AdapterAttributes {
 277     char        Manufacturer[64];       /*Emulex */
 278     char        SerialNumber[64];       /* A12345 */
 279     char        Model[256];             /* QLA2200 */
 280     char        ModelDescription[256];  /* Agilent TachLite */
 281     HBA_WWN     NodeWWN;
 282     char        NodeSymbolicName[256];  /* From GS-3 */
 283     char        HardwareVersion[256];   /* Vendor use */
 284     char        DriverVersion[256];     /* Vendor use */
 285     char        OptionROMVersion[256];  /* Vendor use  - i.e. hardware boot ROM*/
 286     char        FirmwareVersion[256];   /* Vendor use */
 287     HBA_UINT32  VendorSpecificID;       /* Vendor specific */
 288     HBA_UINT32  NumberOfPorts;
 289     char        DriverName[256];        /* Binary path and/or name of driver
 290                                          *file */
 291 } HBA_ADAPTERATTRIBUTES, *PHBA_ADAPTERATTRIBUTES;
 292 
 293 /* 4.2.8        Port Attributes */
 294 typedef struct HBA_PortAttributes {
 295     HBA_WWN             NodeWWN;
 296     HBA_WWN             PortWWN;
 297     HBA_UINT32          PortFcId;
 298     HBA_PORTTYPE        PortType;               /*PTP, Fabric, etc. */
 299     HBA_PORTSTATE       PortState;
 300     HBA_COS             PortSupportedClassofService;
 301     HBA_FC4TYPES        PortSupportedFc4Types;
 302     HBA_FC4TYPES        PortActiveFc4Types;
 303     char                PortSymbolicName[256];
 304     char                OSDeviceName[256];      /* \device\ScsiPort3  */
 305     HBA_PORTSPEED       PortSupportedSpeed;
 306     HBA_PORTSPEED       PortSpeed;
 307     HBA_UINT32          PortMaxFrameSize;
 308     HBA_WWN             FabricName;
 309     HBA_UINT32          NumberofDiscoveredPorts;
 310 } HBA_PORTATTRIBUTES, *PHBA_PORTATTRIBUTES;
 311 
 312 
 313 
 314 /* 4.2.9        Port Statistics */
 315 
 316 typedef struct HBA_PortStatistics {
 317     HBA_INT64           SecondsSinceLastReset;
 318     HBA_INT64           TxFrames;
 319     HBA_INT64           TxWords;
 320     HBA_INT64           RxFrames;
 321     HBA_INT64           RxWords;
 322     HBA_INT64           LIPCount;
 323     HBA_INT64           NOSCount;
 324     HBA_INT64           ErrorFrames;
 325     HBA_INT64           DumpedFrames;
 326     HBA_INT64           LinkFailureCount;
 327     HBA_INT64           LossOfSyncCount;
 328     HBA_INT64           LossOfSignalCount;
 329     HBA_INT64           PrimitiveSeqProtocolErrCount;
 330     HBA_INT64           InvalidTxWordCount;
 331     HBA_INT64           InvalidCRCCount;
 332 } HBA_PORTSTATISTICS, *PHBA_PORTSTATISTICS;
 333 
 334 
 335 
 336 /* 4.2.10               FCP Attributes */
 337 
 338 typedef enum HBA_fcpbindingtype { TO_D_ID, TO_WWN, TO_OTHER } HBA_FCPBINDINGTYPE;
 339 
 340 typedef struct HBA_ScsiId {
 341     char                OSDeviceName[256];      /* \device\ScsiPort3  */
 342     HBA_UINT32          ScsiBusNumber;          /* Bus on the HBA */
 343     HBA_UINT32          ScsiTargetNumber;       /* SCSI Target ID to OS */
 344     HBA_UINT32          ScsiOSLun;
 345 } HBA_SCSIID, *PHBA_SCSIID;
 346 
 347 typedef struct HBA_FcpId {
 348     HBA_UINT32          FcId;
 349     HBA_WWN             NodeWWN;
 350     HBA_WWN             PortWWN;
 351     HBA_UINT64          FcpLun;
 352 } HBA_FCPID, *PHBA_FCPID;
 353 
 354 typedef struct HBA_LUID {
 355     char                buffer[256];    /* Unique Device Identifier */
 356 } HBA_LUID, *PHBA_LUID;
 357 
 358 typedef struct HBA_FcpScsiEntry {
 359     HBA_SCSIID          ScsiId;
 360     HBA_FCPID           FcpId;
 361 } HBA_FCPSCSIENTRY, *PHBA_FCPSCSIENTRY;
 362 
 363 typedef struct HBA_FcpScsiEntryV2 {
 364     HBA_SCSIID          ScsiId;
 365     HBA_FCPID           FcpId;
 366     HBA_LUID            LUID;
 367 } HBA_FCPSCSIENTRYV2, *PHBA_FCPSCSIENTRYV2;
 368 
 369 typedef struct HBA_FCPTargetMapping {
 370     HBA_UINT32          NumberOfEntries;
 371     HBA_FCPSCSIENTRY    entry[1];               /* Variable length array
 372                                                  * containing mappings */
 373 } HBA_FCPTARGETMAPPING, *PHBA_FCPTARGETMAPPING;
 374 
 375 typedef struct HBA_FCPTargetMappingV2 {
 376     HBA_UINT32          NumberOfEntries;
 377     HBA_FCPSCSIENTRYV2  entry[1];               /* Variable length array
 378                                                  * containing mappings */
 379 } HBA_FCPTARGETMAPPINGV2, *PHBA_FCPTARGETMAPPINGV2;
 380 
 381 typedef struct HBA_FCPBindingEntry {
 382     HBA_FCPBINDINGTYPE  type;
 383     HBA_SCSIID          ScsiId;
 384     HBA_FCPID           FcpId;                  /* WWN valid only if type is
 385                                                  * to WWN, FcpLun always valid */
 386     HBA_UINT32          FcId;
 387 } HBA_FCPBINDINGENTRY, *PHBA_FCPBINDINGENTRY;
 388 
 389 typedef struct HBA_FCPBinding {
 390     HBA_UINT32          NumberOfEntries;
 391     HBA_FCPBINDINGENTRY entry[1];               /* Variable length array */
 392 } HBA_FCPBINDING, *PHBA_FCPBINDING;
 393 
 394 /* 4.2.11       FC-3 Management Atrributes */
 395 
 396 typedef enum HBA_wwntype { NODE_WWN, PORT_WWN } HBA_WWNTYPE;
 397 
 398 typedef struct HBA_MgmtInfo {
 399     HBA_WWN             wwn;
 400     HBA_UINT32          unittype;
 401     HBA_UINT32          PortId;
 402     HBA_UINT32          NumberOfAttachedNodes;
 403     HBA_UINT16          IPVersion;
 404     HBA_UINT16          UDPPort;
 405     HBA_UINT8           IPAddress[16];
 406     HBA_UINT16          reserved;
 407     HBA_UINT16          TopologyDiscoveryFlags;
 408 } HBA_MGMTINFO, *PHBA_MGMTINFO;
 409 
 410 /* Event Codes */
 411 #define HBA_EVENT_LIP_OCCURRED          1
 412 #define HBA_EVENT_LINK_UP               2
 413 #define HBA_EVENT_LINK_DOWN             3
 414 #define HBA_EVENT_LIP_RESET_OCCURRED    4
 415 #define HBA_EVENT_RSCN                  5
 416 #define HBA_EVENT_PROPRIETARY           0xFFFF
 417 
 418 typedef struct HBA_Link_EventInfo {
 419     HBA_UINT32          PortFcId;               /* Port where event occurred */
 420     HBA_UINT32          Reserved[3];
 421 } HBA_LINK_EVENTINFO, *PHBA_LINK_EVENTINFO;
 422 
 423 typedef struct HBA_RSCN_EventInfo {
 424     HBA_UINT32          PortFcId;               /* Port where event occurred */
 425     HBA_UINT32          NPortPage;              /* Reference FC-FS for RSCN ELS
 426                                                  * "Affected N-Port Pages"*/
 427     HBA_UINT32          Reserved[2];
 428 } HBA_RSCN_EVENTINFO, *PHBA_RSCN_EVENTINFO;
 429 
 430 typedef struct HBA_Pty_EventInfo {
 431     HBA_UINT32 PtyData[4];                      /* Proprietary data */
 432 } HBA_PTY_EVENTINFO, *PHBA_PTY_EVENTINFO;
 433 
 434 typedef struct HBA_EventInfo {
 435     HBA_UINT32          EventCode;
 436     union {
 437         HBA_LINK_EVENTINFO      Link_EventInfo;
 438         HBA_RSCN_EVENTINFO      RSCN_EventInfo;
 439         HBA_PTY_EVENTINFO       Pty_EventInfo;
 440     }                   Event;
 441 } HBA_EVENTINFO, *PHBA_EVENTINFO;
 442 
 443 #ifndef _KERNEL
 444 typedef struct HBA_LibraryAttributes {
 445     HBA_BOOLEAN         final;
 446     char                LibPath[256];
 447     char                VName[256];
 448     char                VVersion[256];
 449     struct tm           build_date;
 450 } HBA_LIBRARYATTRIBUTES, *PHBA_LIBRARYATTRIBUTES;
 451 #endif /* ifndef _KERNEL */
 452 
 453 /* Persistant Binding... */
 454 typedef HBA_UINT32 HBA_BIND_TYPE;
 455 #define HBA_BIND_TO_D_ID                0x0001
 456 #define HBA_BIND_TO_WWPN                0x0002
 457 #define HBA_BIND_TO_WWNN                0x0004
 458 #define HBA_BIND_TO_LUID                0x0008
 459 #define HBA_BIND_TARGETS                0x0800
 460 
 461 /* A bit mask of Rev 2.0 persistent binding capabilities */
 462 typedef HBA_UINT32 HBA_BIND_CAPABILITY;
 463 /* The following are bit flags indicating persistent binding capabilities */
 464 #define HBA_CAN_BIND_TO_D_ID            0x0001
 465 #define HBA_CAN_BIND_TO_WWPN            0x0002
 466 #define HBA_CAN_BIND_TO_WWNN            0x0004
 467 #define HBA_CAN_BIND_TO_LUID            0x0008
 468 #define HBA_CAN_BIND_ANY_LUNS           0x0400
 469 #define HBA_CAN_BIND_TARGETS            0x0800
 470 #define HBA_CAN_BIND_AUTOMAP            0x1000
 471 #define HBA_CAN_BIND_CONFIGURED         0x2000
 472 
 473 #define HBA_BIND_STATUS_DISABLED        0x00
 474 #define HBA_BIND_STATUS_ENABLED         0x01
 475 
 476 typedef HBA_UINT32 HBA_BIND_STATUS;
 477 
 478 #define HBA_BIND_EFFECTIVE_AT_REBOOT    0x00
 479 #define HBA_BIND_EFFECTIVE_IMMEDIATE    0x01
 480 
 481 typedef HBA_UINT32 HBA_BIND_EFFECTIVE;
 482 
 483 typedef struct HBA_FCPBindingEntry2 {
 484     HBA_BIND_TYPE       type;
 485     HBA_SCSIID          ScsiId;
 486     HBA_FCPID           FcpId;
 487     HBA_LUID            LUID;
 488     HBA_STATUS          status;
 489 } HBA_FCPBINDINGENTRY2, *PHBA_FCPBINDINGENTRY2;
 490 
 491 typedef struct HBA_FcpBinding2 {
 492     HBA_UINT32          NumberOfEntries;
 493     HBA_FCPBINDINGENTRY2
 494                         entry[1];       /* Variable length array */
 495 } HBA_FCPBINDING2, *PHBA_FCPBINDING2;
 496 
 497 /* FC-4 Instrumentation */
 498 typedef struct HBA_FC4Statistics {
 499     HBA_INT64           InputRequests;
 500     HBA_INT64           OutputRequests;
 501     HBA_INT64           ControlRequests;
 502     HBA_INT64           InputMegabytes;
 503     HBA_INT64           OutputMegabytes;
 504 } HBA_FC4STATISTICS, *PHBA_FC4STATISTICS;
 505 
 506 
 507 typedef void *  HBA_CALLBACKHANDLE;
 508 /* Adapter Level Events */
 509 #define HBA_EVENT_ADAPTER_UNKNOWN       0x100
 510 #define HBA_EVENT_ADAPTER_ADD           0x101
 511 #define HBA_EVENT_ADAPTER_REMOVE        0x102
 512 #define HBA_EVENT_ADAPTER_CHANGE        0x103
 513 
 514 /* Port Level Events */
 515 #define HBA_EVENT_PORT_UNKNOWN          0x200
 516 #define HBA_EVENT_PORT_OFFLINE          0x201
 517 #define HBA_EVENT_PORT_ONLINE           0x202
 518 #define HBA_EVENT_PORT_NEW_TARGETS      0x203
 519 #define HBA_EVENT_PORT_FABRIC           0x204
 520 
 521 /* Port Statistics Events */
 522 #define HBA_EVENT_PORT_STAT_THRESHOLD   0x301
 523 #define HBA_EVENT_PORT_STAT_GROWTH      0x302
 524 
 525 /* Target Level Events */
 526 #define HBA_EVENT_TARGET_UNKNOWN        0x400
 527 #define HBA_EVENT_TARGET_OFFLINE        0x401
 528 #define HBA_EVENT_TARGET_ONLINE         0x402
 529 #define HBA_EVENT_TARGET_REMOVED        0x403
 530 
 531 /* Fabric Link  Events */
 532 #define HBA_EVENT_LINK_UNKNOWN          0x500
 533 #define HBA_EVENT_LINK_INCIDENT         0x501
 534 
 535 HBA_API HBA_UINT32 HBA_GetVersion();
 536 
 537 /*
 538  * Make sure HBA_LoadLibrary returns before any other threads
 539  * make calls to the library
 540  */
 541 HBA_API HBA_STATUS HBA_LoadLibrary();
 542 
 543 HBA_API HBA_STATUS HBA_FreeLibrary();
 544 
 545 HBA_API HBA_UINT32 HBA_GetNumberOfAdapters();
 546 
 547 HBA_API HBA_STATUS HBA_GetAdapterName(
 548     HBA_UINT32          adapterindex,
 549     char                *adaptername
 550     );
 551 
 552 HBA_API HBA_HANDLE HBA_OpenAdapter(
 553     char*               adaptername
 554     );
 555 
 556 HBA_API HBA_STATUS HBA_OpenAdapterByWWN(
 557     HBA_HANDLE          *handle,
 558     HBA_WWN             wwn
 559     );
 560 
 561 HBA_API void HBA_CloseAdapter(
 562     HBA_HANDLE          handle
 563     );
 564 
 565 HBA_API HBA_STATUS HBA_GetAdapterAttributes(
 566     HBA_HANDLE          handle,
 567     HBA_ADAPTERATTRIBUTES
 568                         *hbaattributes
 569     );
 570 
 571 HBA_API HBA_STATUS HBA_GetAdapterPortAttributes(
 572     HBA_HANDLE          handle,
 573     HBA_UINT32          portindex,
 574     HBA_PORTATTRIBUTES  *portattributes
 575     );
 576 
 577 HBA_API HBA_STATUS HBA_GetPortStatistics(
 578     HBA_HANDLE          handle,
 579     HBA_UINT32          portindex,
 580     HBA_PORTSTATISTICS  *portstatistics
 581     );
 582 
 583 HBA_API HBA_STATUS HBA_GetDiscoveredPortAttributes(
 584     HBA_HANDLE          handle,
 585     HBA_UINT32          portindex,
 586     HBA_UINT32          discoveredportindex,
 587     HBA_PORTATTRIBUTES  *portattributes
 588     );
 589 
 590 HBA_API HBA_STATUS HBA_GetPortAttributesByWWN(
 591     HBA_HANDLE          handle,
 592     HBA_WWN             PortWWN,
 593     HBA_PORTATTRIBUTES  *portattributes
 594     );
 595 
 596 HBA_API HBA_STATUS HBA_SendCTPassThruV2(
 597     HBA_HANDLE          handle,
 598     HBA_WWN             hbaPortWWN,
 599     void                *pReqBuffer,
 600     HBA_UINT32          ReqBufferSize,
 601     void                *pRspBuffer,
 602     HBA_UINT32          *pRspBufferSize
 603     );
 604 
 605 /* Depricated, but supported */
 606 HBA_API HBA_STATUS HBA_SendCTPassThru(
 607     HBA_HANDLE          handle,
 608     void                *pReqBuffer,
 609     HBA_UINT32          ReqBufferSize,
 610     void                *pRspBuffer,
 611     HBA_UINT32          RspBufferSize
 612     );
 613 
 614 HBA_API void HBA_RefreshAdapterConfiguration();
 615 
 616 HBA_API HBA_STATUS HBA_GetEventBuffer(
 617     HBA_HANDLE          handle,
 618     HBA_EVENTINFO       *EventBuffer,
 619     HBA_UINT32          *EventBufferCount
 620     );
 621 
 622 HBA_API HBA_STATUS HBA_SetRNIDMgmtInfo(
 623     HBA_HANDLE          handle,
 624     HBA_MGMTINFO        Info
 625     );
 626 
 627 HBA_API HBA_STATUS HBA_GetRNIDMgmtInfo(
 628     HBA_HANDLE          handle,
 629     HBA_MGMTINFO        *pInfo
 630     );
 631 
 632 HBA_API HBA_STATUS HBA_SendRNIDV2(
 633     HBA_HANDLE          handle,
 634     HBA_WWN             hbaPortWWN,
 635     HBA_WWN             destWWN,
 636     HBA_UINT32          destFCID,
 637     HBA_UINT32          NodeIdDataFormat,
 638     void                *pRspBuffer,
 639     HBA_UINT32          *pRspBufferSize
 640     );
 641 
 642 /* Depricated, but supported */
 643 HBA_API HBA_STATUS HBA_SendRNID(
 644     HBA_HANDLE          handle,
 645     HBA_WWN             wwn,
 646     HBA_WWNTYPE         wwntype,
 647     void                *pRspBuffer,
 648     HBA_UINT32          *pRspBufferSize
 649     );
 650 
 651 HBA_API HBA_STATUS HBA_SendRLS (
 652     HBA_HANDLE          handle,
 653     HBA_WWN             hbaPortWWN,
 654     HBA_WWN             destWWN,
 655     void                *pRspBuffer,
 656     HBA_UINT32          *pRspBufferSize
 657     );
 658 
 659 HBA_API HBA_STATUS HBA_SendRPL (
 660     HBA_HANDLE          handle,
 661     HBA_WWN             hbaPortWWN,
 662     HBA_WWN             agent_wwn,
 663     HBA_UINT32          agent_domain,
 664     HBA_UINT32          portindex,
 665     void                *pRspBuffer,
 666     HBA_UINT32          *pRspBufferSize
 667     );
 668 
 669 HBA_API HBA_STATUS HBA_SendRPS (
 670     HBA_HANDLE          handle,
 671     HBA_WWN             hbaPortWWN,
 672     HBA_WWN             agent_wwn,
 673     HBA_UINT32          agent_domain,
 674     HBA_WWN             object_wwn,
 675     HBA_UINT32          object_port_number,
 676     void                *pRspBuffer,
 677     HBA_UINT32          *pRspBufferSize
 678     );
 679 
 680 HBA_API HBA_STATUS HBA_SendSRL (
 681     HBA_HANDLE          handle,
 682     HBA_WWN             hbaPortWWN,
 683     HBA_WWN             wwn,
 684     HBA_UINT32          domain,
 685     void                *pRspBuffer,
 686     HBA_UINT32          *pRspBufferSize
 687     );
 688 
 689 HBA_API HBA_STATUS HBA_SendLIRR (
 690     HBA_HANDLE          handle,
 691     HBA_WWN             sourceWWN,
 692     HBA_WWN             destWWN,
 693     HBA_UINT8           function,
 694     HBA_UINT8           type,
 695     void                *pRspBuffer,
 696     HBA_UINT32          *pRspBufferSize
 697     );
 698 
 699 
 700 HBA_API HBA_STATUS HBA_GetFC4Statistics (
 701     HBA_HANDLE          handle,
 702     HBA_WWN             portWWN,
 703     HBA_UINT8           FC4type,
 704     HBA_FC4STATISTICS   *pstatistics
 705     );
 706 
 707 HBA_API HBA_STATUS HBA_GetFCPStatistics (
 708     HBA_HANDLE          handle,
 709     const HBA_SCSIID    *lunit,
 710     HBA_FC4STATISTICS   *pstatistics);
 711 
 712 HBA_API void HBA_RefreshInformation(
 713     HBA_HANDLE          handle
 714     );
 715 
 716 HBA_API void HBA_ResetStatistics(
 717     HBA_HANDLE          handle,
 718     HBA_UINT32          portindex
 719     );
 720 
 721 HBA_API HBA_STATUS HBA_GetFcpTargetMapping(
 722     HBA_HANDLE          handle,
 723     HBA_FCPTARGETMAPPING
 724                         *pmapping
 725     );
 726 
 727 HBA_API HBA_STATUS HBA_GetFcpTargetMappingV2(
 728     HBA_HANDLE          handle,
 729     HBA_WWN             hbaPortWWN,
 730     HBA_FCPTARGETMAPPINGV2
 731                         *pmapping
 732     );
 733 
 734 HBA_API HBA_STATUS HBA_GetBindingCapability(
 735     HBA_HANDLE          handle,
 736     HBA_WWN             hbaPortWWN,
 737     HBA_BIND_CAPABILITY *pcapability
 738     );
 739 
 740 HBA_API HBA_STATUS HBA_GetBindingSupport(
 741     HBA_HANDLE          handle,
 742     HBA_WWN             hbaPortWWN,
 743     HBA_BIND_CAPABILITY *pcapability
 744     );
 745 
 746 HBA_API HBA_STATUS HBA_SetBindingSupport(
 747     HBA_HANDLE          handle,
 748     HBA_WWN             hbaPortWWN,
 749     HBA_BIND_CAPABILITY capability
 750     );
 751 
 752 HBA_API HBA_STATUS HBA_SetPersistentBindingV2(
 753     HBA_HANDLE          handle,
 754     HBA_WWN             hbaPortWWN,
 755     const HBA_FCPBINDING2
 756                         *pbinding
 757     );
 758 
 759 HBA_API HBA_STATUS HBA_GetPersistentBindingV2(
 760     HBA_HANDLE          handle,
 761     HBA_WWN             hbaPortWWN,
 762     HBA_FCPBINDING2     *binding
 763     );
 764 
 765 HBA_API HBA_STATUS HBA_RemovePersistentBinding(
 766     HBA_HANDLE          handle,
 767     HBA_WWN             hbaPortWWN,
 768     const HBA_FCPBINDING2
 769                         *pbinding
 770     );
 771 
 772 /* Depricated, but supported */
 773 HBA_API HBA_STATUS HBA_GetFcpPersistentBinding(
 774     HBA_HANDLE          handle,
 775     HBA_FCPBINDING      *binding
 776     );
 777 
 778 HBA_API HBA_STATUS HBA_RemoveAllPersistentBindings(
 779     HBA_HANDLE          handle,
 780     HBA_WWN             hbaPortWWN
 781     );
 782 
 783 HBA_STATUS HBA_ScsiInquiryV2 (
 784     HBA_HANDLE          handle,
 785     HBA_WWN             hbaPortWWN,
 786     HBA_WWN             discoveredPortWWN,
 787     HBA_UINT64          fcLUN,
 788     HBA_UINT8           CDB_Byte1,
 789     HBA_UINT8           CDB_BYte2,
 790     void                *pRspBuffer,
 791     HBA_UINT32          *pRspBufferSize,
 792     HBA_UINT8           *pScsiStatus,
 793     void                *pSenseBuffer,
 794     HBA_UINT32          *pSenseBufferSize
 795     );
 796 
 797 /* Depricated, but supported */
 798 HBA_API HBA_STATUS HBA_SendScsiInquiry (
 799     HBA_HANDLE          handle,
 800     HBA_WWN             PortWWN,
 801     HBA_UINT64          fcLUN,
 802     HBA_UINT8           EVPD,
 803     HBA_UINT32          PageCode,
 804     void                *pRspBuffer,
 805     HBA_UINT32          RspBufferSize,
 806     void                *pSenseBuffer,
 807     HBA_UINT32          SenseBufferSize
 808     );
 809 
 810 HBA_API HBA_STATUS HBA_ScsiReportLUNsV2(
 811     HBA_HANDLE          handle,
 812     HBA_WWN             hbaPortWWN,
 813     HBA_WWN             discoveredPortWWN,
 814     void                *pRespBuffer,
 815     HBA_UINT32          *pRespBufferSize,
 816     HBA_UINT8           *pScsiStatus,
 817     void                *pSenseBuffer,
 818     HBA_UINT32          *pSenseBufferSize
 819     );
 820 
 821 /* Depricated, but supported */
 822 HBA_API HBA_STATUS HBA_SendReportLUNs (
 823     HBA_HANDLE          handle,
 824     HBA_WWN             portWWN,
 825     void                *pRspBuffer,
 826     HBA_UINT32          RspBufferSize,
 827     void                *pSenseBuffer,
 828     HBA_UINT32          SenseBufferSize
 829     );
 830 
 831 HBA_API HBA_STATUS HBA_ScsiReadCapacityV2(
 832     HBA_HANDLE          handle,
 833     HBA_WWN             hbaPortWWN,
 834     HBA_WWN             discoveredPortWWN,
 835     HBA_UINT64          fcLUN,
 836     void                *pRspBuffer,
 837     HBA_UINT32          *pRspBufferSize,
 838     HBA_UINT8           *pScsiStatus,
 839     void                *pSenseBuffer,
 840     HBA_UINT32          *SenseBufferSize
 841     );
 842 
 843 /* Depricated, but supported */
 844 HBA_API HBA_STATUS HBA_SendReadCapacity (
 845     HBA_HANDLE          handle,
 846     HBA_WWN             portWWN,
 847     HBA_UINT64          fcLUN,
 848     void                *pRspBuffer,
 849     HBA_UINT32          RspBufferSize,
 850     void                *pSenseBuffer,
 851     HBA_UINT32          SenseBufferSize
 852     );
 853 
 854 #ifndef _KERNEL
 855 HBA_API HBA_UINT32 HBA_GetVendorLibraryAttributes (
 856     HBA_UINT32          adapter_index,
 857     HBA_LIBRARYATTRIBUTES
 858                         *attributes
 859     );
 860 #endif /* ifndef _KERNEL */
 861 
 862 HBA_API HBA_STATUS HBA_RemoveCallback(
 863     HBA_CALLBACKHANDLE  callbackHandle
 864     );
 865 
 866 HBA_API HBA_STATUS HBA_RegisterForAdapterAddEvents(
 867     void                (*callback) (
 868         void            *data,
 869         HBA_WWN         PortWWN,
 870         HBA_UINT32      eventType
 871         ),
 872     void                *userData,
 873     HBA_CALLBACKHANDLE *callbackHandle
 874     );
 875 
 876 HBA_API HBA_STATUS HBA_RegisterForAdapterEvents(
 877     void                (*callback)(
 878         void            *data,
 879         HBA_WWN         PortWWN,
 880         HBA_UINT32      eventType
 881         ),
 882     void                *userData,
 883     HBA_HANDLE          handle,
 884     HBA_CALLBACKHANDLE  *callbackHandle
 885     );
 886 
 887 HBA_API HBA_STATUS HBA_RegisterForAdapterPortEvents(
 888     void                (*callback)(
 889         void            *data,
 890         HBA_WWN         PortWWN,
 891         HBA_UINT32      eventType,
 892         HBA_UINT32      fabricPortID
 893         ),
 894     void                *userData,
 895     HBA_HANDLE          handle,
 896     HBA_WWN             PortWWN,
 897     HBA_CALLBACKHANDLE *callbackHandle
 898     );
 899 
 900 HBA_API HBA_STATUS HBA_RegisterForAdapterPortStatEvents(
 901     void                (*callback)(
 902         void            *data,
 903         HBA_WWN         PortWWN,
 904         HBA_UINT32      eventType
 905         ),
 906     void                *userData,
 907     HBA_HANDLE          handle,
 908     HBA_WWN             PortWWN,
 909     HBA_PORTSTATISTICS  stats,
 910     HBA_UINT32          statType,
 911     HBA_CALLBACKHANDLE  *callbackHandle
 912     );
 913 
 914 
 915 HBA_API HBA_STATUS HBA_RegisterForTargetEvents(
 916     void                (*callback)(
 917         void            *data,
 918         HBA_WWN         hbaPortWWN,
 919         HBA_WWN         discoveredPortWWN,
 920         HBA_UINT32      eventType
 921         ),
 922     void                *userData,
 923     HBA_HANDLE          handle,
 924     HBA_WWN             hbaPortWWN,
 925     HBA_WWN             discoveredPortWWN,
 926     HBA_CALLBACKHANDLE  *callbackHandle,
 927     HBA_UINT32          allTargets
 928     );
 929 
 930 HBA_API HBA_STATUS HBA_RegisterForLinkEvents(
 931     void                (*callback)
 932     (
 933         void            *data,
 934         HBA_WWN         adapterWWN,
 935         HBA_UINT32      eventType,
 936         void            *pRLIRBuffer,
 937         HBA_UINT32      RLIRBufferSize
 938         ),
 939     void                *userData,
 940     void                *pRLIRBuffer,
 941     HBA_UINT32          RLIRBufferSize,
 942     HBA_HANDLE          handle,
 943     HBA_CALLBACKHANDLE  *callbackHandle
 944 );
 945 
 946 /* Wrapper library specific entry points */
 947 
 948 #ifndef _KERNEL
 949 HBA_API HBA_UINT32 HBA_GetWrapperLibraryAttributes (
 950     HBA_LIBRARYATTRIBUTES
 951                         *attributes
 952 );
 953 #endif /* ifndef _KERNEL */
 954 
 955 #ifdef __cplusplus
 956 }
 957 #endif
 958 
 959 #endif /* _EMLXS_HBAAPI_H */