Module Name:    src
Committed By:   jruoho
Date:           Thu Jan 21 08:57:17 UTC 2010

Modified Files:
        src/sys/dev/acpi: acpi_bat.c

Log Message:
In preparation for upcoming changes:

  * Provide proper definitions and use these.
  * Clarify the evaluation of _STA.
  * Mark the state of a sensor according to the return value from _STA.
  * Share the basic object evaluation in _BIF and _BST.
  * Verify the object types before using the objects.
  * Be aware of bogus values from _BIF and _BST, as noted in the specifcation.

Despite of the list, functional change should be minimal. Ok pgoye...@.


To generate a diff of this commit:
cvs rdiff -u -r1.75 -r1.76 src/sys/dev/acpi/acpi_bat.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/acpi/acpi_bat.c
diff -u src/sys/dev/acpi/acpi_bat.c:1.75 src/sys/dev/acpi/acpi_bat.c:1.76
--- src/sys/dev/acpi/acpi_bat.c:1.75	Fri Jan  8 20:40:41 2010
+++ src/sys/dev/acpi/acpi_bat.c	Thu Jan 21 08:57:17 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: acpi_bat.c,v 1.75 2010/01/08 20:40:41 dyoung Exp $	*/
+/*	$NetBSD: acpi_bat.c,v 1.76 2010/01/21 08:57:17 jruoho Exp $	*/
 
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -79,7 +79,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_bat.c,v 1.75 2010/01/08 20:40:41 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_bat.c,v 1.76 2010/01/21 08:57:17 jruoho Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -95,21 +95,58 @@
 #define _COMPONENT          ACPI_BAT_COMPONENT
 ACPI_MODULE_NAME            ("acpi_bat")
 
