mirror of https://gitee.com/openkylin/linux.git
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: Peter Osterlund <petero2@telia.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
This commit is contained in:
parent
54f9e36cb8
commit
867d2682e9
|
@ -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)
|
||||||
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)
|
||||||
|
|
||||||
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,
|
||||||
{
|
{
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue