Module Name:    src
Committed By:   riz
Date:           Sat Jul 16 00:14:57 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 #1641):
        sys/arch/sparc64/dev/lom.c: revision 1.8
Limit reading from registers at most once every second with using
ratecheck(9).


To generate a diff of this commit:
cvs rdiff -u -r1.1.2.7 -r1.1.2.8 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.7 src/sys/arch/sparc64/dev/lom.c:1.1.2.8
--- src/sys/arch/sparc64/dev/lom.c:1.1.2.7	Sun Mar 20 21:23:32 2011
+++ src/sys/arch/sparc64/dev/lom.c	Sat Jul 16 00:14:57 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: lom.c,v 1.1.2.7 2011/03/20 21:23:32 bouyer Exp $	*/
+/*	$NetBSD: lom.c,v 1.1.2.8 2011/07/16 00:14:57 riz 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.7 2011/03/20 21:23:32 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lom.c,v 1.1.2.8 2011/07/16 00:14:57 riz Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -171,6 +171,12 @@
 
 	int32_t			sc_sysctl_num[LOM_MAX_ALARM];
 
+	struct timeval		sc_alarm_lastread;
+	uint8_t			sc_alarm_lastval;
+	struct timeval		sc_fan_lastread[LOM_MAX_FAN];
+	struct timeval		sc_psu_lastread[LOM_MAX_PSU];
+	struct timeval		sc_temp_lastread[LOM_MAX_TEMP];
+
 	uint8_t			sc_fan_cal[LOM_MAX_FAN];
 	uint8_t			sc_fan_low[LOM_MAX_FAN];
 
@@ -239,6 +245,7 @@
 static const char *nodedesc[LOM_MAX_ALARM] =
     { "Fault LED status", "Alarm1 status", "Alarm2 status ", "Alarm3 status" };
 #endif
+static const struct timeval refresh_interval = { 1, 0 };
 
 static int
 lom_match(device_t parent, cfdata_t match, void *aux)
@@ -1002,24 +1009,31 @@
 	/* Fault LED or Alarms */
 	KASSERT(i < sc->sc_num_alarm);
 
-	if (lom_read(sc, LOM_IDX_ALARM, &val)) {
-		edata->state = ENVSYS_SINVALID;
-	} else {
-		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)
-				edata->value_cur = 0;
-			else
-				edata->value_cur = 1;
+	/* Read new value at most once every second. */
+	if (ratecheck(&sc->sc_alarm_lastread, &refresh_interval)) {
+		if (lom_read(sc, LOM_IDX_ALARM, &val)) {
+			edata->state = ENVSYS_SINVALID;
+			return;
 		}
-		edata->state = ENVSYS_SVALID;
+		sc->sc_alarm_lastval = val;
+	} else {
+		val = sc->sc_alarm_lastval;
+	}
+
+	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)
+			edata->value_cur = 0;
+		else
+			edata->value_cur = 1;
 	}
+	edata->state = ENVSYS_SVALID;
 }
 
 static void
@@ -1030,6 +1044,10 @@
 	/* Fan speed */
 	KASSERT(i < sc->sc_num_fan);
 
+	/* Read new value at most once every second. */
+	if (!ratecheck(&sc->sc_fan_lastread[i], &refresh_interval))
+		return;
+
 	if (lom_read(sc, LOM_IDX_FAN1 + i, &val)) {
 		edata->state = ENVSYS_SINVALID;
 	} else {
@@ -1049,6 +1067,10 @@
 	/* PSU status */
 	KASSERT(i < sc->sc_num_psu);
 
+	/* Read new value at most once every second. */
+	if (!ratecheck(&sc->sc_psu_lastread[i], &refresh_interval))
+		return;
+
 	if (lom_read(sc, LOM_IDX_PSU1 + i, &val) ||
 	    !ISSET(val, LOM_PSU_PRESENT)) {
 		edata->state = ENVSYS_SINVALID;
@@ -1076,6 +1098,10 @@
 	/* Temperature */
 	KASSERT(i < sc->sc_num_temp);
 
+	/* Read new value at most once every second. */
+	if (!ratecheck(&sc->sc_temp_lastread[i], &refresh_interval))
+		return;
+
 	if (lom_read(sc, LOM_IDX_TEMP1 + i, &val)) {
 		edata->state = ENVSYS_SINVALID;
 	} else {

Reply via email to