-/* sensor indexes */
-#define ACPIBAT_PRESENT		0
-#define ACPIBAT_DCAPACITY	1
-#define ACPIBAT_LFCCAPACITY	2
-#define ACPIBAT_TECHNOLOGY	3
-#define ACPIBAT_DVOLTAGE	4
-#define ACPIBAT_WCAPACITY	5
-#define ACPIBAT_LCAPACITY	6
-#define ACPIBAT_VOLTAGE		7
-#define ACPIBAT_CHARGERATE	8
-#define ACPIBAT_DISCHARGERATE	9
-#define ACPIBAT_CAPACITY	10
-#define ACPIBAT_CHARGING	11
-#define ACPIBAT_CHARGE_STATE	12
-#define ACPIBAT_NSENSORS	13  /* number of sensors */
+/*
+ * Sensor indexes.
+ */
+enum {
+	ACPIBAT_PRESENT		 = 0,
+	ACPIBAT_DCAPACITY	 = 1,
+	ACPIBAT_LFCCAPACITY	 = 2,
+	ACPIBAT_TECHNOLOGY	 = 3,
+	ACPIBAT_DVOLTAGE	 = 4,
+	ACPIBAT_WCAPACITY	 = 5,
+	ACPIBAT_LCAPACITY	 = 6,
+	ACPIBAT_VOLTAGE		 = 7,
+	ACPIBAT_CHARGERATE	 = 8,
+	ACPIBAT_DISCHARGERATE	 = 9,
+	ACPIBAT_CAPACITY	 = 10,
+	ACPIBAT_CHARGING	 = 11,
+	ACPIBAT_CHARGE_STATE	 = 12,
+	ACPIBAT_COUNT		 = 13
+};
+
+/*
+ * Battery Information, _BIF
+ * (ACPI 3.0, sec. 10.2.2.1).
+ */
+enum {
+	ACPIBAT_BIF_UNIT	 = 0,
+	ACPIBAT_BIF_DCAPACITY	 = 1,
+	ACPIBAT_BIF_LFCCAPACITY	 = 2,
+	ACPIBAT_BIF_TECHNOLOGY	 = 3,
+	ACPIBAT_BIF_DVOLTAGE	 = 4,
+	ACPIBAT_BIF_WCAPACITY	 = 5,
+	ACPIBAT_BIF_LCAPACITY	 = 6,
+	ACPIBAT_BIF_GRANULARITY1 = 7,
+	ACPIBAT_BIF_GRANULARITY2 = 8,
+	ACPIBAT_BIF_MODEL	 = 9,
+	ACPIBAT_BIF_SERIAL	 = 10,
+	ACPIBAT_BIF_TYPE	 = 11,
+	ACPIBAT_BIF_OEM		 = 12,
+	ACPIBAT_BIF_COUNT	 = 13
+};
+
+/*
+ * Battery Status, _BST
+ * (ACPI 3.0, sec. 10.2.2.3).
+ */
+enum {
+	ACPIBAT_BST_STATE	 = 0,
+	ACPIBAT_BST_RATE	 = 1,
+	ACPIBAT_BST_CAPACITY	 = 2,
+	ACPIBAT_BST_VOLTAGE	 = 3,
+	ACPIBAT_BST_COUNT	 = 4
+};
 
 struct acpibat_softc {
 	struct acpi_devnode *sc_node;	/* our ACPI devnode */
@@ -117,7 +154,7 @@
 	int sc_available;		/* available information level */
 
 	struct sysmon_envsys *sc_sme;
-	envsys_data_t sc_sensor[ACPIBAT_NSENSORS];
+	envsys_data_t sc_sensor[ACPIBAT_COUNT];
 	struct timeval sc_lastupdate;
 
 	kmutex_t sc_mutex;
@@ -144,11 +181,27 @@
 #define ACPIBAT_ST_CRITICAL	0x00000004  /* battery is critical */
 
 /*
- * Flags for battery status from _STA return
+ * Flags for battery status from _STA return. Note that
+ * this differs from the conventional evaluation of _STA:
+ *
+ *	"Unlike most other devices, when a battery is inserted or
+ *	 removed from the system, the device itself (the battery bay)
+ *	 is still considered to be present in the system. For most
+ *	 systems, the _STA for this device will always return a value
+ *	 with bits 0-3 set and will toggle bit 4 to indicate the actual
+ *	 presence of a battery. (ACPI 3.0, sec. 10.2.1, p. 320.)"
  */
 #define ACPIBAT_STA_PRESENT	0x00000010  /* battery present */
 
 /*
+ * A value used when _BST or _BIF is teporarily unknown (see ibid.).
+ */
+#define ACPIBAT_VAL_UNKNOWN	0xFFFFFFFF
+
+#define ACPIBAT_VAL_ISVALID(x)						      \
+	(((x) != ACPIBAT_VAL_UNKNOWN) ? ENVSYS_SVALID : ENVSYS_SINVALID)
+
+/*
  * These flags are used to set internal state in our softc.
  */
 #define	ABAT_F_VERBOSE		0x01	/* verbose events */
@@ -179,6 +232,7 @@
 static void acpibat_clear_info(struct acpibat_softc *);
 static void acpibat_clear_stat(struct acpibat_softc *);
 static int acpibat_battery_present(device_t);
+static ACPI_OBJECT *acpibat_get_object(ACPI_HANDLE, const char *, int);
 static ACPI_STATUS acpibat_get_status(device_t);
 static ACPI_STATUS acpibat_get_info(device_t);
 static void acpibat_print_info(device_t);
@@ -305,73 +359,126 @@
 	sc->sc_sensor[ACPIBAT_CHARGING].state = ENVSYS_SINVALID;
 }
 
