/proc/acpi/battery/BAT0/info stale when battery changed on Thinkpad X60t
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
Please check if following patch helps:
drivers/acpi/battery.c +0 -0
@@ -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;drivers/acpi/battery.c
Quoted 4 lines · Alexey Starikovskiy
Please check if following patch helps:
drivers/acpi/battery.c +0
-0
Yes, with that patch the problem seems to have gone away.
Thanks!
-Andy
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
@@ -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;