Input: i8042 - really suppress ACK/NAK during panic blink
authorDmitry Torokhov <dtor@insightbb.com>
Thu, 18 Jan 2007 05:42:31 +0000 (00:42 -0500)
committerDmitry Torokhov <dtor@insightbb.com>
Thu, 18 Jan 2007 05:42:31 +0000 (00:42 -0500)
On some boxes panic blink procedure manages to send both bytes
to keyboard contoller before getting first ACK so we need to
make i8042_suppress_kbd_ack a counter instead of boolean.

Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
drivers/input/serio/i8042.c

index debe9445488c0cfefc221823da9fe205a5515d9f..1364c7964db47283221d6ea7b539af7b91126c52 100644 (file)
@@ -371,7 +371,7 @@ static irqreturn_t i8042_interrupt(int irq, void *dev_id)
        if (unlikely(i8042_suppress_kbd_ack))
                if (port_no == I8042_KBD_PORT_NO &&
                    (data == 0xfa || data == 0xfe)) {
-                       i8042_suppress_kbd_ack = 0;
+                       i8042_suppress_kbd_ack--;
                        goto out;
                }
 
@@ -838,13 +838,14 @@ static long i8042_panic_blink(long count)
        led ^= 0x01 | 0x04;
        while (i8042_read_status() & I8042_STR_IBF)
                DELAY;
-       i8042_suppress_kbd_ack = 1;
+       dbg("%02x -> i8042 (panic blink)", 0xed);
+       i8042_suppress_kbd_ack = 2;
        i8042_write_data(0xed); /* set leds */
        DELAY;
        while (i8042_read_status() & I8042_STR_IBF)
                DELAY;
        DELAY;
-       i8042_suppress_kbd_ack = 1;
+       dbg("%02x -> i8042 (panic blink)", led);
        i8042_write_data(led);
        DELAY;
        last_blink = count;