SMHBAAPILIB.c revision 1
1N/A * ************************************************************************ 1N/A * The contents of this file are subject to the SNIA Public License 1N/A * Version 1.0 (the "License"); you may not use this file except in 1N/A * compliance with the License. You may obtain a copy of the License at 1N/A * Software distributed under the License is distributed on an "AS IS" 1N/A * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See 1N/A * the License for the specific language governing rights and limitations 1N/A * under the License. 1N/A * The Original Code is SNIA HBA API Wrapper Library 1N/A * The Initial Developer of the Original Code is: 1N/A * Benjamin F. Kuo, Troika Networks, Inc. (benk@troikanetworks.com) 1N/A * Tuan Lam, QLogic Corp. (t_lam@qlc.com) 1N/A * Dan Willie, Emulex Corp. (Dan.Willie@emulex.com) 1N/A * Dixon Hutchinson, Legato Systems, Inc. (dhutchin@legato.com) 1N/A * David Dillard, VERITAS Software Corp. (david.dillard@veritas.com) 1N/A * ************************************************************************ 1N/A * Adding on SM-HBA support 1N/A * The implementation includes Three different categories functions to support 1N/A * both HBAAPI and SM-HBA through the same library. 1N/A * SM-HBA unique interface: 1N/A * 1. CHECKLIBRARYANDVERSION(SMHBA) : match SMHBA VSL 1N/A * Or checking specifically if version is SMHBA beforehand. 1N/A * HBAAPIV2 unique functions 1N/A * 1. CHECKLIBRARYANDVERSION(HBAAPIV2) : validate and match HBAAPI V2 VSL. 1N/A * Or checking specifically if version is HBAAPIV2 beforehand. 1N/A * 2. resolved to ftable.functiontable.{interface} 1N/A * Common interface between SM-HBA and HBAAPIV2. 1N/A * 1. CHECKLIBRARY() : to validate the VSL. 1N/A * 2. FUNCCOMMON macro to map the appropriate entry point table 1N/A * 3. If the interface is not supported by HBAAPI(Version 1) 1N/A * the funtiion ptr will be set to NULL. 1N/A * Common interface between HBAAPI and HBAAPIV2. 1N/A * 1. Check if version is not SMHBA). 1N/A * 2. ftable.functiontalbe.(interface) 1N/A * ************************************************************************ 1N/A * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 1N/A * Use is subject to license terms. 1N/A * Next define forces entry points in the dll to be exported 1N/A * LIBRARY_NUM is a shortcut to figure out which library we need to call. 1N/A * The top 16 bits of handle are the library index 1N/A * VENDOR_HANDLE turns a global library handle into a vendor specific handle, 1N/A * with all upper 16 bits set to 0 1N/A#
else /* Not both USESYSLOG and USELOGFILE */ 1N/A#
endif /* USESYSLOG */ 1N/A#
endif /* USELOGFILE */ 1N/A#
endif /* Not both USELOGFILE and USESYSLOG */ 1N/A * When multiple mutex's are grabed, they must be always be grabbed in 1N/A * the same order, or deadlock can result. There are three levels 1N/A * of mutex's involved in this API. If LL_mutex is grabbed, always grap 1N/A * it first. If AL_mutex is grabbed, it may not be grabbed before 1N/A * LL_mutex. If grabbed in a multi grab sequence, the mutex's protecting 1N/A * the callback lists must always be grabbed last and release before calling 1N/A * a vendor specific library function that might invoke a callback function 1N/A * on the same thread. 1N/A * Vendor library information 1N/A * Macro to use the right function table between smhba and hbaapi. 1N/A * Macro to use the right function ptr between smhba and hbaapi function table. 1N/A * Should be used for an interface common to SM-HBA and HBAAPIV2. 1N/A * Macro to use the hbaapi function ptr. 1N/A * Should be used for an interface applicable only HBAAPIV2. 1N/A * Macro to use the hbaapi function ptr. 1N/A * Should be used for an interface applicable only HBAAPIV2. 1N/A * Individual adapter (hba) information 1N/A * Call back registration 1N/A * Each instance of HBA_ADAPTERCALLBACK_ELEM represents a call to one of 1N/A * "register" functions that apply to a particular adapter. 1N/A * HBA_ALLADAPTERSCALLBACK_ELEM is used just for HBA_RegisterForAdapterAddEvents 1N/A/* mutex's to protect each list */ 1N/A * Common library internal. Mutex handling 1N/A/* LINTED E_FUNC_SET_NOT_USED */ 1N/A/* LINTED E_FUNC_SET_NOT_USED */ 1N/A DEBUG(
1,
"pthread_mutex_unlock returned %d",
ret, 0, 0);
1N/A * Common library internal. Check library and return vendorhandle 1N/A /* caller will release the mutex */ 1N/A * freevendorhandlelist is called with _hbaapi_LL_mutex already held 1N/A /* search through the simple lists first */ 1N/A * if it wasnt in the simple lists, 1N/A * look in the list for adapteraddevents 1N/A /* should be HBAAPIV2 VSL to get to here */ 1N/A /* now search smhba adapteradd events. */ 1N/A /* should be SMHBA VSL to get to here */ 1N/A/* LINTED E_STATIC_UE_STATIC_UNUSED */ 1N/A/* LINTED E_STATIC_UE_STATIC_UNUSED */ 1N/A/* LINTED E_STATIC_UE_STATIC_UNUSED */ 1N/A/* LINTED E_STATIC_UE_STATIC_UNUSED */ 1N/A for (j = 0; j <
16; j +=
2) {
1N/A * Read in the config file and load all the specified vendor specific 1N/A * libraries and perform the function registration exercise 1N/A /* Open configuration file from known location */ 1N/A /* this is an app programming error */ 1N/A /* ???Opportunity to send error msg, configuration error */ 1N/A * Enumerate all the subkeys. These have the form: 1N/A * HKLM\Software\SNIA\HBA\<Vendor id> - note that we don't care 1N/A * what the vendor id is 1N/A for (i = 0; ; i++) {
1N/A break;
/* we're done */ 1N/A /* Now open the subkey that pertains to this vendor's library */ 1N/A /* ???Opportunity to send error msg, installation error */ 1N/A * you may want to return something 1N/A * else or keep trying 1N/A * The name of the library is contained in a REG_SZ Value 1N/A * keyed to "LibraryFile" 1N/A /* ???Opportunity to send error msg, installation error */ 1N/A /* what is the right thing to do in MS land??? */ 1N/A /* ???Opportunity to send error msg, installation error */ 1N/A /* Now I can try to load the library */ 1N/A /* printf("unable to load library %s\n", librarypath); */ 1N/A /* ???Opportunity to send error msg, installation error */ 1N/A /* library not loaded */ 1N/A /* ???Opportunity to send error msg, library error? */ 1N/A /* Call the registration function to get the list of pointers */ 1N/A * Load the function pointers directly into 1N/A * the table of functions 1N/A /* library not loaded */ 1N/A /* ???Opportunity to send error msg, library error? */ 1N/A /* Maybe the vendor library is only Rev1 */ 1N/A /* ???Opportunity to send error msg, library error? */ 1N/A * Load the function points directly into 1N/A * the Rev 2 table of functions 1N/A /* library not loaded */ 1N/A /* ???Opportunity to send error msg, library error? */ 1N/A /* successfully loaded library */ 1N/A * SM-HBA and HBAAPI has a seperate handler for GetVersion but 1N/A * they have the same function signature so use the same variable here. 1N/A /* Check the version of this library before loading */ 1N/A#
ifdef NOTDEF /* save for a later time... when it matters */ 1N/A /* Check the version of this library before loading */ 1N/A /* Actually... This wrapper is compatible with version 1 */ 1N/A#
ifdef NOTDEF /* save for a later time... when it matters */ 1N/A /* ???Opportunity to send error msg, library error? */ 1N/A /* Hmmm, dont we need to flag this in a realy big way??? */ 1N/A /* How about messages to the system event logger ??? */ 1N/A /* ???Opportunity to send error msg, library error? */ 1N/A /* Initialize this library */ 1N/A /* ???Opportunity to send error msg, library error? */ 1N/A /* successfully loaded library */ 1N/A#
else /* Unix as opposed to Win32 */ 1N/A "HBA_LoadLibrary: previously unfreed " 1N/A "libraries exist, call HBA_FreeLibrary().\n");
1N/A /* Read in each line and load library */ 1N/A /* Skip the comments... */ 1N/A /* grab first 'thing' in line (if its there) */ 1N/A "Library name(%s) in %s is > 64 characters\n",
1N/A /* grab second 'thing' in line (if its there) */ 1N/A "Library path(%s) in %s is > 256 characters\n",
1N/A /* there should be no more 'things' in the line */ 1N/A /* Continue to the next line if library name or path is invalid */ 1N/A /* error handling does the right thing automagically */ 1N/A /* Load the DLL now */ 1N/A /* printf("unable to load library %s\n", librarypath); */ 1N/A /* Call the registration function to get the list of pointers */ 1N/A * Load the function points directly into 1N/A * the table of functions 1N/A /* library not loaded */ 1N/A * Load the function points directly into 1N/A * the table of functions 1N/A /* library not loaded */ 1N/A /* Maybe the vendor library is only Rev1 */ 1N/A /* This function is required */ 1N/A "HBA_LoadLibrary: vendor specific RegisterLibrary " 1N/A DEBUG(
1,
"HBA_LoadLibrary: vendor specific " 1N/A "RegisterLibrary function not found. lib: %s\n",
1N/A * Load the function points directly into 1N/A * the table of functions 1N/A /* library not loaded */ 1N/A "HBA_LoadLibrary: vendor specific RegisterLibrary " 1N/A "function encountered an error. lib: %s\n",
1N/A "HBA_LoadLibrary: vendor specific RegisterLibrary " 1N/A "function encountered an error. lib: %s\n",
1N/A /* successfully loaded library */ 1N/A * SM-HBA and HBAAPI has a seperate handler for GetVersion but 1N/A * they have the same function signature so use the same variable here. 1N/A "Got %d expected %d.\n",
1N/A /* Check the version of this library before loading */ 1N/A /* Actually... This wrapper is compatible with version 1 */ 1N/A "Got %d expected %d.\n",
1N/A /* this function is required */ 1N/A "HBA_LoadLibrary: vendor specific LoadLibrary " 1N/A DEBUG(
1,
"HBA_LoadLibrary: vendor specific LoadLibrary " 1N/A /* Initialize this library */ 1N/A /* maybe this should be a printf so that we CANNOT miss it */ 1N/A "HBA_LoadLibrary: Encounterd and error loading: %s",
1N/A /* successfully loaded library */ 1N/A#
endif /* WIN32 or UNIX */ 1N/A * The _hbaapi_LL_mutex is already grabbed to proctect the caller of 1N/A * HBA_FreeLibrary() during loading. 1N/A * The mutexes are already initialized 1N/A * with PTHREAD_MUTEX_INITIALIZER. Do we need to init again? 1N/A * Keeping the code from HBAAPI source... 1N/A perror(
"pthread_mutex_init - HBA_LoadLibrary");
1N/A/* LINTED E_FUNC_SET_NOT_USED */ 1N/A /* Free this library */ 1N/A * OK, now all functions are disabled except for LoadLibrary, 1N/A * Hope no other thread calls it before we have returned 1N/A * Free up the callbacks, this is not the most efficient, but it works 1N/A /* this will unlock them as well, but who cares */ 1N/A * The API used to use fixed size tables as its primary data structure. 1N/A * Indexing from 1 to N identified each adapters. Now the adapters are 1N/A * on a linked list. There is a unique "index" foreach each adapter. 1N/A * Adapters always keep their index, even if they are removed from the 1N/A * hardware. The only time the indexing is reset is on HBA_FreeLibrary 1N/A DEBUG(
1,
"HBAAPI: num_adapters for %s = %d\n",
1N/A DEBUG(
1,
"HBAAPI: num_adapters for %s = %d\n",
1N/A /* Also get the names of all the adapters here and cache */ 1N/A * check for duplicates, really, 1N/A * this may just be a second 1N/A * call to this function 1N/A * ??? how do we know when a name becomes stale? 1N/A /* already got this one */ 1N/A "HBA_GetNumberOfAdapters: calloc failed" 1N/A DEBUG(
1,
"HBA_GetAdapterName: NULL pointer adatpername",
1N/A * The adapter index is from old code, but we have 1N/A * to support it. Go down the list looking for 1N/A DEBUG(
2,
"GetAdapterName for index:%d ->%s",
1N/A DEBUG(
1,
"HBA_OpenAdapter: NULL pointer adatpername",
1N/A /* retrieve the vendor handle */ 1N/A /* or this with the library index to get the common handle */ 1N/A * Finding an adapter with matching WWN. 1N/A /* only for HBAAPIV2 */ 1N/A /* look for new hardware */ 1N/A * We do not know if the WWN is known by this vendor, 1N/A /* OK, make a vendor non-specific handle */ 1N/A DEBUG(
2,
"HBA_RefreshAdapterConfiguration", 0, 0, 0);
1N/A * This function is VERY OS dependent. Wing it as best you can. 1N/A DEBUG(
2,
"HBA_GetWrapperLibraryAttributes", 0, 0, 0);
1N/A DEBUG(
1,
"HBA_GetWrapperLibraryAttributes:" 1N/A "NULL pointer attributes",
1N/A /* No need to do anything with the module handle */ 1N/A /* It wasn't alloocated so it doesn't need to be freed */ 1N/A * Callback registation and handling 1N/A DEBUG(
2,
"HBA_RemoveCallback", 0, 0, 0);
1N/A/* Adapter Add Events ************************************************* */ 1N/A/* LINTED E_FUNC_ARG_UNUSED */ 1N/A DEBUG(
2,
"HBA_RegisterForAdapterAddEvents", 0, 0, 0);
1N/A "HBA_RegisterForAdapterAddEvents: calloc failed " 1N/A * Need to release the mutex now incase the vendor function invokes the 1N/A * callback. We will grap the mutex later to attach the vendor handle 1N/A * list to the callback structure 1N/A * now create a list of vendors (vendor libraryies, NOT ADAPTERS) 1N/A * that have successfully registerred 1N/A /* only for HBAAPI V2 */ 1N/A "HBA_RegisterForAdapterAddEvents: " 1N/A "calloc failed for %lu bytes\n",
1N/A "HBA_RegisterForAdapterAddEvents: Library->%s, Error->%d",
1N/A "HBA_RegisterForAdapterAddEvents: Library->%s, Error->%d",
1N/A /* no HBAAPIV2 is deteced. should be okay? */ 1N/A * At least one vendor library registered this function, but no 1N/A * vendor call succeeded 1N/A /* we have had atleast some success, now finish up */ 1N/A * this seems silly, but what if another thread called 1N/A * the callback remove 1N/A /* yup, its still there, hooray */ 1N/A * bummer, somebody removed the callback before we finished 1N/A * registration, probably will never happen 1N/A "HBA_RegisterForAdapterAddEvents: HBA_RemoveCallback was " 1N/A "called for a handle before registration was finished.",
1N/A/* Adapter Events (other than add) ************************************** */ 1N/A DEBUG(
2,
"HBA_RegisterForAdapterEvents", 0, 0, 0);
1N/A /* we now have the _hbaapi_LL_mutex */ 1N/A * that allocated memory is used both as the handle for the 1N/A * caller, and as userdata to the vendor call so that on 1N/A * callback the specific registration may be recalled 1N/A "HBA_RegisterForAdapterEvents: calloc failed for %lu bytes\n",
1N/A/* Adapter Port Events ************************************************** */ 1N/A DEBUG(
3,
"AdapterPortEvent, port:%s, eventType:%d fabricPortID:0X%06x",
1N/A DEBUG(
2,
"HBA_RegisterForAdapterPortEvents for port: %s",
1N/A /* we now have the _hbaapi_LL_mutex */ 1N/A * that allocated memory is used both as the handle for the 1N/A * caller, and as userdata to the vendor call so that on 1N/A * callback the specific registration may be recalled 1N/A "HBA_RegisterForAdapterPortEvents: " 1N/A "calloc failed for %lu bytes\n",
1N/A/* Adapter State Events ************************************************ */ 1N/A DEBUG(
3,
"AdapterPortStatEvent, port:%s, eventType:%d",
1N/A DEBUG(
2,
"HBA_RegisterForAdapterPortStatEvents for port: %s",
1N/A /* we now have the _hbaapi_LL_mutex */ 1N/A * that allocated memory is used both as the handle for the 1N/A * caller, and as userdata to the vendor call so that on 1N/A * callback the specific registration may be recalled 1N/A "HBA_RegisterForAdapterPortStatEvents: " 1N/A "calloc failed for %lu bytes\n",
1N/A/* Target Events ******************************************************* */ 1N/A DEBUG(
3,
"TargetEvent, hbaPort:%s, discoveredPort:%s eventType:%d",
1N/A DEBUG(
2,
"HBA_RegisterForTargetEvents, hbaPort: %s, discoveredPort: %s",
1N/A /* we now have the _hbaapi_LL_mutex */ 1N/A * that allocated memory is used both as the handle for the 1N/A * caller, and as userdata to the vendor call so that on 1N/A * callback the specific registration may be recalled 1N/A "HBA_RegisterForTargetEvents: calloc failed for %lu bytes\n",
1N/A/* Link Events ********************************************************* */ 1N/A DEBUG(
3,
"LinkEvent, hbaWWN:%s, eventType:%d",
1N/A DEBUG(
2,
"HBA_RegisterForLinkEvents", 0, 0, 0);
1N/A /* we now have the _hbaapi_LL_mutex */ 1N/A * that allocated memory is used both as the handle for the 1N/A * caller, and as userdata to the vendor call so that on 1N/A * callback the specific registration may be recalled 1N/A "HBA_RegisterForLinkEvents: calloc failed for %lu bytes\n",
1N/A * All of the functions below are almost passthru functions to the 1N/A * vendor specific function 1N/A DEBUG(
2,
"HBA_GetAdapterAttributes", 0, 0, 0);
1N/A DEBUG(
2,
"HBA_GetAdapterPortAttributes", 0, 0, 0);
1N/A DEBUG(
2,
"HBA_GetPortStatistics", 0, 0, 0);
1N/A DEBUG(
2,
"HBA_GetDiscoveredPortAttributes", 0, 0, 0);
1N/A DEBUG(
2,
"HBA_SendCTPassThru", 0, 0, 0);
1N/A DEBUG(
2,
"HBA_SendCTPassThruV2m hbaPortWWN: %s",
1N/A DEBUG(
2,
"HBA_GetEventBuffer", 0, 0, 0);
1N/A DEBUG(
2,
"HBA_SetRNIDMgmtInfo", 0, 0, 0);
1N/A DEBUG(
2,
"HBA_GetRNIDMgmtInfo", 0, 0, 0);
1N/A DEBUG(
2,
"HBA_RefreshInformation", 0, 0, 0);
1N/A DEBUG(
2,
"HBA_ResetStatistics", 0, 0, 0);
1N/A DEBUG(
2,
"HBA_GetFcpTargetMapping", 0, 0, 0);
1N/A DEBUG(
2,
"HBA_GetFcpTargetMapping", 0, 0, 0);
1N/A DEBUG(
2,
"HBA_GetFcpPersistentBinding", 0, 0, 0);
1N/A DEBUG(
2,
"HBA_ScsiInquiryV2 to discoveredPortWWN: %s",
1N/A DEBUG(
2,
"HBA_SendScsiInquiry to PortWWN: %s",
1N/A DEBUG(
2,
"HBA_ScsiReportLUNsV2 to discoveredPortWWN: %s",
1N/A DEBUG(
2,
"HBA_ScsiReadCapacityV2 to discoveredPortWWN: %s",
1N/A DEBUG(
2,
"HBA_SendReadCapacity to portWWN: %s",
1N/A DEBUG(
2,
"HBA_SendRPL to agent_wwn: %s:%d",
1N/A DEBUG(
2,
"HBA_SendRPS to agent_wwn: %s:%d",
1N/A DEBUG(
2,
"HBA_GetBindingCapability", 0, 0, 0);
1N/A DEBUG(
2,
"HBA_GetBindingSupport", 0, 0, 0);
1N/A DEBUG(
2,
"HBA_SetBindingSupport", 0, 0, 0);
1N/A DEBUG(
2,
"HBA_SetPersistentBindingV2 port: %s",
1N/A DEBUG(
2,
"HBA_GetPersistentBindingV2 port: %s",
1N/A DEBUG(
2,
"HBA_RemovePersistentBinding", 0, 0, 0);
1N/A DEBUG(
2,
"HBA_RemoveAllPersistentBindings", 0, 0, 0);
1N/A DEBUG(
2,
"HBA_GetFCPStatistics", 0, 0, 0);
1N/A DEBUG(
2,
"HBA_GetVendorLibraryAttributes adapterindex:%d",
1N/A DEBUG(
1,
"HBAAPI not loaded yet.", 0, 0, 0);
1N/A "HBA_GetVendorLibraryAttributes: NULL pointer attributes",
1N/A /* Version 1 libary? */ 1N/A /* This should not happen, dont think its going to */ 1N/A * This function returns SM-HBA version that the warpper library implemented. 1N/A * This function returns the attributes for the warpper library. 1N/A DEBUG(
2,
"SMHBA_GetWrapperLibraryAttributes", 0, 0, 0);
1N/A DEBUG(
1,
"SMHBA_GetWrapperLibraryAttributes: " 1N/A "NULL pointer attributes",
1N/A * This function returns the attributes for the warpper library. 1N/A DEBUG(
2,
"SMHBA_GetVendorLibraryAttributes adapterindex:%d",
1N/A DEBUG(
1,
"SMHBAAPI not loaded yet.", 0, 0, 0);
1N/A DEBUG(
1,
"SMHBA_GetVendorLibraryAttributes: " 1N/A "NULL pointer attributes",
1N/A /* This should not happen since the VSL is already loaded. */ 1N/A DEBUG(
2,
"SMHBA_GetAdapterAttributes", 0, 0, 0);
1N/A DEBUG(
2,
"SMHBA_GetAdapterAttributes", 0, 0, 0);
1N/A DEBUG(
2,
"SMHBA_GetAdapterAttributes", 0, 0, 0);
1N/A DEBUG(
2,
"SMHBA_GetAdapterPortAttributes", 0, 0, 0);
1N/A DEBUG(
2,
"SMHBA_GetDiscoveredPortAttributes", 0, 0, 0);
1N/A DEBUG(
2,
"SMHBA_GetFCPhyAttributesByWWN", 0, 0, 0);
1N/A DEBUG(
2,
"SMHBA_GetFCPhyAttributesByWWN", 0, 0, 0);
1N/A DEBUG(
2,
"SMHBA_GetProtocolStatistics port index: %d protocol type: %d",
1N/A DEBUG(
2,
"SMHBA_GetPhyStatistics port index: %d phy idex: %d",
1N/A DEBUG(
2,
"HBA_GetBindingCapability", 0, 0, 0);
1N/A DEBUG(
2,
"SMHBA_GetBindingSupport port: %s",
1N/A DEBUG(
2,
"SMHBA_GetBindingSupport port: %s",
1N/A DEBUG(
2,
"SMHBA_GetTargetMapping port WWN: %s",
1N/A DEBUG(
2,
"SMHBA_GetPersistentBinding port WWN: %s",
1N/A DEBUG(
2,
"SMHBA_SetPersistentBinding port WWN: %s",
1N/A DEBUG(
2,
"SMHBA_RemovePersistentBinding port WWN: %s",
1N/A DEBUG(
2,
"SMHBA_RemoveAllPersistentBinding port WWN: %s",
1N/A DEBUG(
2,
"SMHBA_GetLUNStatistics", 0, 0, 0);
1N/A DEBUG(
2,
"SMHBA_ScsiInquiry to hba port: %s discoveredPortWWN: %s",
1N/A DEBUG(
2,
"SMHBA_ScsiReportLuns to hba port: %s discoveredPortWWN: %s",
1N/A DEBUG(
2,
"SMHBA_ScsiReadCapacity to hba port: %s discoveredPortWWN: %s",
1N/A DEBUG(
2,
"SMHBA_SendTEST, hbaPortWWN: %s destWWN",
1N/A DEBUG(
2,
"SMHBA_SendECHO, hbaPortWWN: %s destWWN",
1N/A DEBUG(
2,
"SMHBA_SendSMPPassThru, hbaPortWWN: %s destWWN: %s",
1N/A * Following the similar logic of HBAAPI addaspterevents_callback. 1N/A * Unlike other events Adapter Add Event is not limited to a specific 1N/A * adpater(i.e. no adatper handle is passed for registration) so 1N/A * the event should be passed to all registrants. The routine below 1N/A * is passed to the VSLs as a callback and when Adapter Add event is detected 1N/A * by VSL it will call smhba_adapteraddevents_callback() which in turn check 1N/A * if the passed userdata ptr matches with the one stored in the callback list 1N/A * and calls the stored callback. 1N/A * For the situation that multiple clients are registered for Adapter Add event 1N/A * each registration is passed to VSLs so VSL may call 1N/A * smhba_adapteraddevents_callback() multiple times or it may call only once 1N/A * since the callback function is same. For this implemneation, the userdata 1N/A * is stored in HBA_ALLADAPTERSCALLBACK_ELEM so it is expected that VSL call 1N/A * smhba_adapteraddevents_callback() only once and 1N/A * smhba_adapteraddevents_callback() will call the client callback with proper 1N/A/* LINTED E_FUNC_ARG_UNUSED */ 1N/A/* LINTED E_FUNC_ARG_UNUSED */ 1N/A DEBUG(
2,
"SMHBA_RegisterForAdapterAddEvents", 0, 0, 0);
1N/A * Need to release the mutex now incase the vendor function invokes the 1N/A * callback. We will grap the mutex later to attach the vendor handle 1N/A * list to the callback structure 1N/A * now create a list of vendors (vendor libraryies, NOT ADAPTERS) 1N/A * that have successfully registerred 1N/A /* only for HBAAPI V2 */ 1N/A "SMHBA_RegisterForAdapterAddEvents: Library->%s, Error->%d",
1N/A /* no SMHBA VSL found. Should be okay?? */ 1N/A * At least one vendor library registered this function, but no 1N/A * vendor call succeeded 1N/A /* we have had atleast some success, now finish up */ 1N/A * this seems silly, but what if another thread called 1N/A * the callback remove 1N/A /* yup, its still there, hooray */ 1N/A * bummer, somebody removed the callback before we finished 1N/A * registration, probably will never happen 1N/A "HBA_RegisterForAdapterAddEvents: HBA_RemoveCallback was " 1N/A "called for a handle before registration was finished.",
1N/A/* SMHBA Adapter Events (other than add) ******************************** */ 1N/A DEBUG(
2,
"SMHBA_RegisterForAdapterEvents", 0, 0, 0);
1N/A /* we now have the _hbaapi_LL_mutex */ 1N/A * that allocated memory is used both as the handle for the 1N/A * caller, and as userdata to the vendor call so that on 1N/A * callback the specific registration may be recalled 1N/A/* Adapter Port Events *********************************************** */ 1N/A "SMHBA_AdapterPortEvent, port:%s, eventType:%d fabricPortID:0X%06x",
1N/A DEBUG(
2,
"SMHBA_RegisterForAdapterPortEvents for port: %s",
1N/A /* we now have the _hbaapi_LL_mutex */ 1N/A * that allocated memory is used both as the handle for the 1N/A * caller, and as userdata to the vendor call so that on 1N/A * callback the specific registration may be recalled 1N/A/* SMHBA Adapter Port Stat Events ******************************** */ 1N/A "SMBA_AdapterPortStateEvent, port:%s, eventType:%d",
1N/A DEBUG(
2,
"SMHBA_RegisterForAdapterPortStatEvents for port: %s",
1N/A /* we now have the _hbaapi_LL_mutex */ 1N/A * that allocated memory is used both as the handle for the 1N/A * caller, and as userdata to the vendor call so that on 1N/A * callback the specific registration may be recalled 1N/A/* SMHBA Adapter Port Phy Stat Events ************************************ */ 1N/A "SMBA_AdapterPortStateEvent, port:%s, eventType:%d",
1N/A DEBUG(
2,
"SMHBA_RegisterForAdapterPhyStatEvents for port: %s",
1N/A /* we now have the _hbaapi_LL_mutex */ 1N/A * that allocated memory is used both as the handle for the 1N/A * caller, and as userdata to the vendor call so that on 1N/A * callback the specific registration may be recalled 1N/A/* SMHBA Target Events ********************************************* */ 1N/A DEBUG(
3,
"TargetEvent, hbaPort:%s, discoveredPort:%s eventType:%d",
1N/A DEBUG(
2,
"SMHBA_RegisterForTargetEvents, hbaPort:" 1N/A "%s, discoveredPort: %s",
1N/A /* we now have the _hbaapi_LL_mutex */ 1N/A * that allocated memory is used both as the handle for the 1N/A * caller, and as userdata to the vendor call so that on 1N/A * callback the specific registration may be recalled