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:
@@ -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 (1–3 weeks) · L (3–8 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 92–101 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",
|
||||
],
|
||||
|
||||
+1
-1
Submodule local/sources/base updated: 8dd8fb3b20...6db0f48170
Reference in New Issue
Block a user