CHROMIUM: input: mouse - Fix trackpoint re-probe on resume.
authorShawn Nematbakhsh <shawnn@google.com>
Thu, 25 Apr 2013 21:30:04 +0000 (14:30 -0700)
committerChromeBot <chrome-bot@google.com>
Mon, 29 Apr 2013 10:47:57 +0000 (03:47 -0700)
During suspend, power may be cut to the trackpoint. If so, the
trackpoint will automatically begin its power-on diagnostics upon being
re-powered. If trackpoint_reconnect is called before the diagnostics
complete, the probe ID command will be lost, and reconnect will fail.
This will lead to re-probe, which takes several seconds on Stout due to
the trackpoint / trackpad pass-through design.

The fix here is to make a second attempt if the initial commands on
reconnect fail, which should give the trackpoint enough time to come out
of power-on diagnostics.

TEST=suspend/resume test for 3000 iterations without re-enumeration.
BUG=chromium:220389

Change-Id: I1ff8d3accdde86184864915d540b870ed33feee4
Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/49228
Reviewed-by: Chung-yih Wang <cywang@chromium.org>
drivers/input/mouse/trackpoint.c

index 4c16c5b..62ad256 100644 (file)
@@ -334,8 +334,14 @@ static void trackpoint_disconnect(struct psmouse *psmouse)
 static int trackpoint_reconnect(struct psmouse *psmouse)
 {
        int reset_fail;
+       int ret;
+       int tries = 2;
 
-       if (trackpoint_start_protocol(psmouse, NULL))
+       do {
+               ret = trackpoint_start_protocol(psmouse, NULL);
+       } while (ret != 0 && --tries > 0);
+
+       if (ret != 0)
                return -1;
 
        reset_fail = trackpoint_power_on_reset(&psmouse->ps2dev);