From: Gunther Mayer <gunther.mayer@gmx.net>
To: Martin Dalecki <dalecki@evision-ventures.com>
Cc: linux-kernel@vger.kernel.org
Subject: Re: [PATCH] IDE PIO write Fix #2
Date: Fri, 17 May 2002 21:24:17 +0200 [thread overview]
Message-ID: <3CE558E1.3319E3E8@gmx.net> (raw)
In-Reply-To: <3CE0795B.62C956F0@cinet.co.jp> <3CE0D6DE.8090407@evision-ventures.com> <abroiv$ifs$1@penguin.transmeta.com> <3CE22EA8.60905@evision-ventures.com>
Martin Dalecki wrote:
> U¿ytkownik Linus Torvalds napisa³:
> > In article <3CE0D6DE.8090407@evision-ventures.com>,
> > Martin Dalecki <dalecki@evision-ventures.com> wrote:
> >
> >>>--- linux-2.5.15/drivers/ide/ide-taskfile.c.orig Fri May 10 11:49:35 2002
> >>>+++ linux-2.5.15/drivers/ide/ide-taskfile.c Tue May 14 10:40:43 2002
> >>>@@ -606,7 +606,7 @@
> >>> if (!ide_end_request(drive, rq, 1))
> >>> return ide_stopped;
> >>>
> >>>- if ((rq->current_nr_sectors==1) ^ (stat & DRQ_STAT)) {
> >>>+ if ((rq->nr_sectors == 1) ^ ((stat & DRQ_STAT) != 0)) {
> >>
> >
> > Well, that's definitely an improvement - the original code makes no
> > sense at all, since it's doing a bitwise xor on two bits that are not
> > the same, and then uses that as a boolean value.
> >
> > Your change at least makes it use the bitwise xor on properly logical
> > values, making the bitwise xor work as a _logical_ xor.
> >
> > Although at that point I'd just get rid of the xor, and replace it by
> > the "!=" operation - which is equivalent on logical ops.
> >
> >
> >>> pBuf = ide_map_rq(rq, &flags);
> >>> DTF("write: %p, rq->current_nr_sectors: %d\n", pBuf, (int) rq->current_nr_sectors);
> >>
> >>
> >>Hmm. There is something else that smells in the above, since the XOR operator
> >>doesn't seem to be proper. Why shouldn't we get DRQ_STAT at all on short
> >>request? Could you perhaps just try to replace it with an OR?
> >
> >
> > The XOR operation is a valid op, if you just use it on valid values,
> > which the patch does seem to make it do.
> >
> > I don't know whether the logic is _correct_ after that, but at least
> > there is some remote chance that it might make sense.
> >
> > Linus
>
> As far as I can see the patch makes sense. It is just exposing a problem
> which was hidden before.
The original code:
a) if ((rq->current_nr_sectors==1) ^ (stat & DRQ_STAT)) {
is being compared to these expressions:
b) logical equ. if ((rq->current_nr_sectors==1) || ((stat & DRQ_STAT)!=0)) { (me)
c) not eqival. if ((rq->current_nr_sectors==1) ^ ((stat & DRQ_STAT)!=0)) { (tomita)
d) same as c if ((rq->current_nr_sectors==1) != ((stat & DRQ_STAT)!=0)) { (linus)
Note: DRQ_STAT will be set when this routine is entered per "PIO Out protocol spec".
c+d will deadlock.
(it will _not_ send the last sector)
a+b will send the last sector to the drive when it isn't ready to receive.
(Although most of the time it _will_ be ready when we enter this routine)
So:
if( (stat & DRQ_STAT) && !(stat & BSY_STAT)) {
should be correct.
The original intent for a) was probably:
check DRQ only on the _first_ sector we transfer as
shown in "ATA-4 PIO data out command protocol", which would translate to:
e) if ( !(rq->are_we_transferring_the_first_sector_just_now) || ((stat & DRQ_STAT)!=0)) {
-
Gunther
next prev parent reply other threads:[~2002-05-17 20:24 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-05-14 2:41 [PATCH] IDE PIO write Fix #2 tomita
2002-05-14 9:20 ` Martin Dalecki
2002-05-14 19:29 ` Linus Torvalds
2002-05-15 5:47 ` Andre Hedrick
2002-05-15 9:47 ` Martin Dalecki
2002-05-17 19:24 ` Gunther Mayer [this message]
2002-05-20 1:41 ` Andre Hedrick
2002-05-20 6:48 ` Gunther Mayer
2002-05-20 20:26 ` Andre Hedrick
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=3CE558E1.3319E3E8@gmx.net \
--to=gunther.mayer@gmx.net \
--cc=dalecki@evision-ventures.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox