usb: don't reset an enabled SuperSpeed port; name every setup failure
Real-PC diagnose boot (photo + OCR): the boot stick connects at SuperSpeed on port 21 and 'device setup failed' lands in the SAME millisecond — an instant failure, not a timeout. setupDevice reset every port unconditionally; that is required to enable USB2 ports, but a SuperSpeed port that trained its link is ALREADY enabled (xHCI advances USB3 ports to Enabled, no reset — spec 4.3), and driving a hot reset into the live link drops PED mid-reset on real silicon. QEMU tolerates the spurious reset, which is why the harness never saw it. An enabled speed>=4 port now skips the reset (a not-yet-enabled SS link still gets one). Every setup step names its failure — port reset with the PORTSC value, Enable Slot, device-slot exhaustion, Address Device with its completion code — so the on-screen transcript of the next failure identifies the exact xHCI command instead of one blanket line. block.open's give-up window drops 60 s -> 30 s (the slowest observed healthy chain completed at ~24 s); a machine whose stick failed setup should not sit a further minute pretending otherwise.
This commit is contained in:
@@ -61,7 +61,10 @@ pub fn open() ?Device {
|
||||
// enumeration, mass-storage bring-up) must complete first, which can take
|
||||
// tens of seconds under emulation.
|
||||
var attempts: usize = 0;
|
||||
while (attempts < 1200) : (attempts += 1) {
|
||||
// 30 s covers the slowest observed healthy chain (a flaky QEMU enumeration
|
||||
// completed at ~24 s); a machine whose stick genuinely failed setup should
|
||||
// not sit a further minute pretending otherwise.
|
||||
while (attempts < 600) : (attempts += 1) {
|
||||
if (ipc.lookup(.block)) |handle| return .{ .endpoint = handle };
|
||||
system.sleep(50);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user