66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CDDL HEADER START
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * The contents of this file are subject to the terms of the
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Common Development and Distribution License (the "License").
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * You may not use this file except in compliance with the License.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * or http://www.opensolaris.org/os/licensing.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * See the License for the specific language governing permissions
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * and limitations under the License.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * When distributing Covered Code, include this CDDL HEADER in each
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * If applicable, add the following below this CDDL HEADER, with the
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * fields enclosed by brackets "[]" replaced with your own identifying
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * information: Portions Copyright [yyyy] [name of copyright owner]
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CDDL HEADER END
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Use is subject to license terms.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
724365f7556fc4201fdb11766ebc6bd918523130sethg#include <sys/param.h>
724365f7556fc4201fdb11766ebc6bd918523130sethg#include <sys/stat.h>
724365f7556fc4201fdb11766ebc6bd918523130sethg#include <errno.h>
724365f7556fc4201fdb11766ebc6bd918523130sethg#include <string.h>
724365f7556fc4201fdb11766ebc6bd918523130sethg#include <dirent.h>
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#include "cfga_sata.h"
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * This file contains the entry points to the plug-in as defined in the
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * config_admin(3X) man page.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Set the version number for the cfgadm library's use.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfint cfga_version = CFGA_HSL_V2;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfenum {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf HELP_HEADER = 1,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf HELP_CONFIG,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf HELP_RESET_PORT,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf HELP_RESET_DEVICE,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf HELP_RESET_ALL,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf HELP_PORT_DEACTIVATE,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf HELP_PORT_ACTIVATE,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf HELP_PORT_SELF_TEST,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf HELP_CNTRL_SELF_TEST,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf HELP_UNKNOWN
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf};
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/* SATA specific help messages */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstatic char *sata_help[] = {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf NULL,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf "SATA specific commands:\n",
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf " cfgadm -c [configure|unconfigure|disconnect|connect] ap_id "
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang "[ap_id...]\n",
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf " cfgadm -x sata_reset_port ap_id [ap_id...]\n",
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf " cfgadm -x sata_reset_device ap_id [ap_id...]\n",
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf " cfgadm -x sata_reset_all ap_id\n",
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf " cfgadm -x sata_port_deactivate ap_id [ap_id...]\n",
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf " cfgadm -x sata_port_activate ap_id [ap_id...]\n",
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf " cfgadm -x sata_port_self_test ap_id [ap_id...]\n",
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf " cfgadm -t ap_id\n",
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf "\tunknown command or option:\n",
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf NULL
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf}; /* End help messages */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Messages.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstatic msgcvt_t sata_msgs[] = {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* CFGA_SATA_OK */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_OK, "" },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* CFGA_SATA_NACK */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_NACK, "" },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* CFGA_SATA_DEVICE_UNCONFIGURED */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_OK, "Device unconfigured prior to disconnect" },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* CFGA_SATA_UNKNOWN / CFGA_LIB_ERROR -> "Library error" */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_LIB_ERROR, "Unknown message; internal error" },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* CFGA_SATA_INTERNAL_ERROR / CFGA_LIB_ERROR -> "Library error" */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_LIB_ERROR, "Internal error" },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* CFGA_SATA_DATA_ERROR / CFGA_DATA_ERROR -> "Data error" */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_DATA_ERROR, "cfgadm data error" },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* CFGA_SATA_OPTIONS / CFGA_ERROR -> "Hardware specific failure" */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_ERROR, "Hardware specific option not supported" },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* CFGA_SATA_HWOPNOTSUPP / CFGA_ERROR -> "Hardware specific failure" */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_ERROR, "Hardware specific operation not supported" },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CFGA_SATA_DYNAMIC_AP /
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CFGA_LIB_ERROR -> "Configuration operation invalid"
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_INVAL, "Cannot identify attached device" },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* CFGA_SATA_AP / CFGA_APID_NOEXIST -> "Attachment point not found" */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_APID_NOEXIST, "" },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* CFGA_SATA_PORT / CFGA_LIB_ERROR -> "Library error" */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_LIB_ERROR, "Cannot determine sata port number for " },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* CFGA_SATA_DEVCTL / CFGA_LIB_ERROR -> "Library error" */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_LIB_ERROR, "Internal error: "
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang "Cannot allocate devctl handle " },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CFGA_SATA_DEV_CONFIGURE /
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CFGA_ERROR -> "Hardware specific failure"
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_ERROR, "Failed to config device at " },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CFGA_SATA_DEV_UNCONFIGURE /
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CFGA_ERROR -> "Hardware specific failure"
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_ERROR, "Failed to unconfig device at " },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CFGA_SATA_DISCONNECTED
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CFGA_INVAL -> "Configuration operation invalid"
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_INVAL, "Port already disconnected " },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CFGA_SATA_NOT_CONNECTED
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CFGA_INVAL -> "Configuration operation invalid"
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_INVAL, "No device connected to " },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CFGA_SATA_NOT_CONFIGURED /
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CFGA_INVAL -> "Configuration operation invalid"
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_INVAL, "No device configured at " },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CFGA_SATA_ALREADY_CONNECTED /
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CFGA_INVAL -> "Configuration operation invalid"
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_INVAL, "Device already connected to " },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CFGA_SATA_ALREADY_CONFIGURED /
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CFGA_INVAL -> "Configuration operation invalid"
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_INVAL, "Device already configured at " },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CFGA_SATA_INVALID_DEVNAME /
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CFGA_INVAL -> "Configuration operation invalid"
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_INVAL, "Cannot specify device name" },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* CFGA_SATA_OPEN / CFGA_LIB_ERROR -> "Library error" */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_LIB_ERROR, "Cannot open " },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* CFGA_SATA_IOCTL / CFGA_ERROR -> "Hardware specific failure" */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_ERROR, "Driver ioctl failed " },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CFGA_SATA_BUSY /
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CFGA_SYSTEM_BUSY -> "System is busy, try again"
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_SYSTEM_BUSY, "" },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* CFGA_SATA_ALLOC_FAIL / CFGA_LIB_ERROR -> "Library error" */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_LIB_ERROR, "Memory allocation failure" },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CFGA_SATA_OPNOTSUPP /
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CFGA_OPNOTSUPP -> "Configuration operation not supported"
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_OPNOTSUPP, "Operation not supported" },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* CFGA_SATA_DEVLINK / CFGA_LIB_ERROR -> "Library error" */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_LIB_ERROR, "Could not find /dev/cfg link for " },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* CFGA_SATA_STATE / CFGA_LIB_ERROR -> "Library error" */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_LIB_ERROR, "Internal error: Unrecognized ap state" },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* CFGA_SATA_PRIV / CFGA_PRIV -> "Insufficient privileges" */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_PRIV, "" },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* CFGA_SATA_NVLIST / CFGA_ERROR -> "Hardware specific failure" */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_ERROR, "Internal error (nvlist)" },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* CFGA_SATA_ZEROLEN / CFGA_ERROR -> "Hardware specific failure" */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_ERROR, "Internal error (zerolength string)" },
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* CFGA_SATA_RCM_HANDLE / CFGA_ERROR -> "Hardware specific failure" */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_ERROR, "cannot get RCM handle"},
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CFGA_SATA_RCM_ONLINE /
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CFGA_SYSTEM_BUSY -> "System is busy, try again"
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_SYSTEM_BUSY, "failed to online: "},
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CFGA_SATA_RCM_OFFLINE /
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CFGA_SYSTEM_BUSY -> "System is busy, try again"
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_SYSTEM_BUSY, "failed to offline: "},
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* CFGA_SATA_RCM_INFO / CFGA_ERROR -> "Hardware specific failure" */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf { CVT, CFGA_ERROR, "failed to query: "}
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf}; /* End error messages */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstatic cfga_sata_ret_t
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfverify_params(const char *ap_id, const char *options, char **errstring);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstatic cfga_sata_ret_t
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfsetup_for_devctl_cmd(const char *ap_id, devctl_hdl_t *devctl_hdl,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang nvlist_t **user_nvlistp, uint_t oflag);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstatic cfga_sata_ret_t
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfport_state(devctl_hdl_t hdl, nvlist_t *list,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang ap_rstate_t *rstate, ap_ostate_t *ostate);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstatic cfga_sata_ret_t
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfdo_control_ioctl(const char *ap_id, sata_cfga_apctl_t subcommand, uint_t arg,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang void **descrp, size_t *sizep);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstatic void
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfcleanup_after_devctl_cmd(devctl_hdl_t devctl_hdl, nvlist_t *user_nvlist);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstatic char *
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfsata_get_devicepath(const char *ap_id);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstatic int
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfsata_confirm(struct cfga_confirm *confp, char *msg);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhangstatic cfga_sata_ret_t
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhangget_port_num(const char *ap_id, uint32_t *port);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/* Utilities */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
724365f7556fc4201fdb11766ebc6bd918523130sethgstatic cfga_sata_ret_t
724365f7556fc4201fdb11766ebc6bd918523130sethgphyspath_to_devlink(const char *basedir, const char *node_path,
724365f7556fc4201fdb11766ebc6bd918523130sethg char **logpp, int *l_errnop)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf{
724365f7556fc4201fdb11766ebc6bd918523130sethg char *linkpath;
724365f7556fc4201fdb11766ebc6bd918523130sethg char *buf;
724365f7556fc4201fdb11766ebc6bd918523130sethg char *real_path;
724365f7556fc4201fdb11766ebc6bd918523130sethg DIR *dp;
724365f7556fc4201fdb11766ebc6bd918523130sethg struct dirent *dep, *newdep;
724365f7556fc4201fdb11766ebc6bd918523130sethg int deplen;
724365f7556fc4201fdb11766ebc6bd918523130sethg boolean_t found = B_FALSE;
724365f7556fc4201fdb11766ebc6bd918523130sethg int err = 0;
724365f7556fc4201fdb11766ebc6bd918523130sethg struct stat sb;
724365f7556fc4201fdb11766ebc6bd918523130sethg char *p;
724365f7556fc4201fdb11766ebc6bd918523130sethg cfga_sata_ret_t rv = CFGA_SATA_INTERNAL_ERROR;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
724365f7556fc4201fdb11766ebc6bd918523130sethg * Using libdevinfo for this is overkill and kills performance
724365f7556fc4201fdb11766ebc6bd918523130sethg * when multiple consumers of libcfgadm are executing
724365f7556fc4201fdb11766ebc6bd918523130sethg * concurrently.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
724365f7556fc4201fdb11766ebc6bd918523130sethg if ((dp = opendir(basedir)) == NULL) {
724365f7556fc4201fdb11766ebc6bd918523130sethg *l_errnop = errno;
724365f7556fc4201fdb11766ebc6bd918523130sethg return (CFGA_SATA_INTERNAL_ERROR);
724365f7556fc4201fdb11766ebc6bd918523130sethg }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
724365f7556fc4201fdb11766ebc6bd918523130sethg linkpath = malloc(PATH_MAX);
724365f7556fc4201fdb11766ebc6bd918523130sethg buf = malloc(PATH_MAX);
724365f7556fc4201fdb11766ebc6bd918523130sethg real_path = malloc(PATH_MAX);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
d3080269c400bce011f72255205cee37b5b04079sethg deplen = pathconf(basedir, _PC_NAME_MAX);
d3080269c400bce011f72255205cee37b5b04079sethg deplen = (deplen <= 0 ? MAXNAMELEN : deplen) +
724365f7556fc4201fdb11766ebc6bd918523130sethg sizeof (struct dirent);
724365f7556fc4201fdb11766ebc6bd918523130sethg dep = (struct dirent *)malloc(deplen);
724365f7556fc4201fdb11766ebc6bd918523130sethg
724365f7556fc4201fdb11766ebc6bd918523130sethg if (dep == NULL || linkpath == NULL || buf == NULL ||
724365f7556fc4201fdb11766ebc6bd918523130sethg real_path == NULL) {
724365f7556fc4201fdb11766ebc6bd918523130sethg *l_errnop = ENOMEM;
724365f7556fc4201fdb11766ebc6bd918523130sethg rv = CFGA_SATA_ALLOC_FAIL;
724365f7556fc4201fdb11766ebc6bd918523130sethg goto pp_cleanup;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
724365f7556fc4201fdb11766ebc6bd918523130sethg *logpp = NULL;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
724365f7556fc4201fdb11766ebc6bd918523130sethg while (!found && (err = readdir_r(dp, dep, &newdep)) == 0 &&
724365f7556fc4201fdb11766ebc6bd918523130sethg newdep != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
724365f7556fc4201fdb11766ebc6bd918523130sethg assert(newdep == dep);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
724365f7556fc4201fdb11766ebc6bd918523130sethg if (strcmp(dep->d_name, ".") == 0 ||
724365f7556fc4201fdb11766ebc6bd918523130sethg strcmp(dep->d_name, "..") == 0)
724365f7556fc4201fdb11766ebc6bd918523130sethg continue;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
724365f7556fc4201fdb11766ebc6bd918523130sethg (void) snprintf(linkpath, MAXPATHLEN,
724365f7556fc4201fdb11766ebc6bd918523130sethg "%s/%s", basedir, dep->d_name);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
724365f7556fc4201fdb11766ebc6bd918523130sethg if (lstat(linkpath, &sb) < 0)
724365f7556fc4201fdb11766ebc6bd918523130sethg continue;
724365f7556fc4201fdb11766ebc6bd918523130sethg
724365f7556fc4201fdb11766ebc6bd918523130sethg if (S_ISDIR(sb.st_mode)) {
724365f7556fc4201fdb11766ebc6bd918523130sethg
724365f7556fc4201fdb11766ebc6bd918523130sethg if ((rv = physpath_to_devlink(linkpath, node_path,
724365f7556fc4201fdb11766ebc6bd918523130sethg logpp, l_errnop)) != CFGA_SATA_OK) {
724365f7556fc4201fdb11766ebc6bd918523130sethg
724365f7556fc4201fdb11766ebc6bd918523130sethg goto pp_cleanup;
724365f7556fc4201fdb11766ebc6bd918523130sethg }
724365f7556fc4201fdb11766ebc6bd918523130sethg
724365f7556fc4201fdb11766ebc6bd918523130sethg if (*logpp != NULL)
724365f7556fc4201fdb11766ebc6bd918523130sethg found = B_TRUE;
724365f7556fc4201fdb11766ebc6bd918523130sethg
724365f7556fc4201fdb11766ebc6bd918523130sethg } else if (S_ISLNK(sb.st_mode)) {
724365f7556fc4201fdb11766ebc6bd918523130sethg
724365f7556fc4201fdb11766ebc6bd918523130sethg bzero(buf, PATH_MAX);
724365f7556fc4201fdb11766ebc6bd918523130sethg if (readlink(linkpath, buf, PATH_MAX) < 0)
724365f7556fc4201fdb11766ebc6bd918523130sethg continue;
724365f7556fc4201fdb11766ebc6bd918523130sethg
724365f7556fc4201fdb11766ebc6bd918523130sethg
724365f7556fc4201fdb11766ebc6bd918523130sethg /*
724365f7556fc4201fdb11766ebc6bd918523130sethg * realpath() is too darn slow, so fake
724365f7556fc4201fdb11766ebc6bd918523130sethg * it, by using what we know about /dev
724365f7556fc4201fdb11766ebc6bd918523130sethg * links: they are always of the form:
724365f7556fc4201fdb11766ebc6bd918523130sethg * <"../">+/devices/<path>
724365f7556fc4201fdb11766ebc6bd918523130sethg */
724365f7556fc4201fdb11766ebc6bd918523130sethg p = buf;
724365f7556fc4201fdb11766ebc6bd918523130sethg while (strncmp(p, "../", 3) == 0)
724365f7556fc4201fdb11766ebc6bd918523130sethg p += 3;
724365f7556fc4201fdb11766ebc6bd918523130sethg
724365f7556fc4201fdb11766ebc6bd918523130sethg if (p != buf)
724365f7556fc4201fdb11766ebc6bd918523130sethg p--; /* back up to get a slash */
724365f7556fc4201fdb11766ebc6bd918523130sethg
724365f7556fc4201fdb11766ebc6bd918523130sethg assert (*p == '/');
724365f7556fc4201fdb11766ebc6bd918523130sethg
724365f7556fc4201fdb11766ebc6bd918523130sethg if (strcmp(p, node_path) == 0) {
724365f7556fc4201fdb11766ebc6bd918523130sethg *logpp = strdup(linkpath);
724365f7556fc4201fdb11766ebc6bd918523130sethg if (*logpp == NULL) {
724365f7556fc4201fdb11766ebc6bd918523130sethg
724365f7556fc4201fdb11766ebc6bd918523130sethg rv = CFGA_SATA_ALLOC_FAIL;
724365f7556fc4201fdb11766ebc6bd918523130sethg goto pp_cleanup;
724365f7556fc4201fdb11766ebc6bd918523130sethg }
724365f7556fc4201fdb11766ebc6bd918523130sethg
724365f7556fc4201fdb11766ebc6bd918523130sethg found = B_TRUE;
724365f7556fc4201fdb11766ebc6bd918523130sethg }
724365f7556fc4201fdb11766ebc6bd918523130sethg }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
724365f7556fc4201fdb11766ebc6bd918523130sethg free(linkpath);
724365f7556fc4201fdb11766ebc6bd918523130sethg free(buf);
724365f7556fc4201fdb11766ebc6bd918523130sethg free(real_path);
724365f7556fc4201fdb11766ebc6bd918523130sethg free(dep);
724365f7556fc4201fdb11766ebc6bd918523130sethg (void) closedir(dp);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
724365f7556fc4201fdb11766ebc6bd918523130sethg if (err != 0) {
724365f7556fc4201fdb11766ebc6bd918523130sethg *l_errnop = err;
724365f7556fc4201fdb11766ebc6bd918523130sethg return (CFGA_SATA_INTERNAL_ERROR);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
724365f7556fc4201fdb11766ebc6bd918523130sethg return (CFGA_SATA_OK);
724365f7556fc4201fdb11766ebc6bd918523130sethg
724365f7556fc4201fdb11766ebc6bd918523130sethgpp_cleanup:
724365f7556fc4201fdb11766ebc6bd918523130sethg
724365f7556fc4201fdb11766ebc6bd918523130sethg if (dp)
724365f7556fc4201fdb11766ebc6bd918523130sethg (void) closedir(dp);
724365f7556fc4201fdb11766ebc6bd918523130sethg if (dep)
724365f7556fc4201fdb11766ebc6bd918523130sethg free(dep);
724365f7556fc4201fdb11766ebc6bd918523130sethg if (linkpath)
724365f7556fc4201fdb11766ebc6bd918523130sethg free(linkpath);
724365f7556fc4201fdb11766ebc6bd918523130sethg if (buf)
724365f7556fc4201fdb11766ebc6bd918523130sethg free(buf);
724365f7556fc4201fdb11766ebc6bd918523130sethg if (real_path)
724365f7556fc4201fdb11766ebc6bd918523130sethg free(real_path);
724365f7556fc4201fdb11766ebc6bd918523130sethg if (*logpp) {
724365f7556fc4201fdb11766ebc6bd918523130sethg free(*logpp);
724365f7556fc4201fdb11766ebc6bd918523130sethg *logpp = NULL;
724365f7556fc4201fdb11766ebc6bd918523130sethg }
724365f7556fc4201fdb11766ebc6bd918523130sethg return (rv);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf}
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Given the index into a table (msgcvt_t) of messages, get the message
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * string, converting it to the proper locale if necessary.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * NOTE: Indexes are defined in cfga_sata.h
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstatic const char *
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfget_msg(uint_t msg_index, msgcvt_t *msg_tbl, uint_t tbl_size)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf{
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (msg_index >= tbl_size) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf msg_index = CFGA_SATA_UNKNOWN;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return ((msg_tbl[msg_index].intl) ?
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang dgettext(TEXT_DOMAIN, msg_tbl[msg_index].msgstr) :
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang msg_tbl[msg_index].msgstr);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf}
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Allocates and creates a message string (in *ret_str),
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * by concatenating all the (char *) args together, in order.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Last arg MUST be NULL.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstatic void
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfset_msg(char **ret_str, ...)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf{
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf char *str;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf size_t total_len;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf va_list valist;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf va_start(valist, ret_str);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf total_len = (*ret_str == NULL) ? 0 : strlen(*ret_str);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf while ((str = va_arg(valist, char *)) != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf size_t len = strlen(str);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf char *old_str = *ret_str;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *ret_str = (char *)realloc(*ret_str, total_len + len + 1);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (*ret_str == NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* We're screwed */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf free(old_str);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf va_end(valist);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) strcpy(*ret_str + total_len, str);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf total_len += len;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf va_end(valist);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf}
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Error message handling.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * For the rv passed in, looks up the corresponding error message string(s),
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * internationalized if necessary, and concatenates it into a new
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * memory buffer, and points *errstring to it.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Note not all rvs will result in an error message return, as not all
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * error conditions warrant a SATA-specific error message - for those
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * conditions the cfgadm generic messages are sufficient.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Some messages may display ap_id or errno, which is why they are passed
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * in.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfcfga_err_t
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfsata_err_msg(
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang char **errstring,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang cfga_sata_ret_t rv,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang const char *ap_id,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang int l_errno)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf{
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (errstring == NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (sata_msgs[rv].cfga_err);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Generate the appropriate SATA-specific error message(s) (if any).
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf switch (rv) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_OK:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_NACK:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* Special case - do nothing. */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_UNKNOWN:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_DYNAMIC_AP:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_INTERNAL_ERROR:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_OPTIONS:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_ALLOC_FAIL:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_STATE:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_PRIV:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_OPNOTSUPP:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_DATA_ERROR:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* These messages require no additional strings passed. */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf set_msg(errstring, ERR_STR(rv), NULL);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_HWOPNOTSUPP:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* hardware-specific help needed */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf set_msg(errstring, ERR_STR(rv), NULL);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf set_msg(errstring, "\n",
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang dgettext(TEXT_DOMAIN, sata_help[HELP_HEADER]), NULL);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf set_msg(errstring, sata_help[HELP_RESET_PORT], NULL);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf set_msg(errstring, sata_help[HELP_RESET_DEVICE], NULL);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf set_msg(errstring, sata_help[HELP_RESET_ALL], NULL);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf set_msg(errstring, sata_help[HELP_PORT_ACTIVATE], NULL);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf set_msg(errstring, sata_help[HELP_PORT_DEACTIVATE], NULL);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf set_msg(errstring, sata_help[HELP_PORT_SELF_TEST], NULL);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf set_msg(errstring, sata_help[HELP_CNTRL_SELF_TEST], NULL);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_AP:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_PORT:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_NOT_CONNECTED:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_NOT_CONFIGURED:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_ALREADY_CONNECTED:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_ALREADY_CONFIGURED:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_BUSY:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_DEVLINK:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_RCM_HANDLE:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_RCM_ONLINE:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_RCM_OFFLINE:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_RCM_INFO:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_DEV_CONFIGURE:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_DEV_UNCONFIGURE:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_DISCONNECTED:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* These messages also print ap_id. */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf set_msg(errstring, ERR_STR(rv), "ap_id: ", ap_id, "", NULL);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_IOCTL:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_NVLIST:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* These messages also print errno. */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf char *errno_str = l_errno ? strerror(l_errno) : "";
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf set_msg(errstring, ERR_STR(rv), errno_str,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf l_errno ? "\n" : "", NULL);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_SATA_OPEN:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* These messages also apid and errno. */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf char *errno_str = l_errno ? strerror(l_errno) : "";
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf set_msg(errstring, ERR_STR(rv), "ap_id: ", ap_id, "\n",
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf errno_str, l_errno ? "\n" : "", NULL);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf default:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf set_msg(errstring, ERR_STR(CFGA_SATA_INTERNAL_ERROR), NULL);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf } /* end switch */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Determine the proper error code to send back to the cfgadm library.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (sata_msgs[rv].cfga_err);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf}
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Entry points
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/* cfgadm entry point */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*ARGSUSED*/
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfcfga_err_t
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfcfga_change_state(
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang cfga_cmd_t state_change_cmd,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang const char *ap_id,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang const char *options,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang struct cfga_confirm *confp,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang struct cfga_msg *msgp,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang char **errstring,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang cfga_flags_t flags)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf{
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf int ret;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf int len;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf char *msg;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf char *devpath;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf nvlist_t *nvl = NULL;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf ap_rstate_t rstate;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf ap_ostate_t ostate;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf devctl_hdl_t hdl = NULL;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cfga_sata_ret_t rv = CFGA_SATA_OK;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf char *pdyn;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang char *str_type;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang size_t size;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang boolean_t pmult = B_FALSE;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * All sub-commands which can change state of device require
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * root privileges.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (geteuid() != 0) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_PRIV;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((rv = verify_params(ap_id, options, errstring)) != CFGA_SATA_OK) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) cfga_help(msgp, options, flags);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((rv = setup_for_devctl_cmd(ap_id, &hdl, &nvl,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang DC_RDONLY)) != CFGA_SATA_OK) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang /*
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang * Checking device type. A port multiplier is not configurable - it is
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang * already configured as soon as it is connected.
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang */
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang if ((rv = do_control_ioctl(ap_id, SATA_CFGA_GET_AP_TYPE, NULL,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang (void **)&str_type, &size)) != CFGA_SATA_OK) {
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang /* no such deivce */
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang goto bailout;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang }
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang if (strncmp(str_type, "sata-pmult", sizeof ("sata-pmult")) == 0) {
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang pmult = B_TRUE;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang }
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf switch (state_change_cmd) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_CMD_CONFIGURE:
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang if (pmult == B_TRUE) {
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang rv = CFGA_SATA_HWOPNOTSUPP;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang goto bailout;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang }
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((rv = port_state(hdl, nvl, &rstate, &ostate)) !=
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf CFGA_SATA_OK)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (ostate == AP_OSTATE_CONFIGURED) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_ALREADY_CONFIGURED;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* Disallow dynamic AP name component */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (GET_DYN(ap_id) != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_INVALID_DEVNAME;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (rstate == AP_RSTATE_EMPTY) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_NOT_CONNECTED;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_OK;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (devctl_ap_configure(hdl, nvl) != 0) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_DEV_CONFIGURE;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf devpath = sata_get_devicepath(ap_id);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (devpath == NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf int i;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Try for some time as SATA hotplug thread
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * takes a while to create the path then
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * eventually give up.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf for (i = 0; i < 12 && (devpath == NULL); i++) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) sleep(6);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf devpath = sata_get_devicepath(ap_id);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (devpath == NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_DEV_CONFIGURE;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf S_FREE(devpath);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_CMD_UNCONFIGURE:
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang if (pmult == B_TRUE) {
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang rv = CFGA_SATA_HWOPNOTSUPP;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang goto bailout;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang }
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((rv = port_state(hdl, nvl, &rstate, &ostate)) !=
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf CFGA_SATA_OK)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (rstate != AP_RSTATE_CONNECTED) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_NOT_CONNECTED;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (ostate != AP_OSTATE_CONFIGURED) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_NOT_CONFIGURED;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* Strip off AP name dynamic component, if present */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((pdyn = GET_DYN(ap_id)) != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *pdyn = '\0';
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_OK;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf len = strlen(SATA_CONFIRM_DEVICE) +
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang strlen(SATA_CONFIRM_DEVICE_SUSPEND) +
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang strlen("Unconfigure") + strlen(ap_id);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((msg = (char *)calloc(len +3, 1)) != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) snprintf(msg, len + 3, "Unconfigure"
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang " %s%s\n%s",
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang SATA_CONFIRM_DEVICE, ap_id,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang SATA_CONFIRM_DEVICE_SUSPEND);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (!sata_confirm(confp, msg)) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf free(msg);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_NACK;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf free(msg);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf devpath = sata_get_devicepath(ap_id);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (devpath == NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) printf(
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang "cfga_change_state: get device path failed\n");
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_DEV_UNCONFIGURE;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((rv = sata_rcm_offline(ap_id, errstring, devpath, flags))
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf != CFGA_SATA_OK) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf ret = devctl_ap_unconfigure(hdl, nvl);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (ret != 0) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_DEV_UNCONFIGURE;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (errno == EBUSY) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_BUSY;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) sata_rcm_online(ap_id, errstring, devpath,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang flags);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf } else {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) sata_rcm_remove(ap_id, errstring, devpath,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang flags);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf S_FREE(devpath);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_CMD_DISCONNECT:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((rv = port_state(hdl, nvl, &rstate, &ostate)) !=
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf CFGA_SATA_OK)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (rstate == AP_RSTATE_DISCONNECTED) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_DISCONNECTED;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* Strip off AP name dynamic component, if present */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((pdyn = GET_DYN(ap_id)) != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *pdyn = '\0';
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_OK; /* other statuses don't matter */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * If the port originally with device attached and was
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * unconfigured already, the devicepath for the sd will be
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * removed. sata_get_devicepath in this case is not necessary.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* only call rcm_offline if the state was CONFIGURED */
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang if (ostate == AP_OSTATE_CONFIGURED &&
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang pmult == B_FALSE) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf devpath = sata_get_devicepath(ap_id);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (devpath == NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) printf(
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf "cfga_change_state: get path failed\n");
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_DEV_UNCONFIGURE;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf len = strlen(SATA_CONFIRM_DEVICE) +
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang strlen(SATA_CONFIRM_DEVICE_SUSPEND) +
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang strlen("Disconnect") + strlen(ap_id);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((msg = (char *)calloc(len +3, 1)) != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) snprintf(msg, len + 3,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang "Disconnect"
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang " %s%s\n%s",
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang SATA_CONFIRM_DEVICE, ap_id,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang SATA_CONFIRM_DEVICE_SUSPEND);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (!sata_confirm(confp, msg)) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf free(msg);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_NACK;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf free(msg);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((rv = sata_rcm_offline(ap_id, errstring,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf devpath, flags)) != CFGA_SATA_OK) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf ret = devctl_ap_unconfigure(hdl, nvl);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (ret != 0) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) printf(
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf "devctl_ap_unconfigure failed\n");
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_DEV_UNCONFIGURE;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (errno == EBUSY)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_BUSY;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) sata_rcm_online(ap_id, errstring,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang devpath, flags);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf S_FREE(devpath);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * The current policy is that if unconfigure
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * failed, do not continue with disconnect.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * If the port needs to be forced into the
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * disconnect (shutdown) state,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * the -x sata_port_poweroff command should be
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * used instead of -c disconnect
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf } else {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) printf("%s\n",
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf ERR_STR(CFGA_SATA_DEVICE_UNCONFIGURED));
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) sata_rcm_remove(ap_id, errstring,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang devpath, flags);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf S_FREE(devpath);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf } else if (rstate == AP_RSTATE_CONNECTED ||
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rstate == AP_RSTATE_EMPTY) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf len = strlen(SATA_CONFIRM_PORT) +
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang strlen(SATA_CONFIRM_PORT_DISABLE) +
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang strlen("Deactivate Port") + strlen(ap_id);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((msg = (char *)calloc(len +3, 1)) != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) snprintf(msg, len +3,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang "Disconnect"
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang " %s%s\n%s",
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang SATA_CONFIRM_PORT, ap_id,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang SATA_CONFIRM_PORT_DISABLE);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (!sata_confirm(confp, msg)) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf free(msg);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_NACK;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf ret = devctl_ap_disconnect(hdl, nvl);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (ret != 0) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_IOCTL;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (errno == EBUSY) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_BUSY;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_CMD_CONNECT:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((rv = port_state(hdl, nvl, &rstate, &ostate)) !=
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf CFGA_SATA_OK)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (rstate == AP_RSTATE_CONNECTED) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_ALREADY_CONNECTED;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf len = strlen(SATA_CONFIRM_PORT) +
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang strlen(SATA_CONFIRM_PORT_ENABLE) +
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang strlen("Activate Port") + strlen(ap_id);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((msg = (char *)calloc(len +3, 1)) != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) snprintf(msg, len +3, "Activate"
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang " %s%s\n%s",
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang SATA_CONFIRM_PORT, ap_id,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang SATA_CONFIRM_PORT_ENABLE);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (!sata_confirm(confp, msg)) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_NACK;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* Disallow dynamic AP name component */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (GET_DYN(ap_id) != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_INVALID_DEVNAME;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf ret = devctl_ap_connect(hdl, nvl);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (ret != 0) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_IOCTL;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf } else {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_OK;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_CMD_LOAD:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_CMD_UNLOAD:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) cfga_help(msgp, options, flags);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_OPNOTSUPP;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf case CFGA_CMD_NONE:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf default:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) cfga_help(msgp, options, flags);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_INTERNAL_ERROR;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfbailout:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cleanup_after_devctl_cmd(hdl, nvl);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (sata_err_msg(errstring, rv, ap_id, errno));
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf}
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/* cfgadm entry point */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfcfga_err_t
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfcfga_private_func(
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang const char *func,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang const char *ap_id,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang const char *options,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang struct cfga_confirm *confp,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang struct cfga_msg *msgp,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang char **errstring,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang cfga_flags_t flags)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf{
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf int len;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf char *msg;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf nvlist_t *list = NULL;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf ap_ostate_t ostate;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf ap_rstate_t rstate;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf devctl_hdl_t hdl = NULL;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cfga_sata_ret_t rv;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf char *str_p;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf size_t size;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((rv = verify_params(ap_id, NULL, errstring)) != CFGA_SATA_OK) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) cfga_help(msgp, options, flags);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (sata_err_msg(errstring, rv, ap_id, errno));
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * All subcommands which can change state of device require
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * root privileges.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (geteuid() != 0) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_PRIV;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (func == NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) printf("No valid option specified\n");
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_OPTIONS;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((rv = setup_for_devctl_cmd(ap_id, &hdl, &list, 0)) !=
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf CFGA_SATA_OK) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* We do not care here about dynamic AP name component */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((str_p = GET_DYN(ap_id)) != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *str_p = '\0';
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_OK;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (strcmp(func, SATA_RESET_PORT) == 0) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf len = strlen(SATA_CONFIRM_PORT) +
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf strlen(SATA_CONFIRM_DEVICE_ABORT) +
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf strlen("Reset Port") + strlen(ap_id);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((msg = (char *)calloc(len +3, 1)) != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) snprintf(msg, len +3, "Reset"
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang " %s%s\n%s",
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang SATA_CONFIRM_PORT, ap_id,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang SATA_CONFIRM_DEVICE_ABORT);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf } else {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_NACK;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (!sata_confirm(confp, msg)) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_NACK;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = do_control_ioctl(ap_id, SATA_CFGA_RESET_PORT, NULL,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang (void **)&str_p, &size);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf } else if (strcmp(func, SATA_RESET_DEVICE) == 0) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((rv = port_state(hdl, list, &rstate, &ostate)) !=
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf CFGA_SATA_OK)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Reset device function requires device to be connected
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (rstate != AP_RSTATE_CONNECTED) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_NOT_CONNECTED;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf len = strlen(SATA_CONFIRM_DEVICE) +
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf strlen(SATA_CONFIRM_DEVICE_ABORT) +
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf strlen("Reset Device") + strlen(ap_id);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((msg = (char *)calloc(len +3, 1)) != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) snprintf(msg, len +3, "Reset"
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang " %s%s\n%s",
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang SATA_CONFIRM_DEVICE, ap_id,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang SATA_CONFIRM_DEVICE_ABORT);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf } else {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_NACK;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (!sata_confirm(confp, msg)) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_NACK;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = do_control_ioctl(ap_id, SATA_CFGA_RESET_DEVICE, NULL,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void **)&str_p, &size);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf } else if (strcmp(func, SATA_RESET_ALL) == 0) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf len = strlen(SATA_CONFIRM_CONTROLLER) +
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf strlen(SATA_CONFIRM_CONTROLLER_ABORT) +
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf strlen("Reset All") + strlen(ap_id);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((msg = (char *)calloc(len +3, 1)) != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) snprintf(msg, len +3, "Reset"
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang " %s%s\n%s",
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang SATA_CONFIRM_CONTROLLER, ap_id,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang SATA_CONFIRM_CONTROLLER_ABORT);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf } else {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_NACK;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (!sata_confirm(confp, msg)) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_NACK;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = do_control_ioctl(ap_id, SATA_CFGA_RESET_ALL, NULL,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang (void **)&str_p, &size);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf } else if (strcmp(func, SATA_PORT_DEACTIVATE) == 0) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf len = strlen(SATA_CONFIRM_PORT) +
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf strlen(SATA_CONFIRM_PORT_DISABLE) +
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf strlen("Deactivate Port") + strlen(ap_id);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((msg = (char *)calloc(len +3, 1)) != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) snprintf(msg, len +3, "Deactivate"
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang " %s%s\n%s",
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang SATA_CONFIRM_PORT, ap_id,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang SATA_CONFIRM_PORT_DISABLE);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf } else {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_NACK;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (!sata_confirm(confp, msg)) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_NACK;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = do_control_ioctl(ap_id, SATA_CFGA_PORT_DEACTIVATE, NULL,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang (void **)&str_p, &size);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf } else if (strcmp(func, SATA_PORT_ACTIVATE) == 0) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf len = strlen(SATA_CONFIRM_PORT) +
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf strlen(SATA_CONFIRM_PORT_ENABLE) +
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf strlen("Activate Port") + strlen(ap_id);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((msg = (char *)calloc(len +3, 1)) != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) snprintf(msg, len +3, "Activate"
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang " %s%s\n%s",
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang SATA_CONFIRM_PORT, ap_id,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang SATA_CONFIRM_PORT_ENABLE);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf } else {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_NACK;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (!sata_confirm(confp, msg)) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_NACK;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = do_control_ioctl(ap_id, SATA_CFGA_PORT_ACTIVATE,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf NULL, (void **)&str_p, &size);
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf } else if (strcmp(func, SATA_PORT_SELF_TEST) == 0) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf len = strlen(SATA_CONFIRM_PORT) +
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf strlen(SATA_CONFIRM_DEVICE_SUSPEND) +
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf strlen("Self Test Port") + strlen(ap_id);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((msg = (char *)calloc(len +3, 1)) != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) snprintf(msg, len +3, "Self Test"
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang " %s%s\n%s",
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang SATA_CONFIRM_PORT, ap_id,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang SATA_CONFIRM_DEVICE_SUSPEND);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf } else {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_NACK;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (!sata_confirm(confp, msg)) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_NACK;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = do_control_ioctl(ap_id, SATA_CFGA_PORT_SELF_TEST,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang NULL, (void **)&str_p, &size);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf } else {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* Unrecognized operation request */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_HWOPNOTSUPP;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfbailout:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cleanup_after_devctl_cmd(hdl, list);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (sata_err_msg(errstring, rv, ap_id, errno));
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf}
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/* cfgadm entry point */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*ARGSUSED*/
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfcfga_err_t
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfcfga_test(
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang const char *ap_id,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang const char *options,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang struct cfga_msg *msgp,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang char **errstring,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang cfga_flags_t flags)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf{
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* Should call ioctl for self test - phase 2 */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (CFGA_OPNOTSUPP);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf}
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfint
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfsata_check_target_node(di_node_t node, void *arg)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf{
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf char *minorpath;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf char *cp;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf minorpath = di_devfs_minor_path(di_minor_next(node, DI_MINOR_NIL));
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (minorpath != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (strstr(minorpath, arg) != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cp = strrchr(minorpath, (int)*MINOR_SEP);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (cp != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) strcpy(arg, cp);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf free(minorpath);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (DI_WALK_TERMINATE);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf free(minorpath);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (DI_WALK_CONTINUE);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf}
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikramstruct chk_dev {
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram int c_isblk;
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram char *c_minor;
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram};
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram/*ARGSUSED*/
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikramstatic int
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikramchk_dev_fcn(di_node_t node, di_minor_t minor, void *arg)
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram{
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram char *mn;
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram struct chk_dev *chkp = (struct chk_dev *)arg;
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram mn = di_minor_name(minor);
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram if (mn == NULL)
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram return (DI_WALK_CONTINUE);
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram if (strcmp(mn, chkp->c_minor) != 0)
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram return (DI_WALK_CONTINUE);
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram chkp->c_isblk = di_minor_spectype(minor) == S_IFBLK ? 1 : 0;
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram return (DI_WALK_TERMINATE);
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram}
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram/*
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram * Don't use devfs if stat() in /devices fails. Use libdevinfo instead.
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram * Retired devices don't show up in devfs.
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram *
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram * Returns:
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram * 1 - minor exists and is of type BLK
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram * 0 - minor does not exist or is not of type BLK.
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram */
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikramstatic int
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikramis_devinfo_blk(char *minor_path)
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram{
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram char *minor_portion;
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram struct chk_dev chk_dev;
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram di_node_t node;
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram int rv;
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram /*
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram * prune minor path for di_init() - no /devices prefix and no minor name
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram */
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram if (strncmp(minor_path, "/devices/", strlen("/devices/")) != 0)
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram return (0);
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram minor_portion = strrchr(minor_path, *MINOR_SEP);
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram if (minor_portion == NULL)
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram return (0);
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram *minor_portion = 0;
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram node = di_init(minor_path + strlen("/devices"), DINFOMINOR);
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram *minor_portion = *MINOR_SEP;
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram if (node == DI_NODE_NIL)
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram return (0);
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram chk_dev.c_isblk = 0;
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram chk_dev.c_minor = minor_portion + 1;
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram rv = di_walk_minor(node, NULL, 0, &chk_dev, chk_dev_fcn);
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram di_fini(node);
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram if (rv == 0 && chk_dev.c_isblk)
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram return (1);
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram else
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram return (0);
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram}
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * The dynamic component buffer returned by this function has to be freed!
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfint
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing Chinasata_make_dyncomp(const char *ap_id, char **dyncomp, const char *type)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf{
724365f7556fc4201fdb11766ebc6bd918523130sethg char *devpath = NULL;
724365f7556fc4201fdb11766ebc6bd918523130sethg char *cp = NULL;
724365f7556fc4201fdb11766ebc6bd918523130sethg int l_errno;
724365f7556fc4201fdb11766ebc6bd918523130sethg char minor_path[MAXPATHLEN];
724365f7556fc4201fdb11766ebc6bd918523130sethg char name_part[MAXNAMELEN];
724365f7556fc4201fdb11766ebc6bd918523130sethg char *devlink = NULL;
724365f7556fc4201fdb11766ebc6bd918523130sethg char *minor_portion = NULL;
724365f7556fc4201fdb11766ebc6bd918523130sethg int deplen;
724365f7556fc4201fdb11766ebc6bd918523130sethg int err;
724365f7556fc4201fdb11766ebc6bd918523130sethg DIR *dp = NULL;
724365f7556fc4201fdb11766ebc6bd918523130sethg struct stat sb;
724365f7556fc4201fdb11766ebc6bd918523130sethg struct dirent *dep = NULL;
724365f7556fc4201fdb11766ebc6bd918523130sethg struct dirent *newdep = NULL;
545e5dad7996785cfebf226c5ef410c1b154740fsethg char *p;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf assert(dyncomp != NULL);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Get target node path
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf devpath = sata_get_devicepath(ap_id);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (devpath == NULL) {
724365f7556fc4201fdb11766ebc6bd918523130sethg
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) printf("cfga_list_ext: cannot locate target device\n");
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (CFGA_SATA_DYNAMIC_AP);
724365f7556fc4201fdb11766ebc6bd918523130sethg
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf } else {
724365f7556fc4201fdb11766ebc6bd918523130sethg
724365f7556fc4201fdb11766ebc6bd918523130sethg cp = strrchr(devpath, *PATH_SEP);
724365f7556fc4201fdb11766ebc6bd918523130sethg assert(cp != NULL);
724365f7556fc4201fdb11766ebc6bd918523130sethg *cp = 0; /* terminate path for opendir() */
724365f7556fc4201fdb11766ebc6bd918523130sethg
724365f7556fc4201fdb11766ebc6bd918523130sethg (void) strncpy(name_part, cp + 1, MAXNAMELEN);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
724365f7556fc4201fdb11766ebc6bd918523130sethg * Using libdevinfo for this is overkill and kills
724365f7556fc4201fdb11766ebc6bd918523130sethg * performance when many consumers are using libcfgadm
724365f7556fc4201fdb11766ebc6bd918523130sethg * concurrently.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
724365f7556fc4201fdb11766ebc6bd918523130sethg if ((dp = opendir(devpath)) == NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
724365f7556fc4201fdb11766ebc6bd918523130sethg /*
724365f7556fc4201fdb11766ebc6bd918523130sethg * deplen is large enough to fit the largest path-
724365f7556fc4201fdb11766ebc6bd918523130sethg * struct dirent includes one byte (the terminator)
724365f7556fc4201fdb11766ebc6bd918523130sethg * so we don't add 1 to the calculation here.
724365f7556fc4201fdb11766ebc6bd918523130sethg */
d3080269c400bce011f72255205cee37b5b04079sethg deplen = pathconf(devpath, _PC_NAME_MAX);
d3080269c400bce011f72255205cee37b5b04079sethg deplen = ((deplen <= 0) ? MAXNAMELEN : deplen) +
724365f7556fc4201fdb11766ebc6bd918523130sethg sizeof (struct dirent);
724365f7556fc4201fdb11766ebc6bd918523130sethg dep = (struct dirent *)malloc(deplen);
724365f7556fc4201fdb11766ebc6bd918523130sethg if (dep == NULL)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
724365f7556fc4201fdb11766ebc6bd918523130sethg
724365f7556fc4201fdb11766ebc6bd918523130sethg while ((err = readdir_r(dp, dep, &newdep)) == 0 &&
724365f7556fc4201fdb11766ebc6bd918523130sethg newdep != NULL) {
724365f7556fc4201fdb11766ebc6bd918523130sethg
724365f7556fc4201fdb11766ebc6bd918523130sethg assert(newdep == dep);
724365f7556fc4201fdb11766ebc6bd918523130sethg
724365f7556fc4201fdb11766ebc6bd918523130sethg if (strcmp(dep->d_name, ".") == 0 ||
724365f7556fc4201fdb11766ebc6bd918523130sethg strcmp(dep->d_name, "..") == 0 ||
724365f7556fc4201fdb11766ebc6bd918523130sethg (minor_portion = strchr(dep->d_name,
724365f7556fc4201fdb11766ebc6bd918523130sethg *MINOR_SEP)) == NULL)
724365f7556fc4201fdb11766ebc6bd918523130sethg continue;
724365f7556fc4201fdb11766ebc6bd918523130sethg
724365f7556fc4201fdb11766ebc6bd918523130sethg *minor_portion = 0;
724365f7556fc4201fdb11766ebc6bd918523130sethg if (strcmp(dep->d_name, name_part) != 0)
724365f7556fc4201fdb11766ebc6bd918523130sethg continue;
724365f7556fc4201fdb11766ebc6bd918523130sethg *minor_portion = *MINOR_SEP;
724365f7556fc4201fdb11766ebc6bd918523130sethg
724365f7556fc4201fdb11766ebc6bd918523130sethg (void) snprintf(minor_path, MAXPATHLEN,
724365f7556fc4201fdb11766ebc6bd918523130sethg "%s/%s", devpath, dep->d_name);
724365f7556fc4201fdb11766ebc6bd918523130sethg
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China /*
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China * Break directly for tape device
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China */
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China if (strcmp(type, "tape") == 0)
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China break;
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram /*
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram * If stat() fails, the device *may* be retired.
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram * Check via libdevinfo if the device has a BLK minor.
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram * We don't use libdevinfo all the time, since taking
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram * a snapshot is slower than a stat().
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram */
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram if (stat(minor_path, &sb) < 0) {
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram if (is_devinfo_blk(minor_path)) {
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram break;
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram } else {
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram continue;
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram }
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram }
724365f7556fc4201fdb11766ebc6bd918523130sethg
724365f7556fc4201fdb11766ebc6bd918523130sethg if (S_ISBLK(sb.st_mode))
724365f7556fc4201fdb11766ebc6bd918523130sethg break;
d7b0e458c7037dd10fe3ea153208b18f5b11c8cavikram
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
724365f7556fc4201fdb11766ebc6bd918523130sethg (void) closedir(dp);
724365f7556fc4201fdb11766ebc6bd918523130sethg free(dep);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf free(devpath);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
724365f7556fc4201fdb11766ebc6bd918523130sethg dp = NULL;
724365f7556fc4201fdb11766ebc6bd918523130sethg dep = NULL;
724365f7556fc4201fdb11766ebc6bd918523130sethg devpath = NULL;
724365f7556fc4201fdb11766ebc6bd918523130sethg
724365f7556fc4201fdb11766ebc6bd918523130sethg /*
724365f7556fc4201fdb11766ebc6bd918523130sethg * If there was an error, or we didn't exit the loop
724365f7556fc4201fdb11766ebc6bd918523130sethg * by finding a block or character device, bail out.
724365f7556fc4201fdb11766ebc6bd918523130sethg */
724365f7556fc4201fdb11766ebc6bd918523130sethg if (err != 0 || newdep == NULL)
724365f7556fc4201fdb11766ebc6bd918523130sethg goto bailout;
724365f7556fc4201fdb11766ebc6bd918523130sethg
724365f7556fc4201fdb11766ebc6bd918523130sethg /*
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China * Look for links to the physical path in /dev/dsk
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China * and /dev/rmt. So far, sata modue supports disk,
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China * dvd and tape devices, so we will first look for
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China * BLOCK devices, and then look for tape devices.
724365f7556fc4201fdb11766ebc6bd918523130sethg */
724365f7556fc4201fdb11766ebc6bd918523130sethg (void) physpath_to_devlink("/dev/dsk",
724365f7556fc4201fdb11766ebc6bd918523130sethg minor_path, &devlink, &l_errno);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* postprocess and copy logical name here */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (devlink != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
545e5dad7996785cfebf226c5ef410c1b154740fsethg * For disks, remove partition/slice info
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
724365f7556fc4201fdb11766ebc6bd918523130sethg if ((cp = strstr(devlink, "dsk/")) != NULL) {
545e5dad7996785cfebf226c5ef410c1b154740fsethg /* cXtYdZ[(s[0..15])|(p[0..X])] */
545e5dad7996785cfebf226c5ef410c1b154740fsethg if ((p = strchr(cp + 4, 'd')) != NULL) {
545e5dad7996785cfebf226c5ef410c1b154740fsethg p++; /* Skip the 'd' */
545e5dad7996785cfebf226c5ef410c1b154740fsethg while (*p != 0 && isdigit(*p))
545e5dad7996785cfebf226c5ef410c1b154740fsethg p++;
545e5dad7996785cfebf226c5ef410c1b154740fsethg *p = 0;
545e5dad7996785cfebf226c5ef410c1b154740fsethg }
724365f7556fc4201fdb11766ebc6bd918523130sethg *dyncomp = strdup(cp);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
724365f7556fc4201fdb11766ebc6bd918523130sethg
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf free(devlink);
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China } else if (strcmp(type, "tape") == 0) {
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China /*
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China * For tape device, logical name looks like
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China * rmt/X
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China */
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China (void) physpath_to_devlink("/dev/rmt",
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China minor_path, &devlink, &l_errno);
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China if (devlink != NULL) {
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China if ((cp = strstr(devlink, "rmt/")) != NULL) {
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China *dyncomp = strdup(cp);
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China }
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China free(devlink);
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
724365f7556fc4201fdb11766ebc6bd918523130sethg
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (SATA_CFGA_OK);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
724365f7556fc4201fdb11766ebc6bd918523130sethg
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfbailout:
724365f7556fc4201fdb11766ebc6bd918523130sethg if (dp)
724365f7556fc4201fdb11766ebc6bd918523130sethg (void) closedir(dp);
724365f7556fc4201fdb11766ebc6bd918523130sethg if (devpath)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf free(devpath);
724365f7556fc4201fdb11766ebc6bd918523130sethg if (dep)
724365f7556fc4201fdb11766ebc6bd918523130sethg free(dep);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (CFGA_SATA_DYNAMIC_AP);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf}
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/* cfgadm entry point */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*ARGSUSED*/
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfcfga_err_t
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfcfga_list_ext(
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang const char *ap_id,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang cfga_list_data_t **ap_id_list,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang int *nlistp,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang const char *options,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang const char *listopts,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang char **errstring,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang cfga_flags_t flags)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf{
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf int l_errno;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf char *ap_id_log = NULL;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf size_t size;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf nvlist_t *user_nvlist = NULL;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf devctl_hdl_t devctl_hdl = NULL;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cfga_sata_ret_t rv = CFGA_SATA_OK;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf devctl_ap_state_t devctl_ap_state;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf char *pdyn;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang boolean_t pmult = B_FALSE;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang uint32_t port;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((rv = verify_params(ap_id, options, errstring)) != CFGA_SATA_OK) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) cfga_help(NULL, options, flags);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* We do not care here about dynamic AP name component */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((pdyn = GET_DYN(ap_id)) != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *pdyn = '\0';
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (ap_id_list == NULL || nlistp == NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_DATA_ERROR;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) cfga_help(NULL, options, flags);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* Get ap status */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((rv = setup_for_devctl_cmd(ap_id, &devctl_hdl, &user_nvlist,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf DC_RDONLY)) != CFGA_SATA_OK) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* will call dc_cmd to send IOCTL to kernel */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (devctl_ap_getstate(devctl_hdl, user_nvlist,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf &devctl_ap_state) == -1) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cleanup_after_devctl_cmd(devctl_hdl, user_nvlist);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_IOCTL;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cleanup_after_devctl_cmd(devctl_hdl, user_nvlist);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Create cfga_list_data_t struct.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((*ap_id_list =
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (cfga_list_data_t *)malloc(sizeof (**ap_id_list))) == NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_ALLOC_FAIL;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *nlistp = 1;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Rest of the code fills in the cfga_list_data_t struct.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* Get /dev/cfg path to corresponding to the physical ap_id */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* Remember ap_id_log must be freed */
724365f7556fc4201fdb11766ebc6bd918523130sethg rv = physpath_to_devlink(CFGA_DEV_DIR, (char *)ap_id,
724365f7556fc4201fdb11766ebc6bd918523130sethg &ap_id_log, &l_errno);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (rv != 0) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_DEVLINK;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* Get logical ap_id corresponding to the physical */
20e7b521b938d6074a4b93c9c2f69c6281a26e3asethg if (ap_id_log == NULL || strstr(ap_id_log, CFGA_DEV_DIR) == NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_DEVLINK;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) strlcpy((*ap_id_list)->ap_log_id,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* Strip off /dev/cfg/ */ ap_id_log + strlen(CFGA_DEV_DIR)+ 1,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sizeof ((*ap_id_list)->ap_log_id));
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf free(ap_id_log);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf ap_id_log = NULL;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) strlcpy((*ap_id_list)->ap_phys_id, ap_id,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sizeof ((*ap_id_list)->ap_phys_id));
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf switch (devctl_ap_state.ap_rstate) {
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang case AP_RSTATE_EMPTY:
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang (*ap_id_list)->ap_r_state = CFGA_STAT_EMPTY;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang case AP_RSTATE_DISCONNECTED:
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang (*ap_id_list)->ap_r_state = CFGA_STAT_DISCONNECTED;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang case AP_RSTATE_CONNECTED:
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang (*ap_id_list)->ap_r_state = CFGA_STAT_CONNECTED;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang default:
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang rv = CFGA_SATA_STATE;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf switch (devctl_ap_state.ap_ostate) {
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang case AP_OSTATE_CONFIGURED:
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang (*ap_id_list)->ap_o_state = CFGA_STAT_CONFIGURED;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang case AP_OSTATE_UNCONFIGURED:
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang (*ap_id_list)->ap_o_state = CFGA_STAT_UNCONFIGURED;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang default:
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang rv = CFGA_SATA_STATE;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf switch (devctl_ap_state.ap_condition) {
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang case AP_COND_OK:
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang (*ap_id_list)->ap_cond = CFGA_COND_OK;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang case AP_COND_FAILING:
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang (*ap_id_list)->ap_cond = CFGA_COND_FAILING;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang case AP_COND_FAILED:
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang (*ap_id_list)->ap_cond = CFGA_COND_FAILED;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang case AP_COND_UNUSABLE:
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang (*ap_id_list)->ap_cond = CFGA_COND_UNUSABLE;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang case AP_COND_UNKNOWN:
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang (*ap_id_list)->ap_cond = CFGA_COND_UNKNOWN;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang default:
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang rv = CFGA_SATA_STATE;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (*ap_id_list)->ap_class[0] = '\0'; /* Filled by libcfgadm */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (*ap_id_list)->ap_busy = devctl_ap_state.ap_in_transition;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (*ap_id_list)->ap_status_time = devctl_ap_state.ap_last_change;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (*ap_id_list)->ap_info[0] = NULL;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((*ap_id_list)->ap_r_state == CFGA_STAT_CONNECTED) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf char *str_p;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf int skip, i;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Fill in the 'Information' field for the -v option
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Model (MOD:)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((rv = do_control_ioctl(ap_id, SATA_CFGA_GET_MODEL_INFO,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf NULL, (void **)&str_p, &size)) != CFGA_SATA_OK) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) printf(
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang "SATA_CFGA_GET_MODULE_INFO ioctl failed\n");
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* drop leading and trailing spaces */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf skip = strspn(str_p, " ");
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf for (i = size - 1; i >= 0; i--) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (str_p[i] == '\040')
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf str_p[i] = '\0';
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf else if (str_p[i] != '\0')
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) strlcpy((*ap_id_list)->ap_info, "Mod: ",
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang sizeof ((*ap_id_list)->ap_info));
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) strlcat((*ap_id_list)->ap_info, str_p + skip,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang sizeof ((*ap_id_list)->ap_info));
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf free(str_p);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Fill in the 'Information' field for the -v option
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Firmware revision (FREV:)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((rv = do_control_ioctl(ap_id,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf SATA_CFGA_GET_REVFIRMWARE_INFO,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf NULL, (void **)&str_p, &size)) != CFGA_SATA_OK) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) printf(
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf "SATA_CFGA_GET_REVFIRMWARE_INFO ioctl failed\n");
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* drop leading and trailing spaces */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf skip = strspn(str_p, " ");
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf for (i = size - 1; i >= 0; i--) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (str_p[i] == '\040')
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf str_p[i] = '\0';
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf else if (str_p[i] != '\0')
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) strlcat((*ap_id_list)->ap_info, " FRev: ",
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang sizeof ((*ap_id_list)->ap_info));
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) strlcat((*ap_id_list)->ap_info, str_p + skip,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang sizeof ((*ap_id_list)->ap_info));
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf free(str_p);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Fill in the 'Information' field for the -v option
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Serial Number (SN:)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((rv = do_control_ioctl(ap_id,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf SATA_CFGA_GET_SERIALNUMBER_INFO,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf NULL, (void **)&str_p, &size)) != CFGA_SATA_OK) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) printf(
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf "SATA_CFGA_GET_SERIALNUMBER_INFO ioctl failed\n");
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* drop leading and trailing spaces */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf skip = strspn(str_p, " ");
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf for (i = size - 1; i >= 0; i--) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (str_p[i] == '\040')
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf str_p[i] = '\0';
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf else if (str_p[i] != '\0')
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf break;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) strlcat((*ap_id_list)->ap_info, " SN: ",
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang sizeof ((*ap_id_list)->ap_info));
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) strlcat((*ap_id_list)->ap_info, str_p + skip,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang sizeof ((*ap_id_list)->ap_info));
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf free(str_p);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* Fill in ap_type which is collected from HBA driver */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* call do_control_ioctl TBD */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((rv = do_control_ioctl(ap_id, SATA_CFGA_GET_AP_TYPE, NULL,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void **)&str_p, &size)) != CFGA_SATA_OK) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) printf(
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang "SATA_CFGA_GET_AP_TYPE ioctl failed\n");
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) strlcpy((*ap_id_list)->ap_type, str_p,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang sizeof ((*ap_id_list)->ap_type));
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf free(str_p);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang /*
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang * Checking device type. Port multiplier has no dynamic
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang * suffix.
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang */
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang if (strncmp((*ap_id_list)->ap_type, "sata-pmult",
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang sizeof ("sata-pmult")) == 0)
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang pmult = B_TRUE;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang if ((*ap_id_list)->ap_o_state == CFGA_STAT_CONFIGURED &&
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang pmult == B_FALSE) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf char *dyncomp = NULL;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * This is the case where we need to generate
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * a dynamic component of the ap_id, i.e. device.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China rv = sata_make_dyncomp(ap_id, &dyncomp,
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China (*ap_id_list)->ap_type);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (rv != CFGA_SATA_OK)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (dyncomp != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) strcat((*ap_id_list)->ap_log_id,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang DYN_SEP);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) strlcat((*ap_id_list)->ap_log_id,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang dyncomp,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang sizeof ((*ap_id_list)->ap_log_id));
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf free(dyncomp);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf } else {
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang /* This is an empty port */
2c2d21e98a95cba5687ec6574c974a5c6c4a6adbRichard Lowe if (get_port_num(ap_id, &port) != CFGA_SATA_OK) {
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang goto bailout;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang }
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang if (port & SATA_CFGA_PMPORT_QUAL) {
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang (void) strlcpy((*ap_id_list)->ap_type, "pmult-port",
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang sizeof ((*ap_id_list)->ap_type));
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang } else {
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang (void) strlcpy((*ap_id_list)->ap_type, "sata-port",
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang sizeof ((*ap_id_list)->ap_type));
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (sata_err_msg(errstring, rv, ap_id, errno));
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfbailout:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (*ap_id_list != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf free(*ap_id_list);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (ap_id_log != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf free(ap_id_log);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (sata_err_msg(errstring, rv, ap_id, errno));
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf}
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * This routine accepts a string adn prints it using
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * the message print routine argument.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstatic void
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfcfga_msg(struct cfga_msg *msgp, const char *str)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf{
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf int len;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf char *q;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (msgp == NULL || msgp->message_routine == NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) printf("cfga_msg: NULL msgp\n");
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((len = strlen(str)) == 0) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) printf("cfga_msg: null str\n");
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((q = (char *)calloc(len + 1, 1)) == NULL) {
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang perror("cfga_msg");
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) strcpy(q, str);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (*msgp->message_routine)(msgp->appdata_ptr, q);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf free(q);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf}
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/* cfgadm entry point */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/* ARGSUSED */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfcfga_err_t
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfcfga_help(struct cfga_msg *msgp, const char *options, cfga_flags_t flags)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf{
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (options != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cfga_msg(msgp, dgettext(TEXT_DOMAIN, sata_help[HELP_UNKNOWN]));
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cfga_msg(msgp, options);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cfga_msg(msgp, dgettext(TEXT_DOMAIN, sata_help[HELP_HEADER]));
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cfga_msg(msgp, sata_help[HELP_CONFIG]);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cfga_msg(msgp, sata_help[HELP_RESET_PORT]);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cfga_msg(msgp, sata_help[HELP_RESET_DEVICE]);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cfga_msg(msgp, sata_help[HELP_RESET_ALL]);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cfga_msg(msgp, sata_help[HELP_PORT_ACTIVATE]);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cfga_msg(msgp, sata_help[HELP_PORT_DEACTIVATE]);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cfga_msg(msgp, sata_help[HELP_PORT_SELF_TEST]);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cfga_msg(msgp, sata_help[HELP_CNTRL_SELF_TEST]);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (CFGA_OK);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf}
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Ensure the ap_id passed is in the correct (physical ap_id) form:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * path/device:xx[.xx]
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * where xx is a one or two-digit number.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Note the library always calls the plugin with a physical ap_id.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstatic int
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfverify_valid_apid(const char *ap_id)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf{
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf char *l_ap_id;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (ap_id == NULL)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (-1);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf l_ap_id = strrchr(ap_id, (int)*MINOR_SEP);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf l_ap_id++;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (strspn(l_ap_id, "0123456789.") != strlen(l_ap_id)) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* Bad characters in the ap_id */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (-1);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (strstr(l_ap_id, "..") != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* ap_id has 1..2 or more than 2 dots */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (-1);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (0);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf}
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Verify the params passed in are valid.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstatic cfga_sata_ret_t
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfverify_params(
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang const char *ap_id,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang const char *options,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang char **errstring)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf{
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf char *pdyn, *lap_id;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf int rv;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (errstring != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *errstring = NULL;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (options != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (CFGA_SATA_OPTIONS);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* Strip dynamic AP name component if it is present. */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf lap_id = strdup(ap_id);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (lap_id == NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (CFGA_SATA_ALLOC_FAIL);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((pdyn = GET_DYN(lap_id)) != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *pdyn = '\0';
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (verify_valid_apid(lap_id) != 0) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_AP;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf } else {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_OK;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf free(lap_id);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (rv);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf}
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Takes a validated ap_id and extracts the port number.
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang * Port multiplier is supported now.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstatic cfga_sata_ret_t
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfget_port_num(const char *ap_id, uint32_t *port)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf{
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang uint32_t cport, pmport = 0, qual = 0;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang char *cport_str, *pmport_str;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang /* Get the cport number */
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang cport_str = strrchr(ap_id, (int)*MINOR_SEP) + strlen(MINOR_SEP);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf errno = 0;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang cport = strtol(cport_str, NULL, 10);
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang if ((cport & ~SATA_CFGA_CPORT_MASK) != 0 || errno != 0) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (CFGA_SATA_PORT);
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang /* Get pmport number if there is a PORT_SEPARATOR */
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang errno = 0;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang if ((pmport_str = strrchr(ap_id, (int)*PORT_SEPARATOR)) != 0) {
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang pmport_str += strlen(PORT_SEPARATOR);
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang pmport = strtol(pmport_str, NULL, 10);
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang qual = SATA_CFGA_PMPORT_QUAL;
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang if ((pmport & ~SATA_CFGA_PMPORT_MASK) != 0 || errno != 0) {
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang return (CFGA_SATA_PORT);
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang }
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang *port = cport | (pmport << SATA_CFGA_PMPORT_SHIFT) | qual;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (CFGA_SATA_OK);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf}
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Pair of routines to set up for/clean up after a devctl_ap_* lib call.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstatic void
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfcleanup_after_devctl_cmd(devctl_hdl_t devctl_hdl, nvlist_t *user_nvlist)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf{
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (user_nvlist != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf nvlist_free(user_nvlist);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (devctl_hdl != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf devctl_release(devctl_hdl);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf}
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstatic cfga_sata_ret_t
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfsetup_for_devctl_cmd(
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang const char *ap_id,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang devctl_hdl_t *devctl_hdl,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang nvlist_t **user_nvlistp,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang uint_t oflag)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf{
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint_t port;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cfga_sata_ret_t rv = CFGA_SATA_OK;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf char *lap_id, *pdyn;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf lap_id = strdup(ap_id);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (lap_id == NULL)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (CFGA_SATA_ALLOC_FAIL);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((pdyn = GET_DYN(lap_id)) != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *pdyn = '\0';
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* Get a devctl handle to pass to the devctl_ap_XXX functions */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((*devctl_hdl = devctl_ap_acquire((char *)lap_id, oflag)) == NULL) {
724365f7556fc4201fdb11766ebc6bd918523130sethg (void) fprintf(stderr, "[libcfgadm:sata] "
724365f7556fc4201fdb11766ebc6bd918523130sethg "setup_for_devctl_cmd: devctl_ap_acquire failed: %s\n",
724365f7556fc4201fdb11766ebc6bd918523130sethg strerror(errno));
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_DEVCTL;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* Set up nvlist to pass the port number down to the driver */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (nvlist_alloc(user_nvlistp, NV_UNIQUE_NAME_TYPE, NULL) != 0) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *user_nvlistp = NULL;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_NVLIST;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) printf("nvlist_alloc failed\n");
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Get port id, for Port Multiplier port, things could be a little bit
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * complicated because of "port.port" format in ap_id, thus for
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * port multiplier port, port number should be coded as 32bit int
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * with the sig 16 bit as sata channel number, least 16 bit as
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * the port number of sata port multiplier port.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((rv = get_port_num(lap_id, &port)) != CFGA_SATA_OK) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) printf(
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang "setup_for_devctl_cmd: get_port_num, errno: %d\n",
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang errno);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* Creates an int32_t entry */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (nvlist_add_int32(*user_nvlistp, PORT, port) == -1) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) printf("nvlist_add_int32 failed\n");
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_NVLIST;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
724365f7556fc4201fdb11766ebc6bd918523130sethg free(lap_id);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (rv);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfbailout:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf free(lap_id);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) cleanup_after_devctl_cmd(*devctl_hdl, *user_nvlistp);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (rv);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf}
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstatic cfga_sata_ret_t
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfport_state(devctl_hdl_t hdl, nvlist_t *list,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang ap_rstate_t *rstate, ap_ostate_t *ostate)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf{
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf devctl_ap_state_t devctl_ap_state;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (devctl_ap_getstate(hdl, list, &devctl_ap_state) == -1) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) printf("devctl_ap_getstate failed, errno: %d\n", errno);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (CFGA_SATA_IOCTL);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *rstate = devctl_ap_state.ap_rstate;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *ostate = devctl_ap_state.ap_ostate;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (CFGA_SATA_OK);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf}
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Given a subcommand to the DEVCTL_AP_CONTROL ioctl, rquest the size of
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * the data to be returned, allocate a buffer, then get the data.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Returns *descrp (which must be freed) and size.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Note SATA_DESCR_TYPE_STRING returns an ASCII NULL-terminated string,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * not a string descr.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfcfga_sata_ret_t
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfdo_control_ioctl(const char *ap_id, sata_cfga_apctl_t subcommand, uint_t arg,
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang void **descrp, size_t *sizep)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf{
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf int fd = -1;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint_t port;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint32_t local_size;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cfga_sata_ret_t rv = CFGA_SATA_OK;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf struct sata_ioctl_data ioctl_data;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf assert(descrp != NULL);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *descrp = NULL;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf assert(sizep != NULL);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((rv = get_port_num(ap_id, &port)) != CFGA_SATA_OK) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((fd = open(ap_id, O_RDONLY)) == -1) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) printf("do_control_ioctl: open failed: errno:%d\n",
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang errno);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_OPEN;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (errno == EBUSY) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_BUSY;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf ioctl_data.cmd = subcommand;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf ioctl_data.port = port;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf ioctl_data.misc_arg = (uint_t)arg;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Find out how large a buf we need to get the data.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Note the ioctls only accept/return a 32-bit int for a get_size
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * to avoid 32/64 and BE/LE issues.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((subcommand == SATA_CFGA_GET_AP_TYPE) ||
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (subcommand == SATA_CFGA_GET_DEVICE_PATH) ||
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (subcommand == SATA_CFGA_GET_MODEL_INFO) ||
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (subcommand == SATA_CFGA_GET_REVFIRMWARE_INFO) ||
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (subcommand == SATA_CFGA_GET_SERIALNUMBER_INFO)) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf ioctl_data.get_size = B_TRUE;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf ioctl_data.buf = (caddr_t)&local_size;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf ioctl_data.bufsiz = sizeof (local_size);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (ioctl(fd, DEVCTL_AP_CONTROL, &ioctl_data) != 0) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf perror("ioctl failed (size)");
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_IOCTL;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *sizep = local_size;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (local_size == 0) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) printf("zero length data\n");
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_ZEROLEN;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if ((*descrp = malloc(*sizep)) == NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) printf("do_control_ioctl: malloc failed\n");
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_ALLOC_FAIL;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf } else {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *sizep = 0;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf ioctl_data.get_size = B_FALSE;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf ioctl_data.buf = *descrp;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf ioctl_data.bufsiz = *sizep;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* Execute IOCTL */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (ioctl(fd, DEVCTL_AP_CONTROL, &ioctl_data) != 0) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_IOCTL;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf goto bailout;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) close(fd);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (rv);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfbailout:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (fd != -1) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void) close(fd);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (*descrp != NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf free(*descrp);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *descrp = NULL;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (rv == CFGA_SATA_IOCTL && errno == EBUSY) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = CFGA_SATA_BUSY;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (rv);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf}
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstatic int
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfsata_confirm(struct cfga_confirm *confp, char *msg)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf{
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf int rval;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (confp == NULL || confp->confirm == NULL) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (0);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rval = (*confp->confirm)(confp->appdata_ptr, msg);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (rval);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf}
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstatic char *
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfsata_get_devicepath(const char *ap_id)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf{
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf char *devpath = NULL;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf size_t size;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cfga_sata_ret_t rv;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf rv = do_control_ioctl(ap_id, SATA_CFGA_GET_DEVICE_PATH, NULL,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (void **)&devpath, &size);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (rv == CFGA_SATA_OK) {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return (devpath);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf } else {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf return ((char *)NULL);
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf}