19e86db79SHyon Kim /*
29e86db79SHyon Kim * CDDL HEADER START
39e86db79SHyon Kim *
49e86db79SHyon Kim * The contents of this file are subject to the terms of the
59e86db79SHyon Kim * Common Development and Distribution License (the "License").
69e86db79SHyon Kim * You may not use this file except in compliance with the License.
79e86db79SHyon Kim *
89e86db79SHyon Kim * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
99e86db79SHyon Kim * or http://www.opensolaris.org/os/licensing.
109e86db79SHyon Kim * See the License for the specific language governing permissions
119e86db79SHyon Kim * and limitations under the License.
129e86db79SHyon Kim *
139e86db79SHyon Kim * When distributing Covered Code, include this CDDL HEADER in each
149e86db79SHyon Kim * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
159e86db79SHyon Kim * If applicable, add the following below this CDDL HEADER, with the
169e86db79SHyon Kim * fields enclosed by brackets "[]" replaced with your own identifying
179e86db79SHyon Kim * information: Portions Copyright [yyyy] [name of copyright owner]
189e86db79SHyon Kim *
199e86db79SHyon Kim * CDDL HEADER END
209e86db79SHyon Kim */
219e86db79SHyon Kim /*
229e86db79SHyon Kim * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
239e86db79SHyon Kim * Use is subject to license terms.
249e86db79SHyon Kim */
259e86db79SHyon Kim
269e86db79SHyon Kim #include <ctype.h>
279e86db79SHyon Kim #include <printAttrs.h>
289e86db79SHyon Kim
299e86db79SHyon Kim static SAS_STATE hbastatus_string[] = {
309e86db79SHyon Kim HBA_STATUS_OK, "Okay",
319e86db79SHyon Kim HBA_STATUS_ERROR, "Error",
329e86db79SHyon Kim HBA_STATUS_ERROR_NOT_SUPPORTED, "Not Supported",
339e86db79SHyon Kim HBA_STATUS_ERROR_INVALID_HANDLE, "Invalid Handle",
349e86db79SHyon Kim HBA_STATUS_ERROR_ARG, "Argument Error",
359e86db79SHyon Kim HBA_STATUS_ERROR_ILLEGAL_WWN, "Illegal WWN",
369e86db79SHyon Kim HBA_STATUS_ERROR_ILLEGAL_INDEX, "Illegal Index",
379e86db79SHyon Kim HBA_STATUS_ERROR_MORE_DATA, "Not Enough Buffer for Data",
389e86db79SHyon Kim HBA_STATUS_ERROR_STALE_DATA, "Stale Data",
399e86db79SHyon Kim HBA_STATUS_SCSI_CHECK_CONDITION, "SCSI Check Condition",
409e86db79SHyon Kim HBA_STATUS_ERROR_BUSY, "Busy",
419e86db79SHyon Kim HBA_STATUS_ERROR_TRY_AGAIN, "Try Again",
429e86db79SHyon Kim HBA_STATUS_ERROR_UNAVAILABLE, "Unavailable",
439e86db79SHyon Kim HBA_STATUS_ERROR_ELS_REJECT, "ELS Reject",
449e86db79SHyon Kim HBA_STATUS_ERROR_INVALID_LUN, "Invalid LUN",
459e86db79SHyon Kim HBA_STATUS_ERROR_INCOMPATIBLE, "Request Incompatible",
469e86db79SHyon Kim HBA_STATUS_ERROR_AMBIGUOUS_WWN, "Ambiguous WWN",
479e86db79SHyon Kim HBA_STATUS_ERROR_LOCAL_BUS, "Local Bus Error",
489e86db79SHyon Kim HBA_STATUS_ERROR_LOCAL_TARGET, "Local Target Error",
499e86db79SHyon Kim HBA_STATUS_ERROR_LOCAL_LUN, "Local LUN Error",
509e86db79SHyon Kim HBA_STATUS_ERROR_LOCAL_SCSIID_BOUND, "Local SCSIID Bound",
519e86db79SHyon Kim HBA_STATUS_ERROR_TARGET_FCID, "Target FCID Error",
529e86db79SHyon Kim HBA_STATUS_ERROR_TARGET_NODE_WWN, "Target Node WWN Error",
539e86db79SHyon Kim HBA_STATUS_ERROR_TARGET_PORT_WWN, "Target Port WWN Error",
549e86db79SHyon Kim HBA_STATUS_ERROR_TARGET_LUN, "Target LUN Error",
559e86db79SHyon Kim HBA_STATUS_ERROR_TARGET_LUID, "Target LUID Error",
569e86db79SHyon Kim HBA_STATUS_ERROR_NO_SUCH_BINDING, "No Such Binding",
579e86db79SHyon Kim HBA_STATUS_ERROR_NOT_A_TARGET, "Not a Target",
589e86db79SHyon Kim HBA_STATUS_ERROR_UNSUPPORTED_FC4, "Unsupported FC4",
599e86db79SHyon Kim HBA_STATUS_ERROR_INCAPABLE, "Incapable",
609e86db79SHyon Kim HBA_STATUS_ERROR_TARGET_BUSY, "Target Busy",
619e86db79SHyon Kim HBA_STATUS_ERROR_NOT_LOADED, "Not Loaded",
629e86db79SHyon Kim HBA_STATUS_ERROR_ALREADY_LOADED, "Alreday Loaded",
639e86db79SHyon Kim HBA_STATUS_ERROR_ILLEGAL_FCID, "Illegal FCID",
649e86db79SHyon Kim HBA_STATUS_ERROR_NOT_ASCSIDEVICE, "Not a SCSI Device",
659e86db79SHyon Kim HBA_STATUS_ERROR_INVALID_PROTOCOL_TYPE, "Invalid Protocol Type",
669e86db79SHyon Kim HBA_STATUS_ERROR_BAD_EVENT_TYPE, "Bad Event Type",
679e86db79SHyon Kim -1, NULL
689e86db79SHyon Kim };
699e86db79SHyon Kim
709e86db79SHyon Kim SAS_STATE porttype_string[] = {
719e86db79SHyon Kim HBA_PORTTYPE_UNKNOWN, "UNKNOWN",
729e86db79SHyon Kim HBA_PORTTYPE_OTHER, "OTHER",
739e86db79SHyon Kim HBA_PORTTYPE_NOTPRESENT, "NOT Present",
749e86db79SHyon Kim HBA_PORTTYPE_SASDEVICE, "SAS Device",
759e86db79SHyon Kim HBA_PORTTYPE_SATADEVICE, "SATA Device",
769e86db79SHyon Kim HBA_PORTTYPE_SASEXPANDER, "SAS Expander",
779e86db79SHyon Kim -1, NULL,
789e86db79SHyon Kim };
799e86db79SHyon Kim
809e86db79SHyon Kim SAS_STATE portstate_string[] = {
819e86db79SHyon Kim HBA_PORTSTATE_UNKNOWN, "unknown",
829e86db79SHyon Kim HBA_PORTSTATE_ONLINE, "online",
839e86db79SHyon Kim HBA_PORTSTATE_OFFLINE, "offline",
849e86db79SHyon Kim HBA_PORTSTATE_BYPASSED, "bypassed",
859e86db79SHyon Kim HBA_PORTSTATE_DIAGNOSTICS, "diagnostics",
869e86db79SHyon Kim HBA_PORTSTATE_LINKDOWN, "link Down",
879e86db79SHyon Kim HBA_PORTSTATE_ERROR, "port Error",
889e86db79SHyon Kim HBA_PORTSTATE_LOOPBACK, "loopback",
899e86db79SHyon Kim HBA_PORTSTATE_DEGRADED, "degraded",
909e86db79SHyon Kim -1, NULL,
919e86db79SHyon Kim };
929e86db79SHyon Kim
939e86db79SHyon Kim static SAS_STATE phystate_string[] = {
949e86db79SHyon Kim HBA_SASSTATE_UNKNOWN, "unknown",
959e86db79SHyon Kim HBA_SASSTATE_DISABLED, "disabled",
969e86db79SHyon Kim HBA_SASSTATE_FAILED, "failed",
979e86db79SHyon Kim HBA_SASSTATE_SATASPINUP, "sata-spinup",
989e86db79SHyon Kim HBA_SASSTATE_SATAPORTSEL, "sata-portselector",
999e86db79SHyon Kim HBA_SASSPEED_1_5GBIT, "1.5Gbit",
1009e86db79SHyon Kim HBA_SASSPEED_3GBIT, "3Gbit",
1019e86db79SHyon Kim HBA_SASSPEED_6GBIT, "6Gbit",
10262877672SHans Rosenfeld HBA_SASSPEED_12GBIT, "12Gbit",
1039e86db79SHyon Kim -1, NULL,
1049e86db79SHyon Kim };
1059e86db79SHyon Kim
1069e86db79SHyon Kim static SAS_STATE dtype_string[] = {
1079e86db79SHyon Kim DTYPE_DIRECT, "Disk Device",
1089e86db79SHyon Kim DTYPE_SEQUENTIAL, "Tape Device",
1099e86db79SHyon Kim DTYPE_PRINTER, "Printer Device",
1109e86db79SHyon Kim DTYPE_PROCESSOR, "Processor Device",
1119e86db79SHyon Kim DTYPE_WORM, "WORM Device",
1129e86db79SHyon Kim DTYPE_RODIRECT, "CD/DVD Device",
1139e86db79SHyon Kim DTYPE_SCANNER, "Scanner Device",
1149e86db79SHyon Kim DTYPE_OPTICAL, "Optical Memory Device",
1159e86db79SHyon Kim DTYPE_CHANGER, "Medium Changer Device",
1169e86db79SHyon Kim DTYPE_COMM, "Communications Device",
1179e86db79SHyon Kim DTYPE_ARRAY_CTRL, "Storage Array Controller Device",
1189e86db79SHyon Kim DTYPE_ESI, "Enclosure Services Device",
1199e86db79SHyon Kim DTYPE_RBC, "Simplified Direct-access Device",
1209e86db79SHyon Kim DTYPE_OCRW, "Optical Card Reader/Writer Device",
1219e86db79SHyon Kim DTYPE_BCC, "Bridge Controller Commands",
1229e86db79SHyon Kim DTYPE_OSD, "Object-based Storage Device",
1239e86db79SHyon Kim DTYPE_ADC, "Automation/Drive Interface",
1249e86db79SHyon Kim DTYPE_WELLKNOWN, "Well Known Logical Unit",
1259e86db79SHyon Kim DTYPE_UNKNOWN, "Unknown Device",
1269e86db79SHyon Kim -1, NULL
1279e86db79SHyon Kim };
1289e86db79SHyon Kim
1299e86db79SHyon Kim static char *getPhyStateString(HBA_UINT32 key, phystat_type phyt);
1309e86db79SHyon Kim
1319e86db79SHyon Kim char *
getIndentSpaces(int number)1329e86db79SHyon Kim getIndentSpaces(int number)
1339e86db79SHyon Kim {
1349e86db79SHyon Kim int i = 0;
1359e86db79SHyon Kim /* the maximum indent with terminator '\0' */
1369e86db79SHyon Kim static char ret[MAXINDENT+1];
1379e86db79SHyon Kim
1389e86db79SHyon Kim if (number > MAXINDENT)
1399e86db79SHyon Kim number = MAXINDENT;
1409e86db79SHyon Kim
1419e86db79SHyon Kim for (i = 0; i < number; i++) {
1429e86db79SHyon Kim ret[i] = ' ';
1439e86db79SHyon Kim }
1449e86db79SHyon Kim ret[i] = '\0';
1459e86db79SHyon Kim return (ret);
1469e86db79SHyon Kim }
1479e86db79SHyon Kim
1489e86db79SHyon Kim char *
getStateString(HBA_UINT32 key,SAS_STATE * stat_string)1499e86db79SHyon Kim getStateString(HBA_UINT32 key, SAS_STATE *stat_string)
1509e86db79SHyon Kim {
1519e86db79SHyon Kim static char ret[64];
1529e86db79SHyon Kim while (stat_string->key != -1) {
1539e86db79SHyon Kim if (stat_string->key == key) {
1549e86db79SHyon Kim return ((char *)stat_string->value);
1559e86db79SHyon Kim }
1569e86db79SHyon Kim stat_string++;
1579e86db79SHyon Kim }
158*b172429eSMarco van Wieringen (void) sprintf(ret, "Undefined value (%d)", key);
1599e86db79SHyon Kim return (ret);
1609e86db79SHyon Kim }
1619e86db79SHyon Kim
1629e86db79SHyon Kim static char *
getPhyStateString(HBA_UINT32 key,phystat_type phyt)1639e86db79SHyon Kim getPhyStateString(HBA_UINT32 key, phystat_type phyt)
1649e86db79SHyon Kim {
1659e86db79SHyon Kim int i = 0, len = 0, match = 0;
1669e86db79SHyon Kim HBA_UINT32 physpeed[] = {
1679e86db79SHyon Kim HBA_SASSPEED_1_5GBIT,
1689e86db79SHyon Kim HBA_SASSPEED_3GBIT,
16962877672SHans Rosenfeld HBA_SASSPEED_6GBIT,
17062877672SHans Rosenfeld HBA_SASSPEED_12GBIT
1719e86db79SHyon Kim };
1729e86db79SHyon Kim
1739e86db79SHyon Kim len = sizeof (physpeed) / sizeof (HBA_UINT32);
1749e86db79SHyon Kim for (i = 0; i < len; i++) {
1759e86db79SHyon Kim if (key == physpeed[i]) {
1769e86db79SHyon Kim match = 1;
1779e86db79SHyon Kim break;
1789e86db79SHyon Kim }
1799e86db79SHyon Kim }
1809e86db79SHyon Kim
1819e86db79SHyon Kim if (match == 1) {
1829e86db79SHyon Kim if (phyt == PHY_STATE)
1839e86db79SHyon Kim return ("enabled");
1849e86db79SHyon Kim else
1859e86db79SHyon Kim return (getStateString(key, phystate_string));
1869e86db79SHyon Kim } else {
1879e86db79SHyon Kim if (phyt == PHY_STATE)
1889e86db79SHyon Kim return (getStateString(key, phystate_string));
1899e86db79SHyon Kim else
1909e86db79SHyon Kim return ("not available");
1919e86db79SHyon Kim }
1929e86db79SHyon Kim }
1939e86db79SHyon Kim
1949e86db79SHyon Kim char *
getHBAStatus(HBA_STATUS key)1959e86db79SHyon Kim getHBAStatus(HBA_STATUS key)
1969e86db79SHyon Kim {
1979e86db79SHyon Kim return (getStateString(key, hbastatus_string));
1989e86db79SHyon Kim }
1999e86db79SHyon Kim
2009e86db79SHyon Kim /*
2019e86db79SHyon Kim * return device type description
2029e86db79SHyon Kim *
2039e86db79SHyon Kim * Arguments:
2049e86db79SHyon Kim * dType - Device type returned from Standard INQUIRY
2059e86db79SHyon Kim * Returns:
2069e86db79SHyon Kim * char string description for device type
2079e86db79SHyon Kim */
2089e86db79SHyon Kim char *
getDTypeString(uchar_t dType)2099e86db79SHyon Kim getDTypeString(uchar_t dType)
2109e86db79SHyon Kim {
2119e86db79SHyon Kim return (getStateString((dType & DTYPE_MASK), dtype_string));
2129e86db79SHyon Kim }
2139e86db79SHyon Kim
2149e86db79SHyon Kim uint64_t
wwnConversion(uchar_t * wwn)2159e86db79SHyon Kim wwnConversion(uchar_t *wwn)
2169e86db79SHyon Kim {
2179e86db79SHyon Kim uint64_t tmp;
218*b172429eSMarco van Wieringen (void) memcpy(&tmp, wwn, sizeof (uint64_t));
2199e86db79SHyon Kim return (ntohll(tmp));
2209e86db79SHyon Kim }
2219e86db79SHyon Kim
2229e86db79SHyon Kim /*
2239e86db79SHyon Kim * prints out HBA information
2249e86db79SHyon Kim */
2259e86db79SHyon Kim void
printHBAInfo(SMHBA_ADAPTERATTRIBUTES * attrs,int pflag,int numberOfPorts,const char * adapterName)2269e86db79SHyon Kim printHBAInfo(SMHBA_ADAPTERATTRIBUTES *attrs, int pflag, int numberOfPorts,
2279e86db79SHyon Kim const char *adapterName)
2289e86db79SHyon Kim {
2299e86db79SHyon Kim
230*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s %s\n", "HBA Name:", adapterName);
2319e86db79SHyon Kim
2329e86db79SHyon Kim if (pflag & PRINT_VERBOSE) {
233*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s%s %s\n",
2349e86db79SHyon Kim getIndentSpaces(4), "Manufacturer:",
2359e86db79SHyon Kim attrs->Manufacturer[0] == 0?
2369e86db79SHyon Kim "not available":attrs->Manufacturer);
237*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s%s %s\n",
2389e86db79SHyon Kim getIndentSpaces(4), "Model: ",
2399e86db79SHyon Kim attrs->Model[0] == 0? "not available":attrs->Model);
240*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s%s %s\n",
2419e86db79SHyon Kim getIndentSpaces(4),
2429e86db79SHyon Kim "Firmware Version:",
2439e86db79SHyon Kim attrs->FirmwareVersion[0] == 0? "not available":
2449e86db79SHyon Kim attrs->FirmwareVersion);
245*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s%s %s\n",
2469e86db79SHyon Kim getIndentSpaces(4),
2479e86db79SHyon Kim "FCode/BIOS Version:",
2489e86db79SHyon Kim attrs->OptionROMVersion[0] == 0? "not available":
2499e86db79SHyon Kim attrs->OptionROMVersion);
250*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s%s %s\n",
2519e86db79SHyon Kim getIndentSpaces(4),
2529e86db79SHyon Kim "Serial Number:",
2539e86db79SHyon Kim attrs->SerialNumber[0] == 0? "not available":
2549e86db79SHyon Kim attrs->SerialNumber);
255*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s%s %s\n",
2569e86db79SHyon Kim getIndentSpaces(4),
2579e86db79SHyon Kim "Driver Name:",
2589e86db79SHyon Kim attrs->DriverName[0] == 0? "not available":
2599e86db79SHyon Kim attrs->DriverName);
260*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s%s %s\n",
2619e86db79SHyon Kim getIndentSpaces(4),
2629e86db79SHyon Kim "Driver Version:",
2639e86db79SHyon Kim attrs->DriverVersion[0] == 0? "not available":
2649e86db79SHyon Kim attrs->DriverVersion);
265*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s%s %d\n",
2669e86db79SHyon Kim getIndentSpaces(4),
2679e86db79SHyon Kim "Number of HBA Ports:",
2689e86db79SHyon Kim numberOfPorts);
2699e86db79SHyon Kim }
2709e86db79SHyon Kim }
2719e86db79SHyon Kim
2729e86db79SHyon Kim /*
2739e86db79SHyon Kim * prints out all the HBA port information
2749e86db79SHyon Kim */
2759e86db79SHyon Kim void
printHBAPortInfo(SMHBA_PORTATTRIBUTES * port,SMHBA_ADAPTERATTRIBUTES * attrs,int pflag)2769e86db79SHyon Kim printHBAPortInfo(SMHBA_PORTATTRIBUTES *port,
2779e86db79SHyon Kim SMHBA_ADAPTERATTRIBUTES *attrs, int pflag) {
2789e86db79SHyon Kim
2799e86db79SHyon Kim if ((port == NULL) || (attrs == NULL)) {
2809e86db79SHyon Kim return;
2819e86db79SHyon Kim }
2829e86db79SHyon Kim
283*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s%s %s\n",
2849e86db79SHyon Kim getIndentSpaces(2),
2859e86db79SHyon Kim "HBA Port Name:",
2869e86db79SHyon Kim port->OSDeviceName);
2879e86db79SHyon Kim
2889e86db79SHyon Kim if (!(pflag & PRINT_VERBOSE)) {
2899e86db79SHyon Kim return;
2909e86db79SHyon Kim }
2919e86db79SHyon Kim
2929e86db79SHyon Kim if (port->PortType != HBA_PORTTYPE_SASDEVICE)
2939e86db79SHyon Kim return;
2949e86db79SHyon Kim
295*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s%s %s\n",
2969e86db79SHyon Kim getIndentSpaces(4),
2979e86db79SHyon Kim "Type:",
2989e86db79SHyon Kim getStateString(port->PortType, porttype_string));
299*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s%s %s\n",
3009e86db79SHyon Kim getIndentSpaces(4),
3019e86db79SHyon Kim "State:",
3029e86db79SHyon Kim getStateString(port->PortState, portstate_string));
3039e86db79SHyon Kim
304*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s%s %016llx\n",
3059e86db79SHyon Kim getIndentSpaces(4),
3069e86db79SHyon Kim "Local SAS Address:",
3079e86db79SHyon Kim wwnConversion(port->PortSpecificAttribute.SASPort->\
3089e86db79SHyon Kim LocalSASAddress.wwn));
3099e86db79SHyon Kim
310*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s%s %016llx\n",
3119e86db79SHyon Kim getIndentSpaces(4),
3129e86db79SHyon Kim "Attached SAS Address:",
3139e86db79SHyon Kim wwnConversion(port->PortSpecificAttribute.SASPort->\
3149e86db79SHyon Kim AttachedSASAddress.wwn));
3159e86db79SHyon Kim
316*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s%s %d\n",
3179e86db79SHyon Kim getIndentSpaces(4),
3189e86db79SHyon Kim "Number of Phys:",
3199e86db79SHyon Kim port->PortSpecificAttribute.SASPort->NumberofPhys);
3209e86db79SHyon Kim }
3219e86db79SHyon Kim
3229e86db79SHyon Kim void
printHBAPortPhyInfo(SMHBA_SAS_PHY * phyinfo)3239e86db79SHyon Kim printHBAPortPhyInfo(SMHBA_SAS_PHY *phyinfo)
3249e86db79SHyon Kim {
3259e86db79SHyon Kim if (phyinfo == NULL)
3269e86db79SHyon Kim return;
3279e86db79SHyon Kim
328*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s%s %u\n",
3299e86db79SHyon Kim getIndentSpaces(6),
3309e86db79SHyon Kim "Identifier:",
3319e86db79SHyon Kim phyinfo->PhyIdentifier);
3329e86db79SHyon Kim
333*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s%s %s\n",
3349e86db79SHyon Kim getIndentSpaces(8),
3359e86db79SHyon Kim "State: ",
3369e86db79SHyon Kim getPhyStateString(phyinfo->NegotiatedLinkRate, PHY_STATE));
337*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s%s %s/%s\n",
3389e86db79SHyon Kim getIndentSpaces(8),
3399e86db79SHyon Kim "HardwareLinkRate(Min/Max):",
3409e86db79SHyon Kim getPhyStateString(phyinfo->HardwareMinLinkRate, PHY_SPEED),
3419e86db79SHyon Kim getPhyStateString(phyinfo->HardwareMaxLinkRate, PHY_SPEED));
342*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s%s %s/%s\n",
3439e86db79SHyon Kim getIndentSpaces(8),
3449e86db79SHyon Kim "ProgrammedLinkRate(Min/Max):",
3459e86db79SHyon Kim getPhyStateString(phyinfo->ProgrammedMinLinkRate, PHY_SPEED),
3469e86db79SHyon Kim getPhyStateString(phyinfo->ProgrammedMaxLinkRate, PHY_SPEED));
347*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s%s %s\n",
3489e86db79SHyon Kim getIndentSpaces(8),
3499e86db79SHyon Kim "NegotiatedLinkRate:",
3509e86db79SHyon Kim getPhyStateString(phyinfo->NegotiatedLinkRate, PHY_SPEED));
3519e86db79SHyon Kim }
3529e86db79SHyon Kim
3539e86db79SHyon Kim void
printHBAPortPhyStatistics(SMHBA_SASPHYSTATISTICS * phystat)3549e86db79SHyon Kim printHBAPortPhyStatistics(SMHBA_SASPHYSTATISTICS *phystat)
3559e86db79SHyon Kim {
3569e86db79SHyon Kim if (phystat == NULL)
3579e86db79SHyon Kim return;
3589e86db79SHyon Kim
359*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s%s\n",
3609e86db79SHyon Kim getIndentSpaces(8),
3619e86db79SHyon Kim "Link Error Statistics:");
362*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s%s %llu\n",
3639e86db79SHyon Kim getIndentSpaces(12),
3649e86db79SHyon Kim "Invalid Dword:",
3659e86db79SHyon Kim phystat->InvalidDwordCount);
366*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s%s %llu\n",
3679e86db79SHyon Kim getIndentSpaces(12),
3689e86db79SHyon Kim "Running Disparity Error:",
3699e86db79SHyon Kim phystat->RunningDisparityErrorCount);
370*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s%s %llu\n",
3719e86db79SHyon Kim getIndentSpaces(12),
3729e86db79SHyon Kim "Loss of Dword Sync:",
3739e86db79SHyon Kim phystat->LossofDwordSyncCount);
374*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s%s %llu\n",
3759e86db79SHyon Kim getIndentSpaces(12),
3769e86db79SHyon Kim "Reset Problem:",
3779e86db79SHyon Kim phystat->PhyResetProblemCount);
3789e86db79SHyon Kim }
3799e86db79SHyon Kim
3809e86db79SHyon Kim /*
3819e86db79SHyon Kim * print the OS device name for the logical-unit object
3829e86db79SHyon Kim *
3839e86db79SHyon Kim * Arguments:
3849e86db79SHyon Kim * devListWalk - OS device path info
3859e86db79SHyon Kim * verbose - boolean indicating whether to display additional info
3869e86db79SHyon Kim *
3879e86db79SHyon Kim * returns:
3889e86db79SHyon Kim * 0 - we're good.
3899e86db79SHyon Kim * >0 - we met issues.
3909e86db79SHyon Kim */
3919e86db79SHyon Kim int
printTargetPortInfo(targetPortList_t * TPListWalk,int pflag)3929e86db79SHyon Kim printTargetPortInfo(targetPortList_t *TPListWalk, int pflag)
3939e86db79SHyon Kim {
3949e86db79SHyon Kim targetPortConfig_t *configList;
3959e86db79SHyon Kim targetPortMappingData_t *mapList;
3969e86db79SHyon Kim int count, i;
3979e86db79SHyon Kim int ret = 0;
3989e86db79SHyon Kim
399*b172429eSMarco van Wieringen (void) fprintf(stdout, "Target Port SAS Address: %016llx\n",
4009e86db79SHyon Kim wwnConversion(TPListWalk->sasattr.LocalSASAddress.wwn));
4019e86db79SHyon Kim if ((pflag & PRINT_VERBOSE) || (pflag & PRINT_TARGET_SCSI)) {
402*b172429eSMarco van Wieringen (void) fprintf(stdout, "%sType: %s\n", getIndentSpaces(4),
4039e86db79SHyon Kim getStateString(TPListWalk->targetattr.PortType,
4049e86db79SHyon Kim porttype_string));
4059e86db79SHyon Kim for (configList = TPListWalk->configEntry;
4069e86db79SHyon Kim configList != NULL; configList = configList->next) {
407*b172429eSMarco van Wieringen (void) fprintf(stdout, "%sHBA Port Name: %s\n",
4089e86db79SHyon Kim getIndentSpaces(4), configList->hbaPortName);
4099e86db79SHyon Kim if (wwnConversion(configList->expanderSASAddr.wwn) !=
4109e86db79SHyon Kim 0) {
4119e86db79SHyon Kim if (configList->expanderValid) {
412*b172429eSMarco van Wieringen (void) fprintf(stdout,
4139e86db79SHyon Kim "%sExpander Device SAS Address:"
4149e86db79SHyon Kim " %016llx",
4159e86db79SHyon Kim getIndentSpaces(8),
4169e86db79SHyon Kim wwnConversion(configList->
4179e86db79SHyon Kim expanderSASAddr.wwn));
4189e86db79SHyon Kim } else {
419*b172429eSMarco van Wieringen (void) fprintf(stdout,
4209e86db79SHyon Kim "%sExpander Device SAS Address:"
4219e86db79SHyon Kim " %016llx (Failed to Validate"
4229e86db79SHyon Kim " Attached Port.)",
4239e86db79SHyon Kim getIndentSpaces(8),
4249e86db79SHyon Kim wwnConversion(configList->
4259e86db79SHyon Kim expanderSASAddr.wwn));
4269e86db79SHyon Kim ret++;
4279e86db79SHyon Kim }
4289e86db79SHyon Kim } else {
4299e86db79SHyon Kim if (configList->expanderValid) {
430*b172429eSMarco van Wieringen (void) fprintf(stdout,
4319e86db79SHyon Kim "%sExpander Device SAS Address: %s",
4329e86db79SHyon Kim getIndentSpaces(8),
4339e86db79SHyon Kim "None (direct attached)");
4349e86db79SHyon Kim } else {
435*b172429eSMarco van Wieringen (void) fprintf(stdout,
4369e86db79SHyon Kim "%sExpander Device SAS Address: %s",
4379e86db79SHyon Kim getIndentSpaces(8),
4389e86db79SHyon Kim "None (Failed to Get"
4399e86db79SHyon Kim " Attached Port)");
4409e86db79SHyon Kim }
4419e86db79SHyon Kim }
442*b172429eSMarco van Wieringen (void) fprintf(stdout, "\n");
4439e86db79SHyon Kim if (pflag & PRINT_TARGET_SCSI) {
4449e86db79SHyon Kim
4459e86db79SHyon Kim if (configList->reportLUNsFailed) {
446*b172429eSMarco van Wieringen (void) fprintf(stdout,
4479e86db79SHyon Kim "%s %016llx\n",
4489e86db79SHyon Kim gettext("Error: Failed to get "
4499e86db79SHyon Kim "ReportLun Data on"),
4509e86db79SHyon Kim wwnConversion(TPListWalk->
4519e86db79SHyon Kim sasattr.LocalSASAddress.wwn));
4529e86db79SHyon Kim ret++;
4539e86db79SHyon Kim continue;
4549e86db79SHyon Kim }
4559e86db79SHyon Kim
4569e86db79SHyon Kim for (mapList = configList->map;
4579e86db79SHyon Kim mapList != NULL; mapList = mapList->next) {
458*b172429eSMarco van Wieringen (void) fprintf(stdout, "%sLUN : %d\n",
4599e86db79SHyon Kim getIndentSpaces(12),
4609e86db79SHyon Kim mapList->osLUN);
4619e86db79SHyon Kim if (mapList->mappingExist) {
462*b172429eSMarco van Wieringen (void) fprintf(stdout,
4639e86db79SHyon Kim "%sOS Device Name : %s\n",
4649e86db79SHyon Kim getIndentSpaces(14),
4659e86db79SHyon Kim (mapList->osDeviceName[0] ==
4669e86db79SHyon Kim '\0') ? "Not avaialble" :
4679e86db79SHyon Kim mapList->osDeviceName);
4689e86db79SHyon Kim } else {
469*b172429eSMarco van Wieringen (void) fprintf(stdout,
4709e86db79SHyon Kim "%sOS Device Name : %s\n",
4719e86db79SHyon Kim getIndentSpaces(14), "No "
4729e86db79SHyon Kim "matching OS Device "
4739e86db79SHyon Kim "found.");
4749e86db79SHyon Kim ret++;
4759e86db79SHyon Kim }
4769e86db79SHyon Kim /* indentation changed here */
4779e86db79SHyon Kim if (mapList->inquiryFailed) {
478*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s %s LUN %d\n",
4799e86db79SHyon Kim gettext("Error: Failed to get Inquiry Data on"),
4809e86db79SHyon Kim mapList->osDeviceName, mapList->osLUN);
4819e86db79SHyon Kim ret++;
4829e86db79SHyon Kim } else {
483*b172429eSMarco van Wieringen (void) fprintf(stdout, "%sVendor: ",
4849e86db79SHyon Kim getIndentSpaces(14));
4859e86db79SHyon Kim for (count = sizeof (mapList->inq_vid), i = 0;
4869e86db79SHyon Kim i < count; i++) {
4879e86db79SHyon Kim if (isprint(mapList->inq_vid[i]))
488*b172429eSMarco van Wieringen (void) fprintf(stdout, "%c",
4899e86db79SHyon Kim mapList->inq_vid[i]);
4909e86db79SHyon Kim }
4919e86db79SHyon Kim
492*b172429eSMarco van Wieringen (void) fprintf(stdout, "\n%sProduct: ",
4939e86db79SHyon Kim getIndentSpaces(14));
4949e86db79SHyon Kim for (count = sizeof (mapList->inq_pid), i = 0;
4959e86db79SHyon Kim i < count; i++) {
4969e86db79SHyon Kim if (isprint(mapList->inq_pid[i]))
497*b172429eSMarco van Wieringen (void) fprintf(stdout, "%c",
4989e86db79SHyon Kim mapList->inq_pid[i]);
4999e86db79SHyon Kim }
5009e86db79SHyon Kim
501*b172429eSMarco van Wieringen (void) fprintf(stdout, "\n%sDevice Type: %s\n",
5029e86db79SHyon Kim getIndentSpaces(14),
5039e86db79SHyon Kim getDTypeString(mapList->inq_dtype));
5049e86db79SHyon Kim }
5059e86db79SHyon Kim /* indentation changed back */
5069e86db79SHyon Kim }
5079e86db79SHyon Kim }
5089e86db79SHyon Kim }
5099e86db79SHyon Kim }
5109e86db79SHyon Kim return (ret);
5119e86db79SHyon Kim }
5129e86db79SHyon Kim
5139e86db79SHyon Kim /*
5149e86db79SHyon Kim * print the OS device name for the logical-unit object
5159e86db79SHyon Kim *
5169e86db79SHyon Kim * Arguments:
5179e86db79SHyon Kim * devListWalk - OS device path info
5189e86db79SHyon Kim * verbose - boolean indicating whether to display additional info
5199e86db79SHyon Kim *
5209e86db79SHyon Kim * returns:
5219e86db79SHyon Kim * 0 - we're good.
5229e86db79SHyon Kim * >0 - we met issues.
5239e86db79SHyon Kim */
5249e86db79SHyon Kim int
printOSDeviceNameInfo(discoveredDevice * devListWalk,boolean_t verbose)5259e86db79SHyon Kim printOSDeviceNameInfo(discoveredDevice *devListWalk, boolean_t verbose)
5269e86db79SHyon Kim {
5279e86db79SHyon Kim portList *portElem;
5289e86db79SHyon Kim tgtPortWWNList *tgtWWNList;
5299e86db79SHyon Kim int i, count;
5309e86db79SHyon Kim int ret = 0;
5319e86db79SHyon Kim
532*b172429eSMarco van Wieringen (void) fprintf(stdout, "OS Device Name: %s\n",
5339e86db79SHyon Kim devListWalk->OSDeviceName);
5349e86db79SHyon Kim if (verbose == B_TRUE) {
5359e86db79SHyon Kim for (portElem = devListWalk->HBAPortList;
5369e86db79SHyon Kim portElem != NULL; portElem = portElem->next) {
537*b172429eSMarco van Wieringen (void) fprintf(stdout, "%sHBA Port Name: ",
5389e86db79SHyon Kim getIndentSpaces(4));
539*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s", portElem->portName);
5409e86db79SHyon Kim for (tgtWWNList = portElem->tgtPortWWN;
5419e86db79SHyon Kim tgtWWNList != NULL; tgtWWNList = tgtWWNList->next) {
542*b172429eSMarco van Wieringen (void) fprintf(stdout,
5439e86db79SHyon Kim "\n%sTarget Port SAS Address: ",
5449e86db79SHyon Kim getIndentSpaces(8));
545*b172429eSMarco van Wieringen (void) fprintf(stdout, "%016llx",
5469e86db79SHyon Kim wwnConversion(tgtWWNList->portWWN.wwn));
547*b172429eSMarco van Wieringen (void) fprintf(stdout, "\n%sLUN: %u",
5489e86db79SHyon Kim getIndentSpaces(12),
5499e86db79SHyon Kim tgtWWNList->scsiOSLun);
5509e86db79SHyon Kim }
551*b172429eSMarco van Wieringen (void) fprintf(stdout, "\n");
5529e86db79SHyon Kim }
5539e86db79SHyon Kim
5549e86db79SHyon Kim if (devListWalk->inquiryFailed) {
555*b172429eSMarco van Wieringen (void) fprintf(stdout, "%s %s\n",
5569e86db79SHyon Kim gettext("Error: Failed to get Inquiry data "
5579e86db79SHyon Kim "on device"), devListWalk->OSDeviceName);
5589e86db79SHyon Kim ret++;
5599e86db79SHyon Kim } else {
560*b172429eSMarco van Wieringen (void) fprintf(stdout, "%sVendor: ",
5619e86db79SHyon Kim getIndentSpaces(4));
5629e86db79SHyon Kim for (count = sizeof (devListWalk->VID), i = 0;
5639e86db79SHyon Kim i < count; i++) {
5649e86db79SHyon Kim if (isprint(devListWalk->VID[i]))
565*b172429eSMarco van Wieringen (void) fprintf(stdout, "%c",
5669e86db79SHyon Kim devListWalk->VID[i]);
5679e86db79SHyon Kim }
5689e86db79SHyon Kim
569*b172429eSMarco van Wieringen (void) fprintf(stdout, "\n%sProduct: ",
5709e86db79SHyon Kim getIndentSpaces(4));
5719e86db79SHyon Kim for (count = sizeof (devListWalk->PID), i = 0;
5729e86db79SHyon Kim i < count; i++) {
5739e86db79SHyon Kim if (isprint(devListWalk->PID[i]))
574*b172429eSMarco van Wieringen (void) fprintf(stdout, "%c",
5759e86db79SHyon Kim devListWalk->PID[i]);
5769e86db79SHyon Kim }
5779e86db79SHyon Kim
578*b172429eSMarco van Wieringen (void) fprintf(stdout, "\n%sDevice Type: %s\n",
5799e86db79SHyon Kim getIndentSpaces(4),
5809e86db79SHyon Kim getDTypeString(devListWalk->dType));
5819e86db79SHyon Kim }
5829e86db79SHyon Kim }
5839e86db79SHyon Kim return (ret);
5849e86db79SHyon Kim }
585