03831d35f7499c87d51205817c93e9a8d42c4baestevel * CDDL HEADER START
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The contents of this file are subject to the terms of the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Common Development and Distribution License (the "License").
03831d35f7499c87d51205817c93e9a8d42c4baestevel * You may not use this file except in compliance with the License.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
03831d35f7499c87d51205817c93e9a8d42c4baestevel * See the License for the specific language governing permissions
03831d35f7499c87d51205817c93e9a8d42c4baestevel * and limitations under the License.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * When distributing Covered Code, include this CDDL HEADER in each
03831d35f7499c87d51205817c93e9a8d42c4baestevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If applicable, add the following below this CDDL HEADER, with the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * fields enclosed by brackets "[]" replaced with your own identifying
03831d35f7499c87d51205817c93e9a8d42c4baestevel * information: Portions Copyright [yyyy] [name of copyright owner]
03831d35f7499c87d51205817c93e9a8d42c4baestevel * CDDL HEADER END
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Use is subject to license terms.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Global Variables - can be patched from Solaris
03831d35f7499c87d51205817c93e9a8d42c4baestevel * ==============================================
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Module Variables
03831d35f7499c87d51205817c93e9a8d42c4baestevel * ================
03831d35f7499c87d51205817c93e9a8d42c4baestevel * functions local to this driver.
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int lw8_attach(dev_info_t *dip, ddi_attach_cmd_t cmd);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int lw8_detach(dev_info_t *dip, ddi_detach_cmd_t cmd);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int lw8_add_intr_handlers(void);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int lw8_remove_intr_handlers(void);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void lw8_wakeup_sleepers(void);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int lw8_open(dev_t *dev_p, int flag, int otyp, cred_t *cred_p);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int lw8_close(dev_t dev, int flag, int otyp, cred_t *cred_p);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int lw8_ioctl(dev_t dev, int cmd, intptr_t arg, int mode,
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void lw8_logger_start(void);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void lw8_logger_destroy(void);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void lw8_logger_wakeup(void);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Driver entry points
03831d35f7499c87d51205817c93e9a8d42c4baestevel 0, /* ref count */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Loadable module support.
03831d35f7499c87d51205817c93e9a8d42c4baestevel &mod_driverops, /* Type of module. This is a driver */
193974072f41a843678abf5f61979c748687e66bSherry Moore "Netra-T12 control driver", /* Name of the module */
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define SHUTDOWN_EVENT_MSG "lw8: system shutdown due to " \
03831d35f7499c87d51205817c93e9a8d42c4baestevel "SC request.\n"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define VOLTAGE_EVENT_MSG "lw8: system shutdown due to " \
03831d35f7499c87d51205817c93e9a8d42c4baestevel "voltage out of range.\n"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define TEMPERATURE_EVENT_MSG "lw8: system shutdown due to " \
03831d35f7499c87d51205817c93e9a8d42c4baestevel "temperature exceeding limits.\n"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define FANFAIL_EVENT_MSG "lw8: system shutdown due to " \
03831d35f7499c87d51205817c93e9a8d42c4baestevel "too many fan failures.\n"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define NO_SCC_EVENT_MSG "lw8: system shutdown due to " \
03831d35f7499c87d51205817c93e9a8d42c4baestevel "no system configuration card.\n"
03831d35f7499c87d51205817c93e9a8d42c4baestevel * led table - the following provides a cache of the led state - needed
03831d35f7499c87d51205817c93e9a8d42c4baestevel * to avoid the overhead of readoing from the SC each time
03831d35f7499c87d51205817c93e9a8d42c4baestevel "predicted_fault", LOM_LED_POSITION_FRU, 0, "amber"},
03831d35f7499c87d51205817c93e9a8d42c4baestevel "predicted_fault", LOM_LED_POSITION_FRU, 0, "amber"},
03831d35f7499c87d51205817c93e9a8d42c4baestevel "predicted_fault", LOM_LED_POSITION_FRU, 0, "amber"},
03831d35f7499c87d51205817c93e9a8d42c4baestevel "predicted_fault", LOM_LED_POSITION_FRU, 0, "amber"},
03831d35f7499c87d51205817c93e9a8d42c4baestevel "FAN0", {"fault", LOM_LED_POSITION_LOCATION, 0, "amber"},
03831d35f7499c87d51205817c93e9a8d42c4baestevel "FAN1", {"fault", LOM_LED_POSITION_LOCATION, 0, "amber"},
03831d35f7499c87d51205817c93e9a8d42c4baestevel "FAN2", {"fault", LOM_LED_POSITION_LOCATION, 0, "amber"},
03831d35f7499c87d51205817c93e9a8d42c4baestevel "FAN3", {"fault", LOM_LED_POSITION_LOCATION, 0, "amber"},
03831d35f7499c87d51205817c93e9a8d42c4baestevel "FAN4", {"fault", LOM_LED_POSITION_LOCATION, 0, "amber"},
03831d35f7499c87d51205817c93e9a8d42c4baestevel "FAN5", {"fault", LOM_LED_POSITION_LOCATION, 0, "amber"},
03831d35f7499c87d51205817c93e9a8d42c4baestevel "FAN6", {"fault", LOM_LED_POSITION_LOCATION, 0, "amber"},
03831d35f7499c87d51205817c93e9a8d42c4baestevel "FAN7", {"fault", LOM_LED_POSITION_LOCATION, 0, "amber"},
03831d35f7499c87d51205817c93e9a8d42c4baestevel "FAN8", {"fault", LOM_LED_POSITION_LOCATION, 0, "amber"},
03831d35f7499c87d51205817c93e9a8d42c4baestevel "FAN9", {"fault", LOM_LED_POSITION_LOCATION, 0, "amber"},
03831d35f7499c87d51205817c93e9a8d42c4baestevel "DISK0", {"fault", LOM_LED_POSITION_LOCATION, 0, "amber",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "ok_to_remove", LOM_LED_POSITION_LOCATION, 0, "blue"},
03831d35f7499c87d51205817c93e9a8d42c4baestevel "DISK1", {"fault", LOM_LED_POSITION_LOCATION, 0, "amber",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "ok_to_remove", LOM_LED_POSITION_LOCATION, 0, "blue"},
03831d35f7499c87d51205817c93e9a8d42c4baestevel "chassis", {"fault", LOM_LED_POSITION_FRU, 0, "amber",
03831d35f7499c87d51205817c93e9a8d42c4baestevel * mutexes which protect the interrupt handlers.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * state booleans
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Payloads of the event handlers.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The IDs of the soft interrupts
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Logger commands..
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Logger thread state
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_init(&lw8_shutdown_hdlr_lock, NULL, MUTEX_DEFAULT, NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_init(&lw8_dr_hdlr_lock, NULL, MUTEX_DEFAULT, NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_init(&lw8_env_hdlr_lock, NULL, MUTEX_DEFAULT, NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_init(&lw8_cap_msg_hdlr_lock, NULL, MUTEX_DEFAULT, NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_init(&lw8_event_mutex, NULL, MUTEX_DRIVER, NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_init(&lw8_logger_lock, NULL, MUTEX_DRIVER, NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * only allow one instance
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Add the handlers which watch for unsolicited messages
03831d35f7499c87d51205817c93e9a8d42c4baestevel * and post event to Sysevent Framework.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Remove the handlers which watch for unsolicited messages
03831d35f7499c87d51205817c93e9a8d42c4baestevel * and post event to Sysevent Framework.
03831d35f7499c87d51205817c93e9a8d42c4baestevel lw8_shutdown_payload_msg.msg_buf = (caddr_t)&lw8_shutdown_payload;
03831d35f7499c87d51205817c93e9a8d42c4baestevel lw8_shutdown_payload_msg.msg_len = sizeof (lw8_shutdown_payload);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = sbbc_mbox_reg_intr(MBOX_EVENT_LW8, lw8_event_data_handler,
03831d35f7499c87d51205817c93e9a8d42c4baestevel &lw8_shutdown_payload_msg, NULL, &lw8_shutdown_hdlr_lock);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmn_err(CE_WARN, "Failed to register MBOX_EVENT_LW8 "
03831d35f7499c87d51205817c93e9a8d42c4baestevel lw8_dr_payload_msg.msg_buf = (caddr_t)&lw8_dr_payload;
03831d35f7499c87d51205817c93e9a8d42c4baestevel lw8_dr_payload_msg.msg_len = sizeof (lw8_dr_payload);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = sbbc_mbox_reg_intr(MBOX_EVENT_GENERIC, lw8_dr_data_handler,
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmn_err(CE_WARN, "Failed to register MBOX_EVENT_GENERIC "
03831d35f7499c87d51205817c93e9a8d42c4baestevel lw8_env_payload_msg.msg_buf = (caddr_t)&lw8_env_payload;
03831d35f7499c87d51205817c93e9a8d42c4baestevel lw8_env_payload_msg.msg_len = sizeof (lw8_env_payload);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = sbbc_mbox_reg_intr(MBOX_EVENT_ENV, lw8_env_data_handler,
193974072f41a843678abf5f61979c748687e66bSherry Moore &lw8_env_payload_msg, NULL, &lw8_env_hdlr_lock);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmn_err(CE_WARN, "Failed to register MBOX_EVENT_ENV "
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) sbbc_mbox_unreg_intr(MBOX_EVENT_GENERIC,
03831d35f7499c87d51205817c93e9a8d42c4baestevel lw8_cap_payload_msg.msg_buf = (caddr_t)&lw8_cap_payload;
03831d35f7499c87d51205817c93e9a8d42c4baestevel lw8_cap_payload_msg.msg_len = sizeof (lw8_cap_payload);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = sbbc_mbox_reg_intr(INFO_MBOX, lw8_cap_ecc_msg_handler,
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != 0) {
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) sbbc_mbox_unreg_intr(MBOX_EVENT_GENERIC,
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = sbbc_mbox_unreg_intr(MBOX_EVENT_LW8, lw8_event_data_handler);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmn_err(CE_WARN, "Failed to unregister MBOX_EVENT_LW8 "
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = sbbc_mbox_unreg_intr(MBOX_EVENT_GENERIC, lw8_dr_data_handler);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmn_err(CE_WARN, "Failed to unregister MBOX_EVENT_GENERIC "
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = sbbc_mbox_unreg_intr(MBOX_EVENT_ENV, lw8_env_data_handler);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmn_err(CE_WARN, "Failed to unregister MBOX_EVENT_ENV "
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = sbbc_mbox_unreg_intr(INFO_MBOX, lw8_cap_ecc_msg_handler);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel payload = (sg_system_fru_descriptor_t *)msg->msg_buf;
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (payload->slot < 0 || payload->slot >= sizeof (fru_locn) /
03831d35f7499c87d51205817c93e9a8d42c4baestevel sizeof (char *)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * if not SB send sysevent (SBs send sysevent from ssm driver)
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strncmp(fru_locn[payload->slot], "SB", 2) != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) snprintf(attach_pnt, sizeof (attach_pnt), "ssm0:N0.%s",
03831d35f7499c87d51205817c93e9a8d42c4baestevel ev = sysevent_alloc(EC_DR, ESC_DR_AP_STATE_CHANGE, EP_DDI,
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmn_err(CE_WARN, "Failed to allocate %s event", EC_DR);
03831d35f7499c87d51205817c93e9a8d42c4baestevel rv = sysevent_add_attr(&evnt_attr_list, DR_AP_ID, &evnt_val,
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (rv != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmn_err(CE_WARN, "Failed to add attr [%s] for %s event",
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Add the hint
03831d35f7499c87d51205817c93e9a8d42c4baestevel rv = sysevent_add_attr(&evnt_attr_list, DR_HINT, &evnt_val,
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (rv != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmn_err(CE_WARN, "Failed to add attr [%s] for %s event",
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (sysevent_attach_attributes(ev, evnt_attr_list) != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmn_err(CE_WARN, "Failed to attach attr list for %s "
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (rv != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel "lw8_dr_event_handler: failed to log event");
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*ARGSUSED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevel * wakeup sleepers + mark led cache for this fru as invalid
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This function is triggered by a soft interrupt and it's purpose is to call
03831d35f7499c87d51205817c93e9a8d42c4baestevel * to kadmin() to shutdown the system.
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*ARGSUSED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If kadmin fails for some reason then we bring the system down
03831d35f7499c87d51205817c93e9a8d42c4baestevel * via power_down(), or failing that using halt().
03831d35f7499c87d51205817c93e9a8d42c4baestevel * We should never make it this far, so something must have gone
03831d35f7499c87d51205817c93e9a8d42c4baestevel * horribly, horribly wrong.
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*NOTREACHED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This function is triggered by a soft interrupt and it's purpose is to call
03831d35f7499c87d51205817c93e9a8d42c4baestevel * to do_shutdown() to shutdown the system.
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*ARGSUSED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Let the user know why the domain is going down.
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*NOTREACHED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Let the user know why the domain is going down.
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*NOTREACHED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Let the user know why the domain is going down.
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*NOTREACHED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Let the user know why the domain is going down.
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*NOTREACHED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Let the user know why the domain is going down.
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*NOTREACHED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Wake up the log retrieval thread.
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*ARGSUSED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevellw8_open(dev_t *dev_p, int flag, int otyp, cred_t *cred_p)
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*ARGSUSED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevellw8_close(dev_t dev, int flag, int otyp, cred_t *cred_p)
03831d35f7499c87d51205817c93e9a8d42c4baestevel * cast as lom_eventreq_t to minimise data traffic
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((rv) || (resp->msg_status != SG_MBOX_STATUS_SUCCESS)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* errors from sgsbbc */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* errors from SCAPP */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* internal SCAPP error */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* seprom read/write errors */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* illegal ioctl parameter */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* board access denied */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* stale contents */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* stale handle */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* seprom lacks space */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* user prog. lacks space */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* unsupported operation */
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * set the requested led, and mark cache as empty
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < MAX_FRUS; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strncmp(set_ledp->location, fru_led_table[i].location,
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (j = 0; j < MAX_LEDS_PER_FRU; j++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * to minimise data transfer, the SC maintains
03831d35f7499c87d51205817c93e9a8d42c4baestevel * just 3 values per fru - except for
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the chassis itself at the end which has
03831d35f7499c87d51205817c93e9a8d42c4baestevel * MAX_LEDS_PER_FRU
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * read led value from cache if possible, otherwise read from sc and
03831d35f7499c87d51205817c93e9a8d42c4baestevel * update the cache
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i, j, k;
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < MAX_FRUS; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strncmp(get_ledp->location, fru_led_table[i].location,
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (j = 0; j < MAX_LEDS_PER_FRU; j++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * to minimise data transfer, the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * lw8_get_led_payload_t structure just has 3
03831d35f7499c87d51205817c93e9a8d42c4baestevel * values per fru - except for the chassis
03831d35f7499c87d51205817c93e9a8d42c4baestevel * itself at the end which has MAX_LEDS_PER_FRU
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (k = 0; k < MAX_LEDS_PER_FRU; k++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*ARGSUSED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevellw8_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *cred_p,
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (cv_wait_sig(&lw8_event_cv, &lw8_event_mutex) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel retval = lw8_lomcmd(LW8_MBOX_SET_CTL, (intptr_t)&lw8_ctl2);
03831d35f7499c87d51205817c93e9a8d42c4baestevel lw8_progp = kmem_alloc(sizeof (*lw8_progp), KM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel retval = lw8_lomcmd(LW8_MBOX_UPDATE_FW, (intptr_t)lw8_progp);
03831d35f7499c87d51205817c93e9a8d42c4baestevel retval = lw8_lomcmd(LW8_MBOX_GET_INFO, (intptr_t)&lw8_info2);
03831d35f7499c87d51205817c93e9a8d42c4baestevel retval = lw8_lomcmd(LW8_MBOX_GET_INFO, (intptr_t)&lw8_info2);
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) strncpy(lw8_info.prod_id, lw8_info2.prod_id, MAX_ID_LEN);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ddi_copyout((caddr_t)&lw8_fled_info, (caddr_t)arg,
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) snprintf(lw8_get_led.id, MAX_ID_LEN, "system");
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) snprintf(lw8_get_led.id, MAX_ID_LEN, "alarm%d",
03831d35f7499c87d51205817c93e9a8d42c4baestevel lw8_eventlogp = kmem_alloc(sizeof (*lw8_eventlogp), KM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel lw8_eventresp = kmem_zalloc(sizeof (*lw8_eventresp), KM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (retval == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (j = 0; j < MAX_EVENT_STR; j++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ddi_copyout((caddr_t)lw8_eventlogp, (caddr_t)arg,
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) snprintf(lw8_set_led.id, MAX_ID_LEN, "system");
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) snprintf(lw8_set_led.id, MAX_ID_LEN, "alarm%d",
03831d35f7499c87d51205817c93e9a8d42c4baestevel * for this ioctl, as well as setting the fault led in the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * LOMIOCCTL case in lw8_lomcmd(), we also need to set the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * escape character. To do this we must use LW8_MBOX_SET_CTL,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * but this also needs the serial_event value which we have
03831d35f7499c87d51205817c93e9a8d42c4baestevel * to get via LW8_MBOX_GET_INFO
03831d35f7499c87d51205817c93e9a8d42c4baestevel retval = lw8_lomcmd(LW8_MBOX_GET_INFO, (intptr_t)&lw8_info2);
03831d35f7499c87d51205817c93e9a8d42c4baestevel retval = lw8_lomcmd(LW8_MBOX_SET_CTL, (intptr_t)&lw8_ctl2);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * if fault_led != 0, then set the led
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevel CALLB_CPR_INIT(&cprinfo, &lw8_logger_lock, callb_generic_cpr,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "lw8_logger");
03831d35f7499c87d51205817c93e9a8d42c4baestevel lw8_logmsgp = kmem_zalloc(sizeof (*lw8_logmsgp), KM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Wait for someone to tell me to continue.
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* LW8_LOGGER_EXITNOW implies signal by _detach(). */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* lw8_logger_lock is held at this point! */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* NOTREACHED */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Do lw8_event logging */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Get one message per iteration. We do not sleep if
03831d35f7499c87d51205817c93e9a8d42c4baestevel * there are more to process. This makes exit from the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * routine much more reliable.
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (retval == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 0: /* LOG_EMERG */
03831d35f7499c87d51205817c93e9a8d42c4baestevel default: /* unknown */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Ensure NUL termination */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Re-enter the lock to prepare for another iteration.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * We must have the lock here to protect lw8_logger_sig.
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((lw8_logger_sig == LW8_LOGGER_WAIT) && more_waiting)
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* We need to get more events */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Force retrieval of any pending messages */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (tid != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Wait for lw8_logger() to finish.