2N/A/*
2N/A * CDDL HEADER START
2N/A *
2N/A * The contents of this file are subject to the terms of the
2N/A * Common Development and Distribution License (the "License").
2N/A * You may not use this file except in compliance with the License.
2N/A *
2N/A * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2N/A * or http://www.opensolaris.org/os/licensing.
2N/A * See the License for the specific language governing permissions
2N/A * and limitations under the License.
2N/A *
2N/A * When distributing Covered Code, include this CDDL HEADER in each
2N/A * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2N/A * If applicable, add the following below this CDDL HEADER, with the
2N/A * fields enclosed by brackets "[]" replaced with your own identifying
2N/A * information: Portions Copyright [yyyy] [name of copyright owner]
2N/A *
2N/A * CDDL HEADER END
2N/A */
2N/A/*
2N/A * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
2N/A * Use is subject to license terms.
2N/A */
2N/A
2N/A#ifndef _CFGA_FP_H
2N/A#define _CFGA_FP_H
2N/A
2N/A
2N/A
2N/A#ifdef __cplusplus
2N/Aextern "C" {
2N/A#endif
2N/A
2N/A#include <sys/types.h>
2N/A#include <sys/mkdev.h>
2N/A#include <stddef.h>
2N/A#include <locale.h>
2N/A#include <ctype.h>
2N/A#include <stdio.h>
2N/A#include <stdlib.h>
2N/A#include <string.h>
2N/A#include <fcntl.h>
2N/A#include <unistd.h>
2N/A#include <errno.h>
2N/A#include <locale.h>
2N/A#include <langinfo.h>
2N/A#include <time.h>
2N/A#include <stdarg.h>
2N/A#include <sys/mman.h>
2N/A#include <sys/ioctl.h>
2N/A#include <sys/dditypes.h>
2N/A#include <sys/modctl.h>
2N/A#include <libdevinfo.h>
2N/A#include <libdevice.h>
2N/A#include <librcm.h>
2N/A#include <dirent.h>
2N/A#include <strings.h>
2N/A
2N/A
2N/A#include <sys/ioctl.h>
2N/A#include <sys/byteorder.h>
2N/A#include <sys/scsi/scsi.h>
2N/A#include <strings.h>
2N/A#include <sys/vfstab.h>
2N/A#include <sys/stat.h>
2N/A#include <setjmp.h>
2N/A#include <signal.h>
2N/A#include <hbaapi.h>
2N/A#include <sys/fibre-channel/fcio.h>
2N/A#include <sys/fibre-channel/ulp/fcp_util.h>
2N/A
2N/A#include <sys/uio.h>
2N/A#include <sys/param.h>
2N/A
2N/A#include <synch.h>
2N/A#include <thread.h>
2N/A
2N/A#include <limits.h>
2N/A#include <ftw.h>
2N/A
2N/A#define CFGA_PLUGIN_LIB
2N/A#include <config_admin.h>
2N/A
2N/A#if !defined(DEBUG)
2N/A#define NDEBUG 1
2N/A#else
2N/A#undef NDEBUG
2N/A#endif
2N/A
2N/A#include <assert.h>
2N/A
2N/A/* Return/error codes */
2N/Atypedef enum {
2N/A FPCFGA_ERR = -2,
2N/A FPCFGA_LIB_ERR = -1,
2N/A FPCFGA_OK = 0,
2N/A FPCFGA_ACCESS_OK,
2N/A FPCFGA_NACK,
2N/A FPCFGA_BUSY,
2N/A FPCFGA_SYSTEM_BUSY,
2N/A FPCFGA_APID_NOCONFIGURE,
2N/A FPCFGA_APID_NOACCESS,
2N/A FPCFGA_APID_NOEXIST,
2N/A FPCFGA_OPNOTSUPP,
2N/A FPCFGA_PRIV,
2N/A FPCFGA_UNLOCKED,
2N/A FPCFGA_NO_REC,
2N/A FPCFGA_OP_INTR,
2N/A FPCFGA_DB_INVAL,
2N/A FPCFGA_CONF_OK_UPD_REP_FAILED,
2N/A FPCFGA_UNCONF_OK_UPD_REP_FAILED,
2N/A FPCFGA_INVALID_PATH,
2N/A FPCFGA_VHCI_GET_PATHLIST_FAILED,
2N/A FPCFGA_XPORT_NOT_IN_PHCI_LIST,
2N/A FPCFGA_UNKNOWN_ERR,
2N/A FPCFGA_FCP_TGT_SEND_SCSI_FAILED,
2N/A FPCFGA_FCP_SEND_SCSI_DEV_NOT_TGT
2N/A} fpcfga_ret_t;
2N/A
2N/A/* Commands used internally */
2N/Atypedef enum {
2N/A FPCFGA_INVAL_CMD = -1,
2N/A FPCFGA_DEV_OP = 0,
2N/A FPCFGA_BUS_OP,
2N/A FPCFGA_STAT_FC_DEV,
2N/A FPCFGA_STAT_FCA_PORT,
2N/A FPCFGA_STAT_ALL,
2N/A FPCFGA_GET_DEVPATH,
2N/A FPCFGA_INSERT_DEV,
2N/A FPCFGA_REMOVE_DEV,
2N/A FPCFGA_REPLACE_DEV,
2N/A FPCFGA_WALK_NODE,
2N/A FPCFGA_WALK_MINOR,
2N/A FPCFGA_BUS_QUIESCE,
2N/A FPCFGA_BUS_UNQUIESCE,
2N/A FPCFGA_BUS_GETSTATE,
2N/A FPCFGA_DEV_GETSTATE,
2N/A FPCFGA_BUS_CONFIGURE,
2N/A FPCFGA_BUS_UNCONFIGURE,
2N/A FPCFGA_DEV_CONFIGURE,
2N/A FPCFGA_DEV_UNCONFIGURE,
2N/A FPCFGA_DEV_REMOVE,
2N/A FPCFGA_RESET_DEV,
2N/A FPCFGA_RESET_BUS,
2N/A FPCFGA_RESET_ALL,
2N/A FPCFGA_READ,
2N/A FPCFGA_WRITE
2N/A} fpcfga_cmd_t;
2N/A
2N/Atypedef enum {
2N/A FPCFGA_TERMINATE = 0,
2N/A FPCFGA_CONTINUE
2N/A} fpcfga_recur_t;
2N/A
2N/A
2N/A/* Structures for tree walking code */
2N/A
2N/Atypedef struct {
2N/A uint_t flags;
2N/A int (*fcn)(di_node_t node, void *argp);
2N/A} walk_node_t;
2N/A
2N/Atypedef struct {
2N/A const char *nodetype;
2N/A int (*fcn)(di_node_t node, di_minor_t minor, void *argp);
2N/A} walk_minor_t;
2N/A
2N/Atypedef union {
2N/A walk_node_t node_args;
2N/A walk_minor_t minor_args;
2N/A} walkmode_t;
2N/A
2N/Atypedef struct {
2N/A uint_t flags;
2N/A walkmode_t walkmode;
2N/A} walkarg_t;
2N/A
2N/Atypedef struct {
2N/A char *phys;
2N/A char *log;
2N/A fpcfga_ret_t ret;
2N/A int match_minor;
2N/A int l_errno;
2N/A} pathm_t;
2N/A
2N/Atypedef struct ldata_list {
2N/A cfga_list_data_t ldata;
2N/A struct ldata_list *next;
2N/A} ldata_list_t;
2N/A
2N/Atypedef struct {
2N/A struct cfga_confirm *confp;
2N/A struct cfga_msg *msgp;
2N/A} prompt_t;
2N/A
2N/Atypedef struct luninfo_list {
2N/A int lunnum;
2N/A uint_t node_state;
2N/A uint_t lun_flag;
2N/A char *path;
2N/A struct luninfo_list *next;
2N/A} luninfo_list_t;
2N/A
2N/Atypedef struct {
2N/A char *xport_phys;
2N/A char *dyncomp;
2N/A uint_t flags;
2N/A luninfo_list_t *lunlist; /* Singly linked list */
2N/A} apid_t;
2N/A
2N/A/* Report luns names */
2N/A#define FP_SCMD_REPORT_LUN 0xA0
2N/A#define DEFAULT_NUM_LUN 1024
2N/A#define REPORT_LUN_HDR_SIZE 8
2N/A#define SAM_LUN_SIZE 8
2N/A
2N/A#ifdef _BIG_ENDIAN
2N/A#define htonll(x) (x)
2N/A#define ntohll(x) (x)
2N/A#else
2N/A#define htonll(x) ((((unsigned long long)htonl(x)) << 32) + htonl(x >> 32))
2N/A#define ntohll(x) ((((unsigned long long)ntohl(x)) << 32) + ntohl(x >> 32))
2N/A#endif
2N/A
2N/Atypedef struct report_lun_resp {
2N/A uint32_t num_lun;
2N/A uint32_t reserved;
2N/A longlong_t lun_string[DEFAULT_NUM_LUN];
2N/A} report_lun_resp_t;
2N/A
2N/A/*
2N/A * Hardware options acceptable for fp plugin.
2N/A * list related options are handled by getsupopts() and set to
2N/A * index of array.
2N/A */
2N/A#define OPT_DEVINFO_FORCE 0
2N/A#define OPT_SHOW_SCSI_LUN 1
2N/A#define OPT_FCP_DEV 2
2N/A#define OPT_DISABLE_RCM 0
2N/A#define OPT_FORCE_UPDATE_REP 1
2N/A#define OPT_NO_UPDATE_REP 2
2N/A#define OPT_REMOVE_UNUSABLE_SCSI_LUN 3
2N/A#define OPT_REMOVE_UNUSABLE_FCP_DEV 4
2N/A
2N/A/* walk tree flag */
2N/A#define FLAG_PATH_INFO_WALK 0x00000001
2N/A
2N/A/* apid_t flags */
2N/A#define FLAG_DISABLE_RCM 0x00000001
2N/A#define FLAG_FORCE_UPDATE_REP 0x00000010
2N/A#define FLAG_NO_UPDATE_REP 0x00000100
2N/A#define FLAG_DYN_AP_CONFIGURED 0x00001000
2N/A#define FLAG_DEVINFO_FORCE 0x00010000
2N/A#define FLAG_FCP_DEV 0x00100000
2N/A#define FLAG_REMOVE_UNUSABLE_FCP_DEV 0x01000000
2N/A
2N/A/* apid_t lun flags */
2N/A#define FLAG_SKIP_RCMOFFLINE 0x00000001
2N/A#define FLAG_SKIP_RCMREMOVE 0x00000010
2N/A#define FLAG_SKIP_ONLINEOTHERS 0x00000100
2N/A
2N/A/* define for peripheral qualifier mask */
2N/A#define FP_PERI_QUAL_MASK 0xE0
2N/A
2N/A/* Message ids */
2N/Atypedef enum {
2N/A
2N/A/* ERRORS */
2N/AERR_UNKNOWN = -1,
2N/AERR_OP_FAILED,
2N/AERR_CMD_INVAL,
2N/AERR_NOT_BUSAPID,
2N/AERR_APID_INVAL,
2N/AERR_NOT_BUSOP,
2N/AERR_NOT_DEVOP,
2N/AERR_UNAVAILABLE,
2N/AERR_CTRLR_CRIT,
2N/AERR_BUS_GETSTATE,
2N/AERR_BUS_NOTCONNECTED,
2N/AERR_BUS_CONNECTED,
2N/AERR_BUS_QUIESCE,
2N/AERR_BUS_UNQUIESCE,
2N/AERR_BUS_CONFIGURE,
2N/AERR_BUS_UNCONFIGURE,
2N/AERR_DEV_CONFIGURE,
2N/AERR_DEV_UNCONFIGURE,
2N/AERR_FCA_CONFIGURE,
2N/AERR_FCA_UNCONFIGURE,
2N/AERR_DEV_REPLACE,
2N/AERR_DEV_INSERT,
2N/AERR_DEV_GETSTATE,
2N/AERR_RESET,
2N/AERR_LIST,
2N/AERR_FC,
2N/AERR_FC_GET_DEVLIST,
2N/AERR_FC_GET_FIRST_DEV,
2N/AERR_FC_GET_NEXT_DEV,
2N/AERRARG_FC_DEV_MAP_INIT,
2N/AERRARG_FC_PROP_LOOKUP_BYTES,
2N/AERRARG_FC_INQUIRY,
2N/AERRARG_FC_REP_LUNS,
2N/AERRARG_FC_TOPOLOGY,
2N/AERRARG_PATH_TOO_LONG,
2N/AERRARG_INVALID_PATH,
2N/AERRARG_OPENDIR,
2N/AERRARG_VHCI_GET_PATHLIST,
2N/AERRARG_XPORT_NOT_IN_PHCI_LIST,
2N/AERR_SIG_STATE,
2N/AERR_MAYBE_BUSY,
2N/AERR_BUS_DEV_MISMATCH,
2N/AERR_GET_DEVLIST,
2N/AERR_MEM_ALLOC,
2N/AERR_DEVCTL_OFFLINE,
2N/AERR_UPD_REP,
2N/AERR_CONF_OK_UPD_REP,
2N/AERR_UNCONF_OK_UPD_REP,
2N/AERR_PARTIAL_SUCCESS,
2N/AERR_HBA_LOAD_LIBRARY,
2N/AERR_MATCHING_HBA_PORT,
2N/AERR_NO_ADAPTER_FOUND,
2N/A
2N/A/* Errors with arguments */
2N/AERRARG_OPT_INVAL,
2N/AERRARG_HWCMD_INVAL,
2N/AERRARG_DEVINFO,
2N/AERRARG_NOT_IN_DEVLIST,
2N/AERRARG_NOT_IN_DEVINFO,
2N/AERRARG_DI_GET_PROP,
2N/AERRARG_DC_DDEF_ALLOC,
2N/AERRARG_DC_BYTE_ARRAY,
2N/AERRARG_DC_BUS_ACQUIRE,
2N/AERRARG_BUS_DEV_CREATE,
2N/AERRARG_BUS_DEV_CREATE_UNKNOWN,
2N/AERRARG_DEV_ACQUIRE,
2N/AERRARG_DEV_REMOVE,
2N/A
2N/A/* RCM Errors */
2N/AERR_RCM_HANDLE,
2N/AERRARG_RCM_SUSPEND,
2N/AERRARG_RCM_RESUME,
2N/AERRARG_RCM_OFFLINE,
2N/AERRARG_RCM_ONLINE,
2N/AERRARG_RCM_REMOVE,
2N/AERRARG_RCM_INFO,
2N/A
2N/A/* Commands */
2N/ACMD_INSERT_DEV,
2N/ACMD_REMOVE_DEV,
2N/ACMD_REPLACE_DEV,
2N/ACMD_RESET_DEV,
2N/ACMD_RESET_BUS,
2N/ACMD_RESET_ALL,
2N/A
2N/A/* help messages */
2N/AMSG_HELP_HDR,
2N/AMSG_HELP_USAGE,
2N/A
2N/A/* Hotplug messages */
2N/AMSG_INSDEV,
2N/AMSG_RMDEV,
2N/AMSG_REPLDEV,
2N/A
2N/A/* Hotplugging confirmation prompts */
2N/ACONF_QUIESCE_1,
2N/ACONF_QUIESCE_2,
2N/ACONF_UNQUIESCE,
2N/A
2N/A/* Misc. */
2N/AWARN_DISCONNECT
2N/A} msgid_t;
2N/A
2N/Atypedef struct {
2N/A msgid_t str_id;
2N/A fpcfga_cmd_t cmd;
2N/A fpcfga_ret_t (*fcn)(fpcfga_cmd_t, apid_t *, prompt_t *, char **);
2N/A} hw_cmd_t;
2N/A
2N/Atypedef struct {
2N/A msgid_t msgid;
2N/A int nargs; /* Number of arguments following msgid */
2N/A int intl; /* Flag: if 1, internationalize */
2N/A const char *msgstr;
2N/A} msgcvt_t;
2N/A
2N/A
2N/A#define SLASH "/"
2N/A#define CFGA_DEV_DIR "/dev/cfg"
2N/A#define DEV_DIR "/dev"
2N/A#define DEVICES_DIR "/devices"
2N/A#define DEV_DSK "/dev/dsk"
2N/A#define DEV_RDSK "/dev/rdsk"
2N/A#define DEV_RMT "/dev/rmt"
2N/A#define DSK_DIR "dsk"
2N/A#define RDSK_DIR "rdsk"
2N/A#define RMT_DIR "rmt"
2N/A
2N/A
2N/A#define DYN_SEP "::"
2N/A#define LUN_COMP_SEP ","
2N/A#define MINOR_SEP ":"
2N/A
2N/A#define S_FREE(x) (((x) != NULL) ? (free(x), (x) = NULL) : (void *)0)
2N/A#define S_STR(x) (((x) == NULL) ? "" : (x))
2N/A
2N/A
2N/A#define IS_STUB_NODE(s) (di_instance(s) == -1 && \
2N/A di_nodeid(s) == (DI_PROM_NODEID))
2N/A
2N/A#define GET_MSG_STR(i) (str_tbl[msg_idx(i)].msgstr)
2N/A
2N/A#define GET_DYN(a) (((a) != NULL) ? strstr((a), DYN_SEP) : (void *)0)
2N/A#define GET_LUN_DYN(a) (((a) != NULL) ? strstr((a), LUN_COMP_SEP) : (void *)0)
2N/A
2N/A/*
2N/A * The following macro removes the separator from the dynamic component.
2N/A */
2N/A#define DYN_TO_DYNCOMP(a) ((a) + strlen(DYN_SEP))
2N/A#define LUN_DYN_TO_LUNCOMP(a) ((a) + strlen(LUN_COMP_SEP))
2N/A
2N/A/*
2N/A * Property names
2N/A */
2N/A#define PORT_WWN_PROP "port-wwn"
2N/A#define LUN_GUID_PROP "client-guid"
2N/A#define LUN_PROP "lun"
2N/A
2N/A#define WWN_S_LEN 17 /* NULL terminated string */
2N/A#define WWN_SIZE 8
2N/A/* Constants used for repository updates */
2N/A#define ADD_ENTRY 0
2N/A#define REMOVE_ENTRY 1
2N/A
2N/A#define FAB_REPOSITORY_DIR "/etc/cfg/fp"
2N/A#define FAB_REPOSITORY "/etc/cfg/fp/fabric_WWN_map"
2N/A#define TMP_FAB_REPOSITORY "/etc/cfg/fp/fabric_WWN_map.tmp"
2N/A#define OLD_FAB_REPOSITORY "/etc/cfg/fp/fabric_WWN_map.old"
2N/A
2N/A/* MPXIO VHCI root dir */
2N/A#define SCSI_VHCI_ROOT "/devices/scsi_vhci/"
2N/A#define SCSI_VHCI_DRVR "scsi_vhci"
2N/A#define HBA_MAX_RETRIES 10
2N/A
2N/A/* Function prototypes */
2N/A
2N/Afpcfga_ret_t get_report_lun_data(const char *xport_phys,
2N/A const char *dyncomp, int *num_luns, report_lun_resp_t **resp_buf,
2N/A struct scsi_extended_sense *sense, int *l_errnop);
2N/A/* Functions in cfga_cs.c */
2N/Afpcfga_ret_t
2N/Adev_change_state(cfga_cmd_t, apid_t *, la_wwn_t *, cfga_flags_t, char **,
2N/A HBA_HANDLE handle, HBA_PORTATTRIBUTES portAttrs);
2N/Afpcfga_ret_t
2N/Afca_change_state(cfga_cmd_t, apid_t *, cfga_flags_t, char **);
2N/A
2N/A/* Functions in cfga_rep.c */
2N/Aint update_fabric_wwn_list(int, const char *, char **);
2N/A
2N/Afpcfga_ret_t dev_insert(fpcfga_cmd_t cmd, apid_t *apidp, prompt_t *argsp,
2N/A char **errstring);
2N/Afpcfga_ret_t dev_replace(fpcfga_cmd_t cmd, apid_t *apidp, prompt_t *argsp,
2N/A char **errstring);
2N/Afpcfga_ret_t dev_remove(fpcfga_cmd_t cmd, apid_t *apidp, prompt_t *argsp,
2N/A char **errstring);
2N/Afpcfga_ret_t reset_common(fpcfga_cmd_t cmd, apid_t *apidp, prompt_t *argsp,
2N/A char **errstring);
2N/A
2N/A
2N/A/* List related routines */
2N/Afpcfga_ret_t do_list(apid_t *apidp, fpcfga_cmd_t cmd,
2N/A ldata_list_t **ldatalistp, int *nelem, char **errstring);
2N/Afpcfga_ret_t do_list_FCP_dev(const char *ap_id, uint_t flags, fpcfga_cmd_t cmd,
2N/A ldata_list_t **llpp, int *nelemp, char **errstring);
2N/Afpcfga_ret_t list_ext_postprocess(ldata_list_t **ldatalistp, int nelem,
2N/A cfga_list_data_t **ap_id_list, int *nlistp, char **errstring);
2N/Aint stat_path_info_node(di_node_t root, void *arg, int *l_errnop);
2N/A
2N/A/* Conversion routines */
2N/Afpcfga_ret_t make_xport_logid(const char *xport_phys, char **xport_logpp,
2N/A int *l_errnop);
2N/Afpcfga_ret_t dyn_apid_to_path(const char *xport_phys, const char *dyncomp,
2N/A struct luninfo_list **lunlistpp, int *l_errnop);
2N/Avoid cvt_lawwn_to_dyncomp(const la_wwn_t *pwwn, char **dyncomp, int *l_errnop);
2N/Aint cvt_dyncomp_to_lawwn(const char *dyncomp, la_wwn_t *port_wwn);
2N/Afpcfga_ret_t make_dyncomp_from_dinode(const di_node_t node, char **dyncompp,
2N/A int *l_errnop);
2N/Afpcfga_ret_t make_portwwn_luncomp_from_dinode(const di_node_t node,
2N/A char **dyncompp, int **luncompp, int *l_errnop);
2N/Afpcfga_ret_t make_portwwn_luncomp_from_pinode(const di_path_t pinode,
2N/A char **dyncompp, int **luncompp, int *l_errnop);
2N/Afpcfga_ret_t construct_nodepath_from_dinode(const di_node_t node,
2N/A char **node_pathp, int *l_errnop);
2N/Au_longlong_t wwnConversion(uchar_t *wwn);
2N/A
2N/A
2N/A/* Functions in cfga_rcm.c */
2N/Afpcfga_ret_t fp_rcm_offline(char *, char **, cfga_flags_t);
2N/Afpcfga_ret_t fp_rcm_online(char *, char **, cfga_flags_t);
2N/Afpcfga_ret_t fp_rcm_remove(char *, char **, cfga_flags_t);
2N/Afpcfga_ret_t fp_rcm_suspend(char *, char *, char **, cfga_flags_t);
2N/Afpcfga_ret_t fp_rcm_resume(char *, char *, char **, cfga_flags_t);
2N/Afpcfga_ret_t fp_rcm_info(char *, char **, char **);
2N/A
2N/A/* Utility routines */
2N/Afpcfga_ret_t physpath_to_devlink(const char *basedir, char *xport_phys,
2N/A char **xport_logpp, int *l_errnop, int match_minor);
2N/Afpcfga_ret_t recurse_dev(const char *basedir, void *arg,
2N/A fpcfga_recur_t (*fcn)(const char *lpath, void *arg));
2N/Afpcfga_ret_t apidt_create(const char *ap_id, apid_t *apidp,
2N/A char **errstring);
2N/Avoid apidt_free(apid_t *apidp);
2N/Acfga_err_t err_cvt(fpcfga_ret_t err);
2N/Avoid list_free(ldata_list_t **llpp);
2N/Aint known_state(di_node_t node);
2N/A
2N/Afpcfga_ret_t devctl_cmd(const char *ap_id, fpcfga_cmd_t cmd,
2N/A uint_t *statep, int *l_errnop);
2N/Afpcfga_ret_t invoke_cmd(const char *func, apid_t *apidt, prompt_t *prp,
2N/A char **errstring);
2N/A
2N/Avoid cfga_err(char **errstring, int use_errno, ...);
2N/Avoid cfga_msg(struct cfga_msg *msgp, ...);
2N/Achar *cfga_str(int append_newline, ...);
2N/Aint msg_idx(msgid_t msgid);
2N/Afpcfga_ret_t walk_tree(const char *physpath, void *arg, uint_t init_flags,
2N/A walkarg_t *up, fpcfga_cmd_t cmd, int *l_errnop);
2N/Aint hba_dev_cmp(const char *hba, const char *dev);
2N/Aint dev_cmp(const char *dev1, const char *dev2, int match_minor);
2N/Achar *pathdup(const char *path, int *l_errnop);
2N/Aint getPortAttrsByWWN(HBA_HANDLE handle, HBA_WWN wwn,
2N/A HBA_PORTATTRIBUTES *attrs);
2N/Aint getDiscPortAttrs(HBA_HANDLE handle, int portIndex,
2N/A int discIndex, HBA_PORTATTRIBUTES *attrs);
2N/Aint getAdapterPortAttrs(HBA_HANDLE handle, int portIndex,
2N/A HBA_PORTATTRIBUTES *attrs);
2N/Aint getAdapterAttrs(HBA_HANDLE handle, HBA_ADAPTERATTRIBUTES *attrs);
2N/Afpcfga_ret_t findMatchingAdapterPort(char *portPath,
2N/A HBA_HANDLE *matchingHandle, int *matchingPortIndex,
2N/A HBA_PORTATTRIBUTES *matchingPortAttrs, char **errstring);
2N/A
2N/Aextern msgcvt_t str_tbl[];
2N/A
2N/A#ifdef __cplusplus
2N/A}
2N/A#endif
2N/A
2N/A#endif /* _CFGA_FP_H */