diff options
author | Jules Maselbas <jmaselbas@kalray.eu> | 2020-08-11 17:16:29 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2020-08-14 14:05:17 +0200 |
commit | 58593dd67edeed2eb9462b36a4cb565e2d0f36c0 (patch) | |
tree | 6d483009367ed3bd29a286364fad9ca4d301925a /drivers | |
parent | 15da095d1207293a6e79b87d6449371ba15bfde9 (diff) | |
download | barebox-58593dd67edeed2eb9462b36a4cb565e2d0f36c0.tar.gz barebox-58593dd67edeed2eb9462b36a4cb565e2d0f36c0.tar.xz |
usb: dwc2: Rework timeout
Signed-off-by: Jules Maselbas <jmaselbas@kalray.eu>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/usb/dwc2/core.h | 22 | ||||
-rw-r--r-- | 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 94f992cb10..a2ec3ff689 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 561f401f34..36ac77d130 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, |