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 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 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 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 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 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 */ 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 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 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 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 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 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 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 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 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 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 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 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 */ 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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