1*9e86db79SHyon Kim /*
2*9e86db79SHyon Kim * CDDL HEADER START
3*9e86db79SHyon Kim *
4*9e86db79SHyon Kim * The contents of this file are subject to the terms of the
5*9e86db79SHyon Kim * Common Development and Distribution License (the "License").
6*9e86db79SHyon Kim * You may not use this file except in compliance with the License.
7*9e86db79SHyon Kim *
8*9e86db79SHyon Kim * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*9e86db79SHyon Kim * or http://www.opensolaris.org/os/licensing.
10*9e86db79SHyon Kim * See the License for the specific language governing permissions
11*9e86db79SHyon Kim * and limitations under the License.
12*9e86db79SHyon Kim *
13*9e86db79SHyon Kim * When distributing Covered Code, include this CDDL HEADER in each
14*9e86db79SHyon Kim * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*9e86db79SHyon Kim * If applicable, add the following below this CDDL HEADER, with the
16*9e86db79SHyon Kim * fields enclosed by brackets "[]" replaced with your own identifying
17*9e86db79SHyon Kim * information: Portions Copyright [yyyy] [name of copyright owner]
18*9e86db79SHyon Kim *
19*9e86db79SHyon Kim * CDDL HEADER END
20*9e86db79SHyon Kim */
21*9e86db79SHyon Kim /*
22*9e86db79SHyon Kim * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
23*9e86db79SHyon Kim * Use is subject to license terms.
24*9e86db79SHyon Kim */
25*9e86db79SHyon Kim
26*9e86db79SHyon Kim #include <ctype.h>
27*9e86db79SHyon Kim #include <printAttrs.h>
28*9e86db79SHyon Kim
29*9e86db79SHyon Kim static SAS_STATE hbastatus_string[] = {
30*9e86db79SHyon Kim HBA_STATUS_OK, "Okay",
31*9e86db79SHyon Kim HBA_STATUS_ERROR, "Error",
32*9e86db79SHyon Kim HBA_STATUS_ERROR_NOT_SUPPORTED, "Not Supported",
33*9e86db79SHyon Kim HBA_STATUS_ERROR_INVALID_HANDLE, "Invalid Handle",
34*9e86db79SHyon Kim HBA_STATUS_ERROR_ARG, "Argument Error",
35*9e86db79SHyon Kim HBA_STATUS_ERROR_ILLEGAL_WWN, "Illegal WWN",
36*9e86db79SHyon Kim HBA_STATUS_ERROR_ILLEGAL_INDEX, "Illegal Index",
37*9e86db79SHyon Kim HBA_STATUS_ERROR_MORE_DATA, "Not Enough Buffer for Data",
38*9e86db79SHyon Kim HBA_STATUS_ERROR_STALE_DATA, "Stale Data",
39*9e86db79SHyon Kim HBA_STATUS_SCSI_CHECK_CONDITION, "SCSI Check Condition",
40*9e86db79SHyon Kim HBA_STATUS_ERROR_BUSY, "Busy",
41*9e86db79SHyon Kim HBA_STATUS_ERROR_TRY_AGAIN, "Try Again",
42*9e86db79SHyon Kim HBA_STATUS_ERROR_UNAVAILABLE, "Unavailable",
43*9e86db79SHyon Kim HBA_STATUS_ERROR_ELS_REJECT, "ELS Reject",
44*9e86db79SHyon Kim HBA_STATUS_ERROR_INVALID_LUN, "Invalid LUN",
45*9e86db79SHyon Kim HBA_STATUS_ERROR_INCOMPATIBLE, "Request Incompatible",
46*9e86db79SHyon Kim HBA_STATUS_ERROR_AMBIGUOUS_WWN, "Ambiguous WWN",
47*9e86db79SHyon Kim HBA_STATUS_ERROR_LOCAL_BUS, "Local Bus Error",
48*9e86db79SHyon Kim HBA_STATUS_ERROR_LOCAL_TARGET, "Local Target Error",
49*9e86db79SHyon Kim HBA_STATUS_ERROR_LOCAL_LUN, "Local LUN Error",
50*9e86db79SHyon Kim HBA_STATUS_ERROR_LOCAL_SCSIID_BOUND, "Local SCSIID Bound",
51*9e86db79SHyon Kim HBA_STATUS_ERROR_TARGET_FCID, "Target FCID Error",
52*9e86db79SHyon Kim HBA_STATUS_ERROR_TARGET_NODE_WWN, "Target Node WWN Error",
53*9e86db79SHyon Kim HBA_STATUS_ERROR_TARGET_PORT_WWN, "Target Port WWN Error",
54*9e86db79SHyon Kim HBA_STATUS_ERROR_TARGET_LUN, "Target LUN Error",
55*9e86db79SHyon Kim HBA_STATUS_ERROR_TARGET_LUID, "Target LUID Error",
56*9e86db79SHyon Kim HBA_STATUS_ERROR_NO_SUCH_BINDING, "No Such Binding",
57*9e86db79SHyon Kim HBA_STATUS_ERROR_NOT_A_TARGET, "Not a Target",
58*9e86db79SHyon Kim HBA_STATUS_ERROR_UNSUPPORTED_FC4, "Unsupported FC4",
59*9e86db79SHyon Kim HBA_STATUS_ERROR_INCAPABLE, "Incapable",
60*9e86db79SHyon Kim HBA_STATUS_ERROR_TARGET_BUSY, "Target Busy",
61*9e86db79SHyon Kim HBA_STATUS_ERROR_NOT_LOADED, "Not Loaded",
62*9e86db79SHyon Kim HBA_STATUS_ERROR_ALREADY_LOADED, "Alreday Loaded",
63*9e86db79SHyon Kim HBA_STATUS_ERROR_ILLEGAL_FCID, "Illegal FCID",
64*9e86db79SHyon Kim HBA_STATUS_ERROR_NOT_ASCSIDEVICE, "Not a SCSI Device",
65*9e86db79SHyon Kim HBA_STATUS_ERROR_INVALID_PROTOCOL_TYPE, "Invalid Protocol Type",
66*9e86db79SHyon Kim HBA_STATUS_ERROR_BAD_EVENT_TYPE, "Bad Event Type",
67*9e86db79SHyon Kim -1, NULL
68*9e86db79SHyon Kim };
69*9e86db79SHyon Kim
70*9e86db79SHyon Kim SAS_STATE porttype_string[] = {
71*9e86db79SHyon Kim HBA_PORTTYPE_UNKNOWN, "UNKNOWN",
72*9e86db79SHyon Kim HBA_PORTTYPE_OTHER, "OTHER",
73*9e86db79SHyon Kim HBA_PORTTYPE_NOTPRESENT, "NOT Present",
74*9e86db79SHyon Kim HBA_PORTTYPE_SASDEVICE, "SAS Device",
75*9e86db79SHyon Kim HBA_PORTTYPE_SATADEVICE, "SATA Device",
76*9e86db79SHyon Kim HBA_PORTTYPE_SASEXPANDER, "SAS Expander",
77*9e86db79SHyon Kim -1, NULL,
78*9e86db79SHyon Kim };
79*9e86db79SHyon Kim
80*9e86db79SHyon Kim SAS_STATE portstate_string[] = {
81*9e86db79SHyon Kim HBA_PORTSTATE_UNKNOWN, "unknown",
82*9e86db79SHyon Kim HBA_PORTSTATE_ONLINE, "online",
83*9e86db79SHyon Kim HBA_PORTSTATE_OFFLINE, "offline",
84*9e86db79SHyon Kim HBA_PORTSTATE_BYPASSED, "bypassed",
85*9e86db79SHyon Kim HBA_PORTSTATE_DIAGNOSTICS, "diagnostics",
86*9e86db79SHyon Kim HBA_PORTSTATE_LINKDOWN, "link Down",
87*9e86db79SHyon Kim HBA_PORTSTATE_ERROR, "port Error",
88*9e86db79SHyon Kim HBA_PORTSTATE_LOOPBACK, "loopback",
89*9e86db79SHyon Kim HBA_PORTSTATE_DEGRADED, "degraded",
90*9e86db79SHyon Kim -1, NULL,
91*9e86db79SHyon Kim };
92*9e86db79SHyon Kim
93*9e86db79SHyon Kim static SAS_STATE phystate_string[] = {
94*9e86db79SHyon Kim HBA_SASSTATE_UNKNOWN, "unknown",
95*9e86db79SHyon Kim HBA_SASSTATE_DISABLED, "disabled",
96*9e86db79SHyon Kim HBA_SASSTATE_FAILED, "failed",
97*9e86db79SHyon Kim HBA_SASSTATE_SATASPINUP, "sata-spinup",
98*9e86db79SHyon Kim HBA_SASSTATE_SATAPORTSEL, "sata-portselector",
99*9e86db79SHyon Kim HBA_SASSPEED_1_5GBIT, "1.5Gbit",
100*9e86db79SHyon Kim HBA_SASSPEED_3GBIT, "3Gbit",
101*9e86db79SHyon Kim HBA_SASSPEED_6GBIT, "6Gbit",
102*9e86db79SHyon Kim -1, NULL,
103*9e86db79SHyon Kim };
104*9e86db79SHyon Kim
105*9e86db79SHyon Kim static SAS_STATE dtype_string[] = {
106*9e86db79SHyon Kim DTYPE_DIRECT, "Disk Device",
107*9e86db79SHyon Kim DTYPE_SEQUENTIAL, "Tape Device",
108*9e86db79SHyon Kim DTYPE_PRINTER, "Printer Device",
109*9e86db79SHyon Kim DTYPE_PROCESSOR, "Processor Device",
110*9e86db79SHyon Kim DTYPE_WORM, "WORM Device",
111*9e86db79SHyon Kim DTYPE_RODIRECT, "CD/DVD Device",
112*9e86db79SHyon Kim DTYPE_SCANNER, "Scanner Device",
113*9e86db79SHyon Kim DTYPE_OPTICAL, "Optical Memory Device",
114*9e86db79SHyon Kim DTYPE_CHANGER, "Medium Changer Device",
115*9e86db79SHyon Kim DTYPE_COMM, "Communications Device",
116*9e86db79SHyon Kim DTYPE_ARRAY_CTRL, "Storage Array Controller Device",
117*9e86db79SHyon Kim DTYPE_ESI, "Enclosure Services Device",
118*9e86db79SHyon Kim DTYPE_RBC, "Simplified Direct-access Device",
119*9e86db79SHyon Kim DTYPE_OCRW, "Optical Card Reader/Writer Device",
120*9e86db79SHyon Kim DTYPE_BCC, "Bridge Controller Commands",
121*9e86db79SHyon Kim DTYPE_OSD, "Object-based Storage Device",
122*9e86db79SHyon Kim DTYPE_ADC, "Automation/Drive Interface",
123*9e86db79SHyon Kim DTYPE_WELLKNOWN, "Well Known Logical Unit",
124*9e86db79SHyon Kim DTYPE_UNKNOWN, "Unknown Device",
125*9e86db79SHyon Kim -1, NULL
126*9e86db79SHyon Kim };
127*9e86db79SHyon Kim
128*9e86db79SHyon Kim static char *getPhyStateString(HBA_UINT32 key, phystat_type phyt);
129*9e86db79SHyon Kim
130*9e86db79SHyon Kim char *
getIndentSpaces(int number)131*9e86db79SHyon Kim getIndentSpaces(int number)
132*9e86db79SHyon Kim {
133*9e86db79SHyon Kim int i = 0;
134*9e86db79SHyon Kim /* the maximum indent with terminator '\0' */
135*9e86db79SHyon Kim static char ret[MAXINDENT+1];
136*9e86db79SHyon Kim
137*9e86db79SHyon Kim if (number > MAXINDENT)
138*9e86db79SHyon Kim number = MAXINDENT;
139*9e86db79SHyon Kim
140*9e86db79SHyon Kim for (i = 0; i < number; i++) {
141*9e86db79SHyon Kim ret[i] = ' ';
142*9e86db79SHyon Kim }
143*9e86db79SHyon Kim ret[i] = '\0';
144*9e86db79SHyon Kim return (ret);
145*9e86db79SHyon Kim }
146*9e86db79SHyon Kim
147*9e86db79SHyon Kim char *
getStateString(HBA_UINT32 key,SAS_STATE * stat_string)148*9e86db79SHyon Kim getStateString(HBA_UINT32 key, SAS_STATE *stat_string)
149*9e86db79SHyon Kim {
150*9e86db79SHyon Kim static char ret[64];
151*9e86db79SHyon Kim while (stat_string->key != -1) {
152*9e86db79SHyon Kim if (stat_string->key == key) {
153*9e86db79SHyon Kim return ((char *)stat_string->value);
154*9e86db79SHyon Kim }
155*9e86db79SHyon Kim stat_string++;
156*9e86db79SHyon Kim }
157*9e86db79SHyon Kim (void *) sprintf(ret, "Undefined value (%d)", key);
158*9e86db79SHyon Kim return (ret);
159*9e86db79SHyon Kim }
160*9e86db79SHyon Kim
161*9e86db79SHyon Kim static char *
getPhyStateString(HBA_UINT32 key,phystat_type phyt)162*9e86db79SHyon Kim getPhyStateString(HBA_UINT32 key, phystat_type phyt)
163*9e86db79SHyon Kim {
164*9e86db79SHyon Kim int i = 0, len = 0, match = 0;
165*9e86db79SHyon Kim HBA_UINT32 physpeed[] = {
166*9e86db79SHyon Kim HBA_SASSPEED_1_5GBIT,
167*9e86db79SHyon Kim HBA_SASSPEED_3GBIT,
168*9e86db79SHyon Kim HBA_SASSPEED_6GBIT
169*9e86db79SHyon Kim };
170*9e86db79SHyon Kim
171*9e86db79SHyon Kim len = sizeof (physpeed) / sizeof (HBA_UINT32);
172*9e86db79SHyon Kim for (i = 0; i < len; i++) {
173*9e86db79SHyon Kim if (key == physpeed[i]) {
174*9e86db79SHyon Kim match = 1;
175*9e86db79SHyon Kim break;
176*9e86db79SHyon Kim }
177*9e86db79SHyon Kim }
178*9e86db79SHyon Kim
179*9e86db79SHyon Kim if (match == 1) {
180*9e86db79SHyon Kim if (phyt == PHY_STATE)
181*9e86db79SHyon Kim return ("enabled");
182*9e86db79SHyon Kim else
183*9e86db79SHyon Kim return (getStateString(key, phystate_string));
184*9e86db79SHyon Kim } else {
185*9e86db79SHyon Kim if (phyt == PHY_STATE)
186*9e86db79SHyon Kim return (getStateString(key, phystate_string));
187*9e86db79SHyon Kim else
188*9e86db79SHyon Kim return ("not available");
189*9e86db79SHyon Kim }
190*9e86db79SHyon Kim }
191*9e86db79SHyon Kim
192*9e86db79SHyon Kim char *
getHBAStatus(HBA_STATUS key)193*9e86db79SHyon Kim getHBAStatus(HBA_STATUS key)
194*9e86db79SHyon Kim {
195*9e86db79SHyon Kim return (getStateString(key, hbastatus_string));
196*9e86db79SHyon Kim }
197*9e86db79SHyon Kim
198*9e86db79SHyon Kim /*
199*9e86db79SHyon Kim * return device type description
200*9e86db79SHyon Kim *
201*9e86db79SHyon Kim * Arguments:
202*9e86db79SHyon Kim * dType - Device type returned from Standard INQUIRY
203*9e86db79SHyon Kim * Returns:
204*9e86db79SHyon Kim * char string description for device type
205*9e86db79SHyon Kim */
206*9e86db79SHyon Kim char *
getDTypeString(uchar_t dType)207*9e86db79SHyon Kim getDTypeString(uchar_t dType)
208*9e86db79SHyon Kim {
209*9e86db79SHyon Kim return (getStateString((dType & DTYPE_MASK), dtype_string));
210*9e86db79SHyon Kim }
211*9e86db79SHyon Kim
212*9e86db79SHyon Kim uint64_t
wwnConversion(uchar_t * wwn)213*9e86db79SHyon Kim wwnConversion(uchar_t *wwn)
214*9e86db79SHyon Kim {
215*9e86db79SHyon Kim uint64_t tmp;
216*9e86db79SHyon Kim (void *) memcpy(&tmp, wwn, sizeof (uint64_t));
217*9e86db79SHyon Kim return (ntohll(tmp));
218*9e86db79SHyon Kim }
219*9e86db79SHyon Kim
220*9e86db79SHyon Kim /*
221*9e86db79SHyon Kim * prints out HBA information
222*9e86db79SHyon Kim */
223*9e86db79SHyon Kim void
printHBAInfo(SMHBA_ADAPTERATTRIBUTES * attrs,int pflag,int numberOfPorts,const char * adapterName)224*9e86db79SHyon Kim printHBAInfo(SMHBA_ADAPTERATTRIBUTES *attrs, int pflag, int numberOfPorts,
225*9e86db79SHyon Kim const char *adapterName)
226*9e86db79SHyon Kim {
227*9e86db79SHyon Kim
228*9e86db79SHyon Kim (void *) fprintf(stdout, "%s %s\n", "HBA Name:", adapterName);
229*9e86db79SHyon Kim
230*9e86db79SHyon Kim if (pflag & PRINT_VERBOSE) {
231*9e86db79SHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
232*9e86db79SHyon Kim getIndentSpaces(4), "Manufacturer:",
233*9e86db79SHyon Kim attrs->Manufacturer[0] == 0?
234*9e86db79SHyon Kim "not available":attrs->Manufacturer);
235*9e86db79SHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
236*9e86db79SHyon Kim getIndentSpaces(4), "Model: ",
237*9e86db79SHyon Kim attrs->Model[0] == 0? "not available":attrs->Model);
238*9e86db79SHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
239*9e86db79SHyon Kim getIndentSpaces(4),
240*9e86db79SHyon Kim "Firmware Version:",
241*9e86db79SHyon Kim attrs->FirmwareVersion[0] == 0? "not available":
242*9e86db79SHyon Kim attrs->FirmwareVersion);
243*9e86db79SHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
244*9e86db79SHyon Kim getIndentSpaces(4),
245*9e86db79SHyon Kim "FCode/BIOS Version:",
246*9e86db79SHyon Kim attrs->OptionROMVersion[0] == 0? "not available":
247*9e86db79SHyon Kim attrs->OptionROMVersion);
248*9e86db79SHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
249*9e86db79SHyon Kim getIndentSpaces(4),
250*9e86db79SHyon Kim "Serial Number:",
251*9e86db79SHyon Kim attrs->SerialNumber[0] == 0? "not available":
252*9e86db79SHyon Kim attrs->SerialNumber);
253*9e86db79SHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
254*9e86db79SHyon Kim getIndentSpaces(4),
255*9e86db79SHyon Kim "Driver Name:",
256*9e86db79SHyon Kim attrs->DriverName[0] == 0? "not available":
257*9e86db79SHyon Kim attrs->DriverName);
258*9e86db79SHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
259*9e86db79SHyon Kim getIndentSpaces(4),
260*9e86db79SHyon Kim "Driver Version:",
261*9e86db79SHyon Kim attrs->DriverVersion[0] == 0? "not available":
262*9e86db79SHyon Kim attrs->DriverVersion);
263*9e86db79SHyon Kim (void *) fprintf(stdout, "%s%s %d\n",
264*9e86db79SHyon Kim getIndentSpaces(4),
265*9e86db79SHyon Kim "Number of HBA Ports:",
266*9e86db79SHyon Kim numberOfPorts);
267*9e86db79SHyon Kim }
268*9e86db79SHyon Kim }
269*9e86db79SHyon Kim
270*9e86db79SHyon Kim /*
271*9e86db79SHyon Kim * prints out all the HBA port information
272*9e86db79SHyon Kim */
273*9e86db79SHyon Kim void
printHBAPortInfo(SMHBA_PORTATTRIBUTES * port,SMHBA_ADAPTERATTRIBUTES * attrs,int pflag)274*9e86db79SHyon Kim printHBAPortInfo(SMHBA_PORTATTRIBUTES *port,
275*9e86db79SHyon Kim SMHBA_ADAPTERATTRIBUTES *attrs, int pflag) {
276*9e86db79SHyon Kim
277*9e86db79SHyon Kim if ((port == NULL) || (attrs == NULL)) {
278*9e86db79SHyon Kim return;
279*9e86db79SHyon Kim }
280*9e86db79SHyon Kim
281*9e86db79SHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
282*9e86db79SHyon Kim getIndentSpaces(2),
283*9e86db79SHyon Kim "HBA Port Name:",
284*9e86db79SHyon Kim port->OSDeviceName);
285*9e86db79SHyon Kim
286*9e86db79SHyon Kim if (!(pflag & PRINT_VERBOSE)) {
287*9e86db79SHyon Kim return;
288*9e86db79SHyon Kim }
289*9e86db79SHyon Kim
290*9e86db79SHyon Kim if (port->PortType != HBA_PORTTYPE_SASDEVICE)
291*9e86db79SHyon Kim return;
292*9e86db79SHyon Kim
293*9e86db79SHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
294*9e86db79SHyon Kim getIndentSpaces(4),
295*9e86db79SHyon Kim "Type:",
296*9e86db79SHyon Kim getStateString(port->PortType, porttype_string));
297*9e86db79SHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
298*9e86db79SHyon Kim getIndentSpaces(4),
299*9e86db79SHyon Kim "State:",
300*9e86db79SHyon Kim getStateString(port->PortState, portstate_string));
301*9e86db79SHyon Kim
302*9e86db79SHyon Kim (void *) fprintf(stdout, "%s%s %016llx\n",
303*9e86db79SHyon Kim getIndentSpaces(4),
304*9e86db79SHyon Kim "Local SAS Address:",
305*9e86db79SHyon Kim wwnConversion(port->PortSpecificAttribute.SASPort->\
306*9e86db79SHyon Kim LocalSASAddress.wwn));
307*9e86db79SHyon Kim
308*9e86db79SHyon Kim (void *) fprintf(stdout, "%s%s %016llx\n",
309*9e86db79SHyon Kim getIndentSpaces(4),
310*9e86db79SHyon Kim "Attached SAS Address:",
311*9e86db79SHyon Kim wwnConversion(port->PortSpecificAttribute.SASPort->\
312*9e86db79SHyon Kim AttachedSASAddress.wwn));
313*9e86db79SHyon Kim
314*9e86db79SHyon Kim (void *) fprintf(stdout, "%s%s %d\n",
315*9e86db79SHyon Kim getIndentSpaces(4),
316*9e86db79SHyon Kim "Number of Phys:",
317*9e86db79SHyon Kim port->PortSpecificAttribute.SASPort->NumberofPhys);
318*9e86db79SHyon Kim }
319*9e86db79SHyon Kim
320*9e86db79SHyon Kim void
printHBAPortPhyInfo(SMHBA_SAS_PHY * phyinfo)321*9e86db79SHyon Kim printHBAPortPhyInfo(SMHBA_SAS_PHY *phyinfo)
322*9e86db79SHyon Kim {
323*9e86db79SHyon Kim if (phyinfo == NULL)
324*9e86db79SHyon Kim return;
325*9e86db79SHyon Kim
326*9e86db79SHyon Kim (void *) fprintf(stdout, "%s%s %u\n",
327*9e86db79SHyon Kim getIndentSpaces(6),
328*9e86db79SHyon Kim "Identifier:",
329*9e86db79SHyon Kim phyinfo->PhyIdentifier);
330*9e86db79SHyon Kim
331*9e86db79SHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
332*9e86db79SHyon Kim getIndentSpaces(8),
333*9e86db79SHyon Kim "State: ",
334*9e86db79SHyon Kim getPhyStateString(phyinfo->NegotiatedLinkRate, PHY_STATE));
335*9e86db79SHyon Kim (void *) fprintf(stdout, "%s%s %s/%s\n",
336*9e86db79SHyon Kim getIndentSpaces(8),
337*9e86db79SHyon Kim "HardwareLinkRate(Min/Max):",
338*9e86db79SHyon Kim getPhyStateString(phyinfo->HardwareMinLinkRate, PHY_SPEED),
339*9e86db79SHyon Kim getPhyStateString(phyinfo->HardwareMaxLinkRate, PHY_SPEED));
340*9e86db79SHyon Kim (void *) fprintf(stdout, "%s%s %s/%s\n",
341*9e86db79SHyon Kim getIndentSpaces(8),
342*9e86db79SHyon Kim "ProgrammedLinkRate(Min/Max):",
343*9e86db79SHyon Kim getPhyStateString(phyinfo->ProgrammedMinLinkRate, PHY_SPEED),
344*9e86db79SHyon Kim getPhyStateString(phyinfo->ProgrammedMaxLinkRate, PHY_SPEED));
345*9e86db79SHyon Kim (void *) fprintf(stdout, "%s%s %s\n",
346*9e86db79SHyon Kim getIndentSpaces(8),
347*9e86db79SHyon Kim "NegotiatedLinkRate:",
348*9e86db79SHyon Kim getPhyStateString(phyinfo->NegotiatedLinkRate, PHY_SPEED));
349*9e86db79SHyon Kim }
350*9e86db79SHyon Kim
351*9e86db79SHyon Kim void
printHBAPortPhyStatistics(SMHBA_SASPHYSTATISTICS * phystat)352*9e86db79SHyon Kim printHBAPortPhyStatistics(SMHBA_SASPHYSTATISTICS *phystat)
353*9e86db79SHyon Kim {
354*9e86db79SHyon Kim if (phystat == NULL)
355*9e86db79SHyon Kim return;
356*9e86db79SHyon Kim
357*9e86db79SHyon Kim (void *) fprintf(stdout, "%s%s\n",
358*9e86db79SHyon Kim getIndentSpaces(8),
359*9e86db79SHyon Kim "Link Error Statistics:");
360*9e86db79SHyon Kim (void *) fprintf(stdout, "%s%s %llu\n",
361*9e86db79SHyon Kim getIndentSpaces(12),
362*9e86db79SHyon Kim "Invalid Dword:",
363*9e86db79SHyon Kim phystat->InvalidDwordCount);
364*9e86db79SHyon Kim (void *) fprintf(stdout, "%s%s %llu\n",
365*9e86db79SHyon Kim getIndentSpaces(12),
366*9e86db79SHyon Kim "Running Disparity Error:",
367*9e86db79SHyon Kim phystat->RunningDisparityErrorCount);
368*9e86db79SHyon Kim (void *) fprintf(stdout, "%s%s %llu\n",
369*9e86db79SHyon Kim getIndentSpaces(12),
370*9e86db79SHyon Kim "Loss of Dword Sync:",
371*9e86db79SHyon Kim phystat->LossofDwordSyncCount);
372*9e86db79SHyon Kim (void *) fprintf(stdout, "%s%s %llu\n",
373*9e86db79SHyon Kim getIndentSpaces(12),
374*9e86db79SHyon Kim "Reset Problem:",
375*9e86db79SHyon Kim phystat->PhyResetProblemCount);
376*9e86db79SHyon Kim }
377*9e86db79SHyon Kim
378*9e86db79SHyon Kim /*
379*9e86db79SHyon Kim * print the OS device name for the logical-unit object
380*9e86db79SHyon Kim *
381*9e86db79SHyon Kim * Arguments:
382*9e86db79SHyon Kim * devListWalk - OS device path info
383*9e86db79SHyon Kim * verbose - boolean indicating whether to display additional info
384*9e86db79SHyon Kim *
385*9e86db79SHyon Kim * returns:
386*9e86db79SHyon Kim * 0 - we're good.
387*9e86db79SHyon Kim * >0 - we met issues.
388*9e86db79SHyon Kim */
389*9e86db79SHyon Kim int
printTargetPortInfo(targetPortList_t * TPListWalk,int pflag)390*9e86db79SHyon Kim printTargetPortInfo(targetPortList_t *TPListWalk, int pflag)
391*9e86db79SHyon Kim {
392*9e86db79SHyon Kim targetPortConfig_t *configList;
393*9e86db79SHyon Kim targetPortMappingData_t *mapList;
394*9e86db79SHyon Kim int count, i;
395*9e86db79SHyon Kim int ret = 0;
396*9e86db79SHyon Kim
397*9e86db79SHyon Kim (void *) fprintf(stdout, "Target Port SAS Address: %016llx\n",
398*9e86db79SHyon Kim wwnConversion(TPListWalk->sasattr.LocalSASAddress.wwn));
399*9e86db79SHyon Kim if ((pflag & PRINT_VERBOSE) || (pflag & PRINT_TARGET_SCSI)) {
400*9e86db79SHyon Kim (void *) fprintf(stdout, "%sType: %s\n", getIndentSpaces(4),
401*9e86db79SHyon Kim getStateString(TPListWalk->targetattr.PortType,
402*9e86db79SHyon Kim porttype_string));
403*9e86db79SHyon Kim for (configList = TPListWalk->configEntry;
404*9e86db79SHyon Kim configList != NULL; configList = configList->next) {
405*9e86db79SHyon Kim (void *) fprintf(stdout, "%sHBA Port Name: %s\n",
406*9e86db79SHyon Kim getIndentSpaces(4), configList->hbaPortName);
407*9e86db79SHyon Kim if (wwnConversion(configList->expanderSASAddr.wwn) !=
408*9e86db79SHyon Kim 0) {
409*9e86db79SHyon Kim if (configList->expanderValid) {
410*9e86db79SHyon Kim (void *) fprintf(stdout,
411*9e86db79SHyon Kim "%sExpander Device SAS Address:"
412*9e86db79SHyon Kim " %016llx",
413*9e86db79SHyon Kim getIndentSpaces(8),
414*9e86db79SHyon Kim wwnConversion(configList->
415*9e86db79SHyon Kim expanderSASAddr.wwn));
416*9e86db79SHyon Kim } else {
417*9e86db79SHyon Kim (void *) fprintf(stdout,
418*9e86db79SHyon Kim "%sExpander Device SAS Address:"
419*9e86db79SHyon Kim " %016llx (Failed to Validate"
420*9e86db79SHyon Kim " Attached Port.)",
421*9e86db79SHyon Kim getIndentSpaces(8),
422*9e86db79SHyon Kim wwnConversion(configList->
423*9e86db79SHyon Kim expanderSASAddr.wwn));
424*9e86db79SHyon Kim ret++;
425*9e86db79SHyon Kim }
426*9e86db79SHyon Kim } else {
427*9e86db79SHyon Kim if (configList->expanderValid) {
428*9e86db79SHyon Kim (void *) fprintf(stdout,
429*9e86db79SHyon Kim "%sExpander Device SAS Address: %s",
430*9e86db79SHyon Kim getIndentSpaces(8),
431*9e86db79SHyon Kim "None (direct attached)");
432*9e86db79SHyon Kim } else {
433*9e86db79SHyon Kim (void *) fprintf(stdout,
434*9e86db79SHyon Kim "%sExpander Device SAS Address: %s",
435*9e86db79SHyon Kim getIndentSpaces(8),
436*9e86db79SHyon Kim "None (Failed to Get"
437*9e86db79SHyon Kim " Attached Port)");
438*9e86db79SHyon Kim }
439*9e86db79SHyon Kim }
440*9e86db79SHyon Kim (void *) fprintf(stdout, "\n");
441*9e86db79SHyon Kim if (pflag & PRINT_TARGET_SCSI) {
442*9e86db79SHyon Kim
443*9e86db79SHyon Kim if (configList->reportLUNsFailed) {
444*9e86db79SHyon Kim (void *) fprintf(stdout,
445*9e86db79SHyon Kim "%s %016llx\n",
446*9e86db79SHyon Kim gettext("Error: Failed to get "
447*9e86db79SHyon Kim "ReportLun Data on"),
448*9e86db79SHyon Kim wwnConversion(TPListWalk->
449*9e86db79SHyon Kim sasattr.LocalSASAddress.wwn));
450*9e86db79SHyon Kim ret++;
451*9e86db79SHyon Kim continue;
452*9e86db79SHyon Kim }
453*9e86db79SHyon Kim
454*9e86db79SHyon Kim for (mapList = configList->map;
455*9e86db79SHyon Kim mapList != NULL; mapList = mapList->next) {
456*9e86db79SHyon Kim (void *) fprintf(stdout, "%sLUN : %d\n",
457*9e86db79SHyon Kim getIndentSpaces(12),
458*9e86db79SHyon Kim mapList->osLUN);
459*9e86db79SHyon Kim if (mapList->mappingExist) {
460*9e86db79SHyon Kim (void *) fprintf(stdout,
461*9e86db79SHyon Kim "%sOS Device Name : %s\n",
462*9e86db79SHyon Kim getIndentSpaces(14),
463*9e86db79SHyon Kim (mapList->osDeviceName[0] ==
464*9e86db79SHyon Kim '\0') ? "Not avaialble" :
465*9e86db79SHyon Kim mapList->osDeviceName);
466*9e86db79SHyon Kim } else {
467*9e86db79SHyon Kim (void *) fprintf(stdout,
468*9e86db79SHyon Kim "%sOS Device Name : %s\n",
469*9e86db79SHyon Kim getIndentSpaces(14), "No "
470*9e86db79SHyon Kim "matching OS Device "
471*9e86db79SHyon Kim "found.");
472*9e86db79SHyon Kim ret++;
473*9e86db79SHyon Kim }
474*9e86db79SHyon Kim /* indentation changed here */
475*9e86db79SHyon Kim if (mapList->inquiryFailed) {
476*9e86db79SHyon Kim (void *) fprintf(stdout, "%s %s LUN %d\n",
477*9e86db79SHyon Kim gettext("Error: Failed to get Inquiry Data on"),
478*9e86db79SHyon Kim mapList->osDeviceName, mapList->osLUN);
479*9e86db79SHyon Kim ret++;
480*9e86db79SHyon Kim } else {
481*9e86db79SHyon Kim (void *) fprintf(stdout, "%sVendor: ",
482*9e86db79SHyon Kim getIndentSpaces(14));
483*9e86db79SHyon Kim for (count = sizeof (mapList->inq_vid), i = 0;
484*9e86db79SHyon Kim i < count; i++) {
485*9e86db79SHyon Kim if (isprint(mapList->inq_vid[i]))
486*9e86db79SHyon Kim (void *) fprintf(stdout, "%c",
487*9e86db79SHyon Kim mapList->inq_vid[i]);
488*9e86db79SHyon Kim }
489*9e86db79SHyon Kim
490*9e86db79SHyon Kim (void *) fprintf(stdout, "\n%sProduct: ",
491*9e86db79SHyon Kim getIndentSpaces(14));
492*9e86db79SHyon Kim for (count = sizeof (mapList->inq_pid), i = 0;
493*9e86db79SHyon Kim i < count; i++) {
494*9e86db79SHyon Kim if (isprint(mapList->inq_pid[i]))
495*9e86db79SHyon Kim (void *) fprintf(stdout, "%c",
496*9e86db79SHyon Kim mapList->inq_pid[i]);
497*9e86db79SHyon Kim }
498*9e86db79SHyon Kim
499*9e86db79SHyon Kim (void *) fprintf(stdout, "\n%sDevice Type: %s\n",
500*9e86db79SHyon Kim getIndentSpaces(14),
501*9e86db79SHyon Kim getDTypeString(mapList->inq_dtype));
502*9e86db79SHyon Kim }
503*9e86db79SHyon Kim /* indentation changed back */
504*9e86db79SHyon Kim }
505*9e86db79SHyon Kim }
506*9e86db79SHyon Kim }
507*9e86db79SHyon Kim }
508*9e86db79SHyon Kim return (ret);
509*9e86db79SHyon Kim }
510*9e86db79SHyon Kim
511*9e86db79SHyon Kim /*
512*9e86db79SHyon Kim * print the OS device name for the logical-unit object
513*9e86db79SHyon Kim *
514*9e86db79SHyon Kim * Arguments:
515*9e86db79SHyon Kim * devListWalk - OS device path info
516*9e86db79SHyon Kim * verbose - boolean indicating whether to display additional info
517*9e86db79SHyon Kim *
518*9e86db79SHyon Kim * returns:
519*9e86db79SHyon Kim * 0 - we're good.
520*9e86db79SHyon Kim * >0 - we met issues.
521*9e86db79SHyon Kim */
522*9e86db79SHyon Kim int
printOSDeviceNameInfo(discoveredDevice * devListWalk,boolean_t verbose)523*9e86db79SHyon Kim printOSDeviceNameInfo(discoveredDevice *devListWalk, boolean_t verbose)
524*9e86db79SHyon Kim {
525*9e86db79SHyon Kim portList *portElem;
526*9e86db79SHyon Kim tgtPortWWNList *tgtWWNList;
527*9e86db79SHyon Kim int i, count;
528*9e86db79SHyon Kim int ret = 0;
529*9e86db79SHyon Kim
530*9e86db79SHyon Kim (void *) fprintf(stdout, "OS Device Name: %s\n",
531*9e86db79SHyon Kim devListWalk->OSDeviceName);
532*9e86db79SHyon Kim if (verbose == B_TRUE) {
533*9e86db79SHyon Kim for (portElem = devListWalk->HBAPortList;
534*9e86db79SHyon Kim portElem != NULL; portElem = portElem->next) {
535*9e86db79SHyon Kim (void *) fprintf(stdout, "%sHBA Port Name: ",
536*9e86db79SHyon Kim getIndentSpaces(4));
537*9e86db79SHyon Kim (void *) fprintf(stdout, "%s", portElem->portName);
538*9e86db79SHyon Kim for (tgtWWNList = portElem->tgtPortWWN;
539*9e86db79SHyon Kim tgtWWNList != NULL; tgtWWNList = tgtWWNList->next) {
540*9e86db79SHyon Kim (void *) fprintf(stdout,
541*9e86db79SHyon Kim "\n%sTarget Port SAS Address: ",
542*9e86db79SHyon Kim getIndentSpaces(8));
543*9e86db79SHyon Kim (void *) fprintf(stdout, "%016llx",
544*9e86db79SHyon Kim wwnConversion(tgtWWNList->portWWN.wwn));
545*9e86db79SHyon Kim (void *) fprintf(stdout, "\n%sLUN: %u",
546*9e86db79SHyon Kim getIndentSpaces(12),
547*9e86db79SHyon Kim tgtWWNList->scsiOSLun);
548*9e86db79SHyon Kim }
549*9e86db79SHyon Kim (void *) fprintf(stdout, "\n");
550*9e86db79SHyon Kim }
551*9e86db79SHyon Kim
552*9e86db79SHyon Kim if (devListWalk->inquiryFailed) {
553*9e86db79SHyon Kim (void *) fprintf(stdout, "%s %s\n",
554*9e86db79SHyon Kim gettext("Error: Failed to get Inquiry data "
555*9e86db79SHyon Kim "on device"), devListWalk->OSDeviceName);
556*9e86db79SHyon Kim ret++;
557*9e86db79SHyon Kim } else {
558*9e86db79SHyon Kim (void *) fprintf(stdout, "%sVendor: ",
559*9e86db79SHyon Kim getIndentSpaces(4));
560*9e86db79SHyon Kim for (count = sizeof (devListWalk->VID), i = 0;
561*9e86db79SHyon Kim i < count; i++) {
562*9e86db79SHyon Kim if (isprint(devListWalk->VID[i]))
563*9e86db79SHyon Kim (void *) fprintf(stdout, "%c",
564*9e86db79SHyon Kim devListWalk->VID[i]);
565*9e86db79SHyon Kim }
566*9e86db79SHyon Kim
567*9e86db79SHyon Kim (void *) fprintf(stdout, "\n%sProduct: ",
568*9e86db79SHyon Kim getIndentSpaces(4));
569*9e86db79SHyon Kim for (count = sizeof (devListWalk->PID), i = 0;
570*9e86db79SHyon Kim i < count; i++) {
571*9e86db79SHyon Kim if (isprint(devListWalk->PID[i]))
572*9e86db79SHyon Kim (void *) fprintf(stdout, "%c",
573*9e86db79SHyon Kim devListWalk->PID[i]);
574*9e86db79SHyon Kim }
575*9e86db79SHyon Kim
576*9e86db79SHyon Kim (void *) fprintf(stdout, "\n%sDevice Type: %s\n",
577*9e86db79SHyon Kim getIndentSpaces(4),
578*9e86db79SHyon Kim getDTypeString(devListWalk->dType));
579*9e86db79SHyon Kim }
580*9e86db79SHyon Kim }
581*9e86db79SHyon Kim return (ret);
582*9e86db79SHyon Kim }
583