diff options
author | T. S., Anil Kumar <anil@ti.com> | 2010-09-24 13:44:09 +0300 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-10-22 10:21:54 -0700 |
commit | f8afbf7f2bf3cee0f4fff7cb753ecc9f583972c3 (patch) | |
tree | ab438c81a15eda0f8b25191b766f644f3f2f81e3 /drivers/usb/musb/musb_host.c | |
parent | ae9b2ad2eea729b907ef5dd5e25d1ff8443d03fc (diff) | |
download | linux-f8afbf7f2bf3cee0f4fff7cb753ecc9f583972c3.tar.gz linux-f8afbf7f2bf3cee0f4fff7cb753ecc9f583972c3.tar.bz2 linux-f8afbf7f2bf3cee0f4fff7cb753ecc9f583972c3.zip |
usb: musb: host: support DMA transfers greater than max channel length
Add support for MUSB Host DMA transfers greater than max
channel length, so that such transfers won't be truncated.
Signed-off-by: Anil Shetty <anil@ti.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/musb/musb_host.c')
-rw-r--r-- | drivers/usb/musb/musb_host.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c index 62e39fc57211..4d5bcb4e14d2 100644 --- a/drivers/usb/musb/musb_host.c +++ b/drivers/usb/musb/musb_host.c @@ -1120,6 +1120,7 @@ void musb_host_tx(struct musb *musb, u8 epnum) u32 status = 0; void __iomem *mbase = musb->mregs; struct dma_channel *dma; + bool transfer_pending = false; musb_ep_select(mbase, epnum); tx_csr = musb_readw(epio, MUSB_TXCSR); @@ -1280,7 +1281,7 @@ void musb_host_tx(struct musb *musb, u8 epnum) offset = d->offset; length = d->length; } - } else if (dma) { + } else if (dma && urb->transfer_buffer_length == qh->offset) { done = true; } else { /* see if we need to send more data, or ZLP */ @@ -1293,6 +1294,7 @@ void musb_host_tx(struct musb *musb, u8 epnum) if (!done) { offset = qh->offset; length = urb->transfer_buffer_length - offset; + transfer_pending = true; } } } @@ -1312,7 +1314,7 @@ void musb_host_tx(struct musb *musb, u8 epnum) urb->actual_length = qh->offset; musb_advance_schedule(musb, urb, hw_ep, USB_DIR_OUT); return; - } else if (usb_pipeisoc(pipe) && dma) { + } else if ((usb_pipeisoc(pipe) || transfer_pending) && dma) { if (musb_tx_dma_program(musb->dma_controller, hw_ep, qh, urb, offset, length)) { if (is_cppi_enabled() || tusb_dma_omap()) |