xref: /illumos-gate/usr/src/cmd/sasinfo/printAttrs.c (revision b172429eb7fa68712e018d8965b6d0c7f6779f9e)
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