Files
RedBear-OS/local/docs/USB-VALIDATION-RUNBOOK.md
T
vasilito 1bc5f8ac88 docs: USB v3 plan + runbook — first-class-citizen roadmap
v3 USB-IMPLEMENTATION-PLAN supersedes v2 (archived).  Comprehensive
audit-driven roadmap with 9 phases (P1–P9) to make USB a first-class
citizen in Red Bear OS:

  P1: Trait unification (all 4 controllers implement UsbHostController)
      + panic hardening (usbscsid 0 panics, xhcid <20 unwraps)
      + remove 3 empty stubs (usbaudiod, acmd, ecmd)
  P2: xHCI core — 51-quirk table, HCCPARAMS2 parsing, 36-code error
      recovery (babble, transaction error, stall, split)
  P3: Hub driver — full enumeration (wHubDelay, power timing, USB 3 SS)
      + interrupt-driven change detection + port LED
  P4: Storage — UAS protocol, multi-LUN, SYNCHRONIZE_CACHE, UNMAP, mass-storage
      quirks applied at runtime
  P5: HID — report descriptor parser, usage→evdev mapping, LED sync, quirks,
      multi-touch
  P6: Class driver completeness — CDC ACM, CDC NCM, USB Audio, USB-serial
      (FTDI/CP210x/PL2303/CH341), compliance test driver
  P7: Power management — USB 2.0 LPM, USB 3.0 U1/U2/U3, runtime PM autosuspend
  P8: Validation — hardware matrix ≥10 rows + 6 new QEMU scripts
      + error-injection tests
  P9: Modern USB scope ADR (host-only; already written in v2 §12)

Linux 7.1 is the implementation of excellence — every feature has a
concrete cross-reference (file:line) and a 'port line-by-line' strategy
when implementation detail is in doubt.

USB-VALIDATION-RUNBOOK v3 replaces v2 (archived): test matrix with
per-phase exit gates, operator runbook for failures.

Stale items cleared:
  - v2 active plan archived as USB-IMPLEMENTATION-PLAN-v2-2026-07.md
  - v2 active runbook archived as USB-VALIDATION-RUNBOOK-2026-07.md
  - archived/README.md supersession table extended
2026-07-07 05:21:35 +03:00

5.8 KiB

Red Bear OS USB Validation Runbook — v3

Companion to local/docs/USB-IMPLEMENTATION-PLAN.md v3. This runbook tells operators how to validate USB on a Red Bear build.

Validation matrix

Script What it validates Maturity target
test-xhci-irq-qemu.sh --check xHCI interrupt-driven reactor path (line 208 of irq_reactor.rs) validated-QEMU
test-xhci-device-lifecycle-qemu.sh --check bounded USB attach/detach for HID + storage validated-QEMU
test-usb-qemu.sh full USB stack (xHCI + keyboard + tablet + storage) validated-QEMU
test-usb-storage-qemu.sh usbscsid autospawn + sector write+readback+restore validated-QEMU
test-usb-runtime.sh guest + QEMU mode dispatch harness harness only
test-usb-maturity-qemu.sh aggregate runner — calls the five above in sequence runner
test-uhci-runtime-qemu.sh --check (P1-B) UHCI controller enumeration on legacy QEMU machine validated-QEMU (P1-B)
test-ohci-runtime-qemu.sh --check (P1-B) OHCI controller enumeration on legacy QEMU machine validated-QEMU (P1-B)
test-ehci-class-autospawn-qemu.sh --check (P1-A) USB keyboard on EHCI route reaches inputd validated-QEMU (P1-A)
test-usb-hub-qemu.sh --check (P3-A) USB hub enumeration including power timing + wHubDelay validated-QEMU (P3-A)
test-usb-error-recovery-qemu.sh --check (P8-C) hot-unplug mid-transfer — graceful error, no panic validated-QEMU (P8-C)
test-usb-uas-qemu.sh --check (P4-A) USB 3.0 storage UAS path active validated-QEMU (P4-A)

A row's last-passed ISO date goes in local/docs/HARDWARE-VALIDATION-MATRIX.md.

Path A — Host-side QEMU validation

Pre-flight

# Confirm the build is fresh
./local/scripts/build-redbear.sh --upstream redbear-mini
ls build/x86_64/redbear-mini/harddrive.img

Run aggregate

./local/scripts/test-usb-maturity-qemu.sh redbear-mini

