kernel/acpi_battery: Add quirk for DSDTs which report a negative 16-bit rate.
authorSascha Wildner <saw@online.de>
Sat, 13 Sep 2014 23:13:00 +0000 (01:13 +0200)
committerSascha Wildner <saw@online.de>
Sat, 13 Sep 2014 23:13:00 +0000 (01:13 +0200)
Discovered on a Packard Bell ENTF71BM laptop.

Fix found in Linux.

sys/dev/acpica/acpi_battery.c
sys/dev/acpica/acpi_quirks
sys/dev/acpica/acpivar.h

index e9602b1..85c12ab 100644 (file)
@@ -233,6 +233,16 @@ acpi_battery_get_battinfo(device_t dev, struct acpi_battinfo *battinfo)
        if (bst[i].rate != ACPI_BATT_UNKNOWN &&
            (bst[i].state & ACPI_BATT_STAT_DISCHARG) != 0)
            valid_rate += bst[i].rate;
+
+       /*
+        * Some DSDTs report a negative 16-bit value for the rate and/or
+        * report 0 as 65536.
+        */
+       if (acpi_quirks & ACPI_Q_BATT_RATE_ABS &&
+           bif->units == ACPI_BIF_UNITS_MA &&
+           bst[i].rate != ACPI_BATT_UNKNOWN &&
+           (int16_t)bst[i].rate < 0)
+               bst[i].rate = abs((int16_t)bst[i].rate);
     }
 
     /* If the caller asked for a device but we didn't find it, error. */
index 33e854e..25087fb 100644 (file)
@@ -426,6 +426,14 @@ oem:               FADT "AMIINT" ""
 oem_rev:       FADT = 0
 quirks:                ACPI_Q_BROKEN
 
+# Packard Bell Easynote ENTF71BM
+name:          Packard_Bell_ENTF71BM
+oem:           FADT "ACRSYS" "ACRPRDCT"
+oem_rev:       FADT = 0x00000003
+creator:       FADT "1025"
+creator_rev:   FADT = 0x00040000
+quirks:                ACPI_Q_BATT_RATE_ABS
+
 # QDIGRP 01/05/99
 name:          QDIGRP_Award
 oem:           FADT "QDIGRP" "AWRDACPI"
index d2b15ef..5ac55bc 100644 (file)
@@ -222,12 +222,15 @@ extern struct lock acpi_lock;
  * ACPI_Q_MADT_IRQ0: Specifies that ISA IRQ 0 is wired up to pin 0 of the
  *     first APIC and that the MADT should force that by ignoring the PC-AT
  *     compatible flag and ignoring overrides that redirect IRQ 0 to pin 2.
+ * ACPI_Q_BATT_RATE_ABS: Specifies that the DSDT reports a negative 16-bit
+ *     value for charging/discharging current and/or 0 as 65536.
  */
 extern int     acpi_quirks;
 #define ACPI_Q_OK              0
 #define ACPI_Q_BROKEN          (1 << 0)
 #define ACPI_Q_TIMER           (1 << 1)
 #define ACPI_Q_MADT_IRQ0       (1 << 2)
+#define ACPI_Q_BATT_RATE_ABS   (1 << 3)
 
 /*
  * Note that the low ivar values are reserved to provide