public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
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


  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