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 {