9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * CDDL HEADER START
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * The contents of this file are subject to the terms of the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Common Development and Distribution License (the "License").
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * You may not use this file except in compliance with the License.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * or http://www.opensolaris.org/os/licensing.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * See the License for the specific language governing permissions
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * and limitations under the License.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * When distributing Covered Code, include this CDDL HEADER in each
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * If applicable, add the following below this CDDL HEADER, with the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * fields enclosed by brackets "[]" replaced with your own identifying
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * information: Portions Copyright [yyyy] [name of copyright owner]
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * CDDL HEADER END
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#include <unistd.h>
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#include <stdlib.h>
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#include <ctype.h>
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#include <errno.h>
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#include <printAttrs.h>
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#include <smhbaapi.h>
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#define TABLEN 2
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimtypedef struct inputArgs {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int wwnCount;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim char **wwn_argv;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim uint64_t portWWN;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim char *hbaName;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int pflag;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int *wwn_flag;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim} inputArg_t;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimtypedef struct tgt_mapping {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_SCSIENTRY tgtentry;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim uchar_t inq_vid[8];
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim uchar_t inq_pid[16];
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim uchar_t inq_dtype;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim struct tgt_mapping *next;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}tgt_mapping;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Remote port tree node structure.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimtypedef struct smhba_rp_tree {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_PORTATTRIBUTES portattr;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_SAS_PORT sasattr;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim tgt_mapping *first_entry;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int printed;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim struct smhba_rp_tree *parent;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim struct smhba_rp_tree *child;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim struct smhba_rp_tree *sibling;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}rp_tree_t;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Report LUN data structure.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstruct lun {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim uchar_t val[8];
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim};
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimtypedef struct rep_luns_rsp {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim uint32_t length;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim uint32_t rsrvd;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim struct lun lun[1];
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim} rep_luns_rsp_t;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * The following flag is used for printing HBA header on-demand.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int g_printHBA = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * The following structure is for sorted output of HBA and HBA Port.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimtypedef struct _sas_elem {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim char name[256];
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int index;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}sas_elem_t;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * The following two functions are for generating hierachy of expander
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * subcommand.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimsas_rp_tree_insert(rp_tree_t **rproot, rp_tree_t *rpnode);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimsas_rp_tree_print(HBA_HANDLE handle, char *adapterName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 portIndex, SMHBA_PORTATTRIBUTES *port,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim rp_tree_t *rpnode, inputArg_t *input, int gident,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int *printPort);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimsas_rp_tree_print_desc(HBA_HANDLE handle, HBA_UINT32 portIndex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_PORTATTRIBUTES *port, rp_tree_t *desc,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim inputArg_t *input, int lident, int gident);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimsas_print_rpnode(inputArg_t *input,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim rp_tree_t *rpnode, int lident, int gident);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic void sas_rp_tree_free(rp_tree_t *rproot);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimtypedef int (*processPortFunc)(HBA_HANDLE handle, char *adapterName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 portIndex, SMHBA_PORTATTRIBUTES *port,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_ADAPTERATTRIBUTES *attrs, inputArg_t *input);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int processHBA(inputArg_t *input,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim processPortFunc processPort);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int isPortWWNInArgv(inputArg_t *input, PHBA_WWN pWWN);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int isStringInArgv(inputArg_t *input, const char *adapterName);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic boolean_t compareLUName(char *cmdArg, char *osName);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic discoveredDevice *LUList = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic targetPortList_t *gTargetPortList = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* processes for hanlding local HBA info */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int handleHBA(SMHBA_ADAPTERATTRIBUTES *attrs, inputArg_t *input,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int numberOfPorts, const char *adapterName);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int handleHBAPort(HBA_HANDLE handle, char *adapterName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 portIndex, SMHBA_PORTATTRIBUTES *port,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_ADAPTERATTRIBUTES *attrs, inputArg_t *input);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int processHBAPortPhyInfo(HBA_HANDLE handle, HBA_UINT32 portIndex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_PORTATTRIBUTES *port, int pflag);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int processHBAPortPhyStat(HBA_HANDLE handle, HBA_UINT32 portIndex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int phyIndex, PSMHBA_SAS_PHY phyattrs, int pflag);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* process for handling expander info */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int handleExpander(HBA_HANDLE handle, char *adapterName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 portIndex, SMHBA_PORTATTRIBUTES *port,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_ADAPTERATTRIBUTES *attrs, inputArg_t *input);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* process for handling target port info */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int handleTargetPort(HBA_HANDLE handle, char *adapterName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 portIndex, SMHBA_PORTATTRIBUTES *port,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_ADAPTERATTRIBUTES *attrs, inputArg_t *input);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* process for handling logical unit info */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int handleLogicalUnit(HBA_HANDLE handle, char *adapterName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 portIndex, SMHBA_PORTATTRIBUTES *port,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_ADAPTERATTRIBUTES *attrs, inputArg_t *input);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* process for target port SCSI processing */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimsearchTargetPortMappingData(HBA_HANDLE handle, HBA_UINT32 portIndex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_PORTATTRIBUTES *port, SMHBA_SAS_PORT *sasattr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim struct targetPortConfig *configData);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* process for target port config processing */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int searchTargetPort(HBA_HANDLE handle, HBA_UINT32 portIndex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_PORTATTRIBUTES *port, SMHBA_PORTATTRIBUTES *targetattr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_SAS_PORT *sasattr, int pflag);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* process for logical-unit config processing */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimsearchDevice(PSMHBA_SCSIENTRY entryP, HBA_HANDLE handle, HBA_WWN hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN domainPortWWN, char *portName, int pflag);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/* get domain port out of hba-port phy attr. */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS get_domainPort(HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int portindex, PSMHBA_PORTATTRIBUTES port,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN *pdomainPort);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimsas_name_comp(const char *name1, const char *name2);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic void
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimsas_elem_sort(sas_elem_t *array, int nelem);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * function for hba subcommand
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Arguments:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * wwnCount - count of the number of WWNs in wwn_argv
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * if wwnCount > 0, then we will only print information for
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * the hba ports listed in wwn_argv
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * if wwnCount == 0, then we will print information on all hba ports
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * wwn_argv - argument array of hba port WWNs
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * options - any options specified by the caller
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * returns:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 0 if successful
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * >0 otherwise
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimint
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimsas_util_list_hba(int hbaCount, char **hba_argv, cmdOptions_t *options)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int processHBA_flags = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim inputArg_t input;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int err_cnt = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* process each of the options */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (; options->optval; options++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim switch (options->optval) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim case 'v':
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim processHBA_flags |= PRINT_VERBOSE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim default:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((status = HBA_LoadLibrary()) != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Failed to load SM-HBA libraries."
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Reason:"), getHBAStatus(status));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim err_cnt++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (err_cnt);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memset(&input, 0, sizeof (input));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* utilize wwnCount and wwn_argv for hbaCount and hba_argv */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input.wwnCount = hbaCount;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input.wwn_argv = hba_argv;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input.pflag = processHBA_flags;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Process and filter for every local hba,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * when the hba is not specificed, print all hba(s).
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim err_cnt += processHBA(&input, NULL);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) HBA_FreeLibrary();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (err_cnt);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * function for hba-port subcommand
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Arguments:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * wwnCount - count of the number of WWNs in wwn_argv
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * if wwnCount > 0, then we will only print information for
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * the hba ports listed in wwn_argv
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * if wwnCount == 0, then we will print information on all hba ports
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * wwn_argv - argument array of hba port WWNs
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * options - any options specified by the caller
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * returns:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 0 if successful
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * >0 otherwise
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimint
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimsas_util_list_hbaport(int wwnCount, char **wwn_argv, cmdOptions_t *options)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int processHBA_flags = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim inputArg_t input;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int err_cnt = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim char hbaName[256] = {'\0'};
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* process each of the options */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (; options->optval; options++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim switch (options->optval) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim case 'a':
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) strlcpy(hbaName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim options->optarg, sizeof (hbaName));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim case 'y':
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim processHBA_flags |= PRINT_PHY;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim case 'l':
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim processHBA_flags |= PRINT_PHY_LINKSTAT;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim case 'v':
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim processHBA_flags |= PRINT_VERBOSE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim default:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((status = HBA_LoadLibrary()) != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Failed to load SM-HBA libraries."
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Reason:"), getHBAStatus(status));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim err_cnt++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (err_cnt);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memset(&input, 0, sizeof (input));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input.wwnCount = wwnCount;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input.wwn_argv = wwn_argv;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input.hbaName = hbaName;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input.pflag = processHBA_flags;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Process and filter for every local hba-port,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * when the hba-port is not specificed, print all hba-port(s).
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim err_cnt += processHBA(&input, handleHBAPort);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) HBA_FreeLibrary();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (err_cnt);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * function for expander subcommand
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Arguments:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * wwnCount - the number of Remote Port SAS Address in wwn_argv
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * if wwnCount == 0, then print information on all
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * expander devices.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * if wwnCount > 0, then print information for the exapnders
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * given in wwn_argv.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * wwn_argv - array of WWNs
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * options - options specified by the caller
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * returns:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 0 if successful
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * >0 otherwise
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimint
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimsas_util_list_expander(int wwnCount, char **wwn_argv, cmdOptions_t *options)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int processHBA_flags = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim char hbaPort[MAXPATHLEN + 1] = {0};
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim inputArg_t input;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int err_cnt = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* process each of the options */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (; options->optval; options++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim switch (options->optval) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim case 'p':
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) strlcpy(hbaPort, options->optarg,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (hbaPort));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim case 't':
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim processHBA_flags |= PRINT_TARGET_PORT;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim case 'v':
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim processHBA_flags |= PRINT_VERBOSE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim default:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((status = HBA_LoadLibrary()) != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Failed to load SM-HBA libraries."
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Reason:"), getHBAStatus(status));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim err_cnt++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (err_cnt);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memset(&input, 0, sizeof (input));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input.wwnCount = wwnCount;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input.wwn_argv = wwn_argv;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input.pflag = processHBA_flags;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input.hbaName = hbaPort;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Process and filter for every hba-port,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * when the hba-port is not specificed, print all hba-port(s).
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim err_cnt += processHBA(&input, handleExpander);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) HBA_FreeLibrary();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (err_cnt);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * function for target-port subcommand
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Arguments:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * wwnCount - the number of Remote Port SAS Address in wwn_argv
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * if wwnCount == 0, then print information on all
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * target ports.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * if wwnCount > 0, then print information for the target ports
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * given in wwn_argv.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * wwn_argv - array of WWNs
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * options - options specified by the caller
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * returns:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 0 if successful
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * >0 otherwise
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimint
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimsas_util_list_targetport(int tpCount, char **tpArgv, cmdOptions_t *options)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int processHBA_flags = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int tp, tpFound;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim inputArg_t input;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim targetPortList_t *tpListWalk;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int err_cnt = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim uint64_t tmpAddr;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* process each of the options */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (; options->optval; options++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim switch (options->optval) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim case 's':
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim processHBA_flags |= PRINT_TARGET_SCSI;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim case 'v':
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim processHBA_flags |= PRINT_VERBOSE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim default:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((status = HBA_LoadLibrary()) != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Failed to load SM-HBA libraries."
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Reason:"), getHBAStatus(status));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim err_cnt++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (err_cnt);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memset(&input, 0, sizeof (input));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input.wwnCount = tpCount;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input.wwn_argv = tpArgv;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input.pflag = processHBA_flags;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Process and filter for every hba-port,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * when the hba-port is not specificed, print all hba-port(s).
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim err_cnt += processHBA(&input, handleTargetPort);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (tpCount == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* list all target port */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (tpListWalk = gTargetPortList; tpListWalk != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim tpListWalk = tpListWalk->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim err_cnt += printTargetPortInfo(tpListWalk, input.pflag);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * When operands provided, we should set the error code
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * only if there are issues related with the operands.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim err_cnt = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * list any paths not found first
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * this gives the user cleaner output
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (tp = 0; tp < tpCount; tp++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim errno = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim tmpAddr = strtoull(tpArgv[tp], NULL, 16);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((tmpAddr == 0) && (errno != 0)) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim err_cnt++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (tpListWalk = gTargetPortList, tpFound = B_FALSE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim tpListWalk != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim tpListWalk = tpListWalk->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (wwnConversion(tpListWalk->sasattr.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim LocalSASAddress.wwn) == tmpAddr) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim tpFound = B_TRUE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (tpFound == B_FALSE) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Error: Target Port %s Not Found \n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim tpArgv[tp]);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim err_cnt++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* list all paths requested in order requested */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (tp = 0; tp < tpCount; tp++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim errno = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim tmpAddr = strtoull(tpArgv[tp], NULL, 16);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((tmpAddr == 0) && (errno != 0)) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (tpListWalk = gTargetPortList, tpFound = B_FALSE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim tpListWalk != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim tpListWalk = tpListWalk->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (wwnConversion(tpListWalk->sasattr.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim LocalSASAddress.wwn) == tmpAddr) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim err_cnt += printTargetPortInfo(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim tpListWalk,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim processHBA_flags);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) HBA_FreeLibrary();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (err_cnt);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * This function will enumerate all the hba and hba ports,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * call the callback function to proceed with futher process.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Arguments:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * input - contains all the input parameters.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * processPort - a callback function when handling each port.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Return Value:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 0 sucessfully processed handle
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * >0 error has occured
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimprocessHBA(inputArg_t *input, processPortFunc processPort)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int numAdapters = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int matchedHBAs = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int matchedHBAPorts = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int hbaPortExist = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 numberOfPorts = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int portIndex = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_PORTTYPE porttype;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_LIBRARYATTRIBUTES libattrs;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_ADAPTERATTRIBUTES attrs;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_PORTATTRIBUTES port;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_SAS_PORT sasattrs;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int i, sum, ret = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int remote_avail = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int local_avail = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sas_elem_t *adpt_array = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sas_elem_t *port_array = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim numAdapters = HBA_GetNumberOfAdapters();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (numAdapters == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Error: No Adapters Found."));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (++ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * To deal with mismatching HBA/HBA Port/Expander Port, we need an
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * array of flags for each operands.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (input->wwnCount && (processPort != handleTargetPort) &&
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (processPort != handleLogicalUnit)) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input->wwn_flag = calloc(input->wwnCount, sizeof (int));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (input->wwn_flag == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("No enough memory on heap"));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (++ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adpt_array = calloc(numAdapters, sizeof (sas_elem_t));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (adpt_array == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("No enough memory on heap"));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (input->wwn_flag) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(input->wwn_flag);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input->wwn_flag = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (++ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (i = 0; i < numAdapters; i++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_GetVendorLibraryAttributes(i, &libattrs);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * If we get SAS incompatible library warning here,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * just skip the following steps.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != 1) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = HBA_GetAdapterName(i, adpt_array[i].name);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s %d %s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Error: Failed to get the name for"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim " HBA index"),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim i, gettext("Reason:"),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getHBAStatus(status));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adpt_array[i].index = i;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Sort the HBA Name in place. */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sas_elem_sort(adpt_array, numAdapters);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (i = 0; i < numAdapters; i++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int times = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (adpt_array[i].name[0] != '\0') {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((handle = HBA_OpenAdapter(adpt_array[i].name))
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s %s.\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Error: Failed to open adapter"),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adpt_array[i].name);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * We need to support an adapter without hba port.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * So get attributes anyway.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memset(&attrs, 0, sizeof (attrs));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = SMHBA_GetAdapterAttributes(handle, &attrs);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim while ((status == HBA_STATUS_ERROR_TRY_AGAIN ||
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status == HBA_STATUS_ERROR_BUSY) &&
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim times++ < HBA_MAX_RETRIES) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) sleep(1);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = SMHBA_GetAdapterAttributes(handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &attrs);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s %s %s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Error: Failed to get attributes"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim " for HBA "), adpt_array[i].name,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Reason:"),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getHBAStatus(status));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_CloseAdapter(handle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = SMHBA_GetNumberOfPorts(handle, &numberOfPorts);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s %s %s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Error: Failed to get number of ports "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "for HBA"), adpt_array[i].name,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Reason:"),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getHBAStatus(status));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_CloseAdapter(handle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Deal with each subcommand for hba filter here,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * processPort is NULL for hba subcommand.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (processPort == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim matchedHBAs += handleHBA(&attrs, input,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim numberOfPorts, adpt_array[i].name);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_CloseAdapter(handle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else if (processPort == handleHBAPort) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (input->hbaName[0] != '\0') {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strcmp(input->hbaName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adpt_array[i].name) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim matchedHBAs++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim matchedHBAs++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim matchedHBAs++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * In order to have a sorted output for HBA Port, we should
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * do the sorting before moving on.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (numberOfPorts) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim port_array = calloc(numberOfPorts, sizeof (sas_elem_t));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (portIndex = 0; portIndex < numberOfPorts; portIndex++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((status = SMHBA_GetPortType(handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portIndex, &porttype)) != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s %s %s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Failed to get adapter port type "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "for HBA"), adpt_array[i].name,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Reason:"),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getHBAStatus(status));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (porttype != HBA_PORTTYPE_SASDEVICE) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* skip any non-sas hba port */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memset(&port, 0, sizeof (port));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memset(&sasattrs, 0, sizeof (sasattrs));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim port.PortSpecificAttribute.SASPort = &sasattrs;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((status = SMHBA_GetAdapterPortAttributes(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim handle, portIndex, &port)) != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Not able to get port attributes.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * print out error message and
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * move on to the next port
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s %s %s %d %s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Error: Failed to get port "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "attributes for HBA"), adpt_array[i].name,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("port index"), portIndex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Reason:"),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getHBAStatus(status));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) strlcpy(port_array[portIndex].name,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim port.OSDeviceName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (port_array[portIndex].name));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim port_array[portIndex].index = portIndex;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Sort the HBA Port Name here. */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (port_array) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sas_elem_sort(port_array, numberOfPorts);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Sum up the local hba ports available.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim local_avail += numberOfPorts;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Clear g_printHBA flag for expander subcommand.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim g_printHBA = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* process each port on the given adapter */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (portIndex = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portIndex < numberOfPorts;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portIndex++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * We only handle the port which is valid.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (port_array[portIndex].name[0] == '\0') {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memset(&port, 0, sizeof (port));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memset(&sasattrs, 0, sizeof (sasattrs));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim port.PortSpecificAttribute.SASPort = &sasattrs;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) SMHBA_GetAdapterPortAttributes(handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim port_array[portIndex].index, &port);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * We have different things to do for the three
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * sub-commands here.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (processPort == handleHBAPort) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * For hba-port, we will check whether the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * specified hba port exist first.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * But if no hba port specified, we should
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * by pass this check(just let hbaPortExist
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * be 1).
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (input->wwnCount > 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (isStringInArgv(input,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim port.OSDeviceName)) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hbaPortExist = 1;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (g_printHBA == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "%s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "HBA Name:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adpt_array[i].name);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim g_printHBA = 1;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hbaPortExist = 1;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (g_printHBA == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "%s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "HBA Name:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adpt_array[i].name);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim g_printHBA = 1;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (processPort == handleExpander) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * For expander device, input->hbaName is
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * the hba port name specified on the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * command line(with -p option).
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (input->hbaName[0] != '\0') {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strcmp(input->hbaName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim port.OSDeviceName) == 0)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hbaPortExist = 1;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hbaPortExist = 1;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (processPort == handleTargetPort) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * For target port, we don't need to check the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * hba port address, so let it go here.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hbaPortExist = 1;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (processPort == handleLogicalUnit) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * For lu, we don't need to check the hba
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * port address, so let it go here.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hbaPortExist = 1;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (hbaPortExist) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (port.PortSpecificAttribute.SASPort->
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim NumberofDiscoveredPorts) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim remote_avail++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret += (*processPort)(handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adpt_array[i].name,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim port_array[portIndex].index, &port,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &attrs, input);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * We should reset the hbaPortExist flag
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * here for next round of check and count
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * for the machedHBAPorts.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hbaPortExist = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim matchedHBAPorts++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (port_array) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(port_array);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim port_array = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_CloseAdapter(handle);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (adpt_array) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(adpt_array);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim adpt_array = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * When we are here, we have traversed all the hba and hba ports.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (matchedHBAs == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Error: Matching HBA not found."));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (input->wwn_flag) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(input->wwn_flag);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input->wwn_flag = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (++ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else if (processPort == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * processPort == NULL signifies hba subcommand.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * If enter here, it means we have at least one matching
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * hba, we need to check if there are mismatching ones.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (i = 0; i < input->wwnCount; i++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (input->wwn_flag[i] == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s %s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Error: HBA"),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input->wwn_argv[i],
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("not found."));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (local_avail > 0 && matchedHBAPorts == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Error: Matching HBA Port "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "not found."));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (input->wwn_flag) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(input->wwn_flag);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input->wwn_flag = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (++ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else if (local_avail == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Error: No HBA Port Configured."));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (input->wwn_flag) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(input->wwn_flag);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input->wwn_flag = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (++ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else if (processPort == handleHBAPort) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * If enter here, we have at least one HBA port
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * matched. For hba-port subcommand, we shall check
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * whether there are operands mismatching.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (i = 0; i < input->wwnCount; i++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (input->wwn_flag[i] == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s %s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Error: HBA Port"),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input->wwn_argv[i],
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("not found."));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * For expander subcommand, we need to check if the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * specified sas address(ese) exist (none/partial/all).
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (processPort == handleExpander) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (input->wwnCount > 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sum = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (i = 0; i < input->wwnCount; i++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sum += input->wwn_flag[i];
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * If sum is zero, it means that for all the given
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * operands matching count is zero. So none of the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * specified SAS address exist actually.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (sum == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, gettext("Error: "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Matching SAS Address not found.\n"));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(input->wwn_flag);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input->wwn_flag = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (++ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * If we get here, it means that some of the specified
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * sas address exist, we will know through looping the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * wwn_flag array.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (i = 0; i < input->wwnCount; i++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (input->wwn_flag[i] == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s %s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Error: SAS Address"),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input->wwn_argv[i],
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("not found."));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* even if no remote port is found it is not an error. */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (input->wwn_flag) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(input->wwn_flag);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input->wwn_flag = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * This function will handle the phy stuff for hba-port subcommand.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Arguments:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * handle - handle to hba port.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * portIndex - the index of hba port currently being processed.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * port - pointer to hba port attributes.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * pflag - options user specified.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Return Value:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 0 sucessfully processed handle
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * >0 error has occured
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimprocessHBAPortPhyInfo(HBA_HANDLE handle, HBA_UINT32 portIndex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_PORTATTRIBUTES *port, int pflag)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int phyIndex = 0, err_cnt = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 numphys = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_SAS_PHY phyattrs;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (port == NULL)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (++err_cnt);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim numphys = port->PortSpecificAttribute.SASPort->NumberofPhys;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (numphys == 0)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((pflag & PRINT_PHY) || (pflag & PRINT_PHY_LINKSTAT))
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s\n", " Phy Information:");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim else
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (phyIndex = 0; phyIndex < numphys; phyIndex++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memset(&phyattrs, 0, sizeof (phyattrs));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = SMHBA_GetSASPhyAttributes(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim handle, portIndex, phyIndex, &phyattrs);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s %d %s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Failed to get SAS Phy attributes"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "phyIndex"), phyIndex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Reason:"),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getHBAStatus(status));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim err_cnt++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (pflag & PRINT_PHY)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim printHBAPortPhyInfo(&phyattrs);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (pflag & PRINT_PHY_LINKSTAT)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim err_cnt += processHBAPortPhyStat(handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portIndex, phyIndex, &phyattrs, pflag);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (err_cnt);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * This function will handle the phy stuff for hba-port subcommand.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Arguments:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * handle - handle to hba port.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * portIndex - the index of hba port currently being processed.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * port - pointer to hba port attributes.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * pflag - options user specified.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Return Value:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 0 sucessfully processed handle
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * >0 error has occured
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimprocessHBAPortPhyStat(HBA_HANDLE handle, HBA_UINT32 portIndex, int phyIndex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim PSMHBA_SAS_PHY phyattrs, int pflag)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_PHYSTATISTICS phystat;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_SASPHYSTATISTICS sasphystat;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((pflag & PRINT_PHY) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s %d\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim " Identifier:", phyattrs->PhyIdentifier);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memset(&phystat, 0, sizeof (phystat));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memset(&sasphystat, 0, sizeof (sasphystat));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim phystat.SASPhyStatistics = &sasphystat;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = SMHBA_GetPhyStatistics(handle, portIndex, phyIndex, &phystat);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim " Link Error Statistics:");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext(" Failed to retrieve Link "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Error Statistics!"));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (1);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim printHBAPortPhyStatistics(phystat.SASPhyStatistics);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Check whether the pWWN exist in the WWNs list which specified by user.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Arguments:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * input - contains all the input parameters.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * pWWN - pointer to the hba port sas address.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Return Value:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 1 true, the pWWN exist in the sas address list specified.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 0 false.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimisPortWWNInArgv(inputArg_t *input, PHBA_WWN pWWN)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int port_wwn_counter = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int portfound = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim uint64_t hbaWWN;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* list only ports given in wwn_argv */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (port_wwn_counter = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim port_wwn_counter < input->wwnCount;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim port_wwn_counter++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hbaWWN = strtoull(input->wwn_argv[port_wwn_counter], NULL,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim 16);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (hbaWWN == 0 && errno != 0)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (wwnConversion(pWWN->wwn) == hbaWWN) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (input->wwn_flag) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input->wwn_flag[port_wwn_counter]++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portfound = 1;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (portfound);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Check whether the string value exists in the input list,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * which specified by user.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Arguments:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * input - contains all the input parameters.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * stringName - could be hba adapter name
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * hba-port name.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Return Value:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 1 true, the HBA exists in the list specified.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 0 false.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimisStringInArgv(inputArg_t *input, const char *stringName)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int counter = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int found = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* list only hba(s) given in wwn_argv */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (counter = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim counter < input->wwnCount;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim counter++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strcmp(input->wwn_argv[counter],
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim stringName) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (input->wwn_flag)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input->wwn_flag[counter]++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim found = 1;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (found);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Callback function for hba subcommand.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Arguments:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * attrs - pointer to adapter attributes currently being processed.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * input - contains all the input parameters.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * numberOfPorts - number of ports of this HBA.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Return Value:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * matching number
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int handleHBA(SMHBA_ADAPTERATTRIBUTES *attrs, inputArg_t *input,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int numberOfPorts, const char *adapterName)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int matchingHBA = 1;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (input->wwnCount == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim printHBAInfo(attrs, input->pflag, numberOfPorts, adapterName);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (isStringInArgv(input, adapterName)) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim printHBAInfo(attrs,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input->pflag, numberOfPorts, adapterName);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim matchingHBA = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (matchingHBA);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Callback function for hba-port subcommand.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Arguments:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * handle - handle to hba port.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * portIndex - the index of hba port currently being processed.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * port - pointer to hba port attributes.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * attrs - pointer to adapter attributes currently being processed.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * input - contains all the input parameters.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Return Value:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 0 sucessfully processed handle
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * >0 error has occured
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*ARGSUSED*/
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int handleHBAPort(HBA_HANDLE handle, char *adapterName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 portIndex, SMHBA_PORTATTRIBUTES *port,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_ADAPTERATTRIBUTES *attrs, inputArg_t *input)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int ret = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim printHBAPortInfo(port, attrs, input->pflag);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret = processHBAPortPhyInfo(handle, portIndex, port, input->pflag);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Callback function for expander subcommand.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Arguments:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * handle - handle to hba port.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * portIndex - the index of hba port currently being processed.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * port - pointer to hba port attributes.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * attrs - pointer to adapter attributes currently being processed.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * input - contains all the input parameters.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Return Value:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 0 sucessfully processed handle
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * >0 error has occured
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*ARGSUSED*/
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int handleExpander(HBA_HANDLE handle, char *adapterName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 portIndex, SMHBA_PORTATTRIBUTES *port,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_ADAPTERATTRIBUTES *attrs, inputArg_t *input)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_PORTATTRIBUTES attr;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_SAS_PORT sasport;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int ret = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int i, numberOfRP;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim rp_tree_t *rpnode;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim rp_tree_t *rproot = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim rp_tree_t *unsolved_head = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim rp_tree_t *unsolved_tail = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim rp_tree_t *unsolved_sentinel = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int printPort = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int numberOfEXP = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int unsolved_inserted = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int unsolved_left = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int disco_port_fail = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim boolean_t firstPrinted = B_FALSE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memset(&attr, 0, sizeof (attr));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memset(&sasport, 0, sizeof (sasport));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim attr.PortSpecificAttribute.SASPort = &sasport;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Retrive all expander device from this hba port first.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((numberOfRP = port->PortSpecificAttribute.SASPort->
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim NumberofDiscoveredPorts) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* no remote port. just return 0. */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (i = 0; i < numberOfRP; i++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim rpnode = calloc(1, sizeof (rp_tree_t));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim rpnode->portattr.PortSpecificAttribute.SASPort =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &rpnode->sasattr;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = SMHBA_GetDiscoveredPortAttributes(handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portIndex, i, &rpnode->portattr);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim disco_port_fail++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(rpnode);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (rpnode->portattr.PortType == HBA_PORTTYPE_SASEXPANDER) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim numberOfEXP++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * We will try to insert this expander device and target
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * ports into the topology tree. If we failed, we can chain
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * them together and try again when we have all the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * discovered port information in hands.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (rproot == NULL && memcmp(port->
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim PortSpecificAttribute.SASPort->LocalSASAddress.wwn,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim rpnode->sasattr.AttachedSASAddress.wwn,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (HBA_WWN)) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * The root node of tree should
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * be set up first.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim rproot = rpnode;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * If we can not set up the root node of
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * the tree or we failed to insert
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * the disocvered port node, queue it up then.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (rproot == NULL ||
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sas_rp_tree_insert(&rproot, rpnode) != 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (unsolved_head == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unsolved_head = rpnode;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unsolved_tail = rpnode;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim rpnode->sibling = unsolved_head;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unsolved_head = rpnode;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (disco_port_fail) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s %d %s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Error: Failed to get attributes for"),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim disco_port_fail,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("connected ports of HBA port"),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim port->OSDeviceName);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* no expander found. No need further processing. */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (numberOfEXP == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim while (unsolved_head) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unsolved_tail =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unsolved_head->sibling;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(unsolved_head);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unsolved_head = unsolved_tail;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (rproot) sas_rp_tree_free(rproot);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * When we're here, we should already have all information,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * now we try again to insert them into the topology tree.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * unsolved_head is the pointer which point to the head of
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * unsolved rpnode linked list.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * unsolved_tail is the pointer which point to the tail of
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * unsolved rpnode linked list.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * unsolved_sentinel is for insertion failure detection.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * When we're trying to insert the rpnodes from unsolved
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * linked list, it may happen that some of the rpnodes can
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * not be inserted no matter how many times we loop through
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * this linked list. So we use unsolved_sentinel to identify
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * the tail of last round of scanning, and unsolved_inserted
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * which is a counter will be used to count how many rpnodes
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * have been inserted from last round, if it is zero, which
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * means that we can not insert rpnodes into rptree any more,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * and we should stop and deallocate the memory they occupied.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unsolved_sentinel = unsolved_tail;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim while (unsolved_head) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim rpnode = unsolved_head;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unsolved_head = unsolved_head->sibling;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (unsolved_head == NULL)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unsolved_tail = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim rpnode->sibling = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (sas_rp_tree_insert(&rproot, rpnode) != 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unsolved_tail->sibling = rpnode;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unsolved_tail = rpnode;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (rpnode == unsolved_sentinel) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * We just scanned one round for the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * unsolved list. Check to see whether we
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * have nodes inserted, if none, we should
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * break in case of an indefinite loop.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (unsolved_inserted == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Indicate there is unhandled node.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Chain free the whole unsolved
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * list here.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unsolved_left++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unsolved_inserted = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unsolved_sentinel = unsolved_tail;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * We just inserted one rpnode, increment the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * unsolved_inserted counter. We will utilize this
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * counter to detect an indefinite insertion loop.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unsolved_inserted++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* check if there is left out discovered ports. */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (unsolved_left) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Error: Failed to establish expander topology on"),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim port->OSDeviceName);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext(" Folowing port(s) are unresolved."));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim while (unsolved_head) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unsolved_tail =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unsolved_head->sibling;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s%016llx ",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim firstPrinted ? "" : "\t",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim wwnConversion(unsolved_head->sasattr.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim LocalSASAddress.wwn));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (firstPrinted == B_FALSE) firstPrinted = B_TRUE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(unsolved_head);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unsolved_head = unsolved_tail;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "\n");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* still print what we have */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret += sas_rp_tree_print(handle, adapterName, portIndex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim port, rproot, input, 2 * TABLEN, &printPort);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret += sas_rp_tree_print(handle, adapterName, portIndex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim port, rproot, input, 2 * TABLEN, &printPort);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (rproot) sas_rp_tree_free(rproot);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Callback function for target-port subcommand.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Arguments:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * handle - handle to hba port.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * portIndex - the index of hba port currently being processed.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * port - pointer to hba port attributes.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * attrs - pointer to adapter attributes currently being processed.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * input - contains all the input parameters.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Return Value:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 0 sucessfully processed handle
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * >0 error has occured
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*ARGSUSED*/
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int handleTargetPort(HBA_HANDLE handle, char *adapterName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 portIndex, SMHBA_PORTATTRIBUTES *port,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_ADAPTERATTRIBUTES *attrs, inputArg_t *input)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_PORTATTRIBUTES targetattr;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_SAS_PORT sasattr;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int i;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int ret = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int disco_port_fail = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim targetattr.PortSpecificAttribute.SASPort = &sasattr;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (i = 0; i < port->PortSpecificAttribute.SASPort->
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim NumberofDiscoveredPorts; i++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = SMHBA_GetDiscoveredPortAttributes(handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portIndex, i, &targetattr);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim disco_port_fail++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* skip expander device */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (targetattr.PortType != HBA_PORTTYPE_SASEXPANDER) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret += searchTargetPort(handle, portIndex, port,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &targetattr, &sasattr, input->pflag);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (disco_port_fail) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s %d %s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Error: Failed to get attributes for"),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim disco_port_fail,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("connected ports of HBA port"),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim port->OSDeviceName);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * ****************************************************************************
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * compareLUName -
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * compare names directly and also check if disk namees match with
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * different slice number or /devices path are speicified and matches.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * cmdArg - first string to compare
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * osName - os name from attributes
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * returns B_TRUE if the strings match either directly or via devid
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * B_FALSE otherwise
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * ****************************************************************************
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic boolean_t
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimcompareLUName(char *cmdArg, char *osName)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim boolean_t isSame = B_FALSE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim char dev1[MAXPATHLEN], dev2[MAXPATHLEN];
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim char *ch1, *ch2;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strcmp(cmdArg, osName) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim isSame = B_TRUE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* user input didn't match, try to match the core of args. */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) strlcpy(dev1, cmdArg, MAXPATHLEN);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) strlcpy(dev2, osName, MAXPATHLEN);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* is this /devices path */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (((ch1 = strrchr(dev1, ',')) != NULL) &&
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ((ch2 = strrchr(dev2, ',')) != NULL)) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *ch1 = *ch2 = '\0';
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strcmp(dev1, dev2) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim isSame = B_TRUE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* is this a /dev link */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else if ((strncmp(dev1, "/dev/", 5) == 0) &&
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (strncmp(dev2, "/dev/", 5) == 0)) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((strstr(dev1, "dsk") != NULL) &&
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ((strstr(dev2, "dsk") != NULL))) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* if it is disk link */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (((ch1 = strrchr(dev1, 's')) != NULL) &&
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ((ch2 = strrchr(dev2, 's')) != NULL)) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *ch1 = *ch2 = '\0';
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strcmp(dev1, dev2) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim isSame = B_TRUE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* other dev links */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strcmp(dev1, dev2) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim isSame = B_TRUE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } /* compare */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (isSame);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Process logical-unit(lu) subcommand.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Arguments:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * luCount - number of OS device name(s) specified by user.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * luArgv - array of OS device name(s) specified by user.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * options - all the options specified by user.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Return Value:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 0 sucessfully processed handle
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * >0 error has occured
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimint
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimsas_util_list_logicalunit(int luCount, char **luArgv, cmdOptions_t *options)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int processHBA_flags = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int lu;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim boolean_t pathFound;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim boolean_t verbose;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim inputArg_t input;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim discoveredDevice *LUListWalk = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int err_cnt = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (; options->optval; options++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (options->optval == 'v') {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim processHBA_flags |= PRINT_VERBOSE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* HBA_LoadLibrary() */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((status = HBA_LoadLibrary()) != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Failed to load SM-HBA libraries."
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Reason:"), getHBAStatus(status));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim err_cnt++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (err_cnt);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memset(&input, 0, sizeof (input));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input.pflag = processHBA_flags;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input.wwnCount = luCount;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input.wwn_argv = luArgv;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim err_cnt += processHBA(&input, handleLogicalUnit);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim verbose = (input.pflag & PRINT_VERBOSE) ? B_TRUE : B_FALSE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (luCount == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* list all paths */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (LUListWalk = LUList; LUListWalk != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim LUListWalk = LUListWalk->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim err_cnt += printOSDeviceNameInfo(LUListWalk, verbose);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * When operands provided, we should set the error code
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * only if there are issues related with the operands.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim err_cnt = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * list any paths not found first
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * this gives the user cleaner output
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (lu = 0; lu < luCount; lu++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (LUListWalk = LUList, pathFound = B_FALSE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim LUListWalk != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim LUListWalk = LUListWalk->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (compareLUName(luArgv[lu],
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim LUListWalk->OSDeviceName)) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim pathFound = B_TRUE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (pathFound == B_FALSE) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Error: Logical Unit %s Not Found \n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim luArgv[lu]);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim err_cnt++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* list all paths requested in order requested */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (lu = 0; lu < luCount; lu++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (LUListWalk = LUList; LUListWalk != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim LUListWalk = LUListWalk->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (compareLUName(luArgv[lu],
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim LUListWalk->OSDeviceName)) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim err_cnt += printOSDeviceNameInfo(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim LUListWalk,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim verbose);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) HBA_FreeLibrary();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (err_cnt);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Callback function for logical-unit(lu) subcommand.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Arguments:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * handle - handle to hba port.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * portIndex - the index of hba port currently being processed.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * port - pointer to hba port attributes.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * attrs - pointer to adapter attributes currently being processed.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * input - contains all the input parameters.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Return Value:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 0 sucessfully processed handle
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * >0 error has occured
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*ARGSUSED*/
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int handleLogicalUnit(HBA_HANDLE handle, char *adapterName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 portIndex, SMHBA_PORTATTRIBUTES *port,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_ADAPTERATTRIBUTES *attrs, inputArg_t *input)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_TARGETMAPPING *map;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN, domainPortWWN;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim char *portName = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int numentries;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int count = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int ret = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hbaPortWWN = port->PortSpecificAttribute.SASPort->LocalSASAddress;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portName = port->OSDeviceName;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = get_domainPort(handle, portIndex, port, &domainPortWWN);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim switch (status) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim case HBA_STATUS_OK:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim case HBA_STATUS_ERROR_NOT_SUPPORTED:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* don't increase error flag for no phy configuration */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim case HBA_STATUS_ERROR:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim default:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (++ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((map = calloc(1, sizeof (*map))) == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("No enough memory on heap."));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (++ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim map->NumberOfEntries = 1;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * First, we need to get the target mapping data from this hba
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * port.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = SMHBA_GetTargetMapping(handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hbaPortWWN, domainPortWWN, map);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status == HBA_STATUS_ERROR_MORE_DATA) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim numentries = map->NumberOfEntries;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(map);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim map = calloc(1, sizeof (HBA_UINT32) +
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (numentries * sizeof (SMHBA_SCSIENTRY)));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (map == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("No enough memory on heap."));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (++ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim map->NumberOfEntries = numentries;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = SMHBA_GetTargetMapping(handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hbaPortWWN, domainPortWWN, map);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s %016llx %s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Error: Failed to get SCSI mapping data for "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "the HBA port"), wwnConversion(hbaPortWWN.wwn),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Reason:"),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getHBAStatus(status));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(map);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (++ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * By iterating each entry of the targetmapping data, we will
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * construct a global list of logical unit.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (count = 0; count < map->NumberOfEntries; count++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret += searchDevice(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &(map->entry[count]), handle, hbaPortWWN, domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portName, input->pflag);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(map);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Search the matching targetmapping data for given target port and SAM LUN
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * and return target mapping data if found.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Arguments:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * handle - handle to hba port.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * portIndex - hba port index
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * port - hba port attributes.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * targetportWWN - target port SAS address.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * domainportWWN - domain port SAS address.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * domainportttr - target port SAS attributes.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * samLUN - samLUN from report LUNs data.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * data - matching target mapping data.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Return Value:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 0 sucessfully processed handle
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * >0 error has occured
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimsearchTargetPortMappingData(HBA_HANDLE handle, HBA_UINT32 portIndex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_PORTATTRIBUTES *port, SMHBA_SAS_PORT *sasattr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim struct targetPortConfig *configData)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int ret = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_TARGETMAPPING *map = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN hbaPortWWN, domainPortWWN;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int numentries, count;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim targetPortMappingData_t *TPMapData;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim struct scsi_inquiry inq;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim struct scsi_extended_sense sense;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 responseSize, senseSize = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim uchar_t rawLUNs[DEFAULT_LUN_LENGTH], *lun_string;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT8 scsiStatus;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim rep_luns_rsp_t *lun_resp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int lunNum, numberOfLun, lunCount;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim uint32_t lunlength, tmp_lunlength;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim uint64_t sasLUN;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_SCSILUN smhbaLUN;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hbaPortWWN = port->PortSpecificAttribute.SASPort->
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim LocalSASAddress;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = get_domainPort(handle, portIndex, port, &domainPortWWN);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status == HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((map = calloc(1, sizeof (*map))) == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("No enough memory on heap."));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (++ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim map->NumberOfEntries = 1;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = SMHBA_GetTargetMapping(handle, hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim domainPortWWN, map);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status == HBA_STATUS_ERROR_MORE_DATA) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim numentries = map->NumberOfEntries;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(map);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim map = calloc(1, sizeof (HBA_UINT32) +
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (numentries * sizeof (SMHBA_SCSIENTRY)));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (map == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("No enough memory on heap."));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (++ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim map->NumberOfEntries = numentries;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = SMHBA_GetTargetMapping(handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hbaPortWWN, domainPortWWN, map);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* continue to build mapping data based SCSI info */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(map);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim map = NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Get report lun data.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim responseSize = DEFAULT_LUN_LENGTH;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim senseSize = sizeof (struct scsi_extended_sense);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) memset(&sense, 0, sizeof (sense));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = SMHBA_ScsiReportLUNs(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sasattr->LocalSASAddress,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *)rawLUNs,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &responseSize,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &scsiStatus,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) &sense, &senseSize);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * if HBA_STATUS_ERROR_NOT_A_TARGET is return, we can assume this is
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * a remote HBA and move on
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim configData->reportLUNsFailed = B_TRUE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (map != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Let's search mapping data and indicate that Report
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * LUNs failed.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (count = 0; count < map->NumberOfEntries; count++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (memcmp(map->entry[count].PortLun.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim PortWWN.wwn, sasattr->LocalSASAddress.wwn,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (HBA_WWN)) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* allocate mapping data for each LUN */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TPMapData = calloc(1,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (targetPortMappingData_t));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (TPMapData == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("No enough "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "memory."));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(map);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (++ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TPMapData->mappingExist = B_TRUE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TPMapData->osLUN =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim map->entry[count].ScsiId.ScsiOSLun;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) strlcpy(TPMapData->osDeviceName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim map->entry[count].ScsiId.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim OSDeviceName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (TPMapData->osDeviceName));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TPMapData->inq_vid[0] = '\0';
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TPMapData->inq_pid[0] = '\0';
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TPMapData->inq_dtype = DTYPE_UNKNOWN;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (configData->map == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim configData->map = TPMapData;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TPMapData->next =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim configData->map->next;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim configData->map = TPMapData;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) free(map);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (++ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lun_resp = (rep_luns_rsp_t *)((void *)rawLUNs);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) memcpy(&tmp_lunlength, &(lun_resp->length),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (tmp_lunlength));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lunlength = ntohl(tmp_lunlength);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) memcpy(&numberOfLun, &lunlength, sizeof (numberOfLun));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (lunCount = 0; lunCount < (numberOfLun / 8); lunCount++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* allocate mapping data for each LUN */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TPMapData = calloc(1,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (targetPortMappingData_t));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (TPMapData == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("No enough memory."));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(map);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (++ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) memcpy(&TPMapData->reportLUN, lun_resp->
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lun[lunCount].val, sizeof (SMHBA_SCSILUN));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * now issue standard inquiry to get Vendor
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * and product information
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim responseSize = sizeof (struct scsi_inquiry);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim senseSize = sizeof (struct scsi_extended_sense);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) memset(&inq, 0, sizeof (struct scsi_inquiry));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) memset(&sense, 0, sizeof (sense));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sasLUN = ntohll(wwnConversion(lun_resp->lun[lunCount].val));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) memcpy(&smhbaLUN, &sasLUN, sizeof (SMHBA_SCSILUN));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = SMHBA_ScsiInquiry(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sasattr->LocalSASAddress,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim smhbaLUN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim 0,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim 0,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) &inq, &responseSize,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &scsiStatus,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) &sense, &senseSize);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TPMapData->inq_vid[0] = '\0';
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TPMapData->inq_pid[0] = '\0';
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TPMapData->inq_dtype = DTYPE_UNKNOWN;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* indicate that inquiry for this lun is failed */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TPMapData->inquiryFailed = B_TRUE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memcpy(TPMapData->inq_vid, inq.inq_vid,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (TPMapData->inq_vid));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memcpy(TPMapData->inq_pid, inq.inq_pid,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (TPMapData->inq_pid));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TPMapData->inq_dtype = inq.inq_dtype;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (map != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (count = 0; count < map->NumberOfEntries; count++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((memcmp(map->entry[count].PortLun.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim PortWWN.wwn, sasattr->LocalSASAddress.wwn,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (HBA_WWN)) == 0) &&
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (memcmp(&(map->entry[count].PortLun.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TargetLun), &smhbaLUN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (SMHBA_SCSILUN))
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim == 0)) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TPMapData->mappingExist = B_TRUE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TPMapData->osLUN =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim map->entry[count].ScsiId.ScsiOSLun;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) strlcpy(TPMapData->osDeviceName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim map->entry[count].ScsiId.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim OSDeviceName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (TPMapData->osDeviceName));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (count == map->NumberOfEntries) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TPMapData->osDeviceName[0] = '\0';
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lun_string = lun_resp->lun[lunCount].val;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lunNum = ((lun_string[0] & 0x3F) << 8) |
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lun_string[1];
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TPMapData->osLUN = lunNum;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Not able to get any target mapping information */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TPMapData->osDeviceName[0] = '\0';
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lun_string = lun_resp->lun[lunCount].val;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lunNum = ((lun_string[0] & 0x3F) << 8) |
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lun_string[1];
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TPMapData->osLUN = lunNum;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (configData->map == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim configData->map = TPMapData;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TPMapData->next = configData->map->next;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim configData->map = TPMapData;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(map);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Search the discovered LUs and construct the global LU list.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Arguments:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * handle - handle to hba port.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * portIndex - hba port index
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * port - hba port attributes.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * targetattr - target port attributes.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * sasattr - target port SAS attributes.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * pflag - options the user specified.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Return Value:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 0 sucessfully processed handle
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * >0 error has occured
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimsearchTargetPort(HBA_HANDLE handle, HBA_UINT32 portIndex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_PORTATTRIBUTES *port, SMHBA_PORTATTRIBUTES *targetattr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_SAS_PORT *sasattr, int pflag)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int ret = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN expander;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN domainPortWWN;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim targetPortList_t *discoveredTP, *newTP;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim targetPortConfig_t *TPConfig, *newConfig, *prevConfig;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim boolean_t foundTP = B_FALSE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim boolean_t foundConfig = B_FALSE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_PORTATTRIBUTES tgtattr;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_SAS_PORT tgtsasport;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int expanderValid = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = get_domainPort(handle, portIndex, port, &domainPortWWN);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim switch (status) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim case HBA_STATUS_OK:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim case HBA_STATUS_ERROR_NOT_SUPPORTED:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* don't increase error flag for no phy configuration */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim case HBA_STATUS_ERROR:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim default:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (++ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * First, we will iterate the already constructed target port
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * list to see whether there is a target port already exist with
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * matching target port SAS address.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (discoveredTP = gTargetPortList; discoveredTP != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim discoveredTP = discoveredTP->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (memcmp((void *)sasattr->LocalSASAddress.wwn,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *)discoveredTP->sasattr.LocalSASAddress.wwn,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (HBA_WWN)) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * if the target port exist and
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * verbose is not set, just return
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (((pflag & PRINT_VERBOSE) == 0) &&
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ((pflag & PRINT_TARGET_SCSI) == 0)) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim foundTP = B_TRUE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (foundTP == B_TRUE) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * If there is a target port already exist, we should
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * add more information on the target port to construct the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * whole topology.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Here we will check whether the current hba port name
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * has already been added.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* first get the expander SAS address compare */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (memcmp((void *)port->PortSpecificAttribute.SASPort->
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim LocalSASAddress.wwn, (void *)sasattr->
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim AttachedSASAddress.wwn, sizeof (HBA_WWN)) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* NO expander */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) memset((void *)expander.wwn, 0,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (HBA_WWN));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim expanderValid = 1;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (wwnConversion(sasattr->AttachedSASAddress.wwn)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim != 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* expander exist. We should verify it. */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) memcpy((void *)expander.wwn,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *)sasattr->AttachedSASAddress.wwn,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (HBA_WWN));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memset(&tgtattr, 0, sizeof (tgtattr));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memset(&tgtsasport, 0,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (tgtsasport));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim tgtattr.PortSpecificAttribute.SASPort
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim = &tgtsasport;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = SMHBA_GetPortAttributesByWWN(handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sasattr->AttachedSASAddress, domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &tgtattr);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status == HBA_STATUS_OK && tgtattr.PortType
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim == HBA_PORTTYPE_SASEXPANDER) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim expanderValid = 1;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (TPConfig = discoveredTP->configEntry,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim foundConfig = B_FALSE; TPConfig != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TPConfig = TPConfig->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((strcmp(TPConfig->hbaPortName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim port->OSDeviceName) == 0) &&
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (memcmp((void *)expander.wwn, (void *)TPConfig->
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim expanderSASAddr.wwn,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (HBA_WWN)) == 0)) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim foundConfig = B_TRUE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * If we get here, it means that it is a new hba port/exapnder
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * sas address for this discovered target port.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (foundConfig == B_FALSE) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newConfig = (targetPortConfig_t *)calloc(1,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (targetPortConfig_t));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (newConfig == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "%s\n", strerror(errno));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (++ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) strlcpy(newConfig->hbaPortName, port->
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim OSDeviceName, sizeof (newConfig->hbaPortName));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) memcpy((void *)newConfig->expanderSASAddr.wwn,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *)expander.wwn, sizeof (HBA_WWN));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newConfig->expanderValid = expanderValid;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (discoveredTP->configEntry == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim discoveredTP->configEntry = newConfig;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TPConfig = discoveredTP->configEntry;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim prevConfig = TPConfig;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim while (TPConfig != NULL &&
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sas_name_comp(newConfig->hbaPortName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TPConfig->hbaPortName) > 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim prevConfig = TPConfig;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TPConfig = TPConfig->next;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (TPConfig == prevConfig) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Should be inserted in the head. */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newConfig->next = TPConfig;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim discoveredTP->configEntry = newConfig;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newConfig->next = TPConfig;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim prevConfig->next = newConfig;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* if scsi option is not set return */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((pflag & PRINT_TARGET_SCSI) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (searchTargetPortMappingData(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim handle, portIndex, port,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sasattr, newConfig));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Here we got a new target port which has not ever exist
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * in our global target port list. So add it to the list.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * list.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newTP = (targetPortList_t *)calloc(1,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (targetPortList_t));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (newTP == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s\n", strerror(errno));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (++ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) memcpy((void *)&newTP->targetattr, (void *)targetattr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (SMHBA_PORTATTRIBUTES));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) memcpy((void *)&newTP->sasattr, (void *)sasattr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (SMHBA_SAS_PORT));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newConfig = (targetPortConfig_t *)calloc(1,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (targetPortConfig_t));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (newConfig == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s\n", strerror(errno));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(newTP);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (++ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) strlcpy(newConfig->hbaPortName, port->OSDeviceName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (newConfig->hbaPortName));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (memcmp((void *)port->PortSpecificAttribute.SASPort->
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim LocalSASAddress.wwn, (void *)sasattr->
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim AttachedSASAddress.wwn, sizeof (HBA_WWN)) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* NO expander */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) memset((void *)newConfig->expanderSASAddr.wwn,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim 0, sizeof (HBA_WWN));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* expander exist. We should verify it. */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) memcpy((void *)newConfig->expanderSASAddr.wwn,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *)sasattr->AttachedSASAddress.wwn,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (HBA_WWN));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memset(&tgtattr, 0, sizeof (tgtattr));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memset(&tgtsasport, 0, sizeof (tgtsasport));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim tgtattr.PortSpecificAttribute.SASPort = &tgtsasport;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = SMHBA_GetPortAttributesByWWN(handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sasattr->AttachedSASAddress, domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &tgtattr);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status == HBA_STATUS_OK && tgtattr.PortType ==
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_PORTTYPE_SASEXPANDER) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim expanderValid = 1;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newConfig->expanderValid = expanderValid;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newTP->configEntry = newConfig;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newTP->next = gTargetPortList; /* insert at head */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gTargetPortList = newTP; /* set new head */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* if scsi option is not set return */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((pflag & PRINT_TARGET_SCSI) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (searchTargetPortMappingData(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim handle, portIndex, port, sasattr, newConfig));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Search the discovered LUs and construct the global LU list.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Arguments:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * entryP - one of the target mapping data.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * handle - handle to hba port.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * hbaPortWWN - hba port sas address.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * domainPortWWN - domain port WWN for this sas domain.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * portName - HBA port OS Device Name.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * pflag - options the user specified.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Return Value:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 0 sucessfully processed handle
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * >0 error has occured
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimsearchDevice(PSMHBA_SCSIENTRY entryP,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_HANDLE handle, HBA_WWN hbaPortWWN, HBA_WWN domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim char *portName, int pflag)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int ret = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim discoveredDevice *discoveredLU, *newDevice;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portList *portElem, *newPort, *prevElem;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim tgtPortWWNList *newTgtWWN, *TgtWWNList;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim boolean_t foundDevice = B_FALSE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim boolean_t foundPort = B_FALSE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim struct scsi_inquiry inq;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 responseSize, senseSize = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT8 inq_status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_SCSILUN smhbaLUN;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim struct scsi_extended_sense sense;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* if OSDeviceName is not set, we don't need to search */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (entryP->ScsiId.OSDeviceName[0] == '\0') {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * First, we will iterate the already constructed discovered LU
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * list to see whether there is a LU already exist with the same OS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * device name as current target mapping data entry.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (discoveredLU = LUList; discoveredLU != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim discoveredLU = discoveredLU->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strcmp(entryP->ScsiId.OSDeviceName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim discoveredLU->OSDeviceName) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * if there is existing OS Device Name and
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * verbose is not set, just return
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((pflag & PRINT_VERBOSE) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim foundDevice = B_TRUE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (foundDevice == B_TRUE) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * If there is a discovered LU already exist, we should
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * add more information on this LU to construct the whole
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * topology.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Here we will check whether the current hba port has
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * already been added.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (portElem = discoveredLU->HBAPortList,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim foundPort = B_FALSE; portElem != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portElem = portElem->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strcmp(portElem->portName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portName) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim foundPort = B_TRUE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * If we get here, it means that it is a new hba port name
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * for this discovered LU.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (foundPort == B_FALSE) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newPort = (portList *)calloc(1, sizeof (portList));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (newPort == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "%s\n", strerror(errno));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (++ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) strlcpy(newPort->portName, portName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (newPort->portName));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portElem = discoveredLU->HBAPortList;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim prevElem = portElem;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim while (portElem != NULL &&
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sas_name_comp(newPort->portName, portElem->portName)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim > 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim prevElem = portElem;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portElem = portElem->next;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (portElem == prevElem) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Insert in the head of list. */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newPort->next = portElem;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim discoveredLU->HBAPortList = newPort;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newPort->next = portElem;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim prevElem->next = newPort;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* add Target Port */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newPort->tgtPortWWN = (tgtPortWWNList *)calloc(1,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (tgtPortWWNList));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (newPort->tgtPortWWN == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "%s\n", strerror(errno));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (++ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memcpy((void *)&(newPort->tgtPortWWN->portWWN),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *)&(entryP->PortLun.PortWWN),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (HBA_WWN));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Set LUN data */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newPort->tgtPortWWN->scsiOSLun =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim entryP->ScsiId.ScsiOSLun;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Otherwise, we just need to add the target port
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * sas address information.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (TgtWWNList = portElem->tgtPortWWN;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TgtWWNList != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim TgtWWNList = TgtWWNList->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (memcmp(&TgtWWNList->portWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &entryP->PortLun.PortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (HBA_WWN)) == 0)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* add it to existing */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newTgtWWN = (tgtPortWWNList *)calloc(1,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (tgtPortWWNList));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (newTgtWWN == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "%s\n", strerror(errno));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (++ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* insert at head */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newTgtWWN->next = portElem->tgtPortWWN;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portElem->tgtPortWWN = newTgtWWN;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memcpy((void *)&(newTgtWWN->portWWN),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *)&(entryP->PortLun.PortWWN),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (HBA_WWN));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Set LUN data */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newTgtWWN->scsiOSLun =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim entryP->ScsiId.ScsiOSLun;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Here we got a new discovered LU which has not ever exist
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * in our global LU list. So add it into our global LU
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * list.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newDevice = (discoveredDevice *)calloc(1,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (discoveredDevice));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (newDevice == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s\n", strerror(errno));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (++ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newDevice->next = LUList; /* insert at head */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim LUList = newDevice; /* set new head */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* copy device name */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) strlcpy(newDevice->OSDeviceName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim entryP->ScsiId.OSDeviceName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (newDevice->OSDeviceName));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* if verbose is not set return */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((pflag & PRINT_VERBOSE) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* copy WWN data */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newDevice->HBAPortList = (portList *)calloc(1,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (portList));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (newDevice->HBAPortList == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s\n", strerror(errno));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (++ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) strlcpy(newDevice->HBAPortList->portName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portName, sizeof (newDevice->HBAPortList->portName));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newDevice->HBAPortList->tgtPortWWN =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (tgtPortWWNList *)calloc(1, sizeof (tgtPortWWNList));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (newDevice->HBAPortList->tgtPortWWN == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s\n", strerror(errno));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (++ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memcpy((void *)&(newDevice->HBAPortList->\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim tgtPortWWN->portWWN),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *)&(entryP->PortLun.PortWWN),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (HBA_WWN));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newDevice->HBAPortList->tgtPortWWN->scsiOSLun =
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim entryP->ScsiId.ScsiOSLun;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim responseSize = sizeof (struct scsi_inquiry);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim senseSize = sizeof (struct scsi_extended_sense);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memset(&inq, 0, sizeof (struct scsi_inquiry));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memset(&sense, 0, sizeof (sense));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memcpy(&smhbaLUN, &entryP->PortLun.TargetLun,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (smhbaLUN));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Retrieve the VPD data for the newly found discovered LU.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = SMHBA_ScsiInquiry(
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hbaPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim entryP->PortLun.PortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim smhbaLUN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim 0,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim 0,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) &inq, &responseSize,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &inq_status,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) &sense, &senseSize);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* init VID/PID/dType as '\0' */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newDevice->VID[0] = '\0';
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newDevice->PID[0] = '\0';
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newDevice->dType = DTYPE_UNKNOWN;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* initialize inq status */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newDevice->inquiryFailed = B_TRUE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memcpy(newDevice->VID, inq.inq_vid,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (newDevice->VID));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memcpy(newDevice->PID, inq.inq_pid,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (newDevice->PID));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newDevice->dType = inq.inq_dtype;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* initialize inq status */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim newDevice->inquiryFailed = B_FALSE;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Function we use to insert a newly discovered port.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Return:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 0 - success
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * >0 - failed
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimsas_rp_tree_insert(rp_tree_t **rproot,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim rp_tree_t *rpnode)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT8 *wwn1, *wwn2, *wwn3;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim rp_tree_t *node_ptr;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int ret = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (rproot == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Error: NULL rproot"));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (1);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (rpnode == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stderr, "%s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Error: NULL rpnode"));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (1);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (*rproot == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *rproot = rpnode;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim wwn1 = (*rproot)->sasattr.LocalSASAddress.wwn;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim wwn2 = (*rproot)->sasattr.AttachedSASAddress.wwn;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim wwn3 = rpnode->sasattr.AttachedSASAddress.wwn;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * If the attched sas address is equal to the local sas address,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * then this should be a child node of current root node.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (memcmp(wwn1, wwn3, sizeof (HBA_WWN)) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) sas_rp_tree_insert(&(*rproot)->child, rpnode);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim rpnode->parent = *rproot;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else if (memcmp(wwn2, wwn3, sizeof (HBA_WWN)) == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * If the attached sas address is equal to the attached sas
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * address of current root node, then this should be a
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * sibling node.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Insert the SAS/SATA Device at the head of sibling list.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (rpnode->portattr.PortType != HBA_PORTTYPE_SASEXPANDER) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim rpnode->sibling = *rproot;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *rproot = rpnode;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Insert the SAS Expander at the tail of sibling
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * list.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim node_ptr = *rproot;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim while (node_ptr->sibling != NULL)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim node_ptr = node_ptr->sibling;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim node_ptr->sibling = rpnode;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim rpnode->parent = (*rproot)->parent;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * If enter here, we should first try to insert the discovered
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * port node into the child sub-tree, then try to insert to the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * sibling sub-trees. If we failed to insert the discovered
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * port node, return 1. The caller will queue this node
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * up and retry insertion later.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((*rproot)->child) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret = sas_rp_tree_insert(&(*rproot)->child, rpnode);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((*rproot)->child == NULL || ret != 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((*rproot)->sibling) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret = sas_rp_tree_insert(&(*rproot)->sibling,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim rpnode);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret = 1;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Function which will print out the whole disocvered port topology.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Here we use the Preorder Traversal algorithm.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * The indentation rules are:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 1 * TABLEN - for attributes
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 2 * TABLEN - for next tier target port/expander
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimsas_rp_tree_print(HBA_HANDLE handle, char *adapterName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 portIndex, SMHBA_PORTATTRIBUTES *port,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim rp_tree_t *rpnode, inputArg_t *input,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int gident, int *printPort)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int ret = 0, lident;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (rpnode == NULL)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lident = gident;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * We assume that all the nodes are disocvered ports(sas device or
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * expander).
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (input->wwnCount > 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Adjust local indentation if a discovered port specified. */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lident = 2 * TABLEN;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Check whether current node match one of the specified
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * SAS addresses.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((rpnode->portattr.PortType != HBA_PORTTYPE_SASEXPANDER) ||
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim !isPortWWNInArgv(input,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim &rpnode->sasattr.LocalSASAddress)) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Step down to child tree first.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret += sas_rp_tree_print(handle, adapterName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portIndex, port, rpnode->child, input,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gident + 2 * TABLEN, printPort);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Then check the sibling tree.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret += sas_rp_tree_print(handle, adapterName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portIndex, port, rpnode->sibling, input,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gident, printPort);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((rpnode->portattr.PortType == HBA_PORTTYPE_SASEXPANDER) ||
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (input->pflag & PRINT_TARGET_PORT)) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * We should print the header(HBA Name + HBA Port Name)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * on-demand. It means that, if we have expander device
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * address specified on the command line, we should print
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * the header once we find a matching one. Or we will
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * print the header from the beginning of the output.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (g_printHBA == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "HBA Name:", adapterName);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim g_printHBA = 1;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (*printPort == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(TABLEN),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "HBA Port Name:", port->OSDeviceName);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *printPort = 1;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret += sas_print_rpnode(input, rpnode, lident, gident);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * If operands provided with "-t" option specified, we will print
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * the immediate child nodes information under the expander.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (input->pflag & PRINT_TARGET_PORT) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* no operand. ignore the option. */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (input->wwnCount > 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (rpnode->portattr.PortType ==
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_PORTTYPE_SASEXPANDER) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret += sas_rp_tree_print_desc(handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portIndex, port, rpnode->child,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim input,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lident + 2 * TABLEN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gident + 2 * TABLEN);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Here we use DFS(Depth First Search) algorithm to traverse the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * whole tree.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret += sas_rp_tree_print(handle, adapterName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portIndex, port, rpnode->child, input,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gident + 2 * TABLEN, printPort);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret += sas_rp_tree_print(handle, adapterName,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portIndex, port, rpnode->sibling, input,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gident, printPort);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Function which will destroy the whole discovered port tree.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Here we use the Postorder Traversal algorithm.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic void sas_rp_tree_free(rp_tree_t *rproot)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim tgt_mapping *cur, *next;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (rproot == NULL)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Free child tree first.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (rproot->child) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sas_rp_tree_free(rproot->child);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Free sibling trees then.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (rproot->sibling) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sas_rp_tree_free(rproot->sibling);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Free root node at last.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim cur = rproot->first_entry;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim while (cur != NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim next = cur->next;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(cur);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim cur = next;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim free(rproot);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Function used to print out all the descendant nodes.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * handle - handle to HBA.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * port - port attributes of current HBA port.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * desc - the root node of a subtree which will be processed.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * input - input argument.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * lident - local indentation for shifting indentation.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * gident - global indentation, can also be used to obtain Tier number.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*ARGSUSED*/
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimsas_rp_tree_print_desc(HBA_HANDLE handle, HBA_UINT32 portIndex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_PORTATTRIBUTES *port, rp_tree_t *desc,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim inputArg_t *input, int lident, int gident)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int ret = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim rp_tree_t *rp_node;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (desc == NULL)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Walk through the subtree of desc by Pre-Order Traversal Algo.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (rp_node = desc; rp_node != NULL; rp_node = rp_node->sibling) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret += sas_print_rpnode(input, rp_node, lident, gident);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Function used to print the information of specified SAS address.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * handle - handle to a HBA.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * port - port attributes of a HBA port.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * rpnode - discovered port which will be processed.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * lident - local indentation used for shifting indentation.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * gident - global indentation used for calculating "Tier" number.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimsas_print_rpnode(inputArg_t *input,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim rp_tree_t *rpnode, int lident, int gident)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int ret = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (rpnode->portattr.PortType == HBA_PORTTYPE_SASEXPANDER) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s(Tier %d): %016llx\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(lident),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Expander SAS Address",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gident / (2 * TABLEN),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim wwnConversion(rpnode->sasattr.LocalSASAddress.wwn));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %016llx\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(lident),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Target Port SAS Address:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim wwnConversion(rpnode->sasattr.LocalSASAddress.wwn));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (input->pflag & PRINT_VERBOSE) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (rpnode->portattr.PortType != HBA_PORTTYPE_SASEXPANDER) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(TABLEN + lident),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Type:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getStateString(rpnode->portattr.PortType,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim porttype_string));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(TABLEN + lident),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "OS Device Name:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim rpnode->portattr.OSDeviceName);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(TABLEN + lident),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "State: ",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getStateString(rpnode->portattr.PortState,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portstate_string));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim rpnode->printed = 1;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Function used to get the correct domainPortWWN as needed by some of the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * SMHBA APIs.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * handle - handle to a HBA.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * portIndex - index to locate the port.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * port - pointer to the structure holding port attributes.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * pdomainPort - pointer to the buffer holding domainPortWWN.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimget_domainPort(HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int portIndex, PSMHBA_PORTATTRIBUTES port,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_WWN *pdomainPort)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim PSMHBA_SAS_PORT sasport;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_SAS_PHY phyattr;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sasport = port->PortSpecificAttribute.SASPort;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memset(pdomainPort, 0, sizeof (HBA_WWN));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Since iport can exist without any phys,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * sasinfo hba-port -v has indicated numberOfPhys;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * if there is no phys within the hba, just return OK.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (sasport->NumberofPhys > 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = SMHBA_GetSASPhyAttributes(handle, portIndex,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim 0, &phyattr);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memcpy(pdomainPort, &phyattr.domainPortWWN,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (HBA_WWN));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* return not supported for no phy configured */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR_NOT_SUPPORTED);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_OK);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Comparison function for comparing names possibly ending with digits.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Return:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * <0 - name1 is less than name2.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 0 - name1 is equal with name2.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * >0 - name1 is more than name2.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimsas_name_comp(const char *name1, const char *name2)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int i = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (name1 == name2)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (0);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim while ((name1[i] == name2[i]) && (name1[i] != '\0'))
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim i++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* If neither of name1[i] and name2[i] is '\0'. */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (isdigit(name1[i]) && isdigit(name2[i]))
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (atoi(&name1[i]) - atoi(&name2[i]));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* One of name1[i] and name2[i] is not digit. */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (name1[i] - name2[i]);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Comparison function for sorting HBA/HBA Port.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * arg1 - first argument of type sas_elem_t.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * arg2 - second argument of type sas_elem_t.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Return:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * <0 - arg1 is less than arg2.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 0 - arg1 is equal with arg2.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * >0 - arg1 is more than arg2.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic int
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimsas_elem_compare(const void *arg1, const void *arg2)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sas_elem_t *p1, *p2;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim p1 = (sas_elem_t *)arg1;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim p2 = (sas_elem_t *)arg2;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (sas_name_comp(p1->name, p2->name));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Sorting function for HBA/HBA Port output.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * array - elements array of type sas_elem_t.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * nelem - number of elements in array of type sas_elem_t.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic void
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimsas_elem_sort(sas_elem_t *array, int nelem)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim qsort((void *)array, nelem, sizeof (sas_elem_t), sas_elem_compare);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}