diff options
author | Praveena Nadahally <praveen.nadahally@stericsson.com> | 2011-03-05 15:31:14 +0530 |
---|---|---|
committer | Srinidhi KASAGAR <srinidhi.kasagar@stericsson.com> | 2011-03-08 05:37:51 +0100 |
commit | 0508cc6567bb6f51f7b557a072fc8a6ab9cd8b2a (patch) | |
tree | bc1778b0d2880f7e47d4a920d9533627892fae20 /drivers/usb | |
parent | e673258842da76577b81903ac2dad10a81b782ff (diff) |
ux8500: USB: Full speed bulk split
In case of full speed mode with double buffering, bulk split
does not work as defined. Hence in case of FS, return the EP
size instead of EP FIFO size.
ST-Ericsson ID: ER 323543
Change-Id: I29e107d6de298d5563a91d562e931759db543b84
Signed-off-by: Praveena Nadahally <praveen.nadahally@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/17674
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/musb/musb_gadget.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index e394676d5dd..b3e4f95ea1b 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c @@ -148,7 +148,8 @@ __acquires(ep->musb->lock) #endif #ifdef CONFIG_USB_U8500_DMA if (is_dma_capable() && !(req->request.actual < ep->packet_sz) - && musb_gadget_use_dma(ep->hw_ep->epnum)) { + && musb_gadget_use_dma(ep->hw_ep->epnum) + && (ep->packet_sz >= DMA_PACKET_THRESHOLD)) { #else if (is_dma_capable()) { #endif @@ -241,7 +242,20 @@ static void nuke(struct musb_ep *ep, const int status) static inline int max_ep_writesize(struct musb *musb, struct musb_ep *ep) { +#ifdef CONFIG_USB_U8500_DMA + /* + * In case of full speed mode with double buffering, bulk split + * does not work as defined. Hence in case of FS, return the EP + * size instead of EP FIFO size. + */ + u8 power; + + power = musb_readb(musb->mregs, MUSB_POWER); + + if (can_bulk_split(musb, ep->type) && (power & MUSB_POWER_HSMODE)) +#else if (can_bulk_split(musb, ep->type)) +#endif return ep->hw_ep->max_packet_sz_tx; else return ep->packet_sz; @@ -344,8 +358,7 @@ static void txstate(struct musb *musb, struct musb_request *req) use_dma = (request->dma != DMA_ADDR_INVALID); #ifdef CONFIG_USB_U8500_DMA - if (request->length >= musb_ep->packet_sz) { - + if (request->length >= DMA_PACKET_THRESHOLD) { csr |= (MUSB_TXCSR_AUTOSET| MUSB_TXCSR_DMAENAB | MUSB_TXCSR_DMAMODE |