text: /*
   * CDDL HEADER START
   *
   * The contents of this file are subject to the terms of the
   * Common Development and Distribution License (the "License").
   * You may not use this file except in compliance with the License.
   *
   * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   * or http://www.opensolaris.org/os/licensing.
   * See the License for the specific language governing permissions
   * and limitations under the License.
   *
   * When distributing Covered Code, include this CDDL HEADER in each
   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
   * If applicable, add the following below this CDDL HEADER, with the
   * fields enclosed by brackets "[]" replaced with your own identifying
   * information: Portions Copyright [yyyy] [name of copyright owner]
   *
   * CDDL HEADER END
   */
  /*
   * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
   * Use is subject to license terms.
   */
  
  #ifndef	_ENVD_H
  #define	_ENVD_H
  
  #include <sys/types.h>
  #include <libintl.h>
  
  #ifdef	__cplusplus
  extern "C" {
  #endif
  
  /*
   * Chicago Platform Details
   */
  #define	MAX_SENSORS		9
  #define	MAX_FANS		6
  
  /*
   * Fan names and ids
   */
  #define	ENV_SYSTEM_FAN0		"system-fan0"
  #define	ENV_SYSTEM_FAN1		"system-fan1"
  #define	ENV_SYSTEM_FAN2		"system-fan2"
  #define	ENV_SYSTEM_FAN3		"system-fan3"
  #define	ENV_SYSTEM_FAN4		"system-fan4"
  
  #define	SYSTEM_FAN0_ID		0
  #define	SYSTEM_FAN1_ID		1
  #define	SYSTEM_FAN2_ID		2
  #define	SYSTEM_FAN3_ID		3
  #define	SYSTEM_FAN4_ID		4
  
  #define	CPU0_FAN_ID		SYSTEM_FAN0_ID
  #define	CPU1_FAN_ID		SYSTEM_FAN1_ID
  
  /*
   * Sensor names and ids
   */
  #define	SENSOR_CPU0		"cpu0"
  #define	SENSOR_CPU1		"cpu1"
  #define	SENSOR_MB		"MotherBoard"
  #define	SENSOR_ADT7462		"ADT7462"
  #define	SENSOR_LM95221		"LM95221"
  #define	SENSOR_FIRE		"FireASIC"
  #define	SENSOR_LSI1064		"LSI1064"
  #define	SENSOR_FRONT_PANEL	"Front_panel"
  #define	SENSOR_PSU		"PSU"
  
  #define	CPU0_SENSOR_ID		0
  #define	CPU1_SENSOR_ID		1
  #define	ADT7462_SENSOR_ID	2
  #define	MB_SENSOR_ID		3
  #define	LM95221_SENSOR_ID	4
  #define	FIRE_SENSOR_ID		5
  #define	LSI1064_SENSOR_ID	6
  #define	FRONT_PANEL_SENSOR_ID	7
  #define	PSU_SENSOR_ID		8
  
  /*
   * Hard disk sensor names and ids
   */
  #define	ENV_DISK0		"hard-disk0"
  #define	ENV_DISK1		"hard-disk1"
  #define	ENV_DISK2		"hard-disk2"
  #define	ENV_DISK3		"hard-disk3"
  
  #define	DISK0_ID		0
  #define	DISK1_ID		1
  #define	DISK2_ID		2
  #define	DISK3_ID		3
  
  /*
   * Thresholds and other constants
   */
  #define	DISK_SCAN_INTERVAL		10
  #define	DISK_HIGH_WARN_TEMPERATURE	55
  #define	DISK_LOW_WARN_TEMPERATURE	5
  #define	DISK_HIGH_SHUTDOWN_TEMPERATURE	60
  #define	DISK_LOW_SHUTDOWN_TEMPERATURE	0
  #define	DISK_INVALID_TEMP		0xFFFF
  #define	LSI1064_VENDOR_ID		0x1000
  #define	LSI1064_DEVICE_ID		0x50
  #define	FAN_SCAN_INTERVAL		10
  #define	SENSOR_SCAN_INTERVAL		2
  #define	SENSOR_WARNING_DURATION		4
  #define	SENSOR_WARNING_INTERVAL		30
  #define	DISK_WARNING_INTERVAL		30
  #define	DISK_WARNING_DURATION		20
  #define	SENSOR_SHUTDOWN_INTERVAL	60
  #define	DISK_SHUTDOWN_INTERVAL		30
  #define	ENV_CONF_FILE			"envmodel.conf"
  #define	TUNABLE_CONF_FILE		"piclenvd.conf"
  #define	PM_DEVICE			"/dev/pm"
  #define	SHUTDOWN_CMD			"/usr/sbin/shutdown -y -g 60 -i 5"
  #define	PICL_PLUGINS_NODE		"plugins"
  #define	PICL_ENVIRONMENTAL_NODE		"environmental"
  
  #define	MAX_RETRIES_FOR_FAN_FAULT	10
  #define	MAX_FAN_RETRIES			14
  #define	MAX_SENSOR_RETRIES		14
  
  #define	TACH_TO_RPM(tach)	(((tach) == 0) ? 0 : (90000 * 60)/(tach))
  
  /*
   * constants used for retrieving SMART data
   */
  #define	DEFAULT_SCSI_TIMEOUT		60
  #define	IEC_PAGE			0x1C
  #define	HDA_TEMP			0xc2
  #define	DRIVE_TEMP			0xe7
  #define	GET_SMART_INFO			0x31
  #define	SMART_FIELDS			30
  #define	REPORT_ON_REQUEST		0x6
  #define	PAGE_FMT			4
  #define	IEC_PAGE_SIZE			12
  #define	SMART_FLAG_SIZE			2
  #define	ATTRIBUTE_DATA_SIZE		8
  #define	VENDOR_ATTR_SIZE		131
  #define	SMART_RESERVED_SIZE		10
  #define	COLLECTION_DATA_SIZE		6
  
  #define	DISK0_PHYSPATH	\
  	"/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@0,0"
  
  #define	DISK1_PHYSPATH	\
  	"/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@1,0"
  
  #define	DISK2_PHYSPATH  \
  	"/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@2,0"
  
  #define	DISK3_PHYSPATH  \
  	"/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@3,0"
  
  #define	ENV_DISK0_DEVFS	\
  "/devices/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@0,0:a,raw"
  
  #define	ENV_DISK1_DEVFS	\
  "/devices/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@1,0:a,raw"
  
  #define	ENV_DISK2_DEVFS \
  "/devices/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@2,0:a,raw"
  
  #define	ENV_DISK3_DEVFS \
  "/devices/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@3,0:a,raw"
  
  #define	DISK0_NODE_PATH	\
  "name:/platform/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@0,0"
  
  #define	DISK1_NODE_PATH	\
  "name:/platform/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@1,0"
  
  #define	DISK2_NODE_PATH \
  "name:/platform/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@2,0"
  
  #define	DISK3_NODE_PATH \
  "name:/platform/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1/sd@3,0"
  
  #define	SCSI_CONTROLLER_NODE_PATH	\
  	"name:/platform/pci@1e,600000/pci@0/pci@9/pci@0/scsi@1"
  
  /* CPU Path Names */
  #define	CPU0_PATH		"_class:/jbus/cpu?ID=0"
  #define	CPU1_PATH		"_class:/jbus/cpu?ID=1"
  
  #define	ENV_MONITOR_DEVFS	"/devices/ebus@1f,464000/env-monitor@3,0"
  
  
  /*
   * devfs-path for various fans and their min/max speeds
   */
  #define	ENV_SYSTEM_FAN0_DEVFS	\
  	"/devices/ebus@1f,464000/env-monitor@3,0:fan_0"
  #define	ENV_SYSTEM_FAN1_DEVFS	\
  	"/devices/ebus@1f,464000/env-monitor@3,0:fan_1"
  #define	ENV_SYSTEM_FAN2_DEVFS	\
  	"/devices/ebus@1f,464000/env-monitor@3,0:fan_2"
  #define	ENV_SYSTEM_FAN3_DEVFS	\
  	"/devices/ebus@1f,464000/env-monitor@3,0:fan_3"
  #define	ENV_SYSTEM_FAN4_DEVFS	\
  	"/devices/ebus@1f,464000/env-monitor@3,0:fan_4"
  
  /* MIN and MAX SPEED are in RPM units */
  
  #define	CPU_FAN_SPEED_MIN	250
  #define	CPU_FAN_SPEED_MAX	5000
  
  #define	SYSTEM_FAN_SPEED_MIN	250
  #define	SYSTEM_FAN_SPEED_MAX	5000
  
  /*
   * devfs-path for various temperature sensors and CPU platform path
   */
  #define	SENSOR_CPU0_DEVFS	\
  	"/devices/ebus@1f,464000/env-monitor@3,0:cpu_0"
  #define	SENSOR_CPU1_DEVFS	\
  	"/devices/ebus@1f,464000/env-monitor@3,0:cpu_1"
  #define	SENSOR_MB_DEVFS	\
  	"/devices/ebus@1f,464000/env-monitor@3,0:mb"
  #define	SENSOR_ADT7462_DEVFS	\
  	"/devices/ebus@1f,464000/env-monitor@3,0:adt7462"
  #define	SENSOR_LM95221_DEVFS	\
  	"/devices/ebus@1f,464000/env-monitor@3,0:lm95221"
  #define	SENSOR_FIRE_DEVFS	\
  	"/devices/ebus@1f,464000/env-monitor@3,0:fire"
  #define	SENSOR_LSI1064_DEVFS	\
  	"/devices/ebus@1f,464000/env-monitor@3,0:lsi1064"
  #define	SENSOR_FRONT_PANEL_DEVFS	\
  	"/devices/ebus@1f,464000/env-monitor@3,0:front_panel"
  #define	SENSOR_PSU_DEVFS	\
  	"/devices/ebus@1f,464000/env-monitor@3,0:psu"
  
  /*
   * Temperature type
   */
  typedef int16_t tempr_t;
  
  /*
   *				SEEPROM LAYOUT
   *
   *      The layout of environmental segment in the SEEPROM in Chicago is as
   *      shown below. Note that this is a stripped-down version of the Envseg
   *      Definition v2.0 (but compatible). In particular, piclenvd in Chicago
   *      does not use the #FanEntries and the list of FANn_ID/FANn_DOFF
   *      pairs, and it doesn't use the SensorPolicy and the list of
   *      Measured/Corrected pairs for the temperature sensor values either.
   *
   *
   *                   0         1         2         3         4         5
   *		+---------+------------------+----------+---------+---------+
   *	0x1800:	| HDR_TAG |      HDR_VER     |  HDR_LEN | HDR_CRC |  N_SEGS |
   *		+---------+---------+--------+----------+---------+---------+
   *	0x1806:	|     SEG1_NAME	    |	            SEG1_DESC               |
   *		+-------------------+-------------------+-------------------+
   *	0x180C:	|     SEG1_OFF	    |	  SEG1_LEN	|      SEG2_NAME    |
   *		+-------------------+-------------------+-------------------+
   *		~							    ~
   *		.							    .
   *		~							    ~
   *		+-------------------+-------------------+-------------------+
   *	0xXXXX:	|     SEGn_OFF	    |	  SEGn_LEN	|
   *		+-------------------+-------------------+
   *
   *
   *              +---------+---------+---------------------------------------+
   *  ENVSEG_OFF:	| ESEG_VER| N_SNSRS |            SENSOR1_ID                 |
   *              +---------+---------+---------------------------------------+
   *	        |    SNSR1_DOFF     |            SENSOR2_ID                 |
   *              +-------------------+---------------------------------------+
   *		~							    ~
   *		~							    ~
   *		+-------------------+---------------------------------------+
   *	        |    SNSRm_DOFF     |
   *              +-------------------+
   *
   *
   *		+---------+---------+--------+----------+---------+---------+
   * SNSRk_DOFF:	| HI_POFF | HI_SHUT | HI_WARN| LO_WARN  | LO_SHUT | LO_POFF |
   *              +-------------------+--------+----------+---------+---------+
   */
  
  #define	I2C_DEVFS		"/devices/ebus@1f,464000/i2c@3,80"
  #define	IOFRU_DEV		"front-io-fru-prom@0,a4:front-io-fru-prom"
  #define	FRU_SEEPROM_NAME	"front-io-fru-prom"
  
  /*
   * SEEPROM section header
   */
  #define	SSCN_TAG	0x08
  #define	SSCN_VER	0x0001
  #define	SSCN_OFFSET	0x1800
  typedef struct {
  	uint8_t sscn_tag;		/* section header tag */
  	uint8_t sscn_ver[2];		/* section header version */
  	uint8_t sscn_len;		/* section header length */
  	uint8_t sscn_crc;		/* unused */
  	uint8_t sscn_nsegs;		/* total number of segments */
  } seeprom_scn_t;
  
  /*
   * SEEPROM segment header
   */
  typedef struct {
  	uint16_t sseg_name;		/* segment name */
  	uint16_t sseg_desc[2];		/* segment descriptor */
  	uint16_t sseg_off;		/* segment data offset */
  	uint16_t sseg_len;		/* segment length */
  } seeprom_seg_t;
  #define	ENVSEG_NAME	0x4553		/* "ES" */
  
  /*
   * Envseg layout V2 (stripped-down version)
   */
  typedef struct {
  	uint8_t esb_high_power_off;
  	uint8_t esb_high_shutdown;
  	uint8_t esb_high_warning;
  	uint8_t esb_low_warning;
  	uint8_t esb_low_shutdown;
  	uint8_t esb_low_power_off;
  } es_sensor_blk_t;
  
  typedef struct {
  	uint16_t ess_id[2];		/* unique sensor id (on this FRU) */
  	uint16_t ess_off;		/* sensor data blk offset */
  } es_sensor_t;
  
  #define	ENVSEG_VERSION	2
  typedef struct {
  	uint8_t esd_ver;		/* envseg version */
  	uint8_t esd_nsensors;		/* envseg total number of sensor blks */
  	es_sensor_t esd_sensors[1];	/* sensor table (variable length) */
  } es_data_t;
  
  /*
   * Macros to fetch 16 and 32 bit msb-to-lsb data from unaligned addresses
   */
  #define	GET_UNALIGN16(addr)	\
  	(((*(uint8_t *)addr) << 8) | *((uint8_t *)addr + 1))
  #define	GET_UNALIGN32(addr)	\
  	(GET_UNALIGN16(addr) << 16) | GET_UNALIGN16((uint8_t *)addr + 2)
  
  /*
   * Macros to check sensor/disk temperatures
   */
  #define	SENSOR_TEMP_IN_WARNING_RANGE(val, sensorp) \
  	((val) > (sensorp)->es->esb_high_warning || \
  	(val) < (char)((sensorp)->es->esb_low_warning))
  
  #define	SENSOR_TEMP_IN_SHUTDOWN_RANGE(val, sensorp) \
  	((val) > (sensorp)->es->esb_high_shutdown || \
  	(val) < (char)((sensorp)->es->esb_low_shutdown))
  
  #define	DISK_TEMP_IN_WARNING_RANGE(val, diskp) \
  	((val) > (diskp)->high_warning || \
  	(val) < (char)((diskp)->low_warning))
  
  #define	DISK_TEMP_IN_SHUTDOWN_RANGE(val, diskp) \
  	((val) > (diskp)->high_shutdown || \
  	(val) < (char)((diskp)->low_shutdown))
  
  #define	SENSOR_WARN		1
  #define	SENSOR_OK		0
  
  #define	FAN_FAILED		1
  #define	FAN_OK			0
  
  /*
   * Default limits for sensors in case environmental segment is absent
   */
  #define	CPU0_HIGH_POWER_OFF		105
  #define	CPU0_HIGH_SHUTDOWN		100
  #define	CPU0_HIGH_WARNING		95
  #define	CPU0_LOW_WARNING		5
  #define	CPU0_LOW_SHUTDOWN		0
  #define	CPU0_LOW_POWER_OFF		0
  
  #define	CPU1_HIGH_POWER_OFF		105
  #define	CPU1_HIGH_SHUTDOWN		100
  #define	CPU1_HIGH_WARNING		95
  #define	CPU1_LOW_WARNING		5
  #define	CPU1_LOW_SHUTDOWN		0
  #define	CPU1_LOW_POWER_OFF		0
  
  #define	ADT7462_HIGH_POWER_OFF		80
  #define	ADT7462_HIGH_SHUTDOWN		75
  #define	ADT7462_HIGH_WARNING		70
  #define	ADT7462_LOW_WARNING		5
  #define	ADT7462_LOW_SHUTDOWN		0
  #define	ADT7462_LOW_POWER_OFF		0
  
  #define	MB_HIGH_POWER_OFF		80
  #define	MB_HIGH_SHUTDOWN		75
  #define	MB_HIGH_WARNING			70
  #define	MB_LOW_WARNING			5
  #define	MB_LOW_SHUTDOWN			0
  #define	MB_LOW_POWER_OFF		0
  
  #define	LM95221_HIGH_POWER_OFF		80
  #define	LM95221_HIGH_SHUTDOWN		75
  #define	LM95221_HIGH_WARNING		70
  #define	LM95221_LOW_WARNING		5
  #define	LM95221_LOW_SHUTDOWN		0
  #define	LM95221_LOW_POWER_OFF		0
  
  #define	FIRE_HIGH_POWER_OFF		105
  #define	FIRE_HIGH_SHUTDOWN		100
  #define	FIRE_HIGH_WARNING		95
  #define	FIRE_LOW_WARNING		5
  #define	FIRE_LOW_SHUTDOWN		0
  #define	FIRE_LOW_POWER_OFF		0
  
  #define	LSI1064_HIGH_POWER_OFF		105
  #define	LSI1064_HIGH_SHUTDOWN		100
  #define	LSI1064_HIGH_WARNING		95
  #define	LSI1064_LOW_WARNING		5
  #define	LSI1064_LOW_SHUTDOWN		0
  #define	LSI1064_LOW_POWER_OFF		0
  
  #define	FRONT_PANEL_HIGH_POWER_OFF	75
  #define	FRONT_PANEL_HIGH_SHUTDOWN	70
  #define	FRONT_PANEL_HIGH_WARNING	60
  #define	FRONT_PANEL_LOW_WARNING		5
  #define	FRONT_PANEL_LOW_SHUTDOWN	0
  #define	FRONT_PANEL_LOW_POWER_OFF	0
  
  #define	PSU_HIGH_POWER_OFF		95
  #define	PSU_HIGH_SHUTDOWN		85
  #define	PSU_HIGH_WARNING		75
  #define	PSU_LOW_WARNING			5
  #define	PSU_LOW_SHUTDOWN		0
  #define	PSU_LOW_POWER_OFF		0
  
  /*
   * Temperature sensor related data structure
   */
  typedef struct env_sensor {
  	char		*name;			/* sensor name */
  	char		*devfs_path;		/* sensor device devfs path */
  	int		id;
  	int		fd;			/* device file descriptor */
  	es_sensor_blk_t	*es;
  	int		error;			/* error flag */
  	boolean_t 	present;		/* sensor present */
  	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 */
  