This runs all five existing QEMU tests in sequence and reports a single pass/fail.

Run individual

# Interrupt-mode proof (must show "Running IRQ reactor with IRQ file
# and event queue" in the boot log; must NOT show "in polling mode").
./local/scripts/test-xhci-irq-qemu.sh --check

# Storage write+readback+restore (sector 2048; expects
# [PASS] STORAGE_DISCOVERY + STORAGE_WRITE + STORAGE_READBACK +
# STORAGE_RESTORE).
./local/scripts/test-usb-storage-qemu.sh

# Lifecycle proof (QEMU monitor-driven attach/detach).
./local/scripts/test-xhci-device-lifecycle-qemu.sh --check

What it validates vs. claims

Claim Evidence
xhcid runs interrupt-driven [RUNNING] IRQ reactor with IRQ file and event queue in log
usbscsid auto-spawns on storage attach usbscsid: scheme event or [redbear-usb-storage-check] STORAGE_DISCOVERY: disk.usb-...
Storage read+write works [PASS] STORAGE_WRITE: + [PASS] STORAGE_READBACK: + [PASS] STORAGE_RESTORE:
HID auto-spawns on keyboard attach usbhidd: registered producer in log
No panics absence of panic|crash|abort|RUST_BACKTRACE in log

Path B — In-guest manual validation

Boot the image and check:

# Inside the guest:
ls /scheme/usb*        # host controllers' scheme namespaces
lsusb                  # walker (in redbear-hwutils package)
redbear-usb-check      # pass/fail scheme validator

A healthy USB stack shows:

  • /scheme/usb.0000:XX:XX.X_xhci/ (xhcid port directory)
  • /scheme/usb/ (ehcid port directory)
  • /scheme/disk.usb-...+...-scsi/ (usbscsid disk)
  • /scheme/input/... (usbhidd device)

Path C — Bare-metal hardware validation (P8-A)

For each (controller, class, board) tuple in HARDWARE-VALIDATION-MATRIX.md:

# On the bare-metal host:
./local/scripts/build-redbear.sh <config>
dd if=build/x86_64/<config>/harddrive.img of=/dev/<target> bs=4M status=progress
# Boot; capture serial console
minicom -D /dev/ttyUSB0 -b 115200 -C capture.bin

# In the captured console:
redbear-info --verbose
lsusb
redbear-usb-check

Required test points (per row in the matrix):

  1. Controller PCI ID detected
  2. Specific class test (HID keypress, storage read+write, etc.)
  3. Hot-plug works
  4. Suspend/resume works (if device supports)

Update the matrix row: last_tested = <ISO date>, result = pass|fail|partial.

Operator runbook for failures

If test-xhci-irq-qemu.sh reports polling-mode:

# Check the boot log for the interrupt path:
grep "IRQ reactor" build/x86_64/redbear-mini/xhci-irq-check.log
# If "in polling mode" appears, xHCI interrupts are bypassed.
# Check the base fork commit:
git -C local/sources/base log --oneline drivers/usb/xhcid/src/main.rs | head -5
# Confirm commit cbd40e0d (or later) is in the merge base.

If test-usb-storage-qemu.sh reports a panic:

# Find the panic site:
grep -n 'panic\|unwrap\|expect' build/x86_64/redbear-mini/usb-storage-check.log
# Cross-reference to usbscsid:
grep -rn 'panic!' local/sources/base/drivers/storage/usbscsid/src/
# After P1-B is complete, no panic sites should exist.

If a USB device is not auto-spawning:

# Check if the class driver is wired in the configs:
grep -A2 "redbear-acmd\|redbear-ecmd\|redbear-usbaudiod" config/redbear-mini.toml
# Cross-check drivers.d:
cat local/config/drivers.d/70-usb-class.toml
# After P1-A, all four controllers should auto-spawn via the unified trait.

Validation cadence

  • On every release branch cut: run all QEMU tests; update matrix with last-tested dates.
  • On every P-phase completion: add the new test scripts to the matrix.
  • Monthly: if any operator has bare-metal access, add one hardware row.

See also

  • local/docs/USB-IMPLEMENTATION-PLAN.md v3 — the plan this runbook validates
  • local/docs/HARDWARE-VALIDATION-MATRIX.md — the matrix this runbook populates
  • local/scripts/test-usb-maturity-qemu.sh — the aggregate entry point