Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 06 Dec 2014 23:53:37 -0800
From:      Colin Percival <cperciva@freebsd.org>
To:        freebsd-acpi@freebsd.org
Subject:   ENXIOing non-present battery
Message-ID:  <54840781.70603@freebsd.org>

next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------010302010806090809050207
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 7bit

Hi ACPI people,

On my Dell Latitude E7440 laptop, the ACPI reports two batteries: First
the battery which exists; and second, a "Not Present" battery with zeroed
statistics.  FreeBSD, not realizing that this second battery is a complete
myth -- the E7440 only has one battery, and there is nowhere to add another
-- faithfully reports the data from ACPI to userland.

Unfortunately it causes some problems there; in particular, KDE interprets
it as meaning that the system should have two batteries, and when it sees
that the "second" battery has 0% power remaining it kicks off the "battery
is low, turn the laptop off" code.  If that code is disabled, it still
displays the wrong battery-charge-remaining status icons.

For dealing with such broken ACPIs, it seems like not attaching a non-present
battery would be a good idea.  This shouldn't be the default behaviour, since
there are plenty of systems where a non-present battery might be inserted at
a later time; but I see nothing wrong with adding an option.

The attached patch adds a acpi.cmbat.hide_not_present loader tunable which,
as the name suggests, hides non-present batteries; this is done in the probe
code by returning ENXIO if the tunable is set to a nonzero value and
acpi_BatteryIsPresent returns zero.  With this patch and the tunable set my
laptop behaves appropriately; and (aside from wasting a few bytes of memory)
there should be no effect on systems where the tunable is not set.

Any objections to me committing this?

-- 
Colin Percival
Security Officer Emeritus, FreeBSD | The power to serve
Founder, Tarsnap | www.tarsnap.com | Online backups for the truly paranoid

--------------010302010806090809050207
Content-Type: text/x-patch;
 name="hide_not_present.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="hide_not_present.patch"

Index: sys/dev/acpica/acpi_cmbat.c
===================================================================
--- sys/dev/acpica/acpi_cmbat.c	(revision 274932)
+++ sys/dev/acpica/acpi_cmbat.c	(working copy)
@@ -112,13 +112,17 @@
 DRIVER_MODULE(acpi_cmbat, acpi, acpi_cmbat_driver, acpi_cmbat_devclass, 0, 0);
 MODULE_DEPEND(acpi_cmbat, acpi, 1, 1, 1);
 
+static unsigned long hide_not_present = 0;
+TUNABLE_ULONG("acpi.cmbat.hide_not_present", &hide_not_present);
+
 static int
 acpi_cmbat_probe(device_t dev)
 {
     static char *cmbat_ids[] = { "PNP0C0A", NULL };
 
     if (acpi_disabled("cmbat") ||
-	ACPI_ID_PROBE(device_get_parent(dev), dev, cmbat_ids) == NULL)
+	ACPI_ID_PROBE(device_get_parent(dev), dev, cmbat_ids) == NULL ||
+	(hide_not_present && !acpi_BatteryIsPresent(dev)))
 	return (ENXIO);
 
     device_set_desc(dev, "ACPI Control Method Battery");

--------------010302010806090809050207--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?54840781.70603>