Signed-off-by: Jules Maselbas <jmaselbas@xxxxxxxxx> --- drivers/usb/dwc2/core.h | 22 ++++------------------ drivers/usb/dwc2/host.c | 16 +++++++++++++++- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h index 94f992cb1..a2ec3ff68 100644 --- a/drivers/usb/dwc2/core.h +++ b/drivers/usb/dwc2/core.h @@ -466,15 +466,8 @@ static inline void dwc2_writel(struct dwc2 *dwc2, u32 value, u32 offset) static inline int dwc2_wait_bit_set(struct dwc2 *dwc2, u32 offset, u32 mask, u32 timeout) { - u32 i; - - for (i = 0; i < timeout; i++) { - if (dwc2_readl(dwc2, offset) & mask) - return 0; - udelay(1); - } - - return -ETIMEDOUT; + return wait_on_timeout(timeout * USECOND, + dwc2_readl(dwc2, offset) & mask); } /** @@ -489,15 +482,8 @@ static inline int dwc2_wait_bit_set(struct dwc2 *dwc2, u32 offset, u32 mask, static inline int dwc2_wait_bit_clear(struct dwc2 *dwc2, u32 offset, u32 mask, u32 timeout) { - u32 i; - - for (i = 0; i < timeout; i++) { - if (!(dwc2_readl(dwc2, offset) & mask)) - return 0; - udelay(1); - } - - return -ETIMEDOUT; + return wait_on_timeout(timeout * USECOND, + !(dwc2_readl(dwc2, offset) & mask)); } /* diff --git a/drivers/usb/dwc2/host.c b/drivers/usb/dwc2/host.c index 7eaa7c31c..ea2facbc8 100644 --- a/drivers/usb/dwc2/host.c +++ b/drivers/usb/dwc2/host.c @@ -383,6 +383,8 @@ static int dwc2_submit_bulk_msg(struct usb_device *udev, unsigned long pipe, int in = usb_pipein(pipe); u8 *pid; u8 hc = DWC2_HC_CHANNEL; + uint64_t start; + int ret; if ((devnum >= MAX_DEVICE) || (devnum == dwc2->root_hub_devnum)) { udev->status = 0; @@ -394,7 +396,19 @@ static int dwc2_submit_bulk_msg(struct usb_device *udev, unsigned long pipe, else pid = &dwc2->out_data_toggle[devnum][ep]; - return dwc2_submit_packet(dwc2, udev, hc, pipe, pid, in, buffer, len); + start = get_time_ns(); + do { + ret = dwc2_submit_packet(dwc2, udev, hc, pipe, pid, in, + buffer, len); + } while (ret == -EAGAIN && !is_timeout(start, timeout * MSECOND)); + if (ret == -EAGAIN) { + dwc2_err(dwc2, "Timeout on bulk endpoint\n"); + ret = -ETIMEDOUT; + } + + dwc2_dbg(dwc2, "%s: return %d\n", __func__, ret); + + return ret; } static int dwc2_submit_int_msg(struct usb_device *udev, unsigned long pipe, -- 2.17.1 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox