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;