Ticket #11260 (new defect)
i8042 data loss over suspend/resume
| Reported by: | dsd | Owned by: | rsmith |
|---|---|---|---|
| Priority: | normal | Milestone: | Future Release |
| Component: | embedded controller | Version: | 1.5-C2 |
| Keywords: | Cc: | pgf | |
| Action Needed: | never set | Verified: | no |
| Deployments affected: | Blocked By: | ||
| Blocking: |
Description
Testing my XO-1.5, reproduced with both the synaptics-mouse base section that it came shipped with, and the AVC-mouse base shipped borrowed from my XO-1.75 B1.
I am finding that if I suspend by typing "echo mem > /sys/power/state" at the terminal (and terminating with the 'enter' key of course), sometimes the system suspends before the "enter released" interrupt comes in, and this interrupt then never properly arrives on resume. I am resuming with the power button. Reproducible within a few tries (especially on a more modern kernel which seems to suspend quicker).
Upon wakeup, the i8042 resume code simulates an interrupt (not sure exactly why, but if we don't do this then no interrupts arrive later). I8042_STATUS_REG reads 0x10 (i.e. no OBF bit set), indicating no data.
Then Linux receives a real interrupt, but I8042_STATUS_REG reads 0x10 still (no data). And the result is that the "enter released" interrupt (expected data 0x9c) was never received and the system incorrectly thinks that enter is held down.
[ 656.532452] i8042: [65410] read I8042_STATUS_REG=11 [ 656.532466] i8042: [65410] read I8042_DATA_REG=1c [ 656.532478] i8042: [65410] 1c <- i8042 (interrupt, 0, 1) [ 656.539243] PM: Syncing filesystems ... done. [ 656.547792] PM: Preparing system for mem sleep [ 656.547813] Freezing user space processes ... (elapsed 0.01 seconds) done. [ 656.572828] Freezing remaining freezable tasks ... (elapsed 0.01 seconds) done. [ 656.592816] PM: Entering mem sleep [ 656.593599] i8042 kbd 00:04: wake-up capability enabled by ACPI [ 656.599616] i8042 aux 00:03: wake-up capability disabled by ACPI [ 656.605834] ehci_hcd 0000:00:10.4: PCI INT D disabled [ 656.610999] uhci_hcd 0000:00:10.2: PCI INT C disabled [ 656.616305] uhci_hcd 0000:00:10.0: PCI INT A disabled [ 656.621507] viafb_suspend! [ 656.624849] viafb 0000:00:01.0: PCI INT A disabled [ 656.629836] ACPI handle has no context! [ 656.629850] sdhci-pci 0000:00:0c.0: PCI INT A disabled [ 656.635060] uhci_hcd 0000:00:10.1: PCI INT B disabled [ 656.640212] ACPI handle has no context! [ 656.660048] PM: suspend of devices complete after 66.956 msecs [ 656.740257] PM: late suspend of devices complete after 74.286 msecs [ 656.746712] ACPI: Preparing to enter system sleep state S3 [ 656.850073] PM: Saving platform NVS memory [ 656.850073] ACPI: Low-level resume complete [ 656.850073] PM: Restoring platform NVS memory [ 656.850073] ACPI: Waking up from system sleep state S3 [ 656.860330] viafb 0000:00:01.0: restoring config space at offset 0xf (was 0x100, writing 0x10a) [ 656.860381] sdhci-pci 0000:00:0c.0: restoring config space at offset 0xf (was 0x100, writing 0x10a) [ 656.860409] sdhci-pci 0000:00:0c.0: restoring config space at offset 0x6 (was 0x0, writing 0x80002000) [ 656.860426] sdhci-pci 0000:00:0c.0: restoring config space at offset 0x5 (was 0x0, writing 0x80001000) [ 656.860443] sdhci-pci 0000:00:0c.0: restoring config space at offset 0x4 (was 0x0, writing 0x80000000) [ 656.860463] sdhci-pci 0000:00:0c.0: restoring config space at offset 0x1 (was 0x2100010, writing 0x2100016) [ 656.880042] uhci_hcd 0000:00:10.0: BAR 4: set to [io 0x8000-0x801f] (PCI address [0x8000-0x801f]) [ 656.889122] uhci_hcd 0000:00:10.0: restoring config space at offset 0xf (was 0x100, writing 0x10a) [ 656.889157] uhci_hcd 0000:00:10.0: restoring config space at offset 0x1 (was 0x2100010, writing 0x2100013) [ 656.900032] uhci_hcd 0000:00:10.1: BAR 4: set to [io 0x8020-0x803f] (PCI address [0x8020-0x803f]) [ 656.909089] uhci_hcd 0000:00:10.1: restoring config space at offset 0xf (was 0x200, writing 0x209) [ 656.909124] uhci_hcd 0000:00:10.1: restoring config space at offset 0x1 (was 0x2100010, writing 0x2100013) [ 656.920031] uhci_hcd 0000:00:10.2: BAR 4: set to [io 0x8040-0x805f] (PCI address [0x8040-0x805f]) [ 656.929085] uhci_hcd 0000:00:10.2: restoring config space at offset 0xf (was 0x300, writing 0x30b) [ 656.929120] uhci_hcd 0000:00:10.2: restoring config space at offset 0x1 (was 0x2100000, writing 0x2100013) [ 656.940032] ehci_hcd 0000:00:10.4: BAR 0: set to [mem 0x80003000-0x800030ff] (PCI address [0x80003000-0x800030ff]) [ 656.950508] ehci_hcd 0000:00:10.4: restoring config space at offset 0xf (was 0x400, writing 0x40a) [ 656.950542] ehci_hcd 0000:00:10.4: restoring config space at offset 0x1 (was 0x2100010, writing 0x2100012) [ 656.950681] pci 0000:00:14.0: restoring config space at offset 0xf (was 0x100, writing 0x109) [ 656.950709] pci 0000:00:14.0: restoring config space at offset 0x4 (was 0x8fff0004, writing 0x80004004) [ 656.950890] PM: early resume of devices complete after 90.837 msecs [ 656.957521] viafb 0000:00:01.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16 [ 656.964493] sdhci-pci 0000:00:0c.0: PCI INT A -> GSI 22 (level, low) -> IRQ 22 [ 656.971814] uhci_hcd 0000:00:10.0: PCI INT A -> GSI 20 (level, low) -> IRQ 20 [ 656.979054] usb usb2: root hub lost power or was reset [ 656.984305] uhci_hcd 0000:00:10.1: PCI INT B -> GSI 22 (level, low) -> IRQ 22 [ 656.991583] uhci_hcd 0000:00:10.2: PCI INT C -> GSI 21 (level, low) -> IRQ 21 [ 656.998809] usb usb4: root hub lost power or was reset [ 657.004176] ehci_hcd 0000:00:10.4: PCI INT D -> GSI 23 (level, low) -> IRQ 23 [ 657.011464] pci 0000:00:13.0: setting latency timer to 64 [ 657.024832] viafb_resume! [ 657.027960] viafb_resume: Init 3d engine! [ 657.032287] usb usb3: root hub lost power or was reset [ 657.032330] sdhci-pci 0000:00:0c.0: setting latency timer to 64 [ 657.032366] sdhci-pci 0000:00:0c.0: setting latency timer to 64 [ 657.032388] sdhci-pci 0000:00:0c.0: setting latency timer to 64 [ 657.052220] i8042 kbd 00:04: wake-up capability disabled by ACPI [ 657.070911] i8042: [65464] soft resume interrupt [ 657.070923] i8042: [65464] read I8042_STATUS_REG=10 [ 657.070942] i8042: [65464] read I8042_STATUS_REG=10 [ 657.070951] i8042: [65464] Interrupt 1, without any data [ 657.280197] PM: resume of devices complete after 322.805 msecs [ 657.286390] PM: Finishing wakeup. [ 657.286397] Restarting tasks ... done.
Kernel which you can use to debug this, which prints all i8042 I/O (as above): http://dev.laptop.org/~dsd/20110920/bzImage
Be sure to enable debugging and keyboard wakeup before suspending, with:
echo 1 > /sys/module/i8042/parameters/debug echo 1 > /sys/devices/platform/i8042/power/wakeup echo 1 > /sys/devices/platform/i8042/serio0/power/wakeup echo 1 > /sys/devices/platform/i8042/serio1/power/wakeup echo 1 > /sys/devices/platform/i8042/serio0/input/*/power/wakeup echo 1 > /sys/devices/platform/i8042/serio1/input/*/power/wakeup


