From: Dmitry Torokhov <dtor_core@ameritech.net>

===================================================================

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 <dtor@mail.ru>

===================================================================

Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 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;
 
_