Page MenuHomeVyOS Platform

Kernel 6.18: Intel BE200 / BE-series Wi-Fi broken — CONFIG_IWLMLD missing from kernel config
Open, NormalPublicBUG

Description

Affected version

Broken: VyOS 2026.08.05-0033-rolling (circinus), kernel 6.18.41-vyos
(from the boot log: Linux version 6.18.41-vyos ... #1 SMP Sun Aug 2 19:51:29 UTC 2026,
BOOT_IMAGE=/boot/2026.08.05-0033-rolling/vmlinuz)

Regression information

  • Last known working: rolling builds on the 6.6 kernel line — verified on:
Version:          VyOS 2026.03
Release train:    circinus
Release flavor:   generic
Built by:         autobuild@vyos.net
Built on:         Wed 18 Mar 2026 20:03 UTC
Architecture:     x86_64
System type:      KVM guest
(kernel 6.6.128 — BE200 probes, associates, and passes traffic, loading
`iwlwifi-gl-c0-fm-c0-83.ucode`)
  • First broken: any rolling build after the 6.6 → 6.18 kernel jump from T8147 (vyos-build commit 739f904284, "Kernel: T8147: upgrade to 6.18", 2026-05-03). Verified broken on 2026.08.05-0033-rolling.

Steps to reproduce

  1. Boot any rolling image with the 6.18 kernel (e.g. 2026.08.05-0033-rolling) on a system with an Intel BE200 (PCI 8086:272b).
  2. sudo dmesg | grep iwlwifi — the probe fails (log below); no wlan interface and no phy is ever created.
  3. Any wireless configuration then fails validation, e.g.:
set interfaces wireless wlan0 physical-device 'phy0'

  Device interface phy0 does not exist
  Invalid value
  Value validation failed

No special configuration is required to trigger the bug — the driver probe
fails at boot before any config applies. For completeness, the config that
works on 6.6 and fails to load on 6.18:

set interfaces wireless wlan0 physical-device 'phy0'
set interfaces wireless wlan0 type 'station'
set interfaces wireless wlan0 ssid 'MYSSID'
set interfaces wireless wlan0 security wpa mode 'wpa3'
set interfaces wireless wlan0 security wpa passphrase 'xxxxxxxx'
set interfaces wireless wlan0 address 'dhcp'

Expected behavior

BE200 probes and interfaces wireless wlan0 commits and works, as on the
6.6-kernel images.

Actual behavior

kernel: iwlwifi 0000:03:00.0: Detected crf-id 0x2001910, cnv-id 0x2001910 wfpm id 0x80000000
kernel: iwlwifi 0000:03:00.0: PCI dev 272b/00f4, rev=0x472, rfid=0x112200
kernel: No config found for PCI dev 272b/00f4, rev=0x472, rfid=0x112200
kernel: iwlwifi 0000:03:00.0: probe with driver iwlwifi failed with error -22

Follow-on damage: because wlan0 never exists, the boot-time load of a config
containing interfaces wireless fails ("Configuration error",
interfaces_wireless_wlan0 commit script), and the system comes up with the
entire wireless subtree missing from the running config. A save in that
state silently strips the wireless config from config.boot.

Root cause

Kernel 6.15+ moved the Intel BE-series (GL/Bz) devices from the iwlmvm
op-mode to the new iwlmld op-mode. All their device-match entries in
drivers/net/wireless/intel/iwlwifi/pcie/drv.c are guarded by
#if IS_ENABLED(CONFIG_IWLMLD):

https://github.com/gregkh/linux/blob/v6.18/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
(see the /* FM RF */ block: iwl_be200_name, iwl_be201_name, ...)

The VyOS kernel config
(scripts/package-build/linux-kernel/config/x86/vyos_defconfig) has:

CONFIG_IWLWIFI=m
CONFIG_IWLDVM=m
CONFIG_IWLMVM=m

but no CONFIG_IWLMLD, so every BE-series device entry is compiled out and
the probe fails with "No config found". This affects every Intel Wi-Fi 7 /
BE-series card on all rolling builds since May 2026.

Proposed fix

Add CONFIG_IWLMLD=m to the x86 and arm64 kernel configs. The required
firmware already ships in the image — vyos-build pins linux-firmware
20260410, which includes the iwlwifi-gl-c0-fm-c0-*.ucode range the 6.18
driver requests — so enabling the kernel config option is the only change
needed. Other distributions hit the same regression after their kernel
bumps and fixed it exactly this way:

Hardware notes

Intel BE200 (8086:272b, subsystem 00f4, rev 0x472), PCIe passthrough into a
KVM guest (Proxmox). The identical passthrough setup works under the 6.6
kernel, so virtualization is not a factor in the probe failure.

Details

Version
2026.08.05-0033-rolling
Is it a breaking change?
Perfectly compatible
Issue type
Bug (incorrect behavior)

Related Objects

Event Timeline

@srnoth Would you like to claim the task and submit a PR?

Viacheslav triaged this task as Normal priority.Aug 11 2026, 3:05 PM

@srnoth Would you like to claim the task and submit a PR?

Yes sir, will do.

@Viacheslav

