From 98f5955031603f62bcd2d078c890e9e2095eba36 Mon Sep 17 00:00:00 2001 From: Neil Cafferkey Date: Thu, 30 Mar 2023 03:06:19 +0100 Subject: [PATCH] Reduced EHCI port reset delay to allow USB volumes to be ready for boot. This at least fixes the problem on the commonly used Acer AspireOne ZG5, where previously a USB boot from BIOS could transfer to an ATA boot from DOS because DOS only saw the ATA disk when the time came to choose a boot volume. --- rom/usb/pciusb/pciusb.conf | 2 +- rom/usb/pciusb/uhwcmd.c | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/rom/usb/pciusb/pciusb.conf b/rom/usb/pciusb/pciusb.conf index 93e3315472..ecff6206b9 100644 --- a/rom/usb/pciusb/pciusb.conf +++ b/rom/usb/pciusb/pciusb.conf @@ -1,5 +1,5 @@ ##begin config -version 1.4 +version 1.5 libbase base libbasetype struct PCIDevice libbasetypeextern struct Device diff --git a/rom/usb/pciusb/uhwcmd.c b/rom/usb/pciusb/uhwcmd.c index b0370dcc49..0c42c64fc9 100644 --- a/rom/usb/pciusb/uhwcmd.c +++ b/rom/usb/pciusb/uhwcmd.c @@ -797,7 +797,12 @@ WORD cmdControlXFerRootHub(struct IOUsbHWReq *ioreq, newval &= ~(EHPF_PORTSUSPEND|EHPF_PORTENABLE); newval |= EHPF_PORTRESET; WRITEREG32_LE(hc->hc_RegBase, portreg, newval); - uhwDelayMS(200, unit); /* Spec is 50ms, FreeBSD source suggests 200ms */ + + // Wait for reset to complete (spec is 50ms, FreeBSD source suggests 200ms, but + // we compromise to help USB volumes become available in time to be chosen as + // the boot device) + uhwDelayMS(125, unit); + newval = READREG32_LE(hc->hc_RegBase, portreg) & ~(EHPF_OVERCURRENTCHG|EHPF_ENABLECHANGE|EHPF_CONNECTCHANGE|EHPF_PORTSUSPEND|EHPF_PORTENABLE); KPRINTF(10, ("EHCI: Reset=%s\n", newval & EHPF_PORTRESET ? "BAD!" : "GOOD")); if (newval & EHPF_PORTRESET)