Kernel Bug Tracker – Bug 12632
don't assume we are fully charged when not charging or discharging
Last modified: 2009-02-22 17:48:20 UTC
Latest working kernel version: None
Earliest failing kernel version: Everything since ACPI moved to using the power_supply class
Distribution: Fedora rawhide
Hardware Environment: Lenovo T61
Software Environment: Fedora rawhide
On hardware like the T61 it can take a couple of seconds for the battery
to start charging after the power is connected, and we incorrectly tell
userspace that we are fully charged, and then go back to charging.
Only mark a battery as fully charged when the preset charge matches either
the last full charge, or the design charge.
Steps to reproduce:
Charge battery to 50%. Watch /sys/class/power_supply/BAT*/status, and observe that when the power is disconnected, the status goes from charging->fully_charged->discharging. This also happens when going from battery to AC. This greatly confuses userspace.
Created attachment 20107 [details]
patch to fix the problem
This fixes things up for me. I've sent this patch twice to linux-acpi but it's so far been ignored: http://www.spinics.net/lists/linux-acpi/msg19946.html. Thanks for considering.
there are three battery status in all, charging/discharging/full changed, right?
The BIOS should reflect the correct state all the time.
I did your test on another laptop, and the status goes from charging to discharging immediately. So this may be a BIOS problem?
1. kill acpid, run "cat /proc/acpi/event", unplug the AC, and attach the output.
2. attach the output of "grep . /sys/firmware/acpi/interrupts/*"
3. attach the full dmesg output after boot
4. attach the acpidump output
Rui, this one is already discussed and solved.
There is a short time frame then EC decides what to do with the battery, during this time, battery will not have charging or discharging state, even if it is almost empty. There is a special state in power class for that -- NOT_CHARGING.
So, there are 4 states to the battery.
Real users are hitting this in Fedora 11 RC1 -- For instance see the debug output in http://bugzilla.gnome.org/show_bug.cgi?id=570133
Do I need to resubmit anything, or is the patch in the queue to send to Linus? Thanks.
I was able to reproduce this failure on my FC10 T61.
However, I was also able to reproduce this failure after
the patch in comment #1 was applied.
This situation seems to correct itself in about 1 sec, sometimes much less.
As this is about the amount of time it takes me to get my attention
back to the screen after plugging in the power, I'm not alarmed
about a battery status icon being incorrect for 1 sec. Are there
more severe implications of this bug that I'm unaware of?
I found that the "mouse hover" scheme for getting more information from the
battery monitor is broken. If the mouse is not moved, the hover
text is not updated and can quickly become inconsistent with the
battery icon (and reality).
Richard, I discharged the T61 down to about 85%, plugged in AC,
and saw the battery icon switch from DC, to AC w/o an electron bolt
and hovered and was told I'm on AC with the battery is fully charged at 85%,
then a moment later the electron bolt appeared on the icon and
hover tells me that I'm charging at 85%.
I should have done this in the first place...
watch -d -n 1 grep . /sys/class/power_supply/BAT0/*
during AC/DC changes shows that the patch works --
status in the DC->AC transient state becomes "Unknown"
instead of "Full".
However, this doesn't seem to solve the problems in the GUI,
which continues to often show full on DC->AC transition,
followed by 'charging' a few seconds later.
From what I can see, the kernel part of this puzzle
is now working as well as it can, giving what the hardware gives us.
(In reply to comment #5)
> This situation seems to correct itself in about 1 sec, sometimes much less.
> As this is about the amount of time it takes me to get my attention
> back to the screen after plugging in the power, I'm not alarmed
> about a battery status icon being incorrect for 1 sec. Are there
> more severe implications of this bug that I'm unaware of?
When we emit fully charged from the kernel to userspace it triggers a notification to the user and also stops the battery statistics profiler.
> during AC/DC changes shows that the patch works --
> status in the DC->AC transient state becomes "Unknown"
> instead of "Full".
Correct, this is the desired state as we can't guess from the EC, as the EC doesn't itself know the state.
> However, this doesn't seem to solve the problems in the GUI,
> which continues to often show full on DC->AC transition,
> followed by 'charging' a few seconds later.
Right, I just need to hide the icon when the status is unknown. That's a patch I'm running with locally here. I don't think we should show a "confused" battery icon, just hide it until the EC knows the state.
> From what I can see, the kernel part of this puzzle
> is now working as well as it can, giving what the hardware gives us.
Yes, the patch makes the interaction go from state->unknown->!state rather than state->fully-charged->!state which is much better for userspace.
Thanks for sorting this, cheers.
okay, patch in comment #1, which was in acpi-test,
is now staged for upstream.
battery: don't assume we are fully charged when not charging or discharging
shipped in 2.6.29-rc5-git7