9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * See the License for the specific language governing permissions
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * and limitations under the License.
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 * CDDL HEADER END
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Use is subject to license terms.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_MORE_DATA, "Not Enough Buffer for Data",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_SCSI_CHECK_CONDITION, "SCSI Check Condition",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_INCOMPATIBLE, "Request Incompatible",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_LOCAL_TARGET, "Local Target Error",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_LOCAL_SCSIID_BOUND, "Local SCSIID Bound",
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_NO_SUCH_BINDING, "No Such Binding",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_UNSUPPORTED_FC4, "Unsupported FC4",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_NOT_ASCSIDEVICE, "Not a SCSI Device",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS_ERROR_INVALID_PROTOCOL_TYPE, "Invalid Protocol Type",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim DTYPE_ARRAY_CTRL, "Storage Array Controller Device",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic char *getPhyStateString(HBA_UINT32 key, phystat_type phyt);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* the maximum indent with terminator '\0' */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (i = 0; i < number; i++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimgetStateString(HBA_UINT32 key, SAS_STATE *stat_string)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) sprintf(ret, "Undefined value (%d)", key);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kimstatic char *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimgetPhyStateString(HBA_UINT32 key, phystat_type phyt)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (i = 0; i < len; i++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return ("enabled");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return ("not available");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * return device type description
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Arguments:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * dType - Device type returned from Standard INQUIRY
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * char string description for device type
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (getStateString((dType & DTYPE_MASK), dtype_string));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * prints out HBA information
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimprintHBAInfo(SMHBA_ADAPTERATTRIBUTES *attrs, int pflag, int numberOfPorts,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s %s\n", "HBA Name:", adapterName);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim attrs->Model[0] == 0? "not available":attrs->Model);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Firmware Version:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Serial Number:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Driver Name:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Driver Version:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Number of HBA Ports:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * prints out all the HBA port information
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "HBA Port Name:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getStateString(port->PortState, portstate_string));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Local SAS Address:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim wwnConversion(port->PortSpecificAttribute.SASPort->\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Attached SAS Address:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim wwnConversion(port->PortSpecificAttribute.SASPort->\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Number of Phys:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim port->PortSpecificAttribute.SASPort->NumberofPhys);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Identifier:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getPhyStateString(phyinfo->NegotiatedLinkRate, PHY_STATE));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "HardwareLinkRate(Min/Max):",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getPhyStateString(phyinfo->HardwareMinLinkRate, PHY_SPEED),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getPhyStateString(phyinfo->HardwareMaxLinkRate, PHY_SPEED));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "ProgrammedLinkRate(Min/Max):",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getPhyStateString(phyinfo->ProgrammedMinLinkRate, PHY_SPEED),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getPhyStateString(phyinfo->ProgrammedMaxLinkRate, PHY_SPEED));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "NegotiatedLinkRate:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim getPhyStateString(phyinfo->NegotiatedLinkRate, PHY_SPEED));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimprintHBAPortPhyStatistics(SMHBA_SASPHYSTATISTICS *phystat)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Link Error Statistics:");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Invalid Dword:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Running Disparity Error:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Loss of Dword Sync:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Reset Problem:",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * print the OS device name for the logical-unit object
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Arguments:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * devListWalk - OS device path info
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * verbose - boolean indicating whether to display additional info
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 0 - we're good.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * >0 - we met issues.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimprintTargetPortInfo(targetPortList_t *TPListWalk, int pflag)
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 configList != NULL; configList = configList->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (wwnConversion(configList->expanderSASAddr.wwn) !=
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "%sExpander Device SAS Address:"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim " %016llx",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "%sExpander Device SAS Address:"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim " %016llx (Failed to Validate"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim " Attached Port.)",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "%sExpander Device SAS Address: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "None (direct attached)");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "%sExpander Device SAS Address: %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "None (Failed to Get"
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim " Attached Port)");
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "%s %016llx\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "ReportLun Data on"),
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "%sOS Device Name : %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "%sOS Device Name : %s\n",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "matching OS Device "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* indentation changed here */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* indentation changed back */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * print the OS device name for the logical-unit object
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Arguments:
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * devListWalk - OS device path info
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * verbose - boolean indicating whether to display additional info
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * 0 - we're good.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * >0 - we met issues.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimprintOSDeviceNameInfo(discoveredDevice *devListWalk, boolean_t verbose)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) fprintf(stdout, "%s", portElem->portName);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim tgtWWNList != NULL; tgtWWNList = tgtWWNList->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "\n%sTarget Port SAS Address: ",