aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2009-05-28 09:51:31 -0700
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2009-05-28 10:34:02 -0700
commita3ce6ea46cc0d6397d1b92b1a5983bb2935306ed (patch)
tree290d6ca606ad960fda685992b6a087cc6b56c1e1
parent346a850e3c3a20159cef2b79235e6d34aa497c65 (diff)
downloadkernel_samsung_tuna-a3ce6ea46cc0d6397d1b92b1a5983bb2935306ed.zip
kernel_samsung_tuna-a3ce6ea46cc0d6397d1b92b1a5983bb2935306ed.tar.gz
kernel_samsung_tuna-a3ce6ea46cc0d6397d1b92b1a5983bb2935306ed.tar.bz2
Input: libps2 - better handle bad scheduler decisions
Sometimes devices send us their responses in time but due to unfortunate scheduling decisions the receiving thread does not get scheduled till much later and we erroneously decide that device timed out. Work around this problem by checking whether we received the data we needed instead of checking timeout condition. Tested-by: Sitsofe Wheeler <sitsofe@yahoo.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
-rw-r--r--drivers/input/serio/libps2.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/input/serio/libps2.c b/drivers/input/serio/libps2.c
index 67248c3..be5bbbb 100644
--- a/drivers/input/serio/libps2.c
+++ b/drivers/input/serio/libps2.c
@@ -210,7 +210,7 @@ int ps2_command(struct ps2dev *ps2dev, unsigned char *param, int command)
timeout = wait_event_timeout(ps2dev->wait,
!(ps2dev->flags & PS2_FLAG_CMD1), timeout);
- if (ps2dev->cmdcnt && timeout > 0) {
+ if (ps2dev->cmdcnt && !(ps2dev->flags & PS2_FLAG_CMD1)) {
timeout = ps2_adjust_timeout(ps2dev, command, timeout);
wait_event_timeout(ps2dev->wait,