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 <ctype.h>
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#include <printAttrs.h>
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic SAS_STATE hbastatus_string[] = {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_OK, "Okay",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR, "Error",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_NOT_SUPPORTED, "Not Supported",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_INVALID_HANDLE, "Invalid Handle",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_ARG, "Argument Error",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_ILLEGAL_WWN, "Illegal WWN",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_ILLEGAL_INDEX, "Illegal Index",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_MORE_DATA, "Not Enough Buffer for Data",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_STALE_DATA, "Stale Data",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_SCSI_CHECK_CONDITION, "SCSI Check Condition",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_BUSY, "Busy",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_TRY_AGAIN, "Try Again",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_UNAVAILABLE, "Unavailable",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_ELS_REJECT, "ELS Reject",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_INVALID_LUN, "Invalid LUN",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_INCOMPATIBLE, "Request Incompatible",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_AMBIGUOUS_WWN, "Ambiguous WWN",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_LOCAL_BUS, "Local Bus Error",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_LOCAL_TARGET, "Local Target Error",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_LOCAL_LUN, "Local LUN Error",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_LOCAL_SCSIID_BOUND, "Local SCSIID Bound",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_TARGET_FCID, "Target FCID Error",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_TARGET_NODE_WWN, "Target Node WWN Error",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_TARGET_PORT_WWN, "Target Port WWN Error",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_TARGET_LUN, "Target LUN Error",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_TARGET_LUID, "Target LUID Error",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_NO_SUCH_BINDING, "No Such Binding",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_NOT_A_TARGET, "Not a Target",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_UNSUPPORTED_FC4, "Unsupported FC4",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_INCAPABLE, "Incapable",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_TARGET_BUSY, "Target Busy",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_NOT_LOADED, "Not Loaded",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_ALREADY_LOADED, "Alreday Loaded",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_ILLEGAL_FCID, "Illegal FCID",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_NOT_ASCSIDEVICE, "Not a SCSI Device",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_INVALID_PROTOCOL_TYPE, "Invalid Protocol Type",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_BAD_EVENT_TYPE, "Bad Event Type",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim -1, NULL
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim};
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSAS_STATE porttype_string[] = {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_PORTTYPE_UNKNOWN, "UNKNOWN",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_PORTTYPE_OTHER, "OTHER",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_PORTTYPE_NOTPRESENT, "NOT Present",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_PORTTYPE_SASDEVICE, "SAS Device",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_PORTTYPE_SATADEVICE, "SATA Device",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_PORTTYPE_SASEXPANDER, "SAS Expander",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim -1, NULL,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim};
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimSAS_STATE portstate_string[] = {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_PORTSTATE_UNKNOWN, "unknown",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_PORTSTATE_ONLINE, "online",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_PORTSTATE_OFFLINE, "offline",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_PORTSTATE_BYPASSED, "bypassed",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_PORTSTATE_DIAGNOSTICS, "diagnostics",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_PORTSTATE_LINKDOWN, "link Down",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_PORTSTATE_ERROR, "port Error",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_PORTSTATE_LOOPBACK, "loopback",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_PORTSTATE_DEGRADED, "degraded",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim -1, NULL,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim};
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic SAS_STATE phystate_string[] = {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_SASSTATE_UNKNOWN, "unknown",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_SASSTATE_DISABLED, "disabled",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_SASSTATE_FAILED, "failed",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_SASSTATE_SATASPINUP, "sata-spinup",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_SASSTATE_SATAPORTSEL, "sata-portselector",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_SASSPEED_1_5GBIT, "1.5Gbit",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_SASSPEED_3GBIT, "3Gbit",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_SASSPEED_6GBIT, "6Gbit",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim -1, NULL,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim};
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic SAS_STATE dtype_string[] = {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DTYPE_DIRECT, "Disk Device",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DTYPE_SEQUENTIAL, "Tape Device",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DTYPE_PRINTER, "Printer Device",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DTYPE_PROCESSOR, "Processor Device",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DTYPE_WORM, "WORM Device",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DTYPE_RODIRECT, "CD/DVD Device",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DTYPE_SCANNER, "Scanner Device",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DTYPE_OPTICAL, "Optical Memory Device",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DTYPE_CHANGER, "Medium Changer Device",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DTYPE_COMM, "Communications Device",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DTYPE_ARRAY_CTRL, "Storage Array Controller Device",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DTYPE_ESI, "Enclosure Services Device",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DTYPE_RBC, "Simplified Direct-access Device",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DTYPE_OCRW, "Optical Card Reader/Writer Device",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DTYPE_BCC, "Bridge Controller Commands",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DTYPE_OSD, "Object-based Storage Device",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DTYPE_ADC, "Automation/Drive Interface",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DTYPE_WELLKNOWN, "Well Known Logical Unit",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DTYPE_UNKNOWN, "Unknown Device",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim -1, NULL
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim};
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic char *getPhyStateString(HBA_UINT32 key, phystat_type phyt);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimchar *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimgetIndentSpaces(int number)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int i = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* the maximum indent with terminator '\0' */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim static char ret[MAXINDENT+1];
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (number > MAXINDENT)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim number = MAXINDENT;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (i = 0; i < number; i++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret[i] = ' ';
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret[i] = '\0';
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimchar *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimgetStateString(HBA_UINT32 key, SAS_STATE *stat_string)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim static char ret[64];
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim while (stat_string->key != -1) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (stat_string->key == key) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return ((char *)stat_string->value);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim stat_string++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) sprintf(ret, "Undefined value (%d)", key);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic char *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimgetPhyStateString(HBA_UINT32 key, phystat_type phyt)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int i = 0, len = 0, match = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 physpeed[] = {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_SASSPEED_1_5GBIT,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_SASSPEED_3GBIT,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_SASSPEED_6GBIT
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim };
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim len = sizeof (physpeed) / sizeof (HBA_UINT32);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (i = 0; i < len; i++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (key == physpeed[i]) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim match = 1;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (match == 1) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (phyt == PHY_STATE)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return ("enabled");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim else
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (getStateString(key, phystate_string));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (phyt == PHY_STATE)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (getStateString(key, phystate_string));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim else
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return ("not available");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimchar *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimgetHBAStatus(HBA_STATUS key)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (getStateString(key, hbastatus_string));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * return device type description
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Arguments:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * dType - Device type returned from Standard INQUIRY
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Returns:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * char string description for device type
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimchar *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimgetDTypeString(uchar_t dType)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (getStateString((dType & DTYPE_MASK), dtype_string));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimuint64_t
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimwwnConversion(uchar_t *wwn)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim uint64_t tmp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memcpy(&tmp, wwn, sizeof (uint64_t));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (ntohll(tmp));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * prints out HBA information
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimvoid
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimprintHBAInfo(SMHBA_ADAPTERATTRIBUTES *attrs, int pflag, int numberOfPorts,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim const char *adapterName)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s %s\n", "HBA Name:", adapterName);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (pflag & PRINT_VERBOSE) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(4), "Manufacturer:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim attrs->Manufacturer[0] == 0?
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "not available":attrs->Manufacturer);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(4), "Model: ",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim attrs->Model[0] == 0? "not available":attrs->Model);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(4),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Firmware Version:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim attrs->FirmwareVersion[0] == 0? "not available":
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim attrs->FirmwareVersion);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(4),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "FCode/BIOS Version:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim attrs->OptionROMVersion[0] == 0? "not available":
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim attrs->OptionROMVersion);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(4),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Serial Number:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim attrs->SerialNumber[0] == 0? "not available":
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim attrs->SerialNumber);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(4),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Driver Name:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim attrs->DriverName[0] == 0? "not available":
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim attrs->DriverName);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(4),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Driver Version:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim attrs->DriverVersion[0] == 0? "not available":
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim attrs->DriverVersion);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %d\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(4),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Number of HBA Ports:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim numberOfPorts);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * prints out all the HBA port information
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimvoid
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimprintHBAPortInfo(SMHBA_PORTATTRIBUTES *port,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SMHBA_ADAPTERATTRIBUTES *attrs, int pflag) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((port == NULL) || (attrs == NULL)) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(2),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "HBA Port Name:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim port->OSDeviceName);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (!(pflag & PRINT_VERBOSE)) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (port->PortType != HBA_PORTTYPE_SASDEVICE)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(4),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Type:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getStateString(port->PortType, porttype_string));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(4),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "State:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getStateString(port->PortState, portstate_string));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %016llx\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(4),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Local SAS Address:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim wwnConversion(port->PortSpecificAttribute.SASPort->\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim LocalSASAddress.wwn));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %016llx\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(4),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Attached SAS Address:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim wwnConversion(port->PortSpecificAttribute.SASPort->\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim AttachedSASAddress.wwn));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %d\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(4),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Number of Phys:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim port->PortSpecificAttribute.SASPort->NumberofPhys);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimvoid
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimprintHBAPortPhyInfo(SMHBA_SAS_PHY *phyinfo)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (phyinfo == NULL)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %u\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(6),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Identifier:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim phyinfo->PhyIdentifier);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(8),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "State: ",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getPhyStateString(phyinfo->NegotiatedLinkRate, PHY_STATE));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %s/%s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(8),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "HardwareLinkRate(Min/Max):",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getPhyStateString(phyinfo->HardwareMinLinkRate, PHY_SPEED),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getPhyStateString(phyinfo->HardwareMaxLinkRate, PHY_SPEED));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %s/%s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(8),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "ProgrammedLinkRate(Min/Max):",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getPhyStateString(phyinfo->ProgrammedMinLinkRate, PHY_SPEED),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getPhyStateString(phyinfo->ProgrammedMaxLinkRate, PHY_SPEED));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(8),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "NegotiatedLinkRate:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getPhyStateString(phyinfo->NegotiatedLinkRate, PHY_SPEED));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimvoid
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimprintHBAPortPhyStatistics(SMHBA_SASPHYSTATISTICS *phystat)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (phystat == NULL)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(8),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Link Error Statistics:");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %llu\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(12),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Invalid Dword:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim phystat->InvalidDwordCount);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %llu\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(12),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Running Disparity Error:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim phystat->RunningDisparityErrorCount);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %llu\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(12),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Loss of Dword Sync:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim phystat->LossofDwordSyncCount);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s%s %llu\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(12),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Reset Problem:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim phystat->PhyResetProblemCount);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * print the OS device name for the logical-unit object
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Arguments:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * devListWalk - OS device path info
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * verbose - boolean indicating whether to display additional info
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * returns:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 0 - we're good.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * >0 - we met issues.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimint
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimprintTargetPortInfo(targetPortList_t *TPListWalk, int pflag)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim targetPortConfig_t *configList;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim targetPortMappingData_t *mapList;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int count, i;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int ret = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "Target Port SAS Address: %016llx\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim wwnConversion(TPListWalk->sasattr.LocalSASAddress.wwn));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((pflag & PRINT_VERBOSE) || (pflag & PRINT_TARGET_SCSI)) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%sType: %s\n", getIndentSpaces(4),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getStateString(TPListWalk->targetattr.PortType,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim porttype_string));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (configList = TPListWalk->configEntry;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim configList != NULL; configList = configList->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%sHBA Port Name: %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(4), configList->hbaPortName);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (wwnConversion(configList->expanderSASAddr.wwn) !=
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (configList->expanderValid) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "%sExpander Device SAS Address:"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim " %016llx",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(8),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim wwnConversion(configList->
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim expanderSASAddr.wwn));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "%sExpander Device SAS Address:"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim " %016llx (Failed to Validate"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim " Attached Port.)",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(8),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim wwnConversion(configList->
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim expanderSASAddr.wwn));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (configList->expanderValid) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "%sExpander Device SAS Address: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(8),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "None (direct attached)");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "%sExpander Device SAS Address: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(8),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "None (Failed to Get"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim " Attached Port)");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "\n");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (pflag & PRINT_TARGET_SCSI) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (configList->reportLUNsFailed) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "%s %016llx\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Error: Failed to get "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "ReportLun Data on"),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim wwnConversion(TPListWalk->
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sasattr.LocalSASAddress.wwn));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (mapList = configList->map;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim mapList != NULL; mapList = mapList->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%sLUN : %d\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(12),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim mapList->osLUN);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (mapList->mappingExist) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "%sOS Device Name : %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(14),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (mapList->osDeviceName[0] ==
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim '\0') ? "Not avaialble" :
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim mapList->osDeviceName);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "%sOS Device Name : %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(14), "No "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "matching OS Device "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "found.");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* indentation changed here */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (mapList->inquiryFailed) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s %s LUN %d\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Error: Failed to get Inquiry Data on"),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim mapList->osDeviceName, mapList->osLUN);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%sVendor: ",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(14));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (count = sizeof (mapList->inq_vid), i = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim i < count; i++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (isprint(mapList->inq_vid[i]))
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%c",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim mapList->inq_vid[i]);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "\n%sProduct: ",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(14));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (count = sizeof (mapList->inq_pid), i = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim i < count; i++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (isprint(mapList->inq_pid[i]))
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%c",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim mapList->inq_pid[i]);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "\n%sDevice Type: %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(14),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getDTypeString(mapList->inq_dtype));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* indentation changed back */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * print the OS device name for the logical-unit object
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Arguments:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * devListWalk - OS device path info
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * verbose - boolean indicating whether to display additional info
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * returns:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 0 - we're good.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * >0 - we met issues.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimint
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimprintOSDeviceNameInfo(discoveredDevice *devListWalk, boolean_t verbose)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim{
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portList *portElem;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim tgtPortWWNList *tgtWWNList;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int i, count;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int ret = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "OS Device Name: %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim devListWalk->OSDeviceName);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (verbose == B_TRUE) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (portElem = devListWalk->HBAPortList;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim portElem != NULL; portElem = portElem->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%sHBA Port Name: ",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(4));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s", portElem->portName);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (tgtWWNList = portElem->tgtPortWWN;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim tgtWWNList != NULL; tgtWWNList = tgtWWNList->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "\n%sTarget Port SAS Address: ",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(8));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%016llx",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim wwnConversion(tgtWWNList->portWWN.wwn));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "\n%sLUN: %u",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(12),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim tgtWWNList->scsiOSLun);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "\n");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (devListWalk->inquiryFailed) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim gettext("Error: Failed to get Inquiry data "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "on device"), devListWalk->OSDeviceName);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ret++;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim } else {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%sVendor: ",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(4));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (count = sizeof (devListWalk->VID), i = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim i < count; i++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (isprint(devListWalk->VID[i]))
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%c",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim devListWalk->VID[i]);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "\n%sProduct: ",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(4));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (count = sizeof (devListWalk->PID), i = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim i < count; i++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (isprint(devListWalk->PID[i]))
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%c",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim devListWalk->PID[i]);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "\n%sDevice Type: %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getIndentSpaces(4),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getDTypeString(devListWalk->dType));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (ret);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}