From: Jaco Kroon <jaco@kroon.co.za>
To: linux-kernel@vger.kernel.org
Cc: Sebastian Piechocki <sebekpi@poczta.onet.pl>
Subject: i8042 controller on Toshiba Satellite P10 notebook - patch
Date: Mon, 04 Apr 2005 18:10:33 +0200 [thread overview]
Message-ID: <425166F9.1040800@kroon.co.za> (raw)
[-- Attachment #1: Type: text/plain, Size: 1742 bytes --]
Hello all
A while back there was quite a discussion on this issue and then
specifically "i8042 timing issues". I refer you to
http://lkml.org/lkml/2005/1/27/11 for more detail.
It turns out that it was the case that the i8042 controller responds too
late on commands, for example, we issue a AUX_LOOP command, whilst
waiting for the response it would time out, however, when issuing
AUX_TEST we will get the response for AUX_LOOP. It turns out this is
also true for the MUX and KBD parts of the driver. The attached patch
resolves this issue by providing a configurable option to issue commands
that expects results twice (not sure whether this is a good idea - but
it seems all commands either set some value or query some value).
Between the two commands it calls i8042_flush() to make sure that there
are not any earlier responses in the buffer.
I've built the patch against linux-2.6.11.6 and it should apply cleanly
(I've attached the patch cause it is about 80 lines in length and I fear
mozilla will break the formatting).
The patch fixes the problem for me - not sure how many other people out
there has the same issue. It provides a configurable option which can
be selected in the kernel configuration to actually enable this (albeit
enabling it should only result in a minor performance hit should it be
enabled needlessly - I think). Should the option not be enabled the
code remains 100% unchanged (except for one extra level of indentation).
I'm not sure what the policy regarding #ifdefs are, especially
considering they enclose the endpoints of a loop, please review and comment.
Jaco
--
There are only 10 kinds of people in this world,
those that understand binary and those that don't.
http://www.kroon.co.za/
[-- Attachment #2: i8042_delayed_response_kludge-2.6.11.6.patch --]
[-- Type: text/plain, Size: 2542 bytes --]
diff -rau linux-2.6.11.6.orig/drivers/input/serio/Kconfig linux-2.6.11.6/drivers/input/serio/Kconfig
--- linux-2.6.11.6.orig/drivers/input/serio/Kconfig 2005-03-26 05:28:21.000000000 +0200
+++ linux-2.6.11.6/drivers/input/serio/Kconfig 2005-04-04 12:01:01.000000000 +0200
@@ -31,6 +31,19 @@
To compile this driver as a module, choose M here: the
module will be called i8042.
+config SERIO_I8042_DELAYEDRESPONSEKLUDGE
+ tristate "i8042 delayed response kludge"
+ default n
+ depends on SERIO_I8042
+ ---help---
+ The Toshiba Satellite P10 series has a delayed response on the i8042
+ device which controls the mouse/keyboard. Whilst the keyboard can
+ function without this kludge it is required for the touchpad. Whilst
+ the kludge should not break other systems I highly recommend saying N
+ on all systems but those who suffer this problem.
+
+ If unsure, say N.
+
config SERIO_SERPORT
tristate "Serial port line discipline"
default y
diff -rau linux-2.6.11.6.orig/drivers/input/serio/i8042.c linux-2.6.11.6/drivers/input/serio/i8042.c
--- linux-2.6.11.6.orig/drivers/input/serio/i8042.c 2005-03-26 05:28:15.000000000 +0200
+++ linux-2.6.11.6/drivers/input/serio/i8042.c 2005-04-04 12:26:15.000000000 +0200
@@ -185,24 +185,41 @@
unsigned long flags;
int retval = 0, i = 0;
+#ifdef CONFIG_SERIO_I8042_DELAYEDRESPONSEKLUDGE
+ int kludge = 0;
+
+ if((command >> 8) & 0xf)
+ kludge = 1;
+#endif
+
if (i8042_noloop && command == I8042_CMD_AUX_LOOP)
return -1;
-
+
spin_lock_irqsave(&i8042_lock, flags);
- retval = i8042_wait_write();
- if (!retval) {
- dbg("%02x -> i8042 (command)", command & 0xff);
- i8042_write_command(command & 0xff);
- }
-
- if (!retval)
- for (i = 0; i < ((command >> 12) & 0xf); i++) {
- if ((retval = i8042_wait_write())) break;
- dbg("%02x -> i8042 (parameter)", param[i]);
- i8042_write_data(param[i]);
+#ifdef CONFIG_SERIO_I8042_DELAYEDRESPONSEKLUDGE
+ do {
+#endif
+ retval = i8042_wait_write();
+ if (!retval) {
+ dbg("%02x -> i8042 (command)", command & 0xff);
+ i8042_write_command(command & 0xff);
}
+ if (!retval)
+ for (i = 0; i < ((command >> 12) & 0xf); i++) {
+ if ((retval = i8042_wait_write())) break;
+ dbg("%02x -> i8042 (parameter)", param[i]);
+ i8042_write_data(param[i]);
+ }
+
+#ifdef CONFIG_SERIO_I8042_DELAYEDRESPONSEKLUDGE
+ if(kludge)
+ i8042_flush();
+
+ } while(!retval && kludge--);
+#endif
+
if (!retval)
for (i = 0; i < ((command >> 8) & 0xf); i++) {
if ((retval = i8042_wait_read())) break;
next reply other threads:[~2005-04-04 16:11 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-04-04 16:10 Jaco Kroon [this message]
2005-04-04 16:54 ` i8042 controller on Toshiba Satellite P10 notebook - patch Dmitry Torokhov
2005-04-04 17:07 ` Jaco Kroon
2005-04-04 18:03 ` Dmitry Torokhov
2005-04-04 20:35 ` Jaco Kroon
2005-04-04 21:02 ` Dmitry Torokhov
2005-04-04 21:51 ` Jaco Kroon
2005-04-04 22:50 ` Dmitry Torokhov
2005-04-04 23:54 ` Jaco Kroon
2005-04-05 0:15 ` Dmitry Torokhov
2005-04-05 0:35 ` Jaco Kroon
2005-04-05 1:25 ` Dmitry Torokhov
2005-04-05 18:20 ` Stefan Seyfried
2005-04-05 18:37 ` Dmitry Torokhov
2005-04-05 21:01 ` Jaco Kroon
2005-04-05 21:21 ` Dmitry Torokhov
2005-04-05 21:26 ` Jaco Kroon
2005-04-06 5:58 ` Jaco Kroon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=425166F9.1040800@kroon.co.za \
--to=jaco@kroon.co.za \
--cc=linux-kernel@vger.kernel.org \
--cc=sebekpi@poczta.onet.pl \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.