1*66f9d5cbSmlf /* 2*66f9d5cbSmlf * CDDL HEADER START 3*66f9d5cbSmlf * 4*66f9d5cbSmlf * The contents of this file are subject to the terms of the 5*66f9d5cbSmlf * Common Development and Distribution License (the "License"). 6*66f9d5cbSmlf * You may not use this file except in compliance with the License. 7*66f9d5cbSmlf * 8*66f9d5cbSmlf * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*66f9d5cbSmlf * or http://www.opensolaris.org/os/licensing. 10*66f9d5cbSmlf * See the License for the specific language governing permissions 11*66f9d5cbSmlf * and limitations under the License. 12*66f9d5cbSmlf * 13*66f9d5cbSmlf * When distributing Covered Code, include this CDDL HEADER in each 14*66f9d5cbSmlf * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*66f9d5cbSmlf * If applicable, add the following below this CDDL HEADER, with the 16*66f9d5cbSmlf * fields enclosed by brackets "[]" replaced with your own identifying 17*66f9d5cbSmlf * information: Portions Copyright [yyyy] [name of copyright owner] 18*66f9d5cbSmlf * 19*66f9d5cbSmlf * CDDL HEADER END 20*66f9d5cbSmlf */ 21*66f9d5cbSmlf 22*66f9d5cbSmlf /* 23*66f9d5cbSmlf * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24*66f9d5cbSmlf * Use is subject to license terms. 25*66f9d5cbSmlf */ 26*66f9d5cbSmlf 27*66f9d5cbSmlf #ifndef _CFGA_SATA_H 28*66f9d5cbSmlf #define _CFGA_SATA_H 29*66f9d5cbSmlf 30*66f9d5cbSmlf #ifdef __cplusplus 31*66f9d5cbSmlf extern "C" { 32*66f9d5cbSmlf #endif 33*66f9d5cbSmlf 34*66f9d5cbSmlf #include <stdlib.h> 35*66f9d5cbSmlf #include <strings.h> 36*66f9d5cbSmlf #include <fcntl.h> 37*66f9d5cbSmlf #include <ctype.h> 38*66f9d5cbSmlf #include <unistd.h> 39*66f9d5cbSmlf #include <libintl.h> 40*66f9d5cbSmlf #include <libdevice.h> 41*66f9d5cbSmlf #include <sys/varargs.h> 42*66f9d5cbSmlf 43*66f9d5cbSmlf #include <sys/sata/sata_cfgadm.h> 44*66f9d5cbSmlf 45*66f9d5cbSmlf #include <libdevinfo.h> 46*66f9d5cbSmlf #include <libdevice.h> 47*66f9d5cbSmlf #include <librcm.h> 48*66f9d5cbSmlf #include <synch.h> 49*66f9d5cbSmlf #include <thread.h> 50*66f9d5cbSmlf #include <assert.h> 51*66f9d5cbSmlf 52*66f9d5cbSmlf #define CFGA_PLUGIN_LIB 53*66f9d5cbSmlf #include <config_admin.h> 54*66f9d5cbSmlf 55*66f9d5cbSmlf /* 56*66f9d5cbSmlf * Debug stuff 57*66f9d5cbSmlf */ 58*66f9d5cbSmlf #ifdef DEBUG 59*66f9d5cbSmlf #define DPRINTF printf 60*66f9d5cbSmlf #else 61*66f9d5cbSmlf #define DPRINTF 0 && 62*66f9d5cbSmlf #endif /* DEBUG */ 63*66f9d5cbSmlf 64*66f9d5cbSmlf typedef enum { 65*66f9d5cbSmlf CFGA_SATA_TERMINATE = 0, 66*66f9d5cbSmlf CFGA_SATA_CONTINUE 67*66f9d5cbSmlf } sata_cfga_recur_t; 68*66f9d5cbSmlf 69*66f9d5cbSmlf /* for walking links */ 70*66f9d5cbSmlf typedef struct walk_link { 71*66f9d5cbSmlf char *path; 72*66f9d5cbSmlf char len; 73*66f9d5cbSmlf char **linkpp; 74*66f9d5cbSmlf } walk_link_t; 75*66f9d5cbSmlf 76*66f9d5cbSmlf #define MATCH_MINOR_NAME 1 77*66f9d5cbSmlf 78*66f9d5cbSmlf /* Misc text strings */ 79*66f9d5cbSmlf #define CFGA_DEV_DIR "/dev/cfg" 80*66f9d5cbSmlf #define MINOR_SEP ":" 81*66f9d5cbSmlf #define DYN_SEP "::" 82*66f9d5cbSmlf #define PORT "port" 83*66f9d5cbSmlf #define PORT_SEPARATOR "." 84*66f9d5cbSmlf #define SATA "sata" 85*66f9d5cbSmlf #define CFGA_DEVCTL_NODE ":devctl" 86*66f9d5cbSmlf #define SATA_CFGADM_DEFAULT_AP_TYPE "unknown" 87*66f9d5cbSmlf #define SLICE "s" 88*66f9d5cbSmlf #define PARTITION "p" 89*66f9d5cbSmlf #define PATH_SEP "/" 90*66f9d5cbSmlf 91*66f9d5cbSmlf /* these set of defines are -lav listing */ 92*66f9d5cbSmlf #define SATA_UNDEF_STR "<undef>" 93*66f9d5cbSmlf #define SATA_NO_CFG_STR "<no cfg str descr>" 94*66f9d5cbSmlf 95*66f9d5cbSmlf /* -x commands */ 96*66f9d5cbSmlf #define SATA_RESET_ALL "sata_reset_all" 97*66f9d5cbSmlf #define SATA_RESET_PORT "sata_reset_port" 98*66f9d5cbSmlf #define SATA_RESET_DEVICE "sata_reset_device" 99*66f9d5cbSmlf #define SATA_PORT_DEACTIVATE "sata_port_deactivate" 100*66f9d5cbSmlf #define SATA_PORT_ACTIVATE "sata_port_activate" 101*66f9d5cbSmlf #define SATA_PORT_SELF_TEST "sata_port_self_test" 102*66f9d5cbSmlf 103*66f9d5cbSmlf /* -t command */ 104*66f9d5cbSmlf #define SATA_CNTRL_SELF_TEST "sata_cntrl_self_test" 105*66f9d5cbSmlf 106*66f9d5cbSmlf /* for confirm operation */ 107*66f9d5cbSmlf #define SATA_CONFIRM_DEVICE "the device at: " 108*66f9d5cbSmlf #define SATA_CONFIRM_DEVICE_SUSPEND \ 109*66f9d5cbSmlf "This operation will suspend activity on the SATA device\nContinue" 110*66f9d5cbSmlf #define SATA_CONFIRM_DEVICE_ABORT \ 111*66f9d5cbSmlf "This operation will arbitrarily abort all commands " \ 112*66f9d5cbSmlf "on SATA device\nContinue" 113*66f9d5cbSmlf #define SATA_CONFIRM_CONTROLLER "the controller: " 114*66f9d5cbSmlf #define SATA_CONFIRM_CONTROLLER_ABORT \ 115*66f9d5cbSmlf "This operation will arbitrarirly abort all commands " \ 116*66f9d5cbSmlf "on the SATA controller\nContinue" 117*66f9d5cbSmlf #define SATA_CONFIRM_PORT "the port: " 118*66f9d5cbSmlf #define SATA_CONFIRM_PORT_DISABLE \ 119*66f9d5cbSmlf "This operation will disable activity on the SATA port\nContinue" 120*66f9d5cbSmlf #define SATA_CONFIRM_PORT_ENABLE \ 121*66f9d5cbSmlf "This operation will enable activity on the SATA port\nContinue" 122*66f9d5cbSmlf 123*66f9d5cbSmlf #define S_FREE(x) (((x) != NULL) ? \ 124*66f9d5cbSmlf (free(x), (x) = NULL) : (void *)0) 125*66f9d5cbSmlf 126*66f9d5cbSmlf #define GET_DYN(a) (((a) != NULL) ? \ 127*66f9d5cbSmlf strstr((a), DYN_SEP) : (void *)0) 128*66f9d5cbSmlf 129*66f9d5cbSmlf typedef struct sata_apid { 130*66f9d5cbSmlf char *hba_phys; 131*66f9d5cbSmlf char *dyncomp; 132*66f9d5cbSmlf char *path; 133*66f9d5cbSmlf uint_t flags; 134*66f9d5cbSmlf } sata_apid_t; 135*66f9d5cbSmlf 136*66f9d5cbSmlf 137*66f9d5cbSmlf /* Messages */ 138*66f9d5cbSmlf 139*66f9d5cbSmlf typedef struct msgcvt { 140*66f9d5cbSmlf int intl; /* Flag: if 1, internationalize */ 141*66f9d5cbSmlf cfga_err_t cfga_err; /* Error code libcfgadm understands */ 142*66f9d5cbSmlf const char *msgstr; 143*66f9d5cbSmlf } msgcvt_t; 144*66f9d5cbSmlf 145*66f9d5cbSmlf #define NO_CVT 0 146*66f9d5cbSmlf #define CVT 1 147*66f9d5cbSmlf 148*66f9d5cbSmlf #define MSG_TBL_SZ(table) (sizeof ((table)) / sizeof (msgcvt_t)) 149*66f9d5cbSmlf 150*66f9d5cbSmlf typedef enum { 151*66f9d5cbSmlf SATA_CFGA_ERR = -2, 152*66f9d5cbSmlf SATA_CFGA_LIB_ERR, 153*66f9d5cbSmlf SATA_CFGA_OK, 154*66f9d5cbSmlf SATA_CFGA_BUSY, 155*66f9d5cbSmlf SATA_CFGA_NO_REC 156*66f9d5cbSmlf } sata_cfga_ret_t; 157*66f9d5cbSmlf 158*66f9d5cbSmlf /* Messages */ 159*66f9d5cbSmlf 160*66f9d5cbSmlf 161*66f9d5cbSmlf /* Error message ids (and indices into sata_error_msgs) */ 162*66f9d5cbSmlf typedef enum { 163*66f9d5cbSmlf CFGA_SATA_OK = 0, 164*66f9d5cbSmlf CFGA_SATA_NACK, 165*66f9d5cbSmlf CFGA_SATA_DEVICE_UNCONFIGURED, 166*66f9d5cbSmlf CFGA_SATA_UNKNOWN, 167*66f9d5cbSmlf CFGA_SATA_INTERNAL_ERROR, 168*66f9d5cbSmlf CFGA_SATA_DATA_ERROR, 169*66f9d5cbSmlf CFGA_SATA_OPTIONS, 170*66f9d5cbSmlf CFGA_SATA_HWOPNOTSUPP, 171*66f9d5cbSmlf CFGA_SATA_DYNAMIC_AP, 172*66f9d5cbSmlf CFGA_SATA_AP, 173*66f9d5cbSmlf CFGA_SATA_PORT, 174*66f9d5cbSmlf CFGA_SATA_DEVCTL, 175*66f9d5cbSmlf CFGA_SATA_DEV_CONFIGURE, 176*66f9d5cbSmlf CFGA_SATA_DEV_UNCONFIGURE, 177*66f9d5cbSmlf CFGA_SATA_DISCONNECTED, 178*66f9d5cbSmlf CFGA_SATA_NOT_CONNECTED, 179*66f9d5cbSmlf CFGA_SATA_NOT_CONFIGURED, 180*66f9d5cbSmlf CFGA_SATA_ALREADY_CONNECTED, 181*66f9d5cbSmlf CFGA_SATA_ALREADY_CONFIGURED, 182*66f9d5cbSmlf CFGA_SATA_INVALID_DEVNAME, 183*66f9d5cbSmlf CFGA_SATA_OPEN, 184*66f9d5cbSmlf CFGA_SATA_IOCTL, 185*66f9d5cbSmlf CFGA_SATA_BUSY, 186*66f9d5cbSmlf CFGA_SATA_ALLOC_FAIL, 187*66f9d5cbSmlf CFGA_SATA_OPNOTSUPP, 188*66f9d5cbSmlf CFGA_SATA_DEVLINK, 189*66f9d5cbSmlf CFGA_SATA_STATE, 190*66f9d5cbSmlf CFGA_SATA_PRIV, 191*66f9d5cbSmlf CFGA_SATA_NVLIST, 192*66f9d5cbSmlf CFGA_SATA_ZEROLEN, 193*66f9d5cbSmlf 194*66f9d5cbSmlf /* RCM Errors */ 195*66f9d5cbSmlf CFGA_SATA_RCM_HANDLE, 196*66f9d5cbSmlf CFGA_SATA_RCM_ONLINE, 197*66f9d5cbSmlf CFGA_SATA_RCM_OFFLINE, 198*66f9d5cbSmlf CFGA_SATA_RCM_INFO 199*66f9d5cbSmlf 200*66f9d5cbSmlf } cfga_sata_ret_t; 201*66f9d5cbSmlf 202*66f9d5cbSmlf /* 203*66f9d5cbSmlf * Given an error msg index, look up the associated string, and 204*66f9d5cbSmlf * convert it to the current locale if required. 205*66f9d5cbSmlf */ 206*66f9d5cbSmlf #define ERR_STR(msg_idx) \ 207*66f9d5cbSmlf (get_msg((msg_idx), sata_msgs, MSG_TBL_SZ(sata_msgs))) 208*66f9d5cbSmlf 209*66f9d5cbSmlf /* Prototypes */ 210*66f9d5cbSmlf 211*66f9d5cbSmlf cfga_err_t sata_err_msg(char **, cfga_sata_ret_t, const char *, int); 212*66f9d5cbSmlf cfga_sata_ret_t sata_rcm_offline(const char *, char **, char *, cfga_flags_t); 213*66f9d5cbSmlf cfga_sata_ret_t sata_rcm_online(const char *, char **, char *, cfga_flags_t); 214*66f9d5cbSmlf cfga_sata_ret_t sata_rcm_remove(const char *, char **, char *, cfga_flags_t); 215*66f9d5cbSmlf 216*66f9d5cbSmlf 217*66f9d5cbSmlf #ifdef __cplusplus 218*66f9d5cbSmlf } 219*66f9d5cbSmlf #endif 220*66f9d5cbSmlf 221*66f9d5cbSmlf #endif /* _CFGA_SATA_H */ 222