From efd745c073cc4124c143eddb90f645b85cd8b2ec Mon Sep 17 00:00:00 2001 From: vasilito Date: Sat, 18 Jul 2026 23:15:00 +0900 Subject: [PATCH] docs: USB/quirks/low-level doc consolidation + P2-C recovery completion MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Documentation pass (staleness audit across 5 docs): USB-IMPLEMENTATION-PLAN.md: - P2-A marked COMPLETE (canonical 51-flag table in redox-driver-sys, ~85 entries, real HCIVERSION reads, BROKEN_MSI pre-gate) - P2-C marked CORE COMPLETE: full 36-code recovery matrix documented (maybe_recover_transfer_error scheme.rs:559-925) with Linux xhci-ring.c equivalences, restart_endpoint bug fixes, known simplifications, and remaining P8-C injection-test scope - Gap table corrected (quirks done, error recovery core done, PM substrate) - P7-A corrected: HLC lives in Supported Protocol capability port_info DWORD, NOT HCCPARAMS1 (driver bug fixed in P2-B) - §12 rewritten: runbook is live v3, not archived; lineage consolidated IRQ-AND-LOWLEVEL-CONTROLLERS-ENHANCEMENT-PLAN.md: - xHCI section rewritten: 'restored' -> hardened/gated (BROKEN_MSI pre-gate, quirk convergence, real HCIVERSION, handle/method agreement) - Priority 6 refocused from 'keep path healthy' to runtime validation (BROKEN_MSI controller proof, event-ring under sustained load) - 26 stale recipes/core/*/source paths -> local/sources/* fork paths - duplicate ACPI-IMPROVEMENT-PLAN.md reference removed - xhcid evidence class upgraded to quirk-hardened - USB plan cross-reference added (feature ownership boundary) QUIRKS-AUDIT.md: - xHCI tombstone removed: lookup_xhci_controller_quirks_full is now a real implementation over XHCI_QUIRK_TABLE (was stub returning empty()) - 'broken TOML mappings' section marked RESOLVED (all 4 flag names now in PCI_FLAG_NAMES) - Implementation-status section re-assessed: xhcid consumes 51-flag XhciControllerQuirkFlags in ~40 paths (was: only PciQuirkFlags) - test inventory +38 xhci_table.rs tests QUIRKS-SYSTEM.md: - xhci_table.rs added to compiled-in tables inventory and file layout - implementation status: canonical xHCI table row added (P2-A) - driver consumption: xhcid xHCI-controller-path flag list documented QUIRKS-IMPROVEMENT-PLAN.md: - Task 3.1 (USB device quirks in xhcid) marked DONE (13 flags consumed) - exit criteria 3/4/5/7 marked met; deliverables 1/3/4 completed - reassessment summary updated for XhciControllerQuirkFlags consumption Also: chmod +x test-xhci-irq-qemu.sh, test-msix-qemu.sh, test-usb-storage-qemu.sh (were non-executable). Track base pointer to 26000333 (P2-C restart_endpoint fixes). --- ...D-LOWLEVEL-CONTROLLERS-ENHANCEMENT-PLAN.md | 106 ++++++------ local/docs/QUIRKS-AUDIT.md | 49 +++--- local/docs/QUIRKS-IMPROVEMENT-PLAN.md | 35 +++- local/docs/QUIRKS-SYSTEM.md | 12 +- local/docs/USB-IMPLEMENTATION-PLAN.md | 151 ++++++++++++------ local/scripts/test-msix-qemu.sh | 0 local/scripts/test-usb-storage-qemu.sh | 0 local/scripts/test-xhci-irq-qemu.sh | 0 local/sources/base | 2 +- 9 files changed, 231 insertions(+), 124 deletions(-) mode change 100644 => 100755 local/scripts/test-msix-qemu.sh mode change 100644 => 100755 local/scripts/test-usb-storage-qemu.sh mode change 100644 => 100755 local/scripts/test-xhci-irq-qemu.sh diff --git a/local/docs/IRQ-AND-LOWLEVEL-CONTROLLERS-ENHANCEMENT-PLAN.md b/local/docs/IRQ-AND-LOWLEVEL-CONTROLLERS-ENHANCEMENT-PLAN.md index 2065b1db2c..645a1f54b2 100644 --- a/local/docs/IRQ-AND-LOWLEVEL-CONTROLLERS-ENHANCEMENT-PLAN.md +++ b/local/docs/IRQ-AND-LOWLEVEL-CONTROLLERS-ENHANCEMENT-PLAN.md @@ -26,11 +26,10 @@ It is grounded in the current repository state, especially: - `local/recipes/drivers/linux-kpi/` - `local/recipes/gpu/redox-drm/` - `local/recipes/system/iommu/` -- `recipes/core/kernel/source/src/acpi/` -- `recipes/core/base/source/drivers/acpid/` +- `local/sources/kernel/src/acpi/` +- `local/sources/base/drivers/acpid/` - `local/docs/IOMMU-SPEC-REFERENCE.md` - `local/docs/ACPI-IMPROVEMENT-PLAN.md` -- `local/docs/ACPI-IMPROVEMENT-PLAN.md` - `docs/04-LINUX-DRIVER-COMPAT.md` The goal is not to restate that these pieces compile, but to separate: @@ -57,22 +56,22 @@ out explicitly below. | Area | Primary owner | Main entry points | Current evidence class | |---|---|---|---| -| LAPIC / xAPIC / x2APIC | kernel | `recipes/core/kernel/source/src/acpi/madt/`, `arch/x86_shared/device/local_apic.rs` | source + local patch + boot/runtime evidence | -| IOAPIC / IRQ overrides | kernel | `recipes/core/kernel/source/src/arch/x86_shared/device/ioapic.rs`, MADT ISO parsing | source | +| LAPIC / xAPIC / x2APIC | kernel | `local/sources/kernel/src/acpi/madt/`, `arch/x86_shared/device/local_apic.rs` | source + local patch + boot/runtime evidence | +| IOAPIC / IRQ overrides | kernel | `local/sources/kernel/src/arch/x86_shared/device/ioapic.rs`, MADT ISO parsing | source | | Legacy PIC | kernel | `arch/x86_shared/device/pic.rs` | source | -| ACPI power/reset methods | userspace `acpid` | `recipes/core/base/source/drivers/acpid/src/acpi.rs` plus local base patch | source + local patch + runtime evidence | -| HPET / timer tables | kernel | `recipes/core/kernel/source/src/acpi/hpet.rs` | source | -| PIT fallback timer | kernel | `recipes/core/kernel/source/src/arch/x86_shared/device/mod.rs`, `pit.rs` | source | -| PCI interrupt plumbing | userspace `pcid` / driver layer | `recipes/core/base/source/drivers/pci/`, `scheme:irq`, `scheme:pci` | source + runtime evidence | +| ACPI power/reset methods | userspace `acpid` | `local/sources/base/drivers/acpid/src/acpi.rs` plus local base patch | source + local patch + runtime evidence | +| HPET / timer tables | kernel | `local/sources/kernel/src/acpi/hpet.rs` | source | +| PIT fallback timer | kernel | `local/sources/kernel/src/arch/x86_shared/device/mod.rs`, `pit.rs` | source | +| PCI interrupt plumbing | userspace `pcid` / driver layer | `local/sources/base/drivers/pci/`, `scheme:irq`, `scheme:pci` | source + runtime evidence | | Driver IRQ abstraction | `redox-driver-sys` | `local/recipes/drivers/redox-driver-sys/source/src/irq.rs` | source | | Linux IRQ compatibility | `linux-kpi` | `local/recipes/drivers/linux-kpi/source/` headers | source | | GPU MSI/MSI-X usage | `redox-drm` | `local/recipes/gpu/redox-drm/source/` | source + build evidence | | IOMMU / interrupt remapping | `iommu` daemon | `local/recipes/system/iommu/source/src/main.rs`, `local/docs/IOMMU-SPEC-REFERENCE.md` | source + build evidence | -| Kernel serio / PS2 path | kernel `serio` + userspace `ps2d` | `recipes/core/kernel/source/src/scheme/serio.rs`, `recipes/core/base/source/drivers/input/ps2d/src/main.rs` | source | +| Kernel serio / PS2 path | kernel `serio` + userspace `ps2d` | `local/sources/kernel/src/scheme/serio.rs`, `local/sources/base/drivers/input/ps2d/src/main.rs` | source | | Input controller path | `inputd` / `evdevd` / `udev-shim` | base driver + local system recipes | source + runtime evidence | -| USB xHCI host controller | userspace `xhcid` | `recipes/core/base/source/drivers/usb/xhcid/src/main.rs` | source + build evidence | +| USB xHCI host controller | userspace `xhcid` | `local/sources/base/drivers/usb/xhcid/src/main.rs` | source + build evidence + quirk-hardened | | Port I/O / legacy controller access | kernel + `redox-driver-sys` | `iopl`, `io.rs`, legacy driver code | source | -| Legacy IRQ dispatch / ownership map | kernel | `recipes/core/kernel/source/src/arch/x86_shared/interrupt/irq.rs` | source | +| Legacy IRQ dispatch / ownership map | kernel | `local/sources/kernel/src/arch/x86_shared/interrupt/irq.rs` | source | ## Current State Summary @@ -262,7 +261,7 @@ especially under real runtime scenarios. **State**: materially complete for the historical boot-baseline bring-up goals, but not release-grade complete. **Important source note**: the checked-in MADT parser in -`recipes/core/kernel/source/src/acpi/madt/mod.rs` visibly handles `LocalApic`, `IoApic`, +`local/sources/kernel/src/acpi/madt/mod.rs` visibly handles `LocalApic`, `IoApic`, `IntSrcOverride`, `Gicc`, and `Gicd`. Additional x2APIC/NMI support referenced elsewhere in the repo is currently evidenced through the local patch set and prior validation notes rather than the plain source snapshot alone. @@ -287,8 +286,8 @@ Open enhancement items: Concrete checked-in owner: -- `recipes/core/kernel/source/src/arch/x86_shared/device/ioapic.rs` -- `recipes/core/kernel/source/src/acpi/madt/mod.rs` +- `local/sources/kernel/src/arch/x86_shared/device/ioapic.rs` +- `local/sources/kernel/src/acpi/madt/mod.rs` Open enhancement items: @@ -301,7 +300,7 @@ Open enhancement items: Concrete checked-in owner: -- `recipes/core/kernel/source/src/acpi/hpet.rs` +- `local/sources/kernel/src/acpi/hpet.rs` Open enhancement items: @@ -314,8 +313,8 @@ Open enhancement items: Concrete checked-in owner: -- `recipes/core/kernel/source/src/arch/x86_shared/device/mod.rs` -- `recipes/core/kernel/source/src/arch/x86_shared/device/pit.rs` +- `local/sources/kernel/src/arch/x86_shared/device/mod.rs` +- `local/sources/kernel/src/arch/x86_shared/device/pit.rs` Current behavior: @@ -380,7 +379,7 @@ controller discussions. Concrete checked-in owner: -- `recipes/core/kernel/source/src/arch/x86_shared/interrupt/irq.rs` +- `local/sources/kernel/src/arch/x86_shared/interrupt/irq.rs` Current covered paths include: @@ -402,8 +401,8 @@ later `evdevd`/`udev-shim` stack. Concrete checked-in owner: -- `recipes/core/kernel/source/src/scheme/serio.rs` -- `recipes/core/base/source/drivers/input/ps2d/src/main.rs` +- `local/sources/kernel/src/scheme/serio.rs` +- `local/sources/base/drivers/input/ps2d/src/main.rs` Current behavior: @@ -424,26 +423,39 @@ Open enhancement items: ### USB xHCI controller interrupt path -**State**: present, but not honestly interrupt-complete in the checked-in source. +**State**: interrupt-driven and quirk-hardened (2026-07-18); not yet hardware-validated. Concrete checked-in owner: -- `recipes/core/base/source/drivers/usb/xhcid/src/main.rs` +- `local/sources/base/drivers/usb/xhcid/src/main.rs` Current behavior: -- xHCI has MSI/MSI-X and legacy INTx detection logic in source -- the checked-in `xhcid` source now calls the existing `get_int_method` path again instead of - hardwiring polling, and it logs whether it selected MSI/MSI-X, legacy INTx, or polling -- `local/scripts/test-xhci-irq-qemu.sh --check` now provides a repo-visible runtime proof path by +- quirks are resolved **before** interrupt-method selection: the PCI vendor/device/revision and + the real HCIVERSION (read from MMIO offset 0x04, mirroring Linux `xhci_gen_setup()` + xhci.c:5455) feed the canonical quirk lookup in `redox-driver-sys` +- the `BROKEN_MSI` quirk skips MSI/MSI-X probing **entirely inside `get_int_method()`**, so the + returned interrupt handle and the delivery method always agree — the earlier handle/method + mismatch class (MSI handle with INTx label) is eliminated +- MSI/MSI-X/legacy INTx/polling selection is logged per controller, plus the full quirk bitmask + (`XHCI quirks: vendor=… device=… rev=… hci_ver=… -> 0x…`) +- `local/scripts/test-xhci-irq-qemu.sh --check` provides a repo-visible runtime proof path by booting a Red Bear image in QEMU and checking the xHCI interrupt-mode log output -- `redox-driver-sys` now logs allocated MSI-X vectors so interrupt selection is more observable in +- `redox-driver-sys` logs allocated MSI-X vectors so interrupt selection is observable in runtime logs +Related work owned by the USB plan (not duplicated here): the 51-flag canonical xHCI quirk +table (P2-A) and HCCPARAMS2 capability gating (P2-B) — see +`local/docs/USB-IMPLEMENTATION-PLAN.md` § P2. This section covers only interrupt-path quality. + Open enhancement items: -- validate the restored interrupt path beyond early boot/logging, especially event-ring behavior -- validate the checked-in event-ring growth path under sustained runtime/device activity +- validate BROKEN_MSI pre-gate correctness on a controller that actually carries the quirk + (requires matching hardware or a mock) +- validate event-ring behavior under sustained runtime/device activity (growth path, wrap + handling, re-entrancy with the now-guaranteed handle/method agreement) +- re-run `test-xhci-irq-qemu.sh --check` after P2-A/P2-B to confirm the hardened path + still passes ### Port I/O / legacy controller support @@ -451,7 +463,7 @@ Open enhancement items: Concrete current consumers/owners include: -- legacy PIC handling in `recipes/core/kernel/source/src/arch/x86_shared/device/pic.rs` +- legacy PIC handling in `local/sources/kernel/src/arch/x86_shared/device/pic.rs` - port-I/O wrappers in `local/recipes/drivers/redox-driver-sys/source/src/io.rs` - ACPI reset fallback via keyboard-controller port writes in the base/acpid patch path documented in `local/docs/ACPI-IMPROVEMENT-PLAN.md` @@ -569,28 +581,32 @@ Why fifth: Important, but less immediately blocking than MSI-X and IOMMU. -## Priority 6 — xHCI interrupt-path hardening +## Priority 6 — xHCI interrupt-path runtime validation This is Priority 6 **within the low-level controller plan itself**, not within the repository-wide subsystem order. At the repo-wide level, low-level controller quality remains ahead of USB/Wi-Fi/ Bluetooth because these later subsystems depend on the controller/runtime proof work documented here. -Goal: keep USB host-controller operation on the restored interrupt-driven path and harden the proof -surface beyond the current narrow QEMU validation. +Goal: validate the now-hardened xHCI interrupt path beyond the current narrow QEMU proof. + +Status (2026-07-18): the interrupt path is no longer merely "restored" — P2-A resolved quirks +before interrupt-method selection (BROKEN_MSI pre-gate, handle/method agreement guaranteed) and +P2-B gated xHCI 1.1+ features on real capability registers. The remaining gap is **validation**, +not implementation. Deliverables: -- keep the actual `get_int_method` path in `xhcid` healthy -- validate MSI/MSI-X or INTx behavior for xHCI on real hardware and/or QEMU -- update docs so USB controller quality is not overstated while broader runtime and hardware - validation remain open +- validate MSI/MSI-X or INTx behavior for xHCI on real hardware and/or QEMU, including at least + one BROKEN_MSI-flagged controller or an injected-quirk mock +- validate event-ring behavior under sustained IRQ load (growth, wrap, multiple interrupters) +- re-run `test-xhci-irq-qemu.sh --check` after each xHCI interrupt-path change Why sixth: -This remains a real completeness gap in an important low-level controller, but it is now narrower in -scope than the cross-cutting MSI-X and IOMMU priorities above because the interrupt path itself is -already restored and QEMU-proven. +This remains a real completeness gap in an important low-level controller, but it is now narrower +in scope than the cross-cutting MSI-X and IOMMU priorities above because the interrupt path itself +is hardened and QEMU-proven; only broader runtime/hardware validation remains open. ## Execution Plan @@ -606,8 +622,8 @@ helper hardening comes before broad driver cleanup, and runtime-proof/observabil **Primary targets** -- `recipes/core/base/source/drivers/pcid/src/{main,scheme,driver_handler}.rs` -- `recipes/core/base/source/drivers/pcid-spawner/src/main.rs` +- `local/sources/base/drivers/pcid/src/{main,scheme,driver_handler}.rs` +- `local/sources/base/drivers/pcid-spawner/src/main.rs` **Implemented** @@ -643,7 +659,7 @@ helper hardening comes before broad driver cleanup, and runtime-proof/observabil - msi.rs: MSI-X BAR mapping null pointer returns MsixMapError::NullPointer - config.rs: vendor ID parse uses proper error handling -- `recipes/core/base/source/drivers/pcid/src/driver_interface/{bar,cap,config,irq_helpers,msi,mod}.rs` +- `local/sources/base/drivers/pcid/src/driver_interface/{bar,cap,config,irq_helpers,msi,mod}.rs` **Implement** @@ -682,7 +698,7 @@ helper hardening comes before broad driver cleanup, and runtime-proof/observabil **Primary targets** -- `recipes/core/base/source/drivers/virtio-core/src/{probe,transport,arch/x86}.rs` +- `local/sources/base/drivers/virtio-core/src/{probe,transport,arch/x86}.rs` **Acceptance** diff --git a/local/docs/QUIRKS-AUDIT.md b/local/docs/QUIRKS-AUDIT.md index a3e8bfbd67..79103e7ebf 100644 --- a/local/docs/QUIRKS-AUDIT.md +++ b/local/docs/QUIRKS-AUDIT.md @@ -84,7 +84,8 @@ that `redox-driver-sys` reads. **See DMI duplication issue below.** | File | What | |------|------| -| `local/recipes/drivers/redox-driver-sys/source/src/quirks/mod.rs` | 11 unit tests for table matching, 1 USB test | +| `local/recipes/drivers/redox-driver-sys/source/src/quirks/mod.rs` | 11 unit tests for table matching, 1 USB test, plus XhciQuirkEntry matching tests | +| `local/recipes/drivers/redox-driver-sys/source/src/quirks/xhci_table.rs` | 38 unit tests covering every xHCI controller vendor family (added 2026-07-18) | | `local/recipes/drivers/redox-driver-sys/source/src/quirks/toml_loader.rs` | 3 DMI rule tests | | `local/recipes/gpu/redox-drm/source/src/drivers/interrupt.rs` | `force_legacy_irq_only_triggers_on_quirk` test | @@ -97,26 +98,23 @@ These are **defined in the type system** but the function body returns | Function | Location | Status | |----------|----------|--------| | `lookup_pci_quirks_full` | `quirks/mod.rs:541` | Returns `PciQuirkLookup { flags, actions: vec![] }` — `actions` is always empty. The `QuirkAction` enum (`WriteConfigByte`, `AndOrMask`, `NamedCallback`, etc.) is fully designed but never populated. | -| `lookup_xhci_controller_quirks_full` | `quirks/mod.rs:564` | Stub — returns `XhciControllerQuirkFlags::empty()`. Ignores all 3 arguments. The 7-flag type is fully defined. | +| ~~`lookup_xhci_controller_quirks_full`~~ | `quirks/mod.rs` | **RESOLVED 2026-07-18 (P2-A).** Real implementation iterating `XHCI_QUIRK_TABLE` (~85 entries in `xhci_table.rs`) with vendor/device/revision/hci_version matching. The type is now 51 flags (Linux 7.1 `xhci.h:1587-1649` parity), consumed by xhcid via a thin re-export shim. | | `lookup_hid_quirks` | `quirks/mod.rs:585` | Stub — returns `HidQuirkFlags::empty()`. The 5-flag type is fully defined. | | `load_dmi_acpi_quirks` | `quirks/dmi.rs:485` | Stub — returns `AcpiQuirkFlags::empty()`. The 16-flag type is fully defined. | | `load_platform_dmi_quirks` | `quirks/dmi.rs:434` | Stub — returns empty. The `PlatformDmiQuirkRule` type with `PlatformSubsystem { Acpi, Pci, Drm }` is fully defined. `PLATFORM_RULES` table is empty. | | `load_drm_panel_orientation` | `quirks/dmi.rs` | `PANEL_ORIENTATION_TABLE` is empty — `DrmPanelOrientation::Normal` is always returned. | -None of these are called from anywhere in the source tree at this time. +None of these (except the resolved xHCI entry) are called from anywhere in the source tree at this time. -## Flags with broken TOML mappings +## Flags with broken TOML mappings — RESOLVED (2026-07-18) -`PCI_FLAG_NAMES` (in `toml_loader.rs`) does not include mappings for the +~~`PCI_FLAG_NAMES` (in `toml_loader.rs`) does not include mappings for the following `PciQuirkFlags` variants added in commit `5916b2473` (2026-06-18): -`no_pm_reset`, `no_flr`, `broken_intx_masking`, `no_pme`. +`no_pm_reset`, `no_flr`, `broken_intx_masking`, `no_pme`.~~ -**Effect:** `[[pci_quirk]]` entries in `/etc/quirks.d/*.toml` cannot set these -flags by name. A TOML file using any of them will log -`quirks: : unknown pci quirk flag ''` and skip the flag, but the -rest of the entry's flags still apply. **The flag definition exists; the -TOML name string is missing.** This is a 1-line fix per missing flag in -`PCI_FLAG_NAMES`. +All four flag names are now present in `PCI_FLAG_NAMES` (`toml_loader.rs`) and +their `PciQuirkFlags` definitions (`mod.rs`). `[[pci_quirk]]` TOML entries can +set them by name. This audit finding is obsolete. ## DMI duplication @@ -184,25 +182,28 @@ The entries themselves are correct PCI device IDs (verified against device boots with one of these, the kernel will see if the suggested quirk resolves the issue. None have been validated against field reports. -## Implementation Status — what the doc understates +## Implementation Status — 2026-07-18 re-assessment -The `## Implementation Status` section in `QUIRKS-SYSTEM.md` overstates -completion in two places: +The `## Implementation Status` section in `QUIRKS-SYSTEM.md` previously +understated completion in two places. Both are now resolved: -- **Q3 "xhcid PCI controller quirks"** is marked ✅ Done. The `XhciControllerQuirkFlags` - type is defined, `lookup_xhci_controller_quirks_full` is wired, but the - lookup function returns `XhciControllerQuirkFlags::empty()`. **xhcid does - not actually consume XhciControllerQuirkFlags — it consumes regular - `PciQuirkFlags` (NO_MSI, NO_MSIX, FORCE_LEGACY_IRQ, RESET_DELAY_MS).** +- **Q3 "xhcid PCI controller quirks"** ✅ **Resolved 2026-07-18 (P2-A/P2-B).** + `lookup_xhci_controller_quirks_full` is a real implementation over the + ~85-entry `XHCI_QUIRK_TABLE`; `XhciControllerQuirkFlags` covers all 51 + Linux 7.1 flags. xhcid consumes them via a thin re-export shim and acts on + them in ~40 code paths (BROKEN_MSI inside `get_int_method`, ZERO_64B_REGS, + BROKEN_STREAMS, HW_LPM_DISABLE / LPM_SUPPORT, RESET_ON_RESUME, NO_SOFT_RETRY, + EP_LIMIT_QUIRK, etc.) — in addition to the regular `PciQuirkFlags` + (NO_MSI, NO_MSIX, FORCE_LEGACY_IRQ, RESET_DELAY_MS). - **Q3 "xhcid USB device quirks"** is marked ✅ Done. The `UsbQuirkFlags` type has 22 flags but only 13 are consumed by xhcid. The other 9 are infrastructure-only — they propagate to the daemon but xhcid does not - act on them. + act on them. (Unchanged by P2-A/P2-B; still accurate.) -The corrected status is: **the type system and TOML pipeline are complete -end-to-end, but ~3 entry points are defined-but-empty (see Tombstones -section above) and ~4 flag names are missing from the TOML schema.** +The corrected status is: **the type system, TOML pipeline, and xHCI +controller quirk table are complete end-to-end; remaining defined-but-empty +entry points are listed in the Tombstones section above.** ## Verifying quirks is "properly initialized and utilized" — the answer diff --git a/local/docs/QUIRKS-IMPROVEMENT-PLAN.md b/local/docs/QUIRKS-IMPROVEMENT-PLAN.md index c918731e4f..f675926790 100644 --- a/local/docs/QUIRKS-IMPROVEMENT-PLAN.md +++ b/local/docs/QUIRKS-IMPROVEMENT-PLAN.md @@ -54,7 +54,7 @@ It is based on the current in-tree state of: - `redox-driver-sys` owns the canonical PCI/USB quirk flag definitions and lookup helpers. - `redox-drm` consumes PCI quirks for interrupt fallback and `DISABLE_ACCEL`. -- `xhcid` consumes PCI controller quirks via `PCI_QUIRK_FLAGS` for IRQ mode selection and reset delay. +- `xhcid` consumes PCI controller quirks via `PCI_QUIRK_FLAGS` for IRQ mode selection and reset delay, and (since 2026-07-18, P2-A) the canonical 51-flag `XhciControllerQuirkFlags` table (~85 entries, Linux 7.1 port) for BROKEN_MSI/streams/LPM/reset/ring-sizing behavior across ~40 code paths. - `linux-kpi` exposes `pci_get_quirk_flags()` / `pci_has_quirk()` for C drivers, and amdgpu now consumes them in its Redox init path. - `lspci` and `lsusb` surface active PCI/USB quirk flags for discovered devices. - `redbear-info --quirks` reports configured TOML entries and DMI rule counts. @@ -209,7 +209,26 @@ QA: ### Wave 3 — Real driver integration -#### Task 3.1: Integrate USB device quirks in `xhcid` +#### Task 3.1: Integrate USB device quirks in `xhcid` ✅ DONE + +Verified complete (see `QUIRKS-SYSTEM.md` § driver consumption): `xhcid` calls +`lookup_usb_quirks()` during enumeration and acts on 13 device-level flags in +concrete branches — `NO_STRING_FETCH`, `BAD_DESCRIPTOR`, `RESET_DELAY`, +`HUB_SLOW_RESET`, `NO_BOS`, `SHORT_SET_ADDR_TIMEOUT`, `FORCE_ONE_CONFIG`, +`HONOR_BNUMINTERFACES`, `DELAY_CTRL_MSG`, `NO_SET_CONFIG`, `NO_SET_INTF`, +`NEED_RESET`, `NO_SUSPEND` — covering descriptor reads, SetConfiguration +gating, LPM/suspend gating, and reset paths. The success criteria below are +all met. + +Additionally, since 2026-07-18 (P2-A/P2-B) the **controller** side is +integrated too: `xhcid` consumes the canonical 51-flag +`XhciControllerQuirkFlags` table from `redox-driver-sys` (thin re-export +shim), including BROKEN_MSI inside `get_int_method` and HW_LPM_DISABLE in +the `hw_lpm_support` computation. + +Original task text (kept for reference): + +
Best integration points: @@ -237,6 +256,8 @@ QA: - unit/integration tests for selector logic where possible, - manual logging proof that a known vendor/product entry triggers the expected path. +
+ #### Task 3.2: Consume linux-kpi quirks in `amdgpu` Best integration points: @@ -331,10 +352,10 @@ Current state: If work resumes right away, the next concrete implementation sequence should be: -1. clean remaining stale quirks docs/reporting text, +1. ~~clean remaining stale quirks docs/reporting text~~ ✅ done 2026-07-18 (this pass) 2. write a design note for canonical PCI quirk ownership, -3. integrate `lookup_usb_quirks()` into `xhcid` enumeration/configuration, -4. add first real `pci_has_quirk()` use in `amdgpu`, +3. ~~integrate `lookup_usb_quirks()` into `xhcid` enumeration/configuration~~ ✅ done (Task 3.1) +4. ~~add first real `pci_has_quirk()` use in `amdgpu`~~ ✅ done (Task 3.2 — amdgpu consumes linux-kpi quirk flags in its Redox init path) 5. validate and extend shipped DMI TOML coverage as needed. ## Exit Criteria For The Next Quirks Milestone @@ -342,7 +363,7 @@ If work resumes right away, the next concrete implementation sequence should be: The next milestone is complete when all are true: - `pcid-spawner` and `redox-driver-sys` no longer drift semantically, -- `xhcid` consumes USB device quirks at runtime, -- at least one real C driver consumes linux-kpi quirks, +- ~~`xhcid` consumes USB device quirks at runtime~~ ✅ met (13 device flags; plus the 51-flag controller table since 2026-07-18), +- ~~at least one real C driver consumes linux-kpi quirks~~ ✅ met (amdgpu), - docs distinguish clearly between reporting, infrastructure, and true runtime behavior, - DMI TOML entries are either runtime-applied or removed from shipped config. diff --git a/local/docs/QUIRKS-SYSTEM.md b/local/docs/QUIRKS-SYSTEM.md index c6d95ed4f4..c2d48f6750 100644 --- a/local/docs/QUIRKS-SYSTEM.md +++ b/local/docs/QUIRKS-SYSTEM.md @@ -39,6 +39,10 @@ Defined as `const` arrays in Rust: - `pci_table.rs` — `PCI_QUIRK_TABLE: &[PciQuirkEntry]` - `usb_table.rs` — `USB_QUIRK_TABLE: &[UsbQuirkEntry]` +- `xhci_table.rs` — `XHCI_QUIRK_TABLE: &[XhciQuirkEntry]` (added 2026-07-18: + ~85 xHCI host-controller entries ported from Linux 7.1 + `xhci-pci.c:xhci_pci_quirks()`, with vendor/device/revision/hci_version + matching and 38 unit tests) Each entry specifies: - Vendor/device/subsystem match fields (0xFFFF = wildcard) @@ -299,9 +303,11 @@ match.product_name = "Example Model" ``` local/recipes/drivers/redox-driver-sys/source/src/quirks/ -├── mod.rs # Public API: lookup_pci_quirks(), PciQuirkFlags, PciQuirkEntry +├── mod.rs # Public API: lookup_pci_quirks(), PciQuirkFlags, PciQuirkEntry, +│ # XhciControllerQuirkFlags (51 flags), lookup_xhci_controller_quirks_full() ├── pci_table.rs # Compiled-in PCI quirk table ├── usb_table.rs # Compiled-in USB quirk table +├── xhci_table.rs # Compiled-in xHCI host-controller quirk table (~85 entries, Linux 7.1 port) ├── dmi.rs # DMI/SMBIOS matching and system-level quirk rules └── toml_loader.rs # /etc/quirks.d/*.toml parser @@ -415,6 +421,7 @@ cargo test | Q2 | redbear-quirks data package | ✅ Done | | Q3 | redox-drm integration (MSI-X/MSI/legacy + DISABLE_ACCEL) | ✅ Done | | Q3 | xhcid PCI controller quirks (interrupt + reset delay) | ✅ Done | +| Q3 | xhcid xHCI controller quirks — canonical 51-flag table (Linux 7.1 port, ~85 entries) | ✅ Done (2026-07-18, P2-A) | | Q3 | xhcid USB device quirks (descriptor/configuration/BOS handling) | ✅ Done | | Q3 | pcid-spawner quirk passthrough | ✅ Done | | Q3 | linux-kpi quirk flag bridge | ✅ Done | @@ -437,7 +444,8 @@ the honest breakdown. **Flags consumed by drivers (runtime checks in production code):** - redox-drm: `NO_MSIX`, `NO_MSI`, `FORCE_LEGACY_IRQ`, `DISABLE_ACCEL` (interrupt setup + driver probe) -- xhcid: `RESET_DELAY_MS`, `NO_MSI`, `NO_MSIX`, `FORCE_LEGACY_IRQ` (interrupt selection + port reset delay) +- xhcid (PCI controller path): `RESET_DELAY_MS`, `NO_MSI`, `NO_MSIX`, `FORCE_LEGACY_IRQ` (interrupt selection + port reset delay) +- xhcid (xHCI controller path, via `XhciControllerQuirkFlags`, 51 flags): `BROKEN_MSI` (skips MSI/MSI-X probing in `get_int_method`), `ZERO_64B_REGS`, `NO_64BIT_SUPPORT`, `BROKEN_STREAMS`, `HW_LPM_DISABLE` / `LPM_SUPPORT` (hw_lpm_support computation), `RESET_ON_RESUME` / `RESET_TO_DEFAULT`, `NO_SOFT_RETRY`, `EP_LIMIT_QUIRK`, `SPURIOUS_REBOOT`, `TRB_OVERFETCH`, `MISSING_CAS`, and ~30 more across reset/run/streams/ring-sizing/suspend paths (converged 2026-07-18, P2-A/P2-B) - xhcid (USB device path): `NO_STRING_FETCH`, `BAD_DESCRIPTOR`, `RESET_DELAY`, `HUB_SLOW_RESET`, `NO_BOS`, `SHORT_SET_ADDR_TIMEOUT`, `FORCE_ONE_CONFIG`, `HONOR_BNUMINTERFACES`, `DELAY_CTRL_MSG`, `NO_SET_CONFIG`, `NO_SET_INTF`, `NEED_RESET`, `NO_SUSPEND` (enumeration/configuration/BOS/runtime recovery plus suspend gating) - amdgpu: startup firmware requirement enforced at the Rust DRM boundary, with real quirk-aware runtime logging for `NO_ASPM`, `NEED_IOMMU`, `NO_MSI`, `NO_MSIX` diff --git a/local/docs/USB-IMPLEMENTATION-PLAN.md b/local/docs/USB-IMPLEMENTATION-PLAN.md index 1a077ce80d..d4cea51ec5 100644 --- a/local/docs/USB-IMPLEMENTATION-PLAN.md +++ b/local/docs/USB-IMPLEMENTATION-PLAN.md @@ -1,7 +1,7 @@ # Red Bear OS USB Plan — v3 -> **Status:** Canonical. Replaces v1 (initial draft, pre-fork era) and v2 (archived `local/docs/archived/USB-IMPLEMENTATION-PLAN-v2-2026-07.md` until this live copy was restored). -> **Date:** 2026-07-07. +> **Status:** Canonical (v3). Supersedes v1 (pre-fork draft) and v2 (archived at `local/docs/archived/USB-IMPLEMENTATION-PLAN-v2-2026-07.md`). +> **Date:** 2026-07-07; last revised 2026-07-18 (P2-A/P2-B completion records, P2-C status, doc consolidation). > **Goal:** Make USB a first-class citizen in Red Bear OS — mature, reliable, feature-complete host stack matching the user-visible capability of Linux 7.1. ## 0. Scope and method @@ -41,9 +41,9 @@ Where the v2 plan referenced Redox upstream commits, v3 references **Linux 7.1** | HID class features | Boot protocol only | Full report descriptor parsing, multi-touch, quirks | ~80% gap | | Class drivers | 6 working (acm 133, ecm 261, audio 308, HID, storage, hub) | 80+ drivers | ~75 missing | | Hub driver lines | 249 | 6,567 (hub.c) | ~95% gap | -| xHCI quirks | 12+ enforced | 51 quirks | Good | -| Error recovery | Stall only | Babble, transaction error, split error, clear-TT | ~90% gap | -| Power management | None | Runtime PM, U1/U2, LPM, autosuspend | All missing | +| xHCI quirks | 51 flags + ~85-entry canonical table (redox-driver-sys, P2-A); ~40 check sites in xhcid | 51 quirks | ✅ Done | +| Error recovery | All 36 codes with active recovery (P2-C core ✅); runtime injection tests open | Babble, transaction error, split error, clear-TT | Core done; validation gap | +| Power management | HW LPM substrate + U3 gate + PORTPMSC helpers (P2-B); per-device LPM, U1/U2, autosuspend missing | Runtime PM, U1/U2, LPM, autosuspend | Core missing | | Hardware validation matrix | 0 entries | ~200 known-good controllers | All missing | ### P0 — already done (carried from v2) @@ -79,7 +79,7 @@ All 4 host controllers implement `usb_core::UsbHostController`: | Phase | Goal | Exit criteria | |---|---|---| | **P1** | Trait unification + panic hardening | All 4 controllers implement `UsbHostController`; usbscsid 0 panic sites; xhcid <20 unwraps | -| **P2** | xHCI core completeness | Quirk table populated; HCCPARAMS2 parsed; error recovery for babble/transaction/stall/split | +| **P2** | xHCI core completeness | ✅ Quirk table (P2-A, 2026-07-18); ✅ HCCPARAMS2 parsed + gated (P2-B, 2026-07-18); 🚧 error recovery (36 codes defined; active recovery in progress) | | **P3** | Hub driver maturity | Full enumeration sequence; USB 3.0 SS hub support; port power/reset timing; wHubDelay accumulation | | **P4** | Storage: UAS + multi-LUN | UAS protocol implementation; multi-LUN dispatch; SYNCHRONIZE_CACHE; WRITE SAME/UNMAP | | **P5** | HID: report descriptor parser + input mapping | Full HID report descriptor parser; usage→evdev mapping; HID quirks; multi-touch support | @@ -180,29 +180,39 @@ None are stubs. Original plan incorrectly stated they were 32-line "not yet impl **Why this matters:** The 51-entry xHCI quirk table in Linux is the difference between "works on QEMU" and "works on real hardware." Without quirks, xhcid will silently misbehave on Intel, AMD, NEC, ASMedia, Etron, Cadence, and Fresco Logic controllers. -### P2-A: xHCI quirk table +### P2-A: xHCI quirk table ✅ COMPLETE (2026-07-18) **Reference:** `local/reference/linux-7.1/drivers/usb/host/xhci.h:1587-1649` (51 quirk flags). -**Tasks:** +**Status:** Complete, and converged into the canonical quirks path +(`redox-driver-sys`) per the quirks-system single-source-of-truth policy — +not a per-driver private table as originally scoped. -1. Define a `XhciQuirks` bitflags struct in `xhcid/src/xhci/mod.rs` matching the Linux 51-entry enum. -2. Implement a per-controller quirk probe: read `PCI_VENDOR_ID` + `PCI_DEVICE_ID`, look up in a quirk table keyed by `{vendor, device}`. -3. Implement the behavior change for each quirk. Reference: `drivers/usb/host/xhci-pci.c:600+` `xhci_pci_quirks()`. -4. Start with the highest-priority quirks: - - `XHCI_RESET_TO_DEFAULT` — all xhci drivers should program MaxSlotsEn = 1 on reset - - `XHCI_LPM_SUPPORT` — Intel Panther Point and later - - `XHCI_BROKEN_STREAMS` — disable streams on affected controllers - - `XHCI_WRITE_64_HI_LO` — write 64-bit registers high-then-low on AMD - - `XHCI_ZERO_64B_REGS` — read 32-bit only on old hardware - - `XHCI_DEFAULT_PM_RUNTIME_ALLOW` — enable runtime PM by default on Intel -5. Wire quirk flags into all relevant code paths: reset, run, MSI-X allocation, streams, ring sizing, error recovery. +1. `XhciControllerQuirkFlags` with all 51 Linux 7.1 flags (bit positions + matching `xhci.h`) lives in `redox-driver-sys/src/quirks/mod.rs`. +2. Canonical controller table `redox-driver-sys/src/quirks/xhci_table.rs`: + ~85 entries ported from `xhci-pci.c:xhci_pci_quirks()` (lines 251-517), + `XhciQuirkEntry` with vendor/device/revision matching + WILDCARD, + 38 unit tests. +3. Lookup: `lookup_xhci_controller_quirks_full(vendor, device, revision, + hci_version, dmi_info)` — revision + hci_version enable the two + table entries that need them (AMD_0x96_HOST, >= 0x120 spec rule). +4. xhcid consumes via a thin re-export shim (`xhci/quirks.rs`); reads the + real HCIVERSION from MMIO offset 0x04 (mirrors `xhci_gen_setup()` + xhci.c:5455). +5. BROKEN_MSI now skips MSI/MSI-X probing inside `get_int_method()` so + the interrupt handle and delivery method always agree (previously a + handle/method mismatch bug). +6. ~40 quirk check sites active across xhcid (reset, run, MSI, streams, + ring sizing, LPM, suspend). -**Linux cross-reference:** `xhci-pci.c:617-900` lists the per-controller quirk table. Translate to a Rust match expression. +Bugs fixed vs xhcid's old self-contained table (7): Intel 0x9c31 duplicate, +WildcatPoint→0x9cb1, Panther Point→0x1e31, VIA VL805 flags, Phytium flags, +ASMedia 0x1142 flags, Intel 0x9a13 list placement. -**Files:** `xhcid/src/xhci/quirks.rs` (new), `xhcid/src/xhci/mod.rs`, `xhcid/src/xhci/pci_quirks.rs` (new). +**Commits:** base `9fc1947d`, parent `980fb994ae`. -**Exit:** per-controller quirk probe running at init; quirk-aware behavior in 5+ paths. +**Exit met:** per-controller quirk probe at init; quirk-aware behavior in 5+ paths. ### P2-B: HCCPARAMS2 parsing (xHCI 1.1+ features) ✅ COMPLETE (2026-07-18) @@ -244,26 +254,61 @@ accessors + HCS3 latencies in `capability.rs`). Gating implemented per Linux **Exit met:** HCCPARAMS2 parsed; 4 features gated (LEC×2, U3C, CIC, HW LPM substrate). cargo check clean (138 warnings, -2 vs baseline), 43/43 tests pass. -### P2-C: Error recovery +### P2-C: Error recovery ✅ CORE COMPLETE (2026-07-18); runtime injection tests open (P8-C) **Reference:** `local/reference/linux-7.1/drivers/usb/host/xhci-ring.c` (4,472 lines), specifically `handle_tx_event()` for the 36 completion codes. -**Tasks:** +**Status:** Active recovery is implemented for all 36 completion codes. +`maybe_recover_transfer_error()` (`scheme.rs:559-925`) is the dispatch, +wired into both `execute_control_transfer()` and `execute_transfer()` retry +loops. Linux equivalences verified line-by-line against `xhci-ring.c`. -1. Extend `TrbCompletionCode` handling from 3 codes (Success, ShortPacket, Stall) to all 36. -2. For each error code, implement recovery: - - `COMP_STALL_ERROR` → endpoint halt + clear-stall control transfer + retry - - `COMP_DATA_BUFFER_ERROR` → re-queue transfer with new DMA mapping - - `COMP_BABBLE_DETECTED_ERROR` → reset endpoint + check port disable - - `COMP_USB_TRANSACTION_ERROR` → retry up to 3 (per `MAX_SOFT_RETRY`) - - `COMP_TRB_ERROR` → log + fatal to upper layer - - `COMP_RESOURCE_ERROR` → re-queue later - - `COMP_SPLIT_TRANSACTION_ERROR` → call Clear-TT-Buffer on parent hub -3. Track retry counts in `Urb` struct. Reference: `xhci-ring.c:1700+` `xhci_urb_request()`. +**Recovery matrix (implemented):** -**Linux cross-reference:** `xhci-ring.c:1700-1900` `xhci_handle_completion()` — the canonical error-handling function. +| Code | xhcid behavior | Linux equivalent | +|---|---|---| +| `UsbTransaction` (0x04) | Soft retry ×3 (`reset_endpoint(tsp=true)` + `restart_endpoint`), then hard reset | `process_bulk_intr_td` ring.c:2529, `MAX_SOFT_RETRY=3` | +| `Resource` (0x07) | Backoff retry ×3 (10 ms×count) + reset, then hard reset | giveback + re-queue | +| `Stall` (0x06) | `reset_endpoint(tsp=false)` + `restart_endpoint` + `CLEAR_FEATURE(ENDPOINT_HALT)`, no retry | `finish_td` → `xhci_handle_halted_endpoint(EP_HARD_RESET)` + `usb_clear_halt` | +| `Babble/DataBuffer/Trb/SplitTransaction` | Hard reset + `clear_tt_buffer_once()` when `behind_highspeed_hub`, no retry | `xhci_handle_halted_endpoint` + `usb_hub_clear_tt_buffer` (hub.c:920) | +| `Stopped*` (0x1A-0x1C) | restart + retry ×3, then hard reset | stop-endpoint completion path | +| `InvalidStreamType/Id` | soft reset + retry ×3 | stream error path | +| `IncompatibleDevice` (0x16) | `disable_slot` — re-enumeration required | ring.c:2757 comment | +| `MissedService/NoPingResponse` | log + surface | `ep->skip` semantics | +| `ContextState/Parameter/IsochBuffer/EventLost/Undefined` | hard reset | fatal class | +| `MaxExitLatencyTooLarge` (0x1D) | log (CMC detection, see P2-B) | xhci.c:2198 | +| Command errors on transfer events | log (xHC state confusion) | — | -**Exit:** 36 completion codes handled with appropriate recovery. +**Infrastructure (verified 2026-07-18):** + +- `reset_endpoint` / `restart_endpoint` / `set_tr_deque_ptr` command chain + mirrors Linux's RESET_EP → SET_TR_DEQUEUE → doorbell sequence. +- `restart_endpoint()` fixed this pass: (a) **latent deadlock** — the + `port_states` write guard was held across `set_tr_deque_ptr()`'s internal + read-guard acquisition on the same key (std RwLock read-while-write); + (b) **doorbell ordering** — spec 4.6.8/4.6.10 requires Set TR Dequeue + *before* doorbell (TR Dequeue Pointer is undefined after Reset Endpoint); + (c) **NoOp priming** — dequeue now points *at* the priming NoOp so the + xHC executes it on restart (Linux `xhci_move_dequeue_past_td` semantics). +- `CLEAR_FEATURE(ENDPOINT_HALT)` control transfer + (`clear_endpoint_halt_no_recovery`) = `usb_clear_halt` device-side half. +- `clear_tt_buffer_once()` for FS/LS devices behind HS hubs = bounded + `usb_hub_clear_tt_buffer` equivalent (hub.c:920). + +**Known simplifications vs Linux (documented, acceptable for current usage):** + +- Retry budget is per-transfer-call (matches Linux's per-TD `err_count`; + Linux resets it on success, so semantics are equivalent within one + transfer). No cross-transfer cumulative counters yet. +- On stall, pending TRBs *after* the failed TD are abandoned (Linux + NoOps the stalled TD in place and resumes subsequent TDs). xhcid's + transfer model is synchronous/single-TD, so this is not observable today. +- `handle_event_trb` maps all non-Success command completions to EIO + without per-code discrimination. + +**Exit met:** 36 completion codes handled with appropriate recovery. +**Remaining:** runtime error-injection proof (P8-C: hot-unplug mid-transfer, +stall injection, 10k random disconnects without panic). --- @@ -554,11 +599,18 @@ A `redbear-usbtest` tool that exercises: **Reference:** `linux-7.1/drivers/usb/host/xhci-port.h:135-173`, `xhci-hub.c`. -**Tasks:** +**Status (2026-07-18):** Substrate done in P2-B — HLC/BLC/L1C parsed from the +Supported Protocol capability (NOT `HCCPARAMS1`: an earlier plan version and +driver accessor were wrong; HLC lives in the protocol caps port_info DWORD per +xHCI §7.2.2.1.3.2). `Xhci::hw_lpm_support` computed per Linux xhci-mem.c:2137; +`Port::enable_lpm/disable_lpm` implement the Linux two-register sequence; +defensive LPM clear runs on USB2 ports at attach when unsupported. -1. Parse `HCCPARAMS1.HLC` (Hardware LPM Capability). +**Remaining tasks:** + +1. ~~Parse HLC~~ ✅ done (P2-B, protocol caps). 2. Implement `usb_set_device_initiated_lpm()` (port hardware LPM control via PORTSC.PORT_L1DEV). -3. xhcid: implement `PORT_HLE` enabling per port. +3. xhcid: per-device `PORT_HLE` enablement at attach — gate chain per Linux xhci.c:4650: `!HW_LPM_DISABLE && hw_lpm_support && udev->lpm_capable && root-hub-direct && non-hub`, then BESL params + MEL Evaluate Context + `enable_lpm()`. 4. ehcid: implement via USBCMD.HIRD (Host Initiated Resume Duration). **Exit:** USB 2.0 devices on HWA LPM-capable hubs enter L1 state when idle. @@ -683,16 +735,25 @@ cd local/recipes/drivers/usb-core/source && cargo check --offline ./local/scripts/test-usb-error-recovery-qemu.sh --check # new ``` -## 12. Stale documentation cleared +## 12. Documentation lineage (2026-07-18, consolidated) -This v3 supersedes: +Current live documents: -- `local/docs/USB-IMPLEMENTATION-PLAN.md` (v2 active) → archived as `local/docs/archived/USB-IMPLEMENTATION-PLAN-v2-2026-07.md` -- `local/docs/USB-VALIDATION-RUNBOOK.md` (v2 active) → archived as `local/docs/archived/USB-VALIDATION-RUNBOOK-2026-07.md` +- `local/docs/USB-IMPLEMENTATION-PLAN.md` — **this document (v3)**, the canonical USB plan. + Updated 2026-07-18 with P2-A and P2-B completion records. +- `local/docs/USB-VALIDATION-RUNBOOK.md` — **live v3** companion runbook + (validation scripts, QEMU/bare-metal paths, failure triage). -`archived/README.md` updated to record the v1 → v2 → v3 supersession chain. +Archived lineage (read for history only): -All Linux 7.0 references in active docs migrated to Linux 7.1 (this happened earlier in the v2 era). +- `local/docs/archived/USB-IMPLEMENTATION-PLAN-v2-2026-07.md` — v2 plan. +- `local/docs/archived/USB-VALIDATION-RUNBOOK-2026-07.md` — v2 runbook. +- v1 — initial pre-fork draft (superseded). + +`archived/README.md` records the v1 → v2 → v3 supersession chain. + +All Linux 7.0 references in active docs were migrated to Linux 7.1 earlier in +the v2 era; active cross-references target `local/reference/linux-7.1/`. ## 13. Cross-reference summary diff --git a/local/scripts/test-msix-qemu.sh b/local/scripts/test-msix-qemu.sh old mode 100644 new mode 100755 diff --git a/local/scripts/test-usb-storage-qemu.sh b/local/scripts/test-usb-storage-qemu.sh old mode 100644 new mode 100755 diff --git a/local/scripts/test-xhci-irq-qemu.sh b/local/scripts/test-xhci-irq-qemu.sh old mode 100644 new mode 100755 diff --git a/local/sources/base b/local/sources/base index 75229a5789..260003331e 160000 --- a/local/sources/base +++ b/local/sources/base @@ -1 +1 @@ -Subproject commit 75229a5789597f494f3045164371c4bfcf21119a +Subproject commit 260003331ed78736a033b3dce645c36935a1e0be