I can confirm this works on a Samsung NP900x4c. The same EC port range in DSDT.
Great work! Thanks a lot. Sent from my iPhone > On 18 Feb 2014, at 18:49, juanmanuel <rockerit...@gmail.com> wrote: > > FINALLY!! I found the exact problem _and_ a SOLUTION!!! (NOTE: see > attached program) > > The problem is that Samsung's embedded controller stops sending GPE > events if it still is waiting for previous GPE events to be queried from > it. > > It will remain in that state until one hits the reset hole in the back > of the latop, or flashes a bios, or queries the events. > > ---> But how will the OS query the events if the GPE interrupt isn't > produced anymore? Classic chicken and egg. <---- > > So I made a small program that does just that -- it queries events from > the EC until there are no more to query. AND IT WORKED!! This restores > the normal behavior, and AC, Battery and LID events start to be produced > again. One would ideally run it after resume from sleep. I based it > after observing normal behavior in <linuxkernel>/drivers/acpi/ec.c, and > afterwards behaviour with laptop in "problem state". > > Following is the program (I will attach it too). You can either: > > 1) Run it by hand after resume from sleep. > > 2) Or Automatically run it from /usr/lib/pm-utils/sleep.d/99-your- > script-here (you can use 95led as basis). > > 3) Or Insert this code in the linux kernel at the beginning of the > acpi_ec_unblock_transactions_early() function in > "<linuxkernel>/drivers/acpi/ec.c" and recompile the kernel. The cmd and > data ports are known in ec.c so they don't need to be hardcoded there. > > PS: Other things that I already tried that didn't fix it: > 1) Please note that I already tried commenting "acpi_disable_all_gpes()" > from "<linuxkernel>/drivers/acpi/sleep.c" and this didn't have an effect (I > guess unreplied events were already accumulated in the EC prior to resume). > 2) I also tried reverting to calling acpi_enable() on sleep.c instead of > setting the ACPI_BITREG_SCI_ENABLE. No effect, issue still resurfaced after > some suspends. > 3) I also tried commenting out the call to > acpi_ec_unblock_transactions_early() in sleep.c, but no effect. > > PS2: Another way to force the embedded controller to be in a problem state > that I discovered, is to: > 1) echo disable > /sys/firmware/acpi/interrupts/gpe17 > 2) plug, unplug, plug, unplug, plug, unplug, plug, unplug (8 actions) > 3) echo enable > /sys/firmware/acpi/interrupts/gpe17 > > > Following are the two files with fixes which I'll attach too: > > NOTE: you must check that embedded controller ports are 0x62 and 0x66 > looking in your DSDT. RUN AT YOUR OWN RISK!!! > > ---- samsung_fix_ec_events.c ------------------------------------------ > #include <stdio.h> > #include <unistd.h> > #include <sys/io.h> > > /* Compile with: > * gcc -o samsung_fix_ec_events samsung_fix_ec_events.c > * Run as: > * sudo ./samsung_fix_ec_events > * You may copy it to /usr/local/bin and then call it > * automatically after resume from sleep with a /usr/lib/pm-utils/sleep.d > script: > * sudo cp ./samsung_fix_ec_events /usr/local/bin/ > */ > > /* Constants: */ > enum ec_command { > /* Standard command for querying LID, Battery and AC events: */ > ACPI_EC_COMMAND_QUERY = 0x84, > > /* ATTENTION: PLEASE edit the following two according to your DSDT. > * For "Samsung Series 5 NP530U3C", they are 0x62 and 0x66 respectively. > * They seem to be the same for many other samsung models, but if you > don't check > * them first in the H_EC._CRS section of your DSDT, you run it at YOUR > OWN RISK: */ > EC_DATA_PORT = 0x62, > EC_COMMAND_PORT = 0x66 > }; > > int main (int argc, char** argv) { > char status = 0; > char data = 0; > int count = 0; > > if (iopl(3)) { > printf("Error: Permission to read/write to EmbeddedController port not > granted.\n"); > return 1; > } > > /* Query AC, Battery, LID, etc. events until there are no more. > * This clears them for the EC so that it can send them again in the > future, thus unblocking the EC. */ > do { > outb(ACPI_EC_COMMAND_QUERY, EC_COMMAND_PORT); > status = inb(EC_COMMAND_PORT); > data = inb(EC_DATA_PORT); > /* printf("CommandQuery 0x84, status=0x%x, data=0x%x\n", status, > data); */ > } while (data != 0 && ++count < 10000); /* Note: No less than a thousand > max count */ > > printf("EmbeddedController GPE events flushed. New events can be > produced now.\n"); > > return 0; > } > ----END samsung_fix_ec_events.c ------------------------------------------ > > > ----- 99samsung_fix_ec_events ---------------------------------------------- > #!/bin/sh > # NOTE: Put this file in: /usr/lib/pm-utils/sleep.d/99samsung_fix_ec_events > # > # On some samsung laptops (series 5 2012, series 9 2011, etc) , if many EC > # GPE events are produced during sleep (AC plugged/unplugged, battery % > change > # change, LID open/close, etc), and they are not queried, the > # EmbeddedController stops sending them and this creates a chicken and egg > # situation, that can only be resolved either by hitting the reset button in > # the back while powered off, or by simply forcing a query for the events > here after resume. > > case "$1" in > hibernate|suspend) > ;; > thaw|resume) > #NOTE: edit this path if necessary to point to the program with the > fix: > /usr/local/bin/samsung_fix_ec_events > ;; > *) exit $NA > ;; > esac > > exit 0 > > ----- END 99samsung_fix_ec_events > ------------------------------------------- > > -- > You received this bug notification because you are subscribed to the bug > report. > https://bugs.launchpad.net/bugs/971061 > > Title: > acpi reports battery state incorrectly > > Status in Linux ACPI client: > Incomplete > Status in “acpi” package in Ubuntu: > Confirmed > > Bug description: > I have a new Samsung 9-series laptop (NP900X3B) and the battery state > is detected incorrectly. Basically the state what was at the time of > boot stays active all the time - regardless of the ac-adapter state. > > Here is output from "acpitool -a -b" in various situations: > > When booted with charger connected and charger is still connected: > Battery #1 : charging, 47.00%, 01:00:43 > AC adapter : on-line > > When booted with charger connected and charger is now disconnected: > Battery #1 : charging, 47.00%, 01:36:59 > AC adapter : off-line > [The battery couldn't possibly be charging when the AC adapter is offline!] > > When booted with charger disconnected and charger is still disconnected: > Battery #1 : discharging, 47.00%, 01:39:44 > AC adapter : off-line > > When booted with charger disconnected and charger is now connected: > Battery #1 : discharging, 47.00%, 00:53:43 > AC adapter : on-line > [The battery is actually charging as the AC adapter is online] > > The percentage and time are correctly updated when the battery is > actually charging or discharging - regardless of the reported state. > So the state is the only thing that is incorrect. However a number of > applications make their decisions based on this state (battery > monitor, jupiter, etc.) and therefore behave incorrectly. > > "lshal -m" doesn't report anything when I plug the charger in or out. > > ProblemType: Bug > DistroRelease: Ubuntu 12.04 > Package: acpi (not installed) > ProcVersionSignature: Ubuntu 3.2.0-21.34-generic 3.2.13 > Uname: Linux 3.2.0-21-generic x86_64 > ApportVersion: 2.0-0ubuntu2 > Architecture: amd64 > Date: Sun Apr 1 22:50:35 2012 > EcryptfsInUse: Yes > InstallationMedia: Ubuntu 12.04 LTS "Precise Pangolin" - Beta amd64 > (20120328) > ProcEnviron: > LANG=en_US.UTF-8 > SHELL=/bin/bash > SourcePackage: acpi > UpgradeStatus: No upgrade log present (probably fresh install) > > To manage notifications about this bug go to: > https://bugs.launchpad.net/acpi/+bug/971061/+subscriptions -- You received this bug notification because you are a member of Ubuntu Bugs, which is subscribed to Ubuntu. https://bugs.launchpad.net/bugs/971061 Title: acpi reports battery state incorrectly To manage notifications about this bug go to: https://bugs.launchpad.net/acpi/+bug/971061/+subscriptions -- ubuntu-bugs mailing list ubuntu-bugs@lists.ubuntu.com https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs