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

Reply via email to