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

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
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -69,7 +69,8 @@ static void sermouse_process_msc(struct sermouse *sermouse, signed char data)
	switch (sermouse->count) {

		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_RIGHT,  !(data & 1));
			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;
	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) {

@@ -169,7 +173,8 @@ static void sermouse_process_ms(struct sermouse *sermouse, signed char data)

		case 5:
		case 7: /* Ignore anything besides MZ++ */
			if (sermouse->type != SERIO_MZPP) break;
			if (sermouse->type != SERIO_MZPP)
				break;

			switch (buf[1]) {

@@ -206,13 +211,16 @@ static irqreturn_t sermouse_interrupt(struct serio *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;

	if (sermouse->type > SERIO_SUN)
		sermouse_process_ms(sermouse, data);
	else
		sermouse_process_msc(sermouse, data);

	return IRQ_HANDLED;
}