diff options
author | Suresh Gupta <suresh.gupta@freescale.com> | 2013-04-14 15:34:47 (GMT) |
---|---|---|
committer | Fleming Andrew-AFLEMING <AFLEMING@freescale.com> | 2013-04-23 20:35:11 (GMT) |
commit | 731a7ed2c09fd37e7928bbdd219f5a73005d3207 (patch) | |
tree | 89f5c872dbfdb2c5ab2b4a166fe2fa8d03a08e0b /drivers/usb | |
parent | fe2026457bb444513a49e423efe6d8637d0998d3 (diff) | |
download | linux-fsl-qoriq-731a7ed2c09fd37e7928bbdd219f5a73005d3207.tar.xz |
fsl/usb: No need to map Zero Length Packet for streaming DMA
ZLP buffer mapping using streaming DMA is not required
Signed-off-by: Suresh Gupta <suresh.gupta@freescale.com>
Change-Id: Ifa4ee7970160f0b3e473b167bc53803ac30e51b4
Reviewed-on: http://git.am.freescale.net:8181/1319
Reviewed-by: Mehresh Ramneek-B31383 <ramneek.mehresh@freescale.com>
Reviewed-by: Fleming Andrew-AFLEMING <AFLEMING@freescale.com>
Tested-by: Fleming Andrew-AFLEMING <AFLEMING@freescale.com>
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/gadget/fsl_udc_core.c | 72 |
1 files changed, 38 insertions, 34 deletions
diff --git a/drivers/usb/gadget/fsl_udc_core.c b/drivers/usb/gadget/fsl_udc_core.c index 7780098..603ee53 100644 --- a/drivers/usb/gadget/fsl_udc_core.c +++ b/drivers/usb/gadget/fsl_udc_core.c @@ -164,6 +164,7 @@ static void done(struct fsl_ep *ep, struct fsl_req *req, int status) unsigned char stopped = ep->stopped; struct ep_td_struct *curr_td, *next_td; int j; + struct device *pdev = NULL; udc = (struct fsl_udc *)ep->udc; /* Removed the req from fsl_ep->queue */ @@ -185,20 +186,24 @@ static void done(struct fsl_ep *ep, struct fsl_req *req, int status) dma_pool_free(udc->td_pool, curr_td, curr_td->td_dma); } - if (req->mapped) { - dma_unmap_single(ep->udc->gadget.dev.parent, - req->req.dma, req->req.length, - ep_is_in(ep) - ? DMA_TO_DEVICE - : DMA_FROM_DEVICE); - req->req.dma = DMA_ADDR_INVALID; - req->mapped = 0; - } else - dma_sync_single_for_cpu(ep->udc->gadget.dev.parent, - req->req.dma, req->req.length, - ep_is_in(ep) - ? DMA_TO_DEVICE - : DMA_FROM_DEVICE); + if (req->req.length) { + /* Non Zero Length Packet */ + pdev = ep->udc->gadget.dev.parent; + if (req->mapped) { + dma_unmap_single(pdev, req->req.dma, + req->req.length, + ep_is_in(ep) + ? DMA_TO_DEVICE + : DMA_FROM_DEVICE); + req->req.dma = DMA_ADDR_INVALID; + req->mapped = 0; + } else + dma_sync_single_for_cpu(pdev, req->req.dma, + req->req.length, + ep_is_in(ep) + ? DMA_TO_DEVICE + : DMA_FROM_DEVICE); + } if (status && (status != -ESHUTDOWN)) VDBG("complete %s req %p stat %d len %u/%u", @@ -888,6 +893,7 @@ fsl_ep_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags) struct fsl_req *req = container_of(_req, struct fsl_req, req); struct fsl_udc *udc; unsigned long flags; + struct device *pdev = NULL; /* catch various bogus parameters */ if (!_req || !req->req.complete || !req->req.buf @@ -910,21 +916,24 @@ fsl_ep_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags) req->ep = ep; - /* map virtual address to hardware */ - if (req->req.dma == DMA_ADDR_INVALID) { - req->req.dma = dma_map_single(ep->udc->gadget.dev.parent, - req->req.buf, - req->req.length, ep_is_in(ep) - ? DMA_TO_DEVICE - : DMA_FROM_DEVICE); - req->mapped = 1; - } else { - dma_sync_single_for_device(ep->udc->gadget.dev.parent, - req->req.dma, req->req.length, - ep_is_in(ep) - ? DMA_TO_DEVICE - : DMA_FROM_DEVICE); - req->mapped = 0; + if (req->req.length) { + /* Non Zero Length Packet */ + /* map virtual address to hardware */ + pdev = ep->udc->gadget.dev.parent; + if (req->req.dma == DMA_ADDR_INVALID) { + req->req.dma = dma_map_single(pdev, req->req.buf, + req->req.length, ep_is_in(ep) + ? DMA_TO_DEVICE + : DMA_FROM_DEVICE); + req->mapped = 1; + } else { + dma_sync_single_for_device(pdev, req->req.dma, + req->req.length, + ep_is_in(ep) + ? DMA_TO_DEVICE + : DMA_FROM_DEVICE); + req->mapped = 0; + } } req->req.status = -EINPROGRESS; @@ -1306,11 +1315,6 @@ static int ep0_prime_status(struct fsl_udc *udc, int direction) req->req.complete = NULL; req->dtd_count = 0; - req->req.dma = dma_map_single(ep->udc->gadget.dev.parent, - req->req.buf, req->req.length, - ep_is_in(ep) ? DMA_TO_DEVICE : DMA_FROM_DEVICE); - req->mapped = 1; - if (fsl_req_to_dtd(req, GFP_ATOMIC) == 0) fsl_queue_td(ep, req); else |