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).
This commit is contained in:
cinap_lenrek 2024-12-26 17:35:44 +00:00
parent 242e1dc552
commit b849349e0c

View file

@ -1184,14 +1184,22 @@ rhubwrite(Ep *ep, void *a, long n)
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);
}
}