shithub: front

Download patch

ref: b849349e0cc9e1dac92498b026cd78ddecef5a97
parent: 242e1dc5528474848c36ee68044b62f7da962241
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Thu Dec 26 12:35:44 EST 2024

devusb: fix enable delays to avoid device suspend (thanks cgnarne)

cgnarne experienced issues with his xbox controller when
connected to uhci root-port.

doing some experiments, we determined that the delay
between clearing reset and setting enable needed to
be between 5µs and 2.7ms for it to attach successfully.

this timing is close to the 3ms idle time that makes
devices enter suspend mode, so we concluded that the
delay here must be shortend (50ms -> 2ms).

--- a/sys/src/9/port/devusb.c
+++ b/sys/src/9/port/devusb.c
@@ -1184,14 +1184,22 @@
 	if(port > 0){
 		dev->rhresetport = 0;
 
-		/* some controllers have to clear reset and set enable manually */
+		/*
+		 * Some controllers have to clear reset and set enable manually.
+		 * We assume that clearing reset will transition the bus from
+		 * SE0 to idle state, and setting enable starts transmitting
+		 * SOF packets (keep alive).
+		 *
+		 * The delay between clearing reset and setting enable must
+		 * not exceed 3ms as this makes devices suspend themselfs.
+		 */
 		if(hp->portreset != nil){
 			(*hp->portreset)(hp, port, 0);
-			tsleep(&up->sleep, return0, nil, 50);
+			tsleep(&up->sleep, return0, nil, 2);
 		}
 		if(hp->portenable != nil){
 			(*hp->portenable)(hp, port, 1);
-			tsleep(&up->sleep, return0, nil, 50);
+			tsleep(&up->sleep, return0, nil, 2);
 		}
 	}
 
--