1*fcf3ce44SJohn Forte /*************************************************************************
2*fcf3ce44SJohn Forte * Description
3*fcf3ce44SJohn Forte * HBAAPILIB.c - Implements a sample common (wrapper) HBA API library
4*fcf3ce44SJohn Forte *
5*fcf3ce44SJohn Forte * License:
6*fcf3ce44SJohn Forte * The contents of this file are subject to the SNIA Public License
7*fcf3ce44SJohn Forte * Version 1.0 (the "License"); you may not use this file except in
8*fcf3ce44SJohn Forte * compliance with the License. You may obtain a copy of the License at
9*fcf3ce44SJohn Forte *
10*fcf3ce44SJohn Forte * /http://www.snia.org/English/Resources/Code/OpenSource.html
11*fcf3ce44SJohn Forte *
12*fcf3ce44SJohn Forte * Software distributed under the License is distributed on an "AS IS"
13*fcf3ce44SJohn Forte * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
14*fcf3ce44SJohn Forte * the License for the specific language governing rights and limitations
15*fcf3ce44SJohn Forte * under the License.
16*fcf3ce44SJohn Forte *
17*fcf3ce44SJohn Forte * The Original Code is SNIA HBA API Wrapper Library
18*fcf3ce44SJohn Forte *
19*fcf3ce44SJohn Forte * The Initial Developer of the Original Code is:
20*fcf3ce44SJohn Forte * Benjamin F. Kuo, Troika Networks, Inc. (benk@troikanetworks.com)
21*fcf3ce44SJohn Forte *
22*fcf3ce44SJohn Forte * Contributor(s):
23*fcf3ce44SJohn Forte * Tuan Lam, QLogic Corp. (t_lam@qlc.com)
24*fcf3ce44SJohn Forte * Dan Willie, Emulex Corp. (Dan.Willie@emulex.com)
25*fcf3ce44SJohn Forte * Dixon Hutchinson, Legato Systems, Inc. (dhutchin@legato.com)
26*fcf3ce44SJohn Forte * David Dillard, VERITAS Software Corp. (david.dillard@veritas.com)
27*fcf3ce44SJohn Forte *
28*fcf3ce44SJohn Forte *************************************************************************
29*fcf3ce44SJohn Forte */
30*fcf3ce44SJohn Forte
31*fcf3ce44SJohn Forte #ifdef WIN32
32*fcf3ce44SJohn Forte #include <windows.h>
33*fcf3ce44SJohn Forte #include <string.h>
34*fcf3ce44SJohn Forte /*
35*fcf3ce44SJohn Forte * Next define forces entry points in the dll to be exported
36*fcf3ce44SJohn Forte * See hbaapi.h to see what it does.
37*fcf3ce44SJohn Forte */
38*fcf3ce44SJohn Forte #define HBAAPI_EXPORTS
39*fcf3ce44SJohn Forte #else
40*fcf3ce44SJohn Forte #include <dlfcn.h>
41*fcf3ce44SJohn Forte #include <strings.h>
42*fcf3ce44SJohn Forte #endif
43*fcf3ce44SJohn Forte #include <stdio.h>
44*fcf3ce44SJohn Forte #include <time.h>
45*fcf3ce44SJohn Forte #include "hbaapi.h"
46*fcf3ce44SJohn Forte #include "vendorhbaapi.h"
47*fcf3ce44SJohn Forte #include <stdlib.h>
48*fcf3ce44SJohn Forte #ifdef USESYSLOG
49*fcf3ce44SJohn Forte #include <syslog.h>
50*fcf3ce44SJohn Forte #endif
51*fcf3ce44SJohn Forte
52*fcf3ce44SJohn Forte /*
53*fcf3ce44SJohn Forte * LIBRARY_NUM is a shortcut to figure out which library we need to call.
54*fcf3ce44SJohn Forte * The top 16 bits of handle are the library index
55*fcf3ce44SJohn Forte */
56*fcf3ce44SJohn Forte #define LIBRARY_NUM(handle) ((handle)>>16)
57*fcf3ce44SJohn Forte
58*fcf3ce44SJohn Forte /*
59*fcf3ce44SJohn Forte * VENDOR_HANDLE turns a global library handle into a vendor specific handle,
60*fcf3ce44SJohn Forte * with all upper 16 bits set to 0
61*fcf3ce44SJohn Forte */
62*fcf3ce44SJohn Forte #define VENDOR_HANDLE(handle) ((handle)&0xFFFF)
63*fcf3ce44SJohn Forte
64*fcf3ce44SJohn Forte #define HBA_HANDLE_FROM_LOCAL(library, vendor) \
65*fcf3ce44SJohn Forte (((library)<<16) | ((vendor)&0x0000FFFF))
66*fcf3ce44SJohn Forte
67*fcf3ce44SJohn Forte int _hbaapi_debuglevel = 0;
68*fcf3ce44SJohn Forte #define DEBUG(L, STR, A1, A2, A3)
69*fcf3ce44SJohn Forte
70*fcf3ce44SJohn Forte #if defined(USESYSLOG) && defined(USELOGFILE)
71*fcf3ce44SJohn Forte FILE *_hbaapi_debug_fd = NULL;
72*fcf3ce44SJohn Forte int _hbaapi_sysloginit = 0;
73*fcf3ce44SJohn Forte #undef DEBUG
74*fcf3ce44SJohn Forte #ifdef WIN32
75*fcf3ce44SJohn Forte #define DEBUG(L, STR, A1, A2, A3)\
76*fcf3ce44SJohn Forte if ((L) <= _hbaapi_debuglevel) {\
77*fcf3ce44SJohn Forte if(_hbaapi_sysloginit == 0) {\
78*fcf3ce44SJohn Forte openlog("HBAAPI", LOG_PID|LOG_ODELAY ,LOG_USER);\
79*fcf3ce44SJohn Forte _hbaapi_sysloginit = 1;\
80*fcf3ce44SJohn Forte }\
81*fcf3ce44SJohn Forte syslog (LOG_INFO, (STR), (A1), (A2), (A3));\
82*fcf3ce44SJohn Forte if(_hbaapi_debug_fd == NULL) {\
83*fcf3ce44SJohn Forte char _logFile[MAX_PATH]; \
84*fcf3ce44SJohn Forte GetTempPath(MAX_PATH, _logFile); \
85*fcf3ce44SJohn Forte strcat(_logFile, "HBAAPI.log"); \
86*fcf3ce44SJohn Forte _hbaapi_debug_fd = fopen(_logFile, "a");\
87*fcf3ce44SJohn Forte }\
88*fcf3ce44SJohn Forte if(_hbaapi_debug_fd != NULL) {\
89*fcf3ce44SJohn Forte fprintf(_hbaapi_debug_fd, (STR ## "\n"), (A1), (A2), (A3));\
90*fcf3ce44SJohn Forte }\
91*fcf3ce44SJohn Forte }
92*fcf3ce44SJohn Forte #else /* WIN32*/
93*fcf3ce44SJohn Forte #define DEBUG(L, STR, A1, A2, A3)\
94*fcf3ce44SJohn Forte if ((L) <= _hbaapi_debuglevel) {\
95*fcf3ce44SJohn Forte if(_hbaapi_sysloginit == 0) {\
96*fcf3ce44SJohn Forte openlog("HBAAPI", LOG_PID|LOG_ODELAY ,LOG_USER);\
97*fcf3ce44SJohn Forte _hbaapi_sysloginit = 1;\
98*fcf3ce44SJohn Forte }\
99*fcf3ce44SJohn Forte syslog (LOG_INFO, (STR), (A1), (A2), (A3));\
100*fcf3ce44SJohn Forte if(_hbaapi_debug_fd == NULL) {\
101*fcf3ce44SJohn Forte _hbaapi_debug_fd = fopen("/tmp/HBAAPI.log", "a");\
102*fcf3ce44SJohn Forte }\
103*fcf3ce44SJohn Forte if(_hbaapi_debug_fd != NULL) {\
104*fcf3ce44SJohn Forte fprintf(_hbaapi_debug_fd, (STR ## "\n"), (A1), (A2), (A3));\
105*fcf3ce44SJohn Forte }\
106*fcf3ce44SJohn Forte }
107*fcf3ce44SJohn Forte #endif /* WIN32*/
108*fcf3ce44SJohn Forte
109*fcf3ce44SJohn Forte #else /* Not both USESYSLOG and USELOGFILE */
110*fcf3ce44SJohn Forte #if defined(USESYSLOG)
111*fcf3ce44SJohn Forte int _hbaapi_sysloginit = 0;
112*fcf3ce44SJohn Forte #undef DEBUG
113*fcf3ce44SJohn Forte #define DEBUG(L, STR, A1, A2, A3) \
114*fcf3ce44SJohn Forte if ((L) <= _hbaapi_debuglevel) {\
115*fcf3ce44SJohn Forte if(_hbaapi_sysloginit == 0) {\
116*fcf3ce44SJohn Forte openlog("HBAAPI", LOG_PID|LOG_ODELAY ,LOG_USER);\
117*fcf3ce44SJohn Forte _hbaapi_sysloginit = 1;\
118*fcf3ce44SJohn Forte }\
119*fcf3ce44SJohn Forte syslog (LOG_INFO, (STR), (A1), (A2), (A3));\
120*fcf3ce44SJohn Forte }
121*fcf3ce44SJohn Forte #endif /* USESYSLOG */
122*fcf3ce44SJohn Forte #if defined(USELOGFILE)
123*fcf3ce44SJohn Forte FILE *_hbaapi_debug_fd = NULL;
124*fcf3ce44SJohn Forte #undef DEBUG
125*fcf3ce44SJohn Forte #ifdef WIN32
126*fcf3ce44SJohn Forte #define DEBUG(L, STR, A1, A2, A3) \
127*fcf3ce44SJohn Forte if((L) <= _hbaapi_debuglevel) {\
128*fcf3ce44SJohn Forte if(_hbaapi_debug_fd == NULL) {\
129*fcf3ce44SJohn Forte char _logFile[MAX_PATH]; \
130*fcf3ce44SJohn Forte GetTempPath(MAX_PATH, _logFile); \
131*fcf3ce44SJohn Forte strcat(_logFile, "HBAAPI.log"); \
132*fcf3ce44SJohn Forte _hbaapi_debug_fd = fopen(_logFile, "a");\
133*fcf3ce44SJohn Forte }\
134*fcf3ce44SJohn Forte }
135*fcf3ce44SJohn Forte #else /* WIN32 */
136*fcf3ce44SJohn Forte #define DEBUG(L, STR, A1, A2, A3) \
137*fcf3ce44SJohn Forte if((L) <= _hbaapi_debuglevel) {\
138*fcf3ce44SJohn Forte if(_hbaapi_debug_fd == NULL) {\
139*fcf3ce44SJohn Forte _hbaapi_debug_fd = fopen("/tmp/HBAAPI.log", "a");\
140*fcf3ce44SJohn Forte }\
141*fcf3ce44SJohn Forte if(_hbaapi_debug_fd != NULL) { \
142*fcf3ce44SJohn Forte fprintf(_hbaapi_debug_fd, (STR) ## "\n", (A1), (A2), (A3));\
143*fcf3ce44SJohn Forte }\
144*fcf3ce44SJohn Forte }
145*fcf3ce44SJohn Forte #endif /* WIN32 */
146*fcf3ce44SJohn Forte #endif /* USELOGFILE */
147*fcf3ce44SJohn Forte #endif /* Not both USELOGFILE and USESYSLOG */
148*fcf3ce44SJohn Forte
149*fcf3ce44SJohn Forte #ifdef POSIX_THREADS
150*fcf3ce44SJohn Forte #include <pthread.h>
151*fcf3ce44SJohn Forte /*
152*fcf3ce44SJohn Forte * When multiple mutex's are grabed, they must be always be grabbed in
153*fcf3ce44SJohn Forte * the same order, or deadlock can result. There are three levels
154*fcf3ce44SJohn Forte * of mutex's involved in this API. If LL_mutex is grabbed, always grap
155*fcf3ce44SJohn Forte * it first. If AL_mutex is grabbed, it may not be grabbed before
156*fcf3ce44SJohn Forte * LL_mutex. If grabbed in a multi grab sequence, the mutex's protecting
157*fcf3ce44SJohn Forte * the callback lists must always be grabbed last and release before calling
158*fcf3ce44SJohn Forte * a vendor specific library function that might invoke a callback function
159*fcf3ce44SJohn Forte * on the same thread.
160*fcf3ce44SJohn Forte */
161*fcf3ce44SJohn Forte #define GRAB_MUTEX(M) grab_mutex(M)
162*fcf3ce44SJohn Forte #define RELEASE_MUTEX(M) release_mutex(M)
163*fcf3ce44SJohn Forte #define RELEASE_MUTEX_RETURN(M,RET) release_mutex(M); return(RET)
164*fcf3ce44SJohn Forte #elif defined (WIN32)
165*fcf3ce44SJohn Forte #define GRAB_MUTEX(m) EnterCriticalSection(m)
166*fcf3ce44SJohn Forte #define RELEASE_MUTEX(m) LeaveCriticalSection(m)
167*fcf3ce44SJohn Forte #define RELEASE_MUTEX_RETURN(m, RET) LeaveCriticalSection(m); return(RET)
168*fcf3ce44SJohn Forte #else
169*fcf3ce44SJohn Forte #define GRAB_MUTEX(M)
170*fcf3ce44SJohn Forte #define RELEASE_MUTEX(M)
171*fcf3ce44SJohn Forte #define RELEASE_MUTEX_RETURN(M,RET) return(RET)
172*fcf3ce44SJohn Forte #endif
173*fcf3ce44SJohn Forte
174*fcf3ce44SJohn Forte /*
175*fcf3ce44SJohn Forte * Vendor library information
176*fcf3ce44SJohn Forte */
177*fcf3ce44SJohn Forte typedef enum {
178*fcf3ce44SJohn Forte HBA_LIBRARY_UNKNOWN,
179*fcf3ce44SJohn Forte HBA_LIBRARY_LOADED,
180*fcf3ce44SJohn Forte HBA_LIBRARY_NOT_LOADED
181*fcf3ce44SJohn Forte } HBA_LIBRARY_STATUS;
182*fcf3ce44SJohn Forte
183*fcf3ce44SJohn Forte typedef struct hba_library_info {
184*fcf3ce44SJohn Forte struct hba_library_info
185*fcf3ce44SJohn Forte *next;
186*fcf3ce44SJohn Forte #ifdef WIN32
187*fcf3ce44SJohn Forte HINSTANCE hLibrary; /* Handle to a loaded DLL */
188*fcf3ce44SJohn Forte #else
189*fcf3ce44SJohn Forte char *LibraryName;
190*fcf3ce44SJohn Forte void* hLibrary; /* Handle to a loaded DLL */
191*fcf3ce44SJohn Forte #endif
192*fcf3ce44SJohn Forte char *LibraryPath;
193*fcf3ce44SJohn Forte HBA_ENTRYPOINTSV2 functionTable; /* Function pointers */
194*fcf3ce44SJohn Forte HBA_LIBRARY_STATUS status; /* info on this library */
195*fcf3ce44SJohn Forte HBA_UINT32 index;
196*fcf3ce44SJohn Forte } HBA_LIBRARY_INFO, *PHBA_LIBRARY_INFO;
197*fcf3ce44SJohn Forte
198*fcf3ce44SJohn Forte #define ARE_WE_INITED() \
199*fcf3ce44SJohn Forte if (_hbaapi_librarylist == NULL) { \
200*fcf3ce44SJohn Forte return(HBA_STATUS_ERROR); \
201*fcf3ce44SJohn Forte }
202*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *_hbaapi_librarylist = NULL;
203*fcf3ce44SJohn Forte HBA_UINT32 _hbaapi_total_library_count = 0;
204*fcf3ce44SJohn Forte #ifdef POSIX_THREADS
205*fcf3ce44SJohn Forte pthread_mutex_t _hbaapi_LL_mutex = PTHREAD_MUTEX_INITIALIZER;
206*fcf3ce44SJohn Forte #elif defined(WIN32)
207*fcf3ce44SJohn Forte CRITICAL_SECTION _hbaapi_LL_mutex;
208*fcf3ce44SJohn Forte #endif
209*fcf3ce44SJohn Forte
210*fcf3ce44SJohn Forte /*
211*fcf3ce44SJohn Forte * Individual adapter (hba) information
212*fcf3ce44SJohn Forte */
213*fcf3ce44SJohn Forte typedef struct hba_adapter_info {
214*fcf3ce44SJohn Forte struct hba_adapter_info
215*fcf3ce44SJohn Forte *next;
216*fcf3ce44SJohn Forte HBA_STATUS GNstatus; /* status from GetAdapterNameFunc */
217*fcf3ce44SJohn Forte char *name;
218*fcf3ce44SJohn Forte HBA_WWN nodeWWN;
219*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *library;
220*fcf3ce44SJohn Forte HBA_UINT32 index;
221*fcf3ce44SJohn Forte } HBA_ADAPTER_INFO;
222*fcf3ce44SJohn Forte
223*fcf3ce44SJohn Forte HBA_ADAPTER_INFO *_hbaapi_adapterlist = NULL;
224*fcf3ce44SJohn Forte HBA_UINT32 _hbaapi_total_adapter_count = 0;
225*fcf3ce44SJohn Forte #ifdef POSIX_THREADS
226*fcf3ce44SJohn Forte pthread_mutex_t _hbaapi_AL_mutex = PTHREAD_MUTEX_INITIALIZER;
227*fcf3ce44SJohn Forte #elif defined(WIN32)
228*fcf3ce44SJohn Forte CRITICAL_SECTION _hbaapi_AL_mutex;
229*fcf3ce44SJohn Forte #endif
230*fcf3ce44SJohn Forte
231*fcf3ce44SJohn Forte /*
232*fcf3ce44SJohn Forte * Call back registration
233*fcf3ce44SJohn Forte */
234*fcf3ce44SJohn Forte typedef struct hba_vendorcallback_elem {
235*fcf3ce44SJohn Forte struct hba_vendorcallback_elem
236*fcf3ce44SJohn Forte *next;
237*fcf3ce44SJohn Forte HBA_CALLBACKHANDLE vendorcbhandle;
238*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_info;
239*fcf3ce44SJohn Forte } HBA_VENDORCALLBACK_ELEM;
240*fcf3ce44SJohn Forte
241*fcf3ce44SJohn Forte /*
242*fcf3ce44SJohn Forte * Each instance of HBA_ADAPTERCALLBACK_ELEM represents a call to one of
243*fcf3ce44SJohn Forte * "register" functions that apply to a particular adapter.
244*fcf3ce44SJohn Forte * HBA_ALLADAPTERSCALLBACK_ELEM is used just for HBA_RegisterForAdapterAddEvents
245*fcf3ce44SJohn Forte */
246*fcf3ce44SJohn Forte typedef struct hba_adaptercallback_elem {
247*fcf3ce44SJohn Forte struct hba_adaptercallback_elem
248*fcf3ce44SJohn Forte *next;
249*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_info;
250*fcf3ce44SJohn Forte void *userdata;
251*fcf3ce44SJohn Forte HBA_CALLBACKHANDLE vendorcbhandle;
252*fcf3ce44SJohn Forte void (*callback)();
253*fcf3ce44SJohn Forte } HBA_ADAPTERCALLBACK_ELEM;
254*fcf3ce44SJohn Forte
255*fcf3ce44SJohn Forte typedef struct hba_alladapterscallback_elem {
256*fcf3ce44SJohn Forte struct hba_alladapterscallback_elem
257*fcf3ce44SJohn Forte *next;
258*fcf3ce44SJohn Forte void *userdata;
259*fcf3ce44SJohn Forte HBA_VENDORCALLBACK_ELEM *vendorhandlelist;
260*fcf3ce44SJohn Forte void (*callback)();
261*fcf3ce44SJohn Forte } HBA_ALLADAPTERSCALLBACK_ELEM;
262*fcf3ce44SJohn Forte
263*fcf3ce44SJohn Forte HBA_ALLADAPTERSCALLBACK_ELEM *_hbaapi_adapteraddevents_callback_list = NULL;
264*fcf3ce44SJohn Forte HBA_ADAPTERCALLBACK_ELEM *_hbaapi_adapterevents_callback_list = NULL;
265*fcf3ce44SJohn Forte HBA_ADAPTERCALLBACK_ELEM *_hbaapi_adapterportevents_callback_list = NULL;
266*fcf3ce44SJohn Forte HBA_ADAPTERCALLBACK_ELEM *_hbaapi_adapterportstatevents_callback_list = NULL;
267*fcf3ce44SJohn Forte HBA_ADAPTERCALLBACK_ELEM *_hbaapi_targetevents_callback_list = NULL;
268*fcf3ce44SJohn Forte HBA_ADAPTERCALLBACK_ELEM *_hbaapi_linkevents_callback_list = NULL;
269*fcf3ce44SJohn Forte HBA_ADAPTERCALLBACK_ELEM *_hbaapi_adapterdeviceevents_callback_list = NULL;
270*fcf3ce44SJohn Forte #ifdef POSIX_THREADS
271*fcf3ce44SJohn Forte /* mutex's to protect each list */
272*fcf3ce44SJohn Forte pthread_mutex_t _hbaapi_AAE_mutex = PTHREAD_MUTEX_INITIALIZER;
273*fcf3ce44SJohn Forte pthread_mutex_t _hbaapi_AE_mutex = PTHREAD_MUTEX_INITIALIZER;
274*fcf3ce44SJohn Forte pthread_mutex_t _hbaapi_APE_mutex = PTHREAD_MUTEX_INITIALIZER;
275*fcf3ce44SJohn Forte pthread_mutex_t _hbaapi_APSE_mutex = PTHREAD_MUTEX_INITIALIZER;
276*fcf3ce44SJohn Forte pthread_mutex_t _hbaapi_TE_mutex = PTHREAD_MUTEX_INITIALIZER;
277*fcf3ce44SJohn Forte pthread_mutex_t _hbaapi_LE_mutex = PTHREAD_MUTEX_INITIALIZER;
278*fcf3ce44SJohn Forte #elif defined(WIN32)
279*fcf3ce44SJohn Forte CRITICAL_SECTION _hbaapi_AAE_mutex;
280*fcf3ce44SJohn Forte CRITICAL_SECTION _hbaapi_AE_mutex;
281*fcf3ce44SJohn Forte CRITICAL_SECTION _hbaapi_APE_mutex;
282*fcf3ce44SJohn Forte CRITICAL_SECTION _hbaapi_APSE_mutex;
283*fcf3ce44SJohn Forte CRITICAL_SECTION _hbaapi_TE_mutex;
284*fcf3ce44SJohn Forte CRITICAL_SECTION _hbaapi_LE_mutex;
285*fcf3ce44SJohn Forte #endif
286*fcf3ce44SJohn Forte
287*fcf3ce44SJohn Forte HBA_ADAPTERCALLBACK_ELEM **cb_lists_array[] = {
288*fcf3ce44SJohn Forte &_hbaapi_adapterevents_callback_list,
289*fcf3ce44SJohn Forte &_hbaapi_adapterportevents_callback_list,
290*fcf3ce44SJohn Forte &_hbaapi_adapterportstatevents_callback_list,
291*fcf3ce44SJohn Forte &_hbaapi_targetevents_callback_list,
292*fcf3ce44SJohn Forte &_hbaapi_linkevents_callback_list,
293*fcf3ce44SJohn Forte &_hbaapi_adapterdeviceevents_callback_list,
294*fcf3ce44SJohn Forte NULL};
295*fcf3ce44SJohn Forte
296*fcf3ce44SJohn Forte /*
297*fcf3ce44SJohn Forte * Common library internal. Mutex handling
298*fcf3ce44SJohn Forte */
299*fcf3ce44SJohn Forte #ifdef POSIX_THREADS
300*fcf3ce44SJohn Forte static void
grab_mutex(pthread_mutex_t * mp)301*fcf3ce44SJohn Forte grab_mutex(pthread_mutex_t *mp) {
302*fcf3ce44SJohn Forte int ret;
303*fcf3ce44SJohn Forte if((ret = pthread_mutex_lock(mp)) != 0) {
304*fcf3ce44SJohn Forte perror("pthread_mutex_lock - HBAAPI:");
305*fcf3ce44SJohn Forte DEBUG(0, "pthread_mutex_lock returned %d", ret, 0, 0);
306*fcf3ce44SJohn Forte }
307*fcf3ce44SJohn Forte }
308*fcf3ce44SJohn Forte
309*fcf3ce44SJohn Forte static void
release_mutex(pthread_mutex_t * mp)310*fcf3ce44SJohn Forte release_mutex(pthread_mutex_t *mp) {
311*fcf3ce44SJohn Forte int ret;
312*fcf3ce44SJohn Forte if((ret = pthread_mutex_unlock(mp)) != 0) {
313*fcf3ce44SJohn Forte perror("pthread_mutex_unlock - HBAAPI:");
314*fcf3ce44SJohn Forte DEBUG(0, "pthread_mutex_unlock returned %d", ret, 0, 0);
315*fcf3ce44SJohn Forte }
316*fcf3ce44SJohn Forte }
317*fcf3ce44SJohn Forte #endif
318*fcf3ce44SJohn Forte
319*fcf3ce44SJohn Forte /*
320*fcf3ce44SJohn Forte * Common library internal. Check library and return vendorhandle
321*fcf3ce44SJohn Forte */
322*fcf3ce44SJohn Forte static HBA_STATUS
HBA_CheckLibrary(HBA_HANDLE handle,HBA_LIBRARY_INFO ** lib_infopp,HBA_HANDLE * vendorhandle)323*fcf3ce44SJohn Forte HBA_CheckLibrary(HBA_HANDLE handle,
324*fcf3ce44SJohn Forte HBA_LIBRARY_INFO **lib_infopp,
325*fcf3ce44SJohn Forte HBA_HANDLE *vendorhandle) {
326*fcf3ce44SJohn Forte
327*fcf3ce44SJohn Forte HBA_UINT32 libraryIndex;
328*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
329*fcf3ce44SJohn Forte
330*fcf3ce44SJohn Forte if (vendorhandle == NULL) {
331*fcf3ce44SJohn Forte return(HBA_STATUS_ERROR_ARG);
332*fcf3ce44SJohn Forte }
333*fcf3ce44SJohn Forte if(_hbaapi_librarylist == NULL) {
334*fcf3ce44SJohn Forte return(HBA_STATUS_ERROR);
335*fcf3ce44SJohn Forte }
336*fcf3ce44SJohn Forte libraryIndex = LIBRARY_NUM(handle);
337*fcf3ce44SJohn Forte
338*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_LL_mutex);
339*fcf3ce44SJohn Forte for(lib_infop = _hbaapi_librarylist;
340*fcf3ce44SJohn Forte lib_infop != NULL;
341*fcf3ce44SJohn Forte lib_infop = lib_infop->next) {
342*fcf3ce44SJohn Forte if(lib_infop->index == libraryIndex) {
343*fcf3ce44SJohn Forte if(lib_infop->status != HBA_LIBRARY_LOADED) {
344*fcf3ce44SJohn Forte return HBA_STATUS_ERROR;
345*fcf3ce44SJohn Forte }
346*fcf3ce44SJohn Forte *lib_infopp = lib_infop;
347*fcf3ce44SJohn Forte *vendorhandle = VENDOR_HANDLE(handle);
348*fcf3ce44SJohn Forte /* caller will release the mutex */
349*fcf3ce44SJohn Forte return HBA_STATUS_OK;
350*fcf3ce44SJohn Forte }
351*fcf3ce44SJohn Forte }
352*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INVALID_HANDLE);
353*fcf3ce44SJohn Forte }
354*fcf3ce44SJohn Forte #define CHECKLIBRARY() \
355*fcf3ce44SJohn Forte status = HBA_CheckLibrary(handle, &lib_infop, &vendorHandle);\
356*fcf3ce44SJohn Forte if(status != HBA_STATUS_OK) { \
357*fcf3ce44SJohn Forte return(status); \
358*fcf3ce44SJohn Forte }
359*fcf3ce44SJohn Forte
360*fcf3ce44SJohn Forte /*
361*fcf3ce44SJohn Forte *freevendorhandlelist is called with _hbaapi_LL_mutex already held
362*fcf3ce44SJohn Forte */
363*fcf3ce44SJohn Forte static void
freevendorhandlelist(HBA_VENDORCALLBACK_ELEM * vhlist)364*fcf3ce44SJohn Forte freevendorhandlelist(HBA_VENDORCALLBACK_ELEM *vhlist) {
365*fcf3ce44SJohn Forte HBA_VENDORCALLBACK_ELEM *vhlp;
366*fcf3ce44SJohn Forte HBA_VENDORCALLBACK_ELEM *vnext;
367*fcf3ce44SJohn Forte HBARemoveCallbackFunc registeredfunc;
368*fcf3ce44SJohn Forte
369*fcf3ce44SJohn Forte for(vhlp = vhlist; vhlp != NULL; vhlp = vnext) {
370*fcf3ce44SJohn Forte vnext = vhlp->next;
371*fcf3ce44SJohn Forte registeredfunc =
372*fcf3ce44SJohn Forte vhlp->lib_info->functionTable.RemoveCallbackHandler;
373*fcf3ce44SJohn Forte if(registeredfunc == NULL) {
374*fcf3ce44SJohn Forte continue;
375*fcf3ce44SJohn Forte }
376*fcf3ce44SJohn Forte (registeredfunc)(vhlp->vendorcbhandle);
377*fcf3ce44SJohn Forte free(vhlp);
378*fcf3ce44SJohn Forte }
379*fcf3ce44SJohn Forte }
380*fcf3ce44SJohn Forte
381*fcf3ce44SJohn Forte static
382*fcf3ce44SJohn Forte HBA_STATUS
local_remove_callback(HBA_CALLBACKHANDLE cbhandle)383*fcf3ce44SJohn Forte local_remove_callback(HBA_CALLBACKHANDLE cbhandle) {
384*fcf3ce44SJohn Forte HBA_ADAPTERCALLBACK_ELEM ***listp;
385*fcf3ce44SJohn Forte HBA_ADAPTERCALLBACK_ELEM **lastp;
386*fcf3ce44SJohn Forte HBA_ALLADAPTERSCALLBACK_ELEM **lap;
387*fcf3ce44SJohn Forte HBA_ALLADAPTERSCALLBACK_ELEM *allcbp;
388*fcf3ce44SJohn Forte HBA_ADAPTERCALLBACK_ELEM *cbp;
389*fcf3ce44SJohn Forte HBARemoveCallbackFunc registeredfunc;
390*fcf3ce44SJohn Forte HBA_VENDORCALLBACK_ELEM *vhlp;
391*fcf3ce44SJohn Forte HBA_VENDORCALLBACK_ELEM *vnext;
392*fcf3ce44SJohn Forte int found;
393*fcf3ce44SJohn Forte HBA_STATUS status = HBA_STATUS_ERROR_INVALID_HANDLE;
394*fcf3ce44SJohn Forte
395*fcf3ce44SJohn Forte
396*fcf3ce44SJohn Forte /* search through the simple lists first */
397*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_AAE_mutex);
398*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_AE_mutex);
399*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_APE_mutex);
400*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_APSE_mutex);
401*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_TE_mutex);
402*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_LE_mutex);
403*fcf3ce44SJohn Forte for(listp = cb_lists_array, found = 0; found == 0, *listp != NULL; listp++) {
404*fcf3ce44SJohn Forte lastp = *listp;
405*fcf3ce44SJohn Forte for(cbp=**listp; cbp != NULL; cbp = cbp->next) {
406*fcf3ce44SJohn Forte if(cbhandle != (HBA_CALLBACKHANDLE)cbp) {
407*fcf3ce44SJohn Forte lastp = &(cbp->next);
408*fcf3ce44SJohn Forte continue;
409*fcf3ce44SJohn Forte }
410*fcf3ce44SJohn Forte found = 1;
411*fcf3ce44SJohn Forte registeredfunc = cbp->lib_info->functionTable.RemoveCallbackHandler;
412*fcf3ce44SJohn Forte if(registeredfunc == NULL) {
413*fcf3ce44SJohn Forte break;
414*fcf3ce44SJohn Forte }
415*fcf3ce44SJohn Forte (registeredfunc)(cbp->vendorcbhandle);
416*fcf3ce44SJohn Forte *lastp = cbp->next;
417*fcf3ce44SJohn Forte free(cbp);
418*fcf3ce44SJohn Forte break;
419*fcf3ce44SJohn Forte }
420*fcf3ce44SJohn Forte }
421*fcf3ce44SJohn Forte RELEASE_MUTEX(&_hbaapi_LE_mutex);
422*fcf3ce44SJohn Forte RELEASE_MUTEX(&_hbaapi_TE_mutex);
423*fcf3ce44SJohn Forte RELEASE_MUTEX(&_hbaapi_APSE_mutex);
424*fcf3ce44SJohn Forte RELEASE_MUTEX(&_hbaapi_APE_mutex);
425*fcf3ce44SJohn Forte RELEASE_MUTEX(&_hbaapi_AE_mutex);
426*fcf3ce44SJohn Forte RELEASE_MUTEX(&_hbaapi_AAE_mutex);
427*fcf3ce44SJohn Forte if(found != 0) {
428*fcf3ce44SJohn Forte if(registeredfunc == NULL) {
429*fcf3ce44SJohn Forte return HBA_STATUS_ERROR_NOT_SUPPORTED;
430*fcf3ce44SJohn Forte }
431*fcf3ce44SJohn Forte return HBA_STATUS_OK;
432*fcf3ce44SJohn Forte }
433*fcf3ce44SJohn Forte
434*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_AAE_mutex);
435*fcf3ce44SJohn Forte /* if it wasnt in the simple lists, look in the list for adapteraddevents */
436*fcf3ce44SJohn Forte lap = &_hbaapi_adapteraddevents_callback_list;
437*fcf3ce44SJohn Forte for(allcbp = _hbaapi_adapteraddevents_callback_list;
438*fcf3ce44SJohn Forte allcbp != NULL;
439*fcf3ce44SJohn Forte allcbp = allcbp->next) {
440*fcf3ce44SJohn Forte if(cbhandle != (HBA_CALLBACKHANDLE)allcbp) {
441*fcf3ce44SJohn Forte lap = &allcbp->next;
442*fcf3ce44SJohn Forte continue;
443*fcf3ce44SJohn Forte }
444*fcf3ce44SJohn Forte for(vhlp = allcbp->vendorhandlelist; vhlp != NULL; vhlp = vnext) {
445*fcf3ce44SJohn Forte vnext = vhlp->next;
446*fcf3ce44SJohn Forte registeredfunc =
447*fcf3ce44SJohn Forte vhlp->lib_info->functionTable.RemoveCallbackHandler;
448*fcf3ce44SJohn Forte if(registeredfunc == NULL) {
449*fcf3ce44SJohn Forte continue;
450*fcf3ce44SJohn Forte }
451*fcf3ce44SJohn Forte (registeredfunc)(vhlp->vendorcbhandle);
452*fcf3ce44SJohn Forte free(vhlp);
453*fcf3ce44SJohn Forte }
454*fcf3ce44SJohn Forte *lap = allcbp->next;
455*fcf3ce44SJohn Forte free(allcbp);
456*fcf3ce44SJohn Forte status = HBA_STATUS_OK;
457*fcf3ce44SJohn Forte break;
458*fcf3ce44SJohn Forte }
459*fcf3ce44SJohn Forte RELEASE_MUTEX(&_hbaapi_AAE_mutex);
460*fcf3ce44SJohn Forte return(status);
461*fcf3ce44SJohn Forte }
462*fcf3ce44SJohn Forte
463*fcf3ce44SJohn Forte static char wwn_str1[17];
464*fcf3ce44SJohn Forte static char wwn_str2[17];
465*fcf3ce44SJohn Forte static char wwn_str3[17];
466*fcf3ce44SJohn Forte #define WWN2STR1(wwn) WWN2str(wwn_str1, (wwn))
467*fcf3ce44SJohn Forte #define WWN2STR2(wwn) WWN2str(wwn_str2, (wwn))
468*fcf3ce44SJohn Forte #define WWN2STR3(wwn) WWN2str(wwn_str3, (wwn))
469*fcf3ce44SJohn Forte static char *
WWN2str(char * buf,HBA_WWN * wwn)470*fcf3ce44SJohn Forte WWN2str(char *buf, HBA_WWN *wwn) {
471*fcf3ce44SJohn Forte int j;
472*fcf3ce44SJohn Forte unsigned char *pc = (unsigned char *)&(wwn->wwn[0]);
473*fcf3ce44SJohn Forte buf[0] = '\0';
474*fcf3ce44SJohn Forte for (j=0; j<16; j+=2) {
475*fcf3ce44SJohn Forte sprintf(&buf[j], "%02X", (int)*pc++);
476*fcf3ce44SJohn Forte }
477*fcf3ce44SJohn Forte return(buf);
478*fcf3ce44SJohn Forte }
479*fcf3ce44SJohn Forte
480*fcf3ce44SJohn Forte
481*fcf3ce44SJohn Forte #ifdef WIN32
482*fcf3ce44SJohn Forte BOOL APIENTRY
DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)483*fcf3ce44SJohn Forte DllMain( HANDLE hModule,
484*fcf3ce44SJohn Forte DWORD ul_reason_for_call,
485*fcf3ce44SJohn Forte LPVOID lpReserved
486*fcf3ce44SJohn Forte )
487*fcf3ce44SJohn Forte {
488*fcf3ce44SJohn Forte switch (ul_reason_for_call)
489*fcf3ce44SJohn Forte {
490*fcf3ce44SJohn Forte case DLL_PROCESS_ATTACH:
491*fcf3ce44SJohn Forte break;
492*fcf3ce44SJohn Forte case DLL_PROCESS_DETACH:
493*fcf3ce44SJohn Forte break;
494*fcf3ce44SJohn Forte case DLL_THREAD_ATTACH:
495*fcf3ce44SJohn Forte case DLL_THREAD_DETACH:
496*fcf3ce44SJohn Forte break;
497*fcf3ce44SJohn Forte }
498*fcf3ce44SJohn Forte return TRUE;
499*fcf3ce44SJohn Forte }
500*fcf3ce44SJohn Forte #endif
501*fcf3ce44SJohn Forte
502*fcf3ce44SJohn Forte /*
503*fcf3ce44SJohn Forte * Read in the config file and load all the specified vendor specific
504*fcf3ce44SJohn Forte * libraries and perform the function registration exercise
505*fcf3ce44SJohn Forte */
506*fcf3ce44SJohn Forte HBA_STATUS
HBA_LoadLibrary(void)507*fcf3ce44SJohn Forte HBA_LoadLibrary(void) {
508*fcf3ce44SJohn Forte HBARegisterLibraryFunc
509*fcf3ce44SJohn Forte RegisterFunc;
510*fcf3ce44SJohn Forte HBARegisterLibraryV2Func
511*fcf3ce44SJohn Forte RegisterV2Func;
512*fcf3ce44SJohn Forte HBALoadLibraryFunc LoadLibraryFunc;
513*fcf3ce44SJohn Forte HBAGetVersionFunc GetVersionFunc;
514*fcf3ce44SJohn Forte #ifdef POSIX_THREADS
515*fcf3ce44SJohn Forte int ret;
516*fcf3ce44SJohn Forte #endif
517*fcf3ce44SJohn Forte HBA_STATUS status;
518*fcf3ce44SJohn Forte HBA_UINT32 libversion;
519*fcf3ce44SJohn Forte
520*fcf3ce44SJohn Forte /* Open configuration file from known location */
521*fcf3ce44SJohn Forte #ifdef WIN32
522*fcf3ce44SJohn Forte LONG lStatus;
523*fcf3ce44SJohn Forte HKEY hkSniaHba, hkVendorLib;
524*fcf3ce44SJohn Forte FILETIME ftLastWriteTime;
525*fcf3ce44SJohn Forte TCHAR cSubKeyName[256];
526*fcf3ce44SJohn Forte DWORD i, dwSize, dwType;
527*fcf3ce44SJohn Forte BYTE byFileName[MAX_PATH];
528*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
529*fcf3ce44SJohn Forte
530*fcf3ce44SJohn Forte if(_hbaapi_librarylist != NULL) {
531*fcf3ce44SJohn Forte /* this is an app programming error */
532*fcf3ce44SJohn Forte return HBA_STATUS_ERROR;
533*fcf3ce44SJohn Forte }
534*fcf3ce44SJohn Forte
535*fcf3ce44SJohn Forte lStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\SNIA\\HBA",
536*fcf3ce44SJohn Forte 0, KEY_READ, &hkSniaHba);
537*fcf3ce44SJohn Forte if (lStatus != ERROR_SUCCESS) {
538*fcf3ce44SJohn Forte /* ???Opportunity to send error msg, configuration error */
539*fcf3ce44SJohn Forte return HBA_STATUS_ERROR;
540*fcf3ce44SJohn Forte }
541*fcf3ce44SJohn Forte /*
542*fcf3ce44SJohn Forte * Enumerate all the subkeys. These have the form:
543*fcf3ce44SJohn Forte * HKLM\Software\SNIA\HBA\<Vendor id> - note that we don't care
544*fcf3ce44SJohn Forte * what the vendor id is
545*fcf3ce44SJohn Forte */
546*fcf3ce44SJohn Forte for (i = 0; ; i++) {
547*fcf3ce44SJohn Forte dwSize = 255; /* how big the buffer is */
548*fcf3ce44SJohn Forte lStatus = RegEnumKeyEx(hkSniaHba, i,
549*fcf3ce44SJohn Forte (char *)&cSubKeyName, &dwSize, NULL,
550*fcf3ce44SJohn Forte NULL, NULL, &ftLastWriteTime);
551*fcf3ce44SJohn Forte if (lStatus == ERROR_NO_MORE_ITEMS) {
552*fcf3ce44SJohn Forte break; /* we're done */
553*fcf3ce44SJohn Forte } else if (lStatus == ERROR_MORE_DATA) { /* buffer not big enough */
554*fcf3ce44SJohn Forte /* do whatever */
555*fcf3ce44SJohn Forte ;
556*fcf3ce44SJohn Forte }
557*fcf3ce44SJohn Forte /* Now open the subkey that pertains to this vendor's library */
558*fcf3ce44SJohn Forte lStatus = RegOpenKeyEx(hkSniaHba, cSubKeyName, 0, KEY_READ,
559*fcf3ce44SJohn Forte &hkVendorLib);
560*fcf3ce44SJohn Forte if (lStatus != ERROR_SUCCESS) {
561*fcf3ce44SJohn Forte RegCloseKey(hkSniaHba);
562*fcf3ce44SJohn Forte /* ???Opportunity to send error msg, installation error */
563*fcf3ce44SJohn Forte return HBA_STATUS_ERROR; /* you may want to return something
564*fcf3ce44SJohn Forte * else or keep trying */
565*fcf3ce44SJohn Forte }
566*fcf3ce44SJohn Forte /* The name of the library is contained in a REG_SZ Value
567*fcf3ce44SJohn Forte * keyed to "LibraryFile" */
568*fcf3ce44SJohn Forte dwSize = MAX_PATH;
569*fcf3ce44SJohn Forte lStatus = RegQueryValueEx(hkVendorLib, "LibraryFile", NULL, &dwType,
570*fcf3ce44SJohn Forte byFileName, &dwSize);
571*fcf3ce44SJohn Forte if (lStatus != ERROR_SUCCESS) {
572*fcf3ce44SJohn Forte RegCloseKey(hkVendorLib);
573*fcf3ce44SJohn Forte /* ???Opportunity to send error msg, installation error */
574*fcf3ce44SJohn Forte continue;
575*fcf3ce44SJohn Forte }
576*fcf3ce44SJohn Forte lib_infop = (HBA_LIBRARY_INFO *)calloc(1, sizeof(HBA_LIBRARY_INFO));
577*fcf3ce44SJohn Forte if(lib_infop == NULL) {
578*fcf3ce44SJohn Forte /* what is the right thing to do in MS land??? */
579*fcf3ce44SJohn Forte RegCloseKey(hkVendorLib);
580*fcf3ce44SJohn Forte /* ???Opportunity to send error msg, installation error */
581*fcf3ce44SJohn Forte return(HBA_STATUS_ERROR);
582*fcf3ce44SJohn Forte }
583*fcf3ce44SJohn Forte lib_infop->status = HBA_LIBRARY_NOT_LOADED;
584*fcf3ce44SJohn Forte lib_infop->next = _hbaapi_librarylist;
585*fcf3ce44SJohn Forte lib_infop->index = _hbaapi_total_library_count;
586*fcf3ce44SJohn Forte _hbaapi_total_library_count++;
587*fcf3ce44SJohn Forte _hbaapi_librarylist = lib_infop;
588*fcf3ce44SJohn Forte
589*fcf3ce44SJohn Forte /* Now I can try to load the library */
590*fcf3ce44SJohn Forte lib_infop->hLibrary = LoadLibrary(byFileName);
591*fcf3ce44SJohn Forte if (lib_infop->hLibrary == NULL){
592*fcf3ce44SJohn Forte /* printf("unable to load library %s\n", librarypath); */
593*fcf3ce44SJohn Forte /* ???Opportunity to send error msg, installation error */
594*fcf3ce44SJohn Forte goto dud_library;
595*fcf3ce44SJohn Forte }
596*fcf3ce44SJohn Forte lib_infop->LibraryPath = strdup(byFileName);
597*fcf3ce44SJohn Forte DEBUG(1, "HBAAPI loading: %s\n", byFileName, 0, 0);
598*fcf3ce44SJohn Forte
599*fcf3ce44SJohn Forte /* Call the registration function to get the list of pointers */
600*fcf3ce44SJohn Forte RegisterV2Func = (HBARegisterLibraryV2Func)
601*fcf3ce44SJohn Forte GetProcAddress(lib_infop->hLibrary, "HBA_RegisterLibraryV2");
602*fcf3ce44SJohn Forte if (RegisterV2Func != NULL) {
603*fcf3ce44SJohn Forte /* Load the function pointers directly into
604*fcf3ce44SJohn Forte * the table of functions */
605*fcf3ce44SJohn Forte status = ((RegisterV2Func)(&lib_infop->functionTable));
606*fcf3ce44SJohn Forte if (status != HBA_STATUS_OK) {
607*fcf3ce44SJohn Forte /* library not loaded */
608*fcf3ce44SJohn Forte /* ???Opportunity to send error msg, library error? */
609*fcf3ce44SJohn Forte goto dud_library;
610*fcf3ce44SJohn Forte }
611*fcf3ce44SJohn Forte } else {
612*fcf3ce44SJohn Forte /* Maybe the vendor library is only Rev1 */
613*fcf3ce44SJohn Forte RegisterFunc = (HBARegisterLibraryFunc)
614*fcf3ce44SJohn Forte GetProcAddress(lib_infop->hLibrary, "HBA_RegisterLibrary");
615*fcf3ce44SJohn Forte if(RegisterFunc == NULL) {
616*fcf3ce44SJohn Forte /* ???Opportunity to send error msg, library error? */
617*fcf3ce44SJohn Forte goto dud_library;
618*fcf3ce44SJohn Forte }
619*fcf3ce44SJohn Forte /* Load the function points directly into
620*fcf3ce44SJohn Forte * the Rev 2 table of functions */
621*fcf3ce44SJohn Forte status = ((RegisterFunc)(
622*fcf3ce44SJohn Forte (HBA_ENTRYPOINTS *)(&lib_infop->functionTable)));
623*fcf3ce44SJohn Forte if (status != HBA_STATUS_OK) {
624*fcf3ce44SJohn Forte /* library not loaded */
625*fcf3ce44SJohn Forte /* ???Opportunity to send error msg, library error? */
626*fcf3ce44SJohn Forte goto dud_library;
627*fcf3ce44SJohn Forte }
628*fcf3ce44SJohn Forte }
629*fcf3ce44SJohn Forte
630*fcf3ce44SJohn Forte /* successfully loaded library */
631*fcf3ce44SJohn Forte GetVersionFunc = lib_infop->functionTable.GetVersionHandler;
632*fcf3ce44SJohn Forte if (GetVersionFunc == NULL) {
633*fcf3ce44SJohn Forte /* ???Opportunity to send error msg, library error? */
634*fcf3ce44SJohn Forte goto dud_library;
635*fcf3ce44SJohn Forte }
636*fcf3ce44SJohn Forte /* Check the version of this library before loading */
637*fcf3ce44SJohn Forte /* Actually... This wrapper is compatible with version 1 */
638*fcf3ce44SJohn Forte libversion = ((GetVersionFunc)());
639*fcf3ce44SJohn Forte #ifdef NOTDEF /* save for a later time... when it matters */
640*fcf3ce44SJohn Forte if (libversion < HBA_LIBVERSION) {
641*fcf3ce44SJohn Forte goto dud_library;
642*fcf3ce44SJohn Forte }
643*fcf3ce44SJohn Forte #endif
644*fcf3ce44SJohn Forte LoadLibraryFunc = lib_infop->functionTable.LoadLibraryHandler;
645*fcf3ce44SJohn Forte if (LoadLibraryFunc == NULL) {
646*fcf3ce44SJohn Forte /* Hmmm, dont we need to flag this in a realy big way??? */
647*fcf3ce44SJohn Forte /* How about messages to the system event logger ??? */
648*fcf3ce44SJohn Forte /* ???Opportunity to send error msg, library error? */
649*fcf3ce44SJohn Forte goto dud_library;
650*fcf3ce44SJohn Forte }
651*fcf3ce44SJohn Forte /* Initialize this library */
652*fcf3ce44SJohn Forte status = ((LoadLibraryFunc)());
653*fcf3ce44SJohn Forte if (status != HBA_STATUS_OK) {
654*fcf3ce44SJohn Forte /* ???Opportunity to send error msg, library error? */
655*fcf3ce44SJohn Forte continue;
656*fcf3ce44SJohn Forte }
657*fcf3ce44SJohn Forte /* successfully loaded library */
658*fcf3ce44SJohn Forte lib_infop->status = HBA_LIBRARY_LOADED;
659*fcf3ce44SJohn Forte
660*fcf3ce44SJohn Forte dud_library: /* its also just the end of the loop */
661*fcf3ce44SJohn Forte RegCloseKey(hkVendorLib);
662*fcf3ce44SJohn Forte }
663*fcf3ce44SJohn Forte RegCloseKey(hkSniaHba);
664*fcf3ce44SJohn Forte
665*fcf3ce44SJohn Forte #else /* Unix as opposed to Win32 */
666*fcf3ce44SJohn Forte FILE *hbaconf;
667*fcf3ce44SJohn Forte char fullline[512]; /* line read from HBA.conf */
668*fcf3ce44SJohn Forte char *libraryname; /* Read in from file HBA.conf */
669*fcf3ce44SJohn Forte char *librarypath; /* Read in from file HBA.conf */
670*fcf3ce44SJohn Forte char hbaConfFilePath[256];
671*fcf3ce44SJohn Forte char *charPtr;
672*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
673*fcf3ce44SJohn Forte
674*fcf3ce44SJohn Forte if(_hbaapi_librarylist != NULL) {
675*fcf3ce44SJohn Forte fprintf(stderr,
676*fcf3ce44SJohn Forte "HBA_LoadLibrary: previously unfreed "
677*fcf3ce44SJohn Forte "libraries exist, call HBA_FreeLibrary().\n");
678*fcf3ce44SJohn Forte return HBA_STATUS_ERROR;
679*fcf3ce44SJohn Forte }
680*fcf3ce44SJohn Forte
681*fcf3ce44SJohn Forte strcpy(hbaConfFilePath, "/etc/hba.conf");
682*fcf3ce44SJohn Forte
683*fcf3ce44SJohn Forte if ((hbaconf = fopen(hbaConfFilePath, "r")) == NULL) {
684*fcf3ce44SJohn Forte printf("Cannot open %s\n", hbaConfFilePath);
685*fcf3ce44SJohn Forte return HBA_STATUS_ERROR;
686*fcf3ce44SJohn Forte }
687*fcf3ce44SJohn Forte
688*fcf3ce44SJohn Forte /* Read in each line and load library */
689*fcf3ce44SJohn Forte while ((hbaconf != NULL) && (fgets(fullline, sizeof(fullline), hbaconf))) {
690*fcf3ce44SJohn Forte /* Skip the comments... */
691*fcf3ce44SJohn Forte if ((fullline[0] == '#') || (fullline[0] == '\n')) {
692*fcf3ce44SJohn Forte continue;
693*fcf3ce44SJohn Forte }
694*fcf3ce44SJohn Forte
695*fcf3ce44SJohn Forte /* grab first 'thing' in line (if its there)*/
696*fcf3ce44SJohn Forte if((libraryname = strtok(fullline, " \t\n")) != NULL) {
697*fcf3ce44SJohn Forte if(strlen(libraryname) >= 64) {
698*fcf3ce44SJohn Forte fprintf(stderr, "Library name(%s) in %s is > 64 characters\n",
699*fcf3ce44SJohn Forte libraryname, hbaConfFilePath);
700*fcf3ce44SJohn Forte }
701*fcf3ce44SJohn Forte }
702*fcf3ce44SJohn Forte /* grab second 'thing' in line (if its there)*/
703*fcf3ce44SJohn Forte if((librarypath = strtok(NULL, " \t\n")) != NULL) {
704*fcf3ce44SJohn Forte if(strlen(librarypath) >= 256) {
705*fcf3ce44SJohn Forte fprintf(stderr, "Library path(%s) in %s is > 256 characters\n",
706*fcf3ce44SJohn Forte librarypath, hbaConfFilePath);
707*fcf3ce44SJohn Forte }
708*fcf3ce44SJohn Forte }
709*fcf3ce44SJohn Forte
710*fcf3ce44SJohn Forte /* there should be no more 'things' in the line */
711*fcf3ce44SJohn Forte if((charPtr = strtok(NULL, " \n\t")) != NULL) {
712*fcf3ce44SJohn Forte fprintf(stderr, "Extraneous characters (\"%s\") in %s\n",
713*fcf3ce44SJohn Forte charPtr, hbaConfFilePath);
714*fcf3ce44SJohn Forte }
715*fcf3ce44SJohn Forte
716*fcf3ce44SJohn Forte /* Continue to the next line if library name or path is invalid */
717*fcf3ce44SJohn Forte if (libraryname == NULL ||
718*fcf3ce44SJohn Forte strlen(libraryname) == 0 ||
719*fcf3ce44SJohn Forte librarypath == NULL ||
720*fcf3ce44SJohn Forte (strlen(librarypath) == 0)) {
721*fcf3ce44SJohn Forte continue;
722*fcf3ce44SJohn Forte }
723*fcf3ce44SJohn Forte /*
724*fcf3ce44SJohn Forte * Special case....
725*fcf3ce44SJohn Forte * Look for loglevel
726*fcf3ce44SJohn Forte */
727*fcf3ce44SJohn Forte if(strcmp(libraryname, "debuglevel") == 0) {
728*fcf3ce44SJohn Forte _hbaapi_debuglevel = strtol(librarypath, NULL, 10);
729*fcf3ce44SJohn Forte /* error handling does the right thing automagically */
730*fcf3ce44SJohn Forte continue;
731*fcf3ce44SJohn Forte }
732*fcf3ce44SJohn Forte
733*fcf3ce44SJohn Forte lib_infop = (HBA_LIBRARY_INFO *)calloc(1, sizeof(HBA_LIBRARY_INFO));
734*fcf3ce44SJohn Forte if(lib_infop == NULL) {
735*fcf3ce44SJohn Forte fprintf(stderr, "HBA_LoadLibrary: out of memeory\n");
736*fcf3ce44SJohn Forte return(HBA_STATUS_ERROR);
737*fcf3ce44SJohn Forte }
738*fcf3ce44SJohn Forte lib_infop->status = HBA_LIBRARY_NOT_LOADED;
739*fcf3ce44SJohn Forte lib_infop->LibraryName = strdup(libraryname);
740*fcf3ce44SJohn Forte lib_infop->LibraryPath = strdup(librarypath);
741*fcf3ce44SJohn Forte lib_infop->index = _hbaapi_total_library_count;
742*fcf3ce44SJohn Forte _hbaapi_total_library_count++;
743*fcf3ce44SJohn Forte lib_infop->next = _hbaapi_librarylist;
744*fcf3ce44SJohn Forte _hbaapi_librarylist = lib_infop;
745*fcf3ce44SJohn Forte
746*fcf3ce44SJohn Forte /* Load the DLL now */
747*fcf3ce44SJohn Forte if((lib_infop->hLibrary = dlopen(librarypath,RTLD_LAZY)) == NULL) {
748*fcf3ce44SJohn Forte /*printf("unable to load library %s\n", librarypath); */
749*fcf3ce44SJohn Forte continue;
750*fcf3ce44SJohn Forte }
751*fcf3ce44SJohn Forte /* Call the registration function to get the list of pointers */
752*fcf3ce44SJohn Forte RegisterV2Func = (HBARegisterLibraryV2Func)
753*fcf3ce44SJohn Forte dlsym(lib_infop->hLibrary, "HBA_RegisterLibraryV2");
754*fcf3ce44SJohn Forte if (RegisterV2Func != NULL) {
755*fcf3ce44SJohn Forte /* Load the function points directly into
756*fcf3ce44SJohn Forte * the table of functions */
757*fcf3ce44SJohn Forte status = ((RegisterV2Func)(&lib_infop->functionTable));
758*fcf3ce44SJohn Forte if (status != HBA_STATUS_OK) {
759*fcf3ce44SJohn Forte /* library not loaded */
760*fcf3ce44SJohn Forte continue;
761*fcf3ce44SJohn Forte }
762*fcf3ce44SJohn Forte } else {
763*fcf3ce44SJohn Forte /* Maybe the vendor library is only Rev1 */
764*fcf3ce44SJohn Forte RegisterFunc = (HBARegisterLibraryFunc)
765*fcf3ce44SJohn Forte dlsym(lib_infop->hLibrary, "HBA_RegisterLibrary");
766*fcf3ce44SJohn Forte if(RegisterFunc == NULL) {
767*fcf3ce44SJohn Forte /* This function is required */
768*fcf3ce44SJohn Forte fprintf(stderr,
769*fcf3ce44SJohn Forte "HBA_LoadLibrary: vendor specific RegisterLibrary "
770*fcf3ce44SJohn Forte "function not found. lib: %s\n", librarypath);
771*fcf3ce44SJohn Forte DEBUG(0, "HBA_LoadLibrary: vendor specific RegisterLibrary "
772*fcf3ce44SJohn Forte "function not found. lib: %s\n", librarypath, 0, 0);
773*fcf3ce44SJohn Forte continue;
774*fcf3ce44SJohn Forte }
775*fcf3ce44SJohn Forte /* Load the function points directly into
776*fcf3ce44SJohn Forte * the table of functions */
777*fcf3ce44SJohn Forte status = ((RegisterFunc)
778*fcf3ce44SJohn Forte ((HBA_ENTRYPOINTS *)(&lib_infop->functionTable)));
779*fcf3ce44SJohn Forte if (status != HBA_STATUS_OK) {
780*fcf3ce44SJohn Forte /* library not loaded */
781*fcf3ce44SJohn Forte fprintf(stderr,
782*fcf3ce44SJohn Forte "HBA_LoadLibrary: vendor specific RegisterLibrary "
783*fcf3ce44SJohn Forte "function encountered an error. lib: %s\n", librarypath);
784*fcf3ce44SJohn Forte DEBUG(0, "HBA_LoadLibrary: vendor specific RegisterLibrary "
785*fcf3ce44SJohn Forte "function encountered an error. lib: %s\n", librarypath, 0, 0);
786*fcf3ce44SJohn Forte continue;
787*fcf3ce44SJohn Forte }
788*fcf3ce44SJohn Forte }
789*fcf3ce44SJohn Forte
790*fcf3ce44SJohn Forte /* successfully loaded library */
791*fcf3ce44SJohn Forte if((GetVersionFunc = lib_infop->functionTable.GetVersionHandler)
792*fcf3ce44SJohn Forte == NULL) {
793*fcf3ce44SJohn Forte continue;
794*fcf3ce44SJohn Forte }
795*fcf3ce44SJohn Forte libversion = ((GetVersionFunc)());
796*fcf3ce44SJohn Forte /* Check the version of this library before loading */
797*fcf3ce44SJohn Forte /* Actually... This wrapper is compatible with version 1 */
798*fcf3ce44SJohn Forte #ifdef NOTDEF /* save for a later time... when it matters */
799*fcf3ce44SJohn Forte if(libversion < HBA_LIBVERSION) {
800*fcf3ce44SJohn Forte printf("Library version mismatch. Got %d expected %d.\n",
801*fcf3ce44SJohn Forte libversion, HBA_LIBVERSION);
802*fcf3ce44SJohn Forte continue;
803*fcf3ce44SJohn Forte }
804*fcf3ce44SJohn Forte #endif
805*fcf3ce44SJohn Forte DEBUG(1, "%s libversion = %d", librarypath, libversion, 0);
806*fcf3ce44SJohn Forte LoadLibraryFunc = lib_infop->functionTable.LoadLibraryHandler;
807*fcf3ce44SJohn Forte if (LoadLibraryFunc == NULL) {
808*fcf3ce44SJohn Forte /* this function is required */
809*fcf3ce44SJohn Forte fprintf(stderr,
810*fcf3ce44SJohn Forte "HBA_LoadLibrary: vendor specific LoadLibrary "
811*fcf3ce44SJohn Forte "function not found. lib: %s\n", librarypath);
812*fcf3ce44SJohn Forte DEBUG(0, "HBA_LoadLibrary: vendor specific LoadLibrary "
813*fcf3ce44SJohn Forte "function not found. lib: %s\n", librarypath, 0, 0);
814*fcf3ce44SJohn Forte continue;
815*fcf3ce44SJohn Forte }
816*fcf3ce44SJohn Forte /* Initialize this library */
817*fcf3ce44SJohn Forte if((status = ((LoadLibraryFunc)())) != HBA_STATUS_OK) {
818*fcf3ce44SJohn Forte /* maybe this should be a printf so that we CANNOT miss it */
819*fcf3ce44SJohn Forte fprintf(stderr,
820*fcf3ce44SJohn Forte "HBA_LoadLibrary: Encounterd and error loading: %s",
821*fcf3ce44SJohn Forte librarypath);
822*fcf3ce44SJohn Forte DEBUG(0, "Encounterd and error loading: %s", librarypath, 0, 0);
823*fcf3ce44SJohn Forte DEBUG(0, " HBA_STATUS: %d", status, 0, 0);
824*fcf3ce44SJohn Forte continue;
825*fcf3ce44SJohn Forte }
826*fcf3ce44SJohn Forte /* successfully loaded library */
827*fcf3ce44SJohn Forte lib_infop->status = HBA_LIBRARY_LOADED;
828*fcf3ce44SJohn Forte }
829*fcf3ce44SJohn Forte
830*fcf3ce44SJohn Forte fclose(hbaconf);
831*fcf3ce44SJohn Forte #endif /* WIN32 or UNIX */
832*fcf3ce44SJohn Forte #ifdef POSIX_THREADS
833*fcf3ce44SJohn Forte ret = pthread_mutex_init(&_hbaapi_LL_mutex, NULL);
834*fcf3ce44SJohn Forte if(ret == 0) {
835*fcf3ce44SJohn Forte ret = pthread_mutex_init(&_hbaapi_AL_mutex, NULL);
836*fcf3ce44SJohn Forte }
837*fcf3ce44SJohn Forte if(ret == 0) {
838*fcf3ce44SJohn Forte ret = pthread_mutex_init(&_hbaapi_AAE_mutex, NULL);
839*fcf3ce44SJohn Forte }
840*fcf3ce44SJohn Forte if(ret == 0) {
841*fcf3ce44SJohn Forte ret = pthread_mutex_init(&_hbaapi_AE_mutex, NULL);
842*fcf3ce44SJohn Forte }
843*fcf3ce44SJohn Forte if(ret == 0) {
844*fcf3ce44SJohn Forte ret = pthread_mutex_init(&_hbaapi_APE_mutex, NULL);
845*fcf3ce44SJohn Forte }
846*fcf3ce44SJohn Forte if(ret == 0) {
847*fcf3ce44SJohn Forte ret = pthread_mutex_init(&_hbaapi_APSE_mutex, NULL);
848*fcf3ce44SJohn Forte }
849*fcf3ce44SJohn Forte if(ret == 0) {
850*fcf3ce44SJohn Forte ret = pthread_mutex_init(&_hbaapi_TE_mutex, NULL);
851*fcf3ce44SJohn Forte }
852*fcf3ce44SJohn Forte if(ret == 0) {
853*fcf3ce44SJohn Forte ret = pthread_mutex_init(&_hbaapi_LE_mutex, NULL);
854*fcf3ce44SJohn Forte }
855*fcf3ce44SJohn Forte if(ret != 0) {
856*fcf3ce44SJohn Forte perror("pthread_mutec_init - HBA_LoadLibrary");
857*fcf3ce44SJohn Forte return(HBA_STATUS_ERROR);
858*fcf3ce44SJohn Forte }
859*fcf3ce44SJohn Forte #elif defined(WIN32)
860*fcf3ce44SJohn Forte InitializeCriticalSection(&_hbaapi_LL_mutex);
861*fcf3ce44SJohn Forte InitializeCriticalSection(&_hbaapi_AL_mutex);
862*fcf3ce44SJohn Forte InitializeCriticalSection(&_hbaapi_AAE_mutex);
863*fcf3ce44SJohn Forte InitializeCriticalSection(&_hbaapi_AE_mutex);
864*fcf3ce44SJohn Forte InitializeCriticalSection(&_hbaapi_APE_mutex);
865*fcf3ce44SJohn Forte InitializeCriticalSection(&_hbaapi_APSE_mutex);
866*fcf3ce44SJohn Forte InitializeCriticalSection(&_hbaapi_TE_mutex);
867*fcf3ce44SJohn Forte InitializeCriticalSection(&_hbaapi_LE_mutex);
868*fcf3ce44SJohn Forte #endif
869*fcf3ce44SJohn Forte
870*fcf3ce44SJohn Forte
871*fcf3ce44SJohn Forte return HBA_STATUS_OK;
872*fcf3ce44SJohn Forte }
873*fcf3ce44SJohn Forte
874*fcf3ce44SJohn Forte HBA_STATUS
HBA_FreeLibrary(void)875*fcf3ce44SJohn Forte HBA_FreeLibrary(void) {
876*fcf3ce44SJohn Forte HBAFreeLibraryFunc FreeLibraryFunc;
877*fcf3ce44SJohn Forte HBA_STATUS status;
878*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
879*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_next;
880*fcf3ce44SJohn Forte HBA_ADAPTERCALLBACK_ELEM
881*fcf3ce44SJohn Forte ***listp;
882*fcf3ce44SJohn Forte HBA_ADAPTER_INFO *adapt_infop;
883*fcf3ce44SJohn Forte HBA_ADAPTER_INFO *adapt_next;
884*fcf3ce44SJohn Forte
885*fcf3ce44SJohn Forte ARE_WE_INITED();
886*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_LL_mutex);
887*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_AL_mutex);
888*fcf3ce44SJohn Forte
889*fcf3ce44SJohn Forte DEBUG(1, "HBA_FreeLibrary()", 0, 0, 0);
890*fcf3ce44SJohn Forte for(lib_infop = _hbaapi_librarylist; lib_infop != NULL; lib_infop = lib_next) {
891*fcf3ce44SJohn Forte lib_next = lib_infop->next;
892*fcf3ce44SJohn Forte if (lib_infop->status == HBA_LIBRARY_LOADED) {
893*fcf3ce44SJohn Forte FreeLibraryFunc = lib_infop->functionTable.FreeLibraryHandler;
894*fcf3ce44SJohn Forte if (FreeLibraryFunc != NULL) {
895*fcf3ce44SJohn Forte /* Free this library */
896*fcf3ce44SJohn Forte status = ((FreeLibraryFunc)());
897*fcf3ce44SJohn Forte }
898*fcf3ce44SJohn Forte #ifdef WIN32
899*fcf3ce44SJohn Forte FreeLibrary(lib_infop->hLibrary); /* Unload DLL from memory */
900*fcf3ce44SJohn Forte #else
901*fcf3ce44SJohn Forte dlclose(lib_infop->hLibrary); /* Unload DLL from memory */
902*fcf3ce44SJohn Forte #endif
903*fcf3ce44SJohn Forte }
904*fcf3ce44SJohn Forte #ifndef WIN32
905*fcf3ce44SJohn Forte free(lib_infop->LibraryName);
906*fcf3ce44SJohn Forte #endif
907*fcf3ce44SJohn Forte free(lib_infop->LibraryPath);
908*fcf3ce44SJohn Forte free(lib_infop);
909*fcf3ce44SJohn Forte
910*fcf3ce44SJohn Forte }
911*fcf3ce44SJohn Forte _hbaapi_librarylist = NULL;
912*fcf3ce44SJohn Forte /* OK, now all functions are disabled except for LoadLibrary,
913*fcf3ce44SJohn Forte * Hope no other thread calls it before we have returned */
914*fcf3ce44SJohn Forte _hbaapi_total_library_count = 0;
915*fcf3ce44SJohn Forte
916*fcf3ce44SJohn Forte for(adapt_infop = _hbaapi_adapterlist;
917*fcf3ce44SJohn Forte adapt_infop != NULL;
918*fcf3ce44SJohn Forte adapt_infop = adapt_next) {
919*fcf3ce44SJohn Forte adapt_next = adapt_infop->next;
920*fcf3ce44SJohn Forte free(adapt_infop->name);
921*fcf3ce44SJohn Forte free(adapt_infop);
922*fcf3ce44SJohn Forte }
923*fcf3ce44SJohn Forte _hbaapi_adapterlist = NULL;
924*fcf3ce44SJohn Forte _hbaapi_total_adapter_count = 0;
925*fcf3ce44SJohn Forte
926*fcf3ce44SJohn Forte /* Free up the callbacks, this is not the most efficient, but it works */
927*fcf3ce44SJohn Forte while((volatile HBA_ADAPTERCALLBACK_ELEM *)
928*fcf3ce44SJohn Forte _hbaapi_adapteraddevents_callback_list
929*fcf3ce44SJohn Forte != NULL) {
930*fcf3ce44SJohn Forte local_remove_callback((HBA_CALLBACKHANDLE)
931*fcf3ce44SJohn Forte _hbaapi_adapteraddevents_callback_list);
932*fcf3ce44SJohn Forte }
933*fcf3ce44SJohn Forte for(listp = cb_lists_array; *listp != NULL; listp++) {
934*fcf3ce44SJohn Forte while((volatile HBA_ADAPTERCALLBACK_ELEM ***)**listp != NULL) {
935*fcf3ce44SJohn Forte local_remove_callback((HBA_CALLBACKHANDLE)**listp);
936*fcf3ce44SJohn Forte }
937*fcf3ce44SJohn Forte }
938*fcf3ce44SJohn Forte
939*fcf3ce44SJohn Forte RELEASE_MUTEX(&_hbaapi_AL_mutex);
940*fcf3ce44SJohn Forte RELEASE_MUTEX(&_hbaapi_LL_mutex);
941*fcf3ce44SJohn Forte
942*fcf3ce44SJohn Forte #ifdef USESYSLOG
943*fcf3ce44SJohn Forte closelog();
944*fcf3ce44SJohn Forte #endif
945*fcf3ce44SJohn Forte #ifdef USELOGFILE
946*fcf3ce44SJohn Forte if(_hbaapi_debug_fd != NULL) {
947*fcf3ce44SJohn Forte fclose(_hbaapi_debug_fd);
948*fcf3ce44SJohn Forte }
949*fcf3ce44SJohn Forte _hbaapi_debug_fd = NULL;
950*fcf3ce44SJohn Forte #endif
951*fcf3ce44SJohn Forte #ifdef POSIX_THREADS
952*fcf3ce44SJohn Forte /* this will unlock them as well, but who cares */
953*fcf3ce44SJohn Forte pthread_mutex_destroy(&_hbaapi_LE_mutex);
954*fcf3ce44SJohn Forte pthread_mutex_destroy(&_hbaapi_TE_mutex);
955*fcf3ce44SJohn Forte pthread_mutex_destroy(&_hbaapi_APSE_mutex);
956*fcf3ce44SJohn Forte pthread_mutex_destroy(&_hbaapi_APE_mutex);
957*fcf3ce44SJohn Forte pthread_mutex_destroy(&_hbaapi_AE_mutex);
958*fcf3ce44SJohn Forte pthread_mutex_destroy(&_hbaapi_AAE_mutex);
959*fcf3ce44SJohn Forte pthread_mutex_destroy(&_hbaapi_AL_mutex);
960*fcf3ce44SJohn Forte pthread_mutex_destroy(&_hbaapi_LL_mutex);
961*fcf3ce44SJohn Forte #elif defined(WIN32)
962*fcf3ce44SJohn Forte DeleteCriticalSection(&_hbaapi_LL_mutex);
963*fcf3ce44SJohn Forte DeleteCriticalSection(&_hbaapi_AL_mutex);
964*fcf3ce44SJohn Forte DeleteCriticalSection(&_hbaapi_AAE_mutex);
965*fcf3ce44SJohn Forte DeleteCriticalSection(&_hbaapi_AE_mutex);
966*fcf3ce44SJohn Forte DeleteCriticalSection(&_hbaapi_APE_mutex);
967*fcf3ce44SJohn Forte DeleteCriticalSection(&_hbaapi_APSE_mutex);
968*fcf3ce44SJohn Forte DeleteCriticalSection(&_hbaapi_TE_mutex);
969*fcf3ce44SJohn Forte DeleteCriticalSection(&_hbaapi_LE_mutex);
970*fcf3ce44SJohn Forte #endif
971*fcf3ce44SJohn Forte
972*fcf3ce44SJohn Forte return HBA_STATUS_OK;
973*fcf3ce44SJohn Forte }
974*fcf3ce44SJohn Forte
975*fcf3ce44SJohn Forte /*
976*fcf3ce44SJohn Forte * The API used to use fixed size tables as its primary data structure.
977*fcf3ce44SJohn Forte * Indexing from 1 to N identified each adapters. Now the adapters are
978*fcf3ce44SJohn Forte * on a linked list. There is a unique "index" foreach each adapter.
979*fcf3ce44SJohn Forte * Adapters always keep their index, even if they are removed from the
980*fcf3ce44SJohn Forte * hardware. The only time the indexing is reset is on HBA_FreeLibrary
981*fcf3ce44SJohn Forte */
982*fcf3ce44SJohn Forte HBA_UINT32
HBA_GetNumberOfAdapters(void)983*fcf3ce44SJohn Forte HBA_GetNumberOfAdapters(void) {
984*fcf3ce44SJohn Forte int j=0;
985*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
986*fcf3ce44SJohn Forte HBAGetNumberOfAdaptersFunc
987*fcf3ce44SJohn Forte GetNumberOfAdaptersFunc;
988*fcf3ce44SJohn Forte HBAGetAdapterNameFunc
989*fcf3ce44SJohn Forte GetAdapterNameFunc;
990*fcf3ce44SJohn Forte HBA_BOOLEAN found_name;
991*fcf3ce44SJohn Forte HBA_ADAPTER_INFO *adapt_infop;
992*fcf3ce44SJohn Forte HBA_STATUS status;
993*fcf3ce44SJohn Forte
994*fcf3ce44SJohn Forte char adaptername[256];
995*fcf3ce44SJohn Forte int num_adapters; /* local */
996*fcf3ce44SJohn Forte
997*fcf3ce44SJohn Forte if(_hbaapi_librarylist == NULL) {
998*fcf3ce44SJohn Forte return (0);
999*fcf3ce44SJohn Forte }
1000*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_LL_mutex); /* pay attention to order */
1001*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_AL_mutex);
1002*fcf3ce44SJohn Forte
1003*fcf3ce44SJohn Forte for (lib_infop = _hbaapi_librarylist;
1004*fcf3ce44SJohn Forte lib_infop != NULL;
1005*fcf3ce44SJohn Forte lib_infop = lib_infop->next) {
1006*fcf3ce44SJohn Forte
1007*fcf3ce44SJohn Forte if (lib_infop->status != HBA_LIBRARY_LOADED) {
1008*fcf3ce44SJohn Forte continue;
1009*fcf3ce44SJohn Forte }
1010*fcf3ce44SJohn Forte
1011*fcf3ce44SJohn Forte GetNumberOfAdaptersFunc =
1012*fcf3ce44SJohn Forte lib_infop->functionTable.GetNumberOfAdaptersHandler;
1013*fcf3ce44SJohn Forte if (GetNumberOfAdaptersFunc == NULL) {
1014*fcf3ce44SJohn Forte continue;
1015*fcf3ce44SJohn Forte }
1016*fcf3ce44SJohn Forte num_adapters = ((GetNumberOfAdaptersFunc)());
1017*fcf3ce44SJohn Forte #ifndef WIN32
1018*fcf3ce44SJohn Forte DEBUG(1, "HBAAPI: num_adapters for %s = %d\n",
1019*fcf3ce44SJohn Forte lib_infop->LibraryName, num_adapters, 0);
1020*fcf3ce44SJohn Forte #else
1021*fcf3ce44SJohn Forte DEBUG(1, "HBAAPI: num_adapters for %s = %d\n",
1022*fcf3ce44SJohn Forte lib_infop->LibraryPath, num_adapters, 0);
1023*fcf3ce44SJohn Forte #endif
1024*fcf3ce44SJohn Forte
1025*fcf3ce44SJohn Forte /* Also get the names of all the adapters here and cache */
1026*fcf3ce44SJohn Forte GetAdapterNameFunc = lib_infop->functionTable.GetAdapterNameHandler;
1027*fcf3ce44SJohn Forte if(GetAdapterNameFunc == NULL) {
1028*fcf3ce44SJohn Forte continue;
1029*fcf3ce44SJohn Forte }
1030*fcf3ce44SJohn Forte
1031*fcf3ce44SJohn Forte for (j = 0; j < num_adapters; j++) {
1032*fcf3ce44SJohn Forte found_name = 0;
1033*fcf3ce44SJohn Forte status = (GetAdapterNameFunc)(j, (char *)&adaptername);
1034*fcf3ce44SJohn Forte if(status == HBA_STATUS_OK) {
1035*fcf3ce44SJohn Forte for(adapt_infop = _hbaapi_adapterlist;
1036*fcf3ce44SJohn Forte adapt_infop != NULL;
1037*fcf3ce44SJohn Forte adapt_infop = adapt_infop->next) {
1038*fcf3ce44SJohn Forte /*
1039*fcf3ce44SJohn Forte * check for duplicates, really, this may just be a second
1040*fcf3ce44SJohn Forte * call to this function
1041*fcf3ce44SJohn Forte * ??? how do we know when a name becomes stale?
1042*fcf3ce44SJohn Forte */
1043*fcf3ce44SJohn Forte if(strcmp(adaptername, adapt_infop->name) == 0) {
1044*fcf3ce44SJohn Forte /* already got this one */
1045*fcf3ce44SJohn Forte found_name++;
1046*fcf3ce44SJohn Forte break;
1047*fcf3ce44SJohn Forte }
1048*fcf3ce44SJohn Forte }
1049*fcf3ce44SJohn Forte if(found_name != 0) {
1050*fcf3ce44SJohn Forte continue;
1051*fcf3ce44SJohn Forte }
1052*fcf3ce44SJohn Forte }
1053*fcf3ce44SJohn Forte
1054*fcf3ce44SJohn Forte adapt_infop = (HBA_ADAPTER_INFO *)
1055*fcf3ce44SJohn Forte calloc(1, sizeof(HBA_ADAPTER_INFO));
1056*fcf3ce44SJohn Forte if(adapt_infop == NULL) {
1057*fcf3ce44SJohn Forte #ifndef WIN32
1058*fcf3ce44SJohn Forte fprintf(stderr,
1059*fcf3ce44SJohn Forte "HBA_GetNumberOfAdapters: calloc failed on sizeof:%d\n",
1060*fcf3ce44SJohn Forte sizeof(HBA_ADAPTER_INFO));
1061*fcf3ce44SJohn Forte #endif
1062*fcf3ce44SJohn Forte RELEASE_MUTEX(&_hbaapi_AL_mutex);
1063*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex,
1064*fcf3ce44SJohn Forte _hbaapi_total_adapter_count);
1065*fcf3ce44SJohn Forte }
1066*fcf3ce44SJohn Forte if((adapt_infop->GNstatus = status) == HBA_STATUS_OK) {
1067*fcf3ce44SJohn Forte adapt_infop->name = strdup(adaptername);
1068*fcf3ce44SJohn Forte } else {
1069*fcf3ce44SJohn Forte char dummyname[512];
1070*fcf3ce44SJohn Forte sprintf(dummyname, "NULLADAPTER-%s-%03d",
1071*fcf3ce44SJohn Forte lib_infop->LibraryPath, _hbaapi_total_adapter_count);
1072*fcf3ce44SJohn Forte dummyname[255] = '\0';
1073*fcf3ce44SJohn Forte adapt_infop->name = strdup(dummyname);
1074*fcf3ce44SJohn Forte }
1075*fcf3ce44SJohn Forte adapt_infop->library = lib_infop;
1076*fcf3ce44SJohn Forte adapt_infop->next = _hbaapi_adapterlist;
1077*fcf3ce44SJohn Forte adapt_infop->index = _hbaapi_total_adapter_count;
1078*fcf3ce44SJohn Forte _hbaapi_adapterlist = adapt_infop;
1079*fcf3ce44SJohn Forte _hbaapi_total_adapter_count++;
1080*fcf3ce44SJohn Forte }
1081*fcf3ce44SJohn Forte }
1082*fcf3ce44SJohn Forte RELEASE_MUTEX(&_hbaapi_AL_mutex);
1083*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, _hbaapi_total_adapter_count);
1084*fcf3ce44SJohn Forte }
1085*fcf3ce44SJohn Forte
1086*fcf3ce44SJohn Forte HBA_STATUS
HBA_GetAdapterName(HBA_UINT32 adapterindex,char * adaptername)1087*fcf3ce44SJohn Forte HBA_GetAdapterName(
1088*fcf3ce44SJohn Forte HBA_UINT32 adapterindex,
1089*fcf3ce44SJohn Forte char *adaptername)
1090*fcf3ce44SJohn Forte {
1091*fcf3ce44SJohn Forte HBA_ADAPTER_INFO *adapt_infop;
1092*fcf3ce44SJohn Forte HBA_STATUS ret = HBA_STATUS_ERROR_ILLEGAL_INDEX;
1093*fcf3ce44SJohn Forte
1094*fcf3ce44SJohn Forte if (adaptername == NULL) {
1095*fcf3ce44SJohn Forte return(HBA_STATUS_ERROR_ARG);
1096*fcf3ce44SJohn Forte }
1097*fcf3ce44SJohn Forte /*
1098*fcf3ce44SJohn Forte * The adapter index is from old code, but we have
1099*fcf3ce44SJohn Forte * to support it. Go down the list looking for
1100*fcf3ce44SJohn Forte * the adapter
1101*fcf3ce44SJohn Forte */
1102*fcf3ce44SJohn Forte ARE_WE_INITED();
1103*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_AL_mutex);
1104*fcf3ce44SJohn Forte *adaptername = '\0';
1105*fcf3ce44SJohn Forte for(adapt_infop = _hbaapi_adapterlist;
1106*fcf3ce44SJohn Forte adapt_infop != NULL;
1107*fcf3ce44SJohn Forte adapt_infop = adapt_infop->next) {
1108*fcf3ce44SJohn Forte
1109*fcf3ce44SJohn Forte if(adapt_infop->index == adapterindex) {
1110*fcf3ce44SJohn Forte if(adapt_infop->name != NULL &&
1111*fcf3ce44SJohn Forte adapt_infop->GNstatus == HBA_STATUS_OK) {
1112*fcf3ce44SJohn Forte strcpy(adaptername, adapt_infop->name);
1113*fcf3ce44SJohn Forte } else {
1114*fcf3ce44SJohn Forte *adaptername = '\0';
1115*fcf3ce44SJohn Forte }
1116*fcf3ce44SJohn Forte ret = adapt_infop->GNstatus;
1117*fcf3ce44SJohn Forte break;
1118*fcf3ce44SJohn Forte }
1119*fcf3ce44SJohn Forte }
1120*fcf3ce44SJohn Forte DEBUG(2, "GetAdapterName for index:%d ->%s", adapterindex, adaptername, 0);
1121*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_AL_mutex, ret);
1122*fcf3ce44SJohn Forte }
1123*fcf3ce44SJohn Forte
1124*fcf3ce44SJohn Forte HBA_HANDLE
HBA_OpenAdapter(char * adaptername)1125*fcf3ce44SJohn Forte HBA_OpenAdapter(char* adaptername) {
1126*fcf3ce44SJohn Forte HBA_HANDLE handle;
1127*fcf3ce44SJohn Forte HBAOpenAdapterFunc OpenAdapterFunc;
1128*fcf3ce44SJohn Forte HBA_ADAPTER_INFO *adapt_infop;
1129*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
1130*fcf3ce44SJohn Forte
1131*fcf3ce44SJohn Forte DEBUG(2, "OpenAdapter: %s", adaptername, 0, 0);
1132*fcf3ce44SJohn Forte
1133*fcf3ce44SJohn Forte if(_hbaapi_librarylist == NULL) {
1134*fcf3ce44SJohn Forte return(HBA_HANDLE_INVALID);
1135*fcf3ce44SJohn Forte }
1136*fcf3ce44SJohn Forte if (adaptername == NULL) {
1137*fcf3ce44SJohn Forte return(HBA_STATUS_ERROR_ARG);
1138*fcf3ce44SJohn Forte }
1139*fcf3ce44SJohn Forte handle = HBA_HANDLE_INVALID;
1140*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_AL_mutex);
1141*fcf3ce44SJohn Forte for(adapt_infop = _hbaapi_adapterlist;
1142*fcf3ce44SJohn Forte adapt_infop != NULL;
1143*fcf3ce44SJohn Forte adapt_infop = adapt_infop->next) {
1144*fcf3ce44SJohn Forte if (strcmp(adaptername, adapt_infop->name) != 0) {
1145*fcf3ce44SJohn Forte continue;
1146*fcf3ce44SJohn Forte }
1147*fcf3ce44SJohn Forte lib_infop = adapt_infop->library;
1148*fcf3ce44SJohn Forte OpenAdapterFunc =
1149*fcf3ce44SJohn Forte lib_infop->functionTable.OpenAdapterHandler;
1150*fcf3ce44SJohn Forte if (OpenAdapterFunc != NULL) {
1151*fcf3ce44SJohn Forte /* retrieve the vendor handle */
1152*fcf3ce44SJohn Forte handle = (OpenAdapterFunc)(adaptername);
1153*fcf3ce44SJohn Forte if(handle != 0) {
1154*fcf3ce44SJohn Forte /* or this with the library index to get the common handle */
1155*fcf3ce44SJohn Forte handle = HBA_HANDLE_FROM_LOCAL(lib_infop->index, handle);
1156*fcf3ce44SJohn Forte }
1157*fcf3ce44SJohn Forte }
1158*fcf3ce44SJohn Forte break;
1159*fcf3ce44SJohn Forte }
1160*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_AL_mutex, handle);
1161*fcf3ce44SJohn Forte }
1162*fcf3ce44SJohn Forte /*
1163*fcf3ce44SJohn Forte * This function ignores the list of known adapters and instead tries
1164*fcf3ce44SJohn Forte * each vendors open function to see if one of them
1165*fcf3ce44SJohn Forte * can open an adapter when referenced with a particular WWN
1166*fcf3ce44SJohn Forte */
1167*fcf3ce44SJohn Forte HBA_STATUS
HBA_OpenAdapterByWWN(HBA_HANDLE * phandle,HBA_WWN nodeWWN)1168*fcf3ce44SJohn Forte HBA_OpenAdapterByWWN(HBA_HANDLE *phandle, HBA_WWN nodeWWN) {
1169*fcf3ce44SJohn Forte HBA_HANDLE handle;
1170*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
1171*fcf3ce44SJohn Forte HBAGetNumberOfAdaptersFunc
1172*fcf3ce44SJohn Forte GetNumberOfAdaptersFunc;
1173*fcf3ce44SJohn Forte HBAOpenAdapterByWWNFunc
1174*fcf3ce44SJohn Forte OpenAdapterFunc;
1175*fcf3ce44SJohn Forte HBA_STATUS status;
1176*fcf3ce44SJohn Forte
1177*fcf3ce44SJohn Forte DEBUG(2, "OpenAdapterByWWN: %s", WWN2STR1(&nodeWWN), 0, 0);
1178*fcf3ce44SJohn Forte
1179*fcf3ce44SJohn Forte if (phandle == NULL) {
1180*fcf3ce44SJohn Forte return(HBA_STATUS_ERROR_ARG);
1181*fcf3ce44SJohn Forte }
1182*fcf3ce44SJohn Forte
1183*fcf3ce44SJohn Forte ARE_WE_INITED();
1184*fcf3ce44SJohn Forte
1185*fcf3ce44SJohn Forte *phandle = HBA_HANDLE_INVALID;
1186*fcf3ce44SJohn Forte
1187*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_LL_mutex);
1188*fcf3ce44SJohn Forte for (lib_infop = _hbaapi_librarylist;
1189*fcf3ce44SJohn Forte lib_infop != NULL;
1190*fcf3ce44SJohn Forte lib_infop = lib_infop->next) {
1191*fcf3ce44SJohn Forte
1192*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_ILLEGAL_WWN;
1193*fcf3ce44SJohn Forte
1194*fcf3ce44SJohn Forte if (lib_infop->status != HBA_LIBRARY_LOADED) {
1195*fcf3ce44SJohn Forte continue;
1196*fcf3ce44SJohn Forte }
1197*fcf3ce44SJohn Forte
1198*fcf3ce44SJohn Forte GetNumberOfAdaptersFunc =
1199*fcf3ce44SJohn Forte lib_infop->functionTable.GetNumberOfAdaptersHandler;
1200*fcf3ce44SJohn Forte if (GetNumberOfAdaptersFunc == NULL) {
1201*fcf3ce44SJohn Forte continue;
1202*fcf3ce44SJohn Forte }
1203*fcf3ce44SJohn Forte
1204*fcf3ce44SJohn Forte /* look for new hardware */
1205*fcf3ce44SJohn Forte (void) ((GetNumberOfAdaptersFunc)());
1206*fcf3ce44SJohn Forte
1207*fcf3ce44SJohn Forte OpenAdapterFunc = lib_infop->functionTable.OpenAdapterByWWNHandler;
1208*fcf3ce44SJohn Forte if (OpenAdapterFunc == NULL) {
1209*fcf3ce44SJohn Forte continue;
1210*fcf3ce44SJohn Forte }
1211*fcf3ce44SJohn Forte /*
1212*fcf3ce44SJohn Forte * We do not know if the WWN is known by this vendor,
1213*fcf3ce44SJohn Forte * just try it
1214*fcf3ce44SJohn Forte */
1215*fcf3ce44SJohn Forte if((status = (OpenAdapterFunc)(&handle, nodeWWN)) != HBA_STATUS_OK) {
1216*fcf3ce44SJohn Forte continue;
1217*fcf3ce44SJohn Forte }
1218*fcf3ce44SJohn Forte /* OK, make a vendor non-specific handle */
1219*fcf3ce44SJohn Forte *phandle = HBA_HANDLE_FROM_LOCAL(lib_infop->index, handle);
1220*fcf3ce44SJohn Forte status = HBA_STATUS_OK;
1221*fcf3ce44SJohn Forte break;
1222*fcf3ce44SJohn Forte }
1223*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
1224*fcf3ce44SJohn Forte }
1225*fcf3ce44SJohn Forte
1226*fcf3ce44SJohn Forte void
HBA_RefreshAdapterConfiguration()1227*fcf3ce44SJohn Forte HBA_RefreshAdapterConfiguration() {
1228*fcf3ce44SJohn Forte DEBUG(2, "HBA_RefreshAdapterConfiguration", 0, 0, 0);
1229*fcf3ce44SJohn Forte (void)HBA_GetNumberOfAdapters();
1230*fcf3ce44SJohn Forte return;
1231*fcf3ce44SJohn Forte }
1232*fcf3ce44SJohn Forte
1233*fcf3ce44SJohn Forte HBA_UINT32
HBA_GetVersion()1234*fcf3ce44SJohn Forte HBA_GetVersion() {
1235*fcf3ce44SJohn Forte DEBUG(2, "HBA_GetVersion", 0, 0, 0);
1236*fcf3ce44SJohn Forte return HBA_LIBVERSION;
1237*fcf3ce44SJohn Forte }
1238*fcf3ce44SJohn Forte
1239*fcf3ce44SJohn Forte /*
1240*fcf3ce44SJohn Forte * This function is VERY OS dependent. Wing it as best you can.
1241*fcf3ce44SJohn Forte */
1242*fcf3ce44SJohn Forte HBA_UINT32
HBA_GetWrapperLibraryAttributes(HBA_LIBRARYATTRIBUTES * attributes)1243*fcf3ce44SJohn Forte HBA_GetWrapperLibraryAttributes (
1244*fcf3ce44SJohn Forte HBA_LIBRARYATTRIBUTES *attributes)
1245*fcf3ce44SJohn Forte {
1246*fcf3ce44SJohn Forte
1247*fcf3ce44SJohn Forte DEBUG(2, "HBA_GetWrapperLibraryAttributes", 0, 0, 0);
1248*fcf3ce44SJohn Forte
1249*fcf3ce44SJohn Forte if (attributes == NULL) {
1250*fcf3ce44SJohn Forte return(HBA_STATUS_ERROR_ARG);
1251*fcf3ce44SJohn Forte }
1252*fcf3ce44SJohn Forte
1253*fcf3ce44SJohn Forte memset(attributes, 0, sizeof(HBA_LIBRARYATTRIBUTES));
1254*fcf3ce44SJohn Forte
1255*fcf3ce44SJohn Forte #if defined(SOLARIS)
1256*fcf3ce44SJohn Forte if((handle = dlopen("libHBAAPI.so", RTLD_NOW)) != NULL) {
1257*fcf3ce44SJohn Forte if(dlinfo(handle, RTLD_DI_LINKMAP, &map) >= 0) {
1258*fcf3ce44SJohn Forte for(mp = map; mp != NULL; mp = mp->l_next) {
1259*fcf3ce44SJohn Forte if(strlen(map->l_name) < 256) {
1260*fcf3ce44SJohn Forte strcpy(attributes->LibPath, map->l_lname);
1261*fcf3ce44SJohn Forte }
1262*fcf3ce44SJohn Forte }
1263*fcf3ce44SJohn Forte }
1264*fcf3ce44SJohn Forte }
1265*fcf3ce44SJohn Forte #elif defined(WIN32)
1266*fcf3ce44SJohn Forte {
1267*fcf3ce44SJohn Forte HMODULE module;
1268*fcf3ce44SJohn Forte
1269*fcf3ce44SJohn Forte /* No need to do anything with the module handle */
1270*fcf3ce44SJohn Forte /* It wasn't alloocated so it doesn't need to be freed */
1271*fcf3ce44SJohn Forte module = GetModuleHandle("HBAAPI");
1272*fcf3ce44SJohn Forte if ( module != NULL ) {
1273*fcf3ce44SJohn Forte if ( GetModuleFileName(module, attributes->LibPath,
1274*fcf3ce44SJohn Forte sizeof(attributes->LibPath)) == 0 ) {
1275*fcf3ce44SJohn Forte attributes->LibPath[0] = '\0';
1276*fcf3ce44SJohn Forte }
1277*fcf3ce44SJohn Forte }
1278*fcf3ce44SJohn Forte }
1279*fcf3ce44SJohn Forte #endif
1280*fcf3ce44SJohn Forte #if defined(VENDOR)
1281*fcf3ce44SJohn Forte strcpy(attributes->VName, VENDOR);
1282*fcf3ce44SJohn Forte #else
1283*fcf3ce44SJohn Forte attributes->VName[0] = '\0';
1284*fcf3ce44SJohn Forte #endif
1285*fcf3ce44SJohn Forte #if defined(VERSION)
1286*fcf3ce44SJohn Forte strcpy(attributes->VVersion, VERSION);
1287*fcf3ce44SJohn Forte #else
1288*fcf3ce44SJohn Forte attributes->VVersion[0] = '\0';
1289*fcf3ce44SJohn Forte #endif
1290*fcf3ce44SJohn Forte #if defined(BUILD_DATE)
1291*fcf3ce44SJohn Forte #if defined(WIN32)
1292*fcf3ce44SJohn Forte {
1293*fcf3ce44SJohn Forte int matchCount;
1294*fcf3ce44SJohn Forte matchCount = sscanf(BUILD_DATE, "%u/%u/%u %u:%u:%u",
1295*fcf3ce44SJohn Forte &attributes->build_date.tm_year,
1296*fcf3ce44SJohn Forte &attributes->build_date.tm_mon,
1297*fcf3ce44SJohn Forte &attributes->build_date.tm_mday,
1298*fcf3ce44SJohn Forte &attributes->build_date.tm_hour,
1299*fcf3ce44SJohn Forte &attributes->build_date.tm_min,
1300*fcf3ce44SJohn Forte &attributes->build_date.tm_sec
1301*fcf3ce44SJohn Forte );
1302*fcf3ce44SJohn Forte
1303*fcf3ce44SJohn Forte if ( matchCount != 6 ) {
1304*fcf3ce44SJohn Forte memset(&attributes->build_date, 0, sizeof(struct tm));
1305*fcf3ce44SJohn Forte } else {
1306*fcf3ce44SJohn Forte attributes->build_date.tm_year -= 1900;
1307*fcf3ce44SJohn Forte attributes->build_date.tm_isdst = -1;
1308*fcf3ce44SJohn Forte }
1309*fcf3ce44SJohn Forte
1310*fcf3ce44SJohn Forte }
1311*fcf3ce44SJohn Forte #else
1312*fcf3ce44SJohn Forte if(strptime(BUILD_DATE, "%Y/%m/%d %T %Z", &(attributes->build_date)) == NULL) {
1313*fcf3ce44SJohn Forte memset(&attributes->build_date, 0, sizeof(struct tm));
1314*fcf3ce44SJohn Forte }
1315*fcf3ce44SJohn Forte #endif
1316*fcf3ce44SJohn Forte #else
1317*fcf3ce44SJohn Forte memset(&attributes->build_date, 0, sizeof(struct tm));
1318*fcf3ce44SJohn Forte #endif
1319*fcf3ce44SJohn Forte return 2;
1320*fcf3ce44SJohn Forte }
1321*fcf3ce44SJohn Forte
1322*fcf3ce44SJohn Forte /*
1323*fcf3ce44SJohn Forte * Callback registation and handling
1324*fcf3ce44SJohn Forte */
1325*fcf3ce44SJohn Forte HBA_STATUS
HBA_RemoveCallback(HBA_CALLBACKHANDLE cbhandle)1326*fcf3ce44SJohn Forte HBA_RemoveCallback (HBA_CALLBACKHANDLE cbhandle) {
1327*fcf3ce44SJohn Forte HBA_STATUS status;
1328*fcf3ce44SJohn Forte
1329*fcf3ce44SJohn Forte DEBUG(2, "HBA_RemoveCallback", 0, 0, 0);
1330*fcf3ce44SJohn Forte ARE_WE_INITED();
1331*fcf3ce44SJohn Forte
1332*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_LL_mutex);
1333*fcf3ce44SJohn Forte status = local_remove_callback(cbhandle);
1334*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
1335*fcf3ce44SJohn Forte }
1336*fcf3ce44SJohn Forte
1337*fcf3ce44SJohn Forte /* Adapter Add Events *********************************************************/
1338*fcf3ce44SJohn Forte static void
adapteraddevents_callback(void * data,HBA_WWN PortWWN,HBA_UINT32 eventType)1339*fcf3ce44SJohn Forte adapteraddevents_callback (void *data, HBA_WWN PortWWN, HBA_UINT32 eventType) {
1340*fcf3ce44SJohn Forte HBA_ALLADAPTERSCALLBACK_ELEM *cbp;
1341*fcf3ce44SJohn Forte
1342*fcf3ce44SJohn Forte DEBUG(3, "AddAdapterEvent, port:%s", WWN2STR1(&PortWWN), 0, 0);
1343*fcf3ce44SJohn Forte
1344*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_AAE_mutex);
1345*fcf3ce44SJohn Forte for(cbp = _hbaapi_adapteraddevents_callback_list;
1346*fcf3ce44SJohn Forte cbp != NULL;
1347*fcf3ce44SJohn Forte cbp = cbp->next) {
1348*fcf3ce44SJohn Forte (*cbp->callback)(data, PortWWN, HBA_EVENT_ADAPTER_ADD);
1349*fcf3ce44SJohn Forte }
1350*fcf3ce44SJohn Forte RELEASE_MUTEX(&_hbaapi_AAE_mutex);
1351*fcf3ce44SJohn Forte
1352*fcf3ce44SJohn Forte }
1353*fcf3ce44SJohn Forte HBA_STATUS
HBA_RegisterForAdapterAddEvents(void (* callback)(void * data,HBA_WWN PortWWN,HBA_UINT32 eventType),void * userData,HBA_CALLBACKHANDLE * callbackHandle)1354*fcf3ce44SJohn Forte HBA_RegisterForAdapterAddEvents (
1355*fcf3ce44SJohn Forte void (*callback) (
1356*fcf3ce44SJohn Forte void *data,
1357*fcf3ce44SJohn Forte HBA_WWN PortWWN,
1358*fcf3ce44SJohn Forte HBA_UINT32 eventType
1359*fcf3ce44SJohn Forte ),
1360*fcf3ce44SJohn Forte void *userData,
1361*fcf3ce44SJohn Forte HBA_CALLBACKHANDLE *callbackHandle) {
1362*fcf3ce44SJohn Forte
1363*fcf3ce44SJohn Forte HBA_ALLADAPTERSCALLBACK_ELEM *cbp;
1364*fcf3ce44SJohn Forte HBA_VENDORCALLBACK_ELEM *vcbp;
1365*fcf3ce44SJohn Forte HBA_VENDORCALLBACK_ELEM *vendorhandlelist;
1366*fcf3ce44SJohn Forte HBARegisterForAdapterAddEventsFunc registeredfunc;
1367*fcf3ce44SJohn Forte HBA_STATUS status = HBA_STATUS_OK;
1368*fcf3ce44SJohn Forte HBA_STATUS failure = HBA_STATUS_OK;
1369*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
1370*fcf3ce44SJohn Forte int registered_cnt = 0;
1371*fcf3ce44SJohn Forte int vendor_cnt = 0;
1372*fcf3ce44SJohn Forte int not_supported_cnt = 0;
1373*fcf3ce44SJohn Forte int status_OK_bar_cnt = 0;
1374*fcf3ce44SJohn Forte int status_OK_cnt = 0;
1375*fcf3ce44SJohn Forte
1376*fcf3ce44SJohn Forte DEBUG(2, "HBA_RegisterForAdapterAddEvents", 0, 0, 0);
1377*fcf3ce44SJohn Forte
1378*fcf3ce44SJohn Forte if (callbackHandle == NULL) {
1379*fcf3ce44SJohn Forte return(HBA_STATUS_ERROR_ARG);
1380*fcf3ce44SJohn Forte }
1381*fcf3ce44SJohn Forte ARE_WE_INITED();
1382*fcf3ce44SJohn Forte
1383*fcf3ce44SJohn Forte cbp = (HBA_ALLADAPTERSCALLBACK_ELEM *)
1384*fcf3ce44SJohn Forte calloc(1, sizeof(HBA_ALLADAPTERSCALLBACK_ELEM));
1385*fcf3ce44SJohn Forte *callbackHandle = (HBA_CALLBACKHANDLE) cbp;
1386*fcf3ce44SJohn Forte if(cbp == NULL) {
1387*fcf3ce44SJohn Forte #ifndef WIN32
1388*fcf3ce44SJohn Forte fprintf(stderr,
1389*fcf3ce44SJohn Forte "HBA_RegisterForAdapterAddEvents: calloc failed for %d bytes\n",
1390*fcf3ce44SJohn Forte sizeof(HBA_ALLADAPTERSCALLBACK_ELEM));
1391*fcf3ce44SJohn Forte #endif
1392*fcf3ce44SJohn Forte return HBA_STATUS_ERROR;
1393*fcf3ce44SJohn Forte }
1394*fcf3ce44SJohn Forte
1395*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_LL_mutex);
1396*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_AAE_mutex);
1397*fcf3ce44SJohn Forte cbp->callback = callback;
1398*fcf3ce44SJohn Forte cbp->next = _hbaapi_adapteraddevents_callback_list;
1399*fcf3ce44SJohn Forte _hbaapi_adapteraddevents_callback_list = cbp;
1400*fcf3ce44SJohn Forte /* Need to release the mutex now incase the vendor function invokes the
1401*fcf3ce44SJohn Forte * callback. We will grap the mutex later to attach the vendor handle list
1402*fcf3ce44SJohn Forte * to the callback structure */
1403*fcf3ce44SJohn Forte RELEASE_MUTEX(&_hbaapi_AAE_mutex);
1404*fcf3ce44SJohn Forte
1405*fcf3ce44SJohn Forte
1406*fcf3ce44SJohn Forte /*
1407*fcf3ce44SJohn Forte * now create a list of vendors (vendor libraryies, NOT ADAPTERS) that have
1408*fcf3ce44SJohn Forte * successfully registerred
1409*fcf3ce44SJohn Forte */
1410*fcf3ce44SJohn Forte vendorhandlelist = NULL;
1411*fcf3ce44SJohn Forte for(lib_infop = _hbaapi_librarylist;
1412*fcf3ce44SJohn Forte lib_infop != NULL;
1413*fcf3ce44SJohn Forte lib_infop = lib_infop->next) {
1414*fcf3ce44SJohn Forte
1415*fcf3ce44SJohn Forte vendor_cnt++;
1416*fcf3ce44SJohn Forte
1417*fcf3ce44SJohn Forte registeredfunc =
1418*fcf3ce44SJohn Forte lib_infop->functionTable.RegisterForAdapterAddEventsHandler;
1419*fcf3ce44SJohn Forte if(registeredfunc == NULL) {
1420*fcf3ce44SJohn Forte continue;
1421*fcf3ce44SJohn Forte }
1422*fcf3ce44SJohn Forte
1423*fcf3ce44SJohn Forte vcbp = (HBA_VENDORCALLBACK_ELEM *)
1424*fcf3ce44SJohn Forte calloc(1, sizeof(HBA_VENDORCALLBACK_ELEM));
1425*fcf3ce44SJohn Forte if(vcbp == NULL) {
1426*fcf3ce44SJohn Forte #ifndef WIN32
1427*fcf3ce44SJohn Forte fprintf(stderr,
1428*fcf3ce44SJohn Forte "HBA_RegisterForAdapterAddEvents: "
1429*fcf3ce44SJohn Forte "calloc failed for %d bytes\n",
1430*fcf3ce44SJohn Forte sizeof(HBA_VENDORCALLBACK_ELEM));
1431*fcf3ce44SJohn Forte #endif
1432*fcf3ce44SJohn Forte freevendorhandlelist(vendorhandlelist);
1433*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR;
1434*fcf3ce44SJohn Forte break;
1435*fcf3ce44SJohn Forte }
1436*fcf3ce44SJohn Forte
1437*fcf3ce44SJohn Forte registered_cnt++;
1438*fcf3ce44SJohn Forte status = (registeredfunc)(adapteraddevents_callback,
1439*fcf3ce44SJohn Forte userData, &vcbp->vendorcbhandle);
1440*fcf3ce44SJohn Forte if(status == HBA_STATUS_ERROR_NOT_SUPPORTED) {
1441*fcf3ce44SJohn Forte not_supported_cnt++;
1442*fcf3ce44SJohn Forte free(vcbp);
1443*fcf3ce44SJohn Forte continue;
1444*fcf3ce44SJohn Forte } else if (status != HBA_STATUS_OK) {
1445*fcf3ce44SJohn Forte status_OK_bar_cnt++;
1446*fcf3ce44SJohn Forte DEBUG(0,
1447*fcf3ce44SJohn Forte "HBA_RegisterForAdapterAddEvents: Library->%s, Error->%d",
1448*fcf3ce44SJohn Forte lib_infop->LibraryPath, status, 0);
1449*fcf3ce44SJohn Forte #ifndef WIN32
1450*fcf3ce44SJohn Forte fprintf(stderr,
1451*fcf3ce44SJohn Forte "HBA_RegisterForAdapterAddEvents: Library->%s, Error->%d",
1452*fcf3ce44SJohn Forte lib_infop->LibraryPath, status);
1453*fcf3ce44SJohn Forte #endif
1454*fcf3ce44SJohn Forte failure = status;
1455*fcf3ce44SJohn Forte free(vcbp);
1456*fcf3ce44SJohn Forte continue;
1457*fcf3ce44SJohn Forte } else {
1458*fcf3ce44SJohn Forte status_OK_cnt++;
1459*fcf3ce44SJohn Forte }
1460*fcf3ce44SJohn Forte vcbp->lib_info = lib_infop;
1461*fcf3ce44SJohn Forte vcbp->next = vendorhandlelist;
1462*fcf3ce44SJohn Forte vendorhandlelist = vcbp;
1463*fcf3ce44SJohn Forte }
1464*fcf3ce44SJohn Forte if(registered_cnt == 0) {
1465*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
1466*fcf3ce44SJohn Forte freevendorhandlelist(vendorhandlelist);
1467*fcf3ce44SJohn Forte local_remove_callback((HBA_CALLBACKHANDLE) cbp);
1468*fcf3ce44SJohn Forte } else if (status_OK_cnt == 0 && not_supported_cnt != 0) {
1469*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
1470*fcf3ce44SJohn Forte } else if (status_OK_cnt == 0) {
1471*fcf3ce44SJohn Forte /* At least one vendor library registered this function, but no
1472*fcf3ce44SJohn Forte * vendor call succeeded */
1473*fcf3ce44SJohn Forte local_remove_callback((HBA_CALLBACKHANDLE) cbp);
1474*fcf3ce44SJohn Forte status = failure;
1475*fcf3ce44SJohn Forte } else {
1476*fcf3ce44SJohn Forte /* we have had atleast some success, now finish up */
1477*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_AAE_mutex);
1478*fcf3ce44SJohn Forte /* this seems silly, but what if another thread called
1479*fcf3ce44SJohn Forte * the callback remove */
1480*fcf3ce44SJohn Forte for(cbp = _hbaapi_adapteraddevents_callback_list;
1481*fcf3ce44SJohn Forte cbp != NULL; cbp = cbp->next) {
1482*fcf3ce44SJohn Forte if((HBA_CALLBACKHANDLE)cbp == *callbackHandle) {
1483*fcf3ce44SJohn Forte /* yup, its still there, hooray */
1484*fcf3ce44SJohn Forte cbp->vendorhandlelist = vendorhandlelist;
1485*fcf3ce44SJohn Forte vendorhandlelist = NULL;
1486*fcf3ce44SJohn Forte break;
1487*fcf3ce44SJohn Forte }
1488*fcf3ce44SJohn Forte }
1489*fcf3ce44SJohn Forte RELEASE_MUTEX(&_hbaapi_AAE_mutex);
1490*fcf3ce44SJohn Forte if(vendorhandlelist != NULL) {
1491*fcf3ce44SJohn Forte /* bummer, somebody removed the callback before we finished
1492*fcf3ce44SJohn Forte * registration, probably will never happen */
1493*fcf3ce44SJohn Forte freevendorhandlelist(vendorhandlelist);
1494*fcf3ce44SJohn Forte DEBUG(0,
1495*fcf3ce44SJohn Forte "HBA_RegisterForAdapterAddEvents: HBA_RemoveCallback was "
1496*fcf3ce44SJohn Forte "called for a handle before registration was finished.",
1497*fcf3ce44SJohn Forte 0, 0, 0);
1498*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR;
1499*fcf3ce44SJohn Forte } else {
1500*fcf3ce44SJohn Forte status = HBA_STATUS_OK;
1501*fcf3ce44SJohn Forte }
1502*fcf3ce44SJohn Forte }
1503*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
1504*fcf3ce44SJohn Forte }
1505*fcf3ce44SJohn Forte
1506*fcf3ce44SJohn Forte /* Adapter Events (other than add) ********************************************/
1507*fcf3ce44SJohn Forte static void
adapterevents_callback(void * data,HBA_WWN PortWWN,HBA_UINT32 eventType)1508*fcf3ce44SJohn Forte adapterevents_callback (void *data,
1509*fcf3ce44SJohn Forte HBA_WWN PortWWN,
1510*fcf3ce44SJohn Forte HBA_UINT32 eventType) {
1511*fcf3ce44SJohn Forte HBA_ADAPTERCALLBACK_ELEM *acbp;
1512*fcf3ce44SJohn Forte
1513*fcf3ce44SJohn Forte DEBUG(3, "AdapterEvent, port:%s, eventType:%d", WWN2STR1(&PortWWN),
1514*fcf3ce44SJohn Forte eventType, 0);
1515*fcf3ce44SJohn Forte
1516*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_AE_mutex);
1517*fcf3ce44SJohn Forte for(acbp = _hbaapi_adapterevents_callback_list;
1518*fcf3ce44SJohn Forte acbp != NULL;
1519*fcf3ce44SJohn Forte acbp = acbp->next) {
1520*fcf3ce44SJohn Forte if(data == (void *)acbp) {
1521*fcf3ce44SJohn Forte (*acbp->callback)(acbp->userdata, PortWWN, eventType);
1522*fcf3ce44SJohn Forte break;
1523*fcf3ce44SJohn Forte }
1524*fcf3ce44SJohn Forte }
1525*fcf3ce44SJohn Forte RELEASE_MUTEX(&_hbaapi_AE_mutex);
1526*fcf3ce44SJohn Forte }
1527*fcf3ce44SJohn Forte HBA_STATUS
HBA_RegisterForAdapterEvents(void (* callback)(void * data,HBA_WWN PortWWN,HBA_UINT32 eventType),void * userData,HBA_HANDLE handle,HBA_CALLBACKHANDLE * callbackHandle)1528*fcf3ce44SJohn Forte HBA_RegisterForAdapterEvents (
1529*fcf3ce44SJohn Forte void (*callback) (
1530*fcf3ce44SJohn Forte void *data,
1531*fcf3ce44SJohn Forte HBA_WWN PortWWN,
1532*fcf3ce44SJohn Forte HBA_UINT32 eventType
1533*fcf3ce44SJohn Forte ),
1534*fcf3ce44SJohn Forte void *userData,
1535*fcf3ce44SJohn Forte HBA_HANDLE handle,
1536*fcf3ce44SJohn Forte HBA_CALLBACKHANDLE *callbackHandle) {
1537*fcf3ce44SJohn Forte
1538*fcf3ce44SJohn Forte HBA_ADAPTERCALLBACK_ELEM *acbp;
1539*fcf3ce44SJohn Forte HBARegisterForAdapterEventsFunc registeredfunc;
1540*fcf3ce44SJohn Forte HBA_STATUS status;
1541*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
1542*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
1543*fcf3ce44SJohn Forte
1544*fcf3ce44SJohn Forte DEBUG(2, "HBA_RegisterForAdapterEvents", 0, 0, 0);
1545*fcf3ce44SJohn Forte
1546*fcf3ce44SJohn Forte if (callbackHandle == NULL) {
1547*fcf3ce44SJohn Forte return(HBA_STATUS_ERROR_ARG);
1548*fcf3ce44SJohn Forte }
1549*fcf3ce44SJohn Forte
1550*fcf3ce44SJohn Forte CHECKLIBRARY();
1551*fcf3ce44SJohn Forte
1552*fcf3ce44SJohn Forte /* we now have the _hbaapi_LL_mutex */
1553*fcf3ce44SJohn Forte
1554*fcf3ce44SJohn Forte registeredfunc = lib_infop->functionTable.RegisterForAdapterEventsHandler;
1555*fcf3ce44SJohn Forte if(registeredfunc == NULL) {
1556*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_NOT_SUPPORTED);
1557*fcf3ce44SJohn Forte }
1558*fcf3ce44SJohn Forte
1559*fcf3ce44SJohn Forte /*
1560*fcf3ce44SJohn Forte * that allocated memory is used both as the handle for the
1561*fcf3ce44SJohn Forte * caller, and as userdata to the vendor call so that on
1562*fcf3ce44SJohn Forte * callback the specific registration may be recalled
1563*fcf3ce44SJohn Forte */
1564*fcf3ce44SJohn Forte acbp = (HBA_ADAPTERCALLBACK_ELEM *)
1565*fcf3ce44SJohn Forte calloc(1, sizeof(HBA_ADAPTERCALLBACK_ELEM));
1566*fcf3ce44SJohn Forte if(acbp == NULL) {
1567*fcf3ce44SJohn Forte #ifndef WIN32
1568*fcf3ce44SJohn Forte fprintf(stderr,
1569*fcf3ce44SJohn Forte "HBA_RegisterForAdapterEvents: calloc failed for %d bytes\n",
1570*fcf3ce44SJohn Forte sizeof(HBA_ADAPTERCALLBACK_ELEM));
1571*fcf3ce44SJohn Forte #endif
1572*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR);
1573*fcf3ce44SJohn Forte }
1574*fcf3ce44SJohn Forte *callbackHandle = (HBA_CALLBACKHANDLE) acbp;
1575*fcf3ce44SJohn Forte acbp->callback = callback;
1576*fcf3ce44SJohn Forte acbp->userdata = userData;
1577*fcf3ce44SJohn Forte acbp->lib_info = lib_infop;
1578*fcf3ce44SJohn Forte
1579*fcf3ce44SJohn Forte status = (registeredfunc)(adapterevents_callback,
1580*fcf3ce44SJohn Forte (void *)acbp,
1581*fcf3ce44SJohn Forte vendorHandle,
1582*fcf3ce44SJohn Forte &acbp->vendorcbhandle);
1583*fcf3ce44SJohn Forte if(status != HBA_STATUS_OK) {
1584*fcf3ce44SJohn Forte free(acbp);
1585*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
1586*fcf3ce44SJohn Forte }
1587*fcf3ce44SJohn Forte
1588*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_AE_mutex);
1589*fcf3ce44SJohn Forte acbp->next = _hbaapi_adapterevents_callback_list;
1590*fcf3ce44SJohn Forte _hbaapi_adapterevents_callback_list = acbp;
1591*fcf3ce44SJohn Forte RELEASE_MUTEX(&_hbaapi_AE_mutex);
1592*fcf3ce44SJohn Forte
1593*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_OK);
1594*fcf3ce44SJohn Forte }
1595*fcf3ce44SJohn Forte
1596*fcf3ce44SJohn Forte /* Adapter Port Events ********************************************************/
1597*fcf3ce44SJohn Forte static void
adapterportevents_callback(void * data,HBA_WWN PortWWN,HBA_UINT32 eventType,HBA_UINT32 fabricPortID)1598*fcf3ce44SJohn Forte adapterportevents_callback (void *data,
1599*fcf3ce44SJohn Forte HBA_WWN PortWWN,
1600*fcf3ce44SJohn Forte HBA_UINT32 eventType,
1601*fcf3ce44SJohn Forte HBA_UINT32 fabricPortID) {
1602*fcf3ce44SJohn Forte HBA_ADAPTERCALLBACK_ELEM *acbp;
1603*fcf3ce44SJohn Forte
1604*fcf3ce44SJohn Forte DEBUG(3, "AdapterPortEvent, port:%s, eventType:%d fabricPortID:0X%06x",
1605*fcf3ce44SJohn Forte WWN2STR1(&PortWWN), eventType, fabricPortID);
1606*fcf3ce44SJohn Forte
1607*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_APE_mutex);
1608*fcf3ce44SJohn Forte
1609*fcf3ce44SJohn Forte for(acbp = _hbaapi_adapterportevents_callback_list;
1610*fcf3ce44SJohn Forte acbp != NULL;
1611*fcf3ce44SJohn Forte acbp = acbp->next) {
1612*fcf3ce44SJohn Forte if(data == (void *)acbp) {
1613*fcf3ce44SJohn Forte (*acbp->callback)(acbp->userdata, PortWWN, eventType, fabricPortID);
1614*fcf3ce44SJohn Forte break;
1615*fcf3ce44SJohn Forte }
1616*fcf3ce44SJohn Forte }
1617*fcf3ce44SJohn Forte RELEASE_MUTEX(&_hbaapi_APE_mutex);
1618*fcf3ce44SJohn Forte }
1619*fcf3ce44SJohn Forte HBA_STATUS
HBA_RegisterForAdapterPortEvents(void (* callback)(void * data,HBA_WWN PortWWN,HBA_UINT32 eventType,HBA_UINT32 fabricPortID),void * userData,HBA_HANDLE handle,HBA_WWN PortWWN,HBA_CALLBACKHANDLE * callbackHandle)1620*fcf3ce44SJohn Forte HBA_RegisterForAdapterPortEvents (
1621*fcf3ce44SJohn Forte void (*callback) (
1622*fcf3ce44SJohn Forte void *data,
1623*fcf3ce44SJohn Forte HBA_WWN PortWWN,
1624*fcf3ce44SJohn Forte HBA_UINT32 eventType,
1625*fcf3ce44SJohn Forte HBA_UINT32 fabricPortID
1626*fcf3ce44SJohn Forte ),
1627*fcf3ce44SJohn Forte void *userData,
1628*fcf3ce44SJohn Forte HBA_HANDLE handle,
1629*fcf3ce44SJohn Forte HBA_WWN PortWWN,
1630*fcf3ce44SJohn Forte HBA_CALLBACKHANDLE *callbackHandle) {
1631*fcf3ce44SJohn Forte
1632*fcf3ce44SJohn Forte HBA_ADAPTERCALLBACK_ELEM *acbp;
1633*fcf3ce44SJohn Forte HBARegisterForAdapterPortEventsFunc registeredfunc;
1634*fcf3ce44SJohn Forte HBA_STATUS status;
1635*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
1636*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
1637*fcf3ce44SJohn Forte
1638*fcf3ce44SJohn Forte DEBUG(2, "HBA_RegisterForAdapterPortEvents for port: %s",
1639*fcf3ce44SJohn Forte WWN2STR1(&PortWWN), 0, 0);
1640*fcf3ce44SJohn Forte
1641*fcf3ce44SJohn Forte if (callbackHandle == NULL) {
1642*fcf3ce44SJohn Forte return(HBA_STATUS_ERROR_ARG);
1643*fcf3ce44SJohn Forte }
1644*fcf3ce44SJohn Forte
1645*fcf3ce44SJohn Forte CHECKLIBRARY();
1646*fcf3ce44SJohn Forte /* we now have the _hbaapi_LL_mutex */
1647*fcf3ce44SJohn Forte
1648*fcf3ce44SJohn Forte registeredfunc =
1649*fcf3ce44SJohn Forte lib_infop->functionTable.RegisterForAdapterPortEventsHandler;
1650*fcf3ce44SJohn Forte if(registeredfunc == NULL) {
1651*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_NOT_SUPPORTED);
1652*fcf3ce44SJohn Forte }
1653*fcf3ce44SJohn Forte
1654*fcf3ce44SJohn Forte /*
1655*fcf3ce44SJohn Forte * that allocated memory is used both as the handle for the
1656*fcf3ce44SJohn Forte * caller, and as userdata to the vendor call so that on
1657*fcf3ce44SJohn Forte * callback the specific registration may be recalled
1658*fcf3ce44SJohn Forte */
1659*fcf3ce44SJohn Forte acbp = (HBA_ADAPTERCALLBACK_ELEM *)
1660*fcf3ce44SJohn Forte calloc(1, sizeof(HBA_ADAPTERCALLBACK_ELEM));
1661*fcf3ce44SJohn Forte if(acbp == NULL) {
1662*fcf3ce44SJohn Forte #ifndef WIN32
1663*fcf3ce44SJohn Forte fprintf(stderr,
1664*fcf3ce44SJohn Forte "HBA_RegisterForAdapterPortEvents: "
1665*fcf3ce44SJohn Forte "calloc failed for %d bytes\n",
1666*fcf3ce44SJohn Forte sizeof(HBA_ADAPTERCALLBACK_ELEM));
1667*fcf3ce44SJohn Forte #endif
1668*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR);
1669*fcf3ce44SJohn Forte
1670*fcf3ce44SJohn Forte }
1671*fcf3ce44SJohn Forte *callbackHandle = (HBA_CALLBACKHANDLE) acbp;
1672*fcf3ce44SJohn Forte acbp->callback = callback;
1673*fcf3ce44SJohn Forte acbp->userdata = userData;
1674*fcf3ce44SJohn Forte acbp->lib_info = lib_infop;
1675*fcf3ce44SJohn Forte
1676*fcf3ce44SJohn Forte status = (registeredfunc)(adapterportevents_callback,
1677*fcf3ce44SJohn Forte (void *)acbp,
1678*fcf3ce44SJohn Forte vendorHandle,
1679*fcf3ce44SJohn Forte PortWWN,
1680*fcf3ce44SJohn Forte &acbp->vendorcbhandle);
1681*fcf3ce44SJohn Forte if(status != HBA_STATUS_OK) {
1682*fcf3ce44SJohn Forte free(acbp);
1683*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
1684*fcf3ce44SJohn Forte }
1685*fcf3ce44SJohn Forte
1686*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_APE_mutex);
1687*fcf3ce44SJohn Forte acbp->next = _hbaapi_adapterportevents_callback_list;
1688*fcf3ce44SJohn Forte _hbaapi_adapterportevents_callback_list = acbp;
1689*fcf3ce44SJohn Forte RELEASE_MUTEX(&_hbaapi_APE_mutex);
1690*fcf3ce44SJohn Forte
1691*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_OK);
1692*fcf3ce44SJohn Forte }
1693*fcf3ce44SJohn Forte
1694*fcf3ce44SJohn Forte /* Adapter State Events *******************************************************/
1695*fcf3ce44SJohn Forte static void
adapterportstatevents_callback(void * data,HBA_WWN PortWWN,HBA_UINT32 eventType)1696*fcf3ce44SJohn Forte adapterportstatevents_callback (void *data,
1697*fcf3ce44SJohn Forte HBA_WWN PortWWN,
1698*fcf3ce44SJohn Forte HBA_UINT32 eventType) {
1699*fcf3ce44SJohn Forte HBA_ADAPTERCALLBACK_ELEM *acbp;
1700*fcf3ce44SJohn Forte
1701*fcf3ce44SJohn Forte DEBUG(3, "AdapterPortStateEvent, port:%s, eventType:%d", WWN2STR1(&PortWWN),
1702*fcf3ce44SJohn Forte eventType, 0);
1703*fcf3ce44SJohn Forte
1704*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_APSE_mutex);
1705*fcf3ce44SJohn Forte for(acbp = _hbaapi_adapterportstatevents_callback_list;
1706*fcf3ce44SJohn Forte acbp != NULL;
1707*fcf3ce44SJohn Forte acbp = acbp->next) {
1708*fcf3ce44SJohn Forte if(data == (void *)acbp) {
1709*fcf3ce44SJohn Forte (*acbp->callback)(acbp->userdata, PortWWN, eventType);
1710*fcf3ce44SJohn Forte return;
1711*fcf3ce44SJohn Forte }
1712*fcf3ce44SJohn Forte }
1713*fcf3ce44SJohn Forte }
1714*fcf3ce44SJohn Forte HBA_STATUS
HBA_RegisterForAdapterPortStatEvents(void (* callback)(void * data,HBA_WWN PortWWN,HBA_UINT32 eventType),void * userData,HBA_HANDLE handle,HBA_WWN PortWWN,HBA_PORTSTATISTICS stats,HBA_UINT32 statType,HBA_CALLBACKHANDLE * callbackHandle)1715*fcf3ce44SJohn Forte HBA_RegisterForAdapterPortStatEvents (
1716*fcf3ce44SJohn Forte void (*callback) (
1717*fcf3ce44SJohn Forte void *data,
1718*fcf3ce44SJohn Forte HBA_WWN PortWWN,
1719*fcf3ce44SJohn Forte HBA_UINT32 eventType
1720*fcf3ce44SJohn Forte ),
1721*fcf3ce44SJohn Forte void *userData,
1722*fcf3ce44SJohn Forte HBA_HANDLE handle,
1723*fcf3ce44SJohn Forte HBA_WWN PortWWN,
1724*fcf3ce44SJohn Forte HBA_PORTSTATISTICS stats,
1725*fcf3ce44SJohn Forte HBA_UINT32 statType,
1726*fcf3ce44SJohn Forte HBA_CALLBACKHANDLE *callbackHandle) {
1727*fcf3ce44SJohn Forte
1728*fcf3ce44SJohn Forte HBA_ADAPTERCALLBACK_ELEM *acbp;
1729*fcf3ce44SJohn Forte HBARegisterForAdapterPortStatEventsFunc
1730*fcf3ce44SJohn Forte registeredfunc;
1731*fcf3ce44SJohn Forte HBA_STATUS status;
1732*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
1733*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
1734*fcf3ce44SJohn Forte
1735*fcf3ce44SJohn Forte DEBUG(2, "HBA_RegisterForAdapterPortStatEvents for port: %s",
1736*fcf3ce44SJohn Forte WWN2STR1(&PortWWN), 0, 0);
1737*fcf3ce44SJohn Forte
1738*fcf3ce44SJohn Forte if (callbackHandle == NULL) {
1739*fcf3ce44SJohn Forte return(HBA_STATUS_ERROR_ARG);
1740*fcf3ce44SJohn Forte }
1741*fcf3ce44SJohn Forte
1742*fcf3ce44SJohn Forte CHECKLIBRARY();
1743*fcf3ce44SJohn Forte /* we now have the _hbaapi_LL_mutex */
1744*fcf3ce44SJohn Forte
1745*fcf3ce44SJohn Forte registeredfunc =
1746*fcf3ce44SJohn Forte lib_infop->functionTable.RegisterForAdapterPortStatEventsHandler;
1747*fcf3ce44SJohn Forte if(registeredfunc == NULL) {
1748*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_NOT_SUPPORTED);
1749*fcf3ce44SJohn Forte }
1750*fcf3ce44SJohn Forte
1751*fcf3ce44SJohn Forte /*
1752*fcf3ce44SJohn Forte * that allocated memory is used both as the handle for the
1753*fcf3ce44SJohn Forte * caller, and as userdata to the vendor call so that on
1754*fcf3ce44SJohn Forte * callback the specific registration may be recalled
1755*fcf3ce44SJohn Forte */
1756*fcf3ce44SJohn Forte acbp = (HBA_ADAPTERCALLBACK_ELEM *)
1757*fcf3ce44SJohn Forte calloc(1, sizeof(HBA_ADAPTERCALLBACK_ELEM));
1758*fcf3ce44SJohn Forte if(acbp == NULL) {
1759*fcf3ce44SJohn Forte #ifndef WIN32
1760*fcf3ce44SJohn Forte fprintf(stderr,
1761*fcf3ce44SJohn Forte "HBA_RegisterForAdapterPortStatEvents: "
1762*fcf3ce44SJohn Forte "calloc failed for %d bytes\n",
1763*fcf3ce44SJohn Forte sizeof(HBA_ADAPTERCALLBACK_ELEM));
1764*fcf3ce44SJohn Forte #endif
1765*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR);
1766*fcf3ce44SJohn Forte }
1767*fcf3ce44SJohn Forte *callbackHandle = (HBA_CALLBACKHANDLE) acbp;
1768*fcf3ce44SJohn Forte acbp->callback = callback;
1769*fcf3ce44SJohn Forte acbp->userdata = userData;
1770*fcf3ce44SJohn Forte acbp->lib_info = lib_infop;
1771*fcf3ce44SJohn Forte
1772*fcf3ce44SJohn Forte status = (registeredfunc)(adapterportstatevents_callback,
1773*fcf3ce44SJohn Forte (void *)acbp,
1774*fcf3ce44SJohn Forte vendorHandle,
1775*fcf3ce44SJohn Forte PortWWN,
1776*fcf3ce44SJohn Forte stats,
1777*fcf3ce44SJohn Forte statType,
1778*fcf3ce44SJohn Forte &acbp->vendorcbhandle);
1779*fcf3ce44SJohn Forte if(status != HBA_STATUS_OK) {
1780*fcf3ce44SJohn Forte free(acbp);
1781*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
1782*fcf3ce44SJohn Forte }
1783*fcf3ce44SJohn Forte
1784*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_APSE_mutex);
1785*fcf3ce44SJohn Forte acbp->next = _hbaapi_adapterportstatevents_callback_list;
1786*fcf3ce44SJohn Forte _hbaapi_adapterportstatevents_callback_list = acbp;
1787*fcf3ce44SJohn Forte RELEASE_MUTEX(&_hbaapi_APSE_mutex);
1788*fcf3ce44SJohn Forte
1789*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_OK);
1790*fcf3ce44SJohn Forte }
1791*fcf3ce44SJohn Forte
1792*fcf3ce44SJohn Forte /* Target Events **************************************************************/
1793*fcf3ce44SJohn Forte static void
targetevents_callback(void * data,HBA_WWN hbaPortWWN,HBA_WWN discoveredPortWWN,HBA_UINT32 eventType)1794*fcf3ce44SJohn Forte targetevents_callback (void *data,
1795*fcf3ce44SJohn Forte HBA_WWN hbaPortWWN,
1796*fcf3ce44SJohn Forte HBA_WWN discoveredPortWWN,
1797*fcf3ce44SJohn Forte HBA_UINT32 eventType) {
1798*fcf3ce44SJohn Forte HBA_ADAPTERCALLBACK_ELEM *acbp;
1799*fcf3ce44SJohn Forte
1800*fcf3ce44SJohn Forte DEBUG(3, "TargetEvent, hbaPort:%s, discoveredPort:%s eventType:%d",
1801*fcf3ce44SJohn Forte WWN2STR1(&hbaPortWWN), WWN2STR2(&discoveredPortWWN), eventType);
1802*fcf3ce44SJohn Forte
1803*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_TE_mutex);
1804*fcf3ce44SJohn Forte for(acbp = _hbaapi_targetevents_callback_list;
1805*fcf3ce44SJohn Forte acbp != NULL;
1806*fcf3ce44SJohn Forte acbp = acbp->next) {
1807*fcf3ce44SJohn Forte if(data == (void *)acbp) {
1808*fcf3ce44SJohn Forte (*acbp->callback)(acbp->userdata, hbaPortWWN,
1809*fcf3ce44SJohn Forte discoveredPortWWN, eventType);
1810*fcf3ce44SJohn Forte break;
1811*fcf3ce44SJohn Forte }
1812*fcf3ce44SJohn Forte }
1813*fcf3ce44SJohn Forte RELEASE_MUTEX(&_hbaapi_TE_mutex);
1814*fcf3ce44SJohn Forte }
1815*fcf3ce44SJohn Forte HBA_STATUS
HBA_RegisterForTargetEvents(void (* callback)(void * data,HBA_WWN hbaPortWWN,HBA_WWN discoveredPortWWN,HBA_UINT32 eventType),void * userData,HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_WWN discoveredPortWWN,HBA_CALLBACKHANDLE * callbackHandle,HBA_UINT32 allTargets)1816*fcf3ce44SJohn Forte HBA_RegisterForTargetEvents (
1817*fcf3ce44SJohn Forte void (*callback) (
1818*fcf3ce44SJohn Forte void *data,
1819*fcf3ce44SJohn Forte HBA_WWN hbaPortWWN,
1820*fcf3ce44SJohn Forte HBA_WWN discoveredPortWWN,
1821*fcf3ce44SJohn Forte HBA_UINT32 eventType
1822*fcf3ce44SJohn Forte ),
1823*fcf3ce44SJohn Forte void *userData,
1824*fcf3ce44SJohn Forte HBA_HANDLE handle,
1825*fcf3ce44SJohn Forte HBA_WWN hbaPortWWN,
1826*fcf3ce44SJohn Forte HBA_WWN discoveredPortWWN,
1827*fcf3ce44SJohn Forte HBA_CALLBACKHANDLE *callbackHandle,
1828*fcf3ce44SJohn Forte HBA_UINT32 allTargets) {
1829*fcf3ce44SJohn Forte
1830*fcf3ce44SJohn Forte HBA_ADAPTERCALLBACK_ELEM
1831*fcf3ce44SJohn Forte *acbp;
1832*fcf3ce44SJohn Forte HBARegisterForTargetEventsFunc
1833*fcf3ce44SJohn Forte registeredfunc;
1834*fcf3ce44SJohn Forte HBA_STATUS status;
1835*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
1836*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
1837*fcf3ce44SJohn Forte
1838*fcf3ce44SJohn Forte DEBUG(2, "HBA_RegisterForTargetEvents, hbaPort: %s, discoveredPort: %s",
1839*fcf3ce44SJohn Forte WWN2STR1(&hbaPortWWN), WWN2STR2(&discoveredPortWWN), 0);
1840*fcf3ce44SJohn Forte
1841*fcf3ce44SJohn Forte if (callbackHandle == NULL) {
1842*fcf3ce44SJohn Forte return(HBA_STATUS_ERROR_ARG);
1843*fcf3ce44SJohn Forte }
1844*fcf3ce44SJohn Forte
1845*fcf3ce44SJohn Forte CHECKLIBRARY();
1846*fcf3ce44SJohn Forte /* we now have the _hbaapi_LL_mutex */
1847*fcf3ce44SJohn Forte
1848*fcf3ce44SJohn Forte registeredfunc = lib_infop->functionTable.RegisterForTargetEventsHandler;
1849*fcf3ce44SJohn Forte if(registeredfunc == NULL) {
1850*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_NOT_SUPPORTED);
1851*fcf3ce44SJohn Forte }
1852*fcf3ce44SJohn Forte
1853*fcf3ce44SJohn Forte /*
1854*fcf3ce44SJohn Forte * that allocated memory is used both as the handle for the
1855*fcf3ce44SJohn Forte * caller, and as userdata to the vendor call so that on
1856*fcf3ce44SJohn Forte * callback the specific registration may be recalled
1857*fcf3ce44SJohn Forte */
1858*fcf3ce44SJohn Forte acbp = (HBA_ADAPTERCALLBACK_ELEM *)
1859*fcf3ce44SJohn Forte calloc(1, sizeof(HBA_ADAPTERCALLBACK_ELEM));
1860*fcf3ce44SJohn Forte if(acbp == NULL) {
1861*fcf3ce44SJohn Forte #ifndef WIN32
1862*fcf3ce44SJohn Forte fprintf(stderr,
1863*fcf3ce44SJohn Forte "HBA_RegisterForTargetEvents: calloc failed for %d bytes\n",
1864*fcf3ce44SJohn Forte sizeof(HBA_ADAPTERCALLBACK_ELEM));
1865*fcf3ce44SJohn Forte #endif
1866*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR);
1867*fcf3ce44SJohn Forte }
1868*fcf3ce44SJohn Forte *callbackHandle = (HBA_CALLBACKHANDLE) acbp;
1869*fcf3ce44SJohn Forte acbp->callback = callback;
1870*fcf3ce44SJohn Forte acbp->userdata = userData;
1871*fcf3ce44SJohn Forte acbp->lib_info = lib_infop;
1872*fcf3ce44SJohn Forte
1873*fcf3ce44SJohn Forte status = (registeredfunc)(targetevents_callback,
1874*fcf3ce44SJohn Forte (void *)acbp,
1875*fcf3ce44SJohn Forte vendorHandle,
1876*fcf3ce44SJohn Forte hbaPortWWN,
1877*fcf3ce44SJohn Forte discoveredPortWWN,
1878*fcf3ce44SJohn Forte &acbp->vendorcbhandle,
1879*fcf3ce44SJohn Forte allTargets);
1880*fcf3ce44SJohn Forte if(status != HBA_STATUS_OK) {
1881*fcf3ce44SJohn Forte free(acbp);
1882*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
1883*fcf3ce44SJohn Forte }
1884*fcf3ce44SJohn Forte
1885*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_TE_mutex);
1886*fcf3ce44SJohn Forte acbp->next = _hbaapi_targetevents_callback_list;
1887*fcf3ce44SJohn Forte _hbaapi_targetevents_callback_list = acbp;
1888*fcf3ce44SJohn Forte RELEASE_MUTEX(&_hbaapi_TE_mutex);
1889*fcf3ce44SJohn Forte
1890*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_OK);
1891*fcf3ce44SJohn Forte }
1892*fcf3ce44SJohn Forte
1893*fcf3ce44SJohn Forte /* Link Events ****************************************************************/
1894*fcf3ce44SJohn Forte static void
linkevents_callback(void * data,HBA_WWN adapterWWN,HBA_UINT32 eventType,void * pRLIRBuffer,HBA_UINT32 RLIRBufferSize)1895*fcf3ce44SJohn Forte linkevents_callback (void *data,
1896*fcf3ce44SJohn Forte HBA_WWN adapterWWN,
1897*fcf3ce44SJohn Forte HBA_UINT32 eventType,
1898*fcf3ce44SJohn Forte void *pRLIRBuffer,
1899*fcf3ce44SJohn Forte HBA_UINT32 RLIRBufferSize) {
1900*fcf3ce44SJohn Forte HBA_ADAPTERCALLBACK_ELEM *acbp;
1901*fcf3ce44SJohn Forte
1902*fcf3ce44SJohn Forte DEBUG(3, "LinkEvent, hbaWWN:%s, eventType:%d",
1903*fcf3ce44SJohn Forte WWN2STR1(&adapterWWN), eventType, 0);
1904*fcf3ce44SJohn Forte
1905*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_LE_mutex);
1906*fcf3ce44SJohn Forte for(acbp = _hbaapi_linkevents_callback_list;
1907*fcf3ce44SJohn Forte acbp != NULL;
1908*fcf3ce44SJohn Forte acbp = acbp->next) {
1909*fcf3ce44SJohn Forte if(data == (void *)acbp) {
1910*fcf3ce44SJohn Forte (*acbp->callback)(acbp->userdata, adapterWWN,
1911*fcf3ce44SJohn Forte eventType, pRLIRBuffer, RLIRBufferSize);
1912*fcf3ce44SJohn Forte break;
1913*fcf3ce44SJohn Forte }
1914*fcf3ce44SJohn Forte }
1915*fcf3ce44SJohn Forte RELEASE_MUTEX(&_hbaapi_LE_mutex);
1916*fcf3ce44SJohn Forte }
1917*fcf3ce44SJohn Forte HBA_STATUS
HBA_RegisterForLinkEvents(void (* callback)(void * data,HBA_WWN adapterWWN,HBA_UINT32 eventType,void * pRLIRBuffer,HBA_UINT32 RLIRBufferSize),void * userData,void * pRLIRBuffer,HBA_UINT32 RLIRBufferSize,HBA_HANDLE handle,HBA_CALLBACKHANDLE * callbackHandle)1918*fcf3ce44SJohn Forte HBA_RegisterForLinkEvents (
1919*fcf3ce44SJohn Forte void (*callback) (
1920*fcf3ce44SJohn Forte void *data,
1921*fcf3ce44SJohn Forte HBA_WWN adapterWWN,
1922*fcf3ce44SJohn Forte HBA_UINT32 eventType,
1923*fcf3ce44SJohn Forte void *pRLIRBuffer,
1924*fcf3ce44SJohn Forte HBA_UINT32 RLIRBufferSize),
1925*fcf3ce44SJohn Forte void *userData,
1926*fcf3ce44SJohn Forte void *pRLIRBuffer,
1927*fcf3ce44SJohn Forte HBA_UINT32 RLIRBufferSize,
1928*fcf3ce44SJohn Forte HBA_HANDLE handle,
1929*fcf3ce44SJohn Forte HBA_CALLBACKHANDLE *callbackHandle) {
1930*fcf3ce44SJohn Forte
1931*fcf3ce44SJohn Forte HBA_ADAPTERCALLBACK_ELEM *acbp;
1932*fcf3ce44SJohn Forte HBARegisterForLinkEventsFunc
1933*fcf3ce44SJohn Forte registeredfunc;
1934*fcf3ce44SJohn Forte HBA_STATUS status;
1935*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
1936*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
1937*fcf3ce44SJohn Forte
1938*fcf3ce44SJohn Forte DEBUG(2, "HBA_RegisterForLinkEvents", 0, 0, 0);
1939*fcf3ce44SJohn Forte
1940*fcf3ce44SJohn Forte if (callbackHandle == NULL) {
1941*fcf3ce44SJohn Forte return(HBA_STATUS_ERROR_ARG);
1942*fcf3ce44SJohn Forte }
1943*fcf3ce44SJohn Forte
1944*fcf3ce44SJohn Forte CHECKLIBRARY();
1945*fcf3ce44SJohn Forte /* we now have the _hbaapi_LL_mutex */
1946*fcf3ce44SJohn Forte
1947*fcf3ce44SJohn Forte registeredfunc = lib_infop->functionTable.RegisterForLinkEventsHandler;
1948*fcf3ce44SJohn Forte if(registeredfunc == NULL) {
1949*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_NOT_SUPPORTED);
1950*fcf3ce44SJohn Forte }
1951*fcf3ce44SJohn Forte
1952*fcf3ce44SJohn Forte /*
1953*fcf3ce44SJohn Forte * that allocated memory is used both as the handle for the
1954*fcf3ce44SJohn Forte * caller, and as userdata to the vendor call so that on
1955*fcf3ce44SJohn Forte * callback the specific registration may be recalled
1956*fcf3ce44SJohn Forte */
1957*fcf3ce44SJohn Forte acbp = (HBA_ADAPTERCALLBACK_ELEM *)
1958*fcf3ce44SJohn Forte calloc(1, sizeof(HBA_ADAPTERCALLBACK_ELEM));
1959*fcf3ce44SJohn Forte if(acbp == NULL) {
1960*fcf3ce44SJohn Forte #ifndef WIN32
1961*fcf3ce44SJohn Forte fprintf(stderr,
1962*fcf3ce44SJohn Forte "HBA_RegisterForLinkEvents: calloc failed for %d bytes\n",
1963*fcf3ce44SJohn Forte sizeof(HBA_ADAPTERCALLBACK_ELEM));
1964*fcf3ce44SJohn Forte #endif
1965*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR);
1966*fcf3ce44SJohn Forte }
1967*fcf3ce44SJohn Forte *callbackHandle = (HBA_CALLBACKHANDLE) acbp;
1968*fcf3ce44SJohn Forte acbp->callback = callback;
1969*fcf3ce44SJohn Forte acbp->userdata = userData;
1970*fcf3ce44SJohn Forte acbp->lib_info = lib_infop;
1971*fcf3ce44SJohn Forte
1972*fcf3ce44SJohn Forte status = (registeredfunc)(linkevents_callback,
1973*fcf3ce44SJohn Forte (void *)acbp,
1974*fcf3ce44SJohn Forte pRLIRBuffer,
1975*fcf3ce44SJohn Forte RLIRBufferSize,
1976*fcf3ce44SJohn Forte vendorHandle,
1977*fcf3ce44SJohn Forte &acbp->vendorcbhandle);
1978*fcf3ce44SJohn Forte if(status != HBA_STATUS_OK) {
1979*fcf3ce44SJohn Forte free(acbp);
1980*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
1981*fcf3ce44SJohn Forte }
1982*fcf3ce44SJohn Forte
1983*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_LE_mutex);
1984*fcf3ce44SJohn Forte acbp->next = _hbaapi_linkevents_callback_list;
1985*fcf3ce44SJohn Forte _hbaapi_linkevents_callback_list = acbp;
1986*fcf3ce44SJohn Forte RELEASE_MUTEX(&_hbaapi_LE_mutex);
1987*fcf3ce44SJohn Forte
1988*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_OK);
1989*fcf3ce44SJohn Forte }
1990*fcf3ce44SJohn Forte
1991*fcf3ce44SJohn Forte
1992*fcf3ce44SJohn Forte /*
1993*fcf3ce44SJohn Forte * All of the functions below are almost passthru functions to the
1994*fcf3ce44SJohn Forte * vendor specific function
1995*fcf3ce44SJohn Forte */
1996*fcf3ce44SJohn Forte
1997*fcf3ce44SJohn Forte void
HBA_CloseAdapter(HBA_HANDLE handle)1998*fcf3ce44SJohn Forte HBA_CloseAdapter(HBA_HANDLE handle) {
1999*fcf3ce44SJohn Forte HBA_STATUS status;
2000*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2001*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2002*fcf3ce44SJohn Forte HBACloseAdapterFunc CloseAdapterFunc;
2003*fcf3ce44SJohn Forte
2004*fcf3ce44SJohn Forte DEBUG(2, "HBA_CloseAdapter", 0, 0, 0);
2005*fcf3ce44SJohn Forte
2006*fcf3ce44SJohn Forte status = HBA_CheckLibrary(handle, &lib_infop, &vendorHandle);
2007*fcf3ce44SJohn Forte if (status == HBA_STATUS_OK) {
2008*fcf3ce44SJohn Forte CloseAdapterFunc = lib_infop->functionTable.CloseAdapterHandler;
2009*fcf3ce44SJohn Forte if (CloseAdapterFunc != NULL) {
2010*fcf3ce44SJohn Forte ((CloseAdapterFunc)(vendorHandle));
2011*fcf3ce44SJohn Forte }
2012*fcf3ce44SJohn Forte RELEASE_MUTEX(&_hbaapi_LL_mutex);
2013*fcf3ce44SJohn Forte }
2014*fcf3ce44SJohn Forte }
2015*fcf3ce44SJohn Forte
2016*fcf3ce44SJohn Forte HBA_STATUS
HBA_GetAdapterAttributes(HBA_HANDLE handle,HBA_ADAPTERATTRIBUTES * hbaattributes)2017*fcf3ce44SJohn Forte HBA_GetAdapterAttributes (
2018*fcf3ce44SJohn Forte HBA_HANDLE handle,
2019*fcf3ce44SJohn Forte HBA_ADAPTERATTRIBUTES
2020*fcf3ce44SJohn Forte *hbaattributes)
2021*fcf3ce44SJohn Forte {
2022*fcf3ce44SJohn Forte HBA_STATUS status;
2023*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2024*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2025*fcf3ce44SJohn Forte HBAGetAdapterAttributesFunc GetAdapterAttributesFunc;
2026*fcf3ce44SJohn Forte
2027*fcf3ce44SJohn Forte DEBUG(2, "HBA_GetAdapterAttributes", 0, 0, 0);
2028*fcf3ce44SJohn Forte
2029*fcf3ce44SJohn Forte CHECKLIBRARY();
2030*fcf3ce44SJohn Forte GetAdapterAttributesFunc =
2031*fcf3ce44SJohn Forte lib_infop->functionTable.GetAdapterAttributesHandler;
2032*fcf3ce44SJohn Forte if (GetAdapterAttributesFunc != NULL) {
2033*fcf3ce44SJohn Forte status = ((GetAdapterAttributesFunc)(vendorHandle, hbaattributes));
2034*fcf3ce44SJohn Forte } else {
2035*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2036*fcf3ce44SJohn Forte }
2037*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2038*fcf3ce44SJohn Forte }
2039*fcf3ce44SJohn Forte
2040*fcf3ce44SJohn Forte HBA_STATUS
HBA_GetAdapterPortAttributes(HBA_HANDLE handle,HBA_UINT32 portindex,HBA_PORTATTRIBUTES * portattributes)2041*fcf3ce44SJohn Forte HBA_GetAdapterPortAttributes (
2042*fcf3ce44SJohn Forte HBA_HANDLE handle,
2043*fcf3ce44SJohn Forte HBA_UINT32 portindex,
2044*fcf3ce44SJohn Forte HBA_PORTATTRIBUTES *portattributes)
2045*fcf3ce44SJohn Forte {
2046*fcf3ce44SJohn Forte HBA_STATUS status;
2047*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2048*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2049*fcf3ce44SJohn Forte HBAGetAdapterPortAttributesFunc
2050*fcf3ce44SJohn Forte GetAdapterPortAttributesFunc;
2051*fcf3ce44SJohn Forte
2052*fcf3ce44SJohn Forte DEBUG(2, "HBA_GetAdapterPortAttributes", 0, 0, 0);
2053*fcf3ce44SJohn Forte
2054*fcf3ce44SJohn Forte CHECKLIBRARY();
2055*fcf3ce44SJohn Forte GetAdapterPortAttributesFunc =
2056*fcf3ce44SJohn Forte lib_infop->functionTable.GetAdapterPortAttributesHandler;
2057*fcf3ce44SJohn Forte if (GetAdapterPortAttributesFunc != NULL) {
2058*fcf3ce44SJohn Forte status = ((GetAdapterPortAttributesFunc)
2059*fcf3ce44SJohn Forte (vendorHandle, portindex, portattributes));
2060*fcf3ce44SJohn Forte } else {
2061*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2062*fcf3ce44SJohn Forte }
2063*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2064*fcf3ce44SJohn Forte }
2065*fcf3ce44SJohn Forte
2066*fcf3ce44SJohn Forte HBA_STATUS
HBA_GetPortStatistics(HBA_HANDLE handle,HBA_UINT32 portindex,HBA_PORTSTATISTICS * portstatistics)2067*fcf3ce44SJohn Forte HBA_GetPortStatistics (
2068*fcf3ce44SJohn Forte HBA_HANDLE handle,
2069*fcf3ce44SJohn Forte HBA_UINT32 portindex,
2070*fcf3ce44SJohn Forte HBA_PORTSTATISTICS *portstatistics)
2071*fcf3ce44SJohn Forte {
2072*fcf3ce44SJohn Forte HBA_STATUS status;
2073*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2074*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2075*fcf3ce44SJohn Forte HBAGetPortStatisticsFunc
2076*fcf3ce44SJohn Forte GetPortStatisticsFunc;
2077*fcf3ce44SJohn Forte
2078*fcf3ce44SJohn Forte DEBUG(2, "HBA_GetPortStatistics", 0, 0, 0);
2079*fcf3ce44SJohn Forte
2080*fcf3ce44SJohn Forte CHECKLIBRARY();
2081*fcf3ce44SJohn Forte GetPortStatisticsFunc =
2082*fcf3ce44SJohn Forte lib_infop->functionTable.GetPortStatisticsHandler;
2083*fcf3ce44SJohn Forte if (GetPortStatisticsFunc != NULL) {
2084*fcf3ce44SJohn Forte status = ((GetPortStatisticsFunc)
2085*fcf3ce44SJohn Forte (vendorHandle, portindex, portstatistics));
2086*fcf3ce44SJohn Forte } else {
2087*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2088*fcf3ce44SJohn Forte }
2089*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2090*fcf3ce44SJohn Forte }
2091*fcf3ce44SJohn Forte
2092*fcf3ce44SJohn Forte HBA_STATUS
HBA_GetDiscoveredPortAttributes(HBA_HANDLE handle,HBA_UINT32 portindex,HBA_UINT32 discoveredportindex,HBA_PORTATTRIBUTES * portattributes)2093*fcf3ce44SJohn Forte HBA_GetDiscoveredPortAttributes (
2094*fcf3ce44SJohn Forte HBA_HANDLE handle,
2095*fcf3ce44SJohn Forte HBA_UINT32 portindex,
2096*fcf3ce44SJohn Forte HBA_UINT32 discoveredportindex,
2097*fcf3ce44SJohn Forte HBA_PORTATTRIBUTES *portattributes)
2098*fcf3ce44SJohn Forte {
2099*fcf3ce44SJohn Forte HBA_STATUS status;
2100*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2101*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2102*fcf3ce44SJohn Forte HBAGetDiscoveredPortAttributesFunc
2103*fcf3ce44SJohn Forte GetDiscoveredPortAttributesFunc;
2104*fcf3ce44SJohn Forte
2105*fcf3ce44SJohn Forte DEBUG(2, "HBA_GetDiscoveredPortAttributes", 0, 0, 0);
2106*fcf3ce44SJohn Forte
2107*fcf3ce44SJohn Forte CHECKLIBRARY();
2108*fcf3ce44SJohn Forte GetDiscoveredPortAttributesFunc =
2109*fcf3ce44SJohn Forte lib_infop->functionTable.GetDiscoveredPortAttributesHandler;
2110*fcf3ce44SJohn Forte if (GetDiscoveredPortAttributesFunc != NULL) {
2111*fcf3ce44SJohn Forte status = ((GetDiscoveredPortAttributesFunc)
2112*fcf3ce44SJohn Forte (vendorHandle, portindex, discoveredportindex,
2113*fcf3ce44SJohn Forte portattributes));
2114*fcf3ce44SJohn Forte } else {
2115*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2116*fcf3ce44SJohn Forte }
2117*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2118*fcf3ce44SJohn Forte }
2119*fcf3ce44SJohn Forte
2120*fcf3ce44SJohn Forte HBA_STATUS
HBA_GetPortAttributesByWWN(HBA_HANDLE handle,HBA_WWN PortWWN,HBA_PORTATTRIBUTES * portattributes)2121*fcf3ce44SJohn Forte HBA_GetPortAttributesByWWN (
2122*fcf3ce44SJohn Forte HBA_HANDLE handle,
2123*fcf3ce44SJohn Forte HBA_WWN PortWWN,
2124*fcf3ce44SJohn Forte HBA_PORTATTRIBUTES *portattributes)
2125*fcf3ce44SJohn Forte {
2126*fcf3ce44SJohn Forte HBA_STATUS status;
2127*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2128*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2129*fcf3ce44SJohn Forte HBAGetPortAttributesByWWNFunc
2130*fcf3ce44SJohn Forte GetPortAttributesByWWNFunc;
2131*fcf3ce44SJohn Forte
2132*fcf3ce44SJohn Forte DEBUG(2, "HBA_GetPortAttributesByWWN: %s", WWN2STR1(&PortWWN), 0, 0);
2133*fcf3ce44SJohn Forte
2134*fcf3ce44SJohn Forte CHECKLIBRARY();
2135*fcf3ce44SJohn Forte GetPortAttributesByWWNFunc =
2136*fcf3ce44SJohn Forte lib_infop->functionTable.GetPortAttributesByWWNHandler;
2137*fcf3ce44SJohn Forte if (GetPortAttributesByWWNFunc != NULL) {
2138*fcf3ce44SJohn Forte status = ((GetPortAttributesByWWNFunc)
2139*fcf3ce44SJohn Forte (vendorHandle, PortWWN, portattributes));
2140*fcf3ce44SJohn Forte } else {
2141*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2142*fcf3ce44SJohn Forte }
2143*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2144*fcf3ce44SJohn Forte }
2145*fcf3ce44SJohn Forte
2146*fcf3ce44SJohn Forte HBA_STATUS
HBA_SendCTPassThru(HBA_HANDLE handle,void * pReqBuffer,HBA_UINT32 ReqBufferSize,void * pRspBuffer,HBA_UINT32 RspBufferSize)2147*fcf3ce44SJohn Forte HBA_SendCTPassThru (
2148*fcf3ce44SJohn Forte HBA_HANDLE handle,
2149*fcf3ce44SJohn Forte void *pReqBuffer,
2150*fcf3ce44SJohn Forte HBA_UINT32 ReqBufferSize,
2151*fcf3ce44SJohn Forte void *pRspBuffer,
2152*fcf3ce44SJohn Forte HBA_UINT32 RspBufferSize)
2153*fcf3ce44SJohn Forte {
2154*fcf3ce44SJohn Forte HBA_STATUS status;
2155*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2156*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2157*fcf3ce44SJohn Forte HBASendCTPassThruFunc
2158*fcf3ce44SJohn Forte SendCTPassThruFunc;
2159*fcf3ce44SJohn Forte
2160*fcf3ce44SJohn Forte DEBUG(2, "HBA_SendCTPassThru", 0, 0, 0);
2161*fcf3ce44SJohn Forte
2162*fcf3ce44SJohn Forte CHECKLIBRARY();
2163*fcf3ce44SJohn Forte SendCTPassThruFunc = lib_infop->functionTable.SendCTPassThruHandler;
2164*fcf3ce44SJohn Forte if (SendCTPassThruFunc != NULL) {
2165*fcf3ce44SJohn Forte status = (SendCTPassThruFunc)
2166*fcf3ce44SJohn Forte (vendorHandle,
2167*fcf3ce44SJohn Forte pReqBuffer, ReqBufferSize,
2168*fcf3ce44SJohn Forte pRspBuffer, RspBufferSize);
2169*fcf3ce44SJohn Forte } else {
2170*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2171*fcf3ce44SJohn Forte }
2172*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2173*fcf3ce44SJohn Forte }
2174*fcf3ce44SJohn Forte
2175*fcf3ce44SJohn Forte HBA_STATUS
HBA_SendCTPassThruV2(HBA_HANDLE handle,HBA_WWN hbaPortWWN,void * pReqBuffer,HBA_UINT32 ReqBufferSize,void * pRspBuffer,HBA_UINT32 * pRspBufferSize)2176*fcf3ce44SJohn Forte HBA_SendCTPassThruV2 (
2177*fcf3ce44SJohn Forte HBA_HANDLE handle,
2178*fcf3ce44SJohn Forte HBA_WWN hbaPortWWN,
2179*fcf3ce44SJohn Forte void *pReqBuffer,
2180*fcf3ce44SJohn Forte HBA_UINT32 ReqBufferSize,
2181*fcf3ce44SJohn Forte void *pRspBuffer,
2182*fcf3ce44SJohn Forte HBA_UINT32 *pRspBufferSize)
2183*fcf3ce44SJohn Forte {
2184*fcf3ce44SJohn Forte HBA_STATUS status;
2185*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2186*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2187*fcf3ce44SJohn Forte HBASendCTPassThruV2Func
2188*fcf3ce44SJohn Forte registeredfunc;
2189*fcf3ce44SJohn Forte
2190*fcf3ce44SJohn Forte DEBUG(2, "HBA_SendCTPassThruV2m hbaPortWWN: %s", WWN2STR1(&hbaPortWWN), 0, 0);
2191*fcf3ce44SJohn Forte
2192*fcf3ce44SJohn Forte CHECKLIBRARY();
2193*fcf3ce44SJohn Forte registeredfunc = lib_infop->functionTable.SendCTPassThruV2Handler;
2194*fcf3ce44SJohn Forte if (registeredfunc != NULL) {
2195*fcf3ce44SJohn Forte status = (registeredfunc)
2196*fcf3ce44SJohn Forte (vendorHandle, hbaPortWWN,
2197*fcf3ce44SJohn Forte pReqBuffer, ReqBufferSize,
2198*fcf3ce44SJohn Forte pRspBuffer, pRspBufferSize);
2199*fcf3ce44SJohn Forte } else {
2200*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2201*fcf3ce44SJohn Forte }
2202*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2203*fcf3ce44SJohn Forte }
2204*fcf3ce44SJohn Forte
2205*fcf3ce44SJohn Forte HBA_STATUS
HBA_GetEventBuffer(HBA_HANDLE handle,PHBA_EVENTINFO EventBuffer,HBA_UINT32 * EventBufferCount)2206*fcf3ce44SJohn Forte HBA_GetEventBuffer (
2207*fcf3ce44SJohn Forte HBA_HANDLE handle,
2208*fcf3ce44SJohn Forte PHBA_EVENTINFO EventBuffer,
2209*fcf3ce44SJohn Forte HBA_UINT32 *EventBufferCount)
2210*fcf3ce44SJohn Forte {
2211*fcf3ce44SJohn Forte HBA_STATUS status;
2212*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2213*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2214*fcf3ce44SJohn Forte HBAGetEventBufferFunc
2215*fcf3ce44SJohn Forte GetEventBufferFunc;
2216*fcf3ce44SJohn Forte
2217*fcf3ce44SJohn Forte DEBUG(2, "HBA_GetEventBuffer", 0, 0, 0);
2218*fcf3ce44SJohn Forte
2219*fcf3ce44SJohn Forte CHECKLIBRARY();
2220*fcf3ce44SJohn Forte GetEventBufferFunc = lib_infop->functionTable.GetEventBufferHandler;
2221*fcf3ce44SJohn Forte if (GetEventBufferFunc != NULL) {
2222*fcf3ce44SJohn Forte status = (GetEventBufferFunc)
2223*fcf3ce44SJohn Forte (vendorHandle, EventBuffer, EventBufferCount);
2224*fcf3ce44SJohn Forte } else {
2225*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2226*fcf3ce44SJohn Forte }
2227*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2228*fcf3ce44SJohn Forte }
2229*fcf3ce44SJohn Forte
2230*fcf3ce44SJohn Forte HBA_STATUS
HBA_SetRNIDMgmtInfo(HBA_HANDLE handle,HBA_MGMTINFO Info)2231*fcf3ce44SJohn Forte HBA_SetRNIDMgmtInfo (HBA_HANDLE handle, HBA_MGMTINFO Info) {
2232*fcf3ce44SJohn Forte HBA_STATUS status;
2233*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2234*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2235*fcf3ce44SJohn Forte HBASetRNIDMgmtInfoFunc
2236*fcf3ce44SJohn Forte SetRNIDMgmtInfoFunc;
2237*fcf3ce44SJohn Forte
2238*fcf3ce44SJohn Forte DEBUG(2, "HBA_SetRNIDMgmtInfo", 0, 0, 0);
2239*fcf3ce44SJohn Forte
2240*fcf3ce44SJohn Forte CHECKLIBRARY();
2241*fcf3ce44SJohn Forte SetRNIDMgmtInfoFunc = lib_infop->functionTable.SetRNIDMgmtInfoHandler;
2242*fcf3ce44SJohn Forte if (SetRNIDMgmtInfoFunc != NULL) {
2243*fcf3ce44SJohn Forte status = (SetRNIDMgmtInfoFunc)(vendorHandle, Info);
2244*fcf3ce44SJohn Forte } else {
2245*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2246*fcf3ce44SJohn Forte }
2247*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2248*fcf3ce44SJohn Forte }
2249*fcf3ce44SJohn Forte
2250*fcf3ce44SJohn Forte HBA_STATUS
HBA_GetRNIDMgmtInfo(HBA_HANDLE handle,HBA_MGMTINFO * pInfo)2251*fcf3ce44SJohn Forte HBA_GetRNIDMgmtInfo (HBA_HANDLE handle, HBA_MGMTINFO *pInfo) {
2252*fcf3ce44SJohn Forte HBA_STATUS status;
2253*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2254*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2255*fcf3ce44SJohn Forte HBAGetRNIDMgmtInfoFunc
2256*fcf3ce44SJohn Forte GetRNIDMgmtInfoFunc;
2257*fcf3ce44SJohn Forte
2258*fcf3ce44SJohn Forte DEBUG(2, "HBA_GetRNIDMgmtInfo", 0, 0, 0);
2259*fcf3ce44SJohn Forte
2260*fcf3ce44SJohn Forte CHECKLIBRARY();
2261*fcf3ce44SJohn Forte GetRNIDMgmtInfoFunc = lib_infop->functionTable.GetRNIDMgmtInfoHandler;
2262*fcf3ce44SJohn Forte if (GetRNIDMgmtInfoFunc != NULL) {
2263*fcf3ce44SJohn Forte status = (GetRNIDMgmtInfoFunc)(vendorHandle, pInfo);
2264*fcf3ce44SJohn Forte } else {
2265*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2266*fcf3ce44SJohn Forte }
2267*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2268*fcf3ce44SJohn Forte }
2269*fcf3ce44SJohn Forte
2270*fcf3ce44SJohn Forte HBA_STATUS
HBA_SendRNID(HBA_HANDLE handle,HBA_WWN wwn,HBA_WWNTYPE wwntype,void * pRspBuffer,HBA_UINT32 * pRspBufferSize)2271*fcf3ce44SJohn Forte HBA_SendRNID (
2272*fcf3ce44SJohn Forte HBA_HANDLE handle,
2273*fcf3ce44SJohn Forte HBA_WWN wwn,
2274*fcf3ce44SJohn Forte HBA_WWNTYPE wwntype,
2275*fcf3ce44SJohn Forte void *pRspBuffer,
2276*fcf3ce44SJohn Forte HBA_UINT32 *pRspBufferSize)
2277*fcf3ce44SJohn Forte {
2278*fcf3ce44SJohn Forte HBA_STATUS status;
2279*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2280*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2281*fcf3ce44SJohn Forte HBASendRNIDFunc SendRNIDFunc;
2282*fcf3ce44SJohn Forte
2283*fcf3ce44SJohn Forte DEBUG(2, "HBA_SendRNID for wwn: %s", WWN2STR1(&wwn), 0, 0);
2284*fcf3ce44SJohn Forte
2285*fcf3ce44SJohn Forte CHECKLIBRARY();
2286*fcf3ce44SJohn Forte SendRNIDFunc = lib_infop->functionTable.SendRNIDHandler;
2287*fcf3ce44SJohn Forte if (SendRNIDFunc != NULL) {
2288*fcf3ce44SJohn Forte status = ((SendRNIDFunc)(vendorHandle, wwn, wwntype,
2289*fcf3ce44SJohn Forte pRspBuffer, pRspBufferSize));
2290*fcf3ce44SJohn Forte } else {
2291*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2292*fcf3ce44SJohn Forte }
2293*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2294*fcf3ce44SJohn Forte }
2295*fcf3ce44SJohn Forte
2296*fcf3ce44SJohn Forte HBA_STATUS
HBA_SendRNIDV2(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_WWN destWWN,HBA_UINT32 destFCID,HBA_UINT32 NodeIdDataFormat,void * pRspBuffer,HBA_UINT32 * pRspBufferSize)2297*fcf3ce44SJohn Forte HBA_SendRNIDV2(
2298*fcf3ce44SJohn Forte HBA_HANDLE handle,
2299*fcf3ce44SJohn Forte HBA_WWN hbaPortWWN,
2300*fcf3ce44SJohn Forte HBA_WWN destWWN,
2301*fcf3ce44SJohn Forte HBA_UINT32 destFCID,
2302*fcf3ce44SJohn Forte HBA_UINT32 NodeIdDataFormat,
2303*fcf3ce44SJohn Forte void *pRspBuffer,
2304*fcf3ce44SJohn Forte HBA_UINT32 *pRspBufferSize)
2305*fcf3ce44SJohn Forte {
2306*fcf3ce44SJohn Forte HBA_STATUS status;
2307*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2308*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2309*fcf3ce44SJohn Forte HBASendRNIDV2Func registeredfunc;
2310*fcf3ce44SJohn Forte
2311*fcf3ce44SJohn Forte DEBUG(2, "HBA_SendRNIDV2, hbaPortWWN: %s", WWN2STR1(&hbaPortWWN), 0, 0);
2312*fcf3ce44SJohn Forte
2313*fcf3ce44SJohn Forte CHECKLIBRARY();
2314*fcf3ce44SJohn Forte registeredfunc = lib_infop->functionTable.SendRNIDV2Handler;
2315*fcf3ce44SJohn Forte if (registeredfunc != NULL) {
2316*fcf3ce44SJohn Forte status = (registeredfunc)
2317*fcf3ce44SJohn Forte (vendorHandle, hbaPortWWN, destWWN, destFCID, NodeIdDataFormat,
2318*fcf3ce44SJohn Forte pRspBuffer, pRspBufferSize);
2319*fcf3ce44SJohn Forte } else {
2320*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2321*fcf3ce44SJohn Forte }
2322*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2323*fcf3ce44SJohn Forte }
2324*fcf3ce44SJohn Forte
2325*fcf3ce44SJohn Forte void
HBA_RefreshInformation(HBA_HANDLE handle)2326*fcf3ce44SJohn Forte HBA_RefreshInformation (HBA_HANDLE handle) {
2327*fcf3ce44SJohn Forte HBA_STATUS status;
2328*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2329*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2330*fcf3ce44SJohn Forte HBARefreshInformationFunc
2331*fcf3ce44SJohn Forte RefreshInformationFunc;
2332*fcf3ce44SJohn Forte
2333*fcf3ce44SJohn Forte DEBUG(2, "HBA_RefreshInformation", 0, 0, 0);
2334*fcf3ce44SJohn Forte
2335*fcf3ce44SJohn Forte status = HBA_CheckLibrary(handle, &lib_infop, &vendorHandle);
2336*fcf3ce44SJohn Forte if(status == HBA_STATUS_OK) {
2337*fcf3ce44SJohn Forte RefreshInformationFunc =
2338*fcf3ce44SJohn Forte lib_infop->functionTable.RefreshInformationHandler;
2339*fcf3ce44SJohn Forte if (RefreshInformationFunc != NULL) {
2340*fcf3ce44SJohn Forte ((RefreshInformationFunc)(vendorHandle));
2341*fcf3ce44SJohn Forte }
2342*fcf3ce44SJohn Forte RELEASE_MUTEX(&_hbaapi_LL_mutex);
2343*fcf3ce44SJohn Forte }
2344*fcf3ce44SJohn Forte }
2345*fcf3ce44SJohn Forte
2346*fcf3ce44SJohn Forte void
HBA_ResetStatistics(HBA_HANDLE handle,HBA_UINT32 portindex)2347*fcf3ce44SJohn Forte HBA_ResetStatistics (HBA_HANDLE handle, HBA_UINT32 portindex) {
2348*fcf3ce44SJohn Forte HBA_STATUS status;
2349*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2350*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2351*fcf3ce44SJohn Forte HBAResetStatisticsFunc
2352*fcf3ce44SJohn Forte ResetStatisticsFunc;
2353*fcf3ce44SJohn Forte
2354*fcf3ce44SJohn Forte DEBUG(2, "HBA_ResetStatistics", 0, 0, 0);
2355*fcf3ce44SJohn Forte
2356*fcf3ce44SJohn Forte status = HBA_CheckLibrary(handle, &lib_infop, &vendorHandle);
2357*fcf3ce44SJohn Forte if(status == HBA_STATUS_OK) {
2358*fcf3ce44SJohn Forte ResetStatisticsFunc = lib_infop->functionTable.ResetStatisticsHandler;
2359*fcf3ce44SJohn Forte if (ResetStatisticsFunc != NULL) {
2360*fcf3ce44SJohn Forte ((ResetStatisticsFunc)(vendorHandle, portindex));
2361*fcf3ce44SJohn Forte }
2362*fcf3ce44SJohn Forte RELEASE_MUTEX(&_hbaapi_LL_mutex);
2363*fcf3ce44SJohn Forte }
2364*fcf3ce44SJohn Forte }
2365*fcf3ce44SJohn Forte
2366*fcf3ce44SJohn Forte HBA_STATUS
HBA_GetFcpTargetMapping(HBA_HANDLE handle,PHBA_FCPTARGETMAPPING mapping)2367*fcf3ce44SJohn Forte HBA_GetFcpTargetMapping (HBA_HANDLE handle, PHBA_FCPTARGETMAPPING mapping) {
2368*fcf3ce44SJohn Forte HBA_STATUS status;
2369*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2370*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2371*fcf3ce44SJohn Forte HBAGetFcpTargetMappingFunc GetFcpTargetMappingFunc;
2372*fcf3ce44SJohn Forte
2373*fcf3ce44SJohn Forte DEBUG(2, "HBA_GetFcpTargetMapping", 0, 0, 0);
2374*fcf3ce44SJohn Forte
2375*fcf3ce44SJohn Forte CHECKLIBRARY();
2376*fcf3ce44SJohn Forte GetFcpTargetMappingFunc =
2377*fcf3ce44SJohn Forte lib_infop->functionTable.GetFcpTargetMappingHandler;
2378*fcf3ce44SJohn Forte if (GetFcpTargetMappingFunc != NULL) {
2379*fcf3ce44SJohn Forte status = ((GetFcpTargetMappingFunc)(vendorHandle, mapping));
2380*fcf3ce44SJohn Forte } else {
2381*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2382*fcf3ce44SJohn Forte }
2383*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2384*fcf3ce44SJohn Forte }
2385*fcf3ce44SJohn Forte
2386*fcf3ce44SJohn Forte HBA_STATUS
HBA_GetFcpTargetMappingV2(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_FCPTARGETMAPPINGV2 * pmapping)2387*fcf3ce44SJohn Forte HBA_GetFcpTargetMappingV2 (
2388*fcf3ce44SJohn Forte HBA_HANDLE handle,
2389*fcf3ce44SJohn Forte HBA_WWN hbaPortWWN,
2390*fcf3ce44SJohn Forte HBA_FCPTARGETMAPPINGV2
2391*fcf3ce44SJohn Forte *pmapping)
2392*fcf3ce44SJohn Forte {
2393*fcf3ce44SJohn Forte HBA_STATUS status;
2394*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2395*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2396*fcf3ce44SJohn Forte HBAGetFcpTargetMappingV2Func
2397*fcf3ce44SJohn Forte registeredfunc;
2398*fcf3ce44SJohn Forte
2399*fcf3ce44SJohn Forte DEBUG(2, "HBA_GetFcpTargetMapping", 0, 0, 0);
2400*fcf3ce44SJohn Forte
2401*fcf3ce44SJohn Forte CHECKLIBRARY();
2402*fcf3ce44SJohn Forte registeredfunc =
2403*fcf3ce44SJohn Forte lib_infop->functionTable.GetFcpTargetMappingV2Handler;
2404*fcf3ce44SJohn Forte if (registeredfunc != NULL) {
2405*fcf3ce44SJohn Forte status = ((registeredfunc)(vendorHandle, hbaPortWWN, pmapping));
2406*fcf3ce44SJohn Forte } else {
2407*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2408*fcf3ce44SJohn Forte }
2409*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2410*fcf3ce44SJohn Forte }
2411*fcf3ce44SJohn Forte
2412*fcf3ce44SJohn Forte HBA_STATUS
HBA_GetFcpPersistentBinding(HBA_HANDLE handle,PHBA_FCPBINDING binding)2413*fcf3ce44SJohn Forte HBA_GetFcpPersistentBinding (HBA_HANDLE handle, PHBA_FCPBINDING binding) {
2414*fcf3ce44SJohn Forte HBA_STATUS status;
2415*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2416*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2417*fcf3ce44SJohn Forte HBAGetFcpPersistentBindingFunc
2418*fcf3ce44SJohn Forte GetFcpPersistentBindingFunc;
2419*fcf3ce44SJohn Forte
2420*fcf3ce44SJohn Forte DEBUG(2, "HBA_GetFcpPersistentBinding", 0, 0, 0);
2421*fcf3ce44SJohn Forte
2422*fcf3ce44SJohn Forte CHECKLIBRARY();
2423*fcf3ce44SJohn Forte GetFcpPersistentBindingFunc =
2424*fcf3ce44SJohn Forte lib_infop->functionTable.GetFcpPersistentBindingHandler;
2425*fcf3ce44SJohn Forte if (GetFcpPersistentBindingFunc != NULL) {
2426*fcf3ce44SJohn Forte status = ((GetFcpPersistentBindingFunc)(vendorHandle, binding));
2427*fcf3ce44SJohn Forte } else {
2428*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2429*fcf3ce44SJohn Forte }
2430*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2431*fcf3ce44SJohn Forte }
2432*fcf3ce44SJohn Forte
2433*fcf3ce44SJohn Forte HBA_STATUS
HBA_ScsiInquiryV2(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_WWN discoveredPortWWN,HBA_UINT64 fcLUN,HBA_UINT8 CDB_Byte1,HBA_UINT8 CDB_Byte2,void * pRspBuffer,HBA_UINT32 * pRspBufferSize,HBA_UINT8 * pScsiStatus,void * pSenseBuffer,HBA_UINT32 * pSenseBufferSize)2434*fcf3ce44SJohn Forte HBA_ScsiInquiryV2 (
2435*fcf3ce44SJohn Forte HBA_HANDLE handle,
2436*fcf3ce44SJohn Forte HBA_WWN hbaPortWWN,
2437*fcf3ce44SJohn Forte HBA_WWN discoveredPortWWN,
2438*fcf3ce44SJohn Forte HBA_UINT64 fcLUN,
2439*fcf3ce44SJohn Forte HBA_UINT8 CDB_Byte1,
2440*fcf3ce44SJohn Forte HBA_UINT8 CDB_Byte2,
2441*fcf3ce44SJohn Forte void *pRspBuffer,
2442*fcf3ce44SJohn Forte HBA_UINT32 *pRspBufferSize,
2443*fcf3ce44SJohn Forte HBA_UINT8 *pScsiStatus,
2444*fcf3ce44SJohn Forte void *pSenseBuffer,
2445*fcf3ce44SJohn Forte HBA_UINT32 *pSenseBufferSize)
2446*fcf3ce44SJohn Forte {
2447*fcf3ce44SJohn Forte HBA_STATUS status;
2448*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2449*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2450*fcf3ce44SJohn Forte HBAScsiInquiryV2Func ScsiInquiryV2Func;
2451*fcf3ce44SJohn Forte
2452*fcf3ce44SJohn Forte DEBUG(2, "HBA_ScsiInquiryV2 to discoveredPortWWN: %s",
2453*fcf3ce44SJohn Forte WWN2STR1(&discoveredPortWWN), 0, 0);
2454*fcf3ce44SJohn Forte
2455*fcf3ce44SJohn Forte CHECKLIBRARY();
2456*fcf3ce44SJohn Forte ScsiInquiryV2Func =
2457*fcf3ce44SJohn Forte lib_infop->functionTable.ScsiInquiryV2Handler;
2458*fcf3ce44SJohn Forte if (ScsiInquiryV2Func != NULL) {
2459*fcf3ce44SJohn Forte status =((ScsiInquiryV2Func)(
2460*fcf3ce44SJohn Forte vendorHandle, hbaPortWWN, discoveredPortWWN, fcLUN, CDB_Byte1,
2461*fcf3ce44SJohn Forte CDB_Byte2, pRspBuffer, pRspBufferSize, pScsiStatus,
2462*fcf3ce44SJohn Forte pSenseBuffer, pSenseBufferSize));
2463*fcf3ce44SJohn Forte } else {
2464*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2465*fcf3ce44SJohn Forte }
2466*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2467*fcf3ce44SJohn Forte }
2468*fcf3ce44SJohn Forte
2469*fcf3ce44SJohn Forte HBA_STATUS
HBA_SendScsiInquiry(HBA_HANDLE handle,HBA_WWN PortWWN,HBA_UINT64 fcLUN,HBA_UINT8 EVPD,HBA_UINT32 PageCode,void * pRspBuffer,HBA_UINT32 RspBufferSize,void * pSenseBuffer,HBA_UINT32 SenseBufferSize)2470*fcf3ce44SJohn Forte HBA_SendScsiInquiry (
2471*fcf3ce44SJohn Forte HBA_HANDLE handle,
2472*fcf3ce44SJohn Forte HBA_WWN PortWWN,
2473*fcf3ce44SJohn Forte HBA_UINT64 fcLUN,
2474*fcf3ce44SJohn Forte HBA_UINT8 EVPD,
2475*fcf3ce44SJohn Forte HBA_UINT32 PageCode,
2476*fcf3ce44SJohn Forte void *pRspBuffer,
2477*fcf3ce44SJohn Forte HBA_UINT32 RspBufferSize,
2478*fcf3ce44SJohn Forte void *pSenseBuffer,
2479*fcf3ce44SJohn Forte HBA_UINT32 SenseBufferSize)
2480*fcf3ce44SJohn Forte {
2481*fcf3ce44SJohn Forte HBA_STATUS status;
2482*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2483*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2484*fcf3ce44SJohn Forte HBASendScsiInquiryFunc SendScsiInquiryFunc;
2485*fcf3ce44SJohn Forte
2486*fcf3ce44SJohn Forte DEBUG(2, "HBA_SendScsiInquiry to PortWWN: %s", WWN2STR1(&PortWWN), 0, 0);
2487*fcf3ce44SJohn Forte
2488*fcf3ce44SJohn Forte CHECKLIBRARY();
2489*fcf3ce44SJohn Forte SendScsiInquiryFunc = lib_infop->functionTable.ScsiInquiryHandler;
2490*fcf3ce44SJohn Forte if (SendScsiInquiryFunc != NULL) {
2491*fcf3ce44SJohn Forte status =((SendScsiInquiryFunc)(
2492*fcf3ce44SJohn Forte vendorHandle, PortWWN, fcLUN, EVPD, PageCode, pRspBuffer,
2493*fcf3ce44SJohn Forte RspBufferSize, pSenseBuffer, SenseBufferSize));
2494*fcf3ce44SJohn Forte } else {
2495*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2496*fcf3ce44SJohn Forte }
2497*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2498*fcf3ce44SJohn Forte }
2499*fcf3ce44SJohn Forte
2500*fcf3ce44SJohn Forte HBA_STATUS
HBA_ScsiReportLUNsV2(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_WWN discoveredPortWWN,void * pRespBuffer,HBA_UINT32 * pRespBufferSize,HBA_UINT8 * pScsiStatus,void * pSenseBuffer,HBA_UINT32 * pSenseBufferSize)2501*fcf3ce44SJohn Forte HBA_ScsiReportLUNsV2 (
2502*fcf3ce44SJohn Forte HBA_HANDLE handle,
2503*fcf3ce44SJohn Forte HBA_WWN hbaPortWWN,
2504*fcf3ce44SJohn Forte HBA_WWN discoveredPortWWN,
2505*fcf3ce44SJohn Forte void *pRespBuffer,
2506*fcf3ce44SJohn Forte HBA_UINT32 *pRespBufferSize,
2507*fcf3ce44SJohn Forte HBA_UINT8 *pScsiStatus,
2508*fcf3ce44SJohn Forte void *pSenseBuffer,
2509*fcf3ce44SJohn Forte HBA_UINT32 *pSenseBufferSize)
2510*fcf3ce44SJohn Forte {
2511*fcf3ce44SJohn Forte HBA_STATUS status;
2512*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2513*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2514*fcf3ce44SJohn Forte HBAScsiReportLUNsV2Func ScsiReportLUNsV2Func;
2515*fcf3ce44SJohn Forte
2516*fcf3ce44SJohn Forte DEBUG(2, "HBA_ScsiReportLUNsV2 to discoveredPortWWN: %s",
2517*fcf3ce44SJohn Forte WWN2STR1(&discoveredPortWWN), 0, 0);
2518*fcf3ce44SJohn Forte
2519*fcf3ce44SJohn Forte CHECKLIBRARY();
2520*fcf3ce44SJohn Forte ScsiReportLUNsV2Func = lib_infop->functionTable.ScsiReportLUNsV2Handler;
2521*fcf3ce44SJohn Forte if (ScsiReportLUNsV2Func != NULL) {
2522*fcf3ce44SJohn Forte status = ((ScsiReportLUNsV2Func)(
2523*fcf3ce44SJohn Forte vendorHandle, hbaPortWWN, discoveredPortWWN,
2524*fcf3ce44SJohn Forte pRespBuffer, pRespBufferSize,
2525*fcf3ce44SJohn Forte pScsiStatus,
2526*fcf3ce44SJohn Forte pSenseBuffer, pSenseBufferSize));
2527*fcf3ce44SJohn Forte } else {
2528*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2529*fcf3ce44SJohn Forte }
2530*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2531*fcf3ce44SJohn Forte }
2532*fcf3ce44SJohn Forte
2533*fcf3ce44SJohn Forte HBA_STATUS
HBA_SendReportLUNs(HBA_HANDLE handle,HBA_WWN portWWN,void * pRspBuffer,HBA_UINT32 RspBufferSize,void * pSenseBuffer,HBA_UINT32 SenseBufferSize)2534*fcf3ce44SJohn Forte HBA_SendReportLUNs (
2535*fcf3ce44SJohn Forte HBA_HANDLE handle,
2536*fcf3ce44SJohn Forte HBA_WWN portWWN,
2537*fcf3ce44SJohn Forte void *pRspBuffer,
2538*fcf3ce44SJohn Forte HBA_UINT32 RspBufferSize,
2539*fcf3ce44SJohn Forte void *pSenseBuffer,
2540*fcf3ce44SJohn Forte HBA_UINT32 SenseBufferSize)
2541*fcf3ce44SJohn Forte {
2542*fcf3ce44SJohn Forte HBA_STATUS status;
2543*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2544*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2545*fcf3ce44SJohn Forte HBASendReportLUNsFunc SendReportLUNsFunc;
2546*fcf3ce44SJohn Forte
2547*fcf3ce44SJohn Forte DEBUG(2, "HBA_SendReportLUNs to PortWWN: %s", WWN2STR1(&portWWN), 0, 0);
2548*fcf3ce44SJohn Forte
2549*fcf3ce44SJohn Forte CHECKLIBRARY();
2550*fcf3ce44SJohn Forte SendReportLUNsFunc = lib_infop->functionTable.ReportLUNsHandler;
2551*fcf3ce44SJohn Forte if (SendReportLUNsFunc != NULL) {
2552*fcf3ce44SJohn Forte status = ((SendReportLUNsFunc)(
2553*fcf3ce44SJohn Forte vendorHandle, portWWN, pRspBuffer,
2554*fcf3ce44SJohn Forte RspBufferSize, pSenseBuffer, SenseBufferSize));
2555*fcf3ce44SJohn Forte } else {
2556*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2557*fcf3ce44SJohn Forte }
2558*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2559*fcf3ce44SJohn Forte }
2560*fcf3ce44SJohn Forte
2561*fcf3ce44SJohn Forte HBA_STATUS
HBA_ScsiReadCapacityV2(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_WWN discoveredPortWWN,HBA_UINT64 fcLUN,void * pRspBuffer,HBA_UINT32 * pRspBufferSize,HBA_UINT8 * pScsiStatus,void * pSenseBuffer,HBA_UINT32 * SenseBufferSize)2562*fcf3ce44SJohn Forte HBA_ScsiReadCapacityV2 (
2563*fcf3ce44SJohn Forte HBA_HANDLE handle,
2564*fcf3ce44SJohn Forte HBA_WWN hbaPortWWN,
2565*fcf3ce44SJohn Forte HBA_WWN discoveredPortWWN,
2566*fcf3ce44SJohn Forte HBA_UINT64 fcLUN,
2567*fcf3ce44SJohn Forte void *pRspBuffer,
2568*fcf3ce44SJohn Forte HBA_UINT32 *pRspBufferSize,
2569*fcf3ce44SJohn Forte HBA_UINT8 *pScsiStatus,
2570*fcf3ce44SJohn Forte void *pSenseBuffer,
2571*fcf3ce44SJohn Forte HBA_UINT32 *SenseBufferSize)
2572*fcf3ce44SJohn Forte {
2573*fcf3ce44SJohn Forte HBA_STATUS status;
2574*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2575*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2576*fcf3ce44SJohn Forte HBAScsiReadCapacityV2Func ScsiReadCapacityV2Func;
2577*fcf3ce44SJohn Forte
2578*fcf3ce44SJohn Forte DEBUG(2, "HBA_ScsiReadCapacityV2 to discoveredPortWWN: %s",
2579*fcf3ce44SJohn Forte WWN2STR1(&discoveredPortWWN), 0, 0);
2580*fcf3ce44SJohn Forte
2581*fcf3ce44SJohn Forte CHECKLIBRARY();
2582*fcf3ce44SJohn Forte ScsiReadCapacityV2Func =
2583*fcf3ce44SJohn Forte lib_infop->functionTable.ScsiReadCapacityV2Handler;
2584*fcf3ce44SJohn Forte if (ScsiReadCapacityV2Func != NULL) {
2585*fcf3ce44SJohn Forte status =((ScsiReadCapacityV2Func)(
2586*fcf3ce44SJohn Forte vendorHandle, hbaPortWWN, discoveredPortWWN, fcLUN,
2587*fcf3ce44SJohn Forte pRspBuffer, pRspBufferSize,
2588*fcf3ce44SJohn Forte pScsiStatus,
2589*fcf3ce44SJohn Forte pSenseBuffer, SenseBufferSize));
2590*fcf3ce44SJohn Forte } else {
2591*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2592*fcf3ce44SJohn Forte }
2593*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2594*fcf3ce44SJohn Forte }
2595*fcf3ce44SJohn Forte
2596*fcf3ce44SJohn Forte HBA_STATUS
HBA_SendReadCapacity(HBA_HANDLE handle,HBA_WWN portWWN,HBA_UINT64 fcLUN,void * pRspBuffer,HBA_UINT32 RspBufferSize,void * pSenseBuffer,HBA_UINT32 SenseBufferSize)2597*fcf3ce44SJohn Forte HBA_SendReadCapacity (
2598*fcf3ce44SJohn Forte HBA_HANDLE handle,
2599*fcf3ce44SJohn Forte HBA_WWN portWWN,
2600*fcf3ce44SJohn Forte HBA_UINT64 fcLUN,
2601*fcf3ce44SJohn Forte void *pRspBuffer,
2602*fcf3ce44SJohn Forte HBA_UINT32 RspBufferSize,
2603*fcf3ce44SJohn Forte void *pSenseBuffer,
2604*fcf3ce44SJohn Forte HBA_UINT32 SenseBufferSize)
2605*fcf3ce44SJohn Forte {
2606*fcf3ce44SJohn Forte HBA_STATUS status;
2607*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2608*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2609*fcf3ce44SJohn Forte HBASendReadCapacityFunc SendReadCapacityFunc;
2610*fcf3ce44SJohn Forte
2611*fcf3ce44SJohn Forte DEBUG(2, "HBA_SendReadCapacity to portWWN: %s", WWN2STR1(&portWWN), 0, 0);
2612*fcf3ce44SJohn Forte
2613*fcf3ce44SJohn Forte CHECKLIBRARY();
2614*fcf3ce44SJohn Forte SendReadCapacityFunc = lib_infop->functionTable.ReadCapacityHandler;
2615*fcf3ce44SJohn Forte if (SendReadCapacityFunc != NULL) {
2616*fcf3ce44SJohn Forte status =((SendReadCapacityFunc)
2617*fcf3ce44SJohn Forte (vendorHandle, portWWN, fcLUN, pRspBuffer,
2618*fcf3ce44SJohn Forte RspBufferSize, pSenseBuffer, SenseBufferSize));
2619*fcf3ce44SJohn Forte } else {
2620*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2621*fcf3ce44SJohn Forte }
2622*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2623*fcf3ce44SJohn Forte }
2624*fcf3ce44SJohn Forte
2625*fcf3ce44SJohn Forte HBA_STATUS
HBA_SendRLS(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_WWN destWWN,void * pRspBuffer,HBA_UINT32 * pRspBufferSize)2626*fcf3ce44SJohn Forte HBA_SendRLS (
2627*fcf3ce44SJohn Forte HBA_HANDLE handle,
2628*fcf3ce44SJohn Forte HBA_WWN hbaPortWWN,
2629*fcf3ce44SJohn Forte HBA_WWN destWWN,
2630*fcf3ce44SJohn Forte void *pRspBuffer,
2631*fcf3ce44SJohn Forte HBA_UINT32 *pRspBufferSize)
2632*fcf3ce44SJohn Forte {
2633*fcf3ce44SJohn Forte HBA_STATUS status;
2634*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2635*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2636*fcf3ce44SJohn Forte HBASendRLSFunc registeredfunc;
2637*fcf3ce44SJohn Forte
2638*fcf3ce44SJohn Forte DEBUG(2, "HBA_SendRLS to agent_wwn: %s:%d",
2639*fcf3ce44SJohn Forte WWN2STR1(&agent_wwn), agent_domain, 0);
2640*fcf3ce44SJohn Forte
2641*fcf3ce44SJohn Forte CHECKLIBRARY();
2642*fcf3ce44SJohn Forte registeredfunc = lib_infop->functionTable.SendRLSHandler;
2643*fcf3ce44SJohn Forte if (registeredfunc != NULL) {
2644*fcf3ce44SJohn Forte status =(registeredfunc)(
2645*fcf3ce44SJohn Forte vendorHandle, hbaPortWWN, destWWN, pRspBuffer, pRspBufferSize);
2646*fcf3ce44SJohn Forte } else {
2647*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2648*fcf3ce44SJohn Forte }
2649*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2650*fcf3ce44SJohn Forte }
2651*fcf3ce44SJohn Forte
2652*fcf3ce44SJohn Forte HBA_STATUS
HBA_SendRPL(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_WWN agent_wwn,HBA_UINT32 agent_domain,HBA_UINT32 portindex,void * pRspBuffer,HBA_UINT32 * pRspBufferSize)2653*fcf3ce44SJohn Forte HBA_SendRPL (
2654*fcf3ce44SJohn Forte HBA_HANDLE handle,
2655*fcf3ce44SJohn Forte HBA_WWN hbaPortWWN,
2656*fcf3ce44SJohn Forte HBA_WWN agent_wwn,
2657*fcf3ce44SJohn Forte HBA_UINT32 agent_domain,
2658*fcf3ce44SJohn Forte HBA_UINT32 portindex,
2659*fcf3ce44SJohn Forte void *pRspBuffer,
2660*fcf3ce44SJohn Forte HBA_UINT32 *pRspBufferSize)
2661*fcf3ce44SJohn Forte {
2662*fcf3ce44SJohn Forte HBA_STATUS status;
2663*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2664*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2665*fcf3ce44SJohn Forte HBASendRPLFunc registeredfunc;
2666*fcf3ce44SJohn Forte
2667*fcf3ce44SJohn Forte DEBUG(2, "HBA_SendRPL to agent_wwn: %s:%d",
2668*fcf3ce44SJohn Forte WWN2STR1(&agent_wwn), agent_domain, 0);
2669*fcf3ce44SJohn Forte
2670*fcf3ce44SJohn Forte CHECKLIBRARY();
2671*fcf3ce44SJohn Forte registeredfunc = lib_infop->functionTable.SendRPLHandler;
2672*fcf3ce44SJohn Forte if (registeredfunc != NULL) {
2673*fcf3ce44SJohn Forte status =(registeredfunc)(
2674*fcf3ce44SJohn Forte vendorHandle, hbaPortWWN, agent_wwn, agent_domain, portindex,
2675*fcf3ce44SJohn Forte pRspBuffer, pRspBufferSize);
2676*fcf3ce44SJohn Forte } else {
2677*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2678*fcf3ce44SJohn Forte }
2679*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2680*fcf3ce44SJohn Forte }
2681*fcf3ce44SJohn Forte
2682*fcf3ce44SJohn Forte HBA_STATUS
HBA_SendRPS(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_WWN agent_wwn,HBA_UINT32 agent_domain,HBA_WWN object_wwn,HBA_UINT32 object_port_number,void * pRspBuffer,HBA_UINT32 * pRspBufferSize)2683*fcf3ce44SJohn Forte HBA_SendRPS (
2684*fcf3ce44SJohn Forte HBA_HANDLE handle,
2685*fcf3ce44SJohn Forte HBA_WWN hbaPortWWN,
2686*fcf3ce44SJohn Forte HBA_WWN agent_wwn,
2687*fcf3ce44SJohn Forte HBA_UINT32 agent_domain,
2688*fcf3ce44SJohn Forte HBA_WWN object_wwn,
2689*fcf3ce44SJohn Forte HBA_UINT32 object_port_number,
2690*fcf3ce44SJohn Forte void *pRspBuffer,
2691*fcf3ce44SJohn Forte HBA_UINT32 *pRspBufferSize)
2692*fcf3ce44SJohn Forte {
2693*fcf3ce44SJohn Forte HBA_STATUS status;
2694*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2695*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2696*fcf3ce44SJohn Forte HBASendRPSFunc registeredfunc;
2697*fcf3ce44SJohn Forte
2698*fcf3ce44SJohn Forte DEBUG(2, "HBA_SendRPS to agent_wwn: %s:%d",
2699*fcf3ce44SJohn Forte WWN2STR1(&agent_wwn), agent_domain, 0);
2700*fcf3ce44SJohn Forte
2701*fcf3ce44SJohn Forte CHECKLIBRARY();
2702*fcf3ce44SJohn Forte registeredfunc = lib_infop->functionTable.SendRPSHandler;
2703*fcf3ce44SJohn Forte if (registeredfunc != NULL) {
2704*fcf3ce44SJohn Forte status =(registeredfunc)(
2705*fcf3ce44SJohn Forte vendorHandle, hbaPortWWN, agent_wwn, agent_domain,
2706*fcf3ce44SJohn Forte object_wwn, object_port_number,
2707*fcf3ce44SJohn Forte pRspBuffer, pRspBufferSize);
2708*fcf3ce44SJohn Forte } else {
2709*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2710*fcf3ce44SJohn Forte }
2711*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2712*fcf3ce44SJohn Forte }
2713*fcf3ce44SJohn Forte
2714*fcf3ce44SJohn Forte HBA_STATUS
HBA_SendSRL(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_WWN wwn,HBA_UINT32 domain,void * pRspBuffer,HBA_UINT32 * pRspBufferSize)2715*fcf3ce44SJohn Forte HBA_SendSRL (
2716*fcf3ce44SJohn Forte HBA_HANDLE handle,
2717*fcf3ce44SJohn Forte HBA_WWN hbaPortWWN,
2718*fcf3ce44SJohn Forte HBA_WWN wwn,
2719*fcf3ce44SJohn Forte HBA_UINT32 domain,
2720*fcf3ce44SJohn Forte void *pRspBuffer,
2721*fcf3ce44SJohn Forte HBA_UINT32 *pRspBufferSize)
2722*fcf3ce44SJohn Forte {
2723*fcf3ce44SJohn Forte HBA_STATUS status;
2724*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2725*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2726*fcf3ce44SJohn Forte HBASendSRLFunc registeredfunc;
2727*fcf3ce44SJohn Forte
2728*fcf3ce44SJohn Forte DEBUG(2, "HBA_SendSRL to wwn:%s domain:%d", WWN2STR1(&wwn), domain, 0);
2729*fcf3ce44SJohn Forte
2730*fcf3ce44SJohn Forte CHECKLIBRARY();
2731*fcf3ce44SJohn Forte registeredfunc = lib_infop->functionTable.SendSRLHandler;
2732*fcf3ce44SJohn Forte if (registeredfunc != NULL) {
2733*fcf3ce44SJohn Forte status =(registeredfunc)(
2734*fcf3ce44SJohn Forte vendorHandle, hbaPortWWN, wwn, domain,
2735*fcf3ce44SJohn Forte pRspBuffer, pRspBufferSize);
2736*fcf3ce44SJohn Forte } else {
2737*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2738*fcf3ce44SJohn Forte }
2739*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2740*fcf3ce44SJohn Forte }
2741*fcf3ce44SJohn Forte
2742*fcf3ce44SJohn Forte HBA_STATUS
HBA_SendLIRR(HBA_HANDLE handle,HBA_WWN sourceWWN,HBA_WWN destWWN,HBA_UINT8 function,HBA_UINT8 type,void * pRspBuffer,HBA_UINT32 * pRspBufferSize)2743*fcf3ce44SJohn Forte HBA_SendLIRR (
2744*fcf3ce44SJohn Forte HBA_HANDLE handle,
2745*fcf3ce44SJohn Forte HBA_WWN sourceWWN,
2746*fcf3ce44SJohn Forte HBA_WWN destWWN,
2747*fcf3ce44SJohn Forte HBA_UINT8 function,
2748*fcf3ce44SJohn Forte HBA_UINT8 type,
2749*fcf3ce44SJohn Forte void *pRspBuffer,
2750*fcf3ce44SJohn Forte HBA_UINT32 *pRspBufferSize)
2751*fcf3ce44SJohn Forte {
2752*fcf3ce44SJohn Forte HBA_STATUS status;
2753*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2754*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2755*fcf3ce44SJohn Forte HBASendLIRRFunc registeredfunc;
2756*fcf3ce44SJohn Forte
2757*fcf3ce44SJohn Forte DEBUG(2, "HBA_SendLIRR destWWN:%s", WWN2STR1(&destWWN), 0, 0);
2758*fcf3ce44SJohn Forte
2759*fcf3ce44SJohn Forte CHECKLIBRARY();
2760*fcf3ce44SJohn Forte registeredfunc = lib_infop->functionTable.SendLIRRHandler;
2761*fcf3ce44SJohn Forte if (registeredfunc != NULL) {
2762*fcf3ce44SJohn Forte status =(registeredfunc)(
2763*fcf3ce44SJohn Forte vendorHandle, sourceWWN, destWWN, function, type,
2764*fcf3ce44SJohn Forte pRspBuffer, pRspBufferSize);
2765*fcf3ce44SJohn Forte } else {
2766*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2767*fcf3ce44SJohn Forte }
2768*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2769*fcf3ce44SJohn Forte }
2770*fcf3ce44SJohn Forte
2771*fcf3ce44SJohn Forte HBA_STATUS
HBA_GetBindingCapability(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_BIND_CAPABILITY * pcapability)2772*fcf3ce44SJohn Forte HBA_GetBindingCapability(
2773*fcf3ce44SJohn Forte HBA_HANDLE handle,
2774*fcf3ce44SJohn Forte HBA_WWN hbaPortWWN,
2775*fcf3ce44SJohn Forte HBA_BIND_CAPABILITY *pcapability)
2776*fcf3ce44SJohn Forte {
2777*fcf3ce44SJohn Forte HBA_STATUS status;
2778*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2779*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2780*fcf3ce44SJohn Forte HBAGetBindingCapabilityFunc
2781*fcf3ce44SJohn Forte registeredfunc;
2782*fcf3ce44SJohn Forte
2783*fcf3ce44SJohn Forte DEBUG(2, "HBA_GetBindingCapability", 0, 0, 0);
2784*fcf3ce44SJohn Forte
2785*fcf3ce44SJohn Forte CHECKLIBRARY();
2786*fcf3ce44SJohn Forte registeredfunc = lib_infop->functionTable.GetBindingCapabilityHandler;
2787*fcf3ce44SJohn Forte if (registeredfunc != NULL) {
2788*fcf3ce44SJohn Forte status =(registeredfunc)(vendorHandle, hbaPortWWN, pcapability);
2789*fcf3ce44SJohn Forte } else {
2790*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2791*fcf3ce44SJohn Forte }
2792*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2793*fcf3ce44SJohn Forte }
2794*fcf3ce44SJohn Forte
2795*fcf3ce44SJohn Forte HBA_STATUS
HBA_GetBindingSupport(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_BIND_CAPABILITY * pcapability)2796*fcf3ce44SJohn Forte HBA_GetBindingSupport (
2797*fcf3ce44SJohn Forte HBA_HANDLE handle,
2798*fcf3ce44SJohn Forte HBA_WWN hbaPortWWN,
2799*fcf3ce44SJohn Forte HBA_BIND_CAPABILITY *pcapability)
2800*fcf3ce44SJohn Forte {
2801*fcf3ce44SJohn Forte HBA_STATUS status;
2802*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2803*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2804*fcf3ce44SJohn Forte HBAGetBindingSupportFunc
2805*fcf3ce44SJohn Forte registeredfunc;
2806*fcf3ce44SJohn Forte
2807*fcf3ce44SJohn Forte DEBUG(2, "HBA_GetBindingSupport", 0, 0, 0);
2808*fcf3ce44SJohn Forte
2809*fcf3ce44SJohn Forte CHECKLIBRARY();
2810*fcf3ce44SJohn Forte registeredfunc = lib_infop->functionTable.GetBindingSupportHandler;
2811*fcf3ce44SJohn Forte if (registeredfunc != NULL) {
2812*fcf3ce44SJohn Forte status =(registeredfunc)(vendorHandle, hbaPortWWN, pcapability);
2813*fcf3ce44SJohn Forte } else {
2814*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2815*fcf3ce44SJohn Forte }
2816*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2817*fcf3ce44SJohn Forte }
2818*fcf3ce44SJohn Forte
2819*fcf3ce44SJohn Forte HBA_STATUS
HBA_SetBindingSupport(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_BIND_CAPABILITY capability)2820*fcf3ce44SJohn Forte HBA_SetBindingSupport(
2821*fcf3ce44SJohn Forte HBA_HANDLE handle,
2822*fcf3ce44SJohn Forte HBA_WWN hbaPortWWN,
2823*fcf3ce44SJohn Forte HBA_BIND_CAPABILITY capability)
2824*fcf3ce44SJohn Forte {
2825*fcf3ce44SJohn Forte HBA_STATUS status;
2826*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2827*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2828*fcf3ce44SJohn Forte HBASetBindingSupportFunc
2829*fcf3ce44SJohn Forte registeredfunc;
2830*fcf3ce44SJohn Forte
2831*fcf3ce44SJohn Forte DEBUG(2, "HBA_SetBindingSupport", 0, 0, 0);
2832*fcf3ce44SJohn Forte
2833*fcf3ce44SJohn Forte CHECKLIBRARY();
2834*fcf3ce44SJohn Forte registeredfunc = lib_infop->functionTable.SetBindingSupportHandler;
2835*fcf3ce44SJohn Forte if (registeredfunc != NULL) {
2836*fcf3ce44SJohn Forte status =(registeredfunc)(vendorHandle, hbaPortWWN, capability);
2837*fcf3ce44SJohn Forte } else {
2838*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2839*fcf3ce44SJohn Forte }
2840*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2841*fcf3ce44SJohn Forte }
2842*fcf3ce44SJohn Forte
2843*fcf3ce44SJohn Forte HBA_STATUS
HBA_SetPersistentBindingV2(HBA_HANDLE handle,HBA_WWN hbaPortWWN,const HBA_FCPBINDING2 * pbinding)2844*fcf3ce44SJohn Forte HBA_SetPersistentBindingV2 (
2845*fcf3ce44SJohn Forte HBA_HANDLE handle,
2846*fcf3ce44SJohn Forte HBA_WWN hbaPortWWN,
2847*fcf3ce44SJohn Forte const HBA_FCPBINDING2
2848*fcf3ce44SJohn Forte *pbinding)
2849*fcf3ce44SJohn Forte {
2850*fcf3ce44SJohn Forte HBA_STATUS status;
2851*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2852*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2853*fcf3ce44SJohn Forte HBASetPersistentBindingV2Func
2854*fcf3ce44SJohn Forte registeredfunc;
2855*fcf3ce44SJohn Forte
2856*fcf3ce44SJohn Forte DEBUG(2, "HBA_SetPersistentBindingV2 port: %s", WWN2STR1(&hbaPortWWN), 0, 0);
2857*fcf3ce44SJohn Forte
2858*fcf3ce44SJohn Forte CHECKLIBRARY();
2859*fcf3ce44SJohn Forte registeredfunc = lib_infop->functionTable.SetPersistentBindingV2Handler;
2860*fcf3ce44SJohn Forte if (registeredfunc != NULL) {
2861*fcf3ce44SJohn Forte status =(registeredfunc)(vendorHandle, hbaPortWWN, pbinding);
2862*fcf3ce44SJohn Forte } else {
2863*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2864*fcf3ce44SJohn Forte }
2865*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2866*fcf3ce44SJohn Forte }
2867*fcf3ce44SJohn Forte
2868*fcf3ce44SJohn Forte HBA_STATUS
HBA_GetPersistentBindingV2(HBA_HANDLE handle,HBA_WWN hbaPortWWN,HBA_FCPBINDING2 * pbinding)2869*fcf3ce44SJohn Forte HBA_GetPersistentBindingV2 (
2870*fcf3ce44SJohn Forte HBA_HANDLE handle,
2871*fcf3ce44SJohn Forte HBA_WWN hbaPortWWN,
2872*fcf3ce44SJohn Forte HBA_FCPBINDING2 *pbinding)
2873*fcf3ce44SJohn Forte {
2874*fcf3ce44SJohn Forte HBA_STATUS status;
2875*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2876*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2877*fcf3ce44SJohn Forte HBAGetPersistentBindingV2Func
2878*fcf3ce44SJohn Forte registeredfunc;
2879*fcf3ce44SJohn Forte
2880*fcf3ce44SJohn Forte DEBUG(2, "HBA_GetPersistentBindingV2 port: %s", WWN2STR1(&hbaPortWWN), 0, 0);
2881*fcf3ce44SJohn Forte
2882*fcf3ce44SJohn Forte CHECKLIBRARY();
2883*fcf3ce44SJohn Forte registeredfunc = lib_infop->functionTable.GetPersistentBindingV2Handler;
2884*fcf3ce44SJohn Forte if (registeredfunc != NULL) {
2885*fcf3ce44SJohn Forte status =(registeredfunc)(vendorHandle, hbaPortWWN, pbinding);
2886*fcf3ce44SJohn Forte } else {
2887*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2888*fcf3ce44SJohn Forte }
2889*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2890*fcf3ce44SJohn Forte }
2891*fcf3ce44SJohn Forte
2892*fcf3ce44SJohn Forte HBA_STATUS
HBA_RemovePersistentBinding(HBA_HANDLE handle,HBA_WWN hbaPortWWN,const HBA_FCPBINDING2 * pbinding)2893*fcf3ce44SJohn Forte HBA_RemovePersistentBinding (
2894*fcf3ce44SJohn Forte HBA_HANDLE handle,
2895*fcf3ce44SJohn Forte HBA_WWN hbaPortWWN,
2896*fcf3ce44SJohn Forte const HBA_FCPBINDING2
2897*fcf3ce44SJohn Forte *pbinding)
2898*fcf3ce44SJohn Forte {
2899*fcf3ce44SJohn Forte HBA_STATUS status;
2900*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2901*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2902*fcf3ce44SJohn Forte HBARemovePersistentBindingFunc
2903*fcf3ce44SJohn Forte registeredfunc;
2904*fcf3ce44SJohn Forte
2905*fcf3ce44SJohn Forte DEBUG(2, "HBA_RemovePersistentBinding", 0, 0, 0);
2906*fcf3ce44SJohn Forte
2907*fcf3ce44SJohn Forte CHECKLIBRARY();
2908*fcf3ce44SJohn Forte registeredfunc =
2909*fcf3ce44SJohn Forte lib_infop->functionTable.RemovePersistentBindingHandler;
2910*fcf3ce44SJohn Forte if (registeredfunc != NULL) {
2911*fcf3ce44SJohn Forte status =(registeredfunc)(vendorHandle, hbaPortWWN, pbinding);
2912*fcf3ce44SJohn Forte } else {
2913*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2914*fcf3ce44SJohn Forte }
2915*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2916*fcf3ce44SJohn Forte }
2917*fcf3ce44SJohn Forte
2918*fcf3ce44SJohn Forte HBA_STATUS
HBA_RemoveAllPersistentBindings(HBA_HANDLE handle,HBA_WWN hbaPortWWN)2919*fcf3ce44SJohn Forte HBA_RemoveAllPersistentBindings (
2920*fcf3ce44SJohn Forte HBA_HANDLE handle,
2921*fcf3ce44SJohn Forte HBA_WWN hbaPortWWN)
2922*fcf3ce44SJohn Forte {
2923*fcf3ce44SJohn Forte HBA_STATUS status;
2924*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2925*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2926*fcf3ce44SJohn Forte HBARemoveAllPersistentBindingsFunc
2927*fcf3ce44SJohn Forte registeredfunc;
2928*fcf3ce44SJohn Forte
2929*fcf3ce44SJohn Forte DEBUG(2, "HBA_RemoveAllPersistentBindings", 0, 0, 0);
2930*fcf3ce44SJohn Forte
2931*fcf3ce44SJohn Forte CHECKLIBRARY();
2932*fcf3ce44SJohn Forte registeredfunc =
2933*fcf3ce44SJohn Forte lib_infop->functionTable.RemoveAllPersistentBindingsHandler;
2934*fcf3ce44SJohn Forte if (registeredfunc != NULL) {
2935*fcf3ce44SJohn Forte status =(registeredfunc)(vendorHandle, hbaPortWWN);
2936*fcf3ce44SJohn Forte } else {
2937*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2938*fcf3ce44SJohn Forte }
2939*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2940*fcf3ce44SJohn Forte }
2941*fcf3ce44SJohn Forte
2942*fcf3ce44SJohn Forte HBA_STATUS
HBA_GetFC4Statistics(HBA_HANDLE handle,HBA_WWN portWWN,HBA_UINT8 FC4type,HBA_FC4STATISTICS * pstatistics)2943*fcf3ce44SJohn Forte HBA_GetFC4Statistics (
2944*fcf3ce44SJohn Forte HBA_HANDLE handle,
2945*fcf3ce44SJohn Forte HBA_WWN portWWN,
2946*fcf3ce44SJohn Forte HBA_UINT8 FC4type,
2947*fcf3ce44SJohn Forte HBA_FC4STATISTICS *pstatistics)
2948*fcf3ce44SJohn Forte {
2949*fcf3ce44SJohn Forte HBA_STATUS status;
2950*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2951*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2952*fcf3ce44SJohn Forte HBAGetFC4StatisticsFunc
2953*fcf3ce44SJohn Forte registeredfunc;
2954*fcf3ce44SJohn Forte
2955*fcf3ce44SJohn Forte DEBUG(2, "HBA_GetFC4Statistics port: %s", WWN2STR1(&portWWN), 0, 0);
2956*fcf3ce44SJohn Forte
2957*fcf3ce44SJohn Forte CHECKLIBRARY();
2958*fcf3ce44SJohn Forte registeredfunc =
2959*fcf3ce44SJohn Forte lib_infop->functionTable.GetFC4StatisticsHandler;
2960*fcf3ce44SJohn Forte if (registeredfunc != NULL) {
2961*fcf3ce44SJohn Forte status =(registeredfunc)
2962*fcf3ce44SJohn Forte (vendorHandle, portWWN, FC4type, pstatistics);
2963*fcf3ce44SJohn Forte } else {
2964*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2965*fcf3ce44SJohn Forte }
2966*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2967*fcf3ce44SJohn Forte }
2968*fcf3ce44SJohn Forte
2969*fcf3ce44SJohn Forte HBA_STATUS
HBA_GetFCPStatistics(HBA_HANDLE handle,const HBA_SCSIID * lunit,HBA_FC4STATISTICS * pstatistics)2970*fcf3ce44SJohn Forte HBA_GetFCPStatistics (
2971*fcf3ce44SJohn Forte HBA_HANDLE handle,
2972*fcf3ce44SJohn Forte const HBA_SCSIID *lunit,
2973*fcf3ce44SJohn Forte HBA_FC4STATISTICS *pstatistics)
2974*fcf3ce44SJohn Forte {
2975*fcf3ce44SJohn Forte HBA_STATUS status;
2976*fcf3ce44SJohn Forte HBA_LIBRARY_INFO *lib_infop;
2977*fcf3ce44SJohn Forte HBA_HANDLE vendorHandle;
2978*fcf3ce44SJohn Forte HBAGetFCPStatisticsFunc
2979*fcf3ce44SJohn Forte registeredfunc;
2980*fcf3ce44SJohn Forte
2981*fcf3ce44SJohn Forte DEBUG(2, "HBA_GetFCPStatistics", 0, 0, 0);
2982*fcf3ce44SJohn Forte
2983*fcf3ce44SJohn Forte CHECKLIBRARY();
2984*fcf3ce44SJohn Forte registeredfunc =
2985*fcf3ce44SJohn Forte lib_infop->functionTable.GetFCPStatisticsHandler;
2986*fcf3ce44SJohn Forte if (registeredfunc != NULL) {
2987*fcf3ce44SJohn Forte status =(registeredfunc)(vendorHandle, lunit, pstatistics);
2988*fcf3ce44SJohn Forte } else {
2989*fcf3ce44SJohn Forte status = HBA_STATUS_ERROR_NOT_SUPPORTED;
2990*fcf3ce44SJohn Forte }
2991*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
2992*fcf3ce44SJohn Forte }
2993*fcf3ce44SJohn Forte
2994*fcf3ce44SJohn Forte HBA_UINT32
HBA_GetVendorLibraryAttributes(HBA_UINT32 adapter_index,HBA_LIBRARYATTRIBUTES * attributes)2995*fcf3ce44SJohn Forte HBA_GetVendorLibraryAttributes (
2996*fcf3ce44SJohn Forte HBA_UINT32 adapter_index,
2997*fcf3ce44SJohn Forte HBA_LIBRARYATTRIBUTES *attributes)
2998*fcf3ce44SJohn Forte {
2999*fcf3ce44SJohn Forte HBA_ADAPTER_INFO *adapt_infop;
3000*fcf3ce44SJohn Forte HBAGetVendorLibraryAttributesFunc
3001*fcf3ce44SJohn Forte registeredfunc;
3002*fcf3ce44SJohn Forte HBA_UINT32 ret = 0;
3003*fcf3ce44SJohn Forte
3004*fcf3ce44SJohn Forte DEBUG(2, "HBA_GetVendorLibraryAttributes adapterindex:%d",
3005*fcf3ce44SJohn Forte adapter_index, 0, 0);
3006*fcf3ce44SJohn Forte if(_hbaapi_librarylist == NULL) {
3007*fcf3ce44SJohn Forte DEBUG(1, "HBAAPI not loaded yet.", 0, 0, 0);
3008*fcf3ce44SJohn Forte return(0);
3009*fcf3ce44SJohn Forte }
3010*fcf3ce44SJohn Forte
3011*fcf3ce44SJohn Forte if (attributes == NULL) {
3012*fcf3ce44SJohn Forte return(HBA_STATUS_ERROR_ARG);
3013*fcf3ce44SJohn Forte }
3014*fcf3ce44SJohn Forte
3015*fcf3ce44SJohn Forte memset(attributes, 0, sizeof(HBA_LIBRARYATTRIBUTES));
3016*fcf3ce44SJohn Forte
3017*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_LL_mutex);
3018*fcf3ce44SJohn Forte GRAB_MUTEX(&_hbaapi_AL_mutex);
3019*fcf3ce44SJohn Forte for(adapt_infop = _hbaapi_adapterlist;
3020*fcf3ce44SJohn Forte adapt_infop != NULL;
3021*fcf3ce44SJohn Forte adapt_infop = adapt_infop->next) {
3022*fcf3ce44SJohn Forte
3023*fcf3ce44SJohn Forte if(adapt_infop->index == adapter_index) {
3024*fcf3ce44SJohn Forte registeredfunc = adapt_infop->library->
3025*fcf3ce44SJohn Forte functionTable.GetVendorLibraryAttributesHandler;
3026*fcf3ce44SJohn Forte if(registeredfunc != NULL) {
3027*fcf3ce44SJohn Forte ret = (registeredfunc)(attributes);
3028*fcf3ce44SJohn Forte } else {
3029*fcf3ce44SJohn Forte /* Version 1 libary? */
3030*fcf3ce44SJohn Forte HBAGetVersionFunc GetVersionFunc;
3031*fcf3ce44SJohn Forte GetVersionFunc = adapt_infop->library->
3032*fcf3ce44SJohn Forte functionTable.GetVersionHandler;
3033*fcf3ce44SJohn Forte if(GetVersionFunc != NULL) {
3034*fcf3ce44SJohn Forte ret = ((GetVersionFunc)());
3035*fcf3ce44SJohn Forte }
3036*fcf3ce44SJohn Forte #ifdef NOTDEF
3037*fcf3ce44SJohn Forte else {
3038*fcf3ce44SJohn Forte /* This should not happen, dont think its going to */
3039*fcf3ce44SJohn Forte }
3040*fcf3ce44SJohn Forte #endif
3041*fcf3ce44SJohn Forte }
3042*fcf3ce44SJohn Forte if (attributes->LibPath[0] == '\0') {
3043*fcf3ce44SJohn Forte if(strlen(adapt_infop->library->LibraryPath) < 256) {
3044*fcf3ce44SJohn Forte strcpy(attributes->LibPath,
3045*fcf3ce44SJohn Forte adapt_infop->library->LibraryPath);
3046*fcf3ce44SJohn Forte }
3047*fcf3ce44SJohn Forte }
3048*fcf3ce44SJohn Forte break;
3049*fcf3ce44SJohn Forte }
3050*fcf3ce44SJohn Forte }
3051*fcf3ce44SJohn Forte RELEASE_MUTEX(&_hbaapi_AL_mutex);
3052*fcf3ce44SJohn Forte RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, ret);
3053*fcf3ce44SJohn Forte }
3054