RE: DMA versus PIO

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, 19 Mar 2010, Gadiyar, Anand wrote:

> > Felipe:
> > 
> > There's a comment in message.c:usb_sg_init() about some systems needing
> > to revert to PIO when DMA is temporarily unavailable.  Does this refer
> > to the musb drivers?  Or if not, do you know which drivers it does
> > refer to?
> > 
> > This is something we have to be careful about.  The CPU generally isn't
> > allowed to access buffers while they are mapped for DMA.  If the
> > controller driver needs to use PIO instead of DMA, then it will have to
> > unmap the buffers first.
> > 
> 
> Alan,
> 
> Yes, MUSB is one such driver that could potentially revert to PIO
> when DMA is unavailable.
> 
> One of the DMA engines used with MUSB has 8 DMA channels. If all of
> them are in use, then some transfers are carried out using PIO.
> 
> 
> Also, if the DMA programming call returns an error, then the transfer
> is attempted using PIO.
> 
> For a long time, the DMA code never had any error returns added, but
> the backup PIO path was still present in the code. A short while ago,
> I introduced a patch to workaround a hardware bug - this patch
> would make the DMA programming call return failure, and force the
> trasnsfer to be carried out using PIO. (This patch is now in mainline)
> 
> After this patch was merged into internal codebases, someone recently
> pointed out that this approach is not correct, and I cannot mix and
> match DMA and PIO accesses the way we're doing it in the driver.
> 
> 
> I'm afraid I don't understand the DMA APIs very well and their usage
> in the MUSB driver. I still need to study them.
> 
> Thanks for pointing this out.

You shouldn't need to understand much about the DMA APIs in order to
use it in the MUSB driver; usbcore will take care of the details for
you.  All you need to know is that when a buffer is mapped for DMA, the
device owns it and the CPU mustn't access the buffer again until it is
unmapped.

So to fix the issue, all you should need to do is unmap the buffers 
before using them with PIO.  (Or not map them in the first place if you 
know beforehand that PIO will be used.)  The code to do this still has 
to be added to usbcore and to MUSB.

Alan Stern

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux