19e86db79SHyon Kim /*
29e86db79SHyon Kim * ************************************************************************
39e86db79SHyon Kim * Description
49e86db79SHyon Kim * HBAAPILIB.c - Implements a sample common (wrapper) HBA API library
59e86db79SHyon Kim *
69e86db79SHyon Kim * License:
79e86db79SHyon Kim * The contents of this file are subject to the SNIA Public License
89e86db79SHyon Kim * Version 1.0 (the "License"); you may not use this file except in
99e86db79SHyon Kim * compliance with the License. You may obtain a copy of the License at
109e86db79SHyon Kim *
119e86db79SHyon Kim * /http://www.snia.org/English/Resources/Code/OpenSource.html
129e86db79SHyon Kim *
139e86db79SHyon Kim * Software distributed under the License is distributed on an "AS IS"
149e86db79SHyon Kim * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
159e86db79SHyon Kim * the License for the specific language governing rights and limitations
169e86db79SHyon Kim * under the License.
179e86db79SHyon Kim *
189e86db79SHyon Kim * The Original Code is SNIA HBA API Wrapper Library
199e86db79SHyon Kim *
209e86db79SHyon Kim * The Initial Developer of the Original Code is:
219e86db79SHyon Kim * Benjamin F. Kuo, Troika Networks, Inc. (benk@troikanetworks.com)
229e86db79SHyon Kim *
239e86db79SHyon Kim * Contributor(s):
249e86db79SHyon Kim * Tuan Lam, QLogic Corp. (t_lam@qlc.com)
259e86db79SHyon Kim * Dan Willie, Emulex Corp. (Dan.Willie@emulex.com)
269e86db79SHyon Kim * Dixon Hutchinson, Legato Systems, Inc. (dhutchin@legato.com)
279e86db79SHyon Kim * David Dillard, VERITAS Software Corp. (david.dillard@veritas.com)
289e86db79SHyon Kim *
299e86db79SHyon Kim * ************************************************************************
309e86db79SHyon Kim *
319e86db79SHyon Kim * Adding on SM-HBA support
329e86db79SHyon Kim *
339e86db79SHyon Kim * The implementation includes Three different categories functions to support
349e86db79SHyon Kim * both HBAAPI and SM-HBA through the same library.
359e86db79SHyon Kim *
369e86db79SHyon Kim * SM-HBA unique interface:
379e86db79SHyon Kim * 1. CHECKLIBRARYANDVERSION(SMHBA) : match SMHBA VSL
389e86db79SHyon Kim * Or checking specifically if version is SMHBA beforehand.
399e86db79SHyon Kim * 2. resolved to ftable.smhbafunctiontable.{interface}
409e86db79SHyon Kim * HBAAPIV2 unique functions
419e86db79SHyon Kim * 1. CHECKLIBRARYANDVERSION(HBAAPIV2) : validate and match HBAAPI V2 VSL.
429e86db79SHyon Kim * Or checking specifically if version is HBAAPIV2 beforehand.
439e86db79SHyon Kim * 2. resolved to ftable.functiontable.{interface}
449e86db79SHyon Kim * Common interface between SM-HBA and HBAAPIV2.
459e86db79SHyon Kim * 1. CHECKLIBRARY() : to validate the VSL.
469e86db79SHyon Kim * 2. FUNCCOMMON macro to map the appropriate entry point table
479e86db79SHyon Kim * (union ftable).
489e86db79SHyon Kim * 3. If the interface is not supported by HBAAPI(Version 1)
499e86db79SHyon Kim * the funtiion ptr will be set to NULL.
509e86db79SHyon Kim * Common interface between HBAAPI and HBAAPIV2.
519e86db79SHyon Kim * 1. Check if version is not SMHBA).
529e86db79SHyon Kim * 2. ftable.functiontalbe.(interface)
539e86db79SHyon Kim *
549e86db79SHyon Kim * ************************************************************************
559e86db79SHyon Kim */
569e86db79SHyon Kim /*
579e86db79SHyon Kim * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
589e86db79SHyon Kim * Use is subject to license terms.
599e86db79SHyon Kim */
609e86db79SHyon Kim
619e86db79SHyon Kim #ifdef WIN32
629e86db79SHyon Kim #include <windows.h>
639e86db79SHyon Kim #include <string.h>
649e86db79SHyon Kim /*
659e86db79SHyon Kim * Next define forces entry points in the dll to be exported
669e86db79SHyon Kim * See hbaapi.h to see what it does.
679e86db79SHyon Kim */
689e86db79SHyon Kim #define HBAAPI_EXPORTS
699e86db79SHyon Kim #else
709e86db79SHyon Kim #include <dlfcn.h>
719e86db79SHyon Kim #include <strings.h>
729e86db79SHyon Kim #endif
739e86db79SHyon Kim #include <stdio.h>
749e86db79SHyon Kim #include <time.h>
759e86db79SHyon Kim #include "smhbaapi.h"
769e86db79SHyon Kim #include "vendorsmhbaapi.h"
779e86db79SHyon Kim #include <stdlib.h>
789e86db79SHyon Kim #ifdef USESYSLOG
799e86db79SHyon Kim #include <syslog.h>
809e86db79SHyon Kim #endif
819e86db79SHyon Kim #ifdef SOLARIS
829e86db79SHyon Kim #include <link.h>
839e86db79SHyon Kim #include <limits.h>
849e86db79SHyon Kim static int *handle;
859e86db79SHyon Kim static Link_map *map, *mp;
869e86db79SHyon Kim #endif
879e86db79SHyon Kim
889e86db79SHyon Kim /*
899e86db79SHyon Kim * LIBRARY_NUM is a shortcut to figure out which library we need to call.
909e86db79SHyon Kim * The top 16 bits of handle are the library index
919e86db79SHyon Kim */
929e86db79SHyon Kim #define LIBRARY_NUM(handle) ((handle)>>16)
939e86db79SHyon Kim
949e86db79SHyon Kim /*
959e86db79SHyon Kim * VENDOR_HANDLE turns a global library handle into a vendor specific handle,
969e86db79SHyon Kim * with all upper 16 bits set to 0
979e86db79SHyon Kim */
989e86db79SHyon Kim #define VENDOR_HANDLE(handle) ((handle)&0xFFFF)
999e86db79SHyon Kim
1009e86db79SHyon Kim #define HBA_HANDLE_FROM_LOCAL(library, vendor) \
1019e86db79SHyon Kim (((library)<<16) | ((vendor)&0x0000FFFF))
1029e86db79SHyon Kim
1039e86db79SHyon Kim int _hbaapi_debuglevel = 0;
1049e86db79SHyon Kim #define DEBUG(L, STR, A1, A2, A3)
1059e86db79SHyon Kim
1069e86db79SHyon Kim #if defined(USESYSLOG) && defined(USELOGFILE)
1079e86db79SHyon Kim FILE *_hbaapi_debug_fd = NULL;
1089e86db79SHyon Kim int _hbaapi_sysloginit = 0;
1099e86db79SHyon Kim #undef DEBUG
1109e86db79SHyon Kim #ifdef WIN32
1119e86db79SHyon Kim #define DEBUG(L, STR, A1, A2, A3)\
1129e86db79SHyon Kim if ((L) <= _hbaapi_debuglevel) {\
1139e86db79SHyon Kim if (_hbaapi_sysloginit == 0) {\
1149e86db79SHyon Kim openlog("HBAAPI", LOG_PID|LOG_ODELAY, LOG_USER);\
1159e86db79SHyon Kim _hbaapi_sysloginit = 1;\
1169e86db79SHyon Kim }\
1179e86db79SHyon Kim syslog(LOG_INFO, (STR), (A1), (A2), (A3));\
1189e86db79SHyon Kim if (_hbaapi_debug_fd == NULL) {\
1199e86db79SHyon Kim char _logFile[MAX_PATH]; \
1209e86db79SHyon Kim GetTempPath(MAX_PATH, _logFile); \
1219e86db79SHyon Kim strcat(_logFile, "HBAAPI.log"); \
1229e86db79SHyon Kim _hbaapi_debug_fd = fopen(_logFile, "a");\
1239e86db79SHyon Kim }\
1249e86db79SHyon Kim if (_hbaapi_debug_fd != NULL) {\
1259e86db79SHyon Kim fprintf(_hbaapi_debug_fd, #STR "\n", (A1), (A2), (A3));\
1269e86db79SHyon Kim }\
1279e86db79SHyon Kim }
1289e86db79SHyon Kim #else /* WIN32 */
1299e86db79SHyon Kim #define DEBUG(L, STR, A1, A2, A3)\
1309e86db79SHyon Kim if ((L) <= _hbaapi_debuglevel) {\
1319e86db79SHyon Kim if (_hbaapi_sysloginit == 0) {\
1329e86db79SHyon Kim openlog("HBAAPI", LOG_PID|LOG_ODELAY, LOG_USER);\
1339e86db79SHyon Kim _hbaapi_sysloginit = 1;\
1349e86db79SHyon Kim }\
1359e86db79SHyon Kim syslog(LOG_INFO, (STR), (A1), (A2), (A3));\
1369e86db79SHyon Kim if (_hbaapi_debug_fd == NULL) {\
1379e86db79SHyon Kim _hbaapi_debug_fd = fopen("/tmp/HBAAPI.log", "a");\
1389e86db79SHyon Kim }\
1399e86db79SHyon Kim if (_hbaapi_debug_fd != NULL) {\
1409e86db79SHyon Kim fprintf(_hbaapi_debug_fd, #STR "\n", (A1), (A2), (A3));\
1419e86db79SHyon Kim }\
1429e86db79SHyon Kim }
1439e86db79SHyon Kim #endif /* WIN32 */
1449e86db79SHyon Kim
1459e86db79SHyon Kim #else /* Not both USESYSLOG and USELOGFILE */
1469e86db79SHyon Kim #if defined(USESYSLOG)
1479e86db79SHyon Kim int _hbaapi_sysloginit = 0;
1489e86db79SHyon Kim #undef DEBUG
1499e86db79SHyon Kim #define DEBUG(L, STR, A1, A2, A3) \
1509e86db79SHyon Kim if ((L) <= _hbaapi_debuglevel) {\
1519e86db79SHyon Kim if (_hbaapi_sysloginit == 0) {\
1529e86db79SHyon Kim openlog("HBAAPI", LOG_PID|LOG_ODELAY, LOG_USER);\
1539e86db79SHyon Kim _hbaapi_sysloginit = 1;\
1549e86db79SHyon Kim }\
1559e86db79SHyon Kim syslog(LOG_DEBUG, (STR), (A1), (A2), (A3));\
1569e86db79SHyon Kim }
1579e86db79SHyon Kim #endif /* USESYSLOG */
1589e86db79SHyon Kim #if defined(USELOGFILE)
1599e86db79SHyon Kim FILE *_hbaapi_debug_fd = NULL;
1609e86db79SHyon Kim #undef DEBUG
1619e86db79SHyon Kim #ifdef WIN32
1629e86db79SHyon Kim #define DEBUG(L, STR, A1, A2, A3) \
1639e86db79SHyon Kim if ((L) <= _hbaapi_debuglevel) {\
1649e86db79SHyon Kim if (_hbaapi_debug_fd == NULL) {\
1659e86db79SHyon Kim char _logFile[MAX_PATH]; \
1669e86db79SHyon Kim GetTempPath(MAX_PATH, _logFile); \
1679e86db79SHyon Kim strcat(_logFile, "HBAAPI.log"); \
1689e86db79SHyon Kim _hbaapi_debug_fd = fopen(_logFile, "a");\
1699e86db79SHyon Kim }\
1709e86db79SHyon Kim }
1719e86db79SHyon Kim #else /* WIN32 */
1729e86db79SHyon Kim #define DEBUG(L, STR, A1, A2, A3) \
1739e86db79SHyon Kim if ((L) <= _hbaapi_debuglevel) {\
1749e86db79SHyon Kim if (_hbaapi_debug_fd == NULL) {\
1759e86db79SHyon Kim _hbaapi_debug_fd = fopen("/tmp/HBAAPI.log", "a");\
1769e86db79SHyon Kim }\
1779e86db79SHyon Kim if (_hbaapi_debug_fd != NULL) { \
1789e86db79SHyon Kim fprintf(_hbaapi_debug_fd, #STR "\n", (A1), (A2), (A3));\
1799e86db79SHyon Kim }\
1809e86db79SHyon Kim }
1819e86db79SHyon Kim #endif /* WIN32 */
1829e86db79SHyon Kim #endif /* USELOGFILE */
1839e86db79SHyon Kim #endif /* Not both USELOGFILE and USESYSLOG */
1849e86db79SHyon Kim
1859e86db79SHyon Kim #ifdef POSIX_THREADS
1869e86db79SHyon Kim #include <pthread.h>
1879e86db79SHyon Kim /*
1889e86db79SHyon Kim * When multiple mutex's are grabed, they must be always be grabbed in
1899e86db79SHyon Kim * the same order, or deadlock can result. There are three levels
1909e86db79SHyon Kim * of mutex's involved in this API. If LL_mutex is grabbed, always grap
1919e86db79SHyon Kim * it first. If AL_mutex is grabbed, it may not be grabbed before
1929e86db79SHyon Kim * LL_mutex. If grabbed in a multi grab sequence, the mutex's protecting
1939e86db79SHyon Kim * the callback lists must always be grabbed last and release before calling
1949e86db79SHyon Kim * a vendor specific library function that might invoke a callback function
1959e86db79SHyon Kim * on the same thread.
1969e86db79SHyon Kim */
1979e86db79SHyon Kim #define GRAB_MUTEX(M) grab_mutex(M)
1989e86db79SHyon Kim #define RELEASE_MUTEX(M) release_mutex(M)
1999e86db79SHyon Kim #define RELEASE_MUTEX_RETURN(M, RET) release_mutex(M); return (RET)
2009e86db79SHyon Kim #elif defined(WIN32)
2019e86db79SHyon Kim #define GRAB_MUTEX(m) EnterCriticalSection(m)
2029e86db79SHyon Kim #define RELEASE_MUTEX(m) LeaveCriticalSection(m)
2039e86db79SHyon Kim #define RELEASE_MUTEX_RETURN(m, RET) LeaveCriticalSection(m); return (RET)
2049e86db79SHyon Kim #else
2059e86db79SHyon Kim #define GRAB_MUTEX(M)
2069e86db79SHyon Kim #define RELEASE_MUTEX(M)
2079e86db79SHyon Kim #define RELEASE_MUTEX_RETURN(M, RET) return (RET)
2089e86db79SHyon Kim #endif
2099e86db79SHyon Kim
2109e86db79SHyon Kim /*
2119e86db79SHyon Kim * Vendor library information
2129e86db79SHyon Kim */
2139e86db79SHyon Kim typedef enum {
2149e86db79SHyon Kim HBA_LIBRARY_UNKNOWN,
2159e86db79SHyon Kim HBA_LIBRARY_LOADED,
2169e86db79SHyon Kim HBA_LIBRARY_NOT_LOADED
2179e86db79SHyon Kim } HBA_LIBRARY_STATUS;
2189e86db79SHyon Kim
2199e86db79SHyon Kim typedef enum {
2209e86db79SHyon Kim UNKNOWN = 1,
2219e86db79SHyon Kim SMHBA,
2229e86db79SHyon Kim HBAAPIV2,
2239e86db79SHyon Kim HBAAPI
2249e86db79SHyon Kim } LIBRARY_VERSION;
2259e86db79SHyon Kim
2269e86db79SHyon Kim typedef struct hba_library_info {
2279e86db79SHyon Kim struct hba_library_info
2289e86db79SHyon Kim *next;
2299e86db79SHyon Kim #ifdef WIN32
2309e86db79SHyon Kim HINSTANCE hLibrary; /* Handle to a loaded DLL */
2319e86db79SHyon Kim #else
2329e86db79SHyon Kim char *LibraryName;
2339e86db79SHyon Kim void* hLibrary; /* Handle to a loaded DLL */
2349e86db79SHyon Kim #endif
2359e86db79SHyon Kim char *LibraryPath;
2369e86db79SHyon Kim LIBRARY_VERSION version; /* resolve union */
2379e86db79SHyon Kim HBA_UINT32 numOfAdapters;
2389e86db79SHyon Kim union {
2399e86db79SHyon Kim SMHBA_ENTRYPOINTS smhbafunctionTable; /* smhba function pointers */
2409e86db79SHyon Kim HBA_ENTRYPOINTSV2 functionTable; /* hba api function pointers */
2419e86db79SHyon Kim } ftable;
2429e86db79SHyon Kim HBA_LIBRARY_STATUS status; /* info on this library */
2439e86db79SHyon Kim HBA_UINT32 index;
2449e86db79SHyon Kim } HBA_LIBRARY_INFO, *PHBA_LIBRARY_INFO;
2459e86db79SHyon Kim
2469e86db79SHyon Kim #define ARE_WE_INITED() \
2479e86db79SHyon Kim if (_hbaapi_librarylist == NULL) { \
2489e86db79SHyon Kim return (HBA_STATUS_ERROR_NOT_LOADED); \
2499e86db79SHyon Kim }
2509e86db79SHyon Kim HBA_LIBRARY_INFO *_hbaapi_librarylist = NULL;
2519e86db79SHyon Kim HBA_UINT32 _hbaapi_total_library_count = 0;
2529e86db79SHyon Kim #ifdef POSIX_THREADS
2539e86db79SHyon Kim pthread_mutex_t _hbaapi_LL_mutex = PTHREAD_MUTEX_INITIALIZER;
2549e86db79SHyon Kim #elif defined(WIN32)
2559e86db79SHyon Kim CRITICAL_SECTION _hbaapi_LL_mutex;
2569e86db79SHyon Kim #endif
2579e86db79SHyon Kim
2589e86db79SHyon Kim /*
2599e86db79SHyon Kim * Macro to use the right function table between smhba and hbaapi.
2609e86db79SHyon Kim */
2619e86db79SHyon Kim #define FUNCTABLE(lib_infop) \
2629e86db79SHyon Kim ((lib_infop->version == SMHBA) ? \
2639e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable : \
2649e86db79SHyon Kim lib_infop->ftable.functionTable);
2659e86db79SHyon Kim
2669e86db79SHyon Kim /*
2679e86db79SHyon Kim * Macro to use the right function ptr between smhba and hbaapi function table.
2689e86db79SHyon Kim * Should be used for an interface common to SM-HBA and HBAAPIV2.
2699e86db79SHyon Kim */
2709e86db79SHyon Kim #define FUNCCOMMON(lib_infop, func) \
2719e86db79SHyon Kim ((lib_infop->version == SMHBA) ? \
2729e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.func : \
2739e86db79SHyon Kim lib_infop->ftable.functionTable.func)
2749e86db79SHyon Kim
2759e86db79SHyon Kim /*
2769e86db79SHyon Kim * Macro to use the hbaapi function ptr.
2779e86db79SHyon Kim * Should be used for an interface applicable only HBAAPIV2.
2789e86db79SHyon Kim */
2799e86db79SHyon Kim #define FUNCHBAAPIV2(lib_infop, func) \
2809e86db79SHyon Kim lib_infop->ftable.functionTable.func
2819e86db79SHyon Kim
2829e86db79SHyon Kim /*
2839e86db79SHyon Kim * Macro to use the hbaapi function ptr.
2849e86db79SHyon Kim * Should be used for an interface applicable only HBAAPIV2.
2859e86db79SHyon Kim */
2869e86db79SHyon Kim #define FUNCSMHBA(lib_infop, func) \
2879e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.func
2889e86db79SHyon Kim
2899e86db79SHyon Kim /*
2909e86db79SHyon Kim * Individual adapter (hba) information
2919e86db79SHyon Kim */
2929e86db79SHyon Kim typedef struct hba_adapter_info {
2939e86db79SHyon Kim struct hba_adapter_info
2949e86db79SHyon Kim *next;
2959e86db79SHyon Kim HBA_STATUS GNstatus; /* status from GetAdapterNameFunc */
2969e86db79SHyon Kim char *name;
2979e86db79SHyon Kim HBA_WWN nodeWWN;
2989e86db79SHyon Kim HBA_LIBRARY_INFO *library;
2999e86db79SHyon Kim HBA_UINT32 index;
3009e86db79SHyon Kim } HBA_ADAPTER_INFO;
3019e86db79SHyon Kim
3029e86db79SHyon Kim HBA_ADAPTER_INFO *_hbaapi_adapterlist = NULL;
3039e86db79SHyon Kim HBA_UINT32 _hbaapi_total_adapter_count = 0;
3049e86db79SHyon Kim #ifdef POSIX_THREADS
3059e86db79SHyon Kim pthread_mutex_t _hbaapi_AL_mutex = PTHREAD_MUTEX_INITIALIZER;
3069e86db79SHyon Kim #elif defined(WIN32)
3079e86db79SHyon Kim CRITICAL_SECTION _hbaapi_AL_mutex;
3089e86db79SHyon Kim #endif
3099e86db79SHyon Kim
3109e86db79SHyon Kim /*
3119e86db79SHyon Kim * Call back registration
3129e86db79SHyon Kim */
3139e86db79SHyon Kim typedef struct hba_vendorcallback_elem {
3149e86db79SHyon Kim struct hba_vendorcallback_elem
3159e86db79SHyon Kim *next;
3169e86db79SHyon Kim HBA_CALLBACKHANDLE vendorcbhandle;
3179e86db79SHyon Kim HBA_LIBRARY_INFO *lib_info;
3189e86db79SHyon Kim } HBA_VENDORCALLBACK_ELEM;
3199e86db79SHyon Kim
3209e86db79SHyon Kim /*
3219e86db79SHyon Kim * Each instance of HBA_ADAPTERCALLBACK_ELEM represents a call to one of
3229e86db79SHyon Kim * "register" functions that apply to a particular adapter.
3239e86db79SHyon Kim * HBA_ALLADAPTERSCALLBACK_ELEM is used just for HBA_RegisterForAdapterAddEvents
3249e86db79SHyon Kim */
3259e86db79SHyon Kim typedef struct hba_adaptercallback_elem {
3269e86db79SHyon Kim struct hba_adaptercallback_elem
3279e86db79SHyon Kim *next;
3289e86db79SHyon Kim HBA_LIBRARY_INFO *lib_info;
3299e86db79SHyon Kim void *userdata;
3309e86db79SHyon Kim HBA_CALLBACKHANDLE vendorcbhandle;
3319e86db79SHyon Kim void (*callback)();
3329e86db79SHyon Kim } HBA_ADAPTERCALLBACK_ELEM;
3339e86db79SHyon Kim
3349e86db79SHyon Kim typedef struct hba_alladapterscallback_elem {
3359e86db79SHyon Kim struct hba_alladapterscallback_elem
3369e86db79SHyon Kim *next;
3379e86db79SHyon Kim void *userdata;
3389e86db79SHyon Kim HBA_VENDORCALLBACK_ELEM *vendorhandlelist;
3399e86db79SHyon Kim void (*callback)();
3409e86db79SHyon Kim } HBA_ALLADAPTERSCALLBACK_ELEM;
3419e86db79SHyon Kim
3429e86db79SHyon Kim HBA_ALLADAPTERSCALLBACK_ELEM *_hbaapi_adapteraddevents_callback_list = NULL;
3439e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *_hbaapi_adapterevents_callback_list = NULL;
3449e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *_hbaapi_adapterportevents_callback_list = NULL;
3459e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *_hbaapi_adapterportstatevents_callback_list = NULL;
3469e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *_hbaapi_targetevents_callback_list = NULL;
3479e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *_hbaapi_linkevents_callback_list = NULL;
3489e86db79SHyon Kim
3499e86db79SHyon Kim HBA_ALLADAPTERSCALLBACK_ELEM *_smhba_adapteraddevents_callback_list = NULL;
3509e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *_smhba_adapterevents_callback_list = NULL;
3519e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *_smhba_adapterportevents_callback_list = NULL;
3529e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *_smhba_adapterportstatevents_callback_list = NULL;
3539e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *_smhba_adapterphystatevents_callback_list = NULL;
3549e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *_smhba_targetevents_callback_list = NULL;
3559e86db79SHyon Kim
3569e86db79SHyon Kim #ifdef POSIX_THREADS
3579e86db79SHyon Kim /* mutex's to protect each list */
3589e86db79SHyon Kim pthread_mutex_t _hbaapi_AAE_mutex = PTHREAD_MUTEX_INITIALIZER;
3599e86db79SHyon Kim pthread_mutex_t _hbaapi_AE_mutex = PTHREAD_MUTEX_INITIALIZER;
3609e86db79SHyon Kim pthread_mutex_t _hbaapi_APE_mutex = PTHREAD_MUTEX_INITIALIZER;
3619e86db79SHyon Kim pthread_mutex_t _hbaapi_APSE_mutex = PTHREAD_MUTEX_INITIALIZER;
3629e86db79SHyon Kim pthread_mutex_t _hbaapi_TE_mutex = PTHREAD_MUTEX_INITIALIZER;
3639e86db79SHyon Kim pthread_mutex_t _hbaapi_LE_mutex = PTHREAD_MUTEX_INITIALIZER;
3649e86db79SHyon Kim pthread_mutex_t _smhba_AAE_mutex = PTHREAD_MUTEX_INITIALIZER;
3659e86db79SHyon Kim pthread_mutex_t _smhba_AE_mutex = PTHREAD_MUTEX_INITIALIZER;
3669e86db79SHyon Kim pthread_mutex_t _smhba_APE_mutex = PTHREAD_MUTEX_INITIALIZER;
3679e86db79SHyon Kim pthread_mutex_t _smhba_APSE_mutex = PTHREAD_MUTEX_INITIALIZER;
3689e86db79SHyon Kim pthread_mutex_t _smhba_APHYSE_mutex = PTHREAD_MUTEX_INITIALIZER;
3699e86db79SHyon Kim pthread_mutex_t _smhba_TE_mutex = PTHREAD_MUTEX_INITIALIZER;
3709e86db79SHyon Kim pthread_mutex_t _smhba_LE_mutex = PTHREAD_MUTEX_INITIALIZER;
3719e86db79SHyon Kim #elif defined(WIN32)
3729e86db79SHyon Kim CRITICAL_SECTION _hbaapi_AAE_mutex;
3739e86db79SHyon Kim CRITICAL_SECTION _hbaapi_AE_mutex;
3749e86db79SHyon Kim CRITICAL_SECTION _hbaapi_APE_mutex;
3759e86db79SHyon Kim CRITICAL_SECTION _hbaapi_APSE_mutex;
3769e86db79SHyon Kim CRITICAL_SECTION _hbaapi_TE_mutex;
3779e86db79SHyon Kim CRITICAL_SECTION _smhba_AAE_mutex;
3789e86db79SHyon Kim CRITICAL_SECTION _smhba_AE_mutex;
3799e86db79SHyon Kim CRITICAL_SECTION _smhba_APE_mutex;
3809e86db79SHyon Kim CRITICAL_SECTION _smhba_APSE_mutex;
3819e86db79SHyon Kim CRITICAL_SECTION _smhba_APHYSE_mutex;
3829e86db79SHyon Kim CRITICAL_SECTION _smhba_TE_mutex;
3839e86db79SHyon Kim CRITICAL_SECTION _hbaapi_LE_mutex;
3849e86db79SHyon Kim #endif
3859e86db79SHyon Kim
3869e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM **cb_lists_array[] = {
3879e86db79SHyon Kim &_hbaapi_adapterevents_callback_list,
3889e86db79SHyon Kim &_hbaapi_adapterportevents_callback_list,
3899e86db79SHyon Kim &_hbaapi_adapterportstatevents_callback_list,
3909e86db79SHyon Kim &_hbaapi_targetevents_callback_list,
3919e86db79SHyon Kim &_hbaapi_linkevents_callback_list,
3929e86db79SHyon Kim &_smhba_adapterevents_callback_list,
3939e86db79SHyon Kim &_smhba_adapterportevents_callback_list,
3949e86db79SHyon Kim &_smhba_adapterportstatevents_callback_list,
3959e86db79SHyon Kim &_smhba_adapterphystatevents_callback_list,
3969e86db79SHyon Kim &_smhba_targetevents_callback_list,
3979e86db79SHyon Kim NULL};
3989e86db79SHyon Kim
3999e86db79SHyon Kim /*
4009e86db79SHyon Kim * Common library internal. Mutex handling
4019e86db79SHyon Kim */
4029e86db79SHyon Kim #ifdef POSIX_THREADS
4039e86db79SHyon Kim static void
grab_mutex(pthread_mutex_t * mp)4049e86db79SHyon Kim grab_mutex(pthread_mutex_t *mp) {
4059e86db79SHyon Kim /* LINTED E_FUNC_SET_NOT_USED */
4069e86db79SHyon Kim int ret;
4079e86db79SHyon Kim if ((ret = pthread_mutex_lock(mp)) != 0) {
4089e86db79SHyon Kim perror("pthread_mutex_lock - HBAAPI:");
4099e86db79SHyon Kim DEBUG(1, "pthread_mutex_lock returned %d", ret, 0, 0);
4109e86db79SHyon Kim }
4119e86db79SHyon Kim }
4129e86db79SHyon Kim
4139e86db79SHyon Kim static void
release_mutex(pthread_mutex_t * mp)4149e86db79SHyon Kim release_mutex(pthread_mutex_t *mp) {
4159e86db79SHyon Kim /* LINTED E_FUNC_SET_NOT_USED */
4169e86db79SHyon Kim int ret;
4179e86db79SHyon Kim if ((ret = pthread_mutex_unlock(mp)) != 0) {
4189e86db79SHyon Kim perror("pthread_mutex_unlock - HBAAPI:");
4199e86db79SHyon Kim DEBUG(1, "pthread_mutex_unlock returned %d", ret, 0, 0);
4209e86db79SHyon Kim }
4219e86db79SHyon Kim }
4229e86db79SHyon Kim #endif
4239e86db79SHyon Kim
4249e86db79SHyon Kim /*
4259e86db79SHyon Kim * Common library internal. Check library and return vendorhandle
4269e86db79SHyon Kim */
4279e86db79SHyon Kim static HBA_STATUS
HBA_CheckLibrary(HBA_HANDLE handle,HBA_LIBRARY_INFO ** lib_infopp,HBA_HANDLE * vendorhandle)4289e86db79SHyon Kim HBA_CheckLibrary(HBA_HANDLE handle,
4299e86db79SHyon Kim HBA_LIBRARY_INFO **lib_infopp,
4309e86db79SHyon Kim HBA_HANDLE *vendorhandle) {
4319e86db79SHyon Kim
4329e86db79SHyon Kim HBA_UINT32 libraryIndex;
4339e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
4349e86db79SHyon Kim
4359e86db79SHyon Kim if (_hbaapi_librarylist == NULL) {
4369e86db79SHyon Kim return (HBA_STATUS_ERROR);
4379e86db79SHyon Kim }
4389e86db79SHyon Kim libraryIndex = LIBRARY_NUM(handle);
4399e86db79SHyon Kim
4409e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_LL_mutex);
4419e86db79SHyon Kim for (lib_infop = _hbaapi_librarylist;
4429e86db79SHyon Kim lib_infop != NULL;
4439e86db79SHyon Kim lib_infop = lib_infop->next) {
4449e86db79SHyon Kim if (lib_infop->index == libraryIndex) {
4459e86db79SHyon Kim if (lib_infop->status != HBA_LIBRARY_LOADED) {
4469e86db79SHyon Kim return (HBA_STATUS_ERROR);
4479e86db79SHyon Kim }
4489e86db79SHyon Kim *lib_infopp = lib_infop;
4499e86db79SHyon Kim *vendorhandle = VENDOR_HANDLE(handle);
4509e86db79SHyon Kim /* caller will release the mutex */
4519e86db79SHyon Kim return (HBA_STATUS_OK);
4529e86db79SHyon Kim }
4539e86db79SHyon Kim }
4549e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INVALID_HANDLE);
4559e86db79SHyon Kim }
4569e86db79SHyon Kim #define CHECKLIBRARY() \
4579e86db79SHyon Kim status = HBA_CheckLibrary(handle, &lib_infop, &vendorHandle);\
4589e86db79SHyon Kim if (status != HBA_STATUS_OK) { \
4599e86db79SHyon Kim return (status); \
4609e86db79SHyon Kim }
4619e86db79SHyon Kim
4629e86db79SHyon Kim #define CHECKLIBRARYANDVERSION(ver) \
4639e86db79SHyon Kim status = HBA_CheckLibrary(handle, &lib_infop, &vendorHandle); \
4649e86db79SHyon Kim if (status != HBA_STATUS_OK) { \
4659e86db79SHyon Kim return (status); \
4669e86db79SHyon Kim } else { \
4679e86db79SHyon Kim if (ver != lib_infop->version) { \
4689e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, \
4699e86db79SHyon Kim HBA_STATUS_ERROR_INCOMPATIBLE); \
4709e86db79SHyon Kim } \
4719e86db79SHyon Kim }
4729e86db79SHyon Kim
4739e86db79SHyon Kim /*
4749e86db79SHyon Kim * freevendorhandlelist is called with _hbaapi_LL_mutex already held
4759e86db79SHyon Kim */
4769e86db79SHyon Kim static void
freevendorhandlelist(HBA_VENDORCALLBACK_ELEM * vhlist)4779e86db79SHyon Kim freevendorhandlelist(HBA_VENDORCALLBACK_ELEM *vhlist) {
4789e86db79SHyon Kim HBA_VENDORCALLBACK_ELEM *vhlp;
4799e86db79SHyon Kim HBA_VENDORCALLBACK_ELEM *vnext;
4809e86db79SHyon Kim HBARemoveCallbackFunc registeredfunc;
4819e86db79SHyon Kim
4829e86db79SHyon Kim for (vhlp = vhlist; vhlp != NULL; vhlp = vnext) {
4839e86db79SHyon Kim vnext = vhlp->next;
4849e86db79SHyon Kim registeredfunc =
4859e86db79SHyon Kim FUNCCOMMON(vhlp->lib_info, RemoveCallbackHandler);
4869e86db79SHyon Kim if (registeredfunc == NULL) {
4879e86db79SHyon Kim continue;
4889e86db79SHyon Kim }
4899e86db79SHyon Kim (registeredfunc)(vhlp->vendorcbhandle);
4909e86db79SHyon Kim free(vhlp);
4919e86db79SHyon Kim }
4929e86db79SHyon Kim }
4939e86db79SHyon Kim
4949e86db79SHyon Kim static
4959e86db79SHyon Kim HBA_STATUS
local_remove_callback(HBA_CALLBACKHANDLE cbhandle)4969e86db79SHyon Kim local_remove_callback(HBA_CALLBACKHANDLE cbhandle) {
4979e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM ***listp;
4989e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM **lastp;
4999e86db79SHyon Kim HBA_ALLADAPTERSCALLBACK_ELEM **lap;
5009e86db79SHyon Kim HBA_ALLADAPTERSCALLBACK_ELEM *allcbp;
5019e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *cbp;
5029e86db79SHyon Kim HBARemoveCallbackFunc registeredfunc;
5039e86db79SHyon Kim HBA_VENDORCALLBACK_ELEM *vhlp;
5049e86db79SHyon Kim HBA_VENDORCALLBACK_ELEM *vnext;
5059e86db79SHyon Kim int found;
5069e86db79SHyon Kim HBA_STATUS status = HBA_STATUS_ERROR_INVALID_HANDLE;
5079e86db79SHyon Kim
5089e86db79SHyon Kim
5099e86db79SHyon Kim /* search through the simple lists first */
5109e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_AAE_mutex);
5119e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_AE_mutex);
5129e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_APE_mutex);
5139e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_APSE_mutex);
5149e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_TE_mutex);
5159e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_LE_mutex);
5169e86db79SHyon Kim GRAB_MUTEX(&_smhba_AAE_mutex);
5179e86db79SHyon Kim GRAB_MUTEX(&_smhba_AE_mutex);
5189e86db79SHyon Kim GRAB_MUTEX(&_smhba_APE_mutex);
5199e86db79SHyon Kim GRAB_MUTEX(&_smhba_APSE_mutex);
5209e86db79SHyon Kim GRAB_MUTEX(&_smhba_TE_mutex);
5219e86db79SHyon Kim for (listp = cb_lists_array, found = 0;
5229e86db79SHyon Kim (found == 0 && *listp != NULL); listp++) {
5239e86db79SHyon Kim lastp = *listp;
5249e86db79SHyon Kim for (cbp = **listp; cbp != NULL; cbp = cbp->next) {
5259e86db79SHyon Kim if (cbhandle != (HBA_CALLBACKHANDLE)cbp) {
5269e86db79SHyon Kim lastp = &(cbp->next);
5279e86db79SHyon Kim continue;
5289e86db79SHyon Kim }
5299e86db79SHyon Kim found = 1;
5309e86db79SHyon Kim registeredfunc =
5319e86db79SHyon Kim FUNCCOMMON(cbp->lib_info, RemoveCallbackHandler);
5329e86db79SHyon Kim if (registeredfunc == NULL) {
5339e86db79SHyon Kim break;
5349e86db79SHyon Kim }
5359e86db79SHyon Kim (registeredfunc)(cbp->vendorcbhandle);
5369e86db79SHyon Kim *lastp = cbp->next;
5379e86db79SHyon Kim free(cbp);
5389e86db79SHyon Kim break;
5399e86db79SHyon Kim }
5409e86db79SHyon Kim }
5419e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_LE_mutex);
5429e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_TE_mutex);
5439e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_APSE_mutex);
5449e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_APE_mutex);
5459e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_AE_mutex);
5469e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_AAE_mutex);
5479e86db79SHyon Kim RELEASE_MUTEX(&_smhba_AAE_mutex);
5489e86db79SHyon Kim RELEASE_MUTEX(&_smhba_AE_mutex);
5499e86db79SHyon Kim RELEASE_MUTEX(&_smhba_APE_mutex);
5509e86db79SHyon Kim RELEASE_MUTEX(&_smhba_APSE_mutex);
5519e86db79SHyon Kim RELEASE_MUTEX(&_smhba_TE_mutex);
5529e86db79SHyon Kim
5539e86db79SHyon Kim if (found != 0) {
5549e86db79SHyon Kim if (registeredfunc == NULL) {
5559e86db79SHyon Kim return (HBA_STATUS_ERROR_NOT_SUPPORTED);
5569e86db79SHyon Kim }
5579e86db79SHyon Kim return (HBA_STATUS_OK);
5589e86db79SHyon Kim }
5599e86db79SHyon Kim
5609e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_AAE_mutex);
5619e86db79SHyon Kim /*
5629e86db79SHyon Kim * if it wasnt in the simple lists,
5639e86db79SHyon Kim * look in the list for adapteraddevents
5649e86db79SHyon Kim */
5659e86db79SHyon Kim lap = &_hbaapi_adapteraddevents_callback_list;
5669e86db79SHyon Kim for (allcbp = _hbaapi_adapteraddevents_callback_list;
5679e86db79SHyon Kim allcbp != NULL;
5689e86db79SHyon Kim allcbp = allcbp->next) {
5699e86db79SHyon Kim if (cbhandle != (HBA_CALLBACKHANDLE)allcbp) {
5709e86db79SHyon Kim lap = &allcbp->next;
5719e86db79SHyon Kim continue;
5729e86db79SHyon Kim }
5739e86db79SHyon Kim for (vhlp = allcbp->vendorhandlelist; vhlp != NULL; vhlp = vnext) {
5749e86db79SHyon Kim vnext = vhlp->next;
5759e86db79SHyon Kim /* should be HBAAPIV2 VSL to get to here */
5769e86db79SHyon Kim registeredfunc =
5779e86db79SHyon Kim vhlp->lib_info->ftable.functionTable.RemoveCallbackHandler;
5789e86db79SHyon Kim if (registeredfunc == NULL) {
5799e86db79SHyon Kim continue;
5809e86db79SHyon Kim }
5819e86db79SHyon Kim (registeredfunc)(vhlp->vendorcbhandle);
5829e86db79SHyon Kim free(vhlp);
5839e86db79SHyon Kim }
5849e86db79SHyon Kim *lap = allcbp->next;
5859e86db79SHyon Kim free(allcbp);
5869e86db79SHyon Kim status = HBA_STATUS_OK;
5879e86db79SHyon Kim break;
5889e86db79SHyon Kim }
5899e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_AAE_mutex);
5909e86db79SHyon Kim
5919e86db79SHyon Kim /* now search smhba adapteradd events. */
5929e86db79SHyon Kim GRAB_MUTEX(&_smhba_AAE_mutex);
5939e86db79SHyon Kim lap = &_smhba_adapteraddevents_callback_list;
5949e86db79SHyon Kim for (allcbp = _smhba_adapteraddevents_callback_list;
5959e86db79SHyon Kim allcbp != NULL;
5969e86db79SHyon Kim allcbp = allcbp->next) {
5979e86db79SHyon Kim if (cbhandle != (HBA_CALLBACKHANDLE)allcbp) {
5989e86db79SHyon Kim lap = &allcbp->next;
5999e86db79SHyon Kim continue;
6009e86db79SHyon Kim }
6019e86db79SHyon Kim for (vhlp = allcbp->vendorhandlelist; vhlp != NULL; vhlp = vnext) {
6029e86db79SHyon Kim vnext = vhlp->next;
6039e86db79SHyon Kim /* should be SMHBA VSL to get to here */
6049e86db79SHyon Kim registeredfunc =
6059e86db79SHyon Kim vhlp->lib_info->
6069e86db79SHyon Kim ftable.smhbafunctionTable.RemoveCallbackHandler;
6079e86db79SHyon Kim if (registeredfunc == NULL) {
6089e86db79SHyon Kim continue;
6099e86db79SHyon Kim }
6109e86db79SHyon Kim (registeredfunc)(vhlp->vendorcbhandle);
6119e86db79SHyon Kim free(vhlp);
6129e86db79SHyon Kim }
6139e86db79SHyon Kim *lap = allcbp->next;
6149e86db79SHyon Kim free(allcbp);
6159e86db79SHyon Kim status = HBA_STATUS_OK;
6169e86db79SHyon Kim break;
6179e86db79SHyon Kim }
6189e86db79SHyon Kim RELEASE_MUTEX(&_smhba_AAE_mutex);
6199e86db79SHyon Kim
6209e86db79SHyon Kim return (status);
6219e86db79SHyon Kim }
6229e86db79SHyon Kim
6239e86db79SHyon Kim /* LINTED E_STATIC_UE_STATIC_UNUSED */
6249e86db79SHyon Kim static char wwn_str1[17];
6259e86db79SHyon Kim /* LINTED E_STATIC_UE_STATIC_UNUSED */
6269e86db79SHyon Kim static char wwn_str2[17];
6279e86db79SHyon Kim /* LINTED E_STATIC_UE_STATIC_UNUSED */
6289e86db79SHyon Kim static char wwn_str3[17];
6299e86db79SHyon Kim #define WWN2STR1(wwn) WWN2str(wwn_str1, (wwn))
6309e86db79SHyon Kim #define WWN2STR2(wwn) WWN2str(wwn_str2, (wwn))
6319e86db79SHyon Kim #define WWN2STR3(wwn) WWN2str(wwn_str3, (wwn))
6329e86db79SHyon Kim static char *
6339e86db79SHyon Kim /* LINTED E_STATIC_UE_STATIC_UNUSED */
WWN2str(char * buf,HBA_WWN * wwn)6349e86db79SHyon Kim WWN2str(char *buf, HBA_WWN *wwn) {
6359e86db79SHyon Kim int j;
6369e86db79SHyon Kim unsigned char *pc = (unsigned char *)&(wwn->wwn[0]);
6379e86db79SHyon Kim buf[0] = '\0';
6389e86db79SHyon Kim for (j = 0; j < 16; j += 2) {
6399e86db79SHyon Kim (void) sprintf(&buf[j], "%02X", (int)*pc++);
6409e86db79SHyon Kim }
6419e86db79SHyon Kim return (buf);
6429e86db79SHyon Kim }
6439e86db79SHyon Kim
6449e86db79SHyon Kim #ifdef WIN32
6459e86db79SHyon Kim BOOL APIENTRY
DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)6469e86db79SHyon Kim DllMain(HANDLE hModule,
6479e86db79SHyon Kim DWORD ul_reason_for_call,
6489e86db79SHyon Kim LPVOID lpReserved)
6499e86db79SHyon Kim {
6509e86db79SHyon Kim switch (ul_reason_for_call) {
6519e86db79SHyon Kim case DLL_PROCESS_ATTACH:
6529e86db79SHyon Kim break;
6539e86db79SHyon Kim case DLL_PROCESS_DETACH:
6549e86db79SHyon Kim break;
6559e86db79SHyon Kim case DLL_THREAD_ATTACH:
6569e86db79SHyon Kim case DLL_THREAD_DETACH:
6579e86db79SHyon Kim break;
6589e86db79SHyon Kim }
6599e86db79SHyon Kim return (TRUE);
6609e86db79SHyon Kim }
6619e86db79SHyon Kim #endif
6629e86db79SHyon Kim
6639e86db79SHyon Kim /*
6649e86db79SHyon Kim * Read in the config file and load all the specified vendor specific
6659e86db79SHyon Kim * libraries and perform the function registration exercise
6669e86db79SHyon Kim */
6679e86db79SHyon Kim HBA_STATUS
HBA_LoadLibrary()6689e86db79SHyon Kim HBA_LoadLibrary()
6699e86db79SHyon Kim {
6709e86db79SHyon Kim HBARegisterLibraryFunc RegisterFunc;
6719e86db79SHyon Kim HBARegisterLibraryV2Func RegisterV2Func;
6729e86db79SHyon Kim SMHBARegisterLibraryFunc RegisterSMHBAFunc;
6739e86db79SHyon Kim HBALoadLibraryFunc LoadLibraryFunc;
6749e86db79SHyon Kim HBAGetVersionFunc GetVersionFunc;
6759e86db79SHyon Kim #ifdef POSIX_THREADS
6769e86db79SHyon Kim int ret;
6779e86db79SHyon Kim #endif
6789e86db79SHyon Kim HBA_STATUS status;
6799e86db79SHyon Kim HBA_UINT32 libversion;
6809e86db79SHyon Kim
6819e86db79SHyon Kim /* Open configuration file from known location */
6829e86db79SHyon Kim #ifdef WIN32
6839e86db79SHyon Kim LONG lStatus;
6849e86db79SHyon Kim HKEY hkSniaHba, hkVendorLib;
6859e86db79SHyon Kim FILETIME ftLastWriteTime;
6869e86db79SHyon Kim TCHAR cSubKeyName[256];
6879e86db79SHyon Kim DWORD i, dwSize, dwType;
6889e86db79SHyon Kim BYTE byFileName[MAX_PATH];
6899e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
6909e86db79SHyon Kim
6919e86db79SHyon Kim if (_hbaapi_librarylist != NULL) {
6929e86db79SHyon Kim /* this is an app programming error */
6939e86db79SHyon Kim return (HBA_STATUS_ERROR);
6949e86db79SHyon Kim }
6959e86db79SHyon Kim
6969e86db79SHyon Kim lStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\SNIA\\HBA",
6979e86db79SHyon Kim 0, KEY_READ, &hkSniaHba);
6989e86db79SHyon Kim if (lStatus != ERROR_SUCCESS) {
6999e86db79SHyon Kim /* ???Opportunity to send error msg, configuration error */
7009e86db79SHyon Kim return (HBA_STATUS_ERROR);
7019e86db79SHyon Kim }
7029e86db79SHyon Kim /*
7039e86db79SHyon Kim * Enumerate all the subkeys. These have the form:
7049e86db79SHyon Kim * HKLM\Software\SNIA\HBA\<Vendor id> - note that we don't care
7059e86db79SHyon Kim * what the vendor id is
7069e86db79SHyon Kim */
7079e86db79SHyon Kim for (i = 0; ; i++) {
7089e86db79SHyon Kim dwSize = 255; /* how big the buffer is */
7099e86db79SHyon Kim lStatus = RegEnumKeyEx(hkSniaHba, i,
7109e86db79SHyon Kim (char *)&cSubKeyName, &dwSize, NULL,
7119e86db79SHyon Kim NULL, NULL, &ftLastWriteTime);
7129e86db79SHyon Kim if (lStatus == ERROR_NO_MORE_ITEMS) {
7139e86db79SHyon Kim break; /* we're done */
7149e86db79SHyon Kim } else if (lStatus == ERROR_MORE_DATA) { /* buffer not big enough */
7159e86db79SHyon Kim /* do whatever */
7169e86db79SHyon Kim ;
7179e86db79SHyon Kim }
7189e86db79SHyon Kim /* Now open the subkey that pertains to this vendor's library */
7199e86db79SHyon Kim lStatus = RegOpenKeyEx(hkSniaHba, cSubKeyName, 0, KEY_READ,
7209e86db79SHyon Kim &hkVendorLib);
7219e86db79SHyon Kim if (lStatus != ERROR_SUCCESS) {
7229e86db79SHyon Kim RegCloseKey(hkSniaHba);
7239e86db79SHyon Kim /* ???Opportunity to send error msg, installation error */
7249e86db79SHyon Kim return (HBA_STATUS_ERROR);
7259e86db79SHyon Kim /*
7269e86db79SHyon Kim * you may want to return something
7279e86db79SHyon Kim * else or keep trying
7289e86db79SHyon Kim */
7299e86db79SHyon Kim }
7309e86db79SHyon Kim /*
7319e86db79SHyon Kim * The name of the library is contained in a REG_SZ Value
7329e86db79SHyon Kim * keyed to "LibraryFile"
7339e86db79SHyon Kim */
7349e86db79SHyon Kim dwSize = MAX_PATH;
7359e86db79SHyon Kim lStatus = RegQueryValueEx(hkVendorLib, "LibraryFile", NULL, &dwType,
7369e86db79SHyon Kim byFileName, &dwSize);
7379e86db79SHyon Kim if (lStatus != ERROR_SUCCESS) {
7389e86db79SHyon Kim RegCloseKey(hkVendorLib);
7399e86db79SHyon Kim /* ???Opportunity to send error msg, installation error */
7409e86db79SHyon Kim continue;
7419e86db79SHyon Kim }
7429e86db79SHyon Kim lib_infop = (HBA_LIBRARY_INFO *)calloc(1, sizeof (HBA_LIBRARY_INFO));
7439e86db79SHyon Kim if (lib_infop == NULL) {
7449e86db79SHyon Kim /* what is the right thing to do in MS land??? */
7459e86db79SHyon Kim RegCloseKey(hkVendorLib);
7469e86db79SHyon Kim /* ???Opportunity to send error msg, installation error */
7479e86db79SHyon Kim return (HBA_STATUS_ERROR);
7489e86db79SHyon Kim }
7499e86db79SHyon Kim lib_infop->status = HBA_LIBRARY_NOT_LOADED;
7509e86db79SHyon Kim lib_infop->next = _hbaapi_librarylist;
7519e86db79SHyon Kim lib_infop->index = _hbaapi_total_library_count;
7529e86db79SHyon Kim _hbaapi_total_library_count++;
7539e86db79SHyon Kim _hbaapi_librarylist = lib_infop;
7549e86db79SHyon Kim
7559e86db79SHyon Kim /* Now I can try to load the library */
7569e86db79SHyon Kim lib_infop->hLibrary = LoadLibrary(byFileName);
7579e86db79SHyon Kim if (lib_infop->hLibrary == NULL) {
7589e86db79SHyon Kim /* printf("unable to load library %s\n", librarypath); */
7599e86db79SHyon Kim /* ???Opportunity to send error msg, installation error */
7609e86db79SHyon Kim goto dud_library;
7619e86db79SHyon Kim }
7629e86db79SHyon Kim lib_infop->LibraryPath = strdup(byFileName);
7639e86db79SHyon Kim DEBUG(1, "HBAAPI loading: %s\n", byFileName, 0, 0);
7649e86db79SHyon Kim
7659e86db79SHyon Kim RegisterSMHBAFunc = (SMHBARegisterLibraryFunc)
7669e86db79SHyon Kim GetProcAddress(lib_infop->hLibrary, "SMHBA_RegisterLibrary");
7679e86db79SHyon Kim if (RegisterSMHBAFunc != NULL) {
7689e86db79SHyon Kim status = ((RegisterSMHBAFunc)(SMHBA_ENTRYPOINTS *)
7699e86db79SHyon Kim (&lib_infop->ftable.smhbafunctionTable));
7709e86db79SHyon Kim if (status != HBA_STATUS_OK) {
7719e86db79SHyon Kim /* library not loaded */
7729e86db79SHyon Kim /* ???Opportunity to send error msg, library error? */
7739e86db79SHyon Kim goto dud_library;
7749e86db79SHyon Kim } else {
7759e86db79SHyon Kim lib_infop->version = SMHBA;
7769e86db79SHyon Kim }
7779e86db79SHyon Kim } else {
7789e86db79SHyon Kim /* Call the registration function to get the list of pointers */
7799e86db79SHyon Kim RegisterV2Func = (HBARegisterLibraryV2Func)GetProcAddress(
7809e86db79SHyon Kim lib_infop->hLibrary, "HBA_RegisterLibraryV2");
7819e86db79SHyon Kim if (RegisterV2Func != NULL) {
7829e86db79SHyon Kim /*
7839e86db79SHyon Kim * Load the function pointers directly into
7849e86db79SHyon Kim * the table of functions
7859e86db79SHyon Kim */
7869e86db79SHyon Kim status = ((RegisterV2Func)
7879e86db79SHyon Kim (HBA_ENTRYPOINTSV2 *)(&lib_infop->ftable.functionTable));
7889e86db79SHyon Kim if (status != HBA_STATUS_OK) {
7899e86db79SHyon Kim /* library not loaded */
7909e86db79SHyon Kim /* ???Opportunity to send error msg, library error? */
7919e86db79SHyon Kim goto dud_library;
7929e86db79SHyon Kim } else {
7939e86db79SHyon Kim lib_infop->version = HBAAPIV2;
7949e86db79SHyon Kim }
7959e86db79SHyon Kim } else {
7969e86db79SHyon Kim /* Maybe the vendor library is only Rev1 */
7979e86db79SHyon Kim RegisterFunc = (HBARegisterLibraryFunc)
7989e86db79SHyon Kim GetProcAddress(lib_infop->hLibrary, "HBA_RegisterLibrary");
7999e86db79SHyon Kim if (RegisterFunc == NULL) {
8009e86db79SHyon Kim /* ???Opportunity to send error msg, library error? */
8019e86db79SHyon Kim goto dud_library;
8029e86db79SHyon Kim }
8039e86db79SHyon Kim /*
8049e86db79SHyon Kim * Load the function points directly into
8059e86db79SHyon Kim * the Rev 2 table of functions
8069e86db79SHyon Kim */
8079e86db79SHyon Kim status = ((RegisterFunc)(
8089e86db79SHyon Kim (HBA_ENTRYPOINTS *)(&lib_infop->ftable.functionTable)));
8099e86db79SHyon Kim if (status != HBA_STATUS_OK) {
8109e86db79SHyon Kim /* library not loaded */
8119e86db79SHyon Kim /* ???Opportunity to send error msg, library error? */
8129e86db79SHyon Kim goto dud_library;
8139e86db79SHyon Kim } else {
8149e86db79SHyon Kim lib_infop->version = HBAAPI;
8159e86db79SHyon Kim }
8169e86db79SHyon Kim }
8179e86db79SHyon Kim }
8189e86db79SHyon Kim
8199e86db79SHyon Kim /* successfully loaded library */
8209e86db79SHyon Kim /*
8219e86db79SHyon Kim * SM-HBA and HBAAPI has a seperate handler for GetVersion but
8229e86db79SHyon Kim * they have the same function signature so use the same variable here.
8239e86db79SHyon Kim */
8249e86db79SHyon Kim GetVersionFunc = FUNCCOMMON(lib_infop, GetVersionHandler);
8259e86db79SHyon Kim if (GetVersionFunc != NULL) {
8269e86db79SHyon Kim if (lib_infop->version == SMHBA) {
8279e86db79SHyon Kim /* Check the version of this library before loading */
8289e86db79SHyon Kim libversion = ((GetVersionFunc)());
8299e86db79SHyon Kim #ifdef NOTDEF /* save for a later time... when it matters */
8309e86db79SHyon Kim if (libversion < SMHBA_LIBVERSION) {
8319e86db79SHyon Kim goto dud_library;
8329e86db79SHyon Kim }
8339e86db79SHyon Kim #endif
8349e86db79SHyon Kim } else {
8359e86db79SHyon Kim /* Check the version of this library before loading */
8369e86db79SHyon Kim /* Actually... This wrapper is compatible with version 1 */
8379e86db79SHyon Kim libversion = ((GetVersionFunc)());
8389e86db79SHyon Kim #ifdef NOTDEF /* save for a later time... when it matters */
8399e86db79SHyon Kim if (libversion < HBA_LIBVERSION) {
8409e86db79SHyon Kim goto dud_library;
8419e86db79SHyon Kim }
8429e86db79SHyon Kim #endif
8439e86db79SHyon Kim }
8449e86db79SHyon Kim } else {
8459e86db79SHyon Kim /* ???Opportunity to send error msg, library error? */
8469e86db79SHyon Kim goto dud_library;
8479e86db79SHyon Kim }
8489e86db79SHyon Kim
8499e86db79SHyon Kim LoadLibraryFunc = FUNCCOMMON(lib_infop, LoadLibraryHandler);
8509e86db79SHyon Kim if (LoadLibraryFunc == NULL) {
8519e86db79SHyon Kim /* Hmmm, dont we need to flag this in a realy big way??? */
8529e86db79SHyon Kim /* How about messages to the system event logger ??? */
8539e86db79SHyon Kim /* ???Opportunity to send error msg, library error? */
8549e86db79SHyon Kim goto dud_library;
8559e86db79SHyon Kim }
8569e86db79SHyon Kim /* Initialize this library */
8579e86db79SHyon Kim status = ((LoadLibraryFunc)());
8589e86db79SHyon Kim if (status != HBA_STATUS_OK) {
8599e86db79SHyon Kim /* ???Opportunity to send error msg, library error? */
8609e86db79SHyon Kim continue;
8619e86db79SHyon Kim }
8629e86db79SHyon Kim /* successfully loaded library */
8639e86db79SHyon Kim lib_infop->status = HBA_LIBRARY_LOADED;
8649e86db79SHyon Kim
8659e86db79SHyon Kim dud_library: /* its also just the end of the loop */
8669e86db79SHyon Kim RegCloseKey(hkVendorLib);
8679e86db79SHyon Kim }
8689e86db79SHyon Kim RegCloseKey(hkSniaHba);
8699e86db79SHyon Kim
8709e86db79SHyon Kim #else /* Unix as opposed to Win32 */
8719e86db79SHyon Kim FILE *hbaconf;
8729e86db79SHyon Kim char fullline[512]; /* line read from HBA.conf */
8739e86db79SHyon Kim char *libraryname; /* Read in from file HBA.conf */
8749e86db79SHyon Kim char *librarypath; /* Read in from file HBA.conf */
8759e86db79SHyon Kim char hbaConfFilePath[256];
8769e86db79SHyon Kim char *charPtr;
8779e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
8789e86db79SHyon Kim
8799e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_LL_mutex);
8809e86db79SHyon Kim if (_hbaapi_librarylist != NULL) {
8819e86db79SHyon Kim (void) fprintf(stderr,
8829e86db79SHyon Kim "HBA_LoadLibrary: previously unfreed "
8839e86db79SHyon Kim "libraries exist, call HBA_FreeLibrary().\n");
8849e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_LL_mutex);
8859e86db79SHyon Kim return (HBA_STATUS_ERROR);
8869e86db79SHyon Kim }
8879e86db79SHyon Kim
8889e86db79SHyon Kim (void) strcpy(hbaConfFilePath, "/etc/smhba.conf");
8899e86db79SHyon Kim
8909e86db79SHyon Kim if ((hbaconf = fopen(hbaConfFilePath, "r")) == NULL) {
8919e86db79SHyon Kim (void) printf("Cannot open %s\n", hbaConfFilePath);
8929e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_LL_mutex);
8939e86db79SHyon Kim return (HBA_STATUS_ERROR);
8949e86db79SHyon Kim }
8959e86db79SHyon Kim
8969e86db79SHyon Kim /* Read in each line and load library */
8979e86db79SHyon Kim while ((hbaconf != NULL) &&
8989e86db79SHyon Kim (fgets(fullline, sizeof (fullline), hbaconf))) {
8999e86db79SHyon Kim /* Skip the comments... */
9009e86db79SHyon Kim if ((fullline[0] == '#') || (fullline[0] == '\n')) {
9019e86db79SHyon Kim continue;
9029e86db79SHyon Kim }
9039e86db79SHyon Kim
9049e86db79SHyon Kim /* grab first 'thing' in line (if its there) */
9059e86db79SHyon Kim if ((libraryname = strtok(fullline, " \t\n")) != NULL) {
9069e86db79SHyon Kim if (strlen(libraryname) >= 64) {
9079e86db79SHyon Kim (void) fprintf(stderr,
9089e86db79SHyon Kim "Library name(%s) in %s is > 64 characters\n",
9099e86db79SHyon Kim libraryname, hbaConfFilePath);
9109e86db79SHyon Kim }
9119e86db79SHyon Kim }
9129e86db79SHyon Kim /* grab second 'thing' in line (if its there) */
9139e86db79SHyon Kim if ((librarypath = strtok(NULL, " \t\n")) != NULL) {
9149e86db79SHyon Kim if (strlen(librarypath) >= 256) {
9159e86db79SHyon Kim (void) fprintf(stderr,
9169e86db79SHyon Kim "Library path(%s) in %s is > 256 characters\n",
9179e86db79SHyon Kim librarypath, hbaConfFilePath);
9189e86db79SHyon Kim }
9199e86db79SHyon Kim }
9209e86db79SHyon Kim
9219e86db79SHyon Kim /* there should be no more 'things' in the line */
9229e86db79SHyon Kim if ((charPtr = strtok(NULL, " \n\t")) != NULL) {
9239e86db79SHyon Kim (void) fprintf(stderr, "Extraneous characters (\"%s\") in %s\n",
9249e86db79SHyon Kim charPtr, hbaConfFilePath);
9259e86db79SHyon Kim }
9269e86db79SHyon Kim
9279e86db79SHyon Kim /* Continue to the next line if library name or path is invalid */
9289e86db79SHyon Kim if (libraryname == NULL ||
9299e86db79SHyon Kim strlen(libraryname) == 0 ||
9309e86db79SHyon Kim librarypath == NULL ||
9319e86db79SHyon Kim (strlen(librarypath) == 0)) {
9329e86db79SHyon Kim continue;
9339e86db79SHyon Kim }
9349e86db79SHyon Kim
9359e86db79SHyon Kim /*
9369e86db79SHyon Kim * Special case....
9379e86db79SHyon Kim * Look for loglevel
9389e86db79SHyon Kim */
9399e86db79SHyon Kim if (strcmp(libraryname, "debuglevel") == 0) {
9409e86db79SHyon Kim _hbaapi_debuglevel = strtol(librarypath, NULL, 10);
9419e86db79SHyon Kim /* error handling does the right thing automagically */
9429e86db79SHyon Kim continue;
9439e86db79SHyon Kim }
9449e86db79SHyon Kim
9459e86db79SHyon Kim lib_infop = (HBA_LIBRARY_INFO *)calloc(1, sizeof (HBA_LIBRARY_INFO));
9469e86db79SHyon Kim if (lib_infop == NULL) {
9479e86db79SHyon Kim (void) fprintf(stderr, "HBA_LoadLibrary: out of memeory\n");
9489e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_LL_mutex);
9499e86db79SHyon Kim return (HBA_STATUS_ERROR);
9509e86db79SHyon Kim }
9519e86db79SHyon Kim lib_infop->status = HBA_LIBRARY_NOT_LOADED;
9529e86db79SHyon Kim lib_infop->LibraryName = strdup(libraryname);
9539e86db79SHyon Kim lib_infop->LibraryPath = strdup(librarypath);
9549e86db79SHyon Kim lib_infop->numOfAdapters = 0;
9559e86db79SHyon Kim lib_infop->version = UNKNOWN;
9569e86db79SHyon Kim lib_infop->index = _hbaapi_total_library_count;
9579e86db79SHyon Kim _hbaapi_total_library_count++;
9589e86db79SHyon Kim lib_infop->next = _hbaapi_librarylist;
9599e86db79SHyon Kim _hbaapi_librarylist = lib_infop;
9609e86db79SHyon Kim
9619e86db79SHyon Kim /* Load the DLL now */
9629e86db79SHyon Kim if ((lib_infop->hLibrary = dlopen(librarypath, RTLD_LAZY)) == NULL) {
9639e86db79SHyon Kim /* printf("unable to load library %s\n", librarypath); */
9649e86db79SHyon Kim continue;
9659e86db79SHyon Kim }
9669e86db79SHyon Kim /* Call the registration function to get the list of pointers */
9679e86db79SHyon Kim RegisterSMHBAFunc = (SMHBARegisterLibraryFunc)
9689e86db79SHyon Kim dlsym(lib_infop->hLibrary, "SMHBA_RegisterLibrary");
9699e86db79SHyon Kim if (RegisterSMHBAFunc != NULL) {
9709e86db79SHyon Kim /*
9719e86db79SHyon Kim * Load the function points directly into
9729e86db79SHyon Kim * the table of functions
9739e86db79SHyon Kim */
9749e86db79SHyon Kim status = ((RegisterSMHBAFunc)
9759e86db79SHyon Kim (&lib_infop->ftable.smhbafunctionTable));
9769e86db79SHyon Kim if (status != HBA_STATUS_OK) {
9779e86db79SHyon Kim /* library not loaded */
9789e86db79SHyon Kim continue;
9799e86db79SHyon Kim } else {
9809e86db79SHyon Kim lib_infop->version = SMHBA;
9819e86db79SHyon Kim }
9829e86db79SHyon Kim } else {
9839e86db79SHyon Kim RegisterV2Func = (HBARegisterLibraryV2Func)
9849e86db79SHyon Kim dlsym(lib_infop->hLibrary, "HBA_RegisterLibraryV2");
9859e86db79SHyon Kim if (RegisterV2Func != NULL) {
9869e86db79SHyon Kim /*
9879e86db79SHyon Kim * Load the function points directly into
9889e86db79SHyon Kim * the table of functions
9899e86db79SHyon Kim */
9909e86db79SHyon Kim status = ((RegisterV2Func)((HBA_ENTRYPOINTSV2 *)
9919e86db79SHyon Kim (&lib_infop->ftable.functionTable)));
9929e86db79SHyon Kim if (status != HBA_STATUS_OK) {
9939e86db79SHyon Kim /* library not loaded */
9949e86db79SHyon Kim continue;
9959e86db79SHyon Kim } else {
9969e86db79SHyon Kim lib_infop->version = HBAAPIV2;
9979e86db79SHyon Kim }
9989e86db79SHyon Kim } else {
9999e86db79SHyon Kim /* Maybe the vendor library is only Rev1 */
10009e86db79SHyon Kim RegisterFunc = (HBARegisterLibraryFunc)
10019e86db79SHyon Kim dlsym(lib_infop->hLibrary, "HBA_RegisterLibrary");
10029e86db79SHyon Kim if (RegisterFunc == NULL) {
10039e86db79SHyon Kim /* This function is required */
10049e86db79SHyon Kim (void) fprintf(stderr,
10059e86db79SHyon Kim "HBA_LoadLibrary: vendor specific RegisterLibrary "
10069e86db79SHyon Kim "function not found. lib: %s\n", librarypath);
10079e86db79SHyon Kim DEBUG(1, "HBA_LoadLibrary: vendor specific "
10089e86db79SHyon Kim "RegisterLibrary function not found. lib: %s\n",
10099e86db79SHyon Kim librarypath, 0, 0);
10109e86db79SHyon Kim continue;
10119e86db79SHyon Kim }
10129e86db79SHyon Kim /*
10139e86db79SHyon Kim * Load the function points directly into
10149e86db79SHyon Kim * the table of functions
10159e86db79SHyon Kim */
10169e86db79SHyon Kim status = ((RegisterFunc)
10179e86db79SHyon Kim ((HBA_ENTRYPOINTS *)(&lib_infop->ftable.functionTable)));
10189e86db79SHyon Kim if (status != HBA_STATUS_OK) {
10199e86db79SHyon Kim /* library not loaded */
10209e86db79SHyon Kim (void) fprintf(stderr,
10219e86db79SHyon Kim "HBA_LoadLibrary: vendor specific RegisterLibrary "
10229e86db79SHyon Kim "function encountered an error. lib: %s\n",
10239e86db79SHyon Kim librarypath);
10249e86db79SHyon Kim DEBUG(1,
10259e86db79SHyon Kim "HBA_LoadLibrary: vendor specific RegisterLibrary "
10269e86db79SHyon Kim "function encountered an error. lib: %s\n",
10279e86db79SHyon Kim librarypath, 0, 0);
10289e86db79SHyon Kim continue;
10299e86db79SHyon Kim } else {
10309e86db79SHyon Kim lib_infop->version = HBAAPI;
10319e86db79SHyon Kim }
10329e86db79SHyon Kim }
10339e86db79SHyon Kim }
10349e86db79SHyon Kim
10359e86db79SHyon Kim /* successfully loaded library */
10369e86db79SHyon Kim /*
10379e86db79SHyon Kim * SM-HBA and HBAAPI has a seperate handler for GetVersion but
10389e86db79SHyon Kim * they have the same function signature so use the same variable here.
10399e86db79SHyon Kim */
10409e86db79SHyon Kim if ((GetVersionFunc = FUNCCOMMON(lib_infop, GetVersionHandler))
10419e86db79SHyon Kim == NULL) {
10429e86db79SHyon Kim continue;
10439e86db79SHyon Kim }
10449e86db79SHyon Kim if (lib_infop->version == SMHBA) {
10459e86db79SHyon Kim libversion = ((GetVersionFunc)());
10469e86db79SHyon Kim if (libversion < SMHBA_LIBVERSION) {
10479e86db79SHyon Kim (void) printf("Library version mismatch."
10489e86db79SHyon Kim "Got %d expected %d.\n",
10499e86db79SHyon Kim libversion, SMHBA_LIBVERSION);
10509e86db79SHyon Kim continue;
10519e86db79SHyon Kim }
10529e86db79SHyon Kim } else {
10539e86db79SHyon Kim libversion = ((GetVersionFunc)());
10549e86db79SHyon Kim /* Check the version of this library before loading */
10559e86db79SHyon Kim /* Actually... This wrapper is compatible with version 1 */
10569e86db79SHyon Kim if (libversion < HBA_LIBVERSION) {
10579e86db79SHyon Kim (void) printf("Library version mismatch."
10589e86db79SHyon Kim "Got %d expected %d.\n",
10599e86db79SHyon Kim libversion, HBA_LIBVERSION);
10609e86db79SHyon Kim continue;
10619e86db79SHyon Kim }
10629e86db79SHyon Kim }
10639e86db79SHyon Kim
10649e86db79SHyon Kim DEBUG(1, "%s libversion = %d", librarypath, libversion, 0);
10659e86db79SHyon Kim LoadLibraryFunc = FUNCCOMMON(lib_infop, LoadLibraryHandler);
10669e86db79SHyon Kim if (LoadLibraryFunc == NULL) {
10679e86db79SHyon Kim /* this function is required */
10689e86db79SHyon Kim (void) fprintf(stderr,
10699e86db79SHyon Kim "HBA_LoadLibrary: vendor specific LoadLibrary "
10709e86db79SHyon Kim "function not found. lib: %s\n", librarypath);
10719e86db79SHyon Kim DEBUG(1, "HBA_LoadLibrary: vendor specific LoadLibrary "
10729e86db79SHyon Kim "function not found. lib: %s\n", librarypath, 0, 0);
10739e86db79SHyon Kim continue;
10749e86db79SHyon Kim }
10759e86db79SHyon Kim /* Initialize this library */
10769e86db79SHyon Kim if ((status = ((LoadLibraryFunc)())) != HBA_STATUS_OK) {
10779e86db79SHyon Kim /* maybe this should be a printf so that we CANNOT miss it */
10789e86db79SHyon Kim (void) fprintf(stderr,
10799e86db79SHyon Kim "HBA_LoadLibrary: Encounterd and error loading: %s",
10809e86db79SHyon Kim librarypath);
10819e86db79SHyon Kim DEBUG(1, "Encounterd and error loading: %s", librarypath, 0, 0);
10829e86db79SHyon Kim DEBUG(1, " HBA_STATUS: %d", status, 0, 0);
10839e86db79SHyon Kim continue;
10849e86db79SHyon Kim }
10859e86db79SHyon Kim /* successfully loaded library */
10869e86db79SHyon Kim lib_infop->status = HBA_LIBRARY_LOADED;
10879e86db79SHyon Kim }
10889e86db79SHyon Kim #endif /* WIN32 or UNIX */
10899e86db79SHyon Kim #ifdef POSIX_THREADS
10909e86db79SHyon Kim /*
10919e86db79SHyon Kim * The _hbaapi_LL_mutex is already grabbed to proctect the caller of
10929e86db79SHyon Kim * HBA_FreeLibrary() during loading.
10939e86db79SHyon Kim * The mutexes are already initialized
10949e86db79SHyon Kim * with PTHREAD_MUTEX_INITIALIZER. Do we need to init again?
10959e86db79SHyon Kim * Keeping the code from HBAAPI source...
10969e86db79SHyon Kim */
10979e86db79SHyon Kim ret = pthread_mutex_init(&_hbaapi_AL_mutex, NULL);
10989e86db79SHyon Kim if (ret == 0) {
10999e86db79SHyon Kim ret = pthread_mutex_init(&_hbaapi_AAE_mutex, NULL);
11009e86db79SHyon Kim }
11019e86db79SHyon Kim if (ret == 0) {
11029e86db79SHyon Kim ret = pthread_mutex_init(&_hbaapi_AE_mutex, NULL);
11039e86db79SHyon Kim }
11049e86db79SHyon Kim if (ret == 0) {
11059e86db79SHyon Kim ret = pthread_mutex_init(&_hbaapi_APE_mutex, NULL);
11069e86db79SHyon Kim }
11079e86db79SHyon Kim if (ret == 0) {
11089e86db79SHyon Kim ret = pthread_mutex_init(&_hbaapi_APSE_mutex, NULL);
11099e86db79SHyon Kim }
11109e86db79SHyon Kim if (ret == 0) {
11119e86db79SHyon Kim ret = pthread_mutex_init(&_hbaapi_TE_mutex, NULL);
11129e86db79SHyon Kim }
11139e86db79SHyon Kim if (ret == 0) {
11149e86db79SHyon Kim ret = pthread_mutex_init(&_smhba_AAE_mutex, NULL);
11159e86db79SHyon Kim }
11169e86db79SHyon Kim if (ret == 0) {
11179e86db79SHyon Kim ret = pthread_mutex_init(&_smhba_AE_mutex, NULL);
11189e86db79SHyon Kim }
11199e86db79SHyon Kim if (ret == 0) {
11209e86db79SHyon Kim ret = pthread_mutex_init(&_smhba_APE_mutex, NULL);
11219e86db79SHyon Kim }
11229e86db79SHyon Kim if (ret == 0) {
11239e86db79SHyon Kim ret = pthread_mutex_init(&_smhba_APSE_mutex, NULL);
11249e86db79SHyon Kim }
11259e86db79SHyon Kim if (ret == 0) {
11269e86db79SHyon Kim ret = pthread_mutex_init(&_smhba_TE_mutex, NULL);
11279e86db79SHyon Kim }
11289e86db79SHyon Kim if (ret == 0) {
11299e86db79SHyon Kim ret = pthread_mutex_init(&_hbaapi_LE_mutex, NULL);
11309e86db79SHyon Kim }
11319e86db79SHyon Kim if (ret != 0) {
11329e86db79SHyon Kim perror("pthread_mutex_init - HBA_LoadLibrary");
11339e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_LL_mutex);
11349e86db79SHyon Kim return (HBA_STATUS_ERROR);
11359e86db79SHyon Kim }
11369e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_LL_mutex);
11379e86db79SHyon Kim #elif defined(WIN32)
11389e86db79SHyon Kim InitializeCriticalSection(&_hbaapi_LL_mutex);
11399e86db79SHyon Kim InitializeCriticalSection(&_hbaapi_AL_mutex);
11409e86db79SHyon Kim InitializeCriticalSection(&_hbaapi_AAE_mutex);
11419e86db79SHyon Kim InitializeCriticalSection(&_hbaapi_AE_mutex);
11429e86db79SHyon Kim InitializeCriticalSection(&_hbaapi_APE_mutex);
11439e86db79SHyon Kim InitializeCriticalSection(&_hbaapi_APSE_mutex);
11449e86db79SHyon Kim InitializeCriticalSection(&_hbaapi_TE_mutex);
11459e86db79SHyon Kim InitializeCriticalSection(&_hbaapi_LE_mutex);
11469e86db79SHyon Kim InitializeCriticalSection(&_smhba_AAE_mutex);
11479e86db79SHyon Kim InitializeCriticalSection(&_smhba_AE_mutex);
11489e86db79SHyon Kim InitializeCriticalSection(&_smhba_APE_mutex);
11499e86db79SHyon Kim InitializeCriticalSection(&_smhba_APSE_mutex);
11509e86db79SHyon Kim InitializeCriticalSection(&_smhba_TE_mutex);
11519e86db79SHyon Kim #endif
11529e86db79SHyon Kim
11539e86db79SHyon Kim return (HBA_STATUS_OK);
11549e86db79SHyon Kim }
11559e86db79SHyon Kim
11569e86db79SHyon Kim HBA_STATUS
HBA_FreeLibrary()11579e86db79SHyon Kim HBA_FreeLibrary() {
11589e86db79SHyon Kim HBAFreeLibraryFunc FreeLibraryFunc;
11599e86db79SHyon Kim /* LINTED E_FUNC_SET_NOT_USED */
11609e86db79SHyon Kim HBA_STATUS status;
11619e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
11629e86db79SHyon Kim HBA_LIBRARY_INFO *lib_next;
11639e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM
11649e86db79SHyon Kim ***listp;
11659e86db79SHyon Kim HBA_ADAPTER_INFO *adapt_infop;
11669e86db79SHyon Kim HBA_ADAPTER_INFO *adapt_next;
11679e86db79SHyon Kim
11689e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_LL_mutex);
11699e86db79SHyon Kim if (_hbaapi_librarylist == NULL) {
11709e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_LL_mutex);
11719e86db79SHyon Kim return (HBA_STATUS_ERROR_NOT_LOADED);
11729e86db79SHyon Kim }
11739e86db79SHyon Kim
11749e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_AL_mutex);
11759e86db79SHyon Kim
11769e86db79SHyon Kim DEBUG(1, "HBA_FreeLibrary()", 0, 0, 0);
11779e86db79SHyon Kim for (lib_infop = _hbaapi_librarylist; lib_infop != NULL;
11789e86db79SHyon Kim lib_infop = lib_next) {
11799e86db79SHyon Kim lib_next = lib_infop->next;
11809e86db79SHyon Kim if (lib_infop->status == HBA_LIBRARY_LOADED) {
11819e86db79SHyon Kim FreeLibraryFunc = FUNCCOMMON(lib_infop, FreeLibraryHandler);
11829e86db79SHyon Kim if (FreeLibraryFunc != NULL) {
11839e86db79SHyon Kim /* Free this library */
11849e86db79SHyon Kim status = ((FreeLibraryFunc)());
11859e86db79SHyon Kim DEBUG(1, "HBA_FreeLibrary() Failed %d", status, 0, 0);
11869e86db79SHyon Kim }
11879e86db79SHyon Kim #ifdef WIN32
11889e86db79SHyon Kim FreeLibrary(lib_infop->hLibrary); /* Unload DLL from memory */
11899e86db79SHyon Kim #else
11909e86db79SHyon Kim (void) dlclose(lib_infop->hLibrary); /* Unload DLL from memory */
11919e86db79SHyon Kim #endif
11929e86db79SHyon Kim }
11939e86db79SHyon Kim #ifndef WIN32
11949e86db79SHyon Kim free(lib_infop->LibraryName);
11959e86db79SHyon Kim #endif
11969e86db79SHyon Kim free(lib_infop->LibraryPath);
11979e86db79SHyon Kim free(lib_infop);
11989e86db79SHyon Kim
11999e86db79SHyon Kim }
12009e86db79SHyon Kim _hbaapi_librarylist = NULL;
12019e86db79SHyon Kim /*
12029e86db79SHyon Kim * OK, now all functions are disabled except for LoadLibrary,
12039e86db79SHyon Kim * Hope no other thread calls it before we have returned
12049e86db79SHyon Kim */
12059e86db79SHyon Kim _hbaapi_total_library_count = 0;
12069e86db79SHyon Kim
12079e86db79SHyon Kim for (adapt_infop = _hbaapi_adapterlist;
12089e86db79SHyon Kim adapt_infop != NULL;
12099e86db79SHyon Kim adapt_infop = adapt_next) {
12109e86db79SHyon Kim adapt_next = adapt_infop->next;
12119e86db79SHyon Kim free(adapt_infop->name);
12129e86db79SHyon Kim free(adapt_infop);
12139e86db79SHyon Kim }
12149e86db79SHyon Kim _hbaapi_adapterlist = NULL;
12159e86db79SHyon Kim _hbaapi_total_adapter_count = 0;
12169e86db79SHyon Kim
12179e86db79SHyon Kim /*
12189e86db79SHyon Kim * Free up the callbacks, this is not the most efficient, but it works
12199e86db79SHyon Kim */
12209e86db79SHyon Kim while ((volatile HBA_ADAPTERCALLBACK_ELEM *)
12219e86db79SHyon Kim _hbaapi_adapteraddevents_callback_list
12229e86db79SHyon Kim != NULL) {
12239e86db79SHyon Kim (void) local_remove_callback((HBA_CALLBACKHANDLE)
12249e86db79SHyon Kim _hbaapi_adapteraddevents_callback_list);
12259e86db79SHyon Kim }
12269e86db79SHyon Kim while ((volatile HBA_ADAPTERCALLBACK_ELEM *)
12279e86db79SHyon Kim _smhba_adapteraddevents_callback_list
12289e86db79SHyon Kim != NULL) {
12299e86db79SHyon Kim (void) local_remove_callback((HBA_CALLBACKHANDLE)
12309e86db79SHyon Kim _smhba_adapteraddevents_callback_list);
12319e86db79SHyon Kim }
12329e86db79SHyon Kim for (listp = cb_lists_array; *listp != NULL; listp++) {
12339e86db79SHyon Kim while ((volatile HBA_ADAPTERCALLBACK_ELEM ***)**listp != NULL) {
12349e86db79SHyon Kim (void) local_remove_callback((HBA_CALLBACKHANDLE)**listp);
12359e86db79SHyon Kim }
12369e86db79SHyon Kim }
12379e86db79SHyon Kim
12389e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_AL_mutex);
12399e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_LL_mutex);
12409e86db79SHyon Kim
12419e86db79SHyon Kim #ifdef USESYSLOG
12429e86db79SHyon Kim closelog();
12439e86db79SHyon Kim #endif
12449e86db79SHyon Kim #ifdef USELOGFILE
12459e86db79SHyon Kim if (_hbaapi_debug_fd != NULL) {
12469e86db79SHyon Kim fclose(_hbaapi_debug_fd);
12479e86db79SHyon Kim }
12489e86db79SHyon Kim _hbaapi_debug_fd = NULL;
12499e86db79SHyon Kim #endif
12509e86db79SHyon Kim #ifdef POSIX_THREADS
12519e86db79SHyon Kim /* this will unlock them as well, but who cares */
12529e86db79SHyon Kim (void) pthread_mutex_destroy(&_hbaapi_LE_mutex);
12539e86db79SHyon Kim (void) pthread_mutex_destroy(&_hbaapi_TE_mutex);
12549e86db79SHyon Kim (void) pthread_mutex_destroy(&_hbaapi_APSE_mutex);
12559e86db79SHyon Kim (void) pthread_mutex_destroy(&_hbaapi_APE_mutex);
12569e86db79SHyon Kim (void) pthread_mutex_destroy(&_hbaapi_AE_mutex);
12579e86db79SHyon Kim (void) pthread_mutex_destroy(&_hbaapi_AAE_mutex);
12589e86db79SHyon Kim (void) pthread_mutex_destroy(&_smhba_TE_mutex);
12599e86db79SHyon Kim (void) pthread_mutex_destroy(&_smhba_APSE_mutex);
12609e86db79SHyon Kim (void) pthread_mutex_destroy(&_smhba_APE_mutex);
12619e86db79SHyon Kim (void) pthread_mutex_destroy(&_smhba_AE_mutex);
12629e86db79SHyon Kim (void) pthread_mutex_destroy(&_smhba_AAE_mutex);
12639e86db79SHyon Kim (void) pthread_mutex_destroy(&_hbaapi_AL_mutex);
12649e86db79SHyon Kim (void) pthread_mutex_destroy(&_hbaapi_LL_mutex);
12659e86db79SHyon Kim #elif defined(WIN32)
12669e86db79SHyon Kim DeleteCriticalSection(&_hbaapi_LL_mutex);
12679e86db79SHyon Kim DeleteCriticalSection(&_hbaapi_AL_mutex);
12689e86db79SHyon Kim DeleteCriticalSection(&_hbaapi_AAE_mutex);
12699e86db79SHyon Kim DeleteCriticalSection(&_hbaapi_AE_mutex);
12709e86db79SHyon Kim DeleteCriticalSection(&_hbaapi_APE_mutex);
12719e86db79SHyon Kim DeleteCriticalSection(&_hbaapi_APSE_mutex);
12729e86db79SHyon Kim DeleteCriticalSection(&_hbaapi_TE_mutex);
12739e86db79SHyon Kim DeleteCriticalSection(&_hbaapi_LE_mutex);
12749e86db79SHyon Kim DeleteCriticalSection(&_smhba_TE_mutex);
12759e86db79SHyon Kim DeleteCriticalSection(&_smhba_APSE_mutex);
12769e86db79SHyon Kim DeleteCriticalSection(&_smhba_APE_mutex);
12779e86db79SHyon Kim DeleteCriticalSection(&_smhba_AE_mutex);
12789e86db79SHyon Kim DeleteCriticalSection(&_smhba_AAE_mutex);
12799e86db79SHyon Kim #endif
12809e86db79SHyon Kim
12819e86db79SHyon Kim return (HBA_STATUS_OK);
12829e86db79SHyon Kim }
12839e86db79SHyon Kim
12849e86db79SHyon Kim /*
12859e86db79SHyon Kim * The API used to use fixed size tables as its primary data structure.
12869e86db79SHyon Kim * Indexing from 1 to N identified each adapters. Now the adapters are
12879e86db79SHyon Kim * on a linked list. There is a unique "index" foreach each adapter.
12889e86db79SHyon Kim * Adapters always keep their index, even if they are removed from the
12899e86db79SHyon Kim * hardware. The only time the indexing is reset is on HBA_FreeLibrary
12909e86db79SHyon Kim */
12919e86db79SHyon Kim HBA_UINT32
HBA_GetNumberOfAdapters()12929e86db79SHyon Kim HBA_GetNumberOfAdapters()
12939e86db79SHyon Kim {
12949e86db79SHyon Kim int j = 0;
12959e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
12969e86db79SHyon Kim HBAGetNumberOfAdaptersFunc GetNumberOfAdaptersFunc;
12979e86db79SHyon Kim HBAGetAdapterNameFunc GetAdapterNameFunc;
12989e86db79SHyon Kim HBA_BOOLEAN found_name;
12999e86db79SHyon Kim HBA_ADAPTER_INFO *adapt_infop;
13009e86db79SHyon Kim HBA_STATUS status;
13019e86db79SHyon Kim
13029e86db79SHyon Kim char adaptername[256];
13039e86db79SHyon Kim int num_adapters; /* local */
13049e86db79SHyon Kim
13059e86db79SHyon Kim if (_hbaapi_librarylist == NULL) {
13069e86db79SHyon Kim return (0);
13079e86db79SHyon Kim }
13089e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_LL_mutex); /* pay attention to order */
13099e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_AL_mutex);
13109e86db79SHyon Kim
13119e86db79SHyon Kim for (lib_infop = _hbaapi_librarylist;
13129e86db79SHyon Kim lib_infop != NULL;
13139e86db79SHyon Kim lib_infop = lib_infop->next) {
13149e86db79SHyon Kim
13159e86db79SHyon Kim if (lib_infop->status != HBA_LIBRARY_LOADED) {
13169e86db79SHyon Kim continue;
13179e86db79SHyon Kim }
13189e86db79SHyon Kim
13199e86db79SHyon Kim GetNumberOfAdaptersFunc =
13209e86db79SHyon Kim FUNCCOMMON(lib_infop, GetNumberOfAdaptersHandler);
13219e86db79SHyon Kim if (GetNumberOfAdaptersFunc == NULL) {
13229e86db79SHyon Kim continue;
13239e86db79SHyon Kim }
13249e86db79SHyon Kim num_adapters = ((GetNumberOfAdaptersFunc)());
13259e86db79SHyon Kim #ifndef WIN32
13269e86db79SHyon Kim DEBUG(1, "HBAAPI: num_adapters for %s = %d\n",
13279e86db79SHyon Kim lib_infop->LibraryName, num_adapters, 0);
13289e86db79SHyon Kim #else
13299e86db79SHyon Kim DEBUG(1, "HBAAPI: num_adapters for %s = %d\n",
13309e86db79SHyon Kim lib_infop->LibraryPath, num_adapters, 0);
13319e86db79SHyon Kim #endif
13329e86db79SHyon Kim
13339e86db79SHyon Kim /* Also get the names of all the adapters here and cache */
13349e86db79SHyon Kim GetAdapterNameFunc = FUNCCOMMON(lib_infop, GetAdapterNameHandler);
13359e86db79SHyon Kim if (GetAdapterNameFunc == NULL) {
13369e86db79SHyon Kim continue;
13379e86db79SHyon Kim }
13389e86db79SHyon Kim
13399e86db79SHyon Kim for (j = 0; j < num_adapters; j++) {
13409e86db79SHyon Kim found_name = 0;
13419e86db79SHyon Kim status = (GetAdapterNameFunc)(j, (char *)&adaptername);
13429e86db79SHyon Kim if (status == HBA_STATUS_OK) {
13439e86db79SHyon Kim for (adapt_infop = _hbaapi_adapterlist;
13449e86db79SHyon Kim adapt_infop != NULL;
13459e86db79SHyon Kim adapt_infop = adapt_infop->next) {
13469e86db79SHyon Kim /*
13479e86db79SHyon Kim * check for duplicates, really,
13489e86db79SHyon Kim * this may just be a second
13499e86db79SHyon Kim * call to this function
13509e86db79SHyon Kim * ??? how do we know when a name becomes stale?
13519e86db79SHyon Kim */
13529e86db79SHyon Kim if (strcmp(adaptername, adapt_infop->name) == 0) {
13539e86db79SHyon Kim /* already got this one */
13549e86db79SHyon Kim found_name++;
13559e86db79SHyon Kim break;
13569e86db79SHyon Kim }
13579e86db79SHyon Kim }
13589e86db79SHyon Kim if (found_name != 0) {
13599e86db79SHyon Kim continue;
13609e86db79SHyon Kim }
13619e86db79SHyon Kim }
13629e86db79SHyon Kim
13639e86db79SHyon Kim adapt_infop = (HBA_ADAPTER_INFO *)
13649e86db79SHyon Kim calloc(1, sizeof (HBA_ADAPTER_INFO));
13659e86db79SHyon Kim if (adapt_infop == NULL) {
13669e86db79SHyon Kim #ifndef WIN32
13679e86db79SHyon Kim (void) fprintf(stderr,
13689e86db79SHyon Kim "HBA_GetNumberOfAdapters: calloc failed"
13699e86db79SHyon Kim " on sizeof:%lu\n",
13709e86db79SHyon Kim (unsigned long)(sizeof (HBA_ADAPTER_INFO)));
13719e86db79SHyon Kim #endif
13729e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_AL_mutex);
13739e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex,
13749e86db79SHyon Kim _hbaapi_total_adapter_count);
13759e86db79SHyon Kim }
13769e86db79SHyon Kim if ((adapt_infop->GNstatus = status) == HBA_STATUS_OK) {
13779e86db79SHyon Kim adapt_infop->name = strdup(adaptername);
13789e86db79SHyon Kim } else {
13799e86db79SHyon Kim char dummyname[512];
13809e86db79SHyon Kim (void) sprintf(dummyname, "NULLADAPTER-%255s-%03d",
13819e86db79SHyon Kim lib_infop->LibraryPath, _hbaapi_total_adapter_count);
13829e86db79SHyon Kim dummyname[511] = '\0';
13839e86db79SHyon Kim adapt_infop->name = strdup(dummyname);
13849e86db79SHyon Kim }
13859e86db79SHyon Kim lib_infop->numOfAdapters++;
13869e86db79SHyon Kim adapt_infop->library = lib_infop;
13879e86db79SHyon Kim adapt_infop->next = _hbaapi_adapterlist;
13889e86db79SHyon Kim adapt_infop->index = _hbaapi_total_adapter_count;
13899e86db79SHyon Kim _hbaapi_adapterlist = adapt_infop;
13909e86db79SHyon Kim _hbaapi_total_adapter_count++;
13919e86db79SHyon Kim }
13929e86db79SHyon Kim }
13939e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_AL_mutex);
13949e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, _hbaapi_total_adapter_count);
13959e86db79SHyon Kim }
13969e86db79SHyon Kim
13979e86db79SHyon Kim HBA_STATUS
HBA_GetAdapterName(HBA_UINT32 adapterindex,char * adaptername)13989e86db79SHyon Kim HBA_GetAdapterName(
13999e86db79SHyon Kim HBA_UINT32 adapterindex,
14009e86db79SHyon Kim char *adaptername)
14019e86db79SHyon Kim {
14029e86db79SHyon Kim HBA_ADAPTER_INFO *adapt_infop;
14039e86db79SHyon Kim HBA_STATUS ret = HBA_STATUS_ERROR_ILLEGAL_INDEX;
14049e86db79SHyon Kim
14059e86db79SHyon Kim if (adaptername == NULL) {
1406*0778188fSHengqing Hu DEBUG(1, "HBA_GetAdapterName: NULL pointer adaptername",
14079e86db79SHyon Kim 0, 0, 0);
14089e86db79SHyon Kim return (HBA_STATUS_ERROR_ARG);
14099e86db79SHyon Kim }
14109e86db79SHyon Kim
14119e86db79SHyon Kim /*
14129e86db79SHyon Kim * The adapter index is from old code, but we have
14139e86db79SHyon Kim * to support it. Go down the list looking for
14149e86db79SHyon Kim * the adapter
14159e86db79SHyon Kim */
14169e86db79SHyon Kim ARE_WE_INITED();
14179e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_AL_mutex);
14189e86db79SHyon Kim *adaptername = '\0';
14199e86db79SHyon Kim for (adapt_infop = _hbaapi_adapterlist;
14209e86db79SHyon Kim adapt_infop != NULL;
14219e86db79SHyon Kim adapt_infop = adapt_infop->next) {
14229e86db79SHyon Kim
14239e86db79SHyon Kim if (adapt_infop->index == adapterindex) {
14249e86db79SHyon Kim if (adapt_infop->name != NULL &&
14259e86db79SHyon Kim adapt_infop->GNstatus == HBA_STATUS_OK) {
14269e86db79SHyon Kim (void) strcpy(adaptername, adapt_infop->name);
14279e86db79SHyon Kim } else {
14289e86db79SHyon Kim *adaptername = '\0';
14299e86db79SHyon Kim }
14309e86db79SHyon Kim ret = adapt_infop->GNstatus;
14319e86db79SHyon Kim break;
14329e86db79SHyon Kim }
14339e86db79SHyon Kim }
14349e86db79SHyon Kim DEBUG(2, "GetAdapterName for index:%d ->%s",
14359e86db79SHyon Kim adapterindex, adaptername, 0);
14369e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_AL_mutex, ret);
14379e86db79SHyon Kim }
14389e86db79SHyon Kim
14399e86db79SHyon Kim HBA_HANDLE
HBA_OpenAdapter(char * adaptername)14409e86db79SHyon Kim HBA_OpenAdapter(char *adaptername)
14419e86db79SHyon Kim {
14429e86db79SHyon Kim HBA_HANDLE handle;
14439e86db79SHyon Kim HBAOpenAdapterFunc OpenAdapterFunc;
14449e86db79SHyon Kim HBA_ADAPTER_INFO *adapt_infop;
14459e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
14469e86db79SHyon Kim
14479e86db79SHyon Kim DEBUG(2, "OpenAdapter: %s", adaptername, 0, 0);
14489e86db79SHyon Kim
14499e86db79SHyon Kim handle = HBA_HANDLE_INVALID;
14509e86db79SHyon Kim if (_hbaapi_librarylist == NULL) {
14519e86db79SHyon Kim return (handle);
14529e86db79SHyon Kim }
14539e86db79SHyon Kim if (adaptername == NULL) {
1454*0778188fSHengqing Hu DEBUG(1, "HBA_OpenAdapter: NULL pointer adaptername",
14559e86db79SHyon Kim 0, 0, 0);
14569e86db79SHyon Kim return (handle);
14579e86db79SHyon Kim }
14589e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_AL_mutex);
14599e86db79SHyon Kim for (adapt_infop = _hbaapi_adapterlist;
14609e86db79SHyon Kim adapt_infop != NULL;
14619e86db79SHyon Kim adapt_infop = adapt_infop->next) {
14629e86db79SHyon Kim if (strcmp(adaptername, adapt_infop->name) != 0) {
14639e86db79SHyon Kim continue;
14649e86db79SHyon Kim }
14659e86db79SHyon Kim lib_infop = adapt_infop->library;
14669e86db79SHyon Kim OpenAdapterFunc = FUNCCOMMON(lib_infop, OpenAdapterHandler);
14679e86db79SHyon Kim
14689e86db79SHyon Kim if (OpenAdapterFunc != NULL) {
14699e86db79SHyon Kim /* retrieve the vendor handle */
14709e86db79SHyon Kim handle = (OpenAdapterFunc)(adaptername);
14719e86db79SHyon Kim if (handle != 0) {
14729e86db79SHyon Kim /* or this with the library index to get the common handle */
14739e86db79SHyon Kim handle = HBA_HANDLE_FROM_LOCAL(lib_infop->index, handle);
14749e86db79SHyon Kim }
14759e86db79SHyon Kim }
14769e86db79SHyon Kim break;
14779e86db79SHyon Kim }
14789e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_AL_mutex, handle);
14799e86db79SHyon Kim }
14809e86db79SHyon Kim
14819e86db79SHyon Kim /*
14829e86db79SHyon Kim * Finding an adapter with matching WWN.
14839e86db79SHyon Kim */
14849e86db79SHyon Kim HBA_STATUS
HBA_OpenAdapterByWWN(HBA_HANDLE * phandle,HBA_WWN nodeWWN)14859e86db79SHyon Kim HBA_OpenAdapterByWWN(HBA_HANDLE *phandle, HBA_WWN nodeWWN) {
14869e86db79SHyon Kim HBA_HANDLE handle;
14879e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
14889e86db79SHyon Kim HBAGetNumberOfAdaptersFunc
14899e86db79SHyon Kim GetNumberOfAdaptersFunc;
14909e86db79SHyon Kim HBAOpenAdapterByWWNFunc
14919e86db79SHyon Kim OpenAdapterFunc;
14929e86db79SHyon Kim HBA_STATUS status;
14939e86db79SHyon Kim
14949e86db79SHyon Kim DEBUG(2, "OpenAdapterByWWN: %s", WWN2STR1(&nodeWWN), 0, 0);
14959e86db79SHyon Kim ARE_WE_INITED();
14969e86db79SHyon Kim
14979e86db79SHyon Kim *phandle = HBA_HANDLE_INVALID;
14989e86db79SHyon Kim
14999e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_LL_mutex);
15009e86db79SHyon Kim for (lib_infop = _hbaapi_librarylist;
15019e86db79SHyon Kim lib_infop != NULL;
15029e86db79SHyon Kim lib_infop = lib_infop->next) {
15039e86db79SHyon Kim
15049e86db79SHyon Kim status = HBA_STATUS_ERROR_ILLEGAL_WWN;
15059e86db79SHyon Kim
15069e86db79SHyon Kim if (lib_infop->status != HBA_LIBRARY_LOADED) {
15079e86db79SHyon Kim continue;
15089e86db79SHyon Kim }
15099e86db79SHyon Kim
15109e86db79SHyon Kim /* only for HBAAPIV2 */
15119e86db79SHyon Kim if (lib_infop->version != HBAAPIV2) {
15129e86db79SHyon Kim continue;
15139e86db79SHyon Kim }
15149e86db79SHyon Kim
15159e86db79SHyon Kim GetNumberOfAdaptersFunc =
15169e86db79SHyon Kim FUNCCOMMON(lib_infop, GetNumberOfAdaptersHandler);
15179e86db79SHyon Kim if (GetNumberOfAdaptersFunc == NULL) {
15189e86db79SHyon Kim continue;
15199e86db79SHyon Kim }
15209e86db79SHyon Kim
15219e86db79SHyon Kim /* look for new hardware */
15229e86db79SHyon Kim (void) ((GetNumberOfAdaptersFunc)());
15239e86db79SHyon Kim
15249e86db79SHyon Kim OpenAdapterFunc =
15259e86db79SHyon Kim lib_infop->ftable.functionTable.OpenAdapterByWWNHandler;
15269e86db79SHyon Kim if (OpenAdapterFunc == NULL) {
15279e86db79SHyon Kim continue;
15289e86db79SHyon Kim }
15299e86db79SHyon Kim /*
15309e86db79SHyon Kim * We do not know if the WWN is known by this vendor,
15319e86db79SHyon Kim * just try it
15329e86db79SHyon Kim */
15339e86db79SHyon Kim if ((status = (OpenAdapterFunc)(&handle, nodeWWN)) != HBA_STATUS_OK) {
15349e86db79SHyon Kim continue;
15359e86db79SHyon Kim }
15369e86db79SHyon Kim /* OK, make a vendor non-specific handle */
15379e86db79SHyon Kim *phandle = HBA_HANDLE_FROM_LOCAL(lib_infop->index, handle);
15389e86db79SHyon Kim status = HBA_STATUS_OK;
15399e86db79SHyon Kim break;
15409e86db79SHyon Kim }
15419e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
15429e86db79SHyon Kim }
15439e86db79SHyon Kim
15449e86db79SHyon Kim void
HBA_RefreshAdapterConfiguration()15459e86db79SHyon Kim HBA_RefreshAdapterConfiguration() {
15469e86db79SHyon Kim DEBUG(2, "HBA_RefreshAdapterConfiguration", 0, 0, 0);
15479e86db79SHyon Kim (void) HBA_GetNumberOfAdapters();
15489e86db79SHyon Kim }
15499e86db79SHyon Kim
15509e86db79SHyon Kim HBA_UINT32
HBA_GetVersion()15519e86db79SHyon Kim HBA_GetVersion() {
15529e86db79SHyon Kim DEBUG(2, "HBA_GetVersion", 0, 0, 0);
15539e86db79SHyon Kim return (HBA_LIBVERSION);
15549e86db79SHyon Kim }
15559e86db79SHyon Kim
15569e86db79SHyon Kim /*
15579e86db79SHyon Kim * This function is VERY OS dependent. Wing it as best you can.
15589e86db79SHyon Kim */
15599e86db79SHyon Kim HBA_UINT32
HBA_GetWrapperLibraryAttributes(HBA_LIBRARYATTRIBUTES * attributes)15609e86db79SHyon Kim HBA_GetWrapperLibraryAttributes(
15619e86db79SHyon Kim HBA_LIBRARYATTRIBUTES *attributes)
15629e86db79SHyon Kim {
15639e86db79SHyon Kim
15649e86db79SHyon Kim DEBUG(2, "HBA_GetWrapperLibraryAttributes", 0, 0, 0);
15659e86db79SHyon Kim
15669e86db79SHyon Kim if (attributes == NULL) {
15679e86db79SHyon Kim DEBUG(1, "HBA_GetWrapperLibraryAttributes:"
15689e86db79SHyon Kim "NULL pointer attributes",
15699e86db79SHyon Kim 0, 0, 0);
15709e86db79SHyon Kim return (HBA_STATUS_ERROR_ARG);
15719e86db79SHyon Kim }
15729e86db79SHyon Kim
15739e86db79SHyon Kim (void) memset(attributes, 0, sizeof (HBA_LIBRARYATTRIBUTES));
15749e86db79SHyon Kim
15759e86db79SHyon Kim #if defined(SOLARIS)
15769e86db79SHyon Kim if ((handle = dlopen("libHBAAPI.so", RTLD_NOW)) != NULL) {
15779e86db79SHyon Kim if (dlinfo(handle, RTLD_DI_LINKMAP, &map) >= 0) {
15789e86db79SHyon Kim for (mp = map; mp != NULL; mp = mp->l_next) {
15799e86db79SHyon Kim if (strlen(map->l_name) < 256) {
15809e86db79SHyon Kim (void) strcpy(attributes->LibPath, map->l_name);
15819e86db79SHyon Kim }
15829e86db79SHyon Kim }
15839e86db79SHyon Kim }
15849e86db79SHyon Kim }
15859e86db79SHyon Kim #elif defined(WIN32)
15869e86db79SHyon Kim HMODULE module;
15879e86db79SHyon Kim
15889e86db79SHyon Kim /* No need to do anything with the module handle */
15899e86db79SHyon Kim /* It wasn't alloocated so it doesn't need to be freed */
15909e86db79SHyon Kim module = GetModuleHandle("HBAAPI");
15919e86db79SHyon Kim if (module != NULL) {
15929e86db79SHyon Kim if (GetModuleFileName(module, attributes->LibPath,
15939e86db79SHyon Kim sizeof (attributes->LibPath)) == 0) {
15949e86db79SHyon Kim attributes->LibPath[0] = '\0';
15959e86db79SHyon Kim }
15969e86db79SHyon Kim }
15979e86db79SHyon Kim #endif
15989e86db79SHyon Kim #if defined(VENDOR)
15999e86db79SHyon Kim (void) strcpy(attributes->VName, VENDOR);
16009e86db79SHyon Kim #else
16019e86db79SHyon Kim attributes->VName[0] = '\0';
16029e86db79SHyon Kim #endif
16039e86db79SHyon Kim #if defined(VERSION)
16049e86db79SHyon Kim (void) strcpy(attributes->VVersion, VERSION);
16059e86db79SHyon Kim #else
16069e86db79SHyon Kim attributes->VVersion[0] = '\0';
16079e86db79SHyon Kim #endif
16089e86db79SHyon Kim #if defined(BUILD_DATE)
16099e86db79SHyon Kim #if defined(WIN32)
16109e86db79SHyon Kim int matchCount;
16119e86db79SHyon Kim matchCount = sscanf(BUILD_DATE, "%u/%u/%u %u:%u:%u",
16129e86db79SHyon Kim &attributes->build_date.tm_year,
16139e86db79SHyon Kim &attributes->build_date.tm_mon,
16149e86db79SHyon Kim &attributes->build_date.tm_mday,
16159e86db79SHyon Kim &attributes->build_date.tm_hour,
16169e86db79SHyon Kim &attributes->build_date.tm_min,
16179e86db79SHyon Kim &attributes->build_date.tm_sec);
16189e86db79SHyon Kim
16199e86db79SHyon Kim if (matchCount != 6) {
16209e86db79SHyon Kim memset(&attributes->build_date, 0, sizeof (struct tm));
16219e86db79SHyon Kim } else {
16229e86db79SHyon Kim attributes->build_date.tm_year -= 1900;
16239e86db79SHyon Kim attributes->build_date.tm_isdst = -1;
16249e86db79SHyon Kim }
16259e86db79SHyon Kim #else
16269e86db79SHyon Kim if (strptime(BUILD_DATE,
16279e86db79SHyon Kim "%Y/%m/%d %T %Z", &(attributes->build_date)) == NULL) {
16289e86db79SHyon Kim (void) memset(&attributes->build_date, 0, sizeof (struct tm));
16299e86db79SHyon Kim }
16309e86db79SHyon Kim #endif
16319e86db79SHyon Kim #else
16329e86db79SHyon Kim (void) memset(&attributes->build_date, 0, sizeof (struct tm));
16339e86db79SHyon Kim #endif
16349e86db79SHyon Kim return (2);
16359e86db79SHyon Kim }
16369e86db79SHyon Kim
16379e86db79SHyon Kim /*
16389e86db79SHyon Kim * Callback registation and handling
16399e86db79SHyon Kim */
16409e86db79SHyon Kim HBA_STATUS
HBA_RemoveCallback(HBA_CALLBACKHANDLE cbhandle)16419e86db79SHyon Kim HBA_RemoveCallback(HBA_CALLBACKHANDLE cbhandle) {
16429e86db79SHyon Kim HBA_STATUS status;
16439e86db79SHyon Kim
16449e86db79SHyon Kim DEBUG(2, "HBA_RemoveCallback", 0, 0, 0);
16459e86db79SHyon Kim ARE_WE_INITED();
16469e86db79SHyon Kim
16479e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_LL_mutex);
16489e86db79SHyon Kim status = local_remove_callback(cbhandle);
16499e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
16509e86db79SHyon Kim }
16519e86db79SHyon Kim
16529e86db79SHyon Kim /* Adapter Add Events ************************************************* */
16539e86db79SHyon Kim static void
16549e86db79SHyon Kim /* LINTED E_FUNC_ARG_UNUSED */
adapteraddevents_callback(void * data,HBA_WWN PortWWN,HBA_UINT32 eventType)16559e86db79SHyon Kim adapteraddevents_callback(void *data, HBA_WWN PortWWN, HBA_UINT32 eventType) {
16569e86db79SHyon Kim HBA_ALLADAPTERSCALLBACK_ELEM *cbp;
16579e86db79SHyon Kim
16589e86db79SHyon Kim DEBUG(3, "AddAdapterEvent, port: %s", WWN2STR1(&PortWWN), 0, 0);
16599e86db79SHyon Kim
16609e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_AAE_mutex);
16619e86db79SHyon Kim for (cbp = _hbaapi_adapteraddevents_callback_list;
16629e86db79SHyon Kim cbp != NULL;
16639e86db79SHyon Kim cbp = cbp->next) {
16649e86db79SHyon Kim (*cbp->callback)(data, PortWWN, HBA_EVENT_ADAPTER_ADD);
16659e86db79SHyon Kim }
16669e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_AAE_mutex);
16679e86db79SHyon Kim
16689e86db79SHyon Kim }
16699e86db79SHyon Kim
16709e86db79SHyon Kim HBA_STATUS
HBA_RegisterForAdapterAddEvents(void (* callback)(void * data,HBA_WWN PortWWN,HBA_UINT32 eventType),void * userData,HBA_CALLBACKHANDLE * callbackHandle)16719e86db79SHyon Kim HBA_RegisterForAdapterAddEvents(
16729e86db79SHyon Kim void (*callback)(
16739e86db79SHyon Kim void *data,
16749e86db79SHyon Kim HBA_WWN PortWWN,
16759e86db79SHyon Kim HBA_UINT32 eventType),
16769e86db79SHyon Kim void *userData,
16779e86db79SHyon Kim HBA_CALLBACKHANDLE *callbackHandle) {
16789e86db79SHyon Kim
16799e86db79SHyon Kim HBA_ALLADAPTERSCALLBACK_ELEM *cbp;
16809e86db79SHyon Kim HBA_VENDORCALLBACK_ELEM *vcbp;
16819e86db79SHyon Kim HBA_VENDORCALLBACK_ELEM *vendorhandlelist;
16829e86db79SHyon Kim HBARegisterForAdapterAddEventsFunc registeredfunc;
16839e86db79SHyon Kim HBA_STATUS status = HBA_STATUS_OK;
16849e86db79SHyon Kim HBA_STATUS failure = HBA_STATUS_OK;
16859e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
16869e86db79SHyon Kim int registered_cnt = 0;
16879e86db79SHyon Kim int vendor_cnt = 0;
16889e86db79SHyon Kim int not_supported_cnt = 0;
16899e86db79SHyon Kim int status_OK_bar_cnt = 0;
16909e86db79SHyon Kim int status_OK_cnt = 0;
16919e86db79SHyon Kim
16929e86db79SHyon Kim DEBUG(2, "HBA_RegisterForAdapterAddEvents", 0, 0, 0);
16939e86db79SHyon Kim ARE_WE_INITED();
16949e86db79SHyon Kim
16959e86db79SHyon Kim cbp = (HBA_ALLADAPTERSCALLBACK_ELEM *)
16969e86db79SHyon Kim calloc(1, sizeof (HBA_ALLADAPTERSCALLBACK_ELEM));
16979e86db79SHyon Kim *callbackHandle = (HBA_CALLBACKHANDLE) cbp;
16989e86db79SHyon Kim if (cbp == NULL) {
16999e86db79SHyon Kim #ifndef WIN32
17009e86db79SHyon Kim (void) fprintf(stderr,
17019e86db79SHyon Kim "HBA_RegisterForAdapterAddEvents: calloc failed "
17029e86db79SHyon Kim "for %lu bytes\n",
17039e86db79SHyon Kim (unsigned long)(sizeof (HBA_ALLADAPTERSCALLBACK_ELEM)));
17049e86db79SHyon Kim #endif
17059e86db79SHyon Kim return (HBA_STATUS_ERROR);
17069e86db79SHyon Kim }
17079e86db79SHyon Kim
17089e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_LL_mutex);
17099e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_AAE_mutex);
17109e86db79SHyon Kim cbp->callback = callback;
17119e86db79SHyon Kim cbp->next = _hbaapi_adapteraddevents_callback_list;
17129e86db79SHyon Kim _hbaapi_adapteraddevents_callback_list = cbp;
17139e86db79SHyon Kim /*
17149e86db79SHyon Kim * Need to release the mutex now incase the vendor function invokes the
17159e86db79SHyon Kim * callback. We will grap the mutex later to attach the vendor handle
17169e86db79SHyon Kim * list to the callback structure
17179e86db79SHyon Kim */
17189e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_AAE_mutex);
17199e86db79SHyon Kim
17209e86db79SHyon Kim /*
17219e86db79SHyon Kim * now create a list of vendors (vendor libraryies, NOT ADAPTERS)
17229e86db79SHyon Kim * that have successfully registerred
17239e86db79SHyon Kim */
17249e86db79SHyon Kim vendorhandlelist = NULL;
17259e86db79SHyon Kim for (lib_infop = _hbaapi_librarylist;
17269e86db79SHyon Kim lib_infop != NULL;
17279e86db79SHyon Kim lib_infop = lib_infop->next) {
17289e86db79SHyon Kim
17299e86db79SHyon Kim /* only for HBAAPI V2 */
17309e86db79SHyon Kim if ((lib_infop->version != HBAAPIV2)) {
17319e86db79SHyon Kim continue;
17329e86db79SHyon Kim } else {
17339e86db79SHyon Kim vendor_cnt++;
17349e86db79SHyon Kim }
17359e86db79SHyon Kim
17369e86db79SHyon Kim registeredfunc =
17379e86db79SHyon Kim lib_infop->ftable.functionTable.RegisterForAdapterAddEventsHandler;
17389e86db79SHyon Kim if (registeredfunc == NULL) {
17399e86db79SHyon Kim continue;
17409e86db79SHyon Kim }
17419e86db79SHyon Kim
17429e86db79SHyon Kim vcbp = (HBA_VENDORCALLBACK_ELEM *)
17439e86db79SHyon Kim calloc(1, sizeof (HBA_VENDORCALLBACK_ELEM));
17449e86db79SHyon Kim if (vcbp == NULL) {
17459e86db79SHyon Kim #ifndef WIN32
17469e86db79SHyon Kim (void) fprintf(stderr,
17479e86db79SHyon Kim "HBA_RegisterForAdapterAddEvents: "
17489e86db79SHyon Kim "calloc failed for %lu bytes\n",
17499e86db79SHyon Kim (unsigned long)(sizeof (HBA_VENDORCALLBACK_ELEM)));
17509e86db79SHyon Kim #endif
17519e86db79SHyon Kim freevendorhandlelist(vendorhandlelist);
17529e86db79SHyon Kim status = HBA_STATUS_ERROR;
17539e86db79SHyon Kim break;
17549e86db79SHyon Kim }
17559e86db79SHyon Kim
17569e86db79SHyon Kim registered_cnt++;
17579e86db79SHyon Kim status = (registeredfunc)(adapteraddevents_callback,
17589e86db79SHyon Kim userData, &vcbp->vendorcbhandle);
17599e86db79SHyon Kim if (status == HBA_STATUS_ERROR_NOT_SUPPORTED) {
17609e86db79SHyon Kim not_supported_cnt++;
17619e86db79SHyon Kim free(vcbp);
17629e86db79SHyon Kim continue;
17639e86db79SHyon Kim } else if (status != HBA_STATUS_OK) {
17649e86db79SHyon Kim status_OK_bar_cnt++;
17659e86db79SHyon Kim DEBUG(1,
17669e86db79SHyon Kim "HBA_RegisterForAdapterAddEvents: Library->%s, Error->%d",
17679e86db79SHyon Kim lib_infop->LibraryPath, status, 0);
17689e86db79SHyon Kim #ifndef WIN32
17699e86db79SHyon Kim (void) fprintf(stderr,
17709e86db79SHyon Kim "HBA_RegisterForAdapterAddEvents: Library->%s, Error->%d",
17719e86db79SHyon Kim lib_infop->LibraryPath, status);
17729e86db79SHyon Kim #endif
17739e86db79SHyon Kim failure = status;
17749e86db79SHyon Kim free(vcbp);
17759e86db79SHyon Kim continue;
17769e86db79SHyon Kim } else {
17779e86db79SHyon Kim status_OK_cnt++;
17789e86db79SHyon Kim }
17799e86db79SHyon Kim vcbp->lib_info = lib_infop;
17809e86db79SHyon Kim vcbp->next = vendorhandlelist;
17819e86db79SHyon Kim vendorhandlelist = vcbp;
17829e86db79SHyon Kim }
17839e86db79SHyon Kim if (vendor_cnt == 0) {
17849e86db79SHyon Kim /* no HBAAPIV2 is deteced. should be okay? */
17859e86db79SHyon Kim status = HBA_STATUS_ERROR;
17869e86db79SHyon Kim } else if (registered_cnt == 0) {
17879e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
17889e86db79SHyon Kim freevendorhandlelist(vendorhandlelist);
17899e86db79SHyon Kim (void) local_remove_callback((HBA_CALLBACKHANDLE) cbp);
17909e86db79SHyon Kim } else if (status_OK_cnt == 0 && not_supported_cnt != 0) {
17919e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
17929e86db79SHyon Kim } else if (status_OK_cnt == 0) {
17939e86db79SHyon Kim /*
17949e86db79SHyon Kim * At least one vendor library registered this function, but no
17959e86db79SHyon Kim * vendor call succeeded
17969e86db79SHyon Kim */
17979e86db79SHyon Kim (void) local_remove_callback((HBA_CALLBACKHANDLE) cbp);
17989e86db79SHyon Kim status = failure;
17999e86db79SHyon Kim } else {
18009e86db79SHyon Kim /* we have had atleast some success, now finish up */
18019e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_AAE_mutex);
18029e86db79SHyon Kim /*
18039e86db79SHyon Kim * this seems silly, but what if another thread called
18049e86db79SHyon Kim * the callback remove
18059e86db79SHyon Kim */
18069e86db79SHyon Kim for (cbp = _hbaapi_adapteraddevents_callback_list;
18079e86db79SHyon Kim cbp != NULL; cbp = cbp->next) {
18089e86db79SHyon Kim if ((HBA_CALLBACKHANDLE)cbp == *callbackHandle) {
18099e86db79SHyon Kim /* yup, its still there, hooray */
18109e86db79SHyon Kim cbp->vendorhandlelist = vendorhandlelist;
18119e86db79SHyon Kim vendorhandlelist = NULL;
18129e86db79SHyon Kim break;
18139e86db79SHyon Kim }
18149e86db79SHyon Kim }
18159e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_AAE_mutex);
18169e86db79SHyon Kim if (vendorhandlelist != NULL) {
18179e86db79SHyon Kim /*
18189e86db79SHyon Kim * bummer, somebody removed the callback before we finished
18199e86db79SHyon Kim * registration, probably will never happen
18209e86db79SHyon Kim */
18219e86db79SHyon Kim freevendorhandlelist(vendorhandlelist);
18229e86db79SHyon Kim DEBUG(1,
18239e86db79SHyon Kim "HBA_RegisterForAdapterAddEvents: HBA_RemoveCallback was "
18249e86db79SHyon Kim "called for a handle before registration was finished.",
18259e86db79SHyon Kim 0, 0, 0);
18269e86db79SHyon Kim status = HBA_STATUS_ERROR;
18279e86db79SHyon Kim } else {
18289e86db79SHyon Kim status = HBA_STATUS_OK;
18299e86db79SHyon Kim }
18309e86db79SHyon Kim }
18319e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
18329e86db79SHyon Kim }
18339e86db79SHyon Kim
18349e86db79SHyon Kim /* Adapter Events (other than add) ************************************** */
18359e86db79SHyon Kim static void
adapterevents_callback(void * data,HBA_WWN PortWWN,HBA_UINT32 eventType)18369e86db79SHyon Kim adapterevents_callback(void *data,
18379e86db79SHyon Kim HBA_WWN PortWWN,
18389e86db79SHyon Kim HBA_UINT32 eventType) {
18399e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
18409e86db79SHyon Kim
18419e86db79SHyon Kim DEBUG(3, "AdapterEvent, port:%s, eventType:%d", WWN2STR1(&PortWWN),
18429e86db79SHyon Kim eventType, 0);
18439e86db79SHyon Kim
18449e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_AE_mutex);
18459e86db79SHyon Kim for (acbp = _hbaapi_adapterevents_callback_list;
18469e86db79SHyon Kim acbp != NULL;
18479e86db79SHyon Kim acbp = acbp->next) {
18489e86db79SHyon Kim if (data == (void *)acbp) {
18499e86db79SHyon Kim (*acbp->callback)(acbp->userdata, PortWWN, eventType);
18509e86db79SHyon Kim break;
18519e86db79SHyon Kim }
18529e86db79SHyon Kim }
18539e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_AE_mutex);
18549e86db79SHyon Kim }
18559e86db79SHyon Kim HBA_STATUS
HBA_RegisterForAdapterEvents(void (* callback)(void * data,HBA_WWN PortWWN,HBA_UINT32 eventType),void * userData,HBA_HANDLE handle,HBA_CALLBACKHANDLE * callbackHandle)18569e86db79SHyon Kim HBA_RegisterForAdapterEvents(
18579e86db79SHyon Kim void (*callback) (
18589e86db79SHyon Kim void *data,
18599e86db79SHyon Kim HBA_WWN PortWWN,
18609e86db79SHyon Kim HBA_UINT32 eventType),
18619e86db79SHyon Kim void *userData,
18629e86db79SHyon Kim HBA_HANDLE handle,
18639e86db79SHyon Kim HBA_CALLBACKHANDLE *callbackHandle) {
18649e86db79SHyon Kim
18659e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
18669e86db79SHyon Kim HBARegisterForAdapterEventsFunc registeredfunc;
18679e86db79SHyon Kim HBA_STATUS status;
18689e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
18699e86db79SHyon Kim HBA_HANDLE vendorHandle;
18709e86db79SHyon Kim
18719e86db79SHyon Kim DEBUG(2, "HBA_RegisterForAdapterEvents", 0, 0, 0);
18729e86db79SHyon Kim
18739e86db79SHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
18749e86db79SHyon Kim
18759e86db79SHyon Kim /* we now have the _hbaapi_LL_mutex */
18769e86db79SHyon Kim
18779e86db79SHyon Kim registeredfunc =
18789e86db79SHyon Kim lib_infop->ftable.functionTable.RegisterForAdapterEventsHandler;
18799e86db79SHyon Kim if (registeredfunc == NULL) {
18809e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_NOT_SUPPORTED);
18819e86db79SHyon Kim }
18829e86db79SHyon Kim
18839e86db79SHyon Kim /*
18849e86db79SHyon Kim * that allocated memory is used both as the handle for the
18859e86db79SHyon Kim * caller, and as userdata to the vendor call so that on
18869e86db79SHyon Kim * callback the specific registration may be recalled
18879e86db79SHyon Kim */
18889e86db79SHyon Kim acbp = (HBA_ADAPTERCALLBACK_ELEM *)
18899e86db79SHyon Kim calloc(1, sizeof (HBA_ADAPTERCALLBACK_ELEM));
18909e86db79SHyon Kim if (acbp == NULL) {
18919e86db79SHyon Kim #ifndef WIN32
18929e86db79SHyon Kim (void) fprintf(stderr,
18939e86db79SHyon Kim "HBA_RegisterForAdapterEvents: calloc failed for %lu bytes\n",
18949e86db79SHyon Kim (unsigned long)(sizeof (HBA_ADAPTERCALLBACK_ELEM)));
18959e86db79SHyon Kim #endif
18969e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR);
18979e86db79SHyon Kim }
18989e86db79SHyon Kim *callbackHandle = (HBA_CALLBACKHANDLE) acbp;
18999e86db79SHyon Kim acbp->callback = callback;
19009e86db79SHyon Kim acbp->userdata = userData;
19019e86db79SHyon Kim acbp->lib_info = lib_infop;
19029e86db79SHyon Kim
19039e86db79SHyon Kim status = (registeredfunc)(adapterevents_callback,
19049e86db79SHyon Kim (void *)acbp,
19059e86db79SHyon Kim vendorHandle,
19069e86db79SHyon Kim &acbp->vendorcbhandle);
19079e86db79SHyon Kim if (status != HBA_STATUS_OK) {
19089e86db79SHyon Kim free(acbp);
19099e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
19109e86db79SHyon Kim }
19119e86db79SHyon Kim
19129e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_AE_mutex);
19139e86db79SHyon Kim acbp->next = _hbaapi_adapterevents_callback_list;
19149e86db79SHyon Kim _hbaapi_adapterevents_callback_list = acbp;
19159e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_AE_mutex);
19169e86db79SHyon Kim
19179e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_OK);
19189e86db79SHyon Kim }
19199e86db79SHyon Kim
19209e86db79SHyon Kim /* Adapter Port Events ************************************************** */
19219e86db79SHyon Kim static void
adapterportevents_callback(void * data,HBA_WWN PortWWN,HBA_UINT32 eventType,HBA_UINT32 fabricPortID)19229e86db79SHyon Kim adapterportevents_callback(void *data,
19239e86db79SHyon Kim HBA_WWN PortWWN,
19249e86db79SHyon Kim HBA_UINT32 eventType,
19259e86db79SHyon Kim HBA_UINT32 fabricPortID) {
19269e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
19279e86db79SHyon Kim
19289e86db79SHyon Kim DEBUG(3, "AdapterPortEvent, port:%s, eventType:%d fabricPortID:0X%06x",
19299e86db79SHyon Kim WWN2STR1(&PortWWN), eventType, fabricPortID);
19309e86db79SHyon Kim
19319e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_APE_mutex);
19329e86db79SHyon Kim
19339e86db79SHyon Kim for (acbp = _hbaapi_adapterportevents_callback_list;
19349e86db79SHyon Kim acbp != NULL;
19359e86db79SHyon Kim acbp = acbp->next) {
19369e86db79SHyon Kim if (data == (void *)acbp) {
19379e86db79SHyon Kim (*acbp->callback)(acbp->userdata, PortWWN, eventType, fabricPortID);
19389e86db79SHyon Kim break;
19399e86db79SHyon Kim }
19409e86db79SHyon Kim }
19419e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_APE_mutex);
19429e86db79SHyon Kim }
19439e86db79SHyon Kim
19449e86db79SHyon Kim 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)19459e86db79SHyon Kim HBA_RegisterForAdapterPortEvents(
19469e86db79SHyon Kim void (*callback) (
19479e86db79SHyon Kim void *data,
19489e86db79SHyon Kim HBA_WWN PortWWN,
19499e86db79SHyon Kim HBA_UINT32 eventType,
19509e86db79SHyon Kim HBA_UINT32 fabricPortID),
19519e86db79SHyon Kim void *userData,
19529e86db79SHyon Kim HBA_HANDLE handle,
19539e86db79SHyon Kim HBA_WWN PortWWN,
19549e86db79SHyon Kim HBA_CALLBACKHANDLE *callbackHandle) {
19559e86db79SHyon Kim
19569e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
19579e86db79SHyon Kim HBARegisterForAdapterPortEventsFunc registeredfunc;
19589e86db79SHyon Kim HBA_STATUS status;
19599e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
19609e86db79SHyon Kim HBA_HANDLE vendorHandle;
19619e86db79SHyon Kim
19629e86db79SHyon Kim DEBUG(2, "HBA_RegisterForAdapterPortEvents for port: %s",
19639e86db79SHyon Kim WWN2STR1(&PortWWN), 0, 0);
19649e86db79SHyon Kim
19659e86db79SHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
19669e86db79SHyon Kim /* we now have the _hbaapi_LL_mutex */
19679e86db79SHyon Kim
19689e86db79SHyon Kim registeredfunc =
19699e86db79SHyon Kim lib_infop->ftable.functionTable.RegisterForAdapterPortEventsHandler;
19709e86db79SHyon Kim if (registeredfunc == NULL) {
19719e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_NOT_SUPPORTED);
19729e86db79SHyon Kim }
19739e86db79SHyon Kim
19749e86db79SHyon Kim /*
19759e86db79SHyon Kim * that allocated memory is used both as the handle for the
19769e86db79SHyon Kim * caller, and as userdata to the vendor call so that on
19779e86db79SHyon Kim * callback the specific registration may be recalled
19789e86db79SHyon Kim */
19799e86db79SHyon Kim acbp = (HBA_ADAPTERCALLBACK_ELEM *)
19809e86db79SHyon Kim calloc(1, sizeof (HBA_ADAPTERCALLBACK_ELEM));
19819e86db79SHyon Kim if (acbp == NULL) {
19829e86db79SHyon Kim #ifndef WIN32
19839e86db79SHyon Kim (void) fprintf(stderr,
19849e86db79SHyon Kim "HBA_RegisterForAdapterPortEvents: "
19859e86db79SHyon Kim "calloc failed for %lu bytes\n",
19869e86db79SHyon Kim (unsigned long)(sizeof (HBA_ADAPTERCALLBACK_ELEM)));
19879e86db79SHyon Kim #endif
19889e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR);
19899e86db79SHyon Kim
19909e86db79SHyon Kim }
19919e86db79SHyon Kim *callbackHandle = (HBA_CALLBACKHANDLE) acbp;
19929e86db79SHyon Kim acbp->callback = callback;
19939e86db79SHyon Kim acbp->userdata = userData;
19949e86db79SHyon Kim acbp->lib_info = lib_infop;
19959e86db79SHyon Kim
19969e86db79SHyon Kim status = (registeredfunc)(adapterportevents_callback,
19979e86db79SHyon Kim (void *)acbp,
19989e86db79SHyon Kim vendorHandle,
19999e86db79SHyon Kim PortWWN,
20009e86db79SHyon Kim &acbp->vendorcbhandle);
20019e86db79SHyon Kim if (status != HBA_STATUS_OK) {
20029e86db79SHyon Kim free(acbp);
20039e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
20049e86db79SHyon Kim }
20059e86db79SHyon Kim
20069e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_APE_mutex);
20079e86db79SHyon Kim acbp->next = _hbaapi_adapterportevents_callback_list;
20089e86db79SHyon Kim _hbaapi_adapterportevents_callback_list = acbp;
20099e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_APE_mutex);
20109e86db79SHyon Kim
20119e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_OK);
20129e86db79SHyon Kim }
20139e86db79SHyon Kim
20149e86db79SHyon Kim /* Adapter State Events ************************************************ */
20159e86db79SHyon Kim static void
adapterportstatevents_callback(void * data,HBA_WWN PortWWN,HBA_UINT32 eventType)20169e86db79SHyon Kim adapterportstatevents_callback(void *data,
20179e86db79SHyon Kim HBA_WWN PortWWN,
20189e86db79SHyon Kim HBA_UINT32 eventType) {
20199e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
20209e86db79SHyon Kim
20219e86db79SHyon Kim DEBUG(3, "AdapterPortStatEvent, port:%s, eventType:%d",
20229e86db79SHyon Kim WWN2STR1(&PortWWN),
20239e86db79SHyon Kim eventType, 0);
20249e86db79SHyon Kim
20259e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_APSE_mutex);
20269e86db79SHyon Kim for (acbp = _hbaapi_adapterportstatevents_callback_list;
20279e86db79SHyon Kim acbp != NULL;
20289e86db79SHyon Kim acbp = acbp->next) {
20299e86db79SHyon Kim if (data == (void *)acbp) {
20309e86db79SHyon Kim (*acbp->callback)(acbp->userdata, PortWWN, eventType);
20319e86db79SHyon Kim return;
20329e86db79SHyon Kim }
20339e86db79SHyon Kim }
20349e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_APSE_mutex);
20359e86db79SHyon Kim }
20369e86db79SHyon Kim 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)20379e86db79SHyon Kim HBA_RegisterForAdapterPortStatEvents(
20389e86db79SHyon Kim void (*callback) (
20399e86db79SHyon Kim void *data,
20409e86db79SHyon Kim HBA_WWN PortWWN,
20419e86db79SHyon Kim HBA_UINT32 eventType),
20429e86db79SHyon Kim void *userData,
20439e86db79SHyon Kim HBA_HANDLE handle,
20449e86db79SHyon Kim HBA_WWN PortWWN,
20459e86db79SHyon Kim HBA_PORTSTATISTICS stats,
20469e86db79SHyon Kim HBA_UINT32 statType,
20479e86db79SHyon Kim HBA_CALLBACKHANDLE *callbackHandle) {
20489e86db79SHyon Kim
20499e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
20509e86db79SHyon Kim HBARegisterForAdapterPortStatEventsFunc
20519e86db79SHyon Kim registeredfunc;
20529e86db79SHyon Kim HBA_STATUS status;
20539e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
20549e86db79SHyon Kim HBA_HANDLE vendorHandle;
20559e86db79SHyon Kim
20569e86db79SHyon Kim DEBUG(2, "HBA_RegisterForAdapterPortStatEvents for port: %s",
20579e86db79SHyon Kim WWN2STR1(&PortWWN), 0, 0);
20589e86db79SHyon Kim
20599e86db79SHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
20609e86db79SHyon Kim /* we now have the _hbaapi_LL_mutex */
20619e86db79SHyon Kim
20629e86db79SHyon Kim registeredfunc =
20639e86db79SHyon Kim lib_infop->ftable.functionTable.RegisterForAdapterPortStatEventsHandler;
20649e86db79SHyon Kim if (registeredfunc == NULL) {
20659e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_NOT_SUPPORTED);
20669e86db79SHyon Kim }
20679e86db79SHyon Kim
20689e86db79SHyon Kim /*
20699e86db79SHyon Kim * that allocated memory is used both as the handle for the
20709e86db79SHyon Kim * caller, and as userdata to the vendor call so that on
20719e86db79SHyon Kim * callback the specific registration may be recalled
20729e86db79SHyon Kim */
20739e86db79SHyon Kim acbp = (HBA_ADAPTERCALLBACK_ELEM *)
20749e86db79SHyon Kim calloc(1, sizeof (HBA_ADAPTERCALLBACK_ELEM));
20759e86db79SHyon Kim if (acbp == NULL) {
20769e86db79SHyon Kim #ifndef WIN32
20779e86db79SHyon Kim (void) fprintf(stderr,
20789e86db79SHyon Kim "HBA_RegisterForAdapterPortStatEvents: "
20799e86db79SHyon Kim "calloc failed for %lu bytes\n",
20809e86db79SHyon Kim (unsigned long)(sizeof (HBA_ADAPTERCALLBACK_ELEM)));
20819e86db79SHyon Kim #endif
20829e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR);
20839e86db79SHyon Kim }
20849e86db79SHyon Kim *callbackHandle = (HBA_CALLBACKHANDLE) acbp;
20859e86db79SHyon Kim acbp->callback = callback;
20869e86db79SHyon Kim acbp->userdata = userData;
20879e86db79SHyon Kim acbp->lib_info = lib_infop;
20889e86db79SHyon Kim
20899e86db79SHyon Kim status = (registeredfunc)(adapterportstatevents_callback,
20909e86db79SHyon Kim (void *)acbp,
20919e86db79SHyon Kim vendorHandle,
20929e86db79SHyon Kim PortWWN,
20939e86db79SHyon Kim stats,
20949e86db79SHyon Kim statType,
20959e86db79SHyon Kim &acbp->vendorcbhandle);
20969e86db79SHyon Kim if (status != HBA_STATUS_OK) {
20979e86db79SHyon Kim free(acbp);
20989e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
20999e86db79SHyon Kim }
21009e86db79SHyon Kim
21019e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_APSE_mutex);
21029e86db79SHyon Kim acbp->next = _hbaapi_adapterportstatevents_callback_list;
21039e86db79SHyon Kim _hbaapi_adapterportstatevents_callback_list = acbp;
21049e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_APSE_mutex);
21059e86db79SHyon Kim
21069e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_OK);
21079e86db79SHyon Kim }
21089e86db79SHyon Kim
21099e86db79SHyon Kim /* Target Events ******************************************************* */
21109e86db79SHyon Kim static void
targetevents_callback(void * data,HBA_WWN hbaPortWWN,HBA_WWN discoveredPortWWN,HBA_UINT32 eventType)21119e86db79SHyon Kim targetevents_callback(void *data,
21129e86db79SHyon Kim HBA_WWN hbaPortWWN,
21139e86db79SHyon Kim HBA_WWN discoveredPortWWN,
21149e86db79SHyon Kim HBA_UINT32 eventType) {
21159e86db79SHyon Kim
21169e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
21179e86db79SHyon Kim
21189e86db79SHyon Kim DEBUG(3, "TargetEvent, hbaPort:%s, discoveredPort:%s eventType:%d",
21199e86db79SHyon Kim WWN2STR1(&hbaPortWWN), WWN2STR2(&discoveredPortWWN), eventType);
21209e86db79SHyon Kim
21219e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_TE_mutex);
21229e86db79SHyon Kim for (acbp = _hbaapi_targetevents_callback_list;
21239e86db79SHyon Kim acbp != NULL;
21249e86db79SHyon Kim acbp = acbp->next) {
21259e86db79SHyon Kim if (data == (void *)acbp) {
21269e86db79SHyon Kim (*acbp->callback)(acbp->userdata, hbaPortWWN,
21279e86db79SHyon Kim discoveredPortWWN, eventType);
21289e86db79SHyon Kim break;
21299e86db79SHyon Kim }
21309e86db79SHyon Kim }
21319e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_TE_mutex);
21329e86db79SHyon Kim }
21339e86db79SHyon Kim
21349e86db79SHyon Kim 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)21359e86db79SHyon Kim HBA_RegisterForTargetEvents(
21369e86db79SHyon Kim void (*callback) (
21379e86db79SHyon Kim void *data,
21389e86db79SHyon Kim HBA_WWN hbaPortWWN,
21399e86db79SHyon Kim HBA_WWN discoveredPortWWN,
21409e86db79SHyon Kim HBA_UINT32 eventType),
21419e86db79SHyon Kim void *userData,
21429e86db79SHyon Kim HBA_HANDLE handle,
21439e86db79SHyon Kim HBA_WWN hbaPortWWN,
21449e86db79SHyon Kim HBA_WWN discoveredPortWWN,
21459e86db79SHyon Kim HBA_CALLBACKHANDLE *callbackHandle,
21469e86db79SHyon Kim HBA_UINT32 allTargets) {
21479e86db79SHyon Kim
21489e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM
21499e86db79SHyon Kim *acbp;
21509e86db79SHyon Kim HBARegisterForTargetEventsFunc
21519e86db79SHyon Kim registeredfunc;
21529e86db79SHyon Kim HBA_STATUS status;
21539e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
21549e86db79SHyon Kim HBA_HANDLE vendorHandle;
21559e86db79SHyon Kim
21569e86db79SHyon Kim DEBUG(2, "HBA_RegisterForTargetEvents, hbaPort: %s, discoveredPort: %s",
21579e86db79SHyon Kim WWN2STR1(&hbaPortWWN), WWN2STR2(&discoveredPortWWN), 0);
21589e86db79SHyon Kim
21599e86db79SHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
21609e86db79SHyon Kim /* we now have the _hbaapi_LL_mutex */
21619e86db79SHyon Kim
21629e86db79SHyon Kim registeredfunc =
21639e86db79SHyon Kim lib_infop->ftable.functionTable.RegisterForTargetEventsHandler;
21649e86db79SHyon Kim if (registeredfunc == NULL) {
21659e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_NOT_SUPPORTED);
21669e86db79SHyon Kim }
21679e86db79SHyon Kim
21689e86db79SHyon Kim /*
21699e86db79SHyon Kim * that allocated memory is used both as the handle for the
21709e86db79SHyon Kim * caller, and as userdata to the vendor call so that on
21719e86db79SHyon Kim * callback the specific registration may be recalled
21729e86db79SHyon Kim */
21739e86db79SHyon Kim acbp = (HBA_ADAPTERCALLBACK_ELEM *)
21749e86db79SHyon Kim calloc(1, sizeof (HBA_ADAPTERCALLBACK_ELEM));
21759e86db79SHyon Kim if (acbp == NULL) {
21769e86db79SHyon Kim #ifndef WIN32
21779e86db79SHyon Kim (void) fprintf(stderr,
21789e86db79SHyon Kim "HBA_RegisterForTargetEvents: calloc failed for %lu bytes\n",
21799e86db79SHyon Kim (unsigned long)(sizeof (HBA_ADAPTERCALLBACK_ELEM)));
21809e86db79SHyon Kim #endif
21819e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR);
21829e86db79SHyon Kim }
21839e86db79SHyon Kim *callbackHandle = (HBA_CALLBACKHANDLE) acbp;
21849e86db79SHyon Kim acbp->callback = callback;
21859e86db79SHyon Kim acbp->userdata = userData;
21869e86db79SHyon Kim acbp->lib_info = lib_infop;
21879e86db79SHyon Kim
21889e86db79SHyon Kim status = (registeredfunc)(targetevents_callback,
21899e86db79SHyon Kim (void *)acbp,
21909e86db79SHyon Kim vendorHandle,
21919e86db79SHyon Kim hbaPortWWN,
21929e86db79SHyon Kim discoveredPortWWN,
21939e86db79SHyon Kim &acbp->vendorcbhandle,
21949e86db79SHyon Kim allTargets);
21959e86db79SHyon Kim if (status != HBA_STATUS_OK) {
21969e86db79SHyon Kim free(acbp);
21979e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
21989e86db79SHyon Kim }
21999e86db79SHyon Kim
22009e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_TE_mutex);
22019e86db79SHyon Kim acbp->next = _hbaapi_targetevents_callback_list;
22029e86db79SHyon Kim _hbaapi_targetevents_callback_list = acbp;
22039e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_TE_mutex);
22049e86db79SHyon Kim
22059e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_OK);
22069e86db79SHyon Kim }
22079e86db79SHyon Kim
22089e86db79SHyon Kim /* Link Events ********************************************************* */
22099e86db79SHyon Kim static void
linkevents_callback(void * data,HBA_WWN adapterWWN,HBA_UINT32 eventType,void * pRLIRBuffer,HBA_UINT32 RLIRBufferSize)22109e86db79SHyon Kim linkevents_callback(void *data,
22119e86db79SHyon Kim HBA_WWN adapterWWN,
22129e86db79SHyon Kim HBA_UINT32 eventType,
22139e86db79SHyon Kim void *pRLIRBuffer,
22149e86db79SHyon Kim HBA_UINT32 RLIRBufferSize) {
22159e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
22169e86db79SHyon Kim
22179e86db79SHyon Kim DEBUG(3, "LinkEvent, hbaWWN:%s, eventType:%d",
22189e86db79SHyon Kim WWN2STR1(&adapterWWN), eventType, 0);
22199e86db79SHyon Kim
22209e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_LE_mutex);
22219e86db79SHyon Kim for (acbp = _hbaapi_linkevents_callback_list;
22229e86db79SHyon Kim acbp != NULL;
22239e86db79SHyon Kim acbp = acbp->next) {
22249e86db79SHyon Kim if (data == (void *)acbp) {
22259e86db79SHyon Kim (*acbp->callback)(acbp->userdata, adapterWWN,
22269e86db79SHyon Kim eventType, pRLIRBuffer, RLIRBufferSize);
22279e86db79SHyon Kim break;
22289e86db79SHyon Kim }
22299e86db79SHyon Kim }
22309e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_LE_mutex);
22319e86db79SHyon Kim }
22329e86db79SHyon Kim 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)22339e86db79SHyon Kim HBA_RegisterForLinkEvents(
22349e86db79SHyon Kim void (*callback) (
22359e86db79SHyon Kim void *data,
22369e86db79SHyon Kim HBA_WWN adapterWWN,
22379e86db79SHyon Kim HBA_UINT32 eventType,
22389e86db79SHyon Kim void *pRLIRBuffer,
22399e86db79SHyon Kim HBA_UINT32 RLIRBufferSize),
22409e86db79SHyon Kim void *userData,
22419e86db79SHyon Kim void *pRLIRBuffer,
22429e86db79SHyon Kim HBA_UINT32 RLIRBufferSize,
22439e86db79SHyon Kim HBA_HANDLE handle,
22449e86db79SHyon Kim HBA_CALLBACKHANDLE *callbackHandle) {
22459e86db79SHyon Kim
22469e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
22479e86db79SHyon Kim HBARegisterForLinkEventsFunc
22489e86db79SHyon Kim registeredfunc;
22499e86db79SHyon Kim HBA_STATUS status;
22509e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
22519e86db79SHyon Kim HBA_HANDLE vendorHandle;
22529e86db79SHyon Kim
22539e86db79SHyon Kim DEBUG(2, "HBA_RegisterForLinkEvents", 0, 0, 0);
22549e86db79SHyon Kim
22559e86db79SHyon Kim CHECKLIBRARY();
22569e86db79SHyon Kim /* we now have the _hbaapi_LL_mutex */
22579e86db79SHyon Kim
22589e86db79SHyon Kim registeredfunc = FUNCCOMMON(lib_infop, RegisterForLinkEventsHandler);
22599e86db79SHyon Kim
22609e86db79SHyon Kim if (registeredfunc == NULL) {
22619e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_NOT_SUPPORTED);
22629e86db79SHyon Kim }
22639e86db79SHyon Kim
22649e86db79SHyon Kim /*
22659e86db79SHyon Kim * that allocated memory is used both as the handle for the
22669e86db79SHyon Kim * caller, and as userdata to the vendor call so that on
22679e86db79SHyon Kim * callback the specific registration may be recalled
22689e86db79SHyon Kim */
22699e86db79SHyon Kim acbp = (HBA_ADAPTERCALLBACK_ELEM *)
22709e86db79SHyon Kim calloc(1, sizeof (HBA_ADAPTERCALLBACK_ELEM));
22719e86db79SHyon Kim if (acbp == NULL) {
22729e86db79SHyon Kim #ifndef WIN32
22739e86db79SHyon Kim (void) fprintf(stderr,
22749e86db79SHyon Kim "HBA_RegisterForLinkEvents: calloc failed for %lu bytes\n",
22759e86db79SHyon Kim (unsigned long)(sizeof (HBA_ADAPTERCALLBACK_ELEM)));
22769e86db79SHyon Kim #endif
22779e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR);
22789e86db79SHyon Kim }
22799e86db79SHyon Kim *callbackHandle = (HBA_CALLBACKHANDLE) acbp;
22809e86db79SHyon Kim acbp->callback = callback;
22819e86db79SHyon Kim acbp->userdata = userData;
22829e86db79SHyon Kim acbp->lib_info = lib_infop;
22839e86db79SHyon Kim
22849e86db79SHyon Kim status = (registeredfunc)(linkevents_callback,
22859e86db79SHyon Kim (void *)acbp,
22869e86db79SHyon Kim pRLIRBuffer,
22879e86db79SHyon Kim RLIRBufferSize,
22889e86db79SHyon Kim vendorHandle,
22899e86db79SHyon Kim &acbp->vendorcbhandle);
22909e86db79SHyon Kim if (status != HBA_STATUS_OK) {
22919e86db79SHyon Kim free(acbp);
22929e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
22939e86db79SHyon Kim }
22949e86db79SHyon Kim
22959e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_LE_mutex);
22969e86db79SHyon Kim acbp->next = _hbaapi_linkevents_callback_list;
22979e86db79SHyon Kim _hbaapi_linkevents_callback_list = acbp;
22989e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_LE_mutex);
22999e86db79SHyon Kim
23009e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_OK);
23019e86db79SHyon Kim }
23029e86db79SHyon Kim
23039e86db79SHyon Kim /*
23049e86db79SHyon Kim * All of the functions below are almost passthru functions to the
23059e86db79SHyon Kim * vendor specific function
23069e86db79SHyon Kim */
23079e86db79SHyon Kim
23089e86db79SHyon Kim void
HBA_CloseAdapter(HBA_HANDLE handle)23099e86db79SHyon Kim HBA_CloseAdapter(HBA_HANDLE handle) {
23109e86db79SHyon Kim HBA_STATUS status;
23119e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
23129e86db79SHyon Kim HBA_HANDLE vendorHandle;
23139e86db79SHyon Kim HBACloseAdapterFunc CloseAdapterFunc;
23149e86db79SHyon Kim
23159e86db79SHyon Kim DEBUG(2, "HBA_CloseAdapter", 0, 0, 0);
23169e86db79SHyon Kim
23179e86db79SHyon Kim status = HBA_CheckLibrary(handle, &lib_infop, &vendorHandle);
23189e86db79SHyon Kim if (status == HBA_STATUS_OK) {
23199e86db79SHyon Kim CloseAdapterFunc = FUNCCOMMON(lib_infop, CloseAdapterHandler);
23209e86db79SHyon Kim if (CloseAdapterFunc != NULL) {
23219e86db79SHyon Kim ((CloseAdapterFunc)(vendorHandle));
23229e86db79SHyon Kim }
23239e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_LL_mutex);
23249e86db79SHyon Kim }
23259e86db79SHyon Kim }
23269e86db79SHyon Kim
23279e86db79SHyon Kim HBA_STATUS
HBA_GetAdapterAttributes(HBA_HANDLE handle,HBA_ADAPTERATTRIBUTES * hbaattributes)23289e86db79SHyon Kim HBA_GetAdapterAttributes(
23299e86db79SHyon Kim HBA_HANDLE handle,
23309e86db79SHyon Kim HBA_ADAPTERATTRIBUTES
23319e86db79SHyon Kim *hbaattributes)
23329e86db79SHyon Kim {
23339e86db79SHyon Kim HBA_STATUS status;
23349e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
23359e86db79SHyon Kim HBA_HANDLE vendorHandle;
23369e86db79SHyon Kim HBAGetAdapterAttributesFunc GetAdapterAttributesFunc;
23379e86db79SHyon Kim
23389e86db79SHyon Kim DEBUG(2, "HBA_GetAdapterAttributes", 0, 0, 0);
23399e86db79SHyon Kim
23409e86db79SHyon Kim CHECKLIBRARY();
23419e86db79SHyon Kim
23429e86db79SHyon Kim if (lib_infop->version == SMHBA) {
23439e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INCOMPATIBLE);
23449e86db79SHyon Kim }
23459e86db79SHyon Kim
23469e86db79SHyon Kim GetAdapterAttributesFunc =
23479e86db79SHyon Kim lib_infop->ftable.functionTable.GetAdapterAttributesHandler;
23489e86db79SHyon Kim if (GetAdapterAttributesFunc != NULL) {
23499e86db79SHyon Kim status = ((GetAdapterAttributesFunc)(vendorHandle, hbaattributes));
23509e86db79SHyon Kim } else {
23519e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
23529e86db79SHyon Kim }
23539e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
23549e86db79SHyon Kim }
23559e86db79SHyon Kim
23569e86db79SHyon Kim HBA_STATUS
HBA_GetAdapterPortAttributes(HBA_HANDLE handle,HBA_UINT32 portindex,HBA_PORTATTRIBUTES * portattributes)23579e86db79SHyon Kim HBA_GetAdapterPortAttributes(
23589e86db79SHyon Kim HBA_HANDLE handle,
23599e86db79SHyon Kim HBA_UINT32 portindex,
23609e86db79SHyon Kim HBA_PORTATTRIBUTES *portattributes)
23619e86db79SHyon Kim {
23629e86db79SHyon Kim HBA_STATUS status;
23639e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
23649e86db79SHyon Kim HBA_HANDLE vendorHandle;
23659e86db79SHyon Kim HBAGetAdapterPortAttributesFunc
23669e86db79SHyon Kim GetAdapterPortAttributesFunc;
23679e86db79SHyon Kim
23689e86db79SHyon Kim DEBUG(2, "HBA_GetAdapterPortAttributes", 0, 0, 0);
23699e86db79SHyon Kim
23709e86db79SHyon Kim CHECKLIBRARY();
23719e86db79SHyon Kim if (lib_infop->version == SMHBA) {
23729e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INCOMPATIBLE);
23739e86db79SHyon Kim }
23749e86db79SHyon Kim
23759e86db79SHyon Kim GetAdapterPortAttributesFunc =
23769e86db79SHyon Kim lib_infop->ftable.functionTable.GetAdapterPortAttributesHandler;
23779e86db79SHyon Kim if (GetAdapterPortAttributesFunc != NULL) {
23789e86db79SHyon Kim status = ((GetAdapterPortAttributesFunc)
23799e86db79SHyon Kim (vendorHandle, portindex, portattributes));
23809e86db79SHyon Kim } else {
23819e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
23829e86db79SHyon Kim }
23839e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
23849e86db79SHyon Kim }
23859e86db79SHyon Kim
23869e86db79SHyon Kim HBA_STATUS
HBA_GetPortStatistics(HBA_HANDLE handle,HBA_UINT32 portindex,HBA_PORTSTATISTICS * portstatistics)23879e86db79SHyon Kim HBA_GetPortStatistics(
23889e86db79SHyon Kim HBA_HANDLE handle,
23899e86db79SHyon Kim HBA_UINT32 portindex,
23909e86db79SHyon Kim HBA_PORTSTATISTICS *portstatistics)
23919e86db79SHyon Kim {
23929e86db79SHyon Kim HBA_STATUS status;
23939e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
23949e86db79SHyon Kim HBA_HANDLE vendorHandle;
23959e86db79SHyon Kim HBAGetPortStatisticsFunc
23969e86db79SHyon Kim GetPortStatisticsFunc;
23979e86db79SHyon Kim
23989e86db79SHyon Kim DEBUG(2, "HBA_GetPortStatistics", 0, 0, 0);
23999e86db79SHyon Kim
24009e86db79SHyon Kim CHECKLIBRARY();
24019e86db79SHyon Kim if (lib_infop->version == SMHBA) {
24029e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INCOMPATIBLE);
24039e86db79SHyon Kim }
24049e86db79SHyon Kim
24059e86db79SHyon Kim GetPortStatisticsFunc =
24069e86db79SHyon Kim lib_infop->ftable.functionTable.GetPortStatisticsHandler;
24079e86db79SHyon Kim if (GetPortStatisticsFunc != NULL) {
24089e86db79SHyon Kim status = ((GetPortStatisticsFunc)
24099e86db79SHyon Kim (vendorHandle, portindex, portstatistics));
24109e86db79SHyon Kim } else {
24119e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
24129e86db79SHyon Kim }
24139e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
24149e86db79SHyon Kim }
24159e86db79SHyon Kim
24169e86db79SHyon Kim HBA_STATUS
HBA_GetDiscoveredPortAttributes(HBA_HANDLE handle,HBA_UINT32 portindex,HBA_UINT32 discoveredportindex,HBA_PORTATTRIBUTES * portattributes)24179e86db79SHyon Kim HBA_GetDiscoveredPortAttributes(
24189e86db79SHyon Kim HBA_HANDLE handle,
24199e86db79SHyon Kim HBA_UINT32 portindex,
24209e86db79SHyon Kim HBA_UINT32 discoveredportindex,
24219e86db79SHyon Kim HBA_PORTATTRIBUTES *portattributes)
24229e86db79SHyon Kim {
24239e86db79SHyon Kim HBA_STATUS status;
24249e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
24259e86db79SHyon Kim HBA_HANDLE vendorHandle;
24269e86db79SHyon Kim HBAGetDiscoveredPortAttributesFunc
24279e86db79SHyon Kim GetDiscoveredPortAttributesFunc;
24289e86db79SHyon Kim
24299e86db79SHyon Kim DEBUG(2, "HBA_GetDiscoveredPortAttributes", 0, 0, 0);
24309e86db79SHyon Kim
24319e86db79SHyon Kim CHECKLIBRARY();
24329e86db79SHyon Kim if (lib_infop->version == SMHBA) {
24339e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INCOMPATIBLE);
24349e86db79SHyon Kim }
24359e86db79SHyon Kim
24369e86db79SHyon Kim GetDiscoveredPortAttributesFunc =
24379e86db79SHyon Kim lib_infop->ftable.functionTable.GetDiscoveredPortAttributesHandler;
24389e86db79SHyon Kim if (GetDiscoveredPortAttributesFunc != NULL) {
24399e86db79SHyon Kim status = ((GetDiscoveredPortAttributesFunc)
24409e86db79SHyon Kim (vendorHandle, portindex, discoveredportindex,
24419e86db79SHyon Kim portattributes));
24429e86db79SHyon Kim } else {
24439e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
24449e86db79SHyon Kim }
24459e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
24469e86db79SHyon Kim }
24479e86db79SHyon Kim
24489e86db79SHyon Kim HBA_STATUS
HBA_GetPortAttributesByWWN(HBA_HANDLE handle,HBA_WWN PortWWN,HBA_PORTATTRIBUTES * portattributes)24499e86db79SHyon Kim HBA_GetPortAttributesByWWN(
24509e86db79SHyon Kim HBA_HANDLE handle,
24519e86db79SHyon Kim HBA_WWN PortWWN,
24529e86db79SHyon Kim HBA_PORTATTRIBUTES *portattributes)
24539e86db79SHyon Kim {
24549e86db79SHyon Kim HBA_STATUS status;
24559e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
24569e86db79SHyon Kim HBA_HANDLE vendorHandle;
24579e86db79SHyon Kim HBAGetPortAttributesByWWNFunc
24589e86db79SHyon Kim GetPortAttributesByWWNFunc;
24599e86db79SHyon Kim
24609e86db79SHyon Kim DEBUG(2, "HBA_GetPortAttributesByWWN: %s", WWN2STR1(&PortWWN), 0, 0);
24619e86db79SHyon Kim
24629e86db79SHyon Kim CHECKLIBRARY();
24639e86db79SHyon Kim if (lib_infop->version == SMHBA) {
24649e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INCOMPATIBLE);
24659e86db79SHyon Kim }
24669e86db79SHyon Kim
24679e86db79SHyon Kim GetPortAttributesByWWNFunc =
24689e86db79SHyon Kim lib_infop->ftable.functionTable.GetPortAttributesByWWNHandler;
24699e86db79SHyon Kim if (GetPortAttributesByWWNFunc != NULL) {
24709e86db79SHyon Kim status = ((GetPortAttributesByWWNFunc)
24719e86db79SHyon Kim (vendorHandle, PortWWN, portattributes));
24729e86db79SHyon Kim } else {
24739e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
24749e86db79SHyon Kim }
24759e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
24769e86db79SHyon Kim }
24779e86db79SHyon Kim
24789e86db79SHyon Kim HBA_STATUS
HBA_SendCTPassThru(HBA_HANDLE handle,void * pReqBuffer,HBA_UINT32 ReqBufferSize,void * pRspBuffer,HBA_UINT32 RspBufferSize)24799e86db79SHyon Kim HBA_SendCTPassThru(
24809e86db79SHyon Kim HBA_HANDLE handle,
24819e86db79SHyon Kim void *pReqBuffer,
24829e86db79SHyon Kim HBA_UINT32 ReqBufferSize,
24839e86db79SHyon Kim void *pRspBuffer,
24849e86db79SHyon Kim HBA_UINT32 RspBufferSize)
24859e86db79SHyon Kim {
24869e86db79SHyon Kim HBA_STATUS status;
24879e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
24889e86db79SHyon Kim HBA_HANDLE vendorHandle;
24899e86db79SHyon Kim HBASendCTPassThruFunc
24909e86db79SHyon Kim SendCTPassThruFunc;
24919e86db79SHyon Kim
24929e86db79SHyon Kim DEBUG(2, "HBA_SendCTPassThru", 0, 0, 0);
24939e86db79SHyon Kim
24949e86db79SHyon Kim CHECKLIBRARY();
24959e86db79SHyon Kim if (lib_infop->version == SMHBA) {
24969e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INCOMPATIBLE);
24979e86db79SHyon Kim }
24989e86db79SHyon Kim
24999e86db79SHyon Kim SendCTPassThruFunc =
25009e86db79SHyon Kim lib_infop->ftable.functionTable.SendCTPassThruHandler;
25019e86db79SHyon Kim if (SendCTPassThruFunc != NULL) {
25029e86db79SHyon Kim status = (SendCTPassThruFunc)
25039e86db79SHyon Kim (vendorHandle,
25049e86db79SHyon Kim pReqBuffer, ReqBufferSize,
25059e86db79SHyon Kim pRspBuffer, RspBufferSize);
25069e86db79SHyon Kim } else {
25079e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
25089e86db79SHyon Kim }
25099e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
25109e86db79SHyon Kim }
25119e86db79SHyon Kim
25129e86db79SHyon Kim HBA_STATUS
HBA_SendCTPassThruV2(HBA_HANDLE handle,HBA_WWN hbaPortWWN,void * pReqBuffer,HBA_UINT32 ReqBufferSize,void * pRspBuffer,HBA_UINT32 * pRspBufferSize)25139e86db79SHyon Kim HBA_SendCTPassThruV2(
25149e86db79SHyon Kim HBA_HANDLE handle,
25159e86db79SHyon Kim HBA_WWN hbaPortWWN,
25169e86db79SHyon Kim void *pReqBuffer,
25179e86db79SHyon Kim HBA_UINT32 ReqBufferSize,
25189e86db79SHyon Kim void *pRspBuffer,
25199e86db79SHyon Kim HBA_UINT32 *pRspBufferSize)
25209e86db79SHyon Kim {
25219e86db79SHyon Kim HBA_STATUS status;
25229e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
25239e86db79SHyon Kim HBA_HANDLE vendorHandle;
25249e86db79SHyon Kim HBASendCTPassThruV2Func
25259e86db79SHyon Kim registeredfunc;
25269e86db79SHyon Kim
25279e86db79SHyon Kim DEBUG(2, "HBA_SendCTPassThruV2m hbaPortWWN: %s",
25289e86db79SHyon Kim WWN2STR1(&hbaPortWWN), 0, 0);
25299e86db79SHyon Kim
25309e86db79SHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
25319e86db79SHyon Kim registeredfunc = FUNCCOMMON(lib_infop, SendCTPassThruV2Handler);
25329e86db79SHyon Kim if (registeredfunc != NULL) {
25339e86db79SHyon Kim status = (registeredfunc)
25349e86db79SHyon Kim (vendorHandle, hbaPortWWN,
25359e86db79SHyon Kim pReqBuffer, ReqBufferSize,
25369e86db79SHyon Kim pRspBuffer, pRspBufferSize);
25379e86db79SHyon Kim } else {
25389e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
25399e86db79SHyon Kim }
25409e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
25419e86db79SHyon Kim }
25429e86db79SHyon Kim
25439e86db79SHyon Kim HBA_STATUS
HBA_GetEventBuffer(HBA_HANDLE handle,PHBA_EVENTINFO EventBuffer,HBA_UINT32 * EventBufferCount)25449e86db79SHyon Kim HBA_GetEventBuffer(
25459e86db79SHyon Kim HBA_HANDLE handle,
25469e86db79SHyon Kim PHBA_EVENTINFO EventBuffer,
25479e86db79SHyon Kim HBA_UINT32 *EventBufferCount)
25489e86db79SHyon Kim {
25499e86db79SHyon Kim HBA_STATUS status;
25509e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
25519e86db79SHyon Kim HBA_HANDLE vendorHandle;
25529e86db79SHyon Kim HBAGetEventBufferFunc
25539e86db79SHyon Kim GetEventBufferFunc;
25549e86db79SHyon Kim
25559e86db79SHyon Kim DEBUG(2, "HBA_GetEventBuffer", 0, 0, 0);
25569e86db79SHyon Kim
25579e86db79SHyon Kim CHECKLIBRARY();
25589e86db79SHyon Kim if (lib_infop->version == SMHBA) {
25599e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INCOMPATIBLE);
25609e86db79SHyon Kim }
25619e86db79SHyon Kim
25629e86db79SHyon Kim GetEventBufferFunc =
25639e86db79SHyon Kim lib_infop->ftable.functionTable.GetEventBufferHandler;
25649e86db79SHyon Kim if (GetEventBufferFunc != NULL) {
25659e86db79SHyon Kim status = (GetEventBufferFunc)
25669e86db79SHyon Kim (vendorHandle, EventBuffer, EventBufferCount);
25679e86db79SHyon Kim } else {
25689e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
25699e86db79SHyon Kim }
25709e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
25719e86db79SHyon Kim }
25729e86db79SHyon Kim
25739e86db79SHyon Kim HBA_STATUS
HBA_SetRNIDMgmtInfo(HBA_HANDLE handle,HBA_MGMTINFO Info)25749e86db79SHyon Kim HBA_SetRNIDMgmtInfo(HBA_HANDLE handle, HBA_MGMTINFO Info) {
25759e86db79SHyon Kim HBA_STATUS status;
25769e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
25779e86db79SHyon Kim HBA_HANDLE vendorHandle;
25789e86db79SHyon Kim HBASetRNIDMgmtInfoFunc
25799e86db79SHyon Kim SetRNIDMgmtInfoFunc;
25809e86db79SHyon Kim
25819e86db79SHyon Kim DEBUG(2, "HBA_SetRNIDMgmtInfo", 0, 0, 0);
25829e86db79SHyon Kim
25839e86db79SHyon Kim CHECKLIBRARY();
25849e86db79SHyon Kim SetRNIDMgmtInfoFunc = FUNCCOMMON(lib_infop, SetRNIDMgmtInfoHandler);
25859e86db79SHyon Kim if (SetRNIDMgmtInfoFunc != NULL) {
25869e86db79SHyon Kim status = (SetRNIDMgmtInfoFunc)(vendorHandle, Info);
25879e86db79SHyon Kim } else {
25889e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
25899e86db79SHyon Kim }
25909e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
25919e86db79SHyon Kim }
25929e86db79SHyon Kim
25939e86db79SHyon Kim HBA_STATUS
HBA_GetRNIDMgmtInfo(HBA_HANDLE handle,HBA_MGMTINFO * pInfo)25949e86db79SHyon Kim HBA_GetRNIDMgmtInfo(HBA_HANDLE handle, HBA_MGMTINFO *pInfo) {
25959e86db79SHyon Kim HBA_STATUS status;
25969e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
25979e86db79SHyon Kim HBA_HANDLE vendorHandle;
25989e86db79SHyon Kim HBAGetRNIDMgmtInfoFunc
25999e86db79SHyon Kim GetRNIDMgmtInfoFunc;
26009e86db79SHyon Kim
26019e86db79SHyon Kim DEBUG(2, "HBA_GetRNIDMgmtInfo", 0, 0, 0);
26029e86db79SHyon Kim
26039e86db79SHyon Kim CHECKLIBRARY();
26049e86db79SHyon Kim GetRNIDMgmtInfoFunc = FUNCCOMMON(lib_infop, GetRNIDMgmtInfoHandler);
26059e86db79SHyon Kim if (GetRNIDMgmtInfoFunc != NULL) {
26069e86db79SHyon Kim status = (GetRNIDMgmtInfoFunc)(vendorHandle, pInfo);
26079e86db79SHyon Kim } else {
26089e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
26099e86db79SHyon Kim }
26109e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
26119e86db79SHyon Kim }
26129e86db79SHyon Kim
26139e86db79SHyon Kim HBA_STATUS
HBA_SendRNID(HBA_HANDLE handle,HBA_WWN wwn,HBA_WWNTYPE wwntype,void * pRspBuffer,HBA_UINT32 * pRspBufferSize)26149e86db79SHyon Kim HBA_SendRNID(
26159e86db79SHyon Kim HBA_HANDLE handle,
26169e86db79SHyon Kim HBA_WWN wwn,
26179e86db79SHyon Kim HBA_WWNTYPE wwntype,
26189e86db79SHyon Kim void *pRspBuffer,
26199e86db79SHyon Kim HBA_UINT32 *pRspBufferSize)
26209e86db79SHyon Kim {
26219e86db79SHyon Kim HBA_STATUS status;
26229e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
26239e86db79SHyon Kim HBA_HANDLE vendorHandle;
26249e86db79SHyon Kim HBASendRNIDFunc SendRNIDFunc;
26259e86db79SHyon Kim
26269e86db79SHyon Kim DEBUG(2, "HBA_SendRNID for wwn: %s", WWN2STR1(&wwn), 0, 0);
26279e86db79SHyon Kim
26289e86db79SHyon Kim CHECKLIBRARY();
26299e86db79SHyon Kim if (lib_infop->version == SMHBA) {
26309e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INCOMPATIBLE);
26319e86db79SHyon Kim }
26329e86db79SHyon Kim
26339e86db79SHyon Kim SendRNIDFunc = lib_infop->ftable.functionTable.SendRNIDHandler;
26349e86db79SHyon Kim if (SendRNIDFunc != NULL) {
26359e86db79SHyon Kim status = ((SendRNIDFunc)(vendorHandle, wwn, wwntype,
26369e86db79SHyon Kim pRspBuffer, pRspBufferSize));
26379e86db79SHyon Kim } else {
26389e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
26399e86db79SHyon Kim }
26409e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
26419e86db79SHyon Kim }
26429e86db79SHyon Kim
26439e86db79SHyon Kim HBA_STATUS
HBA_SendRNIDV2(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_WWN destWWN,HBA_UINT32 destFCID,HBA_UINT32 NodeIdDataFormat,void * pRspBuffer,HBA_UINT32 * pRspBufferSize)26449e86db79SHyon Kim HBA_SendRNIDV2(
26459e86db79SHyon Kim HBA_HANDLE handle,
26469e86db79SHyon Kim HBA_WWN hbaPortWWN,
26479e86db79SHyon Kim HBA_WWN destWWN,
26489e86db79SHyon Kim HBA_UINT32 destFCID,
26499e86db79SHyon Kim HBA_UINT32 NodeIdDataFormat,
26509e86db79SHyon Kim void *pRspBuffer,
26519e86db79SHyon Kim HBA_UINT32 *pRspBufferSize)
26529e86db79SHyon Kim {
26539e86db79SHyon Kim HBA_STATUS status;
26549e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
26559e86db79SHyon Kim HBA_HANDLE vendorHandle;
26569e86db79SHyon Kim HBASendRNIDV2Func registeredfunc;
26579e86db79SHyon Kim
26589e86db79SHyon Kim DEBUG(2, "HBA_SendRNIDV2, hbaPortWWN: %s", WWN2STR1(&hbaPortWWN), 0, 0);
26599e86db79SHyon Kim
26609e86db79SHyon Kim CHECKLIBRARY();
26619e86db79SHyon Kim registeredfunc = FUNCCOMMON(lib_infop, SendRNIDV2Handler);
26629e86db79SHyon Kim if (registeredfunc != NULL) {
26639e86db79SHyon Kim status = (registeredfunc)
26649e86db79SHyon Kim (vendorHandle, hbaPortWWN, destWWN, destFCID, NodeIdDataFormat,
26659e86db79SHyon Kim pRspBuffer, pRspBufferSize);
26669e86db79SHyon Kim } else {
26679e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
26689e86db79SHyon Kim }
26699e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
26709e86db79SHyon Kim }
26719e86db79SHyon Kim
26729e86db79SHyon Kim void
HBA_RefreshInformation(HBA_HANDLE handle)26739e86db79SHyon Kim HBA_RefreshInformation(HBA_HANDLE handle) {
26749e86db79SHyon Kim HBA_STATUS status;
26759e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
26769e86db79SHyon Kim HBA_HANDLE vendorHandle;
26779e86db79SHyon Kim HBARefreshInformationFunc
26789e86db79SHyon Kim RefreshInformationFunc;
26799e86db79SHyon Kim
26809e86db79SHyon Kim DEBUG(2, "HBA_RefreshInformation", 0, 0, 0);
26819e86db79SHyon Kim
26829e86db79SHyon Kim status = HBA_CheckLibrary(handle, &lib_infop, &vendorHandle);
26839e86db79SHyon Kim if (status == HBA_STATUS_OK) {
26849e86db79SHyon Kim RefreshInformationFunc =
26859e86db79SHyon Kim FUNCCOMMON(lib_infop, RefreshInformationHandler);
26869e86db79SHyon Kim if (RefreshInformationFunc != NULL) {
26879e86db79SHyon Kim ((RefreshInformationFunc)(vendorHandle));
26889e86db79SHyon Kim }
26899e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_LL_mutex);
26909e86db79SHyon Kim }
26919e86db79SHyon Kim }
26929e86db79SHyon Kim
26939e86db79SHyon Kim void
HBA_ResetStatistics(HBA_HANDLE handle,HBA_UINT32 portindex)26949e86db79SHyon Kim HBA_ResetStatistics(HBA_HANDLE handle, HBA_UINT32 portindex) {
26959e86db79SHyon Kim HBA_STATUS status;
26969e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
26979e86db79SHyon Kim HBA_HANDLE vendorHandle;
26989e86db79SHyon Kim HBAResetStatisticsFunc
26999e86db79SHyon Kim ResetStatisticsFunc;
27009e86db79SHyon Kim
27019e86db79SHyon Kim DEBUG(2, "HBA_ResetStatistics", 0, 0, 0);
27029e86db79SHyon Kim
27039e86db79SHyon Kim status = HBA_CheckLibrary(handle, &lib_infop, &vendorHandle);
27049e86db79SHyon Kim if (status == HBA_STATUS_OK) {
27059e86db79SHyon Kim if (lib_infop->version == SMHBA) {
27069e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_LL_mutex);
27079e86db79SHyon Kim }
27089e86db79SHyon Kim
27099e86db79SHyon Kim ResetStatisticsFunc =
27109e86db79SHyon Kim lib_infop->ftable.functionTable.ResetStatisticsHandler;
27119e86db79SHyon Kim if (ResetStatisticsFunc != NULL) {
27129e86db79SHyon Kim ((ResetStatisticsFunc)(vendorHandle, portindex));
27139e86db79SHyon Kim }
27149e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_LL_mutex);
27159e86db79SHyon Kim }
27169e86db79SHyon Kim }
27179e86db79SHyon Kim
27189e86db79SHyon Kim HBA_STATUS
HBA_GetFcpTargetMapping(HBA_HANDLE handle,PHBA_FCPTARGETMAPPING mapping)27199e86db79SHyon Kim HBA_GetFcpTargetMapping(HBA_HANDLE handle, PHBA_FCPTARGETMAPPING mapping) {
27209e86db79SHyon Kim HBA_STATUS status;
27219e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
27229e86db79SHyon Kim HBA_HANDLE vendorHandle;
27239e86db79SHyon Kim HBAGetFcpTargetMappingFunc GetFcpTargetMappingFunc;
27249e86db79SHyon Kim
27259e86db79SHyon Kim DEBUG(2, "HBA_GetFcpTargetMapping", 0, 0, 0);
27269e86db79SHyon Kim
27279e86db79SHyon Kim CHECKLIBRARY();
27289e86db79SHyon Kim if (lib_infop->version == SMHBA) {
27299e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INCOMPATIBLE);
27309e86db79SHyon Kim }
27319e86db79SHyon Kim
27329e86db79SHyon Kim GetFcpTargetMappingFunc =
27339e86db79SHyon Kim lib_infop->ftable.functionTable.GetFcpTargetMappingHandler;
27349e86db79SHyon Kim if (GetFcpTargetMappingFunc != NULL) {
27359e86db79SHyon Kim status = ((GetFcpTargetMappingFunc)(vendorHandle, mapping));
27369e86db79SHyon Kim } else {
27379e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
27389e86db79SHyon Kim }
27399e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
27409e86db79SHyon Kim }
27419e86db79SHyon Kim
27429e86db79SHyon Kim HBA_STATUS
HBA_GetFcpTargetMappingV2(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_FCPTARGETMAPPINGV2 * pmapping)27439e86db79SHyon Kim HBA_GetFcpTargetMappingV2(
27449e86db79SHyon Kim HBA_HANDLE handle,
27459e86db79SHyon Kim HBA_WWN hbaPortWWN,
27469e86db79SHyon Kim HBA_FCPTARGETMAPPINGV2 *pmapping)
27479e86db79SHyon Kim {
27489e86db79SHyon Kim HBA_STATUS status;
27499e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
27509e86db79SHyon Kim HBA_HANDLE vendorHandle;
27519e86db79SHyon Kim HBAGetFcpTargetMappingV2Func
27529e86db79SHyon Kim registeredfunc;
27539e86db79SHyon Kim
27549e86db79SHyon Kim DEBUG(2, "HBA_GetFcpTargetMapping", 0, 0, 0);
27559e86db79SHyon Kim
27569e86db79SHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
27579e86db79SHyon Kim
27589e86db79SHyon Kim registeredfunc =
27599e86db79SHyon Kim lib_infop->ftable.functionTable.GetFcpTargetMappingV2Handler;
27609e86db79SHyon Kim if (registeredfunc != NULL) {
27619e86db79SHyon Kim status = ((registeredfunc)(vendorHandle, hbaPortWWN, pmapping));
27629e86db79SHyon Kim } else {
27639e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
27649e86db79SHyon Kim }
27659e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
27669e86db79SHyon Kim }
27679e86db79SHyon Kim
27689e86db79SHyon Kim HBA_STATUS
HBA_GetFcpPersistentBinding(HBA_HANDLE handle,PHBA_FCPBINDING binding)27699e86db79SHyon Kim HBA_GetFcpPersistentBinding(HBA_HANDLE handle, PHBA_FCPBINDING binding) {
27709e86db79SHyon Kim HBA_STATUS status;
27719e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
27729e86db79SHyon Kim HBA_HANDLE vendorHandle;
27739e86db79SHyon Kim HBAGetFcpPersistentBindingFunc
27749e86db79SHyon Kim GetFcpPersistentBindingFunc;
27759e86db79SHyon Kim
27769e86db79SHyon Kim DEBUG(2, "HBA_GetFcpPersistentBinding", 0, 0, 0);
27779e86db79SHyon Kim
27789e86db79SHyon Kim CHECKLIBRARY();
27799e86db79SHyon Kim if (lib_infop->version == SMHBA) {
27809e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INCOMPATIBLE);
27819e86db79SHyon Kim }
27829e86db79SHyon Kim
27839e86db79SHyon Kim GetFcpPersistentBindingFunc =
27849e86db79SHyon Kim lib_infop->ftable.functionTable.GetFcpPersistentBindingHandler;
27859e86db79SHyon Kim if (GetFcpPersistentBindingFunc != NULL) {
27869e86db79SHyon Kim status = ((GetFcpPersistentBindingFunc)(vendorHandle, binding));
27879e86db79SHyon Kim } else {
27889e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
27899e86db79SHyon Kim }
27909e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
27919e86db79SHyon Kim }
27929e86db79SHyon Kim
27939e86db79SHyon Kim 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)27949e86db79SHyon Kim HBA_ScsiInquiryV2(
27959e86db79SHyon Kim HBA_HANDLE handle,
27969e86db79SHyon Kim HBA_WWN hbaPortWWN,
27979e86db79SHyon Kim HBA_WWN discoveredPortWWN,
27989e86db79SHyon Kim HBA_UINT64 fcLUN,
27999e86db79SHyon Kim HBA_UINT8 CDB_Byte1,
28009e86db79SHyon Kim HBA_UINT8 CDB_Byte2,
28019e86db79SHyon Kim void *pRspBuffer,
28029e86db79SHyon Kim HBA_UINT32 *pRspBufferSize,
28039e86db79SHyon Kim HBA_UINT8 *pScsiStatus,
28049e86db79SHyon Kim void *pSenseBuffer,
28059e86db79SHyon Kim HBA_UINT32 *pSenseBufferSize)
28069e86db79SHyon Kim {
28079e86db79SHyon Kim HBA_STATUS status;
28089e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
28099e86db79SHyon Kim HBA_HANDLE vendorHandle;
28109e86db79SHyon Kim HBAScsiInquiryV2Func ScsiInquiryV2Func;
28119e86db79SHyon Kim
28129e86db79SHyon Kim DEBUG(2, "HBA_ScsiInquiryV2 to discoveredPortWWN: %s",
28139e86db79SHyon Kim WWN2STR1(&discoveredPortWWN), 0, 0);
28149e86db79SHyon Kim
28159e86db79SHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
28169e86db79SHyon Kim
28179e86db79SHyon Kim ScsiInquiryV2Func =
28189e86db79SHyon Kim lib_infop->ftable.functionTable.ScsiInquiryV2Handler;
28199e86db79SHyon Kim if (ScsiInquiryV2Func != NULL) {
28209e86db79SHyon Kim status = ((ScsiInquiryV2Func)(
28219e86db79SHyon Kim vendorHandle, hbaPortWWN, discoveredPortWWN, fcLUN, CDB_Byte1,
28229e86db79SHyon Kim CDB_Byte2, pRspBuffer, pRspBufferSize, pScsiStatus,
28239e86db79SHyon Kim pSenseBuffer, pSenseBufferSize));
28249e86db79SHyon Kim } else {
28259e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
28269e86db79SHyon Kim }
28279e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
28289e86db79SHyon Kim }
28299e86db79SHyon Kim
28309e86db79SHyon Kim 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)28319e86db79SHyon Kim HBA_SendScsiInquiry(
28329e86db79SHyon Kim HBA_HANDLE handle,
28339e86db79SHyon Kim HBA_WWN PortWWN,
28349e86db79SHyon Kim HBA_UINT64 fcLUN,
28359e86db79SHyon Kim HBA_UINT8 EVPD,
28369e86db79SHyon Kim HBA_UINT32 PageCode,
28379e86db79SHyon Kim void *pRspBuffer,
28389e86db79SHyon Kim HBA_UINT32 RspBufferSize,
28399e86db79SHyon Kim void *pSenseBuffer,
28409e86db79SHyon Kim HBA_UINT32 SenseBufferSize)
28419e86db79SHyon Kim {
28429e86db79SHyon Kim HBA_STATUS status;
28439e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
28449e86db79SHyon Kim HBA_HANDLE vendorHandle;
28459e86db79SHyon Kim HBASendScsiInquiryFunc SendScsiInquiryFunc;
28469e86db79SHyon Kim
28479e86db79SHyon Kim DEBUG(2, "HBA_SendScsiInquiry to PortWWN: %s",
28489e86db79SHyon Kim WWN2STR1(&PortWWN), 0, 0);
28499e86db79SHyon Kim
28509e86db79SHyon Kim CHECKLIBRARY();
28519e86db79SHyon Kim if (lib_infop->version == SMHBA) {
28529e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INCOMPATIBLE);
28539e86db79SHyon Kim }
28549e86db79SHyon Kim
28559e86db79SHyon Kim SendScsiInquiryFunc =
28569e86db79SHyon Kim lib_infop->ftable.functionTable.ScsiInquiryHandler;
28579e86db79SHyon Kim if (SendScsiInquiryFunc != NULL) {
28589e86db79SHyon Kim status = ((SendScsiInquiryFunc)(
28599e86db79SHyon Kim vendorHandle, PortWWN, fcLUN, EVPD, PageCode, pRspBuffer,
28609e86db79SHyon Kim RspBufferSize, pSenseBuffer, SenseBufferSize));
28619e86db79SHyon Kim } else {
28629e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
28639e86db79SHyon Kim }
28649e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
28659e86db79SHyon Kim }
28669e86db79SHyon Kim
28679e86db79SHyon Kim 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)28689e86db79SHyon Kim HBA_ScsiReportLUNsV2(
28699e86db79SHyon Kim HBA_HANDLE handle,
28709e86db79SHyon Kim HBA_WWN hbaPortWWN,
28719e86db79SHyon Kim HBA_WWN discoveredPortWWN,
28729e86db79SHyon Kim void *pRespBuffer,
28739e86db79SHyon Kim HBA_UINT32 *pRespBufferSize,
28749e86db79SHyon Kim HBA_UINT8 *pScsiStatus,
28759e86db79SHyon Kim void *pSenseBuffer,
28769e86db79SHyon Kim HBA_UINT32 *pSenseBufferSize)
28779e86db79SHyon Kim {
28789e86db79SHyon Kim HBA_STATUS status;
28799e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
28809e86db79SHyon Kim HBA_HANDLE vendorHandle;
28819e86db79SHyon Kim HBAScsiReportLUNsV2Func ScsiReportLUNsV2Func;
28829e86db79SHyon Kim
28839e86db79SHyon Kim DEBUG(2, "HBA_ScsiReportLUNsV2 to discoveredPortWWN: %s",
28849e86db79SHyon Kim WWN2STR1(&discoveredPortWWN), 0, 0);
28859e86db79SHyon Kim
28869e86db79SHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
28879e86db79SHyon Kim
28889e86db79SHyon Kim ScsiReportLUNsV2Func =
28899e86db79SHyon Kim lib_infop->ftable.functionTable.ScsiReportLUNsV2Handler;
28909e86db79SHyon Kim if (ScsiReportLUNsV2Func != NULL) {
28919e86db79SHyon Kim status = ((ScsiReportLUNsV2Func)(
28929e86db79SHyon Kim vendorHandle, hbaPortWWN, discoveredPortWWN,
28939e86db79SHyon Kim pRespBuffer, pRespBufferSize,
28949e86db79SHyon Kim pScsiStatus,
28959e86db79SHyon Kim pSenseBuffer, pSenseBufferSize));
28969e86db79SHyon Kim } else {
28979e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
28989e86db79SHyon Kim }
28999e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
29009e86db79SHyon Kim }
29019e86db79SHyon Kim
29029e86db79SHyon Kim HBA_STATUS
HBA_SendReportLUNs(HBA_HANDLE handle,HBA_WWN portWWN,void * pRspBuffer,HBA_UINT32 RspBufferSize,void * pSenseBuffer,HBA_UINT32 SenseBufferSize)29039e86db79SHyon Kim HBA_SendReportLUNs(
29049e86db79SHyon Kim HBA_HANDLE handle,
29059e86db79SHyon Kim HBA_WWN portWWN,
29069e86db79SHyon Kim void *pRspBuffer,
29079e86db79SHyon Kim HBA_UINT32 RspBufferSize,
29089e86db79SHyon Kim void *pSenseBuffer,
29099e86db79SHyon Kim HBA_UINT32 SenseBufferSize)
29109e86db79SHyon Kim {
29119e86db79SHyon Kim HBA_STATUS status;
29129e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
29139e86db79SHyon Kim HBA_HANDLE vendorHandle;
29149e86db79SHyon Kim HBASendReportLUNsFunc SendReportLUNsFunc;
29159e86db79SHyon Kim
29169e86db79SHyon Kim DEBUG(2, "HBA_SendReportLUNs to PortWWN: %s", WWN2STR1(&portWWN), 0, 0);
29179e86db79SHyon Kim
29189e86db79SHyon Kim CHECKLIBRARY();
29199e86db79SHyon Kim if (lib_infop->version == SMHBA) {
29209e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INCOMPATIBLE);
29219e86db79SHyon Kim }
29229e86db79SHyon Kim
29239e86db79SHyon Kim SendReportLUNsFunc = lib_infop->ftable.functionTable.ReportLUNsHandler;
29249e86db79SHyon Kim if (SendReportLUNsFunc != NULL) {
29259e86db79SHyon Kim status = ((SendReportLUNsFunc)(
29269e86db79SHyon Kim vendorHandle, portWWN, pRspBuffer,
29279e86db79SHyon Kim RspBufferSize, pSenseBuffer, SenseBufferSize));
29289e86db79SHyon Kim } else {
29299e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
29309e86db79SHyon Kim }
29319e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
29329e86db79SHyon Kim }
29339e86db79SHyon Kim
29349e86db79SHyon Kim 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)29359e86db79SHyon Kim HBA_ScsiReadCapacityV2(
29369e86db79SHyon Kim HBA_HANDLE handle,
29379e86db79SHyon Kim HBA_WWN hbaPortWWN,
29389e86db79SHyon Kim HBA_WWN discoveredPortWWN,
29399e86db79SHyon Kim HBA_UINT64 fcLUN,
29409e86db79SHyon Kim void *pRspBuffer,
29419e86db79SHyon Kim HBA_UINT32 *pRspBufferSize,
29429e86db79SHyon Kim HBA_UINT8 *pScsiStatus,
29439e86db79SHyon Kim void *pSenseBuffer,
29449e86db79SHyon Kim HBA_UINT32 *SenseBufferSize)
29459e86db79SHyon Kim {
29469e86db79SHyon Kim HBA_STATUS status;
29479e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
29489e86db79SHyon Kim HBA_HANDLE vendorHandle;
29499e86db79SHyon Kim HBAScsiReadCapacityV2Func ScsiReadCapacityV2Func;
29509e86db79SHyon Kim
29519e86db79SHyon Kim DEBUG(2, "HBA_ScsiReadCapacityV2 to discoveredPortWWN: %s",
29529e86db79SHyon Kim WWN2STR1(&discoveredPortWWN), 0, 0);
29539e86db79SHyon Kim
29549e86db79SHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
29559e86db79SHyon Kim
29569e86db79SHyon Kim ScsiReadCapacityV2Func =
29579e86db79SHyon Kim lib_infop->ftable.functionTable.ScsiReadCapacityV2Handler;
29589e86db79SHyon Kim if (ScsiReadCapacityV2Func != NULL) {
29599e86db79SHyon Kim status = ((ScsiReadCapacityV2Func)(
29609e86db79SHyon Kim vendorHandle, hbaPortWWN, discoveredPortWWN, fcLUN,
29619e86db79SHyon Kim pRspBuffer, pRspBufferSize,
29629e86db79SHyon Kim pScsiStatus,
29639e86db79SHyon Kim pSenseBuffer, SenseBufferSize));
29649e86db79SHyon Kim } else {
29659e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
29669e86db79SHyon Kim }
29679e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
29689e86db79SHyon Kim }
29699e86db79SHyon Kim
29709e86db79SHyon Kim HBA_STATUS
HBA_SendReadCapacity(HBA_HANDLE handle,HBA_WWN portWWN,HBA_UINT64 fcLUN,void * pRspBuffer,HBA_UINT32 RspBufferSize,void * pSenseBuffer,HBA_UINT32 SenseBufferSize)29719e86db79SHyon Kim HBA_SendReadCapacity(
29729e86db79SHyon Kim HBA_HANDLE handle,
29739e86db79SHyon Kim HBA_WWN portWWN,
29749e86db79SHyon Kim HBA_UINT64 fcLUN,
29759e86db79SHyon Kim void *pRspBuffer,
29769e86db79SHyon Kim HBA_UINT32 RspBufferSize,
29779e86db79SHyon Kim void *pSenseBuffer,
29789e86db79SHyon Kim HBA_UINT32 SenseBufferSize)
29799e86db79SHyon Kim {
29809e86db79SHyon Kim HBA_STATUS status;
29819e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
29829e86db79SHyon Kim HBA_HANDLE vendorHandle;
29839e86db79SHyon Kim HBASendReadCapacityFunc SendReadCapacityFunc;
29849e86db79SHyon Kim
29859e86db79SHyon Kim DEBUG(2, "HBA_SendReadCapacity to portWWN: %s",
29869e86db79SHyon Kim WWN2STR1(&portWWN), 0, 0);
29879e86db79SHyon Kim
29889e86db79SHyon Kim CHECKLIBRARY();
29899e86db79SHyon Kim if (lib_infop->version == SMHBA) {
29909e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INCOMPATIBLE);
29919e86db79SHyon Kim }
29929e86db79SHyon Kim
29939e86db79SHyon Kim SendReadCapacityFunc =
29949e86db79SHyon Kim lib_infop->ftable.functionTable.ReadCapacityHandler;
29959e86db79SHyon Kim if (SendReadCapacityFunc != NULL) {
29969e86db79SHyon Kim status = ((SendReadCapacityFunc)
29979e86db79SHyon Kim (vendorHandle, portWWN, fcLUN, pRspBuffer,
29989e86db79SHyon Kim RspBufferSize, pSenseBuffer, SenseBufferSize));
29999e86db79SHyon Kim } else {
30009e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
30019e86db79SHyon Kim }
30029e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
30039e86db79SHyon Kim }
30049e86db79SHyon Kim
30059e86db79SHyon Kim 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)30069e86db79SHyon Kim HBA_SendRPL(
30079e86db79SHyon Kim HBA_HANDLE handle,
30089e86db79SHyon Kim HBA_WWN hbaPortWWN,
30099e86db79SHyon Kim HBA_WWN agent_wwn,
30109e86db79SHyon Kim HBA_UINT32 agent_domain,
30119e86db79SHyon Kim HBA_UINT32 portindex,
30129e86db79SHyon Kim void *pRspBuffer,
30139e86db79SHyon Kim HBA_UINT32 *pRspBufferSize)
30149e86db79SHyon Kim {
30159e86db79SHyon Kim HBA_STATUS status;
30169e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
30179e86db79SHyon Kim HBA_HANDLE vendorHandle;
30189e86db79SHyon Kim HBASendRPLFunc registeredfunc;
30199e86db79SHyon Kim
30209e86db79SHyon Kim DEBUG(2, "HBA_SendRPL to agent_wwn: %s:%d",
30219e86db79SHyon Kim WWN2STR1(&agent_wwn), agent_domain, 0);
30229e86db79SHyon Kim
30239e86db79SHyon Kim CHECKLIBRARY();
30249e86db79SHyon Kim registeredfunc = FUNCCOMMON(lib_infop, SendRPLHandler);
30259e86db79SHyon Kim if (registeredfunc != NULL) {
30269e86db79SHyon Kim status = (registeredfunc)(
30279e86db79SHyon Kim vendorHandle, hbaPortWWN, agent_wwn, agent_domain, portindex,
30289e86db79SHyon Kim pRspBuffer, pRspBufferSize);
30299e86db79SHyon Kim } else {
30309e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
30319e86db79SHyon Kim }
30329e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
30339e86db79SHyon Kim }
30349e86db79SHyon Kim
30359e86db79SHyon Kim 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)30369e86db79SHyon Kim HBA_SendRPS(
30379e86db79SHyon Kim HBA_HANDLE handle,
30389e86db79SHyon Kim HBA_WWN hbaPortWWN,
30399e86db79SHyon Kim HBA_WWN agent_wwn,
30409e86db79SHyon Kim HBA_UINT32 agent_domain,
30419e86db79SHyon Kim HBA_WWN object_wwn,
30429e86db79SHyon Kim HBA_UINT32 object_port_number,
30439e86db79SHyon Kim void *pRspBuffer,
30449e86db79SHyon Kim HBA_UINT32 *pRspBufferSize)
30459e86db79SHyon Kim {
30469e86db79SHyon Kim HBA_STATUS status;
30479e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
30489e86db79SHyon Kim HBA_HANDLE vendorHandle;
30499e86db79SHyon Kim HBASendRPSFunc registeredfunc;
30509e86db79SHyon Kim
30519e86db79SHyon Kim DEBUG(2, "HBA_SendRPS to agent_wwn: %s:%d",
30529e86db79SHyon Kim WWN2STR1(&agent_wwn), agent_domain, 0);
30539e86db79SHyon Kim
30549e86db79SHyon Kim CHECKLIBRARY();
30559e86db79SHyon Kim registeredfunc = FUNCCOMMON(lib_infop, SendRPSHandler);
30569e86db79SHyon Kim if (registeredfunc != NULL) {
30579e86db79SHyon Kim status = (registeredfunc)(
30589e86db79SHyon Kim vendorHandle, hbaPortWWN, agent_wwn, agent_domain,
30599e86db79SHyon Kim object_wwn, object_port_number,
30609e86db79SHyon Kim pRspBuffer, pRspBufferSize);
30619e86db79SHyon Kim } else {
30629e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
30639e86db79SHyon Kim }
30649e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
30659e86db79SHyon Kim }
30669e86db79SHyon Kim
30679e86db79SHyon Kim HBA_STATUS
HBA_SendSRL(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_WWN wwn,HBA_UINT32 domain,void * pRspBuffer,HBA_UINT32 * pRspBufferSize)30689e86db79SHyon Kim HBA_SendSRL(
30699e86db79SHyon Kim HBA_HANDLE handle,
30709e86db79SHyon Kim HBA_WWN hbaPortWWN,
30719e86db79SHyon Kim HBA_WWN wwn,
30729e86db79SHyon Kim HBA_UINT32 domain,
30739e86db79SHyon Kim void *pRspBuffer,
30749e86db79SHyon Kim HBA_UINT32 *pRspBufferSize)
30759e86db79SHyon Kim {
30769e86db79SHyon Kim HBA_STATUS status;
30779e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
30789e86db79SHyon Kim HBA_HANDLE vendorHandle;
30799e86db79SHyon Kim HBASendSRLFunc registeredfunc;
30809e86db79SHyon Kim
30819e86db79SHyon Kim DEBUG(2, "HBA_SendSRL to wwn:%s domain:%d", WWN2STR1(&wwn), domain, 0);
30829e86db79SHyon Kim
30839e86db79SHyon Kim CHECKLIBRARY();
30849e86db79SHyon Kim registeredfunc = FUNCCOMMON(lib_infop, SendSRLHandler);
30859e86db79SHyon Kim if (registeredfunc != NULL) {
30869e86db79SHyon Kim status = (registeredfunc)(
30879e86db79SHyon Kim vendorHandle, hbaPortWWN, wwn, domain,
30889e86db79SHyon Kim pRspBuffer, pRspBufferSize);
30899e86db79SHyon Kim } else {
30909e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
30919e86db79SHyon Kim }
30929e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
30939e86db79SHyon Kim }
30949e86db79SHyon Kim HBA_STATUS
HBA_SendRLS(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_WWN destWWN,void * pRspBuffer,HBA_UINT32 * pRspBufferSize)30959e86db79SHyon Kim HBA_SendRLS(
30969e86db79SHyon Kim HBA_HANDLE handle,
30979e86db79SHyon Kim HBA_WWN hbaPortWWN,
30989e86db79SHyon Kim HBA_WWN destWWN,
30999e86db79SHyon Kim void *pRspBuffer,
31009e86db79SHyon Kim HBA_UINT32 *pRspBufferSize)
31019e86db79SHyon Kim {
31029e86db79SHyon Kim HBA_STATUS status;
31039e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
31049e86db79SHyon Kim HBA_HANDLE vendorHandle;
31059e86db79SHyon Kim HBASendRLSFunc registeredfunc;
31069e86db79SHyon Kim
31079e86db79SHyon Kim DEBUG(2, "HBA_SendRLS dest_wwn: %s",
31089e86db79SHyon Kim WWN2STR1(&destWWN), 0, 0);
31099e86db79SHyon Kim
31109e86db79SHyon Kim CHECKLIBRARY();
31119e86db79SHyon Kim registeredfunc = FUNCCOMMON(lib_infop, SendRLSHandler);
31129e86db79SHyon Kim if (registeredfunc != NULL) {
31139e86db79SHyon Kim status = (registeredfunc)(
31149e86db79SHyon Kim vendorHandle, hbaPortWWN, destWWN,
31159e86db79SHyon Kim pRspBuffer, pRspBufferSize);
31169e86db79SHyon Kim } else {
31179e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
31189e86db79SHyon Kim }
31199e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
31209e86db79SHyon Kim }
31219e86db79SHyon Kim
31229e86db79SHyon Kim HBA_STATUS
HBA_SendLIRR(HBA_HANDLE handle,HBA_WWN sourceWWN,HBA_WWN destWWN,HBA_UINT8 function,HBA_UINT8 type,void * pRspBuffer,HBA_UINT32 * pRspBufferSize)31239e86db79SHyon Kim HBA_SendLIRR(
31249e86db79SHyon Kim HBA_HANDLE handle,
31259e86db79SHyon Kim HBA_WWN sourceWWN,
31269e86db79SHyon Kim HBA_WWN destWWN,
31279e86db79SHyon Kim HBA_UINT8 function,
31289e86db79SHyon Kim HBA_UINT8 type,
31299e86db79SHyon Kim void *pRspBuffer,
31309e86db79SHyon Kim HBA_UINT32 *pRspBufferSize)
31319e86db79SHyon Kim {
31329e86db79SHyon Kim HBA_STATUS status;
31339e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
31349e86db79SHyon Kim HBA_HANDLE vendorHandle;
31359e86db79SHyon Kim HBASendLIRRFunc registeredfunc;
31369e86db79SHyon Kim
31379e86db79SHyon Kim DEBUG(2, "HBA_SendLIRR destWWN:%s", WWN2STR1(&destWWN), 0, 0);
31389e86db79SHyon Kim
31399e86db79SHyon Kim CHECKLIBRARY();
31409e86db79SHyon Kim registeredfunc = FUNCCOMMON(lib_infop, SendLIRRHandler);
31419e86db79SHyon Kim if (registeredfunc != NULL) {
31429e86db79SHyon Kim status = (registeredfunc)(
31439e86db79SHyon Kim vendorHandle, sourceWWN, destWWN, function, type,
31449e86db79SHyon Kim pRspBuffer, pRspBufferSize);
31459e86db79SHyon Kim } else {
31469e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
31479e86db79SHyon Kim }
31489e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
31499e86db79SHyon Kim }
31509e86db79SHyon Kim
31519e86db79SHyon Kim HBA_STATUS
HBA_GetBindingCapability(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_BIND_CAPABILITY * pcapability)31529e86db79SHyon Kim HBA_GetBindingCapability(
31539e86db79SHyon Kim HBA_HANDLE handle,
31549e86db79SHyon Kim HBA_WWN hbaPortWWN,
31559e86db79SHyon Kim HBA_BIND_CAPABILITY *pcapability)
31569e86db79SHyon Kim {
31579e86db79SHyon Kim HBA_STATUS status;
31589e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
31599e86db79SHyon Kim HBA_HANDLE vendorHandle;
31609e86db79SHyon Kim HBAGetBindingCapabilityFunc
31619e86db79SHyon Kim registeredfunc;
31629e86db79SHyon Kim
31639e86db79SHyon Kim DEBUG(2, "HBA_GetBindingCapability", 0, 0, 0);
31649e86db79SHyon Kim
31659e86db79SHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
31669e86db79SHyon Kim
31679e86db79SHyon Kim registeredfunc =
31689e86db79SHyon Kim lib_infop->ftable.functionTable.GetBindingCapabilityHandler;
31699e86db79SHyon Kim if (registeredfunc != NULL) {
31709e86db79SHyon Kim status = (registeredfunc)(vendorHandle, hbaPortWWN, pcapability);
31719e86db79SHyon Kim } else {
31729e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
31739e86db79SHyon Kim }
31749e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
31759e86db79SHyon Kim }
31769e86db79SHyon Kim
31779e86db79SHyon Kim HBA_STATUS
HBA_GetBindingSupport(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_BIND_CAPABILITY * pcapability)31789e86db79SHyon Kim HBA_GetBindingSupport(
31799e86db79SHyon Kim HBA_HANDLE handle,
31809e86db79SHyon Kim HBA_WWN hbaPortWWN,
31819e86db79SHyon Kim HBA_BIND_CAPABILITY *pcapability)
31829e86db79SHyon Kim {
31839e86db79SHyon Kim HBA_STATUS status;
31849e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
31859e86db79SHyon Kim HBA_HANDLE vendorHandle;
31869e86db79SHyon Kim HBAGetBindingSupportFunc
31879e86db79SHyon Kim registeredfunc;
31889e86db79SHyon Kim
31899e86db79SHyon Kim DEBUG(2, "HBA_GetBindingSupport", 0, 0, 0);
31909e86db79SHyon Kim
31919e86db79SHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
31929e86db79SHyon Kim
31939e86db79SHyon Kim registeredfunc =
31949e86db79SHyon Kim lib_infop->ftable.functionTable.GetBindingSupportHandler;
31959e86db79SHyon Kim if (registeredfunc != NULL) {
31969e86db79SHyon Kim status = (registeredfunc)(vendorHandle, hbaPortWWN, pcapability);
31979e86db79SHyon Kim } else {
31989e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
31999e86db79SHyon Kim }
32009e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
32019e86db79SHyon Kim }
32029e86db79SHyon Kim
32039e86db79SHyon Kim HBA_STATUS
HBA_SetBindingSupport(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_BIND_CAPABILITY capability)32049e86db79SHyon Kim HBA_SetBindingSupport(
32059e86db79SHyon Kim HBA_HANDLE handle,
32069e86db79SHyon Kim HBA_WWN hbaPortWWN,
32079e86db79SHyon Kim HBA_BIND_CAPABILITY capability)
32089e86db79SHyon Kim {
32099e86db79SHyon Kim HBA_STATUS status;
32109e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
32119e86db79SHyon Kim HBA_HANDLE vendorHandle;
32129e86db79SHyon Kim HBASetBindingSupportFunc
32139e86db79SHyon Kim registeredfunc;
32149e86db79SHyon Kim
32159e86db79SHyon Kim DEBUG(2, "HBA_SetBindingSupport", 0, 0, 0);
32169e86db79SHyon Kim
32179e86db79SHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
32189e86db79SHyon Kim
32199e86db79SHyon Kim registeredfunc =
32209e86db79SHyon Kim lib_infop->ftable.functionTable.SetBindingSupportHandler;
32219e86db79SHyon Kim if (registeredfunc != NULL) {
32229e86db79SHyon Kim status = (registeredfunc)(vendorHandle, hbaPortWWN, capability);
32239e86db79SHyon Kim } else {
32249e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
32259e86db79SHyon Kim }
32269e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
32279e86db79SHyon Kim }
32289e86db79SHyon Kim
32299e86db79SHyon Kim HBA_STATUS
HBA_SetPersistentBindingV2(HBA_HANDLE handle,HBA_WWN hbaPortWWN,const HBA_FCPBINDING2 * pbinding)32309e86db79SHyon Kim HBA_SetPersistentBindingV2(
32319e86db79SHyon Kim HBA_HANDLE handle,
32329e86db79SHyon Kim HBA_WWN hbaPortWWN,
32339e86db79SHyon Kim const HBA_FCPBINDING2 *pbinding)
32349e86db79SHyon Kim {
32359e86db79SHyon Kim HBA_STATUS status;
32369e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
32379e86db79SHyon Kim HBA_HANDLE vendorHandle;
32389e86db79SHyon Kim HBASetPersistentBindingV2Func
32399e86db79SHyon Kim registeredfunc;
32409e86db79SHyon Kim
32419e86db79SHyon Kim DEBUG(2, "HBA_SetPersistentBindingV2 port: %s",
32429e86db79SHyon Kim WWN2STR1(&hbaPortWWN), 0, 0);
32439e86db79SHyon Kim
32449e86db79SHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
32459e86db79SHyon Kim
32469e86db79SHyon Kim registeredfunc =
32479e86db79SHyon Kim lib_infop->ftable.functionTable.SetPersistentBindingV2Handler;
32489e86db79SHyon Kim if (registeredfunc != NULL) {
32499e86db79SHyon Kim status = (registeredfunc)(vendorHandle, hbaPortWWN, pbinding);
32509e86db79SHyon Kim } else {
32519e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
32529e86db79SHyon Kim }
32539e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
32549e86db79SHyon Kim }
32559e86db79SHyon Kim
32569e86db79SHyon Kim HBA_STATUS
HBA_GetPersistentBindingV2(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_FCPBINDING2 * pbinding)32579e86db79SHyon Kim HBA_GetPersistentBindingV2(
32589e86db79SHyon Kim HBA_HANDLE handle,
32599e86db79SHyon Kim HBA_WWN hbaPortWWN,
32609e86db79SHyon Kim HBA_FCPBINDING2 *pbinding)
32619e86db79SHyon Kim {
32629e86db79SHyon Kim HBA_STATUS status;
32639e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
32649e86db79SHyon Kim HBA_HANDLE vendorHandle;
32659e86db79SHyon Kim HBAGetPersistentBindingV2Func
32669e86db79SHyon Kim registeredfunc;
32679e86db79SHyon Kim
32689e86db79SHyon Kim DEBUG(2, "HBA_GetPersistentBindingV2 port: %s",
32699e86db79SHyon Kim WWN2STR1(&hbaPortWWN), 0, 0);
32709e86db79SHyon Kim
32719e86db79SHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
32729e86db79SHyon Kim
32739e86db79SHyon Kim registeredfunc =
32749e86db79SHyon Kim lib_infop->ftable.functionTable.GetPersistentBindingV2Handler;
32759e86db79SHyon Kim if (registeredfunc != NULL) {
32769e86db79SHyon Kim status = (registeredfunc)(vendorHandle, hbaPortWWN, pbinding);
32779e86db79SHyon Kim } else {
32789e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
32799e86db79SHyon Kim }
32809e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
32819e86db79SHyon Kim }
32829e86db79SHyon Kim
32839e86db79SHyon Kim HBA_STATUS
HBA_RemovePersistentBinding(HBA_HANDLE handle,HBA_WWN hbaPortWWN,const HBA_FCPBINDING2 * pbinding)32849e86db79SHyon Kim HBA_RemovePersistentBinding(
32859e86db79SHyon Kim HBA_HANDLE handle,
32869e86db79SHyon Kim HBA_WWN hbaPortWWN,
32879e86db79SHyon Kim const HBA_FCPBINDING2
32889e86db79SHyon Kim *pbinding)
32899e86db79SHyon Kim {
32909e86db79SHyon Kim HBA_STATUS status;
32919e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
32929e86db79SHyon Kim HBA_HANDLE vendorHandle;
32939e86db79SHyon Kim HBARemovePersistentBindingFunc
32949e86db79SHyon Kim registeredfunc;
32959e86db79SHyon Kim
32969e86db79SHyon Kim DEBUG(2, "HBA_RemovePersistentBinding", 0, 0, 0);
32979e86db79SHyon Kim
32989e86db79SHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
32999e86db79SHyon Kim
33009e86db79SHyon Kim registeredfunc =
33019e86db79SHyon Kim lib_infop->ftable.functionTable.RemovePersistentBindingHandler;
33029e86db79SHyon Kim if (registeredfunc != NULL) {
33039e86db79SHyon Kim status = (registeredfunc)(vendorHandle, hbaPortWWN, pbinding);
33049e86db79SHyon Kim } else {
33059e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
33069e86db79SHyon Kim }
33079e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
33089e86db79SHyon Kim }
33099e86db79SHyon Kim
33109e86db79SHyon Kim HBA_STATUS
HBA_RemoveAllPersistentBindings(HBA_HANDLE handle,HBA_WWN hbaPortWWN)33119e86db79SHyon Kim HBA_RemoveAllPersistentBindings(
33129e86db79SHyon Kim HBA_HANDLE handle,
33139e86db79SHyon Kim HBA_WWN hbaPortWWN)
33149e86db79SHyon Kim {
33159e86db79SHyon Kim HBA_STATUS status;
33169e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
33179e86db79SHyon Kim HBA_HANDLE vendorHandle;
33189e86db79SHyon Kim HBARemoveAllPersistentBindingsFunc
33199e86db79SHyon Kim registeredfunc;
33209e86db79SHyon Kim
33219e86db79SHyon Kim DEBUG(2, "HBA_RemoveAllPersistentBindings", 0, 0, 0);
33229e86db79SHyon Kim
33239e86db79SHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
33249e86db79SHyon Kim
33259e86db79SHyon Kim registeredfunc =
33269e86db79SHyon Kim lib_infop->ftable.functionTable.RemoveAllPersistentBindingsHandler;
33279e86db79SHyon Kim if (registeredfunc != NULL) {
33289e86db79SHyon Kim status = (registeredfunc)(vendorHandle, hbaPortWWN);
33299e86db79SHyon Kim } else {
33309e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
33319e86db79SHyon Kim }
33329e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
33339e86db79SHyon Kim }
33349e86db79SHyon Kim
33359e86db79SHyon Kim HBA_STATUS
HBA_GetFC4Statistics(HBA_HANDLE handle,HBA_WWN portWWN,HBA_UINT8 FC4type,HBA_FC4STATISTICS * pstatistics)33369e86db79SHyon Kim HBA_GetFC4Statistics(
33379e86db79SHyon Kim HBA_HANDLE handle,
33389e86db79SHyon Kim HBA_WWN portWWN,
33399e86db79SHyon Kim HBA_UINT8 FC4type,
33409e86db79SHyon Kim HBA_FC4STATISTICS *pstatistics)
33419e86db79SHyon Kim {
33429e86db79SHyon Kim HBA_STATUS status;
33439e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
33449e86db79SHyon Kim HBA_HANDLE vendorHandle;
33459e86db79SHyon Kim HBAGetFC4StatisticsFunc
33469e86db79SHyon Kim registeredfunc;
33479e86db79SHyon Kim
33489e86db79SHyon Kim DEBUG(2, "HBA_GetFC4Statistics port: %s", WWN2STR1(&portWWN), 0, 0);
33499e86db79SHyon Kim
33509e86db79SHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
33519e86db79SHyon Kim
33529e86db79SHyon Kim registeredfunc =
33539e86db79SHyon Kim lib_infop->ftable.functionTable.GetFC4StatisticsHandler;
33549e86db79SHyon Kim if (registeredfunc != NULL) {
33559e86db79SHyon Kim status = (registeredfunc)
33569e86db79SHyon Kim (vendorHandle, portWWN, FC4type, pstatistics);
33579e86db79SHyon Kim } else {
33589e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
33599e86db79SHyon Kim }
33609e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
33619e86db79SHyon Kim }
33629e86db79SHyon Kim
33639e86db79SHyon Kim HBA_STATUS
HBA_GetFCPStatistics(HBA_HANDLE handle,const HBA_SCSIID * lunit,HBA_FC4STATISTICS * pstatistics)33649e86db79SHyon Kim HBA_GetFCPStatistics(
33659e86db79SHyon Kim HBA_HANDLE handle,
33669e86db79SHyon Kim const HBA_SCSIID *lunit,
33679e86db79SHyon Kim HBA_FC4STATISTICS *pstatistics)
33689e86db79SHyon Kim {
33699e86db79SHyon Kim HBA_STATUS status;
33709e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
33719e86db79SHyon Kim HBA_HANDLE vendorHandle;
33729e86db79SHyon Kim HBAGetFCPStatisticsFunc
33739e86db79SHyon Kim registeredfunc;
33749e86db79SHyon Kim
33759e86db79SHyon Kim DEBUG(2, "HBA_GetFCPStatistics", 0, 0, 0);
33769e86db79SHyon Kim
33779e86db79SHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
33789e86db79SHyon Kim
33799e86db79SHyon Kim registeredfunc =
33809e86db79SHyon Kim lib_infop->ftable.functionTable.GetFCPStatisticsHandler;
33819e86db79SHyon Kim if (registeredfunc != NULL) {
33829e86db79SHyon Kim status = (registeredfunc)(vendorHandle, lunit, pstatistics);
33839e86db79SHyon Kim } else {
33849e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
33859e86db79SHyon Kim }
33869e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
33879e86db79SHyon Kim }
33889e86db79SHyon Kim
33899e86db79SHyon Kim HBA_UINT32
HBA_GetVendorLibraryAttributes(HBA_UINT32 adapter_index,HBA_LIBRARYATTRIBUTES * attributes)33909e86db79SHyon Kim HBA_GetVendorLibraryAttributes(
33919e86db79SHyon Kim HBA_UINT32 adapter_index,
33929e86db79SHyon Kim HBA_LIBRARYATTRIBUTES *attributes)
33939e86db79SHyon Kim {
33949e86db79SHyon Kim HBA_ADAPTER_INFO *adapt_infop;
33959e86db79SHyon Kim HBAGetVendorLibraryAttributesFunc
33969e86db79SHyon Kim registeredfunc;
33979e86db79SHyon Kim HBA_UINT32 ret = 0;
33989e86db79SHyon Kim
33999e86db79SHyon Kim DEBUG(2, "HBA_GetVendorLibraryAttributes adapterindex:%d",
34009e86db79SHyon Kim adapter_index, 0, 0);
34019e86db79SHyon Kim if (_hbaapi_librarylist == NULL) {
34029e86db79SHyon Kim DEBUG(1, "HBAAPI not loaded yet.", 0, 0, 0);
34039e86db79SHyon Kim return (0);
34049e86db79SHyon Kim }
34059e86db79SHyon Kim
34069e86db79SHyon Kim if (attributes == NULL) {
34079e86db79SHyon Kim DEBUG(1,
34089e86db79SHyon Kim "HBA_GetVendorLibraryAttributes: NULL pointer attributes",
34099e86db79SHyon Kim 0, 0, 0);
34109e86db79SHyon Kim return (HBA_STATUS_ERROR_ARG);
34119e86db79SHyon Kim }
34129e86db79SHyon Kim
34139e86db79SHyon Kim (void) memset(attributes, 0, sizeof (HBA_LIBRARYATTRIBUTES));
34149e86db79SHyon Kim
34159e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_LL_mutex);
34169e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_AL_mutex);
34179e86db79SHyon Kim for (adapt_infop = _hbaapi_adapterlist;
34189e86db79SHyon Kim adapt_infop != NULL;
34199e86db79SHyon Kim adapt_infop = adapt_infop->next) {
34209e86db79SHyon Kim
34219e86db79SHyon Kim if (adapt_infop->index == adapter_index) {
34229e86db79SHyon Kim
34239e86db79SHyon Kim if (adapt_infop->library->version == SMHBA) {
34249e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_AL_mutex);
34259e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex,
34269e86db79SHyon Kim HBA_STATUS_ERROR_INCOMPATIBLE);
34279e86db79SHyon Kim }
34289e86db79SHyon Kim
34299e86db79SHyon Kim registeredfunc = adapt_infop->library->
34309e86db79SHyon Kim ftable.functionTable.GetVendorLibraryAttributesHandler;
34319e86db79SHyon Kim if (registeredfunc != NULL) {
34329e86db79SHyon Kim ret = (registeredfunc)(attributes);
34339e86db79SHyon Kim } else {
34349e86db79SHyon Kim /* Version 1 libary? */
34359e86db79SHyon Kim HBAGetVersionFunc GetVersionFunc;
34369e86db79SHyon Kim GetVersionFunc = adapt_infop->library->
34379e86db79SHyon Kim ftable.functionTable.GetVersionHandler;
34389e86db79SHyon Kim if (GetVersionFunc != NULL) {
34399e86db79SHyon Kim ret = ((GetVersionFunc)());
34409e86db79SHyon Kim }
34419e86db79SHyon Kim #ifdef NOTDEF
34429e86db79SHyon Kim else {
34439e86db79SHyon Kim /* This should not happen, dont think its going to */
34449e86db79SHyon Kim }
34459e86db79SHyon Kim #endif
34469e86db79SHyon Kim }
34479e86db79SHyon Kim if (attributes->LibPath[0] == '\0') {
34489e86db79SHyon Kim if (strlen(adapt_infop->library->LibraryPath) < 256) {
34499e86db79SHyon Kim (void) strcpy(attributes->LibPath,
34509e86db79SHyon Kim adapt_infop->library->LibraryPath);
34519e86db79SHyon Kim }
34529e86db79SHyon Kim }
34539e86db79SHyon Kim break;
34549e86db79SHyon Kim }
34559e86db79SHyon Kim }
34569e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_AL_mutex);
34579e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, ret);
34589e86db79SHyon Kim }
34599e86db79SHyon Kim
34609e86db79SHyon Kim
34619e86db79SHyon Kim /*
34629e86db79SHyon Kim * This function returns SM-HBA version that the warpper library implemented.
34639e86db79SHyon Kim */
34649e86db79SHyon Kim HBA_UINT32
SMHBA_GetVersion()34659e86db79SHyon Kim SMHBA_GetVersion() {
34669e86db79SHyon Kim DEBUG(2, "SMHBA_GetVersion", 0, 0, 0);
34679e86db79SHyon Kim return (SMHBA_LIBVERSION);
34689e86db79SHyon Kim }
34699e86db79SHyon Kim
34709e86db79SHyon Kim /*
34719e86db79SHyon Kim * This function returns the attributes for the warpper library.
34729e86db79SHyon Kim */
34739e86db79SHyon Kim HBA_UINT32
SMHBA_GetWrapperLibraryAttributes(SMHBA_LIBRARYATTRIBUTES * attributes)34749e86db79SHyon Kim SMHBA_GetWrapperLibraryAttributes(
34759e86db79SHyon Kim SMHBA_LIBRARYATTRIBUTES *attributes)
34769e86db79SHyon Kim {
34779e86db79SHyon Kim
34789e86db79SHyon Kim struct timeval tv;
34799e86db79SHyon Kim struct tm tp;
34809e86db79SHyon Kim
34819e86db79SHyon Kim DEBUG(2, "SMHBA_GetWrapperLibraryAttributes", 0, 0, 0);
34829e86db79SHyon Kim
34839e86db79SHyon Kim if (attributes == NULL) {
34849e86db79SHyon Kim DEBUG(1, "SMHBA_GetWrapperLibraryAttributes: "
34859e86db79SHyon Kim "NULL pointer attributes",
34869e86db79SHyon Kim 0, 0, 0);
34879e86db79SHyon Kim return (HBA_STATUS_ERROR_ARG);
34889e86db79SHyon Kim }
34899e86db79SHyon Kim
34909e86db79SHyon Kim (void) memset(attributes, 0, sizeof (SMHBA_LIBRARYATTRIBUTES));
34919e86db79SHyon Kim
34929e86db79SHyon Kim #if defined(SOLARIS)
34939e86db79SHyon Kim if ((handle = dlopen("libSMHBAAPI.so", RTLD_NOW)) != NULL) {
34949e86db79SHyon Kim if (dlinfo(handle, RTLD_DI_LINKMAP, &map) >= 0) {
34959e86db79SHyon Kim for (mp = map; mp != NULL; mp = mp->l_next) {
34969e86db79SHyon Kim if (strlen(map->l_name) < 256) {
34979e86db79SHyon Kim (void) strcpy(attributes->LibPath, map->l_name);
34989e86db79SHyon Kim }
34999e86db79SHyon Kim }
35009e86db79SHyon Kim }
35019e86db79SHyon Kim }
35029e86db79SHyon Kim
35039e86db79SHyon Kim #endif
35049e86db79SHyon Kim
35059e86db79SHyon Kim #if defined(VENDOR)
35069e86db79SHyon Kim (void) strcpy(attributes->VName, VENDOR);
35079e86db79SHyon Kim #else
35089e86db79SHyon Kim attributes->VName[0] = '\0';
35099e86db79SHyon Kim #endif
35109e86db79SHyon Kim #if defined(VERSION)
35119e86db79SHyon Kim (void) strcpy(attributes->VVersion, VERSION);
35129e86db79SHyon Kim #else
35139e86db79SHyon Kim attributes->VVersion[0] = '\0';
35149e86db79SHyon Kim #endif
35159e86db79SHyon Kim
35169e86db79SHyon Kim if (gettimeofday(&tv, (void *)0) == 0) {
35179e86db79SHyon Kim if (localtime_r(&tv.tv_sec, &tp) != NULL) {
35189e86db79SHyon Kim attributes->build_date.tm_mday = tp.tm_mday;
35199e86db79SHyon Kim attributes->build_date.tm_mon = tp.tm_mon;
35209e86db79SHyon Kim attributes->build_date.tm_year = tp.tm_year;
35219e86db79SHyon Kim } else {
35229e86db79SHyon Kim (void) memset(&attributes->build_date, 0,
35239e86db79SHyon Kim sizeof (attributes->build_date));
35249e86db79SHyon Kim }
35259e86db79SHyon Kim (void) memset(&attributes->build_date, 0,
35269e86db79SHyon Kim sizeof (attributes->build_date));
35279e86db79SHyon Kim }
35289e86db79SHyon Kim
35299e86db79SHyon Kim return (1);
35309e86db79SHyon Kim }
35319e86db79SHyon Kim
35329e86db79SHyon Kim /*
35339e86db79SHyon Kim * This function returns the attributes for the warpper library.
35349e86db79SHyon Kim */
35359e86db79SHyon Kim HBA_UINT32
SMHBA_GetVendorLibraryAttributes(HBA_UINT32 adapter_index,SMHBA_LIBRARYATTRIBUTES * attributes)35369e86db79SHyon Kim SMHBA_GetVendorLibraryAttributes(
35379e86db79SHyon Kim HBA_UINT32 adapter_index,
35389e86db79SHyon Kim SMHBA_LIBRARYATTRIBUTES *attributes)
35399e86db79SHyon Kim {
35409e86db79SHyon Kim HBA_ADAPTER_INFO *adapt_infop;
35419e86db79SHyon Kim SMHBAGetVendorLibraryAttributesFunc
35429e86db79SHyon Kim registeredfunc;
35439e86db79SHyon Kim HBA_UINT32 ret = 0;
35449e86db79SHyon Kim
35459e86db79SHyon Kim DEBUG(2, "SMHBA_GetVendorLibraryAttributes adapterindex:%d",
35469e86db79SHyon Kim adapter_index, 0, 0);
35479e86db79SHyon Kim if (_hbaapi_librarylist == NULL) {
35489e86db79SHyon Kim DEBUG(1, "SMHBAAPI not loaded yet.", 0, 0, 0);
35499e86db79SHyon Kim return (0);
35509e86db79SHyon Kim }
35519e86db79SHyon Kim
35529e86db79SHyon Kim if (attributes == NULL) {
35539e86db79SHyon Kim DEBUG(1, "SMHBA_GetVendorLibraryAttributes: "
35549e86db79SHyon Kim "NULL pointer attributes",
35559e86db79SHyon Kim 0, 0, 0);
35569e86db79SHyon Kim return (HBA_STATUS_ERROR_ARG);
35579e86db79SHyon Kim }
35589e86db79SHyon Kim
35599e86db79SHyon Kim (void) memset(attributes, 0, sizeof (SMHBA_LIBRARYATTRIBUTES));
35609e86db79SHyon Kim
35619e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_LL_mutex);
35629e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_AL_mutex);
35639e86db79SHyon Kim for (adapt_infop = _hbaapi_adapterlist;
35649e86db79SHyon Kim adapt_infop != NULL;
35659e86db79SHyon Kim adapt_infop = adapt_infop->next) {
35669e86db79SHyon Kim
35679e86db79SHyon Kim if (adapt_infop->index == adapter_index) {
35689e86db79SHyon Kim
35699e86db79SHyon Kim if (adapt_infop->library->version != SMHBA) {
35709e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_AL_mutex);
35719e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex,
35729e86db79SHyon Kim HBA_STATUS_ERROR_INCOMPATIBLE);
35739e86db79SHyon Kim }
35749e86db79SHyon Kim
35759e86db79SHyon Kim registeredfunc = adapt_infop->library->
35769e86db79SHyon Kim ftable.smhbafunctionTable.GetVendorLibraryAttributesHandler;
35779e86db79SHyon Kim if (registeredfunc != NULL) {
35789e86db79SHyon Kim ret = (registeredfunc)(attributes);
35799e86db79SHyon Kim #ifdef NOTDEF
35809e86db79SHyon Kim } else {
35819e86db79SHyon Kim /* This should not happen since the VSL is already loaded. */
35829e86db79SHyon Kim #endif
35839e86db79SHyon Kim }
35849e86db79SHyon Kim if (attributes->LibPath[0] == '\0') {
35859e86db79SHyon Kim if (strlen(adapt_infop->library->LibraryPath) < 256) {
35869e86db79SHyon Kim (void) strcpy(attributes->LibPath,
35879e86db79SHyon Kim adapt_infop->library->LibraryPath);
35889e86db79SHyon Kim }
35899e86db79SHyon Kim }
35909e86db79SHyon Kim break;
35919e86db79SHyon Kim }
35929e86db79SHyon Kim }
35939e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_AL_mutex);
35949e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, ret);
35959e86db79SHyon Kim }
35969e86db79SHyon Kim
35979e86db79SHyon Kim HBA_STATUS
SMHBA_GetAdapterAttributes(HBA_HANDLE handle,SMHBA_ADAPTERATTRIBUTES * hbaattributes)35989e86db79SHyon Kim SMHBA_GetAdapterAttributes(
35999e86db79SHyon Kim HBA_HANDLE handle,
36009e86db79SHyon Kim SMHBA_ADAPTERATTRIBUTES *hbaattributes)
36019e86db79SHyon Kim {
36029e86db79SHyon Kim HBA_STATUS status;
36039e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
36049e86db79SHyon Kim HBA_HANDLE vendorHandle;
36059e86db79SHyon Kim SMHBAGetAdapterAttributesFunc GetAdapterAttributesFunc;
36069e86db79SHyon Kim
36079e86db79SHyon Kim DEBUG(2, "SMHBA_GetAdapterAttributes", 0, 0, 0);
36089e86db79SHyon Kim
36099e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
36109e86db79SHyon Kim
36119e86db79SHyon Kim GetAdapterAttributesFunc =
36129e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.GetAdapterAttributesHandler;
36139e86db79SHyon Kim if (GetAdapterAttributesFunc != NULL) {
36149e86db79SHyon Kim status = ((GetAdapterAttributesFunc)(vendorHandle, hbaattributes));
36159e86db79SHyon Kim } else {
36169e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
36179e86db79SHyon Kim }
36189e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
36199e86db79SHyon Kim }
36209e86db79SHyon Kim
36219e86db79SHyon Kim HBA_STATUS
SMHBA_GetNumberOfPorts(HBA_HANDLE handle,HBA_UINT32 * numberofports)36229e86db79SHyon Kim SMHBA_GetNumberOfPorts(
36239e86db79SHyon Kim HBA_HANDLE handle,
36249e86db79SHyon Kim HBA_UINT32 *numberofports)
36259e86db79SHyon Kim {
36269e86db79SHyon Kim HBA_STATUS status;
36279e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
36289e86db79SHyon Kim HBA_HANDLE vendorHandle;
36299e86db79SHyon Kim SMHBAGetNumberOfPortsFunc GetNumberOfPortsFunc;
36309e86db79SHyon Kim
36319e86db79SHyon Kim DEBUG(2, "SMHBA_GetAdapterAttributes", 0, 0, 0);
36329e86db79SHyon Kim
36339e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
36349e86db79SHyon Kim
36359e86db79SHyon Kim GetNumberOfPortsFunc =
36369e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.GetNumberOfPortsHandler;
36379e86db79SHyon Kim if (GetNumberOfPortsFunc != NULL) {
36389e86db79SHyon Kim status = ((GetNumberOfPortsFunc)(vendorHandle, numberofports));
36399e86db79SHyon Kim } else {
36409e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
36419e86db79SHyon Kim }
36429e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
36439e86db79SHyon Kim }
36449e86db79SHyon Kim
36459e86db79SHyon Kim HBA_STATUS
SMHBA_GetPortType(HBA_HANDLE handle,HBA_UINT32 portindex,HBA_PORTTYPE * porttype)36469e86db79SHyon Kim SMHBA_GetPortType(
36479e86db79SHyon Kim HBA_HANDLE handle,
36489e86db79SHyon Kim HBA_UINT32 portindex,
36499e86db79SHyon Kim HBA_PORTTYPE *porttype)
36509e86db79SHyon Kim {
36519e86db79SHyon Kim HBA_STATUS status;
36529e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
36539e86db79SHyon Kim HBA_HANDLE vendorHandle;
36549e86db79SHyon Kim SMHBAGetPortTypeFunc GetPortTypeFunc;
36559e86db79SHyon Kim
36569e86db79SHyon Kim DEBUG(2, "SMHBA_GetAdapterAttributes", 0, 0, 0);
36579e86db79SHyon Kim
36589e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
36599e86db79SHyon Kim
36609e86db79SHyon Kim GetPortTypeFunc =
36619e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.GetPortTypeHandler;
36629e86db79SHyon Kim if (GetPortTypeFunc != NULL) {
36639e86db79SHyon Kim status = ((GetPortTypeFunc)(vendorHandle, portindex, porttype));
36649e86db79SHyon Kim } else {
36659e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
36669e86db79SHyon Kim }
36679e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
36689e86db79SHyon Kim }
36699e86db79SHyon Kim
36709e86db79SHyon Kim HBA_STATUS
SMHBA_GetAdapterPortAttributes(HBA_HANDLE handle,HBA_UINT32 portindex,SMHBA_PORTATTRIBUTES * portattributes)36719e86db79SHyon Kim SMHBA_GetAdapterPortAttributes(
36729e86db79SHyon Kim HBA_HANDLE handle,
36739e86db79SHyon Kim HBA_UINT32 portindex,
36749e86db79SHyon Kim SMHBA_PORTATTRIBUTES *portattributes)
36759e86db79SHyon Kim {
36769e86db79SHyon Kim HBA_STATUS status;
36779e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
36789e86db79SHyon Kim HBA_HANDLE vendorHandle;
36799e86db79SHyon Kim SMHBAGetAdapterPortAttributesFunc
36809e86db79SHyon Kim GetAdapterPortAttributesFunc;
36819e86db79SHyon Kim
36829e86db79SHyon Kim DEBUG(2, "SMHBA_GetAdapterPortAttributes", 0, 0, 0);
36839e86db79SHyon Kim
36849e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
36859e86db79SHyon Kim
36869e86db79SHyon Kim GetAdapterPortAttributesFunc =
36879e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.\
36889e86db79SHyon Kim GetAdapterPortAttributesHandler;
36899e86db79SHyon Kim if (GetAdapterPortAttributesFunc != NULL) {
36909e86db79SHyon Kim status = ((GetAdapterPortAttributesFunc)
36919e86db79SHyon Kim (vendorHandle, portindex, portattributes));
36929e86db79SHyon Kim } else {
36939e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
36949e86db79SHyon Kim }
36959e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
36969e86db79SHyon Kim }
36979e86db79SHyon Kim
36989e86db79SHyon Kim HBA_STATUS
SMHBA_GetDiscoveredPortAttributes(HBA_HANDLE handle,HBA_UINT32 portindex,HBA_UINT32 discoveredportindex,SMHBA_PORTATTRIBUTES * portattributes)36999e86db79SHyon Kim SMHBA_GetDiscoveredPortAttributes(
37009e86db79SHyon Kim HBA_HANDLE handle,
37019e86db79SHyon Kim HBA_UINT32 portindex,
37029e86db79SHyon Kim HBA_UINT32 discoveredportindex,
37039e86db79SHyon Kim SMHBA_PORTATTRIBUTES *portattributes)
37049e86db79SHyon Kim {
37059e86db79SHyon Kim HBA_STATUS status;
37069e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
37079e86db79SHyon Kim HBA_HANDLE vendorHandle;
37089e86db79SHyon Kim SMHBAGetDiscoveredPortAttributesFunc
37099e86db79SHyon Kim GetDiscoveredPortAttributesFunc;
37109e86db79SHyon Kim
37119e86db79SHyon Kim DEBUG(2, "SMHBA_GetDiscoveredPortAttributes", 0, 0, 0);
37129e86db79SHyon Kim
37139e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
37149e86db79SHyon Kim
37159e86db79SHyon Kim GetDiscoveredPortAttributesFunc =
37169e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.\
37179e86db79SHyon Kim GetDiscoveredPortAttributesHandler;
37189e86db79SHyon Kim if (GetDiscoveredPortAttributesFunc != NULL) {
37199e86db79SHyon Kim status = ((GetDiscoveredPortAttributesFunc)
37209e86db79SHyon Kim (vendorHandle, portindex, discoveredportindex,
37219e86db79SHyon Kim portattributes));
37229e86db79SHyon Kim } else {
37239e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
37249e86db79SHyon Kim }
37259e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
37269e86db79SHyon Kim }
37279e86db79SHyon Kim
37289e86db79SHyon Kim HBA_STATUS
SMHBA_GetPortAttributesByWWN(HBA_HANDLE handle,HBA_WWN portWWN,HBA_WWN domainPortWWN,SMHBA_PORTATTRIBUTES * portattributes)37299e86db79SHyon Kim SMHBA_GetPortAttributesByWWN(
37309e86db79SHyon Kim HBA_HANDLE handle,
37319e86db79SHyon Kim HBA_WWN portWWN,
37329e86db79SHyon Kim HBA_WWN domainPortWWN,
37339e86db79SHyon Kim SMHBA_PORTATTRIBUTES *portattributes)
37349e86db79SHyon Kim {
37359e86db79SHyon Kim HBA_STATUS status;
37369e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
37379e86db79SHyon Kim HBA_HANDLE vendorHandle;
37389e86db79SHyon Kim SMHBAGetPortAttributesByWWNFunc
37399e86db79SHyon Kim GetPortAttributesByWWNFunc;
37409e86db79SHyon Kim
37419e86db79SHyon Kim DEBUG(2, "SMHBA_GetPortAttributesByWWN: %s", WWN2STR1(&portWWN), 0, 0);
37429e86db79SHyon Kim
37439e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
37449e86db79SHyon Kim
37459e86db79SHyon Kim GetPortAttributesByWWNFunc =
37469e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.GetPortAttributesByWWNHandler;
37479e86db79SHyon Kim if (GetPortAttributesByWWNFunc != NULL) {
37489e86db79SHyon Kim status = ((GetPortAttributesByWWNFunc)
37499e86db79SHyon Kim (vendorHandle, portWWN, domainPortWWN, portattributes));
37509e86db79SHyon Kim } else {
37519e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
37529e86db79SHyon Kim }
37539e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
37549e86db79SHyon Kim }
37559e86db79SHyon Kim
37569e86db79SHyon Kim HBA_STATUS
SMHBA_GetFCPhyAttributes(HBA_HANDLE handle,HBA_UINT32 portindex,HBA_UINT32 phyindex,SMHBA_FC_PHY * phytype)37579e86db79SHyon Kim SMHBA_GetFCPhyAttributes(
37589e86db79SHyon Kim HBA_HANDLE handle,
37599e86db79SHyon Kim HBA_UINT32 portindex,
37609e86db79SHyon Kim HBA_UINT32 phyindex,
37619e86db79SHyon Kim SMHBA_FC_PHY *phytype)
37629e86db79SHyon Kim {
37639e86db79SHyon Kim HBA_STATUS status;
37649e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
37659e86db79SHyon Kim HBA_HANDLE vendorHandle;
37669e86db79SHyon Kim SMHBAGetFCPhyAttributesFunc GetFCPhyAttributesFunc;
37679e86db79SHyon Kim
37689e86db79SHyon Kim DEBUG(2, "SMHBA_GetFCPhyAttributesByWWN", 0, 0, 0);
37699e86db79SHyon Kim
37709e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
37719e86db79SHyon Kim
37729e86db79SHyon Kim GetFCPhyAttributesFunc =
37739e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.GetFCPhyAttributesHandler;
37749e86db79SHyon Kim if (GetFCPhyAttributesFunc != NULL) {
37759e86db79SHyon Kim status = ((GetFCPhyAttributesFunc)
37769e86db79SHyon Kim (vendorHandle, portindex, phyindex, phytype));
37779e86db79SHyon Kim } else {
37789e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
37799e86db79SHyon Kim }
37809e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
37819e86db79SHyon Kim }
37829e86db79SHyon Kim
37839e86db79SHyon Kim HBA_STATUS
SMHBA_GetSASPhyAttributes(HBA_HANDLE handle,HBA_UINT32 portindex,HBA_UINT32 phyindex,SMHBA_SAS_PHY * phytype)37849e86db79SHyon Kim SMHBA_GetSASPhyAttributes(
37859e86db79SHyon Kim HBA_HANDLE handle,
37869e86db79SHyon Kim HBA_UINT32 portindex,
37879e86db79SHyon Kim HBA_UINT32 phyindex,
37889e86db79SHyon Kim SMHBA_SAS_PHY *phytype)
37899e86db79SHyon Kim {
37909e86db79SHyon Kim HBA_STATUS status;
37919e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
37929e86db79SHyon Kim HBA_HANDLE vendorHandle;
37939e86db79SHyon Kim SMHBAGetSASPhyAttributesFunc GetSASPhyAttributesFunc;
37949e86db79SHyon Kim
37959e86db79SHyon Kim DEBUG(2, "SMHBA_GetFCPhyAttributesByWWN", 0, 0, 0);
37969e86db79SHyon Kim
37979e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
37989e86db79SHyon Kim
37999e86db79SHyon Kim GetSASPhyAttributesFunc =
38009e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.GetSASPhyAttributesHandler;
38019e86db79SHyon Kim if (GetSASPhyAttributesFunc != NULL) {
38029e86db79SHyon Kim status = ((GetSASPhyAttributesFunc)
38039e86db79SHyon Kim (vendorHandle, portindex, phyindex, phytype));
38049e86db79SHyon Kim } else {
38059e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
38069e86db79SHyon Kim }
38079e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
38089e86db79SHyon Kim }
38099e86db79SHyon Kim
38109e86db79SHyon Kim HBA_STATUS
SMHBA_GetProtocolStatistics(HBA_HANDLE handle,HBA_UINT32 portindex,HBA_UINT32 protocoltype,SMHBA_PROTOCOLSTATISTICS * pProtocolStatistics)38119e86db79SHyon Kim SMHBA_GetProtocolStatistics(
38129e86db79SHyon Kim HBA_HANDLE handle,
38139e86db79SHyon Kim HBA_UINT32 portindex,
38149e86db79SHyon Kim HBA_UINT32 protocoltype,
38159e86db79SHyon Kim SMHBA_PROTOCOLSTATISTICS *pProtocolStatistics)
38169e86db79SHyon Kim {
38179e86db79SHyon Kim HBA_STATUS status;
38189e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
38199e86db79SHyon Kim HBA_HANDLE vendorHandle;
38209e86db79SHyon Kim SMHBAGetProtocolStatisticsFunc
38219e86db79SHyon Kim GetProtocolStatisticsFunc;
38229e86db79SHyon Kim
38239e86db79SHyon Kim DEBUG(2, "SMHBA_GetProtocolStatistics port index: %d protocol type: %d",
38249e86db79SHyon Kim portindex, protocoltype, 0);
38259e86db79SHyon Kim
38269e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
38279e86db79SHyon Kim
38289e86db79SHyon Kim GetProtocolStatisticsFunc =
38299e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.GetProtocolStatisticsHandler;
38309e86db79SHyon Kim if (GetProtocolStatisticsFunc != NULL) {
38319e86db79SHyon Kim status = (GetProtocolStatisticsFunc)
38329e86db79SHyon Kim (vendorHandle, portindex, protocoltype, pProtocolStatistics);
38339e86db79SHyon Kim } else {
38349e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
38359e86db79SHyon Kim }
38369e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
38379e86db79SHyon Kim }
38389e86db79SHyon Kim
38399e86db79SHyon Kim HBA_STATUS
SMHBA_GetPhyStatistics(HBA_HANDLE handle,HBA_UINT32 portindex,HBA_UINT32 phyindex,SMHBA_PHYSTATISTICS * pPhyStatistics)38409e86db79SHyon Kim SMHBA_GetPhyStatistics(
38419e86db79SHyon Kim HBA_HANDLE handle,
38429e86db79SHyon Kim HBA_UINT32 portindex,
38439e86db79SHyon Kim HBA_UINT32 phyindex,
38449e86db79SHyon Kim SMHBA_PHYSTATISTICS *pPhyStatistics)
38459e86db79SHyon Kim {
38469e86db79SHyon Kim HBA_STATUS status;
38479e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
38489e86db79SHyon Kim HBA_HANDLE vendorHandle;
38499e86db79SHyon Kim SMHBAGetPhyStatisticsFunc
38509e86db79SHyon Kim GetPhyStatisticsFunc;
38519e86db79SHyon Kim
38529e86db79SHyon Kim DEBUG(2, "SMHBA_GetPhyStatistics port index: %d phy idex: %d",
38539e86db79SHyon Kim portindex, phyindex, 0);
38549e86db79SHyon Kim
38559e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
38569e86db79SHyon Kim
38579e86db79SHyon Kim GetPhyStatisticsFunc =
38589e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.GetPhyStatisticsHandler;
38599e86db79SHyon Kim if (GetPhyStatisticsFunc != NULL) {
38609e86db79SHyon Kim status = (GetPhyStatisticsFunc)
38619e86db79SHyon Kim (vendorHandle, portindex, phyindex, pPhyStatistics);
38629e86db79SHyon Kim } else {
38639e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
38649e86db79SHyon Kim }
38659e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
38669e86db79SHyon Kim }
38679e86db79SHyon Kim
38689e86db79SHyon Kim HBA_STATUS
SMHBA_GetBindingCapability(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_WWN domainPortWWN,SMHBA_BIND_CAPABILITY * pFlags)38699e86db79SHyon Kim SMHBA_GetBindingCapability(
38709e86db79SHyon Kim HBA_HANDLE handle,
38719e86db79SHyon Kim HBA_WWN hbaPortWWN,
38729e86db79SHyon Kim HBA_WWN domainPortWWN,
38739e86db79SHyon Kim SMHBA_BIND_CAPABILITY *pFlags)
38749e86db79SHyon Kim {
38759e86db79SHyon Kim HBA_STATUS status;
38769e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
38779e86db79SHyon Kim HBA_HANDLE vendorHandle;
38789e86db79SHyon Kim SMHBAGetBindingCapabilityFunc GetBindingCapabilityFunc;
38799e86db79SHyon Kim
38809e86db79SHyon Kim DEBUG(2, "HBA_GetBindingCapability", 0, 0, 0);
38819e86db79SHyon Kim
38829e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
38839e86db79SHyon Kim
38849e86db79SHyon Kim GetBindingCapabilityFunc =
38859e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.GetBindingCapabilityHandler;
38869e86db79SHyon Kim if (GetBindingCapabilityFunc != NULL) {
38879e86db79SHyon Kim status = (GetBindingCapabilityFunc)(vendorHandle, hbaPortWWN,
38889e86db79SHyon Kim domainPortWWN, pFlags);
38899e86db79SHyon Kim } else {
38909e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
38919e86db79SHyon Kim }
38929e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
38939e86db79SHyon Kim }
38949e86db79SHyon Kim
38959e86db79SHyon Kim HBA_STATUS
SMHBA_GetBindingSupport(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_WWN domainPortWWN,SMHBA_BIND_CAPABILITY * pFlags)38969e86db79SHyon Kim SMHBA_GetBindingSupport(
38979e86db79SHyon Kim HBA_HANDLE handle,
38989e86db79SHyon Kim HBA_WWN hbaPortWWN,
38999e86db79SHyon Kim HBA_WWN domainPortWWN,
39009e86db79SHyon Kim SMHBA_BIND_CAPABILITY *pFlags)
39019e86db79SHyon Kim {
39029e86db79SHyon Kim HBA_STATUS status;
39039e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
39049e86db79SHyon Kim HBA_HANDLE vendorHandle;
39059e86db79SHyon Kim SMHBAGetBindingSupportFunc
39069e86db79SHyon Kim GetBindingSupporFunc;
39079e86db79SHyon Kim
39089e86db79SHyon Kim DEBUG(2, "SMHBA_GetBindingSupport port: %s",
39099e86db79SHyon Kim WWN2STR1(&hbaPortWWN), 0, 0);
39109e86db79SHyon Kim
39119e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
39129e86db79SHyon Kim
39139e86db79SHyon Kim GetBindingSupporFunc =
39149e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.GetBindingSupportHandler;
39159e86db79SHyon Kim if (GetBindingSupporFunc != NULL) {
39169e86db79SHyon Kim status = (GetBindingSupporFunc)(vendorHandle,
39179e86db79SHyon Kim hbaPortWWN, domainPortWWN, pFlags);
39189e86db79SHyon Kim } else {
39199e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
39209e86db79SHyon Kim }
39219e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
39229e86db79SHyon Kim }
39239e86db79SHyon Kim
39249e86db79SHyon Kim HBA_STATUS
SMHBA_SetBindingSupport(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_WWN domainPortWWN,SMHBA_BIND_CAPABILITY flags)39259e86db79SHyon Kim SMHBA_SetBindingSupport(
39269e86db79SHyon Kim HBA_HANDLE handle,
39279e86db79SHyon Kim HBA_WWN hbaPortWWN,
39289e86db79SHyon Kim HBA_WWN domainPortWWN,
39299e86db79SHyon Kim SMHBA_BIND_CAPABILITY flags)
39309e86db79SHyon Kim {
39319e86db79SHyon Kim HBA_STATUS status;
39329e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
39339e86db79SHyon Kim HBA_HANDLE vendorHandle;
39349e86db79SHyon Kim SMHBASetBindingSupportFunc
39359e86db79SHyon Kim SetBindingSupporFunc;
39369e86db79SHyon Kim
39379e86db79SHyon Kim DEBUG(2, "SMHBA_GetBindingSupport port: %s",
39389e86db79SHyon Kim WWN2STR1(&hbaPortWWN), 0, 0);
39399e86db79SHyon Kim
39409e86db79SHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
39419e86db79SHyon Kim
39429e86db79SHyon Kim SetBindingSupporFunc =
39439e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.SetBindingSupportHandler;
39449e86db79SHyon Kim if (SetBindingSupporFunc != NULL) {
39459e86db79SHyon Kim status = (SetBindingSupporFunc)
39469e86db79SHyon Kim (vendorHandle, hbaPortWWN, domainPortWWN, flags);
39479e86db79SHyon Kim } else {
39489e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
39499e86db79SHyon Kim }
39509e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
39519e86db79SHyon Kim }
39529e86db79SHyon Kim
39539e86db79SHyon Kim HBA_STATUS
SMHBA_GetTargetMapping(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_WWN domainPortWWN,SMHBA_TARGETMAPPING * pMapping)39549e86db79SHyon Kim SMHBA_GetTargetMapping(
39559e86db79SHyon Kim HBA_HANDLE handle,
39569e86db79SHyon Kim HBA_WWN hbaPortWWN,
39579e86db79SHyon Kim HBA_WWN domainPortWWN,
39589e86db79SHyon Kim SMHBA_TARGETMAPPING *pMapping)
39599e86db79SHyon Kim {
39609e86db79SHyon Kim HBA_STATUS status;
39619e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
39629e86db79SHyon Kim HBA_HANDLE vendorHandle;
39639e86db79SHyon Kim SMHBAGetTargetMappingFunc GetTargetMappingFunc;
39649e86db79SHyon Kim
39659e86db79SHyon Kim DEBUG(2, "SMHBA_GetTargetMapping port WWN: %s",
39669e86db79SHyon Kim WWN2STR1(&hbaPortWWN), 0, 0);
39679e86db79SHyon Kim
39689e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
39699e86db79SHyon Kim
39709e86db79SHyon Kim GetTargetMappingFunc =
39719e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.GetTargetMappingHandler;
39729e86db79SHyon Kim if (GetTargetMappingFunc != NULL) {
39739e86db79SHyon Kim status = ((GetTargetMappingFunc)(vendorHandle,
39749e86db79SHyon Kim hbaPortWWN, domainPortWWN, pMapping));
39759e86db79SHyon Kim } else {
39769e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
39779e86db79SHyon Kim }
39789e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
39799e86db79SHyon Kim }
39809e86db79SHyon Kim
39819e86db79SHyon Kim HBA_STATUS
SMHBA_GetPersistentBinding(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_WWN domainPortWWN,SMHBA_BINDING * binding)39829e86db79SHyon Kim SMHBA_GetPersistentBinding(
39839e86db79SHyon Kim HBA_HANDLE handle,
39849e86db79SHyon Kim HBA_WWN hbaPortWWN,
39859e86db79SHyon Kim HBA_WWN domainPortWWN,
39869e86db79SHyon Kim SMHBA_BINDING *binding)
39879e86db79SHyon Kim {
39889e86db79SHyon Kim HBA_STATUS status;
39899e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
39909e86db79SHyon Kim HBA_HANDLE vendorHandle;
39919e86db79SHyon Kim SMHBAGetPersistentBindingFunc
39929e86db79SHyon Kim GetPersistentBindingFunc;
39939e86db79SHyon Kim
39949e86db79SHyon Kim DEBUG(2, "SMHBA_GetPersistentBinding port WWN: %s",
39959e86db79SHyon Kim WWN2STR1(&hbaPortWWN), 0, 0);
39969e86db79SHyon Kim
39979e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
39989e86db79SHyon Kim
39999e86db79SHyon Kim GetPersistentBindingFunc =
40009e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.GetPersistentBindingHandler;
40019e86db79SHyon Kim if (GetPersistentBindingFunc != NULL) {
40029e86db79SHyon Kim status = ((GetPersistentBindingFunc)(vendorHandle,
40039e86db79SHyon Kim hbaPortWWN, domainPortWWN, binding));
40049e86db79SHyon Kim } else {
40059e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
40069e86db79SHyon Kim }
40079e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
40089e86db79SHyon Kim }
40099e86db79SHyon Kim
40109e86db79SHyon Kim HBA_STATUS
SMHBA_SetPersistentBinding(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_WWN domainPortWWN,const SMHBA_BINDING * binding)40119e86db79SHyon Kim SMHBA_SetPersistentBinding(
40129e86db79SHyon Kim HBA_HANDLE handle,
40139e86db79SHyon Kim HBA_WWN hbaPortWWN,
40149e86db79SHyon Kim HBA_WWN domainPortWWN,
40159e86db79SHyon Kim const SMHBA_BINDING *binding)
40169e86db79SHyon Kim {
40179e86db79SHyon Kim HBA_STATUS status;
40189e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
40199e86db79SHyon Kim HBA_HANDLE vendorHandle;
40209e86db79SHyon Kim SMHBASetPersistentBindingFunc
40219e86db79SHyon Kim SetPersistentBindingFunc;
40229e86db79SHyon Kim
40239e86db79SHyon Kim DEBUG(2, "SMHBA_SetPersistentBinding port WWN: %s",
40249e86db79SHyon Kim WWN2STR1(&hbaPortWWN), 0, 0);
40259e86db79SHyon Kim
40269e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
40279e86db79SHyon Kim
40289e86db79SHyon Kim SetPersistentBindingFunc =
40299e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.SetPersistentBindingHandler;
40309e86db79SHyon Kim if (SetPersistentBindingFunc != NULL) {
40319e86db79SHyon Kim status = ((SetPersistentBindingFunc)(vendorHandle,
40329e86db79SHyon Kim hbaPortWWN, domainPortWWN, binding));
40339e86db79SHyon Kim } else {
40349e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
40359e86db79SHyon Kim }
40369e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
40379e86db79SHyon Kim }
40389e86db79SHyon Kim
40399e86db79SHyon Kim HBA_STATUS
SMHBA_RemovePersistentBinding(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_WWN domainPortWWN,const SMHBA_BINDING * binding)40409e86db79SHyon Kim SMHBA_RemovePersistentBinding(
40419e86db79SHyon Kim HBA_HANDLE handle,
40429e86db79SHyon Kim HBA_WWN hbaPortWWN,
40439e86db79SHyon Kim HBA_WWN domainPortWWN,
40449e86db79SHyon Kim const SMHBA_BINDING *binding)
40459e86db79SHyon Kim {
40469e86db79SHyon Kim HBA_STATUS status;
40479e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
40489e86db79SHyon Kim HBA_HANDLE vendorHandle;
40499e86db79SHyon Kim SMHBARemovePersistentBindingFunc
40509e86db79SHyon Kim RemovePersistentBindingFunc;
40519e86db79SHyon Kim
40529e86db79SHyon Kim DEBUG(2, "SMHBA_RemovePersistentBinding port WWN: %s",
40539e86db79SHyon Kim WWN2STR1(&hbaPortWWN), 0, 0);
40549e86db79SHyon Kim
40559e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
40569e86db79SHyon Kim
40579e86db79SHyon Kim RemovePersistentBindingFunc =
40589e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.RemovePersistentBindingHandler;
40599e86db79SHyon Kim if (RemovePersistentBindingFunc != NULL) {
40609e86db79SHyon Kim status = ((RemovePersistentBindingFunc)(vendorHandle,
40619e86db79SHyon Kim hbaPortWWN, domainPortWWN, binding));
40629e86db79SHyon Kim } else {
40639e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
40649e86db79SHyon Kim }
40659e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
40669e86db79SHyon Kim }
40679e86db79SHyon Kim
40689e86db79SHyon Kim HBA_STATUS
SMHBA_RemoveAllPersistentBindings(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_WWN domainPortWWN)40699e86db79SHyon Kim SMHBA_RemoveAllPersistentBindings(
40709e86db79SHyon Kim HBA_HANDLE handle,
40719e86db79SHyon Kim HBA_WWN hbaPortWWN,
40729e86db79SHyon Kim HBA_WWN domainPortWWN)
40739e86db79SHyon Kim {
40749e86db79SHyon Kim HBA_STATUS status;
40759e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
40769e86db79SHyon Kim HBA_HANDLE vendorHandle;
40779e86db79SHyon Kim SMHBARemoveAllPersistentBindingsFunc
40789e86db79SHyon Kim RemoveAllPersistentBindingsFunc;
40799e86db79SHyon Kim
40809e86db79SHyon Kim DEBUG(2, "SMHBA_RemoveAllPersistentBinding port WWN: %s",
40819e86db79SHyon Kim WWN2STR1(&hbaPortWWN), 0, 0);
40829e86db79SHyon Kim
40839e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
40849e86db79SHyon Kim
40859e86db79SHyon Kim RemoveAllPersistentBindingsFunc =
40869e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.\
40879e86db79SHyon Kim RemoveAllPersistentBindingsHandler;
40889e86db79SHyon Kim if (RemoveAllPersistentBindingsFunc != NULL) {
40899e86db79SHyon Kim status = ((RemoveAllPersistentBindingsFunc)(vendorHandle,
40909e86db79SHyon Kim hbaPortWWN, domainPortWWN));
40919e86db79SHyon Kim } else {
40929e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
40939e86db79SHyon Kim }
40949e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
40959e86db79SHyon Kim }
40969e86db79SHyon Kim
40979e86db79SHyon Kim HBA_STATUS
SMHBA_GetLUNStatistics(HBA_HANDLE handle,const HBA_SCSIID * lunit,SMHBA_PROTOCOLSTATISTICS * statistics)40989e86db79SHyon Kim SMHBA_GetLUNStatistics(
40999e86db79SHyon Kim HBA_HANDLE handle,
41009e86db79SHyon Kim const HBA_SCSIID *lunit,
41019e86db79SHyon Kim SMHBA_PROTOCOLSTATISTICS *statistics)
41029e86db79SHyon Kim {
41039e86db79SHyon Kim HBA_STATUS status;
41049e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
41059e86db79SHyon Kim HBA_HANDLE vendorHandle;
41069e86db79SHyon Kim SMHBAGetLUNStatisticsFunc GetLUNStatisticsFunc;
41079e86db79SHyon Kim
41089e86db79SHyon Kim DEBUG(2, "SMHBA_GetLUNStatistics", 0, 0, 0);
41099e86db79SHyon Kim
41109e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
41119e86db79SHyon Kim
41129e86db79SHyon Kim GetLUNStatisticsFunc =
41139e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.GetLUNStatisticsHandler;
41149e86db79SHyon Kim if (GetLUNStatisticsFunc != NULL) {
41159e86db79SHyon Kim status = ((GetLUNStatisticsFunc)(vendorHandle, lunit, statistics));
41169e86db79SHyon Kim } else {
41179e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
41189e86db79SHyon Kim }
41199e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
41209e86db79SHyon Kim }
41219e86db79SHyon Kim
41229e86db79SHyon Kim HBA_STATUS
SMHBA_ScsiInquiry(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_WWN discoveredPortWWN,HBA_WWN domainPortWWN,SMHBA_SCSILUN smhbaLUN,HBA_UINT8 CDB_Byte1,HBA_UINT8 CDB_Byte2,void * pRspBuffer,HBA_UINT32 * pRspBufferSize,HBA_UINT8 * pScsiStatus,void * pSenseBuffer,HBA_UINT32 * pSenseBufferSize)41239e86db79SHyon Kim SMHBA_ScsiInquiry(
41249e86db79SHyon Kim HBA_HANDLE handle,
41259e86db79SHyon Kim HBA_WWN hbaPortWWN,
41269e86db79SHyon Kim HBA_WWN discoveredPortWWN,
41279e86db79SHyon Kim HBA_WWN domainPortWWN,
41289e86db79SHyon Kim SMHBA_SCSILUN smhbaLUN,
41299e86db79SHyon Kim HBA_UINT8 CDB_Byte1,
41309e86db79SHyon Kim HBA_UINT8 CDB_Byte2,
41319e86db79SHyon Kim void *pRspBuffer,
41329e86db79SHyon Kim HBA_UINT32 *pRspBufferSize,
41339e86db79SHyon Kim HBA_UINT8 *pScsiStatus,
41349e86db79SHyon Kim void *pSenseBuffer,
41359e86db79SHyon Kim HBA_UINT32 *pSenseBufferSize)
41369e86db79SHyon Kim {
41379e86db79SHyon Kim HBA_STATUS status;
41389e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
41399e86db79SHyon Kim HBA_HANDLE vendorHandle;
41409e86db79SHyon Kim SMHBAScsiInquiryFunc ScsiInquiryFunc;
41419e86db79SHyon Kim
41429e86db79SHyon Kim DEBUG(2, "SMHBA_ScsiInquiry to hba port: %s discoveredPortWWN: %s",
41439e86db79SHyon Kim WWN2STR1(&hbaPortWWN), WWN2STR1(&discoveredPortWWN), 0);
41449e86db79SHyon Kim
41459e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
41469e86db79SHyon Kim
41479e86db79SHyon Kim ScsiInquiryFunc =
41489e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.ScsiInquiryHandler;
41499e86db79SHyon Kim if (ScsiInquiryFunc != NULL) {
41509e86db79SHyon Kim status = ((ScsiInquiryFunc)(
41519e86db79SHyon Kim vendorHandle, hbaPortWWN, discoveredPortWWN, domainPortWWN,
41529e86db79SHyon Kim smhbaLUN, CDB_Byte1, CDB_Byte2, pRspBuffer, pRspBufferSize,
41539e86db79SHyon Kim pScsiStatus, pSenseBuffer, pSenseBufferSize));
41549e86db79SHyon Kim } else {
41559e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
41569e86db79SHyon Kim }
41579e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
41589e86db79SHyon Kim }
41599e86db79SHyon Kim
41609e86db79SHyon Kim HBA_STATUS
SMHBA_ScsiReportLUNs(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_WWN discoveredPortWWN,HBA_WWN domainPortWWN,void * pRspBuffer,HBA_UINT32 * pRspBufferSize,HBA_UINT8 * pScsiStatus,void * pSenseBuffer,HBA_UINT32 * pSenseBufferSize)41619e86db79SHyon Kim SMHBA_ScsiReportLUNs(
41629e86db79SHyon Kim HBA_HANDLE handle,
41639e86db79SHyon Kim HBA_WWN hbaPortWWN,
41649e86db79SHyon Kim HBA_WWN discoveredPortWWN,
41659e86db79SHyon Kim HBA_WWN domainPortWWN,
41669e86db79SHyon Kim void *pRspBuffer,
41679e86db79SHyon Kim HBA_UINT32 *pRspBufferSize,
41689e86db79SHyon Kim HBA_UINT8 *pScsiStatus,
41699e86db79SHyon Kim void *pSenseBuffer,
41709e86db79SHyon Kim HBA_UINT32 *pSenseBufferSize)
41719e86db79SHyon Kim {
41729e86db79SHyon Kim HBA_STATUS status;
41739e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
41749e86db79SHyon Kim HBA_HANDLE vendorHandle;
41759e86db79SHyon Kim SMHBAScsiReportLUNsFunc ScsiReportLUNsFunc;
41769e86db79SHyon Kim
41779e86db79SHyon Kim DEBUG(2, "SMHBA_ScsiReportLuns to hba port: %s discoveredPortWWN: %s",
41789e86db79SHyon Kim WWN2STR1(&hbaPortWWN), WWN2STR1(&discoveredPortWWN), 0);
41799e86db79SHyon Kim
41809e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
41819e86db79SHyon Kim
41829e86db79SHyon Kim ScsiReportLUNsFunc =
41839e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.ScsiReportLUNsHandler;
41849e86db79SHyon Kim if (ScsiReportLUNsFunc != NULL) {
41859e86db79SHyon Kim status = ((ScsiReportLUNsFunc)(
41869e86db79SHyon Kim vendorHandle, hbaPortWWN, discoveredPortWWN, domainPortWWN,
41879e86db79SHyon Kim pRspBuffer, pRspBufferSize, pScsiStatus, pSenseBuffer,
41889e86db79SHyon Kim pSenseBufferSize));
41899e86db79SHyon Kim } else {
41909e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
41919e86db79SHyon Kim }
41929e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
41939e86db79SHyon Kim }
41949e86db79SHyon Kim
41959e86db79SHyon Kim HBA_STATUS
SMHBA_ScsiReadCapacity(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_WWN discoveredPortWWN,HBA_WWN domainPortWWN,SMHBA_SCSILUN smhbaLUN,void * pRspBuffer,HBA_UINT32 * pRspBufferSize,HBA_UINT8 * pScsiStatus,void * pSenseBuffer,HBA_UINT32 * pSenseBufferSize)41969e86db79SHyon Kim SMHBA_ScsiReadCapacity(
41979e86db79SHyon Kim HBA_HANDLE handle,
41989e86db79SHyon Kim HBA_WWN hbaPortWWN,
41999e86db79SHyon Kim HBA_WWN discoveredPortWWN,
42009e86db79SHyon Kim HBA_WWN domainPortWWN,
42019e86db79SHyon Kim SMHBA_SCSILUN smhbaLUN,
42029e86db79SHyon Kim void *pRspBuffer,
42039e86db79SHyon Kim HBA_UINT32 *pRspBufferSize,
42049e86db79SHyon Kim HBA_UINT8 *pScsiStatus,
42059e86db79SHyon Kim void *pSenseBuffer,
42069e86db79SHyon Kim HBA_UINT32 *pSenseBufferSize)
42079e86db79SHyon Kim {
42089e86db79SHyon Kim HBA_STATUS status;
42099e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
42109e86db79SHyon Kim HBA_HANDLE vendorHandle;
42119e86db79SHyon Kim SMHBAScsiReadCapacityFunc ScsiReadCapacityFunc;
42129e86db79SHyon Kim
42139e86db79SHyon Kim DEBUG(2, "SMHBA_ScsiReadCapacity to hba port: %s discoveredPortWWN: %s",
42149e86db79SHyon Kim WWN2STR1(&hbaPortWWN), WWN2STR1(&discoveredPortWWN), 0);
42159e86db79SHyon Kim
42169e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
42179e86db79SHyon Kim
42189e86db79SHyon Kim ScsiReadCapacityFunc =
42199e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.ScsiReadCapacityHandler;
42209e86db79SHyon Kim if (ScsiReadCapacityFunc != NULL) {
42219e86db79SHyon Kim status = ((ScsiReadCapacityFunc)(
42229e86db79SHyon Kim vendorHandle, hbaPortWWN, discoveredPortWWN, domainPortWWN,
42239e86db79SHyon Kim smhbaLUN, pRspBuffer, pRspBufferSize, pScsiStatus, pSenseBuffer,
42249e86db79SHyon Kim pSenseBufferSize));
42259e86db79SHyon Kim } else {
42269e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
42279e86db79SHyon Kim }
42289e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
42299e86db79SHyon Kim }
42309e86db79SHyon Kim
42319e86db79SHyon Kim HBA_STATUS
SMHBA_SendTEST(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_WWN destWWN,HBA_UINT32 destFCID,void * pRspBuffer,HBA_UINT32 pRspBufferSize)42329e86db79SHyon Kim SMHBA_SendTEST(
42339e86db79SHyon Kim HBA_HANDLE handle,
42349e86db79SHyon Kim HBA_WWN hbaPortWWN,
42359e86db79SHyon Kim HBA_WWN destWWN,
42369e86db79SHyon Kim HBA_UINT32 destFCID,
42379e86db79SHyon Kim void *pRspBuffer,
42389e86db79SHyon Kim HBA_UINT32 pRspBufferSize)
42399e86db79SHyon Kim {
42409e86db79SHyon Kim HBA_STATUS status;
42419e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
42429e86db79SHyon Kim HBA_HANDLE vendorHandle;
42439e86db79SHyon Kim SMHBASendTESTFunc SendTESTFunc;
42449e86db79SHyon Kim
42459e86db79SHyon Kim DEBUG(2, "SMHBA_SendTEST, hbaPortWWN: %s destWWN",
42469e86db79SHyon Kim WWN2STR1(&hbaPortWWN),
42479e86db79SHyon Kim WWN2STR1(&destWWN), 0);
42489e86db79SHyon Kim
42499e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
42509e86db79SHyon Kim
42519e86db79SHyon Kim SendTESTFunc = lib_infop->ftable.smhbafunctionTable.SendTESTHandler;
42529e86db79SHyon Kim if (SendTESTFunc != NULL) {
42539e86db79SHyon Kim status = (SendTESTFunc)
42549e86db79SHyon Kim (vendorHandle, hbaPortWWN, destWWN, destFCID,
42559e86db79SHyon Kim pRspBuffer, pRspBufferSize);
42569e86db79SHyon Kim } else {
42579e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
42589e86db79SHyon Kim }
42599e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
42609e86db79SHyon Kim }
42619e86db79SHyon Kim
42629e86db79SHyon Kim HBA_STATUS
SMHBA_SendECHO(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_WWN destWWN,HBA_UINT32 destFCID,void * pReqBuffer,HBA_UINT32 ReqBufferSize,void * pRspBuffer,HBA_UINT32 * pRspBufferSize)42639e86db79SHyon Kim SMHBA_SendECHO(
42649e86db79SHyon Kim HBA_HANDLE handle,
42659e86db79SHyon Kim HBA_WWN hbaPortWWN,
42669e86db79SHyon Kim HBA_WWN destWWN,
42679e86db79SHyon Kim HBA_UINT32 destFCID,
42689e86db79SHyon Kim void *pReqBuffer,
42699e86db79SHyon Kim HBA_UINT32 ReqBufferSize,
42709e86db79SHyon Kim void *pRspBuffer,
42719e86db79SHyon Kim HBA_UINT32 *pRspBufferSize)
42729e86db79SHyon Kim {
42739e86db79SHyon Kim HBA_STATUS status;
42749e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
42759e86db79SHyon Kim HBA_HANDLE vendorHandle;
42769e86db79SHyon Kim SMHBASendECHOFunc SendECHOFunc;
42779e86db79SHyon Kim
42789e86db79SHyon Kim DEBUG(2, "SMHBA_SendECHO, hbaPortWWN: %s destWWN",
42799e86db79SHyon Kim WWN2STR1(&hbaPortWWN), WWN2STR1(&destWWN), 0);
42809e86db79SHyon Kim
42819e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
42829e86db79SHyon Kim
42839e86db79SHyon Kim SendECHOFunc = lib_infop->ftable.smhbafunctionTable.SendECHOHandler;
42849e86db79SHyon Kim if (SendECHOFunc != NULL) {
42859e86db79SHyon Kim status = (SendECHOFunc)
42869e86db79SHyon Kim (vendorHandle, hbaPortWWN, destWWN, destFCID,
42879e86db79SHyon Kim pReqBuffer, ReqBufferSize, pRspBuffer, pRspBufferSize);
42889e86db79SHyon Kim } else {
42899e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
42909e86db79SHyon Kim }
42919e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
42929e86db79SHyon Kim }
42939e86db79SHyon Kim
42949e86db79SHyon Kim HBA_STATUS
SMHBA_SendSMPPassThru(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_WWN destWWN,HBA_WWN domainPortWWN,void * pReqBuffer,HBA_UINT32 ReqBufferSize,void * pRspBuffer,HBA_UINT32 * pRspBufferSize)42959e86db79SHyon Kim SMHBA_SendSMPPassThru(
42969e86db79SHyon Kim HBA_HANDLE handle,
42979e86db79SHyon Kim HBA_WWN hbaPortWWN,
42989e86db79SHyon Kim HBA_WWN destWWN,
42999e86db79SHyon Kim HBA_WWN domainPortWWN,
43009e86db79SHyon Kim void *pReqBuffer,
43019e86db79SHyon Kim HBA_UINT32 ReqBufferSize,
43029e86db79SHyon Kim void *pRspBuffer,
43039e86db79SHyon Kim HBA_UINT32 *pRspBufferSize)
43049e86db79SHyon Kim {
43059e86db79SHyon Kim HBA_STATUS status;
43069e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
43079e86db79SHyon Kim HBA_HANDLE vendorHandle;
43089e86db79SHyon Kim SMHBASendSMPPassThruFunc SendSMPPassThruFunc;
43099e86db79SHyon Kim
43109e86db79SHyon Kim DEBUG(2, "SMHBA_SendSMPPassThru, hbaPortWWN: %s destWWN: %s",
43119e86db79SHyon Kim WWN2STR1(&hbaPortWWN), WWN2STR1(&destWWN), 0);
43129e86db79SHyon Kim
43139e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
43149e86db79SHyon Kim
43159e86db79SHyon Kim SendSMPPassThruFunc = lib_infop->ftable.\
43169e86db79SHyon Kim smhbafunctionTable.SendSMPPassThruHandler;
43179e86db79SHyon Kim
43189e86db79SHyon Kim if (SendSMPPassThruFunc != NULL) {
43199e86db79SHyon Kim status = (SendSMPPassThruFunc)
43209e86db79SHyon Kim (vendorHandle, hbaPortWWN, destWWN, domainPortWWN,
43219e86db79SHyon Kim pReqBuffer, ReqBufferSize, pRspBuffer, pRspBufferSize);
43229e86db79SHyon Kim } else {
43239e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
43249e86db79SHyon Kim }
43259e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
43269e86db79SHyon Kim }
43279e86db79SHyon Kim
43289e86db79SHyon Kim /*
43299e86db79SHyon Kim * Following the similar logic of HBAAPI addaspterevents_callback.
43309e86db79SHyon Kim *
43319e86db79SHyon Kim * Unlike other events Adapter Add Event is not limited to a specific
4332*0778188fSHengqing Hu * adapter(i.e. no adapter handle is passed for registration) so
43339e86db79SHyon Kim * the event should be passed to all registrants. The routine below
43349e86db79SHyon Kim * is passed to the VSLs as a callback and when Adapter Add event is detected
43359e86db79SHyon Kim * by VSL it will call smhba_adapteraddevents_callback() which in turn check
43369e86db79SHyon Kim * if the passed userdata ptr matches with the one stored in the callback list
43379e86db79SHyon Kim * and calls the stored callback.
43389e86db79SHyon Kim *
43399e86db79SHyon Kim * For the situation that multiple clients are registered for Adapter Add event
43409e86db79SHyon Kim * each registration is passed to VSLs so VSL may call
43419e86db79SHyon Kim * smhba_adapteraddevents_callback() multiple times or it may call only once
43429e86db79SHyon Kim * since the callback function is same. For this implemneation, the userdata
43439e86db79SHyon Kim * is stored in HBA_ALLADAPTERSCALLBACK_ELEM so it is expected that VSL call
43449e86db79SHyon Kim * smhba_adapteraddevents_callback() only once and
43459e86db79SHyon Kim * smhba_adapteraddevents_callback() will call the client callback with proper
43469e86db79SHyon Kim * userdata.
43479e86db79SHyon Kim */
43489e86db79SHyon Kim static void
smhba_adapteraddevents_callback(void * data,HBA_WWN PortWWN,HBA_UINT32 eventType)43499e86db79SHyon Kim smhba_adapteraddevents_callback(
43509e86db79SHyon Kim /* LINTED E_FUNC_ARG_UNUSED */
43519e86db79SHyon Kim void *data,
43529e86db79SHyon Kim HBA_WWN PortWWN,
43539e86db79SHyon Kim /* LINTED E_FUNC_ARG_UNUSED */
43549e86db79SHyon Kim HBA_UINT32 eventType)
43559e86db79SHyon Kim {
43569e86db79SHyon Kim HBA_ALLADAPTERSCALLBACK_ELEM *cbp;
43579e86db79SHyon Kim
43589e86db79SHyon Kim DEBUG(3, "AddAdapterEvent, port:%s", WWN2STR1(&PortWWN), 0, 0);
43599e86db79SHyon Kim
43609e86db79SHyon Kim GRAB_MUTEX(&_smhba_AAE_mutex);
43619e86db79SHyon Kim for (cbp = _smhba_adapteraddevents_callback_list;
43629e86db79SHyon Kim cbp != NULL;
43639e86db79SHyon Kim cbp = cbp->next) {
43649e86db79SHyon Kim (*cbp->callback)(cbp->userdata, PortWWN, HBA_EVENT_ADAPTER_ADD);
43659e86db79SHyon Kim }
43669e86db79SHyon Kim RELEASE_MUTEX(&_smhba_AAE_mutex);
43679e86db79SHyon Kim
43689e86db79SHyon Kim }
43699e86db79SHyon Kim
43709e86db79SHyon Kim HBA_STATUS
SMHBA_RegisterForAdapterAddEvents(void (* pCallback)(void * data,HBA_WWN PortWWN,HBA_UINT32 eventType),void * pUserData,HBA_CALLBACKHANDLE * pCallbackHandle)43719e86db79SHyon Kim SMHBA_RegisterForAdapterAddEvents(
43729e86db79SHyon Kim void (*pCallback) (
43739e86db79SHyon Kim void *data,
43749e86db79SHyon Kim HBA_WWN PortWWN,
43759e86db79SHyon Kim HBA_UINT32 eventType),
43769e86db79SHyon Kim void *pUserData,
43779e86db79SHyon Kim HBA_CALLBACKHANDLE *pCallbackHandle) {
43789e86db79SHyon Kim
43799e86db79SHyon Kim HBA_ALLADAPTERSCALLBACK_ELEM *cbp;
43809e86db79SHyon Kim HBA_VENDORCALLBACK_ELEM *vcbp;
43819e86db79SHyon Kim HBA_VENDORCALLBACK_ELEM *vendorhandlelist;
43829e86db79SHyon Kim SMHBARegisterForAdapterAddEventsFunc registeredfunc;
43839e86db79SHyon Kim HBA_STATUS status = HBA_STATUS_OK;
43849e86db79SHyon Kim HBA_STATUS failure = HBA_STATUS_OK;
43859e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
43869e86db79SHyon Kim int registered_cnt = 0;
43879e86db79SHyon Kim int vendor_cnt = 0;
43889e86db79SHyon Kim int not_supported_cnt = 0;
43899e86db79SHyon Kim int status_OK_bar_cnt = 0;
43909e86db79SHyon Kim int status_OK_cnt = 0;
43919e86db79SHyon Kim
43929e86db79SHyon Kim DEBUG(2, "SMHBA_RegisterForAdapterAddEvents", 0, 0, 0);
43939e86db79SHyon Kim ARE_WE_INITED();
43949e86db79SHyon Kim
43959e86db79SHyon Kim cbp = (HBA_ALLADAPTERSCALLBACK_ELEM *)
43969e86db79SHyon Kim calloc(1, sizeof (HBA_ALLADAPTERSCALLBACK_ELEM));
43979e86db79SHyon Kim *pCallbackHandle = (HBA_CALLBACKHANDLE) cbp;
43989e86db79SHyon Kim if (cbp == NULL) {
43999e86db79SHyon Kim return (HBA_STATUS_ERROR);
44009e86db79SHyon Kim }
44019e86db79SHyon Kim
44029e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_LL_mutex);
44039e86db79SHyon Kim GRAB_MUTEX(&_smhba_AAE_mutex);
44049e86db79SHyon Kim cbp->callback = pCallback;
44059e86db79SHyon Kim cbp->userdata = pUserData;
44069e86db79SHyon Kim cbp->next = _smhba_adapteraddevents_callback_list;
44079e86db79SHyon Kim _smhba_adapteraddevents_callback_list = cbp;
44089e86db79SHyon Kim
44099e86db79SHyon Kim /*
44109e86db79SHyon Kim * Need to release the mutex now incase the vendor function invokes the
44119e86db79SHyon Kim * callback. We will grap the mutex later to attach the vendor handle
44129e86db79SHyon Kim * list to the callback structure
44139e86db79SHyon Kim */
44149e86db79SHyon Kim RELEASE_MUTEX(&_smhba_AAE_mutex);
44159e86db79SHyon Kim
44169e86db79SHyon Kim
44179e86db79SHyon Kim /*
44189e86db79SHyon Kim * now create a list of vendors (vendor libraryies, NOT ADAPTERS)
44199e86db79SHyon Kim * that have successfully registerred
44209e86db79SHyon Kim */
44219e86db79SHyon Kim vendorhandlelist = NULL;
44229e86db79SHyon Kim for (lib_infop = _hbaapi_librarylist;
44239e86db79SHyon Kim lib_infop != NULL;
44249e86db79SHyon Kim lib_infop = lib_infop->next) {
44259e86db79SHyon Kim
44269e86db79SHyon Kim /* only for HBAAPI V2 */
44279e86db79SHyon Kim if (lib_infop->version != SMHBA) {
44289e86db79SHyon Kim continue;
44299e86db79SHyon Kim } else {
44309e86db79SHyon Kim vendor_cnt++;
44319e86db79SHyon Kim }
44329e86db79SHyon Kim
44339e86db79SHyon Kim registeredfunc =
44349e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.\
44359e86db79SHyon Kim RegisterForAdapterAddEventsHandler;
44369e86db79SHyon Kim if (registeredfunc == NULL) {
44379e86db79SHyon Kim continue;
44389e86db79SHyon Kim }
44399e86db79SHyon Kim
44409e86db79SHyon Kim vcbp = (HBA_VENDORCALLBACK_ELEM *)
44419e86db79SHyon Kim calloc(1, sizeof (HBA_VENDORCALLBACK_ELEM));
44429e86db79SHyon Kim if (vcbp == NULL) {
44439e86db79SHyon Kim freevendorhandlelist(vendorhandlelist);
44449e86db79SHyon Kim status = HBA_STATUS_ERROR;
44459e86db79SHyon Kim break;
44469e86db79SHyon Kim }
44479e86db79SHyon Kim
44489e86db79SHyon Kim registered_cnt++;
44499e86db79SHyon Kim status = (registeredfunc)(smhba_adapteraddevents_callback,
44509e86db79SHyon Kim pUserData, &vcbp->vendorcbhandle);
44519e86db79SHyon Kim if (status == HBA_STATUS_ERROR_NOT_SUPPORTED) {
44529e86db79SHyon Kim not_supported_cnt++;
44539e86db79SHyon Kim free(vcbp);
44549e86db79SHyon Kim continue;
44559e86db79SHyon Kim } else if (status != HBA_STATUS_OK) {
44569e86db79SHyon Kim status_OK_bar_cnt++;
44579e86db79SHyon Kim DEBUG(1,
44589e86db79SHyon Kim "SMHBA_RegisterForAdapterAddEvents: Library->%s, Error->%d",
44599e86db79SHyon Kim lib_infop->LibraryPath, status, 0);
44609e86db79SHyon Kim failure = status;
44619e86db79SHyon Kim free(vcbp);
44629e86db79SHyon Kim continue;
44639e86db79SHyon Kim } else {
44649e86db79SHyon Kim status_OK_cnt++;
44659e86db79SHyon Kim }
44669e86db79SHyon Kim vcbp->lib_info = lib_infop;
44679e86db79SHyon Kim vcbp->next = vendorhandlelist;
44689e86db79SHyon Kim vendorhandlelist = vcbp;
44699e86db79SHyon Kim }
44709e86db79SHyon Kim
44719e86db79SHyon Kim if (vendor_cnt == 0) {
44729e86db79SHyon Kim /* no SMHBA VSL found. Should be okay?? */
44739e86db79SHyon Kim status = HBA_STATUS_ERROR;
44749e86db79SHyon Kim } else if (registered_cnt == 0) {
44759e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
44769e86db79SHyon Kim freevendorhandlelist(vendorhandlelist);
44779e86db79SHyon Kim (void) local_remove_callback((HBA_CALLBACKHANDLE) cbp);
44789e86db79SHyon Kim } else if (status_OK_cnt == 0 && not_supported_cnt != 0) {
44799e86db79SHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
44809e86db79SHyon Kim } else if (status_OK_cnt == 0) {
44819e86db79SHyon Kim /*
44829e86db79SHyon Kim * At least one vendor library registered this function, but no
44839e86db79SHyon Kim * vendor call succeeded
44849e86db79SHyon Kim */
44859e86db79SHyon Kim (void) local_remove_callback((HBA_CALLBACKHANDLE) cbp);
44869e86db79SHyon Kim status = failure;
44879e86db79SHyon Kim } else {
44889e86db79SHyon Kim /* we have had atleast some success, now finish up */
44899e86db79SHyon Kim GRAB_MUTEX(&_smhba_AAE_mutex);
44909e86db79SHyon Kim /*
44919e86db79SHyon Kim * this seems silly, but what if another thread called
44929e86db79SHyon Kim * the callback remove
44939e86db79SHyon Kim */
44949e86db79SHyon Kim for (cbp = _smhba_adapteraddevents_callback_list;
44959e86db79SHyon Kim cbp != NULL; cbp = cbp->next) {
44969e86db79SHyon Kim if ((HBA_CALLBACKHANDLE)cbp == *pCallbackHandle) {
44979e86db79SHyon Kim /* yup, its still there, hooray */
44989e86db79SHyon Kim cbp->vendorhandlelist = vendorhandlelist;
44999e86db79SHyon Kim vendorhandlelist = NULL;
45009e86db79SHyon Kim break;
45019e86db79SHyon Kim }
45029e86db79SHyon Kim }
45039e86db79SHyon Kim RELEASE_MUTEX(&_smhba_AAE_mutex);
45049e86db79SHyon Kim if (vendorhandlelist != NULL) {
45059e86db79SHyon Kim /*
45069e86db79SHyon Kim * bummer, somebody removed the callback before we finished
45079e86db79SHyon Kim * registration, probably will never happen
45089e86db79SHyon Kim */
45099e86db79SHyon Kim freevendorhandlelist(vendorhandlelist);
45109e86db79SHyon Kim DEBUG(1,
45119e86db79SHyon Kim "HBA_RegisterForAdapterAddEvents: HBA_RemoveCallback was "
45129e86db79SHyon Kim "called for a handle before registration was finished.",
45139e86db79SHyon Kim 0, 0, 0);
45149e86db79SHyon Kim status = HBA_STATUS_ERROR;
45159e86db79SHyon Kim } else {
45169e86db79SHyon Kim status = HBA_STATUS_OK;
45179e86db79SHyon Kim }
45189e86db79SHyon Kim }
45199e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
45209e86db79SHyon Kim }
45219e86db79SHyon Kim
45229e86db79SHyon Kim /* SMHBA Adapter Events (other than add) ******************************** */
45239e86db79SHyon Kim static void
smhba_adapterevents_callback(void * data,HBA_WWN PortWWN,HBA_UINT32 eventType)45249e86db79SHyon Kim smhba_adapterevents_callback(void *data,
45259e86db79SHyon Kim HBA_WWN PortWWN,
45269e86db79SHyon Kim HBA_UINT32 eventType)
45279e86db79SHyon Kim {
45289e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
45299e86db79SHyon Kim
45309e86db79SHyon Kim DEBUG(3, "AdapterEvent, port:%s, eventType:%d", WWN2STR1(&PortWWN),
45319e86db79SHyon Kim eventType, 0);
45329e86db79SHyon Kim
45339e86db79SHyon Kim GRAB_MUTEX(&_hbaapi_AE_mutex);
45349e86db79SHyon Kim for (acbp = _smhba_adapterevents_callback_list;
45359e86db79SHyon Kim acbp != NULL;
45369e86db79SHyon Kim acbp = acbp->next) {
45379e86db79SHyon Kim if (data == (void *)acbp) {
45389e86db79SHyon Kim (*acbp->callback)(acbp->userdata, PortWWN, eventType);
45399e86db79SHyon Kim break;
45409e86db79SHyon Kim }
45419e86db79SHyon Kim }
45429e86db79SHyon Kim RELEASE_MUTEX(&_hbaapi_AE_mutex);
45439e86db79SHyon Kim }
45449e86db79SHyon Kim
45459e86db79SHyon Kim HBA_STATUS
SMHBA_RegisterForAdapterEvents(void (* pCallback)(void * data,HBA_WWN PortWWN,HBA_UINT32 eventType),void * pUserData,HBA_HANDLE handle,HBA_CALLBACKHANDLE * pCallbackHandle)45469e86db79SHyon Kim SMHBA_RegisterForAdapterEvents(
45479e86db79SHyon Kim void (*pCallback) (
45489e86db79SHyon Kim void *data,
45499e86db79SHyon Kim HBA_WWN PortWWN,
45509e86db79SHyon Kim HBA_UINT32 eventType),
45519e86db79SHyon Kim void *pUserData,
45529e86db79SHyon Kim HBA_HANDLE handle,
45539e86db79SHyon Kim HBA_CALLBACKHANDLE *pCallbackHandle) {
45549e86db79SHyon Kim
45559e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
45569e86db79SHyon Kim SMHBARegisterForAdapterEventsFunc registeredfunc;
45579e86db79SHyon Kim HBA_STATUS status;
45589e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
45599e86db79SHyon Kim HBA_HANDLE vendorHandle;
45609e86db79SHyon Kim
45619e86db79SHyon Kim DEBUG(2, "SMHBA_RegisterForAdapterEvents", 0, 0, 0);
45629e86db79SHyon Kim
45639e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
45649e86db79SHyon Kim
45659e86db79SHyon Kim /* we now have the _hbaapi_LL_mutex */
45669e86db79SHyon Kim
45679e86db79SHyon Kim registeredfunc = lib_infop->ftable.smhbafunctionTable.\
45689e86db79SHyon Kim RegisterForAdapterEventsHandler;
45699e86db79SHyon Kim if (registeredfunc == NULL) {
45709e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_NOT_SUPPORTED);
45719e86db79SHyon Kim }
45729e86db79SHyon Kim
45739e86db79SHyon Kim /*
45749e86db79SHyon Kim * that allocated memory is used both as the handle for the
45759e86db79SHyon Kim * caller, and as userdata to the vendor call so that on
45769e86db79SHyon Kim * callback the specific registration may be recalled
45779e86db79SHyon Kim */
45789e86db79SHyon Kim acbp = (HBA_ADAPTERCALLBACK_ELEM *)
45799e86db79SHyon Kim calloc(1, sizeof (HBA_ADAPTERCALLBACK_ELEM));
45809e86db79SHyon Kim if (acbp == NULL) {
45819e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR);
45829e86db79SHyon Kim }
45839e86db79SHyon Kim *pCallbackHandle = (HBA_CALLBACKHANDLE) acbp;
45849e86db79SHyon Kim acbp->callback = pCallback;
45859e86db79SHyon Kim acbp->userdata = pUserData;
45869e86db79SHyon Kim acbp->lib_info = lib_infop;
45879e86db79SHyon Kim
45889e86db79SHyon Kim status = (registeredfunc)(smhba_adapterevents_callback,
45899e86db79SHyon Kim (void *)acbp,
45909e86db79SHyon Kim vendorHandle,
45919e86db79SHyon Kim &acbp->vendorcbhandle);
45929e86db79SHyon Kim if (status != HBA_STATUS_OK) {
45939e86db79SHyon Kim free(acbp);
45949e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
45959e86db79SHyon Kim }
45969e86db79SHyon Kim
45979e86db79SHyon Kim GRAB_MUTEX(&_smhba_AE_mutex);
45989e86db79SHyon Kim acbp->next = _smhba_adapterevents_callback_list;
45999e86db79SHyon Kim _hbaapi_adapterevents_callback_list = acbp;
46009e86db79SHyon Kim
46019e86db79SHyon Kim RELEASE_MUTEX(&_smhba_AE_mutex);
46029e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_OK);
46039e86db79SHyon Kim }
46049e86db79SHyon Kim
46059e86db79SHyon Kim /* Adapter Port Events *********************************************** */
46069e86db79SHyon Kim static void
smhba_adapterportevents_callback(void * data,HBA_WWN PortWWN,HBA_UINT32 eventType,HBA_UINT32 fabricPortID)46079e86db79SHyon Kim smhba_adapterportevents_callback(void *data,
46089e86db79SHyon Kim HBA_WWN PortWWN,
46099e86db79SHyon Kim HBA_UINT32 eventType,
46109e86db79SHyon Kim HBA_UINT32 fabricPortID)
46119e86db79SHyon Kim {
46129e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
46139e86db79SHyon Kim
46149e86db79SHyon Kim DEBUG(3,
46159e86db79SHyon Kim "SMHBA_AdapterPortEvent, port:%s, eventType:%d fabricPortID:0X%06x",
46169e86db79SHyon Kim WWN2STR1(&PortWWN), eventType, fabricPortID);
46179e86db79SHyon Kim
46189e86db79SHyon Kim GRAB_MUTEX(&_smhba_APE_mutex);
46199e86db79SHyon Kim
46209e86db79SHyon Kim for (acbp = _smhba_adapterportevents_callback_list;
46219e86db79SHyon Kim acbp != NULL;
46229e86db79SHyon Kim acbp = acbp->next) {
46239e86db79SHyon Kim if (data == (void *)acbp) {
46249e86db79SHyon Kim (*acbp->callback)(acbp->userdata, PortWWN,
46259e86db79SHyon Kim eventType, fabricPortID);
46269e86db79SHyon Kim break;
46279e86db79SHyon Kim }
46289e86db79SHyon Kim }
46299e86db79SHyon Kim RELEASE_MUTEX(&_smhba_APE_mutex);
46309e86db79SHyon Kim }
46319e86db79SHyon Kim
46329e86db79SHyon Kim HBA_STATUS
SMHBA_RegisterForAdapterPortEvents(void (* pCallback)(void * pData,HBA_WWN PortWWN,HBA_UINT32 eventType,HBA_UINT32 fabricPortID),void * pUserData,HBA_HANDLE handle,HBA_WWN portWWN,HBA_UINT32 specificEventType,HBA_CALLBACKHANDLE * pCallbackHandle)46339e86db79SHyon Kim SMHBA_RegisterForAdapterPortEvents(
46349e86db79SHyon Kim void (*pCallback) (
46359e86db79SHyon Kim void *pData,
46369e86db79SHyon Kim HBA_WWN PortWWN,
46379e86db79SHyon Kim HBA_UINT32 eventType,
46389e86db79SHyon Kim HBA_UINT32 fabricPortID),
46399e86db79SHyon Kim void *pUserData,
46409e86db79SHyon Kim HBA_HANDLE handle,
46419e86db79SHyon Kim HBA_WWN portWWN,
46429e86db79SHyon Kim HBA_UINT32 specificEventType,
46439e86db79SHyon Kim HBA_CALLBACKHANDLE *pCallbackHandle) {
46449e86db79SHyon Kim
46459e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
46469e86db79SHyon Kim SMHBARegisterForAdapterPortEventsFunc registeredfunc;
46479e86db79SHyon Kim HBA_STATUS status;
46489e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
46499e86db79SHyon Kim HBA_HANDLE vendorHandle;
46509e86db79SHyon Kim
46519e86db79SHyon Kim DEBUG(2, "SMHBA_RegisterForAdapterPortEvents for port: %s",
46529e86db79SHyon Kim WWN2STR1(&portWWN), 0, 0);
46539e86db79SHyon Kim
46549e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
46559e86db79SHyon Kim /* we now have the _hbaapi_LL_mutex */
46569e86db79SHyon Kim
46579e86db79SHyon Kim registeredfunc =
46589e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.\
46599e86db79SHyon Kim RegisterForAdapterPortEventsHandler;
46609e86db79SHyon Kim if (registeredfunc == NULL) {
46619e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_NOT_SUPPORTED);
46629e86db79SHyon Kim }
46639e86db79SHyon Kim
46649e86db79SHyon Kim /*
46659e86db79SHyon Kim * that allocated memory is used both as the handle for the
46669e86db79SHyon Kim * caller, and as userdata to the vendor call so that on
46679e86db79SHyon Kim * callback the specific registration may be recalled
46689e86db79SHyon Kim */
46699e86db79SHyon Kim acbp = (HBA_ADAPTERCALLBACK_ELEM *)
46709e86db79SHyon Kim calloc(1, sizeof (HBA_ADAPTERCALLBACK_ELEM));
46719e86db79SHyon Kim if (acbp == NULL) {
46729e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR);
46739e86db79SHyon Kim }
46749e86db79SHyon Kim *pCallbackHandle = (HBA_CALLBACKHANDLE) acbp;
46759e86db79SHyon Kim acbp->callback = pCallback;
46769e86db79SHyon Kim acbp->userdata = pUserData;
46779e86db79SHyon Kim acbp->lib_info = lib_infop;
46789e86db79SHyon Kim
46799e86db79SHyon Kim status = (registeredfunc)(smhba_adapterportevents_callback,
46809e86db79SHyon Kim (void *)acbp,
46819e86db79SHyon Kim vendorHandle,
46829e86db79SHyon Kim portWWN,
46839e86db79SHyon Kim specificEventType,
46849e86db79SHyon Kim &acbp->vendorcbhandle);
46859e86db79SHyon Kim if (status != HBA_STATUS_OK) {
46869e86db79SHyon Kim free(acbp);
46879e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
46889e86db79SHyon Kim }
46899e86db79SHyon Kim
46909e86db79SHyon Kim GRAB_MUTEX(&_smhba_APE_mutex);
46919e86db79SHyon Kim acbp->next = _smhba_adapterportevents_callback_list;
46929e86db79SHyon Kim _smhba_adapterportevents_callback_list = acbp;
46939e86db79SHyon Kim
46949e86db79SHyon Kim RELEASE_MUTEX(&_smhba_APE_mutex);
46959e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_OK);
46969e86db79SHyon Kim }
46979e86db79SHyon Kim
46989e86db79SHyon Kim /* SMHBA Adapter Port Stat Events ******************************** */
46999e86db79SHyon Kim static void
smhba_adapterportstatevents_callback(void * data,HBA_WWN portWWN,HBA_UINT32 protocolType,HBA_UINT32 eventType)47009e86db79SHyon Kim smhba_adapterportstatevents_callback(void *data,
47019e86db79SHyon Kim HBA_WWN portWWN,
47029e86db79SHyon Kim HBA_UINT32 protocolType,
47039e86db79SHyon Kim HBA_UINT32 eventType)
47049e86db79SHyon Kim {
47059e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
47069e86db79SHyon Kim
47079e86db79SHyon Kim DEBUG(3,
47089e86db79SHyon Kim "SMBA_AdapterPortStateEvent, port:%s, eventType:%d",
47099e86db79SHyon Kim WWN2STR1(&portWWN), eventType, 0);
47109e86db79SHyon Kim
47119e86db79SHyon Kim GRAB_MUTEX(&_smhba_APSE_mutex);
47129e86db79SHyon Kim for (acbp = _smhba_adapterportstatevents_callback_list;
47139e86db79SHyon Kim acbp != NULL;
47149e86db79SHyon Kim acbp = acbp->next) {
47159e86db79SHyon Kim if (data == (void *)acbp) {
47169e86db79SHyon Kim (*acbp->callback)(acbp->userdata, portWWN,
47179e86db79SHyon Kim protocolType, eventType);
47189e86db79SHyon Kim return;
47199e86db79SHyon Kim }
47209e86db79SHyon Kim }
47219e86db79SHyon Kim RELEASE_MUTEX(&_smhba_APSE_mutex);
47229e86db79SHyon Kim }
47239e86db79SHyon Kim
47249e86db79SHyon Kim HBA_STATUS
SMHBA_RegisterForAdapterPortStatEvents(void (* pCallback)(void * pData,HBA_WWN portWWN,HBA_UINT32 protocolType,HBA_UINT32 eventType),void * pUserData,HBA_HANDLE handle,HBA_WWN portWWN,HBA_UINT32 protocolType,SMHBA_PROTOCOLSTATISTICS stats,HBA_UINT32 statType,HBA_CALLBACKHANDLE * pCallbackHandle)47259e86db79SHyon Kim SMHBA_RegisterForAdapterPortStatEvents(
47269e86db79SHyon Kim void (*pCallback) (
47279e86db79SHyon Kim void *pData,
47289e86db79SHyon Kim HBA_WWN portWWN,
47299e86db79SHyon Kim HBA_UINT32 protocolType,
47309e86db79SHyon Kim HBA_UINT32 eventType),
47319e86db79SHyon Kim void *pUserData,
47329e86db79SHyon Kim HBA_HANDLE handle,
47339e86db79SHyon Kim HBA_WWN portWWN,
47349e86db79SHyon Kim HBA_UINT32 protocolType,
47359e86db79SHyon Kim SMHBA_PROTOCOLSTATISTICS stats,
47369e86db79SHyon Kim HBA_UINT32 statType,
47379e86db79SHyon Kim HBA_CALLBACKHANDLE *pCallbackHandle) {
47389e86db79SHyon Kim
47399e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
47409e86db79SHyon Kim SMHBARegisterForAdapterPortStatEventsFunc
47419e86db79SHyon Kim registeredfunc;
47429e86db79SHyon Kim HBA_STATUS status;
47439e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
47449e86db79SHyon Kim HBA_HANDLE vendorHandle;
47459e86db79SHyon Kim
47469e86db79SHyon Kim DEBUG(2, "SMHBA_RegisterForAdapterPortStatEvents for port: %s",
47479e86db79SHyon Kim WWN2STR1(&portWWN), 0, 0);
47489e86db79SHyon Kim
47499e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
47509e86db79SHyon Kim /* we now have the _hbaapi_LL_mutex */
47519e86db79SHyon Kim
47529e86db79SHyon Kim registeredfunc =
47539e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.\
47549e86db79SHyon Kim RegisterForAdapterPortStatEventsHandler;
47559e86db79SHyon Kim if (registeredfunc == NULL) {
47569e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_NOT_SUPPORTED);
47579e86db79SHyon Kim }
47589e86db79SHyon Kim
47599e86db79SHyon Kim /*
47609e86db79SHyon Kim * that allocated memory is used both as the handle for the
47619e86db79SHyon Kim * caller, and as userdata to the vendor call so that on
47629e86db79SHyon Kim * callback the specific registration may be recalled
47639e86db79SHyon Kim */
47649e86db79SHyon Kim acbp = (HBA_ADAPTERCALLBACK_ELEM *)
47659e86db79SHyon Kim calloc(1, sizeof (HBA_ADAPTERCALLBACK_ELEM));
47669e86db79SHyon Kim if (acbp == NULL) {
47679e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR);
47689e86db79SHyon Kim }
47699e86db79SHyon Kim *pCallbackHandle = (HBA_CALLBACKHANDLE) acbp;
47709e86db79SHyon Kim acbp->callback = pCallback;
47719e86db79SHyon Kim acbp->userdata = pUserData;
47729e86db79SHyon Kim acbp->lib_info = lib_infop;
47739e86db79SHyon Kim
47749e86db79SHyon Kim status = (registeredfunc)(smhba_adapterportstatevents_callback,
47759e86db79SHyon Kim (void *)acbp,
47769e86db79SHyon Kim vendorHandle,
47779e86db79SHyon Kim portWWN,
47789e86db79SHyon Kim protocolType,
47799e86db79SHyon Kim stats,
47809e86db79SHyon Kim statType,
47819e86db79SHyon Kim &acbp->vendorcbhandle);
47829e86db79SHyon Kim if (status != HBA_STATUS_OK) {
47839e86db79SHyon Kim free(acbp);
47849e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
47859e86db79SHyon Kim }
47869e86db79SHyon Kim
47879e86db79SHyon Kim GRAB_MUTEX(&_smhba_APSE_mutex);
47889e86db79SHyon Kim acbp->next = _smhba_adapterportstatevents_callback_list;
47899e86db79SHyon Kim _smhba_adapterportstatevents_callback_list = acbp;
47909e86db79SHyon Kim
47919e86db79SHyon Kim RELEASE_MUTEX(&_smhba_APSE_mutex);
47929e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_OK);
47939e86db79SHyon Kim }
47949e86db79SHyon Kim
47959e86db79SHyon Kim /* SMHBA Adapter Port Phy Stat Events ************************************ */
47969e86db79SHyon Kim static void
smhba_adapterphystatevents_callback(void * data,HBA_WWN portWWN,HBA_UINT32 phyIndex,HBA_UINT32 eventType)47979e86db79SHyon Kim smhba_adapterphystatevents_callback(void *data,
47989e86db79SHyon Kim HBA_WWN portWWN,
47999e86db79SHyon Kim HBA_UINT32 phyIndex,
48009e86db79SHyon Kim HBA_UINT32 eventType)
48019e86db79SHyon Kim {
48029e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
48039e86db79SHyon Kim
48049e86db79SHyon Kim DEBUG(3,
48059e86db79SHyon Kim "SMBA_AdapterPortStateEvent, port:%s, eventType:%d",
48069e86db79SHyon Kim WWN2STR1(&portWWN), eventType, 0);
48079e86db79SHyon Kim
48089e86db79SHyon Kim GRAB_MUTEX(&_smhba_APHYSE_mutex);
48099e86db79SHyon Kim for (acbp = _smhba_adapterphystatevents_callback_list;
48109e86db79SHyon Kim acbp != NULL;
48119e86db79SHyon Kim acbp = acbp->next) {
48129e86db79SHyon Kim if (data == (void *)acbp) {
48139e86db79SHyon Kim (*acbp->callback)(acbp->userdata, portWWN, phyIndex, eventType);
48149e86db79SHyon Kim return;
48159e86db79SHyon Kim }
48169e86db79SHyon Kim }
48179e86db79SHyon Kim RELEASE_MUTEX(&_smhba_APHYSE_mutex);
48189e86db79SHyon Kim }
48199e86db79SHyon Kim
48209e86db79SHyon Kim HBA_STATUS
SMHBA_RegisterForAdapterPhyStatEvents(void (* pCallback)(void * pData,HBA_WWN portWWN,HBA_UINT32 phyIndex,HBA_UINT32 eventType),void * pUserData,HBA_HANDLE handle,HBA_WWN portWWN,HBA_UINT32 phyIndex,SMHBA_PHYSTATISTICS stats,HBA_UINT32 statType,HBA_CALLBACKHANDLE * pCallbackHandle)48219e86db79SHyon Kim SMHBA_RegisterForAdapterPhyStatEvents(
48229e86db79SHyon Kim void (*pCallback) (
48239e86db79SHyon Kim void *pData,
48249e86db79SHyon Kim HBA_WWN portWWN,
48259e86db79SHyon Kim HBA_UINT32 phyIndex,
48269e86db79SHyon Kim HBA_UINT32 eventType),
48279e86db79SHyon Kim void *pUserData,
48289e86db79SHyon Kim HBA_HANDLE handle,
48299e86db79SHyon Kim HBA_WWN portWWN,
48309e86db79SHyon Kim HBA_UINT32 phyIndex,
48319e86db79SHyon Kim SMHBA_PHYSTATISTICS stats,
48329e86db79SHyon Kim HBA_UINT32 statType,
48339e86db79SHyon Kim HBA_CALLBACKHANDLE *pCallbackHandle) {
48349e86db79SHyon Kim
48359e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
48369e86db79SHyon Kim SMHBARegisterForAdapterPhyStatEventsFunc
48379e86db79SHyon Kim registeredfunc;
48389e86db79SHyon Kim HBA_STATUS status;
48399e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
48409e86db79SHyon Kim HBA_HANDLE vendorHandle;
48419e86db79SHyon Kim
48429e86db79SHyon Kim DEBUG(2, "SMHBA_RegisterForAdapterPhyStatEvents for port: %s",
48439e86db79SHyon Kim WWN2STR1(&portWWN), 0, 0);
48449e86db79SHyon Kim
48459e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
48469e86db79SHyon Kim /* we now have the _hbaapi_LL_mutex */
48479e86db79SHyon Kim
48489e86db79SHyon Kim registeredfunc =
48499e86db79SHyon Kim lib_infop->ftable.smhbafunctionTable.\
48509e86db79SHyon Kim RegisterForAdapterPhyStatEventsHandler;
48519e86db79SHyon Kim if (registeredfunc == NULL) {
48529e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_NOT_SUPPORTED);
48539e86db79SHyon Kim }
48549e86db79SHyon Kim
48559e86db79SHyon Kim /*
48569e86db79SHyon Kim * that allocated memory is used both as the handle for the
48579e86db79SHyon Kim * caller, and as userdata to the vendor call so that on
48589e86db79SHyon Kim * callback the specific registration may be recalled
48599e86db79SHyon Kim */
48609e86db79SHyon Kim acbp = (HBA_ADAPTERCALLBACK_ELEM *)
48619e86db79SHyon Kim calloc(1, sizeof (HBA_ADAPTERCALLBACK_ELEM));
48629e86db79SHyon Kim if (acbp == NULL) {
48639e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR);
48649e86db79SHyon Kim }
48659e86db79SHyon Kim *pCallbackHandle = (HBA_CALLBACKHANDLE) acbp;
48669e86db79SHyon Kim acbp->callback = pCallback;
48679e86db79SHyon Kim acbp->userdata = pUserData;
48689e86db79SHyon Kim acbp->lib_info = lib_infop;
48699e86db79SHyon Kim
48709e86db79SHyon Kim status = (registeredfunc)(smhba_adapterphystatevents_callback,
48719e86db79SHyon Kim (void *)acbp,
48729e86db79SHyon Kim vendorHandle,
48739e86db79SHyon Kim portWWN,
48749e86db79SHyon Kim phyIndex,
48759e86db79SHyon Kim stats,
48769e86db79SHyon Kim statType,
48779e86db79SHyon Kim &acbp->vendorcbhandle);
48789e86db79SHyon Kim if (status != HBA_STATUS_OK) {
48799e86db79SHyon Kim free(acbp);
48809e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
48819e86db79SHyon Kim }
48829e86db79SHyon Kim
48839e86db79SHyon Kim GRAB_MUTEX(&_smhba_APHYSE_mutex);
48849e86db79SHyon Kim acbp->next = _smhba_adapterphystatevents_callback_list;
48859e86db79SHyon Kim _smhba_adapterphystatevents_callback_list = acbp;
48869e86db79SHyon Kim
48879e86db79SHyon Kim RELEASE_MUTEX(&_smhba_APHYSE_mutex);
48889e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_OK);
48899e86db79SHyon Kim }
48909e86db79SHyon Kim
48919e86db79SHyon Kim /* SMHBA Target Events ********************************************* */
48929e86db79SHyon Kim static void
smhba_targetevents_callback(void * data,HBA_WWN hbaPortWWN,HBA_WWN discoveredPortWWN,HBA_WWN domainPortWWN,HBA_UINT32 eventType)48939e86db79SHyon Kim smhba_targetevents_callback(void *data,
48949e86db79SHyon Kim HBA_WWN hbaPortWWN,
48959e86db79SHyon Kim HBA_WWN discoveredPortWWN,
48969e86db79SHyon Kim HBA_WWN domainPortWWN,
48979e86db79SHyon Kim HBA_UINT32 eventType)
48989e86db79SHyon Kim {
48999e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
49009e86db79SHyon Kim
49019e86db79SHyon Kim DEBUG(3, "TargetEvent, hbaPort:%s, discoveredPort:%s eventType:%d",
49029e86db79SHyon Kim WWN2STR1(&hbaPortWWN), WWN2STR2(&discoveredPortWWN), eventType);
49039e86db79SHyon Kim
49049e86db79SHyon Kim GRAB_MUTEX(&_smhba_TE_mutex);
49059e86db79SHyon Kim for (acbp = _smhba_targetevents_callback_list;
49069e86db79SHyon Kim acbp != NULL;
49079e86db79SHyon Kim acbp = acbp->next) {
49089e86db79SHyon Kim if (data == (void *)acbp) {
49099e86db79SHyon Kim (*acbp->callback)(acbp->userdata, hbaPortWWN,
49109e86db79SHyon Kim discoveredPortWWN, domainPortWWN, eventType);
49119e86db79SHyon Kim break;
49129e86db79SHyon Kim }
49139e86db79SHyon Kim }
49149e86db79SHyon Kim RELEASE_MUTEX(&_smhba_TE_mutex);
49159e86db79SHyon Kim }
49169e86db79SHyon Kim
49179e86db79SHyon Kim HBA_STATUS
SMHBA_RegisterForTargetEvents(void (* pCallback)(void * pData,HBA_WWN hbaPortWWN,HBA_WWN discoveredPortWWN,HBA_WWN domainPortWWN,HBA_UINT32 eventType),void * pUserData,HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_WWN discoveredPortWWN,HBA_WWN domainPortWWN,HBA_CALLBACKHANDLE * pCallbackHandle,HBA_UINT32 allTargets)49189e86db79SHyon Kim SMHBA_RegisterForTargetEvents(
49199e86db79SHyon Kim void (*pCallback) (
49209e86db79SHyon Kim void *pData,
49219e86db79SHyon Kim HBA_WWN hbaPortWWN,
49229e86db79SHyon Kim HBA_WWN discoveredPortWWN,
49239e86db79SHyon Kim HBA_WWN domainPortWWN,
49249e86db79SHyon Kim HBA_UINT32 eventType),
49259e86db79SHyon Kim void *pUserData,
49269e86db79SHyon Kim HBA_HANDLE handle,
49279e86db79SHyon Kim HBA_WWN hbaPortWWN,
49289e86db79SHyon Kim HBA_WWN discoveredPortWWN,
49299e86db79SHyon Kim HBA_WWN domainPortWWN,
49309e86db79SHyon Kim HBA_CALLBACKHANDLE *pCallbackHandle,
49319e86db79SHyon Kim HBA_UINT32 allTargets) {
49329e86db79SHyon Kim
49339e86db79SHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
49349e86db79SHyon Kim SMHBARegisterForTargetEventsFunc
49359e86db79SHyon Kim registeredfunc;
49369e86db79SHyon Kim HBA_STATUS status;
49379e86db79SHyon Kim HBA_LIBRARY_INFO *lib_infop;
49389e86db79SHyon Kim HBA_HANDLE vendorHandle;
49399e86db79SHyon Kim
49409e86db79SHyon Kim DEBUG(2, "SMHBA_RegisterForTargetEvents, hbaPort:"
49419e86db79SHyon Kim "%s, discoveredPort: %s",
49429e86db79SHyon Kim WWN2STR1(&hbaPortWWN), WWN2STR2(&discoveredPortWWN), 0);
49439e86db79SHyon Kim
49449e86db79SHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
49459e86db79SHyon Kim /* we now have the _hbaapi_LL_mutex */
49469e86db79SHyon Kim
49479e86db79SHyon Kim registeredfunc = lib_infop->ftable.smhbafunctionTable.\
49489e86db79SHyon Kim RegisterForTargetEventsHandler;
49499e86db79SHyon Kim
49509e86db79SHyon Kim if (registeredfunc == NULL) {
49519e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_NOT_SUPPORTED);
49529e86db79SHyon Kim }
49539e86db79SHyon Kim
49549e86db79SHyon Kim /*
49559e86db79SHyon Kim * that allocated memory is used both as the handle for the
49569e86db79SHyon Kim * caller, and as userdata to the vendor call so that on
49579e86db79SHyon Kim * callback the specific registration may be recalled
49589e86db79SHyon Kim */
49599e86db79SHyon Kim acbp = (HBA_ADAPTERCALLBACK_ELEM *)
49609e86db79SHyon Kim calloc(1, sizeof (HBA_ADAPTERCALLBACK_ELEM));
49619e86db79SHyon Kim if (acbp == NULL) {
49629e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR);
49639e86db79SHyon Kim }
49649e86db79SHyon Kim *pCallbackHandle = (HBA_CALLBACKHANDLE) acbp;
49659e86db79SHyon Kim acbp->callback = pCallback;
49669e86db79SHyon Kim acbp->userdata = pUserData;
49679e86db79SHyon Kim acbp->lib_info = lib_infop;
49689e86db79SHyon Kim
49699e86db79SHyon Kim status = (registeredfunc)(smhba_targetevents_callback,
49709e86db79SHyon Kim (void *)acbp,
49719e86db79SHyon Kim vendorHandle,
49729e86db79SHyon Kim hbaPortWWN,
49739e86db79SHyon Kim discoveredPortWWN,
49749e86db79SHyon Kim domainPortWWN,
49759e86db79SHyon Kim &acbp->vendorcbhandle,
49769e86db79SHyon Kim allTargets);
49779e86db79SHyon Kim if (status != HBA_STATUS_OK) {
49789e86db79SHyon Kim free(acbp);
49799e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
49809e86db79SHyon Kim }
49819e86db79SHyon Kim
49829e86db79SHyon Kim GRAB_MUTEX(&_smhba_TE_mutex);
49839e86db79SHyon Kim acbp->next = _smhba_targetevents_callback_list;
49849e86db79SHyon Kim _smhba_targetevents_callback_list = acbp;
49859e86db79SHyon Kim
49869e86db79SHyon Kim RELEASE_MUTEX(&_smhba_TE_mutex);
49879e86db79SHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_OK);
49889e86db79SHyon Kim }
4989