Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0efd937e authored by Johan Hovold's avatar Johan Hovold Committed by Greg Kroah-Hartman
Browse files

USB: ehci-tegra: 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.

Compile-tested only.

Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
Tested-by: default avatarStephen Warren <swarren@nvidia.com>
Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 8ca9a321
Loading
Loading
Loading
Loading
+9 −3
Original line number Original line Diff line number Diff line
@@ -304,6 +304,7 @@ struct dma_aligned_buffer {
static void free_dma_aligned_buffer(struct urb *urb)
static void free_dma_aligned_buffer(struct urb *urb)
{
{
	struct dma_aligned_buffer *temp;
	struct dma_aligned_buffer *temp;
	size_t length;


	if (!(urb->transfer_flags & URB_ALIGNED_TEMP_BUFFER))
	if (!(urb->transfer_flags & URB_ALIGNED_TEMP_BUFFER))
		return;
		return;
@@ -311,9 +312,14 @@ static void free_dma_aligned_buffer(struct urb *urb)
	temp = container_of(urb->transfer_buffer,
	temp = container_of(urb->transfer_buffer,
		struct dma_aligned_buffer, data);
		struct dma_aligned_buffer, data);


	if (usb_urb_dir_in(urb))
	if (usb_urb_dir_in(urb)) {
		memcpy(temp->old_xfer_buffer, temp->data,
		if (usb_pipeisoc(urb->pipe))
		       urb->transfer_buffer_length);
			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;
	urb->transfer_buffer = temp->old_xfer_buffer;
	kfree(temp->kmalloc_ptr);
	kfree(temp->kmalloc_ptr);