--- drivers/input/mouse/psmouse.h.old 2010-02-28 22:33:42.771637775 +0200 +++ drivers/input/mouse/psmouse.h 2010-02-28 22:34:18.723638352 +0200 @@ -43,6 +43,7 @@ char *vendor; char *name; unsigned char packet[8]; + int badchecksum; unsigned char badbyte; unsigned char pktcnt; unsigned char pktsize; --- drivers/input/mouse/psmouse-base.c.old 2010-02-28 22:33:20.299641616 +0200 +++ drivers/input/mouse/psmouse-base.c 2010-02-28 22:38:26.351640678 +0200 @@ -132,6 +132,9 @@ * Full packet accumulated, process it */ + if (psmouse->badchecksum) + return PSMOUSE_FULL_PACKET; + /* * Scroll wheel on IntelliMice, scroll buttons on NetMice */ @@ -216,6 +219,7 @@ 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 = 0; psmouse->ps2dev.flags = 0; psmouse->last = jiffies; @@ -256,10 +260,12 @@ return -1; } } + psmouse->badchecksum = 0; psmouse->pktcnt = 0; break; case PSMOUSE_FULL_PACKET: + psmouse->badchecksum = 0; psmouse->pktcnt = 0; if (psmouse->out_of_sync) { psmouse->out_of_sync = 0; @@ -269,6 +275,7 @@ break; case PSMOUSE_GOOD_DATA: + psmouse->badchecksum = 0; break; } return 0; @@ -292,8 +299,12 @@ 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 (0) { + ps2_cmd_aborted(&psmouse->ps2dev); + goto out; + } else { + psmouse->badchecksum = 1; + } } if (unlikely(psmouse->ps2dev.flags & PS2_FLAG_ACK))