From b849349e0cc9e1dac92498b026cd78ddecef5a97 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Thu, 26 Dec 2024 17:35:44 +0000 Subject: [PATCH] devusb: fix enable delays to avoid device suspend (thanks cgnarne) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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). --- sys/src/9/port/devusb.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/sys/src/9/port/devusb.c b/sys/src/9/port/devusb.c index eb73fbdbb..22599e53d 100644 --- a/sys/src/9/port/devusb.c +++ b/sys/src/9/port/devusb.c @@ -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); } }