Follow-up: I test-built an ISO from rolling with the merged fix (e14a489) to validate on the same BE200 hardware. The initial PR works... the card is now properly detected:

iwlwifi 0000:03:00.0: Detected Intel(R) Wi-Fi 7 BE200 320MHz

However this exposes a second gap, this time in the firmware package:

iwlwifi 0000:03:00.0: Direct firmware load for iwlwifi-gl-c0-fm-c0-c99.ucode failed with error -2
iwlwifi 0000:03:00.0: Direct firmware load for iwlwifi-gl-c0-fm-c0-101.ucode failed with error -2
iwlwifi 0000:03:00.0: Direct firmware load for iwlwifi-gl-c0-fm-c0-100.ucode failed with error -2
iwlwifi 0000:03:00.0: no suitable firmware found!
iwlwifi 0000:03:00.0: minimum version required: iwlwifi-gl-c0-fm-c0-100

Root cause: scripts/package-build/linux-kernel/build-linux-firmware.sh selects blobs by exact-matching the modinfo firmware: declarations of the built kernel modules. For BE-series devices the 6.18 kernel declares only the API-max filename — verified via modinfo on the built iwlwifi.ko:

firmware:       iwlwifi-gl-c0-fm-c0-c99.ucode
firmware:       iwlwifi-gl-b0-fm-b0-c99.ucode

but linux-firmware 20260410 ships iwlwifi-gl-c0-fm-c0-101.ucode / -100.ucode, which the driver falls back to at runtime. The exact-name find matches nothing, so the BE200 ucode is silently omitted from vyos-linux-firmware — i.e. rebuilding the firmware package against the now-IWLMLD-enabled kernel will still not ship it, and nightlies will detect the card but fail firmware load as above.

Proposed fix (currently testing on my hardware, happy to submit a PR once proven working): in build-linux-firmware.sh, when a versioned iwlwifi-*.ucode declaration matches nothing — i.e. the package would otherwise ship no firmware at all for that device — fall back to installing the API versions linux-firmware actually ships for that same firmware prefix. That set is exactly what the driver's runtime version fallback searches, and linux-firmware prunes old API revisions aggressively, so in practice it's 1–3 files per affected device (for BE200: -101 and -100, a few MB). The fallback never adds files alongside an existing exact match, and trying to select a single "correct" version in shell would mean re-implementing iwlwifi's fallback ordering (note it probes c99 before 101 above — not a numeric sort), which would break silently next time the naming scheme changes. Patch here: https://github.com/srnoth/vyos-build/commit/a6466c1

Will report test results in this task.

Test results: rebuilt vyos-linux-firmware against the IWLMLD-enabled kernel (rolling @ 6.18.44) with the missing files included, rebuilt the ISO, and the BE200 now works end-to-end on the same hardware from the original report:

iwlwifi 0000:03:00.0: Detected Intel(R) Wi-Fi 7 BE200 320MHz
iwlwifi 0000:03:00.0: Direct firmware load for iwlwifi-gl-c0-fm-c0-c99.ucode failed with error -2
iwlwifi 0000:03:00.0: loaded firmware version 101.6ef20b19.0 gl-c0-fm-c0-101.ucode op_mode iwlmld
iwlwifi 0000:03:00.0: Detected RF FM, rfid=0x112200
iwlwifi 0000:03:00.0: base HW address: 44:a3:bb:36:38:c3

(the -c99 -2 line is the driver's normal version fallback before it finds -101). The interface associates, authenticates, and passes traffic normally — iperf3 through the router shows ~1.6 Gbit/s down / ~1.1 Gbit/s up over the wireless link.

Underlying issue: build-linux-firmware.sh selects firmware by exact-matching the firmware: strings from modinfo on the built modules. For this device that misses in two ways:

  1. The kernel declares only the API-max filename (iwlwifi-gl-c0-fm-c0-c99.ucode), while linux-firmware ships -101/-100 — versions the driver's runtime fallback loads (as seen above). The exact-name match finds nothing.
  2. The device's required .pnvm data file is not declared via MODULE_FIRMWARE at all.

In both cases the file is skipped without any build-time indication, so the gap only shows up later at runtime. Other iwlwifi devices could be affected the same way whenever their declared API version and the shipped files drift apart.

Some possible approaches, in case they're useful:

  1. Warn or fail in build-linux-firmware.sh when a declared firmware pattern matches no file.
  2. A small static list of additional firmware files to include alongside the modinfo-derived set (for the BE200: -101.ucode, -100.ucode, .pnvm — about 4.3MB, <1MB package growth).
  3. An automatic fallback: when a versioned iwlwifi-*.ucode pattern matches nothing, install the shipped versions of that prefix at or above the declared API number, plus its .pnvm. This is what I tested (https://github.com/srnoth/vyos-build/commit/1ee3c0a) — for BE200 it adds 5 files, +0.9MB package size. It does bake in assumptions about the iwlwifi version naming.

Happy to put together a PR for whatever direction you recommend, or test candidate builds on this hardware.

@Viacheslav / @c-po any thoughts on the above issue? I'd be happy to draft a PR based on whichever path you recommend.

Thanks.