All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jeff Garzik <jeff@garzik.org>
To: Russell King <rmk@arm.linux.org.uk>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>, linux-ide@vger.kernel.org
Subject: Re: 2.6.32: Promise UDMA33 card refuses to work in UDMA mode
Date: Mon, 04 Jan 2010 11:48:20 -0500	[thread overview]
Message-ID: <4B421BD4.8090308@garzik.org> (raw)
In-Reply-To: <20100104161537.GC18335@flint.arm.linux.org.uk>

On 01/04/2010 11:15 AM, Russell King wrote:
> It goes on to say that the interrupt status bit in the BM-DMA status
> register will only be set after buffered data has been transferred -
> which means reading the altstatus register to determine when the device
> has finished would give a premature indication and doesn't take any
> account of the BM-DMA buffering.
>
> So I think Jeff is not right on the "must read altstatus" point.
>
> I would not be surprised if lots of host controllers were actually buggy
> in respect of reading any ATA device register mid-transfer - firstly a
> started UDMA operation can't be stopped before at least one word has been
> transferred, nor can it be stopped without first transferring the CRC
> bytes.  That's an awful lot of logic (and overhead) to be randomly
> interacting with due to other shared devices interrupt activity.
>
> Reading the BM-DMA status register (or equivalent on hosts) seems to be
> the right way to tell if an interrupt is pending.


libata already does that, as does IDE:

         case HSM_ST_LAST:
                 if (qc->tf.protocol == ATA_PROT_DMA ||
                     qc->tf.protocol == ATAPI_PROT_DMA) {

                         /* check status of DMA engine */
                         host_stat = ap->ops->bmdma_status(ap);
                         VPRINTK("ata%u: host_stat 0x%X\n",
                                 ap->print_id, host_stat);

                         /* if it's not our irq... */
                         if (!(host_stat & ATA_DMA_INTR))
                                 goto idle_irq;

[...]

         /* check main status, clearing INTRQ if needed */

         status = ata_sff_irq_status(ap);  <-- reads AltStatus here
         if (status & ATA_BUSY)
                 goto idle_irq;

IDE driver has basically the same logic in drive_is_ready()

I never said "must" read, I was only responding to the notion that 
touching AltStatus at all, in general, was a violation of the ATA spec. 
  IFF there is a DMA status register available to be checked, and IFF 
the transfer is DMA, then we do check that first.

	Jeff



  reply	other threads:[~2010-01-04 16:48 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-12-24 18:13 2.6.32: Promise UDMA33 card refuses to work in UDMA mode Russell King
2009-12-24 21:54 ` Russell King
2010-01-03  0:23   ` Russell King
2010-01-03  3:08     ` Robert Hancock
2010-01-03 10:05       ` Russell King
2010-01-03 11:40         ` Alan Cox
2010-01-03 22:35     ` [PATCH] Fix Promise UDMA33 IDE driver (pdc202xx_old) Russell King
2010-01-04 19:14       ` Sergei Shtylyov
2010-01-05  6:26         ` David Miller
2010-01-05 17:49           ` Russell King
2010-01-05 17:52             ` Sergei Shtylyov
2010-01-03 23:46     ` 2.6.32: Promise UDMA33 card refuses to work in UDMA mode Russell King
2010-01-04 10:37       ` Alan Cox
2010-01-04 13:30         ` Russell King
2010-01-04 15:16           ` Alan Cox
2010-01-04 15:32             ` Jeff Garzik
2010-01-04 15:44               ` Russell King
2010-01-04 15:55                 ` Alan Cox
2010-01-04 16:15                   ` Russell King
2010-01-04 16:48                     ` Jeff Garzik [this message]
2010-01-04 17:16                     ` Sergei Shtylyov
2010-01-04 15:48               ` Alan Cox
2010-01-04 15:25           ` Jeff Garzik
2010-01-04 15:42             ` Russell King
2010-01-05  2:06               ` Robert Hancock
2010-01-05 11:25                 ` Alan Cox
2010-01-05 13:00                   ` Jeff Garzik
2010-01-05 13:37                     ` Alan Cox
2010-01-05 13:11                 ` Jeff Garzik
2010-01-04 15:46             ` Alan Cox
2010-01-04 16:32               ` Jeff Garzik
2010-01-04 17:02                 ` Alan Cox
2010-01-04 17:27                   ` Jeff Garzik
2010-01-04 17:30                     ` Russell King
2010-01-04 18:03                       ` Jeff Garzik
2010-01-04 18:06                         ` Russell King
2010-01-04 18:35                           ` Jeff Garzik
2010-01-04 17:38                     ` Alan Cox
2010-01-04 18:07                       ` Jeff Garzik
2010-01-04 18:29                   ` Jeff Garzik
2010-01-04 16:31           ` Bartlomiej Zolnierkiewicz
2010-01-04 17:28             ` Russell King
2010-01-04 17:39               ` Alan Cox
2010-01-04 17:46                 ` Russell King
2010-01-04 18:20                   ` Alan Cox
2010-01-04 17:49                 ` Bartlomiej Zolnierkiewicz
2010-01-05  1:03           ` Robert Hancock
2010-01-05 10:04             ` Jeff Garzik
2010-01-05 17:44             ` Russell King
2010-01-06  0:30               ` Robert Hancock

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=4B421BD4.8090308@garzik.org \
    --to=jeff@garzik.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=linux-ide@vger.kernel.org \
    --cc=rmk@arm.linux.org.uk \
    /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.