diff options
author | Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> | 2017-09-27 05:47:13 -0400 |
---|---|---|
committer | Felipe Balbi <felipe.balbi@linux.intel.com> | 2017-09-28 05:35:01 -0400 |
commit | 0a2ce62b61f2c76d0213edf4e37aaf54a8ddf295 (patch) | |
tree | dec09818e2c0ad2ccaac61d0ce9c202a882bcc64 | |
parent | 6124607acc88fffeaadf3aacfeb3cc1304c87387 (diff) |
usb: renesas_usbhs: fix usbhsf_fifo_clear() for RX direction
This patch fixes an issue that the usbhsf_fifo_clear() is possible
to cause 10 msec delay if the pipe is RX direction and empty because
the FRDY bit will never be set to 1 in such case.
Fixes: e8d548d54968 ("usb: renesas_usbhs: fifo became independent from pipe.")
Cc: <stable@vger.kernel.org> # v3.1+
Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
-rw-r--r-- | drivers/usb/renesas_usbhs/fifo.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/usb/renesas_usbhs/fifo.c b/drivers/usb/renesas_usbhs/fifo.c index 03cac07f57b5..68f26904c316 100644 --- a/drivers/usb/renesas_usbhs/fifo.c +++ b/drivers/usb/renesas_usbhs/fifo.c | |||
@@ -284,8 +284,17 @@ static void usbhsf_fifo_clear(struct usbhs_pipe *pipe, | |||
284 | struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe); | 284 | struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe); |
285 | int ret = 0; | 285 | int ret = 0; |
286 | 286 | ||
287 | if (!usbhs_pipe_is_dcp(pipe)) | 287 | if (!usbhs_pipe_is_dcp(pipe)) { |
288 | ret = usbhsf_fifo_barrier(priv, fifo); | 288 | /* |
289 | * This driver checks the pipe condition first to avoid -EBUSY | ||
290 | * from usbhsf_fifo_barrier() with about 10 msec delay in | ||
291 | * the interrupt handler if the pipe is RX direction and empty. | ||
292 | */ | ||
293 | if (usbhs_pipe_is_dir_in(pipe)) | ||
294 | ret = usbhs_pipe_is_accessible(pipe); | ||
295 | if (!ret) | ||
296 | ret = usbhsf_fifo_barrier(priv, fifo); | ||
297 | } | ||
289 | 298 | ||
290 | /* | 299 | /* |
291 | * if non-DCP pipe, this driver should set BCLR when | 300 | * if non-DCP pipe, this driver should set BCLR when |