diff options
author | Joerg Jung <jung@cvs.openbsd.org> | 2015-12-11 20:06:49 +0000 |
---|---|---|
committer | Joerg Jung <jung@cvs.openbsd.org> | 2015-12-11 20:06:49 +0000 |
commit | 1956a17eaf1c92118a0b40551c508d4a7a2cd65a (patch) | |
tree | ef6ce9052f35a2e28b85d90d80bac53d2be64980 | |
parent | 6738dc8219d4cf9bcb8d4b7638ad6f11abe83419 (diff) |
instead of checking the status everywhere do it directly after (trying) the
command and propagate the result
-rw-r--r-- | sys/dev/isa/asmc.c | 101 |
1 files changed, 53 insertions, 48 deletions
diff --git a/sys/dev/isa/asmc.c b/sys/dev/isa/asmc.c index 728e965711a..1315f98a080 100644 --- a/sys/dev/isa/asmc.c +++ b/sys/dev/isa/asmc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: asmc.c,v 1.13 2015/10/29 13:29:04 jung Exp $ */ +/* $OpenBSD: asmc.c,v 1.14 2015/12/11 20:06:48 jung Exp $ */ /* * Copyright (c) 2015 Joerg Jung <jung@openbsd.org> * @@ -256,7 +256,7 @@ asmc_attach(struct device *parent, struct device *self, void *aux) struct asmc_softc *sc = (struct asmc_softc *)self; struct isa_attach_args *ia = aux; uint8_t buf[6]; - int i; + int i, r; if (bus_space_map(ia->ia_iot, ia->ia_iobase, ia->ia_iosize, 0, &sc->sc_ioh)) { @@ -265,16 +265,16 @@ asmc_attach(struct device *parent, struct device *self, void *aux) } sc->sc_iot = ia->ia_iot; - if (asmc_try(sc, ASMC_READ, "REV ", buf, 6)) { - printf(": revision failed (0x%x)\n", asmc_status(sc)); + if ((r = asmc_try(sc, ASMC_READ, "REV ", buf, 6))) { + printf(": revision failed (0x%x)\n", r); bus_space_unmap(ia->ia_iot, ia->ia_iobase, ASMC_IOSIZE); return; } printf(": rev %x.%x%x%x", buf[0], buf[1], buf[2], ntohs(*(uint16_t *)buf + 4)); - if (asmc_try(sc, ASMC_READ, "#KEY", buf, 4)) { - printf(", no of keys failed (0x%x)\n", asmc_status(sc)); + if ((r = asmc_try(sc, ASMC_READ, "#KEY", buf, 4))) { + printf(", no of keys failed (0x%x)\n", r); bus_space_unmap(ia->ia_iot, ia->ia_iobase, ASMC_IOSIZE); return; } @@ -430,12 +430,15 @@ int asmc_try(struct asmc_softc *sc, int cmd, const char *key, uint8_t *buf, uint8_t len) { - int i; + uint8_t s; + int i, r; for (i = 0; i < ASMC_RETRY; i++) - if (!asmc_command(sc, cmd, key, buf, len)) - return 0; - return 1; + if (!(r = asmc_command(sc, cmd, key, buf, len))) + break; + if (r && (s = asmc_status(sc))) + r = s; + return r; } static uint32_t @@ -472,10 +475,10 @@ static int asmc_temp(struct asmc_softc *sc, uint8_t idx) { uint8_t buf[2]; - int i; + int i, r; - if (asmc_try(sc, ASMC_READ, sc->sc_prod->pr_temp[idx], buf, 2)) - return 1; + if ((r = asmc_try(sc, ASMC_READ, sc->sc_prod->pr_temp[idx], buf, 2))) + return r; sc->sc_sensor_temp[idx].value = asmc_uk(buf); sc->sc_sensor_temp[idx].flags &= ~SENSOR_FUNKNOWN; @@ -503,10 +506,11 @@ asmc_fan(struct asmc_softc *sc, uint8_t idx) { char key[5]; uint8_t buf[16], *end; + int r; snprintf(key, sizeof(key), "F%dAc", idx); - if (asmc_try(sc, ASMC_READ, key, buf, 2)) - return 1; + if ((r = asmc_try(sc, ASMC_READ, key, buf, 2))) + return r; sc->sc_sensor_fan[idx].value = asmc_rpm(buf); sc->sc_sensor_fan[idx].flags &= ~SENSOR_FUNKNOWN; @@ -514,8 +518,8 @@ asmc_fan(struct asmc_softc *sc, uint8_t idx) return 0; snprintf(key, sizeof(key), "F%dID", idx); - if (asmc_try(sc, ASMC_READ, key, buf, 16)) - return 1; + if ((r = asmc_try(sc, ASMC_READ, key, buf, 16))) + return r; end = buf + 4 + strlen((char *)buf + 4) - 1; while (buf + 4 < end && *end == ' ') /* trim trailing spaces */ *end-- = '\0'; @@ -537,16 +541,17 @@ asmc_light(struct asmc_softc *sc, uint8_t idx) { char key[5]; uint8_t buf[10]; + int r; snprintf(key, sizeof(key), "ALV%d", idx); if (!sc->sc_lightlen) { - if (asmc_try(sc, ASMC_INFO, key, buf, 6)) - return 1; + if ((r = asmc_try(sc, ASMC_INFO, key, buf, 6))) + return r; if ((sc->sc_lightlen = buf[0]) > 10) return 1; } - if (asmc_try(sc, ASMC_READ, key, buf, sc->sc_lightlen)) - return 1; + if ((r = asmc_try(sc, ASMC_READ, key, buf, sc->sc_lightlen))) + return r; if (!buf[0]) /* valid data? */ return 0; sc->sc_sensor_light[idx].value = asmc_lux(buf, sc->sc_lightlen); @@ -568,10 +573,11 @@ asmc_motion(struct asmc_softc *sc, uint8_t idx) { char key[5]; uint8_t buf[2]; + int r; snprintf(key, sizeof(key), "MO_%c", 88 + idx); /* X, Y, Z */ - if (asmc_try(sc, ASMC_READ, key, buf, 2)) - return 1; + if ((r = asmc_try(sc, ASMC_READ, key, buf, 2))) + return r; sc->sc_sensor_motion[idx].value = 0; sc->sc_sensor_motion[idx].flags &= ~SENSOR_FUNKNOWN; @@ -592,13 +598,14 @@ asmc_motion(struct asmc_softc *sc, uint8_t idx) void asmc_kbdled(struct asmc_softc *sc, uint8_t b) { - uint8_t buf[2] = { b, 0 }, s; + uint8_t buf[2] = { b, 0 }; + int r; /* keyboard backlight led is optional */ - if (asmc_try(sc, ASMC_WRITE, "LKSB", buf, 2)) { - if ((s = asmc_status(sc)) != ASMC_NOTFOUND) + if ((r = asmc_try(sc, ASMC_WRITE, "LKSB", buf, 2))) { + if (r != ASMC_NOTFOUND) printf("%s: keyboard backlight failed (0x%x)\n", - sc->sc_dev.dv_xname, s); + sc->sc_dev.dv_xname, r); } } @@ -606,45 +613,43 @@ void asmc_init(void *arg) { struct asmc_softc *sc = arg; - uint8_t buf[2], s; - int i; + uint8_t buf[2]; + int i, r; /* number of temperature sensors depends on product */ for (i = 0; sc->sc_prod->pr_temp[i] && i < ASMC_MAXTEMP; i++) - if (asmc_temp(sc, i) && (s = asmc_status(sc)) != ASMC_NOTFOUND) + if ((r = asmc_temp(sc, i)) && r != ASMC_NOTFOUND) printf("%s: read temp %d failed (0x%x)\n", - sc->sc_dev.dv_xname, i, s); + sc->sc_dev.dv_xname, i, r); /* number of fan sensors depends on product */ - if (asmc_try(sc, ASMC_READ, "FNum", buf, 1)) - printf("%s: read FNum failed (0x%x)\n", sc->sc_dev.dv_xname, - asmc_status(sc)); + if ((r = asmc_try(sc, ASMC_READ, "FNum", buf, 1))) + printf("%s: read FNum failed (0x%x)\n", + sc->sc_dev.dv_xname, r); else sc->sc_nfans = buf[0]; for (i = 0; i < sc->sc_nfans && i < ASMC_MAXFAN; i++) - if (asmc_fan(sc, i) && (s = asmc_status(sc)) != ASMC_NOTFOUND) + if ((r = asmc_fan(sc, i)) && r != ASMC_NOTFOUND) printf("%s: read fan %d failed (0x%x)\n", - sc->sc_dev.dv_xname, i, s); + sc->sc_dev.dv_xname, i, r); /* left and right light sensors are optional */ for (i = 0; i < ASMC_MAXLIGHT; i++) - if (asmc_light(sc, i) && - (s = asmc_status(sc)) != ASMC_NOTFOUND) + if ((r = asmc_light(sc, i)) && r != ASMC_NOTFOUND) printf("%s: read light %d failed (0x%x)\n", - sc->sc_dev.dv_xname, i, s); + sc->sc_dev.dv_xname, i, r); /* motion sensors are optional */ - if (asmc_try(sc, ASMC_READ, "MOCN", buf, 2) && - (s = asmc_status(sc)) != ASMC_NOTFOUND) + if ((r = asmc_try(sc, ASMC_READ, "MOCN", buf, 2)) && + r != ASMC_NOTFOUND) printf("%s: read MOCN failed (0x%x)\n", - sc->sc_dev.dv_xname, s); + sc->sc_dev.dv_xname, r); #if 0 /* todo: initialize sudden motion sensors and setup interrupt handling */ buf[0] = 0xe0, buf[1] = 0xf8; - if (asmc_try(sc, ASMC_WRITE, "MOCN", buf, 2)) - printf("%s write MOCN failed (0x%x)\n", sc->sc_dev.dv_xname, - asmc_status(sc)); + if ((r = asmc_try(sc, ASMC_WRITE, "MOCN", buf, 2))) + printf("%s write MOCN failed (0x%x)\n", + sc->sc_dev.dv_xname, r); for (i = 0; i < ASMC_MAXMOTION; i++) - if (asmc_motion(sc, i) && - (s = asmc_status(sc)) != ASMC_NOTFOUND) + if ((r = asmc_motion(sc, i)) && r != ASMC_NOTFOUND) printf("%s: read motion %d failed (0x%x)\n", - sc->sc_dev.dv_xname, i, s); + sc->sc_dev.dv_xname, i, r); #endif sc->sc_init = 1; } |