diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c index d8c0c8d..144dcbf 100644 --- a/drivers/input/mouse/psmouse-base.c +++ b/drivers/input/mouse/psmouse-base.c @@ -133,6 +133,9 @@ static psmouse_ret_t psmouse_process_byte(struct psmouse *psmouse) * Full packet accumulated, process it */ + if (psmouse->badchecksum) + return PSMOUSE_FULL_PACKET; + /* * Scroll wheel on IntelliMice, scroll buttons on NetMice */ @@ -217,6 +220,7 @@ void psmouse_queue_work(struct psmouse *psmouse, struct delayed_work *work, static inline void __psmouse_set_state(struct psmouse *psmouse, enum psmouse_state new_state) { psmouse->state = new_state; + psmouse->badchecksum = 0; psmouse->pktcnt = psmouse->out_of_sync_cnt = 0; psmouse->ps2dev.flags = 0; psmouse->last = jiffies; @@ -257,10 +261,12 @@ static int psmouse_handle_byte(struct psmouse *psmouse) return -1; } } + psmouse->badchecksum = 0; psmouse->pktcnt = 0; break; case PSMOUSE_FULL_PACKET: + psmouse->badchecksum = 0; psmouse->pktcnt = 0; if (psmouse->out_of_sync_cnt) { psmouse->out_of_sync_cnt = 0; @@ -270,6 +276,7 @@ static int psmouse_handle_byte(struct psmouse *psmouse) break; case PSMOUSE_GOOD_DATA: + psmouse->badchecksum = 0; break; } return 0; @@ -293,8 +300,13 @@ static irqreturn_t psmouse_interrupt(struct serio *serio, printk(KERN_WARNING "psmouse.c: bad data from KBC -%s%s\n", flags & SERIO_TIMEOUT ? " timeout" : "", flags & SERIO_PARITY ? " bad parity" : ""); - ps2_cmd_aborted(&psmouse->ps2dev); - goto out; + if (flags & SERIO_TIMEOUT) { + psmouse->last = jiffies; + psmouse->badchecksum = 1; + goto out; + } else { + psmouse->badchecksum = 1; + } } if (unlikely(psmouse->ps2dev.flags & PS2_FLAG_ACK)) diff --git a/drivers/input/mouse/psmouse.h b/drivers/input/mouse/psmouse.h index e053bdd..65c6916 100644 --- a/drivers/input/mouse/psmouse.h +++ b/drivers/input/mouse/psmouse.h @@ -43,6 +43,7 @@ struct psmouse { char *vendor; char *name; unsigned char packet[8]; + int badchecksum; unsigned char badbyte; unsigned char pktcnt; unsigned char pktsize;