1*fcf3ce44SJohn Forte /*
2*fcf3ce44SJohn Forte * CDDL HEADER START
3*fcf3ce44SJohn Forte *
4*fcf3ce44SJohn Forte * The contents of this file are subject to the terms of the
5*fcf3ce44SJohn Forte * Common Development and Distribution License (the "License").
6*fcf3ce44SJohn Forte * You may not use this file except in compliance with the License.
7*fcf3ce44SJohn Forte *
8*fcf3ce44SJohn Forte * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*fcf3ce44SJohn Forte * or http://www.opensolaris.org/os/licensing.
10*fcf3ce44SJohn Forte * See the License for the specific language governing permissions
11*fcf3ce44SJohn Forte * and limitations under the License.
12*fcf3ce44SJohn Forte *
13*fcf3ce44SJohn Forte * When distributing Covered Code, include this CDDL HEADER in each
14*fcf3ce44SJohn Forte * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*fcf3ce44SJohn Forte * If applicable, add the following below this CDDL HEADER, with the
16*fcf3ce44SJohn Forte * fields enclosed by brackets "[]" replaced with your own identifying
17*fcf3ce44SJohn Forte * information: Portions Copyright [yyyy] [name of copyright owner]
18*fcf3ce44SJohn Forte *
19*fcf3ce44SJohn Forte * CDDL HEADER END
20*fcf3ce44SJohn Forte */
21*fcf3ce44SJohn Forte /*
22*fcf3ce44SJohn Forte * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
23*fcf3ce44SJohn Forte * Use is subject to license terms.
24*fcf3ce44SJohn Forte */
25*fcf3ce44SJohn Forte
26*fcf3ce44SJohn Forte
27*fcf3ce44SJohn Forte
28*fcf3ce44SJohn Forte #include <stdio.h>
29*fcf3ce44SJohn Forte #include <hbaapi.h>
30*fcf3ce44SJohn Forte #include <string.h>
31*fcf3ce44SJohn Forte #include <sys/types.h>
32*fcf3ce44SJohn Forte #include <netinet/in.h>
33*fcf3ce44SJohn Forte #include <inttypes.h>
34*fcf3ce44SJohn Forte #include <ctype.h>
35*fcf3ce44SJohn Forte #include "fcinfo.h"
36*fcf3ce44SJohn Forte
37*fcf3ce44SJohn Forte #ifdef _BIG_ENDIAN
38*fcf3ce44SJohn Forte #define htonll(x) (x)
39*fcf3ce44SJohn Forte #define ntohll(x) (x)
40*fcf3ce44SJohn Forte #else
41*fcf3ce44SJohn Forte #define htonll(x) ((((unsigned long long)htonl(x)) << 32) + htonl(x >> 32))
42*fcf3ce44SJohn Forte #define ntohll(x) ((((unsigned long long)ntohl(x)) << 32) + ntohl(x >> 32))
43*fcf3ce44SJohn Forte #endif
44*fcf3ce44SJohn Forte
45*fcf3ce44SJohn Forte /* Fc4 Types Format */
46*fcf3ce44SJohn Forte #define FC4_TYPE_WORD_POS(x) ((uint_t)((uint_t)(x) >> 5))
47*fcf3ce44SJohn Forte #define FC4_TYPE_BIT_POS(x) ((uchar_t)(x) & 0x1F)
48*fcf3ce44SJohn Forte
49*fcf3ce44SJohn Forte #define TYPE_IP_FC 0x05
50*fcf3ce44SJohn Forte #define TYPE_SCSI_FCP 0x08
51*fcf3ce44SJohn Forte
52*fcf3ce44SJohn Forte static int fc4_map_is_set(uint32_t *map, uchar_t ulp_type);
53*fcf3ce44SJohn Forte static char *getPortType(HBA_PORTTYPE portType);
54*fcf3ce44SJohn Forte static char *getPortState(HBA_PORTSTATE portState);
55*fcf3ce44SJohn Forte static void printPortSpeed(HBA_PORTSPEED portSpeed);
56*fcf3ce44SJohn Forte static char *getDTypeString(uchar_t dType);
57*fcf3ce44SJohn Forte
wwnConversion(uchar_t * wwn)58*fcf3ce44SJohn Forte uint64_t wwnConversion(uchar_t *wwn) {
59*fcf3ce44SJohn Forte uint64_t tmp;
60*fcf3ce44SJohn Forte memcpy(&tmp, wwn, sizeof (uint64_t));
61*fcf3ce44SJohn Forte return (ntohll(tmp));
62*fcf3ce44SJohn Forte }
63*fcf3ce44SJohn Forte
64*fcf3ce44SJohn Forte static char *
getPortType(HBA_PORTTYPE portType)65*fcf3ce44SJohn Forte getPortType(HBA_PORTTYPE portType) {
66*fcf3ce44SJohn Forte switch (portType) {
67*fcf3ce44SJohn Forte case HBA_PORTTYPE_UNKNOWN:
68*fcf3ce44SJohn Forte return ("unknown");
69*fcf3ce44SJohn Forte case HBA_PORTTYPE_OTHER:
70*fcf3ce44SJohn Forte return ("other");
71*fcf3ce44SJohn Forte case HBA_PORTTYPE_NOTPRESENT:
72*fcf3ce44SJohn Forte return ("not present");
73*fcf3ce44SJohn Forte case HBA_PORTTYPE_NPORT:
74*fcf3ce44SJohn Forte return ("N-port");
75*fcf3ce44SJohn Forte case HBA_PORTTYPE_NLPORT:
76*fcf3ce44SJohn Forte return ("NL-port");
77*fcf3ce44SJohn Forte case HBA_PORTTYPE_FLPORT:
78*fcf3ce44SJohn Forte return ("FL-port");
79*fcf3ce44SJohn Forte case HBA_PORTTYPE_FPORT:
80*fcf3ce44SJohn Forte return ("F-port");
81*fcf3ce44SJohn Forte case HBA_PORTTYPE_LPORT:
82*fcf3ce44SJohn Forte return ("L-port");
83*fcf3ce44SJohn Forte case HBA_PORTTYPE_PTP:
84*fcf3ce44SJohn Forte return ("point-to-point");
85*fcf3ce44SJohn Forte default:
86*fcf3ce44SJohn Forte return ("unrecognized type");
87*fcf3ce44SJohn Forte }
88*fcf3ce44SJohn Forte }
89*fcf3ce44SJohn Forte
90*fcf3ce44SJohn Forte static char *
getPortState(HBA_PORTSTATE portState)91*fcf3ce44SJohn Forte getPortState(HBA_PORTSTATE portState) {
92*fcf3ce44SJohn Forte switch (portState) {
93*fcf3ce44SJohn Forte case HBA_PORTSTATE_UNKNOWN:
94*fcf3ce44SJohn Forte return ("unknown");
95*fcf3ce44SJohn Forte case HBA_PORTSTATE_ONLINE:
96*fcf3ce44SJohn Forte return ("online");
97*fcf3ce44SJohn Forte case HBA_PORTSTATE_OFFLINE:
98*fcf3ce44SJohn Forte return ("offline");
99*fcf3ce44SJohn Forte case HBA_PORTSTATE_BYPASSED:
100*fcf3ce44SJohn Forte return ("bypassed");
101*fcf3ce44SJohn Forte case HBA_PORTSTATE_DIAGNOSTICS:
102*fcf3ce44SJohn Forte return ("diagnostics");
103*fcf3ce44SJohn Forte case HBA_PORTSTATE_LINKDOWN:
104*fcf3ce44SJohn Forte return ("link down");
105*fcf3ce44SJohn Forte case HBA_PORTSTATE_ERROR:
106*fcf3ce44SJohn Forte return ("error");
107*fcf3ce44SJohn Forte case HBA_PORTSTATE_LOOPBACK:
108*fcf3ce44SJohn Forte return ("loopback");
109*fcf3ce44SJohn Forte default:
110*fcf3ce44SJohn Forte return ("unrecognized state");
111*fcf3ce44SJohn Forte }
112*fcf3ce44SJohn Forte }
113*fcf3ce44SJohn Forte
114*fcf3ce44SJohn Forte static void
printPortSpeed(HBA_PORTSPEED portSpeed)115*fcf3ce44SJohn Forte printPortSpeed(HBA_PORTSPEED portSpeed) {
116*fcf3ce44SJohn Forte int foundSpeed = 0;
117*fcf3ce44SJohn Forte
118*fcf3ce44SJohn Forte if ((portSpeed & HBA_PORTSPEED_1GBIT) == HBA_PORTSPEED_1GBIT) {
119*fcf3ce44SJohn Forte fprintf(stdout, "1Gb ");
120*fcf3ce44SJohn Forte foundSpeed = 1;
121*fcf3ce44SJohn Forte }
122*fcf3ce44SJohn Forte if ((portSpeed & HBA_PORTSPEED_2GBIT) == HBA_PORTSPEED_2GBIT) {
123*fcf3ce44SJohn Forte fprintf(stdout, "2Gb ");
124*fcf3ce44SJohn Forte foundSpeed = 1;
125*fcf3ce44SJohn Forte }
126*fcf3ce44SJohn Forte if ((portSpeed & HBA_PORTSPEED_4GBIT) == HBA_PORTSPEED_4GBIT) {
127*fcf3ce44SJohn Forte fprintf(stdout, "4Gb ");
128*fcf3ce44SJohn Forte foundSpeed = 1;
129*fcf3ce44SJohn Forte }
130*fcf3ce44SJohn Forte if ((portSpeed & HBA_PORTSPEED_8GBIT) == HBA_PORTSPEED_8GBIT) {
131*fcf3ce44SJohn Forte fprintf(stdout, "8Gb ");
132*fcf3ce44SJohn Forte foundSpeed = 1;
133*fcf3ce44SJohn Forte }
134*fcf3ce44SJohn Forte if ((portSpeed & HBA_PORTSPEED_10GBIT) == HBA_PORTSPEED_10GBIT) {
135*fcf3ce44SJohn Forte fprintf(stdout, "10Gb ");
136*fcf3ce44SJohn Forte foundSpeed = 1;
137*fcf3ce44SJohn Forte }
138*fcf3ce44SJohn Forte if ((portSpeed & HBA_PORTSPEED_16GBIT) == HBA_PORTSPEED_16GBIT) {
139*fcf3ce44SJohn Forte fprintf(stdout, "16Gb ");
140*fcf3ce44SJohn Forte foundSpeed = 1;
141*fcf3ce44SJohn Forte }
142*fcf3ce44SJohn Forte if ((portSpeed & HBA_PORTSPEED_NOT_NEGOTIATED)
143*fcf3ce44SJohn Forte == HBA_PORTSPEED_NOT_NEGOTIATED) {
144*fcf3ce44SJohn Forte fprintf(stdout, "not established ");
145*fcf3ce44SJohn Forte foundSpeed = 1;
146*fcf3ce44SJohn Forte }
147*fcf3ce44SJohn Forte if (foundSpeed == 0) {
148*fcf3ce44SJohn Forte fprintf(stdout, "not established ");
149*fcf3ce44SJohn Forte }
150*fcf3ce44SJohn Forte }
151*fcf3ce44SJohn Forte
152*fcf3ce44SJohn Forte void
printDiscoPortInfo(HBA_PORTATTRIBUTES * discoPort,int scsiTargetType)153*fcf3ce44SJohn Forte printDiscoPortInfo(HBA_PORTATTRIBUTES *discoPort, int scsiTargetType) {
154*fcf3ce44SJohn Forte int fc4_types = 0;
155*fcf3ce44SJohn Forte
156*fcf3ce44SJohn Forte fprintf(stdout, gettext("Remote Port WWN: %016llx\n"),
157*fcf3ce44SJohn Forte wwnConversion(discoPort->PortWWN.wwn));
158*fcf3ce44SJohn Forte fprintf(stdout, gettext("\tActive FC4 Types: "));
159*fcf3ce44SJohn Forte if (fc4_map_is_set(
160*fcf3ce44SJohn Forte (uint32_t *)discoPort->PortActiveFc4Types.bits,
161*fcf3ce44SJohn Forte TYPE_SCSI_FCP)) {
162*fcf3ce44SJohn Forte fprintf(stdout, gettext("SCSI"));
163*fcf3ce44SJohn Forte fc4_types++;
164*fcf3ce44SJohn Forte }
165*fcf3ce44SJohn Forte if (fc4_map_is_set(
166*fcf3ce44SJohn Forte (uint32_t *)discoPort->PortActiveFc4Types.bits,
167*fcf3ce44SJohn Forte TYPE_IP_FC)) {
168*fcf3ce44SJohn Forte if (fc4_types != 0) {
169*fcf3ce44SJohn Forte fprintf(stdout, ",");
170*fcf3ce44SJohn Forte }
171*fcf3ce44SJohn Forte fprintf(stdout, gettext("IP"));
172*fcf3ce44SJohn Forte fc4_types++;
173*fcf3ce44SJohn Forte }
174*fcf3ce44SJohn Forte fprintf(stdout, "\n");
175*fcf3ce44SJohn Forte
176*fcf3ce44SJohn Forte /* print out scsi target type information */
177*fcf3ce44SJohn Forte fprintf(stdout, gettext("\tSCSI Target: "));
178*fcf3ce44SJohn Forte if (scsiTargetType == SCSI_TARGET_TYPE_YES) {
179*fcf3ce44SJohn Forte fprintf(stdout, gettext("yes\n"));
180*fcf3ce44SJohn Forte } else if (scsiTargetType == SCSI_TARGET_TYPE_NO) {
181*fcf3ce44SJohn Forte fprintf(stdout, gettext("no\n"));
182*fcf3ce44SJohn Forte } else {
183*fcf3ce44SJohn Forte fprintf(stdout, gettext("unknown\n"));
184*fcf3ce44SJohn Forte }
185*fcf3ce44SJohn Forte fprintf(stdout, gettext("\tPort Symbolic Name: %s\n"),
186*fcf3ce44SJohn Forte discoPort->PortSymbolicName);
187*fcf3ce44SJohn Forte fprintf(stdout, gettext("\tNode WWN: %016llx\n"),
188*fcf3ce44SJohn Forte wwnConversion(discoPort->NodeWWN.wwn));
189*fcf3ce44SJohn Forte }
190*fcf3ce44SJohn Forte
191*fcf3ce44SJohn Forte /*
192*fcf3ce44SJohn Forte * scan the bitmap array for the specifed ULP type. The bit map array
193*fcf3ce44SJohn Forte * is 32 bytes long
194*fcf3ce44SJohn Forte */
195*fcf3ce44SJohn Forte static int
fc4_map_is_set(uint32_t * map,uchar_t ulp_type)196*fcf3ce44SJohn Forte fc4_map_is_set(uint32_t *map, uchar_t ulp_type)
197*fcf3ce44SJohn Forte {
198*fcf3ce44SJohn Forte
199*fcf3ce44SJohn Forte map += FC4_TYPE_WORD_POS(ulp_type) * 4;
200*fcf3ce44SJohn Forte
201*fcf3ce44SJohn Forte if (ntohl((*(uint32_t *)map)) & (1 << FC4_TYPE_BIT_POS(ulp_type))) {
202*fcf3ce44SJohn Forte return (1);
203*fcf3ce44SJohn Forte }
204*fcf3ce44SJohn Forte
205*fcf3ce44SJohn Forte return (0);
206*fcf3ce44SJohn Forte }
207*fcf3ce44SJohn Forte
208*fcf3ce44SJohn Forte /*
209*fcf3ce44SJohn Forte * prints out all the HBA port information
210*fcf3ce44SJohn Forte */
211*fcf3ce44SJohn Forte void
printHBAPortInfo(HBA_PORTATTRIBUTES * port,HBA_ADAPTERATTRIBUTES * attrs,int mode)212*fcf3ce44SJohn Forte printHBAPortInfo(HBA_PORTATTRIBUTES *port,
213*fcf3ce44SJohn Forte HBA_ADAPTERATTRIBUTES *attrs, int mode) {
214*fcf3ce44SJohn Forte if (attrs == NULL || port == NULL) {
215*fcf3ce44SJohn Forte return;
216*fcf3ce44SJohn Forte }
217*fcf3ce44SJohn Forte fprintf(stdout, gettext("HBA Port WWN: %016llx\n"),
218*fcf3ce44SJohn Forte wwnConversion(port->PortWWN.wwn));
219*fcf3ce44SJohn Forte fprintf(stdout, gettext("\tPort Mode: %s\n"),
220*fcf3ce44SJohn Forte (mode == INITIATOR_MODE) ? "Initiator" : "Target");
221*fcf3ce44SJohn Forte fprintf(stdout, gettext("\tPort ID: %x\n"),
222*fcf3ce44SJohn Forte port->PortFcId);
223*fcf3ce44SJohn Forte fprintf(stdout, gettext("\tOS Device Name: %s\n"), port->OSDeviceName);
224*fcf3ce44SJohn Forte
225*fcf3ce44SJohn Forte fprintf(stdout, gettext("\tManufacturer: %s\n"),
226*fcf3ce44SJohn Forte attrs->Manufacturer);
227*fcf3ce44SJohn Forte fprintf(stdout, gettext("\tModel: %s\n"), attrs->Model);
228*fcf3ce44SJohn Forte fprintf(stdout, gettext("\tFirmware Version: %s\n"),
229*fcf3ce44SJohn Forte attrs->FirmwareVersion);
230*fcf3ce44SJohn Forte fprintf(stdout, gettext("\tFCode/BIOS Version: %s\n"),
231*fcf3ce44SJohn Forte attrs->OptionROMVersion);
232*fcf3ce44SJohn Forte fprintf(stdout, gettext("\tSerial Number: %s\n"),
233*fcf3ce44SJohn Forte attrs->SerialNumber[0] == 0? "not available":attrs->SerialNumber);
234*fcf3ce44SJohn Forte
235*fcf3ce44SJohn Forte fprintf(stdout, gettext("\tDriver Name: %s\n"),
236*fcf3ce44SJohn Forte attrs->DriverName[0] == 0? "not available":attrs->DriverName);
237*fcf3ce44SJohn Forte fprintf(stdout, gettext("\tDriver Version: %s\n"),
238*fcf3ce44SJohn Forte attrs->DriverVersion[0] == 0? "not available":attrs->DriverVersion);
239*fcf3ce44SJohn Forte
240*fcf3ce44SJohn Forte fprintf(stdout, gettext("\tType: %s\n"),
241*fcf3ce44SJohn Forte getPortType(port->PortType));
242*fcf3ce44SJohn Forte fprintf(stdout, gettext("\tState: %s\n"),
243*fcf3ce44SJohn Forte getPortState(port->PortState));
244*fcf3ce44SJohn Forte
245*fcf3ce44SJohn Forte fprintf(stdout, gettext("\tSupported Speeds: "));
246*fcf3ce44SJohn Forte printPortSpeed(port->PortSupportedSpeed);
247*fcf3ce44SJohn Forte fprintf(stdout, "\n");
248*fcf3ce44SJohn Forte
249*fcf3ce44SJohn Forte fprintf(stdout, gettext("\tCurrent Speed: "));
250*fcf3ce44SJohn Forte printPortSpeed(port->PortSpeed);
251*fcf3ce44SJohn Forte fprintf(stdout, "\n");
252*fcf3ce44SJohn Forte
253*fcf3ce44SJohn Forte fprintf(stdout, gettext("\tNode WWN: %016llx\n"),
254*fcf3ce44SJohn Forte wwnConversion(port->NodeWWN.wwn));
255*fcf3ce44SJohn Forte }
256*fcf3ce44SJohn Forte
257*fcf3ce44SJohn Forte void
printStatus(HBA_STATUS status)258*fcf3ce44SJohn Forte printStatus(HBA_STATUS status) {
259*fcf3ce44SJohn Forte switch (status) {
260*fcf3ce44SJohn Forte case HBA_STATUS_OK:
261*fcf3ce44SJohn Forte fprintf(stderr, gettext("OK"));
262*fcf3ce44SJohn Forte return;
263*fcf3ce44SJohn Forte case HBA_STATUS_ERROR:
264*fcf3ce44SJohn Forte fprintf(stderr, gettext("ERROR"));
265*fcf3ce44SJohn Forte return;
266*fcf3ce44SJohn Forte case HBA_STATUS_ERROR_NOT_SUPPORTED:
267*fcf3ce44SJohn Forte fprintf(stderr, gettext("NOT SUPPORTED"));
268*fcf3ce44SJohn Forte return;
269*fcf3ce44SJohn Forte case HBA_STATUS_ERROR_INVALID_HANDLE:
270*fcf3ce44SJohn Forte fprintf(stderr, gettext("INVALID HANDLE"));
271*fcf3ce44SJohn Forte return;
272*fcf3ce44SJohn Forte case HBA_STATUS_ERROR_ARG:
273*fcf3ce44SJohn Forte fprintf(stderr, gettext("ERROR ARG"));
274*fcf3ce44SJohn Forte return;
275*fcf3ce44SJohn Forte case HBA_STATUS_ERROR_ILLEGAL_WWN:
276*fcf3ce44SJohn Forte fprintf(stderr, gettext("ILLEGAL WWN"));
277*fcf3ce44SJohn Forte return;
278*fcf3ce44SJohn Forte case HBA_STATUS_ERROR_ILLEGAL_INDEX:
279*fcf3ce44SJohn Forte fprintf(stderr, gettext("ILLEGAL INDEX"));
280*fcf3ce44SJohn Forte return;
281*fcf3ce44SJohn Forte case HBA_STATUS_ERROR_MORE_DATA:
282*fcf3ce44SJohn Forte fprintf(stderr, gettext("MORE DATA"));
283*fcf3ce44SJohn Forte return;
284*fcf3ce44SJohn Forte case HBA_STATUS_ERROR_STALE_DATA:
285*fcf3ce44SJohn Forte fprintf(stderr, gettext("STALE DATA"));
286*fcf3ce44SJohn Forte return;
287*fcf3ce44SJohn Forte case HBA_STATUS_SCSI_CHECK_CONDITION:
288*fcf3ce44SJohn Forte fprintf(stderr, gettext("SCSI CHECK CONDITION"));
289*fcf3ce44SJohn Forte return;
290*fcf3ce44SJohn Forte case HBA_STATUS_ERROR_BUSY:
291*fcf3ce44SJohn Forte fprintf(stderr, gettext("BUSY"));
292*fcf3ce44SJohn Forte return;
293*fcf3ce44SJohn Forte case HBA_STATUS_ERROR_TRY_AGAIN:
294*fcf3ce44SJohn Forte fprintf(stderr, gettext("TRY AGAIN"));
295*fcf3ce44SJohn Forte return;
296*fcf3ce44SJohn Forte case HBA_STATUS_ERROR_UNAVAILABLE:
297*fcf3ce44SJohn Forte fprintf(stderr, gettext("UNAVAILABLE"));
298*fcf3ce44SJohn Forte return;
299*fcf3ce44SJohn Forte default:
300*fcf3ce44SJohn Forte fprintf(stderr, "%s %d",
301*fcf3ce44SJohn Forte gettext("Undefined error code "), status);
302*fcf3ce44SJohn Forte return;
303*fcf3ce44SJohn Forte }
304*fcf3ce44SJohn Forte }
305*fcf3ce44SJohn Forte
306*fcf3ce44SJohn Forte void
printLUNInfo(struct scsi_inquiry * inq,HBA_UINT32 scsiLUN,char * devpath)307*fcf3ce44SJohn Forte printLUNInfo(struct scsi_inquiry *inq, HBA_UINT32 scsiLUN, char *devpath) {
308*fcf3ce44SJohn Forte fprintf(stdout, "\tLUN: %d\n", scsiLUN);
309*fcf3ce44SJohn Forte fprintf(stdout, "\t Vendor: %c%c%c%c%c%c%c%c\n",
310*fcf3ce44SJohn Forte inq->inq_vid[0],
311*fcf3ce44SJohn Forte inq->inq_vid[1],
312*fcf3ce44SJohn Forte inq->inq_vid[2],
313*fcf3ce44SJohn Forte inq->inq_vid[3],
314*fcf3ce44SJohn Forte inq->inq_vid[4],
315*fcf3ce44SJohn Forte inq->inq_vid[5],
316*fcf3ce44SJohn Forte inq->inq_vid[6],
317*fcf3ce44SJohn Forte inq->inq_vid[7]);
318*fcf3ce44SJohn Forte fprintf(stdout, "\t Product: %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n",
319*fcf3ce44SJohn Forte inq->inq_pid[0],
320*fcf3ce44SJohn Forte inq->inq_pid[1],
321*fcf3ce44SJohn Forte inq->inq_pid[2],
322*fcf3ce44SJohn Forte inq->inq_pid[3],
323*fcf3ce44SJohn Forte inq->inq_pid[4],
324*fcf3ce44SJohn Forte inq->inq_pid[5],
325*fcf3ce44SJohn Forte inq->inq_pid[6],
326*fcf3ce44SJohn Forte inq->inq_pid[7],
327*fcf3ce44SJohn Forte inq->inq_pid[8],
328*fcf3ce44SJohn Forte inq->inq_pid[9],
329*fcf3ce44SJohn Forte inq->inq_pid[10],
330*fcf3ce44SJohn Forte inq->inq_pid[11],
331*fcf3ce44SJohn Forte inq->inq_pid[12],
332*fcf3ce44SJohn Forte inq->inq_pid[13],
333*fcf3ce44SJohn Forte inq->inq_pid[14],
334*fcf3ce44SJohn Forte inq->inq_pid[15]);
335*fcf3ce44SJohn Forte fprintf(stdout, gettext("\t OS Device Name: %s\n"), devpath);
336*fcf3ce44SJohn Forte }
337*fcf3ce44SJohn Forte
338*fcf3ce44SJohn Forte void
printPortStat(fc_rls_acc_t * rls_payload)339*fcf3ce44SJohn Forte printPortStat(fc_rls_acc_t *rls_payload) {
340*fcf3ce44SJohn Forte fprintf(stdout, gettext("\tLink Error Statistics:\n"));
341*fcf3ce44SJohn Forte fprintf(stdout, gettext("\t\tLink Failure Count: %u\n"),
342*fcf3ce44SJohn Forte rls_payload->rls_link_fail);
343*fcf3ce44SJohn Forte fprintf(stdout, gettext("\t\tLoss of Sync Count: %u\n"),
344*fcf3ce44SJohn Forte rls_payload->rls_sync_loss);
345*fcf3ce44SJohn Forte fprintf(stdout, gettext("\t\tLoss of Signal Count: %u\n"),
346*fcf3ce44SJohn Forte rls_payload->rls_sig_loss);
347*fcf3ce44SJohn Forte fprintf(stdout, gettext("\t\tPrimitive Seq Protocol Error Count: %u\n"),
348*fcf3ce44SJohn Forte rls_payload->rls_prim_seq_err);
349*fcf3ce44SJohn Forte fprintf(stdout, gettext("\t\tInvalid Tx Word Count: %u\n"),
350*fcf3ce44SJohn Forte rls_payload->rls_invalid_word);
351*fcf3ce44SJohn Forte fprintf(stdout, gettext("\t\tInvalid CRC Count: %u\n"),
352*fcf3ce44SJohn Forte rls_payload->rls_invalid_crc);
353*fcf3ce44SJohn Forte }
354*fcf3ce44SJohn Forte
355*fcf3ce44SJohn Forte /*
356*fcf3ce44SJohn Forte * return device type description
357*fcf3ce44SJohn Forte *
358*fcf3ce44SJohn Forte * Arguments:
359*fcf3ce44SJohn Forte * dType - Device type returned from Standard INQUIRY
360*fcf3ce44SJohn Forte * Returns:
361*fcf3ce44SJohn Forte * char string description for device type
362*fcf3ce44SJohn Forte */
363*fcf3ce44SJohn Forte static char *
getDTypeString(uchar_t dType)364*fcf3ce44SJohn Forte getDTypeString(uchar_t dType)
365*fcf3ce44SJohn Forte {
366*fcf3ce44SJohn Forte switch (dType & DTYPE_MASK) {
367*fcf3ce44SJohn Forte case DTYPE_DIRECT:
368*fcf3ce44SJohn Forte return ("Disk Device");
369*fcf3ce44SJohn Forte case DTYPE_SEQUENTIAL:
370*fcf3ce44SJohn Forte return ("Tape Device");
371*fcf3ce44SJohn Forte case DTYPE_PRINTER:
372*fcf3ce44SJohn Forte return ("Printer Device");
373*fcf3ce44SJohn Forte case DTYPE_PROCESSOR:
374*fcf3ce44SJohn Forte return ("Processor Device");
375*fcf3ce44SJohn Forte case DTYPE_WORM:
376*fcf3ce44SJohn Forte return ("WORM Device");
377*fcf3ce44SJohn Forte case DTYPE_RODIRECT:
378*fcf3ce44SJohn Forte return ("CD/DVD Device");
379*fcf3ce44SJohn Forte case DTYPE_SCANNER:
380*fcf3ce44SJohn Forte return ("Scanner Device");
381*fcf3ce44SJohn Forte case DTYPE_OPTICAL:
382*fcf3ce44SJohn Forte return ("Optical Memory Device");
383*fcf3ce44SJohn Forte case DTYPE_CHANGER:
384*fcf3ce44SJohn Forte return ("Medium Changer Device");
385*fcf3ce44SJohn Forte case DTYPE_COMM:
386*fcf3ce44SJohn Forte return ("Communications Device");
387*fcf3ce44SJohn Forte case DTYPE_ARRAY_CTRL:
388*fcf3ce44SJohn Forte return ("Storage Array Controller Device");
389*fcf3ce44SJohn Forte case DTYPE_ESI:
390*fcf3ce44SJohn Forte return ("Enclosure Services Device");
391*fcf3ce44SJohn Forte case DTYPE_RBC:
392*fcf3ce44SJohn Forte return ("Simplified Direct-access Device");
393*fcf3ce44SJohn Forte case DTYPE_OCRW:
394*fcf3ce44SJohn Forte return ("Optical Card Reader/Writer Device");
395*fcf3ce44SJohn Forte case DTYPE_BCC:
396*fcf3ce44SJohn Forte return ("Bridge Controller Commands");
397*fcf3ce44SJohn Forte case DTYPE_OSD:
398*fcf3ce44SJohn Forte return ("Object-based Storage Device");
399*fcf3ce44SJohn Forte case DTYPE_ADC:
400*fcf3ce44SJohn Forte return ("Automation/Drive Interface");
401*fcf3ce44SJohn Forte case DTYPE_WELLKNOWN:
402*fcf3ce44SJohn Forte return ("Well Known Logical Unit");
403*fcf3ce44SJohn Forte case DTYPE_UNKNOWN:
404*fcf3ce44SJohn Forte return ("Unknown Device");
405*fcf3ce44SJohn Forte default:
406*fcf3ce44SJohn Forte return ("Undefined");
407*fcf3ce44SJohn Forte }
408*fcf3ce44SJohn Forte }
409*fcf3ce44SJohn Forte
410*fcf3ce44SJohn Forte /*
411*fcf3ce44SJohn Forte * print the OS device name for the logical-unit object
412*fcf3ce44SJohn Forte *
413*fcf3ce44SJohn Forte * Arguments:
414*fcf3ce44SJohn Forte * devListWalk - OS device path info
415*fcf3ce44SJohn Forte * verbose - boolean indicating whether to display additional info
416*fcf3ce44SJohn Forte *
417*fcf3ce44SJohn Forte * returns:
418*fcf3ce44SJohn Forte * none
419*fcf3ce44SJohn Forte */
420*fcf3ce44SJohn Forte void
printOSDeviceNameInfo(discoveredDevice * devListWalk,boolean_t verbose)421*fcf3ce44SJohn Forte printOSDeviceNameInfo(discoveredDevice *devListWalk, boolean_t verbose)
422*fcf3ce44SJohn Forte {
423*fcf3ce44SJohn Forte portWWNList *WWNList;
424*fcf3ce44SJohn Forte tgtPortWWNList *tgtWWNList;
425*fcf3ce44SJohn Forte int i, count;
426*fcf3ce44SJohn Forte
427*fcf3ce44SJohn Forte fprintf(stdout, "OS Device Name: %s\n", devListWalk->OSDeviceName);
428*fcf3ce44SJohn Forte if (verbose == B_TRUE) {
429*fcf3ce44SJohn Forte for (WWNList = devListWalk->HBAPortWWN;
430*fcf3ce44SJohn Forte WWNList != NULL; WWNList = WWNList->next) {
431*fcf3ce44SJohn Forte fprintf(stdout, "\tHBA Port WWN: ");
432*fcf3ce44SJohn Forte fprintf(stdout, "%016llx",
433*fcf3ce44SJohn Forte wwnConversion(WWNList->portWWN.wwn));
434*fcf3ce44SJohn Forte for (tgtWWNList = WWNList->tgtPortWWN;
435*fcf3ce44SJohn Forte tgtWWNList != NULL; tgtWWNList = tgtWWNList->next) {
436*fcf3ce44SJohn Forte fprintf(stdout, "\n\t\tRemote Port WWN: ");
437*fcf3ce44SJohn Forte fprintf(stdout, "%016llx",
438*fcf3ce44SJohn Forte wwnConversion(tgtWWNList->portWWN.wwn));
439*fcf3ce44SJohn Forte fprintf(stdout, "\n\t\t\tLUN: %d",
440*fcf3ce44SJohn Forte tgtWWNList->scsiOSLun);
441*fcf3ce44SJohn Forte }
442*fcf3ce44SJohn Forte fprintf(stdout, "\n");
443*fcf3ce44SJohn Forte }
444*fcf3ce44SJohn Forte
445*fcf3ce44SJohn Forte fprintf(stdout, "\tVendor: ");
446*fcf3ce44SJohn Forte for (count = sizeof (devListWalk->VID), i = 0; i < count; i++) {
447*fcf3ce44SJohn Forte if (isprint(devListWalk->VID[i]))
448*fcf3ce44SJohn Forte fprintf(stdout, "%c", devListWalk->VID[i]);
449*fcf3ce44SJohn Forte }
450*fcf3ce44SJohn Forte
451*fcf3ce44SJohn Forte fprintf(stdout, "\n\tProduct: ");
452*fcf3ce44SJohn Forte for (count = sizeof (devListWalk->PID), i = 0; i < count; i++) {
453*fcf3ce44SJohn Forte if (isprint(devListWalk->PID[i]))
454*fcf3ce44SJohn Forte fprintf(stdout, "%c", devListWalk->PID[i]);
455*fcf3ce44SJohn Forte }
456*fcf3ce44SJohn Forte
457*fcf3ce44SJohn Forte fprintf(stdout, "\n\tDevice Type: %s\n",
458*fcf3ce44SJohn Forte getDTypeString(devListWalk->dType));
459*fcf3ce44SJohn Forte }
460*fcf3ce44SJohn Forte }
461