git: 9front

Download patch

ref: 55b805e4a8c3c1b0fb2c7fe11923a01379558dd8
parent: e8e264353ef9410a6427dfe25f0418e02139502b
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);
 		}
 	}
 
--