summaryrefslogtreecommitdiff
path: root/drivers/usb
diff options
context:
space:
mode:
authorSuresh Gupta <suresh.gupta@freescale.com>2013-04-14 15:34:47 (GMT)
committerFleming Andrew-AFLEMING <AFLEMING@freescale.com>2013-04-23 20:35:11 (GMT)
commit731a7ed2c09fd37e7928bbdd219f5a73005d3207 (patch)
tree89f5c872dbfdb2c5ab2b4a166fe2fa8d03a08e0b /drivers/usb
parentfe2026457bb444513a49e423efe6d8637d0998d3 (diff)
downloadlinux-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.c72
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