xref: /titanic_50/usr/src/lib/smhba/common/SMHBAAPILIB.c (revision 0778188f242b11e5d53f771c9e8a069354b3d5d4)
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