Skip to contentSkip to conversation

/proc/acpi/battery/BAT0/info stale when battery changed on Thinkpad X60t

PATCH New Andy Neitzke 3 participants 4 messages May 14, 2008 – May 15, 2008 ACPI

lore
Share & tools
lore
#0 lore raw

Hi,

I have two batteries for my Thinkpad X60 Tablet, one 6-cell and one 9-cell, with very different capacities. If I boot up or resume from suspend with say battery A connected, then /proc/acpi/battery/BAT0/info correctly shows information about battery A. If I then connect the system to AC power and remove battery A, /proc/acpi/battery/BAT0/info correctly shows that no battery is present. If I then attach battery B,
then /proc/acpi/battery/BAT0/info incorrectly shows the information about battery A again! (And similarly e.g. kpowersave shows the wrong capacity.) On the other hand /proc/acpi/battery/BAT0/state always shows the correct information. A suspend-resume cycle clears up the problem.

For example:

andy@chirality ~ $ cat /proc/acpi/battery/BAT0/state

present:                 yes
capacity state:          ok
charging state:          charged
present rate:            0 mW
remaining capacity:      61650 mWh
present voltage:         16587 mV

andy@chirality ~ $ cat /proc/acpi/battery/BAT0/info

present:                 yes
design capacity:         28800 mWh
last full capacity:      23550 mWh
battery technology:      rechargeable
design voltage:          14400 mV
design capacity warning: 1177 mWh
design capacity low:     200 mWh
capacity granularity 1:  1 mWh
capacity granularity 2:  1 mWh
model number:            93P5031
serial number:             482
battery type:            LION
OEM info:                SANYO

and then after suspend-resume, the correct information:

andy@chirality ~ $ cat /proc/acpi/battery/BAT0/info

present:                 yes
design capacity:         66240 mWh
last full capacity:      61650 mWh
battery technology:      rechargeable
design voltage:          14400 mV
design capacity warning: 3082 mWh
design capacity low:     200 mWh
capacity granularity 1:  1 mWh
capacity granularity 2:  1 mWh
model number:            42T4507
serial number:             833
battery type:            LION
OEM info:                SANYO

At the moment I am seeing this problem with kernel 2.6.25.3, but I believe I have had it for a while (I was reminded of it only just now because I started using kpowersave again).

Any ideas? I'm happy to try to debug, but don't know where to start.

Thanks, and best wishes,

-Andy

#1 lore raw

Please check if following patch helps:

drivers/acpi/battery.c +0 -0
index b1c723f..e5ca3a0 100644
@@ -472,7 +472,7 @@ static void sysfs_remove_battery(struct acpi_battery *battery)
 

static int acpi_battery_update(struct acpi_battery *battery) {
- int result;

+    int result, old_present = acpi_battery_present(battery);
    result = acpi_battery_get_status(battery);
    if (result)
        return result;
@@ -483,7 +483,8 @@ static int acpi_battery_update(struct acpi_battery *battery)
        return 0;
    }
#endif
-    if (!battery->update_time) {
+    if (!battery->update_time ||
+        old_present != acpi_battery_present(battery)) {
        result = acpi_battery_get_info(battery);
        if (result)
            return result;
#2 lore raw

drivers/acpi/battery.c

Quoted 4 lines · Alexey Starikovskiy

Please check if following patch helps:

drivers/acpi/battery.c +0 -0
index b1c723f..e5ca3a0 100644

Yes, with that patch the problem seems to have gone away.

Thanks!

-Andy

#3 lore raw

PATCH 1/1 ACPI: Battery: Update info for inserted battery

---

 drivers/acpi/battery.c |    5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)
drivers/acpi/battery.c +3 -2
index b1c723f..e5ca3a0 100644
@@ -472,7 +472,7 @@ static void sysfs_remove_battery(struct acpi_battery *battery)
 
 static int acpi_battery_update(struct acpi_battery *battery)
 {
-	int result;
+	int result, old_present = acpi_battery_present(battery);
 	result = acpi_battery_get_status(battery);
 	if (result)
 		return result;
@@ -483,7 +483,8 @@ static int acpi_battery_update(struct acpi_battery *battery)
 		return 0;
 	}
 #endif
-	if (!battery->update_time) {
+	if (!battery->update_time ||
+	    old_present != acpi_battery_present(battery)) {
 		result = acpi_battery_get_info(battery);
 		if (result)
 			return result;