diff options
author | Peter Osterlund <petero2@telia.com> | 2007-03-16 00:58:37 -0400 |
---|---|---|
committer | Dmitry Torokhov <dtor@insightbb.com> | 2007-03-16 00:58:37 -0400 |
commit | 867d2682e92a3999e3862f1679cfcb549142d776 (patch) | |
tree | 0e58a245bb102ec8a5d5f7485a8cf332c51d2ad6 /drivers/input/mouse/sermouse.c | |
parent | 54f9e36cb83e7da17dc0596d365fe019a25c226f (diff) |
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>
Diffstat (limited to 'drivers/input/mouse/sermouse.c')
-rw-r--r-- | drivers/input/mouse/sermouse.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/drivers/input/mouse/sermouse.c b/drivers/input/mouse/sermouse.c index a85d74710b44..0ac448a82bde 100644 --- a/drivers/input/mouse/sermouse.c +++ b/drivers/input/mouse/sermouse.c | |||
@@ -69,7 +69,8 @@ static void sermouse_process_msc(struct sermouse *sermouse, signed char data) | |||
69 | switch (sermouse->count) { | 69 | switch (sermouse->count) { |
70 | 70 | ||
71 | case 0: | 71 | case 0: |
72 | if ((data & 0xf8) != 0x80) return; | 72 | if ((data & 0xf8) != 0x80) |
73 | return; | ||
73 | input_report_key(dev, BTN_LEFT, !(data & 4)); | 74 | input_report_key(dev, BTN_LEFT, !(data & 4)); |
74 | input_report_key(dev, BTN_RIGHT, !(data & 1)); | 75 | input_report_key(dev, BTN_RIGHT, !(data & 1)); |
75 | input_report_key(dev, BTN_MIDDLE, !(data & 2)); | 76 | input_report_key(dev, BTN_MIDDLE, !(data & 2)); |
@@ -107,7 +108,10 @@ static void sermouse_process_ms(struct sermouse *sermouse, signed char data) | |||
107 | struct input_dev *dev = sermouse->dev; | 108 | struct input_dev *dev = sermouse->dev; |
108 | signed char *buf = sermouse->buf; | 109 | signed char *buf = sermouse->buf; |
109 | 110 | ||
110 | if (data & 0x40) sermouse->count = 0; | 111 | if (data & 0x40) |
112 | sermouse->count = 0; | ||
113 | else if (sermouse->count == 0) | ||
114 | return; | ||
111 | 115 | ||
112 | switch (sermouse->count) { | 116 | switch (sermouse->count) { |
113 | 117 | ||
@@ -169,7 +173,8 @@ static void sermouse_process_ms(struct sermouse *sermouse, signed char data) | |||
169 | 173 | ||
170 | case 5: | 174 | case 5: |
171 | case 7: /* Ignore anything besides MZ++ */ | 175 | case 7: /* Ignore anything besides MZ++ */ |
172 | if (sermouse->type != SERIO_MZPP) break; | 176 | if (sermouse->type != SERIO_MZPP) |
177 | break; | ||
173 | 178 | ||
174 | switch (buf[1]) { | 179 | switch (buf[1]) { |
175 | 180 | ||
@@ -206,13 +211,16 @@ static irqreturn_t sermouse_interrupt(struct serio *serio, | |||
206 | { | 211 | { |
207 | struct sermouse *sermouse = serio_get_drvdata(serio); | 212 | struct sermouse *sermouse = serio_get_drvdata(serio); |
208 | 213 | ||
209 | if (time_after(jiffies, sermouse->last + HZ/10)) sermouse->count = 0; | 214 | if (time_after(jiffies, sermouse->last + HZ/10)) |
215 | sermouse->count = 0; | ||
216 | |||
210 | sermouse->last = jiffies; | 217 | sermouse->last = jiffies; |
211 | 218 | ||
212 | if (sermouse->type > SERIO_SUN) | 219 | if (sermouse->type > SERIO_SUN) |
213 | sermouse_process_ms(sermouse, data); | 220 | sermouse_process_ms(sermouse, data); |
214 | else | 221 | else |
215 | sermouse_process_msc(sermouse, data); | 222 | sermouse_process_msc(sermouse, data); |
223 | |||
216 | return IRQ_HANDLED; | 224 | return IRQ_HANDLED; |
217 | } | 225 | } |
218 | 226 | ||