From b050b28598f3310ee009642b0a4e200f71759ffc Mon Sep 17 00:00:00 2001 From: vasilito Date: Tue, 21 Jul 2026 12:06:21 +0900 Subject: [PATCH] =?UTF-8?q?lg-gram-16z90tp:=20review-fix=20round=20?= =?UTF-8?q?=E2=80=94=20firmware=20op-mode=20honesty=20+=20docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- config/redbear-device-services.toml | 96 +++++++++++++++---- .../LG-GRAM-16Z90TP-COMPATIBILITY-PLAN.md | 53 +++++++--- .../redbear-iwlwifi/source/src/main.rs | 30 +++--- .../redbear-wifictl/source/src/backend.rs | 21 ++-- local/sources/base | 2 +- 5 files changed, 150 insertions(+), 52 deletions(-) diff --git a/config/redbear-device-services.toml b/config/redbear-device-services.toml index 1e13def89e..ec70161f9c 100644 --- a/config/redbear-device-services.toml +++ b/config/redbear-device-services.toml @@ -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]] diff --git a/local/docs/LG-GRAM-16Z90TP-COMPATIBILITY-PLAN.md b/local/docs/LG-GRAM-16Z90TP-COMPATIBILITY-PLAN.md index 451d75013d..e5d8e7449c 100644 --- a/local/docs/LG-GRAM-16Z90TP-COMPATIBILITY-PLAN.md +++ b/local/docs/LG-GRAM-16Z90TP-COMPATIBILITY-PLAN.md @@ -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//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/` transfer endpoint with an on-ready callback - (register-scheme-then-ready ordering, matching xhcid). + + shared `/scheme/` 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). diff --git a/local/recipes/drivers/redbear-iwlwifi/source/src/main.rs b/local/recipes/drivers/redbear-iwlwifi/source/src/main.rs index c08232fa5d..ae2a838aa4 100644 --- a/local/recipes/drivers/redbear-iwlwifi/source/src/main.rs +++ b/local/recipes/drivers/redbear-iwlwifi/source/src/main.rs @@ -416,13 +416,20 @@ fn detect_candidates(firmware_root: &PathBuf) -> Result, 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", ], diff --git a/local/recipes/system/redbear-wifictl/source/src/backend.rs b/local/recipes/system/redbear-wifictl/source/src/backend.rs index 37ac635285..314b69a0e5 100644 --- a/local/recipes/system/redbear-wifictl/source/src/backend.rs +++ b/local/recipes/system/redbear-wifictl/source/src/backend.rs @@ -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", ], diff --git a/local/sources/base b/local/sources/base index 8dd8fb3b20..6db0f48170 160000 --- a/local/sources/base +++ b/local/sources/base @@ -1 +1 @@ -Subproject commit 8dd8fb3b2059825c5733e0687c14f0f449ac3d3c +Subproject commit 6db0f481707f27efcca13bbc99de34bfd01edef6