3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * CDDL HEADER START
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * The contents of this file are subject to the terms of the
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Common Development and Distribution License (the "License").
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * You may not use this file except in compliance with the License.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * or http://www.opensolaris.org/os/licensing.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * See the License for the specific language governing permissions
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * and limitations under the License.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * When distributing Covered Code, include this CDDL HEADER in each
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * If applicable, add the following below this CDDL HEADER, with the
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * fields enclosed by brackets "[]" replaced with your own identifying
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * information: Portions Copyright [yyyy] [name of copyright owner]
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * CDDL HEADER END
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
193974072f41a843678abf5f61979c748687e66bSherry Moore * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Use is subject to license terms.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/types.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/stat.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/conf.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/modctl.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/callb.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/strlog.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/cyclic.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/rmc_comm_dp.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/rmc_comm_dp_boot.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/rmc_comm_drvintf.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/rmc_comm.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/machsystm.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/sysevent.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/sysevent/dr.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/sysevent/env.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/sysevent/eventdefs.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/file.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/disp.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/reboot.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/envmon.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/rmclomv_impl.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/cpu_sgnblk_defs.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/utsname.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/systeminfo.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/ddi.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/time.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#include <sys/promif.h>
5c5f137104b2d56181283389fa902220f2023809Richard Lowe#include <sys/sysmacros.h>
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define RMCRESBUFLEN 1024
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define DATE_TIME_MSG_SIZE 78
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define RMCLOMV_WATCHDOG_MODE "rmclomv-watchdog-mode"
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank#define DELAY_TIME 5000000 /* 5 seconds, in microseconds */
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank#define CPU_SIGNATURE_DELAY_TIME 5000000 /* 5 secs, in microsecs */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelextern void pmugpio_watchdog_pat();
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelextern int watchdog_activated;
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int last_watchdog_msg = 1;
3db86aab554edbb4244c8d1a1c90f152eee768afstevelextern int watchdog_enable;
3db86aab554edbb4244c8d1a1c90f152eee768afstevelextern int boothowto;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelint rmclomv_watchdog_mode;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * functions local to this driver.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int rmclomv_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel void **resultp);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int rmclomv_attach(dev_info_t *dip, ddi_attach_cmd_t cmd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int rmclomv_detach(dev_info_t *dip, ddi_detach_cmd_t cmd);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic uint_t rmclomv_break_intr(caddr_t arg);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int rmclomv_add_intr_handlers(void);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int rmclomv_remove_intr_handlers(void);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic uint_t rmclomv_event_data_handler(char *);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void rmclomv_dr_data_handler(const char *, int);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int rmclomv_open(dev_t *dev_p, int flag, int otyp, cred_t *cred_p);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int rmclomv_close(dev_t dev, int flag, int otyp, cred_t *cred_p);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int rmclomv_ioctl(dev_t dev, int cmd, intptr_t arg, int mode,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cred_t *cred_p, int *rval_p);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void rmclomv_checkrmc_start(void);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void rmclomv_checkrmc_destroy(void);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void rmclomv_checkrmc_wakeup(void *);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void rmclomv_refresh_start(void);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void rmclomv_refresh_destroy(void);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void rmclomv_refresh_wakeup(void);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void rmclomv_reset_cache(rmclomv_cache_section_t *new_chain,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_section_t *new_subchain, dp_get_sysinfo_r_t *sysinfo);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic rmclomv_cache_section_t *rmclomv_find_section(
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_section_t *start, uint16_t sensor);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic rmclomv_cache_section_t *create_cache_section(int sensor_type, int num);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int get_sensor_by_name(const rmclomv_cache_section_t *section,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *name, int *index);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int validate_section_entry(rmclomv_cache_section_t *section,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int index);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int add_names_to_section(rmclomv_cache_section_t *section);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void free_section(rmclomv_cache_section_t *section);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void add_section(rmclomv_cache_section_t **head,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_section_t *section);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int rmclomv_do_cmd(int req_cmd, int resp_cmd, int resp_len,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel intptr_t arg_req, intptr_t arg_res);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void refresh_name_cache(int force_fail);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void set_val_unav(envmon_sensor_t *sensor);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void set_fan_unav(envmon_fan_t *fan);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int do_psu_cmd(intptr_t arg, int mode, envmon_indicator_t *env_ind,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_psu_status_t *rmc_psu, dp_get_psu_status_r_t *rmc_psu_r,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int detector_type);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic uint_t rmc_set_watchdog_timer(uint_t timeoutval);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic uint_t rmc_clear_watchdog_timer(void);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void send_watchdog_msg(int msg);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void plat_timesync(void *arg);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic kmutex_t timesync_lock;
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic clock_t timesync_interval = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic timeout_id_t timesync_tid = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Driver entry points
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic struct cb_ops rmclomv_cb_ops = {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_open, /* open */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_close, /* close */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nodev, /* strategy() */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nodev, /* print() */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nodev, /* dump() */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nodev, /* read() */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nodev, /* write() */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_ioctl, /* ioctl() */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nodev, /* devmap() */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nodev, /* mmap() */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ddi_segmap, /* segmap() */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nochpoll, /* poll() */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ddi_prop_op, /* prop_op() */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel NULL, /* cb_str */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel D_NEW | D_MP /* cb_flag */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel};
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic struct dev_ops rmclomv_ops = {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DEVO_REV,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel 0, /* ref count */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_getinfo, /* getinfo() */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nulldev, /* identify() */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nulldev, /* probe() */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_attach, /* attach() */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_detach, /* detach */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nodev, /* reset */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel &rmclomv_cb_ops, /* pointer to cb_ops structure */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (struct bus_ops *)NULL,
193974072f41a843678abf5f61979c748687e66bSherry Moore nulldev, /* power() */
193974072f41a843678abf5f61979c748687e66bSherry Moore ddi_quiesce_not_supported, /* devo_quiesce */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel};
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Loadable module support.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelextern struct mod_ops mod_driverops;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic struct modldrv modldrv = {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel &mod_driverops, /* Type of module. This is a driver */
193974072f41a843678abf5f61979c748687e66bSherry Moore "rmclomv control driver", /* Name of the module */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel &rmclomv_ops /* pointer to the dev_ops structure */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel};
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic struct modlinkage modlinkage = {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel MODREV_1,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel &modldrv,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel NULL
3db86aab554edbb4244c8d1a1c90f152eee768afstevel};
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Device info
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic dev_info_t *rmclomv_dip = NULL;
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int rmclomv_break_requested = B_FALSE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic ddi_softintr_t rmclomv_softintr_id;
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic ddi_iblock_cookie_t rmclomv_soft_iblock_cookie;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelextern void (*abort_seq_handler)();
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/* key_position is effective key-position. Set to locked if unknown */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic rsci8 key_position = RMC_KEYSWITCH_POS_LOCKED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/* real_key_position starts off as unknown and records value actually seen */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic rsci8 real_key_position = RMC_KEYSWITCH_POS_UNKNOWN;
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void rmclomv_abort_seq_handler(char *msg);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * mutexes which protect the interrupt handlers.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic kmutex_t rmclomv_event_hdlr_lock;
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic kmutex_t rmclomv_refresh_lock;
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic kcondvar_t rmclomv_refresh_sig_cv;
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic kmutex_t rmclomv_checkrmc_lock;
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic kcondvar_t rmclomv_checkrmc_sig_cv;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * mutex to protect the handle_name cache
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic kmutex_t rmclomv_cache_lock;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * mutex to protect the RMC state
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic kmutex_t rmclomv_state_lock;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Payloads of the event handlers.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic dp_event_notification_t rmclomv_event_payload;
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic rmc_comm_msg_t rmclomv_event_payload_msg;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Checkrmc commands..
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define RMCLOMV_CHECKRMC_EXITNOW (-1)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define RMCLOMV_CHECKRMC_WAIT 0
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define RMCLOMV_CHECKRMC_PROCESSNOW 1
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Checkrmc thread state
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int rmclomv_checkrmc_sig = RMCLOMV_CHECKRMC_WAIT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic kt_did_t rmclomv_checkrmc_tid = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * RMC state data
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define RMCLOMV_RMCSTATE_UNKNOWN 0
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define RMCLOMV_RMCSTATE_OK 1
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define RMCLOMV_RMCSTATE_FAILED 2
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define RMCLOMV_RMCSTATE_DOWNLOAD 3
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * RMC error indicator values (status from last RMC command)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define RMCLOMV_RMCERROR_NONE 0
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/* fail RMC after 5 minutes without a good response */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define RMCLOMV_RMCFAILTHRESHOLD 5
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * rmclomv_rmc_state is the state reported in OperationalStatus.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * rmclomv_rmc_error reflects the result of the last RMC interaction.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * rmclomv_rmcfailcount is used by the rmclomv_checkrmc thread to count
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * failures in its regular status polls. Once RMCLOMV_RMCFAILTHRESHOLD
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * is reached, rmclomv_rmc_state is marked as RMCLOMV_RMCSTATE_FAILED.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int rmclomv_rmc_state = RMCLOMV_RMCSTATE_UNKNOWN;
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int rmclomv_rmc_error = RMCLOMV_RMCERROR_NONE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int rmclomv_rmcfailcount;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Refresh commands..
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define RMCLOMV_REFRESH_EXITNOW (-1)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define RMCLOMV_REFRESH_WAIT 0
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define RMCLOMV_REFRESH_PROCESSNOW 1
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Refresh thread state
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int rmclomv_refresh_sig = RMCLOMV_REFRESH_WAIT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic kt_did_t rmclomv_refresh_tid = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * timeout id
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic timeout_id_t timer_id;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Handle-name cache
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define LOCK_CACHE mutex_enter(&rmclomv_cache_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define RELEASE_CACHE mutex_exit(&rmclomv_cache_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic rmclomv_cache_section_t *rmclomv_cache; /* main handle-names */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic rmclomv_cache_section_t *rmclomv_subcache; /* derived names */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic dp_get_sysinfo_r_t rmclomv_sysinfo_data;
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic boolean_t rmclomv_sysinfo_valid;
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int rmclomv_cache_valid;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelextern pri_t maxclsyspri;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * static strings
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char str_percent[] = "%";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char str_rpm[] = " rpm";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char str_ip_volts_ind[] = "P_PWR";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char str_ip2_volts_ind[] = "P_PWR2";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char str_ff_pok_ind[] = "FF_POK";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char str_vlo_volts_ind[] = "FF_UV";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char str_vhi_volts_ind[] = "FF_OV";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char str_chi_amps_ind[] = "FF_OC";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char str_chi_nr_ind[] = "FF_NR";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char str_ot_tmpr_ind[] = "FF_OT";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char str_fan_ind[] = "FF_FAN";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char str_pdct_fan_ind[] = "FF_PDCT_FAN";
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic const char str_sc[] = "SC";
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelint
3db86aab554edbb4244c8d1a1c90f152eee768afstevel_init(void)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int error = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_init(&rmclomv_event_hdlr_lock, NULL, MUTEX_DEFAULT, NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_init(&rmclomv_checkrmc_lock, NULL, MUTEX_DRIVER, NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_init(&rmclomv_refresh_lock, NULL, MUTEX_DRIVER, NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_init(&rmclomv_cache_lock, NULL, MUTEX_DRIVER, NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_init(&rmclomv_state_lock, NULL, MUTEX_DRIVER, NULL);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mutex_init(&timesync_lock, NULL, MUTEX_DEFAULT, NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cv_init(&rmclomv_checkrmc_sig_cv, NULL, CV_DRIVER, NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cv_init(&rmclomv_refresh_sig_cv, NULL, CV_DRIVER, NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel error = mod_install(&modlinkage);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (error) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cv_destroy(&rmclomv_refresh_sig_cv);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cv_destroy(&rmclomv_checkrmc_sig_cv);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_destroy(&rmclomv_state_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_destroy(&rmclomv_cache_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_destroy(&rmclomv_refresh_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_destroy(&rmclomv_checkrmc_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_destroy(&rmclomv_event_hdlr_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (error);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelint
3db86aab554edbb4244c8d1a1c90f152eee768afstevel_info(struct modinfo *modinfop)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (mod_info(&modlinkage, modinfop));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelint
3db86aab554edbb4244c8d1a1c90f152eee768afstevel_fini(void)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int error = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel error = mod_remove(&modlinkage);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (error)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (error);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cv_destroy(&rmclomv_refresh_sig_cv);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cv_destroy(&rmclomv_checkrmc_sig_cv);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mutex_destroy(&timesync_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_destroy(&rmclomv_state_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_destroy(&rmclomv_cache_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_destroy(&rmclomv_refresh_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_destroy(&rmclomv_checkrmc_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_destroy(&rmclomv_event_hdlr_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (error);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/* ARGSUSED */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmclomv_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **resultp)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel minor_t m = getminor((dev_t)arg);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (cmd) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DDI_INFO_DEVT2DEVINFO:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((m != 0) || (rmclomv_dip == NULL)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *resultp = NULL;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_FAILURE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *resultp = rmclomv_dip;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_SUCCESS);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DDI_INFO_DEVT2INSTANCE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *resultp = (void *)(uintptr_t)m;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_SUCCESS);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_FAILURE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmclomv_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int instance;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int err;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *wdog_state;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int attaching = 1;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (cmd) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DDI_ATTACH:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * only allow one instance
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel instance = ddi_get_instance(dip);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (instance != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_FAILURE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = ddi_create_minor_node(dip, "rmclomv", S_IFCHR,
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank instance, DDI_PSEUDO, NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (err != DDI_SUCCESS)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_FAILURE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Register with rmc_comm to prevent it being detached
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * (in the unlikely event that its attach succeeded on a
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * platform whose platmod doesn't lock it down).
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = rmc_comm_register();
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (err != DDI_SUCCESS) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ddi_remove_minor_node(dip, NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_FAILURE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* Remember the dev info */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_dip = dip;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Add the handlers which watch for unsolicited messages
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * and post event to Sysevent Framework.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = rmclomv_add_intr_handlers();
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (err != DDI_SUCCESS) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_comm_unregister();
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ddi_remove_minor_node(dip, NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_dip = NULL;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_FAILURE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_checkrmc_start();
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_refresh_start();
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel abort_seq_handler = rmclomv_abort_seq_handler;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ddi_report_dev(dip);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Check whether we have an application watchdog
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ddi_prop_lookup_string(DDI_DEV_T_ANY, dip,
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank DDI_PROP_DONTPASS, RMCLOMV_WATCHDOG_MODE,
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank &wdog_state) == DDI_PROP_SUCCESS) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (strcmp(wdog_state, "app") == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_watchdog_mode = 1;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel watchdog_enable = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_watchdog_mode = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ddi_prop_free(wdog_state);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel tod_ops.tod_set_watchdog_timer = rmc_set_watchdog_timer;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel tod_ops.tod_clear_watchdog_timer = rmc_clear_watchdog_timer;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Now is a good time to activate hardware watchdog
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * (if one exists).
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_enter(&tod_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (watchdog_enable && tod_ops.tod_set_watchdog_timer != NULL)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = tod_ops.tod_set_watchdog_timer(0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_exit(&tod_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (err != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel printf("Hardware watchdog enabled\n");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Set time interval and start timesync routine.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Also just this once set the Solaris clock
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * to the RMC clock.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel timesync_interval = drv_usectohz(5*60 * MICROSEC);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel plat_timesync((void *) &attaching);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_SUCCESS);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DDI_RESUME:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_SUCCESS);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_FAILURE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmclomv_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng timeout_id_t tid;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng int instance;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng int err;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (cmd) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DDI_DETACH:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel instance = ddi_get_instance(dip);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (instance != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_FAILURE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Remove the handlers which watch for unsolicited messages
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * and post event to Sysevent Framework.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = rmclomv_remove_intr_handlers();
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (err != DDI_SUCCESS) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN, "Failed to remove event handlers");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_FAILURE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_checkrmc_destroy();
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_refresh_destroy();
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_reset_cache(NULL, NULL, NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ddi_remove_minor_node(dip, NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mutex_enter(&timesync_lock);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng tid = timesync_tid;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng timesync_tid = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng timesync_interval = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mutex_exit(&timesync_lock);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng (void) untimeout(tid);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* Forget the dev info */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_dip = NULL;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_comm_unregister();
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_SUCCESS);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DDI_SUSPEND:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_SUCCESS);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_FAILURE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmclomv_add_intr_handlers()
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int err;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ddi_get_soft_iblock_cookie(rmclomv_dip, DDI_SOFTINT_HIGH,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel &rmclomv_soft_iblock_cookie) != DDI_SUCCESS) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_FAILURE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = ddi_add_softintr(rmclomv_dip, DDI_SOFTINT_HIGH,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel &rmclomv_softintr_id, &rmclomv_soft_iblock_cookie, NULL,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_break_intr, NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (err != DDI_SUCCESS)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_FAILURE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_event_payload_msg.msg_buf = (caddr_t)&rmclomv_event_payload;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_event_payload_msg.msg_len = sizeof (rmclomv_event_payload);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = rmc_comm_reg_intr(DP_RMC_EVENTS, rmclomv_event_data_handler,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel &rmclomv_event_payload_msg, NULL, &rmclomv_event_hdlr_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (err != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ddi_remove_softintr(rmclomv_softintr_id);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_FAILURE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_SUCCESS);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmclomv_remove_intr_handlers(void)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int err = rmc_comm_unreg_intr(DP_RMC_EVENTS,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_event_data_handler);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (err != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN, "Failed to unregister DP_RMC_EVENTS "
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank "handler. Err=%d", err);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_FAILURE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ddi_remove_softintr(rmclomv_softintr_id);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_SUCCESS);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmclomv_abort_seq_handler(char *msg)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (key_position == RMC_KEYSWITCH_POS_LOCKED)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_CONT, "KEY in LOCKED position, "
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank "ignoring debug enter sequence");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_break_requested = B_TRUE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (msg != NULL)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel prom_printf("%s\n", msg);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ddi_trigger_softintr(rmclomv_softintr_id);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/* ARGSUSED */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic uint_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmclomv_break_intr(caddr_t arg)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rmclomv_break_requested) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_break_requested = B_FALSE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel debug_enter(NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_INTR_CLAIMED);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_INTR_UNCLAIMED);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Create a cache section structure
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic rmclomv_cache_section_t *
3db86aab554edbb4244c8d1a1c90f152eee768afstevelcreate_cache_section(int sensor_type, int num)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel size_t len = offsetof(rmclomv_cache_section_t, entry[0]) +
3db86aab554edbb4244c8d1a1c90f152eee768afstevel num * sizeof (rmclomv_cache_entry_t);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_section_t *ptr = kmem_zalloc(len, KM_SLEEP);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ptr->next_section = NULL;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ptr->sensor_type = sensor_type;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ptr->num_entries = num;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ptr->section_len = len;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ptr);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Free a cache_section.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelfree_section(rmclomv_cache_section_t *section)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel size_t len = section->section_len;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel kmem_free(section, len);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * adds supplied section to end of cache chain
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * must be called with cache locked
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afsteveladd_section(rmclomv_cache_section_t **head, rmclomv_cache_section_t *section)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section->next_section = *head;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *head = section;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * This function releases all cache sections and exchanges the two
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * chain heads for new values.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmclomv_reset_cache(rmclomv_cache_section_t *new_chain,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_section_t *new_subchain, dp_get_sysinfo_r_t *sysinfo)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_section_t *first;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_section_t *sub_first;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_section_t *next;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel LOCK_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_valid = (new_chain != NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel first = rmclomv_cache;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache = new_chain;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sub_first = rmclomv_subcache;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_subcache = new_subchain;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (sysinfo == NULL)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel bzero(&rmclomv_sysinfo_data, sizeof (rmclomv_sysinfo_data));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel bcopy(sysinfo, &rmclomv_sysinfo_data,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (rmclomv_sysinfo_data));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_sysinfo_valid = (sysinfo != NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RELEASE_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel while (first != NULL) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel next = first->next_section;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel free_section(first);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel first = next;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel while (sub_first != NULL) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel next = sub_first->next_section;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel free_section(sub_first);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sub_first = next;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * cache must be locked before calling rmclomv_find_section
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic rmclomv_cache_section_t *
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmclomv_find_section(rmclomv_cache_section_t *start, uint16_t sensor)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_section_t *next = start;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel while ((next != NULL) && (next->sensor_type != sensor))
3db86aab554edbb4244c8d1a1c90f152eee768afstevel next = next->next_section;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (next);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Return a string presenting the keyswitch position
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * For unknown values returns "Unknown"
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic char *
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmclomv_key_position(enum rmc_keyswitch_pos pos)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (pos) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMC_KEYSWITCH_POS_NORMAL:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return ("NORMAL");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMC_KEYSWITCH_POS_DIAG:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return ("DIAG");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMC_KEYSWITCH_POS_LOCKED:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return ("LOCKED");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMC_KEYSWITCH_POS_OFF:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return ("STBY");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return ("UNKNOWN");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * The sensor id name is sought in the supplied section and if found
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * its index within the section is written to *index.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Return value is zero for success, otherwise -1.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * The cache must be locked before calling get_sensor_by_name
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int
3db86aab554edbb4244c8d1a1c90f152eee768afstevelget_sensor_by_name(const rmclomv_cache_section_t *section,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel const char *name, int *index)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int i;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (i = 0; i < section->num_entries; i++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (strcmp(name, section->entry[i].handle_name.name) == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *index = i;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *index = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (-1);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * fills in the envmon_handle name
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * if it is unknown (not cached), the dp_handle_t is returned as a hex-digit
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * string
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmclomv_hdl_to_envhdl(dp_handle_t hdl, envmon_handle_t *envhdl)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_section_t *next;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int i;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel LOCK_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (next = rmclomv_cache; next != NULL; next = next->next_section) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (i = 0; i < next->num_entries; i++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (next->entry[i].handle == hdl) {
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank *envhdl = next->entry[i].handle_name;
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank RELEASE_CACHE
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank return;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Sought handle not currently cached.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RELEASE_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) snprintf(envhdl->name, sizeof (envhdl->name),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "Unknown SC node 0x%x", hdl);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmclomv_dr_data_handler(const char *fru_name, int hint)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int err = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nvlist_t *attr_list;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char attach_pnt[MAXPATHLEN];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) snprintf(attach_pnt, sizeof (attach_pnt), "%s", fru_name);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = nvlist_alloc(&attr_list, NV_UNIQUE_NAME_TYPE, KM_NOSLEEP);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (err != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "Failed to allocate name-value list for %s event", EC_DR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = nvlist_add_string(attr_list, DR_AP_ID, attach_pnt);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (err != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN, "Failed to add attr [%s] for %s event",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DR_AP_ID, EC_DR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nvlist_free(attr_list);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Add the hint
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = nvlist_add_string(attr_list, DR_HINT, SE_HINT2STR(hint));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (err != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN, "Failed to add attr [%s] for %s event",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DR_HINT, EC_DR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nvlist_free(attr_list);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = ddi_log_sysevent(rmclomv_dip, DDI_VENDOR_SUNW, EC_DR,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ESC_DR_AP_STATE_CHANGE, attr_list, NULL, DDI_NOSLEEP);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (err != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN, "Failed to log %s/%s event",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DR_AP_ID, EC_DR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nvlist_free(attr_list);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelfan_sysevent(char *fru_name, char *sensor_name, int sub_event)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nvlist_t *attr_list;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char fan_str[MAXNAMELEN];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int err;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = nvlist_alloc(&attr_list, NV_UNIQUE_NAME_TYPE, KM_NOSLEEP);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (err != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "Failed to allocate name-value list for %s/%s event",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel EC_ENV, ESC_ENV_FAN);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = nvlist_add_string(attr_list, ENV_FRU_ID, fru_name);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (err != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN, "Failed to add attr [%s] for %s/%s event",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENV_FRU_ID, EC_ENV, ESC_ENV_FAN);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nvlist_free(attr_list);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = nvlist_add_string(attr_list, ENV_FRU_RESOURCE_ID, sensor_name);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (err != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN, "Failed to add attr [%s] for %s/%s event",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENV_FRU_RESOURCE_ID, EC_ENV, ESC_ENV_FAN);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nvlist_free(attr_list);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = nvlist_add_string(attr_list, ENV_FRU_DEVICE, ENV_RESERVED_ATTR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (err != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN, "Failed to add attr [%s] for %s/%s event",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENV_FRU_DEVICE, EC_ENV, ESC_ENV_FAN);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nvlist_free(attr_list);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = nvlist_add_int32(attr_list, ENV_FRU_STATE,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (sub_event == RMC_ENV_FAULT_EVENT) ? ENV_FAILED : ENV_OK);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (err != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN, "Failed to add attr [%s] for %s/%s event",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENV_FRU_STATE, EC_ENV, ESC_ENV_FAN);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nvlist_free(attr_list);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (sub_event == RMC_ENV_FAULT_EVENT) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) snprintf(fan_str, sizeof (fan_str),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "fan %s/%s is now failed", fru_name, sensor_name);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) snprintf(fan_str, sizeof (fan_str),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "fan %s/%s is now ok", fru_name, sensor_name);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = nvlist_add_string(attr_list, ENV_MSG, fan_str);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (err != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN, "Failed to add attr [%s] for %s/%s event",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENV_MSG, EC_ENV, ESC_ENV_FAN);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nvlist_free(attr_list);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = ddi_log_sysevent(rmclomv_dip, DDI_VENDOR_SUNW, EC_ENV,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ESC_ENV_FAN, attr_list, NULL, DDI_NOSLEEP);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (err != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN, "Failed to log %s/%s event",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel EC_ENV, ESC_ENV_FAN);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_NOTE, "%s", fan_str);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nvlist_free(attr_list);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelthreshold_sysevent(char *fru_name, char *sensor_name, int sub_event,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char event_type)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nvlist_t *attr_list;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int err;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *subclass;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char sensor_str[MAXNAMELEN];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel subclass = (event_type == 'T') ? ESC_ENV_TEMP : ESC_ENV_POWER;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = nvlist_alloc(&attr_list, NV_UNIQUE_NAME_TYPE, KM_NOSLEEP);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (err != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "Failed to allocate name-value list for %s/%s event",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel EC_ENV, subclass);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = nvlist_add_string(attr_list, ENV_FRU_ID, fru_name);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (err != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN, "Failed to add attr [%s] for %s/%s event",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENV_FRU_ID, EC_ENV, subclass);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nvlist_free(attr_list);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = nvlist_add_string(attr_list, ENV_FRU_RESOURCE_ID, sensor_name);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (err != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN, "Failed to add attr [%s] for %s/%s event",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENV_FRU_RESOURCE_ID, EC_ENV, subclass);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nvlist_free(attr_list);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = nvlist_add_string(attr_list, ENV_FRU_DEVICE, ENV_RESERVED_ATTR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (err != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN, "Failed to add attr [%s] for %s/%s event",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENV_FRU_DEVICE, EC_ENV, subclass);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nvlist_free(attr_list);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (sub_event) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMC_ENV_OK_EVENT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = nvlist_add_int32(attr_list, ENV_FRU_STATE, ENV_OK);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMC_ENV_WARNING_THRESHOLD_EVENT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = nvlist_add_int32(attr_list, ENV_FRU_STATE, ENV_WARNING);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMC_ENV_SHUTDOWN_THRESHOLD_EVENT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = nvlist_add_int32(attr_list, ENV_FRU_STATE, ENV_FAILED);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (err != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN, "Failed to add attr [%s] for %s/%s event",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENV_FRU_STATE, EC_ENV, subclass);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nvlist_free(attr_list);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (sub_event) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMC_ENV_OK_EVENT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) snprintf(sensor_str, sizeof (sensor_str),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "sensor %s/%s is now ok", fru_name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_name);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMC_ENV_WARNING_THRESHOLD_EVENT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) snprintf(sensor_str, sizeof (sensor_str),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "sensor %s/%s is now outside warning thresholds", fru_name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_name);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMC_ENV_SHUTDOWN_THRESHOLD_EVENT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) snprintf(sensor_str, sizeof (sensor_str),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "sensor %s/%s is now outside shutdown thresholds", fru_name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_name);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = nvlist_add_string(attr_list, ENV_MSG, sensor_str);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (err != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN, "Failed to add attr [%s] for %s/%s event",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENV_MSG, EC_ENV, subclass);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nvlist_free(attr_list);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = ddi_log_sysevent(rmclomv_dip, DDI_VENDOR_SUNW, EC_ENV,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel subclass, attr_list, NULL, DDI_NOSLEEP);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (err != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN, "Failed to log %s/%s event",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel EC_ENV, subclass);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_NOTE, "%s", sensor_str);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel nvlist_free(attr_list);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic uint_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmclomv_event_data_handler(char *arg)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_event_notification_t *payload;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_comm_msg_t *msg;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel envmon_handle_t envhdl;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int hint;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *ptr, *save_ptr;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (arg == NULL) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_INTR_CLAIMED);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel msg = (rmc_comm_msg_t *)arg;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (msg->msg_buf == NULL) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_INTR_CLAIMED);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel payload = (dp_event_notification_t *)msg->msg_buf;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (payload->event) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMC_KEYSWITCH_EVENT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel real_key_position = payload->event_info.ev_keysw.key_position;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_NOTE, "keyswitch change event - state = %s",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_key_position(real_key_position));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((real_key_position != RMC_KEYSWITCH_POS_UNKNOWN) &&
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (real_key_position <= RMC_KEYSWITCH_POS_OFF)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel key_position = real_key_position;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* treat unknown key position as locked */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel key_position = RMC_KEYSWITCH_POS_LOCKED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMC_HPU_EVENT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * send appropriate sysevent
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (payload->event_info.ev_hpunot.sub_event) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMC_HPU_REMOVE_EVENT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel hint = SE_HINT_REMOVE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMC_HPU_INSERT_EVENT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel hint = SE_HINT_INSERT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel hint = SE_NO_HINT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_hdl_to_envhdl(payload->event_info.ev_hpunot.hpu_hdl,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel &envhdl);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_dr_data_handler(envhdl.name, hint);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMC_INIT_EVENT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Wake up the refresh thread.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_refresh_wakeup();
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Wake up the checkrmc thread for an early indication to PICL
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_checkrmc_wakeup(NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMC_ENV_EVENT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_hdl_to_envhdl(payload->event_info.ev_envnot.env_hdl,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel &envhdl);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* split name into fru name and sensor name */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ptr = strchr(envhdl.name, '.');
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* must have at least one '.' */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ptr == NULL)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* find last '.' - convert the others to '/' */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (;;) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel save_ptr = ptr;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ptr = strchr(ptr, '.');
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ptr == NULL) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ptr = save_ptr;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *save_ptr = '/';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *ptr = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ptr++;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* is it a voltage or temperature sensor? */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((*ptr == 'V' || *ptr == 'T') && *(ptr + 1) == '_') {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (payload->event_info.ev_envnot.sub_event) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMC_ENV_WARNING_THRESHOLD_EVENT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMC_ENV_SHUTDOWN_THRESHOLD_EVENT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMC_ENV_OK_EVENT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel threshold_sysevent(envhdl.name, ptr,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel payload->event_info.ev_envnot.sub_event,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *ptr);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * is it a fan sensor?
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Fan sensor names end either in RS, F0 or F1
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((*ptr == 'R' && *(ptr + 1) == 'S' && *(ptr + 2) == '\0') ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (*ptr == 'F' && *(ptr + 1) == '0' && *(ptr + 2) == '\0') ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (*ptr == 'F' && *(ptr + 1) == '1' && *(ptr + 2) == '\0')) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (payload->event_info.ev_envnot.sub_event) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMC_ENV_FAULT_EVENT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMC_ENV_OK_EVENT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel fan_sysevent(envhdl.name, ptr,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel payload->event_info.ev_envnot.sub_event);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMC_LOG_EVENT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int level = 10;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int flags = SL_NOTE | SL_CONSOLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char *message =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (char *)payload->event_info.ev_rmclog.log_record;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel message[ payload->event_info.ev_rmclog.log_record_size] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Logs have a 10 character prefix - specifying the severity of
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * the event being logged. Thus all the magic number 10s down
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * here
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (0 == strncmp("CRITICAL: ", message, 10)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel message += 10;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel level = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel flags = SL_FATAL | SL_ERROR | SL_CONSOLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (0 == strncmp("MAJOR: ", message, 10)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel message += 10;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel level = 5;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel flags = SL_WARN | SL_ERROR | SL_CONSOLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (0 == strncmp("MINOR: ", message, 10)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel message += 10;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel level = 10;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel flags = SL_NOTE | SL_CONSOLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) strlog(0, 0, level, flags, message);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_INTR_CLAIMED);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_INTR_CLAIMED);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*ARGSUSED*/
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmclomv_open(dev_t *dev_p, int flag, int otyp, cred_t *cred_p)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int error = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int instance = getminor(*dev_p);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (instance != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ENXIO);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((flag & FWRITE) != 0 && (error = drv_priv(cred_p)) != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (error);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*ARGSUSED*/
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmclomv_close(dev_t dev, int flag, int otyp, cred_t *cred_p)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (DDI_SUCCESS);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmclomv_do_cmd(int req_cmd, int resp_cmd, int resp_len, intptr_t arg_req,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel intptr_t arg_res)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_comm_msg_t request, *reqp = &request;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_comm_msg_t response, *resp = &response;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int rv = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel bzero((caddr_t)&request, sizeof (request));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel reqp->msg_type = req_cmd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel reqp->msg_buf = (caddr_t)arg_req;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel bzero((caddr_t)&response, sizeof (response));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel resp->msg_type = resp_cmd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel resp->msg_buf = (caddr_t)arg_res;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel resp->msg_len = resp_len;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (req_cmd) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DP_GET_SYSINFO:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel resp->msg_len = sizeof (dp_get_sysinfo_r_t);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DP_GET_EVENT_LOG:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel resp->msg_len = sizeof (dp_get_event_log_r_t);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DP_GET_VOLTS:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel reqp->msg_len = sizeof (dp_get_volts_t);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DP_GET_TEMPERATURES:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel reqp->msg_len = sizeof (dp_get_temperatures_t);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DP_GET_CIRCUIT_BRKS:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel reqp->msg_len = sizeof (dp_get_circuit_brks_t);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DP_GET_FAN_STATUS:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel reqp->msg_len = sizeof (dp_get_fan_status_t);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DP_GET_PSU_STATUS:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel reqp->msg_len = sizeof (dp_get_psu_status_t);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DP_GET_LED_STATE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel reqp->msg_len = sizeof (dp_get_led_state_t);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DP_SET_LED_STATE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel reqp->msg_len = sizeof (dp_set_led_state_t);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DP_GET_FRU_STATUS:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel reqp->msg_len = sizeof (dp_get_fru_status_t);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DP_GET_HANDLE_NAME:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel reqp->msg_len = sizeof (dp_get_handle_name_t);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DP_GET_ALARM_STATE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel reqp->msg_len = sizeof (dp_get_alarm_state_t);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DP_SET_ALARM_STATE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel reqp->msg_len = sizeof (dp_set_alarm_state_t);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DP_GET_SDP_VERSION:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel resp->msg_len = sizeof (dp_get_sdp_version_r_t);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DP_GET_CHASSIS_SERIALNUM:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel reqp->msg_len = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DP_GET_DATE_TIME:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel reqp->msg_len = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EINVAL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rv = rmc_comm_request_response(reqp, resp,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RMCLOMV_DEFAULT_MAX_MBOX_WAIT_TIME);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rv != RCNOERR) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * RMC returned an error or failed to respond.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Where the RMC itself is implicated, rmclomv_rmc_error
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * is set non-zero. It is cleared after an error free exchange.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Two failure cases are distinguished:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * RMCLOMV_RMCSTATE_FAILED and RMCLOMV_RMCSTATE_DOWNLOAD.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (rv) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RCENOSOFTSTATE:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* invalid/NULL soft state structure */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EIO);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RCENODATALINK:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * firmware download in progress,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * can you come back later?
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_rmc_error = RMCLOMV_RMCSTATE_DOWNLOAD;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_rmc_state = RMCLOMV_RMCSTATE_DOWNLOAD;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EAGAIN);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RCENOMEM:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* memory problems */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ENOMEM);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RCECANTRESEND:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* resend failed */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_rmc_error = RMCLOMV_RMCSTATE_FAILED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EIO);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RCEMAXRETRIES:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* reply not received - retries exceeded */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_rmc_error = RMCLOMV_RMCSTATE_FAILED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EINTR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RCETIMEOUT:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* reply not received - command has timed out */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_rmc_error = RMCLOMV_RMCSTATE_FAILED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EINTR);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RCEINVCMD:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* data protocol cmd not supported */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ENOTSUP);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RCEINVARG:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* invalid argument(s) */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ENOTSUP);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RCEGENERIC:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* generic error */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_rmc_error = RMCLOMV_RMCSTATE_FAILED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EIO);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_rmc_error = RMCLOMV_RMCSTATE_FAILED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EIO);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_rmc_error = RMCLOMV_RMCERROR_NONE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * validate_section_entry checks that the entry at the specified index
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * is valid and not duplicated by an entry above. If these tests fail
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * the entry is removed and B_FALSE returned. Otherwise returns B_TRUE.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int
3db86aab554edbb4244c8d1a1c90f152eee768afstevelvalidate_section_entry(rmclomv_cache_section_t *section, int index)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int i;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_entry_t *entry;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (i = index; i < section->num_entries; i++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel entry = &section->entry[i];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (entry->handle_name.name[0] == '\0') {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "rmclomv: empty handle_name, handle 0x%x type %x",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel entry->handle, section->sensor_type);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (entry->ind_mask != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel continue; /* skip special entries */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (entry->handle == DP_NULL_HANDLE) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "rmclomv: null handle id for \"%s\" type %x",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel entry->handle_name.name, section->sensor_type);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (i == index) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel continue;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (section->entry[index].handle == entry->handle) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "rmclomv: duplicate handle 0x%x type %x",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel entry->handle, section->sensor_type);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (strcmp(entry->handle_name.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section->entry[index].handle_name.name) == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "rmclomv: duplicate handle_name \"%s\", "
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "handle 0x%x type %x", entry->handle_name.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel entry->handle, section->sensor_type);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel continue;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * need to remove the entry at index
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section->num_entries--;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (i = index; i < section->num_entries; i++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section->entry[i] = section->entry[i + 1];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (B_FALSE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (B_TRUE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Populate a section containing handles with corresponding names
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * The supplied section structure must not be publically visible and the
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * name cache must not be locked either (because RMC i/o is required).
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * This is the place where a sanity check is applied. Entries containing
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * duplicate handles, duplicate names or empty names are removed and the
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * structure is compacted. As a result num_entries may be reduced.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int
3db86aab554edbb4244c8d1a1c90f152eee768afsteveladd_names_to_section(rmclomv_cache_section_t *section)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int retval = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int ditched = B_FALSE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int index;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_handle_name_r_t handle_name_r;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_entry_t *entry;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (index = 0; index < section->num_entries; index++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel entry = &section->entry[index];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (entry->ind_mask != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel continue; /* skip special entries */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel handle_name_r.handle = entry->handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel retval = rmclomv_do_cmd(DP_GET_HANDLE_NAME,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DP_GET_HANDLE_NAME_R, sizeof (handle_name_r),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (intptr_t)&handle_name_r, (intptr_t)&handle_name_r);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (retval == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel bcopy(handle_name_r.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel entry->handle_name.name, DP_MAX_HANDLE_NAME);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * now ditch invalid and duplicate entries
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (index = 0; index < section->num_entries; index++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel while (validate_section_entry(section, index) == B_FALSE)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ditched = B_TRUE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ditched)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN, "Retaining %d nodes of type %d",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section->num_entries, section->sensor_type);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (retval);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * The supplied (PSU) cache section is traversed and entries are created
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * for the individual indicators belonging to a PSU. These entries are
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * placed in a private chain. The caller, subsequently acquires the
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * cache lock and copies the chain head to make it public.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * The handle-names for PSU indicators are derived from the parent PSU
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * handle-name.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * NOTE: add_names_to_section() may have reduced psu_section->num_entries
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * so DON'T USE psu_resp->num_psus
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelmake_psu_subsections(rmclomv_cache_section_t *psu_section,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_section_t **chain_head, dp_get_psu_status_r_t *psu_resp)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int index;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int subindex = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_section_t *subsection;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_entry_t *src_entry;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_entry_t *dst_entry;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel subsection = create_cache_section(RMCLOMV_VOLT_IND,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RMCLOMV_MAX_VI_PER_PSU * psu_section->num_entries);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (index = 0; index < psu_section->num_entries; index++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel src_entry = &psu_section->entry[index];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((psu_resp->psu_status[index].mask &
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DP_PSU_INPUT_STATUS) != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry = &subsection->entry[subindex++];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry->handle = src_entry->handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry->ind_mask = DP_PSU_INPUT_STATUS;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) snprintf(dst_entry->handle_name.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_MAXNAMELEN, "%s.%s",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel src_entry->handle_name.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel str_ip_volts_ind);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((psu_resp->psu_status[index].mask &
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DP_PSU_SEC_INPUT_STATUS) != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry = &subsection->entry[subindex++];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry->handle = src_entry->handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry->ind_mask = DP_PSU_SEC_INPUT_STATUS;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) snprintf(dst_entry->handle_name.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_MAXNAMELEN, "%s.%s",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel src_entry->handle_name.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel str_ip2_volts_ind);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((psu_resp->psu_status[index].mask &
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DP_PSU_OUTPUT_STATUS) != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry = &subsection->entry[subindex++];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry->handle = src_entry->handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry->ind_mask = DP_PSU_OUTPUT_STATUS;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) snprintf(dst_entry->handle_name.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_MAXNAMELEN, "%s.%s",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel src_entry->handle_name.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel str_ff_pok_ind);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((psu_resp->psu_status[index].mask &
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DP_PSU_OUTPUT_VLO_STATUS) != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry = &subsection->entry[subindex++];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry->handle = src_entry->handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry->ind_mask = DP_PSU_OUTPUT_VLO_STATUS;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) snprintf(dst_entry->handle_name.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_MAXNAMELEN, "%s.%s",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel src_entry->handle_name.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel str_vlo_volts_ind);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((psu_resp->psu_status[index].mask &
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DP_PSU_OUTPUT_VHI_STATUS) != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry = &subsection->entry[subindex++];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry->handle = src_entry->handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry->ind_mask = DP_PSU_OUTPUT_VHI_STATUS;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) snprintf(dst_entry->handle_name.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_MAXNAMELEN, "%s.%s",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel src_entry->handle_name.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel str_vhi_volts_ind);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Adjust number of entries value in cache section
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * to match the facts.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel subsection->num_entries = subindex;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel add_section(chain_head, subsection);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel subsection = create_cache_section(RMCLOMV_AMP_IND,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RMCLOMV_MAX_CI_PER_PSU * psu_section->num_entries);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel subindex = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (index = 0; index < psu_section->num_entries; index++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int mask = psu_resp->psu_status[index].mask;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel src_entry = &psu_section->entry[index];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((mask & DP_PSU_OUTPUT_AHI_STATUS) != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry = &subsection->entry[subindex++];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry->handle = src_entry->handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry->ind_mask = DP_PSU_OUTPUT_AHI_STATUS;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) snprintf(dst_entry->handle_name.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_MAXNAMELEN, "%s.%s",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel src_entry->handle_name.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel str_chi_amps_ind);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((mask & DP_PSU_NR_WARNING) != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry = &subsection->entry[subindex++];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry->handle = src_entry->handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry->ind_mask = DP_PSU_NR_WARNING;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) snprintf(dst_entry->handle_name.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_MAXNAMELEN, "%s.%s",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel src_entry->handle_name.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel str_chi_nr_ind);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel subsection->num_entries = subindex;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel add_section(chain_head, subsection);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel subsection = create_cache_section(RMCLOMV_TEMP_IND,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel psu_section->num_entries);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel subindex = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (index = 0; index < psu_section->num_entries; index++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((psu_resp->psu_status[index].mask &
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DP_PSU_OVERTEMP_FAULT) != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel src_entry = &psu_section->entry[index];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry = &subsection->entry[subindex++];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry->handle = src_entry->handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry->ind_mask = DP_PSU_OVERTEMP_FAULT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) snprintf(dst_entry->handle_name.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_MAXNAMELEN, "%s.%s",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel src_entry->handle_name.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel str_ot_tmpr_ind);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel subsection->num_entries = subindex;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel add_section(chain_head, subsection);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel subsection = create_cache_section(RMCLOMV_FAN_IND,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RMCLOMV_MAX_FI_PER_PSU * psu_section->num_entries);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel subindex = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (index = 0; index < psu_section->num_entries; index++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int mask = psu_resp->psu_status[index].mask;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel src_entry = &psu_section->entry[index];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((mask & DP_PSU_FAN_FAULT) != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry = &subsection->entry[subindex++];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry->handle = src_entry->handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry->ind_mask = DP_PSU_FAN_FAULT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) snprintf(dst_entry->handle_name.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_MAXNAMELEN, "%s.%s",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel src_entry->handle_name.name, str_fan_ind);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((mask & DP_PSU_PDCT_FAN) != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry = &subsection->entry[subindex++];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry->handle = src_entry->handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dst_entry->ind_mask = DP_PSU_PDCT_FAN;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) snprintf(dst_entry->handle_name.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_MAXNAMELEN, "%s.%s",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel src_entry->handle_name.name, str_pdct_fan_ind);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel subsection->num_entries = subindex;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel add_section(chain_head, subsection);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrefresh_name_cache(int force_fail)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel union {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_volts_t u_volts_cmd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_temperatures_t u_temp_cmd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_circuit_brks_t u_ampi_cmd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_fan_status_t u_fan_cmd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_psu_status_t u_psu_cmd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_fru_status_t u_fru_cmd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_led_state_t u_led_cmd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_set_led_state_t u_setled_cmd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_alarm_state_t u_alarm_cmd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_set_alarm_state_t u_setalarm_cmd;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } rmc_cmdbuf;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/* defines for accessing union fields */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define volts_cmd rmc_cmdbuf.u_volts_cmd
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define temp_cmd rmc_cmdbuf.u_temp_cmd
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define ampi_cmd rmc_cmdbuf.u_ampi_cmd
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define fan_cmd rmc_cmdbuf.u_fan_cmd
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define psu_cmd rmc_cmdbuf.u_psu_cmd
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define fru_cmd rmc_cmdbuf.u_fru_cmd
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define led_cmd rmc_cmdbuf.u_led_cmd
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define setled_cmd rmc_cmdbuf.u_setled_cmd
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define alarm_cmd rmc_cmdbuf.u_alarm_cmd
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define setalarm_cmd rmc_cmdbuf.u_setalarm_cmd
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Data area to read sensor data into
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel static union {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel char reservation[RMCRESBUFLEN];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_volts_r_t u_volts_r;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_temperatures_r_t u_temp_r;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_circuit_brks_r_t u_ampi_r;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_fan_status_r_t u_fan_r;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_psu_status_r_t u_psu_r;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_fru_status_r_t u_fru_r;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_led_state_r_t u_led_r;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_set_led_state_r_t u_setled_r;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_alarm_state_r_t u_alarm_r;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_set_alarm_state_r_t u_setalarm_r;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } rmc_sensbuf;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/* defines for accessing union fields */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define volts_r rmc_sensbuf.u_volts_r
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define temp_r rmc_sensbuf.u_temp_r
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define ampi_r rmc_sensbuf.u_ampi_r
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define fan_r rmc_sensbuf.u_fan_r
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define psu_r rmc_sensbuf.u_psu_r
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define fru_r rmc_sensbuf.u_fru_r
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define led_r rmc_sensbuf.u_led_r
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define setled_r rmc_sensbuf.u_setled_r
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define alarm_r rmc_sensbuf.u_alarm_r
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define setalarm_r rmc_sensbuf.u_setalarm_r
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int retval = force_fail;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int retval1 = retval;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int index;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_section_t *my_chain = NULL;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_section_t *derived_chain = NULL;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_section_t *section;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_section_t *psu_section;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_section_t *fru_section;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_sysinfo_r_t sysinfo;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_entry_t *entry;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (retval == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel retval = rmclomv_do_cmd(DP_GET_SYSINFO, DP_GET_SYSINFO_R,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (sysinfo), NULL, (intptr_t)&sysinfo);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (retval == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel fru_cmd.handle = DP_NULL_HANDLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel retval = rmclomv_do_cmd(DP_GET_FRU_STATUS, DP_GET_FRU_STATUS_R,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RMCRESBUFLEN, (intptr_t)&fru_cmd, (intptr_t)&fru_r);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (retval != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel fru_r.num_frus = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Reserve space for special additional entries in the FRU section
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel fru_section = create_cache_section(RMCLOMV_HPU_IND,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RMCLOMV_NUM_SPECIAL_FRUS + fru_r.num_frus);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * add special entry for RMC itself
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel entry = &fru_section->entry[0];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) snprintf(entry->handle_name.name, sizeof (envmon_handle_t),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "SC");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel entry->handle = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel entry->ind_mask = 1; /* flag as a special entry */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * populate any other FRU entries
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (index = 0; index < fru_r.num_frus; index++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel fru_section->entry[RMCLOMV_NUM_SPECIAL_FRUS + index].handle =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel fru_r.fru_status[index].handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel fru_section->entry[RMCLOMV_NUM_SPECIAL_FRUS + index].ind_mask =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel my_chain = fru_section;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (retval == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel volts_cmd.handle = DP_NULL_HANDLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel retval = rmclomv_do_cmd(DP_GET_VOLTS, DP_GET_VOLTS_R,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RMCRESBUFLEN, (intptr_t)&volts_cmd, (intptr_t)&volts_r);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (retval == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section = create_cache_section(RMCLOMV_VOLT_SENS,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel volts_r.num_volts);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (index = 0; index < volts_r.num_volts; index++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section->entry[index].handle =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel volts_r.volt_status[index].handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel add_section(&my_chain, section);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (retval == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel temp_cmd.handle = DP_NULL_HANDLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel retval = rmclomv_do_cmd(DP_GET_TEMPERATURES,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DP_GET_TEMPERATURES_R, RMCRESBUFLEN,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (intptr_t)&temp_cmd, (intptr_t)&temp_r);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (retval == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section = create_cache_section(RMCLOMV_TEMP_SENS,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel temp_r.num_temps);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (index = 0; index < temp_r.num_temps; index++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section->entry[index].handle =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel temp_r.temp_status[index].handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel add_section(&my_chain, section);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (retval == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel fan_cmd.handle = DP_NULL_HANDLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel retval = rmclomv_do_cmd(DP_GET_FAN_STATUS, DP_GET_FAN_STATUS_R,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RMCRESBUFLEN, (intptr_t)&fan_cmd, (intptr_t)&fan_r);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (retval == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section = create_cache_section(RMCLOMV_FAN_SENS,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel fan_r.num_fans);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (index = 0; index < fan_r.num_fans; index++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section->entry[index].handle =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel fan_r.fan_status[index].handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel add_section(&my_chain, section);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (retval == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ampi_cmd.handle = DP_NULL_HANDLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel retval = rmclomv_do_cmd(DP_GET_CIRCUIT_BRKS,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DP_GET_CIRCUIT_BRKS_R, RMCRESBUFLEN,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (intptr_t)&ampi_cmd, (intptr_t)&ampi_r);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (retval == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section = create_cache_section(RMCLOMV_AMP_IND,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ampi_r.num_circuit_brks);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (index = 0; index < ampi_r.num_circuit_brks; index++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section->entry[index].handle =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ampi_r.circuit_brk_status[index].handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel add_section(&my_chain, section);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (retval == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel led_cmd.handle = DP_NULL_HANDLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel retval = rmclomv_do_cmd(DP_GET_LED_STATE, DP_GET_LED_STATE_R,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RMCRESBUFLEN, (intptr_t)&led_cmd, (intptr_t)&led_r);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (retval == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section = create_cache_section(RMCLOMV_LED_IND,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel led_r.num_leds);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (index = 0; index < led_r.num_leds; index++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section->entry[index].handle =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel led_r.led_state[index].handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel add_section(&my_chain, section);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * The command DP_GET_ALARM_STATE may not be valid on
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * some RMC versions, so we ignore the return value
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * and proceed
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (retval == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel alarm_cmd.handle = DP_NULL_HANDLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel retval1 = rmclomv_do_cmd(DP_GET_ALARM_STATE,
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank DP_GET_ALARM_STATE_R, RMCRESBUFLEN,
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank (intptr_t)&alarm_cmd, (intptr_t)&alarm_r);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((retval1 == 0) && alarm_r.num_alarms) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section = create_cache_section(RMCLOMV_ALARM_IND,
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank alarm_r.num_alarms);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (index = 0; index < alarm_r.num_alarms; index++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section->entry[index].handle =
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank alarm_r.alarm_state[index].handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel add_section(&my_chain, section);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (retval == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel psu_cmd.handle = DP_NULL_HANDLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel retval = rmclomv_do_cmd(DP_GET_PSU_STATUS, DP_GET_PSU_STATUS_R,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RMCRESBUFLEN, (intptr_t)&psu_cmd, (intptr_t)&psu_r);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (retval == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * WARNING:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * =======
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * The PSUs must be probed last so that the response data
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * (psu_r) is available for make_psu_subsections() below.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Note that all the responses share the same data area
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * which is declared as a union.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel psu_section = create_cache_section(RMCLOMV_PSU_IND,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel psu_r.num_psus);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (index = 0; index < psu_r.num_psus; index++) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel psu_section->entry[index].handle =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel psu_r.psu_status[index].handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel add_section(&my_chain, psu_section);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (retval == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (section = my_chain;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section != NULL;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section = section->next_section) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel retval = add_names_to_section(section);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (retval != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * now add nodes derived from PSUs
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (retval == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel make_psu_subsections(psu_section, &derived_chain, &psu_r);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * name cache sections all set, exchange new for old
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_reset_cache(my_chain, derived_chain, &sysinfo);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * RMC is not responding, ditch any existing cache
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * and just leave the special SC FRU node
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_reset_cache(my_chain, NULL, NULL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelset_val_unav(envmon_sensor_t *sensor)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor->value = ENVMON_VAL_UNAVAILABLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor->lowthresholds.warning = ENVMON_VAL_UNAVAILABLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor->lowthresholds.shutdown = ENVMON_VAL_UNAVAILABLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor->lowthresholds.poweroff = ENVMON_VAL_UNAVAILABLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor->highthresholds.warning = ENVMON_VAL_UNAVAILABLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor->highthresholds.shutdown = ENVMON_VAL_UNAVAILABLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor->highthresholds.poweroff = ENVMON_VAL_UNAVAILABLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelset_fan_unav(envmon_fan_t *fan)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel fan->speed = ENVMON_VAL_UNAVAILABLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel fan->units[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel fan->lowthresholds.warning = ENVMON_VAL_UNAVAILABLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel fan->lowthresholds.shutdown = ENVMON_VAL_UNAVAILABLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel fan->lowthresholds.poweroff = ENVMON_VAL_UNAVAILABLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int
3db86aab554edbb4244c8d1a1c90f152eee768afsteveldo_psu_cmd(intptr_t arg, int mode, envmon_indicator_t *env_ind,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_psu_status_t *rmc_psu, dp_get_psu_status_r_t *rmc_psu_r,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int detector_type)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int index;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel uint16_t sensor_status;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_section_t *section;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel uint16_t indicator_mask;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ddi_copyin((caddr_t)arg, (caddr_t)env_ind,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (envmon_indicator_t), mode) != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EFAULT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* ensure we've got PSU handles cached */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel LOCK_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_SENSOR_OK;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section = rmclomv_find_section(rmclomv_subcache, detector_type);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (env_ind->id.name[0] == '\0') {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* request for first handle */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((section == NULL) || (section->num_entries == 0))
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ind->next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ind->next_id = section->entry[0].handle_name;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* ensure name is properly terminated */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ind->id.name[ENVMON_MAXNAMELEN - 1] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((section == NULL) || (get_sensor_by_name(section,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ind->id.name, &index)) != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ind->next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (index + 1 < section->num_entries)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ind->next_id =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section->entry[index + 1].handle_name;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ind->next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (sensor_status == ENVMON_SENSOR_OK) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * user correctly identified a sensor, note its
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * handle value and request the indicator status
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_psu->handle = section->entry[index].handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel indicator_mask = section->entry[index].ind_mask;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RELEASE_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((sensor_status == ENVMON_SENSOR_OK) && (rmclomv_rmc_error ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_do_cmd(DP_GET_PSU_STATUS, DP_GET_PSU_STATUS_R,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (dp_get_psu_status_r_t), (intptr_t)rmc_psu,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (intptr_t)rmc_psu_r) != 0)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_INACCESSIBLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((env_ind->sensor_status = sensor_status) == ENVMON_SENSOR_OK) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * copy results into buffer for user
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((rmc_psu_r->psu_status[0].flag & DP_PSU_PRESENCE) == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ind->sensor_status |= ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rmc_psu_r->psu_status[0].sensor_status !=
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DP_SENSOR_DATA_AVAILABLE)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ind->sensor_status |= ENVMON_INACCESSIBLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ind->condition =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (rmc_psu_r->psu_status[0].flag & indicator_mask) == 0 ?
3db86aab554edbb4244c8d1a1c90f152eee768afstevel 0 : 1;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rmclomv_rmc_error != RMCLOMV_RMCERROR_NONE)
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank env_ind->sensor_status = ENVMON_INACCESSIBLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ddi_copyout((caddr_t)env_ind, (caddr_t)arg,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (envmon_indicator_t), mode) != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EFAULT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*ARGSUSED*/
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic int
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmclomv_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *cred_p,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int *rval_p)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int instance = getminor(dev);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel envmon_sysinfo_t lomv_sysinfo;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel union {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel envmon_sensor_t u_env_sensor;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel envmon_indicator_t u_env_ind;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel envmon_fan_t u_env_fan;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel envmon_led_info_t u_env_ledinfo;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel envmon_led_ctl_t u_env_ledctl;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel envmon_hpu_t u_env_hpu;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel envmon_alarm_info_t u_env_alarminfo;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel envmon_alarm_ctl_t u_env_alarmctl;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } env_buf;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define env_sensor env_buf.u_env_sensor
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define env_ind env_buf.u_env_ind
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define env_fan env_buf.u_env_fan
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define env_ledinfo env_buf.u_env_ledinfo
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define env_ledctl env_buf.u_env_ledctl
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define env_hpu env_buf.u_env_hpu
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define env_alarminfo env_buf.u_env_alarminfo
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define env_alarmctl env_buf.u_env_alarmctl
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel union {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_volts_t u_rmc_volts;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_temperatures_t u_rmc_temp;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_circuit_brks_t u_rmc_ampi;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_fan_status_t u_rmc_fan;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_psu_status_t u_rmc_psu;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_fru_status_t u_rmc_fru;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_led_state_t u_rmc_led;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_set_led_state_t u_rmc_setled;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_alarm_state_t u_rmc_alarm;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_set_alarm_state_t u_rmc_setalarm;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } rmc_reqbuf;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define rmc_volts rmc_reqbuf.u_rmc_volts
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define rmc_temp rmc_reqbuf.u_rmc_temp
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define rmc_ampi rmc_reqbuf.u_rmc_ampi
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define rmc_fan rmc_reqbuf.u_rmc_fan
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define rmc_psu rmc_reqbuf.u_rmc_psu
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define rmc_fru rmc_reqbuf.u_rmc_fru
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define rmc_led rmc_reqbuf.u_rmc_led
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define rmc_setled rmc_reqbuf.u_rmc_setled
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define rmc_alarm rmc_reqbuf.u_rmc_alarm
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define rmc_setalarm rmc_reqbuf.u_rmc_setalarm
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel union {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_volts_r_t u_rmc_volts_r;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_temperatures_r_t u_rmc_temp_r;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_circuit_brks_r_t u_rmc_ampi_r;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_fan_status_r_t u_rmc_fan_r;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_psu_status_r_t u_rmc_psu_r;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_fru_status_r_t u_rmc_fru_r;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_led_state_r_t u_rmc_led_r;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_set_led_state_r_t u_rmc_setled_r;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_alarm_state_r_t u_rmc_alarm_r;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_set_alarm_state_r_t u_rmc_setalarm_r;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_sdp_version_r_t u_rmc_sdpversion_r;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_serialnum_r_t u_rmc_serialnum_r;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } rmc_resbuf;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define rmc_volts_r rmc_resbuf.u_rmc_volts_r
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define rmc_temp_r rmc_resbuf.u_rmc_temp_r
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define rmc_ampi_r rmc_resbuf.u_rmc_ampi_r
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define rmc_fan_r rmc_resbuf.u_rmc_fan_r
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define rmc_psu_r rmc_resbuf.u_rmc_psu_r
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define rmc_fru_r rmc_resbuf.u_rmc_fru_r
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define rmc_led_r rmc_resbuf.u_rmc_led_r
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define rmc_setled_r rmc_resbuf.u_rmc_setled_r
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define rmc_alarm_r rmc_resbuf.u_rmc_alarm_r
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define rmc_setalarm_r rmc_resbuf.u_rmc_setalarm_r
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define rmc_sdpver_r rmc_resbuf.u_rmc_sdpversion_r
3db86aab554edbb4244c8d1a1c90f152eee768afstevel#define rmc_serialnum_r rmc_resbuf.u_rmc_serialnum_r
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int retval = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int special = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int index;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel uint16_t sensor_status;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_section_t *section;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel envmon_chassis_t chassis;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (instance != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ENXIO);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (cmd) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case ENVMONIOCSYSINFO:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel LOCK_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * A number of OK/not_OK indicators are supported by PSUs
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * (voltage, current, fan, temperature). So the maximum
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * number of such indicators relates to the maximum number
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * of power-supplies.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rmclomv_sysinfo_valid) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel lomv_sysinfo.maxVoltSens = rmclomv_sysinfo_data.maxVolt;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel lomv_sysinfo.maxVoltInd =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RMCLOMV_MAX_VI_PER_PSU *
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_sysinfo_data.maxPSU;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * the ALOM-Solaris interface does not include
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * amp sensors, so we can hard code this value
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel lomv_sysinfo.maxAmpSens = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel lomv_sysinfo.maxAmpInd =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_sysinfo_data.maxCircuitBrks +
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (RMCLOMV_MAX_CI_PER_PSU *
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_sysinfo_data.maxPSU);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel lomv_sysinfo.maxTempSens = rmclomv_sysinfo_data.maxTemp;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel lomv_sysinfo.maxTempInd =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (RMCLOMV_MAX_TI_PER_PSU *
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_sysinfo_data.maxPSU);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel lomv_sysinfo.maxFanSens = rmclomv_sysinfo_data.maxFan;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel lomv_sysinfo.maxFanInd =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RMCLOMV_MAX_FI_PER_PSU *
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_sysinfo_data.maxPSU;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel lomv_sysinfo.maxLED = rmclomv_sysinfo_data.maxLED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel lomv_sysinfo.maxHPU = RMCLOMV_NUM_SPECIAL_FRUS +
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_sysinfo_data.maxFRU;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel bzero(&lomv_sysinfo, sizeof (lomv_sysinfo));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel lomv_sysinfo.maxHPU = 1; /* just the SC node */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RELEASE_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ddi_copyout((caddr_t)&lomv_sysinfo, (caddr_t)arg,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (lomv_sysinfo), mode) != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EFAULT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case ENVMONIOCVOLTSENSOR:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ddi_copyin((caddr_t)arg, (caddr_t)&env_sensor,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (envmon_sensor_t), mode) != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EFAULT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* see if we've got volts handles cached */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel LOCK_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_SENSOR_OK;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((rmclomv_cache_valid == B_FALSE) ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ((section = rmclomv_find_section(rmclomv_cache,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RMCLOMV_VOLT_SENS)) == NULL)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (env_sensor.id.name[0] == '\0') {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* request for first handle */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (section->num_entries == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.next_id =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section->entry[0].handle_name;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* ensure name is properly terminated */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.id.name[ENVMON_MAXNAMELEN - 1] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (get_sensor_by_name(section, env_sensor.id.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel &index) != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (index + 1 < section->num_entries)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.next_id =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section->entry[index + 1].handle_name;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (sensor_status == ENVMON_SENSOR_OK) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * user correctly identified a sensor, note its
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * handle value and request the sensor value
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_volts.handle = section->entry[index].handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RELEASE_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((sensor_status == ENVMON_SENSOR_OK) && (rmclomv_rmc_error ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_do_cmd(DP_GET_VOLTS, DP_GET_VOLTS_R,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (rmc_volts_r), (intptr_t)&rmc_volts,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (intptr_t)&rmc_volts_r) != 0)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_INACCESSIBLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((sensor_status == ENVMON_SENSOR_OK) &&
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (rmc_volts_r.volt_status[0].sensor_status ==
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DP_SENSOR_NOT_PRESENT)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((env_sensor.sensor_status = sensor_status) ==
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_SENSOR_OK) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * copy results into buffer for user
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rmc_volts_r.volt_status[0].sensor_status !=
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DP_SENSOR_DATA_AVAILABLE)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.sensor_status = ENVMON_INACCESSIBLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.value =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_volts_r.volt_status[0].reading;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.lowthresholds.warning =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_volts_r.volt_status[0].low_warning;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.lowthresholds.shutdown =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_volts_r.volt_status[0].low_soft_shutdown;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.lowthresholds.poweroff =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_volts_r.volt_status[0].low_hard_shutdown;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.highthresholds.warning =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_volts_r.volt_status[0].high_warning;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.highthresholds.shutdown =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_volts_r.volt_status[0].high_soft_shutdown;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.highthresholds.poweroff =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_volts_r.volt_status[0].high_hard_shutdown;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (env_sensor.sensor_status != ENVMON_SENSOR_OK ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_rmc_error != RMCLOMV_RMCERROR_NONE)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel set_val_unav(&env_sensor);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ddi_copyout((caddr_t)&env_sensor, (caddr_t)arg,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (envmon_sensor_t), mode) != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EFAULT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case ENVMONIOCVOLTIND:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (do_psu_cmd(arg, mode, &env_ind, &rmc_psu, &rmc_psu_r,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RMCLOMV_VOLT_IND));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case ENVMONIOCTEMPIND:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (do_psu_cmd(arg, mode, &env_ind, &rmc_psu, &rmc_psu_r,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RMCLOMV_TEMP_IND));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case ENVMONIOCFANIND:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (do_psu_cmd(arg, mode, &env_ind, &rmc_psu, &rmc_psu_r,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RMCLOMV_FAN_IND));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case ENVMONIOCAMPSENSOR:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ddi_copyin((caddr_t)arg, (caddr_t)&env_sensor,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (envmon_sensor_t), mode) != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EFAULT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ddi_copyout((caddr_t)&env_sensor, (caddr_t)arg,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (envmon_sensor_t), mode) != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EFAULT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case ENVMONIOCTEMPSENSOR:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ddi_copyin((caddr_t)arg, (caddr_t)&env_sensor,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (envmon_sensor_t), mode) != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EFAULT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* see if we've got temperature handles cached */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel LOCK_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_SENSOR_OK;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((rmclomv_cache_valid == B_FALSE) ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ((section = rmclomv_find_section(rmclomv_cache,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RMCLOMV_TEMP_SENS)) == NULL)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (env_sensor.id.name[0] == '\0') {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* request for first handle */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (section->num_entries == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.next_id =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section->entry[0].handle_name;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* ensure name is properly terminated */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.id.name[ENVMON_MAXNAMELEN - 1] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (get_sensor_by_name(section, env_sensor.id.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel &index) != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (index + 1 < section->num_entries)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.next_id =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section->entry[index + 1].handle_name;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (sensor_status == ENVMON_SENSOR_OK) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * user correctly identified a sensor, note its
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * handle value and request the sensor value
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_temp.handle = section->entry[index].handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RELEASE_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((sensor_status == ENVMON_SENSOR_OK) && (rmclomv_rmc_error ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_do_cmd(DP_GET_TEMPERATURES, DP_GET_TEMPERATURES_R,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (rmc_temp_r), (intptr_t)&rmc_temp,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (intptr_t)&rmc_temp_r) != 0)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_INACCESSIBLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((sensor_status == ENVMON_SENSOR_OK) &&
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (rmc_temp_r.temp_status[0].sensor_status ==
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DP_SENSOR_NOT_PRESENT)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((env_sensor.sensor_status = sensor_status) ==
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_SENSOR_OK) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * copy results into buffer for user
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rmc_temp_r.temp_status[0].sensor_status !=
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DP_SENSOR_DATA_AVAILABLE)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.sensor_status = ENVMON_INACCESSIBLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.value =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_temp_r.temp_status[0].value;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.lowthresholds.warning =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_temp_r.temp_status[0].low_warning;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.lowthresholds.shutdown =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_temp_r.temp_status[0].low_soft_shutdown;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.lowthresholds.poweroff =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_temp_r.temp_status[0].low_hard_shutdown;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.highthresholds.warning =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_temp_r.temp_status[0].high_warning;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.highthresholds.shutdown =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_temp_r.temp_status[0].high_soft_shutdown;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_sensor.highthresholds.poweroff =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_temp_r.temp_status[0].high_hard_shutdown;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (env_sensor.sensor_status != ENVMON_SENSOR_OK ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_rmc_error != RMCLOMV_RMCERROR_NONE)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel set_val_unav(&env_sensor);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ddi_copyout((caddr_t)&env_sensor, (caddr_t)arg,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (envmon_sensor_t), mode) != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EFAULT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case ENVMONIOCFAN:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ddi_copyin((caddr_t)arg, (caddr_t)&env_fan,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (envmon_fan_t), mode) != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EFAULT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* see if we've got fan handles cached */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel LOCK_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_SENSOR_OK;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((rmclomv_cache_valid == B_FALSE) ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ((section = rmclomv_find_section(rmclomv_cache,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RMCLOMV_FAN_SENS)) == NULL)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_fan.next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (env_fan.id.name[0] == '\0') {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* request for first handle */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (section->num_entries == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_fan.next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_fan.next_id =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section->entry[0].handle_name;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* ensure name is properly terminated */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_fan.id.name[ENVMON_MAXNAMELEN - 1] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (get_sensor_by_name(section, env_fan.id.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel &index) != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_fan.next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (index + 1 < section->num_entries)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_fan.next_id =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section->entry[index + 1].handle_name;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_fan.next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (sensor_status == ENVMON_SENSOR_OK) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * user correctly identified a sensor, note its
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * handle value and request the sensor value
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_fan.handle = section->entry[index].handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RELEASE_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((sensor_status == ENVMON_SENSOR_OK) && (rmclomv_rmc_error ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_do_cmd(DP_GET_FAN_STATUS, DP_GET_FAN_STATUS_R,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (rmc_fan_r), (intptr_t)&rmc_fan,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (intptr_t)&rmc_fan_r) != 0)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_INACCESSIBLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((sensor_status == ENVMON_SENSOR_OK) &&
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (rmc_fan_r.fan_status[0].sensor_status ==
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DP_SENSOR_NOT_PRESENT)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((env_fan.sensor_status = sensor_status) ==
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_SENSOR_OK) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((rmc_fan_r.fan_status[0].flag &
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DP_FAN_PRESENCE) == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_fan.sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rmc_fan_r.fan_status[0].sensor_status !=
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DP_SENSOR_DATA_AVAILABLE)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_fan.sensor_status |= ENVMON_INACCESSIBLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (env_fan.sensor_status == ENVMON_SENSOR_OK) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * copy results into buffer for user
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_fan.speed =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_fan_r.fan_status[0].speed;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_fan.lowthresholds.warning =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_fan_r.fan_status[0].minspeed;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_fan.lowthresholds.shutdown =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_VAL_UNAVAILABLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_fan.lowthresholds.poweroff =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_VAL_UNAVAILABLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((rmc_fan_r.fan_status[0].flag &
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DP_FAN_SPEED_VAL_UNIT) == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel bcopy(str_rpm, env_fan.units,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (str_rpm));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel bcopy(str_percent, env_fan.units,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (str_percent));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (env_fan.sensor_status != ENVMON_SENSOR_OK ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_rmc_error != RMCLOMV_RMCERROR_NONE)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel set_fan_unav(&env_fan);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ddi_copyout((caddr_t)&env_fan, (caddr_t)arg,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (envmon_fan_t), mode) != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EFAULT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case ENVMONIOCAMPIND:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ddi_copyin((caddr_t)arg, (caddr_t)&env_ind,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (envmon_indicator_t), mode) != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EFAULT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* see if we've got amp indicator handles cached */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel LOCK_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_SENSOR_OK;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((rmclomv_cache_valid == B_FALSE) ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ((section = rmclomv_find_section(rmclomv_cache,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RMCLOMV_AMP_IND)) == NULL)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RELEASE_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (do_psu_cmd(arg, mode, &env_ind, &rmc_psu,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel &rmc_psu_r, RMCLOMV_AMP_IND));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (env_ind.id.name[0] == '\0') {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* request for first handle */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (section->num_entries == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RELEASE_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (do_psu_cmd(arg, mode, &env_ind,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel &rmc_psu, &rmc_psu_r, RMCLOMV_AMP_IND));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ind.next_id = section->entry[0].handle_name;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* ensure name is properly terminated */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ind.id.name[ENVMON_MAXNAMELEN - 1] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (get_sensor_by_name(section, env_ind.id.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel &index) != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RELEASE_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (do_psu_cmd(arg, mode, &env_ind,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel &rmc_psu, &rmc_psu_r, RMCLOMV_AMP_IND));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (index + 1 < section->num_entries) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ind.next_id =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section->entry[index + 1].handle_name;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_section_t *sub_section =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_find_section(rmclomv_subcache,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RMCLOMV_AMP_IND);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((sub_section == NULL) ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (sub_section->num_entries == 0))
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ind.next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ind.next_id =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sub_section->entry[0].handle_name;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (sensor_status == ENVMON_SENSOR_OK) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * user correctly identified an indicator, note its
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * handle value and request the indicator status
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_ampi.handle = section->entry[index].handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RELEASE_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((sensor_status == ENVMON_SENSOR_OK) && (rmclomv_rmc_error ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_do_cmd(DP_GET_CIRCUIT_BRKS, DP_GET_CIRCUIT_BRKS_R,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (rmc_ampi_r), (intptr_t)&rmc_ampi,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (intptr_t)&rmc_ampi_r) != 0)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_INACCESSIBLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((sensor_status == ENVMON_SENSOR_OK) &&
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (rmc_ampi_r.circuit_brk_status[0].sensor_status ==
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DP_SENSOR_NOT_PRESENT)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((env_ind.sensor_status = sensor_status) ==
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_SENSOR_OK) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * copy results into buffer for user
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rmc_ampi_r.circuit_brk_status[0].sensor_status !=
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DP_SENSOR_DATA_AVAILABLE)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ind.sensor_status = ENVMON_INACCESSIBLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ind.condition =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_ampi_r.circuit_brk_status[0].status;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * If rmclomv_rmc_error is set there is no way
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * that we read information from RSC. Just copy
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * out an inaccessible evironmental.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rmclomv_rmc_error != RMCLOMV_RMCERROR_NONE) {
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank env_ind.sensor_status = ENVMON_INACCESSIBLE;
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank env_ind.condition = ENVMON_INACCESSIBLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ddi_copyout((caddr_t)&env_ind, (caddr_t)arg,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (envmon_indicator_t), mode) != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EFAULT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case ENVMONIOCHPU:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ddi_copyin((caddr_t)arg, (caddr_t)&env_hpu,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (envmon_hpu_t), mode) != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EFAULT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* see if we've got hpu handles cached */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel LOCK_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((rmclomv_cache_valid == B_FALSE) ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ((section = rmclomv_find_section(rmclomv_cache,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RMCLOMV_HPU_IND)) == NULL)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RELEASE_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EAGAIN);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * At this point the cache is locked and section points to
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * the section relating to hpus.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_SENSOR_OK;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (env_hpu.id.name[0] == '\0') {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* request for first handle */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (section->num_entries == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_hpu.next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_hpu.next_id =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section->entry[0].handle_name;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* ensure name is properly terminated */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_hpu.id.name[ENVMON_MAXNAMELEN - 1] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (get_sensor_by_name(section, env_hpu.id.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel &index) != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_hpu.next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (index + 1 < section->num_entries)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_hpu.next_id =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section->entry[index + 1].handle_name;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_hpu.next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (sensor_status == ENVMON_SENSOR_OK) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * user correctly identified an hpu, note its
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * handle value and request the hpu status
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_fru.handle = section->entry[index].handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel special = section->entry[index].ind_mask;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RELEASE_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((env_hpu.sensor_status = sensor_status) ==
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_SENSOR_OK) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_hpu.fru_status = ENVMON_FRU_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (special != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* this is the pseudo SC node */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_enter(&rmclomv_state_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (rmclomv_rmc_state) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMCLOMV_RMCSTATE_OK:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMCLOMV_RMCSTATE_FAILED:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_hpu.fru_status = ENVMON_FRU_FAULT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMCLOMV_RMCSTATE_DOWNLOAD:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_hpu.fru_status =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_FRU_DOWNLOAD;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_hpu.sensor_status =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_INACCESSIBLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_exit(&rmclomv_state_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (rmclomv_rmc_error ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_do_cmd(DP_GET_FRU_STATUS,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DP_GET_FRU_STATUS_R, sizeof (rmc_fru_r),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (intptr_t)&rmc_fru, (intptr_t)&rmc_fru_r) != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_hpu.sensor_status = ENVMON_INACCESSIBLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * copy results into buffer for user
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rmc_fru_r.fru_status[0].presence == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_hpu.sensor_status =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_hpu.fru_status =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_FRU_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (rmc_fru_r.fru_status[0].sensor_status
3db86aab554edbb4244c8d1a1c90f152eee768afstevel != DP_SENSOR_DATA_AVAILABLE) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_hpu.sensor_status =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_INACCESSIBLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel uint8_t status =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_fru_r.fru_status[0].status;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (status == DP_FRU_STATUS_UNKNOWN) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_hpu.sensor_status =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_INACCESSIBLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (status != DP_FRU_STATUS_OK) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_hpu.fru_status =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_FRU_FAULT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * If rmclomv_rmc_error is set there is no way
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * that we read information from RSC. Just copy
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * out an inaccessible environmental.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rmclomv_rmc_error != RMCLOMV_RMCERROR_NONE) {
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank env_hpu.sensor_status = ENVMON_INACCESSIBLE;
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank env_hpu.fru_status = ENVMON_INACCESSIBLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ddi_copyout((caddr_t)&env_hpu, (caddr_t)arg,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (envmon_hpu_t), mode) != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EFAULT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case ENVMONIOCGETLED:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ddi_copyin((caddr_t)arg, (caddr_t)&env_ledinfo,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (envmon_led_info_t), mode) != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EFAULT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* see if we've got LED handles cached */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel LOCK_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_SENSOR_OK;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((rmclomv_cache_valid == B_FALSE) ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ((section = rmclomv_find_section(rmclomv_cache,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RMCLOMV_LED_IND)) == NULL)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ledinfo.next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (env_ledinfo.id.name[0] == '\0') {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* request for first handle */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (section->num_entries == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ledinfo.next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ledinfo.next_id =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section->entry[0].handle_name;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* ensure name is properly terminated */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ledinfo.id.name[ENVMON_MAXNAMELEN - 1] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (get_sensor_by_name(section, env_ledinfo.id.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel &index) != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ledinfo.next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (index + 1 < section->num_entries)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ledinfo.next_id =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section->entry[index + 1].handle_name;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ledinfo.next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (sensor_status == ENVMON_SENSOR_OK) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * user correctly identified a LED, note its
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * handle value and request the LED status
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_led.handle = section->entry[index].handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RELEASE_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((sensor_status == ENVMON_SENSOR_OK) && (rmclomv_rmc_error ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_do_cmd(DP_GET_LED_STATE, DP_GET_LED_STATE_R,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (rmc_led_r), (intptr_t)&rmc_led,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (intptr_t)&rmc_led_r) != 0)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_INACCESSIBLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((sensor_status == ENVMON_SENSOR_OK) &&
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (rmc_led_r.led_state[0].sensor_status ==
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DP_SENSOR_NOT_PRESENT)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((env_ledinfo.sensor_status = sensor_status) ==
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_SENSOR_OK) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * copy results into buffer for user
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * start with some defaults then override
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ledinfo.sensor_status = ENVMON_SENSOR_OK;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ledinfo.led_state = ENVMON_LED_OFF;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ledinfo.led_color = ENVMON_LED_CLR_NONE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rmc_led_r.led_state[0].sensor_status !=
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DP_SENSOR_DATA_AVAILABLE)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ledinfo.sensor_status = ENVMON_INACCESSIBLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_led_state_t ledState;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ledState = rmc_led_r.led_state[0];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ledinfo.led_color = (int8_t)ledState.colour;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (ledState.state) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case (rsci8)DP_LED_OFF:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case (rsci8)DP_LED_ON:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ledinfo.led_state = ENVMON_LED_ON;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case (rsci8)DP_LED_BLINKING:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ledinfo.led_state =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_LED_BLINKING;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case (rsci8)DP_LED_FLASHING:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ledinfo.led_state =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_LED_FLASHING;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * If rmclomv_rmc_error is set there is no way
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * that we read information from RSC. Just copy
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * out an inaccessible environmental.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rmclomv_rmc_error != RMCLOMV_RMCERROR_NONE) {
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank env_ledinfo.sensor_status = ENVMON_INACCESSIBLE;
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank env_ledinfo.led_state = ENVMON_INACCESSIBLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ddi_copyout((caddr_t)&env_ledinfo, (caddr_t)arg,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (envmon_led_info_t), mode) != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EFAULT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case ENVMONIOCSETLED:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((mode & FWRITE) == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EACCES);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (drv_priv(cred_p) != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EPERM);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ddi_copyin((caddr_t)arg, (caddr_t)&env_ledctl,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (envmon_led_ctl_t), mode) != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EFAULT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (env_ledctl.led_state < RMCLOMV_MIN_LED_STATE ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ledctl.led_state > RMCLOMV_MAX_LED_STATE)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EINVAL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Ensure name is properly terminated.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ledctl.id.name[ENVMON_MAXNAMELEN - 1] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* see if we've got LED handles cached */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel LOCK_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((rmclomv_cache_valid == B_FALSE) ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ((section = rmclomv_find_section(rmclomv_cache,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RMCLOMV_LED_IND)) == NULL) ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (get_sensor_by_name(section, env_ledctl.id.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel &index) != 0)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RELEASE_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EINVAL); /* no such LED */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * user correctly identified a LED, note its handle value
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_setled.handle = section->entry[index].handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RELEASE_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (env_ledctl.led_state) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case ENVMON_LED_ON:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_setled.state = DP_LED_ON;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case ENVMON_LED_BLINKING:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_setled.state = DP_LED_BLINKING;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case ENVMON_LED_FLASHING:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_setled.state = DP_LED_FLASHING;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_setled.state = DP_LED_OFF;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel retval = rmclomv_do_cmd(DP_SET_LED_STATE, DP_SET_LED_STATE_R,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (rmc_setled_r), (intptr_t)&rmc_setled,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (intptr_t)&rmc_setled_r);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (retval != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rmc_setled_r.status != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN, "ENVMONIOCSETLED: \"%s\" status: 0x%x",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_ledctl.id.name, rmc_setled_r.status);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EIO);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case ENVMONIOCGETKEYSW:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel enum rmc_keyswitch_pos rmc_pos = real_key_position;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel envmon_keysw_pos_t envmon_pos;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Yes, I know this is ugly, but the V210 has no keyswitch,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * even though the ALOM returns a value for it
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (strcmp(platform, "SUNW,Sun-Fire-V210") == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ENOTSUP);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (rmc_pos) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMC_KEYSWITCH_POS_NORMAL:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel envmon_pos = ENVMON_KEYSW_POS_NORMAL;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMC_KEYSWITCH_POS_DIAG:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel envmon_pos = ENVMON_KEYSW_POS_DIAG;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMC_KEYSWITCH_POS_LOCKED:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel envmon_pos = ENVMON_KEYSW_POS_LOCKED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case RMC_KEYSWITCH_POS_OFF:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel envmon_pos = ENVMON_KEYSW_POS_OFF;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel envmon_pos = ENVMON_KEYSW_POS_UNKNOWN;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ddi_copyout((caddr_t)&envmon_pos, (caddr_t)arg,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (envmon_pos), mode) != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EFAULT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case ENVMONIOCGETALARM:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ddi_copyin((caddr_t)arg, (caddr_t)&env_alarminfo,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (envmon_alarm_info_t), mode) != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EFAULT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* see if we've got ALARM handles cached */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel LOCK_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_SENSOR_OK;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((rmclomv_cache_valid == B_FALSE) ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ((section = rmclomv_find_section(rmclomv_cache,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RMCLOMV_ALARM_IND)) == NULL)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_alarminfo.next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (env_alarminfo.id.name[0] == '\0') {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* request for first handle */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (section->num_entries == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_alarminfo.next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_alarminfo.next_id =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section->entry[0].handle_name;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* ensure name is properly terminated */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_alarminfo.id.name[ENVMON_MAXNAMELEN - 1] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (get_sensor_by_name(section, env_alarminfo.id.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel &index) != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_alarminfo.next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (index + 1 < section->num_entries)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_alarminfo.next_id =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel section->entry[index + 1].handle_name;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_alarminfo.next_id.name[0] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (sensor_status == ENVMON_SENSOR_OK) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * user correctly identified a ALARM, note its
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * handle value and request the ALARM status
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_alarm.handle = section->entry[index].handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RELEASE_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((sensor_status == ENVMON_SENSOR_OK) &&
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank (rmclomv_rmc_error ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_do_cmd(DP_GET_ALARM_STATE, DP_GET_ALARM_STATE_R,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (rmc_alarm_r), (intptr_t)&rmc_alarm,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (intptr_t)&rmc_alarm_r) != 0)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_INACCESSIBLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((env_alarminfo.sensor_status = sensor_status) ==
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ENVMON_SENSOR_OK) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * copy results into buffer for user
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * start with some defaults then override
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_alarminfo.sensor_status = ENVMON_SENSOR_OK;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_alarminfo.alarm_state = ENVMON_ALARM_OFF;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rmc_alarm_r.alarm_state[0].sensor_status !=
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DP_SENSOR_DATA_AVAILABLE)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_alarminfo.sensor_status =
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank ENVMON_INACCESSIBLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_alarm_state_t alarmState;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel alarmState = rmc_alarm_r.alarm_state[0];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (alarmState.state) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DP_ALARM_OFF:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DP_ALARM_ON:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_alarminfo.alarm_state =
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank ENVMON_ALARM_ON;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * If rmclomv_rmc_error is set there is no way
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * that we read information from RSC. Just copy
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * out an inaccessible environmental.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rmclomv_rmc_error != RMCLOMV_RMCERROR_NONE) {
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank env_alarminfo.sensor_status = ENVMON_INACCESSIBLE;
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank env_alarminfo.alarm_state = ENVMON_INACCESSIBLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ddi_copyout((caddr_t)&env_alarminfo, (caddr_t)arg,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (envmon_alarm_info_t), mode) != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EFAULT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case ENVMONIOCSETALARM:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((mode & FWRITE) == 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EACCES);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (drv_priv(cred_p) != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EPERM);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ddi_copyin((caddr_t)arg, (caddr_t)&env_alarmctl,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (envmon_alarm_ctl_t), mode) != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EFAULT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (env_alarmctl.alarm_state < RMCLOMV_MIN_ALARM_STATE ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_alarmctl.alarm_state > RMCLOMV_MAX_ALARM_STATE)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EINVAL);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Ensure name is properly terminated.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel env_alarmctl.id.name[ENVMON_MAXNAMELEN - 1] = '\0';
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* see if we've got ALARM handles cached */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel LOCK_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((rmclomv_cache_valid == B_FALSE) ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ((section = rmclomv_find_section(rmclomv_cache,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RMCLOMV_ALARM_IND)) == NULL) ||
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (get_sensor_by_name(section, env_alarmctl.id.name,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel &index) != 0)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RELEASE_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EINVAL); /* no such ALARM */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * user correctly identified a ALARM, note its handle value
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_setalarm.handle = section->entry[index].handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RELEASE_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_setalarm.state = (rsci8)env_alarmctl.alarm_state;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel retval = rmclomv_do_cmd(DP_SET_ALARM_STATE,
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank DP_SET_ALARM_STATE_R,
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank sizeof (rmc_setalarm_r),
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank (intptr_t)&rmc_setalarm,
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank (intptr_t)&rmc_setalarm_r);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (retval != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rmc_setalarm_r.status != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN, "ENVMONIOCSETALARM: \"%s\" status: "
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank "0x%x", env_alarmctl.id.name,
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank rmc_setalarm_r.status);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EIO);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case ENVMONIOCCHASSISSERIALNUM:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel retval = rmclomv_do_cmd(DP_GET_SDP_VERSION,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DP_GET_SDP_VERSION_R, sizeof (rmc_sdpver_r),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel NULL, (intptr_t)&rmc_sdpver_r);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (retval != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN, "DP_GET_SDP_VERSION failed, ret=%d\n",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel retval);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else if (rmc_sdpver_r.version < SDP_RESPONDS_TO_ALL_CMDS) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel retval = ENOTSUP;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel retval = rmclomv_do_cmd(DP_GET_CHASSIS_SERIALNUM,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DP_GET_CHASSIS_SERIALNUM_R, sizeof (rmc_serialnum_r),
3db86aab554edbb4244c8d1a1c90f152eee768afstevel NULL, (intptr_t)&rmc_serialnum_r);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (retval != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel bcopy(rmc_serialnum_r.chassis_serial_number,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel chassis.serial_number,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (rmc_serialnum_r.chassis_serial_number));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (ddi_copyout((caddr_t)&chassis, (caddr_t)arg,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (chassis), mode) != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EFAULT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_SENSOR_OK;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel retval = ENOTSUP;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (retval);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/* ARGSUSED */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmclomv_checkrmc(caddr_t arg)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel callb_cpr_t cprinfo;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int err;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int retries;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int state;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_sysinfo_r_t sysinfo;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel CALLB_CPR_INIT(&cprinfo, &rmclomv_checkrmc_lock, callb_generic_cpr,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "rmclomv_checkrmc");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_enter(&rmclomv_checkrmc_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (;;) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Initial entry to this for loop is made with
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * rmclomv_checkrmc_sig set to RMCLOMV_PROCESS_NOW. So the
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * following while loop drops through the first time. A
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * timeout call is made just before polling the RMC. Its
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * interrupt routine sustains this loop by injecting additional
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * state changes and cv events.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Wait for someone to tell me to continue.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel while (rmclomv_checkrmc_sig == RMCLOMV_CHECKRMC_WAIT) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel CALLB_CPR_SAFE_BEGIN(&cprinfo);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cv_wait(&rmclomv_checkrmc_sig_cv,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel &rmclomv_checkrmc_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel CALLB_CPR_SAFE_END(&cprinfo, &rmclomv_checkrmc_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_exit(&rmclomv_checkrmc_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * mustn't hold same lock as timeout called with
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * when cancelling timer
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (timer_id != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) untimeout(timer_id);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel timer_id = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_enter(&rmclomv_checkrmc_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* RMCLOMV_CHECKRMC_EXITNOW implies signal by _detach(). */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rmclomv_checkrmc_sig == RMCLOMV_CHECKRMC_EXITNOW) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_checkrmc_sig = RMCLOMV_CHECKRMC_WAIT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* rmclomv_checkrmc_lock is held at this point! */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel CALLB_CPR_EXIT(&cprinfo);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel thread_exit();
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* NOTREACHED */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_checkrmc_sig = RMCLOMV_CHECKRMC_WAIT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * If the RMC is not responding, rmclomv_do_cmd() takes a
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * long time and eventually times out. We conclude that the
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * RMC is broken if it doesn't respond to a number of polls
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * made 60 secs apart. So that the rmclomv_do_cmd() time-out
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * period isn't added to our 60 second timer, make the
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * timeout() call before calling rmclomv_do_cmd().
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (timer_id == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel timer_id = timeout(rmclomv_checkrmc_wakeup, NULL,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel 60 * drv_usectohz(1000000));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_exit(&rmclomv_checkrmc_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel err = rmclomv_do_cmd(DP_GET_SYSINFO, DP_GET_SYSINFO_R,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sizeof (sysinfo), NULL, (intptr_t)&sysinfo);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (err == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_enter(&rmclomv_state_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel state = rmclomv_rmc_state;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* successful poll, reset fail count */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_rmcfailcount = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_exit(&rmclomv_state_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (state != RMCLOMV_RMCSTATE_OK) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_refresh_wakeup();
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((err != 0) &&
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (rmclomv_rmc_error != RMCLOMV_RMCSTATE_DOWNLOAD)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Failed response or no response from RMC.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Count the failure.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * If threshold exceeded, send a DR event.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_enter(&rmclomv_state_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel retries = rmclomv_rmcfailcount;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel state = rmclomv_rmc_state;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (retries == RMCLOMV_RMCFAILTHRESHOLD)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_rmc_state = RMCLOMV_RMCSTATE_FAILED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rmclomv_rmcfailcount <= RMCLOMV_RMCFAILTHRESHOLD)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_rmcfailcount++;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_exit(&rmclomv_state_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (retries == RMCLOMV_RMCFAILTHRESHOLD) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_WARN, "SC %s responding",
3db86aab554edbb4244c8d1a1c90f152eee768afstevel state == RMCLOMV_RMCSTATE_OK ?
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "has stopped" : "is not");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel refresh_name_cache(B_TRUE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_dr_data_handler(str_sc, SE_NO_HINT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Re-enter the lock to prepare for another iteration.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * We must have the lock here to protect rmclomv_checkrmc_sig.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_enter(&rmclomv_checkrmc_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmclomv_checkrmc_start(void)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel kthread_t *tp;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_enter(&rmclomv_checkrmc_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rmclomv_checkrmc_tid == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_checkrmc_sig = RMCLOMV_CHECKRMC_PROCESSNOW;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel tp = thread_create(NULL, 0, rmclomv_checkrmc, NULL, 0,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel &p0, TS_RUN, maxclsyspri);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_checkrmc_tid = tp->t_did;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_exit(&rmclomv_checkrmc_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmclomv_checkrmc_destroy(void)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel kt_did_t tid;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_enter(&rmclomv_checkrmc_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel tid = rmclomv_checkrmc_tid;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (tid != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_checkrmc_sig = RMCLOMV_CHECKRMC_EXITNOW;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cv_signal(&rmclomv_checkrmc_sig_cv);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_checkrmc_tid = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_exit(&rmclomv_checkrmc_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Wait for rmclomv_checkrmc() to finish
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (tid != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel thread_join(tid);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*ARGSUSED*/
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmclomv_checkrmc_wakeup(void *arg)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_enter(&rmclomv_checkrmc_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rmclomv_checkrmc_sig != RMCLOMV_CHECKRMC_EXITNOW)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_checkrmc_sig = RMCLOMV_CHECKRMC_PROCESSNOW;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cv_signal(&rmclomv_checkrmc_sig_cv);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_exit(&rmclomv_checkrmc_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/* ARGSUSED */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmclomv_refresh(caddr_t arg)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel void (*plat_nodename_set_fun)(void);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sig_state_t *current_sgn_p;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel callb_cpr_t cprinfo;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int state;
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank int tmp_checkrmc_sig;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel CALLB_CPR_INIT(&cprinfo, &rmclomv_refresh_lock, callb_generic_cpr,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "rmclomv_refresh");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank /*
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank * Wait until the rmclomv_checkrmc() thread has had a chance to
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank * run its main loop. This is done so that rmclomv_refresh will
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank * only run its main loop once at start of day; otherwise, it may
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank * run twice and generate warning messages when redundantly populating
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank * its internal cache.
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank */
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank do {
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank delay(drv_usectohz(DELAY_TIME));
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank mutex_enter(&rmclomv_checkrmc_lock);
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank tmp_checkrmc_sig = rmclomv_checkrmc_sig;
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank mutex_exit(&rmclomv_checkrmc_lock);
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank } while (tmp_checkrmc_sig != RMCLOMV_CHECKRMC_WAIT);
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_enter(&rmclomv_refresh_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel for (;;) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Wait for someone to tell me to continue.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel while (rmclomv_refresh_sig == RMCLOMV_REFRESH_WAIT) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel CALLB_CPR_SAFE_BEGIN(&cprinfo);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cv_wait(&rmclomv_refresh_sig_cv, &rmclomv_refresh_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel CALLB_CPR_SAFE_END(&cprinfo, &rmclomv_refresh_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* RMCLOMV_REFRESH_EXITNOW implies signal by _detach(). */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rmclomv_refresh_sig == RMCLOMV_REFRESH_EXITNOW) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_refresh_sig = RMCLOMV_REFRESH_WAIT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* rmclomv_refresh_lock is held at this point! */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel CALLB_CPR_EXIT(&cprinfo);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel thread_exit();
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* NOTREACHED */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ASSERT(rmclomv_refresh_sig == RMCLOMV_REFRESH_PROCESSNOW);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_refresh_sig = RMCLOMV_REFRESH_WAIT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_exit(&rmclomv_refresh_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel refresh_name_cache(B_FALSE);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * We're not going to access rmclomv_sysinfo_data here,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * so there's no point in locking it before reading
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * rmclomv_sysinfo_valid. Also this avoids holding two
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * locks at once and the concommitant worry about deadlocks.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rmclomv_sysinfo_valid) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * We've just successfully read the RMC sysinfo
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * so the RMC must be operational. Update its
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * state and if it was previously not OK, refresh
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * nodename, CPU signatures and watchdog settings.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_enter(&rmclomv_state_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_rmcfailcount = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel state = rmclomv_rmc_state;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_rmc_state = RMCLOMV_RMCSTATE_OK;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_exit(&rmclomv_state_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (state != RMCLOMV_RMCSTATE_OK) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_dr_data_handler(str_sc, SE_NO_HINT);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (state == RMCLOMV_RMCSTATE_FAILED) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cmn_err(CE_NOTE, "SC recovered");
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (utsname.nodename[0] != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel plat_nodename_set_fun =
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void (*)(void))modgetsymvalue(
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "plat_nodename_set", 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (plat_nodename_set_fun != NULL)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel plat_nodename_set_fun();
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel current_sgn_p = (sig_state_t *)modgetsymvalue(
3db86aab554edbb4244c8d1a1c90f152eee768afstevel "current_sgn", 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank /*
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank * Delay before calling CPU_SIGNATURE, to allow
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank * any pending asynchronous communications (i.e.
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank * plat_timesync()) to complete. This helps to
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank * prevent the situation where the message associated
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank * with the CPU_SIGNATURE state cannot be sent to the
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank * system controller.
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((current_sgn_p != NULL) &&
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (current_sgn_p->state_t.sig != 0)) {
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank delay(drv_usectohz(CPU_SIGNATURE_DELAY_TIME));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel CPU_SIGNATURE(current_sgn_p->state_t.sig,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel current_sgn_p->state_t.state,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel current_sgn_p->state_t.sub_state, -1);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (!(boothowto & RB_DEBUG)) {
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank /*
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank * Delay before calling
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank * send_watchdog_msg, to allow
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank * CPU_SIGNATURE() time to
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank * complete; this increases the
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank * chances of successfully sending
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank * the watchdog message to the
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank * system controller.
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank */
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank delay(drv_usectohz(
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank CPU_SIGNATURE_DELAY_TIME));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel send_watchdog_msg(last_watchdog_msg);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * update keyswitch value in case it changed while the
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * RMC was out of action
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel LOCK_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rmclomv_sysinfo_valid) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel real_key_position = rmclomv_sysinfo_data.keyswitch;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((real_key_position != RMC_KEYSWITCH_POS_UNKNOWN) &&
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (real_key_position <= RMC_KEYSWITCH_POS_OFF)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel key_position = real_key_position;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* treat unknown key position as locked */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel key_position = RMC_KEYSWITCH_POS_LOCKED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* treat unreadable key position as locked */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel key_position = RMC_KEYSWITCH_POS_LOCKED;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel real_key_position = RMC_KEYSWITCH_POS_UNKNOWN;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RELEASE_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Re-enter the lock to prepare for another iteration.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * We must have the lock here to protect rmclomv_refresh_sig.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_enter(&rmclomv_refresh_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmclomv_refresh_start(void)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel kthread_t *tp;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_enter(&rmclomv_refresh_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rmclomv_refresh_tid == 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_refresh_sig = RMCLOMV_REFRESH_PROCESSNOW;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel tp = thread_create(NULL, 0, rmclomv_refresh, NULL, 0,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel &p0, TS_RUN, maxclsyspri);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_refresh_tid = tp->t_did;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_exit(&rmclomv_refresh_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmclomv_refresh_destroy(void)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel kt_did_t tid;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_enter(&rmclomv_refresh_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel tid = rmclomv_refresh_tid;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (tid != 0) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_refresh_sig = RMCLOMV_REFRESH_EXITNOW;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cv_signal(&rmclomv_refresh_sig_cv);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_refresh_tid = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_exit(&rmclomv_refresh_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Wait for rmclomv_refresh() to finish
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (tid != 0)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel thread_join(tid);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmclomv_refresh_wakeup(void)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_enter(&rmclomv_refresh_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rmclomv_refresh_sig != RMCLOMV_REFRESH_EXITNOW)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_refresh_sig = RMCLOMV_REFRESH_PROCESSNOW;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel cv_signal(&rmclomv_refresh_sig_cv);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_exit(&rmclomv_refresh_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelsend_watchdog_msg(int msg)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_comm_msg_t request;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_set_host_watchdog_t watchdog_msg;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (rmclomv_watchdog_mode)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel watchdog_msg.enable = msg;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel request.msg_type = DP_SET_HOST_WATCHDOG;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel request.msg_len = sizeof (watchdog_msg);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel request.msg_buf = (caddr_t)&watchdog_msg;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) rmc_comm_request_nowait(&request, (msg == 1) ?
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RMC_COMM_DREQ_URGENT : 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*ARGSUSED*/
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic uint_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmc_set_watchdog_timer(uint_t timeoutval)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ASSERT(MUTEX_HELD(&tod_lock));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((watchdog_enable == 0) || (watchdog_available == 0)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * If boothowto has RB_DEBUG set we never want to set the watchdog
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * support on.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (boothowto & RB_DEBUG) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * When the watchdog is shut off last_watchdog_msg goes from a
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * 0 to a 1. So we must test to see that last_watchdog_msg is
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * set to 1 indicating that watchdog was shut off and
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * After which we set last_watchdog_msg back to 0 so that we do not
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * run this code
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * again.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (last_watchdog_msg == 1) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel send_watchdog_msg(0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel last_watchdog_msg = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel pmugpio_watchdog_pat();
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel watchdog_activated = 1;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (1);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic uint_t
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmc_clear_watchdog_timer(void)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ASSERT(MUTEX_HELD(&tod_lock));
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((watchdog_activated == 0) || (boothowto & RB_DEBUG))
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel send_watchdog_msg(1);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel last_watchdog_msg = 1;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel watchdog_activated = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelstatic void
3db86aab554edbb4244c8d1a1c90f152eee768afstevelplat_timesync(void *arg)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel timestruc_t now;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel todinfo_t tod;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmc_comm_msg_t request;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_set_date_time_t set_time_msg;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int retval;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel timestruc_t ts;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_date_time_r_t *date_and_time_info;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int buffer[DATE_TIME_MSG_SIZE];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* Is the system coming up? */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (arg != NULL) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* Request the time from the RMC clock. */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel retval = rmclomv_do_cmd(DP_GET_DATE_TIME, DP_GET_DATE_TIME_R,
3db86aab554edbb4244c8d1a1c90f152eee768afstevel DATE_TIME_MSG_SIZE, NULL, (intptr_t)&buffer);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * If we were able to get the time lets set the local clock.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * The time returned from RMC is in Unix time format.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * If we couldn't get the time we'll accept the drift so as not
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * to cause congestion on the I2C bus or cause boot
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * performance regressions.
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (retval == RCNOERR) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel date_and_time_info = (dp_get_date_time_r_t *)buffer;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ts.tv_sec = date_and_time_info->current_datetime;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel ts.tv_nsec = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_enter(&tod_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel tod_set(ts);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel set_hrestime(&ts);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_exit(&tod_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel gethrestime(&now);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_enter(&tod_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel tod = utc_to_tod(now.tv_sec);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel mutex_exit(&tod_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel set_time_msg.year = tod.tod_year;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel set_time_msg.month = tod.tod_month - 1;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel set_time_msg.day = tod.tod_day;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel set_time_msg.hour = tod.tod_hour;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel set_time_msg.minute = tod.tod_min;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel set_time_msg.second = tod.tod_sec;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel request.msg_type = DP_SET_DATE_TIME;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel request.msg_len = sizeof (set_time_msg);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel request.msg_buf = (caddr_t)&set_time_msg;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel (void) rmc_comm_request_nowait(&request, 0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mutex_enter(&timesync_lock);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (timesync_interval != 0)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng timesync_tid = timeout(plat_timesync, NULL, timesync_interval);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mutex_exit(&timesync_lock);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel/*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * Interfaces to get/set alarm relays from outside
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevelint
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmclomv_alarm_get(int alarm_type, int *alarm_state)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_section_t *section;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int index;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel uint16_t sensor_status;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_alarm_state_t u_rmc_alarm;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_get_alarm_state_r_t u_rmc_alarm_r;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* see if we've got ALARM handles cached */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel LOCK_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_SENSOR_OK;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((rmclomv_cache_valid == B_FALSE) ||
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank ((section = rmclomv_find_section(rmclomv_cache,
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank RMCLOMV_ALARM_IND)) == NULL)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (sensor_status == ENVMON_SENSOR_OK) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * user correctly identified a ALARM, note its
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * handle value and request the ALARM status
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel index = alarm_type;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (index >= section->num_entries)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_INACCESSIBLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel u_rmc_alarm.handle = section->entry[index].handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RELEASE_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((sensor_status == ENVMON_SENSOR_OK) && (rmclomv_rmc_error ||
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank rmclomv_do_cmd(DP_GET_ALARM_STATE, DP_GET_ALARM_STATE_R,
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank sizeof (u_rmc_alarm_r), (intptr_t)&u_rmc_alarm,
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank (intptr_t)&u_rmc_alarm_r) != 0)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_INACCESSIBLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (sensor_status == ENVMON_SENSOR_OK) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * copy results into buffer for user
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * start with some defaults then override
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *alarm_state = 0;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (u_rmc_alarm_r.alarm_state[0].sensor_status !=
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank DP_SENSOR_DATA_AVAILABLE)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ENXIO);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_alarm_state_t alarmState;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel alarmState = u_rmc_alarm_r.alarm_state[0];
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel switch (alarmState.state) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DP_ALARM_OFF:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel case DP_ALARM_ON:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel *alarm_state = 1;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel default:
3db86aab554edbb4244c8d1a1c90f152eee768afstevel break;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel } else
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ENXIO);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevelint
3db86aab554edbb4244c8d1a1c90f152eee768afstevelrmclomv_alarm_set(int alarm_type, int new_state)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel{
3db86aab554edbb4244c8d1a1c90f152eee768afstevel rmclomv_cache_section_t *section;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel int index;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel uint16_t sensor_status;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_set_alarm_state_t u_rmc_setalarm;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel dp_set_alarm_state_r_t u_rmc_setalarm_r;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /* see if we've got ALARM handles cached */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel LOCK_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_SENSOR_OK;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((rmclomv_cache_valid == B_FALSE) ||
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank ((section = rmclomv_find_section(rmclomv_cache,
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank RMCLOMV_ALARM_IND)) == NULL)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_NOT_PRESENT;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (sensor_status == ENVMON_SENSOR_OK) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel /*
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * user correctly identified a ALARM, note its
3db86aab554edbb4244c8d1a1c90f152eee768afstevel * handle value and request the ALARM status
3db86aab554edbb4244c8d1a1c90f152eee768afstevel */
3db86aab554edbb4244c8d1a1c90f152eee768afstevel index = alarm_type;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (index >= section->num_entries)
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_INACCESSIBLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel else {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel u_rmc_setalarm.handle = section->entry[index].handle;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel u_rmc_setalarm.state = new_state;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel RELEASE_CACHE
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if ((sensor_status == ENVMON_SENSOR_OK) &&
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank (rmclomv_rmc_error ||
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank rmclomv_do_cmd(DP_SET_ALARM_STATE, DP_SET_ALARM_STATE_R,
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank sizeof (u_rmc_setalarm_r), (intptr_t)&u_rmc_setalarm,
f594b28ae1d884a53b99c552b3ee660cdea09026jfrank (intptr_t)&u_rmc_setalarm_r) != 0)) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel sensor_status = ENVMON_INACCESSIBLE;
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (u_rmc_setalarm_r.status != DP_SET_ALARM_OK) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (EIO);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel if (sensor_status != ENVMON_SENSOR_OK) {
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (ENXIO);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel }
3db86aab554edbb4244c8d1a1c90f152eee768afstevel
3db86aab554edbb4244c8d1a1c90f152eee768afstevel return (0);
3db86aab554edbb4244c8d1a1c90f152eee768afstevel}