diff options
| author | pgoyette <pgoyette@NetBSD.org> | 2012-07-16 13:55:01 +0000 |
|---|---|---|
| committer | pgoyette <pgoyette@NetBSD.org> | 2012-07-16 13:55:01 +0000 |
| commit | ab95dbb65a5f9c57079d7966130f2f82dbab2155 (patch) | |
| tree | 18f8c3a8fc9c11916487d45617a573d3ef2228c2 /sys/dev/sysmon | |
| parent | e76ec586721fc74d8f57cdc1943108e688f73a69 (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.c | 64 | ||||
| -rw-r--r-- | sys/dev/sysmon/sysmon_envsys_events.c | 20 | ||||
| -rw-r--r-- | sys/dev/sysmon/sysmonvar.h | 3 |
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 */ |
