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));