-
 /*
- * returns 0 for no battery, 1 for present, and -1 on error
+ * acpibat_battery_present:
+ *
+ *	Evaluate whether the battery is present or absent.
+ *
+ *	Returns: 0 for no battery, 1 for present, and -1 on error.
  */
 static int
 acpibat_battery_present(device_t dv)
 {
 	struct acpibat_softc *sc = device_private(dv);
-	uint32_t sta;
 	ACPI_INTEGER val;
 	ACPI_STATUS rv;
+	uint32_t sta;
 
 	rv = acpi_eval_integer(sc->sc_node->ad_handle, "_STA", &val);
+
 	if (ACPI_FAILURE(rv)) {
-		aprint_error_dev(dv, "failed to evaluate _STA: %s\n",
-		    AcpiFormatException(rv));
+		aprint_error_dev(dv, "failed to evaluate _STA\n");
+		sc->sc_sensor[ACPIBAT_PRESENT].state = ENVSYS_SINVALID;
 		return -1;
 	}
 
 	sta = (uint32_t)val;
 
 	sc->sc_available = ABAT_ALV_PRESENCE;
-	if (sta & ACPIBAT_STA_PRESENT) {
-		ABAT_SET(sc, ABAT_F_PRESENT);
-		sc->sc_sensor[ACPIBAT_PRESENT].state = ENVSYS_SVALID;
-		sc->sc_sensor[ACPIBAT_PRESENT].value_cur = 1;
-	} else
+	sc->sc_sensor[ACPIBAT_PRESENT].state = ENVSYS_SVALID;
+
+	if ((sta & ACPIBAT_STA_PRESENT) == 0) {
 		sc->sc_sensor[ACPIBAT_PRESENT].value_cur = 0;
+		return 0;
+	}
 
-	return (sta & ACPIBAT_STA_PRESENT) ? 1 : 0;
+	ABAT_SET(sc, ABAT_F_PRESENT);
+	sc->sc_sensor[ACPIBAT_PRESENT].value_cur = 1;
+
+	return 1;
+}
+
+static ACPI_OBJECT *
+acpibat_get_object(ACPI_HANDLE hdl, const char *pth, int count)
+{
+	ACPI_OBJECT *obj;
+	ACPI_BUFFER buf;
+	ACPI_STATUS rv;
+
+	rv = acpi_eval_struct(hdl, pth, &buf);
+
+	if (ACPI_FAILURE(rv))
+		return NULL;
+
+	obj = buf.Pointer;
+
+	if (obj->Type != ACPI_TYPE_PACKAGE) {
+		ACPI_FREE(buf.Pointer);
+		return NULL;
+	}
+
+	if (obj->Package.Count != count) {
+		ACPI_FREE(buf.Pointer);
+		return NULL;
+	}
+
+	return obj;
 }
 
 /*
- * acpibat_get_info
+ * acpibat_get_info:
  *
  * 	Get, and possibly display, the battery info.
  */
