lkml.org 
[lkml]   [2019]   [Jun]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 43/53] usb: dwc2: Fix DMA cache alignment issues
    Date
    From: Martin Schiller <ms@dev.tdt.de>

    commit 4a4863bf2e7932e584a3a462d3c6daf891142ddc upstream.

    Insert a padding between data and the stored_xfer_buffer pointer to
    ensure they are not on the same cache line.

    Otherwise, the stored_xfer_buffer gets corrupted for IN URBs on
    non-cache-coherent systems. (In my case: Lantiq xRX200 MIPS)

    Fixes: 3bc04e28a030 ("usb: dwc2: host: Get aligned DMA in a more supported way")
    Fixes: 56406e017a88 ("usb: dwc2: Fix DMA alignment to start at allocated boundary")
    Cc: <stable@vger.kernel.org>
    Tested-by: Douglas Anderson <dianders@chromium.org>
    Reviewed-by: Douglas Anderson <dianders@chromium.org>
    Acked-by: Minas Harutyunyan <hminas@synopsys.com>
    Signed-off-by: Martin Schiller <ms@dev.tdt.de>
    Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/usb/dwc2/hcd.c | 10 +++++++---
    1 file changed, 7 insertions(+), 3 deletions(-)

    --- a/drivers/usb/dwc2/hcd.c
    +++ b/drivers/usb/dwc2/hcd.c
    @@ -2652,8 +2652,10 @@ static void dwc2_free_dma_aligned_buffer
    return;

    /* Restore urb->transfer_buffer from the end of the allocated area */
    - memcpy(&stored_xfer_buffer, urb->transfer_buffer +
    - urb->transfer_buffer_length, sizeof(urb->transfer_buffer));
    + memcpy(&stored_xfer_buffer,
    + PTR_ALIGN(urb->transfer_buffer + urb->transfer_buffer_length,
    + dma_get_cache_alignment()),
    + sizeof(urb->transfer_buffer));

    if (usb_urb_dir_in(urb))
    memcpy(stored_xfer_buffer, urb->transfer_buffer,
    @@ -2680,6 +2682,7 @@ static int dwc2_alloc_dma_aligned_buffer
    * DMA
    */
    kmalloc_size = urb->transfer_buffer_length +
    + (dma_get_cache_alignment() - 1) +
    sizeof(urb->transfer_buffer);

    kmalloc_ptr = kmalloc(kmalloc_size, mem_flags);
    @@ -2690,7 +2693,8 @@ static int dwc2_alloc_dma_aligned_buffer
    * Position value of original urb->transfer_buffer pointer to the end
    * of allocation for later referencing
    */
    - memcpy(kmalloc_ptr + urb->transfer_buffer_length,
    + memcpy(PTR_ALIGN(kmalloc_ptr + urb->transfer_buffer_length,
    + dma_get_cache_alignment()),
    &urb->transfer_buffer, sizeof(urb->transfer_buffer));

    if (usb_urb_dir_out(urb))

    \
     
     \ /
      Last update: 2019-06-17 23:31    [W:3.464 / U:0.396 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site