shithub: riscv

Download patch

ref: d38dbf6415cbff7a43997f80f1be9492b496665e
parent: 2f685dd96be9dcf3fe9bbab306ae5b9e07cfd86d
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Dec 15 16:19:57 EST 2024

nusb/usbd: use longer reset delay for rootports

Make reset delays more conservative:

The usb spec says root ports need 50ms reset minimum, use 100ms.
The usb spec says hub ports need 20ms minimum, use 50ms.

--- a/sys/src/cmd/nusb/usbd/dat.h
+++ b/sys/src/cmd/nusb/usbd/dat.h
@@ -56,8 +56,9 @@
 	Pconfigured,
 
 	/* Delays, timeouts (ms) */
-	Resetdelay	= 20,		/* how much to wait after a reset */
-	Resumedelay	= 20,		/* how much to wait after a resume */
+	Rootresetdelay	= 100,		/* how much to wait after a root port reset (50ms by standard) */
+	Portresetdelay	= 50,		/* how much to wait after a hub port reset (20ms by standard) */
+	Resumedelay	= 50,		/* how much to wait after a resume (20ms by standard) */
 	Powerdelay	= 100,		/* after powering up ports */
 	Pollms		= 250, 		/* port poll interval */
 
--- a/sys/src/cmd/nusb/usbd/hub.c
+++ b/sys/src/cmd/nusb/usbd/hub.c
@@ -452,7 +452,7 @@
 			dprint(2, "%s: %s: port %d: set reset: %r\n", argv0, d->dir, p);
 			return -1;
 		}
-		sleep(Resetdelay);
+		sleep(d->depth<0? Rootresetdelay: Portresetdelay);
 		if((sts = portstatus(h, p)) == -1)
 			return -1;
 		sp = "full";
--