envd.h revision b29b9e18acbca49b266e291e6dc75a886c5d3d2b
2N/A/*
2N/A * CDDL HEADER START
2N/A *
2N/A * The contents of this file are subject to the terms of the
2N/A * Common Development and Distribution License, Version 1.0 only
2N/A * (the "License"). You may not use this file except in compliance
2N/A * with the License.
2N/A *
2N/A * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2N/A * or http://www.opensolaris.org/os/licensing.
2N/A * See the License for the specific language governing permissions
2N/A * and limitations under the License.
2N/A *
2N/A * When distributing Covered Code, include this CDDL HEADER in each
2N/A * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2N/A * If applicable, add the following below this CDDL HEADER, with the
2N/A * fields enclosed by brackets "[]" replaced with your own identifying
2N/A * information: Portions Copyright [yyyy] [name of copyright owner]
2N/A *
2N/A * CDDL HEADER END
2N/A */
2N/A/*
2N/A * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
2N/A * Use is subject to license terms.
2N/A */
2N/A
2N/A#ifndef _ENVD_H
2N/A#define _ENVD_H
2N/A
2N/A#pragma ident "%Z%%M% %I% %E% SMI"
2N/A
2N/A#include <sys/types.h>
2N/A#include <libintl.h>
2N/A
2N/A#ifdef __cplusplus
2N/Aextern "C" {
2N/A#endif
2N/A
2N/A/*
2N/A * Chicago Platform Details
2N/A */
2N/A#define MAX_SENSORS 9
2N/A#define MAX_FANS 6
2N/A
2N/A/*
2N/A * Fan names and ids
2N/A */
2N/A#define ENV_SYSTEM_FAN0 "system-fan0"
2N/A#define ENV_SYSTEM_FAN1 "system-fan1"
2N/A#define ENV_SYSTEM_FAN2 "system-fan2"
2N/A#define ENV_SYSTEM_FAN3 "system-fan3"
2N/A#define ENV_SYSTEM_FAN4 "system-fan4"
2N/A
2N/A#define SYSTEM_FAN0_ID 0
2N/A#define SYSTEM_FAN1_ID 1
2N/A#define SYSTEM_FAN2_ID 2
2N/A#define SYSTEM_FAN3_ID 3
2N/A#define SYSTEM_FAN4_ID 4
2N/A
2N/A#define CPU0_FAN_ID SYSTEM_FAN0_ID
2N/A#define CPU1_FAN_ID SYSTEM_FAN1_ID
2N/A
2N/A/*
2N/A * Sensor names and ids
2N/A */
2N/A#define SENSOR_CPU0 "cpu0"
2N/A#define SENSOR_CPU1 "cpu1"
2N/A#define SENSOR_MB "MotherBoard"
2N/A#define SENSOR_ADT7462 "ADT7462"
2N/A#define SENSOR_LM95221 "LM95221"
2N/A#define SENSOR_FIRE "FireASIC"
2N/A#define SENSOR_LSI1064 "LSI1064"
2N/A#define SENSOR_FRONT_PANEL "Front_panel"
2N/A#define SENSOR_PSU "PSU"
2N/A
2N/A#define CPU0_SENSOR_ID 0
2N/A#define CPU1_SENSOR_ID 1
2N/A#define ADT7462_SENSOR_ID 2
2N/A#define MB_SENSOR_ID 3
2N/A#define LM95221_SENSOR_ID 4
2N/A#define FIRE_SENSOR_ID 5
2N/A#define LSI1064_SENSOR_ID 6
2N/A#define FRONT_PANEL_SENSOR_ID 7
2N/A#define PSU_SENSOR_ID 8
2N/A
2N/A/*
2N/A * Hard disk sensor names and ids
2N/A */
2N/A#define ENV_DISK0 "hard-disk0"
2N/A#define ENV_DISK1 "hard-disk1"
2N/A#define ENV_DISK2 "hard-disk2"
2N/A#define ENV_DISK3 "hard-disk3"
2N/A
2N/A#define DISK0_ID 0
2N/A#define DISK1_ID 1
2N/A#define DISK2_ID 2
2N/A#define DISK3_ID 3
2N/A
2N/A/*
2N/A * Thresholds and other constants
2N/A */
2N/A#define DISK_SCAN_INTERVAL 10
2N/A#define DISK_HIGH_WARN_TEMPERATURE 55
2N/A#define DISK_LOW_WARN_TEMPERATURE 5
2N/A#define DISK_HIGH_SHUTDOWN_TEMPERATURE 60
2N/A#define DISK_LOW_SHUTDOWN_TEMPERATURE 0
2N/A#define DISK_INVALID_TEMP 0xFFFF
2N/A#define LSI1064_VENDOR_ID 0x1000
2N/A#define LSI1064_DEVICE_ID 0x50
2N/A#define FAN_SCAN_INTERVAL 10
2N/A#define SENSOR_SCAN_INTERVAL 2
2N/A#define SENSOR_WARNING_DURATION 4
2N/A#define SENSOR_WARNING_INTERVAL 30
2N/A#define DISK_WARNING_INTERVAL 30
2N/A#define DISK_WARNING_DURATION 20
2N/A#define SENSOR_SHUTDOWN_INTERVAL 60
2N/A#define DISK_SHUTDOWN_INTERVAL 30
2N/A#define ENV_CONF_FILE "envmodel.conf"
2N/A#define TUNABLE_CONF_FILE "piclenvd.conf"
2N/A#define PM_DEVICE "/dev/pm"
2N/A#define SHUTDOWN_CMD "/usr/sbin/shutdown -y -g 60 -i 5"
2N/A#define PICL_PLUGINS_NODE "plugins"
2N/A#define PICL_ENVIRONMENTAL_NODE "environmental"
2N/A
2N/A#define MAX_RETRIES_FOR_FAN_FAULT 10
2N/A#define MAX_FAN_RETRIES 14
2N/A#define MAX_SENSOR_RETRIES 14
2N/A
2N/A#define TACH_TO_RPM(tach) (90000 * 60)/tach
2N/A
2N/A/*
2N/A * constants used for retrieving SMART data
2N/A */
2N/A#define DEFAULT_SCSI_TIMEOUT 60
2N/A#define IEC_PAGE 0x1C
2N/A#define HDA_TEMP 0xc2
2N/A#define DRIVE_TEMP 0xe7
2N/A#define GET_SMART_INFO 0x31
2N/A#define SMART_FIELDS 30
2N/A#define REPORT_ON_REQUEST 0x6
2N/A#define PAGE_FMT 4
2N/A#define IEC_PAGE_SIZE 12
2N/A#define SMART_FLAG_SIZE 2
2N/A#define ATTRIBUTE_DATA_SIZE 8
2N/A#define VENDOR_ATTR_SIZE 131
2N/A#define SMART_RESERVED_SIZE 10
2N/A#define COLLECTION_DATA_SIZE 6
2N/A
2N/A#define DISK0_PHYSPATH \
2N/A "/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@0,0"
2N/A
2N/A#define DISK1_PHYSPATH \
2N/A "/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@1,0"
2N/A
2N/A#define DISK2_PHYSPATH \
2N/A "/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@2,0"
2N/A
2N/A#define DISK3_PHYSPATH \
2N/A "/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@3,0"
2N/A
2N/A#define ENV_DISK0_DEVFS \
2N/A"/devices/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@0,0:a,raw"
2N/A
2N/A#define ENV_DISK1_DEVFS \
2N/A"/devices/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@1,0:a,raw"
2N/A
2N/A#define ENV_DISK2_DEVFS \
2N/A"/devices/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@2,0:a,raw"
2N/A
2N/A#define ENV_DISK3_DEVFS \
2N/A"/devices/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@3,0:a,raw"
2N/A
2N/A#define DISK0_NODE_PATH \
2N/A"name:/platform/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@0,0"
2N/A
2N/A#define DISK1_NODE_PATH \
2N/A"name:/platform/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@1,0"
2N/A
2N/A#define DISK2_NODE_PATH \
2N/A"name:/platform/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@2,0"
2N/A
2N/A#define DISK3_NODE_PATH \
2N/A"name:/platform/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@3,0"
2N/A
2N/A#define SCSI_CONTROLLER_NODE_PATH \
2N/A "name:/platform/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1"
2N/A
2N/A/* CPU Path Names */
2N/A#define CPU0_PATH "_class:/jbus/cpu?ID=0"
2N/A#define CPU1_PATH "_class:/jbus/cpu?ID=1"
2N/A
2N/A#define ENV_MONITOR_DEVFS "/devices/ebus@1f,464000/env-monitor@3,0"
2N/A
2N/A
2N/A/*
2N/A * devfs-path for various fans and their min/max speeds
2N/A */
2N/A#define ENV_SYSTEM_FAN0_DEVFS \
2N/A "/devices/ebus@1f,464000/env-monitor@3,0:fan_0"
2N/A#define ENV_SYSTEM_FAN1_DEVFS \
2N/A "/devices/ebus@1f,464000/env-monitor@3,0:fan_1"
2N/A#define ENV_SYSTEM_FAN2_DEVFS \
2N/A "/devices/ebus@1f,464000/env-monitor@3,0:fan_2"
2N/A#define ENV_SYSTEM_FAN3_DEVFS \
2N/A "/devices/ebus@1f,464000/env-monitor@3,0:fan_3"
2N/A#define ENV_SYSTEM_FAN4_DEVFS \
2N/A "/devices/ebus@1f,464000/env-monitor@3,0:fan_4"
2N/A
2N/A/* MIN and MAX SPEED are in RPM units */
2N/A
2N/A#define CPU_FAN_SPEED_MIN 250
2N/A#define CPU_FAN_SPEED_MAX 5000
2N/A
2N/A#define SYSTEM_FAN_SPEED_MIN 250
2N/A#define SYSTEM_FAN_SPEED_MAX 5000
2N/A
2N/A/*
2N/A * devfs-path for various temperature sensors and CPU platform path
2N/A */
2N/A#define SENSOR_CPU0_DEVFS \
2N/A "/devices/ebus@1f,464000/env-monitor@3,0:cpu_0"
2N/A#define SENSOR_CPU1_DEVFS \
2N/A "/devices/ebus@1f,464000/env-monitor@3,0:cpu_1"
2N/A#define SENSOR_MB_DEVFS \
2N/A "/devices/ebus@1f,464000/env-monitor@3,0:mb"
2N/A#define SENSOR_ADT7462_DEVFS \
2N/A "/devices/ebus@1f,464000/env-monitor@3,0:adt7462"
2N/A#define SENSOR_LM95221_DEVFS \
2N/A "/devices/ebus@1f,464000/env-monitor@3,0:lm95221"
2N/A#define SENSOR_FIRE_DEVFS \
2N/A "/devices/ebus@1f,464000/env-monitor@3,0:fire"
2N/A#define SENSOR_LSI1064_DEVFS \
2N/A "/devices/ebus@1f,464000/env-monitor@3,0:lsi1064"
2N/A#define SENSOR_FRONT_PANEL_DEVFS \
2N/A "/devices/ebus@1f,464000/env-monitor@3,0:front_panel"
2N/A#define SENSOR_PSU_DEVFS \
2N/A "/devices/ebus@1f,464000/env-monitor@3,0:psu"
2N/A
2N/A/*
2N/A * Temperature type
2N/A */
2N/Atypedef int16_t tempr_t;
2N/A
2N/A/*
2N/A * SEEPROM LAYOUT
2N/A *
2N/A * The layout of environmental segment in the SEEPROM in Chicago is as
2N/A * shown below. Note that this is a stripped-down version of the Envseg
2N/A * Definition v2.0 (but compatible). In particular, piclenvd in Chicago
2N/A * does not use the #FanEntries and the list of FANn_ID/FANn_DOFF
2N/A * pairs, and it doesn't use the SensorPolicy and the list of
2N/A * Measured/Corrected pairs for the temperature sensor values either.
2N/A *
2N/A *
2N/A * 0 1 2 3 4 5
2N/A * +---------+------------------+----------+---------+---------+
2N/A * 0x1800: | HDR_TAG | HDR_VER | HDR_LEN | HDR_CRC | N_SEGS |
2N/A * +---------+---------+--------+----------+---------+---------+
2N/A * 0x1806: | SEG1_NAME | SEG1_DESC |
2N/A * +-------------------+-------------------+-------------------+
2N/A * 0x180C: | SEG1_OFF | SEG1_LEN | SEG2_NAME |
2N/A * +-------------------+-------------------+-------------------+
2N/A * ~ ~
2N/A * . .
2N/A * ~ ~
2N/A * +-------------------+-------------------+-------------------+
2N/A * 0xXXXX: | SEGn_OFF | SEGn_LEN |
2N/A * +-------------------+-------------------+
2N/A *
2N/A *
2N/A * +---------+---------+---------------------------------------+
2N/A * ENVSEG_OFF: | ESEG_VER| N_SNSRS | SENSOR1_ID |
2N/A * +---------+---------+---------------------------------------+
2N/A * | SNSR1_DOFF | SENSOR2_ID |
2N/A * +-------------------+---------------------------------------+
2N/A * ~ ~
2N/A * ~ ~
2N/A * +-------------------+---------------------------------------+
2N/A * | SNSRm_DOFF |
2N/A * +-------------------+
2N/A *
2N/A *
2N/A * +---------+---------+--------+----------+---------+---------+
2N/A * SNSRk_DOFF: | HI_POFF | HI_SHUT | HI_WARN| LO_WARN | LO_SHUT | LO_POFF |
2N/A * +-------------------+--------+----------+---------+---------+
2N/A */
2N/A
2N/A#define I2C_DEVFS "/devices/ebus@1f,464000/i2c@3,80"
2N/A#define IOFRU_DEV "front-io-fru-prom@0,a4:front-io-fru-prom"
2N/A#define FRU_SEEPROM_NAME "front-io-fru-prom"
2N/A
2N/A/*
2N/A * SEEPROM section header
2N/A */
2N/A#define SSCN_TAG 0x08
2N/A#define SSCN_VER 0x0001
2N/A#define SSCN_OFFSET 0x1800
2N/Atypedef struct {
2N/A uint8_t sscn_tag; /* section header tag */
2N/A uint8_t sscn_ver[2]; /* section header version */
2N/A uint8_t sscn_len; /* section header length */
2N/A uint8_t sscn_crc; /* unused */
2N/A uint8_t sscn_nsegs; /* total number of segments */
2N/A} seeprom_scn_t;
2N/A
2N/A/*
2N/A * SEEPROM segment header
2N/A */
2N/Atypedef struct {
2N/A uint16_t sseg_name; /* segment name */
2N/A uint16_t sseg_desc[2]; /* segment descriptor */
2N/A uint16_t sseg_off; /* segment data offset */
2N/A uint16_t sseg_len; /* segment length */
2N/A} seeprom_seg_t;
2N/A#define ENVSEG_NAME 0x4553 /* "ES" */
2N/A
2N/A/*
2N/A * Envseg layout V2 (stripped-down version)
2N/A */
2N/Atypedef struct {
2N/A uint8_t esb_high_power_off;
2N/A uint8_t esb_high_shutdown;
2N/A uint8_t esb_high_warning;
2N/A uint8_t esb_low_warning;
2N/A uint8_t esb_low_shutdown;
2N/A uint8_t esb_low_power_off;
2N/A} es_sensor_blk_t;
2N/A
2N/Atypedef struct {
2N/A uint16_t ess_id[2]; /* unique sensor id (on this FRU) */
2N/A uint16_t ess_off; /* sensor data blk offset */
2N/A} es_sensor_t;
2N/A
2N/A#define ENVSEG_VERSION 2
2N/Atypedef struct {
2N/A uint8_t esd_ver; /* envseg version */
2N/A uint8_t esd_nsensors; /* envseg total number of sensor blks */
2N/A es_sensor_t esd_sensors[1]; /* sensor table (variable length) */
2N/A} es_data_t;
2N/A
2N/A/*
2N/A * Macros to fetch 16 and 32 bit msb-to-lsb data from unaligned addresses
2N/A */
2N/A#define GET_UNALIGN16(addr) \
2N/A (((*(uint8_t *)addr) << 8) | *((uint8_t *)addr + 1))
2N/A#define GET_UNALIGN32(addr) \
2N/A (GET_UNALIGN16(addr) << 16) | GET_UNALIGN16((uint8_t *)addr + 2)
2N/A
2N/A/*
2N/A * Macros to check sensor/disk temperatures
2N/A */
2N/A#define SENSOR_TEMP_IN_WARNING_RANGE(val, sensorp) \
2N/A ((val) > (sensorp)->es->esb_high_warning || \
2N/A (val) < (char)((sensorp)->es->esb_low_warning))
2N/A
2N/A#define SENSOR_TEMP_IN_SHUTDOWN_RANGE(val, sensorp) \
2N/A ((val) > (sensorp)->es->esb_high_shutdown || \
2N/A (val) < (char)((sensorp)->es->esb_low_shutdown))
2N/A
2N/A#define DISK_TEMP_IN_WARNING_RANGE(val, diskp) \
2N/A ((val) > (diskp)->high_warning || \
2N/A (val) < (char)((diskp)->low_warning))
2N/A
2N/A#define DISK_TEMP_IN_SHUTDOWN_RANGE(val, diskp) \
2N/A ((val) > (diskp)->high_shutdown || \
2N/A (val) < (char)((diskp)->low_shutdown))
2N/A
2N/A#define SENSOR_WARN 1
2N/A#define SENSOR_OK 0
2N/A
2N/A#define FAN_FAILED 1
2N/A#define FAN_OK 0
2N/A
2N/A/*
2N/A * Default limits for sensors in case environmental segment is absent
2N/A */
2N/A#define CPU0_HIGH_POWER_OFF 105
2N/A#define CPU0_HIGH_SHUTDOWN 100
2N/A#define CPU0_HIGH_WARNING 95
2N/A#define CPU0_LOW_WARNING 5
2N/A#define CPU0_LOW_SHUTDOWN 0
2N/A#define CPU0_LOW_POWER_OFF 0
2N/A
2N/A#define CPU1_HIGH_POWER_OFF 105
2N/A#define CPU1_HIGH_SHUTDOWN 100
2N/A#define CPU1_HIGH_WARNING 95
2N/A#define CPU1_LOW_WARNING 5
2N/A#define CPU1_LOW_SHUTDOWN 0
2N/A#define CPU1_LOW_POWER_OFF 0
2N/A
2N/A#define ADT7462_HIGH_POWER_OFF 80
2N/A#define ADT7462_HIGH_SHUTDOWN 75
2N/A#define ADT7462_HIGH_WARNING 70
2N/A#define ADT7462_LOW_WARNING 5
2N/A#define ADT7462_LOW_SHUTDOWN 0
2N/A#define ADT7462_LOW_POWER_OFF 0
2N/A
2N/A#define MB_HIGH_POWER_OFF 80
2N/A#define MB_HIGH_SHUTDOWN 75
2N/A#define MB_HIGH_WARNING 70
2N/A#define MB_LOW_WARNING 5
2N/A#define MB_LOW_SHUTDOWN 0
2N/A#define MB_LOW_POWER_OFF 0
2N/A
2N/A#define LM95221_HIGH_POWER_OFF 80
2N/A#define LM95221_HIGH_SHUTDOWN 75
2N/A#define LM95221_HIGH_WARNING 70
2N/A#define LM95221_LOW_WARNING 5
2N/A#define LM95221_LOW_SHUTDOWN 0
2N/A#define LM95221_LOW_POWER_OFF 0
2N/A
2N/A#define FIRE_HIGH_POWER_OFF 105
2N/A#define FIRE_HIGH_SHUTDOWN 100
2N/A#define FIRE_HIGH_WARNING 95
2N/A#define FIRE_LOW_WARNING 5
2N/A#define FIRE_LOW_SHUTDOWN 0
2N/A#define FIRE_LOW_POWER_OFF 0
2N/A
2N/A#define LSI1064_HIGH_POWER_OFF 105
2N/A#define LSI1064_HIGH_SHUTDOWN 100
2N/A#define LSI1064_HIGH_WARNING 95
2N/A#define LSI1064_LOW_WARNING 5
2N/A#define LSI1064_LOW_SHUTDOWN 0
2N/A#define LSI1064_LOW_POWER_OFF 0
2N/A
2N/A#define FRONT_PANEL_HIGH_POWER_OFF 75
2N/A#define FRONT_PANEL_HIGH_SHUTDOWN 70
2N/A#define FRONT_PANEL_HIGH_WARNING 60
2N/A#define FRONT_PANEL_LOW_WARNING 5
2N/A#define FRONT_PANEL_LOW_SHUTDOWN 0
2N/A#define FRONT_PANEL_LOW_POWER_OFF 0
2N/A
2N/A#define PSU_HIGH_POWER_OFF 95
2N/A#define PSU_HIGH_SHUTDOWN 85
2N/A#define PSU_HIGH_WARNING 75
2N/A#define PSU_LOW_WARNING 5
2N/A#define PSU_LOW_SHUTDOWN 0
2N/A#define PSU_LOW_POWER_OFF 0
2N/A
2N/A/*
2N/A * Temperature sensor related data structure
2N/A */
2N/Atypedef struct env_sensor {
2N/A char *name; /* sensor name */
2N/A char *devfs_path; /* sensor device devfs path */
2N/A int id;
2N/A int fd; /* device file descriptor */
2N/A es_sensor_blk_t *es;
2N/A int error; /* error flag */
2N/A boolean_t present; /* sensor present */
2N/A tempr_t cur_temp; /* current temperature */
time_t warning_start; /* warning start time (secs) */
time_t warning_tstamp; /* last warning time (secs) */
time_t shutdown_tstamp; /* shutdown temp time (secs) */
boolean_t shutdown_initiated; /* shutdown initated */
} env_sensor_t;
extern env_sensor_t *sensor_lookup(char *sensor_name);
extern int get_temperature(env_sensor_t *, tempr_t *);
typedef struct env_disk {
char *name; /* disk name */
char *devfs_path; /* disk device devfs path */
char *physpath; /* used to be probe for IDLW TIME */
char *nodepath; /* used to detect presence of disk */
uchar_t id;
int fd; /* device file descriptor */
boolean_t present; /* disk present */
boolean_t tpage_supported; /* Temperature page */
boolean_t smart_supported;
int current_temp;
int ref_temp;
int reliability_temp;
uchar_t high_shutdown;
uchar_t high_warning;
uchar_t low_warning;
uchar_t low_shutdown;
time_t warning_start; /* warning start time (secs) */
time_t warning_tstamp; /* last warning time (secs) */
time_t shutdown_tstamp; /* shutdown temp time (secs) */
boolean_t shutdown_initiated; /* shutdown initated */
} env_disk_t;
extern env_disk_t *disk_lookup(char *disk_name);
extern int disk_temperature(env_disk_t *, tempr_t *);
/*
* Fan information data structure
*/
typedef int fanspeed_t;
typedef struct env_fan {
char *name; /* fan name */
char *devfs_path; /* fan device devfs path */
uchar_t id;
fanspeed_t speed_min; /* minimum speed */
fanspeed_t speed_max; /* maximum speed */
int forced_speed; /* forced (fixed) speed */
int fd; /* device file descriptor */
boolean_t present; /* fan present */
int last_status; /* Fan status */
uint8_t cspeed; /* Current speed (tach) */
uint8_t lspeed; /* Last speed (tach) */
} env_fan_t;
/*
* Tuneables
*/
typedef struct env_tuneable {
char *name;
char type;
void *value;
int (*rfunc)(ptree_rarg_t *, void *);
int (*wfunc)(ptree_warg_t *, const void *);
int nbytes;
picl_prophdl_t proph;
} env_tuneable_t;
/*
* Smart structures
*/
typedef struct smart_field {
uint8_t id;
uint8_t flags[SMART_FLAG_SIZE];
uint8_t raw_data[ATTRIBUTE_DATA_SIZE];
uint8_t reserved;
} smart_attribute;
typedef struct smart_struct {
uint16_t revision; /* SMART version # */
struct smart_field attribute[SMART_FIELDS];
/* offline collection information */
uint8_t collection_status[COLLECTION_DATA_SIZE];
uint16_t capability; /* SMART capability */
uint8_t reserved[SMART_RESERVED_SIZE];
uint8_t vendor_specific[VENDOR_ATTR_SIZE];
uint8_t checksum; /* page checksum */
} smart_structure;
extern env_fan_t *fan_lookup(char *fan_name);
extern int get_fan_speed(env_fan_t *, fanspeed_t *);
extern int set_fan_speed(env_fan_t *, fanspeed_t);
extern int env_debug;
extern void envd_log(int pri, const char *fmt, ...);
/*
* Various messages
*/
#define ENVD_PLUGIN_INIT_FAILED \
gettext("SUNW_piclenvd: initialization failed!\n")
#define ENVD_PICL_SETUP_FAILED \
gettext("SUNW_piclenvd: PICL setup failed!\n")
#define PM_THREAD_CREATE_FAILED \
gettext("SUNW_piclenvd: pmthr thread creation failed!\n")
#define PM_THREAD_EXITING \
gettext("SUNW_piclenvd: pmthr exiting! errno:%d %s\n")
#define DISK_TEMP_THREAD_EXITING \
gettext("SUNW_piclenvd: Disk temp thread exiting." \
" Disk temperature will not be monitored. errno:%d %s\n")
#define ENVTHR_THREAD_CREATE_FAILED \
gettext("SUNW_piclenvd: envthr thread creation failed!\n")
#define ENV_SHUTDOWN_MSG \
gettext("SUNW_piclenvd: '%s' sensor temperature %d outside safe " \
"limits (%d...%d). Shutting down the system.\n")
#define ENV_WARNING_MSG \
gettext("SUNW_piclenvd: '%s' sensor temperature %d outside safe " \
"operating limits (%d...%d).\n")
#define ENV_FAN_OPEN_FAIL \
gettext("SUNW_piclenvd: can't open '%s' fan path:%s errno:%d %s\n")
#define ENV_SENSOR_OPEN_FAIL \
gettext("SUNW_piclenvd: can't open '%s' sensor path:%s errno:%d %s\n")
#define ENV_SENSOR_ACCESS_FAIL \
gettext("SUNW_piclenvd: can't access '%s' sensor errno:%d %s\n")
#define ENV_SENSOR_ACCESS_OK \
gettext("SUNW_piclenvd: '%s' sensor is accessible now.\n")
#define ENV_FAN_FAILURE_WARNING_MSG \
gettext("SUNW_piclenvd: %s has Failed.\n" \
"(rpm = %s status = %s)\n")
#define ENV_FAN_OK_MSG \
gettext("SUNW_piclenvd: %s is OKAY.\n")
#define ENV_FRU_OPEN_FAIL \
gettext("SUNW_piclenvd: can't open FRU SEEPROM path:%s errno:%d\n")
#define ENV_FRU_BAD_ENVSEG \
gettext("SUNW_piclenvd: version mismatch or environmental segment " \
"header too short in FRU SEEPROM %s\n")
#define ENV_FRU_BAD_SCNHDR \
gettext("SUNW_piclenvd: invalid section header tag:%x version:%x\n")
#define ENV_FRU_NOMEM_FOR_SEG \
gettext("SUNW_piclenvd: cannot allocate %d bytes for env seg memory\n")
#define ENV_DEFAULT_LIMITS \
gettext("SUNW_piclenvd: error reading ES segment, using defaults\n")
#ifdef __cplusplus
}
#endif
#endif /* _ENVD_H */