summaryrefslogtreecommitdiffstats
path: root/sys/powerpc/powermac/smusat.c
diff options
context:
space:
mode:
authornwhitehorn <nwhitehorn@FreeBSD.org>2012-02-15 16:59:24 +0000
committernwhitehorn <nwhitehorn@FreeBSD.org>2012-02-15 16:59:24 +0000
commitb5854e14237eaf156a7044b0a18abbb16a4cfe6f (patch)
treeb97f10f4bf551d59f3f7a15db29a008e3c84435f /sys/powerpc/powermac/smusat.c
parente7eef5c8119b66a2a14b9e339e440f80c327182a (diff)
downloadFreeBSD-src-b5854e14237eaf156a7044b0a18abbb16a4cfe6f.zip
FreeBSD-src-b5854e14237eaf156a7044b0a18abbb16a4cfe6f.tar.gz
Improve error handling in smusat(4).
MFC after: 4 days
Diffstat (limited to 'sys/powerpc/powermac/smusat.c')
-rw-r--r--sys/powerpc/powermac/smusat.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/sys/powerpc/powermac/smusat.c b/sys/powerpc/powermac/smusat.c
index 974e98c..2e37ae4 100644
--- a/sys/powerpc/powermac/smusat.c
+++ b/sys/powerpc/powermac/smusat.c
@@ -202,33 +202,46 @@ static int
smusat_updatecache(device_t dev)
{
uint8_t reg = 0x3f;
+ uint8_t value[16];
struct smusat_softc *sc = device_get_softc(dev);
+ int error;
struct iic_msg msgs[2] = {
{0, IIC_M_WR | IIC_M_NOSTOP, 1, &reg},
- {0, IIC_M_RD, 16, sc->sc_cache},
+ {0, IIC_M_RD, 16, value},
};
msgs[0].slave = msgs[1].slave = iicbus_get_addr(dev);
- sc->sc_last_update = time_uptime;
+ error = iicbus_transfer(dev, msgs, 2);
+ if (error)
+ return (error);
- return (iicbus_transfer(dev, msgs, 2));
+ sc->sc_last_update = time_uptime;
+ memcpy(sc->sc_cache, value, sizeof(value));
+ return (0);
}
static int
smusat_sensor_read(struct smu_sensor *sens)
{
- int value;
+ int value, error;
device_t dev;
struct smusat_softc *sc;
dev = sens->dev;
sc = device_get_softc(dev);
+ error = 0;
if (time_uptime - sc->sc_last_update > 1)
- smusat_updatecache(dev);
+ error = smusat_updatecache(dev);
+ if (error)
+ return (-error);
value = (sc->sc_cache[sens->reg*2] << 8) +
sc->sc_cache[sens->reg*2 + 1];
+ if (value == 0xffff) {
+ sc->sc_last_update = 0; /* Result was bad, don't cache */
+ return (-EINVAL);
+ }
switch (sens->type) {
case SMU_TEMP_SENSOR:
OpenPOWER on IntegriCloud