Module Name:    src
Committed By:   pgoyette
Date:           Mon Jul 16 13:55:01 UTC 2012

Modified Files:
        src/sys/dev/sysmon: sysmon_envsys.c sysmon_envsys_events.c sysmonvar.h

Log Message:
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.


To generate a diff of this commit:
cvs rdiff -u -r1.120 -r1.121 src/sys/dev/sysmon/sysmon_envsys.c
cvs rdiff -u -r1.100 -r1.101 src/sys/dev/sysmon/sysmon_envsys_events.c
cvs rdiff -u -r1.42 -r1.43 src/sys/dev/sysmon/sysmonvar.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/sysmon/sysmon_envsys.c
diff -u src/sys/dev/sysmon/sysmon_envsys.c:1.120 src/sys/dev/sysmon/sysmon_envsys.c:1.121
--- src/sys/dev/sysmon/sysmon_envsys.c:1.120	Sun Jul 15 18:33:07 2012
+++ src/sys/dev/sysmon/sysmon_envsys.c	Mon Jul 16 13:55:01 2012
@@ -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
 		}
 
 		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 *
 			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_envs
 	 */
 	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_env
 			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_envs
 
 		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_envs
 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;
 }

Index: src/sys/dev/sysmon/sysmon_envsys_events.c
diff -u src/sys/dev/sysmon/sysmon_envsys_events.c:1.100 src/sys/dev/sysmon/sysmon_envsys_events.c:1.101
--- src/sys/dev/sysmon/sysmon_envsys_events.c:1.100	Sun Jul 15 18:33:07 2012
+++ src/sys/dev/sysmon/sysmon_envsys_events.c	Mon Jul 16 13:55:01 2012
@@ -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 
 	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;
 		}

Index: src/sys/dev/sysmon/sysmonvar.h
diff -u src/sys/dev/sysmon/sysmonvar.h:1.42 src/sys/dev/sysmon/sysmonvar.h:1.43
--- src/sys/dev/sysmon/sysmonvar.h:1.42	Sun Jul 15 18:33:07 2012
+++ src/sys/dev/sysmon/sysmonvar.h	Mon Jul 16 13:55:01 2012
@@ -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 */

Reply via email to