fixes wrong power unit reporting when booting without battery and
inserting the battery later on Asus EEE 901 and Samsung N220.


Index: src/sys/dev/acpi/acpibat.c
===================================================================
RCS file: /cvs/src/sys/dev/acpi/acpibat.c,v
retrieving revision 1.58
diff -u -r1.58 acpibat.c
--- src/sys/dev/acpi/acpibat.c  10 Nov 2010 21:40:55 -0000      1.58
+++ src/sys/dev/acpi/acpibat.c  23 Nov 2010 21:48:53 -0000
@@ -45,6 +45,7 @@
 const char *acpibat_hids[] = { ACPI_DEV_CMB, 0 };
 
 void   acpibat_monitor(struct acpibat_softc *);
+void   acpibat_attach_power_unit_sensors(int, struct acpibat_softc *);
 void   acpibat_refresh(void *);
 int    acpibat_getbif(struct acpibat_softc *);
 int    acpibat_getbst(struct acpibat_softc *);
@@ -105,23 +106,15 @@
            acpibat_notify, sc, ACPIDEV_POLL);
 }
 
-void
-acpibat_monitor(struct acpibat_softc *sc)
+void 
+acpibat_attach_power_unit_sensors(int type, struct acpibat_softc *sc)
 {
-       int                     type;
-
-       /* assume _BIF and _BST have been called */
-       strlcpy(sc->sc_sensdev.xname, DEVNAME(sc),
-           sizeof(sc->sc_sensdev.xname));
-
-       type = sc->sc_bif.bif_power_unit ? SENSOR_AMPHOUR : SENSOR_WATTHOUR;
-
        strlcpy(sc->sc_sens[0].desc, "last full capacity",
            sizeof(sc->sc_sens[0].desc));
        sc->sc_sens[0].type = type;
        sensor_attach(&sc->sc_sensdev, &sc->sc_sens[0]);
        sc->sc_sens[0].value = sc->sc_bif.bif_last_capacity * 1000;
-
+       
        strlcpy(sc->sc_sens[1].desc, "warning capacity",
            sizeof(sc->sc_sens[1].desc));
        sc->sc_sens[1].type = type;
@@ -134,6 +127,27 @@
        sensor_attach(&sc->sc_sensdev, &sc->sc_sens[2]);
        sc->sc_sens[2].value = sc->sc_bif.bif_low * 1000;
 
+       strlcpy(sc->sc_sens[6].desc, "remaining capacity",
+           sizeof(sc->sc_sens[6].desc));
+       sc->sc_sens[6].type = type;
+       sensor_attach(&sc->sc_sensdev, &sc->sc_sens[6]);
+       sc->sc_sens[6].value = sc->sc_bst.bst_capacity * 1000;
+}
+
+void
+acpibat_monitor(struct acpibat_softc *sc)
+{
+       int                     type;
+
+       /* assume _BIF and _BST have been called */
+       strlcpy(sc->sc_sensdev.xname, DEVNAME(sc),
+           sizeof(sc->sc_sensdev.xname));
+
+       type = sc->sc_bif.bif_power_unit ? SENSOR_AMPHOUR : SENSOR_WATTHOUR;
+
+       /* attach sensors 0,1,2,6 with power unit Ah or Wh */
+       acpibat_attach_power_unit_sensors (type, sc);
+
        strlcpy(sc->sc_sens[3].desc, "voltage", sizeof(sc->sc_sens[3].desc));
        sc->sc_sens[3].type = SENSOR_VOLTS_DC;
        sensor_attach(&sc->sc_sensdev, &sc->sc_sens[3]);
@@ -150,12 +164,6 @@
        sensor_attach(&sc->sc_sensdev, &sc->sc_sens[5]);
        sc->sc_sens[5].value = sc->sc_bst.bst_rate;
 
-       strlcpy(sc->sc_sens[6].desc, "remaining capacity",
-           sizeof(sc->sc_sens[6].desc));
-       sc->sc_sens[6].type = type;
-       sensor_attach(&sc->sc_sensdev, &sc->sc_sens[6]);
-       sc->sc_sens[6].value = sc->sc_bst.bst_capacity * 1000;
-
        strlcpy(sc->sc_sens[7].desc, "current voltage",
            sizeof(sc->sc_sens[7].desc));
        sc->sc_sens[7].type = SENSOR_VOLTS_DC;
@@ -169,7 +177,7 @@
 acpibat_refresh(void *arg)
 {
        struct acpibat_softc    *sc = arg;
-       int                     i;
+       int                     i, type;
 
        dnprintf(30, "%s: %s: refresh\n", DEVNAME(sc),
            sc->sc_devnode->name);
@@ -187,6 +195,16 @@
        }
 
        /* _BIF values are static, sensor 0..3 */
+       type = sc->sc_bif.bif_power_unit ? SENSOR_AMPHOUR : SENSOR_WATTHOUR;
+       if (type != sc->sc_sens[0].type) {
+               /* power units in sensor and _BIF differ */
+               sensor_detach(&sc->sc_sensdev, &sc->sc_sens[0]);
+               sensor_detach(&sc->sc_sensdev, &sc->sc_sens[1]);
+               sensor_detach(&sc->sc_sensdev, &sc->sc_sens[2]);
+               sensor_detach(&sc->sc_sensdev, &sc->sc_sens[6]);
+
+               acpibat_attach_power_unit_sensors (type, sc);
+       }
        if (sc->sc_bif.bif_last_capacity == BIF_UNKNOWN) {
                sc->sc_sens[0].value = 0;
                sc->sc_sens[0].status = SENSOR_S_UNKNOWN;

Reply via email to