svn commit: r310381 - head/sys/dev/ow

Gavin Atkinson gavin at FreeBSD.org
Thu Dec 22 00:09:55 UTC 2016


Author: gavin
Date: Thu Dec 22 00:09:53 2016
New Revision: 310381
URL: https://svnweb.freebsd.org/changeset/base/310381

Log:
  ow_temp: Update the temperature visible via the sysctl atomically, rather
  than using it as temporary calculation space.

Modified:
  head/sys/dev/ow/ow_temp.c

Modified: head/sys/dev/ow/ow_temp.c
==============================================================================
--- head/sys/dev/ow/ow_temp.c	Wed Dec 21 23:59:58 2016	(r310380)
+++ head/sys/dev/ow/ow_temp.c	Thu Dec 22 00:09:53 2016	(r310381)
@@ -137,7 +137,7 @@ ow_temp_event_thread(void *arg)
 	struct ow_temp_softc *sc;
 	uint8_t scratch[8 + 1];
 	uint8_t crc;
-	int retries, rv;
+	int retries, rv, tmp;
 
 	sc = arg;
 	pause("owtstart", device_get_unit(sc->dev) * hz / 100);	// 10ms stagger
@@ -166,14 +166,14 @@ ow_temp_event_thread(void *arg)
 							 * Formula from DS18S20 datasheet, page 6
 							 * DS18S20 datasheet says count_per_c is 16, DS1820 does not
 							 */
-							sc->temp = (int16_t)((scratch[0] & 0xfe) |
+							tmp = (int16_t)((scratch[0] & 0xfe) |
 							    (scratch[1] << 8)) << 3;
-							sc->temp += 16 - scratch[6] - 4; /* count_per_c == 16 */
+							tmp += 16 - scratch[6] - 4; /* count_per_c == 16 */
 						} else
-							sc->temp = (int16_t)(scratch[0] | (scratch[1] << 8)) << 3;
+							tmp = (int16_t)(scratch[0] | (scratch[1] << 8)) << 3;
 					} else
-						sc->temp = (int16_t)(scratch[0] | (scratch[1] << 8));
-					sc->temp = sc->temp * 1000 / 16 + 273150;
+						tmp = (int16_t)(scratch[0] | (scratch[1] << 8));
+					sc->temp = tmp * 1000 / 16 + 273150;
 					break;
 				}
 				sc->bad_crc++;


More information about the svn-src-all mailing list