Comment 28 for bug 191137

Revision history for this message
TJ (tj) wrote : Re: i386 Hardy boots only in recovery mode on VAIO FE41Z

What we expect to see is:

[ 28.070535] ACPI: EC: Look up EC in DSDT
[ 28.077294] ACPI: Interpreter enabled
[ 28.077357] ACPI: (supports S0 S3 S4 S5)
[ 28.077612] ACPI: Using IOAPIC for interrupt routing
[ 28.078065] ACPI: EC: non-query interrupt received, switching to interrupt mode
[ 28.105273] ACPI: EC: GPE = 0x17, I/O: command/status = 0x66, data = 0x62
[ 28.105338] ACPI: EC: driver started in interrupt mode

But i386, when on external power, reports:

[ 18.127035] ACPI: EC: Look up EC in DSDT
[ 18.136591] ACPI: Interpreter enabled
[ 18.136594] ACPI: (supports S0 S3 S4 S5)
[ 18.136604] ACPI: Using IOAPIC for interrupt routing
[ 18.136844] ACPI: EC: non-query interrupt received, switching to interrupt mode
[ 18.634304] ACPI: EC: acpi_ec_wait timeout, status = 0, expect_event = 1
[ 18.634362] ACPI: EC: read timeout, command = 128
[ 18.634415] ACPI Exception (evregion-0420): AE_TIME, Returned by Handler for [EmbeddedControl] [20070126]
[ 18.634419] ACPI Exception (dswexec-0462): AE_TIME, While resolving operands for [OpcodeName unavailable] [20070126]
[ 18.634423] ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC__._REG] (Node f7c4bd20), AE_TIME
[ 19.142018] ACPI: EC: missing confirmations, switch off interrupt mode.
[ 19.154286] ACPI: EC: GPE = 0x17, I/O: command/status = 0x66, data = 0x62
[ 19.154288] ACPI: EC: driver started in poll mode

The key part is:

[ 18.634419] ACPI Exception (dswexec-0462): AE_TIME, While resolving operands for [OpcodeName unavailable] [20070126]

The ACPI EC._REG method is:

Method (_REG, 2, NotSerialized)
{
    If (LEqual (Arg0, 0x03))
    {
        Store (Arg1, ECON)
        Store (BATP, BNUM)
        Store (RSCL, B0SC)
        Store (RPWR, PWRS)
        Notify (BAT0, 0x81)
        PNOT ()
        If (LEqual (PRCP, One))
        {
            Notify (DOCK, Zero)
        }

        If (LEqual (WKSR, 0x02))
        {
            Notify (DOCK, One)
        }
    }
}

If the early-enabling of the EC is the reason, it looks to me as if one or more of the STORE() operations is failing because the target hasn't been declared in the ACPI name-space yet.

The call-chain looks to be:

drivers/acpi/ec.c::acpi_ec_transaction_unlocked()
 drivers/acpi/ec.c::acpi_ec_wait()

-- drivers/acpi/ec.c::acpi_ec_transaction_unlocked() --

for (; rdata_len > 0; --rdata_len) {
 result = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF_1, force_poll);
 if (result) {
  pr_err(PREFIX "read timeout, command = %d\n", command);
  goto end;

--

-- acpi_ec_wait() --

if (likely(test_bit(EC_FLAGS_GPE_MODE, &ec->flags)) && ...

...
 if (acpi_ec_check_status(ec, event)) {
...
 } else {
  /* missing GPEs, switch back to poll mode */
  if (printk_ratelimit())
   pr_info(PREFIX "missing confirmations, "
    "switch off interrupt mode.\n");
  clear_bit(EC_FLAGS_GPE_MODE, &ec->flags);
 }

I'll do an ACPI debug test on this and see where it is going wrong.