9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * ************************************************************************
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Description
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * HBAAPILIB.c - Implements a sample common (wrapper) HBA API library
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * License:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * The contents of this file are subject to the SNIA Public License
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Version 1.0 (the "License"); you may not use this file except in
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * compliance with the License. You may obtain a copy of the License at
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * /http://www.snia.org/English/Resources/Code/OpenSource.html
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Software distributed under the License is distributed on an "AS IS"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * the License for the specific language governing rights and limitations
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * under the License.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * The Original Code is SNIA HBA API Wrapper Library
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * The Initial Developer of the Original Code is:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Benjamin F. Kuo, Troika Networks, Inc. (benk@troikanetworks.com)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Contributor(s):
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Tuan Lam, QLogic Corp. (t_lam@qlc.com)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Dan Willie, Emulex Corp. (Dan.Willie@emulex.com)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Dixon Hutchinson, Legato Systems, Inc. (dhutchin@legato.com)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * David Dillard, VERITAS Software Corp. (david.dillard@veritas.com)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * ************************************************************************
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Adding on SM-HBA support
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * The implementation includes Three different categories functions to support
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * both HBAAPI and SM-HBA through the same library.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * SM-HBA unique interface:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 1. CHECKLIBRARYANDVERSION(SMHBA) : match SMHBA VSL
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Or checking specifically if version is SMHBA beforehand.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 2. resolved to ftable.smhbafunctiontable.{interface}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * HBAAPIV2 unique functions
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 1. CHECKLIBRARYANDVERSION(HBAAPIV2) : validate and match HBAAPI V2 VSL.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Or checking specifically if version is HBAAPIV2 beforehand.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 2. resolved to ftable.functiontable.{interface}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Common interface between SM-HBA and HBAAPIV2.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 1. CHECKLIBRARY() : to validate the VSL.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 2. FUNCCOMMON macro to map the appropriate entry point table
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * (union ftable).
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 3. If the interface is not supported by HBAAPI(Version 1)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * the funtiion ptr will be set to NULL.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Common interface between HBAAPI and HBAAPIV2.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 1. Check if version is not SMHBA).
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 2. ftable.functiontalbe.(interface)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * ************************************************************************
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Use is subject to license terms.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifdef WIN32
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#include <windows.h>
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#include <string.h>
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Next define forces entry points in the dll to be exported
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * See hbaapi.h to see what it does.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define HBAAPI_EXPORTS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#else
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#include <dlfcn.h>
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#include <strings.h>
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#include <stdio.h>
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#include <time.h>
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#include "smhbaapi.h"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#include "vendorsmhbaapi.h"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#include <stdlib.h>
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifdef USESYSLOG
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#include <syslog.h>
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifdef SOLARIS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#include <link.h>
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#include <limits.h>
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int *handle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic Link_map *map, *mp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * LIBRARY_NUM is a shortcut to figure out which library we need to call.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * The top 16 bits of handle are the library index
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define LIBRARY_NUM(handle) ((handle)>>16)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * VENDOR_HANDLE turns a global library handle into a vendor specific handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * with all upper 16 bits set to 0
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define VENDOR_HANDLE(handle) ((handle)&0xFFFF)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define HBA_HANDLE_FROM_LOCAL(library, vendor) \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (((library)<<16) | ((vendor)&0x0000FFFF))
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimint _hbaapi_debuglevel = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define DEBUG(L, STR, A1, A2, A3)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#if defined(USESYSLOG) && defined(USELOGFILE)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimFILE *_hbaapi_debug_fd = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimint _hbaapi_sysloginit = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#undef DEBUG
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifdef WIN32
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define DEBUG(L, STR, A1, A2, A3)\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((L) <= _hbaapi_debuglevel) {\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (_hbaapi_sysloginit == 0) {\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim openlog("HBAAPI", LOG_PID|LOG_ODELAY, LOG_USER);\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_sysloginit = 1;\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim syslog(LOG_INFO, (STR), (A1), (A2), (A3));\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (_hbaapi_debug_fd == NULL) {\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim char _logFile[MAX_PATH]; \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetTempPath(MAX_PATH, _logFile); \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim strcat(_logFile, "HBAAPI.log"); \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_debug_fd = fopen(_logFile, "a");\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (_hbaapi_debug_fd != NULL) {\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim fprintf(_hbaapi_debug_fd, #STR "\n", (A1), (A2), (A3));\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#else /* WIN32 */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define DEBUG(L, STR, A1, A2, A3)\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((L) <= _hbaapi_debuglevel) {\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (_hbaapi_sysloginit == 0) {\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim openlog("HBAAPI", LOG_PID|LOG_ODELAY, LOG_USER);\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_sysloginit = 1;\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim syslog(LOG_INFO, (STR), (A1), (A2), (A3));\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (_hbaapi_debug_fd == NULL) {\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_debug_fd = fopen("/tmp/HBAAPI.log", "a");\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (_hbaapi_debug_fd != NULL) {\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim fprintf(_hbaapi_debug_fd, #STR "\n", (A1), (A2), (A3));\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif /* WIN32 */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#else /* Not both USESYSLOG and USELOGFILE */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#if defined(USESYSLOG)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimint _hbaapi_sysloginit = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#undef DEBUG
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define DEBUG(L, STR, A1, A2, A3) \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((L) <= _hbaapi_debuglevel) {\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (_hbaapi_sysloginit == 0) {\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim openlog("HBAAPI", LOG_PID|LOG_ODELAY, LOG_USER);\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_sysloginit = 1;\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim syslog(LOG_DEBUG, (STR), (A1), (A2), (A3));\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif /* USESYSLOG */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#if defined(USELOGFILE)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimFILE *_hbaapi_debug_fd = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#undef DEBUG
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifdef WIN32
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define DEBUG(L, STR, A1, A2, A3) \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((L) <= _hbaapi_debuglevel) {\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (_hbaapi_debug_fd == NULL) {\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim char _logFile[MAX_PATH]; \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetTempPath(MAX_PATH, _logFile); \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim strcat(_logFile, "HBAAPI.log"); \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_debug_fd = fopen(_logFile, "a");\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#else /* WIN32 */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define DEBUG(L, STR, A1, A2, A3) \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((L) <= _hbaapi_debuglevel) {\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (_hbaapi_debug_fd == NULL) {\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_debug_fd = fopen("/tmp/HBAAPI.log", "a");\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (_hbaapi_debug_fd != NULL) { \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim fprintf(_hbaapi_debug_fd, #STR "\n", (A1), (A2), (A3));\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif /* WIN32 */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif /* USELOGFILE */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif /* Not both USELOGFILE and USESYSLOG */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifdef POSIX_THREADS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#include <pthread.h>
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * When multiple mutex's are grabed, they must be always be grabbed in
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * the same order, or deadlock can result. There are three levels
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * of mutex's involved in this API. If LL_mutex is grabbed, always grap
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * it first. If AL_mutex is grabbed, it may not be grabbed before
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * LL_mutex. If grabbed in a multi grab sequence, the mutex's protecting
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * the callback lists must always be grabbed last and release before calling
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * a vendor specific library function that might invoke a callback function
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * on the same thread.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define GRAB_MUTEX(M) grab_mutex(M)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define RELEASE_MUTEX(M) release_mutex(M)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define RELEASE_MUTEX_RETURN(M, RET) release_mutex(M); return (RET)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#elif defined(WIN32)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define GRAB_MUTEX(m) EnterCriticalSection(m)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define RELEASE_MUTEX(m) LeaveCriticalSection(m)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define RELEASE_MUTEX_RETURN(m, RET) LeaveCriticalSection(m); return (RET)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#else
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define GRAB_MUTEX(M)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define RELEASE_MUTEX(M)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define RELEASE_MUTEX_RETURN(M, RET) return (RET)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Vendor library information
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimtypedef enum {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_UNKNOWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_LOADED,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_NOT_LOADED
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim} HBA_LIBRARY_STATUS;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimtypedef enum {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim UNKNOWN = 1,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAAPIV2,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAAPI
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim} LIBRARY_VERSION;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimtypedef struct hba_library_info {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim struct hba_library_info
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *next;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifdef WIN32
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HINSTANCE hLibrary; /* Handle to a loaded DLL */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#else
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim char *LibraryName;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void* hLibrary; /* Handle to a loaded DLL */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim char *LibraryPath;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim LIBRARY_VERSION version; /* resolve union */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 numOfAdapters;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim union {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_ENTRYPOINTS smhbafunctionTable; /* smhba function pointers */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ENTRYPOINTSV2 functionTable; /* hba api function pointers */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } ftable;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_STATUS status; /* info on this library */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 index;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim} HBA_LIBRARY_INFO, *PHBA_LIBRARY_INFO;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define ARE_WE_INITED() \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (_hbaapi_librarylist == NULL) { \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR_NOT_LOADED); \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_LIBRARY_INFO *_hbaapi_librarylist = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_UINT32 _hbaapi_total_library_count = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifdef POSIX_THREADS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimpthread_mutex_t _hbaapi_LL_mutex = PTHREAD_MUTEX_INITIALIZER;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#elif defined(WIN32)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimCRITICAL_SECTION _hbaapi_LL_mutex;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Macro to use the right function table between smhba and hbaapi.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define FUNCTABLE(lib_infop) \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ((lib_infop->version == SMHBA) ? \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable : \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Macro to use the right function ptr between smhba and hbaapi function table.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Should be used for an interface common to SM-HBA and HBAAPIV2.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define FUNCCOMMON(lib_infop, func) \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ((lib_infop->version == SMHBA) ? \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.func : \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.func)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Macro to use the hbaapi function ptr.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Should be used for an interface applicable only HBAAPIV2.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define FUNCHBAAPIV2(lib_infop, func) \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.func
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Macro to use the hbaapi function ptr.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Should be used for an interface applicable only HBAAPIV2.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define FUNCSMHBA(lib_infop, func) \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.func
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Individual adapter (hba) information
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimtypedef struct hba_adapter_info {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim struct hba_adapter_info
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *next;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS GNstatus; /* status from GetAdapterNameFunc */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim char *name;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN nodeWWN;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *library;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 index;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim} HBA_ADAPTER_INFO;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_ADAPTER_INFO *_hbaapi_adapterlist = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_UINT32 _hbaapi_total_adapter_count = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifdef POSIX_THREADS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimpthread_mutex_t _hbaapi_AL_mutex = PTHREAD_MUTEX_INITIALIZER;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#elif defined(WIN32)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimCRITICAL_SECTION _hbaapi_AL_mutex;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Call back registration
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimtypedef struct hba_vendorcallback_elem {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim struct hba_vendorcallback_elem
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *next;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_CALLBACKHANDLE vendorcbhandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_info;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim} HBA_VENDORCALLBACK_ELEM;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Each instance of HBA_ADAPTERCALLBACK_ELEM represents a call to one of
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * "register" functions that apply to a particular adapter.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * HBA_ALLADAPTERSCALLBACK_ELEM is used just for HBA_RegisterForAdapterAddEvents
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimtypedef struct hba_adaptercallback_elem {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim struct hba_adaptercallback_elem
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *next;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_info;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *userdata;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_CALLBACKHANDLE vendorcbhandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void (*callback)();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim} HBA_ADAPTERCALLBACK_ELEM;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimtypedef struct hba_alladapterscallback_elem {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim struct hba_alladapterscallback_elem
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *next;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *userdata;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_VENDORCALLBACK_ELEM *vendorhandlelist;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void (*callback)();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim} HBA_ALLADAPTERSCALLBACK_ELEM;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_ALLADAPTERSCALLBACK_ELEM *_hbaapi_adapteraddevents_callback_list = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_ADAPTERCALLBACK_ELEM *_hbaapi_adapterevents_callback_list = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_ADAPTERCALLBACK_ELEM *_hbaapi_adapterportevents_callback_list = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_ADAPTERCALLBACK_ELEM *_hbaapi_adapterportstatevents_callback_list = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_ADAPTERCALLBACK_ELEM *_hbaapi_targetevents_callback_list = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_ADAPTERCALLBACK_ELEM *_hbaapi_linkevents_callback_list = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_ALLADAPTERSCALLBACK_ELEM *_smhba_adapteraddevents_callback_list = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_ADAPTERCALLBACK_ELEM *_smhba_adapterevents_callback_list = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_ADAPTERCALLBACK_ELEM *_smhba_adapterportevents_callback_list = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_ADAPTERCALLBACK_ELEM *_smhba_adapterportstatevents_callback_list = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_ADAPTERCALLBACK_ELEM *_smhba_adapterphystatevents_callback_list = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_ADAPTERCALLBACK_ELEM *_smhba_targetevents_callback_list = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifdef POSIX_THREADS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* mutex's to protect each list */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimpthread_mutex_t _hbaapi_AAE_mutex = PTHREAD_MUTEX_INITIALIZER;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimpthread_mutex_t _hbaapi_AE_mutex = PTHREAD_MUTEX_INITIALIZER;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimpthread_mutex_t _hbaapi_APE_mutex = PTHREAD_MUTEX_INITIALIZER;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimpthread_mutex_t _hbaapi_APSE_mutex = PTHREAD_MUTEX_INITIALIZER;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimpthread_mutex_t _hbaapi_TE_mutex = PTHREAD_MUTEX_INITIALIZER;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimpthread_mutex_t _hbaapi_LE_mutex = PTHREAD_MUTEX_INITIALIZER;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimpthread_mutex_t _smhba_AAE_mutex = PTHREAD_MUTEX_INITIALIZER;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimpthread_mutex_t _smhba_AE_mutex = PTHREAD_MUTEX_INITIALIZER;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimpthread_mutex_t _smhba_APE_mutex = PTHREAD_MUTEX_INITIALIZER;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimpthread_mutex_t _smhba_APSE_mutex = PTHREAD_MUTEX_INITIALIZER;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimpthread_mutex_t _smhba_APHYSE_mutex = PTHREAD_MUTEX_INITIALIZER;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimpthread_mutex_t _smhba_TE_mutex = PTHREAD_MUTEX_INITIALIZER;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimpthread_mutex_t _smhba_LE_mutex = PTHREAD_MUTEX_INITIALIZER;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#elif defined(WIN32)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimCRITICAL_SECTION _hbaapi_AAE_mutex;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimCRITICAL_SECTION _hbaapi_AE_mutex;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimCRITICAL_SECTION _hbaapi_APE_mutex;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimCRITICAL_SECTION _hbaapi_APSE_mutex;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimCRITICAL_SECTION _hbaapi_TE_mutex;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimCRITICAL_SECTION _smhba_AAE_mutex;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimCRITICAL_SECTION _smhba_AE_mutex;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimCRITICAL_SECTION _smhba_APE_mutex;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimCRITICAL_SECTION _smhba_APSE_mutex;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimCRITICAL_SECTION _smhba_APHYSE_mutex;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimCRITICAL_SECTION _smhba_TE_mutex;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimCRITICAL_SECTION _hbaapi_LE_mutex;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_ADAPTERCALLBACK_ELEM **cb_lists_array[] = {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &_hbaapi_adapterevents_callback_list,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &_hbaapi_adapterportevents_callback_list,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &_hbaapi_adapterportstatevents_callback_list,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &_hbaapi_targetevents_callback_list,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &_hbaapi_linkevents_callback_list,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &_smhba_adapterevents_callback_list,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &_smhba_adapterportevents_callback_list,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &_smhba_adapterportstatevents_callback_list,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &_smhba_adapterphystatevents_callback_list,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &_smhba_targetevents_callback_list,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim NULL};
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Common library internal. Mutex handling
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifdef POSIX_THREADS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic void
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimgrab_mutex(pthread_mutex_t *mp) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* LINTED E_FUNC_SET_NOT_USED */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int ret;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((ret = pthread_mutex_lock(mp)) != 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim perror("pthread_mutex_lock - HBAAPI:");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(1, "pthread_mutex_lock returned %d", ret, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic void
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimrelease_mutex(pthread_mutex_t *mp) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* LINTED E_FUNC_SET_NOT_USED */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int ret;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((ret = pthread_mutex_unlock(mp)) != 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim perror("pthread_mutex_unlock - HBAAPI:");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(1, "pthread_mutex_unlock returned %d", ret, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Common library internal. Check library and return vendorhandle
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic HBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_CheckLibrary(HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO **lib_infopp,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE *vendorhandle) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 libraryIndex;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (_hbaapi_librarylist == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim libraryIndex = LIBRARY_NUM(handle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_LL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (lib_infop = _hbaapi_librarylist;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop = lib_infop->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lib_infop->index == libraryIndex) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lib_infop->status != HBA_LIBRARY_LOADED) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *lib_infopp = lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *vendorhandle = VENDOR_HANDLE(handle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* caller will release the mutex */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_OK);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INVALID_HANDLE);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define CHECKLIBRARY() \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_CheckLibrary(handle, &lib_infop, &vendorHandle);\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) { \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (status); \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define CHECKLIBRARYANDVERSION(ver) \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_CheckLibrary(handle, &lib_infop, &vendorHandle); \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) { \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (status); \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else { \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (ver != lib_infop->version) { \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_INCOMPATIBLE); \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } \
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * freevendorhandlelist is called with _hbaapi_LL_mutex already held
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic void
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimfreevendorhandlelist(HBA_VENDORCALLBACK_ELEM *vhlist) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_VENDORCALLBACK_ELEM *vhlp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_VENDORCALLBACK_ELEM *vnext;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBARemoveCallbackFunc registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (vhlp = vhlist; vhlp != NULL; vhlp = vnext) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vnext = vhlp->next;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim FUNCCOMMON(vhlp->lib_info, RemoveCallbackHandler);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (registeredfunc)(vhlp->vendorcbhandle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(vhlp);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimlocal_remove_callback(HBA_CALLBACKHANDLE cbhandle) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTERCALLBACK_ELEM ***listp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTERCALLBACK_ELEM **lastp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ALLADAPTERSCALLBACK_ELEM **lap;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ALLADAPTERSCALLBACK_ELEM *allcbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTERCALLBACK_ELEM *cbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBARemoveCallbackFunc registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_VENDORCALLBACK_ELEM *vhlp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_VENDORCALLBACK_ELEM *vnext;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int found;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status = HBA_STATUS_ERROR_INVALID_HANDLE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* search through the simple lists first */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_AAE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_AE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_APE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_APSE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_TE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_LE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_smhba_AAE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_smhba_AE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_smhba_APE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_smhba_APSE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_smhba_TE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (listp = cb_lists_array, found = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (found == 0 && *listp != NULL); listp++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lastp = *listp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (cbp = **listp; cbp != NULL; cbp = cbp->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (cbhandle != (HBA_CALLBACKHANDLE)cbp) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lastp = &(cbp->next);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim found = 1;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim FUNCCOMMON(cbp->lib_info, RemoveCallbackHandler);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (registeredfunc)(cbp->vendorcbhandle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *lastp = cbp->next;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(cbp);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_LE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_TE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_APSE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_APE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_AE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_AAE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_smhba_AAE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_smhba_AE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_smhba_APE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_smhba_APSE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_smhba_TE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (found != 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR_NOT_SUPPORTED);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_OK);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_AAE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * if it wasnt in the simple lists,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * look in the list for adapteraddevents
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lap = &_hbaapi_adapteraddevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (allcbp = _hbaapi_adapteraddevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim allcbp != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim allcbp = allcbp->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (cbhandle != (HBA_CALLBACKHANDLE)allcbp) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lap = &allcbp->next;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (vhlp = allcbp->vendorhandlelist; vhlp != NULL; vhlp = vnext) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vnext = vhlp->next;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* should be HBAAPIV2 VSL to get to here */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vhlp->lib_info->ftable.functionTable.RemoveCallbackHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (registeredfunc)(vhlp->vendorcbhandle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(vhlp);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *lap = allcbp->next;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(allcbp);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_OK;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_AAE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* now search smhba adapteradd events. */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_smhba_AAE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lap = &_smhba_adapteraddevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (allcbp = _smhba_adapteraddevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim allcbp != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim allcbp = allcbp->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (cbhandle != (HBA_CALLBACKHANDLE)allcbp) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lap = &allcbp->next;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (vhlp = allcbp->vendorhandlelist; vhlp != NULL; vhlp = vnext) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vnext = vhlp->next;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* should be SMHBA VSL to get to here */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vhlp->lib_info->
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ftable.smhbafunctionTable.RemoveCallbackHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (registeredfunc)(vhlp->vendorcbhandle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(vhlp);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *lap = allcbp->next;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(allcbp);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_OK;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_smhba_AAE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* LINTED E_STATIC_UE_STATIC_UNUSED */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic char wwn_str1[17];
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* LINTED E_STATIC_UE_STATIC_UNUSED */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic char wwn_str2[17];
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* LINTED E_STATIC_UE_STATIC_UNUSED */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic char wwn_str3[17];
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define WWN2STR1(wwn) WWN2str(wwn_str1, (wwn))
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define WWN2STR2(wwn) WWN2str(wwn_str2, (wwn))
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define WWN2STR3(wwn) WWN2str(wwn_str3, (wwn))
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic char *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* LINTED E_STATIC_UE_STATIC_UNUSED */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimWWN2str(char *buf, HBA_WWN *wwn) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int j;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unsigned char *pc = (unsigned char *)&(wwn->wwn[0]);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim buf[0] = '\0';
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (j = 0; j < 16; j += 2) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) sprintf(&buf[j], "%02X", (int)*pc++);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (buf);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifdef WIN32
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimBOOL APIENTRY
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimDllMain(HANDLE hModule,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DWORD ul_reason_for_call,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim LPVOID lpReserved)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim switch (ul_reason_for_call) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim case DLL_PROCESS_ATTACH:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim case DLL_PROCESS_DETACH:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim case DLL_THREAD_ATTACH:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim case DLL_THREAD_DETACH:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (TRUE);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Read in the config file and load all the specified vendor specific
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * libraries and perform the function registration exercise
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_LoadLibrary()
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBARegisterLibraryFunc RegisterFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBARegisterLibraryV2Func RegisterV2Func;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBARegisterLibraryFunc RegisterSMHBAFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBALoadLibraryFunc LoadLibraryFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAGetVersionFunc GetVersionFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifdef POSIX_THREADS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int ret;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 libversion;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Open configuration file from known location */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifdef WIN32
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim LONG lStatus;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HKEY hkSniaHba, hkVendorLib;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim FILETIME ftLastWriteTime;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TCHAR cSubKeyName[256];
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DWORD i, dwSize, dwType;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim BYTE byFileName[MAX_PATH];
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (_hbaapi_librarylist != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* this is an app programming error */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\SNIA\\HBA",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim 0, KEY_READ, &hkSniaHba);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lStatus != ERROR_SUCCESS) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* ???Opportunity to send error msg, configuration error */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Enumerate all the subkeys. These have the form:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * HKLM\Software\SNIA\HBA\<Vendor id> - note that we don't care
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * what the vendor id is
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (i = 0; ; i++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim dwSize = 255; /* how big the buffer is */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lStatus = RegEnumKeyEx(hkSniaHba, i,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (char *)&cSubKeyName, &dwSize, NULL,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim NULL, NULL, &ftLastWriteTime);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lStatus == ERROR_NO_MORE_ITEMS) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break; /* we're done */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else if (lStatus == ERROR_MORE_DATA) { /* buffer not big enough */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* do whatever */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Now open the subkey that pertains to this vendor's library */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lStatus = RegOpenKeyEx(hkSniaHba, cSubKeyName, 0, KEY_READ,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &hkVendorLib);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lStatus != ERROR_SUCCESS) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RegCloseKey(hkSniaHba);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* ???Opportunity to send error msg, installation error */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * you may want to return something
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * else or keep trying
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * The name of the library is contained in a REG_SZ Value
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * keyed to "LibraryFile"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim dwSize = MAX_PATH;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lStatus = RegQueryValueEx(hkVendorLib, "LibraryFile", NULL, &dwType,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim byFileName, &dwSize);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lStatus != ERROR_SUCCESS) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RegCloseKey(hkVendorLib);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* ???Opportunity to send error msg, installation error */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop = (HBA_LIBRARY_INFO *)calloc(1, sizeof (HBA_LIBRARY_INFO));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lib_infop == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* what is the right thing to do in MS land??? */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RegCloseKey(hkVendorLib);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* ???Opportunity to send error msg, installation error */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->status = HBA_LIBRARY_NOT_LOADED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->next = _hbaapi_librarylist;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->index = _hbaapi_total_library_count;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_total_library_count++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_librarylist = lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Now I can try to load the library */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->hLibrary = LoadLibrary(byFileName);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lib_infop->hLibrary == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* printf("unable to load library %s\n", librarypath); */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* ???Opportunity to send error msg, installation error */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim goto dud_library;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->LibraryPath = strdup(byFileName);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(1, "HBAAPI loading: %s\n", byFileName, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RegisterSMHBAFunc = (SMHBARegisterLibraryFunc)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetProcAddress(lib_infop->hLibrary, "SMHBA_RegisterLibrary");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (RegisterSMHBAFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((RegisterSMHBAFunc)(SMHBA_ENTRYPOINTS *)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (&lib_infop->ftable.smhbafunctionTable));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* library not loaded */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* ???Opportunity to send error msg, library error? */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim goto dud_library;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->version = SMHBA;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Call the registration function to get the list of pointers */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RegisterV2Func = (HBARegisterLibraryV2Func)GetProcAddress(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->hLibrary, "HBA_RegisterLibraryV2");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (RegisterV2Func != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Load the function pointers directly into
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * the table of functions
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((RegisterV2Func)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (HBA_ENTRYPOINTSV2 *)(&lib_infop->ftable.functionTable));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* library not loaded */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* ???Opportunity to send error msg, library error? */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim goto dud_library;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->version = HBAAPIV2;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Maybe the vendor library is only Rev1 */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RegisterFunc = (HBARegisterLibraryFunc)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetProcAddress(lib_infop->hLibrary, "HBA_RegisterLibrary");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (RegisterFunc == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* ???Opportunity to send error msg, library error? */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim goto dud_library;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Load the function points directly into
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * the Rev 2 table of functions
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((RegisterFunc)(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (HBA_ENTRYPOINTS *)(&lib_infop->ftable.functionTable)));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* library not loaded */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* ???Opportunity to send error msg, library error? */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim goto dud_library;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->version = HBAAPI;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* successfully loaded library */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * SM-HBA and HBAAPI has a seperate handler for GetVersion but
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * they have the same function signature so use the same variable here.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetVersionFunc = FUNCCOMMON(lib_infop, GetVersionHandler);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetVersionFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lib_infop->version == SMHBA) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Check the version of this library before loading */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim libversion = ((GetVersionFunc)());
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifdef NOTDEF /* save for a later time... when it matters */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (libversion < SMHBA_LIBVERSION) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim goto dud_library;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Check the version of this library before loading */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Actually... This wrapper is compatible with version 1 */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim libversion = ((GetVersionFunc)());
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifdef NOTDEF /* save for a later time... when it matters */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (libversion < HBA_LIBVERSION) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim goto dud_library;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* ???Opportunity to send error msg, library error? */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim goto dud_library;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim LoadLibraryFunc = FUNCCOMMON(lib_infop, LoadLibraryHandler);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (LoadLibraryFunc == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Hmmm, dont we need to flag this in a realy big way??? */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* How about messages to the system event logger ??? */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* ???Opportunity to send error msg, library error? */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim goto dud_library;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Initialize this library */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((LoadLibraryFunc)());
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* ???Opportunity to send error msg, library error? */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* successfully loaded library */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->status = HBA_LIBRARY_LOADED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim dud_library: /* its also just the end of the loop */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RegCloseKey(hkVendorLib);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RegCloseKey(hkSniaHba);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#else /* Unix as opposed to Win32 */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim FILE *hbaconf;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim char fullline[512]; /* line read from HBA.conf */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim char *libraryname; /* Read in from file HBA.conf */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim char *librarypath; /* Read in from file HBA.conf */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim char hbaConfFilePath[256];
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim char *charPtr;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_LL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (_hbaapi_librarylist != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) fprintf(stderr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "HBA_LoadLibrary: previously unfreed "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "libraries exist, call HBA_FreeLibrary().\n");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_LL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) strcpy(hbaConfFilePath, "/etc/smhba.conf");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((hbaconf = fopen(hbaConfFilePath, "r")) == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) printf("Cannot open %s\n", hbaConfFilePath);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_LL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Read in each line and load library */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim while ((hbaconf != NULL) &&
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (fgets(fullline, sizeof (fullline), hbaconf))) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Skip the comments... */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((fullline[0] == '#') || (fullline[0] == '\n')) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* grab first 'thing' in line (if its there) */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((libraryname = strtok(fullline, " \t\n")) != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strlen(libraryname) >= 64) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) fprintf(stderr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Library name(%s) in %s is > 64 characters\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim libraryname, hbaConfFilePath);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* grab second 'thing' in line (if its there) */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((librarypath = strtok(NULL, " \t\n")) != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strlen(librarypath) >= 256) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) fprintf(stderr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Library path(%s) in %s is > 256 characters\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim librarypath, hbaConfFilePath);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* there should be no more 'things' in the line */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((charPtr = strtok(NULL, " \n\t")) != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) fprintf(stderr, "Extraneous characters (\"%s\") in %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim charPtr, hbaConfFilePath);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Continue to the next line if library name or path is invalid */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (libraryname == NULL ||
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim strlen(libraryname) == 0 ||
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim librarypath == NULL ||
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (strlen(librarypath) == 0)) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Special case....
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Look for loglevel
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strcmp(libraryname, "debuglevel") == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_debuglevel = strtol(librarypath, NULL, 10);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* error handling does the right thing automagically */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop = (HBA_LIBRARY_INFO *)calloc(1, sizeof (HBA_LIBRARY_INFO));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lib_infop == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) fprintf(stderr, "HBA_LoadLibrary: out of memeory\n");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_LL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->status = HBA_LIBRARY_NOT_LOADED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->LibraryName = strdup(libraryname);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->LibraryPath = strdup(librarypath);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->numOfAdapters = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->version = UNKNOWN;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->index = _hbaapi_total_library_count;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_total_library_count++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->next = _hbaapi_librarylist;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_librarylist = lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Load the DLL now */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((lib_infop->hLibrary = dlopen(librarypath, RTLD_LAZY)) == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* printf("unable to load library %s\n", librarypath); */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Call the registration function to get the list of pointers */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RegisterSMHBAFunc = (SMHBARegisterLibraryFunc)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim dlsym(lib_infop->hLibrary, "SMHBA_RegisterLibrary");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (RegisterSMHBAFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Load the function points directly into
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * the table of functions
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((RegisterSMHBAFunc)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (&lib_infop->ftable.smhbafunctionTable));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* library not loaded */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->version = SMHBA;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RegisterV2Func = (HBARegisterLibraryV2Func)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim dlsym(lib_infop->hLibrary, "HBA_RegisterLibraryV2");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (RegisterV2Func != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Load the function points directly into
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * the table of functions
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((RegisterV2Func)((HBA_ENTRYPOINTSV2 *)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (&lib_infop->ftable.functionTable)));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* library not loaded */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->version = HBAAPIV2;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Maybe the vendor library is only Rev1 */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RegisterFunc = (HBARegisterLibraryFunc)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim dlsym(lib_infop->hLibrary, "HBA_RegisterLibrary");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (RegisterFunc == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* This function is required */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) fprintf(stderr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "HBA_LoadLibrary: vendor specific RegisterLibrary "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "function not found. lib: %s\n", librarypath);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(1, "HBA_LoadLibrary: vendor specific "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "RegisterLibrary function not found. lib: %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim librarypath, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Load the function points directly into
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * the table of functions
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((RegisterFunc)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ((HBA_ENTRYPOINTS *)(&lib_infop->ftable.functionTable)));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* library not loaded */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) fprintf(stderr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "HBA_LoadLibrary: vendor specific RegisterLibrary "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "function encountered an error. lib: %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim librarypath);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(1,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "HBA_LoadLibrary: vendor specific RegisterLibrary "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "function encountered an error. lib: %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim librarypath, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->version = HBAAPI;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* successfully loaded library */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * SM-HBA and HBAAPI has a seperate handler for GetVersion but
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * they have the same function signature so use the same variable here.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((GetVersionFunc = FUNCCOMMON(lib_infop, GetVersionHandler))
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lib_infop->version == SMHBA) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim libversion = ((GetVersionFunc)());
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (libversion < SMHBA_LIBVERSION) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) printf("Library version mismatch."
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Got %d expected %d.\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim libversion, SMHBA_LIBVERSION);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim libversion = ((GetVersionFunc)());
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Check the version of this library before loading */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Actually... This wrapper is compatible with version 1 */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (libversion < HBA_LIBVERSION) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) printf("Library version mismatch."
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Got %d expected %d.\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim libversion, HBA_LIBVERSION);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(1, "%s libversion = %d", librarypath, libversion, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim LoadLibraryFunc = FUNCCOMMON(lib_infop, LoadLibraryHandler);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (LoadLibraryFunc == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* this function is required */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) fprintf(stderr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "HBA_LoadLibrary: vendor specific LoadLibrary "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "function not found. lib: %s\n", librarypath);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(1, "HBA_LoadLibrary: vendor specific LoadLibrary "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "function not found. lib: %s\n", librarypath, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Initialize this library */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((status = ((LoadLibraryFunc)())) != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* maybe this should be a printf so that we CANNOT miss it */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) fprintf(stderr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "HBA_LoadLibrary: Encounterd and error loading: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim librarypath);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(1, "Encounterd and error loading: %s", librarypath, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(1, " HBA_STATUS: %d", status, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* successfully loaded library */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->status = HBA_LIBRARY_LOADED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif /* WIN32 or UNIX */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifdef POSIX_THREADS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * The _hbaapi_LL_mutex is already grabbed to proctect the caller of
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * HBA_FreeLibrary() during loading.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * The mutexes are already initialized
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * with PTHREAD_MUTEX_INITIALIZER. Do we need to init again?
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Keeping the code from HBAAPI source...
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret = pthread_mutex_init(&_hbaapi_AL_mutex, NULL);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (ret == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret = pthread_mutex_init(&_hbaapi_AAE_mutex, NULL);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (ret == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret = pthread_mutex_init(&_hbaapi_AE_mutex, NULL);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (ret == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret = pthread_mutex_init(&_hbaapi_APE_mutex, NULL);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (ret == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret = pthread_mutex_init(&_hbaapi_APSE_mutex, NULL);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (ret == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret = pthread_mutex_init(&_hbaapi_TE_mutex, NULL);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (ret == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret = pthread_mutex_init(&_smhba_AAE_mutex, NULL);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (ret == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret = pthread_mutex_init(&_smhba_AE_mutex, NULL);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (ret == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret = pthread_mutex_init(&_smhba_APE_mutex, NULL);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (ret == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret = pthread_mutex_init(&_smhba_APSE_mutex, NULL);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (ret == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret = pthread_mutex_init(&_smhba_TE_mutex, NULL);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (ret == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret = pthread_mutex_init(&_hbaapi_LE_mutex, NULL);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (ret != 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim perror("pthread_mutex_init - HBA_LoadLibrary");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_LL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_LL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#elif defined(WIN32)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim InitializeCriticalSection(&_hbaapi_LL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim InitializeCriticalSection(&_hbaapi_AL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim InitializeCriticalSection(&_hbaapi_AAE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim InitializeCriticalSection(&_hbaapi_AE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim InitializeCriticalSection(&_hbaapi_APE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim InitializeCriticalSection(&_hbaapi_APSE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim InitializeCriticalSection(&_hbaapi_TE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim InitializeCriticalSection(&_hbaapi_LE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim InitializeCriticalSection(&_smhba_AAE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim InitializeCriticalSection(&_smhba_AE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim InitializeCriticalSection(&_smhba_APE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim InitializeCriticalSection(&_smhba_APSE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim InitializeCriticalSection(&_smhba_TE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_OK);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_FreeLibrary() {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAFreeLibraryFunc FreeLibraryFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* LINTED E_FUNC_SET_NOT_USED */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_next;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTERCALLBACK_ELEM
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ***listp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTER_INFO *adapt_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTER_INFO *adapt_next;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_LL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (_hbaapi_librarylist == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_LL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR_NOT_LOADED);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_AL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(1, "HBA_FreeLibrary()", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (lib_infop = _hbaapi_librarylist; lib_infop != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop = lib_next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_next = lib_infop->next;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lib_infop->status == HBA_LIBRARY_LOADED) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim FreeLibraryFunc = FUNCCOMMON(lib_infop, FreeLibraryHandler);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (FreeLibraryFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Free this library */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((FreeLibraryFunc)());
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(1, "HBA_FreeLibrary() Failed %d", status, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifdef WIN32
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim FreeLibrary(lib_infop->hLibrary); /* Unload DLL from memory */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#else
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) dlclose(lib_infop->hLibrary); /* Unload DLL from memory */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifndef WIN32
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(lib_infop->LibraryName);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(lib_infop->LibraryPath);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(lib_infop);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_librarylist = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * OK, now all functions are disabled except for LoadLibrary,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Hope no other thread calls it before we have returned
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_total_library_count = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (adapt_infop = _hbaapi_adapterlist;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adapt_infop != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adapt_infop = adapt_next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adapt_next = adapt_infop->next;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(adapt_infop->name);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(adapt_infop);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_adapterlist = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_total_adapter_count = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Free up the callbacks, this is not the most efficient, but it works
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim while ((volatile HBA_ADAPTERCALLBACK_ELEM *)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_adapteraddevents_callback_list
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) local_remove_callback((HBA_CALLBACKHANDLE)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_adapteraddevents_callback_list);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim while ((volatile HBA_ADAPTERCALLBACK_ELEM *)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _smhba_adapteraddevents_callback_list
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) local_remove_callback((HBA_CALLBACKHANDLE)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _smhba_adapteraddevents_callback_list);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (listp = cb_lists_array; *listp != NULL; listp++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim while ((volatile HBA_ADAPTERCALLBACK_ELEM ***)**listp != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) local_remove_callback((HBA_CALLBACKHANDLE)**listp);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_AL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_LL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifdef USESYSLOG
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim closelog();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifdef USELOGFILE
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (_hbaapi_debug_fd != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim fclose(_hbaapi_debug_fd);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_debug_fd = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifdef POSIX_THREADS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* this will unlock them as well, but who cares */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) pthread_mutex_destroy(&_hbaapi_LE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) pthread_mutex_destroy(&_hbaapi_TE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) pthread_mutex_destroy(&_hbaapi_APSE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) pthread_mutex_destroy(&_hbaapi_APE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) pthread_mutex_destroy(&_hbaapi_AE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) pthread_mutex_destroy(&_hbaapi_AAE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) pthread_mutex_destroy(&_smhba_TE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) pthread_mutex_destroy(&_smhba_APSE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) pthread_mutex_destroy(&_smhba_APE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) pthread_mutex_destroy(&_smhba_AE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) pthread_mutex_destroy(&_smhba_AAE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) pthread_mutex_destroy(&_hbaapi_AL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) pthread_mutex_destroy(&_hbaapi_LL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#elif defined(WIN32)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DeleteCriticalSection(&_hbaapi_LL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DeleteCriticalSection(&_hbaapi_AL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DeleteCriticalSection(&_hbaapi_AAE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DeleteCriticalSection(&_hbaapi_AE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DeleteCriticalSection(&_hbaapi_APE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DeleteCriticalSection(&_hbaapi_APSE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DeleteCriticalSection(&_hbaapi_TE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DeleteCriticalSection(&_hbaapi_LE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DeleteCriticalSection(&_smhba_TE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DeleteCriticalSection(&_smhba_APSE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DeleteCriticalSection(&_smhba_APE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DeleteCriticalSection(&_smhba_AE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DeleteCriticalSection(&_smhba_AAE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_OK);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * The API used to use fixed size tables as its primary data structure.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Indexing from 1 to N identified each adapters. Now the adapters are
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * on a linked list. There is a unique "index" foreach each adapter.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Adapters always keep their index, even if they are removed from the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * hardware. The only time the indexing is reset is on HBA_FreeLibrary
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_UINT32
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_GetNumberOfAdapters()
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int j = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAGetNumberOfAdaptersFunc GetNumberOfAdaptersFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAGetAdapterNameFunc GetAdapterNameFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_BOOLEAN found_name;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTER_INFO *adapt_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim char adaptername[256];
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int num_adapters; /* local */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (_hbaapi_librarylist == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_LL_mutex); /* pay attention to order */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_AL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (lib_infop = _hbaapi_librarylist;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop = lib_infop->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lib_infop->status != HBA_LIBRARY_LOADED) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetNumberOfAdaptersFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim FUNCCOMMON(lib_infop, GetNumberOfAdaptersHandler);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetNumberOfAdaptersFunc == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim num_adapters = ((GetNumberOfAdaptersFunc)());
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifndef WIN32
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(1, "HBAAPI: num_adapters for %s = %d\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->LibraryName, num_adapters, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#else
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(1, "HBAAPI: num_adapters for %s = %d\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->LibraryPath, num_adapters, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Also get the names of all the adapters here and cache */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetAdapterNameFunc = FUNCCOMMON(lib_infop, GetAdapterNameHandler);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetAdapterNameFunc == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (j = 0; j < num_adapters; j++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim found_name = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (GetAdapterNameFunc)(j, (char *)&adaptername);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status == HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (adapt_infop = _hbaapi_adapterlist;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adapt_infop != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adapt_infop = adapt_infop->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * check for duplicates, really,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * this may just be a second
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * call to this function
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * ??? how do we know when a name becomes stale?
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strcmp(adaptername, adapt_infop->name) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* already got this one */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim found_name++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (found_name != 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adapt_infop = (HBA_ADAPTER_INFO *)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim calloc(1, sizeof (HBA_ADAPTER_INFO));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (adapt_infop == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifndef WIN32
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) fprintf(stderr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "HBA_GetNumberOfAdapters: calloc failed"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim " on sizeof:%lu\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (unsigned long)(sizeof (HBA_ADAPTER_INFO)));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_AL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_total_adapter_count);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((adapt_infop->GNstatus = status) == HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adapt_infop->name = strdup(adaptername);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim char dummyname[512];
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) sprintf(dummyname, "NULLADAPTER-%255s-%03d",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->LibraryPath, _hbaapi_total_adapter_count);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim dummyname[511] = '\0';
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adapt_infop->name = strdup(dummyname);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->numOfAdapters++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adapt_infop->library = lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adapt_infop->next = _hbaapi_adapterlist;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adapt_infop->index = _hbaapi_total_adapter_count;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_adapterlist = adapt_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_total_adapter_count++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_AL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, _hbaapi_total_adapter_count);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_GetAdapterName(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 adapterindex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim char *adaptername)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTER_INFO *adapt_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS ret = HBA_STATUS_ERROR_ILLEGAL_INDEX;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (adaptername == NULL) {
0778188f242b11e5d53f771c9e8a069354b3d5d4Hengqing Hu DEBUG(1, "HBA_GetAdapterName: NULL pointer adaptername",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR_ARG);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * The adapter index is from old code, but we have
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * to support it. Go down the list looking for
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * the adapter
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ARE_WE_INITED();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_AL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *adaptername = '\0';
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (adapt_infop = _hbaapi_adapterlist;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adapt_infop != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adapt_infop = adapt_infop->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (adapt_infop->index == adapterindex) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (adapt_infop->name != NULL &&
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adapt_infop->GNstatus == HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) strcpy(adaptername, adapt_infop->name);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *adaptername = '\0';
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret = adapt_infop->GNstatus;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "GetAdapterName for index:%d ->%s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adapterindex, adaptername, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_AL_mutex, ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_HANDLE
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_OpenAdapter(char *adaptername)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAOpenAdapterFunc OpenAdapterFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTER_INFO *adapt_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "OpenAdapter: %s", adaptername, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim handle = HBA_HANDLE_INVALID;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (_hbaapi_librarylist == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (handle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (adaptername == NULL) {
0778188f242b11e5d53f771c9e8a069354b3d5d4Hengqing Hu DEBUG(1, "HBA_OpenAdapter: NULL pointer adaptername",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (handle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_AL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (adapt_infop = _hbaapi_adapterlist;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adapt_infop != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adapt_infop = adapt_infop->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strcmp(adaptername, adapt_infop->name) != 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop = adapt_infop->library;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim OpenAdapterFunc = FUNCCOMMON(lib_infop, OpenAdapterHandler);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (OpenAdapterFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* retrieve the vendor handle */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim handle = (OpenAdapterFunc)(adaptername);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (handle != 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* or this with the library index to get the common handle */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim handle = HBA_HANDLE_FROM_LOCAL(lib_infop->index, handle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_AL_mutex, handle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Finding an adapter with matching WWN.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_OpenAdapterByWWN(HBA_HANDLE *phandle, HBA_WWN nodeWWN) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAGetNumberOfAdaptersFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetNumberOfAdaptersFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAOpenAdapterByWWNFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim OpenAdapterFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "OpenAdapterByWWN: %s", WWN2STR1(&nodeWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ARE_WE_INITED();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *phandle = HBA_HANDLE_INVALID;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_LL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (lib_infop = _hbaapi_librarylist;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop = lib_infop->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_ILLEGAL_WWN;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lib_infop->status != HBA_LIBRARY_LOADED) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* only for HBAAPIV2 */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lib_infop->version != HBAAPIV2) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetNumberOfAdaptersFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim FUNCCOMMON(lib_infop, GetNumberOfAdaptersHandler);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetNumberOfAdaptersFunc == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* look for new hardware */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) ((GetNumberOfAdaptersFunc)());
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim OpenAdapterFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.OpenAdapterByWWNHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (OpenAdapterFunc == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * We do not know if the WWN is known by this vendor,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * just try it
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((status = (OpenAdapterFunc)(&handle, nodeWWN)) != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* OK, make a vendor non-specific handle */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *phandle = HBA_HANDLE_FROM_LOCAL(lib_infop->index, handle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_OK;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimvoid
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_RefreshAdapterConfiguration() {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_RefreshAdapterConfiguration", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) HBA_GetNumberOfAdapters();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_UINT32
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_GetVersion() {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_GetVersion", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_LIBVERSION);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * This function is VERY OS dependent. Wing it as best you can.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_UINT32
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_GetWrapperLibraryAttributes(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARYATTRIBUTES *attributes)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_GetWrapperLibraryAttributes", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (attributes == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(1, "HBA_GetWrapperLibraryAttributes:"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "NULL pointer attributes",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR_ARG);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) memset(attributes, 0, sizeof (HBA_LIBRARYATTRIBUTES));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#if defined(SOLARIS)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((handle = dlopen("libHBAAPI.so", RTLD_NOW)) != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (dlinfo(handle, RTLD_DI_LINKMAP, &map) >= 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (mp = map; mp != NULL; mp = mp->l_next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strlen(map->l_name) < 256) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) strcpy(attributes->LibPath, map->l_name);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#elif defined(WIN32)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HMODULE module;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* No need to do anything with the module handle */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* It wasn't alloocated so it doesn't need to be freed */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim module = GetModuleHandle("HBAAPI");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (module != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetModuleFileName(module, attributes->LibPath,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (attributes->LibPath)) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim attributes->LibPath[0] = '\0';
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#if defined(VENDOR)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) strcpy(attributes->VName, VENDOR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#else
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim attributes->VName[0] = '\0';
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#if defined(VERSION)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) strcpy(attributes->VVersion, VERSION);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#else
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim attributes->VVersion[0] = '\0';
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#if defined(BUILD_DATE)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#if defined(WIN32)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int matchCount;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim matchCount = sscanf(BUILD_DATE, "%u/%u/%u %u:%u:%u",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &attributes->build_date.tm_year,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &attributes->build_date.tm_mon,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &attributes->build_date.tm_mday,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &attributes->build_date.tm_hour,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &attributes->build_date.tm_min,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &attributes->build_date.tm_sec);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (matchCount != 6) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim memset(&attributes->build_date, 0, sizeof (struct tm));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim attributes->build_date.tm_year -= 1900;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim attributes->build_date.tm_isdst = -1;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#else
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strptime(BUILD_DATE,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "%Y/%m/%d %T %Z", &(attributes->build_date)) == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) memset(&attributes->build_date, 0, sizeof (struct tm));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#else
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) memset(&attributes->build_date, 0, sizeof (struct tm));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (2);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Callback registation and handling
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_RemoveCallback(HBA_CALLBACKHANDLE cbhandle) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_RemoveCallback", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ARE_WE_INITED();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_LL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = local_remove_callback(cbhandle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* Adapter Add Events ************************************************* */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic void
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* LINTED E_FUNC_ARG_UNUSED */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimadapteraddevents_callback(void *data, HBA_WWN PortWWN, HBA_UINT32 eventType) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ALLADAPTERSCALLBACK_ELEM *cbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(3, "AddAdapterEvent, port: %s", WWN2STR1(&PortWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_AAE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (cbp = _hbaapi_adapteraddevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim cbp != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim cbp = cbp->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (*cbp->callback)(data, PortWWN, HBA_EVENT_ADAPTER_ADD);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_AAE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_RegisterForAdapterAddEvents(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void (*callback)(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *data,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN PortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 eventType),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *userData,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_CALLBACKHANDLE *callbackHandle) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ALLADAPTERSCALLBACK_ELEM *cbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_VENDORCALLBACK_ELEM *vcbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_VENDORCALLBACK_ELEM *vendorhandlelist;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBARegisterForAdapterAddEventsFunc registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status = HBA_STATUS_OK;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS failure = HBA_STATUS_OK;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int registered_cnt = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int vendor_cnt = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int not_supported_cnt = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int status_OK_bar_cnt = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int status_OK_cnt = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_RegisterForAdapterAddEvents", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ARE_WE_INITED();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim cbp = (HBA_ALLADAPTERSCALLBACK_ELEM *)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim calloc(1, sizeof (HBA_ALLADAPTERSCALLBACK_ELEM));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *callbackHandle = (HBA_CALLBACKHANDLE) cbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (cbp == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifndef WIN32
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) fprintf(stderr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "HBA_RegisterForAdapterAddEvents: calloc failed "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "for %lu bytes\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (unsigned long)(sizeof (HBA_ALLADAPTERSCALLBACK_ELEM)));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_LL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_AAE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim cbp->callback = callback;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim cbp->next = _hbaapi_adapteraddevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_adapteraddevents_callback_list = cbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Need to release the mutex now incase the vendor function invokes the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * callback. We will grap the mutex later to attach the vendor handle
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * list to the callback structure
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_AAE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * now create a list of vendors (vendor libraryies, NOT ADAPTERS)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * that have successfully registerred
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorhandlelist = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (lib_infop = _hbaapi_librarylist;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop = lib_infop->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* only for HBAAPI V2 */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((lib_infop->version != HBAAPIV2)) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendor_cnt++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.RegisterForAdapterAddEventsHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vcbp = (HBA_VENDORCALLBACK_ELEM *)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim calloc(1, sizeof (HBA_VENDORCALLBACK_ELEM));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (vcbp == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifndef WIN32
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) fprintf(stderr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "HBA_RegisterForAdapterAddEvents: "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "calloc failed for %lu bytes\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (unsigned long)(sizeof (HBA_VENDORCALLBACK_ELEM)));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim freevendorhandlelist(vendorhandlelist);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registered_cnt++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)(adapteraddevents_callback,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim userData, &vcbp->vendorcbhandle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status == HBA_STATUS_ERROR_NOT_SUPPORTED) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim not_supported_cnt++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(vcbp);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status_OK_bar_cnt++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(1,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "HBA_RegisterForAdapterAddEvents: Library->%s, Error->%d",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->LibraryPath, status, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifndef WIN32
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) fprintf(stderr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "HBA_RegisterForAdapterAddEvents: Library->%s, Error->%d",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->LibraryPath, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim failure = status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(vcbp);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status_OK_cnt++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vcbp->lib_info = lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vcbp->next = vendorhandlelist;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorhandlelist = vcbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (vendor_cnt == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* no HBAAPIV2 is deteced. should be okay? */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else if (registered_cnt == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim freevendorhandlelist(vendorhandlelist);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) local_remove_callback((HBA_CALLBACKHANDLE) cbp);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else if (status_OK_cnt == 0 && not_supported_cnt != 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else if (status_OK_cnt == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * At least one vendor library registered this function, but no
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * vendor call succeeded
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) local_remove_callback((HBA_CALLBACKHANDLE) cbp);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = failure;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* we have had atleast some success, now finish up */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_AAE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * this seems silly, but what if another thread called
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * the callback remove
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (cbp = _hbaapi_adapteraddevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim cbp != NULL; cbp = cbp->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((HBA_CALLBACKHANDLE)cbp == *callbackHandle) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* yup, its still there, hooray */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim cbp->vendorhandlelist = vendorhandlelist;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorhandlelist = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_AAE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (vendorhandlelist != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * bummer, somebody removed the callback before we finished
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * registration, probably will never happen
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim freevendorhandlelist(vendorhandlelist);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(1,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "HBA_RegisterForAdapterAddEvents: HBA_RemoveCallback was "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "called for a handle before registration was finished.",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_OK;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* Adapter Events (other than add) ************************************** */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic void
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimadapterevents_callback(void *data,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN PortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 eventType) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(3, "AdapterEvent, port:%s, eventType:%d", WWN2STR1(&PortWWN),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim eventType, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_AE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (acbp = _hbaapi_adapterevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp = acbp->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (data == (void *)acbp) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (*acbp->callback)(acbp->userdata, PortWWN, eventType);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_AE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_RegisterForAdapterEvents(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void (*callback) (
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *data,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN PortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 eventType),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *userData,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_CALLBACKHANDLE *callbackHandle) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBARegisterForAdapterEventsFunc registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_RegisterForAdapterEvents", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* we now have the _hbaapi_LL_mutex */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.RegisterForAdapterEventsHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_NOT_SUPPORTED);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * that allocated memory is used both as the handle for the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * caller, and as userdata to the vendor call so that on
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * callback the specific registration may be recalled
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp = (HBA_ADAPTERCALLBACK_ELEM *)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim calloc(1, sizeof (HBA_ADAPTERCALLBACK_ELEM));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (acbp == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifndef WIN32
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) fprintf(stderr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "HBA_RegisterForAdapterEvents: calloc failed for %lu bytes\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (unsigned long)(sizeof (HBA_ADAPTERCALLBACK_ELEM)));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *callbackHandle = (HBA_CALLBACKHANDLE) acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->callback = callback;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->userdata = userData;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->lib_info = lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)(adapterevents_callback,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *)acbp,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorHandle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &acbp->vendorcbhandle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(acbp);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_AE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->next = _hbaapi_adapterevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_adapterevents_callback_list = acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_AE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_OK);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* Adapter Port Events ************************************************** */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic void
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimadapterportevents_callback(void *data,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN PortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 eventType,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 fabricPortID) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(3, "AdapterPortEvent, port:%s, eventType:%d fabricPortID:0X%06x",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&PortWWN), eventType, fabricPortID);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_APE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (acbp = _hbaapi_adapterportevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp = acbp->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (data == (void *)acbp) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (*acbp->callback)(acbp->userdata, PortWWN, eventType, fabricPortID);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_APE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_RegisterForAdapterPortEvents(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void (*callback) (
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *data,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN PortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 eventType,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 fabricPortID),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *userData,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN PortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_CALLBACKHANDLE *callbackHandle) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBARegisterForAdapterPortEventsFunc registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_RegisterForAdapterPortEvents for port: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&PortWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* we now have the _hbaapi_LL_mutex */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.RegisterForAdapterPortEventsHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_NOT_SUPPORTED);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * that allocated memory is used both as the handle for the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * caller, and as userdata to the vendor call so that on
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * callback the specific registration may be recalled
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp = (HBA_ADAPTERCALLBACK_ELEM *)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim calloc(1, sizeof (HBA_ADAPTERCALLBACK_ELEM));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (acbp == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifndef WIN32
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) fprintf(stderr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "HBA_RegisterForAdapterPortEvents: "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "calloc failed for %lu bytes\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (unsigned long)(sizeof (HBA_ADAPTERCALLBACK_ELEM)));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *callbackHandle = (HBA_CALLBACKHANDLE) acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->callback = callback;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->userdata = userData;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->lib_info = lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)(adapterportevents_callback,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *)acbp,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorHandle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim PortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &acbp->vendorcbhandle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(acbp);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_APE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->next = _hbaapi_adapterportevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_adapterportevents_callback_list = acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_APE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_OK);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* Adapter State Events ************************************************ */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic void
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimadapterportstatevents_callback(void *data,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN PortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 eventType) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(3, "AdapterPortStatEvent, port:%s, eventType:%d",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&PortWWN),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim eventType, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_APSE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (acbp = _hbaapi_adapterportstatevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp = acbp->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (data == (void *)acbp) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (*acbp->callback)(acbp->userdata, PortWWN, eventType);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_APSE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_RegisterForAdapterPortStatEvents(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void (*callback) (
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *data,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN PortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 eventType),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *userData,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN PortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_PORTSTATISTICS stats,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 statType,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_CALLBACKHANDLE *callbackHandle) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBARegisterForAdapterPortStatEventsFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_RegisterForAdapterPortStatEvents for port: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&PortWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* we now have the _hbaapi_LL_mutex */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.RegisterForAdapterPortStatEventsHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_NOT_SUPPORTED);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * that allocated memory is used both as the handle for the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * caller, and as userdata to the vendor call so that on
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * callback the specific registration may be recalled
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp = (HBA_ADAPTERCALLBACK_ELEM *)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim calloc(1, sizeof (HBA_ADAPTERCALLBACK_ELEM));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (acbp == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifndef WIN32
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) fprintf(stderr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "HBA_RegisterForAdapterPortStatEvents: "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "calloc failed for %lu bytes\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (unsigned long)(sizeof (HBA_ADAPTERCALLBACK_ELEM)));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *callbackHandle = (HBA_CALLBACKHANDLE) acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->callback = callback;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->userdata = userData;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->lib_info = lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)(adapterportstatevents_callback,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *)acbp,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorHandle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim PortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim stats,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim statType,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &acbp->vendorcbhandle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(acbp);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_APSE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->next = _hbaapi_adapterportstatevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_adapterportstatevents_callback_list = acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_APSE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_OK);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* Target Events ******************************************************* */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic void
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimtargetevents_callback(void *data,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN discoveredPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 eventType) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(3, "TargetEvent, hbaPort:%s, discoveredPort:%s eventType:%d",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&hbaPortWWN), WWN2STR2(&discoveredPortWWN), eventType);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_TE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (acbp = _hbaapi_targetevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp = acbp->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (data == (void *)acbp) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (*acbp->callback)(acbp->userdata, hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim discoveredPortWWN, eventType);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_TE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_RegisterForTargetEvents(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void (*callback) (
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *data,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN discoveredPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 eventType),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *userData,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN discoveredPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_CALLBACKHANDLE *callbackHandle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 allTargets) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTERCALLBACK_ELEM
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBARegisterForTargetEventsFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_RegisterForTargetEvents, hbaPort: %s, discoveredPort: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&hbaPortWWN), WWN2STR2(&discoveredPortWWN), 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* we now have the _hbaapi_LL_mutex */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.RegisterForTargetEventsHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_NOT_SUPPORTED);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * that allocated memory is used both as the handle for the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * caller, and as userdata to the vendor call so that on
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * callback the specific registration may be recalled
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp = (HBA_ADAPTERCALLBACK_ELEM *)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim calloc(1, sizeof (HBA_ADAPTERCALLBACK_ELEM));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (acbp == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifndef WIN32
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) fprintf(stderr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "HBA_RegisterForTargetEvents: calloc failed for %lu bytes\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (unsigned long)(sizeof (HBA_ADAPTERCALLBACK_ELEM)));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *callbackHandle = (HBA_CALLBACKHANDLE) acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->callback = callback;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->userdata = userData;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->lib_info = lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)(targetevents_callback,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *)acbp,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorHandle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim discoveredPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &acbp->vendorcbhandle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim allTargets);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(acbp);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_TE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->next = _hbaapi_targetevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_targetevents_callback_list = acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_TE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_OK);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* Link Events ********************************************************* */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic void
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimlinkevents_callback(void *data,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN adapterWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 eventType,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pRLIRBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 RLIRBufferSize) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(3, "LinkEvent, hbaWWN:%s, eventType:%d",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&adapterWWN), eventType, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_LE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (acbp = _hbaapi_linkevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp = acbp->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (data == (void *)acbp) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (*acbp->callback)(acbp->userdata, adapterWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim eventType, pRLIRBuffer, RLIRBufferSize);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_LE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_RegisterForLinkEvents(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void (*callback) (
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *data,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN adapterWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 eventType,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pRLIRBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 RLIRBufferSize),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *userData,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pRLIRBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 RLIRBufferSize,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_CALLBACKHANDLE *callbackHandle) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBARegisterForLinkEventsFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_RegisterForLinkEvents", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARY();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* we now have the _hbaapi_LL_mutex */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc = FUNCCOMMON(lib_infop, RegisterForLinkEventsHandler);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_NOT_SUPPORTED);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * that allocated memory is used both as the handle for the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * caller, and as userdata to the vendor call so that on
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * callback the specific registration may be recalled
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp = (HBA_ADAPTERCALLBACK_ELEM *)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim calloc(1, sizeof (HBA_ADAPTERCALLBACK_ELEM));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (acbp == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifndef WIN32
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) fprintf(stderr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "HBA_RegisterForLinkEvents: calloc failed for %lu bytes\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (unsigned long)(sizeof (HBA_ADAPTERCALLBACK_ELEM)));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *callbackHandle = (HBA_CALLBACKHANDLE) acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->callback = callback;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->userdata = userData;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->lib_info = lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)(linkevents_callback,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *)acbp,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pRLIRBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RLIRBufferSize,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorHandle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &acbp->vendorcbhandle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(acbp);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_LE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->next = _hbaapi_linkevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_linkevents_callback_list = acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_LE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_OK);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * All of the functions below are almost passthru functions to the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * vendor specific function
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimvoid
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_CloseAdapter(HBA_HANDLE handle) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBACloseAdapterFunc CloseAdapterFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_CloseAdapter", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_CheckLibrary(handle, &lib_infop, &vendorHandle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status == HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CloseAdapterFunc = FUNCCOMMON(lib_infop, CloseAdapterHandler);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (CloseAdapterFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ((CloseAdapterFunc)(vendorHandle));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_LL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_GetAdapterAttributes(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTERATTRIBUTES
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *hbaattributes)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAGetAdapterAttributesFunc GetAdapterAttributesFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_GetAdapterAttributes", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARY();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lib_infop->version == SMHBA) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INCOMPATIBLE);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetAdapterAttributesFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.GetAdapterAttributesHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetAdapterAttributesFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((GetAdapterAttributesFunc)(vendorHandle, hbaattributes));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_GetAdapterPortAttributes(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 portindex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_PORTATTRIBUTES *portattributes)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAGetAdapterPortAttributesFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetAdapterPortAttributesFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_GetAdapterPortAttributes", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARY();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lib_infop->version == SMHBA) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INCOMPATIBLE);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetAdapterPortAttributesFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.GetAdapterPortAttributesHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetAdapterPortAttributesFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((GetAdapterPortAttributesFunc)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (vendorHandle, portindex, portattributes));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_GetPortStatistics(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 portindex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_PORTSTATISTICS *portstatistics)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAGetPortStatisticsFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetPortStatisticsFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_GetPortStatistics", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARY();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lib_infop->version == SMHBA) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INCOMPATIBLE);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetPortStatisticsFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.GetPortStatisticsHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetPortStatisticsFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((GetPortStatisticsFunc)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (vendorHandle, portindex, portstatistics));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_GetDiscoveredPortAttributes(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 portindex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 discoveredportindex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_PORTATTRIBUTES *portattributes)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAGetDiscoveredPortAttributesFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetDiscoveredPortAttributesFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_GetDiscoveredPortAttributes", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARY();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lib_infop->version == SMHBA) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INCOMPATIBLE);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetDiscoveredPortAttributesFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.GetDiscoveredPortAttributesHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetDiscoveredPortAttributesFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((GetDiscoveredPortAttributesFunc)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (vendorHandle, portindex, discoveredportindex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portattributes));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_GetPortAttributesByWWN(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN PortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_PORTATTRIBUTES *portattributes)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAGetPortAttributesByWWNFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetPortAttributesByWWNFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_GetPortAttributesByWWN: %s", WWN2STR1(&PortWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARY();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lib_infop->version == SMHBA) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INCOMPATIBLE);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetPortAttributesByWWNFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.GetPortAttributesByWWNHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetPortAttributesByWWNFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((GetPortAttributesByWWNFunc)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (vendorHandle, PortWWN, portattributes));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_SendCTPassThru(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pReqBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 ReqBufferSize,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pRspBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 RspBufferSize)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBASendCTPassThruFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SendCTPassThruFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_SendCTPassThru", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARY();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lib_infop->version == SMHBA) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INCOMPATIBLE);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SendCTPassThruFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.SendCTPassThruHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (SendCTPassThruFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (SendCTPassThruFunc)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (vendorHandle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pReqBuffer, ReqBufferSize,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pRspBuffer, RspBufferSize);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_SendCTPassThruV2(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pReqBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 ReqBufferSize,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pRspBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 *pRspBufferSize)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBASendCTPassThruV2Func
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_SendCTPassThruV2m hbaPortWWN: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&hbaPortWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc = FUNCCOMMON(lib_infop, SendCTPassThruV2Handler);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (vendorHandle, hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pReqBuffer, ReqBufferSize,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pRspBuffer, pRspBufferSize);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_GetEventBuffer(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim PHBA_EVENTINFO EventBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 *EventBufferCount)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAGetEventBufferFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetEventBufferFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_GetEventBuffer", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARY();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lib_infop->version == SMHBA) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INCOMPATIBLE);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetEventBufferFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.GetEventBufferHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetEventBufferFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (GetEventBufferFunc)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (vendorHandle, EventBuffer, EventBufferCount);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_SetRNIDMgmtInfo(HBA_HANDLE handle, HBA_MGMTINFO Info) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBASetRNIDMgmtInfoFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SetRNIDMgmtInfoFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_SetRNIDMgmtInfo", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARY();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SetRNIDMgmtInfoFunc = FUNCCOMMON(lib_infop, SetRNIDMgmtInfoHandler);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (SetRNIDMgmtInfoFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (SetRNIDMgmtInfoFunc)(vendorHandle, Info);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_GetRNIDMgmtInfo(HBA_HANDLE handle, HBA_MGMTINFO *pInfo) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAGetRNIDMgmtInfoFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetRNIDMgmtInfoFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_GetRNIDMgmtInfo", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARY();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetRNIDMgmtInfoFunc = FUNCCOMMON(lib_infop, GetRNIDMgmtInfoHandler);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetRNIDMgmtInfoFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (GetRNIDMgmtInfoFunc)(vendorHandle, pInfo);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_SendRNID(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN wwn,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWNTYPE wwntype,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pRspBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 *pRspBufferSize)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBASendRNIDFunc SendRNIDFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_SendRNID for wwn: %s", WWN2STR1(&wwn), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARY();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lib_infop->version == SMHBA) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INCOMPATIBLE);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SendRNIDFunc = lib_infop->ftable.functionTable.SendRNIDHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (SendRNIDFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((SendRNIDFunc)(vendorHandle, wwn, wwntype,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pRspBuffer, pRspBufferSize));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_SendRNIDV2(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN destWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 destFCID,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 NodeIdDataFormat,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pRspBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 *pRspBufferSize)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBASendRNIDV2Func registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_SendRNIDV2, hbaPortWWN: %s", WWN2STR1(&hbaPortWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARY();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc = FUNCCOMMON(lib_infop, SendRNIDV2Handler);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (vendorHandle, hbaPortWWN, destWWN, destFCID, NodeIdDataFormat,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pRspBuffer, pRspBufferSize);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimvoid
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_RefreshInformation(HBA_HANDLE handle) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBARefreshInformationFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RefreshInformationFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_RefreshInformation", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_CheckLibrary(handle, &lib_infop, &vendorHandle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status == HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RefreshInformationFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim FUNCCOMMON(lib_infop, RefreshInformationHandler);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (RefreshInformationFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ((RefreshInformationFunc)(vendorHandle));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_LL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimvoid
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_ResetStatistics(HBA_HANDLE handle, HBA_UINT32 portindex) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAResetStatisticsFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ResetStatisticsFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_ResetStatistics", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_CheckLibrary(handle, &lib_infop, &vendorHandle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status == HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lib_infop->version == SMHBA) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_LL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ResetStatisticsFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.ResetStatisticsHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (ResetStatisticsFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ((ResetStatisticsFunc)(vendorHandle, portindex));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_LL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_GetFcpTargetMapping(HBA_HANDLE handle, PHBA_FCPTARGETMAPPING mapping) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAGetFcpTargetMappingFunc GetFcpTargetMappingFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_GetFcpTargetMapping", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARY();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lib_infop->version == SMHBA) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INCOMPATIBLE);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetFcpTargetMappingFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.GetFcpTargetMappingHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetFcpTargetMappingFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((GetFcpTargetMappingFunc)(vendorHandle, mapping));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_GetFcpTargetMappingV2(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_FCPTARGETMAPPINGV2 *pmapping)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAGetFcpTargetMappingV2Func
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_GetFcpTargetMapping", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.GetFcpTargetMappingV2Handler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((registeredfunc)(vendorHandle, hbaPortWWN, pmapping));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_GetFcpPersistentBinding(HBA_HANDLE handle, PHBA_FCPBINDING binding) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAGetFcpPersistentBindingFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetFcpPersistentBindingFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_GetFcpPersistentBinding", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARY();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lib_infop->version == SMHBA) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INCOMPATIBLE);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetFcpPersistentBindingFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.GetFcpPersistentBindingHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetFcpPersistentBindingFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((GetFcpPersistentBindingFunc)(vendorHandle, binding));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_ScsiInquiryV2(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN discoveredPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT64 fcLUN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT8 CDB_Byte1,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT8 CDB_Byte2,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pRspBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 *pRspBufferSize,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT8 *pScsiStatus,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pSenseBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 *pSenseBufferSize)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAScsiInquiryV2Func ScsiInquiryV2Func;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_ScsiInquiryV2 to discoveredPortWWN: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&discoveredPortWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ScsiInquiryV2Func =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.ScsiInquiryV2Handler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (ScsiInquiryV2Func != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((ScsiInquiryV2Func)(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorHandle, hbaPortWWN, discoveredPortWWN, fcLUN, CDB_Byte1,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CDB_Byte2, pRspBuffer, pRspBufferSize, pScsiStatus,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pSenseBuffer, pSenseBufferSize));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_SendScsiInquiry(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN PortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT64 fcLUN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT8 EVPD,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 PageCode,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pRspBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 RspBufferSize,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pSenseBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 SenseBufferSize)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBASendScsiInquiryFunc SendScsiInquiryFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_SendScsiInquiry to PortWWN: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&PortWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARY();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lib_infop->version == SMHBA) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INCOMPATIBLE);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SendScsiInquiryFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.ScsiInquiryHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (SendScsiInquiryFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((SendScsiInquiryFunc)(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorHandle, PortWWN, fcLUN, EVPD, PageCode, pRspBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RspBufferSize, pSenseBuffer, SenseBufferSize));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_ScsiReportLUNsV2(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN discoveredPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pRespBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 *pRespBufferSize,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT8 *pScsiStatus,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pSenseBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 *pSenseBufferSize)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAScsiReportLUNsV2Func ScsiReportLUNsV2Func;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_ScsiReportLUNsV2 to discoveredPortWWN: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&discoveredPortWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ScsiReportLUNsV2Func =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.ScsiReportLUNsV2Handler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (ScsiReportLUNsV2Func != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((ScsiReportLUNsV2Func)(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorHandle, hbaPortWWN, discoveredPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pRespBuffer, pRespBufferSize,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pScsiStatus,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pSenseBuffer, pSenseBufferSize));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_SendReportLUNs(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN portWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pRspBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 RspBufferSize,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pSenseBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 SenseBufferSize)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBASendReportLUNsFunc SendReportLUNsFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_SendReportLUNs to PortWWN: %s", WWN2STR1(&portWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARY();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lib_infop->version == SMHBA) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INCOMPATIBLE);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SendReportLUNsFunc = lib_infop->ftable.functionTable.ReportLUNsHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (SendReportLUNsFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((SendReportLUNsFunc)(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorHandle, portWWN, pRspBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RspBufferSize, pSenseBuffer, SenseBufferSize));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_ScsiReadCapacityV2(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN discoveredPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT64 fcLUN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pRspBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 *pRspBufferSize,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT8 *pScsiStatus,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pSenseBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 *SenseBufferSize)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAScsiReadCapacityV2Func ScsiReadCapacityV2Func;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_ScsiReadCapacityV2 to discoveredPortWWN: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&discoveredPortWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ScsiReadCapacityV2Func =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.ScsiReadCapacityV2Handler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (ScsiReadCapacityV2Func != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((ScsiReadCapacityV2Func)(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorHandle, hbaPortWWN, discoveredPortWWN, fcLUN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pRspBuffer, pRspBufferSize,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pScsiStatus,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pSenseBuffer, SenseBufferSize));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_SendReadCapacity(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN portWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT64 fcLUN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pRspBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 RspBufferSize,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pSenseBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 SenseBufferSize)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBASendReadCapacityFunc SendReadCapacityFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_SendReadCapacity to portWWN: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&portWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARY();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lib_infop->version == SMHBA) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_INCOMPATIBLE);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SendReadCapacityFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.ReadCapacityHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (SendReadCapacityFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((SendReadCapacityFunc)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (vendorHandle, portWWN, fcLUN, pRspBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RspBufferSize, pSenseBuffer, SenseBufferSize));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_SendRPL(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN agent_wwn,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 agent_domain,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 portindex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pRspBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 *pRspBufferSize)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBASendRPLFunc registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_SendRPL to agent_wwn: %s:%d",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&agent_wwn), agent_domain, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARY();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc = FUNCCOMMON(lib_infop, SendRPLHandler);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorHandle, hbaPortWWN, agent_wwn, agent_domain, portindex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pRspBuffer, pRspBufferSize);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_SendRPS(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN agent_wwn,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 agent_domain,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN object_wwn,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 object_port_number,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pRspBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 *pRspBufferSize)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBASendRPSFunc registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_SendRPS to agent_wwn: %s:%d",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&agent_wwn), agent_domain, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARY();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc = FUNCCOMMON(lib_infop, SendRPSHandler);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorHandle, hbaPortWWN, agent_wwn, agent_domain,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim object_wwn, object_port_number,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pRspBuffer, pRspBufferSize);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_SendSRL(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN wwn,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 domain,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pRspBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 *pRspBufferSize)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBASendSRLFunc registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_SendSRL to wwn:%s domain:%d", WWN2STR1(&wwn), domain, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARY();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc = FUNCCOMMON(lib_infop, SendSRLHandler);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorHandle, hbaPortWWN, wwn, domain,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pRspBuffer, pRspBufferSize);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_SendRLS(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN destWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pRspBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 *pRspBufferSize)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBASendRLSFunc registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_SendRLS dest_wwn: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&destWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARY();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc = FUNCCOMMON(lib_infop, SendRLSHandler);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorHandle, hbaPortWWN, destWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pRspBuffer, pRspBufferSize);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_SendLIRR(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN sourceWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN destWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT8 function,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT8 type,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pRspBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 *pRspBufferSize)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBASendLIRRFunc registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_SendLIRR destWWN:%s", WWN2STR1(&destWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARY();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc = FUNCCOMMON(lib_infop, SendLIRRHandler);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorHandle, sourceWWN, destWWN, function, type,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pRspBuffer, pRspBufferSize);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_GetBindingCapability(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_BIND_CAPABILITY *pcapability)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAGetBindingCapabilityFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_GetBindingCapability", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.GetBindingCapabilityHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)(vendorHandle, hbaPortWWN, pcapability);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_GetBindingSupport(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_BIND_CAPABILITY *pcapability)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAGetBindingSupportFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_GetBindingSupport", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.GetBindingSupportHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)(vendorHandle, hbaPortWWN, pcapability);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_SetBindingSupport(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_BIND_CAPABILITY capability)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBASetBindingSupportFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_SetBindingSupport", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.SetBindingSupportHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)(vendorHandle, hbaPortWWN, capability);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_SetPersistentBindingV2(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim const HBA_FCPBINDING2 *pbinding)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBASetPersistentBindingV2Func
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_SetPersistentBindingV2 port: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&hbaPortWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.SetPersistentBindingV2Handler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)(vendorHandle, hbaPortWWN, pbinding);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_GetPersistentBindingV2(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_FCPBINDING2 *pbinding)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAGetPersistentBindingV2Func
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_GetPersistentBindingV2 port: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&hbaPortWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.GetPersistentBindingV2Handler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)(vendorHandle, hbaPortWWN, pbinding);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_RemovePersistentBinding(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim const HBA_FCPBINDING2
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *pbinding)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBARemovePersistentBindingFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_RemovePersistentBinding", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.RemovePersistentBindingHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)(vendorHandle, hbaPortWWN, pbinding);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_RemoveAllPersistentBindings(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBARemoveAllPersistentBindingsFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_RemoveAllPersistentBindings", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.RemoveAllPersistentBindingsHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)(vendorHandle, hbaPortWWN);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_GetFC4Statistics(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN portWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT8 FC4type,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_FC4STATISTICS *pstatistics)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAGetFC4StatisticsFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_GetFC4Statistics port: %s", WWN2STR1(&portWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.GetFC4StatisticsHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (vendorHandle, portWWN, FC4type, pstatistics);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_GetFCPStatistics(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim const HBA_SCSIID *lunit,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_FC4STATISTICS *pstatistics)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAGetFCPStatisticsFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_GetFCPStatistics", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.functionTable.GetFCPStatisticsHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)(vendorHandle, lunit, pstatistics);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_UINT32
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_GetVendorLibraryAttributes(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 adapter_index,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARYATTRIBUTES *attributes)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTER_INFO *adapt_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAGetVendorLibraryAttributesFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 ret = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_GetVendorLibraryAttributes adapterindex:%d",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adapter_index, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (_hbaapi_librarylist == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(1, "HBAAPI not loaded yet.", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (attributes == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(1,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "HBA_GetVendorLibraryAttributes: NULL pointer attributes",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR_ARG);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) memset(attributes, 0, sizeof (HBA_LIBRARYATTRIBUTES));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_LL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_AL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (adapt_infop = _hbaapi_adapterlist;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adapt_infop != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adapt_infop = adapt_infop->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (adapt_infop->index == adapter_index) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (adapt_infop->library->version == SMHBA) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_AL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_INCOMPATIBLE);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc = adapt_infop->library->
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ftable.functionTable.GetVendorLibraryAttributesHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret = (registeredfunc)(attributes);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Version 1 libary? */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBAGetVersionFunc GetVersionFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetVersionFunc = adapt_infop->library->
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ftable.functionTable.GetVersionHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetVersionFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret = ((GetVersionFunc)());
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifdef NOTDEF
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* This should not happen, dont think its going to */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (attributes->LibPath[0] == '\0') {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strlen(adapt_infop->library->LibraryPath) < 256) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) strcpy(attributes->LibPath,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adapt_infop->library->LibraryPath);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_AL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * This function returns SM-HBA version that the warpper library implemented.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_UINT32
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_GetVersion() {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_GetVersion", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (SMHBA_LIBVERSION);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * This function returns the attributes for the warpper library.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_UINT32
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_GetWrapperLibraryAttributes(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_LIBRARYATTRIBUTES *attributes)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim struct timeval tv;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim struct tm tp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_GetWrapperLibraryAttributes", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (attributes == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(1, "SMHBA_GetWrapperLibraryAttributes: "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "NULL pointer attributes",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR_ARG);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) memset(attributes, 0, sizeof (SMHBA_LIBRARYATTRIBUTES));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#if defined(SOLARIS)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((handle = dlopen("libSMHBAAPI.so", RTLD_NOW)) != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (dlinfo(handle, RTLD_DI_LINKMAP, &map) >= 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (mp = map; mp != NULL; mp = mp->l_next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strlen(map->l_name) < 256) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) strcpy(attributes->LibPath, map->l_name);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#if defined(VENDOR)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) strcpy(attributes->VName, VENDOR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#else
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim attributes->VName[0] = '\0';
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#if defined(VERSION)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) strcpy(attributes->VVersion, VERSION);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#else
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim attributes->VVersion[0] = '\0';
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (gettimeofday(&tv, (void *)0) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (localtime_r(&tv.tv_sec, &tp) != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim attributes->build_date.tm_mday = tp.tm_mday;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim attributes->build_date.tm_mon = tp.tm_mon;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim attributes->build_date.tm_year = tp.tm_year;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) memset(&attributes->build_date, 0,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (attributes->build_date));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) memset(&attributes->build_date, 0,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (attributes->build_date));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (1);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * This function returns the attributes for the warpper library.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_UINT32
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_GetVendorLibraryAttributes(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 adapter_index,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_LIBRARYATTRIBUTES *attributes)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTER_INFO *adapt_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBAGetVendorLibraryAttributesFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 ret = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_GetVendorLibraryAttributes adapterindex:%d",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adapter_index, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (_hbaapi_librarylist == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(1, "SMHBAAPI not loaded yet.", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (attributes == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(1, "SMHBA_GetVendorLibraryAttributes: "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "NULL pointer attributes",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR_ARG);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) memset(attributes, 0, sizeof (SMHBA_LIBRARYATTRIBUTES));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_LL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_AL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (adapt_infop = _hbaapi_adapterlist;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adapt_infop != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adapt_infop = adapt_infop->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (adapt_infop->index == adapter_index) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (adapt_infop->library->version != SMHBA) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_AL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_INCOMPATIBLE);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc = adapt_infop->library->
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ftable.smhbafunctionTable.GetVendorLibraryAttributesHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret = (registeredfunc)(attributes);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#ifdef NOTDEF
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* This should not happen since the VSL is already loaded. */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#endif
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (attributes->LibPath[0] == '\0') {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strlen(adapt_infop->library->LibraryPath) < 256) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) strcpy(attributes->LibPath,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adapt_infop->library->LibraryPath);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_AL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_GetAdapterAttributes(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_ADAPTERATTRIBUTES *hbaattributes)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBAGetAdapterAttributesFunc GetAdapterAttributesFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_GetAdapterAttributes", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetAdapterAttributesFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.GetAdapterAttributesHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetAdapterAttributesFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((GetAdapterAttributesFunc)(vendorHandle, hbaattributes));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_GetNumberOfPorts(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 *numberofports)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBAGetNumberOfPortsFunc GetNumberOfPortsFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_GetAdapterAttributes", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetNumberOfPortsFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.GetNumberOfPortsHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetNumberOfPortsFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((GetNumberOfPortsFunc)(vendorHandle, numberofports));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_GetPortType(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 portindex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_PORTTYPE *porttype)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBAGetPortTypeFunc GetPortTypeFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_GetAdapterAttributes", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetPortTypeFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.GetPortTypeHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetPortTypeFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((GetPortTypeFunc)(vendorHandle, portindex, porttype));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_GetAdapterPortAttributes(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 portindex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_PORTATTRIBUTES *portattributes)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBAGetAdapterPortAttributesFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetAdapterPortAttributesFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_GetAdapterPortAttributes", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetAdapterPortAttributesFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetAdapterPortAttributesHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetAdapterPortAttributesFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((GetAdapterPortAttributesFunc)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (vendorHandle, portindex, portattributes));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_GetDiscoveredPortAttributes(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 portindex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 discoveredportindex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_PORTATTRIBUTES *portattributes)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBAGetDiscoveredPortAttributesFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetDiscoveredPortAttributesFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_GetDiscoveredPortAttributes", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetDiscoveredPortAttributesFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetDiscoveredPortAttributesHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetDiscoveredPortAttributesFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((GetDiscoveredPortAttributesFunc)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (vendorHandle, portindex, discoveredportindex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portattributes));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_GetPortAttributesByWWN(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN portWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_PORTATTRIBUTES *portattributes)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBAGetPortAttributesByWWNFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetPortAttributesByWWNFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_GetPortAttributesByWWN: %s", WWN2STR1(&portWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetPortAttributesByWWNFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.GetPortAttributesByWWNHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetPortAttributesByWWNFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((GetPortAttributesByWWNFunc)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (vendorHandle, portWWN, domainPortWWN, portattributes));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_GetFCPhyAttributes(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 portindex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 phyindex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_FC_PHY *phytype)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBAGetFCPhyAttributesFunc GetFCPhyAttributesFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_GetFCPhyAttributesByWWN", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetFCPhyAttributesFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.GetFCPhyAttributesHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetFCPhyAttributesFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((GetFCPhyAttributesFunc)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (vendorHandle, portindex, phyindex, phytype));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_GetSASPhyAttributes(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 portindex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 phyindex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_SAS_PHY *phytype)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBAGetSASPhyAttributesFunc GetSASPhyAttributesFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_GetFCPhyAttributesByWWN", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetSASPhyAttributesFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.GetSASPhyAttributesHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetSASPhyAttributesFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((GetSASPhyAttributesFunc)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (vendorHandle, portindex, phyindex, phytype));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_GetProtocolStatistics(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 portindex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 protocoltype,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_PROTOCOLSTATISTICS *pProtocolStatistics)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBAGetProtocolStatisticsFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetProtocolStatisticsFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_GetProtocolStatistics port index: %d protocol type: %d",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portindex, protocoltype, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetProtocolStatisticsFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.GetProtocolStatisticsHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetProtocolStatisticsFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (GetProtocolStatisticsFunc)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (vendorHandle, portindex, protocoltype, pProtocolStatistics);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_GetPhyStatistics(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 portindex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 phyindex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_PHYSTATISTICS *pPhyStatistics)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBAGetPhyStatisticsFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetPhyStatisticsFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_GetPhyStatistics port index: %d phy idex: %d",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portindex, phyindex, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetPhyStatisticsFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.GetPhyStatisticsHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetPhyStatisticsFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (GetPhyStatisticsFunc)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (vendorHandle, portindex, phyindex, pPhyStatistics);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_GetBindingCapability(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_BIND_CAPABILITY *pFlags)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBAGetBindingCapabilityFunc GetBindingCapabilityFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "HBA_GetBindingCapability", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetBindingCapabilityFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.GetBindingCapabilityHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetBindingCapabilityFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (GetBindingCapabilityFunc)(vendorHandle, hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim domainPortWWN, pFlags);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_GetBindingSupport(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_BIND_CAPABILITY *pFlags)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBAGetBindingSupportFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetBindingSupporFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_GetBindingSupport port: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&hbaPortWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetBindingSupporFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.GetBindingSupportHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetBindingSupporFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (GetBindingSupporFunc)(vendorHandle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hbaPortWWN, domainPortWWN, pFlags);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_SetBindingSupport(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_BIND_CAPABILITY flags)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBASetBindingSupportFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SetBindingSupporFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_GetBindingSupport port: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&hbaPortWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(HBAAPIV2);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SetBindingSupporFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.SetBindingSupportHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (SetBindingSupporFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (SetBindingSupporFunc)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (vendorHandle, hbaPortWWN, domainPortWWN, flags);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_GetTargetMapping(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_TARGETMAPPING *pMapping)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBAGetTargetMappingFunc GetTargetMappingFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_GetTargetMapping port WWN: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&hbaPortWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetTargetMappingFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.GetTargetMappingHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetTargetMappingFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((GetTargetMappingFunc)(vendorHandle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hbaPortWWN, domainPortWWN, pMapping));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_GetPersistentBinding(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_BINDING *binding)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBAGetPersistentBindingFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetPersistentBindingFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_GetPersistentBinding port WWN: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&hbaPortWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetPersistentBindingFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.GetPersistentBindingHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetPersistentBindingFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((GetPersistentBindingFunc)(vendorHandle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hbaPortWWN, domainPortWWN, binding));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_SetPersistentBinding(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim const SMHBA_BINDING *binding)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBASetPersistentBindingFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SetPersistentBindingFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_SetPersistentBinding port WWN: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&hbaPortWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SetPersistentBindingFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.SetPersistentBindingHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (SetPersistentBindingFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((SetPersistentBindingFunc)(vendorHandle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hbaPortWWN, domainPortWWN, binding));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_RemovePersistentBinding(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim const SMHBA_BINDING *binding)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBARemovePersistentBindingFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RemovePersistentBindingFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_RemovePersistentBinding port WWN: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&hbaPortWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RemovePersistentBindingFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.RemovePersistentBindingHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (RemovePersistentBindingFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((RemovePersistentBindingFunc)(vendorHandle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hbaPortWWN, domainPortWWN, binding));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_RemoveAllPersistentBindings(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN domainPortWWN)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBARemoveAllPersistentBindingsFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RemoveAllPersistentBindingsFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_RemoveAllPersistentBinding port WWN: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&hbaPortWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RemoveAllPersistentBindingsFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RemoveAllPersistentBindingsHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (RemoveAllPersistentBindingsFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((RemoveAllPersistentBindingsFunc)(vendorHandle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hbaPortWWN, domainPortWWN));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_GetLUNStatistics(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim const HBA_SCSIID *lunit,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_PROTOCOLSTATISTICS *statistics)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBAGetLUNStatisticsFunc GetLUNStatisticsFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_GetLUNStatistics", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GetLUNStatisticsFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.GetLUNStatisticsHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (GetLUNStatisticsFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((GetLUNStatisticsFunc)(vendorHandle, lunit, statistics));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_ScsiInquiry(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN discoveredPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_SCSILUN smhbaLUN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT8 CDB_Byte1,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT8 CDB_Byte2,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pRspBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 *pRspBufferSize,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT8 *pScsiStatus,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pSenseBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 *pSenseBufferSize)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBAScsiInquiryFunc ScsiInquiryFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_ScsiInquiry to hba port: %s discoveredPortWWN: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&hbaPortWWN), WWN2STR1(&discoveredPortWWN), 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ScsiInquiryFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.ScsiInquiryHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (ScsiInquiryFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((ScsiInquiryFunc)(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorHandle, hbaPortWWN, discoveredPortWWN, domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim smhbaLUN, CDB_Byte1, CDB_Byte2, pRspBuffer, pRspBufferSize,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pScsiStatus, pSenseBuffer, pSenseBufferSize));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_ScsiReportLUNs(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN discoveredPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pRspBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 *pRspBufferSize,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT8 *pScsiStatus,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pSenseBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 *pSenseBufferSize)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBAScsiReportLUNsFunc ScsiReportLUNsFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_ScsiReportLuns to hba port: %s discoveredPortWWN: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&hbaPortWWN), WWN2STR1(&discoveredPortWWN), 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ScsiReportLUNsFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.ScsiReportLUNsHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (ScsiReportLUNsFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((ScsiReportLUNsFunc)(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorHandle, hbaPortWWN, discoveredPortWWN, domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pRspBuffer, pRspBufferSize, pScsiStatus, pSenseBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pSenseBufferSize));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_ScsiReadCapacity(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN discoveredPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_SCSILUN smhbaLUN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pRspBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 *pRspBufferSize,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT8 *pScsiStatus,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pSenseBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 *pSenseBufferSize)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBAScsiReadCapacityFunc ScsiReadCapacityFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_ScsiReadCapacity to hba port: %s discoveredPortWWN: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&hbaPortWWN), WWN2STR1(&discoveredPortWWN), 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ScsiReadCapacityFunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.ScsiReadCapacityHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (ScsiReadCapacityFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = ((ScsiReadCapacityFunc)(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorHandle, hbaPortWWN, discoveredPortWWN, domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim smhbaLUN, pRspBuffer, pRspBufferSize, pScsiStatus, pSenseBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pSenseBufferSize));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_SendTEST(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN destWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 destFCID,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pRspBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 pRspBufferSize)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBASendTESTFunc SendTESTFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_SendTEST, hbaPortWWN: %s destWWN",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&hbaPortWWN),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&destWWN), 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SendTESTFunc = lib_infop->ftable.smhbafunctionTable.SendTESTHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (SendTESTFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (SendTESTFunc)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (vendorHandle, hbaPortWWN, destWWN, destFCID,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pRspBuffer, pRspBufferSize);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_SendECHO(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN destWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 destFCID,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pReqBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 ReqBufferSize,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pRspBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 *pRspBufferSize)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBASendECHOFunc SendECHOFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_SendECHO, hbaPortWWN: %s destWWN",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&hbaPortWWN), WWN2STR1(&destWWN), 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SendECHOFunc = lib_infop->ftable.smhbafunctionTable.SendECHOHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (SendECHOFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (SendECHOFunc)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (vendorHandle, hbaPortWWN, destWWN, destFCID,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pReqBuffer, ReqBufferSize, pRspBuffer, pRspBufferSize);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_SendSMPPassThru(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN destWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pReqBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 ReqBufferSize,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pRspBuffer,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 *pRspBufferSize)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBASendSMPPassThruFunc SendSMPPassThruFunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_SendSMPPassThru, hbaPortWWN: %s destWWN: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&hbaPortWWN), WWN2STR1(&destWWN), 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SendSMPPassThruFunc = lib_infop->ftable.\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim smhbafunctionTable.SendSMPPassThruHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (SendSMPPassThruFunc != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (SendSMPPassThruFunc)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (vendorHandle, hbaPortWWN, destWWN, domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pReqBuffer, ReqBufferSize, pRspBuffer, pRspBufferSize);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Following the similar logic of HBAAPI addaspterevents_callback.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Unlike other events Adapter Add Event is not limited to a specific
0778188f242b11e5d53f771c9e8a069354b3d5d4Hengqing Hu * adapter(i.e. no adapter handle is passed for registration) so
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * the event should be passed to all registrants. The routine below
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * is passed to the VSLs as a callback and when Adapter Add event is detected
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * by VSL it will call smhba_adapteraddevents_callback() which in turn check
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * if the passed userdata ptr matches with the one stored in the callback list
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * and calls the stored callback.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * For the situation that multiple clients are registered for Adapter Add event
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * each registration is passed to VSLs so VSL may call
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * smhba_adapteraddevents_callback() multiple times or it may call only once
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * since the callback function is same. For this implemneation, the userdata
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * is stored in HBA_ALLADAPTERSCALLBACK_ELEM so it is expected that VSL call
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * smhba_adapteraddevents_callback() only once and
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * smhba_adapteraddevents_callback() will call the client callback with proper
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * userdata.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic void
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimsmhba_adapteraddevents_callback(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* LINTED E_FUNC_ARG_UNUSED */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *data,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN PortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* LINTED E_FUNC_ARG_UNUSED */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 eventType)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ALLADAPTERSCALLBACK_ELEM *cbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(3, "AddAdapterEvent, port:%s", WWN2STR1(&PortWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_smhba_AAE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (cbp = _smhba_adapteraddevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim cbp != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim cbp = cbp->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (*cbp->callback)(cbp->userdata, PortWWN, HBA_EVENT_ADAPTER_ADD);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_smhba_AAE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_RegisterForAdapterAddEvents(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void (*pCallback) (
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *data,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN PortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 eventType),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pUserData,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_CALLBACKHANDLE *pCallbackHandle) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ALLADAPTERSCALLBACK_ELEM *cbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_VENDORCALLBACK_ELEM *vcbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_VENDORCALLBACK_ELEM *vendorhandlelist;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBARegisterForAdapterAddEventsFunc registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status = HBA_STATUS_OK;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS failure = HBA_STATUS_OK;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int registered_cnt = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int vendor_cnt = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int not_supported_cnt = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int status_OK_bar_cnt = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int status_OK_cnt = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_RegisterForAdapterAddEvents", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ARE_WE_INITED();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim cbp = (HBA_ALLADAPTERSCALLBACK_ELEM *)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim calloc(1, sizeof (HBA_ALLADAPTERSCALLBACK_ELEM));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *pCallbackHandle = (HBA_CALLBACKHANDLE) cbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (cbp == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_LL_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_smhba_AAE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim cbp->callback = pCallback;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim cbp->userdata = pUserData;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim cbp->next = _smhba_adapteraddevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _smhba_adapteraddevents_callback_list = cbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Need to release the mutex now incase the vendor function invokes the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * callback. We will grap the mutex later to attach the vendor handle
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * list to the callback structure
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_smhba_AAE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * now create a list of vendors (vendor libraryies, NOT ADAPTERS)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * that have successfully registerred
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorhandlelist = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (lib_infop = _hbaapi_librarylist;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop = lib_infop->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* only for HBAAPI V2 */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (lib_infop->version != SMHBA) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendor_cnt++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RegisterForAdapterAddEventsHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vcbp = (HBA_VENDORCALLBACK_ELEM *)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim calloc(1, sizeof (HBA_VENDORCALLBACK_ELEM));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (vcbp == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim freevendorhandlelist(vendorhandlelist);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registered_cnt++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)(smhba_adapteraddevents_callback,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pUserData, &vcbp->vendorcbhandle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status == HBA_STATUS_ERROR_NOT_SUPPORTED) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim not_supported_cnt++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(vcbp);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status_OK_bar_cnt++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(1,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "SMHBA_RegisterForAdapterAddEvents: Library->%s, Error->%d",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->LibraryPath, status, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim failure = status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(vcbp);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status_OK_cnt++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vcbp->lib_info = lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vcbp->next = vendorhandlelist;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorhandlelist = vcbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (vendor_cnt == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* no SMHBA VSL found. Should be okay?? */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else if (registered_cnt == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim freevendorhandlelist(vendorhandlelist);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) local_remove_callback((HBA_CALLBACKHANDLE) cbp);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else if (status_OK_cnt == 0 && not_supported_cnt != 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR_NOT_SUPPORTED;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else if (status_OK_cnt == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * At least one vendor library registered this function, but no
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * vendor call succeeded
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) local_remove_callback((HBA_CALLBACKHANDLE) cbp);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = failure;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* we have had atleast some success, now finish up */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_smhba_AAE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * this seems silly, but what if another thread called
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * the callback remove
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (cbp = _smhba_adapteraddevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim cbp != NULL; cbp = cbp->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((HBA_CALLBACKHANDLE)cbp == *pCallbackHandle) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* yup, its still there, hooray */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim cbp->vendorhandlelist = vendorhandlelist;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorhandlelist = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_smhba_AAE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (vendorhandlelist != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * bummer, somebody removed the callback before we finished
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * registration, probably will never happen
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim freevendorhandlelist(vendorhandlelist);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(1,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "HBA_RegisterForAdapterAddEvents: HBA_RemoveCallback was "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "called for a handle before registration was finished.",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_ERROR;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_STATUS_OK;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* SMHBA Adapter Events (other than add) ******************************** */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic void
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimsmhba_adapterevents_callback(void *data,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN PortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 eventType)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(3, "AdapterEvent, port:%s, eventType:%d", WWN2STR1(&PortWWN),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim eventType, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_hbaapi_AE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (acbp = _smhba_adapterevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp = acbp->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (data == (void *)acbp) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (*acbp->callback)(acbp->userdata, PortWWN, eventType);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_hbaapi_AE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_RegisterForAdapterEvents(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void (*pCallback) (
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *data,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN PortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 eventType),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pUserData,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_CALLBACKHANDLE *pCallbackHandle) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBARegisterForAdapterEventsFunc registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_RegisterForAdapterEvents", 0, 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* we now have the _hbaapi_LL_mutex */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc = lib_infop->ftable.smhbafunctionTable.\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RegisterForAdapterEventsHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_NOT_SUPPORTED);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * that allocated memory is used both as the handle for the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * caller, and as userdata to the vendor call so that on
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * callback the specific registration may be recalled
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp = (HBA_ADAPTERCALLBACK_ELEM *)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim calloc(1, sizeof (HBA_ADAPTERCALLBACK_ELEM));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (acbp == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *pCallbackHandle = (HBA_CALLBACKHANDLE) acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->callback = pCallback;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->userdata = pUserData;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->lib_info = lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)(smhba_adapterevents_callback,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *)acbp,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorHandle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &acbp->vendorcbhandle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(acbp);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_smhba_AE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->next = _smhba_adapterevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _hbaapi_adapterevents_callback_list = acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_smhba_AE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_OK);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* Adapter Port Events *********************************************** */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic void
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimsmhba_adapterportevents_callback(void *data,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN PortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 eventType,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 fabricPortID)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(3,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "SMHBA_AdapterPortEvent, port:%s, eventType:%d fabricPortID:0X%06x",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&PortWWN), eventType, fabricPortID);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_smhba_APE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (acbp = _smhba_adapterportevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp = acbp->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (data == (void *)acbp) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (*acbp->callback)(acbp->userdata, PortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim eventType, fabricPortID);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_smhba_APE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_RegisterForAdapterPortEvents(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void (*pCallback) (
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pData,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN PortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 eventType,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 fabricPortID),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pUserData,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN portWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 specificEventType,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_CALLBACKHANDLE *pCallbackHandle) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBARegisterForAdapterPortEventsFunc registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_RegisterForAdapterPortEvents for port: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&portWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* we now have the _hbaapi_LL_mutex */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RegisterForAdapterPortEventsHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_NOT_SUPPORTED);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * that allocated memory is used both as the handle for the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * caller, and as userdata to the vendor call so that on
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * callback the specific registration may be recalled
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp = (HBA_ADAPTERCALLBACK_ELEM *)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim calloc(1, sizeof (HBA_ADAPTERCALLBACK_ELEM));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (acbp == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *pCallbackHandle = (HBA_CALLBACKHANDLE) acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->callback = pCallback;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->userdata = pUserData;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->lib_info = lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)(smhba_adapterportevents_callback,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *)acbp,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorHandle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim specificEventType,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &acbp->vendorcbhandle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(acbp);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_smhba_APE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->next = _smhba_adapterportevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _smhba_adapterportevents_callback_list = acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_smhba_APE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_OK);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* SMHBA Adapter Port Stat Events ******************************** */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic void
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimsmhba_adapterportstatevents_callback(void *data,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN portWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 protocolType,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 eventType)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(3,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "SMBA_AdapterPortStateEvent, port:%s, eventType:%d",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&portWWN), eventType, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_smhba_APSE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (acbp = _smhba_adapterportstatevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp = acbp->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (data == (void *)acbp) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (*acbp->callback)(acbp->userdata, portWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim protocolType, eventType);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_smhba_APSE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_RegisterForAdapterPortStatEvents(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void (*pCallback) (
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pData,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN portWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 protocolType,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 eventType),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pUserData,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN portWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 protocolType,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_PROTOCOLSTATISTICS stats,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 statType,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_CALLBACKHANDLE *pCallbackHandle) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBARegisterForAdapterPortStatEventsFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_RegisterForAdapterPortStatEvents for port: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&portWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* we now have the _hbaapi_LL_mutex */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RegisterForAdapterPortStatEventsHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_NOT_SUPPORTED);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * that allocated memory is used both as the handle for the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * caller, and as userdata to the vendor call so that on
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * callback the specific registration may be recalled
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp = (HBA_ADAPTERCALLBACK_ELEM *)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim calloc(1, sizeof (HBA_ADAPTERCALLBACK_ELEM));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (acbp == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *pCallbackHandle = (HBA_CALLBACKHANDLE) acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->callback = pCallback;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->userdata = pUserData;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->lib_info = lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)(smhba_adapterportstatevents_callback,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *)acbp,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorHandle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim protocolType,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim stats,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim statType,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &acbp->vendorcbhandle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(acbp);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_smhba_APSE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->next = _smhba_adapterportstatevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _smhba_adapterportstatevents_callback_list = acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_smhba_APSE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_OK);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* SMHBA Adapter Port Phy Stat Events ************************************ */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic void
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimsmhba_adapterphystatevents_callback(void *data,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN portWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 phyIndex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 eventType)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(3,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "SMBA_AdapterPortStateEvent, port:%s, eventType:%d",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&portWWN), eventType, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_smhba_APHYSE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (acbp = _smhba_adapterphystatevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp = acbp->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (data == (void *)acbp) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (*acbp->callback)(acbp->userdata, portWWN, phyIndex, eventType);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_smhba_APHYSE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_RegisterForAdapterPhyStatEvents(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void (*pCallback) (
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pData,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN portWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 phyIndex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 eventType),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pUserData,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN portWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 phyIndex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_PHYSTATISTICS stats,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 statType,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_CALLBACKHANDLE *pCallbackHandle) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBARegisterForAdapterPhyStatEventsFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_RegisterForAdapterPhyStatEvents for port: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&portWWN), 0, 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* we now have the _hbaapi_LL_mutex */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lib_infop->ftable.smhbafunctionTable.\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RegisterForAdapterPhyStatEventsHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_NOT_SUPPORTED);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * that allocated memory is used both as the handle for the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * caller, and as userdata to the vendor call so that on
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * callback the specific registration may be recalled
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp = (HBA_ADAPTERCALLBACK_ELEM *)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim calloc(1, sizeof (HBA_ADAPTERCALLBACK_ELEM));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (acbp == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *pCallbackHandle = (HBA_CALLBACKHANDLE) acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->callback = pCallback;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->userdata = pUserData;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->lib_info = lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)(smhba_adapterphystatevents_callback,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *)acbp,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorHandle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim phyIndex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim stats,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim statType,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &acbp->vendorcbhandle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(acbp);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_smhba_APHYSE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->next = _smhba_adapterphystatevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _smhba_adapterphystatevents_callback_list = acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_smhba_APHYSE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_OK);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* SMHBA Target Events ********************************************* */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic void
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimsmhba_targetevents_callback(void *data,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN discoveredPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 eventType)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(3, "TargetEvent, hbaPort:%s, discoveredPort:%s eventType:%d",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&hbaPortWWN), WWN2STR2(&discoveredPortWWN), eventType);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_smhba_TE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (acbp = _smhba_targetevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp = acbp->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (data == (void *)acbp) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (*acbp->callback)(acbp->userdata, hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim discoveredPortWWN, domainPortWWN, eventType);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_smhba_TE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSMHBA_RegisterForTargetEvents(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void (*pCallback) (
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pData,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN discoveredPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 eventType),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim void *pUserData,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN discoveredPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_CALLBACKHANDLE *pCallbackHandle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 allTargets) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_ADAPTERCALLBACK_ELEM *acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBARegisterForTargetEventsFunc
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_LIBRARY_INFO *lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE vendorHandle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DEBUG(2, "SMHBA_RegisterForTargetEvents, hbaPort:"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "%s, discoveredPort: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim WWN2STR1(&hbaPortWWN), WWN2STR2(&discoveredPortWWN), 0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim CHECKLIBRARYANDVERSION(SMHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* we now have the _hbaapi_LL_mutex */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim registeredfunc = lib_infop->ftable.smhbafunctionTable.\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RegisterForTargetEventsHandler;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (registeredfunc == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR_NOT_SUPPORTED);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * that allocated memory is used both as the handle for the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * caller, and as userdata to the vendor call so that on
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * callback the specific registration may be recalled
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp = (HBA_ADAPTERCALLBACK_ELEM *)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim calloc(1, sizeof (HBA_ADAPTERCALLBACK_ELEM));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (acbp == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *pCallbackHandle = (HBA_CALLBACKHANDLE) acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->callback = pCallback;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->userdata = pUserData;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->lib_info = lib_infop;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = (registeredfunc)(smhba_targetevents_callback,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *)acbp,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim vendorHandle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim discoveredPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &acbp->vendorcbhandle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim allTargets);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(acbp);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim GRAB_MUTEX(&_smhba_TE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim acbp->next = _smhba_targetevents_callback_list;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim _smhba_targetevents_callback_list = acbp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX(&_smhba_TE_mutex);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim RELEASE_MUTEX_RETURN(&_hbaapi_LL_mutex, HBA_STATUS_OK);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}