| From 17aa31f13cad25daa19d3f923323f552e87bc874 Mon Sep 17 00:00:00 2001 |
| From: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> |
| Date: Mon, 5 Feb 2018 17:12:35 +0900 |
| Subject: usb: renesas_usbhs: missed the "running" flag in usb_dmac with rx path |
| |
| From: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> |
| |
| commit 17aa31f13cad25daa19d3f923323f552e87bc874 upstream. |
| |
| This fixes an issue that a gadget driver (usb_f_fs) is possible to |
| stop rx transactions after the usb-dmac is used because the following |
| functions missed to set/check the "running" flag. |
| - usbhsf_dma_prepare_pop_with_usb_dmac() |
| - usbhsf_dma_pop_done_with_usb_dmac() |
| |
| So, if next transaction uses pio, the usbhsf_prepare_pop() can not |
| start the transaction because the "running" flag is 0. |
| |
| Fixes: 8355b2b3082d ("usb: renesas_usbhs: fix the behavior of some usbhs_pkt_handle") |
| Cc: <stable@vger.kernel.org> # v3.19+ |
| Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> |
| Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/usb/renesas_usbhs/fifo.c | 5 +++++ |
| 1 file changed, 5 insertions(+) |
| |
| --- a/drivers/usb/renesas_usbhs/fifo.c |
| +++ b/drivers/usb/renesas_usbhs/fifo.c |
| @@ -989,6 +989,10 @@ static int usbhsf_dma_prepare_pop_with_u |
| if ((uintptr_t)pkt->buf & (USBHS_USB_DMAC_XFER_SIZE - 1)) |
| goto usbhsf_pio_prepare_pop; |
| |
| + /* return at this time if the pipe is running */ |
| + if (usbhs_pipe_is_running(pipe)) |
| + return 0; |
| + |
| usbhs_pipe_config_change_bfre(pipe, 1); |
| |
| ret = usbhsf_fifo_select(pipe, fifo, 0); |
| @@ -1179,6 +1183,7 @@ static int usbhsf_dma_pop_done_with_usb_ |
| usbhsf_fifo_clear(pipe, fifo); |
| pkt->actual = usbhs_dma_calc_received_size(pkt, chan, rcv_len); |
| |
| + usbhs_pipe_running(pipe, 0); |
| usbhsf_dma_stop(pipe, fifo); |
| usbhsf_dma_unmap(pkt); |
| usbhsf_fifo_unselect(pipe, pipe->fifo); |