-
 static ACPI_STATUS
 acpibat_get_info(device_t dv)
 {
 	struct acpibat_softc *sc = device_private(dv);
-	ACPI_OBJECT *p1, *p2;
-	ACPI_STATUS rv;
-	ACPI_BUFFER buf;
-	int capunit, rateunit;
+	ACPI_HANDLE hdl = sc->sc_node->ad_handle;
+	int capunit, i, j, rateunit, val;
+	ACPI_OBJECT *elm, *obj;
+	ACPI_STATUS rv = AE_OK;
 
-	rv = acpi_eval_struct(sc->sc_node->ad_handle, "_BIF", &buf);
-	if (ACPI_FAILURE(rv)) {
-		aprint_error_dev(dv, "failed to evaluate _BIF: %s\n",
-		    AcpiFormatException(rv));
-		return rv;
-	}
-	p1 = (ACPI_OBJECT *)buf.Pointer;
+	obj = acpibat_get_object(hdl, "_BIF", ACPIBAT_BIF_COUNT);
 
-	if (p1->Type != ACPI_TYPE_PACKAGE) {
-		aprint_error_dev(dv, "expected PACKAGE, got %d\n", p1->Type);
+	if (obj == NULL) {
+		rv = AE_ERROR;
 		goto out;
 	}
-	if (p1->Package.Count < 13) {
-		aprint_error_dev(dv, "expected 13 elements, got %d\n",
-		    p1->Package.Count);
-		goto out;
+
+	elm = obj->Package.Elements;
+
+	for (i = ACPIBAT_BIF_UNIT; i < ACPIBAT_BIF_MODEL; i++) {
+
+		if (elm[i].Type != ACPI_TYPE_INTEGER) {
+			rv = AE_TYPE;
+			goto out;
+		}
+
+		KDASSERT((uint64_t)elm[i].Integer.Value < INT_MAX);
 	}
-	p2 = p1->Package.Elements;
 
-	if ((p2[0].Integer.Value & ACPIBAT_PWRUNIT_MA) != 0) {
+	aprint_verbose_dev(dv, "battery info: ");
+
+	for (i = j = ACPIBAT_BIF_OEM; i > ACPIBAT_BIF_GRANULARITY2; i--) {
+
+		if (elm[i].Type != ACPI_TYPE_STRING)
+			continue;
+
+		if (elm[i].String.Pointer == NULL)
+			continue;
+
+		aprint_verbose("%s ", elm[i].String.Pointer);
+
+		j = 0;
+	}
+
+	if (j != 0)
+		aprint_verbose("not available");
+
+	aprint_verbose("\n");
+
+	if ((elm[ACPIBAT_BIF_UNIT].Integer.Value & ACPIBAT_PWRUNIT_MA) != 0) {
 		ABAT_SET(sc, ABAT_F_PWRUNIT_MA);
 		capunit = ENVSYS_SAMPHOUR;
 		rateunit = ENVSYS_SAMPS;
@@ -389,38 +496,60 @@
 	sc->sc_sensor[ACPIBAT_DISCHARGERATE].units = rateunit;
 	sc->sc_sensor[ACPIBAT_CAPACITY].units = capunit;
 
-	sc->sc_sensor[ACPIBAT_DCAPACITY].value_cur = p2[1].Integer.Value * 1000;
-	sc->sc_sensor[ACPIBAT_DCAPACITY].state = ENVSYS_SVALID;
-	sc->sc_sensor[ACPIBAT_LFCCAPACITY].value_cur = p2[2].Integer.Value * 1000;
-	sc->sc_sensor[ACPIBAT_LFCCAPACITY].state = ENVSYS_SVALID;
-	sc->sc_sensor[ACPIBAT_CAPACITY].value_max = p2[2].Integer.Value * 1000;
-	sc->sc_sensor[ACPIBAT_TECHNOLOGY].value_cur = p2[3].Integer.Value;
-	sc->sc_sensor[ACPIBAT_TECHNOLOGY].state = ENVSYS_SVALID;
-	sc->sc_sensor[ACPIBAT_DVOLTAGE].value_cur = p2[4].Integer.Value * 1000;
-	sc->sc_sensor[ACPIBAT_DVOLTAGE].state = ENVSYS_SVALID;
-	sc->sc_sensor[ACPIBAT_WCAPACITY].value_cur = p2[5].Integer.Value * 1000;
-	sc->sc_sensor[ACPIBAT_WCAPACITY].value_max = p2[2].Integer.Value * 1000;
-	sc->sc_sensor[ACPIBAT_WCAPACITY].state = ENVSYS_SVALID;
+	/* Design capacity. */
+	val = elm[ACPIBAT_BIF_DCAPACITY].Integer.Value * 1000;
+	sc->sc_sensor[ACPIBAT_DCAPACITY].value_cur = val;
+	sc->sc_sensor[ACPIBAT_DCAPACITY].state = ACPIBAT_VAL_ISVALID(val);
+
+	/* Last full charge capacity. */
+	val = elm[ACPIBAT_BIF_LFCCAPACITY].Integer.Value * 1000;
+	sc->sc_sensor[ACPIBAT_LFCCAPACITY].value_cur = val;
+	sc->sc_sensor[ACPIBAT_LFCCAPACITY].state = ACPIBAT_VAL_ISVALID(val);
+
+	/* Battery technology. */
+	val = elm[ACPIBAT_BIF_TECHNOLOGY].Integer.Value;
+	sc->sc_sensor[ACPIBAT_TECHNOLOGY].value_cur = val;
+	sc->sc_sensor[ACPIBAT_TECHNOLOGY].state = ACPIBAT_VAL_ISVALID(val);
+
+	/* Design voltage. */
+	val = elm[ACPIBAT_BIF_DVOLTAGE].Integer.Value * 1000;
+	sc->sc_sensor[ACPIBAT_DVOLTAGE].value_cur = val;
+	sc->sc_sensor[ACPIBAT_DVOLTAGE].state = ACPIBAT_VAL_ISVALID(val);
+
+	/* Design warning capacity. */
+	val = elm[ACPIBAT_BIF_WCAPACITY].Integer.Value * 1000;
+	sc->sc_sensor[ACPIBAT_WCAPACITY].value_cur = val;
+	sc->sc_sensor[ACPIBAT_WCAPACITY].state = ACPIBAT_VAL_ISVALID(val);
 	sc->sc_sensor[ACPIBAT_WCAPACITY].flags |=
-	    (ENVSYS_FPERCENT|ENVSYS_FVALID_MAX);
-	sc->sc_sensor[ACPIBAT_LCAPACITY].value_cur = p2[6].Integer.Value * 1000;
-	sc->sc_sensor[ACPIBAT_LCAPACITY].value_max = p2[2].Integer.Value * 1000;
-	sc->sc_sensor[ACPIBAT_LCAPACITY].state = ENVSYS_SVALID;
-	sc->sc_sensor[ACPIBAT_LCAPACITY].flags |=
-	    (ENVSYS_FPERCENT|ENVSYS_FVALID_MAX);
-	sc->sc_available = ABAT_ALV_INFO;
+	    ENVSYS_FPERCENT | ENVSYS_FVALID_MAX;
 
-	aprint_verbose_dev(dv, "battery info: %s, %s, %s",
-	    p2[12].String.Pointer, p2[11].String.Pointer, p2[9].String.Pointer);
-	if (p2[10].String.Pointer)
-		aprint_verbose(" %s", p2[10].String.Pointer);
+	/* Design low capacity. */
+	val = elm[ACPIBAT_BIF_LCAPACITY].Integer.Value * 1000;
+	sc->sc_sensor[ACPIBAT_LCAPACITY].value_cur = val;
+	sc->sc_sensor[ACPIBAT_LCAPACITY].state = ACPIBAT_VAL_ISVALID(val);
+	sc->sc_sensor[ACPIBAT_LCAPACITY].flags |=
+	    ENVSYS_FPERCENT | ENVSYS_FVALID_MAX;
 
-	aprint_verbose("\n");
+	/*
+	 * Initialize the maximum of current, warning, and
+	 * low capacity to the last full charge capacity.
+	 */
+	val = sc->sc_sensor[ACPIBAT_LFCCAPACITY].value_cur;
+
+	sc->sc_sensor[ACPIBAT_CAPACITY].value_max = val;
+	sc->sc_sensor[ACPIBAT_WCAPACITY].value_max = val;
+	sc->sc_sensor[ACPIBAT_LCAPACITY].value_max = val;
 
-	rv = AE_OK;
+	sc->sc_available = ABAT_ALV_INFO;
 
 out:
-	ACPI_FREE(buf.Pointer);
+	if (obj != NULL)
+		ACPI_FREE(obj);
+
+	if (ACPI_FAILURE(rv))
+		aprint_error_dev(dv, "failed to evaluate _BIF: %s\n",
+		    AcpiFormatException(rv));
+
 	return rv;
 }
 
@@ -433,65 +562,67 @@
 acpibat_get_status(device_t dv)
 {
 	struct acpibat_softc *sc = device_private(dv);
-	int status, battrate;
-	ACPI_OBJECT *p1, *p2;
-	ACPI_STATUS rv;
-	ACPI_BUFFER buf;
+	ACPI_HANDLE hdl = sc->sc_node->ad_handle;
+	int i, rate, state, val;
+	ACPI_OBJECT *elm, *obj;
+	ACPI_STATUS rv = AE_OK;
 
-	rv = acpi_eval_struct(sc->sc_node->ad_handle, "_BST", &buf);
-	if (ACPI_FAILURE(rv)) {
-		aprint_error_dev(dv, "failed to evaluate _BST: %s\n",
-		    AcpiFormatException(rv));
-		return rv;
-	}
-	p1 = (ACPI_OBJECT *)buf.Pointer;
+	obj = acpibat_get_object(hdl, "_BST", ACPIBAT_BST_COUNT);
 
-	if (p1->Type != ACPI_TYPE_PACKAGE) {
-		aprint_error_dev(dv, "expected PACKAGE, got %d\n",
-		    p1->Type);
+	if (obj == NULL) {
 		rv = AE_ERROR;
 		goto out;
 	}
-	if (p1->Package.Count < 4) {
-		aprint_error_dev(dv, "expected 4 elts, got %d\n",
-		    p1->Package.Count);
-		rv = AE_ERROR;
-		goto out;
+
+	elm = obj->Package.Elements;
+
+	for (i = ACPIBAT_BST_STATE; i < ACPIBAT_BST_COUNT; i++) {
+
+		if (elm[i].Type != ACPI_TYPE_INTEGER) {
+			rv = AE_TYPE;
+			goto out;
+		}
+
+		KDASSERT((uint64_t)elm[i].Integer.Value < INT_MAX);
 	}
-	p2 = p1->Package.Elements;
 
-	status = p2[0].Integer.Value;
-	battrate = p2[1].Integer.Value;
+	rate = elm[ACPIBAT_BST_RATE].Integer.Value;
+	state = elm[ACPIBAT_BST_STATE].Integer.Value;
 
-	if (status & ACPIBAT_ST_CHARGING) {
+	if ((state & ACPIBAT_ST_CHARGING) != 0) {
 		sc->sc_sensor[ACPIBAT_CHARGERATE].state = ENVSYS_SVALID;
-		sc->sc_sensor[ACPIBAT_CHARGERATE].value_cur = battrate * 1000;
+		sc->sc_sensor[ACPIBAT_CHARGERATE].value_cur = rate * 1000;
 		sc->sc_sensor[ACPIBAT_DISCHARGERATE].state = ENVSYS_SINVALID;
 		sc->sc_sensor[ACPIBAT_CHARGING].state = ENVSYS_SVALID;
 		sc->sc_sensor[ACPIBAT_CHARGING].value_cur = 1;
-	} else if (status & ACPIBAT_ST_DISCHARGING) {
+	} else if ((state & ACPIBAT_ST_DISCHARGING) != 0) {
 		sc->sc_sensor[ACPIBAT_DISCHARGERATE].state = ENVSYS_SVALID;
-		sc->sc_sensor[ACPIBAT_DISCHARGERATE].value_cur = battrate * 1000;
+		sc->sc_sensor[ACPIBAT_DISCHARGERATE].value_cur = rate * 1000;
 		sc->sc_sensor[ACPIBAT_CHARGERATE].state = ENVSYS_SINVALID;
 		sc->sc_sensor[ACPIBAT_CHARGING].state = ENVSYS_SVALID;
 		sc->sc_sensor[ACPIBAT_CHARGING].value_cur = 0;
-	} else if (!(status & (ACPIBAT_ST_CHARGING|ACPIBAT_ST_DISCHARGING))) {
+	} else {
 		sc->sc_sensor[ACPIBAT_CHARGING].state = ENVSYS_SVALID;
 		sc->sc_sensor[ACPIBAT_CHARGING].value_cur = 0;
 		sc->sc_sensor[ACPIBAT_CHARGERATE].state = ENVSYS_SINVALID;
 		sc->sc_sensor[ACPIBAT_DISCHARGERATE].state = ENVSYS_SINVALID;
 	}
 
+	/* Remaining capacity. */
+	val = elm[ACPIBAT_BST_CAPACITY].Integer.Value * 1000;
+	sc->sc_sensor[ACPIBAT_CAPACITY].value_cur = val;
+	sc->sc_sensor[ACPIBAT_CAPACITY].state = ACPIBAT_VAL_ISVALID(val);
+	sc->sc_sensor[ACPIBAT_CAPACITY].flags |=
+	    ENVSYS_FPERCENT | ENVSYS_FVALID_MAX;
+
+	/* Battery voltage. */
+	val = elm[ACPIBAT_BST_VOLTAGE].Integer.Value * 1000;
+	sc->sc_sensor[ACPIBAT_VOLTAGE].value_cur = val;
+	sc->sc_sensor[ACPIBAT_VOLTAGE].state = ACPIBAT_VAL_ISVALID(val);
+
 	sc->sc_sensor[ACPIBAT_CHARGE_STATE].value_cur =
 	    ENVSYS_BATTERY_CAPACITY_NORMAL;
 
-	sc->sc_sensor[ACPIBAT_CAPACITY].value_cur = p2[2].Integer.Value * 1000;
-	sc->sc_sensor[ACPIBAT_CAPACITY].state = ENVSYS_SVALID;
-	sc->sc_sensor[ACPIBAT_CAPACITY].flags |=
-	    (ENVSYS_FPERCENT|ENVSYS_FVALID_MAX);
-	sc->sc_sensor[ACPIBAT_VOLTAGE].value_cur = p2[3].Integer.Value * 1000;
-	sc->sc_sensor[ACPIBAT_VOLTAGE].state = ENVSYS_SVALID;
-
 	if (sc->sc_sensor[ACPIBAT_CAPACITY].value_cur <
 	    sc->sc_sensor[ACPIBAT_WCAPACITY].value_cur) {
 		sc->sc_sensor[ACPIBAT_CAPACITY].state = ENVSYS_SWARNUNDER;
@@ -506,16 +637,20 @@
 		    ENVSYS_BATTERY_CAPACITY_LOW;
 	}
 
-	if (status & ACPIBAT_ST_CRITICAL) {
+	if ((state & ACPIBAT_ST_CRITICAL) != 0) {
 		sc->sc_sensor[ACPIBAT_CAPACITY].state = ENVSYS_SCRITICAL;
 		sc->sc_sensor[ACPIBAT_CHARGE_STATE].value_cur =
 		    ENVSYS_BATTERY_CAPACITY_CRITICAL;
 	}
 
-	rv = AE_OK;
-
 out:
-	ACPI_FREE(buf.Pointer);
+	if (obj != NULL)
+		ACPI_FREE(obj);
+
+	if (ACPI_FAILURE(rv))
+		aprint_error_dev(dv, "failed to evaluate _BST: %s\n",
+		    AcpiFormatException(rv));
+
 	return rv;
 }
 
@@ -597,12 +732,8 @@
 		if (sc->sc_available < ABAT_ALV_PRESENCE)
 #endif
 			/* presence is invalid */
-			if (acpibat_battery_present(dv) < 0) {
-				/* error */
-				aprint_debug_dev(dv,
-				    "cannot get battery presence.\n");
+			if (acpibat_battery_present(dv) < 0)
 				return;
-			}
 
 		if (ABAT_ISSET(sc, ABAT_F_PRESENT)) {
 			/* the battery is present. */
@@ -754,7 +885,7 @@
 	sc->sc_sensor[ACPIBAT_LCAPACITY].flags = ENVSYS_FMONNOTSUPP;
 
 	sc->sc_sme = sysmon_envsys_create();
-	for (i = 0; i < ACPIBAT_NSENSORS; i++) {
+	for (i = 0; i < ACPIBAT_COUNT; i++) {
 		if (sysmon_envsys_sensor_attach(sc->sc_sme,
 						&sc->sc_sensor[i])) {
 			aprint_error_dev(dv, "unable to add sensor%d\n", i);

Reply via email to