Commit 867d2682 authored by Peter Osterlund's avatar Peter Osterlund Committed by Dmitry Torokhov

Input: sermouse - improve protocol error recovery

When using MS protocol the driver should wait for a byte with
bit 6 set before assuming that it sees beginning of a data packet.
This should allow driver better cope with lost bytes and prevent
spurious left/right button events when serial communication is
disturbed by a CPU-hungry real-time process.

Also fix some formatting.
Signed-off-by: default avatarPeter Osterlund <petero2@telia.com>
Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent 54f9e36c
...@@ -69,7 +69,8 @@ static void sermouse_process_msc(struct sermouse *sermouse, signed char data) ...@@ -69,7 +69,8 @@ static void sermouse_process_msc(struct sermouse *sermouse, signed char data)
switch (sermouse->count) { switch (sermouse->count) {
case 0: case 0:
if ((data & 0xf8) != 0x80) return; if ((data & 0xf8) != 0x80)
return;
input_report_key(dev, BTN_LEFT, !(data & 4)); input_report_key(dev, BTN_LEFT, !(data & 4));
input_report_key(dev, BTN_RIGHT, !(data & 1)); input_report_key(dev, BTN_RIGHT, !(data & 1));
input_report_key(dev, BTN_MIDDLE, !(data & 2)); input_report_key(dev, BTN_MIDDLE, !(data & 2));
...@@ -107,7 +108,10 @@ static void sermouse_process_ms(struct sermouse *sermouse, signed char data) ...@@ -107,7 +108,10 @@ static void sermouse_process_ms(struct sermouse *sermouse, signed char data)
struct input_dev *dev = sermouse->dev; struct input_dev *dev = sermouse->dev;
signed char *buf = sermouse->buf; signed char *buf = sermouse->buf;
if (data & 0x40) sermouse->count = 0; if (data & 0x40)
sermouse->count = 0;
else if (sermouse->count == 0)
return;
switch (sermouse->count) { switch (sermouse->count) {
...@@ -169,7 +173,8 @@ static void sermouse_process_ms(struct sermouse *sermouse, signed char data) ...@@ -169,7 +173,8 @@ static void sermouse_process_ms(struct sermouse *sermouse, signed char data)
case 5: case 5:
case 7: /* Ignore anything besides MZ++ */ case 7: /* Ignore anything besides MZ++ */
if (sermouse->type != SERIO_MZPP) break; if (sermouse->type != SERIO_MZPP)
break;
switch (buf[1]) { switch (buf[1]) {
...@@ -206,13 +211,16 @@ static irqreturn_t sermouse_interrupt(struct serio *serio, ...@@ -206,13 +211,16 @@ static irqreturn_t sermouse_interrupt(struct serio *serio,
{ {
struct sermouse *sermouse = serio_get_drvdata(serio); struct sermouse *sermouse = serio_get_drvdata(serio);
if (time_after(jiffies, sermouse->last + HZ/10)) sermouse->count = 0; if (time_after(jiffies, sermouse->last + HZ/10))
sermouse->count = 0;
sermouse->last = jiffies; sermouse->last = jiffies;
if (sermouse->type > SERIO_SUN) if (sermouse->type > SERIO_SUN)
sermouse_process_ms(sermouse, data); sermouse_process_ms(sermouse, data);
else else
sermouse_process_msc(sermouse, data); sermouse_process_msc(sermouse, data);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
......
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