bd379e0771
Port the Linux 7.1 hub.c port state machine into usbhubd, replacing the minimal connect/reset handling: New module port_ops.rs (pure logic, side effects injected, 14 unit tests): - debounce_until_connected: hub_port_debounce_be_connected() port (hub.c:4696-4737) — 25ms polls, connection stable for 100ms, 2s budget, connection-change bit cleared in-loop. - wait_for_reset: hub_port_wait_reset() port (hub.c:2953-3047) — 10ms polls until RESET clears with CONNECTION set, escalate to 200ms after two short waits, 800ms budget; then 50ms TRSTRCY recovery (hub.c:3159) and C_PORT_RESET clear. Replaces the previous bare sleep(10ms). - wait_for_u0: USB 3.0 polling→U0 wait after port power-on — 36ms steps, 400ms ceiling (tPollingLFPSTimeout = 360ms; Linux hub.c:1226 debounce path). - accumulate_hub_delay_ns: wHubDelay chain rule (hub.c:1507-1519: wHubDelay + parent->hub_delay + 40ns, cap 65535ns). main.rs wiring: - Port status normalized to PortStatusSnapshot (decouples the state machine from the V2/V3 wire formats; V3 link state extracted from bits 8:5). - Debounce on connection-change before attach; C_PORT_ENABLE cleared once handled (Linux port_event semantics). - Reset path uses wait_for_reset instead of sleep(10ms). - USB 3 power-on path waits for U0 before proceeding. - wHubDelay: ancestor-chain walk fetching USB 3 ancestor hub descriptors, accumulated per Linux; delivered to newly attached SuperSpeed children via SET_ISOCH_DELAY (USB 3.0 9.4.11; Linux message.c:1142 — hubs and non-SS skipped, children inherit the hub's accumulated delay verbatim per hub.c:5128-5129). - attach/detach failure logs now identify the port. hub.rs (xhcid usb module): - HubDescriptorV3 extended with device_removable: u16 — the SS hub descriptor is 12 bytes (spec Table 10-15); the old struct under-read by 2 bytes. Stale TODO corrected: SS descriptors have no PortPwrCtrlMask (that is USB 2.0-only, still unparsed). Verified: cargo check clean (0 usbhubd warnings), 14/14 usbhubd tests, xhcid unaffected (43/43 tests).