summaryrefslogtreecommitdiffstats
path: root/drivers/usb/gadget
diff options
context:
space:
mode:
authorJack Pham <jackp@codeaurora.org>2017-08-01 02:00:56 -0700
committerFelipe Balbi <felipe.balbi@linux.intel.com>2017-08-15 14:18:54 +0300
commit31fe084ffaaf8abece14f8ca28e5e3b4e2bf97b6 (patch)
tree42714e3aa40f6ce62c1e42be22a24de6efe467f1 /drivers/usb/gadget
parentf8faa3bf5fc988e504766b8d1bb7b3d5fb09f6f8 (diff)
downloadlinux-stable-31fe084ffaaf8abece14f8ca28e5e3b4e2bf97b6.tar.gz
linux-stable-31fe084ffaaf8abece14f8ca28e5e3b4e2bf97b6.tar.bz2
linux-stable-31fe084ffaaf8abece14f8ca28e5e3b4e2bf97b6.zip
usb: gadget: core: unmap request from DMA only if previously mapped
In the SG case this is already handled since a non-zero request->num_mapped_sgs is a clear indicator that dma_map_sg() had been called. While it would be nice to do the same for the singly mapped case by simply checking for non-zero request->dma, it's conceivable that 0 is a valid dma_addr_t handle. Hence add a flag 'dma_mapped' to struct usb_request and use this to determine the need to call dma_unmap_single(). Otherwise, if a request is not DMA mapped then the result of calling usb_request_unmap_request() would safely be a no-op. Signed-off-by: Jack Pham <jackp@codeaurora.org> Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
Diffstat (limited to 'drivers/usb/gadget')
-rw-r--r--drivers/usb/gadget/udc/core.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/usb/gadget/udc/core.c b/drivers/usb/gadget/udc/core.c
index e6f04eee95c4..c1cef6a11ecb 100644
--- a/drivers/usb/gadget/udc/core.c
+++ b/drivers/usb/gadget/udc/core.c
@@ -812,6 +812,8 @@ int usb_gadget_map_request_by_dev(struct device *dev,
dev_err(dev, "failed to map buffer\n");
return -EFAULT;
}
+
+ req->dma_mapped = 1;
}
return 0;
@@ -836,9 +838,10 @@ void usb_gadget_unmap_request_by_dev(struct device *dev,
is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
req->num_mapped_sgs = 0;
- } else {
+ } else if (req->dma_mapped) {
dma_unmap_single(dev, req->dma, req->length,
is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
+ req->dma_mapped = 0;
}
}
EXPORT_SYMBOL_GPL(usb_gadget_unmap_request_by_dev);