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 #define LUX_SF_INST_SHIFT4MINOR 6
29*fcf3ce44SJohn Forte #define LUX_SF_MINOR2INST(x) (x >> LUX_SF_INST_SHIFT4MINOR)
30*fcf3ce44SJohn Forte
31*fcf3ce44SJohn Forte #include <stdlib.h>
32*fcf3ce44SJohn Forte #include <stdio.h>
33*fcf3ce44SJohn Forte #include <sys/file.h>
34*fcf3ce44SJohn Forte #include <sys/errno.h>
35*fcf3ce44SJohn Forte #include <sys/types.h>
36*fcf3ce44SJohn Forte #include <sys/stat.h>
37*fcf3ce44SJohn Forte #include <sys/param.h>
38*fcf3ce44SJohn Forte #include <kstat.h>
39*fcf3ce44SJohn Forte #include <sys/mkdev.h>
40*fcf3ce44SJohn Forte #include <locale.h>
41*fcf3ce44SJohn Forte #include <nl_types.h>
42*fcf3ce44SJohn Forte #include <fcntl.h>
43*fcf3ce44SJohn Forte #include <unistd.h>
44*fcf3ce44SJohn Forte #include <strings.h>
45*fcf3ce44SJohn Forte #include <ctype.h>
46*fcf3ce44SJohn Forte #include <dirent.h>
47*fcf3ce44SJohn Forte #include <limits.h>
48*fcf3ce44SJohn Forte #include <stdarg.h>
49*fcf3ce44SJohn Forte #include <termio.h> /* For password */
50*fcf3ce44SJohn Forte #include <signal.h>
51*fcf3ce44SJohn Forte #include <sys/scsi/scsi.h>
52*fcf3ce44SJohn Forte #include <sys/scsi/generic/commands.h>
53*fcf3ce44SJohn Forte #include <l_common.h>
54*fcf3ce44SJohn Forte #include <l_error.h>
55*fcf3ce44SJohn Forte #include <stgcom.h>
56*fcf3ce44SJohn Forte #include <a_state.h>
57*fcf3ce44SJohn Forte #include <devid.h>
58*fcf3ce44SJohn Forte #include <g_state.h>
59*fcf3ce44SJohn Forte #include "common.h"
60*fcf3ce44SJohn Forte
61*fcf3ce44SJohn Forte extern char *dtype[];
62*fcf3ce44SJohn Forte extern char *whoami;
63*fcf3ce44SJohn Forte extern int Options;
64*fcf3ce44SJohn Forte extern const int OPTION_A;
65*fcf3ce44SJohn Forte extern const int OPTION_B;
66*fcf3ce44SJohn Forte extern const int OPTION_C;
67*fcf3ce44SJohn Forte extern const int OPTION_D;
68*fcf3ce44SJohn Forte extern const int OPTION_E;
69*fcf3ce44SJohn Forte extern const int OPTION_F;
70*fcf3ce44SJohn Forte extern const int OPTION_L;
71*fcf3ce44SJohn Forte extern const int OPTION_P;
72*fcf3ce44SJohn Forte extern const int OPTION_R;
73*fcf3ce44SJohn Forte extern const int OPTION_T;
74*fcf3ce44SJohn Forte extern const int OPTION_V;
75*fcf3ce44SJohn Forte extern const int OPTION_Z;
76*fcf3ce44SJohn Forte extern const int OPTION_Y;
77*fcf3ce44SJohn Forte extern const int OPTION_CAPF;
78*fcf3ce44SJohn Forte extern const int PVERBOSE;
79*fcf3ce44SJohn Forte extern const int SAVE;
80*fcf3ce44SJohn Forte extern const int EXPERT;
81*fcf3ce44SJohn Forte
82*fcf3ce44SJohn Forte static struct termios termios;
83*fcf3ce44SJohn Forte static int termio_fd;
84*fcf3ce44SJohn Forte static void pho_display_config(char *);
85*fcf3ce44SJohn Forte static void dpm_display_config(char *);
86*fcf3ce44SJohn Forte static void n_rem_list_entry(uchar_t, struct gfc_map *,
87*fcf3ce44SJohn Forte WWN_list **);
88*fcf3ce44SJohn Forte static void n_rem_list_entry_fabric(int, struct gfc_map *,
89*fcf3ce44SJohn Forte WWN_list **);
90*fcf3ce44SJohn Forte static void n_rem_wwn_entry(uchar_t *, WWN_list **);
91*fcf3ce44SJohn Forte static void display_disk_info(L_inquiry, L_disk_state,
92*fcf3ce44SJohn Forte Path_struct *, struct mode_page *, int, char *, int);
93*fcf3ce44SJohn Forte static void display_lun_info(L_disk_state, Path_struct *,
94*fcf3ce44SJohn Forte struct mode_page *, int, WWN_list *, char *);
95*fcf3ce44SJohn Forte static void display_fc_disk(struct path_struct *, char *, gfc_map_t *,
96*fcf3ce44SJohn Forte L_inquiry, int);
97*fcf3ce44SJohn Forte static void adm_display_err(char *, int);
98*fcf3ce44SJohn Forte static void temperature_messages(struct l_state_struct *, int);
99*fcf3ce44SJohn Forte static void ctlr_messages(struct l_state_struct *, int, int);
100*fcf3ce44SJohn Forte static void fan_messages(struct l_state_struct *, int, int);
101*fcf3ce44SJohn Forte static void ps_messages(struct l_state_struct *, int, int);
102*fcf3ce44SJohn Forte static void abnormal_condition_display(struct l_state_struct *);
103*fcf3ce44SJohn Forte static void loop_messages(struct l_state_struct *, int, int);
104*fcf3ce44SJohn Forte static void revision_msg(struct l_state_struct *, int);
105*fcf3ce44SJohn Forte static void mb_messages(struct l_state_struct *, int, int);
106*fcf3ce44SJohn Forte static void back_plane_messages(struct l_state_struct *, int, int);
107*fcf3ce44SJohn Forte static void dpm_SSC100_messages(struct l_state_struct *, int, int);
108*fcf3ce44SJohn Forte static void mb_messages(struct l_state_struct *, int, int);
109*fcf3ce44SJohn Forte static void back_plane_messages(struct l_state_struct *, int, int);
110*fcf3ce44SJohn Forte static void dpm_SSC100_messages(struct l_state_struct *, int, int);
111*fcf3ce44SJohn Forte static void trans_decode(Trans_elem_st *trans);
112*fcf3ce44SJohn Forte static void trans_messages(struct l_state_struct *, int);
113*fcf3ce44SJohn Forte static void adm_print_pathlist(char *);
114*fcf3ce44SJohn Forte static void display_path_info(char *, char *, WWN_list *);
115*fcf3ce44SJohn Forte static void copy_wwn_data_to_str(char *, const uchar_t *);
116*fcf3ce44SJohn Forte static void adm_mplist_free(struct mplist_struct *);
117*fcf3ce44SJohn Forte static int lun_display(Path_struct *path_struct, L_inquiry inq_struct,
118*fcf3ce44SJohn Forte int verbose);
119*fcf3ce44SJohn Forte static int non_encl_fc_disk_display(Path_struct *path_struct,
120*fcf3ce44SJohn Forte L_inquiry inq_struct, int verbose);
121*fcf3ce44SJohn Forte static int get_enclStatus(char *phys_path, char *encl_name, int off_flag);
122*fcf3ce44SJohn Forte static int get_host_controller_pwwn(char *hba_path, uchar_t *pwwn);
123*fcf3ce44SJohn Forte static int get_lun_capacity(char *devpath,
124*fcf3ce44SJohn Forte struct scsi_capacity_16 *cap_data);
125*fcf3ce44SJohn Forte static int get_path_status(char *devpath, int *status);
126*fcf3ce44SJohn Forte static int get_FC4_host_controller_pwwn(char *hba_path, uchar_t *pwwn);
127*fcf3ce44SJohn Forte
128*fcf3ce44SJohn Forte /*
129*fcf3ce44SJohn Forte * Gets the device's state from the SENA IB and
130*fcf3ce44SJohn Forte * checks whether device is offlined, bypassed
131*fcf3ce44SJohn Forte * or if the slot is empty and prints it to the
132*fcf3ce44SJohn Forte * stdout.
133*fcf3ce44SJohn Forte *
134*fcf3ce44SJohn Forte * RETURNS:
135*fcf3ce44SJohn Forte * 0 O.K.
136*fcf3ce44SJohn Forte * non-zero otherwise
137*fcf3ce44SJohn Forte */
138*fcf3ce44SJohn Forte int
print_devState(char * devname,char * ppath,int fr_flag,int slot,int verbose_flag)139*fcf3ce44SJohn Forte print_devState(char *devname, char *ppath, int fr_flag, int slot,
140*fcf3ce44SJohn Forte int verbose_flag)
141*fcf3ce44SJohn Forte {
142*fcf3ce44SJohn Forte L_state l_state;
143*fcf3ce44SJohn Forte int err;
144*fcf3ce44SJohn Forte int i, elem_index = 0;
145*fcf3ce44SJohn Forte uchar_t device_off, ib_status_code, bypass_a_en, bypass_b_en;
146*fcf3ce44SJohn Forte Bp_elem_st bpf, bpr;
147*fcf3ce44SJohn Forte
148*fcf3ce44SJohn Forte
149*fcf3ce44SJohn Forte if ((err = l_get_status(ppath, &l_state, verbose_flag)) != 0) {
150*fcf3ce44SJohn Forte (void) print_errString(err, ppath);
151*fcf3ce44SJohn Forte return (err);
152*fcf3ce44SJohn Forte }
153*fcf3ce44SJohn Forte
154*fcf3ce44SJohn Forte for (i = 0; i < (int)l_state.ib_tbl.config.enc_num_elem; i++) {
155*fcf3ce44SJohn Forte elem_index++;
156*fcf3ce44SJohn Forte if (l_state.ib_tbl.config.type_hdr[i].type == ELM_TYP_BP) {
157*fcf3ce44SJohn Forte break;
158*fcf3ce44SJohn Forte }
159*fcf3ce44SJohn Forte elem_index += l_state.ib_tbl.config.type_hdr[i].num;
160*fcf3ce44SJohn Forte }
161*fcf3ce44SJohn Forte (void) bcopy((const void *)
162*fcf3ce44SJohn Forte &(l_state.ib_tbl.p2_s.element[elem_index]),
163*fcf3ce44SJohn Forte (void *)&bpf, sizeof (bpf));
164*fcf3ce44SJohn Forte (void) bcopy((const void *)
165*fcf3ce44SJohn Forte &(l_state.ib_tbl.p2_s.element[elem_index + 1]),
166*fcf3ce44SJohn Forte (void *)&bpr, sizeof (bpr));
167*fcf3ce44SJohn Forte
168*fcf3ce44SJohn Forte if (fr_flag) {
169*fcf3ce44SJohn Forte device_off = l_state.drv_front[slot].ib_status.dev_off;
170*fcf3ce44SJohn Forte bypass_a_en = l_state.drv_front[slot].ib_status.bypass_a_en;
171*fcf3ce44SJohn Forte bypass_b_en = l_state.drv_front[slot].ib_status.bypass_b_en;
172*fcf3ce44SJohn Forte ib_status_code = l_state.drv_front[slot].ib_status.code;
173*fcf3ce44SJohn Forte } else {
174*fcf3ce44SJohn Forte device_off = l_state.drv_rear[slot].ib_status.dev_off;
175*fcf3ce44SJohn Forte bypass_a_en = l_state.drv_rear[slot].ib_status.bypass_a_en;
176*fcf3ce44SJohn Forte bypass_b_en = l_state.drv_rear[slot].ib_status.bypass_b_en;
177*fcf3ce44SJohn Forte ib_status_code = l_state.drv_rear[slot].ib_status.code;
178*fcf3ce44SJohn Forte }
179*fcf3ce44SJohn Forte if (device_off) {
180*fcf3ce44SJohn Forte (void) fprintf(stdout,
181*fcf3ce44SJohn Forte MSGSTR(2000,
182*fcf3ce44SJohn Forte "%s is offlined and bypassed.\n"
183*fcf3ce44SJohn Forte " Could not get device specific"
184*fcf3ce44SJohn Forte " information.\n\n"),
185*fcf3ce44SJohn Forte devname);
186*fcf3ce44SJohn Forte } else if (bypass_a_en && bypass_b_en) {
187*fcf3ce44SJohn Forte (void) fprintf(stdout,
188*fcf3ce44SJohn Forte MSGSTR(2001,
189*fcf3ce44SJohn Forte "%s is bypassed (Port:AB).\n"
190*fcf3ce44SJohn Forte " Could not get device specific"
191*fcf3ce44SJohn Forte " information.\n\n"),
192*fcf3ce44SJohn Forte devname);
193*fcf3ce44SJohn Forte } else if (ib_status_code == S_NOT_INSTALLED) {
194*fcf3ce44SJohn Forte (void) fprintf(stdout,
195*fcf3ce44SJohn Forte MSGSTR(2002,
196*fcf3ce44SJohn Forte "Slot %s is empty.\n\n"),
197*fcf3ce44SJohn Forte devname);
198*fcf3ce44SJohn Forte } else if (((bpf.code != S_NOT_INSTALLED) &&
199*fcf3ce44SJohn Forte ((bpf.byp_a_enabled || bpf.en_bypass_a) &&
200*fcf3ce44SJohn Forte (bpf.byp_b_enabled || bpf.en_bypass_b))) ||
201*fcf3ce44SJohn Forte ((bpr.code != S_NOT_INSTALLED) &&
202*fcf3ce44SJohn Forte ((bpr.byp_a_enabled || bpr.en_bypass_a) &&
203*fcf3ce44SJohn Forte (bpr.byp_b_enabled || bpr.en_bypass_b)))) {
204*fcf3ce44SJohn Forte (void) fprintf(stdout,
205*fcf3ce44SJohn Forte MSGSTR(2003,
206*fcf3ce44SJohn Forte "Backplane(Port:AB) is bypassed.\n"
207*fcf3ce44SJohn Forte " Could not get device specific"
208*fcf3ce44SJohn Forte " information for"
209*fcf3ce44SJohn Forte " %s.\n\n"), devname);
210*fcf3ce44SJohn Forte } else {
211*fcf3ce44SJohn Forte (void) fprintf(stderr,
212*fcf3ce44SJohn Forte MSGSTR(33,
213*fcf3ce44SJohn Forte " Error: converting"
214*fcf3ce44SJohn Forte " %s to physical path.\n"
215*fcf3ce44SJohn Forte " Invalid pathname.\n"),
216*fcf3ce44SJohn Forte devname);
217*fcf3ce44SJohn Forte }
218*fcf3ce44SJohn Forte return (-1);
219*fcf3ce44SJohn Forte }
220*fcf3ce44SJohn Forte
221*fcf3ce44SJohn Forte /*
222*fcf3ce44SJohn Forte * Given an error number, this functions
223*fcf3ce44SJohn Forte * calls the get_errString() to print a
224*fcf3ce44SJohn Forte * corresponding error message to the stderr.
225*fcf3ce44SJohn Forte * get_errString() always returns an error
226*fcf3ce44SJohn Forte * message, even in case of undefined error number.
227*fcf3ce44SJohn Forte * So, there is no need to check for a NULL pointer
228*fcf3ce44SJohn Forte * while printing the error message to the stdout.
229*fcf3ce44SJohn Forte *
230*fcf3ce44SJohn Forte * RETURNS: N/A
231*fcf3ce44SJohn Forte *
232*fcf3ce44SJohn Forte */
233*fcf3ce44SJohn Forte void
print_errString(int errnum,char * devpath)234*fcf3ce44SJohn Forte print_errString(int errnum, char *devpath)
235*fcf3ce44SJohn Forte {
236*fcf3ce44SJohn Forte
237*fcf3ce44SJohn Forte char *errStr;
238*fcf3ce44SJohn Forte
239*fcf3ce44SJohn Forte errStr = g_get_errString(errnum);
240*fcf3ce44SJohn Forte
241*fcf3ce44SJohn Forte if (devpath == NULL) {
242*fcf3ce44SJohn Forte (void) fprintf(stderr,
243*fcf3ce44SJohn Forte "%s \n\n", errStr);
244*fcf3ce44SJohn Forte } else {
245*fcf3ce44SJohn Forte (void) fprintf(stderr,
246*fcf3ce44SJohn Forte "%s - %s.\n\n", errStr, devpath);
247*fcf3ce44SJohn Forte }
248*fcf3ce44SJohn Forte
249*fcf3ce44SJohn Forte /* free the allocated memory for error string */
250*fcf3ce44SJohn Forte if (errStr != NULL)
251*fcf3ce44SJohn Forte (void) free(errStr);
252*fcf3ce44SJohn Forte }
253*fcf3ce44SJohn Forte
254*fcf3ce44SJohn Forte /*
255*fcf3ce44SJohn Forte * adm_inquiry() Display the inquiry information for
256*fcf3ce44SJohn Forte * a SENA enclosure(s) or disk(s).
257*fcf3ce44SJohn Forte *
258*fcf3ce44SJohn Forte * RETURNS:
259*fcf3ce44SJohn Forte * none.
260*fcf3ce44SJohn Forte */
261*fcf3ce44SJohn Forte int
adm_inquiry(char ** argv)262*fcf3ce44SJohn Forte adm_inquiry(char **argv)
263*fcf3ce44SJohn Forte {
264*fcf3ce44SJohn Forte L_inquiry inq;
265*fcf3ce44SJohn Forte L_inquiry80 inq80;
266*fcf3ce44SJohn Forte size_t serial_len;
267*fcf3ce44SJohn Forte int path_index = 0, retval = 0;
268*fcf3ce44SJohn Forte int slot, f_r, err = 0, argpwwn, argnwwn;
269*fcf3ce44SJohn Forte char inq_path[MAXNAMELEN];
270*fcf3ce44SJohn Forte char *path_phys = NULL, *ptr;
271*fcf3ce44SJohn Forte Path_struct *path_struct;
272*fcf3ce44SJohn Forte WWN_list *wwn_list, *wwn_list_ptr, *list_start;
273*fcf3ce44SJohn Forte char last_logical_path[MAXPATHLEN];
274*fcf3ce44SJohn Forte
275*fcf3ce44SJohn Forte while (argv[path_index] != NULL) {
276*fcf3ce44SJohn Forte if ((err = l_convert_name(argv[path_index], &path_phys,
277*fcf3ce44SJohn Forte &path_struct, Options & PVERBOSE)) != 0) {
278*fcf3ce44SJohn Forte (void) strcpy(inq_path, argv[path_index]);
279*fcf3ce44SJohn Forte if (((ptr = strstr(inq_path, ",")) != NULL) &&
280*fcf3ce44SJohn Forte ((*(ptr + 1) == 'f') || (*(ptr + 1) == 'r') ||
281*fcf3ce44SJohn Forte (*(ptr +1) == 's'))) {
282*fcf3ce44SJohn Forte if (err != -1) {
283*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
284*fcf3ce44SJohn Forte path_index++;
285*fcf3ce44SJohn Forte retval++;
286*fcf3ce44SJohn Forte continue;
287*fcf3ce44SJohn Forte }
288*fcf3ce44SJohn Forte *ptr = NULL;
289*fcf3ce44SJohn Forte slot = path_struct->slot;
290*fcf3ce44SJohn Forte f_r = path_struct->f_flag;
291*fcf3ce44SJohn Forte path_phys = NULL;
292*fcf3ce44SJohn Forte if ((err = l_convert_name(inq_path, &path_phys,
293*fcf3ce44SJohn Forte &path_struct, Options & PVERBOSE)) != 0) {
294*fcf3ce44SJohn Forte (void) fprintf(stderr,
295*fcf3ce44SJohn Forte MSGSTR(33,
296*fcf3ce44SJohn Forte " Error: converting"
297*fcf3ce44SJohn Forte " %s to physical path.\n"
298*fcf3ce44SJohn Forte " Invalid pathname.\n"),
299*fcf3ce44SJohn Forte argv[path_index]);
300*fcf3ce44SJohn Forte if (err != -1) {
301*fcf3ce44SJohn Forte (void) print_errString(err,
302*fcf3ce44SJohn Forte argv[path_index]);
303*fcf3ce44SJohn Forte }
304*fcf3ce44SJohn Forte path_index++;
305*fcf3ce44SJohn Forte retval++;
306*fcf3ce44SJohn Forte continue;
307*fcf3ce44SJohn Forte }
308*fcf3ce44SJohn Forte if ((err = print_devState(argv[path_index],
309*fcf3ce44SJohn Forte path_struct->p_physical_path,
310*fcf3ce44SJohn Forte f_r, slot, Options & PVERBOSE)) != 0) {
311*fcf3ce44SJohn Forte path_index++;
312*fcf3ce44SJohn Forte retval++;
313*fcf3ce44SJohn Forte continue;
314*fcf3ce44SJohn Forte }
315*fcf3ce44SJohn Forte } else {
316*fcf3ce44SJohn Forte if (err != -1) {
317*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
318*fcf3ce44SJohn Forte } else {
319*fcf3ce44SJohn Forte (void) fprintf(stderr, "\n ");
320*fcf3ce44SJohn Forte (void) fprintf(stderr,
321*fcf3ce44SJohn Forte MSGSTR(112, "Error: Invalid pathname (%s)"),
322*fcf3ce44SJohn Forte argv[path_index]);
323*fcf3ce44SJohn Forte (void) fprintf(stderr, "\n");
324*fcf3ce44SJohn Forte }
325*fcf3ce44SJohn Forte }
326*fcf3ce44SJohn Forte path_index++;
327*fcf3ce44SJohn Forte retval++;
328*fcf3ce44SJohn Forte continue;
329*fcf3ce44SJohn Forte }
330*fcf3ce44SJohn Forte
331*fcf3ce44SJohn Forte if (strstr(argv[path_index], "/") != NULL) {
332*fcf3ce44SJohn Forte if (err = g_get_inquiry(path_phys, &inq)) {
333*fcf3ce44SJohn Forte (void) fprintf(stderr, "\n");
334*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
335*fcf3ce44SJohn Forte (void) fprintf(stderr, "\n");
336*fcf3ce44SJohn Forte path_index++;
337*fcf3ce44SJohn Forte retval++;
338*fcf3ce44SJohn Forte continue;
339*fcf3ce44SJohn Forte }
340*fcf3ce44SJohn Forte
341*fcf3ce44SJohn Forte serial_len = sizeof (inq80.inq_serial);
342*fcf3ce44SJohn Forte if (err = g_get_serial_number(path_phys, inq80.inq_serial,
343*fcf3ce44SJohn Forte &serial_len)) {
344*fcf3ce44SJohn Forte (void) fprintf(stderr, "\n");
345*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
346*fcf3ce44SJohn Forte (void) fprintf(stderr, "\n");
347*fcf3ce44SJohn Forte path_index++;
348*fcf3ce44SJohn Forte retval++;
349*fcf3ce44SJohn Forte continue;
350*fcf3ce44SJohn Forte }
351*fcf3ce44SJohn Forte print_inq_data(argv[path_index], path_phys, inq,
352*fcf3ce44SJohn Forte inq80.inq_serial, serial_len);
353*fcf3ce44SJohn Forte path_index++;
354*fcf3ce44SJohn Forte continue;
355*fcf3ce44SJohn Forte }
356*fcf3ce44SJohn Forte if ((err = g_get_wwn_list(&wwn_list, 0)) != 0) {
357*fcf3ce44SJohn Forte return (err);
358*fcf3ce44SJohn Forte }
359*fcf3ce44SJohn Forte g_sort_wwn_list(&wwn_list);
360*fcf3ce44SJohn Forte list_start = wwn_list;
361*fcf3ce44SJohn Forte argpwwn = argnwwn = 0;
362*fcf3ce44SJohn Forte (void) strcpy(last_logical_path, path_phys);
363*fcf3ce44SJohn Forte for (wwn_list_ptr = wwn_list; wwn_list_ptr != NULL;
364*fcf3ce44SJohn Forte wwn_list_ptr = wwn_list_ptr->wwn_next) {
365*fcf3ce44SJohn Forte if (strcasecmp(wwn_list_ptr->port_wwn_s, path_struct->argv) ==
366*fcf3ce44SJohn Forte 0) {
367*fcf3ce44SJohn Forte list_start = wwn_list_ptr;
368*fcf3ce44SJohn Forte argpwwn = 1;
369*fcf3ce44SJohn Forte break;
370*fcf3ce44SJohn Forte } else if (strcasecmp(wwn_list_ptr->node_wwn_s,
371*fcf3ce44SJohn Forte path_struct->argv) == 0) {
372*fcf3ce44SJohn Forte list_start = wwn_list_ptr;
373*fcf3ce44SJohn Forte argnwwn = 1;
374*fcf3ce44SJohn Forte break;
375*fcf3ce44SJohn Forte }
376*fcf3ce44SJohn Forte }
377*fcf3ce44SJohn Forte
378*fcf3ce44SJohn Forte if (!(argpwwn || argnwwn)) {
379*fcf3ce44SJohn Forte /*
380*fcf3ce44SJohn Forte * if the wwn list is null or the arg device not found
381*fcf3ce44SJohn Forte * from the wwn list, still go ahead to issue inquiry.
382*fcf3ce44SJohn Forte */
383*fcf3ce44SJohn Forte if (err = g_get_inquiry(path_phys, &inq)) {
384*fcf3ce44SJohn Forte (void) fprintf(stderr, "\n");
385*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
386*fcf3ce44SJohn Forte (void) fprintf(stderr, "\n");
387*fcf3ce44SJohn Forte path_index++;
388*fcf3ce44SJohn Forte retval++;
389*fcf3ce44SJohn Forte continue;
390*fcf3ce44SJohn Forte }
391*fcf3ce44SJohn Forte
392*fcf3ce44SJohn Forte serial_len = sizeof (inq80.inq_serial);
393*fcf3ce44SJohn Forte if (err = g_get_serial_number(path_phys, inq80.inq_serial,
394*fcf3ce44SJohn Forte &serial_len)) {
395*fcf3ce44SJohn Forte (void) fprintf(stderr, "\n");
396*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
397*fcf3ce44SJohn Forte (void) fprintf(stderr, "\n");
398*fcf3ce44SJohn Forte path_index++;
399*fcf3ce44SJohn Forte retval++;
400*fcf3ce44SJohn Forte continue;
401*fcf3ce44SJohn Forte }
402*fcf3ce44SJohn Forte print_inq_data(argv[path_index], path_phys, inq,
403*fcf3ce44SJohn Forte inq80.inq_serial, serial_len);
404*fcf3ce44SJohn Forte (void) g_free_wwn_list(&wwn_list);
405*fcf3ce44SJohn Forte path_index++;
406*fcf3ce44SJohn Forte continue;
407*fcf3ce44SJohn Forte }
408*fcf3ce44SJohn Forte
409*fcf3ce44SJohn Forte for (wwn_list_ptr = list_start; wwn_list_ptr != NULL;
410*fcf3ce44SJohn Forte wwn_list_ptr = wwn_list_ptr->wwn_next) {
411*fcf3ce44SJohn Forte if (argpwwn) {
412*fcf3ce44SJohn Forte if (strcasecmp(wwn_list_ptr->port_wwn_s,
413*fcf3ce44SJohn Forte path_struct->argv) != 0) {
414*fcf3ce44SJohn Forte continue;
415*fcf3ce44SJohn Forte }
416*fcf3ce44SJohn Forte (void) strcpy(path_phys,
417*fcf3ce44SJohn Forte wwn_list_ptr->physical_path);
418*fcf3ce44SJohn Forte } else if (argnwwn) {
419*fcf3ce44SJohn Forte if (strcasecmp(wwn_list_ptr->node_wwn_s,
420*fcf3ce44SJohn Forte path_struct->argv) != 0) {
421*fcf3ce44SJohn Forte continue;
422*fcf3ce44SJohn Forte }
423*fcf3ce44SJohn Forte if (strstr(wwn_list_ptr->logical_path,
424*fcf3ce44SJohn Forte last_logical_path) != NULL) {
425*fcf3ce44SJohn Forte continue;
426*fcf3ce44SJohn Forte }
427*fcf3ce44SJohn Forte (void) strcpy(path_phys,
428*fcf3ce44SJohn Forte wwn_list_ptr->physical_path);
429*fcf3ce44SJohn Forte (void) strcpy(last_logical_path,
430*fcf3ce44SJohn Forte wwn_list_ptr->logical_path);
431*fcf3ce44SJohn Forte }
432*fcf3ce44SJohn Forte
433*fcf3ce44SJohn Forte if (err = g_get_inquiry(path_phys, &inq)) {
434*fcf3ce44SJohn Forte (void) fprintf(stderr, "\n");
435*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
436*fcf3ce44SJohn Forte (void) fprintf(stderr, "\n");
437*fcf3ce44SJohn Forte retval++;
438*fcf3ce44SJohn Forte break;
439*fcf3ce44SJohn Forte }
440*fcf3ce44SJohn Forte
441*fcf3ce44SJohn Forte serial_len = sizeof (inq80.inq_serial);
442*fcf3ce44SJohn Forte if (err = g_get_serial_number(path_phys, inq80.inq_serial,
443*fcf3ce44SJohn Forte &serial_len)) {
444*fcf3ce44SJohn Forte (void) fprintf(stderr, "\n");
445*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
446*fcf3ce44SJohn Forte (void) fprintf(stderr, "\n");
447*fcf3ce44SJohn Forte retval++;
448*fcf3ce44SJohn Forte break;
449*fcf3ce44SJohn Forte }
450*fcf3ce44SJohn Forte print_inq_data(argv[path_index], path_phys, inq,
451*fcf3ce44SJohn Forte inq80.inq_serial, serial_len);
452*fcf3ce44SJohn Forte
453*fcf3ce44SJohn Forte }
454*fcf3ce44SJohn Forte
455*fcf3ce44SJohn Forte (void) g_free_wwn_list(&wwn_list);
456*fcf3ce44SJohn Forte path_index++;
457*fcf3ce44SJohn Forte }
458*fcf3ce44SJohn Forte return (retval);
459*fcf3ce44SJohn Forte }
460*fcf3ce44SJohn Forte
461*fcf3ce44SJohn Forte /*
462*fcf3ce44SJohn Forte * FORCELIP expert function
463*fcf3ce44SJohn Forte */
464*fcf3ce44SJohn Forte int
adm_forcelip(char ** argv)465*fcf3ce44SJohn Forte adm_forcelip(char **argv)
466*fcf3ce44SJohn Forte {
467*fcf3ce44SJohn Forte int slot, f_r, path_index = 0, err = 0, retval = 0;
468*fcf3ce44SJohn Forte Path_struct *path_struct = NULL;
469*fcf3ce44SJohn Forte char *path_phys = NULL, *ptr;
470*fcf3ce44SJohn Forte char err_path[MAXNAMELEN];
471*fcf3ce44SJohn Forte
472*fcf3ce44SJohn Forte while (argv[path_index] != NULL) {
473*fcf3ce44SJohn Forte if ((err = l_convert_name(argv[path_index], &path_phys,
474*fcf3ce44SJohn Forte &path_struct, Options & PVERBOSE)) != 0) {
475*fcf3ce44SJohn Forte (void) strcpy(err_path, argv[path_index]);
476*fcf3ce44SJohn Forte if (err != -1) {
477*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
478*fcf3ce44SJohn Forte path_index++;
479*fcf3ce44SJohn Forte retval++;
480*fcf3ce44SJohn Forte continue;
481*fcf3ce44SJohn Forte }
482*fcf3ce44SJohn Forte if (((ptr = strstr(err_path, ", ")) != NULL) &&
483*fcf3ce44SJohn Forte ((*(ptr + 1) == 'f') || (*(ptr + 1) == 'r') ||
484*fcf3ce44SJohn Forte (*(ptr +1) == 's'))) {
485*fcf3ce44SJohn Forte *ptr = NULL;
486*fcf3ce44SJohn Forte slot = path_struct->slot;
487*fcf3ce44SJohn Forte f_r = path_struct->f_flag;
488*fcf3ce44SJohn Forte path_phys = NULL;
489*fcf3ce44SJohn Forte if ((err = l_convert_name(err_path,
490*fcf3ce44SJohn Forte &path_phys, &path_struct,
491*fcf3ce44SJohn Forte Options & PVERBOSE)) != 0) {
492*fcf3ce44SJohn Forte (void) fprintf(stderr, MSGSTR(33,
493*fcf3ce44SJohn Forte " Error: converting"
494*fcf3ce44SJohn Forte " %s to physical path.\n"
495*fcf3ce44SJohn Forte " Invalid pathname.\n"),
496*fcf3ce44SJohn Forte argv[path_index]);
497*fcf3ce44SJohn Forte if (err != -1) {
498*fcf3ce44SJohn Forte (void) print_errString(err,
499*fcf3ce44SJohn Forte argv[path_index]);
500*fcf3ce44SJohn Forte }
501*fcf3ce44SJohn Forte path_index++;
502*fcf3ce44SJohn Forte retval++;
503*fcf3ce44SJohn Forte continue;
504*fcf3ce44SJohn Forte }
505*fcf3ce44SJohn Forte if ((err = print_devState(argv[path_index],
506*fcf3ce44SJohn Forte path_struct->p_physical_path,
507*fcf3ce44SJohn Forte f_r, slot, Options & PVERBOSE)) != 0) {
508*fcf3ce44SJohn Forte path_index++;
509*fcf3ce44SJohn Forte retval++;
510*fcf3ce44SJohn Forte continue;
511*fcf3ce44SJohn Forte }
512*fcf3ce44SJohn Forte } else {
513*fcf3ce44SJohn Forte (void) fprintf(stderr, "\n ");
514*fcf3ce44SJohn Forte (void) fprintf(stderr, MSGSTR(112,
515*fcf3ce44SJohn Forte "Error: Invalid pathname (%s)"),
516*fcf3ce44SJohn Forte argv[path_index]);
517*fcf3ce44SJohn Forte (void) fprintf(stderr, "\n");
518*fcf3ce44SJohn Forte }
519*fcf3ce44SJohn Forte path_index++;
520*fcf3ce44SJohn Forte retval++;
521*fcf3ce44SJohn Forte continue;
522*fcf3ce44SJohn Forte }
523*fcf3ce44SJohn Forte if (err = g_force_lip(path_phys, Options & PVERBOSE)) {
524*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
525*fcf3ce44SJohn Forte path_index++;
526*fcf3ce44SJohn Forte retval++;
527*fcf3ce44SJohn Forte continue;
528*fcf3ce44SJohn Forte }
529*fcf3ce44SJohn Forte path_index++;
530*fcf3ce44SJohn Forte if (path_struct != NULL) {
531*fcf3ce44SJohn Forte (void) free(path_struct);
532*fcf3ce44SJohn Forte }
533*fcf3ce44SJohn Forte }
534*fcf3ce44SJohn Forte return (retval);
535*fcf3ce44SJohn Forte }
536*fcf3ce44SJohn Forte
537*fcf3ce44SJohn Forte
538*fcf3ce44SJohn Forte /*
539*fcf3ce44SJohn Forte * DISPLAY function
540*fcf3ce44SJohn Forte *
541*fcf3ce44SJohn Forte * RETURNS:
542*fcf3ce44SJohn Forte * 0 O.K.
543*fcf3ce44SJohn Forte */
544*fcf3ce44SJohn Forte int
adm_display_config(char ** argv)545*fcf3ce44SJohn Forte adm_display_config(char **argv)
546*fcf3ce44SJohn Forte {
547*fcf3ce44SJohn Forte L_inquiry inq, ses_inq;
548*fcf3ce44SJohn Forte int i, slot, f_r, path_index = 0, err = 0, opnerr = 0;
549*fcf3ce44SJohn Forte int retval = 0;
550*fcf3ce44SJohn Forte gfc_map_t map;
551*fcf3ce44SJohn Forte Path_struct *path_struct;
552*fcf3ce44SJohn Forte char *path_phys = NULL, *ptr;
553*fcf3ce44SJohn Forte char ses_path[MAXPATHLEN], inq_path[MAXNAMELEN];
554*fcf3ce44SJohn Forte
555*fcf3ce44SJohn Forte
556*fcf3ce44SJohn Forte while (argv[path_index] != NULL) {
557*fcf3ce44SJohn Forte VERBPRINT(MSGSTR(2108, " Displaying information for: %s\n"),
558*fcf3ce44SJohn Forte argv[path_index]);
559*fcf3ce44SJohn Forte map.dev_addr = (gfc_port_dev_info_t *)NULL;
560*fcf3ce44SJohn Forte if ((err = l_convert_name(argv[path_index], &path_phys,
561*fcf3ce44SJohn Forte &path_struct, Options & PVERBOSE)) != 0) {
562*fcf3ce44SJohn Forte if (strstr(argv[path_index], SCSI_VHCI) == NULL) {
563*fcf3ce44SJohn Forte
564*fcf3ce44SJohn Forte (void) strcpy(inq_path, argv[path_index]);
565*fcf3ce44SJohn Forte if (((ptr = strstr(inq_path, ",")) != NULL) &&
566*fcf3ce44SJohn Forte ((*(ptr + 1) == 'f') || (*(ptr + 1) == 'r') ||
567*fcf3ce44SJohn Forte (*(ptr +1) == 's'))) {
568*fcf3ce44SJohn Forte
569*fcf3ce44SJohn Forte if (err != -1) {
570*fcf3ce44SJohn Forte (void) print_errString(err,
571*fcf3ce44SJohn Forte argv[path_index]);
572*fcf3ce44SJohn Forte path_index++;
573*fcf3ce44SJohn Forte retval++;
574*fcf3ce44SJohn Forte continue;
575*fcf3ce44SJohn Forte }
576*fcf3ce44SJohn Forte *ptr = NULL;
577*fcf3ce44SJohn Forte slot = path_struct->slot;
578*fcf3ce44SJohn Forte f_r = path_struct->f_flag;
579*fcf3ce44SJohn Forte if ((err = l_convert_name(inq_path, &path_phys,
580*fcf3ce44SJohn Forte &path_struct, Options & PVERBOSE))
581*fcf3ce44SJohn Forte != 0) {
582*fcf3ce44SJohn Forte
583*fcf3ce44SJohn Forte (void) fprintf(stderr,
584*fcf3ce44SJohn Forte MSGSTR(33,
585*fcf3ce44SJohn Forte " Error: converting"
586*fcf3ce44SJohn Forte " %s to physical path.\n"
587*fcf3ce44SJohn Forte " Invalid pathname.\n"),
588*fcf3ce44SJohn Forte argv[path_index]);
589*fcf3ce44SJohn Forte if (err != -1) {
590*fcf3ce44SJohn Forte (void) print_errString(err,
591*fcf3ce44SJohn Forte argv[path_index]);
592*fcf3ce44SJohn Forte }
593*fcf3ce44SJohn Forte path_index++;
594*fcf3ce44SJohn Forte retval++;
595*fcf3ce44SJohn Forte continue;
596*fcf3ce44SJohn Forte }
597*fcf3ce44SJohn Forte
598*fcf3ce44SJohn Forte if ((err = print_devState(argv[path_index],
599*fcf3ce44SJohn Forte path_struct->p_physical_path,
600*fcf3ce44SJohn Forte f_r, slot, Options & PVERBOSE)) != 0) {
601*fcf3ce44SJohn Forte path_index++;
602*fcf3ce44SJohn Forte retval++;
603*fcf3ce44SJohn Forte continue;
604*fcf3ce44SJohn Forte }
605*fcf3ce44SJohn Forte } else {
606*fcf3ce44SJohn Forte if (err != -1) {
607*fcf3ce44SJohn Forte (void) print_errString(err,
608*fcf3ce44SJohn Forte argv[path_index]);
609*fcf3ce44SJohn Forte } else {
610*fcf3ce44SJohn Forte (void) fprintf(stderr, "\n ");
611*fcf3ce44SJohn Forte (void) fprintf(stderr,
612*fcf3ce44SJohn Forte MSGSTR(112,
613*fcf3ce44SJohn Forte "Error: Invalid pathname (%s)"),
614*fcf3ce44SJohn Forte argv[path_index]);
615*fcf3ce44SJohn Forte (void) fprintf(stderr, "\n");
616*fcf3ce44SJohn Forte }
617*fcf3ce44SJohn Forte }
618*fcf3ce44SJohn Forte
619*fcf3ce44SJohn Forte } else {
620*fcf3ce44SJohn Forte if (err != -1) {
621*fcf3ce44SJohn Forte (void) print_errString(err,
622*fcf3ce44SJohn Forte argv[path_index]);
623*fcf3ce44SJohn Forte } else {
624*fcf3ce44SJohn Forte (void) fprintf(stderr, "\n ");
625*fcf3ce44SJohn Forte (void) fprintf(stderr,
626*fcf3ce44SJohn Forte MSGSTR(112,
627*fcf3ce44SJohn Forte "Error: Invalid pathname (%s)"),
628*fcf3ce44SJohn Forte argv[path_index]);
629*fcf3ce44SJohn Forte (void) fprintf(stderr, "\n");
630*fcf3ce44SJohn Forte }
631*fcf3ce44SJohn Forte }
632*fcf3ce44SJohn Forte
633*fcf3ce44SJohn Forte path_index++;
634*fcf3ce44SJohn Forte retval++;
635*fcf3ce44SJohn Forte continue;
636*fcf3ce44SJohn Forte }
637*fcf3ce44SJohn Forte
638*fcf3ce44SJohn Forte /*
639*fcf3ce44SJohn Forte * See what kind of device we are talking to.
640*fcf3ce44SJohn Forte */
641*fcf3ce44SJohn Forte if ((opnerr = g_get_inquiry(path_phys, &inq)) != 0) {
642*fcf3ce44SJohn Forte if (opnerr == L_OPEN_PATH_FAIL) {
643*fcf3ce44SJohn Forte /*
644*fcf3ce44SJohn Forte * We check only for L_OPEN_PATH_FAIL because
645*fcf3ce44SJohn Forte * that is the only error code returned by
646*fcf3ce44SJohn Forte * g_get_inquiry() which is not got from the ioctl
647*fcf3ce44SJohn Forte * call itself. So, we are dependent, in a way, on the
648*fcf3ce44SJohn Forte * implementation of g_get_inquiry().
649*fcf3ce44SJohn Forte *
650*fcf3ce44SJohn Forte */
651*fcf3ce44SJohn Forte (void) print_errString(errno, argv[path_index]);
652*fcf3ce44SJohn Forte path_index++;
653*fcf3ce44SJohn Forte retval++;
654*fcf3ce44SJohn Forte continue;
655*fcf3ce44SJohn Forte }
656*fcf3ce44SJohn Forte } else if (!g_enclDiskChk((char *)inq.inq_vid,
657*fcf3ce44SJohn Forte (char *)inq.inq_pid)) {
658*fcf3ce44SJohn Forte if ((err = lun_display(path_struct,
659*fcf3ce44SJohn Forte inq, Options & PVERBOSE)) != 0) {
660*fcf3ce44SJohn Forte (void) print_errString(err, path_phys);
661*fcf3ce44SJohn Forte exit(1);
662*fcf3ce44SJohn Forte }
663*fcf3ce44SJohn Forte } else if (strstr((char *)inq.inq_pid, ENCLOSURE_PROD_ID) != NULL) {
664*fcf3ce44SJohn Forte /*
665*fcf3ce44SJohn Forte * Display SENA enclosure.
666*fcf3ce44SJohn Forte */
667*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n\t\t\t\t ");
668*fcf3ce44SJohn Forte print_chars(inq.inq_pid, sizeof (inq.inq_pid), 0);
669*fcf3ce44SJohn Forte
670*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
671*fcf3ce44SJohn Forte if (Options & OPTION_R) {
672*fcf3ce44SJohn Forte adm_display_err(path_phys,
673*fcf3ce44SJohn Forte (inq.inq_dtype & DTYPE_MASK));
674*fcf3ce44SJohn Forte } else {
675*fcf3ce44SJohn Forte pho_display_config(path_phys);
676*fcf3ce44SJohn Forte }
677*fcf3ce44SJohn Forte } else if ((((inq.inq_dtype & DTYPE_MASK) == DTYPE_ESI)) &&
678*fcf3ce44SJohn Forte (l_get_enc_type(inq) == DAK_ENC_TYPE)) {
679*fcf3ce44SJohn Forte /*
680*fcf3ce44SJohn Forte * Display for the Daktari/DPM
681*fcf3ce44SJohn Forte */
682*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n\t\t");
683*fcf3ce44SJohn Forte for (i = 0; i < sizeof (inq.inq_pid); i++) {
684*fcf3ce44SJohn Forte (void) fprintf(stdout, "%c", inq.inq_pid[i]);
685*fcf3ce44SJohn Forte }
686*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
687*fcf3ce44SJohn Forte if (Options & OPTION_R) {
688*fcf3ce44SJohn Forte adm_display_err(path_phys,
689*fcf3ce44SJohn Forte (inq.inq_dtype & DTYPE_MASK));
690*fcf3ce44SJohn Forte } else {
691*fcf3ce44SJohn Forte dpm_display_config(path_phys);
692*fcf3ce44SJohn Forte }
693*fcf3ce44SJohn Forte /*
694*fcf3ce44SJohn Forte * if device is in SENA enclosure
695*fcf3ce44SJohn Forte *
696*fcf3ce44SJohn Forte * if the slot is valid, then I know this is a SENA enclosure
697*fcf3ce44SJohn Forte * and can continue
698*fcf3ce44SJohn Forte * otherwise:
699*fcf3ce44SJohn Forte * I first get the ses_path, if this doesn't fail
700*fcf3ce44SJohn Forte * I retrieve the inquiry data from the ses node
701*fcf3ce44SJohn Forte * and check teh PID to make sure this is a SENA
702*fcf3ce44SJohn Forte */
703*fcf3ce44SJohn Forte } else if (((inq.inq_dtype & DTYPE_MASK) == DTYPE_DIRECT) &&
704*fcf3ce44SJohn Forte ((path_struct->slot_valid == 1) ||
705*fcf3ce44SJohn Forte ((g_get_dev_map(path_phys, &map,
706*fcf3ce44SJohn Forte (Options & PVERBOSE)) == 0) &&
707*fcf3ce44SJohn Forte (l_get_ses_path(path_phys, ses_path,
708*fcf3ce44SJohn Forte &map, Options & PVERBOSE) == 0) &&
709*fcf3ce44SJohn Forte (g_get_inquiry(ses_path, &ses_inq) == 0) &&
710*fcf3ce44SJohn Forte ((strstr((char *)ses_inq.inq_pid, ENCLOSURE_PROD_ID)
711*fcf3ce44SJohn Forte != NULL))))) {
712*fcf3ce44SJohn Forte if (Options & OPTION_R) {
713*fcf3ce44SJohn Forte adm_display_err(path_phys,
714*fcf3ce44SJohn Forte (inq.inq_dtype & DTYPE_MASK));
715*fcf3ce44SJohn Forte } else {
716*fcf3ce44SJohn Forte display_fc_disk(path_struct, ses_path, &map, inq,
717*fcf3ce44SJohn Forte Options & PVERBOSE);
718*fcf3ce44SJohn Forte }
719*fcf3ce44SJohn Forte
720*fcf3ce44SJohn Forte } else if (strstr((char *)inq.inq_pid, "SUN_SEN") != 0) {
721*fcf3ce44SJohn Forte if (strcmp(argv[path_index], path_phys) != 0) {
722*fcf3ce44SJohn Forte (void) fprintf(stdout, " ");
723*fcf3ce44SJohn Forte (void) fprintf(stdout,
724*fcf3ce44SJohn Forte MSGSTR(5, "Physical Path:"));
725*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n %s\n", path_phys);
726*fcf3ce44SJohn Forte }
727*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2109, "DEVICE is a "));
728*fcf3ce44SJohn Forte print_chars(inq.inq_vid, sizeof (inq.inq_vid), 1);
729*fcf3ce44SJohn Forte (void) fprintf(stdout, " ");
730*fcf3ce44SJohn Forte print_chars(inq.inq_pid, sizeof (inq.inq_pid), 1);
731*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2110, " card."));
732*fcf3ce44SJohn Forte if (inq.inq_len > 31) {
733*fcf3ce44SJohn Forte (void) fprintf(stdout, " ");
734*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(26, "Revision:"));
735*fcf3ce44SJohn Forte (void) fprintf(stdout, " ");
736*fcf3ce44SJohn Forte print_chars(inq.inq_revision,
737*fcf3ce44SJohn Forte sizeof (inq.inq_revision), 0);
738*fcf3ce44SJohn Forte }
739*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
740*fcf3ce44SJohn Forte /* if device is not in SENA or SSA enclosures. */
741*fcf3ce44SJohn Forte } else if ((inq.inq_dtype & DTYPE_MASK) < 0x10) {
742*fcf3ce44SJohn Forte switch ((inq.inq_dtype & DTYPE_MASK)) {
743*fcf3ce44SJohn Forte case DTYPE_DIRECT:
744*fcf3ce44SJohn Forte case DTYPE_SEQUENTIAL: /* Tape */
745*fcf3ce44SJohn Forte if (Options & OPTION_R) {
746*fcf3ce44SJohn Forte adm_display_err(path_phys,
747*fcf3ce44SJohn Forte (inq.inq_dtype & DTYPE_MASK));
748*fcf3ce44SJohn Forte } else if (non_encl_fc_disk_display(path_struct,
749*fcf3ce44SJohn Forte inq, Options & PVERBOSE) != 0) {
750*fcf3ce44SJohn Forte (void) fprintf(stderr,
751*fcf3ce44SJohn Forte MSGSTR(2111,
752*fcf3ce44SJohn Forte "Error: getting the device"
753*fcf3ce44SJohn Forte " information.\n"));
754*fcf3ce44SJohn Forte retval++;
755*fcf3ce44SJohn Forte }
756*fcf3ce44SJohn Forte break;
757*fcf3ce44SJohn Forte /* case 0x01: same as default */
758*fcf3ce44SJohn Forte default:
759*fcf3ce44SJohn Forte (void) fprintf(stdout, " ");
760*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(35,
761*fcf3ce44SJohn Forte "Device Type:"));
762*fcf3ce44SJohn Forte (void) fprintf(stdout, "%s\n",
763*fcf3ce44SJohn Forte dtype[inq.inq_dtype & DTYPE_MASK]);
764*fcf3ce44SJohn Forte break;
765*fcf3ce44SJohn Forte }
766*fcf3ce44SJohn Forte } else if ((inq.inq_dtype & DTYPE_MASK) < 0x1f) {
767*fcf3ce44SJohn Forte (void) fprintf(stdout,
768*fcf3ce44SJohn Forte MSGSTR(2112, " Device type: Reserved"));
769*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
770*fcf3ce44SJohn Forte } else {
771*fcf3ce44SJohn Forte (void) fprintf(stdout,
772*fcf3ce44SJohn Forte MSGSTR(2113, " Device type: Unknown device"));
773*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
774*fcf3ce44SJohn Forte }
775*fcf3ce44SJohn Forte path_index++;
776*fcf3ce44SJohn Forte if (map.dev_addr != NULL) {
777*fcf3ce44SJohn Forte free((void *)map.dev_addr);
778*fcf3ce44SJohn Forte }
779*fcf3ce44SJohn Forte (void) free(path_struct);
780*fcf3ce44SJohn Forte }
781*fcf3ce44SJohn Forte return (retval);
782*fcf3ce44SJohn Forte }
783*fcf3ce44SJohn Forte
784*fcf3ce44SJohn Forte
785*fcf3ce44SJohn Forte /*
786*fcf3ce44SJohn Forte * Powers off a list of SENA enclosure(s)
787*fcf3ce44SJohn Forte * and disk(s) which is provided by the user.
788*fcf3ce44SJohn Forte *
789*fcf3ce44SJohn Forte * RETURNS:
790*fcf3ce44SJohn Forte * none.
791*fcf3ce44SJohn Forte */
792*fcf3ce44SJohn Forte int
adm_power_off(char ** argv,int off_flag)793*fcf3ce44SJohn Forte adm_power_off(char **argv, int off_flag)
794*fcf3ce44SJohn Forte {
795*fcf3ce44SJohn Forte int path_index = 0, err = 0, retval = 0;
796*fcf3ce44SJohn Forte L_inquiry inq;
797*fcf3ce44SJohn Forte char *path_phys = NULL;
798*fcf3ce44SJohn Forte Path_struct *path_struct;
799*fcf3ce44SJohn Forte
800*fcf3ce44SJohn Forte while (argv[path_index] != NULL) {
801*fcf3ce44SJohn Forte if ((err = l_convert_name(argv[path_index], &path_phys,
802*fcf3ce44SJohn Forte &path_struct, Options & PVERBOSE)) != 0) {
803*fcf3ce44SJohn Forte /*
804*fcf3ce44SJohn Forte * In case we did not find the device
805*fcf3ce44SJohn Forte * in the /devices directory.
806*fcf3ce44SJohn Forte *
807*fcf3ce44SJohn Forte * Only valid for pathnames like box,f1
808*fcf3ce44SJohn Forte */
809*fcf3ce44SJohn Forte if (path_struct->ib_path_flag) {
810*fcf3ce44SJohn Forte path_phys = path_struct->p_physical_path;
811*fcf3ce44SJohn Forte } else {
812*fcf3ce44SJohn Forte (void) fprintf(stderr,
813*fcf3ce44SJohn Forte MSGSTR(33,
814*fcf3ce44SJohn Forte " Error: converting"
815*fcf3ce44SJohn Forte " %s to physical path.\n"
816*fcf3ce44SJohn Forte " Invalid pathname.\n"),
817*fcf3ce44SJohn Forte argv[path_index]);
818*fcf3ce44SJohn Forte if (err != -1) {
819*fcf3ce44SJohn Forte (void) print_errString(err,
820*fcf3ce44SJohn Forte argv[path_index]);
821*fcf3ce44SJohn Forte }
822*fcf3ce44SJohn Forte path_index++;
823*fcf3ce44SJohn Forte retval++;
824*fcf3ce44SJohn Forte continue;
825*fcf3ce44SJohn Forte }
826*fcf3ce44SJohn Forte }
827*fcf3ce44SJohn Forte if (path_struct->ib_path_flag) {
828*fcf3ce44SJohn Forte /*
829*fcf3ce44SJohn Forte * We are addressing a disk using a path
830*fcf3ce44SJohn Forte * format type box,f1.
831*fcf3ce44SJohn Forte */
832*fcf3ce44SJohn Forte if (err = l_dev_pwr_up_down(path_phys,
833*fcf3ce44SJohn Forte path_struct, off_flag, Options & PVERBOSE,
834*fcf3ce44SJohn Forte Options & OPTION_CAPF)) {
835*fcf3ce44SJohn Forte /*
836*fcf3ce44SJohn Forte * Is it Bypassed... try to give more
837*fcf3ce44SJohn Forte * informtaion.
838*fcf3ce44SJohn Forte */
839*fcf3ce44SJohn Forte print_devState(argv[path_index],
840*fcf3ce44SJohn Forte path_struct->p_physical_path,
841*fcf3ce44SJohn Forte path_struct->f_flag, path_struct->slot,
842*fcf3ce44SJohn Forte Options & PVERBOSE);
843*fcf3ce44SJohn Forte retval++;
844*fcf3ce44SJohn Forte }
845*fcf3ce44SJohn Forte path_index++;
846*fcf3ce44SJohn Forte continue;
847*fcf3ce44SJohn Forte }
848*fcf3ce44SJohn Forte
849*fcf3ce44SJohn Forte if (err = g_get_inquiry(path_phys, &inq)) {
850*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
851*fcf3ce44SJohn Forte path_index++;
852*fcf3ce44SJohn Forte retval++;
853*fcf3ce44SJohn Forte continue;
854*fcf3ce44SJohn Forte }
855*fcf3ce44SJohn Forte if ((strstr((char *)inq.inq_pid, ENCLOSURE_PROD_ID) != 0) ||
856*fcf3ce44SJohn Forte (strncmp((char *)inq.inq_vid, "SUN ",
857*fcf3ce44SJohn Forte sizeof (inq.inq_vid)) &&
858*fcf3ce44SJohn Forte ((inq.inq_dtype & DTYPE_MASK) == DTYPE_ESI))) {
859*fcf3ce44SJohn Forte
860*fcf3ce44SJohn Forte if (get_enclStatus(path_phys, argv[path_index],
861*fcf3ce44SJohn Forte off_flag) != 0) {
862*fcf3ce44SJohn Forte path_index++;
863*fcf3ce44SJohn Forte retval++;
864*fcf3ce44SJohn Forte continue;
865*fcf3ce44SJohn Forte }
866*fcf3ce44SJohn Forte /* power off SENA enclosure. */
867*fcf3ce44SJohn Forte if (err = l_pho_pwr_up_down(argv[path_index], path_phys,
868*fcf3ce44SJohn Forte off_flag, Options & PVERBOSE,
869*fcf3ce44SJohn Forte Options & OPTION_CAPF)) {
870*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
871*fcf3ce44SJohn Forte retval++;
872*fcf3ce44SJohn Forte }
873*fcf3ce44SJohn Forte } else if ((inq.inq_dtype & DTYPE_MASK) == DTYPE_DIRECT) {
874*fcf3ce44SJohn Forte if (err = l_dev_pwr_up_down(path_phys,
875*fcf3ce44SJohn Forte path_struct, off_flag, Options & PVERBOSE,
876*fcf3ce44SJohn Forte Options & OPTION_CAPF)) {
877*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
878*fcf3ce44SJohn Forte retval++;
879*fcf3ce44SJohn Forte }
880*fcf3ce44SJohn Forte } else {
881*fcf3ce44SJohn Forte /*
882*fcf3ce44SJohn Forte * SSA section:
883*fcf3ce44SJohn Forte */
884*fcf3ce44SJohn Forte (void) print_errString(L_INVALID_PATH,
885*fcf3ce44SJohn Forte argv[path_index]);
886*fcf3ce44SJohn Forte }
887*fcf3ce44SJohn Forte path_index++;
888*fcf3ce44SJohn Forte }
889*fcf3ce44SJohn Forte return (retval);
890*fcf3ce44SJohn Forte }
891*fcf3ce44SJohn Forte
892*fcf3ce44SJohn Forte
893*fcf3ce44SJohn Forte
894*fcf3ce44SJohn Forte void
adm_bypass_enable(char ** argv,int bypass_flag)895*fcf3ce44SJohn Forte adm_bypass_enable(char **argv, int bypass_flag)
896*fcf3ce44SJohn Forte {
897*fcf3ce44SJohn Forte int path_index = 0, err = 0;
898*fcf3ce44SJohn Forte L_inquiry inq;
899*fcf3ce44SJohn Forte char *path_phys = NULL;
900*fcf3ce44SJohn Forte Path_struct *path_struct;
901*fcf3ce44SJohn Forte
902*fcf3ce44SJohn Forte if ((err = l_convert_name(argv[path_index], &path_phys,
903*fcf3ce44SJohn Forte &path_struct, Options & PVERBOSE)) != 0) {
904*fcf3ce44SJohn Forte /*
905*fcf3ce44SJohn Forte * In case we did not find the device
906*fcf3ce44SJohn Forte * in the /devices directory.
907*fcf3ce44SJohn Forte *
908*fcf3ce44SJohn Forte * Only valid for pathnames like box,f1
909*fcf3ce44SJohn Forte */
910*fcf3ce44SJohn Forte if (path_struct->ib_path_flag) {
911*fcf3ce44SJohn Forte path_phys = path_struct->p_physical_path;
912*fcf3ce44SJohn Forte } else {
913*fcf3ce44SJohn Forte (void) fprintf(stderr,
914*fcf3ce44SJohn Forte MSGSTR(33,
915*fcf3ce44SJohn Forte " Error: converting"
916*fcf3ce44SJohn Forte " %s to physical path.\n"
917*fcf3ce44SJohn Forte " Invalid pathname.\n"),
918*fcf3ce44SJohn Forte argv[path_index]);
919*fcf3ce44SJohn Forte if (err != -1) {
920*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
921*fcf3ce44SJohn Forte }
922*fcf3ce44SJohn Forte exit(-1);
923*fcf3ce44SJohn Forte }
924*fcf3ce44SJohn Forte }
925*fcf3ce44SJohn Forte if (path_struct->ib_path_flag) {
926*fcf3ce44SJohn Forte if (Options & OPTION_F) {
927*fcf3ce44SJohn Forte E_USEAGE();
928*fcf3ce44SJohn Forte exit(-1);
929*fcf3ce44SJohn Forte }
930*fcf3ce44SJohn Forte /*
931*fcf3ce44SJohn Forte * We are addressing a disk using a path
932*fcf3ce44SJohn Forte * format type box,f1 and no disk
933*fcf3ce44SJohn Forte * path was found.
934*fcf3ce44SJohn Forte * So set the Force flag so no reserved/busy
935*fcf3ce44SJohn Forte * check is performed.
936*fcf3ce44SJohn Forte */
937*fcf3ce44SJohn Forte if (err = l_dev_bypass_enable(path_struct,
938*fcf3ce44SJohn Forte bypass_flag, OPTION_CAPF,
939*fcf3ce44SJohn Forte Options & OPTION_A,
940*fcf3ce44SJohn Forte Options & PVERBOSE)) {
941*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
942*fcf3ce44SJohn Forte exit(-1);
943*fcf3ce44SJohn Forte }
944*fcf3ce44SJohn Forte return;
945*fcf3ce44SJohn Forte }
946*fcf3ce44SJohn Forte
947*fcf3ce44SJohn Forte if (err = g_get_inquiry(path_phys, &inq)) {
948*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
949*fcf3ce44SJohn Forte exit(-1);
950*fcf3ce44SJohn Forte }
951*fcf3ce44SJohn Forte if ((strstr((char *)inq.inq_pid, ENCLOSURE_PROD_ID) != 0) ||
952*fcf3ce44SJohn Forte (strncmp((char *)inq.inq_vid, "SUN ",
953*fcf3ce44SJohn Forte sizeof (inq.inq_vid)) &&
954*fcf3ce44SJohn Forte ((inq.inq_dtype & DTYPE_MASK) == DTYPE_ESI))) {
955*fcf3ce44SJohn Forte if ((!((Options & OPTION_F) ||
956*fcf3ce44SJohn Forte (Options & OPTION_R))) ||
957*fcf3ce44SJohn Forte ((Options & OPTION_R) &&
958*fcf3ce44SJohn Forte (Options & OPTION_F))) {
959*fcf3ce44SJohn Forte E_USEAGE();
960*fcf3ce44SJohn Forte exit(-1);
961*fcf3ce44SJohn Forte }
962*fcf3ce44SJohn Forte if (err = l_bp_bypass_enable(path_phys, bypass_flag,
963*fcf3ce44SJohn Forte Options & OPTION_A,
964*fcf3ce44SJohn Forte Options & OPTION_F,
965*fcf3ce44SJohn Forte Options & OPTION_CAPF,
966*fcf3ce44SJohn Forte Options & PVERBOSE)) {
967*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
968*fcf3ce44SJohn Forte exit(-1);
969*fcf3ce44SJohn Forte }
970*fcf3ce44SJohn Forte } else if ((inq.inq_dtype & DTYPE_MASK) == DTYPE_DIRECT) {
971*fcf3ce44SJohn Forte if (Options & OPTION_F) {
972*fcf3ce44SJohn Forte E_USEAGE();
973*fcf3ce44SJohn Forte exit(-1);
974*fcf3ce44SJohn Forte }
975*fcf3ce44SJohn Forte if (err = l_dev_bypass_enable(path_struct,
976*fcf3ce44SJohn Forte bypass_flag, Options & OPTION_CAPF,
977*fcf3ce44SJohn Forte Options & OPTION_A,
978*fcf3ce44SJohn Forte Options & PVERBOSE)) {
979*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
980*fcf3ce44SJohn Forte exit(-1);
981*fcf3ce44SJohn Forte }
982*fcf3ce44SJohn Forte }
983*fcf3ce44SJohn Forte }
984*fcf3ce44SJohn Forte
985*fcf3ce44SJohn Forte /*
986*fcf3ce44SJohn Forte * adm_download() Download subsystem microcode.
987*fcf3ce44SJohn Forte * Path must point to a LUX IB.
988*fcf3ce44SJohn Forte *
989*fcf3ce44SJohn Forte * RETURNS:
990*fcf3ce44SJohn Forte * None.
991*fcf3ce44SJohn Forte */
992*fcf3ce44SJohn Forte void
adm_download(char ** argv,char * file_name)993*fcf3ce44SJohn Forte adm_download(char **argv, char *file_name)
994*fcf3ce44SJohn Forte {
995*fcf3ce44SJohn Forte int path_index = 0, err = 0;
996*fcf3ce44SJohn Forte char *path_phys = NULL;
997*fcf3ce44SJohn Forte L_inquiry inq;
998*fcf3ce44SJohn Forte Path_struct *path_struct;
999*fcf3ce44SJohn Forte
1000*fcf3ce44SJohn Forte while (argv[path_index] != NULL) {
1001*fcf3ce44SJohn Forte /*
1002*fcf3ce44SJohn Forte * See what kind of device we are talking to.
1003*fcf3ce44SJohn Forte */
1004*fcf3ce44SJohn Forte if ((err = l_convert_name(argv[path_index], &path_phys,
1005*fcf3ce44SJohn Forte &path_struct, Options & PVERBOSE)) != 0) {
1006*fcf3ce44SJohn Forte (void) fprintf(stderr,
1007*fcf3ce44SJohn Forte MSGSTR(33,
1008*fcf3ce44SJohn Forte " Error: converting"
1009*fcf3ce44SJohn Forte " %s to physical path.\n"
1010*fcf3ce44SJohn Forte " Invalid pathname.\n"),
1011*fcf3ce44SJohn Forte argv[path_index]);
1012*fcf3ce44SJohn Forte if (err != -1) {
1013*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
1014*fcf3ce44SJohn Forte }
1015*fcf3ce44SJohn Forte exit(-1);
1016*fcf3ce44SJohn Forte }
1017*fcf3ce44SJohn Forte if (err = g_get_inquiry(path_phys, &inq)) {
1018*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
1019*fcf3ce44SJohn Forte exit(-1);
1020*fcf3ce44SJohn Forte }
1021*fcf3ce44SJohn Forte if ((strstr((char *)inq.inq_pid, ENCLOSURE_PROD_ID) != 0) ||
1022*fcf3ce44SJohn Forte (strncmp((char *)inq.inq_vid, "SUN ",
1023*fcf3ce44SJohn Forte sizeof (inq.inq_vid)) &&
1024*fcf3ce44SJohn Forte ((inq.inq_dtype & DTYPE_MASK) == DTYPE_ESI))) {
1025*fcf3ce44SJohn Forte if (err = l_download(path_phys,
1026*fcf3ce44SJohn Forte file_name, (Options & SAVE),
1027*fcf3ce44SJohn Forte (Options & PVERBOSE))) {
1028*fcf3ce44SJohn Forte (void) print_errString(err,
1029*fcf3ce44SJohn Forte (err == L_OPEN_PATH_FAIL) ?
1030*fcf3ce44SJohn Forte argv[path_index]: file_name);
1031*fcf3ce44SJohn Forte exit(-1);
1032*fcf3ce44SJohn Forte }
1033*fcf3ce44SJohn Forte } else {
1034*fcf3ce44SJohn Forte (void) fprintf(stderr,
1035*fcf3ce44SJohn Forte MSGSTR(112, "Error: Invalid pathname (%s)"),
1036*fcf3ce44SJohn Forte argv[path_index]);
1037*fcf3ce44SJohn Forte }
1038*fcf3ce44SJohn Forte path_index++;
1039*fcf3ce44SJohn Forte }
1040*fcf3ce44SJohn Forte }
1041*fcf3ce44SJohn Forte
1042*fcf3ce44SJohn Forte /*
1043*fcf3ce44SJohn Forte * display_link_status() Reads and displays the link status.
1044*fcf3ce44SJohn Forte *
1045*fcf3ce44SJohn Forte * RETURNS:
1046*fcf3ce44SJohn Forte * none.
1047*fcf3ce44SJohn Forte */
1048*fcf3ce44SJohn Forte void
display_link_status(char ** argv)1049*fcf3ce44SJohn Forte display_link_status(char **argv)
1050*fcf3ce44SJohn Forte {
1051*fcf3ce44SJohn Forte AL_rls *rls = NULL, *n;
1052*fcf3ce44SJohn Forte int path_index = 0, err = 0;
1053*fcf3ce44SJohn Forte char *path_phys = NULL;
1054*fcf3ce44SJohn Forte Path_struct *path_struct;
1055*fcf3ce44SJohn Forte
1056*fcf3ce44SJohn Forte
1057*fcf3ce44SJohn Forte while (argv[path_index] != NULL) {
1058*fcf3ce44SJohn Forte if ((err = l_convert_name(argv[path_index], &path_phys,
1059*fcf3ce44SJohn Forte &path_struct, Options & PVERBOSE)) != 0) {
1060*fcf3ce44SJohn Forte (void) fprintf(stderr,
1061*fcf3ce44SJohn Forte MSGSTR(33,
1062*fcf3ce44SJohn Forte " Error: converting"
1063*fcf3ce44SJohn Forte " %s to physical path.\n"
1064*fcf3ce44SJohn Forte " Invalid pathname.\n"),
1065*fcf3ce44SJohn Forte argv[path_index]);
1066*fcf3ce44SJohn Forte if (err != -1) {
1067*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
1068*fcf3ce44SJohn Forte }
1069*fcf3ce44SJohn Forte exit(-1);
1070*fcf3ce44SJohn Forte }
1071*fcf3ce44SJohn Forte if (err = g_rdls(path_phys, &rls, Options & PVERBOSE)) {
1072*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
1073*fcf3ce44SJohn Forte exit(-1);
1074*fcf3ce44SJohn Forte }
1075*fcf3ce44SJohn Forte n = rls;
1076*fcf3ce44SJohn Forte if (n != NULL) {
1077*fcf3ce44SJohn Forte (void) fprintf(stdout,
1078*fcf3ce44SJohn Forte MSGSTR(2007, "\nLink Error Status "
1079*fcf3ce44SJohn Forte "information for loop:%s\n"),
1080*fcf3ce44SJohn Forte n->driver_path);
1081*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2008, "al_pa lnk fail "
1082*fcf3ce44SJohn Forte " sync loss signal loss sequence err"
1083*fcf3ce44SJohn Forte " invalid word CRC\n"));
1084*fcf3ce44SJohn Forte }
1085*fcf3ce44SJohn Forte while (n) {
1086*fcf3ce44SJohn Forte if ((n->payload.rls_linkfail == 0xffffffff) &&
1087*fcf3ce44SJohn Forte (n->payload.rls_syncfail == 0xffffffff) &&
1088*fcf3ce44SJohn Forte (n->payload.rls_sigfail == 0xffffffff) &&
1089*fcf3ce44SJohn Forte (n->payload.rls_primitiverr == 0xffffffff) &&
1090*fcf3ce44SJohn Forte (n->payload.rls_invalidword == 0xffffffff) &&
1091*fcf3ce44SJohn Forte (n->payload.rls_invalidcrc == 0xffffffff)) {
1092*fcf3ce44SJohn Forte (void) fprintf(stdout,
1093*fcf3ce44SJohn Forte "%x\t%-12d%-12d%-14d%-15d%-15d%-12d\n",
1094*fcf3ce44SJohn Forte n->al_ha,
1095*fcf3ce44SJohn Forte n->payload.rls_linkfail,
1096*fcf3ce44SJohn Forte n->payload.rls_syncfail,
1097*fcf3ce44SJohn Forte n->payload.rls_sigfail,
1098*fcf3ce44SJohn Forte n->payload.rls_primitiverr,
1099*fcf3ce44SJohn Forte n->payload.rls_invalidword,
1100*fcf3ce44SJohn Forte n->payload.rls_invalidcrc);
1101*fcf3ce44SJohn Forte } else {
1102*fcf3ce44SJohn Forte (void) fprintf(stdout,
1103*fcf3ce44SJohn Forte "%x\t%-12u%-12u%-14u%-15u%-15u%-12u\n",
1104*fcf3ce44SJohn Forte n->al_ha,
1105*fcf3ce44SJohn Forte n->payload.rls_linkfail,
1106*fcf3ce44SJohn Forte n->payload.rls_syncfail,
1107*fcf3ce44SJohn Forte n->payload.rls_sigfail,
1108*fcf3ce44SJohn Forte n->payload.rls_primitiverr,
1109*fcf3ce44SJohn Forte n->payload.rls_invalidword,
1110*fcf3ce44SJohn Forte n->payload.rls_invalidcrc);
1111*fcf3ce44SJohn Forte }
1112*fcf3ce44SJohn Forte n = n->next;
1113*fcf3ce44SJohn Forte }
1114*fcf3ce44SJohn Forte
1115*fcf3ce44SJohn Forte path_index++;
1116*fcf3ce44SJohn Forte }
1117*fcf3ce44SJohn Forte (void) fprintf(stdout,
1118*fcf3ce44SJohn Forte MSGSTR(2009, "NOTE: These LESB counts are not"
1119*fcf3ce44SJohn Forte " cleared by a reset, only power cycles.\n"
1120*fcf3ce44SJohn Forte "These counts must be compared"
1121*fcf3ce44SJohn Forte " to previously read counts.\n"));
1122*fcf3ce44SJohn Forte }
1123*fcf3ce44SJohn Forte
1124*fcf3ce44SJohn Forte
1125*fcf3ce44SJohn Forte /*
1126*fcf3ce44SJohn Forte * ib_present_chk() Check to see if IB 0 or 1 is present in the box.
1127*fcf3ce44SJohn Forte *
1128*fcf3ce44SJohn Forte * RETURN:
1129*fcf3ce44SJohn Forte * 1 if ib present
1130*fcf3ce44SJohn Forte * 0 otherwise
1131*fcf3ce44SJohn Forte */
1132*fcf3ce44SJohn Forte int
ib_present_chk(struct l_state_struct * l_state,int which_one)1133*fcf3ce44SJohn Forte ib_present_chk(struct l_state_struct *l_state, int which_one)
1134*fcf3ce44SJohn Forte {
1135*fcf3ce44SJohn Forte Ctlr_elem_st ctlr;
1136*fcf3ce44SJohn Forte int i;
1137*fcf3ce44SJohn Forte int elem_index = 0;
1138*fcf3ce44SJohn Forte int result = 1;
1139*fcf3ce44SJohn Forte
1140*fcf3ce44SJohn Forte for (i = 0; i < (int)l_state->ib_tbl.config.enc_num_elem; i++) {
1141*fcf3ce44SJohn Forte elem_index++; /* skip global */
1142*fcf3ce44SJohn Forte if (l_state->ib_tbl.config.type_hdr[i].type == ELM_TYP_IB) {
1143*fcf3ce44SJohn Forte (void) bcopy((const void *)
1144*fcf3ce44SJohn Forte &l_state->ib_tbl.p2_s.element[elem_index + which_one],
1145*fcf3ce44SJohn Forte (void *)&ctlr, sizeof (ctlr));
1146*fcf3ce44SJohn Forte if (ctlr.code == S_NOT_INSTALLED) {
1147*fcf3ce44SJohn Forte result = 0;
1148*fcf3ce44SJohn Forte }
1149*fcf3ce44SJohn Forte break;
1150*fcf3ce44SJohn Forte }
1151*fcf3ce44SJohn Forte elem_index += l_state->ib_tbl.config.type_hdr[i].num;
1152*fcf3ce44SJohn Forte }
1153*fcf3ce44SJohn Forte return (result);
1154*fcf3ce44SJohn Forte }
1155*fcf3ce44SJohn Forte
1156*fcf3ce44SJohn Forte /*
1157*fcf3ce44SJohn Forte * print_individual_state() Print individual disk status.
1158*fcf3ce44SJohn Forte *
1159*fcf3ce44SJohn Forte * RETURNS:
1160*fcf3ce44SJohn Forte * none.
1161*fcf3ce44SJohn Forte */
1162*fcf3ce44SJohn Forte void
print_individual_state(int status,int port)1163*fcf3ce44SJohn Forte print_individual_state(int status, int port)
1164*fcf3ce44SJohn Forte {
1165*fcf3ce44SJohn Forte if (status & L_OPEN_FAIL) {
1166*fcf3ce44SJohn Forte (void) fprintf(stdout, " (");
1167*fcf3ce44SJohn Forte (void) fprintf(stdout,
1168*fcf3ce44SJohn Forte MSGSTR(28, "Open Failed"));
1169*fcf3ce44SJohn Forte (void) fprintf(stdout, ") ");
1170*fcf3ce44SJohn Forte } else if (status & L_NOT_READY) {
1171*fcf3ce44SJohn Forte (void) fprintf(stdout, " (");
1172*fcf3ce44SJohn Forte (void) fprintf(stdout,
1173*fcf3ce44SJohn Forte MSGSTR(20, "Not Ready"));
1174*fcf3ce44SJohn Forte (void) fprintf(stdout, ") ");
1175*fcf3ce44SJohn Forte } else if (status & L_NOT_READABLE) {
1176*fcf3ce44SJohn Forte (void) fprintf(stdout, "(");
1177*fcf3ce44SJohn Forte (void) fprintf(stdout,
1178*fcf3ce44SJohn Forte MSGSTR(88, "Not Readable"));
1179*fcf3ce44SJohn Forte (void) fprintf(stdout, ") ");
1180*fcf3ce44SJohn Forte } else if (status & L_SPUN_DWN_D) {
1181*fcf3ce44SJohn Forte (void) fprintf(stdout, " (");
1182*fcf3ce44SJohn Forte (void) fprintf(stdout,
1183*fcf3ce44SJohn Forte MSGSTR(68, "Spun Down"));
1184*fcf3ce44SJohn Forte (void) fprintf(stdout, ") ");
1185*fcf3ce44SJohn Forte } else if (status & L_SCSI_ERR) {
1186*fcf3ce44SJohn Forte (void) fprintf(stdout, " (");
1187*fcf3ce44SJohn Forte (void) fprintf(stdout,
1188*fcf3ce44SJohn Forte MSGSTR(70, "SCSI Error"));
1189*fcf3ce44SJohn Forte (void) fprintf(stdout, ") ");
1190*fcf3ce44SJohn Forte } else if (status & L_RESERVED) {
1191*fcf3ce44SJohn Forte if (port == PORT_A) {
1192*fcf3ce44SJohn Forte (void) fprintf(stdout,
1193*fcf3ce44SJohn Forte MSGSTR(2010,
1194*fcf3ce44SJohn Forte " (Rsrv cnflt:A) "));
1195*fcf3ce44SJohn Forte } else if (port == PORT_B) {
1196*fcf3ce44SJohn Forte (void) fprintf(stdout,
1197*fcf3ce44SJohn Forte MSGSTR(2011,
1198*fcf3ce44SJohn Forte " (Rsrv cnflt:B) "));
1199*fcf3ce44SJohn Forte } else {
1200*fcf3ce44SJohn Forte (void) fprintf(stdout,
1201*fcf3ce44SJohn Forte MSGSTR(2012,
1202*fcf3ce44SJohn Forte " (Reserve cnflt)"));
1203*fcf3ce44SJohn Forte }
1204*fcf3ce44SJohn Forte } else if (status & L_NO_LABEL) {
1205*fcf3ce44SJohn Forte (void) fprintf(stdout, "(");
1206*fcf3ce44SJohn Forte (void) fprintf(stdout,
1207*fcf3ce44SJohn Forte MSGSTR(92, "No UNIX Label"));
1208*fcf3ce44SJohn Forte (void) fprintf(stdout, ") ");
1209*fcf3ce44SJohn Forte }
1210*fcf3ce44SJohn Forte }
1211*fcf3ce44SJohn Forte
1212*fcf3ce44SJohn Forte
1213*fcf3ce44SJohn Forte /*
1214*fcf3ce44SJohn Forte * display_disk_msg() Displays status for
1215*fcf3ce44SJohn Forte * an individual SENA device.
1216*fcf3ce44SJohn Forte *
1217*fcf3ce44SJohn Forte * RETURNS:
1218*fcf3ce44SJohn Forte * none.
1219*fcf3ce44SJohn Forte */
1220*fcf3ce44SJohn Forte void
display_disk_msg(struct l_disk_state_struct * dsk_ptr,struct l_state_struct * l_state,Bp_elem_st * bp,int front_flag)1221*fcf3ce44SJohn Forte display_disk_msg(struct l_disk_state_struct *dsk_ptr,
1222*fcf3ce44SJohn Forte struct l_state_struct *l_state, Bp_elem_st *bp, int front_flag)
1223*fcf3ce44SJohn Forte {
1224*fcf3ce44SJohn Forte int loop_flag = 0;
1225*fcf3ce44SJohn Forte int a_and_b = 0;
1226*fcf3ce44SJohn Forte int state_a = 0, state_b = 0;
1227*fcf3ce44SJohn Forte
1228*fcf3ce44SJohn Forte if (dsk_ptr->ib_status.code == S_NOT_INSTALLED) {
1229*fcf3ce44SJohn Forte (void) fprintf(stdout,
1230*fcf3ce44SJohn Forte MSGSTR(30, "Not Installed"));
1231*fcf3ce44SJohn Forte (void) fprintf(stdout, " ");
1232*fcf3ce44SJohn Forte if (dsk_ptr->ib_status.fault ||
1233*fcf3ce44SJohn Forte dsk_ptr->ib_status.fault_req) {
1234*fcf3ce44SJohn Forte (void) fprintf(stdout, "(");
1235*fcf3ce44SJohn Forte (void) fprintf(stdout,
1236*fcf3ce44SJohn Forte MSGSTR(2013, "Faulted"));
1237*fcf3ce44SJohn Forte (void) fprintf(stdout,
1238*fcf3ce44SJohn Forte ") ");
1239*fcf3ce44SJohn Forte } else if (dsk_ptr->ib_status.ident ||
1240*fcf3ce44SJohn Forte dsk_ptr->ib_status.rdy_to_ins ||
1241*fcf3ce44SJohn Forte dsk_ptr->ib_status.rmv) {
1242*fcf3ce44SJohn Forte (void) fprintf(stdout,
1243*fcf3ce44SJohn Forte MSGSTR(2014,
1244*fcf3ce44SJohn Forte "(LED Blinking) "));
1245*fcf3ce44SJohn Forte } else {
1246*fcf3ce44SJohn Forte (void) fprintf(stdout,
1247*fcf3ce44SJohn Forte " ");
1248*fcf3ce44SJohn Forte }
1249*fcf3ce44SJohn Forte } else if (dsk_ptr->ib_status.dev_off) {
1250*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2015, "Off"));
1251*fcf3ce44SJohn Forte if (dsk_ptr->ib_status.fault || dsk_ptr->ib_status.fault_req) {
1252*fcf3ce44SJohn Forte (void) fprintf(stdout, "(");
1253*fcf3ce44SJohn Forte (void) fprintf(stdout,
1254*fcf3ce44SJohn Forte MSGSTR(2016, "Faulted"));
1255*fcf3ce44SJohn Forte (void) fprintf(stdout,
1256*fcf3ce44SJohn Forte ") ");
1257*fcf3ce44SJohn Forte } else if (dsk_ptr->ib_status.bypass_a_en &&
1258*fcf3ce44SJohn Forte dsk_ptr->ib_status.bypass_b_en) {
1259*fcf3ce44SJohn Forte (void) fprintf(stdout,
1260*fcf3ce44SJohn Forte MSGSTR(2017,
1261*fcf3ce44SJohn Forte "(Bypassed:AB)"));
1262*fcf3ce44SJohn Forte (void) fprintf(stdout,
1263*fcf3ce44SJohn Forte " ");
1264*fcf3ce44SJohn Forte } else if (dsk_ptr->ib_status.bypass_a_en) {
1265*fcf3ce44SJohn Forte (void) fprintf(stdout,
1266*fcf3ce44SJohn Forte MSGSTR(2018,
1267*fcf3ce44SJohn Forte "(Bypassed: A)"));
1268*fcf3ce44SJohn Forte (void) fprintf(stdout,
1269*fcf3ce44SJohn Forte " ");
1270*fcf3ce44SJohn Forte } else if (dsk_ptr->ib_status.bypass_b_en) {
1271*fcf3ce44SJohn Forte (void) fprintf(stdout,
1272*fcf3ce44SJohn Forte MSGSTR(2019,
1273*fcf3ce44SJohn Forte "(Bypassed: B)"));
1274*fcf3ce44SJohn Forte (void) fprintf(stdout,
1275*fcf3ce44SJohn Forte " ");
1276*fcf3ce44SJohn Forte } else {
1277*fcf3ce44SJohn Forte (void) fprintf(stdout,
1278*fcf3ce44SJohn Forte " ");
1279*fcf3ce44SJohn Forte }
1280*fcf3ce44SJohn Forte } else {
1281*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2020, "On"));
1282*fcf3ce44SJohn Forte
1283*fcf3ce44SJohn Forte if (dsk_ptr->ib_status.fault || dsk_ptr->ib_status.fault_req) {
1284*fcf3ce44SJohn Forte (void) fprintf(stdout, " (");
1285*fcf3ce44SJohn Forte (void) fprintf(stdout,
1286*fcf3ce44SJohn Forte MSGSTR(2021, "Faulted"));
1287*fcf3ce44SJohn Forte (void) fprintf(stdout, ") ");
1288*fcf3ce44SJohn Forte } else if (dsk_ptr->ib_status.bypass_a_en &&
1289*fcf3ce44SJohn Forte dsk_ptr->ib_status.bypass_b_en) {
1290*fcf3ce44SJohn Forte (void) fprintf(stdout, " ");
1291*fcf3ce44SJohn Forte (void) fprintf(stdout,
1292*fcf3ce44SJohn Forte MSGSTR(2022, "(Bypassed:AB)"));
1293*fcf3ce44SJohn Forte (void) fprintf(stdout, " ");
1294*fcf3ce44SJohn Forte } else if (ib_present_chk(l_state, 0) &&
1295*fcf3ce44SJohn Forte dsk_ptr->ib_status.bypass_a_en) {
1296*fcf3ce44SJohn Forte /*
1297*fcf3ce44SJohn Forte * Before printing that the port is bypassed
1298*fcf3ce44SJohn Forte * verify that there is an IB for this port.
1299*fcf3ce44SJohn Forte * If not then don't print.
1300*fcf3ce44SJohn Forte */
1301*fcf3ce44SJohn Forte (void) fprintf(stdout, " ");
1302*fcf3ce44SJohn Forte (void) fprintf(stdout,
1303*fcf3ce44SJohn Forte MSGSTR(2023, "(Bypassed: A)"));
1304*fcf3ce44SJohn Forte (void) fprintf(stdout, " ");
1305*fcf3ce44SJohn Forte } else if (ib_present_chk(l_state, 1) &&
1306*fcf3ce44SJohn Forte dsk_ptr->ib_status.bypass_b_en) {
1307*fcf3ce44SJohn Forte (void) fprintf(stdout, " ");
1308*fcf3ce44SJohn Forte (void) fprintf(stdout,
1309*fcf3ce44SJohn Forte MSGSTR(2024, "(Bypassed: B)"));
1310*fcf3ce44SJohn Forte (void) fprintf(stdout, " ");
1311*fcf3ce44SJohn Forte } else if ((bp->code != S_NOT_INSTALLED) &&
1312*fcf3ce44SJohn Forte ((bp->byp_a_enabled || bp->en_bypass_a) &&
1313*fcf3ce44SJohn Forte !(bp->byp_b_enabled || bp->en_bypass_b))) {
1314*fcf3ce44SJohn Forte (void) fprintf(stdout,
1315*fcf3ce44SJohn Forte MSGSTR(2025,
1316*fcf3ce44SJohn Forte " (Bypassed BP: A)"));
1317*fcf3ce44SJohn Forte } else if ((bp->code != S_NOT_INSTALLED) &&
1318*fcf3ce44SJohn Forte ((bp->byp_b_enabled || bp->en_bypass_b) &&
1319*fcf3ce44SJohn Forte !(bp->byp_a_enabled || bp->en_bypass_a))) {
1320*fcf3ce44SJohn Forte (void) fprintf(stdout,
1321*fcf3ce44SJohn Forte MSGSTR(2026,
1322*fcf3ce44SJohn Forte "(Bypassed BP: B)"));
1323*fcf3ce44SJohn Forte } else if ((bp->code != S_NOT_INSTALLED) &&
1324*fcf3ce44SJohn Forte ((bp->byp_a_enabled || bp->en_bypass_a) &&
1325*fcf3ce44SJohn Forte (bp->byp_b_enabled || bp->en_bypass_b))) {
1326*fcf3ce44SJohn Forte (void) fprintf(stdout,
1327*fcf3ce44SJohn Forte MSGSTR(2027,
1328*fcf3ce44SJohn Forte "(Bypassed BP:AB)"));
1329*fcf3ce44SJohn Forte } else {
1330*fcf3ce44SJohn Forte state_a = dsk_ptr->g_disk_state.d_state_flags[PORT_A];
1331*fcf3ce44SJohn Forte state_b = dsk_ptr->g_disk_state.d_state_flags[PORT_B];
1332*fcf3ce44SJohn Forte a_and_b = state_a & state_b;
1333*fcf3ce44SJohn Forte
1334*fcf3ce44SJohn Forte if (dsk_ptr->l_state_flag & L_NO_LOOP) {
1335*fcf3ce44SJohn Forte (void) fprintf(stdout,
1336*fcf3ce44SJohn Forte MSGSTR(2028,
1337*fcf3ce44SJohn Forte " (Loop not accessible)"));
1338*fcf3ce44SJohn Forte loop_flag = 1;
1339*fcf3ce44SJohn Forte } else if (dsk_ptr->l_state_flag & L_INVALID_WWN) {
1340*fcf3ce44SJohn Forte (void) fprintf(stdout,
1341*fcf3ce44SJohn Forte MSGSTR(2029,
1342*fcf3ce44SJohn Forte " (Invalid WWN) "));
1343*fcf3ce44SJohn Forte } else if (dsk_ptr->l_state_flag & L_INVALID_MAP) {
1344*fcf3ce44SJohn Forte (void) fprintf(stdout,
1345*fcf3ce44SJohn Forte MSGSTR(2030,
1346*fcf3ce44SJohn Forte " (Login failed) "));
1347*fcf3ce44SJohn Forte } else if (dsk_ptr->l_state_flag & L_NO_PATH_FOUND) {
1348*fcf3ce44SJohn Forte (void) fprintf(stdout,
1349*fcf3ce44SJohn Forte MSGSTR(2031,
1350*fcf3ce44SJohn Forte " (No path found)"));
1351*fcf3ce44SJohn Forte } else if (a_and_b) {
1352*fcf3ce44SJohn Forte print_individual_state(a_and_b, PORT_A_B);
1353*fcf3ce44SJohn Forte } else if (state_a && (!state_b)) {
1354*fcf3ce44SJohn Forte print_individual_state(state_a, PORT_A);
1355*fcf3ce44SJohn Forte } else if ((!state_a) && state_b) {
1356*fcf3ce44SJohn Forte print_individual_state(state_b, PORT_B);
1357*fcf3ce44SJohn Forte } else if (state_a || state_b) {
1358*fcf3ce44SJohn Forte /* NOTE: Double state - should do 2 lines. */
1359*fcf3ce44SJohn Forte print_individual_state(state_a | state_b,
1360*fcf3ce44SJohn Forte PORT_A_B);
1361*fcf3ce44SJohn Forte } else {
1362*fcf3ce44SJohn Forte (void) fprintf(stdout, " (");
1363*fcf3ce44SJohn Forte (void) fprintf(stdout,
1364*fcf3ce44SJohn Forte MSGSTR(29, "O.K."));
1365*fcf3ce44SJohn Forte (void) fprintf(stdout,
1366*fcf3ce44SJohn Forte ") ");
1367*fcf3ce44SJohn Forte }
1368*fcf3ce44SJohn Forte }
1369*fcf3ce44SJohn Forte if (loop_flag) {
1370*fcf3ce44SJohn Forte (void) fprintf(stdout, " ");
1371*fcf3ce44SJohn Forte } else if (strlen(dsk_ptr->g_disk_state.node_wwn_s)) {
1372*fcf3ce44SJohn Forte (void) fprintf(stdout, "%s",
1373*fcf3ce44SJohn Forte dsk_ptr->g_disk_state.node_wwn_s);
1374*fcf3ce44SJohn Forte } else {
1375*fcf3ce44SJohn Forte (void) fprintf(stdout, " ");
1376*fcf3ce44SJohn Forte }
1377*fcf3ce44SJohn Forte }
1378*fcf3ce44SJohn Forte if (front_flag) {
1379*fcf3ce44SJohn Forte (void) fprintf(stdout, " ");
1380*fcf3ce44SJohn Forte }
1381*fcf3ce44SJohn Forte }
1382*fcf3ce44SJohn Forte
1383*fcf3ce44SJohn Forte
1384*fcf3ce44SJohn Forte
1385*fcf3ce44SJohn Forte /*
1386*fcf3ce44SJohn Forte * pho_display_config() Displays device status
1387*fcf3ce44SJohn Forte * information for a SENA enclosure.
1388*fcf3ce44SJohn Forte *
1389*fcf3ce44SJohn Forte * RETURNS:
1390*fcf3ce44SJohn Forte * none.
1391*fcf3ce44SJohn Forte */
1392*fcf3ce44SJohn Forte void
pho_display_config(char * path_phys)1393*fcf3ce44SJohn Forte pho_display_config(char *path_phys)
1394*fcf3ce44SJohn Forte {
1395*fcf3ce44SJohn Forte L_state l_state;
1396*fcf3ce44SJohn Forte Bp_elem_st bpf, bpr;
1397*fcf3ce44SJohn Forte int i, j, elem_index = 0, err = 0;
1398*fcf3ce44SJohn Forte
1399*fcf3ce44SJohn Forte
1400*fcf3ce44SJohn Forte /* Get global status */
1401*fcf3ce44SJohn Forte if (err = l_get_status(path_phys, &l_state,
1402*fcf3ce44SJohn Forte (Options & PVERBOSE))) {
1403*fcf3ce44SJohn Forte (void) print_errString(err, path_phys);
1404*fcf3ce44SJohn Forte exit(-1);
1405*fcf3ce44SJohn Forte }
1406*fcf3ce44SJohn Forte
1407*fcf3ce44SJohn Forte /*
1408*fcf3ce44SJohn Forte * Look for abnormal status.
1409*fcf3ce44SJohn Forte */
1410*fcf3ce44SJohn Forte if (l_state.ib_tbl.p2_s.ui.ab_cond) {
1411*fcf3ce44SJohn Forte abnormal_condition_display(&l_state);
1412*fcf3ce44SJohn Forte }
1413*fcf3ce44SJohn Forte
1414*fcf3ce44SJohn Forte (void) fprintf(stdout,
1415*fcf3ce44SJohn Forte MSGSTR(2032, " DISK STATUS \n"
1416*fcf3ce44SJohn Forte "SLOT FRONT DISKS (Node WWN) "
1417*fcf3ce44SJohn Forte " REAR DISKS (Node WWN)\n"));
1418*fcf3ce44SJohn Forte /*
1419*fcf3ce44SJohn Forte * Print the status for each disk
1420*fcf3ce44SJohn Forte */
1421*fcf3ce44SJohn Forte for (j = 0; j < (int)l_state.ib_tbl.config.enc_num_elem; j++) {
1422*fcf3ce44SJohn Forte elem_index++;
1423*fcf3ce44SJohn Forte if (l_state.ib_tbl.config.type_hdr[j].type == ELM_TYP_BP)
1424*fcf3ce44SJohn Forte break;
1425*fcf3ce44SJohn Forte elem_index += l_state.ib_tbl.config.type_hdr[j].num;
1426*fcf3ce44SJohn Forte }
1427*fcf3ce44SJohn Forte (void) bcopy((const void *)
1428*fcf3ce44SJohn Forte &(l_state.ib_tbl.p2_s.element[elem_index]),
1429*fcf3ce44SJohn Forte (void *)&bpf, sizeof (bpf));
1430*fcf3ce44SJohn Forte (void) bcopy((const void *)
1431*fcf3ce44SJohn Forte &(l_state.ib_tbl.p2_s.element[elem_index + 1]),
1432*fcf3ce44SJohn Forte (void *)&bpr, sizeof (bpr));
1433*fcf3ce44SJohn Forte
1434*fcf3ce44SJohn Forte for (i = 0; i < (int)l_state.total_num_drv/2; i++) {
1435*fcf3ce44SJohn Forte (void) fprintf(stdout, "%-2d ", i);
1436*fcf3ce44SJohn Forte display_disk_msg(&l_state.drv_front[i], &l_state, &bpf, 1);
1437*fcf3ce44SJohn Forte display_disk_msg(&l_state.drv_rear[i], &l_state, &bpr, 0);
1438*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
1439*fcf3ce44SJohn Forte }
1440*fcf3ce44SJohn Forte
1441*fcf3ce44SJohn Forte
1442*fcf3ce44SJohn Forte
1443*fcf3ce44SJohn Forte /*
1444*fcf3ce44SJohn Forte * Display the subsystem status.
1445*fcf3ce44SJohn Forte */
1446*fcf3ce44SJohn Forte (void) fprintf(stdout,
1447*fcf3ce44SJohn Forte MSGSTR(2242,
1448*fcf3ce44SJohn Forte " SUBSYSTEM STATUS\nFW Revision:"));
1449*fcf3ce44SJohn Forte print_chars(l_state.ib_tbl.config.prod_revision,
1450*fcf3ce44SJohn Forte sizeof (l_state.ib_tbl.config.prod_revision), 1);
1451*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2034, " Box ID:%d"),
1452*fcf3ce44SJohn Forte l_state.ib_tbl.box_id);
1453*fcf3ce44SJohn Forte (void) fprintf(stdout, " ");
1454*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(90, "Node WWN:"));
1455*fcf3ce44SJohn Forte for (i = 0; i < 8; i++) {
1456*fcf3ce44SJohn Forte (void) fprintf(stdout, "%1.2x",
1457*fcf3ce44SJohn Forte l_state.ib_tbl.config.enc_node_wwn[i]);
1458*fcf3ce44SJohn Forte }
1459*fcf3ce44SJohn Forte /* Make sure NULL terminated although it is supposed to be */
1460*fcf3ce44SJohn Forte if (strlen((const char *)l_state.ib_tbl.enclosure_name) <=
1461*fcf3ce44SJohn Forte sizeof (l_state.ib_tbl.enclosure_name)) {
1462*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2035, " Enclosure Name:%s\n"),
1463*fcf3ce44SJohn Forte l_state.ib_tbl.enclosure_name);
1464*fcf3ce44SJohn Forte }
1465*fcf3ce44SJohn Forte
1466*fcf3ce44SJohn Forte /*
1467*fcf3ce44SJohn Forte *
1468*fcf3ce44SJohn Forte */
1469*fcf3ce44SJohn Forte elem_index = 0;
1470*fcf3ce44SJohn Forte /* Get and print CONTROLLER messages */
1471*fcf3ce44SJohn Forte for (i = 0; i < (int)l_state.ib_tbl.config.enc_num_elem; i++) {
1472*fcf3ce44SJohn Forte elem_index++; /* skip global */
1473*fcf3ce44SJohn Forte switch (l_state.ib_tbl.config.type_hdr[i].type) {
1474*fcf3ce44SJohn Forte case ELM_TYP_PS:
1475*fcf3ce44SJohn Forte ps_messages(&l_state, i, elem_index);
1476*fcf3ce44SJohn Forte break;
1477*fcf3ce44SJohn Forte case ELM_TYP_FT:
1478*fcf3ce44SJohn Forte fan_messages(&l_state, i, elem_index);
1479*fcf3ce44SJohn Forte break;
1480*fcf3ce44SJohn Forte case ELM_TYP_BP:
1481*fcf3ce44SJohn Forte back_plane_messages(&l_state, i, elem_index);
1482*fcf3ce44SJohn Forte break;
1483*fcf3ce44SJohn Forte case ELM_TYP_IB:
1484*fcf3ce44SJohn Forte ctlr_messages(&l_state, i, elem_index);
1485*fcf3ce44SJohn Forte break;
1486*fcf3ce44SJohn Forte case ELM_TYP_LN:
1487*fcf3ce44SJohn Forte /*
1488*fcf3ce44SJohn Forte * NOTE: I just use the Photon's message
1489*fcf3ce44SJohn Forte * string here and don't look at the
1490*fcf3ce44SJohn Forte * language code. The string includes
1491*fcf3ce44SJohn Forte * the language name.
1492*fcf3ce44SJohn Forte */
1493*fcf3ce44SJohn Forte if (l_state.ib_tbl.config.type_hdr[i].text_len != 0) {
1494*fcf3ce44SJohn Forte (void) fprintf(stdout, "%s\t",
1495*fcf3ce44SJohn Forte l_state.ib_tbl.config.text[i]);
1496*fcf3ce44SJohn Forte }
1497*fcf3ce44SJohn Forte break;
1498*fcf3ce44SJohn Forte case ELM_TYP_LO: /* Loop configuration */
1499*fcf3ce44SJohn Forte loop_messages(&l_state, i, elem_index);
1500*fcf3ce44SJohn Forte break;
1501*fcf3ce44SJohn Forte case ELM_TYP_MB: /* Loop configuration */
1502*fcf3ce44SJohn Forte mb_messages(&l_state, i, elem_index);
1503*fcf3ce44SJohn Forte break;
1504*fcf3ce44SJohn Forte
1505*fcf3ce44SJohn Forte }
1506*fcf3ce44SJohn Forte /*
1507*fcf3ce44SJohn Forte * Calculate the index to each element.
1508*fcf3ce44SJohn Forte */
1509*fcf3ce44SJohn Forte elem_index += l_state.ib_tbl.config.type_hdr[i].num;
1510*fcf3ce44SJohn Forte }
1511*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
1512*fcf3ce44SJohn Forte }
1513*fcf3ce44SJohn Forte
1514*fcf3ce44SJohn Forte
1515*fcf3ce44SJohn Forte
1516*fcf3ce44SJohn Forte
1517*fcf3ce44SJohn Forte /*
1518*fcf3ce44SJohn Forte * dpm_display_config() Displays device status
1519*fcf3ce44SJohn Forte * information for a DAKTARI enclosure.
1520*fcf3ce44SJohn Forte *
1521*fcf3ce44SJohn Forte * RETURNS:
1522*fcf3ce44SJohn Forte * none.
1523*fcf3ce44SJohn Forte */
1524*fcf3ce44SJohn Forte void
dpm_display_config(char * path_phys)1525*fcf3ce44SJohn Forte dpm_display_config(char *path_phys)
1526*fcf3ce44SJohn Forte {
1527*fcf3ce44SJohn Forte L_state l_state;
1528*fcf3ce44SJohn Forte Bp_elem_st bpf, bpr;
1529*fcf3ce44SJohn Forte int i, j, elem_index = 0, err = 0, count;
1530*fcf3ce44SJohn Forte
1531*fcf3ce44SJohn Forte
1532*fcf3ce44SJohn Forte /* Get global status */
1533*fcf3ce44SJohn Forte if (err = l_get_status(path_phys, &l_state,
1534*fcf3ce44SJohn Forte (Options & PVERBOSE))) {
1535*fcf3ce44SJohn Forte (void) print_errString(err, path_phys);
1536*fcf3ce44SJohn Forte exit(-1);
1537*fcf3ce44SJohn Forte }
1538*fcf3ce44SJohn Forte
1539*fcf3ce44SJohn Forte /*
1540*fcf3ce44SJohn Forte * Look for abnormal status.
1541*fcf3ce44SJohn Forte */
1542*fcf3ce44SJohn Forte if (l_state.ib_tbl.p2_s.ui.ab_cond) {
1543*fcf3ce44SJohn Forte abnormal_condition_display(&l_state);
1544*fcf3ce44SJohn Forte }
1545*fcf3ce44SJohn Forte
1546*fcf3ce44SJohn Forte (void) fprintf(stdout,
1547*fcf3ce44SJohn Forte MSGSTR(2247, " DISK STATUS \n"
1548*fcf3ce44SJohn Forte "SLOT DISKS (Node WWN) \n"));
1549*fcf3ce44SJohn Forte /*
1550*fcf3ce44SJohn Forte * Print the status for each disk
1551*fcf3ce44SJohn Forte */
1552*fcf3ce44SJohn Forte for (j = 0; j < (int)l_state.ib_tbl.config.enc_num_elem; j++) {
1553*fcf3ce44SJohn Forte elem_index++;
1554*fcf3ce44SJohn Forte if (l_state.ib_tbl.config.type_hdr[j].type == ELM_TYP_BP)
1555*fcf3ce44SJohn Forte break;
1556*fcf3ce44SJohn Forte elem_index += l_state.ib_tbl.config.type_hdr[j].num;
1557*fcf3ce44SJohn Forte }
1558*fcf3ce44SJohn Forte (void) bcopy((const void *)
1559*fcf3ce44SJohn Forte &(l_state.ib_tbl.p2_s.element[elem_index]),
1560*fcf3ce44SJohn Forte (void *)&bpf, sizeof (bpf));
1561*fcf3ce44SJohn Forte (void) bcopy((const void *)
1562*fcf3ce44SJohn Forte &(l_state.ib_tbl.p2_s.element[elem_index + 1]),
1563*fcf3ce44SJohn Forte (void *)&bpr, sizeof (bpr));
1564*fcf3ce44SJohn Forte
1565*fcf3ce44SJohn Forte for (i = 0, count = 0;
1566*fcf3ce44SJohn Forte i < (int)l_state.total_num_drv/2;
1567*fcf3ce44SJohn Forte i++, count++) {
1568*fcf3ce44SJohn Forte (void) fprintf(stdout, "%-2d ", count);
1569*fcf3ce44SJohn Forte display_disk_msg(&l_state.drv_front[i], &l_state, &bpf, 1);
1570*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
1571*fcf3ce44SJohn Forte }
1572*fcf3ce44SJohn Forte for (i = 0; i < (int)l_state.total_num_drv/2; i++, count++) {
1573*fcf3ce44SJohn Forte (void) fprintf(stdout, "%-2d ", count);
1574*fcf3ce44SJohn Forte display_disk_msg(&l_state.drv_rear[i], &l_state, &bpf, 1);
1575*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
1576*fcf3ce44SJohn Forte }
1577*fcf3ce44SJohn Forte
1578*fcf3ce44SJohn Forte
1579*fcf3ce44SJohn Forte /*
1580*fcf3ce44SJohn Forte * Display the subsystem status.
1581*fcf3ce44SJohn Forte */
1582*fcf3ce44SJohn Forte (void) fprintf(stdout,
1583*fcf3ce44SJohn Forte MSGSTR(2033,
1584*fcf3ce44SJohn Forte "\t\tSUBSYSTEM STATUS\nFW Revision:"));
1585*fcf3ce44SJohn Forte for (i = 0; i < sizeof (l_state.ib_tbl.config.prod_revision); i++) {
1586*fcf3ce44SJohn Forte (void) fprintf(stdout, "%c",
1587*fcf3ce44SJohn Forte l_state.ib_tbl.config.prod_revision[i]);
1588*fcf3ce44SJohn Forte }
1589*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2034, " Box ID:%d"),
1590*fcf3ce44SJohn Forte l_state.ib_tbl.box_id);
1591*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n ");
1592*fcf3ce44SJohn Forte
1593*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(90, "Node WWN:"));
1594*fcf3ce44SJohn Forte
1595*fcf3ce44SJohn Forte for (i = 0; i < 8; i++) {
1596*fcf3ce44SJohn Forte (void) fprintf(stdout, "%1.2x",
1597*fcf3ce44SJohn Forte l_state.ib_tbl.config.enc_node_wwn[i]);
1598*fcf3ce44SJohn Forte }
1599*fcf3ce44SJohn Forte /* Make sure NULL terminated although it is supposed to be */
1600*fcf3ce44SJohn Forte if (strlen((const char *)l_state.ib_tbl.enclosure_name) <=
1601*fcf3ce44SJohn Forte sizeof (l_state.ib_tbl.enclosure_name)) {
1602*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2035, " Enclosure Name:%s\n"),
1603*fcf3ce44SJohn Forte l_state.ib_tbl.enclosure_name);
1604*fcf3ce44SJohn Forte }
1605*fcf3ce44SJohn Forte
1606*fcf3ce44SJohn Forte /*
1607*fcf3ce44SJohn Forte *
1608*fcf3ce44SJohn Forte */
1609*fcf3ce44SJohn Forte elem_index = 0;
1610*fcf3ce44SJohn Forte /* Get and print CONTROLLER messages */
1611*fcf3ce44SJohn Forte for (i = 0; i < (int)l_state.ib_tbl.config.enc_num_elem; i++) {
1612*fcf3ce44SJohn Forte elem_index++; /* skip global */
1613*fcf3ce44SJohn Forte switch (l_state.ib_tbl.config.type_hdr[i].type) {
1614*fcf3ce44SJohn Forte case ELM_TYP_PS:
1615*fcf3ce44SJohn Forte ps_messages(&l_state, i, elem_index);
1616*fcf3ce44SJohn Forte break;
1617*fcf3ce44SJohn Forte case ELM_TYP_FT:
1618*fcf3ce44SJohn Forte fan_messages(&l_state, i, elem_index);
1619*fcf3ce44SJohn Forte break;
1620*fcf3ce44SJohn Forte case ELM_TYP_BP:
1621*fcf3ce44SJohn Forte dpm_SSC100_messages(&l_state, i, elem_index);
1622*fcf3ce44SJohn Forte break;
1623*fcf3ce44SJohn Forte case ELM_TYP_IB:
1624*fcf3ce44SJohn Forte ctlr_messages(&l_state, i, elem_index);
1625*fcf3ce44SJohn Forte break;
1626*fcf3ce44SJohn Forte case ELM_TYP_LN:
1627*fcf3ce44SJohn Forte /*
1628*fcf3ce44SJohn Forte * NOTE: I just use the Photon's message
1629*fcf3ce44SJohn Forte * string here and don't look at the
1630*fcf3ce44SJohn Forte * language code. The string includes
1631*fcf3ce44SJohn Forte * the language name.
1632*fcf3ce44SJohn Forte */
1633*fcf3ce44SJohn Forte if (l_state.ib_tbl.config.type_hdr[i].text_len != 0) {
1634*fcf3ce44SJohn Forte (void) fprintf(stdout, "%s\t",
1635*fcf3ce44SJohn Forte l_state.ib_tbl.config.text[i]);
1636*fcf3ce44SJohn Forte }
1637*fcf3ce44SJohn Forte break;
1638*fcf3ce44SJohn Forte case ELM_TYP_LO: /* Loop configuration */
1639*fcf3ce44SJohn Forte loop_messages(&l_state, i, elem_index);
1640*fcf3ce44SJohn Forte break;
1641*fcf3ce44SJohn Forte case ELM_TYP_MB: /* Loop configuration */
1642*fcf3ce44SJohn Forte mb_messages(&l_state, i, elem_index);
1643*fcf3ce44SJohn Forte break;
1644*fcf3ce44SJohn Forte case ELM_TYP_FL:
1645*fcf3ce44SJohn Forte trans_messages(&l_state, 1);
1646*fcf3ce44SJohn Forte break;
1647*fcf3ce44SJohn Forte
1648*fcf3ce44SJohn Forte }
1649*fcf3ce44SJohn Forte /*
1650*fcf3ce44SJohn Forte * Calculate the index to each element.
1651*fcf3ce44SJohn Forte */
1652*fcf3ce44SJohn Forte elem_index += l_state.ib_tbl.config.type_hdr[i].num;
1653*fcf3ce44SJohn Forte }
1654*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
1655*fcf3ce44SJohn Forte }
1656*fcf3ce44SJohn Forte
1657*fcf3ce44SJohn Forte
1658*fcf3ce44SJohn Forte
1659*fcf3ce44SJohn Forte
1660*fcf3ce44SJohn Forte
1661*fcf3ce44SJohn Forte
1662*fcf3ce44SJohn Forte /*
1663*fcf3ce44SJohn Forte * Change the FPM (Front Panel Module) password of the
1664*fcf3ce44SJohn Forte * subsystem associated with the IB addressed by the
1665*fcf3ce44SJohn Forte * enclosure or pathname to name.
1666*fcf3ce44SJohn Forte *
1667*fcf3ce44SJohn Forte */
1668*fcf3ce44SJohn Forte void
intfix(void)1669*fcf3ce44SJohn Forte intfix(void)
1670*fcf3ce44SJohn Forte {
1671*fcf3ce44SJohn Forte if (termio_fd) {
1672*fcf3ce44SJohn Forte termios.c_lflag |= ECHO;
1673*fcf3ce44SJohn Forte ioctl(termio_fd, TCSETS, &termios);
1674*fcf3ce44SJohn Forte }
1675*fcf3ce44SJohn Forte exit(SIGINT);
1676*fcf3ce44SJohn Forte }
1677*fcf3ce44SJohn Forte
1678*fcf3ce44SJohn Forte
1679*fcf3ce44SJohn Forte /*
1680*fcf3ce44SJohn Forte * up_password() Changes the password for SENA enclosure.
1681*fcf3ce44SJohn Forte *
1682*fcf3ce44SJohn Forte * RETURNS:
1683*fcf3ce44SJohn Forte * none.
1684*fcf3ce44SJohn Forte */
1685*fcf3ce44SJohn Forte void
up_password(char ** argv)1686*fcf3ce44SJohn Forte up_password(char **argv)
1687*fcf3ce44SJohn Forte {
1688*fcf3ce44SJohn Forte int path_index = 0, err = 0;
1689*fcf3ce44SJohn Forte char password[1024];
1690*fcf3ce44SJohn Forte char input[1024];
1691*fcf3ce44SJohn Forte int i, j, matched, equal;
1692*fcf3ce44SJohn Forte L_inquiry inq;
1693*fcf3ce44SJohn Forte void (*sig)();
1694*fcf3ce44SJohn Forte char *path_phys = NULL;
1695*fcf3ce44SJohn Forte Path_struct *path_struct;
1696*fcf3ce44SJohn Forte
1697*fcf3ce44SJohn Forte
1698*fcf3ce44SJohn Forte if ((termio_fd = open("/dev/tty", O_RDONLY)) == -1) {
1699*fcf3ce44SJohn Forte (void) fprintf(stderr,
1700*fcf3ce44SJohn Forte MSGSTR(2036, "Error: tty open failed.\n"));
1701*fcf3ce44SJohn Forte exit(-1);
1702*fcf3ce44SJohn Forte }
1703*fcf3ce44SJohn Forte ioctl(termio_fd, TCGETS, &termios);
1704*fcf3ce44SJohn Forte sig = sigset(SIGINT, (void (*)())intfix);
1705*fcf3ce44SJohn Forte /*
1706*fcf3ce44SJohn Forte * Make sure path valid and is to a PHO
1707*fcf3ce44SJohn Forte * before bothering operator.
1708*fcf3ce44SJohn Forte */
1709*fcf3ce44SJohn Forte if ((err = l_convert_name(argv[path_index], &path_phys,
1710*fcf3ce44SJohn Forte &path_struct, Options & PVERBOSE)) != 0) {
1711*fcf3ce44SJohn Forte (void) fprintf(stderr,
1712*fcf3ce44SJohn Forte MSGSTR(33,
1713*fcf3ce44SJohn Forte " Error: converting"
1714*fcf3ce44SJohn Forte " %s to physical path.\n"
1715*fcf3ce44SJohn Forte " Invalid pathname.\n"),
1716*fcf3ce44SJohn Forte argv[path_index]);
1717*fcf3ce44SJohn Forte if (err != -1) {
1718*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
1719*fcf3ce44SJohn Forte }
1720*fcf3ce44SJohn Forte exit(-1);
1721*fcf3ce44SJohn Forte }
1722*fcf3ce44SJohn Forte if (err = g_get_inquiry(path_phys, &inq)) {
1723*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
1724*fcf3ce44SJohn Forte exit(-1);
1725*fcf3ce44SJohn Forte }
1726*fcf3ce44SJohn Forte if ((strstr((char *)inq.inq_pid, ENCLOSURE_PROD_ID) == 0) &&
1727*fcf3ce44SJohn Forte (!(strncmp((char *)inq.inq_vid, "SUN ",
1728*fcf3ce44SJohn Forte sizeof (inq.inq_vid)) &&
1729*fcf3ce44SJohn Forte ((inq.inq_dtype & DTYPE_MASK) == DTYPE_ESI)))) {
1730*fcf3ce44SJohn Forte /*
1731*fcf3ce44SJohn Forte * Again this is like the ssaadm code in that the name
1732*fcf3ce44SJohn Forte * is still not defined before this code must be released.
1733*fcf3ce44SJohn Forte */
1734*fcf3ce44SJohn Forte (void) fprintf(stderr,
1735*fcf3ce44SJohn Forte MSGSTR(2037, "Error: Enclosure is not a %s\n"),
1736*fcf3ce44SJohn Forte ENCLOSURE_PROD_ID);
1737*fcf3ce44SJohn Forte exit(-1);
1738*fcf3ce44SJohn Forte }
1739*fcf3ce44SJohn Forte (void) fprintf(stdout,
1740*fcf3ce44SJohn Forte MSGSTR(2038,
1741*fcf3ce44SJohn Forte "Changing FPM password for subsystem %s\n"),
1742*fcf3ce44SJohn Forte argv[path_index]);
1743*fcf3ce44SJohn Forte
1744*fcf3ce44SJohn Forte equal = 0;
1745*fcf3ce44SJohn Forte while (!equal) {
1746*fcf3ce44SJohn Forte memset(input, 0, sizeof (input));
1747*fcf3ce44SJohn Forte memset(password, 0, sizeof (password));
1748*fcf3ce44SJohn Forte (void) fprintf(stdout,
1749*fcf3ce44SJohn Forte MSGSTR(2039, "New password: "));
1750*fcf3ce44SJohn Forte
1751*fcf3ce44SJohn Forte termios.c_lflag &= ~ECHO;
1752*fcf3ce44SJohn Forte ioctl(termio_fd, TCSETS, &termios);
1753*fcf3ce44SJohn Forte
1754*fcf3ce44SJohn Forte (void) gets(input);
1755*fcf3ce44SJohn Forte (void) fprintf(stdout,
1756*fcf3ce44SJohn Forte MSGSTR(2040, "\nRe-enter new password: "));
1757*fcf3ce44SJohn Forte (void) gets(password);
1758*fcf3ce44SJohn Forte termios.c_lflag |= ECHO;
1759*fcf3ce44SJohn Forte ioctl(termio_fd, TCSETS, &termios);
1760*fcf3ce44SJohn Forte for (i = 0; input[i]; i++) {
1761*fcf3ce44SJohn Forte if (!isdigit(input[i])) {
1762*fcf3ce44SJohn Forte (void) fprintf(stderr,
1763*fcf3ce44SJohn Forte MSGSTR(2041, "\nError: Invalid password."
1764*fcf3ce44SJohn Forte " The password"
1765*fcf3ce44SJohn Forte " must be 4 decimal-digit characters.\n"));
1766*fcf3ce44SJohn Forte exit(-1);
1767*fcf3ce44SJohn Forte }
1768*fcf3ce44SJohn Forte }
1769*fcf3ce44SJohn Forte if (i && (i != 4)) {
1770*fcf3ce44SJohn Forte (void) fprintf(stderr,
1771*fcf3ce44SJohn Forte MSGSTR(2042, "\nError: Invalid password."
1772*fcf3ce44SJohn Forte " The password"
1773*fcf3ce44SJohn Forte " must be 4 decimal-digit characters.\n"));
1774*fcf3ce44SJohn Forte exit(-1);
1775*fcf3ce44SJohn Forte }
1776*fcf3ce44SJohn Forte for (j = 0; password[j]; j++) {
1777*fcf3ce44SJohn Forte if (!isdigit(password[j])) {
1778*fcf3ce44SJohn Forte (void) fprintf(stderr,
1779*fcf3ce44SJohn Forte MSGSTR(2043, "\nError: Invalid password."
1780*fcf3ce44SJohn Forte " The password"
1781*fcf3ce44SJohn Forte " must be 4 decimal-digit characters.\n"));
1782*fcf3ce44SJohn Forte exit(-1);
1783*fcf3ce44SJohn Forte }
1784*fcf3ce44SJohn Forte }
1785*fcf3ce44SJohn Forte if (i != j) {
1786*fcf3ce44SJohn Forte matched = -1;
1787*fcf3ce44SJohn Forte } else for (i = matched = 0; password[i]; i++) {
1788*fcf3ce44SJohn Forte if (password[i] == input[i]) {
1789*fcf3ce44SJohn Forte matched++;
1790*fcf3ce44SJohn Forte }
1791*fcf3ce44SJohn Forte }
1792*fcf3ce44SJohn Forte if ((matched != -1) && (matched == i)) {
1793*fcf3ce44SJohn Forte equal = 1;
1794*fcf3ce44SJohn Forte } else {
1795*fcf3ce44SJohn Forte (void) fprintf(stdout,
1796*fcf3ce44SJohn Forte MSGSTR(2044, "\npassword: They don't match;"
1797*fcf3ce44SJohn Forte " try again.\n"));
1798*fcf3ce44SJohn Forte }
1799*fcf3ce44SJohn Forte }
1800*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
1801*fcf3ce44SJohn Forte sscanf(input, "%s", password);
1802*fcf3ce44SJohn Forte (void) signal(SIGINT, sig); /* restore signal handler */
1803*fcf3ce44SJohn Forte
1804*fcf3ce44SJohn Forte /* Send new password to IB */
1805*fcf3ce44SJohn Forte if (l_new_password(path_phys, input)) {
1806*fcf3ce44SJohn Forte (void) print_errString(err, path_phys);
1807*fcf3ce44SJohn Forte exit(-1);
1808*fcf3ce44SJohn Forte }
1809*fcf3ce44SJohn Forte }
1810*fcf3ce44SJohn Forte
1811*fcf3ce44SJohn Forte /*
1812*fcf3ce44SJohn Forte * Call g_failover to process failover command
1813*fcf3ce44SJohn Forte */
1814*fcf3ce44SJohn Forte void
adm_failover(char ** argv)1815*fcf3ce44SJohn Forte adm_failover(char **argv)
1816*fcf3ce44SJohn Forte {
1817*fcf3ce44SJohn Forte int path_index = 0, err = 0;
1818*fcf3ce44SJohn Forte char pathclass[20];
1819*fcf3ce44SJohn Forte char *path_phys = NULL;
1820*fcf3ce44SJohn Forte
1821*fcf3ce44SJohn Forte (void) memset(pathclass, 0, sizeof (pathclass));
1822*fcf3ce44SJohn Forte (void) strcpy(pathclass, argv[path_index++]);
1823*fcf3ce44SJohn Forte if ((strcmp(pathclass, "primary") != 0) &&
1824*fcf3ce44SJohn Forte (strcmp(pathclass, "secondary") != 0)) {
1825*fcf3ce44SJohn Forte (void) fprintf(stderr,
1826*fcf3ce44SJohn Forte MSGSTR(2300, "Incorrect pathclass\n"));
1827*fcf3ce44SJohn Forte exit(-1);
1828*fcf3ce44SJohn Forte }
1829*fcf3ce44SJohn Forte
1830*fcf3ce44SJohn Forte while (argv[path_index] != NULL) {
1831*fcf3ce44SJohn Forte path_phys = g_get_physical_name(argv[path_index++]);
1832*fcf3ce44SJohn Forte if ((path_phys == NULL) ||
1833*fcf3ce44SJohn Forte (strstr(path_phys, SCSI_VHCI) == NULL)) {
1834*fcf3ce44SJohn Forte (void) fprintf(stderr,
1835*fcf3ce44SJohn Forte MSGSTR(2301, "Incorrect pathname\n"));
1836*fcf3ce44SJohn Forte exit(-1);
1837*fcf3ce44SJohn Forte }
1838*fcf3ce44SJohn Forte
1839*fcf3ce44SJohn Forte if (err = g_failover(path_phys, pathclass)) {
1840*fcf3ce44SJohn Forte (void) print_errString(err, NULL);
1841*fcf3ce44SJohn Forte exit(-1);
1842*fcf3ce44SJohn Forte }
1843*fcf3ce44SJohn Forte }
1844*fcf3ce44SJohn Forte }
1845*fcf3ce44SJohn Forte
1846*fcf3ce44SJohn Forte
1847*fcf3ce44SJohn Forte
1848*fcf3ce44SJohn Forte /*
1849*fcf3ce44SJohn Forte * up_encl_name() Update the enclosures logical name.
1850*fcf3ce44SJohn Forte *
1851*fcf3ce44SJohn Forte * RETURNS:
1852*fcf3ce44SJohn Forte * none.
1853*fcf3ce44SJohn Forte */
1854*fcf3ce44SJohn Forte void
up_encl_name(char ** argv,int argc)1855*fcf3ce44SJohn Forte up_encl_name(char **argv, int argc)
1856*fcf3ce44SJohn Forte {
1857*fcf3ce44SJohn Forte int i, rval, al_pa, path_index = 0, err = 0;
1858*fcf3ce44SJohn Forte L_inquiry inq;
1859*fcf3ce44SJohn Forte Box_list *b_list = NULL;
1860*fcf3ce44SJohn Forte uchar_t node_wwn[WWN_SIZE], port_wwn[WWN_SIZE];
1861*fcf3ce44SJohn Forte char wwn1[(WWN_SIZE*2)+1], name[1024], *path_phys = NULL;
1862*fcf3ce44SJohn Forte Path_struct *path_struct;
1863*fcf3ce44SJohn Forte
1864*fcf3ce44SJohn Forte (void) memset(name, 0, sizeof (name));
1865*fcf3ce44SJohn Forte (void) memset(&inq, 0, sizeof (inq));
1866*fcf3ce44SJohn Forte (void) sscanf(argv[path_index++], "%s", name);
1867*fcf3ce44SJohn Forte for (i = 0; name[i]; i++) {
1868*fcf3ce44SJohn Forte if ((!isalnum(name[i]) &&
1869*fcf3ce44SJohn Forte ((name[i] != '#') &&
1870*fcf3ce44SJohn Forte (name[i] != '-') &&
1871*fcf3ce44SJohn Forte (name[i] != '_') &&
1872*fcf3ce44SJohn Forte (name[i] != '.'))) || i >= 16) {
1873*fcf3ce44SJohn Forte (void) fprintf(stderr,
1874*fcf3ce44SJohn Forte MSGSTR(2045, "Error: Invalid enclosure name.\n"));
1875*fcf3ce44SJohn Forte (void) fprintf(stderr, MSGSTR(2046,
1876*fcf3ce44SJohn Forte "Usage: %s [-v] subcommand {a name consisting of"
1877*fcf3ce44SJohn Forte " 1-16 alphanumeric characters}"
1878*fcf3ce44SJohn Forte " {enclosure... | pathname...}\n"), whoami);
1879*fcf3ce44SJohn Forte exit(-1);
1880*fcf3ce44SJohn Forte }
1881*fcf3ce44SJohn Forte }
1882*fcf3ce44SJohn Forte
1883*fcf3ce44SJohn Forte if (((Options & PVERBOSE) && (argc != 5)) ||
1884*fcf3ce44SJohn Forte (!(Options & PVERBOSE) && (argc != 4))) {
1885*fcf3ce44SJohn Forte (void) fprintf(stderr,
1886*fcf3ce44SJohn Forte MSGSTR(114, "Error: Incorrect number of arguments.\n"));
1887*fcf3ce44SJohn Forte (void) fprintf(stderr, MSGSTR(2047,
1888*fcf3ce44SJohn Forte "Usage: %s [-v] subcommand {a name consisting of"
1889*fcf3ce44SJohn Forte " 1-16 alphanumeric characters}"
1890*fcf3ce44SJohn Forte " {enclosure... | pathname...}\n"), whoami);
1891*fcf3ce44SJohn Forte exit(-1);
1892*fcf3ce44SJohn Forte }
1893*fcf3ce44SJohn Forte
1894*fcf3ce44SJohn Forte if ((err = l_convert_name(argv[path_index], &path_phys,
1895*fcf3ce44SJohn Forte &path_struct, Options & PVERBOSE)) != 0) {
1896*fcf3ce44SJohn Forte (void) fprintf(stderr,
1897*fcf3ce44SJohn Forte MSGSTR(33,
1898*fcf3ce44SJohn Forte " Error: converting"
1899*fcf3ce44SJohn Forte " %s to physical path.\n"
1900*fcf3ce44SJohn Forte " Invalid pathname.\n"),
1901*fcf3ce44SJohn Forte argv[path_index]);
1902*fcf3ce44SJohn Forte if (err != -1) {
1903*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
1904*fcf3ce44SJohn Forte }
1905*fcf3ce44SJohn Forte exit(-1);
1906*fcf3ce44SJohn Forte }
1907*fcf3ce44SJohn Forte /*
1908*fcf3ce44SJohn Forte * Make sure we are talking to an IB.
1909*fcf3ce44SJohn Forte */
1910*fcf3ce44SJohn Forte if (err = g_get_inquiry(path_phys, &inq)) {
1911*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
1912*fcf3ce44SJohn Forte exit(-1);
1913*fcf3ce44SJohn Forte }
1914*fcf3ce44SJohn Forte if ((strstr((char *)inq.inq_pid, ENCLOSURE_PROD_ID) == 0) &&
1915*fcf3ce44SJohn Forte (!(strncmp((char *)inq.inq_vid, "SUN ",
1916*fcf3ce44SJohn Forte sizeof (inq.inq_vid)) &&
1917*fcf3ce44SJohn Forte ((inq.inq_dtype & DTYPE_MASK) == DTYPE_ESI)))) {
1918*fcf3ce44SJohn Forte /*
1919*fcf3ce44SJohn Forte * Again this is like the ssaadm code in that the name
1920*fcf3ce44SJohn Forte * is still not defined before this code must be released.
1921*fcf3ce44SJohn Forte */
1922*fcf3ce44SJohn Forte (void) fprintf(stderr,
1923*fcf3ce44SJohn Forte MSGSTR(2048, "Error: Pathname does not point to a %s"
1924*fcf3ce44SJohn Forte " enclosure\n"), ENCLOSURE_PROD_NAME);
1925*fcf3ce44SJohn Forte exit(-1);
1926*fcf3ce44SJohn Forte }
1927*fcf3ce44SJohn Forte
1928*fcf3ce44SJohn Forte if (err = g_get_wwn(path_phys, port_wwn, node_wwn, &al_pa,
1929*fcf3ce44SJohn Forte Options & PVERBOSE)) {
1930*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
1931*fcf3ce44SJohn Forte exit(-1);
1932*fcf3ce44SJohn Forte }
1933*fcf3ce44SJohn Forte
1934*fcf3ce44SJohn Forte for (i = 0; i < WWN_SIZE; i++) {
1935*fcf3ce44SJohn Forte (void) sprintf(&wwn1[i << 1], "%02x", node_wwn[i]);
1936*fcf3ce44SJohn Forte }
1937*fcf3ce44SJohn Forte if ((err = l_get_box_list(&b_list, Options & PVERBOSE)) != 0) {
1938*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
1939*fcf3ce44SJohn Forte exit(-1);
1940*fcf3ce44SJohn Forte }
1941*fcf3ce44SJohn Forte if (b_list == NULL) {
1942*fcf3ce44SJohn Forte (void) fprintf(stdout,
1943*fcf3ce44SJohn Forte MSGSTR(93, "No %s enclosures found "
1944*fcf3ce44SJohn Forte "in /dev/es\n"), ENCLOSURE_PROD_NAME);
1945*fcf3ce44SJohn Forte exit(-1);
1946*fcf3ce44SJohn Forte } else if (l_duplicate_names(b_list, wwn1, name,
1947*fcf3ce44SJohn Forte Options & PVERBOSE)) {
1948*fcf3ce44SJohn Forte (void) fprintf(stderr,
1949*fcf3ce44SJohn Forte MSGSTR(2049, "Warning: The name you selected, %s,"
1950*fcf3ce44SJohn Forte " is already being used.\n"
1951*fcf3ce44SJohn Forte "Please choose a unique name.\n"
1952*fcf3ce44SJohn Forte "You can use the \"probe\" subcommand to"
1953*fcf3ce44SJohn Forte " see all of the enclosure names.\n"),
1954*fcf3ce44SJohn Forte name);
1955*fcf3ce44SJohn Forte (void) l_free_box_list(&b_list);
1956*fcf3ce44SJohn Forte exit(-1);
1957*fcf3ce44SJohn Forte }
1958*fcf3ce44SJohn Forte (void) l_free_box_list(&b_list);
1959*fcf3ce44SJohn Forte
1960*fcf3ce44SJohn Forte /* Send new name to IB */
1961*fcf3ce44SJohn Forte if (rval = l_new_name(path_phys, name)) {
1962*fcf3ce44SJohn Forte (void) print_errString(rval, path_phys);
1963*fcf3ce44SJohn Forte exit(-1);
1964*fcf3ce44SJohn Forte }
1965*fcf3ce44SJohn Forte if (Options & PVERBOSE) {
1966*fcf3ce44SJohn Forte (void) fprintf(stdout,
1967*fcf3ce44SJohn Forte MSGSTR(2050, "The enclosure has been renamed to %s\n"),
1968*fcf3ce44SJohn Forte name);
1969*fcf3ce44SJohn Forte }
1970*fcf3ce44SJohn Forte }
1971*fcf3ce44SJohn Forte
1972*fcf3ce44SJohn Forte
1973*fcf3ce44SJohn Forte static int
get_enclStatus(char * phys_path,char * encl_name,int off_flag)1974*fcf3ce44SJohn Forte get_enclStatus(char *phys_path, char *encl_name, int off_flag)
1975*fcf3ce44SJohn Forte {
1976*fcf3ce44SJohn Forte int found_pwrOnDrv = 0, slot;
1977*fcf3ce44SJohn Forte int found_pwrOffDrv = 0, err = 0;
1978*fcf3ce44SJohn Forte L_state l_state;
1979*fcf3ce44SJohn Forte
1980*fcf3ce44SJohn Forte if ((err = l_get_status(phys_path,
1981*fcf3ce44SJohn Forte &l_state, Options & PVERBOSE)) != 0) {
1982*fcf3ce44SJohn Forte (void) print_errString(err, encl_name);
1983*fcf3ce44SJohn Forte return (err);
1984*fcf3ce44SJohn Forte }
1985*fcf3ce44SJohn Forte
1986*fcf3ce44SJohn Forte if (off_flag) {
1987*fcf3ce44SJohn Forte for (slot = 0; slot < l_state.total_num_drv/2;
1988*fcf3ce44SJohn Forte slot++) {
1989*fcf3ce44SJohn Forte if (((l_state.drv_front[slot].ib_status.code !=
1990*fcf3ce44SJohn Forte S_NOT_INSTALLED) &&
1991*fcf3ce44SJohn Forte (!l_state.drv_front[slot].ib_status.dev_off)) ||
1992*fcf3ce44SJohn Forte ((l_state.drv_rear[slot].ib_status.code !=
1993*fcf3ce44SJohn Forte S_NOT_INSTALLED) &&
1994*fcf3ce44SJohn Forte (!l_state.drv_rear[slot].ib_status.dev_off))) {
1995*fcf3ce44SJohn Forte found_pwrOnDrv++;
1996*fcf3ce44SJohn Forte break;
1997*fcf3ce44SJohn Forte }
1998*fcf3ce44SJohn Forte }
1999*fcf3ce44SJohn Forte if (!found_pwrOnDrv) {
2000*fcf3ce44SJohn Forte (void) fprintf(stdout,
2001*fcf3ce44SJohn Forte MSGSTR(2051,
2002*fcf3ce44SJohn Forte "Notice: Drives in enclosure"
2003*fcf3ce44SJohn Forte " \"%s\" have already been"
2004*fcf3ce44SJohn Forte " powered off.\n\n"),
2005*fcf3ce44SJohn Forte encl_name);
2006*fcf3ce44SJohn Forte return (-1);
2007*fcf3ce44SJohn Forte }
2008*fcf3ce44SJohn Forte } else {
2009*fcf3ce44SJohn Forte for (slot = 0; slot < l_state.total_num_drv/2;
2010*fcf3ce44SJohn Forte slot++) {
2011*fcf3ce44SJohn Forte if (((l_state.drv_front[slot].ib_status.code !=
2012*fcf3ce44SJohn Forte S_NOT_INSTALLED) &&
2013*fcf3ce44SJohn Forte (l_state.drv_front[slot].ib_status.dev_off)) ||
2014*fcf3ce44SJohn Forte ((l_state.drv_rear[slot].ib_status.code !=
2015*fcf3ce44SJohn Forte S_NOT_INSTALLED) &&
2016*fcf3ce44SJohn Forte (l_state.drv_rear[slot].ib_status.dev_off))) {
2017*fcf3ce44SJohn Forte found_pwrOffDrv++;
2018*fcf3ce44SJohn Forte break;
2019*fcf3ce44SJohn Forte }
2020*fcf3ce44SJohn Forte }
2021*fcf3ce44SJohn Forte if (!found_pwrOffDrv) {
2022*fcf3ce44SJohn Forte (void) fprintf(stdout,
2023*fcf3ce44SJohn Forte MSGSTR(2052,
2024*fcf3ce44SJohn Forte "Notice: Drives in enclosure"
2025*fcf3ce44SJohn Forte " \"%s\" have already been"
2026*fcf3ce44SJohn Forte " powered on.\n\n"),
2027*fcf3ce44SJohn Forte encl_name);
2028*fcf3ce44SJohn Forte return (-1);
2029*fcf3ce44SJohn Forte }
2030*fcf3ce44SJohn Forte }
2031*fcf3ce44SJohn Forte return (0);
2032*fcf3ce44SJohn Forte }
2033*fcf3ce44SJohn Forte
2034*fcf3ce44SJohn Forte
2035*fcf3ce44SJohn Forte
2036*fcf3ce44SJohn Forte
2037*fcf3ce44SJohn Forte
2038*fcf3ce44SJohn Forte /*
2039*fcf3ce44SJohn Forte * adm_led() The led_request subcommand requests the subsystem
2040*fcf3ce44SJohn Forte * to display the current state or turn off, on, or blink
2041*fcf3ce44SJohn Forte * the yellow LED associated with the disk specified by the
2042*fcf3ce44SJohn Forte * enclosure or pathname.
2043*fcf3ce44SJohn Forte *
2044*fcf3ce44SJohn Forte * RETURNS:
2045*fcf3ce44SJohn Forte * none.
2046*fcf3ce44SJohn Forte */
2047*fcf3ce44SJohn Forte void
adm_led(char ** argv,int led_action)2048*fcf3ce44SJohn Forte adm_led(char **argv, int led_action)
2049*fcf3ce44SJohn Forte {
2050*fcf3ce44SJohn Forte int path_index = 0, err = 0;
2051*fcf3ce44SJohn Forte gfc_map_t map;
2052*fcf3ce44SJohn Forte L_inquiry inq;
2053*fcf3ce44SJohn Forte Dev_elem_st status;
2054*fcf3ce44SJohn Forte char *path_phys = NULL;
2055*fcf3ce44SJohn Forte Path_struct *path_struct;
2056*fcf3ce44SJohn Forte int enc_t = 0; /* enclosure type */
2057*fcf3ce44SJohn Forte char ses_path[MAXPATHLEN];
2058*fcf3ce44SJohn Forte L_inquiry ses_inq;
2059*fcf3ce44SJohn Forte
2060*fcf3ce44SJohn Forte while (argv[path_index] != NULL) {
2061*fcf3ce44SJohn Forte if ((err = l_convert_name(argv[path_index], &path_phys,
2062*fcf3ce44SJohn Forte &path_struct, Options & PVERBOSE)) != 0) {
2063*fcf3ce44SJohn Forte /* Make sure we have a device path. */
2064*fcf3ce44SJohn Forte if (path_struct->ib_path_flag) {
2065*fcf3ce44SJohn Forte path_phys = path_struct->p_physical_path;
2066*fcf3ce44SJohn Forte } else {
2067*fcf3ce44SJohn Forte (void) fprintf(stderr,
2068*fcf3ce44SJohn Forte MSGSTR(33,
2069*fcf3ce44SJohn Forte " Error: converting"
2070*fcf3ce44SJohn Forte " %s to physical path.\n"
2071*fcf3ce44SJohn Forte " Invalid pathname.\n"),
2072*fcf3ce44SJohn Forte argv[path_index]);
2073*fcf3ce44SJohn Forte if (err != -1) {
2074*fcf3ce44SJohn Forte (void) print_errString(err,
2075*fcf3ce44SJohn Forte argv[path_index]);
2076*fcf3ce44SJohn Forte }
2077*fcf3ce44SJohn Forte exit(-1);
2078*fcf3ce44SJohn Forte }
2079*fcf3ce44SJohn Forte }
2080*fcf3ce44SJohn Forte if (!path_struct->ib_path_flag) {
2081*fcf3ce44SJohn Forte if (err = g_get_inquiry(path_phys, &inq)) {
2082*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
2083*fcf3ce44SJohn Forte exit(-1);
2084*fcf3ce44SJohn Forte }
2085*fcf3ce44SJohn Forte if ((inq.inq_dtype & DTYPE_MASK) != DTYPE_DIRECT) {
2086*fcf3ce44SJohn Forte (void) fprintf(stderr,
2087*fcf3ce44SJohn Forte MSGSTR(2053,
2088*fcf3ce44SJohn Forte "Error: pathname must be to a disk device.\n"
2089*fcf3ce44SJohn Forte " %s\n"), argv[path_index]);
2090*fcf3ce44SJohn Forte exit(-1);
2091*fcf3ce44SJohn Forte }
2092*fcf3ce44SJohn Forte }
2093*fcf3ce44SJohn Forte /*
2094*fcf3ce44SJohn Forte * See if we are in fact talking to a loop or not.
2095*fcf3ce44SJohn Forte */
2096*fcf3ce44SJohn Forte if (err = g_get_dev_map(path_phys, &map,
2097*fcf3ce44SJohn Forte (Options & PVERBOSE))) {
2098*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
2099*fcf3ce44SJohn Forte
2100*fcf3ce44SJohn Forte }
2101*fcf3ce44SJohn Forte if (led_action == L_LED_ON) {
2102*fcf3ce44SJohn Forte (void) fprintf(stderr, MSGSTR(2054,
2103*fcf3ce44SJohn Forte "The led_on functionality is not applicable "
2104*fcf3ce44SJohn Forte "to this subsystem.\n"));
2105*fcf3ce44SJohn Forte exit(-1);
2106*fcf3ce44SJohn Forte }
2107*fcf3ce44SJohn Forte if (err = l_led(path_struct, led_action, &status,
2108*fcf3ce44SJohn Forte (Options & PVERBOSE))) {
2109*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
2110*fcf3ce44SJohn Forte exit(-1);
2111*fcf3ce44SJohn Forte }
2112*fcf3ce44SJohn Forte
2113*fcf3ce44SJohn Forte /* Check to see if we have a daktari */
2114*fcf3ce44SJohn Forte if (l_get_ses_path(path_phys, ses_path, &map,
2115*fcf3ce44SJohn Forte (Options & PVERBOSE)) == 0) {
2116*fcf3ce44SJohn Forte if (g_get_inquiry(ses_path, &ses_inq) == 0) {
2117*fcf3ce44SJohn Forte enc_t = l_get_enc_type(ses_inq);
2118*fcf3ce44SJohn Forte }
2119*fcf3ce44SJohn Forte }
2120*fcf3ce44SJohn Forte switch (led_action) {
2121*fcf3ce44SJohn Forte case L_LED_STATUS:
2122*fcf3ce44SJohn Forte if (status.fault || status.fault_req) {
2123*fcf3ce44SJohn Forte if (!path_struct->slot_valid) {
2124*fcf3ce44SJohn Forte (void) fprintf(stdout,
2125*fcf3ce44SJohn Forte MSGSTR(2055, "LED state is ON for "
2126*fcf3ce44SJohn Forte "device:\n %s\n"), path_phys);
2127*fcf3ce44SJohn Forte } else {
2128*fcf3ce44SJohn Forte if (enc_t == DAK_ENC_TYPE) {
2129*fcf3ce44SJohn Forte if (path_struct->f_flag) {
2130*fcf3ce44SJohn Forte (void) fprintf(stdout,
2131*fcf3ce44SJohn Forte MSGSTR(2236, "LED state is ON for "
2132*fcf3ce44SJohn Forte "device in location: slot %d\n"),
2133*fcf3ce44SJohn Forte path_struct->slot);
2134*fcf3ce44SJohn Forte } else {
2135*fcf3ce44SJohn Forte (void) fprintf(stdout,
2136*fcf3ce44SJohn Forte MSGSTR(2236, "LED state is ON for "
2137*fcf3ce44SJohn Forte "device in location: slot %d\n"),
2138*fcf3ce44SJohn Forte path_struct->slot +
2139*fcf3ce44SJohn Forte (MAX_DRIVES_DAK/2));
2140*fcf3ce44SJohn Forte }
2141*fcf3ce44SJohn Forte } else {
2142*fcf3ce44SJohn Forte (void) fprintf(stdout,
2143*fcf3ce44SJohn Forte (path_struct->f_flag) ?
2144*fcf3ce44SJohn Forte MSGSTR(2056, "LED state is ON for "
2145*fcf3ce44SJohn Forte "device in location: front,slot %d\n")
2146*fcf3ce44SJohn Forte : MSGSTR(2057, "LED state is ON for "
2147*fcf3ce44SJohn Forte "device in location: rear,slot %d\n"),
2148*fcf3ce44SJohn Forte path_struct->slot);
2149*fcf3ce44SJohn Forte }
2150*fcf3ce44SJohn Forte }
2151*fcf3ce44SJohn Forte } else if (status.ident || status.rdy_to_ins ||
2152*fcf3ce44SJohn Forte status.rmv) {
2153*fcf3ce44SJohn Forte if (!path_struct->slot_valid) {
2154*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2058,
2155*fcf3ce44SJohn Forte "LED state is BLINKING for "
2156*fcf3ce44SJohn Forte "device:\n %s\n"), path_phys);
2157*fcf3ce44SJohn Forte } else {
2158*fcf3ce44SJohn Forte if (enc_t == DAK_ENC_TYPE) {
2159*fcf3ce44SJohn Forte if (path_struct->f_flag) {
2160*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2237,
2161*fcf3ce44SJohn Forte "LED state is BLINKING for "
2162*fcf3ce44SJohn Forte "device in location: slot %d\n"),
2163*fcf3ce44SJohn Forte path_struct->slot);
2164*fcf3ce44SJohn Forte } else {
2165*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2237,
2166*fcf3ce44SJohn Forte "LED state is BLINKING for "
2167*fcf3ce44SJohn Forte "device in location: slot %d\n"),
2168*fcf3ce44SJohn Forte path_struct->slot + (MAX_DRIVES_DAK/2));
2169*fcf3ce44SJohn Forte }
2170*fcf3ce44SJohn Forte } else {
2171*fcf3ce44SJohn Forte (void) fprintf(stdout,
2172*fcf3ce44SJohn Forte (path_struct->f_flag) ?
2173*fcf3ce44SJohn Forte MSGSTR(2059, "LED state is BLINKING for "
2174*fcf3ce44SJohn Forte "device in location: front,slot %d\n")
2175*fcf3ce44SJohn Forte : MSGSTR(2060, "LED state is BLINKING for "
2176*fcf3ce44SJohn Forte "device in location: rear,slot %d\n"),
2177*fcf3ce44SJohn Forte path_struct->slot);
2178*fcf3ce44SJohn Forte }
2179*fcf3ce44SJohn Forte }
2180*fcf3ce44SJohn Forte } else {
2181*fcf3ce44SJohn Forte if (!path_struct->slot_valid) {
2182*fcf3ce44SJohn Forte (void) fprintf(stdout,
2183*fcf3ce44SJohn Forte MSGSTR(2061, "LED state is OFF for "
2184*fcf3ce44SJohn Forte "device:\n %s\n"), path_phys);
2185*fcf3ce44SJohn Forte } else {
2186*fcf3ce44SJohn Forte if (enc_t == DAK_ENC_TYPE) {
2187*fcf3ce44SJohn Forte if (path_struct->f_flag) {
2188*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2238,
2189*fcf3ce44SJohn Forte "LED state is OFF for "
2190*fcf3ce44SJohn Forte "device in location: slot %d\n"),
2191*fcf3ce44SJohn Forte path_struct->slot);
2192*fcf3ce44SJohn Forte } else {
2193*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2238,
2194*fcf3ce44SJohn Forte "LED state is OFF for "
2195*fcf3ce44SJohn Forte "device in location: slot %d\n"),
2196*fcf3ce44SJohn Forte path_struct->slot + MAX_DRIVES_DAK/2);
2197*fcf3ce44SJohn Forte }
2198*fcf3ce44SJohn Forte } else {
2199*fcf3ce44SJohn Forte (void) fprintf(stdout,
2200*fcf3ce44SJohn Forte (path_struct->f_flag) ?
2201*fcf3ce44SJohn Forte MSGSTR(2062, "LED state is OFF for "
2202*fcf3ce44SJohn Forte "device in location: front,slot %d\n")
2203*fcf3ce44SJohn Forte : MSGSTR(2063, "LED state is OFF for "
2204*fcf3ce44SJohn Forte "device in location: rear,slot %d\n"),
2205*fcf3ce44SJohn Forte path_struct->slot);
2206*fcf3ce44SJohn Forte }
2207*fcf3ce44SJohn Forte }
2208*fcf3ce44SJohn Forte }
2209*fcf3ce44SJohn Forte break;
2210*fcf3ce44SJohn Forte }
2211*fcf3ce44SJohn Forte free((void *)map.dev_addr);
2212*fcf3ce44SJohn Forte path_index++;
2213*fcf3ce44SJohn Forte }
2214*fcf3ce44SJohn Forte }
2215*fcf3ce44SJohn Forte
2216*fcf3ce44SJohn Forte
2217*fcf3ce44SJohn Forte
2218*fcf3ce44SJohn Forte
2219*fcf3ce44SJohn Forte
2220*fcf3ce44SJohn Forte /*
2221*fcf3ce44SJohn Forte * dump() Dump information
2222*fcf3ce44SJohn Forte *
2223*fcf3ce44SJohn Forte * RETURNS:
2224*fcf3ce44SJohn Forte * none.
2225*fcf3ce44SJohn Forte */
2226*fcf3ce44SJohn Forte void
dump(char ** argv)2227*fcf3ce44SJohn Forte dump(char **argv)
2228*fcf3ce44SJohn Forte {
2229*fcf3ce44SJohn Forte uchar_t *buf;
2230*fcf3ce44SJohn Forte int path_index = 0, err = 0;
2231*fcf3ce44SJohn Forte L_inquiry inq;
2232*fcf3ce44SJohn Forte char hdr_buf[MAXNAMELEN];
2233*fcf3ce44SJohn Forte Rec_diag_hdr *hdr, *hdr_ptr;
2234*fcf3ce44SJohn Forte char *path_phys = NULL;
2235*fcf3ce44SJohn Forte Path_struct *path_struct;
2236*fcf3ce44SJohn Forte
2237*fcf3ce44SJohn Forte /*
2238*fcf3ce44SJohn Forte * get big buffer
2239*fcf3ce44SJohn Forte */
2240*fcf3ce44SJohn Forte if ((hdr = (struct rec_diag_hdr *)calloc(1, MAX_REC_DIAG_LENGTH)) ==
2241*fcf3ce44SJohn Forte NULL) {
2242*fcf3ce44SJohn Forte (void) print_errString(L_MALLOC_FAILED, NULL);
2243*fcf3ce44SJohn Forte exit(-1);
2244*fcf3ce44SJohn Forte }
2245*fcf3ce44SJohn Forte buf = (uchar_t *)hdr;
2246*fcf3ce44SJohn Forte
2247*fcf3ce44SJohn Forte while (argv[path_index] != NULL) {
2248*fcf3ce44SJohn Forte if ((err = l_convert_name(argv[path_index], &path_phys,
2249*fcf3ce44SJohn Forte &path_struct, Options & PVERBOSE)) != 0) {
2250*fcf3ce44SJohn Forte (void) fprintf(stderr,
2251*fcf3ce44SJohn Forte MSGSTR(33,
2252*fcf3ce44SJohn Forte " Error: converting"
2253*fcf3ce44SJohn Forte " %s to physical path.\n"
2254*fcf3ce44SJohn Forte " Invalid pathname.\n"),
2255*fcf3ce44SJohn Forte argv[path_index]);
2256*fcf3ce44SJohn Forte if (err != -1) {
2257*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
2258*fcf3ce44SJohn Forte }
2259*fcf3ce44SJohn Forte exit(-1);
2260*fcf3ce44SJohn Forte }
2261*fcf3ce44SJohn Forte if (err = g_get_inquiry(path_phys, &inq)) {
2262*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
2263*fcf3ce44SJohn Forte } else {
2264*fcf3ce44SJohn Forte (void) g_dump(MSGSTR(2065, "INQUIRY data: "),
2265*fcf3ce44SJohn Forte (uchar_t *)&inq, 5 + inq.inq_len, HEX_ASCII);
2266*fcf3ce44SJohn Forte }
2267*fcf3ce44SJohn Forte
2268*fcf3ce44SJohn Forte (void) memset(buf, 0, MAX_REC_DIAG_LENGTH);
2269*fcf3ce44SJohn Forte if (err = l_get_envsen(path_phys, buf, MAX_REC_DIAG_LENGTH,
2270*fcf3ce44SJohn Forte (Options & PVERBOSE))) {
2271*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
2272*fcf3ce44SJohn Forte exit(-1);
2273*fcf3ce44SJohn Forte }
2274*fcf3ce44SJohn Forte (void) fprintf(stdout,
2275*fcf3ce44SJohn Forte MSGSTR(2066, "\t\tEnvironmental Sense Information\n"));
2276*fcf3ce44SJohn Forte
2277*fcf3ce44SJohn Forte /*
2278*fcf3ce44SJohn Forte * Dump all pages.
2279*fcf3ce44SJohn Forte */
2280*fcf3ce44SJohn Forte hdr_ptr = hdr;
2281*fcf3ce44SJohn Forte
2282*fcf3ce44SJohn Forte while (hdr_ptr->page_len != 0) {
2283*fcf3ce44SJohn Forte (void) sprintf(hdr_buf, MSGSTR(2067, "Page %d: "),
2284*fcf3ce44SJohn Forte hdr_ptr->page_code);
2285*fcf3ce44SJohn Forte (void) g_dump(hdr_buf, (uchar_t *)hdr_ptr,
2286*fcf3ce44SJohn Forte HEADER_LEN + hdr_ptr->page_len, HEX_ASCII);
2287*fcf3ce44SJohn Forte hdr_ptr += ((HEADER_LEN + hdr_ptr->page_len) /
2288*fcf3ce44SJohn Forte sizeof (struct rec_diag_hdr));
2289*fcf3ce44SJohn Forte }
2290*fcf3ce44SJohn Forte path_index++;
2291*fcf3ce44SJohn Forte }
2292*fcf3ce44SJohn Forte (void) free(buf);
2293*fcf3ce44SJohn Forte }
2294*fcf3ce44SJohn Forte
2295*fcf3ce44SJohn Forte
2296*fcf3ce44SJohn Forte
2297*fcf3ce44SJohn Forte /*
2298*fcf3ce44SJohn Forte * display_socal_stats() Display socal driver kstat information.
2299*fcf3ce44SJohn Forte *
2300*fcf3ce44SJohn Forte * RETURNS:
2301*fcf3ce44SJohn Forte * none.
2302*fcf3ce44SJohn Forte */
2303*fcf3ce44SJohn Forte void
display_socal_stats(int port,char * socal_path,struct socal_stats * fc_stats)2304*fcf3ce44SJohn Forte display_socal_stats(int port, char *socal_path, struct socal_stats *fc_stats)
2305*fcf3ce44SJohn Forte {
2306*fcf3ce44SJohn Forte int i;
2307*fcf3ce44SJohn Forte int header_flag = 0;
2308*fcf3ce44SJohn Forte char status_msg_buf[MAXNAMELEN];
2309*fcf3ce44SJohn Forte int num_status_entries;
2310*fcf3ce44SJohn Forte
2311*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2068,
2312*fcf3ce44SJohn Forte "\tInformation for FC Loop on port %d of"
2313*fcf3ce44SJohn Forte " FC100/S Host Adapter\n\tat path: %s\n"),
2314*fcf3ce44SJohn Forte port, socal_path);
2315*fcf3ce44SJohn Forte if (fc_stats->version > 1) {
2316*fcf3ce44SJohn Forte (void) fprintf(stdout, "\t");
2317*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(32,
2318*fcf3ce44SJohn Forte "Information from %s"), fc_stats->drvr_name);
2319*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
2320*fcf3ce44SJohn Forte if ((*fc_stats->node_wwn != NULL) &&
2321*fcf3ce44SJohn Forte (*fc_stats->port_wwn[port] != NULL)) {
2322*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(104,
2323*fcf3ce44SJohn Forte " Host Adapter WWN's: Node:%s"
2324*fcf3ce44SJohn Forte " Port:%s\n"),
2325*fcf3ce44SJohn Forte fc_stats->node_wwn,
2326*fcf3ce44SJohn Forte fc_stats->port_wwn[port]);
2327*fcf3ce44SJohn Forte }
2328*fcf3ce44SJohn Forte if (*fc_stats->fw_revision != NULL) {
2329*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(105,
2330*fcf3ce44SJohn Forte " Host Adapter Firmware Revision: %s\n"),
2331*fcf3ce44SJohn Forte fc_stats->fw_revision);
2332*fcf3ce44SJohn Forte }
2333*fcf3ce44SJohn Forte if (fc_stats->parity_chk_enabled != 0) {
2334*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2069,
2335*fcf3ce44SJohn Forte " This Host Adapter checks S-Bus parity.\n"));
2336*fcf3ce44SJohn Forte }
2337*fcf3ce44SJohn Forte }
2338*fcf3ce44SJohn Forte
2339*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2070,
2340*fcf3ce44SJohn Forte " Version Resets Req_Q_Intrpts Qfulls"
2341*fcf3ce44SJohn Forte " Unsol_Resps Lips\n"));
2342*fcf3ce44SJohn Forte
2343*fcf3ce44SJohn Forte (void) fprintf(stdout, " %4d%8d%11d%13d%10d%7d\n",
2344*fcf3ce44SJohn Forte fc_stats->version,
2345*fcf3ce44SJohn Forte fc_stats->resets,
2346*fcf3ce44SJohn Forte fc_stats->reqq_intrs,
2347*fcf3ce44SJohn Forte fc_stats->qfulls,
2348*fcf3ce44SJohn Forte fc_stats->pstats[port].unsol_resps,
2349*fcf3ce44SJohn Forte fc_stats->pstats[port].lips);
2350*fcf3ce44SJohn Forte
2351*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2071,
2352*fcf3ce44SJohn Forte " Els_rcvd Abts"
2353*fcf3ce44SJohn Forte " Abts_ok Offlines Loop_onlines Onlines\n"));
2354*fcf3ce44SJohn Forte
2355*fcf3ce44SJohn Forte (void) fprintf(stdout, " %4d%9d%10d%9d%13d%10d\n",
2356*fcf3ce44SJohn Forte fc_stats->pstats[port].els_rcvd,
2357*fcf3ce44SJohn Forte fc_stats->pstats[port].abts,
2358*fcf3ce44SJohn Forte fc_stats->pstats[port].abts_ok,
2359*fcf3ce44SJohn Forte fc_stats->pstats[port].offlines,
2360*fcf3ce44SJohn Forte fc_stats->pstats[port].online_loops,
2361*fcf3ce44SJohn Forte fc_stats->pstats[port].onlines);
2362*fcf3ce44SJohn Forte
2363*fcf3ce44SJohn Forte /* If any status conditions exist then display */
2364*fcf3ce44SJohn Forte if (fc_stats->version > 1) {
2365*fcf3ce44SJohn Forte num_status_entries = FC_STATUS_ENTRIES;
2366*fcf3ce44SJohn Forte } else {
2367*fcf3ce44SJohn Forte num_status_entries = 64;
2368*fcf3ce44SJohn Forte }
2369*fcf3ce44SJohn Forte
2370*fcf3ce44SJohn Forte for (i = 0; i < num_status_entries; i++) {
2371*fcf3ce44SJohn Forte if (fc_stats->pstats[port].resp_status[i] != 0) {
2372*fcf3ce44SJohn Forte if (header_flag++ == 0) {
2373*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2072,
2374*fcf3ce44SJohn Forte " Fibre Channel Transport status:\n "
2375*fcf3ce44SJohn Forte "Status Value"
2376*fcf3ce44SJohn Forte " Count\n"));
2377*fcf3ce44SJohn Forte }
2378*fcf3ce44SJohn Forte (void) l_format_fc_status_msg(status_msg_buf,
2379*fcf3ce44SJohn Forte fc_stats->pstats[port].resp_status[i], i);
2380*fcf3ce44SJohn Forte (void) fprintf(stdout, " %s\n",
2381*fcf3ce44SJohn Forte status_msg_buf);
2382*fcf3ce44SJohn Forte }
2383*fcf3ce44SJohn Forte }
2384*fcf3ce44SJohn Forte }
2385*fcf3ce44SJohn Forte
2386*fcf3ce44SJohn Forte
2387*fcf3ce44SJohn Forte
2388*fcf3ce44SJohn Forte /*
2389*fcf3ce44SJohn Forte * display_sf_stats() Display sf driver kstat information.
2390*fcf3ce44SJohn Forte *
2391*fcf3ce44SJohn Forte * This routine is called by private loop device only
2392*fcf3ce44SJohn Forte *
2393*fcf3ce44SJohn Forte * RETURNS:
2394*fcf3ce44SJohn Forte * none.
2395*fcf3ce44SJohn Forte */
2396*fcf3ce44SJohn Forte void
display_sf_stats(char * path_phys,int dtype,struct sf_stats * sf_stats)2397*fcf3ce44SJohn Forte display_sf_stats(char *path_phys, int dtype, struct sf_stats *sf_stats)
2398*fcf3ce44SJohn Forte {
2399*fcf3ce44SJohn Forte int i, al_pa, err = 0;
2400*fcf3ce44SJohn Forte gfc_map_t map;
2401*fcf3ce44SJohn Forte uchar_t node_wwn[WWN_SIZE];
2402*fcf3ce44SJohn Forte uchar_t port_wwn[WWN_SIZE];
2403*fcf3ce44SJohn Forte gfc_port_dev_info_t *dev_addr_list;
2404*fcf3ce44SJohn Forte
2405*fcf3ce44SJohn Forte if (sf_stats->version > 1) {
2406*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n\t");
2407*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(32,
2408*fcf3ce44SJohn Forte "Information from %s"),
2409*fcf3ce44SJohn Forte sf_stats->drvr_name);
2410*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
2411*fcf3ce44SJohn Forte } else {
2412*fcf3ce44SJohn Forte (void) fprintf(stdout,
2413*fcf3ce44SJohn Forte MSGSTR(2073, "\n\t\tInformation from sf driver:\n"));
2414*fcf3ce44SJohn Forte }
2415*fcf3ce44SJohn Forte
2416*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2074,
2417*fcf3ce44SJohn Forte " Version Lip_count Lip_fail"
2418*fcf3ce44SJohn Forte " Alloc_fail #_cmds "
2419*fcf3ce44SJohn Forte "Throttle_limit Pool_size\n"));
2420*fcf3ce44SJohn Forte
2421*fcf3ce44SJohn Forte (void) fprintf(stdout, " %4d%9d%12d%11d%10d%11d%12d\n",
2422*fcf3ce44SJohn Forte sf_stats->version,
2423*fcf3ce44SJohn Forte sf_stats->lip_count,
2424*fcf3ce44SJohn Forte sf_stats->lip_failures,
2425*fcf3ce44SJohn Forte sf_stats->cralloc_failures,
2426*fcf3ce44SJohn Forte sf_stats->ncmds,
2427*fcf3ce44SJohn Forte sf_stats->throttle_limit,
2428*fcf3ce44SJohn Forte sf_stats->cr_pool_size);
2429*fcf3ce44SJohn Forte
2430*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2075,
2431*fcf3ce44SJohn Forte "\n\t\tTARGET ERROR INFORMATION:\n"));
2432*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2076,
2433*fcf3ce44SJohn Forte "AL_PA Els_fail Timouts Abts_fail"
2434*fcf3ce44SJohn Forte " Tsk_m_fail "
2435*fcf3ce44SJohn Forte " Data_ro_mis Dl_len_mis Logouts\n"));
2436*fcf3ce44SJohn Forte
2437*fcf3ce44SJohn Forte if (err = g_get_dev_map(path_phys, &map, (Options & PVERBOSE))) {
2438*fcf3ce44SJohn Forte (void) print_errString(err, path_phys);
2439*fcf3ce44SJohn Forte exit(-1);
2440*fcf3ce44SJohn Forte }
2441*fcf3ce44SJohn Forte
2442*fcf3ce44SJohn Forte if (dtype == DTYPE_DIRECT) {
2443*fcf3ce44SJohn Forte if (err = g_get_wwn(path_phys, port_wwn, node_wwn, &al_pa,
2444*fcf3ce44SJohn Forte Options & PVERBOSE)) {
2445*fcf3ce44SJohn Forte (void) print_errString(err, path_phys);
2446*fcf3ce44SJohn Forte exit(-1);
2447*fcf3ce44SJohn Forte }
2448*fcf3ce44SJohn Forte /* for san toleration, only need to modify the code */
2449*fcf3ce44SJohn Forte /* such that the current sf_al_map structure replaced */
2450*fcf3ce44SJohn Forte /* by the new gfc_map structure for private loop device */
2451*fcf3ce44SJohn Forte for (i = 0, dev_addr_list = map.dev_addr; i < map.count;
2452*fcf3ce44SJohn Forte i++, dev_addr_list++) {
2453*fcf3ce44SJohn Forte if (dev_addr_list->gfc_port_dev.priv_port.sf_al_pa
2454*fcf3ce44SJohn Forte == al_pa) {
2455*fcf3ce44SJohn Forte (void) fprintf(stdout,
2456*fcf3ce44SJohn Forte "%3x%10d%8d%10d%11d%13d%11d%9d\n",
2457*fcf3ce44SJohn Forte al_pa,
2458*fcf3ce44SJohn Forte sf_stats->tstats[i].els_failures,
2459*fcf3ce44SJohn Forte sf_stats->tstats[i].timeouts,
2460*fcf3ce44SJohn Forte sf_stats->tstats[i].abts_failures,
2461*fcf3ce44SJohn Forte sf_stats->tstats[i].task_mgmt_failures,
2462*fcf3ce44SJohn Forte sf_stats->tstats[i].data_ro_mismatches,
2463*fcf3ce44SJohn Forte sf_stats->tstats[i].dl_len_mismatches,
2464*fcf3ce44SJohn Forte sf_stats->tstats[i].logouts_recvd);
2465*fcf3ce44SJohn Forte break;
2466*fcf3ce44SJohn Forte }
2467*fcf3ce44SJohn Forte }
2468*fcf3ce44SJohn Forte if (i >= map.count) {
2469*fcf3ce44SJohn Forte (void) print_errString(L_INVALID_LOOP_MAP, path_phys);
2470*fcf3ce44SJohn Forte exit(-1);
2471*fcf3ce44SJohn Forte }
2472*fcf3ce44SJohn Forte } else {
2473*fcf3ce44SJohn Forte for (i = 0, dev_addr_list = map.dev_addr; i < map.count;
2474*fcf3ce44SJohn Forte i++, dev_addr_list++) {
2475*fcf3ce44SJohn Forte (void) fprintf(stdout,
2476*fcf3ce44SJohn Forte "%3x%10d%8d%10d%11d%13d%11d%9d\n",
2477*fcf3ce44SJohn Forte dev_addr_list->gfc_port_dev.priv_port.sf_al_pa,
2478*fcf3ce44SJohn Forte sf_stats->tstats[i].els_failures,
2479*fcf3ce44SJohn Forte sf_stats->tstats[i].timeouts,
2480*fcf3ce44SJohn Forte sf_stats->tstats[i].abts_failures,
2481*fcf3ce44SJohn Forte sf_stats->tstats[i].task_mgmt_failures,
2482*fcf3ce44SJohn Forte sf_stats->tstats[i].data_ro_mismatches,
2483*fcf3ce44SJohn Forte sf_stats->tstats[i].dl_len_mismatches,
2484*fcf3ce44SJohn Forte sf_stats->tstats[i].logouts_recvd);
2485*fcf3ce44SJohn Forte }
2486*fcf3ce44SJohn Forte }
2487*fcf3ce44SJohn Forte free((void *)map.dev_addr);
2488*fcf3ce44SJohn Forte }
2489*fcf3ce44SJohn Forte
2490*fcf3ce44SJohn Forte
2491*fcf3ce44SJohn Forte
2492*fcf3ce44SJohn Forte /*
2493*fcf3ce44SJohn Forte * adm_display_err() Displays enclosure specific
2494*fcf3ce44SJohn Forte * error information.
2495*fcf3ce44SJohn Forte *
2496*fcf3ce44SJohn Forte * RETURNS:
2497*fcf3ce44SJohn Forte * none.
2498*fcf3ce44SJohn Forte */
2499*fcf3ce44SJohn Forte static void
adm_display_err(char * path_phys,int dtype)2500*fcf3ce44SJohn Forte adm_display_err(char *path_phys, int dtype)
2501*fcf3ce44SJohn Forte {
2502*fcf3ce44SJohn Forte int i, drvr_inst, sf_inst, socal_inst, port, al_pa, err = 0;
2503*fcf3ce44SJohn Forte char *char_ptr, socal_path[MAXPATHLEN], drvr_path[MAXPATHLEN];
2504*fcf3ce44SJohn Forte struct stat sbuf;
2505*fcf3ce44SJohn Forte kstat_ctl_t *kc;
2506*fcf3ce44SJohn Forte kstat_t *ifp_ks, *sf_ks, *fc_ks;
2507*fcf3ce44SJohn Forte sf_stats_t sf_stats;
2508*fcf3ce44SJohn Forte socal_stats_t fc_stats;
2509*fcf3ce44SJohn Forte ifp_stats_t ifp_stats;
2510*fcf3ce44SJohn Forte int header_flag = 0, pathcnt = 1;
2511*fcf3ce44SJohn Forte char status_msg_buf[MAXNAMELEN];
2512*fcf3ce44SJohn Forte gfc_map_t map;
2513*fcf3ce44SJohn Forte uchar_t node_wwn[WWN_SIZE], port_wwn[WWN_SIZE];
2514*fcf3ce44SJohn Forte uint_t path_type;
2515*fcf3ce44SJohn Forte gfc_port_dev_info_t *dev_addr_list;
2516*fcf3ce44SJohn Forte mp_pathlist_t pathlist;
2517*fcf3ce44SJohn Forte int p_on = 0, p_st = 0;
2518*fcf3ce44SJohn Forte
2519*fcf3ce44SJohn Forte if ((kc = kstat_open()) == (kstat_ctl_t *)NULL) {
2520*fcf3ce44SJohn Forte (void) fprintf(stderr,
2521*fcf3ce44SJohn Forte MSGSTR(2077, " Error: can't open kstat\n"));
2522*fcf3ce44SJohn Forte exit(-1);
2523*fcf3ce44SJohn Forte }
2524*fcf3ce44SJohn Forte
2525*fcf3ce44SJohn Forte if (strstr(path_phys, SCSI_VHCI)) {
2526*fcf3ce44SJohn Forte (void) strcpy(drvr_path, path_phys);
2527*fcf3ce44SJohn Forte if (err = g_get_pathlist(drvr_path, &pathlist)) {
2528*fcf3ce44SJohn Forte (void) print_errString(err, NULL);
2529*fcf3ce44SJohn Forte exit(-1);
2530*fcf3ce44SJohn Forte }
2531*fcf3ce44SJohn Forte pathcnt = pathlist.path_count;
2532*fcf3ce44SJohn Forte p_on = p_st = 0;
2533*fcf3ce44SJohn Forte for (i = 0; i < pathcnt; i++) {
2534*fcf3ce44SJohn Forte if (pathlist.path_info[i].path_state < MAXPATHSTATE) {
2535*fcf3ce44SJohn Forte if (pathlist.path_info[i].path_state ==
2536*fcf3ce44SJohn Forte MDI_PATHINFO_STATE_ONLINE) {
2537*fcf3ce44SJohn Forte p_on = i;
2538*fcf3ce44SJohn Forte break;
2539*fcf3ce44SJohn Forte } else if (pathlist.path_info[i].path_state ==
2540*fcf3ce44SJohn Forte MDI_PATHINFO_STATE_STANDBY) {
2541*fcf3ce44SJohn Forte p_st = i;
2542*fcf3ce44SJohn Forte }
2543*fcf3ce44SJohn Forte }
2544*fcf3ce44SJohn Forte }
2545*fcf3ce44SJohn Forte if (pathlist.path_info[p_on].path_state ==
2546*fcf3ce44SJohn Forte MDI_PATHINFO_STATE_ONLINE) {
2547*fcf3ce44SJohn Forte /* on_line path */
2548*fcf3ce44SJohn Forte (void) strcpy(drvr_path,
2549*fcf3ce44SJohn Forte pathlist.path_info[p_on].path_hba);
2550*fcf3ce44SJohn Forte } else {
2551*fcf3ce44SJohn Forte /* standby or path0 */
2552*fcf3ce44SJohn Forte (void) strcpy(drvr_path,
2553*fcf3ce44SJohn Forte pathlist.path_info[p_st].path_hba);
2554*fcf3ce44SJohn Forte }
2555*fcf3ce44SJohn Forte free(pathlist.path_info);
2556*fcf3ce44SJohn Forte } else {
2557*fcf3ce44SJohn Forte
2558*fcf3ce44SJohn Forte (void) strcpy(drvr_path, path_phys);
2559*fcf3ce44SJohn Forte
2560*fcf3ce44SJohn Forte if ((char_ptr = strrchr(drvr_path, '/')) == NULL) {
2561*fcf3ce44SJohn Forte (void) print_errString(L_INVLD_PATH_NO_SLASH_FND,
2562*fcf3ce44SJohn Forte path_phys);
2563*fcf3ce44SJohn Forte exit(-1);
2564*fcf3ce44SJohn Forte }
2565*fcf3ce44SJohn Forte *char_ptr = '\0'; /* Make into nexus or HBA driver path. */
2566*fcf3ce44SJohn Forte }
2567*fcf3ce44SJohn Forte /*
2568*fcf3ce44SJohn Forte * Each HBA and driver stack has its own structures
2569*fcf3ce44SJohn Forte * for this, so we have to handle each one individually.
2570*fcf3ce44SJohn Forte */
2571*fcf3ce44SJohn Forte path_type = g_get_path_type(drvr_path);
2572*fcf3ce44SJohn Forte
2573*fcf3ce44SJohn Forte if (path_type) { /* Quick sanity check for valid path */
2574*fcf3ce44SJohn Forte if ((err = g_get_nexus_path(drvr_path, &char_ptr)) != 0) {
2575*fcf3ce44SJohn Forte (void) print_errString(err, path_phys);
2576*fcf3ce44SJohn Forte exit(-1);
2577*fcf3ce44SJohn Forte }
2578*fcf3ce44SJohn Forte (void) strcpy(socal_path, char_ptr);
2579*fcf3ce44SJohn Forte
2580*fcf3ce44SJohn Forte }
2581*fcf3ce44SJohn Forte
2582*fcf3ce44SJohn Forte /* attach :devctl to get node stat instead of dir stat. */
2583*fcf3ce44SJohn Forte (void) strcat(drvr_path, FC_CTLR);
2584*fcf3ce44SJohn Forte
2585*fcf3ce44SJohn Forte if (stat(drvr_path, &sbuf) < 0) {
2586*fcf3ce44SJohn Forte (void) print_errString(L_LSTAT_ERROR, path_phys);
2587*fcf3ce44SJohn Forte exit(-1);
2588*fcf3ce44SJohn Forte }
2589*fcf3ce44SJohn Forte
2590*fcf3ce44SJohn Forte drvr_inst = minor(sbuf.st_rdev);
2591*fcf3ce44SJohn Forte
2592*fcf3ce44SJohn Forte
2593*fcf3ce44SJohn Forte /*
2594*fcf3ce44SJohn Forte * first take care of ifp card.
2595*fcf3ce44SJohn Forte */
2596*fcf3ce44SJohn Forte if (path_type & FC4_PCI_FCA) {
2597*fcf3ce44SJohn Forte if ((ifp_ks = kstat_lookup(kc, "ifp",
2598*fcf3ce44SJohn Forte drvr_inst, "statistics")) != NULL) {
2599*fcf3ce44SJohn Forte
2600*fcf3ce44SJohn Forte if (kstat_read(kc, ifp_ks, &ifp_stats) < 0) {
2601*fcf3ce44SJohn Forte (void) fprintf(stderr,
2602*fcf3ce44SJohn Forte MSGSTR(2082,
2603*fcf3ce44SJohn Forte "Error: could not read ifp%d\n"), drvr_inst);
2604*fcf3ce44SJohn Forte exit(-1);
2605*fcf3ce44SJohn Forte }
2606*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2083,
2607*fcf3ce44SJohn Forte "\tInformation for FC Loop of"
2608*fcf3ce44SJohn Forte " FC100/P Host Adapter\n\tat path: %s\n"),
2609*fcf3ce44SJohn Forte drvr_path);
2610*fcf3ce44SJohn Forte if (ifp_stats.version > 1) {
2611*fcf3ce44SJohn Forte (void) fprintf(stdout, "\t");
2612*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(32,
2613*fcf3ce44SJohn Forte "Information from %s"),
2614*fcf3ce44SJohn Forte ifp_stats.drvr_name);
2615*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
2616*fcf3ce44SJohn Forte if ((*ifp_stats.node_wwn != NULL) &&
2617*fcf3ce44SJohn Forte (*ifp_stats.port_wwn != NULL)) {
2618*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(104,
2619*fcf3ce44SJohn Forte " Host Adapter WWN's: Node:%s"
2620*fcf3ce44SJohn Forte " Port:%s\n"),
2621*fcf3ce44SJohn Forte ifp_stats.node_wwn,
2622*fcf3ce44SJohn Forte ifp_stats.port_wwn);
2623*fcf3ce44SJohn Forte }
2624*fcf3ce44SJohn Forte if (*ifp_stats.fw_revision != NULL) {
2625*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(105,
2626*fcf3ce44SJohn Forte " Host Adapter Firmware Revision: %s\n"),
2627*fcf3ce44SJohn Forte ifp_stats.fw_revision);
2628*fcf3ce44SJohn Forte }
2629*fcf3ce44SJohn Forte if (ifp_stats.parity_chk_enabled != 0) {
2630*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2084,
2631*fcf3ce44SJohn Forte " This Host Adapter checks "
2632*fcf3ce44SJohn Forte "PCI-Bus parity.\n"));
2633*fcf3ce44SJohn Forte }
2634*fcf3ce44SJohn Forte }
2635*fcf3ce44SJohn Forte
2636*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2085,
2637*fcf3ce44SJohn Forte " Version Lips\n"));
2638*fcf3ce44SJohn Forte (void) fprintf(stdout, " %10d%7d\n",
2639*fcf3ce44SJohn Forte ifp_stats.version,
2640*fcf3ce44SJohn Forte ifp_stats.lip_count);
2641*fcf3ce44SJohn Forte /* If any status conditions exist then display */
2642*fcf3ce44SJohn Forte for (i = 0; i < FC_STATUS_ENTRIES; i++) {
2643*fcf3ce44SJohn Forte if (ifp_stats.resp_status[i] != 0) {
2644*fcf3ce44SJohn Forte if (header_flag++ == 0) {
2645*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2086,
2646*fcf3ce44SJohn Forte " Fibre Channel Transport "
2647*fcf3ce44SJohn Forte "status:\n "
2648*fcf3ce44SJohn Forte "Status "
2649*fcf3ce44SJohn Forte " Value"
2650*fcf3ce44SJohn Forte " Count\n"));
2651*fcf3ce44SJohn Forte }
2652*fcf3ce44SJohn Forte (void) l_format_ifp_status_msg(
2653*fcf3ce44SJohn Forte status_msg_buf,
2654*fcf3ce44SJohn Forte ifp_stats.resp_status[i], i);
2655*fcf3ce44SJohn Forte (void) fprintf(stdout, " %s\n",
2656*fcf3ce44SJohn Forte status_msg_buf);
2657*fcf3ce44SJohn Forte }
2658*fcf3ce44SJohn Forte }
2659*fcf3ce44SJohn Forte
2660*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2087,
2661*fcf3ce44SJohn Forte "\n\t\tTARGET ERROR INFORMATION:\n"));
2662*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2088,
2663*fcf3ce44SJohn Forte "AL_PA logouts_recvd task_mgmt_failures"
2664*fcf3ce44SJohn Forte " data_ro_mismatches data_len_mismatch\n"));
2665*fcf3ce44SJohn Forte
2666*fcf3ce44SJohn Forte if (err = g_get_dev_map(path_phys, &map,
2667*fcf3ce44SJohn Forte (Options & PVERBOSE))) {
2668*fcf3ce44SJohn Forte (void) print_errString(err, path_phys);
2669*fcf3ce44SJohn Forte exit(-1);
2670*fcf3ce44SJohn Forte }
2671*fcf3ce44SJohn Forte
2672*fcf3ce44SJohn Forte
2673*fcf3ce44SJohn Forte if (dtype == DTYPE_DIRECT) {
2674*fcf3ce44SJohn Forte if (err = g_get_wwn(path_phys, port_wwn,
2675*fcf3ce44SJohn Forte node_wwn, &al_pa,
2676*fcf3ce44SJohn Forte Options & PVERBOSE)) {
2677*fcf3ce44SJohn Forte (void) print_errString(err,
2678*fcf3ce44SJohn Forte path_phys);
2679*fcf3ce44SJohn Forte exit(-1);
2680*fcf3ce44SJohn Forte }
2681*fcf3ce44SJohn Forte for (i = 0, dev_addr_list = map.dev_addr;
2682*fcf3ce44SJohn Forte i < map.count; i++,
2683*fcf3ce44SJohn Forte dev_addr_list++) {
2684*fcf3ce44SJohn Forte if (dev_addr_list->gfc_port_dev.
2685*fcf3ce44SJohn Forte priv_port.sf_al_pa
2686*fcf3ce44SJohn Forte == al_pa) {
2687*fcf3ce44SJohn Forte (void) fprintf
2688*fcf3ce44SJohn Forte (stdout,
2689*fcf3ce44SJohn Forte "%3x%14d%18d%20d%20d\n",
2690*fcf3ce44SJohn Forte al_pa,
2691*fcf3ce44SJohn Forte ifp_stats.tstats[i].
2692*fcf3ce44SJohn Forte logouts_recvd,
2693*fcf3ce44SJohn Forte ifp_stats.tstats[i].
2694*fcf3ce44SJohn Forte task_mgmt_failures,
2695*fcf3ce44SJohn Forte ifp_stats.tstats[i].
2696*fcf3ce44SJohn Forte data_ro_mismatches,
2697*fcf3ce44SJohn Forte ifp_stats.tstats[i].
2698*fcf3ce44SJohn Forte dl_len_mismatches);
2699*fcf3ce44SJohn Forte break;
2700*fcf3ce44SJohn Forte }
2701*fcf3ce44SJohn Forte }
2702*fcf3ce44SJohn Forte if (i >= map.count) {
2703*fcf3ce44SJohn Forte
2704*fcf3ce44SJohn Forte (void) print_errString(
2705*fcf3ce44SJohn Forte L_INVALID_LOOP_MAP, path_phys);
2706*fcf3ce44SJohn Forte exit(-1);
2707*fcf3ce44SJohn Forte }
2708*fcf3ce44SJohn Forte
2709*fcf3ce44SJohn Forte } else {
2710*fcf3ce44SJohn Forte for (i = 0, dev_addr_list = map.dev_addr;
2711*fcf3ce44SJohn Forte i < map.count; i++,
2712*fcf3ce44SJohn Forte dev_addr_list++) {
2713*fcf3ce44SJohn Forte (void) fprintf(stdout,
2714*fcf3ce44SJohn Forte "%3x%14d%18d%20d%20d\n",
2715*fcf3ce44SJohn Forte dev_addr_list->gfc_port_dev.
2716*fcf3ce44SJohn Forte priv_port.sf_al_pa,
2717*fcf3ce44SJohn Forte ifp_stats.tstats[i].logouts_recvd,
2718*fcf3ce44SJohn Forte ifp_stats.tstats[i].task_mgmt_failures,
2719*fcf3ce44SJohn Forte ifp_stats.tstats[i].data_ro_mismatches,
2720*fcf3ce44SJohn Forte ifp_stats.tstats[i].dl_len_mismatches);
2721*fcf3ce44SJohn Forte }
2722*fcf3ce44SJohn Forte }
2723*fcf3ce44SJohn Forte
2724*fcf3ce44SJohn Forte free((void *)map.dev_addr);
2725*fcf3ce44SJohn Forte }
2726*fcf3ce44SJohn Forte } else if (path_type & FC4_SF_XPORT) {
2727*fcf3ce44SJohn Forte /*
2728*fcf3ce44SJohn Forte * process cards with sf xport nodes.
2729*fcf3ce44SJohn Forte */
2730*fcf3ce44SJohn Forte if (stat(socal_path, &sbuf) < 0) {
2731*fcf3ce44SJohn Forte (void) print_errString(L_LSTAT_ERROR, path_phys);
2732*fcf3ce44SJohn Forte exit(-1);
2733*fcf3ce44SJohn Forte }
2734*fcf3ce44SJohn Forte socal_inst = minor(sbuf.st_rdev)/2;
2735*fcf3ce44SJohn Forte port = socal_inst%2;
2736*fcf3ce44SJohn Forte
2737*fcf3ce44SJohn Forte sf_inst = LUX_SF_MINOR2INST(minor(sbuf.st_rdev));
2738*fcf3ce44SJohn Forte if (!(sf_ks = kstat_lookup(kc, "sf", sf_inst,
2739*fcf3ce44SJohn Forte "statistics"))) {
2740*fcf3ce44SJohn Forte (void) fprintf(stderr,
2741*fcf3ce44SJohn Forte MSGSTR(2078,
2742*fcf3ce44SJohn Forte " Error: could not lookup driver stats for sf%d\n"),
2743*fcf3ce44SJohn Forte sf_inst);
2744*fcf3ce44SJohn Forte exit(-1);
2745*fcf3ce44SJohn Forte }
2746*fcf3ce44SJohn Forte if (!(fc_ks = kstat_lookup(kc, "socal", socal_inst,
2747*fcf3ce44SJohn Forte "statistics"))) {
2748*fcf3ce44SJohn Forte (void) fprintf(stderr,
2749*fcf3ce44SJohn Forte MSGSTR(2079,
2750*fcf3ce44SJohn Forte " Error: could not lookup driver stats for socal%d\n"),
2751*fcf3ce44SJohn Forte socal_inst);
2752*fcf3ce44SJohn Forte exit(-1);
2753*fcf3ce44SJohn Forte }
2754*fcf3ce44SJohn Forte if (kstat_read(kc, sf_ks, &sf_stats) < 0) {
2755*fcf3ce44SJohn Forte (void) fprintf(stderr,
2756*fcf3ce44SJohn Forte MSGSTR(2080,
2757*fcf3ce44SJohn Forte " Error: could not read driver stats for sf%d\n"),
2758*fcf3ce44SJohn Forte sf_inst);
2759*fcf3ce44SJohn Forte exit(-1);
2760*fcf3ce44SJohn Forte }
2761*fcf3ce44SJohn Forte if (kstat_read(kc, fc_ks, &fc_stats) < 0) {
2762*fcf3ce44SJohn Forte (void) fprintf(stderr,
2763*fcf3ce44SJohn Forte MSGSTR(2081,
2764*fcf3ce44SJohn Forte " Error: could not read driver stats for socal%d\n"),
2765*fcf3ce44SJohn Forte socal_inst);
2766*fcf3ce44SJohn Forte exit(-1);
2767*fcf3ce44SJohn Forte }
2768*fcf3ce44SJohn Forte (void) display_socal_stats(port, socal_path, &fc_stats);
2769*fcf3ce44SJohn Forte (void) display_sf_stats(path_phys, dtype, &sf_stats);
2770*fcf3ce44SJohn Forte } else if ((path_type & FC_FCA_MASK) == FC_PCI_FCA) {
2771*fcf3ce44SJohn Forte fprintf(stderr, MSGSTR(2252,
2772*fcf3ce44SJohn Forte "\n WARNING!! display -r on qlc is"
2773*fcf3ce44SJohn Forte " currently not supported.\n"));
2774*fcf3ce44SJohn Forte } else {
2775*fcf3ce44SJohn Forte fprintf(stderr, MSGSTR(2253,
2776*fcf3ce44SJohn Forte "\n WARNING!! display -r is not supported on path\n"
2777*fcf3ce44SJohn Forte " %s\n"), drvr_path);
2778*fcf3ce44SJohn Forte }
2779*fcf3ce44SJohn Forte (void) kstat_close(kc);
2780*fcf3ce44SJohn Forte
2781*fcf3ce44SJohn Forte }
2782*fcf3ce44SJohn Forte
2783*fcf3ce44SJohn Forte
2784*fcf3ce44SJohn Forte
2785*fcf3ce44SJohn Forte /*ARGSUSED*/
2786*fcf3ce44SJohn Forte /*
2787*fcf3ce44SJohn Forte * adm_display_verbose_disk() Gets the mode page information
2788*fcf3ce44SJohn Forte * for a SENA disk and prints that information.
2789*fcf3ce44SJohn Forte *
2790*fcf3ce44SJohn Forte * RETURNS:
2791*fcf3ce44SJohn Forte * none.
2792*fcf3ce44SJohn Forte */
2793*fcf3ce44SJohn Forte void
adm_display_verbose_disk(char * path,int verbose)2794*fcf3ce44SJohn Forte adm_display_verbose_disk(char *path, int verbose)
2795*fcf3ce44SJohn Forte {
2796*fcf3ce44SJohn Forte uchar_t *pg_buf;
2797*fcf3ce44SJohn Forte Mode_header_10 *mode_header_ptr;
2798*fcf3ce44SJohn Forte Mp_01 *pg1_buf;
2799*fcf3ce44SJohn Forte Mp_04 *pg4_buf;
2800*fcf3ce44SJohn Forte struct mode_page *pg_hdr;
2801*fcf3ce44SJohn Forte int offset, hdr_printed = 0, err = 0;
2802*fcf3ce44SJohn Forte
2803*fcf3ce44SJohn Forte if ((err = l_get_mode_pg(path, &pg_buf, verbose)) == 0) {
2804*fcf3ce44SJohn Forte
2805*fcf3ce44SJohn Forte mode_header_ptr = (struct mode_header_10_struct *)(int)pg_buf;
2806*fcf3ce44SJohn Forte pg_hdr = ((struct mode_page *)((int)pg_buf +
2807*fcf3ce44SJohn Forte (uchar_t)sizeof (struct mode_header_10_struct) +
2808*fcf3ce44SJohn Forte (uchar_t *)(uintptr_t)(mode_header_ptr->bdesc_length)));
2809*fcf3ce44SJohn Forte offset = sizeof (struct mode_header_10_struct) +
2810*fcf3ce44SJohn Forte mode_header_ptr->bdesc_length;
2811*fcf3ce44SJohn Forte while (offset < (mode_header_ptr->length +
2812*fcf3ce44SJohn Forte sizeof (mode_header_ptr->length))) {
2813*fcf3ce44SJohn Forte switch (pg_hdr->code) {
2814*fcf3ce44SJohn Forte case 0x01:
2815*fcf3ce44SJohn Forte pg1_buf = (struct mode_page_01_struct *)
2816*fcf3ce44SJohn Forte (int)pg_hdr;
2817*fcf3ce44SJohn Forte P_DPRINTF(" adm_display_verbose_disk:"
2818*fcf3ce44SJohn Forte "Mode Sense page 1 found.\n");
2819*fcf3ce44SJohn Forte if (hdr_printed++ == 0) {
2820*fcf3ce44SJohn Forte (void) fprintf(stdout,
2821*fcf3ce44SJohn Forte MSGSTR(2089,
2822*fcf3ce44SJohn Forte " Mode Sense data:\n"));
2823*fcf3ce44SJohn Forte }
2824*fcf3ce44SJohn Forte (void) fprintf(stdout,
2825*fcf3ce44SJohn Forte MSGSTR(2090,
2826*fcf3ce44SJohn Forte " AWRE:\t\t\t%d\n"
2827*fcf3ce44SJohn Forte " ARRE:\t\t\t%d\n"
2828*fcf3ce44SJohn Forte " Read Retry Count:\t\t"
2829*fcf3ce44SJohn Forte "%d\n"
2830*fcf3ce44SJohn Forte " Write Retry Count:\t\t"
2831*fcf3ce44SJohn Forte "%d\n"),
2832*fcf3ce44SJohn Forte pg1_buf->awre,
2833*fcf3ce44SJohn Forte pg1_buf->arre,
2834*fcf3ce44SJohn Forte pg1_buf->read_retry_count,
2835*fcf3ce44SJohn Forte pg1_buf->write_retry_count);
2836*fcf3ce44SJohn Forte break;
2837*fcf3ce44SJohn Forte case MODEPAGE_GEOMETRY:
2838*fcf3ce44SJohn Forte pg4_buf = (struct mode_page_04_struct *)
2839*fcf3ce44SJohn Forte (int)pg_hdr;
2840*fcf3ce44SJohn Forte P_DPRINTF(" adm_display_verbose_disk:"
2841*fcf3ce44SJohn Forte "Mode Sense page 4 found.\n");
2842*fcf3ce44SJohn Forte if (hdr_printed++ == 0) {
2843*fcf3ce44SJohn Forte (void) fprintf(stdout,
2844*fcf3ce44SJohn Forte MSGSTR(2091,
2845*fcf3ce44SJohn Forte " Mode Sense data:\n"));
2846*fcf3ce44SJohn Forte }
2847*fcf3ce44SJohn Forte if (pg4_buf->rpm) {
2848*fcf3ce44SJohn Forte (void) fprintf(stdout,
2849*fcf3ce44SJohn Forte MSGSTR(2092,
2850*fcf3ce44SJohn Forte " Medium rotation rate:\t"
2851*fcf3ce44SJohn Forte "%d RPM\n"), pg4_buf->rpm);
2852*fcf3ce44SJohn Forte }
2853*fcf3ce44SJohn Forte break;
2854*fcf3ce44SJohn Forte }
2855*fcf3ce44SJohn Forte offset += pg_hdr->length + sizeof (struct mode_page);
2856*fcf3ce44SJohn Forte pg_hdr = ((struct mode_page *)((int)pg_buf +
2857*fcf3ce44SJohn Forte (uchar_t)offset));
2858*fcf3ce44SJohn Forte }
2859*fcf3ce44SJohn Forte
2860*fcf3ce44SJohn Forte
2861*fcf3ce44SJohn Forte
2862*fcf3ce44SJohn Forte
2863*fcf3ce44SJohn Forte
2864*fcf3ce44SJohn Forte } else if (getenv("_LUX_P_DEBUG") != NULL) {
2865*fcf3ce44SJohn Forte (void) print_errString(err, path);
2866*fcf3ce44SJohn Forte }
2867*fcf3ce44SJohn Forte }
2868*fcf3ce44SJohn Forte
2869*fcf3ce44SJohn Forte /*
2870*fcf3ce44SJohn Forte * Print out the port_wwn or node_wwn
2871*fcf3ce44SJohn Forte */
2872*fcf3ce44SJohn Forte void
print_wwn(FILE * fd,uchar_t * pn_wwn)2873*fcf3ce44SJohn Forte print_wwn(FILE *fd, uchar_t *pn_wwn)
2874*fcf3ce44SJohn Forte {
2875*fcf3ce44SJohn Forte
2876*fcf3ce44SJohn Forte (void) fprintf(fd,
2877*fcf3ce44SJohn Forte " %1.2x%1.2x%1.2x%1.2x%1.2x%1.2x%1.2x%1.2x",
2878*fcf3ce44SJohn Forte pn_wwn[0], pn_wwn[1], pn_wwn[2], pn_wwn[3],
2879*fcf3ce44SJohn Forte pn_wwn[4], pn_wwn[5], pn_wwn[6], pn_wwn[7]);
2880*fcf3ce44SJohn Forte }
2881*fcf3ce44SJohn Forte
2882*fcf3ce44SJohn Forte /*
2883*fcf3ce44SJohn Forte * Print out the fabric dev port_id, hard_addr, port_wwn and node_wwn
2884*fcf3ce44SJohn Forte */
2885*fcf3ce44SJohn Forte void
print_fabric_prop(int pos,uchar_t * port_wwn,uchar_t * node_wwn,int port_addr,int hard_addr)2886*fcf3ce44SJohn Forte print_fabric_prop(int pos, uchar_t *port_wwn, uchar_t *node_wwn, int port_addr,
2887*fcf3ce44SJohn Forte int hard_addr)
2888*fcf3ce44SJohn Forte {
2889*fcf3ce44SJohn Forte (void) fprintf(stdout, "%-4d %-6x %-6x ",
2890*fcf3ce44SJohn Forte pos, port_addr, hard_addr);
2891*fcf3ce44SJohn Forte print_wwn(stdout, port_wwn);
2892*fcf3ce44SJohn Forte print_wwn(stdout, node_wwn);
2893*fcf3ce44SJohn Forte }
2894*fcf3ce44SJohn Forte
2895*fcf3ce44SJohn Forte /*
2896*fcf3ce44SJohn Forte * Print out the private loop dev port_id, hard_addr, port_wwn and node_wwn
2897*fcf3ce44SJohn Forte */
2898*fcf3ce44SJohn Forte void
print_private_loop_prop(int pos,uchar_t * port_wwn,uchar_t * node_wwn,int port_addr,int hard_addr)2899*fcf3ce44SJohn Forte print_private_loop_prop(int pos, uchar_t *port_wwn, uchar_t *node_wwn,
2900*fcf3ce44SJohn Forte int port_addr, int hard_addr)
2901*fcf3ce44SJohn Forte {
2902*fcf3ce44SJohn Forte (void) fprintf(stdout, "%-3d %-2x %-2x %-2x ",
2903*fcf3ce44SJohn Forte pos, port_addr, g_sf_alpa_to_switch[port_addr], hard_addr);
2904*fcf3ce44SJohn Forte print_wwn(stdout, port_wwn);
2905*fcf3ce44SJohn Forte print_wwn(stdout, node_wwn);
2906*fcf3ce44SJohn Forte }
2907*fcf3ce44SJohn Forte
2908*fcf3ce44SJohn Forte /*
2909*fcf3ce44SJohn Forte * Get the device map from
2910*fcf3ce44SJohn Forte * fc nexus driver and prints the map.
2911*fcf3ce44SJohn Forte *
2912*fcf3ce44SJohn Forte * RETURNS:
2913*fcf3ce44SJohn Forte * none.
2914*fcf3ce44SJohn Forte */
2915*fcf3ce44SJohn Forte void
dump_map(char ** argv)2916*fcf3ce44SJohn Forte dump_map(char **argv)
2917*fcf3ce44SJohn Forte {
2918*fcf3ce44SJohn Forte int i = 0, path_index = 0, pathcnt = 1;
2919*fcf3ce44SJohn Forte int limited_map_flag = 0, err = 0;
2920*fcf3ce44SJohn Forte char *path_phys = NULL;
2921*fcf3ce44SJohn Forte Path_struct *path_struct;
2922*fcf3ce44SJohn Forte struct lilpmap limited_map;
2923*fcf3ce44SJohn Forte uint_t dev_type;
2924*fcf3ce44SJohn Forte char temp2path[MAXPATHLEN];
2925*fcf3ce44SJohn Forte mp_pathlist_t pathlist;
2926*fcf3ce44SJohn Forte int p_pw = 0, p_on = 0, p_st = 0;
2927*fcf3ce44SJohn Forte gfc_dev_t map_root, map_dev;
2928*fcf3ce44SJohn Forte int *port_addr, *hard_addr, pos = 0, count;
2929*fcf3ce44SJohn Forte uchar_t *hba_port_wwn, *port_wwn, *node_wwn, *dtype_prop;
2930*fcf3ce44SJohn Forte uint_t map_topo;
2931*fcf3ce44SJohn Forte
2932*fcf3ce44SJohn Forte while (argv[path_index] != NULL) {
2933*fcf3ce44SJohn Forte if ((err = l_convert_name(argv[path_index], &path_phys,
2934*fcf3ce44SJohn Forte &path_struct, Options & PVERBOSE)) != 0) {
2935*fcf3ce44SJohn Forte (void) fprintf(stderr,
2936*fcf3ce44SJohn Forte MSGSTR(33,
2937*fcf3ce44SJohn Forte " Error: converting"
2938*fcf3ce44SJohn Forte " %s to physical path.\n"
2939*fcf3ce44SJohn Forte " Invalid pathname.\n"),
2940*fcf3ce44SJohn Forte argv[path_index]);
2941*fcf3ce44SJohn Forte if (err != -1) {
2942*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
2943*fcf3ce44SJohn Forte }
2944*fcf3ce44SJohn Forte exit(-1);
2945*fcf3ce44SJohn Forte }
2946*fcf3ce44SJohn Forte
2947*fcf3ce44SJohn Forte if (strstr(path_phys, SCSI_VHCI) != NULL) {
2948*fcf3ce44SJohn Forte /* obtain phci */
2949*fcf3ce44SJohn Forte (void) strcpy(temp2path, path_phys);
2950*fcf3ce44SJohn Forte if (err = g_get_pathlist(temp2path, &pathlist)) {
2951*fcf3ce44SJohn Forte (void) print_errString(err, NULL);
2952*fcf3ce44SJohn Forte exit(-1);
2953*fcf3ce44SJohn Forte }
2954*fcf3ce44SJohn Forte pathcnt = pathlist.path_count;
2955*fcf3ce44SJohn Forte p_pw = p_on = p_st = 0;
2956*fcf3ce44SJohn Forte for (i = 0; i < pathcnt; i++) {
2957*fcf3ce44SJohn Forte if (pathlist.path_info[i].path_state <
2958*fcf3ce44SJohn Forte MAXPATHSTATE) {
2959*fcf3ce44SJohn Forte if (strstr(pathlist.path_info[i].
2960*fcf3ce44SJohn Forte path_addr,
2961*fcf3ce44SJohn Forte path_struct->argv) != NULL) {
2962*fcf3ce44SJohn Forte p_pw = i;
2963*fcf3ce44SJohn Forte break;
2964*fcf3ce44SJohn Forte }
2965*fcf3ce44SJohn Forte if (pathlist.path_info[i].path_state ==
2966*fcf3ce44SJohn Forte MDI_PATHINFO_STATE_ONLINE) {
2967*fcf3ce44SJohn Forte p_on = i;
2968*fcf3ce44SJohn Forte }
2969*fcf3ce44SJohn Forte if (pathlist.path_info[i].path_state ==
2970*fcf3ce44SJohn Forte MDI_PATHINFO_STATE_STANDBY) {
2971*fcf3ce44SJohn Forte p_st = i;
2972*fcf3ce44SJohn Forte }
2973*fcf3ce44SJohn Forte }
2974*fcf3ce44SJohn Forte }
2975*fcf3ce44SJohn Forte if (strstr(pathlist.path_info[p_pw].path_addr,
2976*fcf3ce44SJohn Forte path_struct->argv) != NULL) {
2977*fcf3ce44SJohn Forte /* matching input pwwn */
2978*fcf3ce44SJohn Forte (void) strcpy(temp2path,
2979*fcf3ce44SJohn Forte pathlist.path_info[p_pw].path_hba);
2980*fcf3ce44SJohn Forte } else if (pathlist.path_info[p_on].path_state ==
2981*fcf3ce44SJohn Forte MDI_PATHINFO_STATE_ONLINE) {
2982*fcf3ce44SJohn Forte /* on_line path */
2983*fcf3ce44SJohn Forte (void) strcpy(temp2path,
2984*fcf3ce44SJohn Forte pathlist.path_info[p_on].path_hba);
2985*fcf3ce44SJohn Forte } else {
2986*fcf3ce44SJohn Forte /* standby or path0 */
2987*fcf3ce44SJohn Forte (void) strcpy(temp2path,
2988*fcf3ce44SJohn Forte pathlist.path_info[p_st].path_hba);
2989*fcf3ce44SJohn Forte }
2990*fcf3ce44SJohn Forte free(pathlist.path_info);
2991*fcf3ce44SJohn Forte (void) strcat(temp2path, FC_CTLR);
2992*fcf3ce44SJohn Forte } else {
2993*fcf3ce44SJohn Forte (void) strcpy(temp2path, path_phys);
2994*fcf3ce44SJohn Forte }
2995*fcf3ce44SJohn Forte
2996*fcf3ce44SJohn Forte if ((dev_type = g_get_path_type(temp2path)) == 0) {
2997*fcf3ce44SJohn Forte (void) print_errString(L_INVALID_PATH,
2998*fcf3ce44SJohn Forte argv[path_index]);
2999*fcf3ce44SJohn Forte exit(-1);
3000*fcf3ce44SJohn Forte }
3001*fcf3ce44SJohn Forte
3002*fcf3ce44SJohn Forte if ((map_root = g_dev_map_init(temp2path, &err,
3003*fcf3ce44SJohn Forte MAP_FORMAT_LILP)) == NULL) {
3004*fcf3ce44SJohn Forte if (dev_type & FC_FCA_MASK) {
3005*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
3006*fcf3ce44SJohn Forte exit(-1);
3007*fcf3ce44SJohn Forte } else {
3008*fcf3ce44SJohn Forte /*
3009*fcf3ce44SJohn Forte * This did not work so try the FCIO_GETMAP
3010*fcf3ce44SJohn Forte * type ioctl.
3011*fcf3ce44SJohn Forte */
3012*fcf3ce44SJohn Forte if (err = g_get_limited_map(path_phys,
3013*fcf3ce44SJohn Forte &limited_map, (Options & PVERBOSE))) {
3014*fcf3ce44SJohn Forte (void) print_errString(err,
3015*fcf3ce44SJohn Forte argv[path_index]);
3016*fcf3ce44SJohn Forte exit(-1);
3017*fcf3ce44SJohn Forte }
3018*fcf3ce44SJohn Forte limited_map_flag++;
3019*fcf3ce44SJohn Forte }
3020*fcf3ce44SJohn Forte
3021*fcf3ce44SJohn Forte }
3022*fcf3ce44SJohn Forte
3023*fcf3ce44SJohn Forte if (limited_map_flag) {
3024*fcf3ce44SJohn Forte (void) fprintf(stdout,
3025*fcf3ce44SJohn Forte MSGSTR(2093,
3026*fcf3ce44SJohn Forte "Host Adapter AL_PA: %x\n"),
3027*fcf3ce44SJohn Forte limited_map.lilp_myalpa);
3028*fcf3ce44SJohn Forte
3029*fcf3ce44SJohn Forte (void) fprintf(stdout,
3030*fcf3ce44SJohn Forte MSGSTR(2094,
3031*fcf3ce44SJohn Forte "Pos AL_PA\n"));
3032*fcf3ce44SJohn Forte for (i = 0; i < (uint_t)limited_map.lilp_length; i++) {
3033*fcf3ce44SJohn Forte (void) fprintf(stdout, "%-3d %-2x\n",
3034*fcf3ce44SJohn Forte i, limited_map.lilp_list[i]);
3035*fcf3ce44SJohn Forte }
3036*fcf3ce44SJohn Forte } else {
3037*fcf3ce44SJohn Forte if ((err = g_dev_prop_lookup_bytes(map_root,
3038*fcf3ce44SJohn Forte PORT_WWN_PROP, &count, &hba_port_wwn)) != 0) {
3039*fcf3ce44SJohn Forte g_dev_map_fini(map_root);
3040*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
3041*fcf3ce44SJohn Forte exit(-1);
3042*fcf3ce44SJohn Forte }
3043*fcf3ce44SJohn Forte if ((err = g_get_map_topology(
3044*fcf3ce44SJohn Forte map_root, &map_topo)) != 0) {
3045*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
3046*fcf3ce44SJohn Forte exit(-1);
3047*fcf3ce44SJohn Forte }
3048*fcf3ce44SJohn Forte
3049*fcf3ce44SJohn Forte if ((map_dev = g_get_first_dev(map_root, &err)) == NULL) {
3050*fcf3ce44SJohn Forte if (err == L_NO_SUCH_DEV_FOUND) {
3051*fcf3ce44SJohn Forte g_dev_map_fini(map_root);
3052*fcf3ce44SJohn Forte (void) fprintf(stderr,
3053*fcf3ce44SJohn Forte MSGSTR(2308, " No devices are found on %s.\n"),
3054*fcf3ce44SJohn Forte argv[path_index]);
3055*fcf3ce44SJohn Forte exit(-1);
3056*fcf3ce44SJohn Forte } else {
3057*fcf3ce44SJohn Forte g_dev_map_fini(map_root);
3058*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
3059*fcf3ce44SJohn Forte exit(-1);
3060*fcf3ce44SJohn Forte }
3061*fcf3ce44SJohn Forte }
3062*fcf3ce44SJohn Forte
3063*fcf3ce44SJohn Forte switch (map_topo) {
3064*fcf3ce44SJohn Forte case FC_TOP_FABRIC:
3065*fcf3ce44SJohn Forte case FC_TOP_PUBLIC_LOOP:
3066*fcf3ce44SJohn Forte case FC_TOP_PT_PT:
3067*fcf3ce44SJohn Forte (void) fprintf(stdout,
3068*fcf3ce44SJohn Forte MSGSTR(2095, "Pos Port_ID Hard_Addr Port WWN"
3069*fcf3ce44SJohn Forte " Node WWN Type\n"));
3070*fcf3ce44SJohn Forte while (map_dev) {
3071*fcf3ce44SJohn Forte if ((err = g_dev_prop_lookup_ints(
3072*fcf3ce44SJohn Forte map_dev, PORT_ADDR_PROP, &port_addr)) != 0) {
3073*fcf3ce44SJohn Forte g_dev_map_fini(map_root);
3074*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
3075*fcf3ce44SJohn Forte exit(-1);
3076*fcf3ce44SJohn Forte }
3077*fcf3ce44SJohn Forte if ((err = g_dev_prop_lookup_bytes(map_dev,
3078*fcf3ce44SJohn Forte PORT_WWN_PROP, &count, &port_wwn)) != 0) {
3079*fcf3ce44SJohn Forte g_dev_map_fini(map_root);
3080*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
3081*fcf3ce44SJohn Forte exit(-1);
3082*fcf3ce44SJohn Forte }
3083*fcf3ce44SJohn Forte if ((err = g_dev_prop_lookup_bytes(map_dev,
3084*fcf3ce44SJohn Forte NODE_WWN_PROP, &count, &node_wwn)) != 0) {
3085*fcf3ce44SJohn Forte g_dev_map_fini(map_root);
3086*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
3087*fcf3ce44SJohn Forte exit(-1);
3088*fcf3ce44SJohn Forte }
3089*fcf3ce44SJohn Forte if ((err = g_dev_prop_lookup_ints(
3090*fcf3ce44SJohn Forte map_dev, HARD_ADDR_PROP, &hard_addr)) != 0) {
3091*fcf3ce44SJohn Forte g_dev_map_fini(map_root);
3092*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
3093*fcf3ce44SJohn Forte exit(-1);
3094*fcf3ce44SJohn Forte }
3095*fcf3ce44SJohn Forte print_fabric_prop(pos++, port_wwn,
3096*fcf3ce44SJohn Forte node_wwn, *port_addr, *hard_addr);
3097*fcf3ce44SJohn Forte if ((err = g_dev_prop_lookup_bytes(map_dev,
3098*fcf3ce44SJohn Forte INQ_DTYPE_PROP, &count, &dtype_prop)) != 0) {
3099*fcf3ce44SJohn Forte (void) fprintf(stdout,
3100*fcf3ce44SJohn Forte MSGSTR(2307, " Failed to get the type.\n"));
3101*fcf3ce44SJohn Forte } else {
3102*fcf3ce44SJohn Forte print_fabric_dtype_prop(hba_port_wwn, port_wwn,
3103*fcf3ce44SJohn Forte *dtype_prop);
3104*fcf3ce44SJohn Forte }
3105*fcf3ce44SJohn Forte
3106*fcf3ce44SJohn Forte if (((map_dev = g_get_next_dev(
3107*fcf3ce44SJohn Forte map_dev, &err)) == NULL) &&
3108*fcf3ce44SJohn Forte (err != L_NO_SUCH_DEV_FOUND)) {
3109*fcf3ce44SJohn Forte g_dev_map_fini(map_root);
3110*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
3111*fcf3ce44SJohn Forte exit(-1);
3112*fcf3ce44SJohn Forte }
3113*fcf3ce44SJohn Forte }
3114*fcf3ce44SJohn Forte break;
3115*fcf3ce44SJohn Forte case FC_TOP_PRIVATE_LOOP:
3116*fcf3ce44SJohn Forte (void) fprintf(stdout,
3117*fcf3ce44SJohn Forte MSGSTR(2295,
3118*fcf3ce44SJohn Forte "Pos AL_PA ID Hard_Addr "
3119*fcf3ce44SJohn Forte "Port WWN Node WWN Type\n"));
3120*fcf3ce44SJohn Forte
3121*fcf3ce44SJohn Forte while (map_dev) {
3122*fcf3ce44SJohn Forte if ((err = g_dev_prop_lookup_ints(
3123*fcf3ce44SJohn Forte map_dev, PORT_ADDR_PROP, &port_addr)) != 0) {
3124*fcf3ce44SJohn Forte g_dev_map_fini(map_root);
3125*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
3126*fcf3ce44SJohn Forte exit(-1);
3127*fcf3ce44SJohn Forte }
3128*fcf3ce44SJohn Forte if ((err = g_dev_prop_lookup_bytes(map_dev,
3129*fcf3ce44SJohn Forte PORT_WWN_PROP, &count, &port_wwn)) != 0) {
3130*fcf3ce44SJohn Forte g_dev_map_fini(map_root);
3131*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
3132*fcf3ce44SJohn Forte exit(-1);
3133*fcf3ce44SJohn Forte }
3134*fcf3ce44SJohn Forte if ((err = g_dev_prop_lookup_bytes(map_dev,
3135*fcf3ce44SJohn Forte NODE_WWN_PROP, &count, &node_wwn)) != 0) {
3136*fcf3ce44SJohn Forte g_dev_map_fini(map_root);
3137*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
3138*fcf3ce44SJohn Forte exit(-1);
3139*fcf3ce44SJohn Forte }
3140*fcf3ce44SJohn Forte if ((err = g_dev_prop_lookup_ints(
3141*fcf3ce44SJohn Forte map_dev, HARD_ADDR_PROP, &hard_addr)) != 0) {
3142*fcf3ce44SJohn Forte g_dev_map_fini(map_root);
3143*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
3144*fcf3ce44SJohn Forte exit(-1);
3145*fcf3ce44SJohn Forte }
3146*fcf3ce44SJohn Forte print_private_loop_prop(pos++, port_wwn,
3147*fcf3ce44SJohn Forte node_wwn, *port_addr, *hard_addr);
3148*fcf3ce44SJohn Forte if ((err = g_dev_prop_lookup_bytes(map_dev,
3149*fcf3ce44SJohn Forte INQ_DTYPE_PROP, &count, &dtype_prop)) != 0) {
3150*fcf3ce44SJohn Forte (void) fprintf(stdout,
3151*fcf3ce44SJohn Forte MSGSTR(2307, " Failed to get the type.\n"));
3152*fcf3ce44SJohn Forte } else {
3153*fcf3ce44SJohn Forte print_private_loop_dtype_prop(hba_port_wwn,
3154*fcf3ce44SJohn Forte port_wwn, *dtype_prop);
3155*fcf3ce44SJohn Forte }
3156*fcf3ce44SJohn Forte
3157*fcf3ce44SJohn Forte if (((map_dev = g_get_next_dev(
3158*fcf3ce44SJohn Forte map_dev, &err)) == NULL) &&
3159*fcf3ce44SJohn Forte (err != L_NO_SUCH_DEV_FOUND)) {
3160*fcf3ce44SJohn Forte g_dev_map_fini(map_root);
3161*fcf3ce44SJohn Forte (void) print_errString(err, argv[path_index]);
3162*fcf3ce44SJohn Forte exit(-1);
3163*fcf3ce44SJohn Forte }
3164*fcf3ce44SJohn Forte }
3165*fcf3ce44SJohn Forte break;
3166*fcf3ce44SJohn Forte default:
3167*fcf3ce44SJohn Forte (void) print_errString(L_UNEXPECTED_FC_TOPOLOGY,
3168*fcf3ce44SJohn Forte argv[path_index]);
3169*fcf3ce44SJohn Forte exit(-1);
3170*fcf3ce44SJohn Forte }
3171*fcf3ce44SJohn Forte g_dev_map_fini(map_root);
3172*fcf3ce44SJohn Forte }
3173*fcf3ce44SJohn Forte limited_map_flag = 0;
3174*fcf3ce44SJohn Forte path_index++;
3175*fcf3ce44SJohn Forte }
3176*fcf3ce44SJohn Forte }
3177*fcf3ce44SJohn Forte
3178*fcf3ce44SJohn Forte /*
3179*fcf3ce44SJohn Forte * Gets a list of non-SENA fcal devices
3180*fcf3ce44SJohn Forte * found on the system.
3181*fcf3ce44SJohn Forte *
3182*fcf3ce44SJohn Forte * OUTPUT:
3183*fcf3ce44SJohn Forte * wwn_list pointer
3184*fcf3ce44SJohn Forte * NULL: No non-enclosure devices found.
3185*fcf3ce44SJohn Forte * !NULL: Devices found
3186*fcf3ce44SJohn Forte * wwn_list points to a linked list of wwn's.
3187*fcf3ce44SJohn Forte * RETURNS:
3188*fcf3ce44SJohn Forte * 0 O.K.
3189*fcf3ce44SJohn Forte */
3190*fcf3ce44SJohn Forte int
n_get_non_encl_list(WWN_list ** wwn_list_ptr,int verbose)3191*fcf3ce44SJohn Forte n_get_non_encl_list(WWN_list **wwn_list_ptr, int verbose)
3192*fcf3ce44SJohn Forte {
3193*fcf3ce44SJohn Forte int i, j, k, err, found_ib = 0, pathcnt = 1;
3194*fcf3ce44SJohn Forte WWN_list *wwn_list;
3195*fcf3ce44SJohn Forte Box_list *b_list = NULL;
3196*fcf3ce44SJohn Forte gfc_map_t map;
3197*fcf3ce44SJohn Forte uchar_t box_id;
3198*fcf3ce44SJohn Forte gfc_port_dev_info_t *dev_addr_list;
3199*fcf3ce44SJohn Forte char phci_path[MAXPATHLEN], oldphci_path[MAXPATHLEN];
3200*fcf3ce44SJohn Forte mp_pathlist_t pathlist;
3201*fcf3ce44SJohn Forte
3202*fcf3ce44SJohn Forte
3203*fcf3ce44SJohn Forte /*
3204*fcf3ce44SJohn Forte * Only interested in devices that are not part of
3205*fcf3ce44SJohn Forte * a Photon enclosure.
3206*fcf3ce44SJohn Forte */
3207*fcf3ce44SJohn Forte if ((err = l_get_box_list(&b_list, verbose)) != 0) {
3208*fcf3ce44SJohn Forte return (err); /* Failure */
3209*fcf3ce44SJohn Forte }
3210*fcf3ce44SJohn Forte
3211*fcf3ce44SJohn Forte if (err = g_get_wwn_list(&wwn_list, verbose)) {
3212*fcf3ce44SJohn Forte (void) l_free_box_list(&b_list);
3213*fcf3ce44SJohn Forte return (err);
3214*fcf3ce44SJohn Forte }
3215*fcf3ce44SJohn Forte
3216*fcf3ce44SJohn Forte while (b_list != NULL) {
3217*fcf3ce44SJohn Forte
3218*fcf3ce44SJohn Forte pathcnt = 1;
3219*fcf3ce44SJohn Forte if (strstr(b_list->b_physical_path, SCSI_VHCI) != NULL) {
3220*fcf3ce44SJohn Forte (void) strcpy(phci_path, b_list->b_physical_path);
3221*fcf3ce44SJohn Forte if (err = g_get_pathlist(phci_path, &pathlist)) {
3222*fcf3ce44SJohn Forte (void) print_errString(err, NULL);
3223*fcf3ce44SJohn Forte exit(-1);
3224*fcf3ce44SJohn Forte }
3225*fcf3ce44SJohn Forte pathcnt = pathlist.path_count;
3226*fcf3ce44SJohn Forte }
3227*fcf3ce44SJohn Forte
3228*fcf3ce44SJohn Forte for (k = 0; k < pathcnt; k++) {
3229*fcf3ce44SJohn Forte
3230*fcf3ce44SJohn Forte if ((k > 0) && (strstr(oldphci_path,
3231*fcf3ce44SJohn Forte pathlist.path_info[k].path_hba))) {
3232*fcf3ce44SJohn Forte continue;
3233*fcf3ce44SJohn Forte }
3234*fcf3ce44SJohn Forte
3235*fcf3ce44SJohn Forte if (strstr(b_list->b_physical_path, SCSI_VHCI) == NULL) {
3236*fcf3ce44SJohn Forte if ((err = g_get_dev_map(b_list->b_physical_path,
3237*fcf3ce44SJohn Forte &map, verbose)) != 0) {
3238*fcf3ce44SJohn Forte (void) g_free_wwn_list(&wwn_list);
3239*fcf3ce44SJohn Forte (void) l_free_box_list(&b_list);
3240*fcf3ce44SJohn Forte return (err);
3241*fcf3ce44SJohn Forte }
3242*fcf3ce44SJohn Forte } else {
3243*fcf3ce44SJohn Forte (void) strcpy(phci_path,
3244*fcf3ce44SJohn Forte pathlist.path_info[k].path_hba);
3245*fcf3ce44SJohn Forte (void) strcpy(oldphci_path, phci_path);
3246*fcf3ce44SJohn Forte (void) strcat(phci_path, FC_CTLR);
3247*fcf3ce44SJohn Forte if (g_get_dev_map(phci_path, &map, verbose)) {
3248*fcf3ce44SJohn Forte continue;
3249*fcf3ce44SJohn Forte }
3250*fcf3ce44SJohn Forte if (pathcnt == 1) {
3251*fcf3ce44SJohn Forte free(pathlist.path_info);
3252*fcf3ce44SJohn Forte }
3253*fcf3ce44SJohn Forte }
3254*fcf3ce44SJohn Forte
3255*fcf3ce44SJohn Forte
3256*fcf3ce44SJohn Forte switch (map.hba_addr.port_topology) {
3257*fcf3ce44SJohn Forte case FC_TOP_FABRIC:
3258*fcf3ce44SJohn Forte case FC_TOP_PUBLIC_LOOP:
3259*fcf3ce44SJohn Forte
3260*fcf3ce44SJohn Forte for (i = 0, dev_addr_list = map.dev_addr;
3261*fcf3ce44SJohn Forte i < map.count; i++, dev_addr_list++) {
3262*fcf3ce44SJohn Forte for (found_ib = 1, j = 0; j < WWN_SIZE;
3263*fcf3ce44SJohn Forte j++) {
3264*fcf3ce44SJohn Forte if (b_list->b_node_wwn[j] !=
3265*fcf3ce44SJohn Forte dev_addr_list->gfc_port_dev.
3266*fcf3ce44SJohn Forte pub_port.dev_nwwn.raw_wwn[j]) {
3267*fcf3ce44SJohn Forte found_ib = 0;
3268*fcf3ce44SJohn Forte }
3269*fcf3ce44SJohn Forte }
3270*fcf3ce44SJohn Forte if (found_ib) {
3271*fcf3ce44SJohn Forte (void) n_rem_list_entry_fabric(
3272*fcf3ce44SJohn Forte dev_addr_list->gfc_port_dev.
3273*fcf3ce44SJohn Forte pub_port.dev_did.port_id, &map,
3274*fcf3ce44SJohn Forte &wwn_list);
3275*fcf3ce44SJohn Forte }
3276*fcf3ce44SJohn Forte }
3277*fcf3ce44SJohn Forte break;
3278*fcf3ce44SJohn Forte
3279*fcf3ce44SJohn Forte case FC_TOP_PRIVATE_LOOP:
3280*fcf3ce44SJohn Forte
3281*fcf3ce44SJohn Forte for (i = 0, dev_addr_list = map.dev_addr;
3282*fcf3ce44SJohn Forte i < map.count; i++, dev_addr_list++) {
3283*fcf3ce44SJohn Forte for (found_ib = 1, j = 0; j < WWN_SIZE;
3284*fcf3ce44SJohn Forte j++) {
3285*fcf3ce44SJohn Forte if (b_list->b_node_wwn[j] !=
3286*fcf3ce44SJohn Forte dev_addr_list->gfc_port_dev.
3287*fcf3ce44SJohn Forte priv_port.sf_node_wwn[j]) {
3288*fcf3ce44SJohn Forte found_ib = 0;
3289*fcf3ce44SJohn Forte }
3290*fcf3ce44SJohn Forte }
3291*fcf3ce44SJohn Forte if (found_ib) {
3292*fcf3ce44SJohn Forte box_id = g_sf_alpa_to_switch
3293*fcf3ce44SJohn Forte [dev_addr_list->gfc_port_dev.
3294*fcf3ce44SJohn Forte priv_port.sf_al_pa] &
3295*fcf3ce44SJohn Forte BOX_ID_MASK;
3296*fcf3ce44SJohn Forte /* This function has been added */
3297*fcf3ce44SJohn Forte /* here only to keep from having */
3298*fcf3ce44SJohn Forte /* to tab over farther */
3299*fcf3ce44SJohn Forte (void) n_rem_list_entry(box_id, &map,
3300*fcf3ce44SJohn Forte &wwn_list);
3301*fcf3ce44SJohn Forte if (wwn_list == NULL) {
3302*fcf3ce44SJohn Forte /* Return the list */
3303*fcf3ce44SJohn Forte *wwn_list_ptr = NULL;
3304*fcf3ce44SJohn Forte break;
3305*fcf3ce44SJohn Forte }
3306*fcf3ce44SJohn Forte }
3307*fcf3ce44SJohn Forte }
3308*fcf3ce44SJohn Forte break;
3309*fcf3ce44SJohn Forte case FC_TOP_PT_PT:
3310*fcf3ce44SJohn Forte (void) free((void *)map.dev_addr);
3311*fcf3ce44SJohn Forte return (L_PT_PT_FC_TOP_NOT_SUPPORTED);
3312*fcf3ce44SJohn Forte default:
3313*fcf3ce44SJohn Forte (void) free((void *)map.dev_addr);
3314*fcf3ce44SJohn Forte return (L_UNEXPECTED_FC_TOPOLOGY);
3315*fcf3ce44SJohn Forte }
3316*fcf3ce44SJohn Forte free((void *)map.dev_addr);
3317*fcf3ce44SJohn Forte
3318*fcf3ce44SJohn Forte }
3319*fcf3ce44SJohn Forte if (pathcnt > 1) {
3320*fcf3ce44SJohn Forte free(pathlist.path_info);
3321*fcf3ce44SJohn Forte }
3322*fcf3ce44SJohn Forte
3323*fcf3ce44SJohn Forte b_list = b_list->box_next;
3324*fcf3ce44SJohn Forte }
3325*fcf3ce44SJohn Forte /* Return the list */
3326*fcf3ce44SJohn Forte *wwn_list_ptr = wwn_list;
3327*fcf3ce44SJohn Forte (void) l_free_box_list(&b_list);
3328*fcf3ce44SJohn Forte return (0);
3329*fcf3ce44SJohn Forte }
3330*fcf3ce44SJohn Forte
3331*fcf3ce44SJohn Forte
3332*fcf3ce44SJohn Forte
3333*fcf3ce44SJohn Forte /*
3334*fcf3ce44SJohn Forte * n_rem_list_entry() We found an IB so remove disks that
3335*fcf3ce44SJohn Forte * are in the Photon from the individual device list.
3336*fcf3ce44SJohn Forte *
3337*fcf3ce44SJohn Forte * OUTPUT:
3338*fcf3ce44SJohn Forte * wwn_list - removes the fcal disks that are in SENA enclosure
3339*fcf3ce44SJohn Forte *
3340*fcf3ce44SJohn Forte * RETURNS:
3341*fcf3ce44SJohn Forte * none
3342*fcf3ce44SJohn Forte */
3343*fcf3ce44SJohn Forte void
n_rem_list_entry(uchar_t box_id,struct gfc_map * map,struct wwn_list_struct ** wwn_list)3344*fcf3ce44SJohn Forte n_rem_list_entry(uchar_t box_id, struct gfc_map *map,
3345*fcf3ce44SJohn Forte struct wwn_list_struct **wwn_list)
3346*fcf3ce44SJohn Forte {
3347*fcf3ce44SJohn Forte int k;
3348*fcf3ce44SJohn Forte gfc_port_dev_info_t *dev_addr_list;
3349*fcf3ce44SJohn Forte
3350*fcf3ce44SJohn Forte N_DPRINTF(" n_rem_list_entry: Removing devices"
3351*fcf3ce44SJohn Forte " with box_id=0x%x from device list.\n", box_id);
3352*fcf3ce44SJohn Forte
3353*fcf3ce44SJohn Forte
3354*fcf3ce44SJohn Forte for (k = 0, dev_addr_list = map->dev_addr; k < map->count;
3355*fcf3ce44SJohn Forte k++, dev_addr_list++) {
3356*fcf3ce44SJohn Forte if ((g_sf_alpa_to_switch[dev_addr_list->gfc_port_dev.
3357*fcf3ce44SJohn Forte priv_port.sf_hard_address] & BOX_ID_MASK)
3358*fcf3ce44SJohn Forte == box_id) {
3359*fcf3ce44SJohn Forte n_rem_wwn_entry(dev_addr_list->gfc_port_dev.
3360*fcf3ce44SJohn Forte priv_port.sf_node_wwn, wwn_list);
3361*fcf3ce44SJohn Forte }
3362*fcf3ce44SJohn Forte }
3363*fcf3ce44SJohn Forte
3364*fcf3ce44SJohn Forte }
3365*fcf3ce44SJohn Forte
3366*fcf3ce44SJohn Forte
3367*fcf3ce44SJohn Forte
3368*fcf3ce44SJohn Forte /*
3369*fcf3ce44SJohn Forte * n_rem_list_entry_fabric() We found an IB so remove disks that
3370*fcf3ce44SJohn Forte * are in the Photon from the individual device list.
3371*fcf3ce44SJohn Forte *
3372*fcf3ce44SJohn Forte * OUTPUT:
3373*fcf3ce44SJohn Forte * wwn_list - removes the fcal disks that are in SENA enclosure
3374*fcf3ce44SJohn Forte *
3375*fcf3ce44SJohn Forte * RETURNS:
3376*fcf3ce44SJohn Forte * none
3377*fcf3ce44SJohn Forte */
3378*fcf3ce44SJohn Forte void
n_rem_list_entry_fabric(int pa,struct gfc_map * map,struct wwn_list_struct ** wwn_list)3379*fcf3ce44SJohn Forte n_rem_list_entry_fabric(int pa, struct gfc_map *map,
3380*fcf3ce44SJohn Forte struct wwn_list_struct **wwn_list)
3381*fcf3ce44SJohn Forte {
3382*fcf3ce44SJohn Forte int k;
3383*fcf3ce44SJohn Forte gfc_port_dev_info_t *dev_addr_ptr;
3384*fcf3ce44SJohn Forte
3385*fcf3ce44SJohn Forte N_DPRINTF(" n_rem_list_entry: Removing devices"
3386*fcf3ce44SJohn Forte " with the same domain and area ID as"
3387*fcf3ce44SJohn Forte " 0x%x PA from device list.\n", pa);
3388*fcf3ce44SJohn Forte for (k = 0, dev_addr_ptr = map->dev_addr; k < map->count;
3389*fcf3ce44SJohn Forte k++, dev_addr_ptr++) {
3390*fcf3ce44SJohn Forte
3391*fcf3ce44SJohn Forte /* matching the domain and area id with input alpa, */
3392*fcf3ce44SJohn Forte /* ignoring last 8 bits. */
3393*fcf3ce44SJohn Forte if ((dev_addr_ptr->gfc_port_dev.pub_port.dev_did.port_id |
3394*fcf3ce44SJohn Forte 0xff) == (pa | 0xff)) {
3395*fcf3ce44SJohn Forte n_rem_wwn_entry(dev_addr_ptr->
3396*fcf3ce44SJohn Forte gfc_port_dev.pub_port.dev_nwwn.raw_wwn,
3397*fcf3ce44SJohn Forte wwn_list);
3398*fcf3ce44SJohn Forte }
3399*fcf3ce44SJohn Forte }
3400*fcf3ce44SJohn Forte }
3401*fcf3ce44SJohn Forte
3402*fcf3ce44SJohn Forte
3403*fcf3ce44SJohn Forte /*
3404*fcf3ce44SJohn Forte * n_rem_wwn_entry() removes input wwn from wwn_list.
3405*fcf3ce44SJohn Forte *
3406*fcf3ce44SJohn Forte * OUTPUT:
3407*fcf3ce44SJohn Forte * wwn_list - removes the input wwn from wwn_list if found.
3408*fcf3ce44SJohn Forte *
3409*fcf3ce44SJohn Forte * RETURNS:
3410*fcf3ce44SJohn Forte * none
3411*fcf3ce44SJohn Forte */
3412*fcf3ce44SJohn Forte void
n_rem_wwn_entry(uchar_t node_wwn[],struct wwn_list_struct ** wwn_list)3413*fcf3ce44SJohn Forte n_rem_wwn_entry(uchar_t node_wwn[], struct wwn_list_struct **wwn_list)
3414*fcf3ce44SJohn Forte {
3415*fcf3ce44SJohn Forte int l, found_dev;
3416*fcf3ce44SJohn Forte WWN_list *inner, *l1;
3417*fcf3ce44SJohn Forte
3418*fcf3ce44SJohn Forte inner = *wwn_list;
3419*fcf3ce44SJohn Forte while (inner != NULL) {
3420*fcf3ce44SJohn Forte for (found_dev = 1, l = 0; l < WWN_SIZE; l++) {
3421*fcf3ce44SJohn Forte if (inner->w_node_wwn[l] != node_wwn[l]) {
3422*fcf3ce44SJohn Forte found_dev = 0;
3423*fcf3ce44SJohn Forte }
3424*fcf3ce44SJohn Forte }
3425*fcf3ce44SJohn Forte if (found_dev) {
3426*fcf3ce44SJohn Forte /* Remove this entry from the list */
3427*fcf3ce44SJohn Forte if (inner->wwn_prev != NULL) {
3428*fcf3ce44SJohn Forte inner->wwn_prev->wwn_next =
3429*fcf3ce44SJohn Forte inner->wwn_next;
3430*fcf3ce44SJohn Forte } else {
3431*fcf3ce44SJohn Forte *wwn_list = inner->wwn_next;
3432*fcf3ce44SJohn Forte }
3433*fcf3ce44SJohn Forte if (inner->wwn_next != NULL) {
3434*fcf3ce44SJohn Forte inner->wwn_next->wwn_prev =
3435*fcf3ce44SJohn Forte inner->wwn_prev;
3436*fcf3ce44SJohn Forte }
3437*fcf3ce44SJohn Forte l1 = inner;
3438*fcf3ce44SJohn Forte N_DPRINTF(" n_rem_wwn_entry: "
3439*fcf3ce44SJohn Forte "Removing Logical=%s "
3440*fcf3ce44SJohn Forte "Current=0x%x, "
3441*fcf3ce44SJohn Forte "Prev=0x%x, Next=0x%x\n",
3442*fcf3ce44SJohn Forte l1->logical_path,
3443*fcf3ce44SJohn Forte l1,
3444*fcf3ce44SJohn Forte l1->wwn_prev,
3445*fcf3ce44SJohn Forte l1->wwn_next);
3446*fcf3ce44SJohn Forte inner = inner->wwn_next;
3447*fcf3ce44SJohn Forte if ((l1->wwn_prev == NULL) &&
3448*fcf3ce44SJohn Forte (l1->wwn_next) == NULL) {
3449*fcf3ce44SJohn Forte (void) free(l1->physical_path);
3450*fcf3ce44SJohn Forte (void) free(l1->logical_path);
3451*fcf3ce44SJohn Forte (void) free(l1);
3452*fcf3ce44SJohn Forte *wwn_list = NULL;
3453*fcf3ce44SJohn Forte N_DPRINTF(" n_rem_list_entry: "
3454*fcf3ce44SJohn Forte "No non-Photon "
3455*fcf3ce44SJohn Forte "devices left"
3456*fcf3ce44SJohn Forte " in the list.\n");
3457*fcf3ce44SJohn Forte return;
3458*fcf3ce44SJohn Forte }
3459*fcf3ce44SJohn Forte (void) free(l1->physical_path);
3460*fcf3ce44SJohn Forte (void) free(l1->logical_path);
3461*fcf3ce44SJohn Forte (void) free(l1);
3462*fcf3ce44SJohn Forte } else {
3463*fcf3ce44SJohn Forte inner = inner->wwn_next;
3464*fcf3ce44SJohn Forte }
3465*fcf3ce44SJohn Forte }
3466*fcf3ce44SJohn Forte }
3467*fcf3ce44SJohn Forte
3468*fcf3ce44SJohn Forte
3469*fcf3ce44SJohn Forte /*
3470*fcf3ce44SJohn Forte * non_encl_probe() Finds and displays a list of
3471*fcf3ce44SJohn Forte * non-SENA fcal devices which is found on the
3472*fcf3ce44SJohn Forte * system.
3473*fcf3ce44SJohn Forte *
3474*fcf3ce44SJohn Forte * RETURNS:
3475*fcf3ce44SJohn Forte * none.
3476*fcf3ce44SJohn Forte */
3477*fcf3ce44SJohn Forte void
non_encl_probe()3478*fcf3ce44SJohn Forte non_encl_probe()
3479*fcf3ce44SJohn Forte {
3480*fcf3ce44SJohn Forte WWN_list *wwn_list, *wwn_listh, *inner, *l1;
3481*fcf3ce44SJohn Forte int err = 0;
3482*fcf3ce44SJohn Forte char lun_a[MAXPATHLEN], lun_b[MAXPATHLEN], temppath[MAXPATHLEN];
3483*fcf3ce44SJohn Forte char *tempptra, *tempptrb, *tempptr;
3484*fcf3ce44SJohn Forte mp_pathlist_t pathlist;
3485*fcf3ce44SJohn Forte int compare_result, retr_outer = 0;
3486*fcf3ce44SJohn Forte ddi_devid_t devid1 = NULL, devid2 = NULL;
3487*fcf3ce44SJohn Forte di_node_t root = DI_NODE_NIL;
3488*fcf3ce44SJohn Forte
3489*fcf3ce44SJohn Forte if (err = n_get_non_encl_list(&wwn_list, (Options & PVERBOSE))) {
3490*fcf3ce44SJohn Forte (void) print_errString(err, NULL);
3491*fcf3ce44SJohn Forte exit(-1);
3492*fcf3ce44SJohn Forte }
3493*fcf3ce44SJohn Forte
3494*fcf3ce44SJohn Forte g_sort_wwn_list(&wwn_list);
3495*fcf3ce44SJohn Forte
3496*fcf3ce44SJohn Forte wwn_listh = wwn_list;
3497*fcf3ce44SJohn Forte
3498*fcf3ce44SJohn Forte if (wwn_list != NULL) {
3499*fcf3ce44SJohn Forte if (wwn_list->wwn_next != NULL) {
3500*fcf3ce44SJohn Forte (void) fprintf(stdout,
3501*fcf3ce44SJohn Forte MSGSTR(2098, "\nFound Fibre Channel device(s):\n"));
3502*fcf3ce44SJohn Forte } else {
3503*fcf3ce44SJohn Forte (void) fprintf(stdout,
3504*fcf3ce44SJohn Forte MSGSTR(2099, "\nFound Fibre Channel device:\n"));
3505*fcf3ce44SJohn Forte }
3506*fcf3ce44SJohn Forte } else {
3507*fcf3ce44SJohn Forte return;
3508*fcf3ce44SJohn Forte }
3509*fcf3ce44SJohn Forte
3510*fcf3ce44SJohn Forte while (wwn_list != NULL) {
3511*fcf3ce44SJohn Forte if (strstr(wwn_list->physical_path, SCSI_VHCI) != NULL) {
3512*fcf3ce44SJohn Forte (void) strcpy(temppath, wwn_list->physical_path);
3513*fcf3ce44SJohn Forte if ((!g_get_pathlist(temppath,
3514*fcf3ce44SJohn Forte &pathlist)) &&
3515*fcf3ce44SJohn Forte ((tempptra = strchr(pathlist.path_info[0].
3516*fcf3ce44SJohn Forte path_addr, ','))) != NULL) {
3517*fcf3ce44SJohn Forte tempptra++;
3518*fcf3ce44SJohn Forte (void) strcpy(lun_a, tempptra);
3519*fcf3ce44SJohn Forte free(pathlist.path_info);
3520*fcf3ce44SJohn Forte }
3521*fcf3ce44SJohn Forte } else {
3522*fcf3ce44SJohn Forte if ((((tempptr = strstr(wwn_list->physical_path,
3523*fcf3ce44SJohn Forte SLSH_DRV_NAME_ST)) != NULL) ||
3524*fcf3ce44SJohn Forte ((tempptr = strstr(wwn_list->physical_path,
3525*fcf3ce44SJohn Forte SLSH_DRV_NAME_SSD)) != NULL)) &&
3526*fcf3ce44SJohn Forte ((tempptra = strchr(tempptr, ',')) != NULL)) {
3527*fcf3ce44SJohn Forte tempptra++;
3528*fcf3ce44SJohn Forte (void) strcpy(lun_a, tempptra);
3529*fcf3ce44SJohn Forte }
3530*fcf3ce44SJohn Forte }
3531*fcf3ce44SJohn Forte (void) fprintf(stdout, " ");
3532*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(90, "Node WWN:"));
3533*fcf3ce44SJohn Forte (void) fprintf(stdout, "%s ", wwn_list->node_wwn_s);
3534*fcf3ce44SJohn Forte
3535*fcf3ce44SJohn Forte if (wwn_list->device_type < 0x10) {
3536*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(35, "Device Type:"));
3537*fcf3ce44SJohn Forte (void) fprintf(stdout, "%s",
3538*fcf3ce44SJohn Forte dtype[wwn_list->device_type]);
3539*fcf3ce44SJohn Forte } else if (wwn_list->device_type < 0x1f) {
3540*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2100,
3541*fcf3ce44SJohn Forte "Type:Reserved"));
3542*fcf3ce44SJohn Forte } else {
3543*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2101,
3544*fcf3ce44SJohn Forte "Type:Unknown"));
3545*fcf3ce44SJohn Forte }
3546*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n ");
3547*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(31, "Logical Path:%s"),
3548*fcf3ce44SJohn Forte wwn_list->logical_path);
3549*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
3550*fcf3ce44SJohn Forte
3551*fcf3ce44SJohn Forte if (Options & OPTION_P) {
3552*fcf3ce44SJohn Forte (void) fprintf(stdout, " ");
3553*fcf3ce44SJohn Forte (void) fprintf(stdout,
3554*fcf3ce44SJohn Forte MSGSTR(5, "Physical Path:"));
3555*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n %s\n", wwn_list->physical_path);
3556*fcf3ce44SJohn Forte }
3557*fcf3ce44SJohn Forte inner = wwn_list->wwn_next;
3558*fcf3ce44SJohn Forte
3559*fcf3ce44SJohn Forte while (inner != NULL) {
3560*fcf3ce44SJohn Forte if (strcmp(inner->node_wwn_s, wwn_list->node_wwn_s) == 0) {
3561*fcf3ce44SJohn Forte
3562*fcf3ce44SJohn Forte if (tempptra != NULL) {
3563*fcf3ce44SJohn Forte if (strstr(inner->physical_path,
3564*fcf3ce44SJohn Forte SCSI_VHCI) != NULL) {
3565*fcf3ce44SJohn Forte (void) strcpy(temppath,
3566*fcf3ce44SJohn Forte inner->physical_path);
3567*fcf3ce44SJohn Forte
3568*fcf3ce44SJohn Forte if ((!g_get_pathlist(temppath, &pathlist)) &&
3569*fcf3ce44SJohn Forte ((tempptrb = strchr(
3570*fcf3ce44SJohn Forte pathlist.path_info[0].path_addr, ','))) !=
3571*fcf3ce44SJohn Forte NULL) {
3572*fcf3ce44SJohn Forte tempptrb++;
3573*fcf3ce44SJohn Forte (void) strcpy(lun_b, tempptrb);
3574*fcf3ce44SJohn Forte free(pathlist.path_info);
3575*fcf3ce44SJohn Forte }
3576*fcf3ce44SJohn Forte } else {
3577*fcf3ce44SJohn Forte if ((((tempptr = strstr(inner->physical_path,
3578*fcf3ce44SJohn Forte SLSH_DRV_NAME_ST)) != NULL) ||
3579*fcf3ce44SJohn Forte ((tempptr = strstr(inner->physical_path,
3580*fcf3ce44SJohn Forte SLSH_DRV_NAME_SSD)) != NULL)) &&
3581*fcf3ce44SJohn Forte ((tempptrb = strchr(tempptr, ',')) != NULL)) {
3582*fcf3ce44SJohn Forte tempptrb++;
3583*fcf3ce44SJohn Forte (void) strcpy(lun_b, tempptrb);
3584*fcf3ce44SJohn Forte }
3585*fcf3ce44SJohn Forte }
3586*fcf3ce44SJohn Forte }
3587*fcf3ce44SJohn Forte
3588*fcf3ce44SJohn Forte if (((tempptra == NULL) || (strcmp(lun_a, lun_b)) == 0)) {
3589*fcf3ce44SJohn Forte
3590*fcf3ce44SJohn Forte /*
3591*fcf3ce44SJohn Forte * Have we retrieved a snapshot yet?
3592*fcf3ce44SJohn Forte */
3593*fcf3ce44SJohn Forte if (root == DI_NODE_NIL) {
3594*fcf3ce44SJohn Forte if ((root = di_init("/", DINFOCPYALL)) ==
3595*fcf3ce44SJohn Forte DI_NODE_NIL) {
3596*fcf3ce44SJohn Forte (void) fprintf(stdout,
3597*fcf3ce44SJohn Forte MSGSTR(2319,
3598*fcf3ce44SJohn Forte "\nFailed to get device tree snapshot:\n"));
3599*fcf3ce44SJohn Forte exit(1);
3600*fcf3ce44SJohn Forte }
3601*fcf3ce44SJohn Forte }
3602*fcf3ce44SJohn Forte
3603*fcf3ce44SJohn Forte /* Apply devid to ssd devices only */
3604*fcf3ce44SJohn Forte if (!retr_outer && strstr(wwn_list->physical_path,
3605*fcf3ce44SJohn Forte SLSH_DRV_NAME_SSD) != NULL) {
3606*fcf3ce44SJohn Forte if ((err = g_devid_get(wwn_list->physical_path,
3607*fcf3ce44SJohn Forte &devid1, root, SSD_DRVR_NAME)) != 0) {
3608*fcf3ce44SJohn Forte (void) print_errString(err,
3609*fcf3ce44SJohn Forte wwn_list->physical_path);
3610*fcf3ce44SJohn Forte }
3611*fcf3ce44SJohn Forte /*
3612*fcf3ce44SJohn Forte * Try retrieve of devid only once. If it fails
3613*fcf3ce44SJohn Forte * don't try it again but print error,
3614*fcf3ce44SJohn Forte * There should be a devid prop.
3615*fcf3ce44SJohn Forte */
3616*fcf3ce44SJohn Forte retr_outer = 1;
3617*fcf3ce44SJohn Forte }
3618*fcf3ce44SJohn Forte /*
3619*fcf3ce44SJohn Forte * Apply devid to block devices only.
3620*fcf3ce44SJohn Forte * Get devid of inner path and compare
3621*fcf3ce44SJohn Forte * with outer path's devid.
3622*fcf3ce44SJohn Forte */
3623*fcf3ce44SJohn Forte if ((strstr(inner->physical_path,
3624*fcf3ce44SJohn Forte SLSH_DRV_NAME_SSD) != NULL) &&
3625*fcf3ce44SJohn Forte devid1 != NULL) {
3626*fcf3ce44SJohn Forte
3627*fcf3ce44SJohn Forte if ((err = g_devid_get(inner->physical_path,
3628*fcf3ce44SJohn Forte &devid2, root, SSD_DRVR_NAME)) != 0) {
3629*fcf3ce44SJohn Forte
3630*fcf3ce44SJohn Forte (void) print_errString(err,
3631*fcf3ce44SJohn Forte inner->physical_path);
3632*fcf3ce44SJohn Forte compare_result = 0;
3633*fcf3ce44SJohn Forte } else {
3634*fcf3ce44SJohn Forte compare_result = devid_compare(devid1, devid2);
3635*fcf3ce44SJohn Forte }
3636*fcf3ce44SJohn Forte } else {
3637*fcf3ce44SJohn Forte /* devid isn't applied */
3638*fcf3ce44SJohn Forte compare_result = 0;
3639*fcf3ce44SJohn Forte }
3640*fcf3ce44SJohn Forte
3641*fcf3ce44SJohn Forte if (compare_result == 0) {
3642*fcf3ce44SJohn Forte
3643*fcf3ce44SJohn Forte if (strcmp(wwn_list->logical_path,
3644*fcf3ce44SJohn Forte inner->logical_path)) {
3645*fcf3ce44SJohn Forte (void) fprintf(stdout, " ");
3646*fcf3ce44SJohn Forte (void) fprintf(stdout,
3647*fcf3ce44SJohn Forte MSGSTR(31, "Logical Path:%s"),
3648*fcf3ce44SJohn Forte inner->logical_path);
3649*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
3650*fcf3ce44SJohn Forte
3651*fcf3ce44SJohn Forte if (Options & OPTION_P) {
3652*fcf3ce44SJohn Forte (void) fprintf(stdout, " ");
3653*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(5,
3654*fcf3ce44SJohn Forte "Physical Path:"));
3655*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n %s\n",
3656*fcf3ce44SJohn Forte inner->physical_path);
3657*fcf3ce44SJohn Forte }
3658*fcf3ce44SJohn Forte }
3659*fcf3ce44SJohn Forte
3660*fcf3ce44SJohn Forte /* Remove this entry from the list */
3661*fcf3ce44SJohn Forte if (inner->wwn_prev != NULL) {
3662*fcf3ce44SJohn Forte inner->wwn_prev->wwn_next =
3663*fcf3ce44SJohn Forte inner->wwn_next;
3664*fcf3ce44SJohn Forte }
3665*fcf3ce44SJohn Forte
3666*fcf3ce44SJohn Forte if (inner->wwn_next != NULL) {
3667*fcf3ce44SJohn Forte inner->wwn_next->wwn_prev =
3668*fcf3ce44SJohn Forte inner->wwn_prev;
3669*fcf3ce44SJohn Forte }
3670*fcf3ce44SJohn Forte free(inner->physical_path);
3671*fcf3ce44SJohn Forte free(inner->logical_path);
3672*fcf3ce44SJohn Forte l1 = inner;
3673*fcf3ce44SJohn Forte inner = inner->wwn_next;
3674*fcf3ce44SJohn Forte (void) free(l1);
3675*fcf3ce44SJohn Forte
3676*fcf3ce44SJohn Forte } else {
3677*fcf3ce44SJohn Forte inner = inner->wwn_next;
3678*fcf3ce44SJohn Forte } /* End if (compare_result == 0) */
3679*fcf3ce44SJohn Forte
3680*fcf3ce44SJohn Forte } else {
3681*fcf3ce44SJohn Forte inner = inner->wwn_next;
3682*fcf3ce44SJohn Forte }
3683*fcf3ce44SJohn Forte } else {
3684*fcf3ce44SJohn Forte inner = inner->wwn_next;
3685*fcf3ce44SJohn Forte }
3686*fcf3ce44SJohn Forte devid2 = NULL;
3687*fcf3ce44SJohn Forte }
3688*fcf3ce44SJohn Forte wwn_list = wwn_list->wwn_next;
3689*fcf3ce44SJohn Forte retr_outer = 0;
3690*fcf3ce44SJohn Forte devid1 = NULL;
3691*fcf3ce44SJohn Forte } /* End while (wwn_list != NULL) */
3692*fcf3ce44SJohn Forte
3693*fcf3ce44SJohn Forte (void) g_free_wwn_list(&wwn_listh);
3694*fcf3ce44SJohn Forte (void) di_fini(root);
3695*fcf3ce44SJohn Forte }
3696*fcf3ce44SJohn Forte
3697*fcf3ce44SJohn Forte void
pho_probe()3698*fcf3ce44SJohn Forte pho_probe()
3699*fcf3ce44SJohn Forte {
3700*fcf3ce44SJohn Forte
3701*fcf3ce44SJohn Forte Box_list *b_list, *o_list, *c_list;
3702*fcf3ce44SJohn Forte int multi_path_flag, multi_print_flag;
3703*fcf3ce44SJohn Forte int duplicate_names_found = 0, err = 0;
3704*fcf3ce44SJohn Forte
3705*fcf3ce44SJohn Forte b_list = o_list = c_list = NULL;
3706*fcf3ce44SJohn Forte if ((err = l_get_box_list(&b_list, Options & PVERBOSE)) != 0) {
3707*fcf3ce44SJohn Forte (void) print_errString(err, NULL);
3708*fcf3ce44SJohn Forte exit(-1);
3709*fcf3ce44SJohn Forte }
3710*fcf3ce44SJohn Forte if (b_list == NULL) {
3711*fcf3ce44SJohn Forte (void) fprintf(stdout,
3712*fcf3ce44SJohn Forte MSGSTR(93, "No %s enclosures found "
3713*fcf3ce44SJohn Forte "in /dev/es\n"), ENCLOSURE_PROD_NAME);
3714*fcf3ce44SJohn Forte } else {
3715*fcf3ce44SJohn Forte o_list = b_list;
3716*fcf3ce44SJohn Forte if (b_list->box_next != NULL) {
3717*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2102,
3718*fcf3ce44SJohn Forte "Found Enclosure(s)"));
3719*fcf3ce44SJohn Forte } else {
3720*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2103, "Found Enclosure"));
3721*fcf3ce44SJohn Forte }
3722*fcf3ce44SJohn Forte (void) fprintf(stdout, ":\n");
3723*fcf3ce44SJohn Forte while (b_list != NULL) {
3724*fcf3ce44SJohn Forte /* Don't re-print multiple paths */
3725*fcf3ce44SJohn Forte c_list = o_list;
3726*fcf3ce44SJohn Forte multi_print_flag = 0;
3727*fcf3ce44SJohn Forte while (c_list != b_list) {
3728*fcf3ce44SJohn Forte if (strcmp(c_list->b_node_wwn_s,
3729*fcf3ce44SJohn Forte b_list->b_node_wwn_s) == 0) {
3730*fcf3ce44SJohn Forte multi_print_flag = 1;
3731*fcf3ce44SJohn Forte break;
3732*fcf3ce44SJohn Forte }
3733*fcf3ce44SJohn Forte c_list = c_list->box_next;
3734*fcf3ce44SJohn Forte }
3735*fcf3ce44SJohn Forte if (multi_print_flag) {
3736*fcf3ce44SJohn Forte b_list = b_list->box_next;
3737*fcf3ce44SJohn Forte continue;
3738*fcf3ce44SJohn Forte }
3739*fcf3ce44SJohn Forte (void) fprintf(stdout,
3740*fcf3ce44SJohn Forte MSGSTR(2104, "%s Name:%s Node WWN:%s "),
3741*fcf3ce44SJohn Forte b_list->prod_id_s, b_list->b_name,
3742*fcf3ce44SJohn Forte b_list->b_node_wwn_s);
3743*fcf3ce44SJohn Forte /*
3744*fcf3ce44SJohn Forte * Print logical path on same line if not multipathed.
3745*fcf3ce44SJohn Forte */
3746*fcf3ce44SJohn Forte multi_path_flag = 0;
3747*fcf3ce44SJohn Forte c_list = o_list;
3748*fcf3ce44SJohn Forte while (c_list != NULL) {
3749*fcf3ce44SJohn Forte if ((c_list != b_list) &&
3750*fcf3ce44SJohn Forte (strcmp(c_list->b_node_wwn_s,
3751*fcf3ce44SJohn Forte b_list->b_node_wwn_s) == 0)) {
3752*fcf3ce44SJohn Forte multi_path_flag = 1;
3753*fcf3ce44SJohn Forte }
3754*fcf3ce44SJohn Forte c_list = c_list->box_next;
3755*fcf3ce44SJohn Forte }
3756*fcf3ce44SJohn Forte if (multi_path_flag) {
3757*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n ");
3758*fcf3ce44SJohn Forte }
3759*fcf3ce44SJohn Forte (void) fprintf(stdout,
3760*fcf3ce44SJohn Forte MSGSTR(31, "Logical Path:%s"),
3761*fcf3ce44SJohn Forte b_list->logical_path);
3762*fcf3ce44SJohn Forte
3763*fcf3ce44SJohn Forte if (Options & OPTION_P) {
3764*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n ");
3765*fcf3ce44SJohn Forte (void) fprintf(stdout,
3766*fcf3ce44SJohn Forte MSGSTR(5, "Physical Path:"));
3767*fcf3ce44SJohn Forte (void) fprintf(stdout, "%s",
3768*fcf3ce44SJohn Forte b_list->b_physical_path);
3769*fcf3ce44SJohn Forte }
3770*fcf3ce44SJohn Forte c_list = o_list;
3771*fcf3ce44SJohn Forte while (c_list != NULL) {
3772*fcf3ce44SJohn Forte if ((c_list != b_list) &&
3773*fcf3ce44SJohn Forte (strcmp(c_list->b_node_wwn_s,
3774*fcf3ce44SJohn Forte b_list->b_node_wwn_s) == 0)) {
3775*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n ");
3776*fcf3ce44SJohn Forte (void) fprintf(stdout,
3777*fcf3ce44SJohn Forte MSGSTR(31, "Logical Path:%s"),
3778*fcf3ce44SJohn Forte c_list->logical_path);
3779*fcf3ce44SJohn Forte if (Options & OPTION_P) {
3780*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n ");
3781*fcf3ce44SJohn Forte (void) fprintf(stdout,
3782*fcf3ce44SJohn Forte MSGSTR(5, "Physical Path:"));
3783*fcf3ce44SJohn Forte (void) fprintf(stdout, "%s",
3784*fcf3ce44SJohn Forte c_list->b_physical_path);
3785*fcf3ce44SJohn Forte }
3786*fcf3ce44SJohn Forte }
3787*fcf3ce44SJohn Forte c_list = c_list->box_next;
3788*fcf3ce44SJohn Forte }
3789*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
3790*fcf3ce44SJohn Forte /* Check for duplicate names */
3791*fcf3ce44SJohn Forte if (l_duplicate_names(o_list, b_list->b_node_wwn_s,
3792*fcf3ce44SJohn Forte (char *)b_list->b_name,
3793*fcf3ce44SJohn Forte Options & PVERBOSE)) {
3794*fcf3ce44SJohn Forte duplicate_names_found++;
3795*fcf3ce44SJohn Forte }
3796*fcf3ce44SJohn Forte b_list = b_list->box_next;
3797*fcf3ce44SJohn Forte }
3798*fcf3ce44SJohn Forte }
3799*fcf3ce44SJohn Forte if (duplicate_names_found) {
3800*fcf3ce44SJohn Forte (void) fprintf(stdout,
3801*fcf3ce44SJohn Forte MSGSTR(2105, "\nWARNING: There are enclosures with "
3802*fcf3ce44SJohn Forte "the same names.\n"
3803*fcf3ce44SJohn Forte "You can not use the \"enclosure\""
3804*fcf3ce44SJohn Forte " name to specify these subsystems.\n"
3805*fcf3ce44SJohn Forte "Please use the \"enclosure_name\""
3806*fcf3ce44SJohn Forte " subcommand to select unique names.\n\n"));
3807*fcf3ce44SJohn Forte }
3808*fcf3ce44SJohn Forte (void) l_free_box_list(&b_list);
3809*fcf3ce44SJohn Forte }
3810*fcf3ce44SJohn Forte
3811*fcf3ce44SJohn Forte /*
3812*fcf3ce44SJohn Forte * display_port_status() Prints the device's
3813*fcf3ce44SJohn Forte * port status.
3814*fcf3ce44SJohn Forte *
3815*fcf3ce44SJohn Forte * RETURNS:
3816*fcf3ce44SJohn Forte * none.
3817*fcf3ce44SJohn Forte */
3818*fcf3ce44SJohn Forte void
display_port_status(int d_state_flag)3819*fcf3ce44SJohn Forte display_port_status(int d_state_flag)
3820*fcf3ce44SJohn Forte {
3821*fcf3ce44SJohn Forte
3822*fcf3ce44SJohn Forte if (d_state_flag & L_OPEN_FAIL) {
3823*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(28, "Open Failed"));
3824*fcf3ce44SJohn Forte } else if (d_state_flag & L_NOT_READY) {
3825*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(20, "Not Ready"));
3826*fcf3ce44SJohn Forte } else if (d_state_flag & L_NOT_READABLE) {
3827*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(88, "Not Readable"));
3828*fcf3ce44SJohn Forte } else if (d_state_flag & L_SPUN_DWN_D) {
3829*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(68, "Spun Down"));
3830*fcf3ce44SJohn Forte } else if (d_state_flag & L_SCSI_ERR) {
3831*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(70, "SCSI Error"));
3832*fcf3ce44SJohn Forte } else if (d_state_flag & L_RESERVED) {
3833*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(73, "Reservation conflict"));
3834*fcf3ce44SJohn Forte } else if (d_state_flag & L_NO_LABEL) {
3835*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(92, "No UNIX Label"));
3836*fcf3ce44SJohn Forte } else {
3837*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(29, "O.K."));
3838*fcf3ce44SJohn Forte }
3839*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
3840*fcf3ce44SJohn Forte }
3841*fcf3ce44SJohn Forte
3842*fcf3ce44SJohn Forte /*
3843*fcf3ce44SJohn Forte * Displays individual SENA
3844*fcf3ce44SJohn Forte * FC disk information.
3845*fcf3ce44SJohn Forte *
3846*fcf3ce44SJohn Forte * Caller to this routine should free the storage due to
3847*fcf3ce44SJohn Forte * the use of g_get_dev_map
3848*fcf3ce44SJohn Forte *
3849*fcf3ce44SJohn Forte * RETURNS:
3850*fcf3ce44SJohn Forte * none.
3851*fcf3ce44SJohn Forte */
3852*fcf3ce44SJohn Forte void
display_fc_disk(struct path_struct * path_struct,char * ses_path,gfc_map_t * map,L_inquiry inq,int verbose)3853*fcf3ce44SJohn Forte display_fc_disk(struct path_struct *path_struct, char *ses_path,
3854*fcf3ce44SJohn Forte gfc_map_t *map, L_inquiry inq, int verbose)
3855*fcf3ce44SJohn Forte {
3856*fcf3ce44SJohn Forte static WWN_list *wwn_list = NULL;
3857*fcf3ce44SJohn Forte static char path_phys[MAXPATHLEN];
3858*fcf3ce44SJohn Forte static L_disk_state l_disk_state;
3859*fcf3ce44SJohn Forte static L_inquiry local_inq;
3860*fcf3ce44SJohn Forte static uchar_t node_wwn[WWN_SIZE];
3861*fcf3ce44SJohn Forte char same_path_phys = B_FALSE; /* To chk for repeat args */
3862*fcf3ce44SJohn Forte uchar_t port_wwn[WWN_SIZE], *pg_buf;
3863*fcf3ce44SJohn Forte char logical_path[MAXPATHLEN];
3864*fcf3ce44SJohn Forte int al_pa, port_a_flag = 0;
3865*fcf3ce44SJohn Forte int offset, mode_data_avail = 0;
3866*fcf3ce44SJohn Forte int no_path_flag = 0, err = 0;
3867*fcf3ce44SJohn Forte L_state l_state;
3868*fcf3ce44SJohn Forte Mode_header_10 *mode_header_ptr = NULL;
3869*fcf3ce44SJohn Forte struct mode_page *pg_hdr;
3870*fcf3ce44SJohn Forte
3871*fcf3ce44SJohn Forte /*
3872*fcf3ce44SJohn Forte * Do a quick check to see if its the same path as in last call.
3873*fcf3ce44SJohn Forte * path_phys is a static array and so dont worry about its
3874*fcf3ce44SJohn Forte * initialization.
3875*fcf3ce44SJohn Forte */
3876*fcf3ce44SJohn Forte if (strcmp(path_phys, path_struct->p_physical_path) == 0)
3877*fcf3ce44SJohn Forte same_path_phys = B_TRUE;
3878*fcf3ce44SJohn Forte
3879*fcf3ce44SJohn Forte (void) strcpy(path_phys, path_struct->p_physical_path);
3880*fcf3ce44SJohn Forte (void) memset((char *)logical_path, 0, sizeof (logical_path));
3881*fcf3ce44SJohn Forte
3882*fcf3ce44SJohn Forte /*
3883*fcf3ce44SJohn Forte * slot_valid is 1 when argument is of the form 'enclosure,[f|r]<n>'.
3884*fcf3ce44SJohn Forte * If slot_valid != 1, g_get_dev_map and l_get_ses_path would
3885*fcf3ce44SJohn Forte * already have been called
3886*fcf3ce44SJohn Forte */
3887*fcf3ce44SJohn Forte if (path_struct->slot_valid == 1) {
3888*fcf3ce44SJohn Forte /* Get the location information. */
3889*fcf3ce44SJohn Forte if (err = g_get_dev_map(path_phys, map, (Options & PVERBOSE))) {
3890*fcf3ce44SJohn Forte (void) print_errString(err, path_phys);
3891*fcf3ce44SJohn Forte exit(-1);
3892*fcf3ce44SJohn Forte }
3893*fcf3ce44SJohn Forte if (err = l_get_ses_path(path_phys, ses_path, map,
3894*fcf3ce44SJohn Forte (Options & PVERBOSE))) {
3895*fcf3ce44SJohn Forte (void) print_errString(err, path_phys);
3896*fcf3ce44SJohn Forte exit(-1);
3897*fcf3ce44SJohn Forte }
3898*fcf3ce44SJohn Forte }
3899*fcf3ce44SJohn Forte
3900*fcf3ce44SJohn Forte /*
3901*fcf3ce44SJohn Forte * Get the WWN for our disk if we already haven't or if there was an
3902*fcf3ce44SJohn Forte * error earlier
3903*fcf3ce44SJohn Forte */
3904*fcf3ce44SJohn Forte if (same_path_phys == B_FALSE) {
3905*fcf3ce44SJohn Forte if (err = g_get_wwn(path_phys, port_wwn, node_wwn,
3906*fcf3ce44SJohn Forte &al_pa, (Options & PVERBOSE))) {
3907*fcf3ce44SJohn Forte (void) print_errString(err, path_phys);
3908*fcf3ce44SJohn Forte exit(-1);
3909*fcf3ce44SJohn Forte }
3910*fcf3ce44SJohn Forte
3911*fcf3ce44SJohn Forte if (err = g_get_inquiry(ses_path, &local_inq)) {
3912*fcf3ce44SJohn Forte (void) print_errString(err, ses_path);
3913*fcf3ce44SJohn Forte exit(-1);
3914*fcf3ce44SJohn Forte }
3915*fcf3ce44SJohn Forte }
3916*fcf3ce44SJohn Forte
3917*fcf3ce44SJohn Forte /*
3918*fcf3ce44SJohn Forte * We are interested only a couple of ib_tbl fields and
3919*fcf3ce44SJohn Forte * those get filled using l_get_ib_status.
3920*fcf3ce44SJohn Forte * Note that NOT ALL of ib_tbl fields get filled here
3921*fcf3ce44SJohn Forte */
3922*fcf3ce44SJohn Forte if ((err = l_get_ib_status(ses_path, &l_state,
3923*fcf3ce44SJohn Forte Options & PVERBOSE)) != 0) {
3924*fcf3ce44SJohn Forte (void) print_errString(err, ses_path);
3925*fcf3ce44SJohn Forte exit(-1);
3926*fcf3ce44SJohn Forte }
3927*fcf3ce44SJohn Forte
3928*fcf3ce44SJohn Forte /*
3929*fcf3ce44SJohn Forte * Get path to all the FC disk and tape devices.
3930*fcf3ce44SJohn Forte * if we haven't already done so in a previous pass
3931*fcf3ce44SJohn Forte */
3932*fcf3ce44SJohn Forte if ((wwn_list == NULL) && (err = g_get_wwn_list(&wwn_list, verbose))) {
3933*fcf3ce44SJohn Forte (void) print_errString(err, ses_path);
3934*fcf3ce44SJohn Forte exit(-1); /* Failure */
3935*fcf3ce44SJohn Forte }
3936*fcf3ce44SJohn Forte
3937*fcf3ce44SJohn Forte /*
3938*fcf3ce44SJohn Forte * Get the disk status if it is a different path_phys from
3939*fcf3ce44SJohn Forte * last time.
3940*fcf3ce44SJohn Forte */
3941*fcf3ce44SJohn Forte if (same_path_phys == B_FALSE) {
3942*fcf3ce44SJohn Forte (void) memset(&l_disk_state, 0,
3943*fcf3ce44SJohn Forte sizeof (struct l_disk_state_struct));
3944*fcf3ce44SJohn Forte if (err = l_get_disk_status(path_phys, &l_disk_state,
3945*fcf3ce44SJohn Forte wwn_list, (Options & PVERBOSE))) {
3946*fcf3ce44SJohn Forte (void) print_errString(err, path_phys);
3947*fcf3ce44SJohn Forte exit(-1);
3948*fcf3ce44SJohn Forte }
3949*fcf3ce44SJohn Forte }
3950*fcf3ce44SJohn Forte
3951*fcf3ce44SJohn Forte if (l_disk_state.l_state_flag & L_NO_PATH_FOUND) {
3952*fcf3ce44SJohn Forte (void) fprintf(stderr, MSGSTR(2106,
3953*fcf3ce44SJohn Forte "\nWARNING: No path found "
3954*fcf3ce44SJohn Forte "in /dev/rdsk directory\n"
3955*fcf3ce44SJohn Forte " Please check the logical links in /dev/rdsk\n"
3956*fcf3ce44SJohn Forte " (It may be necessary to run the \"disks\" "
3957*fcf3ce44SJohn Forte "program.)\n\n"));
3958*fcf3ce44SJohn Forte
3959*fcf3ce44SJohn Forte /* Just call to get the status directly. */
3960*fcf3ce44SJohn Forte if (err = l_get_port(ses_path, &port_a_flag, verbose)) {
3961*fcf3ce44SJohn Forte (void) print_errString(err, ses_path);
3962*fcf3ce44SJohn Forte exit(-1);
3963*fcf3ce44SJohn Forte }
3964*fcf3ce44SJohn Forte if (err = l_get_disk_port_status(path_phys,
3965*fcf3ce44SJohn Forte &l_disk_state, port_a_flag,
3966*fcf3ce44SJohn Forte (Options & PVERBOSE))) {
3967*fcf3ce44SJohn Forte (void) print_errString(err, path_phys);
3968*fcf3ce44SJohn Forte exit(-1);
3969*fcf3ce44SJohn Forte }
3970*fcf3ce44SJohn Forte no_path_flag++;
3971*fcf3ce44SJohn Forte }
3972*fcf3ce44SJohn Forte
3973*fcf3ce44SJohn Forte if (strlen(l_disk_state.g_disk_state.node_wwn_s) == 0) {
3974*fcf3ce44SJohn Forte (void) sprintf(l_disk_state.g_disk_state.node_wwn_s,
3975*fcf3ce44SJohn Forte "%1.2x%1.2x%1.2x%1.2x%1.2x%1.2x%1.2x%1.2x",
3976*fcf3ce44SJohn Forte node_wwn[0], node_wwn[1], node_wwn[2], node_wwn[3],
3977*fcf3ce44SJohn Forte node_wwn[4], node_wwn[5], node_wwn[6], node_wwn[7]);
3978*fcf3ce44SJohn Forte }
3979*fcf3ce44SJohn Forte
3980*fcf3ce44SJohn Forte /* get mode page information for FC device */
3981*fcf3ce44SJohn Forte if (l_get_mode_pg(path_phys, &pg_buf, Options & PVERBOSE) == 0) {
3982*fcf3ce44SJohn Forte mode_header_ptr = (struct mode_header_10_struct *)(int)pg_buf;
3983*fcf3ce44SJohn Forte pg_hdr = ((struct mode_page *)((int)pg_buf +
3984*fcf3ce44SJohn Forte (uchar_t)sizeof (struct mode_header_10_struct) +
3985*fcf3ce44SJohn Forte (uchar_t *)(uintptr_t)(mode_header_ptr->bdesc_length)));
3986*fcf3ce44SJohn Forte offset = sizeof (struct mode_header_10_struct) +
3987*fcf3ce44SJohn Forte mode_header_ptr->bdesc_length;
3988*fcf3ce44SJohn Forte while (offset < (mode_header_ptr->length +
3989*fcf3ce44SJohn Forte sizeof (mode_header_ptr->length)) &&
3990*fcf3ce44SJohn Forte !mode_data_avail) {
3991*fcf3ce44SJohn Forte if (pg_hdr->code == MODEPAGE_CACHING) {
3992*fcf3ce44SJohn Forte mode_data_avail++;
3993*fcf3ce44SJohn Forte break;
3994*fcf3ce44SJohn Forte }
3995*fcf3ce44SJohn Forte offset += pg_hdr->length + sizeof (struct mode_page);
3996*fcf3ce44SJohn Forte pg_hdr = ((struct mode_page *)((int)pg_buf +
3997*fcf3ce44SJohn Forte (uchar_t)offset));
3998*fcf3ce44SJohn Forte }
3999*fcf3ce44SJohn Forte }
4000*fcf3ce44SJohn Forte
4001*fcf3ce44SJohn Forte switch ((inq.inq_dtype & DTYPE_MASK)) {
4002*fcf3ce44SJohn Forte case DTYPE_DIRECT:
4003*fcf3ce44SJohn Forte fprintf(stdout, MSGSTR(121, "DEVICE PROPERTIES for disk: %s\n"),
4004*fcf3ce44SJohn Forte path_struct->argv);
4005*fcf3ce44SJohn Forte break;
4006*fcf3ce44SJohn Forte case DTYPE_SEQUENTIAL: /* Tape */
4007*fcf3ce44SJohn Forte fprintf(stdout, MSGSTR(2249, "DEVICE PROPERTIES for tape: %s\n"),
4008*fcf3ce44SJohn Forte path_struct->argv);
4009*fcf3ce44SJohn Forte break;
4010*fcf3ce44SJohn Forte default:
4011*fcf3ce44SJohn Forte fprintf(stdout, MSGSTR(2250, "DEVICE PROPERTIES for: %s\n"),
4012*fcf3ce44SJohn Forte path_struct->argv);
4013*fcf3ce44SJohn Forte break;
4014*fcf3ce44SJohn Forte }
4015*fcf3ce44SJohn Forte
4016*fcf3ce44SJohn Forte if (l_disk_state.g_disk_state.port_a_valid) {
4017*fcf3ce44SJohn Forte (void) fprintf(stdout, " ");
4018*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(141, "Status(Port A):"));
4019*fcf3ce44SJohn Forte (void) fprintf(stdout, "\t");
4020*fcf3ce44SJohn Forte display_port_status(
4021*fcf3ce44SJohn Forte l_disk_state.g_disk_state.d_state_flags[PORT_A]);
4022*fcf3ce44SJohn Forte } else {
4023*fcf3ce44SJohn Forte if (path_struct->f_flag) {
4024*fcf3ce44SJohn Forte if ((ib_present_chk(&l_state, 0) == 1) &&
4025*fcf3ce44SJohn Forte (l_state.drv_front[path_struct->slot].ib_status.bypass_a_en)) {
4026*fcf3ce44SJohn Forte (void) fprintf(stdout,
4027*fcf3ce44SJohn Forte MSGSTR(66,
4028*fcf3ce44SJohn Forte " Status(Port A):\tBYPASSED\n"));
4029*fcf3ce44SJohn Forte }
4030*fcf3ce44SJohn Forte } else {
4031*fcf3ce44SJohn Forte if ((ib_present_chk(&l_state, 0) == 1) &&
4032*fcf3ce44SJohn Forte (l_state.drv_rear[path_struct->slot].ib_status.bypass_a_en)) {
4033*fcf3ce44SJohn Forte (void) fprintf(stdout,
4034*fcf3ce44SJohn Forte MSGSTR(66,
4035*fcf3ce44SJohn Forte " Status(Port A):\tBYPASSED\n"));
4036*fcf3ce44SJohn Forte }
4037*fcf3ce44SJohn Forte }
4038*fcf3ce44SJohn Forte }
4039*fcf3ce44SJohn Forte
4040*fcf3ce44SJohn Forte if (l_disk_state.g_disk_state.port_b_valid) {
4041*fcf3ce44SJohn Forte (void) fprintf(stdout, " ");
4042*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(142, "Status(Port B):"));
4043*fcf3ce44SJohn Forte (void) fprintf(stdout, "\t");
4044*fcf3ce44SJohn Forte display_port_status(l_disk_state.g_disk_state.d_state_flags[PORT_B]);
4045*fcf3ce44SJohn Forte } else {
4046*fcf3ce44SJohn Forte if (path_struct->f_flag) {
4047*fcf3ce44SJohn Forte if ((ib_present_chk(&l_state, 1) == 1) &&
4048*fcf3ce44SJohn Forte (l_state.drv_front[path_struct->slot].ib_status.bypass_b_en)) {
4049*fcf3ce44SJohn Forte (void) fprintf(stdout,
4050*fcf3ce44SJohn Forte MSGSTR(65,
4051*fcf3ce44SJohn Forte " Status(Port B):\tBYPASSED\n"));
4052*fcf3ce44SJohn Forte }
4053*fcf3ce44SJohn Forte } else {
4054*fcf3ce44SJohn Forte if ((ib_present_chk(&l_state, 1) == 1) &&
4055*fcf3ce44SJohn Forte (l_state.drv_rear[path_struct->slot].ib_status.bypass_b_en)) {
4056*fcf3ce44SJohn Forte (void) fprintf(stdout,
4057*fcf3ce44SJohn Forte MSGSTR(65,
4058*fcf3ce44SJohn Forte " Status(Port B):\tBYPASSED\n"));
4059*fcf3ce44SJohn Forte }
4060*fcf3ce44SJohn Forte }
4061*fcf3ce44SJohn Forte }
4062*fcf3ce44SJohn Forte
4063*fcf3ce44SJohn Forte if (no_path_flag) {
4064*fcf3ce44SJohn Forte (void) fprintf(stdout, " ");
4065*fcf3ce44SJohn Forte if (port_a_flag != NULL) {
4066*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(142, "Status(Port B):"));
4067*fcf3ce44SJohn Forte } else {
4068*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(141, "Status(Port A):"));
4069*fcf3ce44SJohn Forte }
4070*fcf3ce44SJohn Forte (void) fprintf(stdout, "\t");
4071*fcf3ce44SJohn Forte display_port_status(
4072*fcf3ce44SJohn Forte l_disk_state.g_disk_state.d_state_flags[port_a_flag]);
4073*fcf3ce44SJohn Forte } else if ((!l_disk_state.g_disk_state.port_a_valid) &&
4074*fcf3ce44SJohn Forte (!l_disk_state.g_disk_state.port_b_valid)) {
4075*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2107, " Status:\t\t"
4076*fcf3ce44SJohn Forte "No state available.\n"));
4077*fcf3ce44SJohn Forte }
4078*fcf3ce44SJohn Forte
4079*fcf3ce44SJohn Forte (void) display_disk_info(inq, l_disk_state, path_struct, pg_hdr,
4080*fcf3ce44SJohn Forte mode_data_avail, (char *)local_inq.inq_box_name, verbose);
4081*fcf3ce44SJohn Forte }
4082*fcf3ce44SJohn Forte
4083*fcf3ce44SJohn Forte
4084*fcf3ce44SJohn Forte
4085*fcf3ce44SJohn Forte
4086*fcf3ce44SJohn Forte
4087*fcf3ce44SJohn Forte /*
4088*fcf3ce44SJohn Forte * non_encl_fc_disk_display() Prints the device specific
4089*fcf3ce44SJohn Forte * information for an individual fcal device.
4090*fcf3ce44SJohn Forte *
4091*fcf3ce44SJohn Forte * RETURNS:
4092*fcf3ce44SJohn Forte * none.
4093*fcf3ce44SJohn Forte */
4094*fcf3ce44SJohn Forte static int
non_encl_fc_disk_display(Path_struct * path_struct,L_inquiry inq_struct,int verbose)4095*fcf3ce44SJohn Forte non_encl_fc_disk_display(Path_struct *path_struct,
4096*fcf3ce44SJohn Forte L_inquiry inq_struct, int verbose)
4097*fcf3ce44SJohn Forte {
4098*fcf3ce44SJohn Forte
4099*fcf3ce44SJohn Forte char phys_path[MAXPATHLEN];
4100*fcf3ce44SJohn Forte uchar_t node_wwn[WWN_SIZE], port_wwn[WWN_SIZE], *pg_buf = NULL;
4101*fcf3ce44SJohn Forte L_disk_state l_disk_state;
4102*fcf3ce44SJohn Forte struct dlist *mlist;
4103*fcf3ce44SJohn Forte int i = 0, al_pa, offset, mode_data_avail = 0, err = 0;
4104*fcf3ce44SJohn Forte int path_a_found = 0, path_b_found = 0, argpwwn = 0,
4105*fcf3ce44SJohn Forte argnwwn = 0, pathcnt = 1;
4106*fcf3ce44SJohn Forte L_inquiry local_inq;
4107*fcf3ce44SJohn Forte Mode_header_10 *mode_header_ptr;
4108*fcf3ce44SJohn Forte struct mode_page *pg_hdr;
4109*fcf3ce44SJohn Forte WWN_list *wwn_list, *wwn_list_ptr, *list_start;
4110*fcf3ce44SJohn Forte char temppath[MAXPATHLEN], last_logical_path[MAXPATHLEN];
4111*fcf3ce44SJohn Forte mp_pathlist_t pathlist;
4112*fcf3ce44SJohn Forte
4113*fcf3ce44SJohn Forte (void) strcpy(phys_path, path_struct->p_physical_path);
4114*fcf3ce44SJohn Forte
4115*fcf3ce44SJohn Forte /* Get path to all the FC disk and tape devices. */
4116*fcf3ce44SJohn Forte if (err = g_get_wwn_list(&wwn_list, verbose)) {
4117*fcf3ce44SJohn Forte return (err);
4118*fcf3ce44SJohn Forte }
4119*fcf3ce44SJohn Forte
4120*fcf3ce44SJohn Forte g_sort_wwn_list(&wwn_list);
4121*fcf3ce44SJohn Forte
4122*fcf3ce44SJohn Forte list_start = wwn_list;
4123*fcf3ce44SJohn Forte (void) strcpy(last_logical_path, phys_path);
4124*fcf3ce44SJohn Forte
4125*fcf3ce44SJohn Forte for (wwn_list_ptr = wwn_list; wwn_list_ptr != NULL;
4126*fcf3ce44SJohn Forte wwn_list_ptr = wwn_list_ptr->wwn_next) {
4127*fcf3ce44SJohn Forte if (strcasecmp(wwn_list_ptr->port_wwn_s,
4128*fcf3ce44SJohn Forte path_struct->argv) == 0) {
4129*fcf3ce44SJohn Forte list_start = wwn_list_ptr;
4130*fcf3ce44SJohn Forte argpwwn = 1;
4131*fcf3ce44SJohn Forte break;
4132*fcf3ce44SJohn Forte } else if (strcasecmp(wwn_list_ptr->node_wwn_s,
4133*fcf3ce44SJohn Forte path_struct->argv) == 0) {
4134*fcf3ce44SJohn Forte list_start = wwn_list_ptr;
4135*fcf3ce44SJohn Forte argnwwn = 1;
4136*fcf3ce44SJohn Forte break;
4137*fcf3ce44SJohn Forte }
4138*fcf3ce44SJohn Forte }
4139*fcf3ce44SJohn Forte
4140*fcf3ce44SJohn Forte for (wwn_list_ptr = list_start; wwn_list_ptr != NULL;
4141*fcf3ce44SJohn Forte wwn_list_ptr = wwn_list_ptr->wwn_next) {
4142*fcf3ce44SJohn Forte
4143*fcf3ce44SJohn Forte
4144*fcf3ce44SJohn Forte if (argpwwn) {
4145*fcf3ce44SJohn Forte if (strcasecmp(wwn_list_ptr->port_wwn_s,
4146*fcf3ce44SJohn Forte path_struct->argv) != 0) {
4147*fcf3ce44SJohn Forte continue;
4148*fcf3ce44SJohn Forte }
4149*fcf3ce44SJohn Forte (void) strcpy(phys_path, wwn_list_ptr->physical_path);
4150*fcf3ce44SJohn Forte path_a_found = 0;
4151*fcf3ce44SJohn Forte path_b_found = 0;
4152*fcf3ce44SJohn Forte mode_data_avail = 0;
4153*fcf3ce44SJohn Forte } else if (argnwwn) {
4154*fcf3ce44SJohn Forte if (strstr(wwn_list_ptr->logical_path,
4155*fcf3ce44SJohn Forte last_logical_path) != NULL) {
4156*fcf3ce44SJohn Forte continue;
4157*fcf3ce44SJohn Forte }
4158*fcf3ce44SJohn Forte if (strcasecmp(wwn_list_ptr->node_wwn_s,
4159*fcf3ce44SJohn Forte path_struct->argv) != 0) {
4160*fcf3ce44SJohn Forte continue;
4161*fcf3ce44SJohn Forte }
4162*fcf3ce44SJohn Forte (void) strcpy(phys_path, wwn_list_ptr->physical_path);
4163*fcf3ce44SJohn Forte (void) strcpy(last_logical_path,
4164*fcf3ce44SJohn Forte wwn_list_ptr->logical_path);
4165*fcf3ce44SJohn Forte path_a_found = 0;
4166*fcf3ce44SJohn Forte path_b_found = 0;
4167*fcf3ce44SJohn Forte mode_data_avail = 0;
4168*fcf3ce44SJohn Forte }
4169*fcf3ce44SJohn Forte
4170*fcf3ce44SJohn Forte (void) memset(&l_disk_state, 0, sizeof (struct l_disk_state_struct));
4171*fcf3ce44SJohn Forte
4172*fcf3ce44SJohn Forte if ((err = g_get_multipath(phys_path,
4173*fcf3ce44SJohn Forte &(l_disk_state.g_disk_state.multipath_list),
4174*fcf3ce44SJohn Forte wwn_list, verbose)) != 0) {
4175*fcf3ce44SJohn Forte return (err);
4176*fcf3ce44SJohn Forte }
4177*fcf3ce44SJohn Forte mlist = l_disk_state.g_disk_state.multipath_list;
4178*fcf3ce44SJohn Forte if (mlist == NULL) {
4179*fcf3ce44SJohn Forte l_disk_state.l_state_flag = L_NO_PATH_FOUND;
4180*fcf3ce44SJohn Forte N_DPRINTF(" non_encl_fc_disk_display: Error finding"
4181*fcf3ce44SJohn Forte " multiple paths to the disk.\n");
4182*fcf3ce44SJohn Forte (void) g_free_wwn_list(&wwn_list);
4183*fcf3ce44SJohn Forte return (-1);
4184*fcf3ce44SJohn Forte }
4185*fcf3ce44SJohn Forte
4186*fcf3ce44SJohn Forte /* get mode page information for FC device */
4187*fcf3ce44SJohn Forte if (l_get_mode_pg(phys_path, &pg_buf, verbose) == 0) {
4188*fcf3ce44SJohn Forte mode_header_ptr = (struct mode_header_10_struct *)(int)pg_buf;
4189*fcf3ce44SJohn Forte pg_hdr = ((struct mode_page *)((int)pg_buf +
4190*fcf3ce44SJohn Forte (uchar_t)sizeof (struct mode_header_10_struct) +
4191*fcf3ce44SJohn Forte (uchar_t *)(uintptr_t)(mode_header_ptr->bdesc_length)));
4192*fcf3ce44SJohn Forte offset = sizeof (struct mode_header_10_struct) +
4193*fcf3ce44SJohn Forte mode_header_ptr->bdesc_length;
4194*fcf3ce44SJohn Forte while (offset < (mode_header_ptr->length +
4195*fcf3ce44SJohn Forte sizeof (mode_header_ptr->length)) &&
4196*fcf3ce44SJohn Forte !mode_data_avail) {
4197*fcf3ce44SJohn Forte if (pg_hdr->code == MODEPAGE_CACHING) {
4198*fcf3ce44SJohn Forte mode_data_avail++;
4199*fcf3ce44SJohn Forte break;
4200*fcf3ce44SJohn Forte }
4201*fcf3ce44SJohn Forte offset += pg_hdr->length + sizeof (struct mode_page);
4202*fcf3ce44SJohn Forte pg_hdr = ((struct mode_page *)((int)pg_buf +
4203*fcf3ce44SJohn Forte (uchar_t)offset));
4204*fcf3ce44SJohn Forte }
4205*fcf3ce44SJohn Forte }
4206*fcf3ce44SJohn Forte
4207*fcf3ce44SJohn Forte switch ((inq_struct.inq_dtype & DTYPE_MASK)) {
4208*fcf3ce44SJohn Forte case DTYPE_DIRECT:
4209*fcf3ce44SJohn Forte fprintf(stdout, MSGSTR(121, "DEVICE PROPERTIES for disk: %s\n"),
4210*fcf3ce44SJohn Forte path_struct->argv);
4211*fcf3ce44SJohn Forte break;
4212*fcf3ce44SJohn Forte case DTYPE_SEQUENTIAL: /* Tape */
4213*fcf3ce44SJohn Forte fprintf(stdout, MSGSTR(2249, "DEVICE PROPERTIES for tape: %s\n"),
4214*fcf3ce44SJohn Forte path_struct->argv);
4215*fcf3ce44SJohn Forte break;
4216*fcf3ce44SJohn Forte default:
4217*fcf3ce44SJohn Forte fprintf(stdout, MSGSTR(2250, "DEVICE PROPERTIES for: %s\n"),
4218*fcf3ce44SJohn Forte path_struct->argv);
4219*fcf3ce44SJohn Forte break;
4220*fcf3ce44SJohn Forte }
4221*fcf3ce44SJohn Forte while ((mlist != NULL) && (!(path_a_found && path_b_found))) {
4222*fcf3ce44SJohn Forte (void) strcpy(phys_path, mlist->dev_path);
4223*fcf3ce44SJohn Forte if (err = g_get_inquiry(phys_path, &local_inq)) {
4224*fcf3ce44SJohn Forte (void) fprintf(stderr,
4225*fcf3ce44SJohn Forte MSGSTR(2114,
4226*fcf3ce44SJohn Forte "non_encl_fc_disk_display: Inquiry failed\n"));
4227*fcf3ce44SJohn Forte (void) print_errString(err, phys_path);
4228*fcf3ce44SJohn Forte (void) g_free_multipath(
4229*fcf3ce44SJohn Forte l_disk_state.g_disk_state.multipath_list);
4230*fcf3ce44SJohn Forte (void) g_free_wwn_list(&wwn_list);
4231*fcf3ce44SJohn Forte return (-1);
4232*fcf3ce44SJohn Forte }
4233*fcf3ce44SJohn Forte if ((err = g_get_wwn(mlist->dev_path, port_wwn, node_wwn,
4234*fcf3ce44SJohn Forte &al_pa, verbose)) != 0) {
4235*fcf3ce44SJohn Forte (void) print_errString(err, mlist->dev_path);
4236*fcf3ce44SJohn Forte (void) g_free_multipath(
4237*fcf3ce44SJohn Forte l_disk_state.g_disk_state.multipath_list);
4238*fcf3ce44SJohn Forte (void) g_free_wwn_list(&wwn_list);
4239*fcf3ce44SJohn Forte return (-1);
4240*fcf3ce44SJohn Forte }
4241*fcf3ce44SJohn Forte if (strlen(l_disk_state.g_disk_state.node_wwn_s) == 0) {
4242*fcf3ce44SJohn Forte (void) sprintf(l_disk_state.g_disk_state.node_wwn_s,
4243*fcf3ce44SJohn Forte "%1.2x%1.2x%1.2x%1.2x%1.2x%1.2x%1.2x%1.2x",
4244*fcf3ce44SJohn Forte node_wwn[0], node_wwn[1], node_wwn[2], node_wwn[3],
4245*fcf3ce44SJohn Forte node_wwn[4], node_wwn[5], node_wwn[6], node_wwn[7]);
4246*fcf3ce44SJohn Forte }
4247*fcf3ce44SJohn Forte if ((err = l_get_disk_port_status(phys_path, &l_disk_state,
4248*fcf3ce44SJohn Forte (local_inq.inq_port) ? FC_PORT_B : FC_PORT_A,
4249*fcf3ce44SJohn Forte verbose)) != 0) {
4250*fcf3ce44SJohn Forte (void) print_errString(err, phys_path);
4251*fcf3ce44SJohn Forte (void) g_free_multipath(
4252*fcf3ce44SJohn Forte l_disk_state.g_disk_state.multipath_list);
4253*fcf3ce44SJohn Forte exit(-1);
4254*fcf3ce44SJohn Forte }
4255*fcf3ce44SJohn Forte
4256*fcf3ce44SJohn Forte if ((!local_inq.inq_port) && (!path_a_found)) {
4257*fcf3ce44SJohn Forte (void) sprintf(l_disk_state.g_disk_state.port_a_wwn_s,
4258*fcf3ce44SJohn Forte "%1.2x%1.2x%1.2x%1.2x%1.2x%1.2x%1.2x%1.2x",
4259*fcf3ce44SJohn Forte port_wwn[0], port_wwn[1], port_wwn[2], port_wwn[3],
4260*fcf3ce44SJohn Forte port_wwn[4], port_wwn[5], port_wwn[6], port_wwn[7]);
4261*fcf3ce44SJohn Forte path_a_found = l_disk_state.g_disk_state.port_a_valid = 1;
4262*fcf3ce44SJohn Forte }
4263*fcf3ce44SJohn Forte if ((local_inq.inq_port) && (!path_b_found)) {
4264*fcf3ce44SJohn Forte path_b_found = l_disk_state.g_disk_state.port_b_valid = 1;
4265*fcf3ce44SJohn Forte (void) sprintf(l_disk_state.g_disk_state.port_b_wwn_s,
4266*fcf3ce44SJohn Forte "%1.2x%1.2x%1.2x%1.2x%1.2x%1.2x%1.2x%1.2x",
4267*fcf3ce44SJohn Forte port_wwn[0], port_wwn[1], port_wwn[2], port_wwn[3],
4268*fcf3ce44SJohn Forte port_wwn[4], port_wwn[5], port_wwn[6], port_wwn[7]);
4269*fcf3ce44SJohn Forte }
4270*fcf3ce44SJohn Forte
4271*fcf3ce44SJohn Forte if ((strstr(mlist->dev_path, SCSI_VHCI) != NULL) &&
4272*fcf3ce44SJohn Forte (!l_get_disk_port_status(phys_path, &l_disk_state,
4273*fcf3ce44SJohn Forte (!local_inq.inq_port) ? FC_PORT_B : FC_PORT_A,
4274*fcf3ce44SJohn Forte verbose))) {
4275*fcf3ce44SJohn Forte (void) strcpy(temppath, mlist->dev_path);
4276*fcf3ce44SJohn Forte if (err = g_get_pathlist(temppath, &pathlist)) {
4277*fcf3ce44SJohn Forte (void) print_errString(err, NULL);
4278*fcf3ce44SJohn Forte exit(-1);
4279*fcf3ce44SJohn Forte }
4280*fcf3ce44SJohn Forte pathcnt = pathlist.path_count;
4281*fcf3ce44SJohn Forte if (pathcnt > 1) {
4282*fcf3ce44SJohn Forte for (i = 0; i < pathcnt; i++) {
4283*fcf3ce44SJohn Forte if ((!path_a_found) &&
4284*fcf3ce44SJohn Forte (path_b_found) &&
4285*fcf3ce44SJohn Forte (strstr(pathlist.path_info[i].
4286*fcf3ce44SJohn Forte path_addr,
4287*fcf3ce44SJohn Forte l_disk_state.g_disk_state.
4288*fcf3ce44SJohn Forte port_b_wwn_s) == NULL)) {
4289*fcf3ce44SJohn Forte
4290*fcf3ce44SJohn Forte (void) strncpy(l_disk_state.
4291*fcf3ce44SJohn Forte g_disk_state.port_a_wwn_s,
4292*fcf3ce44SJohn Forte pathlist.path_info[i].
4293*fcf3ce44SJohn Forte path_addr, 16);
4294*fcf3ce44SJohn Forte path_a_found = l_disk_state.
4295*fcf3ce44SJohn Forte g_disk_state.port_a_valid = 1;
4296*fcf3ce44SJohn Forte }
4297*fcf3ce44SJohn Forte if ((path_a_found) &&
4298*fcf3ce44SJohn Forte (!path_b_found) &&
4299*fcf3ce44SJohn Forte (strstr(pathlist.path_info[i].
4300*fcf3ce44SJohn Forte path_addr,
4301*fcf3ce44SJohn Forte l_disk_state.g_disk_state.
4302*fcf3ce44SJohn Forte port_a_wwn_s) == NULL)) {
4303*fcf3ce44SJohn Forte
4304*fcf3ce44SJohn Forte (void) strncpy(l_disk_state.
4305*fcf3ce44SJohn Forte g_disk_state.port_b_wwn_s,
4306*fcf3ce44SJohn Forte pathlist.path_info[i].
4307*fcf3ce44SJohn Forte path_addr, 16);
4308*fcf3ce44SJohn Forte path_b_found = l_disk_state.
4309*fcf3ce44SJohn Forte g_disk_state.port_b_valid = 1;
4310*fcf3ce44SJohn Forte }
4311*fcf3ce44SJohn Forte if ((path_a_found) && (path_b_found)) {
4312*fcf3ce44SJohn Forte break;
4313*fcf3ce44SJohn Forte }
4314*fcf3ce44SJohn Forte }
4315*fcf3ce44SJohn Forte }
4316*fcf3ce44SJohn Forte free(pathlist.path_info);
4317*fcf3ce44SJohn Forte }
4318*fcf3ce44SJohn Forte
4319*fcf3ce44SJohn Forte mlist = mlist->next;
4320*fcf3ce44SJohn Forte }
4321*fcf3ce44SJohn Forte
4322*fcf3ce44SJohn Forte if (l_disk_state.g_disk_state.port_a_valid) {
4323*fcf3ce44SJohn Forte (void) fprintf(stdout, " ");
4324*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(141, "Status(Port A):"));
4325*fcf3ce44SJohn Forte (void) fprintf(stdout, "\t");
4326*fcf3ce44SJohn Forte display_port_status(l_disk_state.g_disk_state.d_state_flags[FC_PORT_A]);
4327*fcf3ce44SJohn Forte }
4328*fcf3ce44SJohn Forte
4329*fcf3ce44SJohn Forte if (l_disk_state.g_disk_state.port_b_valid) {
4330*fcf3ce44SJohn Forte (void) fprintf(stdout, " ");
4331*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(142, "Status(Port B):"));
4332*fcf3ce44SJohn Forte (void) fprintf(stdout, "\t");
4333*fcf3ce44SJohn Forte display_port_status(l_disk_state.g_disk_state.d_state_flags[FC_PORT_B]);
4334*fcf3ce44SJohn Forte }
4335*fcf3ce44SJohn Forte
4336*fcf3ce44SJohn Forte (void) display_disk_info(local_inq, l_disk_state, path_struct,
4337*fcf3ce44SJohn Forte pg_hdr, mode_data_avail, NULL, verbose);
4338*fcf3ce44SJohn Forte (void) g_free_multipath(l_disk_state.g_disk_state.multipath_list);
4339*fcf3ce44SJohn Forte
4340*fcf3ce44SJohn Forte if (!(argpwwn || argnwwn)) {
4341*fcf3ce44SJohn Forte break;
4342*fcf3ce44SJohn Forte }
4343*fcf3ce44SJohn Forte
4344*fcf3ce44SJohn Forte }
4345*fcf3ce44SJohn Forte (void) g_free_wwn_list(&wwn_list);
4346*fcf3ce44SJohn Forte return (0);
4347*fcf3ce44SJohn Forte }
4348*fcf3ce44SJohn Forte
4349*fcf3ce44SJohn Forte
4350*fcf3ce44SJohn Forte
4351*fcf3ce44SJohn Forte /*
4352*fcf3ce44SJohn Forte * display_disk_info() Prints the device specific information
4353*fcf3ce44SJohn Forte * for any FC_AL disk device.
4354*fcf3ce44SJohn Forte *
4355*fcf3ce44SJohn Forte * RETURNS:
4356*fcf3ce44SJohn Forte * none.
4357*fcf3ce44SJohn Forte */
4358*fcf3ce44SJohn Forte void
display_disk_info(L_inquiry inq,L_disk_state l_disk_state,Path_struct * path_struct,struct mode_page * pg_hdr,int mode_data_avail,char * name_buf,int options)4359*fcf3ce44SJohn Forte display_disk_info(L_inquiry inq, L_disk_state l_disk_state,
4360*fcf3ce44SJohn Forte Path_struct *path_struct, struct mode_page *pg_hdr,
4361*fcf3ce44SJohn Forte int mode_data_avail, char *name_buf, int options)
4362*fcf3ce44SJohn Forte {
4363*fcf3ce44SJohn Forte float num_blks;
4364*fcf3ce44SJohn Forte struct dlist *mlist;
4365*fcf3ce44SJohn Forte int port_a, port_b;
4366*fcf3ce44SJohn Forte struct my_mode_caching *pg8_buf;
4367*fcf3ce44SJohn Forte L_inquiry enc_inq;
4368*fcf3ce44SJohn Forte char *enc_phys_path;
4369*fcf3ce44SJohn Forte Path_struct *enc_path_struct;
4370*fcf3ce44SJohn Forte int enc_type = 0;
4371*fcf3ce44SJohn Forte L_inquiry80 inq80;
4372*fcf3ce44SJohn Forte size_t serial_len;
4373*fcf3ce44SJohn Forte int err;
4374*fcf3ce44SJohn Forte
4375*fcf3ce44SJohn Forte serial_len = sizeof (inq80.inq_serial);
4376*fcf3ce44SJohn Forte err = g_get_serial_number(path_struct->p_physical_path,
4377*fcf3ce44SJohn Forte inq80.inq_serial, &serial_len);
4378*fcf3ce44SJohn Forte if (err) {
4379*fcf3ce44SJohn Forte fprintf(stderr, "\n");
4380*fcf3ce44SJohn Forte print_errString(err, path_struct->p_physical_path);
4381*fcf3ce44SJohn Forte fprintf(stderr, "\n");
4382*fcf3ce44SJohn Forte exit(1);
4383*fcf3ce44SJohn Forte }
4384*fcf3ce44SJohn Forte (void) fprintf(stdout, " ");
4385*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(3, "Vendor:"));
4386*fcf3ce44SJohn Forte (void) fprintf(stdout, "\t\t");
4387*fcf3ce44SJohn Forte print_chars(inq.inq_vid, sizeof (inq.inq_vid), 0);
4388*fcf3ce44SJohn Forte
4389*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2115, "\n Product ID:\t\t"));
4390*fcf3ce44SJohn Forte print_chars(inq.inq_pid, sizeof (inq.inq_pid), 0);
4391*fcf3ce44SJohn Forte
4392*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2116, "\n WWN(Node):\t\t%s"),
4393*fcf3ce44SJohn Forte l_disk_state.g_disk_state.node_wwn_s);
4394*fcf3ce44SJohn Forte
4395*fcf3ce44SJohn Forte if (l_disk_state.g_disk_state.port_a_valid) {
4396*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2117, "\n WWN(Port A):\t\t%s"),
4397*fcf3ce44SJohn Forte l_disk_state.g_disk_state.port_a_wwn_s);
4398*fcf3ce44SJohn Forte }
4399*fcf3ce44SJohn Forte if (l_disk_state.g_disk_state.port_b_valid) {
4400*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2118, "\n WWN(Port B):\t\t%s"),
4401*fcf3ce44SJohn Forte l_disk_state.g_disk_state.port_b_wwn_s);
4402*fcf3ce44SJohn Forte }
4403*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n ");
4404*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2119, "Revision:"));
4405*fcf3ce44SJohn Forte (void) fprintf(stdout, "\t\t");
4406*fcf3ce44SJohn Forte print_chars(inq.inq_revision, sizeof (inq.inq_revision), 0);
4407*fcf3ce44SJohn Forte
4408*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n ");
4409*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(17, "Serial Num:"));
4410*fcf3ce44SJohn Forte (void) fprintf(stdout, "\t\t");
4411*fcf3ce44SJohn Forte print_chars(inq80.inq_serial, serial_len, 0);
4412*fcf3ce44SJohn Forte num_blks = l_disk_state.g_disk_state.num_blocks;
4413*fcf3ce44SJohn Forte if (num_blks) {
4414*fcf3ce44SJohn Forte num_blks /= 2048; /* get Mbytes */
4415*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n ");
4416*fcf3ce44SJohn Forte (void) fprintf(stdout,
4417*fcf3ce44SJohn Forte MSGSTR(60,
4418*fcf3ce44SJohn Forte "Unformatted capacity:\t%6.3f MBytes"), num_blks);
4419*fcf3ce44SJohn Forte }
4420*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
4421*fcf3ce44SJohn Forte
4422*fcf3ce44SJohn Forte if (l_disk_state.g_disk_state.persistent_reserv_flag) {
4423*fcf3ce44SJohn Forte (void) fprintf(stdout,
4424*fcf3ce44SJohn Forte MSGSTR(2120, " Persistent Reserve:\t"));
4425*fcf3ce44SJohn Forte if (l_disk_state.g_disk_state.persistent_active) {
4426*fcf3ce44SJohn Forte (void) fprintf(stdout,
4427*fcf3ce44SJohn Forte MSGSTR(39, "Active"));
4428*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
4429*fcf3ce44SJohn Forte }
4430*fcf3ce44SJohn Forte if (l_disk_state.g_disk_state.persistent_registered) {
4431*fcf3ce44SJohn Forte (void) fprintf(stdout,
4432*fcf3ce44SJohn Forte MSGSTR(2121, "Found Registered Keys"));
4433*fcf3ce44SJohn Forte } else {
4434*fcf3ce44SJohn Forte (void) fprintf(stdout,
4435*fcf3ce44SJohn Forte MSGSTR(87, "Not being used"));
4436*fcf3ce44SJohn Forte }
4437*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
4438*fcf3ce44SJohn Forte }
4439*fcf3ce44SJohn Forte
4440*fcf3ce44SJohn Forte if ((mode_data_avail) && (pg_hdr->code == MODEPAGE_CACHING)) {
4441*fcf3ce44SJohn Forte pg8_buf = (struct my_mode_caching *)(int)pg_hdr;
4442*fcf3ce44SJohn Forte if (pg8_buf->wce) {
4443*fcf3ce44SJohn Forte (void) fprintf(stdout,
4444*fcf3ce44SJohn Forte MSGSTR(2122,
4445*fcf3ce44SJohn Forte " Write Cache:\t\t"
4446*fcf3ce44SJohn Forte "Enabled\n"));
4447*fcf3ce44SJohn Forte }
4448*fcf3ce44SJohn Forte if (pg8_buf->rcd == 0) {
4449*fcf3ce44SJohn Forte (void) fprintf(stdout,
4450*fcf3ce44SJohn Forte MSGSTR(2123,
4451*fcf3ce44SJohn Forte " Read Cache:\t\t"
4452*fcf3ce44SJohn Forte "Enabled\n"));
4453*fcf3ce44SJohn Forte (void) fprintf(stdout,
4454*fcf3ce44SJohn Forte MSGSTR(2320,
4455*fcf3ce44SJohn Forte " Minimum prefetch:"
4456*fcf3ce44SJohn Forte "\t0x%x\n"
4457*fcf3ce44SJohn Forte " Maximum prefetch:"
4458*fcf3ce44SJohn Forte "\t0x%x\n"),
4459*fcf3ce44SJohn Forte pg8_buf->min_prefetch,
4460*fcf3ce44SJohn Forte pg8_buf->max_prefetch);
4461*fcf3ce44SJohn Forte }
4462*fcf3ce44SJohn Forte }
4463*fcf3ce44SJohn Forte
4464*fcf3ce44SJohn Forte /*
4465*fcf3ce44SJohn Forte * When /dev/rdsk/cxtxdxsx form of input is specified
4466*fcf3ce44SJohn Forte * for display command the initial library version didn't
4467*fcf3ce44SJohn Forte * display Location information. The change is made
4468*fcf3ce44SJohn Forte * to display the same Location info as the non-library version.
4469*fcf3ce44SJohn Forte */
4470*fcf3ce44SJohn Forte
4471*fcf3ce44SJohn Forte if (name_buf != NULL) {
4472*fcf3ce44SJohn Forte fprintf(stdout, MSGSTR(2125, " Location:\t\t"));
4473*fcf3ce44SJohn Forte if (path_struct->slot_valid) {
4474*fcf3ce44SJohn Forte /*
4475*fcf3ce44SJohn Forte * We have to do another inquiry on the enclosure (name_buf)
4476*fcf3ce44SJohn Forte * to determine if this device is within a daktari, or
4477*fcf3ce44SJohn Forte * a two sided device.
4478*fcf3ce44SJohn Forte */
4479*fcf3ce44SJohn Forte if (!l_convert_name(name_buf, &enc_phys_path,
4480*fcf3ce44SJohn Forte &enc_path_struct, 0)) {
4481*fcf3ce44SJohn Forte if (!g_get_inquiry(enc_phys_path, &enc_inq)) {
4482*fcf3ce44SJohn Forte enc_type = l_get_enc_type(enc_inq);
4483*fcf3ce44SJohn Forte }
4484*fcf3ce44SJohn Forte }
4485*fcf3ce44SJohn Forte /* If either of the above fail, we just assume the default */
4486*fcf3ce44SJohn Forte free(enc_phys_path);
4487*fcf3ce44SJohn Forte free(enc_path_struct);
4488*fcf3ce44SJohn Forte if (enc_type == DAK_ENC_TYPE) {
4489*fcf3ce44SJohn Forte if (path_struct->f_flag) {
4490*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2239,
4491*fcf3ce44SJohn Forte "In slot %d in the enclosure named: %s\n"),
4492*fcf3ce44SJohn Forte path_struct->slot, name_buf);
4493*fcf3ce44SJohn Forte } else {
4494*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2239,
4495*fcf3ce44SJohn Forte "In slot %d in the enclosure named: %s\n"),
4496*fcf3ce44SJohn Forte path_struct->slot + (MAX_DRIVES_DAK/2),
4497*fcf3ce44SJohn Forte name_buf);
4498*fcf3ce44SJohn Forte }
4499*fcf3ce44SJohn Forte } else { /* Default enclosure type */
4500*fcf3ce44SJohn Forte (void) fprintf(stdout, path_struct->f_flag ?
4501*fcf3ce44SJohn Forte MSGSTR(2126,
4502*fcf3ce44SJohn Forte "In slot %d in the Front of the enclosure named: %s\n")
4503*fcf3ce44SJohn Forte : MSGSTR(2127,
4504*fcf3ce44SJohn Forte "In slot %d in the Rear of the enclosure named: %s\n"),
4505*fcf3ce44SJohn Forte path_struct->slot, name_buf);
4506*fcf3ce44SJohn Forte }
4507*fcf3ce44SJohn Forte } else {
4508*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2228,
4509*fcf3ce44SJohn Forte "In the enclosure named: %s\n"),
4510*fcf3ce44SJohn Forte name_buf);
4511*fcf3ce44SJohn Forte }
4512*fcf3ce44SJohn Forte }
4513*fcf3ce44SJohn Forte
4514*fcf3ce44SJohn Forte (void) fprintf(stdout, " %s\t\t%s\n",
4515*fcf3ce44SJohn Forte MSGSTR(35, "Device Type:"),
4516*fcf3ce44SJohn Forte dtype[inq.inq_dtype & DTYPE_MASK]);
4517*fcf3ce44SJohn Forte
4518*fcf3ce44SJohn Forte mlist = l_disk_state.g_disk_state.multipath_list;
4519*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2128, " Path(s):\n"));
4520*fcf3ce44SJohn Forte if (strstr(mlist->dev_path, SCSI_VHCI) != NULL) {
4521*fcf3ce44SJohn Forte (void) fprintf(stdout, " %s\n %s\n",
4522*fcf3ce44SJohn Forte mlist->logical_path, mlist->dev_path);
4523*fcf3ce44SJohn Forte (void) adm_print_pathlist(mlist->dev_path);
4524*fcf3ce44SJohn Forte } else {
4525*fcf3ce44SJohn Forte while (mlist) {
4526*fcf3ce44SJohn Forte (void) fprintf(stdout, " %s\n %s\n",
4527*fcf3ce44SJohn Forte mlist->logical_path, mlist->dev_path);
4528*fcf3ce44SJohn Forte mlist = mlist->next;
4529*fcf3ce44SJohn Forte }
4530*fcf3ce44SJohn Forte }
4531*fcf3ce44SJohn Forte
4532*fcf3ce44SJohn Forte if (Options & OPTION_V) {
4533*fcf3ce44SJohn Forte if (path_struct->slot_valid) {
4534*fcf3ce44SJohn Forte port_a = PORT_A;
4535*fcf3ce44SJohn Forte port_b = PORT_B;
4536*fcf3ce44SJohn Forte } else {
4537*fcf3ce44SJohn Forte port_a = FC_PORT_A;
4538*fcf3ce44SJohn Forte port_b = FC_PORT_B;
4539*fcf3ce44SJohn Forte }
4540*fcf3ce44SJohn Forte /* Only bother if the state is O.K. */
4541*fcf3ce44SJohn Forte if ((l_disk_state.g_disk_state.port_a_valid) &&
4542*fcf3ce44SJohn Forte (l_disk_state.g_disk_state.d_state_flags[port_a] == 0))
4543*fcf3ce44SJohn Forte adm_display_verbose_disk(path_struct->p_physical_path, options);
4544*fcf3ce44SJohn Forte else if ((l_disk_state.g_disk_state.port_b_valid) &&
4545*fcf3ce44SJohn Forte (l_disk_state.g_disk_state.d_state_flags[port_b] == 0))
4546*fcf3ce44SJohn Forte adm_display_verbose_disk(path_struct->p_physical_path, options);
4547*fcf3ce44SJohn Forte }
4548*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
4549*fcf3ce44SJohn Forte
4550*fcf3ce44SJohn Forte }
4551*fcf3ce44SJohn Forte
4552*fcf3ce44SJohn Forte
4553*fcf3ce44SJohn Forte
4554*fcf3ce44SJohn Forte /*
4555*fcf3ce44SJohn Forte * temp_decode() Display temperature bytes 1-3 state.
4556*fcf3ce44SJohn Forte *
4557*fcf3ce44SJohn Forte * RETURNS:
4558*fcf3ce44SJohn Forte * none.
4559*fcf3ce44SJohn Forte */
4560*fcf3ce44SJohn Forte void
temp_decode(Temp_elem_st * temp)4561*fcf3ce44SJohn Forte temp_decode(Temp_elem_st *temp)
4562*fcf3ce44SJohn Forte {
4563*fcf3ce44SJohn Forte if (temp->ot_fail) {
4564*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2129,
4565*fcf3ce44SJohn Forte ": FAILURE - Over Temperature"));
4566*fcf3ce44SJohn Forte }
4567*fcf3ce44SJohn Forte if (temp->ut_fail) {
4568*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2130,
4569*fcf3ce44SJohn Forte ": FAILURE - Under Temperature"));
4570*fcf3ce44SJohn Forte }
4571*fcf3ce44SJohn Forte if (temp->ot_warn) {
4572*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2131,
4573*fcf3ce44SJohn Forte ": WARNING - Over Temperature"));
4574*fcf3ce44SJohn Forte }
4575*fcf3ce44SJohn Forte if (temp->ut_warn) {
4576*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2132,
4577*fcf3ce44SJohn Forte ": WARNING - Under Temperature"));
4578*fcf3ce44SJohn Forte }
4579*fcf3ce44SJohn Forte }
4580*fcf3ce44SJohn Forte
4581*fcf3ce44SJohn Forte
4582*fcf3ce44SJohn Forte
4583*fcf3ce44SJohn Forte /*
4584*fcf3ce44SJohn Forte * disp_degree() Display temperature in Degrees Celsius.
4585*fcf3ce44SJohn Forte *
4586*fcf3ce44SJohn Forte * RETURNS:
4587*fcf3ce44SJohn Forte * none.
4588*fcf3ce44SJohn Forte */
4589*fcf3ce44SJohn Forte void
disp_degree(Temp_elem_st * temp)4590*fcf3ce44SJohn Forte disp_degree(Temp_elem_st *temp)
4591*fcf3ce44SJohn Forte {
4592*fcf3ce44SJohn Forte int t;
4593*fcf3ce44SJohn Forte
4594*fcf3ce44SJohn Forte t = temp->degrees;
4595*fcf3ce44SJohn Forte t -= 20; /* re-adjust */
4596*fcf3ce44SJohn Forte /*
4597*fcf3ce44SJohn Forte * NL_Comment
4598*fcf3ce44SJohn Forte * The %c is the degree symbol.
4599*fcf3ce44SJohn Forte */
4600*fcf3ce44SJohn Forte (void) fprintf(stdout, ":%1.2d%cC ", t, 186);
4601*fcf3ce44SJohn Forte }
4602*fcf3ce44SJohn Forte
4603*fcf3ce44SJohn Forte
4604*fcf3ce44SJohn Forte
4605*fcf3ce44SJohn Forte /*
4606*fcf3ce44SJohn Forte * trans_decode() Display tranceivers state.
4607*fcf3ce44SJohn Forte *
4608*fcf3ce44SJohn Forte * RETURNS:
4609*fcf3ce44SJohn Forte * none.
4610*fcf3ce44SJohn Forte */
4611*fcf3ce44SJohn Forte void
trans_decode(Trans_elem_st * trans)4612*fcf3ce44SJohn Forte trans_decode(Trans_elem_st *trans)
4613*fcf3ce44SJohn Forte {
4614*fcf3ce44SJohn Forte if (trans->disabled) {
4615*fcf3ce44SJohn Forte (void) fprintf(stdout, ": ");
4616*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(34,
4617*fcf3ce44SJohn Forte "Disabled"));
4618*fcf3ce44SJohn Forte }
4619*fcf3ce44SJohn Forte if (trans->lol) {
4620*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2133,
4621*fcf3ce44SJohn Forte ": Not receiving a signal"));
4622*fcf3ce44SJohn Forte }
4623*fcf3ce44SJohn Forte if (trans->lsr_fail) {
4624*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2134,
4625*fcf3ce44SJohn Forte ": Laser failed"));
4626*fcf3ce44SJohn Forte }
4627*fcf3ce44SJohn Forte }
4628*fcf3ce44SJohn Forte
4629*fcf3ce44SJohn Forte
4630*fcf3ce44SJohn Forte
4631*fcf3ce44SJohn Forte /*
4632*fcf3ce44SJohn Forte * trans_messages() Display tranceiver status.
4633*fcf3ce44SJohn Forte *
4634*fcf3ce44SJohn Forte * NOTE: The decoding of the status assumes that the elements
4635*fcf3ce44SJohn Forte * are in order with the first two elements are for the
4636*fcf3ce44SJohn Forte * "A" IB. It also assumes the tranceivers are numbered
4637*fcf3ce44SJohn Forte * 0 and 1.
4638*fcf3ce44SJohn Forte *
4639*fcf3ce44SJohn Forte * RETURNS:
4640*fcf3ce44SJohn Forte * none.
4641*fcf3ce44SJohn Forte */
4642*fcf3ce44SJohn Forte void
trans_messages(struct l_state_struct * l_state,int ib_a_flag)4643*fcf3ce44SJohn Forte trans_messages(struct l_state_struct *l_state, int ib_a_flag)
4644*fcf3ce44SJohn Forte {
4645*fcf3ce44SJohn Forte Trans_elem_st trans;
4646*fcf3ce44SJohn Forte int i, j, k;
4647*fcf3ce44SJohn Forte int count = 0;
4648*fcf3ce44SJohn Forte int elem_index = 0;
4649*fcf3ce44SJohn Forte
4650*fcf3ce44SJohn Forte /* Get and print messages */
4651*fcf3ce44SJohn Forte for (i = 0; i < (int)l_state->ib_tbl.config.enc_num_elem; i++) {
4652*fcf3ce44SJohn Forte elem_index++;
4653*fcf3ce44SJohn Forte if (l_state->ib_tbl.config.type_hdr[i].type == ELM_TYP_FL) {
4654*fcf3ce44SJohn Forte
4655*fcf3ce44SJohn Forte if (l_state->ib_tbl.config.type_hdr[i].text_len != 0) {
4656*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n\t\t%s\n",
4657*fcf3ce44SJohn Forte l_state->ib_tbl.config.text[i]);
4658*fcf3ce44SJohn Forte }
4659*fcf3ce44SJohn Forte count = k = 0;
4660*fcf3ce44SJohn Forte
4661*fcf3ce44SJohn Forte for (j = 0; j <
4662*fcf3ce44SJohn Forte (int)l_state->ib_tbl.config.type_hdr[i].num; j++) {
4663*fcf3ce44SJohn Forte /*
4664*fcf3ce44SJohn Forte * Only display the status for the selected IB.
4665*fcf3ce44SJohn Forte */
4666*fcf3ce44SJohn Forte if ((count < 2 && ib_a_flag) ||
4667*fcf3ce44SJohn Forte (count >= 2 && !ib_a_flag)) {
4668*fcf3ce44SJohn Forte (void) bcopy((const void *)
4669*fcf3ce44SJohn Forte &l_state->ib_tbl.p2_s.element[elem_index + j],
4670*fcf3ce44SJohn Forte (void *)&trans, sizeof (trans));
4671*fcf3ce44SJohn Forte
4672*fcf3ce44SJohn Forte if (k == 0) {
4673*fcf3ce44SJohn Forte (void) fprintf(stdout, "\t\t%d ", k);
4674*fcf3ce44SJohn Forte } else {
4675*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n\t\t%d ", k);
4676*fcf3ce44SJohn Forte }
4677*fcf3ce44SJohn Forte if (trans.code == S_OK) {
4678*fcf3ce44SJohn Forte (void) fprintf(stdout,
4679*fcf3ce44SJohn Forte MSGSTR(29, "O.K."));
4680*fcf3ce44SJohn Forte revision_msg(l_state, elem_index + j);
4681*fcf3ce44SJohn Forte } else if ((trans.code == S_CRITICAL) ||
4682*fcf3ce44SJohn Forte (trans.code == S_NONCRITICAL)) {
4683*fcf3ce44SJohn Forte (void) fprintf(stdout,
4684*fcf3ce44SJohn Forte MSGSTR(2135, "Failed"));
4685*fcf3ce44SJohn Forte revision_msg(l_state, elem_index + j);
4686*fcf3ce44SJohn Forte trans_decode(&trans);
4687*fcf3ce44SJohn Forte } else if (trans.code == S_NOT_INSTALLED) {
4688*fcf3ce44SJohn Forte (void) fprintf(stdout,
4689*fcf3ce44SJohn Forte MSGSTR(30, "Not Installed"));
4690*fcf3ce44SJohn Forte } else if (trans.code == S_NOT_AVAILABLE) {
4691*fcf3ce44SJohn Forte (void) fprintf(stdout,
4692*fcf3ce44SJohn Forte MSGSTR(34, "Disabled"));
4693*fcf3ce44SJohn Forte revision_msg(l_state, elem_index + j);
4694*fcf3ce44SJohn Forte } else {
4695*fcf3ce44SJohn Forte (void) fprintf(stdout,
4696*fcf3ce44SJohn Forte MSGSTR(4, "Unknown status"));
4697*fcf3ce44SJohn Forte }
4698*fcf3ce44SJohn Forte k++;
4699*fcf3ce44SJohn Forte }
4700*fcf3ce44SJohn Forte count++;
4701*fcf3ce44SJohn Forte }
4702*fcf3ce44SJohn Forte }
4703*fcf3ce44SJohn Forte /*
4704*fcf3ce44SJohn Forte * Calculate the index to each element.
4705*fcf3ce44SJohn Forte */
4706*fcf3ce44SJohn Forte elem_index += l_state->ib_tbl.config.type_hdr[i].num;
4707*fcf3ce44SJohn Forte }
4708*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
4709*fcf3ce44SJohn Forte }
4710*fcf3ce44SJohn Forte
4711*fcf3ce44SJohn Forte
4712*fcf3ce44SJohn Forte
4713*fcf3ce44SJohn Forte /*
4714*fcf3ce44SJohn Forte * temperature_messages() Display temperature status.
4715*fcf3ce44SJohn Forte *
4716*fcf3ce44SJohn Forte * RETURNS:
4717*fcf3ce44SJohn Forte * none.
4718*fcf3ce44SJohn Forte */
4719*fcf3ce44SJohn Forte void
temperature_messages(struct l_state_struct * l_state,int rear_flag)4720*fcf3ce44SJohn Forte temperature_messages(struct l_state_struct *l_state, int rear_flag)
4721*fcf3ce44SJohn Forte {
4722*fcf3ce44SJohn Forte Temp_elem_st temp;
4723*fcf3ce44SJohn Forte int i, j, last_ok = 0;
4724*fcf3ce44SJohn Forte int all_ok = 1;
4725*fcf3ce44SJohn Forte int elem_index = 0;
4726*fcf3ce44SJohn Forte
4727*fcf3ce44SJohn Forte /* Get and print messages */
4728*fcf3ce44SJohn Forte for (i = 0; i < (int)l_state->ib_tbl.config.enc_num_elem; i++) {
4729*fcf3ce44SJohn Forte elem_index++; /* skip global */
4730*fcf3ce44SJohn Forte if (l_state->ib_tbl.config.type_hdr[i].type == ELM_TYP_TS) {
4731*fcf3ce44SJohn Forte if (!rear_flag) {
4732*fcf3ce44SJohn Forte rear_flag = 1; /* only do front or rear backplane */
4733*fcf3ce44SJohn Forte if (l_state->ib_tbl.config.type_hdr[i].text_len != 0) {
4734*fcf3ce44SJohn Forte (void) fprintf(stdout, "\t %s",
4735*fcf3ce44SJohn Forte l_state->ib_tbl.config.text[i]);
4736*fcf3ce44SJohn Forte }
4737*fcf3ce44SJohn Forte
4738*fcf3ce44SJohn Forte /*
4739*fcf3ce44SJohn Forte * Check global status and if not all O.K.
4740*fcf3ce44SJohn Forte * then print individually.
4741*fcf3ce44SJohn Forte */
4742*fcf3ce44SJohn Forte (void) bcopy((const void *)&l_state->ib_tbl.p2_s.element[i],
4743*fcf3ce44SJohn Forte (void *)&temp, sizeof (temp));
4744*fcf3ce44SJohn Forte for (j = 0; j <
4745*fcf3ce44SJohn Forte (int)l_state->ib_tbl.config.type_hdr[i].num; j++) {
4746*fcf3ce44SJohn Forte (void) bcopy((const void *)
4747*fcf3ce44SJohn Forte &l_state->ib_tbl.p2_s.element[elem_index + j],
4748*fcf3ce44SJohn Forte (void *)&temp, sizeof (temp));
4749*fcf3ce44SJohn Forte
4750*fcf3ce44SJohn Forte if ((j == 0) && (temp.code == S_OK) &&
4751*fcf3ce44SJohn Forte (!(temp.ot_fail || temp.ot_warn ||
4752*fcf3ce44SJohn Forte temp.ut_fail || temp.ut_warn))) {
4753*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n\t %d", j);
4754*fcf3ce44SJohn Forte } else if ((j == 6) && (temp.code == S_OK) &&
4755*fcf3ce44SJohn Forte all_ok) {
4756*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n\t %d", j);
4757*fcf3ce44SJohn Forte } else if (last_ok && (temp.code == S_OK)) {
4758*fcf3ce44SJohn Forte (void) fprintf(stdout, "%d", j);
4759*fcf3ce44SJohn Forte } else {
4760*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n\t\t%d", j);
4761*fcf3ce44SJohn Forte }
4762*fcf3ce44SJohn Forte if (temp.code == S_OK) {
4763*fcf3ce44SJohn Forte disp_degree(&temp);
4764*fcf3ce44SJohn Forte if (temp.ot_fail || temp.ot_warn ||
4765*fcf3ce44SJohn Forte temp.ut_fail || temp.ut_warn) {
4766*fcf3ce44SJohn Forte temp_decode(&temp);
4767*fcf3ce44SJohn Forte all_ok = 0;
4768*fcf3ce44SJohn Forte last_ok = 0;
4769*fcf3ce44SJohn Forte } else {
4770*fcf3ce44SJohn Forte last_ok++;
4771*fcf3ce44SJohn Forte }
4772*fcf3ce44SJohn Forte } else if (temp.code == S_CRITICAL) {
4773*fcf3ce44SJohn Forte (void) fprintf(stdout,
4774*fcf3ce44SJohn Forte MSGSTR(122, "Critical failure"));
4775*fcf3ce44SJohn Forte last_ok = 0;
4776*fcf3ce44SJohn Forte all_ok = 0;
4777*fcf3ce44SJohn Forte } else if (temp.code == S_NONCRITICAL) {
4778*fcf3ce44SJohn Forte (void) fprintf(stdout,
4779*fcf3ce44SJohn Forte MSGSTR(89, "Non-Critical Failure"));
4780*fcf3ce44SJohn Forte last_ok = 0;
4781*fcf3ce44SJohn Forte all_ok = 0;
4782*fcf3ce44SJohn Forte } else if (temp.code == S_NOT_INSTALLED) {
4783*fcf3ce44SJohn Forte (void) fprintf(stdout,
4784*fcf3ce44SJohn Forte MSGSTR(30, "Not Installed"));
4785*fcf3ce44SJohn Forte last_ok = 0;
4786*fcf3ce44SJohn Forte all_ok = 0;
4787*fcf3ce44SJohn Forte } else if (temp.code == S_NOT_AVAILABLE) {
4788*fcf3ce44SJohn Forte (void) fprintf(stdout,
4789*fcf3ce44SJohn Forte MSGSTR(34, "Disabled"));
4790*fcf3ce44SJohn Forte last_ok = 0;
4791*fcf3ce44SJohn Forte all_ok = 0;
4792*fcf3ce44SJohn Forte } else {
4793*fcf3ce44SJohn Forte (void) fprintf(stdout,
4794*fcf3ce44SJohn Forte MSGSTR(4, "Unknown status"));
4795*fcf3ce44SJohn Forte last_ok = 0;
4796*fcf3ce44SJohn Forte all_ok = 0;
4797*fcf3ce44SJohn Forte }
4798*fcf3ce44SJohn Forte }
4799*fcf3ce44SJohn Forte if (all_ok) {
4800*fcf3ce44SJohn Forte (void) fprintf(stdout,
4801*fcf3ce44SJohn Forte MSGSTR(2136, " (All temperatures are "
4802*fcf3ce44SJohn Forte "NORMAL.)"));
4803*fcf3ce44SJohn Forte }
4804*fcf3ce44SJohn Forte all_ok = 1;
4805*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
4806*fcf3ce44SJohn Forte } else {
4807*fcf3ce44SJohn Forte rear_flag = 0;
4808*fcf3ce44SJohn Forte }
4809*fcf3ce44SJohn Forte }
4810*fcf3ce44SJohn Forte elem_index += l_state->ib_tbl.config.type_hdr[i].num;
4811*fcf3ce44SJohn Forte }
4812*fcf3ce44SJohn Forte }
4813*fcf3ce44SJohn Forte
4814*fcf3ce44SJohn Forte
4815*fcf3ce44SJohn Forte
4816*fcf3ce44SJohn Forte /*
4817*fcf3ce44SJohn Forte * ib_decode() Display IB byte 3 state.
4818*fcf3ce44SJohn Forte *
4819*fcf3ce44SJohn Forte * RETURNS:
4820*fcf3ce44SJohn Forte * none.
4821*fcf3ce44SJohn Forte */
4822*fcf3ce44SJohn Forte void
ib_decode(Ctlr_elem_st * ctlr)4823*fcf3ce44SJohn Forte ib_decode(Ctlr_elem_st *ctlr)
4824*fcf3ce44SJohn Forte {
4825*fcf3ce44SJohn Forte if (ctlr->overtemp_alart) {
4826*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2137,
4827*fcf3ce44SJohn Forte " - IB Over Temperature Alert "));
4828*fcf3ce44SJohn Forte }
4829*fcf3ce44SJohn Forte if (ctlr->ib_loop_1_fail) {
4830*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2138,
4831*fcf3ce44SJohn Forte " - IB Loop 1 has failed "));
4832*fcf3ce44SJohn Forte }
4833*fcf3ce44SJohn Forte if (ctlr->ib_loop_0_fail) {
4834*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2139,
4835*fcf3ce44SJohn Forte " - IB Loop 0 has failed "));
4836*fcf3ce44SJohn Forte }
4837*fcf3ce44SJohn Forte }
4838*fcf3ce44SJohn Forte
4839*fcf3ce44SJohn Forte
4840*fcf3ce44SJohn Forte
4841*fcf3ce44SJohn Forte /*
4842*fcf3ce44SJohn Forte * mb_messages() Display motherboard
4843*fcf3ce44SJohn Forte * (interconnect assembly) messages.
4844*fcf3ce44SJohn Forte *
4845*fcf3ce44SJohn Forte * RETURNS:
4846*fcf3ce44SJohn Forte * none.
4847*fcf3ce44SJohn Forte */
4848*fcf3ce44SJohn Forte void
mb_messages(struct l_state_struct * l_state,int index,int elem_index)4849*fcf3ce44SJohn Forte mb_messages(struct l_state_struct *l_state, int index, int elem_index)
4850*fcf3ce44SJohn Forte {
4851*fcf3ce44SJohn Forte int j;
4852*fcf3ce44SJohn Forte Interconnect_st interconnect;
4853*fcf3ce44SJohn Forte
4854*fcf3ce44SJohn Forte if (l_state->ib_tbl.config.type_hdr[index].text_len != 0) {
4855*fcf3ce44SJohn Forte (void) fprintf(stdout, "%s\n",
4856*fcf3ce44SJohn Forte l_state->ib_tbl.config.text[index]);
4857*fcf3ce44SJohn Forte }
4858*fcf3ce44SJohn Forte for (j = 0; j < (int)l_state->ib_tbl.config.type_hdr[index].num;
4859*fcf3ce44SJohn Forte j++) {
4860*fcf3ce44SJohn Forte (void) bcopy((const void *)
4861*fcf3ce44SJohn Forte &l_state->ib_tbl.p2_s.element[elem_index + j],
4862*fcf3ce44SJohn Forte (void *)&interconnect, sizeof (interconnect));
4863*fcf3ce44SJohn Forte (void) fprintf(stdout, "\t");
4864*fcf3ce44SJohn Forte
4865*fcf3ce44SJohn Forte if (interconnect.code == S_OK) {
4866*fcf3ce44SJohn Forte (void) fprintf(stdout,
4867*fcf3ce44SJohn Forte MSGSTR(29, "O.K."));
4868*fcf3ce44SJohn Forte revision_msg(l_state, elem_index + j);
4869*fcf3ce44SJohn Forte } else if (interconnect.code == S_NOT_INSTALLED) {
4870*fcf3ce44SJohn Forte (void) fprintf(stdout,
4871*fcf3ce44SJohn Forte MSGSTR(30, "Not Installed"));
4872*fcf3ce44SJohn Forte } else if (interconnect.code == S_CRITICAL) {
4873*fcf3ce44SJohn Forte if (interconnect.eprom_fail != NULL) {
4874*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2140,
4875*fcf3ce44SJohn Forte "Critical Failure: EEPROM failure"));
4876*fcf3ce44SJohn Forte } else {
4877*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2141,
4878*fcf3ce44SJohn Forte "Critical Failure: Unknown failure"));
4879*fcf3ce44SJohn Forte }
4880*fcf3ce44SJohn Forte revision_msg(l_state, elem_index + j);
4881*fcf3ce44SJohn Forte } else if (interconnect.code == S_NONCRITICAL) {
4882*fcf3ce44SJohn Forte if (interconnect.eprom_fail != NULL) {
4883*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2142,
4884*fcf3ce44SJohn Forte "Non-Critical Failure: EEPROM failure"));
4885*fcf3ce44SJohn Forte } else {
4886*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2143,
4887*fcf3ce44SJohn Forte "Non-Critical Failure: Unknown failure"));
4888*fcf3ce44SJohn Forte }
4889*fcf3ce44SJohn Forte revision_msg(l_state, elem_index + j);
4890*fcf3ce44SJohn Forte } else if (interconnect.code == S_NOT_AVAILABLE) {
4891*fcf3ce44SJohn Forte (void) fprintf(stdout,
4892*fcf3ce44SJohn Forte MSGSTR(34, "Disabled"));
4893*fcf3ce44SJohn Forte revision_msg(l_state, elem_index + j);
4894*fcf3ce44SJohn Forte } else {
4895*fcf3ce44SJohn Forte (void) fprintf(stdout,
4896*fcf3ce44SJohn Forte MSGSTR(4, "Unknown status"));
4897*fcf3ce44SJohn Forte }
4898*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
4899*fcf3ce44SJohn Forte }
4900*fcf3ce44SJohn Forte
4901*fcf3ce44SJohn Forte
4902*fcf3ce44SJohn Forte }
4903*fcf3ce44SJohn Forte
4904*fcf3ce44SJohn Forte
4905*fcf3ce44SJohn Forte
4906*fcf3ce44SJohn Forte /*
4907*fcf3ce44SJohn Forte * back_plane_messages() Display back_plane messages
4908*fcf3ce44SJohn Forte * including the temperature's.
4909*fcf3ce44SJohn Forte *
4910*fcf3ce44SJohn Forte * RETURNS:
4911*fcf3ce44SJohn Forte * none.
4912*fcf3ce44SJohn Forte */
4913*fcf3ce44SJohn Forte void
back_plane_messages(struct l_state_struct * l_state,int index,int elem_index)4914*fcf3ce44SJohn Forte back_plane_messages(struct l_state_struct *l_state, int index, int elem_index)
4915*fcf3ce44SJohn Forte {
4916*fcf3ce44SJohn Forte Bp_elem_st bp;
4917*fcf3ce44SJohn Forte int j;
4918*fcf3ce44SJohn Forte char status_string[MAXPATHLEN];
4919*fcf3ce44SJohn Forte
4920*fcf3ce44SJohn Forte if (l_state->ib_tbl.config.type_hdr[index].text_len != 0) {
4921*fcf3ce44SJohn Forte (void) fprintf(stdout, "%s\n",
4922*fcf3ce44SJohn Forte l_state->ib_tbl.config.text[index]);
4923*fcf3ce44SJohn Forte }
4924*fcf3ce44SJohn Forte for (j = 0; j < (int)l_state->ib_tbl.config.type_hdr[index].num;
4925*fcf3ce44SJohn Forte j++) {
4926*fcf3ce44SJohn Forte (void) bcopy((const void *)
4927*fcf3ce44SJohn Forte &l_state->ib_tbl.p2_s.element[elem_index + j],
4928*fcf3ce44SJohn Forte (void *)&bp, sizeof (bp));
4929*fcf3ce44SJohn Forte if (j == 0) {
4930*fcf3ce44SJohn Forte (void) fprintf(stdout,
4931*fcf3ce44SJohn Forte MSGSTR(2144, "\tFront Backplane: "));
4932*fcf3ce44SJohn Forte } else {
4933*fcf3ce44SJohn Forte (void) fprintf(stdout,
4934*fcf3ce44SJohn Forte MSGSTR(2145, "\tRear Backplane: "));
4935*fcf3ce44SJohn Forte }
4936*fcf3ce44SJohn Forte
4937*fcf3ce44SJohn Forte (void) l_element_msg_string(bp.code, status_string);
4938*fcf3ce44SJohn Forte (void) fprintf(stdout, "%s", status_string);
4939*fcf3ce44SJohn Forte
4940*fcf3ce44SJohn Forte if (bp.code != S_NOT_INSTALLED) {
4941*fcf3ce44SJohn Forte revision_msg(l_state, elem_index + j);
4942*fcf3ce44SJohn Forte if ((bp.byp_a_enabled || bp.en_bypass_a) &&
4943*fcf3ce44SJohn Forte !(bp.byp_b_enabled || bp.en_bypass_b)) {
4944*fcf3ce44SJohn Forte (void) fprintf(stdout, " (");
4945*fcf3ce44SJohn Forte (void) fprintf(stdout,
4946*fcf3ce44SJohn Forte MSGSTR(130, "Bypass A enabled"));
4947*fcf3ce44SJohn Forte (void) fprintf(stdout, ")");
4948*fcf3ce44SJohn Forte } else if ((bp.byp_b_enabled || bp.en_bypass_b) &&
4949*fcf3ce44SJohn Forte !(bp.byp_a_enabled || bp.en_bypass_a)) {
4950*fcf3ce44SJohn Forte (void) fprintf(stdout, " (");
4951*fcf3ce44SJohn Forte (void) fprintf(stdout,
4952*fcf3ce44SJohn Forte MSGSTR(129, "Bypass B enabled"));
4953*fcf3ce44SJohn Forte (void) fprintf(stdout, ")");
4954*fcf3ce44SJohn Forte /* This case covers where a and b are bypassed */
4955*fcf3ce44SJohn Forte } else if (bp.byp_b_enabled || bp.en_bypass_b) {
4956*fcf3ce44SJohn Forte (void) fprintf(stdout,
4957*fcf3ce44SJohn Forte MSGSTR(2146, " (Bypass's A & B enabled)"));
4958*fcf3ce44SJohn Forte }
4959*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
4960*fcf3ce44SJohn Forte temperature_messages(l_state, j);
4961*fcf3ce44SJohn Forte } else {
4962*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
4963*fcf3ce44SJohn Forte }
4964*fcf3ce44SJohn Forte }
4965*fcf3ce44SJohn Forte }
4966*fcf3ce44SJohn Forte
4967*fcf3ce44SJohn Forte
4968*fcf3ce44SJohn Forte /*
4969*fcf3ce44SJohn Forte * dpm_SSC100_messages() Display SSC100 messages
4970*fcf3ce44SJohn Forte * including the temperature's.
4971*fcf3ce44SJohn Forte *
4972*fcf3ce44SJohn Forte * RETURNS:
4973*fcf3ce44SJohn Forte * none.
4974*fcf3ce44SJohn Forte */
4975*fcf3ce44SJohn Forte void
dpm_SSC100_messages(struct l_state_struct * l_state,int index,int elem_index)4976*fcf3ce44SJohn Forte dpm_SSC100_messages(struct l_state_struct *l_state, int index, int elem_index)
4977*fcf3ce44SJohn Forte {
4978*fcf3ce44SJohn Forte Bp_elem_st bp;
4979*fcf3ce44SJohn Forte int j;
4980*fcf3ce44SJohn Forte char status_string[MAXPATHLEN];
4981*fcf3ce44SJohn Forte
4982*fcf3ce44SJohn Forte if (l_state->ib_tbl.config.type_hdr[index].text_len != 0) {
4983*fcf3ce44SJohn Forte (void) fprintf(stdout, "%s\n",
4984*fcf3ce44SJohn Forte l_state->ib_tbl.config.text[index]);
4985*fcf3ce44SJohn Forte }
4986*fcf3ce44SJohn Forte for (j = 0; j < (int)l_state->ib_tbl.config.type_hdr[index].num;
4987*fcf3ce44SJohn Forte j++) {
4988*fcf3ce44SJohn Forte (void) bcopy((const void *)
4989*fcf3ce44SJohn Forte &l_state->ib_tbl.p2_s.element[elem_index + j],
4990*fcf3ce44SJohn Forte (void *)&bp, sizeof (bp));
4991*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2246, " SSC100 #%d: "), j);
4992*fcf3ce44SJohn Forte
4993*fcf3ce44SJohn Forte (void) l_element_msg_string(bp.code, status_string);
4994*fcf3ce44SJohn Forte (void) fprintf(stdout, "%s", status_string);
4995*fcf3ce44SJohn Forte
4996*fcf3ce44SJohn Forte if (bp.code != S_NOT_INSTALLED) {
4997*fcf3ce44SJohn Forte revision_msg(l_state, elem_index + j);
4998*fcf3ce44SJohn Forte if ((bp.byp_a_enabled || bp.en_bypass_a) &&
4999*fcf3ce44SJohn Forte !(bp.byp_b_enabled || bp.en_bypass_b)) {
5000*fcf3ce44SJohn Forte (void) fprintf(stdout, " (");
5001*fcf3ce44SJohn Forte (void) fprintf(stdout,
5002*fcf3ce44SJohn Forte MSGSTR(130, "Bypass A enabled"));
5003*fcf3ce44SJohn Forte (void) fprintf(stdout, ")");
5004*fcf3ce44SJohn Forte } else if ((bp.byp_b_enabled || bp.en_bypass_b) &&
5005*fcf3ce44SJohn Forte !(bp.byp_a_enabled || bp.en_bypass_a)) {
5006*fcf3ce44SJohn Forte (void) fprintf(stdout, " (");
5007*fcf3ce44SJohn Forte (void) fprintf(stdout,
5008*fcf3ce44SJohn Forte MSGSTR(129, "Bypass B enabled"));
5009*fcf3ce44SJohn Forte (void) fprintf(stdout, ")");
5010*fcf3ce44SJohn Forte /* This case covers where a and b are bypassed */
5011*fcf3ce44SJohn Forte } else if (bp.byp_b_enabled || bp.en_bypass_b) {
5012*fcf3ce44SJohn Forte (void) fprintf(stdout,
5013*fcf3ce44SJohn Forte MSGSTR(2146, " (Bypass's A & B enabled)"));
5014*fcf3ce44SJohn Forte }
5015*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
5016*fcf3ce44SJohn Forte } else {
5017*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
5018*fcf3ce44SJohn Forte }
5019*fcf3ce44SJohn Forte }
5020*fcf3ce44SJohn Forte temperature_messages(l_state, 0);
5021*fcf3ce44SJohn Forte }
5022*fcf3ce44SJohn Forte
5023*fcf3ce44SJohn Forte
5024*fcf3ce44SJohn Forte
5025*fcf3ce44SJohn Forte
5026*fcf3ce44SJohn Forte /*
5027*fcf3ce44SJohn Forte * loop_messages() Display loop messages.
5028*fcf3ce44SJohn Forte *
5029*fcf3ce44SJohn Forte * RETURNS:
5030*fcf3ce44SJohn Forte * none.
5031*fcf3ce44SJohn Forte */
5032*fcf3ce44SJohn Forte void
loop_messages(struct l_state_struct * l_state,int index,int elem_index)5033*fcf3ce44SJohn Forte loop_messages(struct l_state_struct *l_state, int index, int elem_index)
5034*fcf3ce44SJohn Forte {
5035*fcf3ce44SJohn Forte Loop_elem_st loop;
5036*fcf3ce44SJohn Forte int j;
5037*fcf3ce44SJohn Forte
5038*fcf3ce44SJohn Forte if (l_state->ib_tbl.config.type_hdr[index].text_len != 0) {
5039*fcf3ce44SJohn Forte (void) fprintf(stdout, "%s\n",
5040*fcf3ce44SJohn Forte l_state->ib_tbl.config.text[index]);
5041*fcf3ce44SJohn Forte }
5042*fcf3ce44SJohn Forte for (j = 0; j < (int)l_state->ib_tbl.config.type_hdr[index].num;
5043*fcf3ce44SJohn Forte j++) {
5044*fcf3ce44SJohn Forte (void) bcopy((const void *)
5045*fcf3ce44SJohn Forte &l_state->ib_tbl.p2_s.element[elem_index + j],
5046*fcf3ce44SJohn Forte (void *)&loop, sizeof (loop));
5047*fcf3ce44SJohn Forte
5048*fcf3ce44SJohn Forte (void) fprintf(stdout, "\t");
5049*fcf3ce44SJohn Forte if (j == 0) {
5050*fcf3ce44SJohn Forte if (loop.code == S_NOT_INSTALLED) {
5051*fcf3ce44SJohn Forte (void) fprintf(stdout,
5052*fcf3ce44SJohn Forte MSGSTR(2147, "Loop A is not installed"));
5053*fcf3ce44SJohn Forte } else {
5054*fcf3ce44SJohn Forte if (loop.split) {
5055*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2148,
5056*fcf3ce44SJohn Forte "Loop A is configured as two separate loops."));
5057*fcf3ce44SJohn Forte } else {
5058*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2149,
5059*fcf3ce44SJohn Forte "Loop A is configured as a single loop."));
5060*fcf3ce44SJohn Forte }
5061*fcf3ce44SJohn Forte }
5062*fcf3ce44SJohn Forte } else {
5063*fcf3ce44SJohn Forte if (loop.code == S_NOT_INSTALLED) {
5064*fcf3ce44SJohn Forte (void) fprintf(stdout,
5065*fcf3ce44SJohn Forte MSGSTR(2150, "Loop B is not installed"));
5066*fcf3ce44SJohn Forte } else {
5067*fcf3ce44SJohn Forte if (loop.split) {
5068*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2151,
5069*fcf3ce44SJohn Forte "Loop B is configured as two separate loops."));
5070*fcf3ce44SJohn Forte } else {
5071*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2152,
5072*fcf3ce44SJohn Forte "Loop B is configured as a single loop."));
5073*fcf3ce44SJohn Forte }
5074*fcf3ce44SJohn Forte }
5075*fcf3ce44SJohn Forte }
5076*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
5077*fcf3ce44SJohn Forte }
5078*fcf3ce44SJohn Forte }
5079*fcf3ce44SJohn Forte
5080*fcf3ce44SJohn Forte
5081*fcf3ce44SJohn Forte
5082*fcf3ce44SJohn Forte /*
5083*fcf3ce44SJohn Forte * ctlr_messages() Display ESI Controller status.
5084*fcf3ce44SJohn Forte *
5085*fcf3ce44SJohn Forte * RETURNS:
5086*fcf3ce44SJohn Forte * none.
5087*fcf3ce44SJohn Forte */
5088*fcf3ce44SJohn Forte void
ctlr_messages(struct l_state_struct * l_state,int index,int elem_index)5089*fcf3ce44SJohn Forte ctlr_messages(struct l_state_struct *l_state, int index, int elem_index)
5090*fcf3ce44SJohn Forte {
5091*fcf3ce44SJohn Forte Ctlr_elem_st ctlr;
5092*fcf3ce44SJohn Forte int j;
5093*fcf3ce44SJohn Forte int ib_a_flag = 1;
5094*fcf3ce44SJohn Forte
5095*fcf3ce44SJohn Forte if (l_state->ib_tbl.config.type_hdr[index].text_len != 0) {
5096*fcf3ce44SJohn Forte (void) fprintf(stdout, "%s\n",
5097*fcf3ce44SJohn Forte l_state->ib_tbl.config.text[index]);
5098*fcf3ce44SJohn Forte }
5099*fcf3ce44SJohn Forte for (j = 0; j < (int)l_state->ib_tbl.config.type_hdr[index].num;
5100*fcf3ce44SJohn Forte j++) {
5101*fcf3ce44SJohn Forte (void) bcopy((const void *)
5102*fcf3ce44SJohn Forte &l_state->ib_tbl.p2_s.element[elem_index + j],
5103*fcf3ce44SJohn Forte (void *)&ctlr, sizeof (ctlr));
5104*fcf3ce44SJohn Forte if (j == 0) {
5105*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2153, "\tA: "));
5106*fcf3ce44SJohn Forte } else {
5107*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2154, "\tB: "));
5108*fcf3ce44SJohn Forte ib_a_flag = 0;
5109*fcf3ce44SJohn Forte }
5110*fcf3ce44SJohn Forte if (ctlr.code == S_OK) {
5111*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(29, "O.K."));
5112*fcf3ce44SJohn Forte /* If any byte 3 bits set display */
5113*fcf3ce44SJohn Forte ib_decode(&ctlr);
5114*fcf3ce44SJohn Forte /* Display Version message */
5115*fcf3ce44SJohn Forte revision_msg(l_state, elem_index + j);
5116*fcf3ce44SJohn Forte /*
5117*fcf3ce44SJohn Forte * Display the tranciver module state for this
5118*fcf3ce44SJohn Forte * IB.
5119*fcf3ce44SJohn Forte */
5120*fcf3ce44SJohn Forte trans_messages(l_state, ib_a_flag);
5121*fcf3ce44SJohn Forte } else if (ctlr.code == S_CRITICAL) {
5122*fcf3ce44SJohn Forte (void) fprintf(stdout,
5123*fcf3ce44SJohn Forte MSGSTR(122, "Critical failure"));
5124*fcf3ce44SJohn Forte ib_decode(&ctlr);
5125*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
5126*fcf3ce44SJohn Forte } else if (ctlr.code == S_NONCRITICAL) {
5127*fcf3ce44SJohn Forte (void) fprintf(stdout,
5128*fcf3ce44SJohn Forte MSGSTR(89, "Non-Critical Failure"));
5129*fcf3ce44SJohn Forte ib_decode(&ctlr);
5130*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
5131*fcf3ce44SJohn Forte } else if (ctlr.code == S_NOT_INSTALLED) {
5132*fcf3ce44SJohn Forte (void) fprintf(stdout,
5133*fcf3ce44SJohn Forte MSGSTR(30, "Not Installed"));
5134*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
5135*fcf3ce44SJohn Forte } else if (ctlr.code == S_NOT_AVAILABLE) {
5136*fcf3ce44SJohn Forte (void) fprintf(stdout,
5137*fcf3ce44SJohn Forte MSGSTR(34, "Disabled"));
5138*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
5139*fcf3ce44SJohn Forte } else {
5140*fcf3ce44SJohn Forte (void) fprintf(stdout,
5141*fcf3ce44SJohn Forte MSGSTR(4, "Unknown status"));
5142*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
5143*fcf3ce44SJohn Forte }
5144*fcf3ce44SJohn Forte }
5145*fcf3ce44SJohn Forte }
5146*fcf3ce44SJohn Forte
5147*fcf3ce44SJohn Forte
5148*fcf3ce44SJohn Forte
5149*fcf3ce44SJohn Forte /*
5150*fcf3ce44SJohn Forte * fan_decode() Display Fans bytes 1-3 state.
5151*fcf3ce44SJohn Forte *
5152*fcf3ce44SJohn Forte * RETURNS:
5153*fcf3ce44SJohn Forte * none.
5154*fcf3ce44SJohn Forte */
5155*fcf3ce44SJohn Forte void
fan_decode(Fan_elem_st * fan)5156*fcf3ce44SJohn Forte fan_decode(Fan_elem_st *fan)
5157*fcf3ce44SJohn Forte {
5158*fcf3ce44SJohn Forte if (fan->fail) {
5159*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2155,
5160*fcf3ce44SJohn Forte ":Yellow LED is on"));
5161*fcf3ce44SJohn Forte }
5162*fcf3ce44SJohn Forte if (fan->speed == 0) {
5163*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2156,
5164*fcf3ce44SJohn Forte ":Fan stopped"));
5165*fcf3ce44SJohn Forte } else if (fan->speed < S_HI_SPEED) {
5166*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2157,
5167*fcf3ce44SJohn Forte ":Fan speed Low"));
5168*fcf3ce44SJohn Forte } else {
5169*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2158,
5170*fcf3ce44SJohn Forte ":Fan speed Hi"));
5171*fcf3ce44SJohn Forte }
5172*fcf3ce44SJohn Forte }
5173*fcf3ce44SJohn Forte
5174*fcf3ce44SJohn Forte /*
5175*fcf3ce44SJohn Forte * fan_messages() Display Fan status.
5176*fcf3ce44SJohn Forte *
5177*fcf3ce44SJohn Forte * RETURNS:
5178*fcf3ce44SJohn Forte * none.
5179*fcf3ce44SJohn Forte */
5180*fcf3ce44SJohn Forte void
fan_messages(struct l_state_struct * l_state,int hdr_index,int elem_index)5181*fcf3ce44SJohn Forte fan_messages(struct l_state_struct *l_state, int hdr_index, int elem_index)
5182*fcf3ce44SJohn Forte {
5183*fcf3ce44SJohn Forte Fan_elem_st fan;
5184*fcf3ce44SJohn Forte int j;
5185*fcf3ce44SJohn Forte
5186*fcf3ce44SJohn Forte /* Get and print messages */
5187*fcf3ce44SJohn Forte if (l_state->ib_tbl.config.type_hdr[hdr_index].text_len != 0) {
5188*fcf3ce44SJohn Forte (void) fprintf(stdout, "%s\n",
5189*fcf3ce44SJohn Forte l_state->ib_tbl.config.text[hdr_index]);
5190*fcf3ce44SJohn Forte }
5191*fcf3ce44SJohn Forte for (j = 0; j < (int)l_state->ib_tbl.config.type_hdr[hdr_index].num;
5192*fcf3ce44SJohn Forte j++) {
5193*fcf3ce44SJohn Forte (void) bcopy((const void *)
5194*fcf3ce44SJohn Forte &l_state->ib_tbl.p2_s.element[elem_index + j],
5195*fcf3ce44SJohn Forte (void *)&fan, sizeof (fan));
5196*fcf3ce44SJohn Forte (void) fprintf(stdout, "\t%d ", j);
5197*fcf3ce44SJohn Forte if (fan.code == S_OK) {
5198*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(29, "O.K."));
5199*fcf3ce44SJohn Forte revision_msg(l_state, elem_index + j);
5200*fcf3ce44SJohn Forte } else if (fan.code == S_CRITICAL) {
5201*fcf3ce44SJohn Forte (void) fprintf(stdout,
5202*fcf3ce44SJohn Forte MSGSTR(122, "Critical failure"));
5203*fcf3ce44SJohn Forte fan_decode(&fan);
5204*fcf3ce44SJohn Forte revision_msg(l_state, elem_index + j);
5205*fcf3ce44SJohn Forte } else if (fan.code == S_NONCRITICAL) {
5206*fcf3ce44SJohn Forte (void) fprintf(stdout,
5207*fcf3ce44SJohn Forte MSGSTR(89, "Non-Critical Failure"));
5208*fcf3ce44SJohn Forte fan_decode(&fan);
5209*fcf3ce44SJohn Forte revision_msg(l_state, elem_index + j);
5210*fcf3ce44SJohn Forte } else if (fan.code == S_NOT_INSTALLED) {
5211*fcf3ce44SJohn Forte (void) fprintf(stdout,
5212*fcf3ce44SJohn Forte MSGSTR(30, "Not Installed"));
5213*fcf3ce44SJohn Forte } else if (fan.code == S_NOT_AVAILABLE) {
5214*fcf3ce44SJohn Forte (void) fprintf(stdout,
5215*fcf3ce44SJohn Forte MSGSTR(34, "Disabled"));
5216*fcf3ce44SJohn Forte revision_msg(l_state, elem_index + j);
5217*fcf3ce44SJohn Forte } else {
5218*fcf3ce44SJohn Forte (void) fprintf(stdout,
5219*fcf3ce44SJohn Forte MSGSTR(4, "Unknown status"));
5220*fcf3ce44SJohn Forte }
5221*fcf3ce44SJohn Forte }
5222*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
5223*fcf3ce44SJohn Forte }
5224*fcf3ce44SJohn Forte
5225*fcf3ce44SJohn Forte
5226*fcf3ce44SJohn Forte
5227*fcf3ce44SJohn Forte /*
5228*fcf3ce44SJohn Forte * ps_decode() Display Power Supply bytes 1-3 state.
5229*fcf3ce44SJohn Forte *
5230*fcf3ce44SJohn Forte * RETURNS:
5231*fcf3ce44SJohn Forte * none.
5232*fcf3ce44SJohn Forte */
5233*fcf3ce44SJohn Forte void
ps_decode(Ps_elem_st * ps)5234*fcf3ce44SJohn Forte ps_decode(Ps_elem_st *ps)
5235*fcf3ce44SJohn Forte {
5236*fcf3ce44SJohn Forte if (ps->dc_over) {
5237*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2159,
5238*fcf3ce44SJohn Forte ": DC Voltage too high"));
5239*fcf3ce44SJohn Forte }
5240*fcf3ce44SJohn Forte if (ps->dc_under) {
5241*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2160,
5242*fcf3ce44SJohn Forte ": DC Voltage too low"));
5243*fcf3ce44SJohn Forte }
5244*fcf3ce44SJohn Forte if (ps->dc_over_i) {
5245*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2161,
5246*fcf3ce44SJohn Forte ": DC Current too high"));
5247*fcf3ce44SJohn Forte }
5248*fcf3ce44SJohn Forte if (ps->ovrtmp_fail || ps->temp_warn) {
5249*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2162,
5250*fcf3ce44SJohn Forte ": Temperature too high"));
5251*fcf3ce44SJohn Forte }
5252*fcf3ce44SJohn Forte if (ps->ac_fail) {
5253*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2163,
5254*fcf3ce44SJohn Forte ": AC Failed"));
5255*fcf3ce44SJohn Forte }
5256*fcf3ce44SJohn Forte if (ps->dc_fail) {
5257*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2164,
5258*fcf3ce44SJohn Forte ": DC Failed"));
5259*fcf3ce44SJohn Forte }
5260*fcf3ce44SJohn Forte }
5261*fcf3ce44SJohn Forte
5262*fcf3ce44SJohn Forte
5263*fcf3ce44SJohn Forte
5264*fcf3ce44SJohn Forte /*
5265*fcf3ce44SJohn Forte * revision_msg() Print the revision message from page 7.
5266*fcf3ce44SJohn Forte *
5267*fcf3ce44SJohn Forte * RETURNS:
5268*fcf3ce44SJohn Forte * none.
5269*fcf3ce44SJohn Forte */
5270*fcf3ce44SJohn Forte void
revision_msg(struct l_state_struct * l_state,int index)5271*fcf3ce44SJohn Forte revision_msg(struct l_state_struct *l_state, int index)
5272*fcf3ce44SJohn Forte {
5273*fcf3ce44SJohn Forte if (strlen((const char *)
5274*fcf3ce44SJohn Forte l_state->ib_tbl.p7_s.element_desc[index].desc_string)) {
5275*fcf3ce44SJohn Forte (void) fprintf(stdout, "(%s)",
5276*fcf3ce44SJohn Forte l_state->ib_tbl.p7_s.element_desc[index].desc_string);
5277*fcf3ce44SJohn Forte }
5278*fcf3ce44SJohn Forte }
5279*fcf3ce44SJohn Forte
5280*fcf3ce44SJohn Forte
5281*fcf3ce44SJohn Forte
5282*fcf3ce44SJohn Forte /*
5283*fcf3ce44SJohn Forte * ps_messages() Display Power Supply status.
5284*fcf3ce44SJohn Forte *
5285*fcf3ce44SJohn Forte * RETURNS:
5286*fcf3ce44SJohn Forte * none.
5287*fcf3ce44SJohn Forte */
5288*fcf3ce44SJohn Forte void
ps_messages(struct l_state_struct * l_state,int index,int elem_index)5289*fcf3ce44SJohn Forte ps_messages(struct l_state_struct *l_state, int index, int elem_index)
5290*fcf3ce44SJohn Forte {
5291*fcf3ce44SJohn Forte Ps_elem_st ps;
5292*fcf3ce44SJohn Forte int j;
5293*fcf3ce44SJohn Forte
5294*fcf3ce44SJohn Forte /* Get and print Power Supply messages */
5295*fcf3ce44SJohn Forte
5296*fcf3ce44SJohn Forte if (l_state->ib_tbl.config.type_hdr[index].text_len != 0) {
5297*fcf3ce44SJohn Forte (void) fprintf(stdout, "%s\n",
5298*fcf3ce44SJohn Forte l_state->ib_tbl.config.text[index]);
5299*fcf3ce44SJohn Forte }
5300*fcf3ce44SJohn Forte
5301*fcf3ce44SJohn Forte for (j = 0; j < (int)l_state->ib_tbl.config.type_hdr[index].num;
5302*fcf3ce44SJohn Forte j++) {
5303*fcf3ce44SJohn Forte (void) bcopy((const void *)
5304*fcf3ce44SJohn Forte &l_state->ib_tbl.p2_s.element[elem_index + j],
5305*fcf3ce44SJohn Forte (void *)&ps, sizeof (ps));
5306*fcf3ce44SJohn Forte (void) fprintf(stdout, "\t%d ", j);
5307*fcf3ce44SJohn Forte if (ps.code == S_OK) {
5308*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(29, "O.K."));
5309*fcf3ce44SJohn Forte revision_msg(l_state, elem_index + j);
5310*fcf3ce44SJohn Forte } else if (ps.code == S_CRITICAL) {
5311*fcf3ce44SJohn Forte (void) fprintf(stdout,
5312*fcf3ce44SJohn Forte MSGSTR(122, "Critical failure"));
5313*fcf3ce44SJohn Forte ps_decode(&ps);
5314*fcf3ce44SJohn Forte revision_msg(l_state, elem_index + j);
5315*fcf3ce44SJohn Forte } else if (ps.code == S_NONCRITICAL) {
5316*fcf3ce44SJohn Forte (void) fprintf(stdout,
5317*fcf3ce44SJohn Forte MSGSTR(89, "Non-Critical Failure"));
5318*fcf3ce44SJohn Forte ps_decode(&ps);
5319*fcf3ce44SJohn Forte revision_msg(l_state, elem_index + j);
5320*fcf3ce44SJohn Forte } else if (ps.code == S_NOT_INSTALLED) {
5321*fcf3ce44SJohn Forte (void) fprintf(stdout,
5322*fcf3ce44SJohn Forte MSGSTR(30, "Not Installed"));
5323*fcf3ce44SJohn Forte } else if (ps.code == S_NOT_AVAILABLE) {
5324*fcf3ce44SJohn Forte (void) fprintf(stdout,
5325*fcf3ce44SJohn Forte MSGSTR(34, "Disabled"));
5326*fcf3ce44SJohn Forte revision_msg(l_state, elem_index + j);
5327*fcf3ce44SJohn Forte } else {
5328*fcf3ce44SJohn Forte (void) fprintf(stdout,
5329*fcf3ce44SJohn Forte MSGSTR(4, "Unknown status"));
5330*fcf3ce44SJohn Forte }
5331*fcf3ce44SJohn Forte
5332*fcf3ce44SJohn Forte }
5333*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
5334*fcf3ce44SJohn Forte }
5335*fcf3ce44SJohn Forte
5336*fcf3ce44SJohn Forte
5337*fcf3ce44SJohn Forte
5338*fcf3ce44SJohn Forte /*
5339*fcf3ce44SJohn Forte * abnormal_condition() Display any abnormal condition messages.
5340*fcf3ce44SJohn Forte *
5341*fcf3ce44SJohn Forte * RETURNS:
5342*fcf3ce44SJohn Forte * none.
5343*fcf3ce44SJohn Forte */
5344*fcf3ce44SJohn Forte void
abnormal_condition_display(struct l_state_struct * l_state)5345*fcf3ce44SJohn Forte abnormal_condition_display(struct l_state_struct *l_state)
5346*fcf3ce44SJohn Forte {
5347*fcf3ce44SJohn Forte
5348*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
5349*fcf3ce44SJohn Forte if (l_state->ib_tbl.p2_s.ui.crit) {
5350*fcf3ce44SJohn Forte (void) fprintf(stdout,
5351*fcf3ce44SJohn Forte MSGSTR(2165, " "
5352*fcf3ce44SJohn Forte "CRITICAL CONDITION DETECTED\n"));
5353*fcf3ce44SJohn Forte }
5354*fcf3ce44SJohn Forte if (l_state->ib_tbl.p2_s.ui.non_crit) {
5355*fcf3ce44SJohn Forte (void) fprintf(stdout,
5356*fcf3ce44SJohn Forte MSGSTR(2166, " "
5357*fcf3ce44SJohn Forte "WARNING: NON-CRITICAL CONDITION DETECTED\n"));
5358*fcf3ce44SJohn Forte }
5359*fcf3ce44SJohn Forte if (l_state->ib_tbl.p2_s.ui.invop) {
5360*fcf3ce44SJohn Forte (void) fprintf(stdout,
5361*fcf3ce44SJohn Forte MSGSTR(2167, " "
5362*fcf3ce44SJohn Forte "WARNING: Invalid Operation bit set.\n"
5363*fcf3ce44SJohn Forte "\tThis means an Enclosure Control page"
5364*fcf3ce44SJohn Forte " or an Array Control page with an invalid\n"
5365*fcf3ce44SJohn Forte "\tformat has previously been transmitted to the"
5366*fcf3ce44SJohn Forte " Enclosure Services card by a\n\tSend Diagnostic"
5367*fcf3ce44SJohn Forte " SCSI command.\n"));
5368*fcf3ce44SJohn Forte }
5369*fcf3ce44SJohn Forte (void) fprintf(stdout, "\n");
5370*fcf3ce44SJohn Forte }
5371*fcf3ce44SJohn Forte
5372*fcf3ce44SJohn Forte
5373*fcf3ce44SJohn Forte
5374*fcf3ce44SJohn Forte
5375*fcf3ce44SJohn Forte
5376*fcf3ce44SJohn Forte /*
5377*fcf3ce44SJohn Forte * adm_start() Spin up the given list
5378*fcf3ce44SJohn Forte * of SENA devices.
5379*fcf3ce44SJohn Forte *
5380*fcf3ce44SJohn Forte * RETURNS:
5381*fcf3ce44SJohn Forte * none.
5382*fcf3ce44SJohn Forte */
5383*fcf3ce44SJohn Forte int
adm_start(char ** argv)5384*fcf3ce44SJohn Forte adm_start(char **argv)
5385*fcf3ce44SJohn Forte {
5386*fcf3ce44SJohn Forte char *path_phys = NULL;
5387*fcf3ce44SJohn Forte Path_struct *path_struct;
5388*fcf3ce44SJohn Forte int err = 0, retval = 0;
5389*fcf3ce44SJohn Forte
5390*fcf3ce44SJohn Forte while (*argv != NULL) {
5391*fcf3ce44SJohn Forte if ((err = l_convert_name(*argv, &path_phys,
5392*fcf3ce44SJohn Forte &path_struct, Options & PVERBOSE)) != 0) {
5393*fcf3ce44SJohn Forte (void) fprintf(stderr, MSGSTR(33,
5394*fcf3ce44SJohn Forte " Error: converting"
5395*fcf3ce44SJohn Forte " %s to physical path.\n"
5396*fcf3ce44SJohn Forte " Invalid pathname.\n"),
5397*fcf3ce44SJohn Forte *argv);
5398*fcf3ce44SJohn Forte if (err != -1) {
5399*fcf3ce44SJohn Forte (void) print_errString(err, *argv);
5400*fcf3ce44SJohn Forte }
5401*fcf3ce44SJohn Forte (argv)++;
5402*fcf3ce44SJohn Forte retval++;
5403*fcf3ce44SJohn Forte continue;
5404*fcf3ce44SJohn Forte }
5405*fcf3ce44SJohn Forte VERBPRINT(MSGSTR(101, "Issuing start to:\n %s\n"), *argv);
5406*fcf3ce44SJohn Forte if (err = g_start(path_phys)) {
5407*fcf3ce44SJohn Forte (void) print_errString(err, *argv);
5408*fcf3ce44SJohn Forte (argv)++;
5409*fcf3ce44SJohn Forte retval++;
5410*fcf3ce44SJohn Forte continue;
5411*fcf3ce44SJohn Forte }
5412*fcf3ce44SJohn Forte (argv)++;
5413*fcf3ce44SJohn Forte }
5414*fcf3ce44SJohn Forte return (retval);
5415*fcf3ce44SJohn Forte }
5416*fcf3ce44SJohn Forte
5417*fcf3ce44SJohn Forte
5418*fcf3ce44SJohn Forte
5419*fcf3ce44SJohn Forte /*
5420*fcf3ce44SJohn Forte * adm_stop() Spin down a
5421*fcf3ce44SJohn Forte * given list of SENA devices.
5422*fcf3ce44SJohn Forte *
5423*fcf3ce44SJohn Forte * RETURNS:
5424*fcf3ce44SJohn Forte * none.
5425*fcf3ce44SJohn Forte */
5426*fcf3ce44SJohn Forte int
adm_stop(char ** argv)5427*fcf3ce44SJohn Forte adm_stop(char **argv)
5428*fcf3ce44SJohn Forte {
5429*fcf3ce44SJohn Forte char *path_phys = NULL;
5430*fcf3ce44SJohn Forte Path_struct *path_struct;
5431*fcf3ce44SJohn Forte int err = 0, retval = 0;
5432*fcf3ce44SJohn Forte
5433*fcf3ce44SJohn Forte while (*argv != NULL) {
5434*fcf3ce44SJohn Forte if ((err = l_convert_name(*argv, &path_phys,
5435*fcf3ce44SJohn Forte &path_struct, Options & PVERBOSE)) != 0) {
5436*fcf3ce44SJohn Forte (void) fprintf(stderr,
5437*fcf3ce44SJohn Forte MSGSTR(33,
5438*fcf3ce44SJohn Forte " Error: converting"
5439*fcf3ce44SJohn Forte " %s to physical path.\n"
5440*fcf3ce44SJohn Forte " Invalid pathname.\n"),
5441*fcf3ce44SJohn Forte *argv);
5442*fcf3ce44SJohn Forte if (err != -1) {
5443*fcf3ce44SJohn Forte (void) print_errString(err, *argv);
5444*fcf3ce44SJohn Forte }
5445*fcf3ce44SJohn Forte (argv)++;
5446*fcf3ce44SJohn Forte retval++;
5447*fcf3ce44SJohn Forte continue;
5448*fcf3ce44SJohn Forte }
5449*fcf3ce44SJohn Forte
5450*fcf3ce44SJohn Forte /*
5451*fcf3ce44SJohn Forte * scsi stop is not supported for tape drives.
5452*fcf3ce44SJohn Forte * The scsi unload op code for tape is the same as a
5453*fcf3ce44SJohn Forte * scsi stop for disk so this command will eject the tape.
5454*fcf3ce44SJohn Forte * If an eject is the desired behavior then remove the
5455*fcf3ce44SJohn Forte * following if block. ('mt offline' will give you
5456*fcf3ce44SJohn Forte * the same eject functionality).
5457*fcf3ce44SJohn Forte */
5458*fcf3ce44SJohn Forte if (strstr(path_phys, SLSH_DRV_NAME_ST)) {
5459*fcf3ce44SJohn Forte errno = ENOTSUP;
5460*fcf3ce44SJohn Forte (void) print_errString(0, path_phys);
5461*fcf3ce44SJohn Forte (argv)++;
5462*fcf3ce44SJohn Forte continue;
5463*fcf3ce44SJohn Forte }
5464*fcf3ce44SJohn Forte
5465*fcf3ce44SJohn Forte VERBPRINT(MSGSTR(100, "Issuing stop to:\n %s\n"), *argv);
5466*fcf3ce44SJohn Forte if (err = g_stop(path_phys, 1)) {
5467*fcf3ce44SJohn Forte (void) print_errString(err, *argv);
5468*fcf3ce44SJohn Forte (argv)++;
5469*fcf3ce44SJohn Forte retval++;
5470*fcf3ce44SJohn Forte continue;
5471*fcf3ce44SJohn Forte }
5472*fcf3ce44SJohn Forte (argv)++;
5473*fcf3ce44SJohn Forte }
5474*fcf3ce44SJohn Forte return (retval);
5475*fcf3ce44SJohn Forte }
5476*fcf3ce44SJohn Forte
5477*fcf3ce44SJohn Forte
5478*fcf3ce44SJohn Forte /*
5479*fcf3ce44SJohn Forte * On a SOC+ chip, the port is either put into (offline) or pulled out
5480*fcf3ce44SJohn Forte * of (online) a loopback mode since the laser cannot be turned on or off.
5481*fcf3ce44SJohn Forte * As of this writing, this feature is yet to be supported by the ifp
5482*fcf3ce44SJohn Forte * driver on a QLogic card.
5483*fcf3ce44SJohn Forte *
5484*fcf3ce44SJohn Forte * INPUT :
5485*fcf3ce44SJohn Forte * Command line args and flag - LUX_P_ONLINE or LUX_P_OFFLINE
5486*fcf3ce44SJohn Forte * The path that is passed has to be the physical path to the port.
5487*fcf3ce44SJohn Forte * For example :
5488*fcf3ce44SJohn Forte * /devices/sbus@2,0/SUNW,socal@2,0:0
5489*fcf3ce44SJohn Forte * /devices/io-unit@f,e0200000/sbi@0,0/SUNW,socal@2,0:0
5490*fcf3ce44SJohn Forte * /devices/pci@1f,4000/SUNW,ifp@2:devctl
5491*fcf3ce44SJohn Forte * RETURNS :
5492*fcf3ce44SJohn Forte * Nothing
5493*fcf3ce44SJohn Forte */
5494*fcf3ce44SJohn Forte int
adm_port_offline_online(char * argv[],int flag)5495*fcf3ce44SJohn Forte adm_port_offline_online(char *argv[], int flag)
5496*fcf3ce44SJohn Forte {
5497*fcf3ce44SJohn Forte int err, retval = 0;
5498*fcf3ce44SJohn Forte char *path_phys = NULL;
5499*fcf3ce44SJohn Forte char *nexus_path_ptr = NULL;
5500*fcf3ce44SJohn Forte Path_struct *path_struct = NULL;
5501*fcf3ce44SJohn Forte
5502*fcf3ce44SJohn Forte while (*argv != NULL) {
5503*fcf3ce44SJohn Forte if ((err = l_convert_name(*argv, &path_phys,
5504*fcf3ce44SJohn Forte &path_struct, Options & PVERBOSE)) != 0) {
5505*fcf3ce44SJohn Forte (void) fprintf(stderr,
5506*fcf3ce44SJohn Forte MSGSTR(33,
5507*fcf3ce44SJohn Forte " Error: converting"
5508*fcf3ce44SJohn Forte " %s to physical path.\n"
5509*fcf3ce44SJohn Forte " Invalid pathname.\n"),
5510*fcf3ce44SJohn Forte *argv);
5511*fcf3ce44SJohn Forte if (err != -1) {
5512*fcf3ce44SJohn Forte (void) print_errString(err, *argv);
5513*fcf3ce44SJohn Forte }
5514*fcf3ce44SJohn Forte argv++;
5515*fcf3ce44SJohn Forte retval++;
5516*fcf3ce44SJohn Forte continue;
5517*fcf3ce44SJohn Forte }
5518*fcf3ce44SJohn Forte
5519*fcf3ce44SJohn Forte /* Get the nexus path - need this to print messages */
5520*fcf3ce44SJohn Forte if ((err = g_get_nexus_path(path_phys, &nexus_path_ptr)) != 0) {
5521*fcf3ce44SJohn Forte (void) print_errString(err, *argv);
5522*fcf3ce44SJohn Forte retval++;
5523*fcf3ce44SJohn Forte goto cleanup_and_go;
5524*fcf3ce44SJohn Forte }
5525*fcf3ce44SJohn Forte
5526*fcf3ce44SJohn Forte if (flag == LUX_P_OFFLINE) {
5527*fcf3ce44SJohn Forte if ((err = g_port_offline(nexus_path_ptr))) {
5528*fcf3ce44SJohn Forte (void) print_errString(err, nexus_path_ptr);
5529*fcf3ce44SJohn Forte retval++;
5530*fcf3ce44SJohn Forte goto cleanup_and_go;
5531*fcf3ce44SJohn Forte }
5532*fcf3ce44SJohn Forte fprintf(stdout,
5533*fcf3ce44SJohn Forte MSGSTR(2223, "Port %s has been disabled\n"),
5534*fcf3ce44SJohn Forte nexus_path_ptr);
5535*fcf3ce44SJohn Forte } else if (flag == LUX_P_ONLINE) {
5536*fcf3ce44SJohn Forte if ((err = g_port_online(nexus_path_ptr))) {
5537*fcf3ce44SJohn Forte (void) print_errString(err, nexus_path_ptr);
5538*fcf3ce44SJohn Forte retval++;
5539*fcf3ce44SJohn Forte goto cleanup_and_go;
5540*fcf3ce44SJohn Forte }
5541*fcf3ce44SJohn Forte fprintf(stdout,
5542*fcf3ce44SJohn Forte MSGSTR(2224, "Port %s has been enabled\n"),
5543*fcf3ce44SJohn Forte nexus_path_ptr);
5544*fcf3ce44SJohn Forte } else {
5545*fcf3ce44SJohn Forte (void) fprintf(stderr,
5546*fcf3ce44SJohn Forte MSGSTR(2225,
5547*fcf3ce44SJohn Forte "Unknown action requested "
5548*fcf3ce44SJohn Forte "on port - %d\nIgnoring."),
5549*fcf3ce44SJohn Forte flag);
5550*fcf3ce44SJohn Forte retval++;
5551*fcf3ce44SJohn Forte }
5552*fcf3ce44SJohn Forte cleanup_and_go:
5553*fcf3ce44SJohn Forte free(path_phys);
5554*fcf3ce44SJohn Forte free(path_struct);
5555*fcf3ce44SJohn Forte free(nexus_path_ptr);
5556*fcf3ce44SJohn Forte argv++;
5557*fcf3ce44SJohn Forte }
5558*fcf3ce44SJohn Forte return (retval);
5559*fcf3ce44SJohn Forte }
5560*fcf3ce44SJohn Forte
5561*fcf3ce44SJohn Forte /*
5562*fcf3ce44SJohn Forte * Expert level subcommand 'luxadm -e port'
5563*fcf3ce44SJohn Forte * which displays all FC ports on a host and state information for
5564*fcf3ce44SJohn Forte * connectivity (CONNECTED or NOT CONNECTED) indicating whether there
5565*fcf3ce44SJohn Forte * are devices attached to the port.
5566*fcf3ce44SJohn Forte *
5567*fcf3ce44SJohn Forte * Sample output for ifp:
5568*fcf3ce44SJohn Forte *
5569*fcf3ce44SJohn Forte * /devices/pci@1f,4000/SUNW,ifp@2:devctl CONNECTED
5570*fcf3ce44SJohn Forte * /devices/pci@1f,2000/SUNW,ifp@1:devctl NOT CONNECTED
5571*fcf3ce44SJohn Forte *
5572*fcf3ce44SJohn Forte * Sample output for socal:
5573*fcf3ce44SJohn Forte *
5574*fcf3ce44SJohn Forte * /devices/sbus@2,0/SUNW,socal@d,10000:0 CONNECTED
5575*fcf3ce44SJohn Forte * /devices/sbus@2,0/SUNW,socal@d,10000:1 NOT CONNECTED
5576*fcf3ce44SJohn Forte * /devices/sbus@2,0/SUNW,socal@2,0:0 NOT CONNECTED
5577*fcf3ce44SJohn Forte * /devices/sbus@2,0/SUNW,socal@2,0:1 CONNECTED
5578*fcf3ce44SJohn Forte *
5579*fcf3ce44SJohn Forte * Note: for socal the path returned is not a devctl path as there is no
5580*fcf3ce44SJohn Forte * devctl path for socal.
5581*fcf3ce44SJohn Forte *
5582*fcf3ce44SJohn Forte * Sample output for fp:
5583*fcf3ce44SJohn Forte *
5584*fcf3ce44SJohn Forte * /devices/sbus@2,0/SUNW,qlc@5/fp@0,0:devctl CONNECTED
5585*fcf3ce44SJohn Forte * /devices/sbus@2,0/SUNW,qlc@4/fp@1,0:devctl CONNECTED
5586*fcf3ce44SJohn Forte */
5587*fcf3ce44SJohn Forte int
adm_display_port(int verbose)5588*fcf3ce44SJohn Forte adm_display_port(int verbose)
5589*fcf3ce44SJohn Forte {
5590*fcf3ce44SJohn Forte /*
5591*fcf3ce44SJohn Forte * If another port driver needs to be searched, add it here
5592*fcf3ce44SJohn Forte */
5593*fcf3ce44SJohn Forte static char *portdrvr_list[] = {"socal",
5594*fcf3ce44SJohn Forte "fp",
5595*fcf3ce44SJohn Forte "ifp",
5596*fcf3ce44SJohn Forte NULL};
5597*fcf3ce44SJohn Forte portlist_t portlist;
5598*fcf3ce44SJohn Forte int x = 0, err = 0, retval = 0;
5599*fcf3ce44SJohn Forte int port_state;
5600*fcf3ce44SJohn Forte
5601*fcf3ce44SJohn Forte portlist.hbacnt = 0;
5602*fcf3ce44SJohn Forte
5603*fcf3ce44SJohn Forte /*
5604*fcf3ce44SJohn Forte * Look for all HBA ports as listed in portdrvr_list[]
5605*fcf3ce44SJohn Forte */
5606*fcf3ce44SJohn Forte while (portdrvr_list[x]) {
5607*fcf3ce44SJohn Forte if (err = g_get_port_path(portdrvr_list[x], &portlist)) {
5608*fcf3ce44SJohn Forte if (err != L_PORT_DRIVER_NOT_FOUND &&
5609*fcf3ce44SJohn Forte err != L_PHYS_PATH_NOT_FOUND) {
5610*fcf3ce44SJohn Forte (void) print_errString(err, portdrvr_list[x]);
5611*fcf3ce44SJohn Forte retval++;
5612*fcf3ce44SJohn Forte }
5613*fcf3ce44SJohn Forte }
5614*fcf3ce44SJohn Forte x++;
5615*fcf3ce44SJohn Forte }
5616*fcf3ce44SJohn Forte
5617*fcf3ce44SJohn Forte
5618*fcf3ce44SJohn Forte /*
5619*fcf3ce44SJohn Forte * For each port path found get the connection state.
5620*fcf3ce44SJohn Forte * If there are devices attached the state is considered connected.
5621*fcf3ce44SJohn Forte */
5622*fcf3ce44SJohn Forte for (x = 0; x < portlist.hbacnt; x++) {
5623*fcf3ce44SJohn Forte if (err = g_get_port_state(portlist.physpath[x],
5624*fcf3ce44SJohn Forte &port_state, verbose)) {
5625*fcf3ce44SJohn Forte (void) print_errString(err, portlist.physpath[x]);
5626*fcf3ce44SJohn Forte retval++;
5627*fcf3ce44SJohn Forte } else {
5628*fcf3ce44SJohn Forte fprintf(stdout, "%-65s ", portlist.physpath[x]);
5629*fcf3ce44SJohn Forte if (port_state == PORT_CONNECTED) {
5630*fcf3ce44SJohn Forte (void) fprintf(stdout,
5631*fcf3ce44SJohn Forte MSGSTR(2233,
5632*fcf3ce44SJohn Forte "CONNECTED\n"));
5633*fcf3ce44SJohn Forte } else {
5634*fcf3ce44SJohn Forte (void) fprintf(stdout,
5635*fcf3ce44SJohn Forte MSGSTR(2234,
5636*fcf3ce44SJohn Forte "NOT CONNECTED\n"));
5637*fcf3ce44SJohn Forte }
5638*fcf3ce44SJohn Forte }
5639*fcf3ce44SJohn Forte }
5640*fcf3ce44SJohn Forte g_free_portlist(&portlist);
5641*fcf3ce44SJohn Forte return (retval);
5642*fcf3ce44SJohn Forte }
5643*fcf3ce44SJohn Forte
5644*fcf3ce44SJohn Forte /*
5645*fcf3ce44SJohn Forte * Expert level subcommand 'luxadm -e external_loopback <portpath>
5646*fcf3ce44SJohn Forte * internal_loopback
5647*fcf3ce44SJohn Forte * no_loopback
5648*fcf3ce44SJohn Forte * Does just what you would think. Sets port in designated loopback
5649*fcf3ce44SJohn Forte * mode.
5650*fcf3ce44SJohn Forte * INPUT: portpath - path to device on which to set loopback mode
5651*fcf3ce44SJohn Forte * flag - loopback mode to set. Values are:
5652*fcf3ce44SJohn Forte * EXT_LOOPBACK
5653*fcf3ce44SJohn Forte * INT_LOOPBACK
5654*fcf3ce44SJohn Forte * NO_LOOPBACK
5655*fcf3ce44SJohn Forte *
5656*fcf3ce44SJohn Forte * RETURN: 0 on success
5657*fcf3ce44SJohn Forte * non-zero on failure
5658*fcf3ce44SJohn Forte */
5659*fcf3ce44SJohn Forte int
adm_port_loopback(char * portpath,int flag)5660*fcf3ce44SJohn Forte adm_port_loopback(char *portpath, int flag)
5661*fcf3ce44SJohn Forte {
5662*fcf3ce44SJohn Forte int err;
5663*fcf3ce44SJohn Forte char *path_phys = NULL;
5664*fcf3ce44SJohn Forte Path_struct *path_struct = NULL;
5665*fcf3ce44SJohn Forte int cmd;
5666*fcf3ce44SJohn Forte
5667*fcf3ce44SJohn Forte if ((err = l_convert_name(portpath, &path_phys,
5668*fcf3ce44SJohn Forte &path_struct, Options & PVERBOSE)) != 0) {
5669*fcf3ce44SJohn Forte (void) fprintf(stderr,
5670*fcf3ce44SJohn Forte MSGSTR(33,
5671*fcf3ce44SJohn Forte " Error: converting"
5672*fcf3ce44SJohn Forte " %s to physical path.\n"
5673*fcf3ce44SJohn Forte " Invalid pathname.\n"),
5674*fcf3ce44SJohn Forte portpath);
5675*fcf3ce44SJohn Forte if (err != -1) {
5676*fcf3ce44SJohn Forte (void) print_errString(err, portpath);
5677*fcf3ce44SJohn Forte }
5678*fcf3ce44SJohn Forte return (-1);
5679*fcf3ce44SJohn Forte }
5680*fcf3ce44SJohn Forte
5681*fcf3ce44SJohn Forte switch (flag) {
5682*fcf3ce44SJohn Forte case EXT_LOOPBACK:
5683*fcf3ce44SJohn Forte cmd = EXT_LPBACK;
5684*fcf3ce44SJohn Forte break;
5685*fcf3ce44SJohn Forte case INT_LOOPBACK:
5686*fcf3ce44SJohn Forte cmd = INT_LPBACK;
5687*fcf3ce44SJohn Forte break;
5688*fcf3ce44SJohn Forte case NO_LOOPBACK:
5689*fcf3ce44SJohn Forte cmd = NO_LPBACK;
5690*fcf3ce44SJohn Forte break;
5691*fcf3ce44SJohn Forte default:
5692*fcf3ce44SJohn Forte (void) fprintf(stderr,
5693*fcf3ce44SJohn Forte MSGSTR(2225,
5694*fcf3ce44SJohn Forte "Unknown action requested "
5695*fcf3ce44SJohn Forte "on port - %d\nIgnoring."),
5696*fcf3ce44SJohn Forte flag);
5697*fcf3ce44SJohn Forte free(path_phys);
5698*fcf3ce44SJohn Forte free(path_struct);
5699*fcf3ce44SJohn Forte return (-1);
5700*fcf3ce44SJohn Forte }
5701*fcf3ce44SJohn Forte
5702*fcf3ce44SJohn Forte
5703*fcf3ce44SJohn Forte if ((err = g_loopback_mode(path_phys, cmd)) != 0) {
5704*fcf3ce44SJohn Forte (void) print_errString(err, portpath);
5705*fcf3ce44SJohn Forte free(path_phys);
5706*fcf3ce44SJohn Forte free(path_struct);
5707*fcf3ce44SJohn Forte return (-1);
5708*fcf3ce44SJohn Forte } else {
5709*fcf3ce44SJohn Forte switch (flag) {
5710*fcf3ce44SJohn Forte case EXT_LOOPBACK:
5711*fcf3ce44SJohn Forte (void) fprintf(stdout,
5712*fcf3ce44SJohn Forte MSGSTR(2230,
5713*fcf3ce44SJohn Forte "External loopback mode set "
5714*fcf3ce44SJohn Forte "on:\n%s\n"),
5715*fcf3ce44SJohn Forte portpath);
5716*fcf3ce44SJohn Forte break;
5717*fcf3ce44SJohn Forte case INT_LOOPBACK:
5718*fcf3ce44SJohn Forte (void) fprintf(stdout,
5719*fcf3ce44SJohn Forte MSGSTR(2231,
5720*fcf3ce44SJohn Forte "Internal loopback mode set "
5721*fcf3ce44SJohn Forte "on:\n%s\n"),
5722*fcf3ce44SJohn Forte portpath);
5723*fcf3ce44SJohn Forte break;
5724*fcf3ce44SJohn Forte case NO_LOOPBACK:
5725*fcf3ce44SJohn Forte (void) fprintf(stdout,
5726*fcf3ce44SJohn Forte MSGSTR(2232,
5727*fcf3ce44SJohn Forte "Loopback mode unset "
5728*fcf3ce44SJohn Forte "on:\n%s\n"),
5729*fcf3ce44SJohn Forte portpath);
5730*fcf3ce44SJohn Forte break;
5731*fcf3ce44SJohn Forte default:
5732*fcf3ce44SJohn Forte fprintf(stderr,
5733*fcf3ce44SJohn Forte MSGSTR(2248, "Undefined command\n"));
5734*fcf3ce44SJohn Forte break;
5735*fcf3ce44SJohn Forte }
5736*fcf3ce44SJohn Forte }
5737*fcf3ce44SJohn Forte free(path_phys);
5738*fcf3ce44SJohn Forte free(path_struct);
5739*fcf3ce44SJohn Forte return (0);
5740*fcf3ce44SJohn Forte }
5741*fcf3ce44SJohn Forte
5742*fcf3ce44SJohn Forte
5743*fcf3ce44SJohn Forte
5744*fcf3ce44SJohn Forte /*
5745*fcf3ce44SJohn Forte * To print the pathlist and mpxio path attributes
5746*fcf3ce44SJohn Forte */
5747*fcf3ce44SJohn Forte void
adm_print_pathlist(char * dev_path)5748*fcf3ce44SJohn Forte adm_print_pathlist(char *dev_path)
5749*fcf3ce44SJohn Forte {
5750*fcf3ce44SJohn Forte int i, pathcnt = 1;
5751*fcf3ce44SJohn Forte mp_pathlist_t pathlist;
5752*fcf3ce44SJohn Forte int retval = 0;
5753*fcf3ce44SJohn Forte char temppath[MAXPATHLEN];
5754*fcf3ce44SJohn Forte char wwns[(WWN_SIZE *2) +1];
5755*fcf3ce44SJohn Forte uchar_t wwn_data[WWN_SIZE];
5756*fcf3ce44SJohn Forte int err;
5757*fcf3ce44SJohn Forte int state, ext_state = 0;
5758*fcf3ce44SJohn Forte char *path_state[5];
5759*fcf3ce44SJohn Forte
5760*fcf3ce44SJohn Forte path_state[0] = MSGSTR(2400, "INIT");
5761*fcf3ce44SJohn Forte path_state[1] = MSGSTR(2401, "ONLINE");
5762*fcf3ce44SJohn Forte path_state[2] = MSGSTR(2402, "STANDBY");
5763*fcf3ce44SJohn Forte path_state[3] = MSGSTR(2403, "FAULT");
5764*fcf3ce44SJohn Forte path_state[4] = MSGSTR(2404, "OFFLINE");
5765*fcf3ce44SJohn Forte
5766*fcf3ce44SJohn Forte (void) strcpy(temppath, dev_path);
5767*fcf3ce44SJohn Forte retval = g_get_pathlist(temppath, &pathlist);
5768*fcf3ce44SJohn Forte if (retval != 0) {
5769*fcf3ce44SJohn Forte (void) print_errString(retval, NULL);
5770*fcf3ce44SJohn Forte exit(-1);
5771*fcf3ce44SJohn Forte }
5772*fcf3ce44SJohn Forte pathcnt = pathlist.path_count;
5773*fcf3ce44SJohn Forte for (i = 0; i < pathcnt; i++) {
5774*fcf3ce44SJohn Forte (void) fprintf(stdout,
5775*fcf3ce44SJohn Forte MSGSTR(2303, " Controller \t%s\n"),
5776*fcf3ce44SJohn Forte pathlist.path_info[i].path_hba);
5777*fcf3ce44SJohn Forte
5778*fcf3ce44SJohn Forte (void) fprintf(stdout,
5779*fcf3ce44SJohn Forte MSGSTR(2304, " Device Address\t\t%s\n"),
5780*fcf3ce44SJohn Forte pathlist.path_info[i].path_addr);
5781*fcf3ce44SJohn Forte
5782*fcf3ce44SJohn Forte if ((err = get_host_controller_pwwn(
5783*fcf3ce44SJohn Forte pathlist.path_info[i].path_hba,
5784*fcf3ce44SJohn Forte (uchar_t *)&wwn_data)) != 0) {
5785*fcf3ce44SJohn Forte if (err != ENOTSUP) {
5786*fcf3ce44SJohn Forte (void) print_errString(err,
5787*fcf3ce44SJohn Forte pathlist.path_info[i].path_hba);
5788*fcf3ce44SJohn Forte exit(1);
5789*fcf3ce44SJohn Forte }
5790*fcf3ce44SJohn Forte }
5791*fcf3ce44SJohn Forte
5792*fcf3ce44SJohn Forte if (!err) {
5793*fcf3ce44SJohn Forte copy_wwn_data_to_str(wwns, wwn_data);
5794*fcf3ce44SJohn Forte (void) fprintf(stdout,
5795*fcf3ce44SJohn Forte MSGSTR(2326, " Host controller port WWN\t%s\n"),
5796*fcf3ce44SJohn Forte wwns);
5797*fcf3ce44SJohn Forte }
5798*fcf3ce44SJohn Forte
5799*fcf3ce44SJohn Forte (void) fprintf(stdout,
5800*fcf3ce44SJohn Forte MSGSTR(2305, " Class\t\t\t%s\n"),
5801*fcf3ce44SJohn Forte pathlist.path_info[i].path_class);
5802*fcf3ce44SJohn Forte if (pathlist.path_info[i].path_state < MAXPATHSTATE) {
5803*fcf3ce44SJohn Forte (void) fprintf(stdout,
5804*fcf3ce44SJohn Forte MSGSTR(2306, " State\t\t\t%s\n"),
5805*fcf3ce44SJohn Forte path_state[pathlist.path_info[i].path_state]);
5806*fcf3ce44SJohn Forte }
5807*fcf3ce44SJohn Forte if ((err = g_stms_get_path_state(dev_path,
5808*fcf3ce44SJohn Forte pathlist.path_info[i].path_hba, &state,
5809*fcf3ce44SJohn Forte &ext_state)) != 0) {
5810*fcf3ce44SJohn Forte (void) print_errString(err,
5811*fcf3ce44SJohn Forte pathlist.path_info[i].path_hba);
5812*fcf3ce44SJohn Forte exit(1);
5813*fcf3ce44SJohn Forte } else {
5814*fcf3ce44SJohn Forte if ((ext_state & MDI_PATHINFO_STATE_USER_DISABLE)
5815*fcf3ce44SJohn Forte == MDI_PATHINFO_STATE_USER_DISABLE) {
5816*fcf3ce44SJohn Forte ext_state = 0;
5817*fcf3ce44SJohn Forte fprintf(stdout,
5818*fcf3ce44SJohn Forte MSGSTR(2327,
5819*fcf3ce44SJohn Forte " I/Os disabled on this %s path\n\n"),
5820*fcf3ce44SJohn Forte path_state[pathlist.path_info[i].path_state]);
5821*fcf3ce44SJohn Forte }
5822*fcf3ce44SJohn Forte }
5823*fcf3ce44SJohn Forte }
5824*fcf3ce44SJohn Forte /* Free memory for per path info properties */
5825*fcf3ce44SJohn Forte free(pathlist.path_info);
5826*fcf3ce44SJohn Forte }
5827*fcf3ce44SJohn Forte
5828*fcf3ce44SJohn Forte /*
5829*fcf3ce44SJohn Forte * compare_multipath
5830*fcf3ce44SJohn Forte * compares path with all paths in pathlist
5831*fcf3ce44SJohn Forte * If there is a match, 0 is returned, otherwise 1 is returned
5832*fcf3ce44SJohn Forte */
5833*fcf3ce44SJohn Forte int
compare_multipath(char * path,struct mplist_struct * pathlist)5834*fcf3ce44SJohn Forte compare_multipath(char *path, struct mplist_struct *pathlist)
5835*fcf3ce44SJohn Forte {
5836*fcf3ce44SJohn Forte
5837*fcf3ce44SJohn Forte while (pathlist != NULL) {
5838*fcf3ce44SJohn Forte if (strncmp(path, pathlist->devpath, MAXPATHLEN) == 0) {
5839*fcf3ce44SJohn Forte return (0);
5840*fcf3ce44SJohn Forte }
5841*fcf3ce44SJohn Forte pathlist = pathlist->next;
5842*fcf3ce44SJohn Forte }
5843*fcf3ce44SJohn Forte return (1);
5844*fcf3ce44SJohn Forte }
5845*fcf3ce44SJohn Forte
5846*fcf3ce44SJohn Forte /*
5847*fcf3ce44SJohn Forte * lun_display() Prints the
5848*fcf3ce44SJohn Forte * information for an individual lun.
5849*fcf3ce44SJohn Forte *
5850*fcf3ce44SJohn Forte * RETURNS:
5851*fcf3ce44SJohn Forte * none.
5852*fcf3ce44SJohn Forte */
5853*fcf3ce44SJohn Forte static int
lun_display(Path_struct * path_struct,L_inquiry inq_struct,int verbose)5854*fcf3ce44SJohn Forte lun_display(Path_struct *path_struct, L_inquiry inq_struct, int verbose)
5855*fcf3ce44SJohn Forte {
5856*fcf3ce44SJohn Forte
5857*fcf3ce44SJohn Forte char phys_path[MAXPATHLEN], last_logical_path[MAXPATHLEN];
5858*fcf3ce44SJohn Forte uchar_t *pg_buf = NULL;
5859*fcf3ce44SJohn Forte L_disk_state l_disk_state;
5860*fcf3ce44SJohn Forte struct dlist *mlist;
5861*fcf3ce44SJohn Forte int offset, mode_data_avail, err = 0;
5862*fcf3ce44SJohn Forte Mode_header_10 *mode_header_ptr;
5863*fcf3ce44SJohn Forte struct mode_page *pg_hdr;
5864*fcf3ce44SJohn Forte WWN_list *wwn_list, *list_start, *wwn_list_ptr;
5865*fcf3ce44SJohn Forte WWN_list *wwn_list_find;
5866*fcf3ce44SJohn Forte int found = 0;
5867*fcf3ce44SJohn Forte int argpwwn = 0, argnwwn = 0;
5868*fcf3ce44SJohn Forte struct mplist_struct *mplistp, *mpl, *mpln;
5869*fcf3ce44SJohn Forte struct dlist *dlist;
5870*fcf3ce44SJohn Forte
5871*fcf3ce44SJohn Forte
5872*fcf3ce44SJohn Forte
5873*fcf3ce44SJohn Forte strcpy(phys_path, path_struct->p_physical_path);
5874*fcf3ce44SJohn Forte strcpy(last_logical_path, phys_path);
5875*fcf3ce44SJohn Forte
5876*fcf3ce44SJohn Forte mplistp = mpl = mpln = (struct mplist_struct *)NULL;
5877*fcf3ce44SJohn Forte /*
5878*fcf3ce44SJohn Forte * Get path to all the FC disk and tape devices.
5879*fcf3ce44SJohn Forte * If there is no slash in the argument in this routine, we assume
5880*fcf3ce44SJohn Forte * it is a wwn argument.
5881*fcf3ce44SJohn Forte */
5882*fcf3ce44SJohn Forte if (strstr(path_struct->argv, "/") != NULL) {
5883*fcf3ce44SJohn Forte if ((err = g_devices_get_all(&wwn_list)) != 0) {
5884*fcf3ce44SJohn Forte return (err);
5885*fcf3ce44SJohn Forte }
5886*fcf3ce44SJohn Forte } else {
5887*fcf3ce44SJohn Forte if ((err = g_get_wwn_list(&wwn_list, verbose)) != 0) {
5888*fcf3ce44SJohn Forte return (err);
5889*fcf3ce44SJohn Forte }
5890*fcf3ce44SJohn Forte }
5891*fcf3ce44SJohn Forte
5892*fcf3ce44SJohn Forte g_sort_wwn_list(&wwn_list);
5893*fcf3ce44SJohn Forte
5894*fcf3ce44SJohn Forte list_start = wwn_list;
5895*fcf3ce44SJohn Forte
5896*fcf3ce44SJohn Forte for (wwn_list_ptr = wwn_list; wwn_list_ptr != NULL;
5897*fcf3ce44SJohn Forte wwn_list_ptr = wwn_list_ptr->wwn_next) {
5898*fcf3ce44SJohn Forte if (strcasecmp(wwn_list_ptr->port_wwn_s,
5899*fcf3ce44SJohn Forte path_struct->argv) == 0) {
5900*fcf3ce44SJohn Forte list_start = wwn_list_ptr;
5901*fcf3ce44SJohn Forte argpwwn = 1;
5902*fcf3ce44SJohn Forte break;
5903*fcf3ce44SJohn Forte } else if (strcasecmp(wwn_list_ptr->node_wwn_s,
5904*fcf3ce44SJohn Forte path_struct->argv) == 0) {
5905*fcf3ce44SJohn Forte list_start = wwn_list_ptr;
5906*fcf3ce44SJohn Forte argnwwn = 1;
5907*fcf3ce44SJohn Forte break;
5908*fcf3ce44SJohn Forte }
5909*fcf3ce44SJohn Forte }
5910*fcf3ce44SJohn Forte
5911*fcf3ce44SJohn Forte for (wwn_list_ptr = list_start; wwn_list_ptr != NULL;
5912*fcf3ce44SJohn Forte wwn_list_ptr = wwn_list_ptr->wwn_next) {
5913*fcf3ce44SJohn Forte
5914*fcf3ce44SJohn Forte
5915*fcf3ce44SJohn Forte if (argpwwn) {
5916*fcf3ce44SJohn Forte if (strcasecmp(wwn_list_ptr->port_wwn_s,
5917*fcf3ce44SJohn Forte path_struct->argv) != 0) {
5918*fcf3ce44SJohn Forte continue;
5919*fcf3ce44SJohn Forte }
5920*fcf3ce44SJohn Forte (void) strcpy(phys_path, wwn_list_ptr->physical_path);
5921*fcf3ce44SJohn Forte } else if (argnwwn) {
5922*fcf3ce44SJohn Forte if (strstr(wwn_list_ptr->logical_path,
5923*fcf3ce44SJohn Forte last_logical_path) != NULL) {
5924*fcf3ce44SJohn Forte continue;
5925*fcf3ce44SJohn Forte }
5926*fcf3ce44SJohn Forte if (strcasecmp(wwn_list_ptr->node_wwn_s,
5927*fcf3ce44SJohn Forte path_struct->argv) != 0) {
5928*fcf3ce44SJohn Forte continue;
5929*fcf3ce44SJohn Forte }
5930*fcf3ce44SJohn Forte (void) strcpy(phys_path, wwn_list_ptr->physical_path);
5931*fcf3ce44SJohn Forte (void) strcpy(last_logical_path,
5932*fcf3ce44SJohn Forte wwn_list_ptr->logical_path);
5933*fcf3ce44SJohn Forte }
5934*fcf3ce44SJohn Forte
5935*fcf3ce44SJohn Forte if (argnwwn || argpwwn) {
5936*fcf3ce44SJohn Forte if (compare_multipath(wwn_list_ptr->logical_path,
5937*fcf3ce44SJohn Forte mplistp) == 0) {
5938*fcf3ce44SJohn Forte continue;
5939*fcf3ce44SJohn Forte }
5940*fcf3ce44SJohn Forte }
5941*fcf3ce44SJohn Forte
5942*fcf3ce44SJohn Forte mode_data_avail = 0;
5943*fcf3ce44SJohn Forte
5944*fcf3ce44SJohn Forte (void) memset(&l_disk_state, 0, sizeof (struct l_disk_state_struct));
5945*fcf3ce44SJohn Forte
5946*fcf3ce44SJohn Forte /*
5947*fcf3ce44SJohn Forte * Don't call g_get_multipath if this is a SCSI_VHCI device
5948*fcf3ce44SJohn Forte * dlist gets alloc'ed here to retain the free at the end
5949*fcf3ce44SJohn Forte */
5950*fcf3ce44SJohn Forte if (strstr(phys_path, SCSI_VHCI) == NULL) {
5951*fcf3ce44SJohn Forte if ((err = g_get_multipath(phys_path,
5952*fcf3ce44SJohn Forte &(l_disk_state.g_disk_state.multipath_list),
5953*fcf3ce44SJohn Forte wwn_list, verbose)) != 0) {
5954*fcf3ce44SJohn Forte return (err);
5955*fcf3ce44SJohn Forte }
5956*fcf3ce44SJohn Forte
5957*fcf3ce44SJohn Forte mlist = l_disk_state.g_disk_state.multipath_list;
5958*fcf3ce44SJohn Forte if (mlist == NULL) {
5959*fcf3ce44SJohn Forte l_disk_state.l_state_flag = L_NO_PATH_FOUND;
5960*fcf3ce44SJohn Forte N_DPRINTF(" lun_display: Error finding"
5961*fcf3ce44SJohn Forte " multiple paths to the disk.\n");
5962*fcf3ce44SJohn Forte (void) g_free_wwn_list(&wwn_list);
5963*fcf3ce44SJohn Forte return (L_NO_VALID_PATH);
5964*fcf3ce44SJohn Forte }
5965*fcf3ce44SJohn Forte } else {
5966*fcf3ce44SJohn Forte /* Search for match on physical path name */
5967*fcf3ce44SJohn Forte for (wwn_list_find = list_start; wwn_list_find != NULL;
5968*fcf3ce44SJohn Forte wwn_list_find = wwn_list_find->wwn_next) {
5969*fcf3ce44SJohn Forte if (strncmp(wwn_list_find->physical_path, phys_path,
5970*fcf3ce44SJohn Forte strlen(wwn_list_find->physical_path))
5971*fcf3ce44SJohn Forte == 0) {
5972*fcf3ce44SJohn Forte found++;
5973*fcf3ce44SJohn Forte break;
5974*fcf3ce44SJohn Forte }
5975*fcf3ce44SJohn Forte }
5976*fcf3ce44SJohn Forte
5977*fcf3ce44SJohn Forte if (!found) {
5978*fcf3ce44SJohn Forte return (L_NO_VALID_PATH);
5979*fcf3ce44SJohn Forte } else {
5980*fcf3ce44SJohn Forte found = 0;
5981*fcf3ce44SJohn Forte }
5982*fcf3ce44SJohn Forte
5983*fcf3ce44SJohn Forte if ((dlist = (struct dlist *)
5984*fcf3ce44SJohn Forte calloc(1, sizeof (struct dlist))) == NULL) {
5985*fcf3ce44SJohn Forte return (L_MALLOC_FAILED);
5986*fcf3ce44SJohn Forte }
5987*fcf3ce44SJohn Forte if ((dlist->logical_path = (char *)calloc(1,
5988*fcf3ce44SJohn Forte strlen(wwn_list_find->logical_path) + 1)) == NULL) {
5989*fcf3ce44SJohn Forte return (L_MALLOC_FAILED);
5990*fcf3ce44SJohn Forte }
5991*fcf3ce44SJohn Forte if ((dlist->dev_path = (char *)calloc(1,
5992*fcf3ce44SJohn Forte strlen(phys_path) + 1)) == NULL) {
5993*fcf3ce44SJohn Forte return (L_MALLOC_FAILED);
5994*fcf3ce44SJohn Forte }
5995*fcf3ce44SJohn Forte strncpy(dlist->logical_path, wwn_list_find->logical_path,
5996*fcf3ce44SJohn Forte strlen(wwn_list_find->logical_path));
5997*fcf3ce44SJohn Forte strncpy(dlist->dev_path, phys_path, strlen(phys_path));
5998*fcf3ce44SJohn Forte l_disk_state.g_disk_state.multipath_list = dlist;
5999*fcf3ce44SJohn Forte }
6000*fcf3ce44SJohn Forte
6001*fcf3ce44SJohn Forte if (argnwwn || argpwwn) {
6002*fcf3ce44SJohn Forte for (mlist = l_disk_state.g_disk_state.multipath_list;
6003*fcf3ce44SJohn Forte mlist != NULL; mlist = mlist->next) {
6004*fcf3ce44SJohn Forte /* add the path to the list for compare */
6005*fcf3ce44SJohn Forte if ((mpl = (struct mplist_struct *)
6006*fcf3ce44SJohn Forte calloc(1, sizeof (struct mplist_struct)))
6007*fcf3ce44SJohn Forte == NULL) {
6008*fcf3ce44SJohn Forte adm_mplist_free(mplistp);
6009*fcf3ce44SJohn Forte return (L_MALLOC_FAILED);
6010*fcf3ce44SJohn Forte }
6011*fcf3ce44SJohn Forte
6012*fcf3ce44SJohn Forte mpl->devpath = (char *)calloc(1, MAXPATHLEN+1);
6013*fcf3ce44SJohn Forte if (mpl->devpath == NULL) {
6014*fcf3ce44SJohn Forte adm_mplist_free(mplistp);
6015*fcf3ce44SJohn Forte return (L_MALLOC_FAILED);
6016*fcf3ce44SJohn Forte }
6017*fcf3ce44SJohn Forte strncpy(mpl->devpath, mlist->logical_path,
6018*fcf3ce44SJohn Forte strlen(mlist->logical_path));
6019*fcf3ce44SJohn Forte if (mplistp == NULL) {
6020*fcf3ce44SJohn Forte mplistp = mpln = mpl;
6021*fcf3ce44SJohn Forte } else {
6022*fcf3ce44SJohn Forte mpln->next = mpl;
6023*fcf3ce44SJohn Forte mpln = mpl;
6024*fcf3ce44SJohn Forte }
6025*fcf3ce44SJohn Forte }
6026*fcf3ce44SJohn Forte }
6027*fcf3ce44SJohn Forte
6028*fcf3ce44SJohn Forte /* get mode page information for FC device */
6029*fcf3ce44SJohn Forte if (l_get_mode_pg(phys_path, &pg_buf, verbose) == 0) {
6030*fcf3ce44SJohn Forte mode_header_ptr = (struct mode_header_10_struct *)
6031*fcf3ce44SJohn Forte (void *)pg_buf;
6032*fcf3ce44SJohn Forte offset = sizeof (struct mode_header_10_struct) +
6033*fcf3ce44SJohn Forte mode_header_ptr->bdesc_length;
6034*fcf3ce44SJohn Forte pg_hdr = (struct mode_page *)&pg_buf[offset];
6035*fcf3ce44SJohn Forte
6036*fcf3ce44SJohn Forte while (offset < (mode_header_ptr->length +
6037*fcf3ce44SJohn Forte sizeof (mode_header_ptr->length)) &&
6038*fcf3ce44SJohn Forte !mode_data_avail) {
6039*fcf3ce44SJohn Forte if (pg_hdr->code == MODEPAGE_CACHING) {
6040*fcf3ce44SJohn Forte mode_data_avail++;
6041*fcf3ce44SJohn Forte break;
6042*fcf3ce44SJohn Forte }
6043*fcf3ce44SJohn Forte offset += pg_hdr->length + sizeof (struct mode_page);
6044*fcf3ce44SJohn Forte pg_hdr = (struct mode_page *)&pg_buf[offset];
6045*fcf3ce44SJohn Forte }
6046*fcf3ce44SJohn Forte }
6047*fcf3ce44SJohn Forte
6048*fcf3ce44SJohn Forte switch ((inq_struct.inq_dtype & DTYPE_MASK)) {
6049*fcf3ce44SJohn Forte case DTYPE_DIRECT:
6050*fcf3ce44SJohn Forte fprintf(stdout, MSGSTR(121, "DEVICE PROPERTIES for disk: %s\n"),
6051*fcf3ce44SJohn Forte path_struct->argv);
6052*fcf3ce44SJohn Forte break;
6053*fcf3ce44SJohn Forte case DTYPE_SEQUENTIAL: /* Tape */
6054*fcf3ce44SJohn Forte fprintf(stdout, MSGSTR(2249, "DEVICE PROPERTIES for tape: %s\n"),
6055*fcf3ce44SJohn Forte path_struct->argv);
6056*fcf3ce44SJohn Forte break;
6057*fcf3ce44SJohn Forte default:
6058*fcf3ce44SJohn Forte fprintf(stdout, MSGSTR(2250, "DEVICE PROPERTIES for: %s\n"),
6059*fcf3ce44SJohn Forte path_struct->argv);
6060*fcf3ce44SJohn Forte break;
6061*fcf3ce44SJohn Forte }
6062*fcf3ce44SJohn Forte
6063*fcf3ce44SJohn Forte (void) display_lun_info(l_disk_state, path_struct, pg_hdr,
6064*fcf3ce44SJohn Forte mode_data_avail, wwn_list, phys_path);
6065*fcf3ce44SJohn Forte
6066*fcf3ce44SJohn Forte (void) g_free_multipath(l_disk_state.g_disk_state.multipath_list);
6067*fcf3ce44SJohn Forte
6068*fcf3ce44SJohn Forte if (!(argpwwn || argnwwn)) {
6069*fcf3ce44SJohn Forte break;
6070*fcf3ce44SJohn Forte }
6071*fcf3ce44SJohn Forte
6072*fcf3ce44SJohn Forte } /* End for wwn_list_ptr = list_start... */
6073*fcf3ce44SJohn Forte
6074*fcf3ce44SJohn Forte (void) g_free_wwn_list(&wwn_list);
6075*fcf3ce44SJohn Forte adm_mplist_free(mplistp);
6076*fcf3ce44SJohn Forte return (0);
6077*fcf3ce44SJohn Forte }
6078*fcf3ce44SJohn Forte
6079*fcf3ce44SJohn Forte /*
6080*fcf3ce44SJohn Forte * display_lun_info() Prints the device specific information
6081*fcf3ce44SJohn Forte * for a lun.
6082*fcf3ce44SJohn Forte *
6083*fcf3ce44SJohn Forte * RETURNS:
6084*fcf3ce44SJohn Forte * none.
6085*fcf3ce44SJohn Forte */
6086*fcf3ce44SJohn Forte void
display_lun_info(L_disk_state l_disk_state,Path_struct * path_struct,struct mode_page * pg_hdr,int mode_data_avail,WWN_list * wwn_list,char * phys_path)6087*fcf3ce44SJohn Forte display_lun_info(L_disk_state l_disk_state, Path_struct *path_struct,
6088*fcf3ce44SJohn Forte struct mode_page *pg_hdr, int mode_data_avail, WWN_list
6089*fcf3ce44SJohn Forte *wwn_list, char *phys_path)
6090*fcf3ce44SJohn Forte {
6091*fcf3ce44SJohn Forte float lunMbytes;
6092*fcf3ce44SJohn Forte struct scsi_capacity_16 cap_data;
6093*fcf3ce44SJohn Forte struct dlist *mlist;
6094*fcf3ce44SJohn Forte struct my_mode_caching *pg8_buf;
6095*fcf3ce44SJohn Forte int err;
6096*fcf3ce44SJohn Forte L_inquiry inq;
6097*fcf3ce44SJohn Forte hrtime_t start_time, end_time;
6098*fcf3ce44SJohn Forte char *envdb = NULL;
6099*fcf3ce44SJohn Forte int peripheral_qual;
6100*fcf3ce44SJohn Forte L_inquiry80 inq80;
6101*fcf3ce44SJohn Forte size_t serial_len = sizeof (inq80.inq_serial);
6102*fcf3ce44SJohn Forte
6103*fcf3ce44SJohn Forte if ((envdb = getenv("_LUX_T_DEBUG")) != NULL) {
6104*fcf3ce44SJohn Forte start_time = gethrtime();
6105*fcf3ce44SJohn Forte }
6106*fcf3ce44SJohn Forte
6107*fcf3ce44SJohn Forte memset(&cap_data, 0, sizeof (cap_data));
6108*fcf3ce44SJohn Forte
6109*fcf3ce44SJohn Forte if (err = g_get_inquiry(phys_path, &inq)) {
6110*fcf3ce44SJohn Forte fprintf(stderr, "\n");
6111*fcf3ce44SJohn Forte print_errString(err, phys_path);
6112*fcf3ce44SJohn Forte fprintf(stderr, "\n");
6113*fcf3ce44SJohn Forte exit(1);
6114*fcf3ce44SJohn Forte }
6115*fcf3ce44SJohn Forte
6116*fcf3ce44SJohn Forte if (err = g_get_serial_number(phys_path, inq80.inq_serial,
6117*fcf3ce44SJohn Forte &serial_len)) {
6118*fcf3ce44SJohn Forte fprintf(stderr, "\n");
6119*fcf3ce44SJohn Forte print_errString(err, phys_path);
6120*fcf3ce44SJohn Forte fprintf(stderr, "\n");
6121*fcf3ce44SJohn Forte exit(1);
6122*fcf3ce44SJohn Forte }
6123*fcf3ce44SJohn Forte /*
6124*fcf3ce44SJohn Forte * check to see if the peripheral qualifier is zero
6125*fcf3ce44SJohn Forte * if it is non-zero, we will return with an error.
6126*fcf3ce44SJohn Forte */
6127*fcf3ce44SJohn Forte peripheral_qual = inq.inq_dtype & ~DTYPE_MASK;
6128*fcf3ce44SJohn Forte if (peripheral_qual != DPQ_POSSIBLE) {
6129*fcf3ce44SJohn Forte fprintf(stderr, MSGSTR(2254, "\n Error: Logical Unit "
6130*fcf3ce44SJohn Forte "(%s) is not available.\n"), phys_path);
6131*fcf3ce44SJohn Forte exit(1);
6132*fcf3ce44SJohn Forte }
6133*fcf3ce44SJohn Forte
6134*fcf3ce44SJohn Forte fprintf(stdout, " ");
6135*fcf3ce44SJohn Forte fprintf(stdout, MSGSTR(3, "Vendor:"));
6136*fcf3ce44SJohn Forte fprintf(stdout, "\t\t");
6137*fcf3ce44SJohn Forte print_chars(inq.inq_vid, sizeof (inq.inq_vid), 0);
6138*fcf3ce44SJohn Forte fprintf(stdout, MSGSTR(2115, "\n Product ID:\t\t"));
6139*fcf3ce44SJohn Forte print_chars(inq.inq_pid, sizeof (inq.inq_pid), 0);
6140*fcf3ce44SJohn Forte
6141*fcf3ce44SJohn Forte fprintf(stdout, "\n ");
6142*fcf3ce44SJohn Forte fprintf(stdout, MSGSTR(2119, "Revision:"));
6143*fcf3ce44SJohn Forte fprintf(stdout, "\t\t");
6144*fcf3ce44SJohn Forte print_chars(inq.inq_revision, sizeof (inq.inq_revision), 0);
6145*fcf3ce44SJohn Forte
6146*fcf3ce44SJohn Forte fprintf(stdout, "\n ");
6147*fcf3ce44SJohn Forte fprintf(stdout, MSGSTR(17, "Serial Num:"));
6148*fcf3ce44SJohn Forte fprintf(stdout, "\t\t");
6149*fcf3ce44SJohn Forte print_chars(inq80.inq_serial, serial_len, 0);
6150*fcf3ce44SJohn Forte
6151*fcf3ce44SJohn Forte if ((inq.inq_dtype & DTYPE_MASK) == DTYPE_DIRECT) {
6152*fcf3ce44SJohn Forte if ((err = get_lun_capacity(phys_path, &cap_data)) != 0) {
6153*fcf3ce44SJohn Forte print_errString(err, phys_path);
6154*fcf3ce44SJohn Forte exit(1);
6155*fcf3ce44SJohn Forte }
6156*fcf3ce44SJohn Forte
6157*fcf3ce44SJohn Forte if (cap_data.sc_capacity > 0 && cap_data.sc_lbasize > 0) {
6158*fcf3ce44SJohn Forte lunMbytes = cap_data.sc_capacity + 1;
6159*fcf3ce44SJohn Forte lunMbytes *= cap_data.sc_lbasize;
6160*fcf3ce44SJohn Forte lunMbytes /= (float)(1024*1024);
6161*fcf3ce44SJohn Forte fprintf(stdout, "\n ");
6162*fcf3ce44SJohn Forte fprintf(stdout, MSGSTR(60,
6163*fcf3ce44SJohn Forte "Unformatted capacity:\t%6.3f MBytes"), lunMbytes);
6164*fcf3ce44SJohn Forte }
6165*fcf3ce44SJohn Forte }
6166*fcf3ce44SJohn Forte
6167*fcf3ce44SJohn Forte fprintf(stdout, "\n");
6168*fcf3ce44SJohn Forte
6169*fcf3ce44SJohn Forte if ((mode_data_avail) && (pg_hdr->code == MODEPAGE_CACHING)) {
6170*fcf3ce44SJohn Forte pg8_buf = (struct my_mode_caching *)(void *)pg_hdr;
6171*fcf3ce44SJohn Forte if (pg8_buf->wce) {
6172*fcf3ce44SJohn Forte fprintf(stdout, MSGSTR(2122, " Write Cache:\t\t"
6173*fcf3ce44SJohn Forte "Enabled\n"));
6174*fcf3ce44SJohn Forte }
6175*fcf3ce44SJohn Forte if (pg8_buf->rcd == 0) {
6176*fcf3ce44SJohn Forte fprintf(stdout, MSGSTR(2123, " Read Cache:\t\t"
6177*fcf3ce44SJohn Forte "Enabled\n"));
6178*fcf3ce44SJohn Forte fprintf(stdout, MSGSTR(2124, " Minimum prefetch:"
6179*fcf3ce44SJohn Forte "\t0x%x\n Maximum prefetch:\t0x%x\n"),
6180*fcf3ce44SJohn Forte pg8_buf->min_prefetch,
6181*fcf3ce44SJohn Forte pg8_buf->max_prefetch);
6182*fcf3ce44SJohn Forte }
6183*fcf3ce44SJohn Forte }
6184*fcf3ce44SJohn Forte
6185*fcf3ce44SJohn Forte fprintf(stdout, " %s\t\t%s\n", MSGSTR(35, "Device Type:"),
6186*fcf3ce44SJohn Forte dtype[inq.inq_dtype & DTYPE_MASK]);
6187*fcf3ce44SJohn Forte
6188*fcf3ce44SJohn Forte
6189*fcf3ce44SJohn Forte fprintf(stdout, MSGSTR(2128, " Path(s):\n"));
6190*fcf3ce44SJohn Forte fprintf(stdout, "\n");
6191*fcf3ce44SJohn Forte
6192*fcf3ce44SJohn Forte if ((mlist = l_disk_state.g_disk_state.multipath_list) == NULL) {
6193*fcf3ce44SJohn Forte fprintf(stderr, MSGSTR(2323, "Error: No paths found (%s)"),
6194*fcf3ce44SJohn Forte path_struct->argv);
6195*fcf3ce44SJohn Forte exit(1);
6196*fcf3ce44SJohn Forte }
6197*fcf3ce44SJohn Forte
6198*fcf3ce44SJohn Forte
6199*fcf3ce44SJohn Forte if (strstr(mlist->dev_path, SCSI_VHCI) != NULL) {
6200*fcf3ce44SJohn Forte fprintf(stdout, " %s\n %s\n",
6201*fcf3ce44SJohn Forte mlist->logical_path, mlist->dev_path);
6202*fcf3ce44SJohn Forte adm_print_pathlist(mlist->dev_path);
6203*fcf3ce44SJohn Forte } else {
6204*fcf3ce44SJohn Forte /*
6205*fcf3ce44SJohn Forte * first display user's requested path
6206*fcf3ce44SJohn Forte * This will avoid duplicate inquiries as well
6207*fcf3ce44SJohn Forte */
6208*fcf3ce44SJohn Forte for (mlist = l_disk_state.g_disk_state.multipath_list;
6209*fcf3ce44SJohn Forte mlist != NULL; mlist = mlist->next) {
6210*fcf3ce44SJohn Forte if ((strcmp(mlist->dev_path, path_struct->p_physical_path))
6211*fcf3ce44SJohn Forte == 0) {
6212*fcf3ce44SJohn Forte display_path_info(mlist->dev_path, mlist->logical_path,
6213*fcf3ce44SJohn Forte wwn_list);
6214*fcf3ce44SJohn Forte break;
6215*fcf3ce44SJohn Forte }
6216*fcf3ce44SJohn Forte }
6217*fcf3ce44SJohn Forte
6218*fcf3ce44SJohn Forte /*
6219*fcf3ce44SJohn Forte * Now display rest of paths
6220*fcf3ce44SJohn Forte * skipping one already displayed
6221*fcf3ce44SJohn Forte */
6222*fcf3ce44SJohn Forte for (mlist = l_disk_state.g_disk_state.multipath_list;
6223*fcf3ce44SJohn Forte mlist != NULL; mlist = mlist->next) {
6224*fcf3ce44SJohn Forte if ((strcmp(mlist->dev_path, path_struct->p_physical_path))
6225*fcf3ce44SJohn Forte == 0) {
6226*fcf3ce44SJohn Forte continue;
6227*fcf3ce44SJohn Forte }
6228*fcf3ce44SJohn Forte if (err = g_get_inquiry(mlist->dev_path, &inq)) {
6229*fcf3ce44SJohn Forte fprintf(stderr, "\n");
6230*fcf3ce44SJohn Forte print_errString(err, mlist->dev_path);
6231*fcf3ce44SJohn Forte fprintf(stderr, "\n");
6232*fcf3ce44SJohn Forte exit(1);
6233*fcf3ce44SJohn Forte }
6234*fcf3ce44SJohn Forte display_path_info(mlist->dev_path, mlist->logical_path,
6235*fcf3ce44SJohn Forte wwn_list);
6236*fcf3ce44SJohn Forte }
6237*fcf3ce44SJohn Forte }
6238*fcf3ce44SJohn Forte fprintf(stdout, "\n");
6239*fcf3ce44SJohn Forte
6240*fcf3ce44SJohn Forte if (envdb != NULL) {
6241*fcf3ce44SJohn Forte end_time = gethrtime();
6242*fcf3ce44SJohn Forte fprintf(stdout, " display_lun_info: "
6243*fcf3ce44SJohn Forte "\t\tTime = %lld millisec\n",
6244*fcf3ce44SJohn Forte (end_time - start_time)/1000000);
6245*fcf3ce44SJohn Forte }
6246*fcf3ce44SJohn Forte }
6247*fcf3ce44SJohn Forte
6248*fcf3ce44SJohn Forte /*
6249*fcf3ce44SJohn Forte * display_path_info() Prints the path specific information
6250*fcf3ce44SJohn Forte * for a lun.
6251*fcf3ce44SJohn Forte * Note: Only applies to ssd nodes currently
6252*fcf3ce44SJohn Forte *
6253*fcf3ce44SJohn Forte * RETURNS:
6254*fcf3ce44SJohn Forte * none.
6255*fcf3ce44SJohn Forte */
6256*fcf3ce44SJohn Forte static void
display_path_info(char * devpath,char * logicalpath,WWN_list * wwn_list)6257*fcf3ce44SJohn Forte display_path_info(char *devpath, char *logicalpath, WWN_list *wwn_list)
6258*fcf3ce44SJohn Forte {
6259*fcf3ce44SJohn Forte WWN_list *wwn_list_walk;
6260*fcf3ce44SJohn Forte int err;
6261*fcf3ce44SJohn Forte uchar_t wwn_data[WWN_SIZE];
6262*fcf3ce44SJohn Forte char wwns[(WWN_SIZE *2) +1];
6263*fcf3ce44SJohn Forte char drvr_path[MAXPATHLEN];
6264*fcf3ce44SJohn Forte char *cptr;
6265*fcf3ce44SJohn Forte int status;
6266*fcf3ce44SJohn Forte
6267*fcf3ce44SJohn Forte fprintf(stdout, " %s\n", logicalpath);
6268*fcf3ce44SJohn Forte fprintf(stdout, " %s\n", devpath);
6269*fcf3ce44SJohn Forte fprintf(stdout, " %s\t\t", MSGSTR(2321, "LUN path port WWN:"));
6270*fcf3ce44SJohn Forte
6271*fcf3ce44SJohn Forte /*
6272*fcf3ce44SJohn Forte * Walk the wwn list passed in and print the
6273*fcf3ce44SJohn Forte * port wwn matching the device path
6274*fcf3ce44SJohn Forte */
6275*fcf3ce44SJohn Forte for (wwn_list_walk = wwn_list; wwn_list_walk != NULL;
6276*fcf3ce44SJohn Forte wwn_list_walk = wwn_list_walk->wwn_next) {
6277*fcf3ce44SJohn Forte if (strcmp(wwn_list_walk->physical_path, devpath) == 0) {
6278*fcf3ce44SJohn Forte fprintf(stdout, "%s", wwn_list_walk->port_wwn_s);
6279*fcf3ce44SJohn Forte break;
6280*fcf3ce44SJohn Forte }
6281*fcf3ce44SJohn Forte }
6282*fcf3ce44SJohn Forte /*
6283*fcf3ce44SJohn Forte * newline here in case port wwn not found
6284*fcf3ce44SJohn Forte */
6285*fcf3ce44SJohn Forte fprintf(stdout, "\n");
6286*fcf3ce44SJohn Forte
6287*fcf3ce44SJohn Forte drvr_path[0] = '\0';
6288*fcf3ce44SJohn Forte (void) strcat(drvr_path, devpath);
6289*fcf3ce44SJohn Forte if (((cptr = strstr(drvr_path, SLSH_DRV_NAME_SSD)) != NULL) ||
6290*fcf3ce44SJohn Forte ((cptr = strstr(drvr_path, SLSH_DRV_NAME_ST)) != NULL)) {;
6291*fcf3ce44SJohn Forte *cptr = '\0';
6292*fcf3ce44SJohn Forte } else {
6293*fcf3ce44SJohn Forte fprintf(stderr, MSGSTR(2324, "Error: Incorrect path (%s)\n"),
6294*fcf3ce44SJohn Forte drvr_path);
6295*fcf3ce44SJohn Forte exit(1);
6296*fcf3ce44SJohn Forte }
6297*fcf3ce44SJohn Forte *cptr = '\0';
6298*fcf3ce44SJohn Forte
6299*fcf3ce44SJohn Forte if ((err = get_host_controller_pwwn(drvr_path,
6300*fcf3ce44SJohn Forte (uchar_t *)&wwn_data)) != 0) {
6301*fcf3ce44SJohn Forte print_errString(err, drvr_path);
6302*fcf3ce44SJohn Forte exit(1);
6303*fcf3ce44SJohn Forte }
6304*fcf3ce44SJohn Forte
6305*fcf3ce44SJohn Forte copy_wwn_data_to_str(wwns, wwn_data);
6306*fcf3ce44SJohn Forte fprintf(stdout, " %s\t%s\n",
6307*fcf3ce44SJohn Forte MSGSTR(2322, "Host controller port WWN:"), wwns);
6308*fcf3ce44SJohn Forte
6309*fcf3ce44SJohn Forte /*
6310*fcf3ce44SJohn Forte * Determine path status
6311*fcf3ce44SJohn Forte */
6312*fcf3ce44SJohn Forte if ((err = get_path_status(devpath, &status)) != 0) {
6313*fcf3ce44SJohn Forte print_errString(err, devpath);
6314*fcf3ce44SJohn Forte exit(1);
6315*fcf3ce44SJohn Forte } else {
6316*fcf3ce44SJohn Forte fprintf(stdout, " %s\t\t", MSGSTR(2329, "Path status:"));
6317*fcf3ce44SJohn Forte display_port_status(status);
6318*fcf3ce44SJohn Forte }
6319*fcf3ce44SJohn Forte }
6320*fcf3ce44SJohn Forte
6321*fcf3ce44SJohn Forte /*
6322*fcf3ce44SJohn Forte * Retrieves the lun capacity
6323*fcf3ce44SJohn Forte */
6324*fcf3ce44SJohn Forte static int
get_lun_capacity(char * devpath,struct scsi_capacity_16 * cap_data)6325*fcf3ce44SJohn Forte get_lun_capacity(char *devpath, struct scsi_capacity_16 *cap_data)
6326*fcf3ce44SJohn Forte {
6327*fcf3ce44SJohn Forte int fd;
6328*fcf3ce44SJohn Forte
6329*fcf3ce44SJohn Forte if (devpath == NULL || cap_data == NULL) {
6330*fcf3ce44SJohn Forte return (L_INVALID_PATH);
6331*fcf3ce44SJohn Forte }
6332*fcf3ce44SJohn Forte
6333*fcf3ce44SJohn Forte if ((fd = g_object_open(devpath, O_RDONLY | O_NDELAY)) == -1) {
6334*fcf3ce44SJohn Forte return (L_OPEN_PATH_FAIL);
6335*fcf3ce44SJohn Forte } else {
6336*fcf3ce44SJohn Forte (void) g_scsi_read_capacity_1016_cmd(fd, cap_data,
6337*fcf3ce44SJohn Forte sizeof (struct scsi_capacity_16));
6338*fcf3ce44SJohn Forte close(fd);
6339*fcf3ce44SJohn Forte }
6340*fcf3ce44SJohn Forte return (0);
6341*fcf3ce44SJohn Forte }
6342*fcf3ce44SJohn Forte
6343*fcf3ce44SJohn Forte /*
6344*fcf3ce44SJohn Forte * Retrieves the reservation status
6345*fcf3ce44SJohn Forte */
6346*fcf3ce44SJohn Forte static int
get_path_status(char * devpath,int * status)6347*fcf3ce44SJohn Forte get_path_status(char *devpath, int *status)
6348*fcf3ce44SJohn Forte {
6349*fcf3ce44SJohn Forte int fd, mystatus = 0;
6350*fcf3ce44SJohn Forte
6351*fcf3ce44SJohn Forte
6352*fcf3ce44SJohn Forte if (devpath == NULL || status == NULL) {
6353*fcf3ce44SJohn Forte return (L_INVALID_PATH);
6354*fcf3ce44SJohn Forte }
6355*fcf3ce44SJohn Forte
6356*fcf3ce44SJohn Forte *status = 0;
6357*fcf3ce44SJohn Forte if ((fd = g_object_open(devpath, O_RDONLY | O_NDELAY)) == -1) {
6358*fcf3ce44SJohn Forte return (L_OPEN_PATH_FAIL);
6359*fcf3ce44SJohn Forte } else {
6360*fcf3ce44SJohn Forte if ((mystatus = g_scsi_tur(fd)) != 0) {
6361*fcf3ce44SJohn Forte if ((mystatus & L_SCSI_ERROR) &&
6362*fcf3ce44SJohn Forte ((mystatus & ~L_SCSI_ERROR) == STATUS_CHECK)) {
6363*fcf3ce44SJohn Forte *status = L_NOT_READY;
6364*fcf3ce44SJohn Forte } else if ((mystatus & L_SCSI_ERROR) &&
6365*fcf3ce44SJohn Forte ((mystatus & ~L_SCSI_ERROR) ==
6366*fcf3ce44SJohn Forte STATUS_RESERVATION_CONFLICT)) {
6367*fcf3ce44SJohn Forte *status = L_RESERVED;
6368*fcf3ce44SJohn Forte } else {
6369*fcf3ce44SJohn Forte *status = L_SCSI_ERR;
6370*fcf3ce44SJohn Forte }
6371*fcf3ce44SJohn Forte }
6372*fcf3ce44SJohn Forte }
6373*fcf3ce44SJohn Forte close(fd);
6374*fcf3ce44SJohn Forte return (0);
6375*fcf3ce44SJohn Forte }
6376*fcf3ce44SJohn Forte
6377*fcf3ce44SJohn Forte /*
6378*fcf3ce44SJohn Forte * Description:
6379*fcf3ce44SJohn Forte * Retrieves the port wwn associated with the hba node
6380*fcf3ce44SJohn Forte *
6381*fcf3ce44SJohn Forte * hba_path: /devices/pci@8,600000/SUNW,qlc@4/fp@0,0
6382*fcf3ce44SJohn Forte * pwwn: ptr to a uchar_t array of size WWN_SIZE
6383*fcf3ce44SJohn Forte */
6384*fcf3ce44SJohn Forte static int
get_host_controller_pwwn(char * hba_path,uchar_t * pwwn)6385*fcf3ce44SJohn Forte get_host_controller_pwwn(char *hba_path, uchar_t *pwwn)
6386*fcf3ce44SJohn Forte {
6387*fcf3ce44SJohn Forte char *cptr, *portptr;
6388*fcf3ce44SJohn Forte int found = 0, err, devlen;
6389*fcf3ce44SJohn Forte char my_hba_path[MAXPATHLEN];
6390*fcf3ce44SJohn Forte di_node_t node;
6391*fcf3ce44SJohn Forte di_prom_prop_t promprop;
6392*fcf3ce44SJohn Forte uchar_t *port_wwn_data = NULL;
6393*fcf3ce44SJohn Forte int di_ret;
6394*fcf3ce44SJohn Forte di_prom_handle_t ph;
6395*fcf3ce44SJohn Forte char *promname;
6396*fcf3ce44SJohn Forte uchar_t *promdata;
6397*fcf3ce44SJohn Forte uint_t path_type;
6398*fcf3ce44SJohn Forte fc_port_dev_t hba_port;
6399*fcf3ce44SJohn Forte
6400*fcf3ce44SJohn Forte if (hba_path == NULL || pwwn == NULL) {
6401*fcf3ce44SJohn Forte return (L_INVALID_PATH);
6402*fcf3ce44SJohn Forte }
6403*fcf3ce44SJohn Forte
6404*fcf3ce44SJohn Forte if ((path_type = g_get_path_type(hba_path)) == 0) {
6405*fcf3ce44SJohn Forte return (L_INVALID_PATH);
6406*fcf3ce44SJohn Forte }
6407*fcf3ce44SJohn Forte
6408*fcf3ce44SJohn Forte /*
6409*fcf3ce44SJohn Forte * ifp nodes do not have a port-wwn prom property
6410*fcf3ce44SJohn Forte * so handle them via FC4 device map
6411*fcf3ce44SJohn Forte */
6412*fcf3ce44SJohn Forte if (path_type & FC4_XPORT_MASK) {
6413*fcf3ce44SJohn Forte if ((err = get_FC4_host_controller_pwwn(hba_path, pwwn)) != 0) {
6414*fcf3ce44SJohn Forte return (err);
6415*fcf3ce44SJohn Forte } else {
6416*fcf3ce44SJohn Forte return (0);
6417*fcf3ce44SJohn Forte }
6418*fcf3ce44SJohn Forte /* For Leadville path get the port wwn through g_get_host param. */
6419*fcf3ce44SJohn Forte } else if ((path_type & FC_GEN_XPORT) &&
6420*fcf3ce44SJohn Forte ((path_type & FC_FCA_MASK) == FC_FCA_MASK)) {
6421*fcf3ce44SJohn Forte /*
6422*fcf3ce44SJohn Forte * For Leadville path, get the port wwn through
6423*fcf3ce44SJohn Forte * g_get_host param. This is a general solution
6424*fcf3ce44SJohn Forte * to support 3rd party vendor Leadville FCA.
6425*fcf3ce44SJohn Forte */
6426*fcf3ce44SJohn Forte my_hba_path[0] = '\0';
6427*fcf3ce44SJohn Forte (void) strlcat(my_hba_path, hba_path, sizeof (my_hba_path));
6428*fcf3ce44SJohn Forte (void) snprintf(my_hba_path, sizeof (my_hba_path), "%s%s",
6429*fcf3ce44SJohn Forte hba_path, FC_CTLR);
6430*fcf3ce44SJohn Forte if ((err = g_get_host_params(
6431*fcf3ce44SJohn Forte my_hba_path, &hba_port, 0)) != 0) {
6432*fcf3ce44SJohn Forte return (err);
6433*fcf3ce44SJohn Forte } else {
6434*fcf3ce44SJohn Forte (void) memcpy(pwwn, &hba_port.dev_pwwn.raw_wwn[0],
6435*fcf3ce44SJohn Forte WWN_SIZE);
6436*fcf3ce44SJohn Forte return (0);
6437*fcf3ce44SJohn Forte }
6438*fcf3ce44SJohn Forte } else if ((path_type & FC_FCA_MASK) == FC_PCI_FCA) {
6439*fcf3ce44SJohn Forte /*
6440*fcf3ce44SJohn Forte * Get port WWN through prom property
6441*fcf3ce44SJohn Forte */
6442*fcf3ce44SJohn Forte my_hba_path[0] = '\0';
6443*fcf3ce44SJohn Forte (void) strlcat(my_hba_path, hba_path, sizeof (my_hba_path));
6444*fcf3ce44SJohn Forte /*
6445*fcf3ce44SJohn Forte * sanity check for /devices mount point
6446*fcf3ce44SJohn Forte */
6447*fcf3ce44SJohn Forte if (strlen(my_hba_path) > (devlen = strlen("/devices"))) {
6448*fcf3ce44SJohn Forte cptr = &my_hba_path[devlen];
6449*fcf3ce44SJohn Forte } else {
6450*fcf3ce44SJohn Forte return (L_INVALID_PATH);
6451*fcf3ce44SJohn Forte }
6452*fcf3ce44SJohn Forte
6453*fcf3ce44SJohn Forte /*
6454*fcf3ce44SJohn Forte * Now strip off the trailing "/fp@"
6455*fcf3ce44SJohn Forte */
6456*fcf3ce44SJohn Forte if ((portptr = strstr(cptr, "/fp@")) != NULL) {
6457*fcf3ce44SJohn Forte *portptr = '\0';
6458*fcf3ce44SJohn Forte }
6459*fcf3ce44SJohn Forte
6460*fcf3ce44SJohn Forte if ((node = di_init(cptr, DINFOCPYALL)) == DI_NODE_NIL) {
6461*fcf3ce44SJohn Forte return (L_DEV_SNAPSHOT_FAILED);
6462*fcf3ce44SJohn Forte }
6463*fcf3ce44SJohn Forte
6464*fcf3ce44SJohn Forte if (di_nodeid(node) == DI_SID_NODEID) {
6465*fcf3ce44SJohn Forte di_ret = di_prop_lookup_bytes(DDI_DEV_T_ANY, node,
6466*fcf3ce44SJohn Forte "port-wwn", &port_wwn_data);
6467*fcf3ce44SJohn Forte if (di_ret == -1 || port_wwn_data == NULL) {
6468*fcf3ce44SJohn Forte di_fini(node);
6469*fcf3ce44SJohn Forte return (L_NO_WWN_PROP_FOUND);
6470*fcf3ce44SJohn Forte } else {
6471*fcf3ce44SJohn Forte (void) memcpy(pwwn, port_wwn_data, WWN_SIZE);
6472*fcf3ce44SJohn Forte found++;
6473*fcf3ce44SJohn Forte }
6474*fcf3ce44SJohn Forte } else if (di_nodeid(node) == DI_PROM_NODEID) {
6475*fcf3ce44SJohn Forte if ((ph = di_prom_init()) == DI_PROM_HANDLE_NIL) {
6476*fcf3ce44SJohn Forte di_fini(node);
6477*fcf3ce44SJohn Forte return (L_PROM_INIT_FAILED);
6478*fcf3ce44SJohn Forte }
6479*fcf3ce44SJohn Forte
6480*fcf3ce44SJohn Forte for (promprop = di_prom_prop_next(ph, node,
6481*fcf3ce44SJohn Forte DI_PROM_PROP_NIL);
6482*fcf3ce44SJohn Forte promprop != DI_PROM_PROP_NIL;
6483*fcf3ce44SJohn Forte promprop = di_prom_prop_next(ph, node, promprop)) {
6484*fcf3ce44SJohn Forte if (((promname = di_prom_prop_name(
6485*fcf3ce44SJohn Forte promprop)) != NULL) &&
6486*fcf3ce44SJohn Forte (strcmp(promname, "port-wwn") == 0) &&
6487*fcf3ce44SJohn Forte (di_prom_prop_data(promprop,
6488*fcf3ce44SJohn Forte &promdata) == WWN_SIZE)) {
6489*fcf3ce44SJohn Forte /* Found port-wwn */
6490*fcf3ce44SJohn Forte (void) memcpy(pwwn, promdata, WWN_SIZE);
6491*fcf3ce44SJohn Forte found++;
6492*fcf3ce44SJohn Forte break;
6493*fcf3ce44SJohn Forte }
6494*fcf3ce44SJohn Forte }
6495*fcf3ce44SJohn Forte di_prom_fini(ph);
6496*fcf3ce44SJohn Forte }
6497*fcf3ce44SJohn Forte
6498*fcf3ce44SJohn Forte di_fini(node);
6499*fcf3ce44SJohn Forte if (found) {
6500*fcf3ce44SJohn Forte return (0);
6501*fcf3ce44SJohn Forte } else {
6502*fcf3ce44SJohn Forte return (L_INVALID_PATH);
6503*fcf3ce44SJohn Forte }
6504*fcf3ce44SJohn Forte } else {
6505*fcf3ce44SJohn Forte return (L_INVALID_PATH_TYPE);
6506*fcf3ce44SJohn Forte }
6507*fcf3ce44SJohn Forte }
6508*fcf3ce44SJohn Forte
6509*fcf3ce44SJohn Forte
6510*fcf3ce44SJohn Forte /*
6511*fcf3ce44SJohn Forte * Description:
6512*fcf3ce44SJohn Forte * Retrieve pwwn via SFIOCGMAP
6513*fcf3ce44SJohn Forte */
6514*fcf3ce44SJohn Forte static int
get_FC4_host_controller_pwwn(char * hba_path,uchar_t * pwwn)6515*fcf3ce44SJohn Forte get_FC4_host_controller_pwwn(char *hba_path, uchar_t *pwwn)
6516*fcf3ce44SJohn Forte {
6517*fcf3ce44SJohn Forte sf_al_map_t sf_map;
6518*fcf3ce44SJohn Forte char my_hba_path[MAXPATHLEN];
6519*fcf3ce44SJohn Forte int fd;
6520*fcf3ce44SJohn Forte
6521*fcf3ce44SJohn Forte if (hba_path == NULL || pwwn == NULL) {
6522*fcf3ce44SJohn Forte return (L_INVALID_PATH);
6523*fcf3ce44SJohn Forte }
6524*fcf3ce44SJohn Forte
6525*fcf3ce44SJohn Forte (void) snprintf(my_hba_path, sizeof (my_hba_path), "%s%s",
6526*fcf3ce44SJohn Forte hba_path, FC_CTLR);
6527*fcf3ce44SJohn Forte
6528*fcf3ce44SJohn Forte if ((fd = g_object_open(my_hba_path, O_NDELAY | O_RDONLY)) == -1) {
6529*fcf3ce44SJohn Forte return (errno);
6530*fcf3ce44SJohn Forte }
6531*fcf3ce44SJohn Forte
6532*fcf3ce44SJohn Forte memset(&sf_map, 0, sizeof (sf_al_map_t));
6533*fcf3ce44SJohn Forte
6534*fcf3ce44SJohn Forte if (ioctl(fd, SFIOCGMAP, &sf_map) != 0) {
6535*fcf3ce44SJohn Forte close(fd);
6536*fcf3ce44SJohn Forte return (L_SFIOCGMAP_IOCTL_FAIL);
6537*fcf3ce44SJohn Forte }
6538*fcf3ce44SJohn Forte
6539*fcf3ce44SJohn Forte close(fd);
6540*fcf3ce44SJohn Forte
6541*fcf3ce44SJohn Forte if (sf_map.sf_count == 0) {
6542*fcf3ce44SJohn Forte close(fd);
6543*fcf3ce44SJohn Forte return (L_SFIOCGMAP_IOCTL_FAIL);
6544*fcf3ce44SJohn Forte }
6545*fcf3ce44SJohn Forte
6546*fcf3ce44SJohn Forte (void) memcpy(pwwn, &sf_map.sf_hba_addr.sf_port_wwn[0], WWN_SIZE);
6547*fcf3ce44SJohn Forte
6548*fcf3ce44SJohn Forte return (0);
6549*fcf3ce44SJohn Forte }
6550*fcf3ce44SJohn Forte
6551*fcf3ce44SJohn Forte /*
6552*fcf3ce44SJohn Forte * from_ptr: ptr to uchar_t array of size WWN_SIZE
6553*fcf3ce44SJohn Forte * to_ptr: char ptr to string of size WWN_SIZE*2+1
6554*fcf3ce44SJohn Forte */
6555*fcf3ce44SJohn Forte void
copy_wwn_data_to_str(char * to_ptr,const uchar_t * from_ptr)6556*fcf3ce44SJohn Forte copy_wwn_data_to_str(char *to_ptr, const uchar_t *from_ptr)
6557*fcf3ce44SJohn Forte {
6558*fcf3ce44SJohn Forte if ((to_ptr == NULL) || (from_ptr == NULL))
6559*fcf3ce44SJohn Forte return;
6560*fcf3ce44SJohn Forte
6561*fcf3ce44SJohn Forte sprintf(to_ptr, "%1.2x%1.2x%1.2x%1.2x%1.2x%1.2x%1.2x%1.2x",
6562*fcf3ce44SJohn Forte from_ptr[0], from_ptr[1], from_ptr[2], from_ptr[3],
6563*fcf3ce44SJohn Forte from_ptr[4], from_ptr[5], from_ptr[6], from_ptr[7]);
6564*fcf3ce44SJohn Forte }
6565*fcf3ce44SJohn Forte
6566*fcf3ce44SJohn Forte /*
6567*fcf3ce44SJohn Forte * Frees a previously allocated mplist_struct
6568*fcf3ce44SJohn Forte */
6569*fcf3ce44SJohn Forte void
adm_mplist_free(struct mplist_struct * mplistp)6570*fcf3ce44SJohn Forte adm_mplist_free(struct mplist_struct *mplistp)
6571*fcf3ce44SJohn Forte {
6572*fcf3ce44SJohn Forte struct mplist_struct *mplistn;
6573*fcf3ce44SJohn Forte
6574*fcf3ce44SJohn Forte while (mplistp != NULL) {
6575*fcf3ce44SJohn Forte mplistn = mplistp->next;
6576*fcf3ce44SJohn Forte if (mplistp->devpath != NULL) {
6577*fcf3ce44SJohn Forte free(mplistp->devpath);
6578*fcf3ce44SJohn Forte mplistp->devpath = NULL;
6579*fcf3ce44SJohn Forte }
6580*fcf3ce44SJohn Forte free(mplistp);
6581*fcf3ce44SJohn Forte mplistp = mplistn;
6582*fcf3ce44SJohn Forte }
6583*fcf3ce44SJohn Forte }
6584*fcf3ce44SJohn Forte
6585*fcf3ce44SJohn Forte int
adm_reserve(char * path)6586*fcf3ce44SJohn Forte adm_reserve(char *path)
6587*fcf3ce44SJohn Forte {
6588*fcf3ce44SJohn Forte char *path_phys = NULL;
6589*fcf3ce44SJohn Forte int err;
6590*fcf3ce44SJohn Forte if ((path_phys =
6591*fcf3ce44SJohn Forte g_get_physical_name(path)) == NULL) {
6592*fcf3ce44SJohn Forte
6593*fcf3ce44SJohn Forte (void) fprintf(stderr, "%s: ", whoami);
6594*fcf3ce44SJohn Forte (void) fprintf(stderr,
6595*fcf3ce44SJohn Forte MSGSTR(112, "Error: Invalid pathname (%s)"),
6596*fcf3ce44SJohn Forte path);
6597*fcf3ce44SJohn Forte (void) fprintf(stderr, "\n");
6598*fcf3ce44SJohn Forte return (1);
6599*fcf3ce44SJohn Forte }
6600*fcf3ce44SJohn Forte
6601*fcf3ce44SJohn Forte if ((err = g_reserve(path_phys)) != 0) {
6602*fcf3ce44SJohn Forte (void) print_errString(err, path);
6603*fcf3ce44SJohn Forte return (1);
6604*fcf3ce44SJohn Forte }
6605*fcf3ce44SJohn Forte return (0);
6606*fcf3ce44SJohn Forte }
6607*fcf3ce44SJohn Forte
6608*fcf3ce44SJohn Forte int
adm_release(char * path)6609*fcf3ce44SJohn Forte adm_release(char *path)
6610*fcf3ce44SJohn Forte {
6611*fcf3ce44SJohn Forte char *path_phys = NULL;
6612*fcf3ce44SJohn Forte int err;
6613*fcf3ce44SJohn Forte if ((path_phys =
6614*fcf3ce44SJohn Forte g_get_physical_name(path)) == NULL) {
6615*fcf3ce44SJohn Forte
6616*fcf3ce44SJohn Forte (void) fprintf(stderr, "%s: ", whoami);
6617*fcf3ce44SJohn Forte (void) fprintf(stderr,
6618*fcf3ce44SJohn Forte MSGSTR(112, "Error: Invalid pathname (%s)"),
6619*fcf3ce44SJohn Forte path);
6620*fcf3ce44SJohn Forte (void) fprintf(stderr, "\n");
6621*fcf3ce44SJohn Forte return (1);
6622*fcf3ce44SJohn Forte }
6623*fcf3ce44SJohn Forte
6624*fcf3ce44SJohn Forte if ((err = g_release(path_phys)) != 0) {
6625*fcf3ce44SJohn Forte (void) print_errString(err, path);
6626*fcf3ce44SJohn Forte return (1);
6627*fcf3ce44SJohn Forte }
6628*fcf3ce44SJohn Forte return (0);
6629*fcf3ce44SJohn Forte }
6630*fcf3ce44SJohn Forte
6631*fcf3ce44SJohn Forte void
i18n_catopen()6632*fcf3ce44SJohn Forte i18n_catopen() {
6633*fcf3ce44SJohn Forte (void) g_i18n_catopen();
6634*fcf3ce44SJohn Forte }
6635*fcf3ce44SJohn Forte
adm_check_file(char ** path,int flag)6636*fcf3ce44SJohn Forte int adm_check_file(char **path, int flag) {
6637*fcf3ce44SJohn Forte int err;
6638*fcf3ce44SJohn Forte if (err = l_check_file(*path, flag)) {
6639*fcf3ce44SJohn Forte (void) print_errString(err, *path);
6640*fcf3ce44SJohn Forte return (-1);
6641*fcf3ce44SJohn Forte }
6642*fcf3ce44SJohn Forte
6643*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2212, "Download file O.K. \n\n"));
6644*fcf3ce44SJohn Forte return (0);
6645*fcf3ce44SJohn Forte }
6646*fcf3ce44SJohn Forte
6647*fcf3ce44SJohn Forte /*
6648*fcf3ce44SJohn Forte * Print out private loop dev dtype
6649*fcf3ce44SJohn Forte */
6650*fcf3ce44SJohn Forte void
print_private_loop_dtype_prop(uchar_t * hba_port_wwn,uchar_t * port_wwn,uchar_t dtype_prop)6651*fcf3ce44SJohn Forte print_private_loop_dtype_prop(uchar_t *hba_port_wwn, uchar_t *port_wwn,
6652*fcf3ce44SJohn Forte uchar_t dtype_prop)
6653*fcf3ce44SJohn Forte {
6654*fcf3ce44SJohn Forte if ((dtype_prop & DTYPE_MASK) < 0x10) {
6655*fcf3ce44SJohn Forte (void) fprintf(stdout, " 0x%-2x (%s",
6656*fcf3ce44SJohn Forte (dtype_prop & DTYPE_MASK), dtype[(dtype_prop & DTYPE_MASK)]);
6657*fcf3ce44SJohn Forte } else if ((dtype_prop & DTYPE_MASK) < 0x1f) {
6658*fcf3ce44SJohn Forte (void) fprintf(stdout,
6659*fcf3ce44SJohn Forte MSGSTR(2243, " 0x%-2x (Reserved"),
6660*fcf3ce44SJohn Forte (dtype_prop & DTYPE_MASK));
6661*fcf3ce44SJohn Forte } else {
6662*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2245,
6663*fcf3ce44SJohn Forte " 0x%-2x (Unknown Type"), (dtype_prop & DTYPE_MASK));
6664*fcf3ce44SJohn Forte }
6665*fcf3ce44SJohn Forte /* Check to see if this is the HBA */
6666*fcf3ce44SJohn Forte if (wwnConversion(hba_port_wwn) == wwnConversion(port_wwn)) {
6667*fcf3ce44SJohn Forte /* MATCH */
6668*fcf3ce44SJohn Forte (void) fprintf(stdout, MSGSTR(2244,
6669*fcf3ce44SJohn Forte ",Host Bus Adapter)\n"));
6670*fcf3ce44SJohn Forte } else {
6671*fcf3ce44SJohn Forte (void) fprintf(stdout, ")\n");
6672*fcf3ce44SJohn Forte }
6673*fcf3ce44SJohn Forte }
6674