lg-gram-16z90tp: review-fix round — firmware op-mode honesty + docs

Base submodule bump (6db0f481): hardware-correct DesignWare engine
(disable/program/enable ordering, abort-first polling, corrected SCL
timing, recovery, validation) and proper Intel LPSS PCI bring-up.

- iwlwifi candidate tables: remove the c-prefixed iwlmld series from
  the current Mini-MVM candidate lists — the MVM transport cannot
  drive MLD firmware, and selecting it would fail firmware boot
  instead of falling back to a compatible image (review MAJOR). c-series
  returns with the MLD op-mode (Phase 6/W). Fallback TOML chains no
  longer mix MLD and MVM series.
- redbear-iwlwifi + redbear-wifictl candidate detection now probes
  both the flat /lib/firmware/iwlwifi-* and the post-2026
  /lib/firmware/intel/iwlwifi/ layouts (review MAJOR).
- plan doc: review-fix round recorded; precision fixes — amd-mp2-i2cd
  remains registration-only until its mailbox engine lands, and the
  system-quirk flags parse but have no consumers until Phase 5.

Validation: iwlwifi 8 + wifictl 21 tests pass, base cooks for
x86_64-unknown-redox.
This commit is contained in:
2026-07-21 12:06:21 +09:00
parent 0ddc032202
commit b050b28598
5 changed files with 150 additions and 52 deletions
+80 -16
View File
@@ -34,7 +34,11 @@ chain = ["iwlwifi-bz-b0-gf-a0-94.ucode", "iwlwifi-bz-b0-gf-a0-92.ucode", "iwlwif
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-c106.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode", "iwlwifi-bz-b0-fm-c0-101.ucode", "iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode"]
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-101.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-98.ucode", "iwlwifi-bz-b0-fm-c0-96.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
# linux-firmware ships iwlwifi blobs under intel/iwlwifi/ since 2026.
[[fallback]]
@@ -89,7 +93,11 @@ chain = ["iwlwifi-bz-b0-gf-a0-94.ucode", "iwlwifi-bz-b0-gf-a0-92.ucode", "iwlwif
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-c106.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode", "iwlwifi-bz-b0-fm-c0-101.ucode", "iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode"]
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-101.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-98.ucode", "iwlwifi-bz-b0-fm-c0-96.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
# linux-firmware ships iwlwifi blobs under intel/iwlwifi/ since 2026.
[[fallback]]
@@ -140,7 +148,11 @@ chain = ["iwlwifi-bz-b0-gf-a0-94.ucode", "iwlwifi-bz-b0-gf-a0-92.ucode", "iwlwif
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-c106.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode", "iwlwifi-bz-b0-fm-c0-101.ucode", "iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode"]
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-101.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-98.ucode", "iwlwifi-bz-b0-fm-c0-96.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
# linux-firmware ships iwlwifi blobs under intel/iwlwifi/ since 2026.
[[fallback]]
@@ -231,7 +243,11 @@ chain = ["iwlwifi-bz-b0-gf-a0-94.ucode", "iwlwifi-bz-b0-gf-a0-92.ucode", "iwlwif
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-c106.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode", "iwlwifi-bz-b0-fm-c0-101.ucode", "iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode"]
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-101.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-98.ucode", "iwlwifi-bz-b0-fm-c0-96.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
# linux-firmware ships iwlwifi blobs under intel/iwlwifi/ since 2026.
[[fallback]]
@@ -337,7 +353,11 @@ chain = ["iwlwifi-bz-b0-gf-a0-94.ucode", "iwlwifi-bz-b0-gf-a0-92.ucode", "iwlwif
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-c106.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode", "iwlwifi-bz-b0-fm-c0-101.ucode", "iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode"]
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-101.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-98.ucode", "iwlwifi-bz-b0-fm-c0-96.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
# linux-firmware ships iwlwifi blobs under intel/iwlwifi/ since 2026.
[[fallback]]
@@ -433,7 +453,11 @@ chain = ["iwlwifi-bz-b0-gf-a0-94.ucode", "iwlwifi-bz-b0-gf-a0-92.ucode", "iwlwif
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-c106.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode", "iwlwifi-bz-b0-fm-c0-101.ucode", "iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode"]
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-101.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-98.ucode", "iwlwifi-bz-b0-fm-c0-96.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
# linux-firmware ships iwlwifi blobs under intel/iwlwifi/ since 2026.
[[fallback]]
@@ -500,7 +524,11 @@ chain = ["iwlwifi-bz-b0-gf-a0-94.ucode", "iwlwifi-bz-b0-gf-a0-92.ucode", "iwlwif
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-c106.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode", "iwlwifi-bz-b0-fm-c0-101.ucode", "iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode"]
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-101.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-98.ucode", "iwlwifi-bz-b0-fm-c0-96.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
# linux-firmware ships iwlwifi blobs under intel/iwlwifi/ since 2026.
[[fallback]]
@@ -555,7 +583,11 @@ chain = ["iwlwifi-bz-b0-gf-a0-94.ucode", "iwlwifi-bz-b0-gf-a0-92.ucode", "iwlwif
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-c106.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode", "iwlwifi-bz-b0-fm-c0-101.ucode", "iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode"]
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-101.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-98.ucode", "iwlwifi-bz-b0-fm-c0-96.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
# linux-firmware ships iwlwifi blobs under intel/iwlwifi/ since 2026.
[[fallback]]
@@ -651,7 +683,11 @@ chain = ["iwlwifi-bz-b0-gf-a0-94.ucode", "iwlwifi-bz-b0-gf-a0-92.ucode", "iwlwif
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-c106.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode", "iwlwifi-bz-b0-fm-c0-101.ucode", "iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode"]
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-101.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-98.ucode", "iwlwifi-bz-b0-fm-c0-96.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
# linux-firmware ships iwlwifi blobs under intel/iwlwifi/ since 2026.
[[fallback]]
@@ -702,7 +738,11 @@ chain = ["iwlwifi-bz-b0-gf-a0-94.ucode", "iwlwifi-bz-b0-gf-a0-92.ucode", "iwlwif
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-c106.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode", "iwlwifi-bz-b0-fm-c0-101.ucode", "iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode"]
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-101.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-98.ucode", "iwlwifi-bz-b0-fm-c0-96.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
# linux-firmware ships iwlwifi blobs under intel/iwlwifi/ since 2026.
[[fallback]]
@@ -753,7 +793,11 @@ chain = ["iwlwifi-bz-b0-gf-a0-94.ucode", "iwlwifi-bz-b0-gf-a0-92.ucode", "iwlwif
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-c106.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode", "iwlwifi-bz-b0-fm-c0-101.ucode", "iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode"]
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-101.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-98.ucode", "iwlwifi-bz-b0-fm-c0-96.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
# linux-firmware ships iwlwifi blobs under intel/iwlwifi/ since 2026.
[[fallback]]
@@ -813,7 +857,11 @@ chain = ["iwlwifi-bz-b0-gf-a0-94.ucode", "iwlwifi-bz-b0-gf-a0-92.ucode", "iwlwif
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-c106.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode", "iwlwifi-bz-b0-fm-c0-101.ucode", "iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode"]
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-101.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-98.ucode", "iwlwifi-bz-b0-fm-c0-96.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
# linux-firmware ships iwlwifi blobs under intel/iwlwifi/ since 2026.
[[fallback]]
@@ -864,7 +912,11 @@ chain = ["iwlwifi-bz-b0-gf-a0-94.ucode", "iwlwifi-bz-b0-gf-a0-92.ucode", "iwlwif
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-c106.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode", "iwlwifi-bz-b0-fm-c0-101.ucode", "iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode"]
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-101.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-98.ucode", "iwlwifi-bz-b0-fm-c0-96.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
# linux-firmware ships iwlwifi blobs under intel/iwlwifi/ since 2026.
[[fallback]]
@@ -921,7 +973,11 @@ chain = ["iwlwifi-bz-b0-gf-a0-94.ucode", "iwlwifi-bz-b0-gf-a0-92.ucode", "iwlwif
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-c106.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode", "iwlwifi-bz-b0-fm-c0-101.ucode", "iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode"]
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-101.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-98.ucode", "iwlwifi-bz-b0-fm-c0-96.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
# linux-firmware ships iwlwifi blobs under intel/iwlwifi/ since 2026.
[[fallback]]
@@ -978,7 +1034,11 @@ chain = ["iwlwifi-bz-b0-gf-a0-94.ucode", "iwlwifi-bz-b0-gf-a0-92.ucode", "iwlwif
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-c106.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode", "iwlwifi-bz-b0-fm-c0-101.ucode", "iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode"]
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-101.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-98.ucode", "iwlwifi-bz-b0-fm-c0-96.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
# linux-firmware ships iwlwifi blobs under intel/iwlwifi/ since 2026.
[[fallback]]
@@ -1035,7 +1095,11 @@ chain = ["iwlwifi-bz-b0-gf-a0-94.ucode", "iwlwifi-bz-b0-gf-a0-92.ucode", "iwlwif
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-c106.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode", "iwlwifi-bz-b0-fm-c0-101.ucode", "iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
chain = ["iwlwifi-bz-b0-fm-c0-c105.ucode", "iwlwifi-bz-b0-fm-c0-c104.ucode", "iwlwifi-bz-b0-fm-c0-c103.ucode", "iwlwifi-bz-b0-fm-c0-c102.ucode", "iwlwifi-bz-b0-fm-c0-c101.ucode"]
[[fallback]]
pattern = "iwlwifi-bz-b0-fm-c0-101.ucode"
chain = ["iwlwifi-bz-b0-fm-c0-100.ucode", "iwlwifi-bz-b0-fm-c0-98.ucode", "iwlwifi-bz-b0-fm-c0-96.ucode", "iwlwifi-bz-b0-fm-c0-94.ucode", "iwlwifi-bz-b0-fm-c0-92.ucode"]
# linux-firmware ships iwlwifi blobs under intel/iwlwifi/ since 2026.
[[fallback]]
@@ -130,7 +130,7 @@ Effort scale: S (<1 week) · M (13 weeks) · L (38 weeks) · XL (8+ weeks)
| # | Work item | Files | Notes |
|---|---|---|---|
| 0.1 | **Fix e1000d wildcard collision** — add `subclass = 0x00` to e1000d match | `local/config/drivers.d/10-network.toml` + embedded copy in `config/redbear-device-services.toml` | ✅ DONE — same defect class also fixed for `rtl8168d` (Realtek ships subclass-0x80 Wi-Fi too) |
| 0.2 | Add DMI quirk-table entry for `LG Electronics 16Z90TP` | `redbear-quirks/source/quirks.d/50-system.toml` | ✅ DONE — **and repaired the whole system-quirk pipeline**: the sibling LG entries' flags (`force_s2idle` etc.) silently parsed to empty sets (unknown names dropped). Added `SystemQuirkFlags` + `DmiSystemQuirkRule` + dual-namespace parsing in `toml_loader.rs` + `quirks::system_quirks()` consumer API in redox-driver-sys. 16Z90TP entry matches on `board_name = "16Z90TP"` (exact-match semantics; product_name carries the SKU suffix) |
| 0.2 | Add DMI quirk-table entry for `LG Electronics 16Z90TP` | `redbear-quirks/source/quirks.d/50-system.toml` | ✅ DONE — **and repaired the system-quirk *parsing* pipeline**: the sibling LG entries' flags (`force_s2idle` etc.) silently parsed to empty sets (unknown names dropped). Added `SystemQuirkFlags` + `DmiSystemQuirkRule` + dual-namespace parsing in `toml_loader.rs` + `quirks::system_quirks()` consumer API in redox-driver-sys. **Consumer wiring (acpid `force_s2idle`, ps2d `kbd_deactivate_fixup`) remains Phase 5 work — the flags parse and are queryable but nothing branches on them yet.** 16Z90TP entry matches on `board_name = "16Z90TP"` (exact-match semantics; product_name carries the SKU suffix) |
| 0.3 | Verify/port xHCI quirks for 8086:7ec0 & 8086:777d — decode Linux `0x200009810` | `redox-driver-sys/source/src/quirks/xhci_table.rs` | ✅ DONE — decoded as `SPURIOUS_SUCCESS \| LPM_SUPPORT \| INTEL_HOST \| AVOID_BEI \| DEFAULT_PM_RUNTIME_ALLOW`. Missing piece was the **universal `hci_version > 0x96 → SPURIOUS_SUCCESS`** rule (Linux `xhci.c:5477`); added it + a flag-parity test pinning the LG Gram controllers to the exact Linux flag set. The `>= 0x120 → DEFAULT_PM_RUNTIME_ALLOW` rule already existed |
| 0.4 | Confirm graphics spawn priority: redox-drm wins over ihdgd for 0x7D51 | `drivers.d/30-graphics.toml`, `pcid.d/intel_gpu.toml`, `redbear-{mini,full}.toml` | ✅ VERIFIED CORRECT — redox-drm Intel entry priority 61 > vesad 60; redbear-mini empties `/etc/pcid.d/ihdgd.toml`; redbear-full overrides it to spawn redox-drm; `/etc/pcid.d` overrides `/usr/lib/pcid.d` via `config_for_dirs()` BTreeMap; base package stages into `/usr/lib/pcid.d` so no layer collision. No change needed |
| 0.5 | Stage firmware blobs | `local/firmware/`, `redbear-iwlwifi/main.rs`, `redbear-wifictl/backend.rs`, `firmware-loader/blob.rs`, `redbear-device-services.toml` | ✅ DONE — staged host-verified blobs (iwlwifi bz-b0-fm-c0 **c101/c102/c103/c106** + pnvm, gf-a0 set, i915/mtl_dmc.bin + guc/huc/gsc, ibt-0093-0291.sfi/.ddc). **Key discovery:** the `c`-prefixed series is the iwlmld firmware — candidate tables rewritten to prefer c106→c101 over the legacy 92101 series. **Fixed firmware path gap:** new linux-firmware ships iwlwifi under `intel/iwlwifi/`; added wildcard path-map to firmware-loader builtins + `/etc/firmware-fallbacks.d/10-iwlwifi.toml`. Image path confirmed: `redbear-firmware` recipe ships the full set (cache has c106) |
@@ -213,20 +213,49 @@ whole desktop path (Qt6/KWin) on this machine.**
"not implemented yet" for every transfer, and its wire format didn't even
match the only in-tree consumer (i2c-hidd sends a bare
`I2cTransferRequest`, i2cd expected `I2cControlRequest::Transfer`).
→ Real provider routing: adapter resolution by name/alias (exact,
normalized, last-component) + forwarding to the provider daemon's
→ Real provider routing: adapter resolution by name/alias (exact-first,
ambiguity-rejecting) + forwarding to the provider daemon's
`/scheme/<provider>/transfer` endpoint.
2. **intel-lpss-i2cd / dw-acpi-i2cd / amd-mp2-i2cd were register-and-park
stubs** — they mapped the MMIO, logged register offsets in a debug line,
registered an adapter name, and parked forever without initializing the
controller or executing a single transfer.
2. **intel-lpss-i2cd / dw-acpi-i2cd were register-and-park stubs** — they
mapped the MMIO, logged register offsets in a debug line, registered an
adapter name, and parked forever without initializing the controller or
executing a single transfer.
→ New shared crate `drivers/i2c/designware` (`dw-i2c`): real DesignWare
master engine ported from Linux 7.1 `i2c-designware-master.c`/`common.c`
(IC_CON/SCL timing from ic_clk with Linux's exact hcnt/lcnt formulas,
SDA hold + RX-hold workaround, polling transfer engine with
RESTART/STOP, TX_ABRT decode, 7/10-bit addressing, bounded timeouts) +
shared `/scheme/<name>` transfer endpoint with an on-ready callback
(register-scheme-then-ready ordering, matching xhcid).
+ shared `/scheme/<name>` transfer endpoint. (amd-mp2-i2cd is a
*different* IP — the AMD mailbox controller — and remains a
registration-only daemon until its own engine lands; every transfer to
it fails honestly with "no transfer provider". It is NOT covered by this
sweep.)
**Review-fix round (2026-07-20, post-implementation review):**
A 5-lane review (goal/QA/code-quality/security/context) returned FAIL with
two verified-CRITICAL and ~14 MAJOR findings. All legitimate findings were
fixed in the same session (fix commits on submodule/base + 0.3.1):
| Finding | Fix |
|---|---|
| CRITICAL: `IC_CON`/`IC_TAR` written while enabled | Engine restructured to Linux `i2c_dw_xfer_init` ordering: wait-idle → disable → program → enable with `IC_ENABLE_STATUS` polling on every transfer |
| CRITICAL: Intel LPSS PCI bring-up skipped parent init | Proper `pcid_interface` claim + `enable_device`, BAR size validation, `intel_lpss_init_dev` port (reset-deassert + 64-bit remap at BAR0+0x200) |
| MAJOR: NACK-reported-as-success | `wait_for` now checks `TX_ABRT` **before** success predicates on every poll |
| MAJOR: SCL timing wrong (fall-time source + rounding) | HCNT uses `sda_fall_ns`, round-to-nearest division; corrected to Linux vectors FS 100/200, SS 552/652 with pinned tests |
| MAJOR: `stop=false` hangs | Rejected honestly (`Invalid`) |
| MAJOR: abort/timeout left controller wedged | `recover()` — ABORT-bit cycle + disable + state flush after any failed transfer |
| MAJOR: unbounded requests (`Read(usize::MAX)` → OOM) | `validate_request`: segment/byte/address/10-bit limits before any MMIO |
| MAJOR: `provider_scheme` unchecked capability | Grammar validation at registration (single safe component) |
| MAJOR: routing ambiguity (short alias shadows exact) | Exact-first resolution in both i2cd and the endpoint; last-component accepted only when unambiguous |
| MAJOR: ACPI-alias startup race | Bounded retry in alias discovery; acpid runs from initfs (41_acpid) so ordering is satisfied |
| MAJOR: `setrens` fail-open | `endpoint::serve` takes a `Result`-returning callback; namespace failure is fatal |
| MAJOR: MLD (`c`-series) firmware fed to Mini-MVM | c-series removed from current candidate lists (returns with the MLD op-mode in Phase 6); fallback chains no longer mix MLD/MVM series |
| MAJOR: subdirectory blobs invisible to candidate detection | Detection probes both flat and `intel/iwlwifi/` layouts |
| MAJOR: untyped error flattening | `I2cTransferResponse.status` (typed `I2cTransferStatus`, serde-defaulted, wire-compatible) |
Open findings deferred with records: AMD MP2 mailbox engine (separate port),
system-quirk consumers in acpid/ps2d (Phase 5), redbear-firmware supply-chain
pinning (pre-existing, separate task), CallerCtx authZ on i2c schemes
(design question), fake-MMIO state-machine tests (test-infrastructure work).
3. **intel-lpss-i2cd could never bind on modern hardware** — it matched only
legacy ACPI HIDs, but MTL/ARL platforms bind LPSS I2C by PCI ID
(Linux `intel-lpss-pci.c` model).
@@ -416,13 +416,20 @@ fn detect_candidates(firmware_root: &PathBuf) -> Result<Vec<Candidate>, DriverEr
let location = parse_location_from_config_path(&config_path)?;
let (family, ucode_candidates, pnvm_candidate) =
intel_firmware_candidates(device_id, subsystem_id);
// linux-firmware ships iwlwifi blobs both at the historical flat
// /lib/firmware/iwlwifi-* paths and (since 2026) under
// /lib/firmware/intel/iwlwifi/ — probe both.
let blob_exists = |name: &str| {
firmware_root.join(name).exists()
|| firmware_root.join("intel/iwlwifi").join(name).exists()
};
let selected_ucode = ucode_candidates
.iter()
.find(|candidate| firmware_root.join(candidate).exists())
.find(|candidate| blob_exists(candidate))
.cloned();
let pnvm_found = pnvm_candidate
.as_ref()
.filter(|candidate| firmware_root.join(candidate).exists())
.filter(|candidate| blob_exists(candidate))
.cloned();
out.push(Candidate {
@@ -492,19 +499,16 @@ fn intel_firmware_candidates(
),
(0x7740, _) => (
vec![
// CNVi BE201 (LG Gram 16Z90TP, host-verified 2026-07-20): the
// "c"-prefixed series is the iwlmld firmware; c102 is what
// production Linux 7.1 loads on the host, c106 is the newest
// in the current linux-firmware snapshot. The unprefixed
// series is the older iwlmvm API and is kept as fallback.
"iwlwifi-bz-b0-fm-c0-c106.ucode",
"iwlwifi-bz-b0-fm-c0-c105.ucode",
"iwlwifi-bz-b0-fm-c0-c104.ucode",
"iwlwifi-bz-b0-fm-c0-c103.ucode",
"iwlwifi-bz-b0-fm-c0-c102.ucode",
"iwlwifi-bz-b0-fm-c0-c101.ucode",
// CNVi BE201. Only iwlmvm-era (unprefixed) firmware is listed:
// the "c"-prefixed series (c101-c106) is iwlmld firmware and
// the current Mini-MVM transport cannot drive it — selecting
// it would fail firmware boot instead of falling back to a
// compatible image. c-series candidates return with the MLD
// op-mode (WIFI-IMPLEMENTATION-PLAN Phase W).
"iwlwifi-bz-b0-fm-c0-101.ucode",
"iwlwifi-bz-b0-fm-c0-100.ucode",
"iwlwifi-bz-b0-fm-c0-98.ucode",
"iwlwifi-bz-b0-fm-c0-96.ucode",
"iwlwifi-bz-b0-fm-c0-94.ucode",
"iwlwifi-bz-b0-fm-c0-92.ucode",
],
@@ -844,13 +844,18 @@ fn detect_intel_wifi_interfaces(
let idx = devices.len();
let (firmware_family, ucode_candidates, pnvm_candidate) =
intel_firmware_candidates(device_id, subsystem_id);
// Probe both the flat and the intel/iwlwifi/ blob layouts.
let blob_exists = |name: &str| {
firmware_root.join(name).exists()
|| firmware_root.join("intel/iwlwifi").join(name).exists()
};
let selected_ucode = ucode_candidates
.iter()
.find(|candidate| firmware_root.join(candidate).exists())
.find(|candidate| blob_exists(candidate))
.cloned();
let pnvm_found = pnvm_candidate
.as_ref()
.filter(|candidate| firmware_root.join(candidate).exists())
.filter(|candidate| blob_exists(candidate))
.cloned();
devices.insert(
format!("wlan{idx}"),
@@ -894,16 +899,12 @@ fn intel_firmware_candidates(
),
(0x7740, _) => (
vec![
// Keep in sync with redbear-iwlwifi main.rs — the "c"-prefixed
// series is iwlmld firmware (production: c102 on the host).
"iwlwifi-bz-b0-fm-c0-c106.ucode",
"iwlwifi-bz-b0-fm-c0-c105.ucode",
"iwlwifi-bz-b0-fm-c0-c104.ucode",
"iwlwifi-bz-b0-fm-c0-c103.ucode",
"iwlwifi-bz-b0-fm-c0-c102.ucode",
"iwlwifi-bz-b0-fm-c0-c101.ucode",
// Keep in sync with redbear-iwlwifi main.rs — only iwlmvm-era
// firmware until the MLD op-mode lands (c-series is iwlmld).
"iwlwifi-bz-b0-fm-c0-101.ucode",
"iwlwifi-bz-b0-fm-c0-100.ucode",
"iwlwifi-bz-b0-fm-c0-98.ucode",
"iwlwifi-bz-b0-fm-c0-96.ucode",
"iwlwifi-bz-b0-fm-c0-94.ucode",
"iwlwifi-bz-b0-fm-c0-92.ucode",
],