summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorRohith Seelaboyina <rseelaboyina@nvidia.com>2013-11-20 11:06:52 +0530
committerHarry Hong <hhong@nvidia.com>2014-01-13 16:46:24 -0800
commit95e95492aed2a09456a379b826ee064cada67fdd (patch)
tree6a0c75f301ba1e5e828fd2538ffa283d5456ca4d /drivers
parent05536b463ba44cbe75a9002d34162d49b0009cf0 (diff)
usb: gadget: tegra: remove spin_unlock/lock pair
Remove the extra spin unlock/lock pain while building dtd, as data corruption seems to happen by swapping of dtd when multiple gadget functions are loaded. This changes will make build dtd as part of Critical section, there by swapping of dtd's doesnt occur. Bug 1380570 Change-Id: I69ffc92a294cba13e79e2a02382b0c8f6b8cb28d Signed-off-by: Rohith Seelaboyina <rseelaboyina@nvidia.com> Reviewed-on: http://git-master/r/334929 (cherry picked from commit 1716e1b6e87ce0765eaab4c0fb62007735b33ee8) Reviewed-on: http://git-master/r/354900 Reviewed-by: Harry Hong <hhong@nvidia.com> Tested-by: Harry Hong <hhong@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/usb/gadget/tegra_udc.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/drivers/usb/gadget/tegra_udc.c b/drivers/usb/gadget/tegra_udc.c
index 7050da114251..bf9ca45286a6 100644
--- a/drivers/usb/gadget/tegra_udc.c
+++ b/drivers/usb/gadget/tegra_udc.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2013, NVIDIA CORPORATION. All rights reserved.
+ * Copyright (c) 2012-2014, NVIDIA CORPORATION. All rights reserved.
*
* Description:
* High-speed USB device controller driver.
@@ -987,10 +987,10 @@ tegra_ep_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags)
dir = ep_is_in(ep) ? DMA_TO_DEVICE : DMA_FROM_DEVICE;
- spin_unlock_irqrestore(&udc->lock, flags);
-
- if (!udc->driver || udc->gadget.speed == USB_SPEED_UNKNOWN)
+ if (!udc->driver || udc->gadget.speed == USB_SPEED_UNKNOWN) {
+ spin_unlock_irqrestore(&udc->lock, flags);
return -ESHUTDOWN;
+ }
req->ep = ep;
@@ -1004,8 +1004,10 @@ tegra_ep_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags)
dma_set_attr(DMA_ATTR_SKIP_CPU_SYNC, &attrs);
req->req.dma = dma_map_single_attrs(dev, req->req.buf, ext, dir,
&attrs);
- if (dma_mapping_error(dev, req->req.dma))
+ if (dma_mapping_error(dev, req->req.dma)) {
+ spin_unlock_irqrestore(&udc->lock, flags);
return -EAGAIN;
+ }
dma_sync_single_for_device(dev, req->req.dma, orig, dir);
@@ -1022,11 +1024,11 @@ tegra_ep_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags)
/* build dtds and push them to device queue */
- status = tegra_req_to_dtd(req, gfp_flags);
- if (status)
+ status = tegra_req_to_dtd(req, GFP_ATOMIC);
+ if (status) {
+ spin_unlock_irqrestore(&udc->lock, flags);
goto err_unmap;
-
- spin_lock_irqsave(&udc->lock, flags);
+ }
/* re-check if the ep has not been disabled */
if (unlikely(!ep->desc)) {