summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorgdt <gdt@NetBSD.org>2006-10-11 19:00:12 +0000
committergdt <gdt@NetBSD.org>2006-10-11 19:00:12 +0000
commitcf2f8187a81f4eef6ddbbd01010a139564e21cef (patch)
tree18dadfd1f90cc2372e57501c668f3647291a0010 /sys/dev
parent8bcd5596e1fb92cb33d9927b40016fd324b1637a (diff)
Aggregate current charge level and lastcap over all batteries, rather
than taking values from the last battery checked. Solves problem of apm showing status of 2nd battery in a 2-battery system.
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/acpi/acpi_apm.c31
1 files changed, 21 insertions, 10 deletions
diff --git a/sys/dev/acpi/acpi_apm.c b/sys/dev/acpi/acpi_apm.c
index e8ef8af5875..febeae5d293 100644
--- a/sys/dev/acpi/acpi_apm.c
+++ b/sys/dev/acpi/acpi_apm.c
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_apm.c,v 1.4 2006/08/06 15:47:51 christos Exp $ */
+/* $NetBSD: acpi_apm.c,v 1.5 2006/10/11 19:00:12 gdt Exp $ */
/*-
* Copyright (c) 2006 The NetBSD Foundation, Inc.
@@ -42,7 +42,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_apm.c,v 1.4 2006/08/06 15:47:51 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_apm.c,v 1.5 2006/10/11 19:00:12 gdt Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -273,17 +273,23 @@ acpiapm_get_powstat(void *opaque, u_int batteryid, struct apm_power_info *pinfo)
APM_BATT_FLAG_LOW | \
APM_BATT_FLAG_HIGH)
int i, curcap, lowcap, warncap, cap, descap, lastcap, discharge;
+ int cap_valid, lastcap_valid;
envsys_tre_data_t etds;
envsys_basic_info_t ebis;
- curcap = lowcap = warncap = cap = descap = lastcap = discharge = -1;
+ /* Denote most variables as unitialized. */
+ curcap = lowcap = warncap = descap = discharge = -1;
+
+ /* Prepare to aggregate these two variables over all batteries. */
+ cap = lastcap = 0;
+ cap_valid = lastcap_valid = 0;
(void)memset(pinfo, 0, sizeof(*pinfo));
pinfo->ac_state = APM_AC_UNKNOWN;
pinfo->minutes_valid = 0;
pinfo->minutes_left = 0xffff; /* unknown */
pinfo->batteryid = 0;
- pinfo->nbattery = 1;
+ pinfo->nbattery = 0; /* to be incremented as batteries are found */
pinfo->battery_flags = 0;
pinfo->battery_state = APM_BATT_UNKNOWN; /* ignored */
pinfo->battery_life = APM_BATT_LIFE_UNKNOWN;
@@ -320,18 +326,23 @@ acpiapm_get_powstat(void *opaque, u_int batteryid, struct apm_power_info *pinfo)
warncap = data / 1000;
else if (strstr(desc, " low cap"))
lowcap = data / 1000;
- else if (strstr(desc, " last full cap"))
- lastcap = data / 1000;
+ else if (strstr(desc, " last full cap")) {
+ lastcap += data / 1000;
+ lastcap_valid = 1;
+ }
else if (strstr(desc, " design cap"))
descap = data / 1000;
else if (strstr(desc, " charge") &&
- strstr(desc, " charge rate") == NULL)
- cap = data / 1000;
+ strstr(desc, " charge rate") == NULL) {
+ cap += data / 1000;
+ cap_valid = 1;
+ pinfo->nbattery++;
+ }
else if (strstr(desc, " discharge rate"))
discharge = data / 1000;
}
- if (cap != -1) {
+ if (cap_valid > 0) {
if (warncap != -1 && cap < warncap)
pinfo->battery_flags |= APM_BATT_FLAG_CRITICAL;
else if (lowcap != -1) {
@@ -340,7 +351,7 @@ acpiapm_get_powstat(void *opaque, u_int batteryid, struct apm_power_info *pinfo)
else
pinfo->battery_flags |= APM_BATT_FLAG_HIGH;
}
- if (lastcap != -1 && lastcap != 0)
+ if (lastcap_valid > 0 && lastcap != 0)
pinfo->battery_life = 100 * cap / lastcap;
else if (descap != -1 && descap != 0)
pinfo->battery_life = 100 * cap / descap;