diff options
author | Johan Hovold <johan@kernel.org> | 2015-04-23 17:06:50 +0300 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2015-04-27 23:48:39 +0300 |
commit | d72348fb5ca634583bf3f79996cc4b3ef91d9c3a (patch) | |
tree | d24d6d333f8ad87342a929f137fdff6d7a6ea92e /drivers/usb/musb | |
parent | 2d9c7f3ca54625f4d740af78f84ee232da3ca937 (diff) | |
download | linux-d72348fb5ca634583bf3f79996cc4b3ef91d9c3a.tar.xz |
usb: musb: fix inefficient copy of unaligned buffers
Make sure only to copy any actual data rather than the whole buffer,
when releasing the temporary buffer used for unaligned non-isochronous
transfers.
Signed-off-by: Johan Hovold <johan@kernel.org>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/musb')
-rw-r--r-- | drivers/usb/musb/musb_host.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c index c3d5fc9dfb5b..e1fb5d885c18 100644 --- a/drivers/usb/musb/musb_host.c +++ b/drivers/usb/musb/musb_host.c @@ -2512,6 +2512,7 @@ static void musb_free_temp_buffer(struct urb *urb) { enum dma_data_direction dir; struct musb_temp_buffer *temp; + size_t length; if (!(urb->transfer_flags & URB_ALIGNED_TEMP_BUFFER)) return; @@ -2522,8 +2523,12 @@ static void musb_free_temp_buffer(struct urb *urb) data); if (dir == DMA_FROM_DEVICE) { - memcpy(temp->old_xfer_buffer, temp->data, - urb->transfer_buffer_length); + if (usb_pipeisoc(urb->pipe)) + length = urb->transfer_buffer_length; + else + length = urb->actual_length; + + memcpy(temp->old_xfer_buffer, temp->data, length); } urb->transfer_buffer = temp->old_xfer_buffer; kfree(temp->kmalloc_ptr); |