Module Name: src Committed By: bouyer Date: Sun Mar 20 21:23:32 UTC 2011
Modified Files: src/sys/arch/sparc64/dev [netbsd-5]: lom.c Log Message: Pull up following revision(s) (requested by nakayama in ticket #1570): sys/arch/sparc64/dev/lom.c: revision 1.7 lom_refresh(): Update only the sensor status specified by the edata as noted in sysmon_envsys(9). lom_sysctl_alarm(): Update alarm status before reading via sysctl to make it usable at a boot time. To generate a diff of this commit: cvs rdiff -u -r1.1.2.6 -r1.1.2.7 src/sys/arch/sparc64/dev/lom.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/sparc64/dev/lom.c diff -u src/sys/arch/sparc64/dev/lom.c:1.1.2.6 src/sys/arch/sparc64/dev/lom.c:1.1.2.7 --- src/sys/arch/sparc64/dev/lom.c:1.1.2.6 Sun Mar 28 16:48:36 2010 +++ src/sys/arch/sparc64/dev/lom.c Sun Mar 20 21:23:32 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: lom.c,v 1.1.2.6 2010/03/28 16:48:36 snj Exp $ */ +/* $NetBSD: lom.c,v 1.1.2.7 2011/03/20 21:23:32 bouyer Exp $ */ /* $OpenBSD: lom.c,v 1.21 2010/02/28 20:44:39 kettenis Exp $ */ /* * Copyright (c) 2009 Mark Kettenis @@ -17,7 +17,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lom.c,v 1.1.2.6 2010/03/28 16:48:36 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lom.c,v 1.1.2.7 2011/03/20 21:23:32 bouyer Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -217,6 +217,10 @@ static int lom_init_desc(struct lom_softc *); static void lom_refresh(struct sysmon_envsys *, envsys_data_t *); +static void lom_refresh_alarm(struct lom_softc *, envsys_data_t *, uint32_t); +static void lom_refresh_fan(struct lom_softc *, envsys_data_t *, uint32_t); +static void lom_refresh_psu(struct lom_softc *, envsys_data_t *, uint32_t); +static void lom_refresh_temp(struct lom_softc *, envsys_data_t *, uint32_t); static void lom1_write_hostname(struct lom_softc *); static void lom2_write_hostname(struct lom_softc *); @@ -947,88 +951,136 @@ lom_refresh(struct sysmon_envsys *sme, envsys_data_t *edata) { struct lom_softc *sc = sme->sme_cookie; + uint32_t i; + + /* Sensor number */ + i = edata->sensor; + + /* Sensor type */ + switch (edata->units) { + case ENVSYS_INDICATOR: + if (i < sc->sc_num_alarm) + lom_refresh_alarm(sc, edata, i); + else + lom_refresh_psu(sc, edata, + i - sc->sc_num_alarm - sc->sc_num_fan); + break; + case ENVSYS_SFANRPM: + lom_refresh_fan(sc, edata, i - sc->sc_num_alarm); + break; + case ENVSYS_STEMP: + lom_refresh_temp(sc, edata, + i - sc->sc_num_alarm - sc->sc_num_fan - sc->sc_num_psu); + break; + default: + edata->state = ENVSYS_SINVALID; + break; + } + + /* + * If our hostname is set and differs from what's stored in + * the LOM, write the new hostname back to the LOM. Note that + * we include the terminating NUL when writing the hostname + * back to the LOM, otherwise the LOM will print any trailing + * garbage. + */ + if (i == 0 && hostnamelen > 0 && + strncmp(sc->sc_hostname, hostname, sizeof(hostname)) != 0) { + if (sc->sc_type < LOM_LOMLITE2) + lom1_write_hostname(sc); + else + lom2_write_hostname(sc); + strlcpy(sc->sc_hostname, hostname, sizeof(hostname)); + } +} + +static void +lom_refresh_alarm(struct lom_softc *sc, envsys_data_t *edata, uint32_t i) +{ uint8_t val; - int i; + + /* Fault LED or Alarms */ + KASSERT(i < sc->sc_num_alarm); if (lom_read(sc, LOM_IDX_ALARM, &val)) { - for (i = 0; i < sc->sc_num_alarm; i++) - sc->sc_alarm[i].state = ENVSYS_SINVALID; + edata->state = ENVSYS_SINVALID; } else { - /* Fault LED */ - if ((val & LOM_ALARM_FAULT) == LOM_ALARM_FAULT) - sc->sc_alarm[0].value_cur = 0; - else - sc->sc_alarm[0].value_cur = 1; - sc->sc_alarm[0].state = ENVSYS_SVALID; - - /* Alarms */ - for (i = 1; i < sc->sc_num_alarm; i++) { + if (i == 0) { + /* Fault LED */ + if ((val & LOM_ALARM_FAULT) == LOM_ALARM_FAULT) + edata->value_cur = 0; + else + edata->value_cur = 1; + } else { + /* Alarms */ if ((val & (LOM_ALARM_1 << (i - 1))) == 0) - sc->sc_alarm[i].value_cur = 0; + edata->value_cur = 0; else - sc->sc_alarm[i].value_cur = 1; - sc->sc_alarm[i].state = ENVSYS_SVALID; + edata->value_cur = 1; } + edata->state = ENVSYS_SVALID; } +} - for (i = 0; i < sc->sc_num_fan; i++) { - if (lom_read(sc, LOM_IDX_FAN1 + i, &val)) { - sc->sc_fan[i].state = ENVSYS_SINVALID; - continue; - } +static void +lom_refresh_fan(struct lom_softc *sc, envsys_data_t *edata, uint32_t i) +{ + uint8_t val; + + /* Fan speed */ + KASSERT(i < sc->sc_num_fan); - sc->sc_fan[i].value_cur = (60 * sc->sc_fan_cal[i] * val) / 100; + if (lom_read(sc, LOM_IDX_FAN1 + i, &val)) { + edata->state = ENVSYS_SINVALID; + } else { + edata->value_cur = (60 * sc->sc_fan_cal[i] * val) / 100; if (val < sc->sc_fan_low[i]) - sc->sc_fan[i].state = ENVSYS_SCRITICAL; + edata->state = ENVSYS_SCRITICAL; else - sc->sc_fan[i].state = ENVSYS_SVALID; + edata->state = ENVSYS_SVALID; } +} - for (i = 0; i < sc->sc_num_psu; i++) { - if (lom_read(sc, LOM_IDX_PSU1 + i, &val) || - !ISSET(val, LOM_PSU_PRESENT)) { - sc->sc_psu[i].state = ENVSYS_SINVALID; - continue; - } +static void +lom_refresh_psu(struct lom_softc *sc, envsys_data_t *edata, uint32_t i) +{ + uint8_t val; + + /* PSU status */ + KASSERT(i < sc->sc_num_psu); + if (lom_read(sc, LOM_IDX_PSU1 + i, &val) || + !ISSET(val, LOM_PSU_PRESENT)) { + edata->state = ENVSYS_SINVALID; + } else { if (val & LOM_PSU_STANDBY) { - sc->sc_psu[i].value_cur = 0; - sc->sc_psu[i].state = ENVSYS_SVALID; + edata->value_cur = 0; + edata->state = ENVSYS_SVALID; } else { - sc->sc_psu[i].value_cur = 1; + edata->value_cur = 1; if (ISSET(val, LOM_PSU_INPUTA) && ISSET(val, LOM_PSU_INPUTB) && ISSET(val, LOM_PSU_OUTPUT)) - sc->sc_psu[i].state = ENVSYS_SVALID; + edata->state = ENVSYS_SVALID; else - sc->sc_psu[i].state = ENVSYS_SCRITICAL; + edata->state = ENVSYS_SCRITICAL; } } +} - for (i = 0; i < sc->sc_num_temp; i++) { - if (lom_read(sc, LOM_IDX_TEMP1 + i, &val)) { - sc->sc_temp[i].state = ENVSYS_SINVALID; - continue; - } +static void +lom_refresh_temp(struct lom_softc *sc, envsys_data_t *edata, uint32_t i) +{ + uint8_t val; - sc->sc_temp[i].value_cur = val * 1000000 + 273150000; - sc->sc_temp[i].state = ENVSYS_SVALID; - } + /* Temperature */ + KASSERT(i < sc->sc_num_temp); - /* - * If our hostname is set and differs from what's stored in - * the LOM, write the new hostname back to the LOM. Note that - * we include the terminating NUL when writing the hostname - * back to the LOM, otherwise the LOM will print any trailing - * garbage. - */ - if (hostnamelen > 0 && - strncmp(sc->sc_hostname, hostname, sizeof(hostname)) != 0) { - if (sc->sc_type < LOM_LOMLITE2) - lom1_write_hostname(sc); - else - lom2_write_hostname(sc); - strlcpy(sc->sc_hostname, hostname, sizeof(hostname)); + if (lom_read(sc, LOM_IDX_TEMP1 + i, &val)) { + edata->state = ENVSYS_SINVALID; + } else { + edata->value_cur = val * 1000000 + 273150000; + edata->state = ENVSYS_SVALID; } } @@ -1142,6 +1194,7 @@ for (i = 0; i < sc->sc_num_alarm; i++) { if (node.sysctl_num == sc->sc_sysctl_num[i]) { + lom_refresh_alarm(sc, &sc->sc_alarm[i], i); tmp = sc->sc_alarm[i].value_cur; node.sysctl_data = &tmp; error = sysctl_lookup(SYSCTLFN_CALL(&node));