1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License, Version 1.0 only
   6  * (the "License").  You may not use this file except in compliance
   7  * with the License.
   8  *
   9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10  * or http://www.opensolaris.org/os/licensing.
  11  * See the License for the specific language governing permissions
  12  * and limitations under the License.
  13  *
  14  * When distributing Covered Code, include this CDDL HEADER in each
  15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16  * If applicable, add the following below this CDDL HEADER, with the
  17  * fields enclosed by brackets "[]" replaced with your own identifying
  18  * information: Portions Copyright [yyyy] [name of copyright owner]
  19  *
  20  * CDDL HEADER END
  21  */
  22 /*
  23  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  */
  26 
  27 #ifndef _PICLFRUTREE_H
  28 #define _PICLFRUTREE_H
  29 
  30 #pragma ident   "%Z%%M% %I%     %E% SMI"
  31 
  32 #include <sys/param.h>
  33 #include <syslog.h>
  34 
  35 #ifdef  __cplusplus
  36 extern "C" {
  37 #endif
  38 
  39 typedef enum {
  40         NONE            = 0x0,
  41         FRUTREE_INIT    = 0x1,
  42         EVENTS          = 0x2,
  43         HASHTABLE       = 0x4,
  44         PERF_DATA       = 0x8,
  45         EV_COMPLETION   = 0x10,
  46         PRINT_ALL       = 0xFF
  47 } frutree_debug_t;
  48 
  49 #define FRUTREE_DEBUG0(lvl, fmt) \
  50         if (lvl & frutree_debug) { \
  51                 syslog(LOG_DEBUG, fmt); \
  52         }
  53 #define FRUTREE_DEBUG1(lvl, fmt, d1) \
  54         if (lvl & frutree_debug) { \
  55                 syslog(LOG_DEBUG, fmt, d1); \
  56         }
  57 #define FRUTREE_DEBUG2(lvl, fmt, d1, d2) \
  58         if (lvl & frutree_debug) { \
  59                 syslog(LOG_DEBUG, fmt, d1, d2); \
  60         }
  61 #define FRUTREE_DEBUG3(lvl, fmt, d1, d2, d3) \
  62         if (lvl & frutree_debug) { \
  63                 syslog(LOG_DEBUG, fmt, d1, d2, d3); \
  64         }
  65 #define FRUTREE_DEBUG4(lvl, fmt, d1, d2, d3, d4) \
  66         if (lvl & frutree_debug) {\
  67                 syslog(LOG_DEBUG, fmt, d1, d2, d3, d4); \
  68         }
  69 
  70 /* environment variables to tune the variables */
  71 #define FRUTREE_DEBUG           "SUNW_FRUTREE_DEBUG"
  72 #define FRUTREE_POLL_TIMEOUT    "SUNW_FRUTREE_POLL_TIMEOUT"
  73 #define FRUTREE_DRWAIT          "SUNW_FRUTREE_DRWAIT_TIME"
  74 
  75 /* PICL defines */
  76 #define PICL_NODE_CHASSIS               "chassis"
  77 
  78 /* Sanibel specific defines */
  79 #define SANIBEL_PICLNODE_CPU            "CPU"
  80 #define SANIBEL_PICLNODE_PARALLEL       "ecpp"
  81 #define SANIBEL_NETWORK_LABEL           "ENET"
  82 #define SANIBEL_CPCISLOT_TYPE           "cpci"
  83 #define SANIBEL_NETWORK_PORT            "network"
  84 #define SANIBEL_SERIAL_PORT             "serial"
  85 #define SANIBEL_PARALLEL_PORT           "parallel"
  86 #define SANIBEL_SCSI_SLOT               "scsi"
  87 #define SANIBEL_IDE_SLOT                "ide"
  88 #define SANIBEL_UNKNOWN_SLOT            "unknown"
  89 #define DEVICE_CLASS_SCSI               "scsi"
  90 #define DEVICE_CLASS_IDE                "dada"
  91 
  92 #define MAX_BUFSIZE             512
  93 #define SUPER_USER              0
  94 #define DEVFSADM_CMD            "/usr/sbin/devfsadm -i"
  95 #define TEMP_DIR                "/var/tmp/"
  96 #define PROBE_FILE              "probed"
  97 #define NULLREAD                (int (*)(ptree_rarg_t *, void *))0
  98 #define NULLWRITE               (int (*)(ptree_warg_t *, const void *))0
  99 
 100 #define PTREE_CREATE_PROP_FAILED        \
 101         gettext("SUNW_frutree:Error in creating property:%s, "\
 102         "under %s(error=%d)")
 103 #define PTREE_POST_PICLEVENT_ERR        \
 104         gettext("SUNW_frutree:Error in posting picl event %s(%s)(error=%d)")
 105 #define PTREE_EVENT_HANDLING_ERR        \
 106         gettext("SUNW_frutree:Error in handling %s event on %s(error=%d)")
 107 #define GET_LOC_STATE_ERR       \
 108         gettext("SUNW_frutree:Error in getting state info for %s"\
 109         "(location)(error=%d)")
 110 #define GET_FRU_STATE_ERR       \
 111         gettext("SUNW_frutree:Error in getting state for %s(fru)(error=%d)")
 112 #define GET_FRU_COND_ERR        \
 113         gettext("SUNW_frutree:Error in getting condition for %s(fru)(error=%d)")
 114 #define CONNECT_FAILED_ERR      \
 115         gettext("SUNW_frutree:Connect operation on %s failed(error=%d)")
 116 #define CONFIGURE_FAILED_ERR    \
 117         gettext("SUNW_frutree:Configure operation on %s failed(error=%d)")
 118 #define UNCONFIG_FAILED_ERR     \
 119         gettext("SUNW_frutree:Unconfigure operation on %s failed(error=%d)")
 120 #define DISCONNECT_FAILED_ERR   \
 121         gettext("SUNW_frutree:Disconnect operation on %s failed(error=%d)")
 122 #define PROBE_FRU_ERR   \
 123         gettext("SUNW_frutree:Error in probing fru under %s(error=%d)")
 124 #define PTREE_UPDATE_PROP_ERR   \
 125         gettext("SUNW_frutree:Error updating %s of %s(error=%d)")
 126 #define PTREE_GET_PROPVAL_ERR   \
 127         gettext("SUNW_frutree:Error in getting value of %s(%s)(error=%d)")
 128 #define PTREE_DEVICE_CREATE_ERR \
 129         gettext("SUNW_frutree:Error in creating nodes under %s(error=%d)")
 130 #define EVENT_NOT_HANDLED       \
 131         gettext("SUNW_frutree:Error in handling %s on %s(error=%d)")
 132 #define ERROR_REINIT    \
 133         gettext("SUNW_frutree:Error in reinitializing %s")
 134 
 135 typedef enum {
 136         NO_WAIT = 0,
 137         WAIT
 138 } frutree_wait_t;
 139 
 140 typedef uint8_t frutree_frustate_t;
 141 typedef uint8_t frutree_frucond_t;
 142 typedef uint8_t frutree_locstate_t;
 143 typedef uint8_t frutree_port_type_t;
 144 typedef uint8_t frutree_datatype_t;
 145 typedef uint8_t frutree_loctype_t;
 146 
 147 /* valid fru states */
 148 #define FRU_STATE_UNKNOWN               0x0
 149 #define FRU_STATE_CONFIGURED            0x1
 150 #define FRU_STATE_UNCONFIGURED          0x2
 151 #define FRU_STATE_CONFIGURING           0x3
 152 #define FRU_STATE_UNCONFIGURING         0x4
 153 
 154 /* valid fru condition */
 155 #define FRU_COND_UNKNOWN                0x0
 156 #define FRU_COND_FAILED                 0x1
 157 #define FRU_COND_FAILING                0x2
 158 #define FRU_COND_OK                     0x3
 159 #define FRU_COND_TESTING                0x4
 160 
 161 /* port states */
 162 #define PORT_STATE_DOWN                 0x0
 163 #define PORT_STATE_UP                   0x1
 164 #define PORT_STATE_UNKNOWN              0x2
 165 
 166 /* port condition */
 167 #define PORT_COND_OK                    0x0
 168 #define PORT_COND_FAILING               0x1
 169 #define PORT_COND_FAILED                0x2
 170 #define PORT_COND_TESTING               0x3
 171 #define PORT_COND_UNKNOWN               0x4
 172 
 173 /* port types */
 174 #define NETWORK_PORT                    0x0
 175 #define SERIAL_PORT                     0x1
 176 #define PARALLEL_PORT                   0x2
 177 #define UNKNOWN_PORT                    0x4
 178 
 179 /* location states */
 180 #define LOC_STATE_UNKNOWN               0x0
 181 #define LOC_STATE_EMPTY                 0x1
 182 #define LOC_STATE_CONNECTED             0x2
 183 #define LOC_STATE_DISCONNECTED          0x3
 184 #define LOC_STATE_CONNECTING            0x4
 185 #define LOC_STATE_DISCONNECTING         0x5
 186 
 187 /* types of nodes */
 188 #define LOC_TYPE                        0x0
 189 #define FRU_TYPE                        0x1
 190 #define PORT_TYPE                       0x2
 191 
 192 /* location managers */
 193 #define CFGADM_AP                       0x0 /*  managed based on cfgadm data */
 194 #define PLUGIN_PVT                      0x1 /* managed by other plugin */
 195 #define STATIC_LOC                      0x2 /* managed based on libdevinfo */
 196 #define UNKNOWN                         0x3 /* unknown */
 197 
 198 typedef struct conf_cache {
 199         char                    buf[MAX_BUFSIZE];
 200         struct conf_cache       *next;
 201 } frutree_cache_t;
 202 
 203 typedef struct {
 204         picl_nodehdl_t  nodeh;
 205         picl_prophdl_t  device_tblhdl;
 206         picl_prophdl_t  env_tblhdl;
 207         frutree_cache_t *first;
 208         frutree_cache_t *last;
 209         boolean_t       create_cache;
 210 } frutree_device_args_t;
 211 
 212 typedef struct loc_node         frutree_locnode_t;
 213 typedef struct fru_node         frutree_frunode_t;
 214 typedef struct port_node        frutree_portnode_t;
 215 
 216 /* information on a particular location */
 217 struct loc_node {
 218         picl_nodehdl_t locnodeh;        /* handle of the loc node itself */
 219         char *name;
 220         boolean_t cpu_node;
 221         boolean_t dr_in_progress;
 222         boolean_t autoconfig_enabled;
 223         frutree_loctype_t state_mgr;    /* state manager */
 224         frutree_locstate_t state;       /* present state */
 225         frutree_locstate_t prev_state;  /* previous state */
 226         pthread_mutex_t mutex;
 227         pthread_cond_t cond_cv;
 228 };
 229 
 230 /* information on a particular port */
 231 struct port_node {
 232         picl_nodehdl_t portnodeh;
 233         char *name;
 234         int state;
 235         int cond;
 236         uint8_t instance;
 237         char driver[MAXPATHLEN];
 238 };
 239 
 240 /* information on a particular fru */
 241 struct fru_node {
 242         /* variable data */
 243         picl_nodehdl_t frunodeh;
 244         char *name;
 245         frutree_frustate_t state;
 246         frutree_frustate_t prev_state;
 247         frutree_frucond_t cond;
 248         frutree_frucond_t prev_cond;
 249         boolean_t cpu_node;
 250         boolean_t autoconfig_enabled;
 251         boolean_t dr_in_progress;
 252         boolean_t busy;
 253         frutree_loctype_t state_mgr;
 254         char fru_path[MAXPATHLEN];
 255         pthread_mutex_t mutex;
 256         pthread_cond_t  cond_cv;
 257         pthread_cond_t  busy_cond_cv;
 258 };
 259 
 260 #ifdef  __cplusplus
 261 }
 262 #endif
 263 
 264 #endif  /* _PICLFRUTREE_H */