summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorAllan Jude <allanjude@FreeBSD.org>2019-06-06 05:10:32 +0000
committerAllan Jude <allanjude@FreeBSD.org>2019-06-06 05:10:32 +0000
commitb732b87de8d3c67a5475ff15bd71e3f89cb3e466 (patch)
treeb675e1eb4949ebb572e58e5ee2368f284dab4396 /sys
parent50a401cf435402454b4fb1d0ff6a51027e1607ea (diff)
Notes
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/acpica/acpi_battery.c27
1 files changed, 15 insertions, 12 deletions
diff --git a/sys/dev/acpica/acpi_battery.c b/sys/dev/acpica/acpi_battery.c
index a9ed4796c7671..8c6bc7e7bfbc8 100644
--- a/sys/dev/acpica/acpi_battery.c
+++ b/sys/dev/acpica/acpi_battery.c
@@ -119,7 +119,7 @@ int
acpi_battery_get_battinfo(device_t dev, struct acpi_battinfo *battinfo)
{
int batt_stat, devcount, dev_idx, error, i;
- int total_cap, total_min, valid_rate, valid_units;
+ int total_cap, total_lfcap, total_min, valid_rate, valid_units;
devclass_t batt_dc;
device_t batt_dev;
struct acpi_bst *bst;
@@ -152,6 +152,7 @@ acpi_battery_get_battinfo(device_t dev, struct acpi_battinfo *battinfo)
*/
dev_idx = -1;
batt_stat = valid_rate = valid_units = 0;
+ total_cap = total_lfcap = 0;
for (i = 0; i < devcount; i++) {
/* Default info for every battery is "not present". */
acpi_reset_battinfo(&bi[i]);
@@ -213,16 +214,22 @@ acpi_battery_get_battinfo(device_t dev, struct acpi_battinfo *battinfo)
if (!acpi_battery_bif_valid(bif))
continue;
- /* Calculate percent capacity remaining. */
- bi[i].cap = (100 * bst[i].cap) / bif->lfcap;
-
/*
* Some laptops report the "design-capacity" instead of the
* "real-capacity" when the battery is fully charged. That breaks
* the above arithmetic as it needs to be 100% maximum.
*/
- if (bi[i].cap > 100)
- bi[i].cap = 100;
+ if (bst[i].cap > bif->lfcap)
+ bst[i].cap = bif->lfcap;
+
+ /* Calculate percent capacity remaining. */
+ bi[i].cap = (100 * bst[i].cap) / bif->lfcap;
+
+ /* If this battery is not present, don't use its capacity. */
+ if (bi[i].cap != -1) {
+ total_cap += bst[i].cap;
+ total_lfcap += bif->lfcap;
+ }
/*
* On systems with more than one battery, they may get used
@@ -244,7 +251,7 @@ acpi_battery_get_battinfo(device_t dev, struct acpi_battinfo *battinfo)
}
/* Pass 2: calculate capacity and remaining time for all batteries. */
- total_cap = total_min = 0;
+ total_min = 0;
for (i = 0; i < devcount; i++) {
/*
* If any batteries are discharging, use the sum of the bst.rate
@@ -256,10 +263,6 @@ acpi_battery_get_battinfo(device_t dev, struct acpi_battinfo *battinfo)
else
bi[i].min = 0;
total_min += bi[i].min;
-
- /* If this battery is not present, don't use its capacity. */
- if (bi[i].cap != -1)
- total_cap += bi[i].cap;
}
/*
@@ -268,7 +271,7 @@ acpi_battery_get_battinfo(device_t dev, struct acpi_battinfo *battinfo)
*/
if (valid_units > 0) {
if (dev == NULL) {
- battinfo->cap = total_cap / valid_units;
+ battinfo->cap = (total_cap * 100) / total_lfcap;
battinfo->min = total_min;
battinfo->state = batt_stat;
battinfo->rate = valid_rate;