1N/A/*
1N/A * CDDL HEADER START
1N/A *
1N/A * The contents of this file are subject to the terms of the
1N/A * Common Development and Distribution License (the "License").
1N/A * You may not use this file except in compliance with the License.
1N/A *
1N/A * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
1N/A * or http://www.opensolaris.org/os/licensing.
1N/A * See the License for the specific language governing permissions
1N/A * and limitations under the License.
1N/A *
1N/A * When distributing Covered Code, include this CDDL HEADER in each
1N/A * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1N/A * If applicable, add the following below this CDDL HEADER, with the
1N/A * fields enclosed by brackets "[]" replaced with your own identifying
1N/A * information: Portions Copyright [yyyy] [name of copyright owner]
1N/A *
1N/A * CDDL HEADER END
1N/A */
1N/A
1N/A/*
1N/A * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
1N/A * Use is subject to license terms.
1N/A */
1N/A
1N/A#ifndef _CFGA_SCSI_H
1N/A#define _CFGA_SCSI_H
1N/A
1N/A#ifdef __cplusplus
1N/Aextern "C" {
1N/A#endif
1N/A
1N/A#include <stddef.h>
1N/A#include <locale.h>
1N/A#include <ctype.h>
1N/A#include <stdio.h>
1N/A#include <stdlib.h>
1N/A#include <string.h>
1N/A#include <fcntl.h>
1N/A#include <unistd.h>
1N/A#include <errno.h>
1N/A#include <locale.h>
1N/A#include <langinfo.h>
1N/A#include <time.h>
1N/A#include <stdarg.h>
1N/A#include <sys/types.h>
1N/A#include <sys/ioctl.h>
1N/A#include <sys/dditypes.h>
1N/A#include <sys/modctl.h>
1N/A#include <libdevinfo.h>
1N/A#include <libdevice.h>
1N/A#include <librcm.h>
1N/A#include <dirent.h>
1N/A#include <strings.h>
1N/A
1N/A#include <sys/ioctl.h>
1N/A#include <sys/byteorder.h>
1N/A#include <sys/scsi/scsi.h>
1N/A#include <strings.h>
1N/A#include <sys/vfstab.h>
1N/A#include <sys/stat.h>
1N/A#include <sys/mnttab.h>
1N/A#include <sys/wait.h>
1N/A#include <signal.h>
1N/A
1N/A#include <sys/uio.h>
1N/A#include <sys/param.h>
1N/A
1N/A#include <synch.h>
1N/A#include <thread.h>
1N/A
1N/A#include <limits.h>
1N/A#include <ftw.h>
1N/A
1N/A#define CFGA_PLUGIN_LIB
1N/A#include <config_admin.h>
1N/A
1N/A#if !defined(DEBUG)
1N/A#define NDEBUG 1
1N/A#else
1N/A#undef NDEBUG
1N/A#endif
1N/A
1N/A#include <assert.h>
1N/A
1N/A/* Return/error codes */
1N/Atypedef enum {
1N/A SCFGA_ERR = -1,
1N/A SCFGA_LIB_ERR = 0,
1N/A SCFGA_OK,
1N/A SCFGA_NACK,
1N/A SCFGA_BUSY,
1N/A SCFGA_SYSTEM_BUSY,
1N/A SCFGA_APID_NOEXIST,
1N/A SCFGA_OPNOTSUPP,
1N/A SCFGA_PRIV,
1N/A SCFGA_UNLOCKED,
1N/A SCFGA_NO_REC,
1N/A SCFGA_OP_INTR,
1N/A SCFGA_DB_INVAL,
1N/A SCFGA_UNKNOWN_ERR
1N/A} scfga_ret_t;
1N/A
1N/A/* Commands used internally */
1N/Atypedef enum {
1N/A SCFGA_INVAL_CMD = -1,
1N/A SCFGA_DEV_OP = 0,
1N/A SCFGA_BUS_OP,
1N/A SCFGA_STAT_DEV,
1N/A SCFGA_STAT_BUS,
1N/A SCFGA_STAT_ALL,
1N/A SCFGA_GET_DEVPATH,
1N/A SCFGA_INSERT_DEV,
1N/A SCFGA_REMOVE_DEV,
1N/A SCFGA_REPLACE_DEV,
1N/A SCFGA_WALK_NODE,
1N/A SCFGA_WALK_MINOR,
1N/A SCFGA_WALK_PATH,
1N/A SCFGA_BUS_QUIESCE,
1N/A SCFGA_BUS_UNQUIESCE,
1N/A SCFGA_BUS_GETSTATE,
1N/A SCFGA_DEV_GETSTATE,
1N/A SCFGA_BUS_CONFIGURE,
1N/A SCFGA_BUS_UNCONFIGURE,
1N/A SCFGA_DEV_CONFIGURE,
1N/A SCFGA_DEV_UNCONFIGURE,
1N/A SCFGA_DEV_REMOVE,
1N/A SCFGA_LED_DEV,
1N/A SCFGA_LOCATOR_DEV,
1N/A SCFGA_RESET_DEV,
1N/A SCFGA_RESET_BUS,
1N/A SCFGA_RESET_ALL,
1N/A SCFGA_READ,
1N/A SCFGA_WRITE
1N/A} scfga_cmd_t;
1N/A
1N/Atypedef enum {
1N/A SCFGA_TERMINATE = 0,
1N/A SCFGA_CONTINUE
1N/A} scfga_recur_t;
1N/A
1N/Atypedef enum {
1N/A NODYNCOMP = 1,
1N/A DEV_APID,
1N/A PATH_APID
1N/A} dyncomp_t;
1N/A
1N/A
1N/A/* Structures for tree walking code */
1N/A
1N/Atypedef struct {
1N/A uint_t flags;
1N/A int (*fcn)(di_node_t node, void *argp);
1N/A} walk_node_t;
1N/A
1N/Atypedef struct {
1N/A const char *nodetype;
1N/A int (*fcn)(di_node_t node, di_minor_t minor, void *argp);
1N/A} walk_minor_t;
1N/A
1N/Atypedef union {
1N/A walk_node_t node_args;
1N/A walk_minor_t minor_args;
1N/A} walkarg_t;
1N/A
1N/Atypedef struct {
1N/A char *phys;
1N/A char *log;
1N/A scfga_ret_t ret;
1N/A int match_minor;
1N/A int l_errno;
1N/A} pathm_t;
1N/A
1N/Atypedef struct ldata_list {
1N/A cfga_list_data_t ldata;
1N/A struct ldata_list *next;
1N/A} ldata_list_t;
1N/A
1N/Atypedef struct {
1N/A struct cfga_confirm *confp;
1N/A struct cfga_msg *msgp;
1N/A} prompt_t;
1N/A
1N/Atypedef struct {
1N/A char *hba_phys;
1N/A char *dyncomp;
1N/A dyncomp_t dyntype; /* is pathinfo or dev apid? */
1N/A char *path; /* for apid with device dyn comp. */
1N/A uint_t flags;
1N/A} apid_t;
1N/A
1N/A/* Private hardware options */
1N/A#define OPT_DISABLE_RCM "disable_rcm"
1N/A#define OPT_USE_DIFORCE "use_diforce"
1N/A
1N/A/* apid_t flags */
1N/A#define FLAG_DISABLE_RCM 0x01
1N/A#define FLAG_USE_DIFORCE 0x02
1N/A
1N/A/* internal use for handling pathinfo */
1N/A#define FLAG_CLIENT_DEV 0x04
1N/A
1N/A/* Message ids */
1N/Atypedef enum {
1N/A
1N/A/* ERRORS */
1N/AERR_UNKNOWN = -1,
1N/AERR_OP_FAILED,
1N/AERR_CMD_INVAL,
1N/AERR_NOT_BUSAPID,
1N/AERR_APID_INVAL,
1N/AERR_NOT_BUSOP,
1N/AERR_NOT_DEVOP,
1N/AERR_UNAVAILABLE,
1N/AERR_CTRLR_CRIT,
1N/AERR_BUS_GETSTATE,
1N/AERR_BUS_NOTCONNECTED,
1N/AERR_BUS_CONNECTED,
1N/AERR_BUS_QUIESCE,
1N/AERR_BUS_UNQUIESCE,
1N/AERR_BUS_CONFIGURE,
1N/AERR_BUS_UNCONFIGURE,
1N/AERR_DEV_CONFIGURE,
1N/AERR_DEV_RECONFIGURE,
1N/AERR_DEV_UNCONFIGURE,
1N/AERR_DEV_REMOVE,
1N/AERR_DEV_REPLACE,
1N/AERR_DEV_INSERT,
1N/AERR_DEV_GETSTATE,
1N/AERR_RESET,
1N/AERR_LIST,
1N/AERR_MAYBE_BUSY,
1N/AERR_BUS_DEV_MISMATCH,
1N/AERR_VAR_RUN,
1N/AERR_FORK,
1N/A
1N/A/* Errors with arguments */
1N/AERRARG_OPT_INVAL,
1N/AERRARG_HWCMD_INVAL,
1N/AERRARG_DEVINFO,
1N/AERRARG_OPEN,
1N/AERRARG_LOCK,
1N/AERRARG_QUIESCE_LOCK,
1N/A
1N/A/* RCM Errors */
1N/AERR_RCM_HANDLE,
1N/AERRARG_RCM_SUSPEND,
1N/AERRARG_RCM_RESUME,
1N/AERRARG_RCM_OFFLINE,
1N/AERRARG_RCM_CLIENT_OFFLINE,
1N/AERRARG_RCM_ONLINE,
1N/AERRARG_RCM_REMOVE,
1N/A
1N/A/* Commands */
1N/ACMD_INSERT_DEV,
1N/ACMD_REMOVE_DEV,
1N/ACMD_REPLACE_DEV,
1N/ACMD_LED_DEV,
1N/ACMD_LOCATOR_DEV,
1N/ACMD_RESET_DEV,
1N/ACMD_RESET_BUS,
1N/ACMD_RESET_ALL,
1N/A
1N/A/* help messages */
1N/AMSG_HELP_HDR,
1N/AMSG_HELP_USAGE,
1N/A
1N/A/* Hotplug messages */
1N/AMSG_INSDEV,
1N/AMSG_RMDEV,
1N/AMSG_REPLDEV,
1N/AMSG_WAIT_LOCK,
1N/A
1N/A/* Hotplugging confirmation prompts */
1N/ACONF_QUIESCE_1,
1N/ACONF_QUIESCE_2,
1N/ACONF_UNQUIESCE,
1N/ACONF_NO_QUIESCE,
1N/A
1N/A/* Misc. */
1N/AWARN_DISCONNECT,
1N/A
1N/A/* HDD led/locator messages */
1N/AMSG_LED_HDR,
1N/AMSG_MISSING_LED_NAME,
1N/AMSG_MISSING_LED_MODE
1N/A} msgid_t;
1N/A
1N/Atypedef enum {
1N/A LED_STR_FAULT,
1N/A LED_STR_POWER,
1N/A LED_STR_ATTN,
1N/A LED_STR_ACTIVE,
1N/A LED_STR_LOCATOR
1N/A} led_strid_t;
1N/A
1N/Atypedef enum {
1N/A LED_MODE_OFF,
1N/A LED_MODE_ON,
1N/A LED_MODE_BLINK,
1N/A LED_MODE_FAULTED,
1N/A LED_MODE_UNK
1N/A} led_modeid_t;
1N/A
1N/A
1N/Atypedef struct {
1N/A msgid_t str_id;
1N/A scfga_cmd_t cmd;
1N/A scfga_ret_t (*fcn)(const char *, scfga_cmd_t, apid_t *, prompt_t *,
1N/A cfga_flags_t, char **);
1N/A} hw_cmd_t;
1N/A
1N/Atypedef struct {
1N/A msgid_t msgid;
1N/A int nargs; /* Number of arguments following msgid */
1N/A int intl; /* Flag: if 1, internationalize */
1N/A const char *msgstr;
1N/A} msgcvt_t;
1N/A
1N/A
1N/A#define SLASH "/"
1N/A#define CFGA_DEV_DIR "/dev/cfg"
1N/A#define DEV_DIR "/dev"
1N/A#define DEVICES_DIR "/devices"
1N/A#define DEV_DSK "/dev/dsk"
1N/A#define DEV_RDSK "/dev/rdsk"
1N/A#define DEV_RMT "/dev/rmt"
1N/A#define DSK_DIR "dsk"
1N/A#define RDSK_DIR "rdsk"
1N/A#define RMT_DIR "rmt"
1N/A
1N/A
1N/A#define DYN_SEP "::"
1N/A#define MINOR_SEP ":"
1N/A#define PATH_APID_DYN_SEP ","
1N/A
1N/A#define S_FREE(x) (((x) != NULL) ? (free(x), (x) = NULL) : (void *)0)
1N/A#define S_STR(x) (((x) == NULL) ? "" : (x))
1N/A
1N/A
1N/A#define IS_STUB_NODE(s) (di_instance(s) == -1 && \
1N/A di_nodeid(s) == (DI_PROM_NODEID))
1N/A
1N/A#define GET_MSG_STR(i) (str_tbl[msg_idx(i)].msgstr)
1N/A
1N/A#define GET_DYN(a) (((a) != NULL) ? strstr((a), DYN_SEP) : (void *)0)
1N/A
1N/A/*
1N/A * The following macro removes the separator from the dynamic component.
1N/A */
1N/A#define DYN_TO_DYNCOMP(a) ((a) + strlen(DYN_SEP))
1N/A
1N/Aextern int _scfga_debug;
1N/A
1N/A/*
1N/A * Tracing/debugging macros
1N/A */
1N/A#define CFGA_TRACE1(args) (void) ((_scfga_debug >= 1) ? fprintf args : 0)
1N/A#define CFGA_TRACE2(args) (void) ((_scfga_debug >= 2) ? fprintf args : 0)
1N/A#define CFGA_TRACE3(args) (void) ((_scfga_debug >= 3) ? fprintf args : 0)
1N/A
1N/A/* Function prototypes */
1N/A
1N/A/* bus/device ctl routines */
1N/Ascfga_ret_t bus_change_state(cfga_cmd_t state_change_cmd,
1N/A apid_t *apidp, struct cfga_confirm *confp, cfga_flags_t flags,
1N/A char **errstring);
1N/Ascfga_ret_t dev_change_state(cfga_cmd_t state_change_cmd,
1N/A apid_t *apidp, cfga_flags_t flags, char **errstring);
1N/Ascfga_ret_t dev_insert(const char *func, scfga_cmd_t cmd, apid_t *apidp,
1N/A prompt_t *argsp, cfga_flags_t flags, char **errstring);
1N/Ascfga_ret_t dev_replace(const char *func, scfga_cmd_t cmd, apid_t *apidp,
1N/A prompt_t *argsp, cfga_flags_t flags, char **errstring);
1N/Ascfga_ret_t dev_remove(const char *func, scfga_cmd_t cmd, apid_t *apidp,
1N/A prompt_t *argsp, cfga_flags_t flags, char **errstring);
1N/Ascfga_ret_t reset_common(const char *func, scfga_cmd_t cmd, apid_t *apidp,
1N/A prompt_t *argsp, cfga_flags_t flags, char **errstring);
1N/Ascfga_ret_t dev_led(const char *func, scfga_cmd_t cmd, apid_t *apidp,
1N/A prompt_t *argsp, cfga_flags_t flags, char **errstring);
1N/Ascfga_ret_t plat_dev_led(const char *func, scfga_cmd_t cmd, apid_t *apidp,
1N/A prompt_t *argsp, cfga_flags_t flags, char **errstring);
1N/A
1N/A
1N/A/* List related routines */
1N/Ascfga_ret_t do_list(apid_t *apidp, scfga_cmd_t cmd,
1N/A ldata_list_t **llpp, int *nelem, char **errstring);
1N/Ascfga_ret_t list_ext_postprocess(ldata_list_t **llpp, int nelem,
1N/A cfga_list_data_t **ap_id_list, int *nlistp, char **errstring);
1N/Aint stat_path_info(di_node_t root, void *arg, int *l_errnop);
1N/A
1N/A
1N/A/* Conversion routines */
1N/Ascfga_ret_t make_hba_logid(const char *hba_phys, char **hba_logpp,
1N/A int *l_errnop);
1N/Ascfga_ret_t apid_to_path(const char *hba_phys, const char *dyncomp,
1N/A char **pathpp, int *l_errnop);
1N/Ascfga_ret_t make_dyncomp(di_node_t node, const char *physpath,
1N/A char **dyncompp, int *l_errnop);
1N/Ascfga_ret_t make_path_dyncomp(di_path_t path, char **dyncomp, int *l_errnop);
1N/A
1N/A
1N/A/* RCM routines */
1N/Ascfga_ret_t scsi_rcm_suspend(char **rsrclist, char **errstring,
1N/A cfga_flags_t flags, int pflag);
1N/Ascfga_ret_t scsi_rcm_resume(char **rsrclist, char **errstring,
1N/A cfga_flags_t flags, int pflag);
1N/Ascfga_ret_t scsi_rcm_offline(char **rsrclist, char **errstring,
1N/A cfga_flags_t flags);
1N/Ascfga_ret_t scsi_rcm_online(char **rsrclist, char **errstring,
1N/A cfga_flags_t flags);
1N/Ascfga_ret_t scsi_rcm_remove(char **rsrclist, char **errstring,
1N/A cfga_flags_t flags);
1N/A
1N/A
1N/A/* Utility routines */
1N/Ascfga_ret_t physpath_to_devlink(char *physpath, char **linkpp, int *l_errnop,
1N/A int match_minor);
1N/Ascfga_ret_t apidt_create(const char *ap_id, apid_t *apidp,
1N/A char **errstring);
1N/Avoid apidt_free(apid_t *apidp);
1N/Acfga_err_t err_cvt(scfga_ret_t err);
1N/Avoid list_free(ldata_list_t **llpp);
1N/Aint known_state(di_node_t node);
1N/Ascfga_ret_t devctl_cmd(const char *ap_id, scfga_cmd_t cmd,
1N/A uint_t *statep, int *l_errnop);
1N/Ascfga_ret_t path_apid_state_change(apid_t *apidp, scfga_cmd_t cmd,
1N/A cfga_flags_t flags, char **errstring, int *l_errnop, msgid_t errid);
1N/Ascfga_ret_t invoke_cmd(const char *func, apid_t *apidt, prompt_t *prp,
1N/A cfga_flags_t flags, char **errstring);
1N/A
1N/Avoid cfga_err(char **errstring, int use_errno, ...);
1N/Avoid cfga_msg(struct cfga_msg *msgp, ...);
1N/Avoid cfga_led_msg(struct cfga_msg *msgp, apid_t *apidp, led_strid_t,
1N/A led_modeid_t);
1N/Achar *cfga_str(int append_newline, ...);
1N/Aint msg_idx(msgid_t msgid);
1N/Ascfga_ret_t walk_tree(const char *physpath, void *arg, uint_t init_flags,
1N/A walkarg_t *up, scfga_cmd_t cmd, int *l_errnop);
1N/Aint hba_dev_cmp(const char *hba, const char *dev);
1N/Aint dev_cmp(const char *dev1, const char *dev2, int match_minor);
1N/A
1N/Aextern msgcvt_t str_tbl[];
1N/A
1N/A#ifdef __cplusplus
1N/A}
1N/A#endif
1N/A
1N/A#endif /* _CFGA_SCSI_H */
1N/A