summaryrefslogtreecommitdiff
path: root/sys/dev/sysmon
diff options
context:
space:
mode:
authorpgoyette <pgoyette@NetBSD.org>2012-07-16 13:55:01 +0000
committerpgoyette <pgoyette@NetBSD.org>2012-07-16 13:55:01 +0000
commitab95dbb65a5f9c57079d7966130f2f82dbab2155 (patch)
tree18f8c3a8fc9c11916487d45617a573d3ef2228c2 /sys/dev/sysmon
parente76ec586721fc74d8f57cdc1943108e688f73a69 (diff)
Extend previous changes so that even sensors which don't use a refresh()
callback to update the value can be polled to provide rnd(4) entropy.
Diffstat (limited to 'sys/dev/sysmon')
-rw-r--r--sys/dev/sysmon/sysmon_envsys.c64
-rw-r--r--sys/dev/sysmon/sysmon_envsys_events.c20
-rw-r--r--sys/dev/sysmon/sysmonvar.h3
3 files changed, 36 insertions, 51 deletions
diff --git a/sys/dev/sysmon/sysmon_envsys.c b/sys/dev/sysmon/sysmon_envsys.c
index ceda7c56c19..8a69cde465b 100644
--- a/sys/dev/sysmon/sysmon_envsys.c
+++ b/sys/dev/sysmon/sysmon_envsys.c
@@ -1,4 +1,4 @@
-/* $NetBSD: sysmon_envsys.c,v 1.120 2012/07/15 18:33:07 pgoyette Exp $ */
+/* $NetBSD: sysmon_envsys.c,v 1.121 2012/07/16 13:55:01 pgoyette Exp $ */
/*-
* Copyright (c) 2007, 2008 Juan Romero Pardines.
@@ -64,7 +64,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys.c,v 1.120 2012/07/15 18:33:07 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys.c,v 1.121 2012/07/16 13:55:01 pgoyette Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -358,8 +358,7 @@ sysmonioctl_envsys(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
}
if (tred->sensor < sme->sme_nsensors) {
- if ((sme->sme_flags & SME_DISABLE_REFRESH) == 0 &&
- (sme->sme_flags & SME_POLL_ONLY) == 0) {
+ if ((sme->sme_flags & SME_POLL_ONLY) == 0) {
mutex_enter(&sme->sme_mtx);
sysmon_envsys_refresh_sensor(sme, edata);
mutex_exit(&sme->sme_mtx);
@@ -1015,8 +1014,7 @@ sme_initial_refresh(void *arg)
mutex_enter(&sme->sme_mtx);
sysmon_envsys_acquire(sme, true);
TAILQ_FOREACH(edata, &sme->sme_sensors_list, sensors_head)
- if ((sme->sme_flags & SME_DISABLE_REFRESH) == 0)
- sysmon_envsys_refresh_sensor(sme, edata);
+ sysmon_envsys_refresh_sensor(sme, edata);
sysmon_envsys_release(sme, true);
mutex_exit(&sme->sme_mtx);
}
@@ -1436,14 +1434,11 @@ sme_get_max_value(struct sysmon_envsys *sme,
continue;
/*
- * refresh sensor data via sme_refresh only if the
- * flag is not set.
+ * refresh sensor data
*/
- if (refresh && (sme->sme_flags & SME_DISABLE_REFRESH) == 0) {
- mutex_enter(&sme->sme_mtx);
- sysmon_envsys_refresh_sensor(sme, edata);
- mutex_exit(&sme->sme_mtx);
- }
+ mutex_enter(&sme->sme_mtx);
+ sysmon_envsys_refresh_sensor(sme, edata);
+ mutex_exit(&sme->sme_mtx);
v = edata->value_cur;
if (v > maxv)
@@ -1513,14 +1508,11 @@ sme_update_dictionary(struct sysmon_envsys *sme)
*/
TAILQ_FOREACH(edata, &sme->sme_sensors_list, sensors_head) {
/*
- * refresh sensor data via sme_refresh only if the
- * flag is not set.
+ * refresh sensor data via sme_envsys_refresh_sensor
*/
- if ((sme->sme_flags & SME_DISABLE_REFRESH) == 0) {
- mutex_enter(&sme->sme_mtx);
- sysmon_envsys_refresh_sensor(sme, edata);
- mutex_exit(&sme->sme_mtx);
- }
+ mutex_enter(&sme->sme_mtx);
+ sysmon_envsys_refresh_sensor(sme, edata);
+ mutex_exit(&sme->sme_mtx);
/*
* retrieve sensor's dictionary.
@@ -1896,11 +1888,11 @@ sme_userset_dictionary(struct sysmon_envsys *sme, prop_dictionary_t udict,
props |= PROP_WARNMIN;
}
- if (props) {
- if (edata->flags & ENVSYS_FMONNOTSUPP) {
- error = ENOTSUP;
- goto out;
- }
+ if (props && (edata->flags & ENVSYS_FMONNOTSUPP) != 0) {
+ error = ENOTSUP;
+ goto out;
+ }
+ if (props || (edata->flags & ENVSYS_FHAS_ENTROPY) != 0) {
error = sme_event_register(dict, edata, sme, &lims,
props,
(edata->flags & ENVSYS_FPERCENT)?
@@ -1948,8 +1940,7 @@ sysmon_envsys_foreach_sensor(sysmon_envsys_callback_t func, void *arg,
sysmon_envsys_acquire(sme, false);
TAILQ_FOREACH(sensor, &sme->sme_sensors_list, sensors_head) {
- if (refresh &&
- (sme->sme_flags & SME_DISABLE_REFRESH) == 0) {
+ if (refresh) {
mutex_enter(&sme->sme_mtx);
sysmon_envsys_refresh_sensor(sme, sensor);
mutex_exit(&sme->sme_mtx);
@@ -1968,18 +1959,13 @@ sysmon_envsys_foreach_sensor(sysmon_envsys_callback_t func, void *arg,
void
sysmon_envsys_refresh_sensor(struct sysmon_envsys *sme, envsys_data_t *edata)
{
- int32_t old_state;
- int32_t old_value;
- if (edata->flags & ENVSYS_FHAS_ENTROPY) {
- old_state = edata->state;
- old_value = edata->value_cur;
- (*sme->sme_refresh)(sme, edata);
- if (old_state != ENVSYS_SINVALID &&
- edata->state != ENVSYS_SINVALID &&
- old_value != edata->value_cur)
- rnd_add_uint32(&edata->rnd_src, edata->value_cur);
- }
- else
+ if ((sme->sme_flags & SME_DISABLE_REFRESH) == 0)
(*sme->sme_refresh)(sme, edata);
+
+ if (edata->flags & ENVSYS_FHAS_ENTROPY &&
+ edata->state != ENVSYS_SINVALID &&
+ edata->value_prev != edata->value_cur)
+ rnd_add_uint32(&edata->rnd_src, edata->value_cur);
+ edata->value_prev = edata->value_cur;
}
diff --git a/sys/dev/sysmon/sysmon_envsys_events.c b/sys/dev/sysmon/sysmon_envsys_events.c
index 3c9ad71a648..bb906290286 100644
--- a/sys/dev/sysmon/sysmon_envsys_events.c
+++ b/sys/dev/sysmon/sysmon_envsys_events.c
@@ -1,4 +1,4 @@
-/* $NetBSD: sysmon_envsys_events.c,v 1.100 2012/07/15 18:33:07 pgoyette Exp $ */
+/* $NetBSD: sysmon_envsys_events.c,v 1.101 2012/07/16 13:55:01 pgoyette Exp $ */
/*-
* Copyright (c) 2007, 2008 Juan Romero Pardines.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys_events.c,v 1.100 2012/07/15 18:33:07 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys_events.c,v 1.101 2012/07/16 13:55:01 pgoyette Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -734,14 +734,13 @@ sme_events_worker(struct work *wk, void *arg)
see->see_flags |= SEE_EVENT_WORKING;
/*
* sme_events_check marks the sensors to make us refresh them here.
- * Don't refresh if the driver uses its own method for refreshing.
+ * sme_envsys_refresh_sensor will not call the driver if the driver
+ * does its own setting of the sensor value.
*/
- if ((sme->sme_flags & SME_DISABLE_REFRESH) == 0) {
- if ((edata->flags & ENVSYS_FNEED_REFRESH) != 0) {
- /* refresh sensor in device */
- sysmon_envsys_refresh_sensor(sme, edata);
- edata->flags &= ~ENVSYS_FNEED_REFRESH;
- }
+ if ((edata->flags & ENVSYS_FNEED_REFRESH) != 0) {
+ /* refresh sensor in device */
+ sysmon_envsys_refresh_sensor(sme, edata);
+ edata->flags &= ~ENVSYS_FNEED_REFRESH;
}
DPRINTFOBJ(("%s: (%s) desc=%s sensor=%d type=%d state=%d units=%d "
@@ -1010,8 +1009,7 @@ sme_acadapter_check(void)
if (edata->units == ENVSYS_INDICATOR) {
sensor = true;
/* refresh current sensor */
- if ((sme->sme_flags & SME_DISABLE_REFRESH) == 0)
- sysmon_envsys_refresh_sensor(sme, edata);
+ sysmon_envsys_refresh_sensor(sme, edata);
if (edata->value_cur)
return false;
}
diff --git a/sys/dev/sysmon/sysmonvar.h b/sys/dev/sysmon/sysmonvar.h
index 272afca8c38..b17cc08896b 100644
--- a/sys/dev/sysmon/sysmonvar.h
+++ b/sys/dev/sysmon/sysmonvar.h
@@ -1,4 +1,4 @@
-/* $NetBSD: sysmonvar.h,v 1.42 2012/07/15 18:33:07 pgoyette Exp $ */
+/* $NetBSD: sysmonvar.h,v 1.43 2012/07/16 13:55:01 pgoyette Exp $ */
/*-
* Copyright (c) 2000 Zembu Labs, Inc.
@@ -82,6 +82,7 @@ struct envsys_data {
uint32_t rpms; /* for fans, nominal RPMs */
int32_t rfact; /* for volts, factor x 10^4 */
int32_t value_cur; /* current value */
+ int32_t value_prev; /* previous value */
int32_t value_max; /* max value */
int32_t value_min; /* min value */
int32_t private; /* private data for drivers */