1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 */
25
26
27
28 /*LINTLIBRARY*/
29
30
31 /*
32 * This module is part of the photon library
33 */
34
35 /*
36 * I18N message number ranges
37 * This file: 3500 - 3999
38 * Shared common messages: 1 - 1999
39 */
40
41 /* Includes */
42 #include <stdlib.h>
43 #include <stdio.h>
44 #include <sys/file.h>
45 #include <sys/errno.h>
46 #include <sys/types.h>
47 #include <sys/param.h>
48 #include <fcntl.h>
49 #include <unistd.h>
50 #include <errno.h>
51 #include <string.h>
52 #include <sys/scsi/scsi.h>
53 #include <nl_types.h>
54 #include <strings.h>
55 #include <sys/ddi.h> /* for max */
56 #include <libdevice.h>
57 #include <sys/fibre-channel/fcio.h>
58 #define _SYS_FC4_FCAL_LINKAPP_H
59 #include <sys/fc4/fcio.h>
60 #include <sys/devctl.h>
61 #include <sys/scsi/targets/sesio.h>
62 #include <l_common.h>
63 #include <l_error.h>
64 #include <a_state.h>
65 #include <a5k.h>
66 #include <stgcom.h>
67 #include "luxadm.h"
68
69
70 /* Defines */
71 #define VERBPRINT if (verbose) (void) printf
72
73
74
75 static int
print_ssd_in_box(char * ses_path,uchar_t * box_name,int verbose)76 print_ssd_in_box(char *ses_path, uchar_t *box_name, int verbose)
77 {
78 L_state l_state;
79 int err, i;
80 struct dlist *ml;
81 WWN_list *wwn_list, *wwn_list_ptr;
82 char *s;
83 L_inquiry inq;
84 int enc_type = 0;
85
86 wwn_list = wwn_list_ptr = NULL;
87 if (err = l_get_status(ses_path, &l_state, verbose)) {
88 return (err);
89 }
90
91 if (err = g_get_wwn_list(&wwn_list, verbose)) {
92 return (err);
93
94 }
95
96 /* Need to find out whether this device is a daktari */
97 if (g_get_inquiry(ses_path, &inq)) {
98 return (L_SCSI_ERROR);
99 }
100 if ((strncmp((char *)&inq.inq_pid[0], DAK_OFF_NAME,
101 strlen(DAK_OFF_NAME)) == 0) ||
102 (strncmp((char *)&inq.inq_pid[0], DAK_PROD_STR,
103 strlen(DAK_PROD_STR)) == 0)) {
104 enc_type = DAK_ENC_TYPE;
105 }
106 for (i = 0; i < (int)l_state.total_num_drv/2; i++) {
107 if (l_state.drv_front[i].ib_status.code != S_NOT_INSTALLED) {
108
109 ml = l_state.drv_front[i].g_disk_state.multipath_list;
110 while (ml) {
111 for (wwn_list_ptr = wwn_list; wwn_list_ptr != NULL;
112 wwn_list_ptr = wwn_list_ptr->wwn_next) {
113 s = wwn_list_ptr->physical_path;
114 if (strcmp((char *)s,
115 ml->dev_path) == 0) {
116 (void) fprintf(stdout, MSGSTR(3500,
117 "%-80.80s %-17.17s %-17.17s %-22.22s "),
118 wwn_list_ptr->physical_path,
119 wwn_list_ptr->node_wwn_s,
120 wwn_list_ptr->port_wwn_s,
121 wwn_list_ptr->logical_path);
122 if (enc_type == DAK_ENC_TYPE) {
123 (void) fprintf(stdout,
124 MSGSTR(3513, "%s,s%d\n"),
125 box_name, i);
126 } else {
127 (void) fprintf(stdout,
128 MSGSTR(3501, "%s,f%d\n"),
129 box_name, i);
130 }
131 }
132 }
133 ml = ml->next;
134 }
135
136 }
137 }
138 for (i = 0; i < (int)l_state.total_num_drv/2; i++) {
139 if (l_state.drv_rear[i].ib_status.code != S_NOT_INSTALLED) {
140
141 ml = l_state.drv_rear[i].g_disk_state.multipath_list;
142 while (ml) {
143 wwn_list_ptr = wwn_list;
144 for (wwn_list_ptr = wwn_list; wwn_list_ptr != NULL;
145 wwn_list_ptr = wwn_list_ptr->wwn_next) {
146 s = wwn_list_ptr->physical_path;
147 if (strcmp((char *)s,
148 ml->dev_path) == 0) {
149 (void) fprintf(stdout, MSGSTR(3502,
150 "%-80.80s %-17.17s %-17.17s %-22.22s "),
151 wwn_list_ptr->physical_path,
152 wwn_list_ptr->node_wwn_s,
153 wwn_list_ptr->port_wwn_s,
154 wwn_list_ptr->logical_path);
155 if (enc_type == DAK_ENC_TYPE) {
156 (void) fprintf(stdout,
157 MSGSTR(3513, "%s,s%d\n"),
158 box_name,
159 (int)l_state.total_num_drv/2+i);
160 } else {
161 (void) fprintf(stdout,
162 MSGSTR(3503, "%s,r%d\n"),
163 box_name, i);
164 }
165 }
166 }
167 ml = ml->next;
168 }
169
170 }
171 }
172 g_free_wwn_list(&wwn_list);
173 return (0);
174 }
175
176
177
178 int
sysdump(int verbose)179 sysdump(int verbose)
180 {
181 int err;
182
183 Box_list *b_list = NULL;
184 Box_list *o_list = NULL;
185 Box_list *c_list = NULL;
186 int multi_print_flag;
187
188 if (err = l_get_box_list(&b_list, verbose)) {
189 return (err);
190 }
191 if (b_list == NULL) {
192 (void) fprintf(stdout,
193 MSGSTR(93, "No %s enclosures found "
194 "in /dev/es\n"), ENCLOSURE_PROD_NAME);
195 } else {
196 o_list = b_list;
197 while (b_list != NULL) {
198 /* Don't re-print multiple paths */
199 c_list = o_list;
200 multi_print_flag = 0;
201 while (c_list != b_list) {
202 if (strcmp(c_list->b_node_wwn_s,
203 b_list->b_node_wwn_s) == 0) {
204 multi_print_flag = 1;
205 break;
206 }
207 c_list = c_list->box_next;
208 }
209 if (multi_print_flag) {
210 b_list = b_list->box_next;
211 continue;
212 }
213 /* Found enclosure */
214
215 (void) fprintf(stdout,
216 MSGSTR(3504, "Enclosure name:%s Node WWN:%s\n"),
217 b_list->b_name, b_list->b_node_wwn_s);
218
219 (void) fprintf(stdout, MSGSTR(3505,
220 "%-80.80s %-17.17s %-17.17s %-22.22s %-20.20s \n"),
221 MSGSTR(3506, "Physical"),
222 MSGSTR(3507, "Node_WWN"),
223 MSGSTR(3508, "Port_WWN"),
224 MSGSTR(3509, "Logical"),
225 MSGSTR(3510, "Name"));
226
227 (void) fprintf(stdout, MSGSTR(3511,
228 "%-80.80s %-17.17s %-17.17s %-22.22s %-20.20s\n"),
229 b_list->b_physical_path,
230 b_list->b_node_wwn_s,
231 b_list->b_port_wwn_s,
232 b_list->logical_path,
233 b_list->b_name);
234
235 c_list = o_list;
236 while (c_list != NULL) {
237 if ((c_list != b_list) &&
238 (strcmp(c_list->b_node_wwn_s,
239 b_list->b_node_wwn_s) == 0)) {
240 (void) fprintf(stdout, MSGSTR(3512,
241 "%-80.80s %-17.17s %-17.17s %-22.22s %-20.20s\n"),
242 c_list->b_physical_path,
243 c_list->b_node_wwn_s,
244 c_list->b_port_wwn_s,
245 c_list->logical_path,
246 c_list->b_name);
247 }
248 c_list = c_list->box_next;
249 }
250 /*
251 * Print the individual disk information for each box.
252 */
253 if (err = print_ssd_in_box(b_list->b_physical_path,
254 b_list->b_name, verbose)) {
255 return (err);
256 }
257 b_list = b_list->box_next;
258 }
259 }
260 (void) l_free_box_list(&b_list);
261 return (0);
262 }
263