From: Vojtech Pavlik <vojtech@suse.cz>
To: Dmitry Torokhov <dtor_core@ameritech.net>
Cc: linux-input@atrey.karlin.mff.cuni.cz,
Alan Cox <alan@lxorguk.ukuu.org.uk>,
linux-kernel@vger.kernel.org
Subject: Re: i8042 access timings
Date: Wed, 26 Jan 2005 16:43:07 +0100 [thread overview]
Message-ID: <20050126154307.GB4422@ucw.cz> (raw)
In-Reply-To: <200501250241.14695.dtor_core@ameritech.net>
On Tue, Jan 25, 2005 at 02:41:14AM -0500, Dmitry Torokhov wrote:
> Recently there was a patch from Alan regarding access timing violations
> in i8042. It made me curious as we only wait between accesses to status
> register but not data register. I peeked into FreeBSD code and they use
> delays to access both registers and I wonder if that's the piece that
> makes i8042 mysteriously fail on some boards.
>
> Anyway, regardless of whether access to data register should be done with
> delay as well there seem to be another timing access violation - in
> i8042_command we do i8042_wait_read which reads STR and then immediately
> do i8042_read_status to check AUXDATA bit.
>
> Does the patch below makes any sense?
>
> + do {
> + str = i8042_read_status();
> + if (~str & I8042_STR_OBF)
> + break;
> + udelay(I8042_DATA_DELAY);
> data = i8042_read_data();
In my opinion, there is no requirement to wait after status read
returned success and the actual reading of data. This way we'd have to
have the delay in the interrupt routine as well.
> - dbg("%02x <- i8042 (flush, %s)", data,
> - i8042_read_status() & I8042_STR_AUXDATA ? "aux" : "kbd");
> - }
> + dbg("%02x <- i8042 (flush, %s)", data, str & I8042_STR_AUXDATA ? "aux" : "kbd");
> + udelay(I8042_STR_DELAY);
> + } while (i++ < I8042_BUFFER_SIZE);
So the only problem in the flush routine is the debugging print.
> spin_unlock_irqrestore(&i8042_lock, flags);
>
> @@ -190,6 +193,7 @@
> static int i8042_command(unsigned char *param, int command)
> {
> unsigned long flags;
> + unsigned char str;
> int retval = 0, i = 0;
>
> if (i8042_noloop && command == I8042_CMD_AUX_LOOP)
> @@ -213,7 +217,10 @@
> if (!retval)
> for (i = 0; i < ((command >> 8) & 0xf); i++) {
> if ((retval = i8042_wait_read())) break;
> - if (i8042_read_status() & I8042_STR_AUXDATA)
> + udelay(I8042_STR_DELAY);
> + str = i8042_read_status();
[]
> + udelay(I8042_DATA_DELAY);
> + if (str & I8042_STR_AUXDATA)
> param[i] = ~i8042_read_data();
> else
> param[i] = i8042_read_data();
We may as well drop the negation. It's a bad way to signal the data came
from the AUX port. Then we don't need the extra status read and can just
proceed to read the data, since IMO we don't need to wait inbetween,
even according to the IBM spec.
--
Vojtech Pavlik
SuSE Labs, SuSE CR
next prev parent reply other threads:[~2005-01-26 15:43 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-01-25 7:41 i8042 access timings Dmitry Torokhov
2005-01-25 10:51 ` Andries Brouwer
2005-01-25 19:17 ` Dmitry Torokhov
2005-01-25 19:25 ` Vojtech Pavlik
2005-01-25 19:41 ` Dmitry Torokhov
2005-01-25 19:46 ` Andries Brouwer
2005-01-25 20:37 ` Lee Revell
2005-01-27 15:14 ` Alan Cox
2005-01-27 16:24 ` Vojtech Pavlik
2005-01-27 16:34 ` Bill Rugolsky Jr.
2005-01-27 16:37 ` Vojtech Pavlik
2005-02-13 0:16 ` Bill Rugolsky Jr.
2005-02-13 8:22 ` Vojtech Pavlik
2005-02-13 16:17 ` Bill Rugolsky Jr.
2005-01-27 17:45 ` Andries Brouwer
2005-01-28 14:55 ` Vojtech Pavlik
2005-01-25 12:44 ` Alan Cox
2005-01-25 12:44 ` Alan Cox
2005-01-26 15:43 ` Vojtech Pavlik [this message]
2005-01-26 16:36 ` Dmitry Torokhov
2005-01-26 17:05 ` linux-os
2005-01-26 18:30 ` Dmitry Torokhov
2005-01-27 10:19 ` Vojtech Pavlik
[not found] <200501260040.46288.sebekpi@poczta.onet.pl>
2005-01-27 6:23 ` Jaco Kroon
2005-01-27 10:25 ` Vojtech Pavlik
2005-01-27 11:12 ` Sebastian Piechocki
2005-01-27 11:31 ` Vojtech Pavlik
2005-01-27 17:33 ` Jaco Kroon
2005-01-27 18:09 ` Linus Torvalds
2005-01-27 20:29 ` Andries Brouwer
2005-01-27 20:41 ` Dmitry Torokhov
2005-01-27 23:11 ` Andries Brouwer
2005-01-28 13:17 ` Vojtech Pavlik
2005-01-28 14:20 ` Jaco Kroon
2005-01-28 18:39 ` Vojtech Pavlik
2005-01-29 19:59 ` Jaco Kroon
2005-01-29 23:21 ` Dmitry Torokhov
2005-01-29 20:02 ` Randy.Dunlap
2005-01-27 20:51 ` Jaco Kroon
2005-01-27 21:17 ` Linus Torvalds
2005-01-27 22:12 ` Jaco Kroon
2005-01-27 22:36 ` Linus Torvalds
2005-01-27 23:40 ` Dmitry Torokhov
2005-01-28 5:52 ` Jaco Kroon
2005-02-04 19:54 ` Bukie Mabayoje
2005-01-28 11:04 ` Vojtech Pavlik
2005-01-27 20:23 ` Andries Brouwer
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=20050126154307.GB4422@ucw.cz \
--to=vojtech@suse.cz \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=dtor_core@ameritech.net \
--cc=linux-input@atrey.karlin.mff.cuni.cz \
--cc=linux-kernel@vger.kernel.org \
/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.