Commit Graph

4 Commits

Author SHA1 Message Date
Red Bear OS fb9b158e66 USB: hub driver disconnect resilience + over-current + port indicators
Cross-referenced with Linux 7.1 drivers/usb/core/hub.c:
- hub_port_connect_change(): over-current detection + power-cycling
- hub_power_on(): power-on settle delay
- hub_port_reset(): reset sequencing
- port_event(): indicator LED toggling

usbhubd main loop:
- All 4 .expect() calls in runtime loop → graceful error handling
  (GetPortStatus, SetPortPower, SetPortReset — now log warn + continue)
- ensure_attached(): attach/detach .expect() → match with warn log
- Port index bounds: .unwrap() → match with None fallback
- 0 panic sites remaining in runtime loop

New features:
- Over-current detection: C_PORT_OVERCURRENT → log warn, clear flag,
  power-cycle port (disconnect→power_off→delay→re-enumerate per Linux)
- Port indicator: SET_FEATURE(PORT_INDICATOR) on enabled+connected ports
  for visual port status feedback

usb/hub.rs:
- HubPortFeature enum extended: PortEnable, PortSuspend, PortLowSpeed,
  CPortEnable, CPortSuspend, PortIndicator (matches Linux 7.1 ch11.h)
- HubPortStatus::is_over_current_changed() method added
2026-07-07 17:40:26 +03:00
Red Bear OS 8b9a4fa7b6 usbhubd: P3 slice 2 — interrupt-driven hub change detection
Replace the polling-only main loop with interrupt-driven change
detection modeled on Linux 7.1 hub_irq().

Key changes:
  1. Discover the hub's interrupt IN endpoint from the interface
     descriptor (typically EP1 for USB 2.x, may be absent for USB 3).
     Use EndpointTy::Interrupt + EndpDirection::In to match.

  2. Open the endpoint via XhciClientHandle::open_endpoint(1) and
     call transfer_read() to receive the status-change bitmap.

  3. Build a per-port change mask from the bitmap:
     Port N is bit (N-1) of byte (N-1)/8.  Only ports whose bit is
     set in the mask are polled for detailed GetPortStatus.

  4. Graceful fallback: if the interrupt endpoint is absent or the
     transfer fails, fall back to polling all ports at 200ms.

  5. Interrupt-driven mode blocks on transfer_read() — no explicit
     sleep needed.  Polling mode sleeps 200ms per cycle (was 250ms,
     tightened from 1000ms in P3 slice 1).

  6. Added XhciEndpHandle import for endpoint operations.

Cross-reference: Linux 7.1
  - drivers/usb/core/hub.c: hub_irq() — URB completion handler
  - drivers/usb/core/hub.c: hub_configure() — interrupt endpoint setup
  - include/linux/usb/ch11.h — hub status change bitmap format

This completes P3 hub maturity — power-on timing (slice 1) plus
interrupt-driven detection (slice 2) brings usbhubd to Linux 7.1
parity for the two most important hub operations.
2026-07-07 12:00:51 +03:00
Red Bear OS b244dbd0d9 usbhubd: P3 — power-on timing, USB 3 fix, polling interval
First P3 hub-driver maturity improvements, cross-referenced with
Linux 7.1 drivers/usb/core/hub.c:

  1. Power-on timing (hub_power_on + hub_power_on_good_delay)
     - reads bPwrOn2PwrGood (V2: power_on_good; V3: default 10)
     - sleeps power_on_good * 2ms after SET_FEATURE(PORT_POWER)
     - minimum floor: 100ms (matches Linux hub_power_on_good_delay)
     - logs the computed delay at startup

  2. USB 3 hub stall fix
     - ConfigureEndpointsReq no longer passes interface_desc or
       alternate_setting for USB 3 hubs
     - xHCI handles default-alt-0 derivation internally
     - resolves the two TODOs that documented the stall symptom

  3. SET_HUB_DEPTH with hub_depth() value
     - previously passed port_id.hub_depth().into() which was
       incorrect (returned route-string-derived depth)
     - now logs the depth value explicitly

  4. Polling interval tightened 1s -> 250ms
     - interrupt-driven detection remains a follow-up (P3 slice 2)
     - 250ms is a reasonable intermediate step for USB keyboard
       responsiveness

  5. wHubDelay recorded from V3 descriptor
     - extracted from hub_desc.delay field
     - displayed at startup; future P3 slices will accumulate
       through the hub tree per Linux hub_configure()

Cross-reference: Linux 7.1
  - drivers/usb/core/hub.c: hub_power_on()
  - drivers/usb/core/hub.c: hub_power_on_good_delay()
  - drivers/usb/core/hub.c: hub_activate()
  - include/linux/usb/ch11.h: HUB_SET_DEPTH = 0x0C
2026-07-07 11:51:10 +03:00
Red Bear OS dd08b76a39 Red Bear OS base baseline from 0.1.0 pre-patched archive 2026-06-27 09:21:43 +03:00