112126SHyon.Kim@Sun.COM /*
212126SHyon.Kim@Sun.COM * CDDL HEADER START
312126SHyon.Kim@Sun.COM *
412126SHyon.Kim@Sun.COM * The contents of this file are subject to the terms of the
512126SHyon.Kim@Sun.COM * Common Development and Distribution License (the "License").
612126SHyon.Kim@Sun.COM * You may not use this file except in compliance with the License.
712126SHyon.Kim@Sun.COM *
812126SHyon.Kim@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
912126SHyon.Kim@Sun.COM * or http://www.opensolaris.org/os/licensing.
1012126SHyon.Kim@Sun.COM * See the License for the specific language governing permissions
1112126SHyon.Kim@Sun.COM * and limitations under the License.
1212126SHyon.Kim@Sun.COM *
1312126SHyon.Kim@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each
1412126SHyon.Kim@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1512126SHyon.Kim@Sun.COM * If applicable, add the following below this CDDL HEADER, with the
1612126SHyon.Kim@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying
1712126SHyon.Kim@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner]
1812126SHyon.Kim@Sun.COM *
1912126SHyon.Kim@Sun.COM * CDDL HEADER END
2012126SHyon.Kim@Sun.COM */
2112126SHyon.Kim@Sun.COM
2212126SHyon.Kim@Sun.COM /*
2312126SHyon.Kim@Sun.COM * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
2412126SHyon.Kim@Sun.COM */
2512126SHyon.Kim@Sun.COM #include <sys/types.h>
2612126SHyon.Kim@Sun.COM #include <sys/scsi/generic/smp_frames.h>
2712126SHyon.Kim@Sun.COM #include <sys/scsi/generic/commands.h>
2812126SHyon.Kim@Sun.COM #include <sys/scsi/impl/commands.h>
2912126SHyon.Kim@Sun.COM #include <sys/ccompile.h>
30*13094Sdavid.hollister@oracle.com #include <sys/byteorder.h>
3112126SHyon.Kim@Sun.COM
3212126SHyon.Kim@Sun.COM #include <stdarg.h>
3312126SHyon.Kim@Sun.COM #include <stdio.h>
3412126SHyon.Kim@Sun.COM #include <string.h>
3512126SHyon.Kim@Sun.COM #include <unistd.h>
3612126SHyon.Kim@Sun.COM #include <stdlib.h>
3712126SHyon.Kim@Sun.COM #include <errno.h>
3812126SHyon.Kim@Sun.COM #include <strings.h>
3912126SHyon.Kim@Sun.COM #include <ctype.h>
4012126SHyon.Kim@Sun.COM
4112126SHyon.Kim@Sun.COM #include <scsi/libsmp.h>
4212126SHyon.Kim@Sun.COM #include <scsi/libsmp_plugin.h>
4312126SHyon.Kim@Sun.COM
44*13094Sdavid.hollister@oracle.com static char *yes = "Yes";
45*13094Sdavid.hollister@oracle.com static char *no = "No";
46*13094Sdavid.hollister@oracle.com
4712126SHyon.Kim@Sun.COM static void fatal(int, const char *, ...) __NORETURN;
4812126SHyon.Kim@Sun.COM
49*13094Sdavid.hollister@oracle.com static smp_target_t *tp = NULL;
50*13094Sdavid.hollister@oracle.com static smp_action_t *ap = NULL;
51*13094Sdavid.hollister@oracle.com static smp_function_t func;
52*13094Sdavid.hollister@oracle.com static smp_result_t result;
53*13094Sdavid.hollister@oracle.com static smp_target_def_t tdef;
54*13094Sdavid.hollister@oracle.com static uint8_t *smp_resp;
55*13094Sdavid.hollister@oracle.com static size_t smp_resp_len;
56*13094Sdavid.hollister@oracle.com
5712126SHyon.Kim@Sun.COM static void
fatal(int err,const char * fmt,...)5812126SHyon.Kim@Sun.COM fatal(int err, const char *fmt, ...)
5912126SHyon.Kim@Sun.COM {
6012126SHyon.Kim@Sun.COM va_list ap;
6112126SHyon.Kim@Sun.COM
6212126SHyon.Kim@Sun.COM va_start(ap, fmt);
6312126SHyon.Kim@Sun.COM (void) vfprintf(stderr, fmt, ap);
6412126SHyon.Kim@Sun.COM va_end(ap);
6512126SHyon.Kim@Sun.COM
6612126SHyon.Kim@Sun.COM (void) fprintf(stderr, "\n");
6712126SHyon.Kim@Sun.COM (void) fflush(stderr);
6812126SHyon.Kim@Sun.COM
6912126SHyon.Kim@Sun.COM _exit(err);
7012126SHyon.Kim@Sun.COM }
7112126SHyon.Kim@Sun.COM
72*13094Sdavid.hollister@oracle.com static char *
smp_get_result(smp_result_t result)73*13094Sdavid.hollister@oracle.com smp_get_result(smp_result_t result)
74*13094Sdavid.hollister@oracle.com {
75*13094Sdavid.hollister@oracle.com switch (result) {
76*13094Sdavid.hollister@oracle.com case SMP_RES_FUNCTION_ACCEPTED:
77*13094Sdavid.hollister@oracle.com return ("Function accepted");
78*13094Sdavid.hollister@oracle.com break;
79*13094Sdavid.hollister@oracle.com case SMP_RES_UNKNOWN_FUNCTION:
80*13094Sdavid.hollister@oracle.com return ("Unknown function");
81*13094Sdavid.hollister@oracle.com break;
82*13094Sdavid.hollister@oracle.com case SMP_RES_FUNCTION_FAILED:
83*13094Sdavid.hollister@oracle.com return ("Function failed");
84*13094Sdavid.hollister@oracle.com break;
85*13094Sdavid.hollister@oracle.com case SMP_RES_INVALID_REQUEST_FRAME_LENGTH:
86*13094Sdavid.hollister@oracle.com return ("Invalid request frame length");
87*13094Sdavid.hollister@oracle.com break;
88*13094Sdavid.hollister@oracle.com case SMP_RES_INVALID_EXPANDER_CHANGE_COUNT:
89*13094Sdavid.hollister@oracle.com return ("Invalid expander change count");
90*13094Sdavid.hollister@oracle.com break;
91*13094Sdavid.hollister@oracle.com case SMP_RES_BUSY:
92*13094Sdavid.hollister@oracle.com return ("Busy");
93*13094Sdavid.hollister@oracle.com break;
94*13094Sdavid.hollister@oracle.com case SMP_RES_INCOMPLETE_DESCRIPTOR_LIST:
95*13094Sdavid.hollister@oracle.com return ("Incomplete descriptor list");
96*13094Sdavid.hollister@oracle.com break;
97*13094Sdavid.hollister@oracle.com case SMP_RES_PHY_DOES_NOT_EXIST:
98*13094Sdavid.hollister@oracle.com return ("PHY does not exist");
99*13094Sdavid.hollister@oracle.com break;
100*13094Sdavid.hollister@oracle.com case SMP_RES_INDEX_DOES_NOT_EXIST:
101*13094Sdavid.hollister@oracle.com return ("Index does not exist");
102*13094Sdavid.hollister@oracle.com break;
103*13094Sdavid.hollister@oracle.com case SMP_RES_PHY_DOES_NOT_SUPPORT_SATA:
104*13094Sdavid.hollister@oracle.com return ("PHY does not support SATA");
105*13094Sdavid.hollister@oracle.com break;
106*13094Sdavid.hollister@oracle.com case SMP_RES_UNKNOWN_PHY_OPERATION:
107*13094Sdavid.hollister@oracle.com return ("Unknown PHY operation");
108*13094Sdavid.hollister@oracle.com break;
109*13094Sdavid.hollister@oracle.com case SMP_RES_UNKNOWN_PHY_TEST_FUNCTION:
110*13094Sdavid.hollister@oracle.com return ("Unknown PHY test function");
111*13094Sdavid.hollister@oracle.com break;
112*13094Sdavid.hollister@oracle.com case SMP_RES_PHY_TEST_IN_PROGRESS:
113*13094Sdavid.hollister@oracle.com return ("PHY test in progress");
114*13094Sdavid.hollister@oracle.com break;
115*13094Sdavid.hollister@oracle.com case SMP_RES_PHY_VACANT:
116*13094Sdavid.hollister@oracle.com return ("PHY vacant");
117*13094Sdavid.hollister@oracle.com break;
118*13094Sdavid.hollister@oracle.com case SMP_RES_UNKNOWN_PHY_EVENT_SOURCE:
119*13094Sdavid.hollister@oracle.com return ("Unknown PHY event source");
120*13094Sdavid.hollister@oracle.com break;
121*13094Sdavid.hollister@oracle.com case SMP_RES_UNKNOWN_DESCRIPTOR_TYPE:
122*13094Sdavid.hollister@oracle.com return ("Unknown descriptor type");
123*13094Sdavid.hollister@oracle.com break;
124*13094Sdavid.hollister@oracle.com case SMP_RES_UNKNOWN_PHY_FILTER:
125*13094Sdavid.hollister@oracle.com return ("Unknown PHY filter");
126*13094Sdavid.hollister@oracle.com break;
127*13094Sdavid.hollister@oracle.com case SMP_RES_AFFILIATION_VIOLATION:
128*13094Sdavid.hollister@oracle.com return ("Affiliation violation");
129*13094Sdavid.hollister@oracle.com break;
130*13094Sdavid.hollister@oracle.com case SMP_RES_ZONE_VIOLATION:
131*13094Sdavid.hollister@oracle.com return ("Zone violation");
132*13094Sdavid.hollister@oracle.com break;
133*13094Sdavid.hollister@oracle.com case SMP_RES_NO_MANAGEMENT_ACCESS_RIGHTS:
134*13094Sdavid.hollister@oracle.com return ("No management access rights");
135*13094Sdavid.hollister@oracle.com break;
136*13094Sdavid.hollister@oracle.com case SMP_RES_UNKNOWN_ENABLE_DISABLE_ZONING:
137*13094Sdavid.hollister@oracle.com return ("Unknown enable/disable zoning value");
138*13094Sdavid.hollister@oracle.com break;
139*13094Sdavid.hollister@oracle.com case SMP_RES_ZONE_LOCK_VIOLATION:
140*13094Sdavid.hollister@oracle.com return ("Zone lock violation");
141*13094Sdavid.hollister@oracle.com break;
142*13094Sdavid.hollister@oracle.com case SMP_RES_NOT_ACTIVATED:
143*13094Sdavid.hollister@oracle.com return ("Not activated");
144*13094Sdavid.hollister@oracle.com break;
145*13094Sdavid.hollister@oracle.com case SMP_RES_ZONE_GROUP_OUT_OF_RANGE:
146*13094Sdavid.hollister@oracle.com return ("Zone group out of range");
147*13094Sdavid.hollister@oracle.com break;
148*13094Sdavid.hollister@oracle.com case SMP_RES_NO_PHYSICAL_PRESENCE:
149*13094Sdavid.hollister@oracle.com return ("No physical presence");
150*13094Sdavid.hollister@oracle.com break;
151*13094Sdavid.hollister@oracle.com case SMP_RES_SAVING_NOT_SUPPORTED:
152*13094Sdavid.hollister@oracle.com return ("Saving not supported");
153*13094Sdavid.hollister@oracle.com break;
154*13094Sdavid.hollister@oracle.com case SMP_RES_SOURCE_ZONE_GROUP_DNE:
155*13094Sdavid.hollister@oracle.com return ("Source zone group does not exist");
156*13094Sdavid.hollister@oracle.com break;
157*13094Sdavid.hollister@oracle.com case SMP_RES_DISABLED_PW_NOT_SUPPORTED:
158*13094Sdavid.hollister@oracle.com return ("Disabled password not supported");
159*13094Sdavid.hollister@oracle.com break;
160*13094Sdavid.hollister@oracle.com default:
161*13094Sdavid.hollister@oracle.com break;
162*13094Sdavid.hollister@oracle.com }
163*13094Sdavid.hollister@oracle.com
164*13094Sdavid.hollister@oracle.com return (NULL);
165*13094Sdavid.hollister@oracle.com }
166*13094Sdavid.hollister@oracle.com
167*13094Sdavid.hollister@oracle.com static void
smp_execute()168*13094Sdavid.hollister@oracle.com smp_execute()
169*13094Sdavid.hollister@oracle.com {
170*13094Sdavid.hollister@oracle.com if (smp_exec(ap, tp) != 0) {
171*13094Sdavid.hollister@oracle.com smp_close(tp);
172*13094Sdavid.hollister@oracle.com smp_action_free(ap);
173*13094Sdavid.hollister@oracle.com smp_fini();
174*13094Sdavid.hollister@oracle.com fatal(-4, "exec failed: %s", smp_errmsg());
175*13094Sdavid.hollister@oracle.com }
176*13094Sdavid.hollister@oracle.com }
177*13094Sdavid.hollister@oracle.com
178*13094Sdavid.hollister@oracle.com static void
smp_cmd_failed(smp_result_t result)179*13094Sdavid.hollister@oracle.com smp_cmd_failed(smp_result_t result)
180*13094Sdavid.hollister@oracle.com {
181*13094Sdavid.hollister@oracle.com char *smp_result_str = smp_get_result(result);
182*13094Sdavid.hollister@oracle.com
183*13094Sdavid.hollister@oracle.com if (result == NULL) {
184*13094Sdavid.hollister@oracle.com fatal(-5, "Command failed: Unknown result (0x%x)",
185*13094Sdavid.hollister@oracle.com result);
186*13094Sdavid.hollister@oracle.com } else {
187*13094Sdavid.hollister@oracle.com fatal(-5, "Command failed: %s", smp_result_str);
188*13094Sdavid.hollister@oracle.com }
189*13094Sdavid.hollister@oracle.com }
190*13094Sdavid.hollister@oracle.com
191*13094Sdavid.hollister@oracle.com static void
smp_get_response(boolean_t close_on_fail)192*13094Sdavid.hollister@oracle.com smp_get_response(boolean_t close_on_fail)
193*13094Sdavid.hollister@oracle.com {
194*13094Sdavid.hollister@oracle.com smp_action_get_response(ap, &result, (void **)&smp_resp, &smp_resp_len);
195*13094Sdavid.hollister@oracle.com
196*13094Sdavid.hollister@oracle.com if (close_on_fail && (result != SMP_RES_FUNCTION_ACCEPTED)) {
197*13094Sdavid.hollister@oracle.com smp_close(tp);
198*13094Sdavid.hollister@oracle.com smp_action_free(ap);
199*13094Sdavid.hollister@oracle.com smp_fini();
200*13094Sdavid.hollister@oracle.com smp_cmd_failed(result);
201*13094Sdavid.hollister@oracle.com }
202*13094Sdavid.hollister@oracle.com }
203*13094Sdavid.hollister@oracle.com
204*13094Sdavid.hollister@oracle.com static void
smp_cleanup()205*13094Sdavid.hollister@oracle.com smp_cleanup()
206*13094Sdavid.hollister@oracle.com {
207*13094Sdavid.hollister@oracle.com if (tp) {
208*13094Sdavid.hollister@oracle.com smp_close(tp);
209*13094Sdavid.hollister@oracle.com tp = NULL;
210*13094Sdavid.hollister@oracle.com }
211*13094Sdavid.hollister@oracle.com smp_action_free(ap);
212*13094Sdavid.hollister@oracle.com smp_fini();
213*13094Sdavid.hollister@oracle.com }
214*13094Sdavid.hollister@oracle.com
215*13094Sdavid.hollister@oracle.com static void
smp_handle_report_route_info(int argc,char * argv[])216*13094Sdavid.hollister@oracle.com smp_handle_report_route_info(int argc, char *argv[])
21712126SHyon.Kim@Sun.COM {
218*13094Sdavid.hollister@oracle.com smp_report_route_info_req_t *rp;
219*13094Sdavid.hollister@oracle.com smp_report_route_info_resp_t *rirp;
220*13094Sdavid.hollister@oracle.com uint16_t route_indexes = smp_target_get_exp_route_indexes(tp);
221*13094Sdavid.hollister@oracle.com uint8_t num_phys = smp_target_get_number_of_phys(tp);
222*13094Sdavid.hollister@oracle.com uint16_t rt_idx_req, ri_idx, ri_end;
223*13094Sdavid.hollister@oracle.com uint8_t phy_id_req, pi_idx, pi_end;
224*13094Sdavid.hollister@oracle.com boolean_t enabled_entries = B_FALSE;
225*13094Sdavid.hollister@oracle.com
226*13094Sdavid.hollister@oracle.com /*
227*13094Sdavid.hollister@oracle.com * Verify the expander supports the PHY-based expander route table
228*13094Sdavid.hollister@oracle.com */
229*13094Sdavid.hollister@oracle.com if (route_indexes == 0) {
230*13094Sdavid.hollister@oracle.com smp_cleanup();
231*13094Sdavid.hollister@oracle.com fatal(-6, "Expander does not support PHY-based route table\n");
232*13094Sdavid.hollister@oracle.com }
233*13094Sdavid.hollister@oracle.com
234*13094Sdavid.hollister@oracle.com rt_idx_req = strtol(argv[3], NULL, 0);
235*13094Sdavid.hollister@oracle.com phy_id_req = strtol(argv[4], NULL, 0);
236*13094Sdavid.hollister@oracle.com
237*13094Sdavid.hollister@oracle.com if (((int16_t)rt_idx_req == -1) && ((int8_t)phy_id_req == -1)) {
238*13094Sdavid.hollister@oracle.com ri_idx = 0;
239*13094Sdavid.hollister@oracle.com ri_end = route_indexes - 1;
240*13094Sdavid.hollister@oracle.com pi_idx = 0;
241*13094Sdavid.hollister@oracle.com pi_end = num_phys - 1;
242*13094Sdavid.hollister@oracle.com } else if (((int16_t)rt_idx_req < 0) || (rt_idx_req >= route_indexes) ||
243*13094Sdavid.hollister@oracle.com ((int8_t)phy_id_req < 0) || (phy_id_req >= num_phys)) {
244*13094Sdavid.hollister@oracle.com smp_cleanup();
245*13094Sdavid.hollister@oracle.com fatal(-1, "Invalid route index (%d) or PHY ID (%d)\n",
246*13094Sdavid.hollister@oracle.com rt_idx_req, phy_id_req);
247*13094Sdavid.hollister@oracle.com } else {
248*13094Sdavid.hollister@oracle.com ri_end = ri_idx = rt_idx_req;
249*13094Sdavid.hollister@oracle.com pi_end = pi_idx = phy_id_req;
250*13094Sdavid.hollister@oracle.com }
251*13094Sdavid.hollister@oracle.com
252*13094Sdavid.hollister@oracle.com (void) printf("%6s %6s %3s %14s\n",
253*13094Sdavid.hollister@oracle.com "RT Idx", "PHY ID", "DIS", "Routed SASAddr");
254*13094Sdavid.hollister@oracle.com
255*13094Sdavid.hollister@oracle.com smp_action_get_request(ap, (void **)&rp, NULL);
256*13094Sdavid.hollister@oracle.com
257*13094Sdavid.hollister@oracle.com while (ri_idx <= ri_end) {
258*13094Sdavid.hollister@oracle.com while (pi_idx <= pi_end) {
259*13094Sdavid.hollister@oracle.com rp->srrir_phy_identifier = pi_idx;
260*13094Sdavid.hollister@oracle.com rp->srrir_exp_route_index = ri_idx;
261*13094Sdavid.hollister@oracle.com
262*13094Sdavid.hollister@oracle.com smp_execute();
263*13094Sdavid.hollister@oracle.com smp_get_response(B_FALSE);
264*13094Sdavid.hollister@oracle.com
265*13094Sdavid.hollister@oracle.com if (result != SMP_RES_FUNCTION_ACCEPTED) {
266*13094Sdavid.hollister@oracle.com pi_idx++;
267*13094Sdavid.hollister@oracle.com continue;
268*13094Sdavid.hollister@oracle.com }
269*13094Sdavid.hollister@oracle.com
270*13094Sdavid.hollister@oracle.com rirp = (smp_report_route_info_resp_t *)smp_resp;
271*13094Sdavid.hollister@oracle.com
272*13094Sdavid.hollister@oracle.com if (rirp->srrir_exp_route_entry_disabled == 0) {
273*13094Sdavid.hollister@oracle.com enabled_entries = B_TRUE;
274*13094Sdavid.hollister@oracle.com (void) printf("%6d %6d %3d %016llx\n",
275*13094Sdavid.hollister@oracle.com rirp->srrir_exp_route_index,
276*13094Sdavid.hollister@oracle.com rirp->srrir_phy_identifier,
277*13094Sdavid.hollister@oracle.com rirp->srrir_exp_route_entry_disabled,
278*13094Sdavid.hollister@oracle.com BE_64(rirp->srrir_routed_sas_addr));
279*13094Sdavid.hollister@oracle.com }
280*13094Sdavid.hollister@oracle.com
281*13094Sdavid.hollister@oracle.com pi_idx++;
282*13094Sdavid.hollister@oracle.com }
283*13094Sdavid.hollister@oracle.com
284*13094Sdavid.hollister@oracle.com ri_idx++;
285*13094Sdavid.hollister@oracle.com pi_idx = 0;
286*13094Sdavid.hollister@oracle.com }
287*13094Sdavid.hollister@oracle.com
288*13094Sdavid.hollister@oracle.com if (!enabled_entries) {
289*13094Sdavid.hollister@oracle.com (void) printf("No enabled entries in the table.\n");
290*13094Sdavid.hollister@oracle.com }
291*13094Sdavid.hollister@oracle.com
292*13094Sdavid.hollister@oracle.com smp_cleanup();
293*13094Sdavid.hollister@oracle.com exit(0);
294*13094Sdavid.hollister@oracle.com }
295*13094Sdavid.hollister@oracle.com
296*13094Sdavid.hollister@oracle.com static char *
smp_phy_event_src_str(smp_phy_event_source_t src,boolean_t * peak_detector)297*13094Sdavid.hollister@oracle.com smp_phy_event_src_str(smp_phy_event_source_t src, boolean_t *peak_detector)
298*13094Sdavid.hollister@oracle.com {
299*13094Sdavid.hollister@oracle.com char *src_str;
300*13094Sdavid.hollister@oracle.com
301*13094Sdavid.hollister@oracle.com *peak_detector = B_FALSE;
302*13094Sdavid.hollister@oracle.com
303*13094Sdavid.hollister@oracle.com switch (src) {
304*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_NO_EVENT:
305*13094Sdavid.hollister@oracle.com src_str = "No event";
306*13094Sdavid.hollister@oracle.com break;
307*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_INVALID_DWORD_COUNT:
308*13094Sdavid.hollister@oracle.com src_str = "Invalid DWORD count";
309*13094Sdavid.hollister@oracle.com break;
310*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_RUNNING_DISPARITY_ERROR_COUNT:
311*13094Sdavid.hollister@oracle.com src_str = "Running disparity error count";
312*13094Sdavid.hollister@oracle.com break;
313*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_LOSS_OF_DWORD_SYNC_COUNT:
314*13094Sdavid.hollister@oracle.com src_str = "Loss of DWORD sync count";
315*13094Sdavid.hollister@oracle.com break;
316*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_PHY_RESET_PROBLEM_COUNT:
317*13094Sdavid.hollister@oracle.com src_str = "PHY reset problem count";
318*13094Sdavid.hollister@oracle.com break;
319*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_ELASTICITY_BUFFER_OVERFLOW_COUNT:
320*13094Sdavid.hollister@oracle.com src_str = "Elasticity buffer overflow count";
321*13094Sdavid.hollister@oracle.com break;
322*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_RX_ERROR_COUNT:
323*13094Sdavid.hollister@oracle.com src_str = "Received ERROR count";
324*13094Sdavid.hollister@oracle.com break;
325*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_RX_ADDR_FRAME_ERROR_COUNT:
326*13094Sdavid.hollister@oracle.com src_str = "Received address frame error count";
327*13094Sdavid.hollister@oracle.com break;
328*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_TX_ABANDON_CLASS_OPEN_REJ_COUNT:
329*13094Sdavid.hollister@oracle.com src_str = "Transmitted abandon-class OPEN_REJECT count";
330*13094Sdavid.hollister@oracle.com break;
331*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_RX_ABANDON_CLASS_OPEN_REJ_COUNT:
332*13094Sdavid.hollister@oracle.com src_str = "Received abandon-class OPEN_REJECT count";
333*13094Sdavid.hollister@oracle.com break;
334*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_TX_RETRY_CLASS_OPEN_REJ_COUNT:
335*13094Sdavid.hollister@oracle.com src_str = "Transmitted retry-class OPEN_REJECT count";
336*13094Sdavid.hollister@oracle.com break;
337*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_RX_RETRY_CLASS_OPEN_REJ_COUNT:
338*13094Sdavid.hollister@oracle.com src_str = "Received retry-class OPEN_REJECT count";
339*13094Sdavid.hollister@oracle.com break;
340*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_RX_AIP_W_O_PARTIAL_COUNT:
341*13094Sdavid.hollister@oracle.com src_str = "Received AIP (WAITING ON PARTIAL) count";
342*13094Sdavid.hollister@oracle.com break;
343*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_RX_AIP_W_O_CONN_COUNT:
344*13094Sdavid.hollister@oracle.com src_str = "Received AIP (WAITING ON CONNECTION) count";
345*13094Sdavid.hollister@oracle.com break;
346*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_TX_BREAK_COUNT:
347*13094Sdavid.hollister@oracle.com src_str = "Transmitted BREAK count";
348*13094Sdavid.hollister@oracle.com break;
349*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_RX_BREAK_COUNT:
350*13094Sdavid.hollister@oracle.com src_str = "Received BREAK count";
351*13094Sdavid.hollister@oracle.com break;
352*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_BREAK_TIMEOUT_COUNT:
353*13094Sdavid.hollister@oracle.com src_str = "BREAK timeout count";
354*13094Sdavid.hollister@oracle.com break;
355*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_CONNECTION_COUNT:
356*13094Sdavid.hollister@oracle.com src_str = "Connection count";
357*13094Sdavid.hollister@oracle.com break;
358*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_PEAK_TX_PATHWAY_BLOCKED_COUNT:
359*13094Sdavid.hollister@oracle.com src_str = "Peak transmitted pathway blocked count";
360*13094Sdavid.hollister@oracle.com *peak_detector = B_TRUE;
361*13094Sdavid.hollister@oracle.com break;
362*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_PEAK_TX_ARB_WAIT_TIME:
363*13094Sdavid.hollister@oracle.com src_str = "Peak transmitted arbitration wait time";
364*13094Sdavid.hollister@oracle.com *peak_detector = B_TRUE;
365*13094Sdavid.hollister@oracle.com break;
366*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_PEAK_ARB_TIME:
367*13094Sdavid.hollister@oracle.com src_str = "Peak arbitration time";
368*13094Sdavid.hollister@oracle.com *peak_detector = B_TRUE;
369*13094Sdavid.hollister@oracle.com break;
370*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_PEAK_CONNECTION_TIME:
371*13094Sdavid.hollister@oracle.com src_str = "Peak connection time";
372*13094Sdavid.hollister@oracle.com *peak_detector = B_TRUE;
373*13094Sdavid.hollister@oracle.com break;
374*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_TX_SSP_FRAME_COUNT:
375*13094Sdavid.hollister@oracle.com src_str = "Transmitted SSP frame count";
376*13094Sdavid.hollister@oracle.com break;
377*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_RX_SSP_FRAME_COUNT:
378*13094Sdavid.hollister@oracle.com src_str = "Received SSP frame count";
379*13094Sdavid.hollister@oracle.com break;
380*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_TX_SSP_FRAME_ERROR_COUNT:
381*13094Sdavid.hollister@oracle.com src_str = "Transmitted SSP frame error count";
382*13094Sdavid.hollister@oracle.com break;
383*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_RX_SSP_FRAME_ERROR_COUNT:
384*13094Sdavid.hollister@oracle.com src_str = "Received SSP frame error count";
385*13094Sdavid.hollister@oracle.com break;
386*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_TX_CREDIT_BLOCKED_COUNT:
387*13094Sdavid.hollister@oracle.com src_str = "Transmitted CREDIT_BLOCKED count";
388*13094Sdavid.hollister@oracle.com break;
389*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_RX_CREDIT_BLOCKED_COUNT:
390*13094Sdavid.hollister@oracle.com src_str = "Received CREDIT_BLOCKED count";
391*13094Sdavid.hollister@oracle.com break;
392*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_TX_SATA_FRAME_COUNT:
393*13094Sdavid.hollister@oracle.com src_str = "Transmitted SATA frame count";
394*13094Sdavid.hollister@oracle.com break;
395*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_RX_SATA_FRAME_COUNT:
396*13094Sdavid.hollister@oracle.com src_str = "Received SATA frame count";
397*13094Sdavid.hollister@oracle.com break;
398*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_SATA_FLOW_CTRL_BUF_OVERFLOW_COUNT:
399*13094Sdavid.hollister@oracle.com src_str = "SATA flow control buffer overflow count";
400*13094Sdavid.hollister@oracle.com break;
401*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_TX_SMP_FRAME_COUNT:
402*13094Sdavid.hollister@oracle.com src_str = "Transmitted SMP frame count";
403*13094Sdavid.hollister@oracle.com break;
404*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_RX_SMP_FRAME_COUNT:
405*13094Sdavid.hollister@oracle.com src_str = "Received SMP frame count";
406*13094Sdavid.hollister@oracle.com break;
407*13094Sdavid.hollister@oracle.com case SMP_PHY_EVENT_RX_SMP_FRAME_ERROR_COUNT:
408*13094Sdavid.hollister@oracle.com src_str = "Received SMP frame error count";
409*13094Sdavid.hollister@oracle.com break;
410*13094Sdavid.hollister@oracle.com default:
411*13094Sdavid.hollister@oracle.com src_str = "<Unknown>";
412*13094Sdavid.hollister@oracle.com break;
413*13094Sdavid.hollister@oracle.com }
414*13094Sdavid.hollister@oracle.com
415*13094Sdavid.hollister@oracle.com return (src_str);
416*13094Sdavid.hollister@oracle.com }
417*13094Sdavid.hollister@oracle.com
418*13094Sdavid.hollister@oracle.com static void
smp_validate_args(int argc,char * argv[])419*13094Sdavid.hollister@oracle.com smp_validate_args(int argc, char *argv[])
420*13094Sdavid.hollister@oracle.com {
421*13094Sdavid.hollister@oracle.com errno = 0;
42212126SHyon.Kim@Sun.COM
42312126SHyon.Kim@Sun.COM if (argc < 3)
42412126SHyon.Kim@Sun.COM fatal(-1, "Usage: %s <device> <function> ...\n", argv[0]);
42512126SHyon.Kim@Sun.COM
42612126SHyon.Kim@Sun.COM func = strtoul(argv[2], NULL, 0);
427*13094Sdavid.hollister@oracle.com
42812126SHyon.Kim@Sun.COM if (errno != 0)
42912126SHyon.Kim@Sun.COM fatal(-1, "Usage: %s <device> <function> ...\n", argv[0]);
43012126SHyon.Kim@Sun.COM
431*13094Sdavid.hollister@oracle.com switch (func) {
432*13094Sdavid.hollister@oracle.com case SMP_FUNC_DISCOVER:
433*13094Sdavid.hollister@oracle.com case SMP_FUNC_REPORT_PHY_EVENT:
434*13094Sdavid.hollister@oracle.com case SMP_FUNC_REPORT_PHY_ERROR_LOG: {
435*13094Sdavid.hollister@oracle.com if (argc != 4) {
436*13094Sdavid.hollister@oracle.com fatal(-1,
437*13094Sdavid.hollister@oracle.com "Usage: %s <device> 0x%x <phy identifier>\n",
438*13094Sdavid.hollister@oracle.com argv[0], func);
439*13094Sdavid.hollister@oracle.com }
440*13094Sdavid.hollister@oracle.com break;
441*13094Sdavid.hollister@oracle.com }
442*13094Sdavid.hollister@oracle.com case SMP_FUNC_REPORT_EXP_ROUTE_TABLE_LIST: {
443*13094Sdavid.hollister@oracle.com if (argc < 4) {
444*13094Sdavid.hollister@oracle.com fatal(-1,
445*13094Sdavid.hollister@oracle.com "Usage: %s <device> 0x%x <SAS Address Index>\n",
446*13094Sdavid.hollister@oracle.com argv[0], func);
447*13094Sdavid.hollister@oracle.com }
448*13094Sdavid.hollister@oracle.com break;
449*13094Sdavid.hollister@oracle.com }
450*13094Sdavid.hollister@oracle.com case SMP_FUNC_REPORT_ZONE_MANAGER_PASSWORD: {
451*13094Sdavid.hollister@oracle.com if (argc < 4) {
452*13094Sdavid.hollister@oracle.com fatal(-1,
453*13094Sdavid.hollister@oracle.com "Usage: %s <device> 0x%x <report type>\n",
454*13094Sdavid.hollister@oracle.com argv[0], func);
455*13094Sdavid.hollister@oracle.com }
456*13094Sdavid.hollister@oracle.com break;
457*13094Sdavid.hollister@oracle.com }
458*13094Sdavid.hollister@oracle.com case SMP_FUNC_ENABLE_DISABLE_ZONING: {
459*13094Sdavid.hollister@oracle.com if (argc != 4) {
460*13094Sdavid.hollister@oracle.com fatal(-1,
461*13094Sdavid.hollister@oracle.com "Usage: %s <device> 0x%x "
462*13094Sdavid.hollister@oracle.com "[0(no change) | 1(enable)| 2(disable)]\n",
463*13094Sdavid.hollister@oracle.com argv[0], func);
464*13094Sdavid.hollister@oracle.com }
465*13094Sdavid.hollister@oracle.com break;
466*13094Sdavid.hollister@oracle.com }
467*13094Sdavid.hollister@oracle.com case SMP_FUNC_REPORT_BROADCAST: {
468*13094Sdavid.hollister@oracle.com if (argc != 4) {
469*13094Sdavid.hollister@oracle.com fatal(-1, "Usage: %s <device> 0x%x <bcast type>\n",
470*13094Sdavid.hollister@oracle.com argv[0], func);
471*13094Sdavid.hollister@oracle.com }
472*13094Sdavid.hollister@oracle.com break;
473*13094Sdavid.hollister@oracle.com }
474*13094Sdavid.hollister@oracle.com case SMP_FUNC_REPORT_ROUTE_INFO: {
475*13094Sdavid.hollister@oracle.com if (argc != 5) {
476*13094Sdavid.hollister@oracle.com fatal(-1,
477*13094Sdavid.hollister@oracle.com "Usage: %s <device> 0x%x <exp_route_idx> "
478*13094Sdavid.hollister@oracle.com "<phy_identifier>\n", argv[0], func);
479*13094Sdavid.hollister@oracle.com }
480*13094Sdavid.hollister@oracle.com break;
481*13094Sdavid.hollister@oracle.com }
482*13094Sdavid.hollister@oracle.com case SMP_FUNC_PHY_CONTROL: {
483*13094Sdavid.hollister@oracle.com if (argc != 5) {
484*13094Sdavid.hollister@oracle.com fatal(-1,
485*13094Sdavid.hollister@oracle.com "Usage: %s <device> 0x%x <phy identifier> "
486*13094Sdavid.hollister@oracle.com " <phy operation>\n",
487*13094Sdavid.hollister@oracle.com argv[0], func);
488*13094Sdavid.hollister@oracle.com }
489*13094Sdavid.hollister@oracle.com break;
490*13094Sdavid.hollister@oracle.com }
491*13094Sdavid.hollister@oracle.com default: {
492*13094Sdavid.hollister@oracle.com fatal(-1, "Usage: %s <device> <function> ...\n", argv[0]);
493*13094Sdavid.hollister@oracle.com break;
494*13094Sdavid.hollister@oracle.com }
495*13094Sdavid.hollister@oracle.com }
496*13094Sdavid.hollister@oracle.com }
497*13094Sdavid.hollister@oracle.com
498*13094Sdavid.hollister@oracle.com int
main(int argc,char * argv[])499*13094Sdavid.hollister@oracle.com main(int argc, char *argv[])
500*13094Sdavid.hollister@oracle.com {
501*13094Sdavid.hollister@oracle.com uint_t i, j;
502*13094Sdavid.hollister@oracle.com char *yesorno;
503*13094Sdavid.hollister@oracle.com uint16_t exp_change_count;
504*13094Sdavid.hollister@oracle.com
505*13094Sdavid.hollister@oracle.com /*
506*13094Sdavid.hollister@oracle.com * If the arguments are invalid, this function will not return.
507*13094Sdavid.hollister@oracle.com */
508*13094Sdavid.hollister@oracle.com smp_validate_args(argc, argv);
509*13094Sdavid.hollister@oracle.com
51012126SHyon.Kim@Sun.COM if (smp_init(LIBSMP_VERSION) != 0)
51112126SHyon.Kim@Sun.COM fatal(-1, "libsmp initialization failed: %s", smp_errmsg());
51212126SHyon.Kim@Sun.COM
51312126SHyon.Kim@Sun.COM bzero(&tdef, sizeof (smp_target_def_t));
51412126SHyon.Kim@Sun.COM tdef.std_def = argv[1];
51512126SHyon.Kim@Sun.COM
51612126SHyon.Kim@Sun.COM if ((tp = smp_open(&tdef)) == NULL) {
51712126SHyon.Kim@Sun.COM smp_fini();
51812126SHyon.Kim@Sun.COM fatal(-2, "failed to open %s: %s", argv[1], smp_errmsg());
51912126SHyon.Kim@Sun.COM }
52012126SHyon.Kim@Sun.COM
521*13094Sdavid.hollister@oracle.com exp_change_count = smp_target_get_change_count(tp);
522*13094Sdavid.hollister@oracle.com
523*13094Sdavid.hollister@oracle.com (void) printf("%s\n", argv[0]);
524*13094Sdavid.hollister@oracle.com (void) printf("\tSAS Address: %016llx\n", smp_target_addr(tp));
525*13094Sdavid.hollister@oracle.com (void) printf("\tVendor/Product/Revision: %s/%s/%s\n",
526*13094Sdavid.hollister@oracle.com smp_target_vendor(tp), smp_target_product(tp),
527*13094Sdavid.hollister@oracle.com smp_target_revision(tp));
528*13094Sdavid.hollister@oracle.com (void) printf("\tExp Vendor/ID/Rev: %s/%04x/%02x\n",
529*13094Sdavid.hollister@oracle.com smp_target_component_vendor(tp), smp_target_component_id(tp),
530*13094Sdavid.hollister@oracle.com smp_target_component_revision(tp));
531*13094Sdavid.hollister@oracle.com (void) printf("\tExpander change count: 0x%04x\n", exp_change_count);
532*13094Sdavid.hollister@oracle.com
53312126SHyon.Kim@Sun.COM ap = smp_action_alloc(func, tp, 0);
53412126SHyon.Kim@Sun.COM if (ap == NULL) {
53512126SHyon.Kim@Sun.COM smp_close(tp);
53612126SHyon.Kim@Sun.COM smp_fini();
53712126SHyon.Kim@Sun.COM fatal(-3, "failed to allocate action: %s", smp_errmsg());
53812126SHyon.Kim@Sun.COM }
53912126SHyon.Kim@Sun.COM
540*13094Sdavid.hollister@oracle.com switch (func) {
541*13094Sdavid.hollister@oracle.com case SMP_FUNC_DISCOVER: {
54212126SHyon.Kim@Sun.COM smp_discover_req_t *dp;
54312126SHyon.Kim@Sun.COM
54412126SHyon.Kim@Sun.COM smp_action_get_request(ap, (void **)&dp, NULL);
54512126SHyon.Kim@Sun.COM dp->sdr_phy_identifier = strtoul(argv[3], NULL, 0);
546*13094Sdavid.hollister@oracle.com break;
547*13094Sdavid.hollister@oracle.com }
548*13094Sdavid.hollister@oracle.com case SMP_FUNC_REPORT_ROUTE_INFO: {
549*13094Sdavid.hollister@oracle.com smp_handle_report_route_info(argc, argv);
550*13094Sdavid.hollister@oracle.com break;
551*13094Sdavid.hollister@oracle.com }
552*13094Sdavid.hollister@oracle.com case SMP_FUNC_ENABLE_DISABLE_ZONING: {
55312126SHyon.Kim@Sun.COM smp_enable_disable_zoning_req_t *rp;
55412126SHyon.Kim@Sun.COM
55512126SHyon.Kim@Sun.COM smp_action_get_request(ap, (void **)&rp, NULL);
55612126SHyon.Kim@Sun.COM rp->sedzr_enable_disable_zoning = strtoul(argv[3], NULL, 0);
557*13094Sdavid.hollister@oracle.com break;
558*13094Sdavid.hollister@oracle.com }
559*13094Sdavid.hollister@oracle.com case SMP_FUNC_PHY_CONTROL: {
56012126SHyon.Kim@Sun.COM smp_phy_control_req_t *rp;
56112126SHyon.Kim@Sun.COM
56212126SHyon.Kim@Sun.COM smp_action_get_request(ap, (void **)&rp, NULL);
56312126SHyon.Kim@Sun.COM rp->spcr_phy_identifier = strtoul(argv[3], NULL, 0);
56412126SHyon.Kim@Sun.COM rp->spcr_phy_operation = strtoul(argv[4], NULL, 0);
565*13094Sdavid.hollister@oracle.com break;
566*13094Sdavid.hollister@oracle.com }
567*13094Sdavid.hollister@oracle.com case SMP_FUNC_REPORT_EXP_ROUTE_TABLE_LIST: {
56812126SHyon.Kim@Sun.COM smp_report_exp_route_table_list_req_t *rp;
56912126SHyon.Kim@Sun.COM
57012126SHyon.Kim@Sun.COM smp_action_get_request(ap, (void **)&rp, NULL);
57112126SHyon.Kim@Sun.COM SCSI_WRITE16(&rp->srertlr_max_descrs, 64);
57212126SHyon.Kim@Sun.COM SCSI_WRITE16(&rp->srertlr_starting_routed_sas_addr_index,
57312126SHyon.Kim@Sun.COM strtoull(argv[3], NULL, 0));
57412126SHyon.Kim@Sun.COM rp->srertlr_starting_phy_identifier = 0;
575*13094Sdavid.hollister@oracle.com break;
57612126SHyon.Kim@Sun.COM }
577*13094Sdavid.hollister@oracle.com case SMP_FUNC_REPORT_PHY_ERROR_LOG: {
578*13094Sdavid.hollister@oracle.com smp_report_phy_error_log_req_t *pelp;
579*13094Sdavid.hollister@oracle.com
580*13094Sdavid.hollister@oracle.com smp_action_get_request(ap, (void **)&pelp, NULL);
581*13094Sdavid.hollister@oracle.com pelp->srpelr_phy_identifier = strtoul(argv[3], NULL, 0);
582*13094Sdavid.hollister@oracle.com break;
583*13094Sdavid.hollister@oracle.com }
584*13094Sdavid.hollister@oracle.com case SMP_FUNC_REPORT_PHY_EVENT: {
585*13094Sdavid.hollister@oracle.com smp_report_phy_event_req_t *rpep;
58612126SHyon.Kim@Sun.COM
587*13094Sdavid.hollister@oracle.com smp_action_get_request(ap, (void **)&rpep, NULL);
588*13094Sdavid.hollister@oracle.com rpep->srper_phy_identifier = strtoul(argv[3], NULL, 0);
589*13094Sdavid.hollister@oracle.com break;
590*13094Sdavid.hollister@oracle.com }
591*13094Sdavid.hollister@oracle.com case SMP_FUNC_REPORT_ZONE_MANAGER_PASSWORD: {
592*13094Sdavid.hollister@oracle.com smp_report_zone_mgr_password_req_t *rzmprp;
59312126SHyon.Kim@Sun.COM
594*13094Sdavid.hollister@oracle.com smp_action_get_request(ap, (void **)&rzmprp, NULL);
595*13094Sdavid.hollister@oracle.com rzmprp->srzmpr_rpt_type = strtoul(argv[3], NULL, 0);
596*13094Sdavid.hollister@oracle.com break;
597*13094Sdavid.hollister@oracle.com }
598*13094Sdavid.hollister@oracle.com case SMP_FUNC_REPORT_BROADCAST: {
599*13094Sdavid.hollister@oracle.com smp_report_broadcast_req_t *rbrp;
600*13094Sdavid.hollister@oracle.com
601*13094Sdavid.hollister@oracle.com smp_action_get_request(ap, (void **)&rbrp, NULL);
602*13094Sdavid.hollister@oracle.com rbrp->srbr_broadcast_type = strtoul(argv[3], NULL, 0);
603*13094Sdavid.hollister@oracle.com break;
604*13094Sdavid.hollister@oracle.com }
605*13094Sdavid.hollister@oracle.com default:
60612126SHyon.Kim@Sun.COM smp_close(tp);
60712126SHyon.Kim@Sun.COM smp_action_free(ap);
60812126SHyon.Kim@Sun.COM smp_fini();
609*13094Sdavid.hollister@oracle.com smp_cmd_failed(result);
61012126SHyon.Kim@Sun.COM }
61112126SHyon.Kim@Sun.COM
612*13094Sdavid.hollister@oracle.com smp_execute();
613*13094Sdavid.hollister@oracle.com smp_get_response(B_TRUE);
61412126SHyon.Kim@Sun.COM
615*13094Sdavid.hollister@oracle.com switch (func) {
616*13094Sdavid.hollister@oracle.com case SMP_FUNC_DISCOVER: {
617*13094Sdavid.hollister@oracle.com smp_discover_resp_t *rp = (smp_discover_resp_t *)smp_resp;
61812126SHyon.Kim@Sun.COM (void) printf("Addr: %016llx Phy: %02x\n",
61912126SHyon.Kim@Sun.COM SCSI_READ64(&rp->sdr_sas_addr), rp->sdr_phy_identifier);
62012126SHyon.Kim@Sun.COM (void) printf("Peer: %016llx Phy: %02x\n",
62112126SHyon.Kim@Sun.COM SCSI_READ64(&rp->sdr_attached_sas_addr),
62212126SHyon.Kim@Sun.COM rp->sdr_attached_phy_identifier);
62312126SHyon.Kim@Sun.COM (void) printf("Device type: %01x\n",
62412126SHyon.Kim@Sun.COM rp->sdr_attached_device_type);
625*13094Sdavid.hollister@oracle.com break;
626*13094Sdavid.hollister@oracle.com }
627*13094Sdavid.hollister@oracle.com case SMP_FUNC_REPORT_ZONE_MANAGER_PASSWORD: {
628*13094Sdavid.hollister@oracle.com smp_report_zone_mgr_password_resp_t *rp =
629*13094Sdavid.hollister@oracle.com (smp_report_zone_mgr_password_resp_t *)smp_resp;
630*13094Sdavid.hollister@oracle.com char *rpt_type = NULL;
631*13094Sdavid.hollister@oracle.com int idx;
632*13094Sdavid.hollister@oracle.com switch (rp->srzmpr_rpt_type) {
633*13094Sdavid.hollister@oracle.com case SMP_ZMP_TYPE_CURRENT:
634*13094Sdavid.hollister@oracle.com rpt_type = "Current";
635*13094Sdavid.hollister@oracle.com break;
636*13094Sdavid.hollister@oracle.com case SMP_ZMP_TYPE_SAVED:
637*13094Sdavid.hollister@oracle.com rpt_type = "Saved";
638*13094Sdavid.hollister@oracle.com break;
639*13094Sdavid.hollister@oracle.com case SMP_ZMP_TYPE_DEFAULT:
640*13094Sdavid.hollister@oracle.com rpt_type = "Default";
641*13094Sdavid.hollister@oracle.com break;
642*13094Sdavid.hollister@oracle.com default:
643*13094Sdavid.hollister@oracle.com rpt_type = "(Unknown Type)";
644*13094Sdavid.hollister@oracle.com break;
645*13094Sdavid.hollister@oracle.com }
646*13094Sdavid.hollister@oracle.com (void) printf("%s zone manager password: 0x", rpt_type);
647*13094Sdavid.hollister@oracle.com for (idx = 0; idx < 32; idx++) {
648*13094Sdavid.hollister@oracle.com (void) printf("%02x",
649*13094Sdavid.hollister@oracle.com rp->srzmpr_zone_mgr_password[idx]);
650*13094Sdavid.hollister@oracle.com }
651*13094Sdavid.hollister@oracle.com (void) printf("\n");
652*13094Sdavid.hollister@oracle.com break;
653*13094Sdavid.hollister@oracle.com }
654*13094Sdavid.hollister@oracle.com case SMP_FUNC_REPORT_EXP_ROUTE_TABLE_LIST: {
655*13094Sdavid.hollister@oracle.com smp_report_exp_route_table_list_resp_t *rtlr =
656*13094Sdavid.hollister@oracle.com (smp_report_exp_route_table_list_resp_t *)smp_resp;
657*13094Sdavid.hollister@oracle.com smp_route_table_descr_t *descp = &rtlr->srertlr_descrs[0];
658*13094Sdavid.hollister@oracle.com int idx, idxx, ndescrs, zoning, startnum;
659*13094Sdavid.hollister@oracle.com
660*13094Sdavid.hollister@oracle.com (void) printf("Expander change count: 0x%04x\n",
661*13094Sdavid.hollister@oracle.com BE_16(rtlr->srertlr_exp_change_count));
662*13094Sdavid.hollister@oracle.com (void) printf("Expander route table change count: 0x%04x\n",
663*13094Sdavid.hollister@oracle.com BE_16(rtlr->srertlr_route_table_change_count));
664*13094Sdavid.hollister@oracle.com
665*13094Sdavid.hollister@oracle.com if (rtlr->srertlr_zoning_enabled) {
666*13094Sdavid.hollister@oracle.com yesorno = yes;
667*13094Sdavid.hollister@oracle.com zoning = 1;
668*13094Sdavid.hollister@oracle.com } else {
669*13094Sdavid.hollister@oracle.com yesorno = no;
670*13094Sdavid.hollister@oracle.com zoning = 0;
671*13094Sdavid.hollister@oracle.com }
672*13094Sdavid.hollister@oracle.com (void) printf("Zoning enabled: %s\n", yesorno);
673*13094Sdavid.hollister@oracle.com
674*13094Sdavid.hollister@oracle.com if (rtlr->srertlr_configuring) {
675*13094Sdavid.hollister@oracle.com yesorno = yes;
676*13094Sdavid.hollister@oracle.com } else {
677*13094Sdavid.hollister@oracle.com yesorno = no;
678*13094Sdavid.hollister@oracle.com }
679*13094Sdavid.hollister@oracle.com (void) printf("Configuring: %s\n", yesorno);
680*13094Sdavid.hollister@oracle.com
681*13094Sdavid.hollister@oracle.com ndescrs = rtlr->srertlr_n_descrs;
682*13094Sdavid.hollister@oracle.com (void) printf("Number of descriptors: %d\n", ndescrs);
683*13094Sdavid.hollister@oracle.com startnum = BE_16(rtlr->srertlr_first_routed_sas_addr_index);
684*13094Sdavid.hollister@oracle.com (void) printf("First/Last routed SAS address index: %d/%d\n",
685*13094Sdavid.hollister@oracle.com startnum, BE_16(rtlr->srertlr_last_routed_sas_addr_index));
686*13094Sdavid.hollister@oracle.com (void) printf("Starting PHY identifier: %d\n",
687*13094Sdavid.hollister@oracle.com rtlr->srertlr_starting_phy_identifier);
688*13094Sdavid.hollister@oracle.com
689*13094Sdavid.hollister@oracle.com for (idx = 0; idx < ndescrs; idx++, descp++) {
690*13094Sdavid.hollister@oracle.com (void) printf("#%03d: Routed SAS addr: %016llx ",
691*13094Sdavid.hollister@oracle.com idx + startnum, BE_64(descp->srtd_routed_sas_addr));
692*13094Sdavid.hollister@oracle.com (void) printf("PHY bitmap: 0x");
693*13094Sdavid.hollister@oracle.com for (idxx = 0; idxx < 6; idxx++) {
694*13094Sdavid.hollister@oracle.com (void) printf("%02x",
695*13094Sdavid.hollister@oracle.com descp->srtd_phy_bitmap[idxx]);
696*13094Sdavid.hollister@oracle.com }
697*13094Sdavid.hollister@oracle.com (void) printf("\n");
698*13094Sdavid.hollister@oracle.com if (zoning) {
699*13094Sdavid.hollister@oracle.com (void) printf("\tZone group: %d\n",
700*13094Sdavid.hollister@oracle.com descp->srtd_zone_group);
701*13094Sdavid.hollister@oracle.com }
702*13094Sdavid.hollister@oracle.com }
703*13094Sdavid.hollister@oracle.com
704*13094Sdavid.hollister@oracle.com (void) printf("\n");
705*13094Sdavid.hollister@oracle.com break;
706*13094Sdavid.hollister@oracle.com }
707*13094Sdavid.hollister@oracle.com case SMP_FUNC_REPORT_PHY_ERROR_LOG: {
708*13094Sdavid.hollister@oracle.com smp_report_phy_error_log_resp_t *pelr =
709*13094Sdavid.hollister@oracle.com (smp_report_phy_error_log_resp_t *)smp_resp;
710*13094Sdavid.hollister@oracle.com (void) printf("PHY error log for PHY %d:\n",
711*13094Sdavid.hollister@oracle.com pelr->srpelr_phy_identifier);
712*13094Sdavid.hollister@oracle.com (void) printf("\tInvalid DWORD count: %d\n",
713*13094Sdavid.hollister@oracle.com BE_32(pelr->srpelr_invalid_dword_count));
714*13094Sdavid.hollister@oracle.com (void) printf("\tRunning disparity error count: %d\n",
715*13094Sdavid.hollister@oracle.com BE_32(pelr->srpelr_running_disparity_error_count));
716*13094Sdavid.hollister@oracle.com (void) printf("\tLoss of DWORD sync count: %d\n",
717*13094Sdavid.hollister@oracle.com BE_32(pelr->srpelr_loss_dword_sync_count));
718*13094Sdavid.hollister@oracle.com (void) printf("\tPHY reset problem count: %d\n",
719*13094Sdavid.hollister@oracle.com BE_32(pelr->srpelr_phy_reset_problem_count));
720*13094Sdavid.hollister@oracle.com break;
721*13094Sdavid.hollister@oracle.com }
722*13094Sdavid.hollister@oracle.com case SMP_FUNC_REPORT_PHY_EVENT: {
723*13094Sdavid.hollister@oracle.com smp_report_phy_event_resp_t *rper =
724*13094Sdavid.hollister@oracle.com (smp_report_phy_event_resp_t *)smp_resp;
725*13094Sdavid.hollister@oracle.com smp_phy_event_report_descr_t *perd =
726*13094Sdavid.hollister@oracle.com &rper->srper_phy_event_descrs[0];
727*13094Sdavid.hollister@oracle.com boolean_t peak;
728*13094Sdavid.hollister@oracle.com int idx;
729*13094Sdavid.hollister@oracle.com
730*13094Sdavid.hollister@oracle.com (void) printf("PHY event for PHY %d:\n",
731*13094Sdavid.hollister@oracle.com rper->srper_phy_identifier);
732*13094Sdavid.hollister@oracle.com (void) printf("Number of PHY event descriptors: %d\n",
733*13094Sdavid.hollister@oracle.com rper->srper_n_phy_event_descrs);
734*13094Sdavid.hollister@oracle.com
735*13094Sdavid.hollister@oracle.com for (idx = 0; idx < rper->srper_n_phy_event_descrs; idx++) {
736*13094Sdavid.hollister@oracle.com (void) printf("%50s : %d\n",
737*13094Sdavid.hollister@oracle.com smp_phy_event_src_str(perd->sped_phy_event_source,
738*13094Sdavid.hollister@oracle.com &peak), BE_32(perd->sped_phy_event));
739*13094Sdavid.hollister@oracle.com if (peak) {
740*13094Sdavid.hollister@oracle.com (void) printf("\tPeak value detector "
741*13094Sdavid.hollister@oracle.com "threshold: %d\n",
742*13094Sdavid.hollister@oracle.com BE_32(perd->sped_peak_detector_threshold));
743*13094Sdavid.hollister@oracle.com }
744*13094Sdavid.hollister@oracle.com perd++;
745*13094Sdavid.hollister@oracle.com }
746*13094Sdavid.hollister@oracle.com
747*13094Sdavid.hollister@oracle.com break;
748*13094Sdavid.hollister@oracle.com }
749*13094Sdavid.hollister@oracle.com case SMP_FUNC_REPORT_BROADCAST: {
750*13094Sdavid.hollister@oracle.com smp_report_broadcast_resp_t *brp =
751*13094Sdavid.hollister@oracle.com (smp_report_broadcast_resp_t *)smp_resp;
752*13094Sdavid.hollister@oracle.com smp_broadcast_descr_t *bdp = &brp->srbr_descrs[0];
753*13094Sdavid.hollister@oracle.com uint16_t bcount, idx;
754*13094Sdavid.hollister@oracle.com uint8_t bctype;
755*13094Sdavid.hollister@oracle.com
756*13094Sdavid.hollister@oracle.com bcount = brp->srbr_number_broadcast_descrs;
757*13094Sdavid.hollister@oracle.com
758*13094Sdavid.hollister@oracle.com (void) printf("\tNumber of broadcast descriptors: %d\n",
759*13094Sdavid.hollister@oracle.com bcount);
760*13094Sdavid.hollister@oracle.com (void) printf("\t%7s %5s %5s %8s\n",
761*13094Sdavid.hollister@oracle.com "BCType", "PhyID", "BCRsn", "BC Count");
762*13094Sdavid.hollister@oracle.com for (idx = 0; idx < bcount; idx++) {
763*13094Sdavid.hollister@oracle.com (void) printf("\t%7s %5s %5s %8s\n",
764*13094Sdavid.hollister@oracle.com bdp->sbd_broadcast_type, bdp->sbd_phy_identifier,
765*13094Sdavid.hollister@oracle.com bdp->sbd_broadcast_reason,
766*13094Sdavid.hollister@oracle.com bdp->sbd_broadcast_count);
767*13094Sdavid.hollister@oracle.com bdp++;
768*13094Sdavid.hollister@oracle.com }
769*13094Sdavid.hollister@oracle.com
770*13094Sdavid.hollister@oracle.com break;
771*13094Sdavid.hollister@oracle.com }
772*13094Sdavid.hollister@oracle.com default:
773*13094Sdavid.hollister@oracle.com (void) printf("Response: (len %d)\n", smp_resp_len);
774*13094Sdavid.hollister@oracle.com for (i = 0; i < smp_resp_len; i += 8) {
775*13094Sdavid.hollister@oracle.com (void) printf("%02x: ", i);
776*13094Sdavid.hollister@oracle.com for (j = i; j < i + 8; j++)
777*13094Sdavid.hollister@oracle.com if (j < smp_resp_len)
778*13094Sdavid.hollister@oracle.com (void) printf("%02x ", smp_resp[j]);
779*13094Sdavid.hollister@oracle.com else
780*13094Sdavid.hollister@oracle.com (void) printf(" ");
781*13094Sdavid.hollister@oracle.com for (j = i; j < i + 8; j++)
782*13094Sdavid.hollister@oracle.com (void) printf("%c",
783*13094Sdavid.hollister@oracle.com j < smp_resp_len && isprint(smp_resp[j]) ?
784*13094Sdavid.hollister@oracle.com smp_resp[j] : j < smp_resp_len ? '.' :
785*13094Sdavid.hollister@oracle.com '\0');
786*13094Sdavid.hollister@oracle.com (void) printf("\n");
787*13094Sdavid.hollister@oracle.com }
788*13094Sdavid.hollister@oracle.com break;
78912126SHyon.Kim@Sun.COM }
79012126SHyon.Kim@Sun.COM
791*13094Sdavid.hollister@oracle.com smp_cleanup();
79212126SHyon.Kim@Sun.COM return (0);
79312126SHyon.Kim@Sun.COM }
794