ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim/*
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim * CDDL HEADER START
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim *
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim * The contents of this file are subject to the terms of the
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim * Common Development and Distribution License (the "License").
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim * You may not use this file except in compliance with the License.
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim *
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim * or http://www.opensolaris.org/os/licensing.
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim * See the License for the specific language governing permissions
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim * and limitations under the License.
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim *
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim * When distributing Covered Code, include this CDDL HEADER in each
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim * If applicable, add the following below this CDDL HEADER, with the
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim * fields enclosed by brackets "[]" replaced with your own identifying
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim * information: Portions Copyright [yyyy] [name of copyright owner]
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim *
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim * CDDL HEADER END
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim */
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim/*
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
24f5a37652e188ebdcdd6da454511686935025dfRichard PALO * Copyright 2015 PALO, Richard
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim */
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim#include <sys/types.h>
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim#include <sys/scsi/generic/smp_frames.h>
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim#include <sys/scsi/generic/commands.h>
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim#include <sys/scsi/impl/commands.h>
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim#include <sys/ccompile.h>
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister#include <sys/byteorder.h>
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim#include <stdarg.h>
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim#include <stdio.h>
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim#include <string.h>
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim#include <unistd.h>
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim#include <stdlib.h>
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim#include <errno.h>
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim#include <strings.h>
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim#include <ctype.h>
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim#include <scsi/libsmp.h>
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim#include <scsi/libsmp_plugin.h>
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollisterstatic char *yes = "Yes";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollisterstatic char *no = "No";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kimstatic void fatal(int, const char *, ...) __NORETURN;
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollisterstatic smp_target_t *tp = NULL;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollisterstatic smp_action_t *ap = NULL;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollisterstatic smp_function_t func;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollisterstatic smp_result_t result;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollisterstatic smp_target_def_t tdef;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollisterstatic uint8_t *smp_resp;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollisterstatic size_t smp_resp_len;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kimstatic void
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kimfatal(int err, const char *fmt, ...)
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim{
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim va_list ap;
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim va_start(ap, fmt);
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim (void) vfprintf(stderr, fmt, ap);
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim va_end(ap);
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim (void) fprintf(stderr, "\n");
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim (void) fflush(stderr);
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim _exit(err);
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim}
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollisterstatic char *
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollistersmp_get_result(smp_result_t result)
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim{
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister switch (result) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_FUNCTION_ACCEPTED:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("Function accepted");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_UNKNOWN_FUNCTION:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("Unknown function");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_FUNCTION_FAILED:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("Function failed");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_INVALID_REQUEST_FRAME_LENGTH:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("Invalid request frame length");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_INVALID_EXPANDER_CHANGE_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("Invalid expander change count");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_BUSY:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("Busy");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_INCOMPLETE_DESCRIPTOR_LIST:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("Incomplete descriptor list");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_PHY_DOES_NOT_EXIST:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("PHY does not exist");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_INDEX_DOES_NOT_EXIST:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("Index does not exist");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_PHY_DOES_NOT_SUPPORT_SATA:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("PHY does not support SATA");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_UNKNOWN_PHY_OPERATION:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("Unknown PHY operation");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_UNKNOWN_PHY_TEST_FUNCTION:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("Unknown PHY test function");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_PHY_TEST_IN_PROGRESS:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("PHY test in progress");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_PHY_VACANT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("PHY vacant");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_UNKNOWN_PHY_EVENT_SOURCE:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("Unknown PHY event source");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_UNKNOWN_DESCRIPTOR_TYPE:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("Unknown descriptor type");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_UNKNOWN_PHY_FILTER:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("Unknown PHY filter");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_AFFILIATION_VIOLATION:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("Affiliation violation");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_ZONE_VIOLATION:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("Zone violation");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_NO_MANAGEMENT_ACCESS_RIGHTS:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("No management access rights");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_UNKNOWN_ENABLE_DISABLE_ZONING:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("Unknown enable/disable zoning value");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_ZONE_LOCK_VIOLATION:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("Zone lock violation");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_NOT_ACTIVATED:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("Not activated");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_ZONE_GROUP_OUT_OF_RANGE:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("Zone group out of range");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_NO_PHYSICAL_PRESENCE:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("No physical presence");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_SAVING_NOT_SUPPORTED:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("Saving not supported");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_SOURCE_ZONE_GROUP_DNE:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("Source zone group does not exist");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_RES_DISABLED_PW_NOT_SUPPORTED:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return ("Disabled password not supported");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister default:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return (NULL);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister}
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollisterstatic void
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollistersmp_execute()
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister{
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister if (smp_exec(ap, tp) != 0) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_close(tp);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_action_free(ap);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_fini();
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister fatal(-4, "exec failed: %s", smp_errmsg());
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister}
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollisterstatic void
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollistersmp_cmd_failed(smp_result_t result)
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister{
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister char *smp_result_str = smp_get_result(result);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
24f5a37652e188ebdcdd6da454511686935025dfRichard PALO if (smp_result_str == NULL) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister fatal(-5, "Command failed: Unknown result (0x%x)",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister result);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister } else {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister fatal(-5, "Command failed: %s", smp_result_str);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister}
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollisterstatic void
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollistersmp_get_response(boolean_t close_on_fail)
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister{
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_action_get_response(ap, &result, (void **)&smp_resp, &smp_resp_len);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister if (close_on_fail && (result != SMP_RES_FUNCTION_ACCEPTED)) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_close(tp);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_action_free(ap);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_fini();
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_cmd_failed(result);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister}
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollisterstatic void
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollistersmp_cleanup()
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister{
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister if (tp) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_close(tp);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister tp = NULL;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_action_free(ap);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_fini();
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister}
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
24f5a37652e188ebdcdd6da454511686935025dfRichard PALO/* ARGSUSED */
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollisterstatic void
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollistersmp_handle_report_route_info(int argc, char *argv[])
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister{
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_report_route_info_req_t *rp;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_report_route_info_resp_t *rirp;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister uint16_t route_indexes = smp_target_get_exp_route_indexes(tp);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister uint8_t num_phys = smp_target_get_number_of_phys(tp);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister uint16_t rt_idx_req, ri_idx, ri_end;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister uint8_t phy_id_req, pi_idx, pi_end;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister boolean_t enabled_entries = B_FALSE;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister /*
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister * Verify the expander supports the PHY-based expander route table
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister */
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister if (route_indexes == 0) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_cleanup();
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister fatal(-6, "Expander does not support PHY-based route table\n");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister rt_idx_req = strtol(argv[3], NULL, 0);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister phy_id_req = strtol(argv[4], NULL, 0);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister if (((int16_t)rt_idx_req == -1) && ((int8_t)phy_id_req == -1)) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister ri_idx = 0;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister ri_end = route_indexes - 1;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister pi_idx = 0;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister pi_end = num_phys - 1;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister } else if (((int16_t)rt_idx_req < 0) || (rt_idx_req >= route_indexes) ||
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister ((int8_t)phy_id_req < 0) || (phy_id_req >= num_phys)) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_cleanup();
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister fatal(-1, "Invalid route index (%d) or PHY ID (%d)\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister rt_idx_req, phy_id_req);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister } else {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister ri_end = ri_idx = rt_idx_req;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister pi_end = pi_idx = phy_id_req;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("%6s %6s %3s %14s\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister "RT Idx", "PHY ID", "DIS", "Routed SASAddr");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_action_get_request(ap, (void **)&rp, NULL);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister while (ri_idx <= ri_end) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister while (pi_idx <= pi_end) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister rp->srrir_phy_identifier = pi_idx;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister rp->srrir_exp_route_index = ri_idx;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_execute();
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_get_response(B_FALSE);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister if (result != SMP_RES_FUNCTION_ACCEPTED) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister pi_idx++;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister continue;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister rirp = (smp_report_route_info_resp_t *)smp_resp;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister if (rirp->srrir_exp_route_entry_disabled == 0) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister enabled_entries = B_TRUE;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("%6d %6d %3d %016llx\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister rirp->srrir_exp_route_index,
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister rirp->srrir_phy_identifier,
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister rirp->srrir_exp_route_entry_disabled,
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister BE_64(rirp->srrir_routed_sas_addr));
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister pi_idx++;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister ri_idx++;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister pi_idx = 0;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister if (!enabled_entries) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("No enabled entries in the table.\n");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_cleanup();
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister exit(0);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister}
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollisterstatic char *
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollistersmp_phy_event_src_str(smp_phy_event_source_t src, boolean_t *peak_detector)
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister{
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister char *src_str;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister *peak_detector = B_FALSE;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister switch (src) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_NO_EVENT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "No event";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_INVALID_DWORD_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Invalid DWORD count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_RUNNING_DISPARITY_ERROR_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Running disparity error count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_LOSS_OF_DWORD_SYNC_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Loss of DWORD sync count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_PHY_RESET_PROBLEM_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "PHY reset problem count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_ELASTICITY_BUFFER_OVERFLOW_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Elasticity buffer overflow count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_RX_ERROR_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Received ERROR count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_RX_ADDR_FRAME_ERROR_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Received address frame error count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_TX_ABANDON_CLASS_OPEN_REJ_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Transmitted abandon-class OPEN_REJECT count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_RX_ABANDON_CLASS_OPEN_REJ_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Received abandon-class OPEN_REJECT count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_TX_RETRY_CLASS_OPEN_REJ_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Transmitted retry-class OPEN_REJECT count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_RX_RETRY_CLASS_OPEN_REJ_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Received retry-class OPEN_REJECT count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_RX_AIP_W_O_PARTIAL_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Received AIP (WAITING ON PARTIAL) count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_RX_AIP_W_O_CONN_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Received AIP (WAITING ON CONNECTION) count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_TX_BREAK_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Transmitted BREAK count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_RX_BREAK_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Received BREAK count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_BREAK_TIMEOUT_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "BREAK timeout count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_CONNECTION_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Connection count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_PEAK_TX_PATHWAY_BLOCKED_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Peak transmitted pathway blocked count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister *peak_detector = B_TRUE;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_PEAK_TX_ARB_WAIT_TIME:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Peak transmitted arbitration wait time";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister *peak_detector = B_TRUE;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_PEAK_ARB_TIME:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Peak arbitration time";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister *peak_detector = B_TRUE;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_PEAK_CONNECTION_TIME:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Peak connection time";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister *peak_detector = B_TRUE;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_TX_SSP_FRAME_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Transmitted SSP frame count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_RX_SSP_FRAME_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Received SSP frame count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_TX_SSP_FRAME_ERROR_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Transmitted SSP frame error count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_RX_SSP_FRAME_ERROR_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Received SSP frame error count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_TX_CREDIT_BLOCKED_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Transmitted CREDIT_BLOCKED count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_RX_CREDIT_BLOCKED_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Received CREDIT_BLOCKED count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_TX_SATA_FRAME_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Transmitted SATA frame count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_RX_SATA_FRAME_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Received SATA frame count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_SATA_FLOW_CTRL_BUF_OVERFLOW_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "SATA flow control buffer overflow count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_TX_SMP_FRAME_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Transmitted SMP frame count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_RX_SMP_FRAME_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Received SMP frame count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_PHY_EVENT_RX_SMP_FRAME_ERROR_COUNT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "Received SMP frame error count";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister default:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister src_str = "<Unknown>";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister return (src_str);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister}
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollisterstatic void
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollistersmp_validate_args(int argc, char *argv[])
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister{
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister errno = 0;
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim if (argc < 3)
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim fatal(-1, "Usage: %s <device> <function> ...\n", argv[0]);
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim func = strtoul(argv[2], NULL, 0);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim if (errno != 0)
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim fatal(-1, "Usage: %s <device> <function> ...\n", argv[0]);
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister switch (func) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_FUNC_DISCOVER:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_FUNC_REPORT_PHY_EVENT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_FUNC_REPORT_PHY_ERROR_LOG: {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister if (argc != 4) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister fatal(-1,
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister "Usage: %s <device> 0x%x <phy identifier>\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister argv[0], func);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_FUNC_REPORT_EXP_ROUTE_TABLE_LIST: {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister if (argc < 4) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister fatal(-1,
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister "Usage: %s <device> 0x%x <SAS Address Index>\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister argv[0], func);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_FUNC_REPORT_ZONE_MANAGER_PASSWORD: {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister if (argc < 4) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister fatal(-1,
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister "Usage: %s <device> 0x%x <report type>\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister argv[0], func);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_FUNC_ENABLE_DISABLE_ZONING: {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister if (argc != 4) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister fatal(-1,
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister "Usage: %s <device> 0x%x "
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister "[0(no change) | 1(enable)| 2(disable)]\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister argv[0], func);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_FUNC_REPORT_BROADCAST: {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister if (argc != 4) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister fatal(-1, "Usage: %s <device> 0x%x <bcast type>\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister argv[0], func);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_FUNC_REPORT_ROUTE_INFO: {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister if (argc != 5) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister fatal(-1,
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister "Usage: %s <device> 0x%x <exp_route_idx> "
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister "<phy_identifier>\n", argv[0], func);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_FUNC_PHY_CONTROL: {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister if (argc != 5) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister fatal(-1,
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister "Usage: %s <device> 0x%x <phy identifier> "
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister " <phy operation>\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister argv[0], func);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister default: {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister fatal(-1, "Usage: %s <device> <function> ...\n", argv[0]);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister}
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollisterint
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollistermain(int argc, char *argv[])
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister{
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister uint_t i, j;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister char *yesorno;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister uint16_t exp_change_count;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister /*
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister * If the arguments are invalid, this function will not return.
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister */
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_validate_args(argc, argv);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim if (smp_init(LIBSMP_VERSION) != 0)
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim fatal(-1, "libsmp initialization failed: %s", smp_errmsg());
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim bzero(&tdef, sizeof (smp_target_def_t));
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim tdef.std_def = argv[1];
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim if ((tp = smp_open(&tdef)) == NULL) {
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim smp_fini();
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim fatal(-2, "failed to open %s: %s", argv[1], smp_errmsg());
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim }
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister exp_change_count = smp_target_get_change_count(tp);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("%s\n", argv[0]);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("\tSAS Address: %016llx\n", smp_target_addr(tp));
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("\tVendor/Product/Revision: %s/%s/%s\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_target_vendor(tp), smp_target_product(tp),
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_target_revision(tp));
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("\tExp Vendor/ID/Rev: %s/%04x/%02x\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_target_component_vendor(tp), smp_target_component_id(tp),
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_target_component_revision(tp));
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("\tExpander change count: 0x%04x\n", exp_change_count);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim ap = smp_action_alloc(func, tp, 0);
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim if (ap == NULL) {
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim smp_close(tp);
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim smp_fini();
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim fatal(-3, "failed to allocate action: %s", smp_errmsg());
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim }
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister switch (func) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_FUNC_DISCOVER: {
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim smp_discover_req_t *dp;
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim smp_action_get_request(ap, (void **)&dp, NULL);
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim dp->sdr_phy_identifier = strtoul(argv[3], NULL, 0);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_FUNC_REPORT_ROUTE_INFO: {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_handle_report_route_info(argc, argv);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_FUNC_ENABLE_DISABLE_ZONING: {
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim smp_enable_disable_zoning_req_t *rp;
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim smp_action_get_request(ap, (void **)&rp, NULL);
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim rp->sedzr_enable_disable_zoning = strtoul(argv[3], NULL, 0);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_FUNC_PHY_CONTROL: {
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim smp_phy_control_req_t *rp;
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim smp_action_get_request(ap, (void **)&rp, NULL);
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim rp->spcr_phy_identifier = strtoul(argv[3], NULL, 0);
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim rp->spcr_phy_operation = strtoul(argv[4], NULL, 0);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_FUNC_REPORT_EXP_ROUTE_TABLE_LIST: {
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim smp_report_exp_route_table_list_req_t *rp;
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim smp_action_get_request(ap, (void **)&rp, NULL);
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim SCSI_WRITE16(&rp->srertlr_max_descrs, 64);
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim SCSI_WRITE16(&rp->srertlr_starting_routed_sas_addr_index,
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim strtoull(argv[3], NULL, 0));
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim rp->srertlr_starting_phy_identifier = 0;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_FUNC_REPORT_PHY_ERROR_LOG: {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_report_phy_error_log_req_t *pelp;
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_action_get_request(ap, (void **)&pelp, NULL);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister pelp->srpelr_phy_identifier = strtoul(argv[3], NULL, 0);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_FUNC_REPORT_PHY_EVENT: {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_report_phy_event_req_t *rpep;
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_action_get_request(ap, (void **)&rpep, NULL);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister rpep->srper_phy_identifier = strtoul(argv[3], NULL, 0);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_FUNC_REPORT_ZONE_MANAGER_PASSWORD: {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_report_zone_mgr_password_req_t *rzmprp;
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_action_get_request(ap, (void **)&rzmprp, NULL);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister rzmprp->srzmpr_rpt_type = strtoul(argv[3], NULL, 0);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_FUNC_REPORT_BROADCAST: {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_report_broadcast_req_t *rbrp;
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_action_get_request(ap, (void **)&rbrp, NULL);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister rbrp->srbr_broadcast_type = strtoul(argv[3], NULL, 0);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister default:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_close(tp);
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim smp_action_free(ap);
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim smp_fini();
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_cmd_failed(result);
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim }
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_execute();
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_get_response(B_TRUE);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister switch (func) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_FUNC_DISCOVER: {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_discover_resp_t *rp = (smp_discover_resp_t *)smp_resp;
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim (void) printf("Addr: %016llx Phy: %02x\n",
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim SCSI_READ64(&rp->sdr_sas_addr), rp->sdr_phy_identifier);
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim (void) printf("Peer: %016llx Phy: %02x\n",
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim SCSI_READ64(&rp->sdr_attached_sas_addr),
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim rp->sdr_attached_phy_identifier);
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim (void) printf("Device type: %01x\n",
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim rp->sdr_attached_device_type);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_FUNC_REPORT_ZONE_MANAGER_PASSWORD: {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_report_zone_mgr_password_resp_t *rp =
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (smp_report_zone_mgr_password_resp_t *)smp_resp;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister char *rpt_type = NULL;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister int idx;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister switch (rp->srzmpr_rpt_type) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_ZMP_TYPE_CURRENT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister rpt_type = "Current";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_ZMP_TYPE_SAVED:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister rpt_type = "Saved";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_ZMP_TYPE_DEFAULT:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister rpt_type = "Default";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister default:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister rpt_type = "(Unknown Type)";
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("%s zone manager password: 0x", rpt_type);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister for (idx = 0; idx < 32; idx++) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("%02x",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister rp->srzmpr_zone_mgr_password[idx]);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("\n");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_FUNC_REPORT_EXP_ROUTE_TABLE_LIST: {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_report_exp_route_table_list_resp_t *rtlr =
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (smp_report_exp_route_table_list_resp_t *)smp_resp;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_route_table_descr_t *descp = &rtlr->srertlr_descrs[0];
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister int idx, idxx, ndescrs, zoning, startnum;
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("Expander change count: 0x%04x\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister BE_16(rtlr->srertlr_exp_change_count));
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("Expander route table change count: 0x%04x\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister BE_16(rtlr->srertlr_route_table_change_count));
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister if (rtlr->srertlr_zoning_enabled) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister yesorno = yes;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister zoning = 1;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister } else {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister yesorno = no;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister zoning = 0;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("Zoning enabled: %s\n", yesorno);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister if (rtlr->srertlr_configuring) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister yesorno = yes;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister } else {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister yesorno = no;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("Configuring: %s\n", yesorno);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister ndescrs = rtlr->srertlr_n_descrs;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("Number of descriptors: %d\n", ndescrs);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister startnum = BE_16(rtlr->srertlr_first_routed_sas_addr_index);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("First/Last routed SAS address index: %d/%d\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister startnum, BE_16(rtlr->srertlr_last_routed_sas_addr_index));
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("Starting PHY identifier: %d\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister rtlr->srertlr_starting_phy_identifier);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister for (idx = 0; idx < ndescrs; idx++, descp++) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("#%03d: Routed SAS addr: %016llx ",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister idx + startnum, BE_64(descp->srtd_routed_sas_addr));
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("PHY bitmap: 0x");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister for (idxx = 0; idxx < 6; idxx++) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("%02x",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister descp->srtd_phy_bitmap[idxx]);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("\n");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister if (zoning) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("\tZone group: %d\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister descp->srtd_zone_group);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("\n");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_FUNC_REPORT_PHY_ERROR_LOG: {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_report_phy_error_log_resp_t *pelr =
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (smp_report_phy_error_log_resp_t *)smp_resp;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("PHY error log for PHY %d:\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister pelr->srpelr_phy_identifier);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("\tInvalid DWORD count: %d\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister BE_32(pelr->srpelr_invalid_dword_count));
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("\tRunning disparity error count: %d\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister BE_32(pelr->srpelr_running_disparity_error_count));
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("\tLoss of DWORD sync count: %d\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister BE_32(pelr->srpelr_loss_dword_sync_count));
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("\tPHY reset problem count: %d\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister BE_32(pelr->srpelr_phy_reset_problem_count));
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_FUNC_REPORT_PHY_EVENT: {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_report_phy_event_resp_t *rper =
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (smp_report_phy_event_resp_t *)smp_resp;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_phy_event_report_descr_t *perd =
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister &rper->srper_phy_event_descrs[0];
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister boolean_t peak;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister int idx;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("PHY event for PHY %d:\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister rper->srper_phy_identifier);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("Number of PHY event descriptors: %d\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister rper->srper_n_phy_event_descrs);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister for (idx = 0; idx < rper->srper_n_phy_event_descrs; idx++) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("%50s : %d\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_phy_event_src_str(perd->sped_phy_event_source,
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister &peak), BE_32(perd->sped_phy_event));
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister if (peak) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("\tPeak value detector "
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister "threshold: %d\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister BE_32(perd->sped_peak_detector_threshold));
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister perd++;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister case SMP_FUNC_REPORT_BROADCAST: {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_report_broadcast_resp_t *brp =
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (smp_report_broadcast_resp_t *)smp_resp;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_broadcast_descr_t *bdp = &brp->srbr_descrs[0];
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister uint16_t bcount, idx;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister bcount = brp->srbr_number_broadcast_descrs;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("\tNumber of broadcast descriptors: %d\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister bcount);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("\t%7s %5s %5s %8s\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister "BCType", "PhyID", "BCRsn", "BC Count");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister for (idx = 0; idx < bcount; idx++) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("\t%7s %5s %5s %8s\n",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister bdp->sbd_broadcast_type, bdp->sbd_phy_identifier,
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister bdp->sbd_broadcast_reason,
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister bdp->sbd_broadcast_count);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister bdp++;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister default:
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("Response: (len %d)\n", smp_resp_len);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister for (i = 0; i < smp_resp_len; i += 8) {
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("%02x: ", i);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister for (j = i; j < i + 8; j++)
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister if (j < smp_resp_len)
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("%02x ", smp_resp[j]);
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister else
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf(" ");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister for (j = i; j < i + 8; j++)
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("%c",
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister j < smp_resp_len && isprint(smp_resp[j]) ?
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_resp[j] : j < smp_resp_len ? '.' :
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister '\0');
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister (void) printf("\n");
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister break;
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister }
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim
d0698e0d179f97729cacdbc2f13446a6b0a3f22aDavid Hollister smp_cleanup();
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim return (0);
ac88567a7a5bb7f01cf22cf366bc9d6203e24d7aHyon Kim}