1
linux/drivers/usb/musb
Sergei Shtylyov c7bbc056a9 USB: musb: bugfixes for multi-packet TXDMA support
We really want to use DMA mode 1 for all multi-packet transfers;
that's one IRQ on DMA completion, instead of one per packet.

There is an important issue with such transfers, especially on
the host side:  when such transfers end with a full-size packet,
we must defer musb_dma_completion() calls until the FIFO empties.
Else we report URB completions too soon, and may clobber data in
the FIFO fifo when writing the next packet (losing data).

The Inventra DMA support uses DMA mode 1, but it ignores that
issue.  The CPPI DMA support uses mode 0, but doesn't handle
its TXPKTRDY interrupts quite right either; it can get stale
"packet ready" interrupts, and report transfer completion too
early using slightly different code paths, also losing data.

So I'm solving it in a generic way -- by adding a sort of the
"interrupt filter" into musb_host_tx(), catching these cases
where a DMA completion IRQ doesn't suffice and removing some
needlessly controller-specific logic.  When a TXDMA interrupt
happens and DMA request mode 1 is active, that filter resets
to mode 0 and defers URB completion processing until TXPKTRDY,
unless the FIFO is already empty.  Related filtering logic in
Inventra and CPPI code gets removed.

Since it should be competely safe now to use the DMA request
mode 1 for host side transfers with the CPPI DMA controller,
set it in musb_h_tx_dma_start() ... now renamed (and shared).

[ dbrownell@users.sourceforge.net: don't introduce more
CamElCase; use more concise explanations ]

Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Cc: Felipe Balbi <felipe.balbi@nokia.com>
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
2009-04-17 10:50:25 -07:00
..
blackfin.c USB: musb: Kill some compiling warning in musb Blackfin part 2009-01-07 10:00:08 -08:00
blackfin.h USB: musb: add Blackfin driver to MUSB framework (v2) 2009-01-07 10:00:07 -08:00
cppi_dma.c USB: musb: bugfixes for multi-packet TXDMA support 2009-04-17 10:50:25 -07:00
cppi_dma.h usb: musb_hdrc build fixes 2008-10-17 14:40:59 -07:00
davinci.c USB: musb: partial DaVinci dm355 support 2009-03-24 16:20:36 -07:00
davinci.h USB: musb: partial DaVinci dm355 support 2009-03-24 16:20:36 -07:00
Kconfig USB: musb: partial DaVinci dm355 support 2009-03-24 16:20:36 -07:00
Makefile USB: musb: add Blackfin Kconfig options and Makefile 2009-01-07 10:00:08 -08:00
musb_core.c USB: musb: only turn off vbus in OTG hosts 2009-03-24 16:20:36 -07:00
musb_core.h USB: musb: fix init oops crash with static FIFO config 2009-03-24 16:20:36 -07:00
musb_debug.h usb: musb: fix debug global variable name 2008-11-13 14:45:01 -08:00
musb_dma.h
musb_gadget_ep0.c usb: musb: do not mess up count number and CSR0 register value 2008-10-17 14:40:59 -07:00
musb_gadget.c USB: musb: be careful with 64K+ transfer lengths (gadget side) 2009-02-27 14:40:51 -08:00
musb_gadget.h
musb_host.c USB: musb: bugfixes for multi-packet TXDMA support 2009-04-17 10:50:25 -07:00
musb_host.h usb: musb: fix BULK request on different available endpoints 2008-11-13 14:45:01 -08:00
musb_io.h USB: musb: Blackfin provides read/write I/O accessor in header files 2009-01-07 10:00:08 -08:00
musb_regs.h USB: musb: add Blackfin specific configuration to MUSB 2009-01-07 10:00:07 -08:00
musb_virthub.c USB: replace uses of __constant_{endian} 2009-03-24 16:20:33 -07:00
musbhsdma.c USB: musb: bugfixes for multi-packet TXDMA support 2009-04-17 10:50:25 -07:00
musbhsdma.h USB: musb: enable low level DMA operation for Blackfin 2009-01-07 10:00:07 -08:00
omap2430.c USB: musb: minor locking fix 2009-01-07 09:59:59 -08:00
omap2430.h usb: musb: fix include path 2008-09-23 13:58:08 -07:00
tusb6010_omap.c USB: musb: tusb6010 buildfix 2009-01-27 16:15:33 -08:00
tusb6010.c USB: musb: sysfs mode updates 2009-01-07 09:59:58 -08:00
tusb6010.h usb: musb: pass configuration specifics via pdata 2008-08-13 17:33:01 -07:00