Commit 817e6ba3 authored by Dmitry Torokhov's avatar Dmitry Torokhov

Input: i8042 - supress ACK/NAKs when blinking during panic

This allows using SysRq and not fill logs with complaints from atkbd.
Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent 80fc9f53
...@@ -106,6 +106,7 @@ static unsigned char i8042_ctr; ...@@ -106,6 +106,7 @@ static unsigned char i8042_ctr;
static unsigned char i8042_mux_present; static unsigned char i8042_mux_present;
static unsigned char i8042_kbd_irq_registered; static unsigned char i8042_kbd_irq_registered;
static unsigned char i8042_aux_irq_registered; static unsigned char i8042_aux_irq_registered;
static unsigned char i8042_suppress_kbd_ack;
static struct platform_device *i8042_platform_device; static struct platform_device *i8042_platform_device;
static irqreturn_t i8042_interrupt(int irq, void *dev_id); static irqreturn_t i8042_interrupt(int irq, void *dev_id);
...@@ -316,7 +317,7 @@ static irqreturn_t i8042_interrupt(int irq, void *dev_id) ...@@ -316,7 +317,7 @@ static irqreturn_t i8042_interrupt(int irq, void *dev_id)
unsigned char str, data; unsigned char str, data;
unsigned int dfl; unsigned int dfl;
unsigned int port_no; unsigned int port_no;
int ret; int ret = 1;
spin_lock_irqsave(&i8042_lock, flags); spin_lock_irqsave(&i8042_lock, flags);
str = i8042_read_status(); str = i8042_read_status();
...@@ -378,10 +379,16 @@ static irqreturn_t i8042_interrupt(int irq, void *dev_id) ...@@ -378,10 +379,16 @@ static irqreturn_t i8042_interrupt(int irq, void *dev_id)
dfl & SERIO_PARITY ? ", bad parity" : "", dfl & SERIO_PARITY ? ", bad parity" : "",
dfl & SERIO_TIMEOUT ? ", timeout" : ""); dfl & SERIO_TIMEOUT ? ", timeout" : "");
if (unlikely(i8042_suppress_kbd_ack))
if (port_no == I8042_KBD_PORT_NO &&
(data == 0xfa || data == 0xfe)) {
i8042_suppress_kbd_ack = 0;
goto out;
}
if (likely(port->exists)) if (likely(port->exists))
serio_interrupt(port->serio, data, dfl); serio_interrupt(port->serio, data, dfl);
ret = 1;
out: out:
return IRQ_RETVAL(ret); return IRQ_RETVAL(ret);
} }
...@@ -842,11 +849,13 @@ static long i8042_panic_blink(long count) ...@@ -842,11 +849,13 @@ static long i8042_panic_blink(long count)
led ^= 0x01 | 0x04; led ^= 0x01 | 0x04;
while (i8042_read_status() & I8042_STR_IBF) while (i8042_read_status() & I8042_STR_IBF)
DELAY; DELAY;
i8042_suppress_kbd_ack = 1;
i8042_write_data(0xed); /* set leds */ i8042_write_data(0xed); /* set leds */
DELAY; DELAY;
while (i8042_read_status() & I8042_STR_IBF) while (i8042_read_status() & I8042_STR_IBF)
DELAY; DELAY;
DELAY; DELAY;
i8042_suppress_kbd_ack = 1;
i8042_write_data(led); i8042_write_data(led);
DELAY; DELAY;
last_blink = count; last_blink = count;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment