From: Dmitry Torokhov =================================================================== ChangeSet@1.1790, 2004-06-16 18:13:33-05:00, dtor_core@ameritech.net Input: psmouse sync. changes - when a partial packet is received (more than HZ/2 jiffies has passed since last byte was received) increment out-of-sync counter. It should help users with KVMs that reset mice to bare PS/2 protocol but do not send 0xAA 0x00 init sequence - after 'resetafter' bad packets psmouse will try reconnecting and reestablishing proper protcol. - change default value for 'resetafter' parameter from 0 (never) to 20. Signed-off-by: Dmitry Torokhov =================================================================== Signed-off-by: Andrew Morton --- 25-akpm/drivers/input/mouse/psmouse-base.c | 19 +++++++++++-------- 1 files changed, 11 insertions(+), 8 deletions(-) diff -puN drivers/input/mouse/psmouse-base.c~input-psmouse-resync-for-kvm-users drivers/input/mouse/psmouse-base.c --- 25/drivers/input/mouse/psmouse-base.c~input-psmouse-resync-for-kvm-users 2004-06-19 22:52:46.558919480 -0700 +++ 25-akpm/drivers/input/mouse/psmouse-base.c 2004-06-19 22:52:46.562918872 -0700 @@ -43,7 +43,7 @@ int psmouse_smartscroll = 1; module_param_named(smartscroll, psmouse_smartscroll, bool, 0); MODULE_PARM_DESC(smartscroll, "Logitech Smartscroll autorepeat, 1 = enabled (default), 0 = disabled."); -static unsigned int psmouse_resetafter; +static unsigned int psmouse_resetafter = 20; module_param_named(resetafter, psmouse_resetafter, uint, 0); MODULE_PARM_DESC(resetafter, "Reset device after so many bad packets (0 = never)."); @@ -189,6 +189,7 @@ static irqreturn_t psmouse_interrupt(str printk(KERN_WARNING "psmouse.c: %s at %s lost synchronization, throwing %d bytes away.\n", psmouse->name, psmouse->phys, psmouse->pktcnt); psmouse->pktcnt = 0; + psmouse->out_of_sync++; } psmouse->last = jiffies; @@ -221,12 +222,7 @@ static irqreturn_t psmouse_interrupt(str printk(KERN_WARNING "psmouse.c: %s at %s lost sync at byte %d\n", psmouse->name, psmouse->phys, psmouse->pktcnt); psmouse->pktcnt = 0; - - if (++psmouse->out_of_sync == psmouse_resetafter) { - psmouse->state = PSMOUSE_IGNORE; - printk(KERN_NOTICE "psmouse.c: issuing reconnect request\n"); - serio_reconnect(psmouse->serio); - } + psmouse->out_of_sync++; break; case PSMOUSE_FULL_PACKET: @@ -241,6 +237,13 @@ static irqreturn_t psmouse_interrupt(str case PSMOUSE_GOOD_DATA: break; } + + if (psmouse->out_of_sync && psmouse->out_of_sync == psmouse_resetafter) { + psmouse->state = PSMOUSE_IGNORE; + printk(KERN_NOTICE "psmouse.c: issuing reconnect request\n"); + serio_reconnect(psmouse->serio); + } + out: return IRQ_HANDLED; } @@ -306,7 +309,7 @@ int psmouse_command(struct psmouse *psmo while (test_bit(PSMOUSE_FLAG_CMD, &psmouse->flags) && timeout--) { if (!test_bit(PSMOUSE_FLAG_CMD1, &psmouse->flags)) { - + if (command == PSMOUSE_CMD_RESET_BAT && timeout > 100000) timeout = 100000; _