mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH master] usb: dwc2: increase timeout for waiting on host mode
@ 2021-04-21  7:27 Ahmad Fatoum
  2021-04-21  8:47 ` Jules Maselbas
  0 siblings, 1 reply; 6+ messages in thread
From: Ahmad Fatoum @ 2021-04-21  7:27 UTC (permalink / raw)
  To: barebox; +Cc: jmaselbas, Ahmad Fatoum

Commit 26459ab7803a ("usb: dwc2: Rework wait for host mode during
core reset") effectively reduced the timeout on switch to host mode
from 200ms to 110 us, which is insufficient for the IP on the Raspberry
Pi 3b, leading to:

  dwc2 3f980000.usb@7e980000.of: dwc2_wait_for_mode: Couldn't set host mode

and an unusable USB (and Ethernet) after.

Bump up the timeout to 200ms and help future debugging by logging how
much time it actually took. For the Raspberry 3b I got a value of 49ms.

Note that this is also called from dwc2_force_mode, so worst case is
that a stuck IP delays barebox startup by 200ms.
An error message would alert to this fact, so it can be corrected.

Fixes: 26459ab7803a ("usb: dwc2: Rework wait for host mode during core reset")
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
 drivers/usb/dwc2/core.c | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/drivers/usb/dwc2/core.c b/drivers/usb/dwc2/core.c
index 5d04a07b0393..7813344ffa65 100644
--- a/drivers/usb/dwc2/core.c
+++ b/drivers/usb/dwc2/core.c
@@ -688,19 +688,23 @@ int dwc2_get_dr_mode(struct dwc2 *dwc2)
  */
 void dwc2_wait_for_mode(struct dwc2 *dwc2, bool host_mode)
 {
-	unsigned int timeout = 110 * USECOND;
-	int ret;
+	unsigned int timeout = 200 * MSECOND;
+	uint64_t start;
 
 	dev_vdbg(dwc2->dev, "Waiting for %s mode\n",
 		 host_mode ? "host" : "device");
 
-	ret = wait_on_timeout(timeout, dwc2_is_host_mode(dwc2) == host_mode);
-	if (ret)
-		dev_err(dwc2->dev, "%s: Couldn't set %s mode\n",
-				 __func__, host_mode ? "host" : "device");
+	start = get_time_ns();
+	while (dwc2_is_host_mode(dwc2) != host_mode) {
+		if (is_timeout(start, timeout)) {
+			dev_err(dwc2->dev, "%s: Couldn't set %s mode\n",
+				__func__, host_mode ? "host" : "device");
+			return;
+		}
+	}
 
-	dev_vdbg(dwc2->dev, "%s mode set\n",
-		 host_mode ? "Host" : "Device");
+	dev_vdbg(dwc2->dev, "%s mode set after %lluns\n",
+		 host_mode ? "Host" : "Device", get_time_ns() - start);
 }
 
 /**
-- 
2.29.2


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2021-06-02 11:29 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-21  7:27 [PATCH master] usb: dwc2: increase timeout for waiting on host mode Ahmad Fatoum
2021-04-21  8:47 ` Jules Maselbas
2021-04-21  8:50   ` Ahmad Fatoum
2021-04-21  9:11     ` Jules Maselbas
2021-05-07  8:07     ` Sascha Hauer
2021-06-02 11:21       ` Ahmad Fatoum

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox