Intel BE200 (Gale Peak) WiFi broken on kernel 7.0.x: driver wants ucode >=100, pve-firmware ships 96 (fix + 3-line patch)

Jul 28, 2023
1
0
6
Posting this as a solved-with-workaround report, since the two existing BE200/BE202 threads here end without a fix and the cause turns out to be a packaging gap rather than anything wrong with the hardware.

Symptoms

Intel Wi-Fi 7 BE200 refuses to initialise. No wireless interface appears, though the card is detected correctly:

Code:
iwlwifi 0000:ad:00.0: Detected Intel(R) Wi-Fi 7 BE200 320MHz
iwlwifi 0000:ad:00.0: Direct firmware load for iwlwifi-gl-c0-fm-c0-c101.ucode failed with error -2
iwlwifi 0000:ad:00.0: Direct firmware load for iwlwifi-gl-c0-fm-c0-c100.ucode failed with error -2
iwlwifi 0000:ad:00.0: Direct firmware load for iwlwifi-gl-c0-fm-c0-102.ucode failed with error -2
iwlwifi 0000:ad:00.0: Direct firmware load for iwlwifi-gl-c0-fm-c0-101.ucode failed with error -2
iwlwifi 0000:ad:00.0: Direct firmware load for iwlwifi-gl-c0-fm-c0-100.ucode failed with error -2
iwlwifi 0000:ad:00.0: no suitable firmware found!
iwlwifi 0000:ad:00.0: minimum version required: iwlwifi-gl-c0-fm-c0-100
iwlwifi 0000:ad:00.0: maximum version supported: iwlwifi-gl-c0-fm-c0-c101
iwlwifi 0000:ad:00.0: check git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git

Environment

Code:
pve-manager/9.2.5, kernel 7.0.14-8-pve
pve-firmware 3.18-5
Intel Core Ultra 9 285HX (Arrow Lake-HX)
ad:00.0 Network controller [0280]: Intel Corporation Wi-Fi 7(802.11be) AX1775*/AX1790*/BE20*/BE401/BE1750* 2x2 [8086:272b] (rev 1a)
        Subsystem: Intel Corporation BE200 320MHz [Gale Peak] [8086:00f4]

pve-firmware 3.18-5 ships only these for this device:

Code:
# dpkg -L pve-firmware | grep gl-c0-fm-c0
/lib/firmware/intel/iwlwifi/iwlwifi-gl-c0-fm-c0-86.ucode.xz
/lib/firmware/intel/iwlwifi/iwlwifi-gl-c0-fm-c0-92.ucode.xz
/lib/firmware/intel/iwlwifi/iwlwifi-gl-c0-fm-c0-96.ucode.xz
/lib/firmware/intel/iwlwifi/iwlwifi-gl-c0-fm-c0.pnvm.xz
/lib/firmware/iwlwifi-gl-c0-fm-c0-86.ucode.xz
/lib/firmware/iwlwifi-gl-c0-fm-c0-92.ucode.xz
/lib/firmware/iwlwifi-gl-c0-fm-c0-96.ucode.xz
/lib/firmware/iwlwifi-gl-c0-fm-c0.pnvm.xz

96 < 100, hence no usable firmware. (The real files live under intel/iwlwifi/ with compatibility symlinks at the top level, matching the upstream directory layout. The driver requests the bare name, so either location works.)

What does NOT work

Installing Debian's firmware package. It conflicts with pve-firmware, so apt tries to remove proxmox-ve and the hook correctly aborts:

Code:
# apt-get install firmware-iwlwifi
W: (pve-apt-hook) If you are unsure why 'proxmox-ve' would be removed, please verify
E: Sub-process /usr/share/proxmox-ve/pve-apt-hook returned an error code (1)

Nothing was broken by this - proxmox-ve and pve-firmware stayed installed and dpkg --audit was clean afterwards - but it is a dead end.

Also worth noting: Debian trixie's own firmware-iwlwifi candidate (20250410-2) only goes to -97, so even if it did install it would not help. You need a newer one.

What works

Extract the single needed file from a newer Debian package without installing it:

Code:
cd /tmp
curl -fsSLO https://deb.debian.org/debian/pool/non-free-firmware/f/firmware-nonfree/firmware-iwlwifi_20260622-1~bpo13+1_all.deb
dpkg-deb -x firmware-iwlwifi_20260622-1~bpo13+1_all.deb x
cp x/usr/lib/firmware/iwlwifi-gl-c0-fm-c0-c101.ucode /lib/firmware/
modprobe -r iwlwifi; modprobe iwlwifi

Result:

Code:
iwlwifi 0000:ad:00.0: loaded firmware version 101.6e695a70.0 gl-c0-fm-c0-c101.ucode op_mode iwlmld
iwlwifi 0000:ad:00.0: base HW address: <redacted>
iwlwifi 0000:ad:00.0 wlo5: renamed from wlan0

Two things I would do differently to the recipe in the older thread here:

  1. Copy only the one file, not the whole tree. Copying everything shadows the ~94 iwlwifi files pve-firmware manages with unmanaged duplicates.
  2. update-initramfs is not needed. iwlwifi is not required to reach the root device.

Pick the version inside the driver's stated window, not the newest available. That package also contains -c102 and -c103, which are above "maximum version supported" and get rejected exactly like the too-old ones. Check the min/max lines in your own journal.

The file is unmanaged by dpkg, but pve-firmware only ships up to -96, so nothing overwrites it. It will need redoing if a future kernel moves the accepted window.

Root cause

The firmware is not missing from the tree Proxmox imports - it is never requested.

pve-firmware 3.18-5 imports linux-firmware 20260622 - commit fe38e0a ("update linux-firmware to 20260622"), and the 3.18-5 changelog entry reads "update linux-firmware to 20260622 tag". That tag contains -98, -100, -101, -c101, -c102 and -c103 for this device; I verified this by extracting Debian's package built from the same tag.

The auto-generated firmware list asks for an unexpanded C macro instead of a version:

Code:
fwlist-7.0.14-1-pve-amd64:1294
iwlwifi-gl-c0-fm-c0-cIWL_BZ_UCODE_CORE_MAX.ucode kernel/drivers/net/wireless/intel/iwlwifi/iwlwifi.ko

which comes straight from the driver's own declaration:

Code:
# modinfo iwlwifi | grep gl-c0-fm-c0
firmware:       iwlwifi-gl-c0-fm-c0-cIWL_BZ_UCODE_CORE_MAX.ucode

This is not unique to Gale Peak - fwlist-7.0.14-1-pve-amd64 has the same unexpanded macro on lines 1285, 1286, 1287 and 1293 for bz-a0-fm-b0, bz-a0-fm-c0, bz-a0-fm4-b0 and gl-b0-fm-b0 respectively.

Both that bogus filename and the 6.17 list's iwlwifi-gl-c0-fm-c0-102.ucode (not present in the imported tree - it has -c102, not -102) are in the $ALLOW_MISSING hash in assemble-firmware.pl, on lines 404 and 403, so the build only emits a "WARN: allowed to skip" and affected devices silently get nothing usable.

Suggested fix for the maintainers

Forcing the three versions that exist in the imported tree and fall inside the driver's window is enough. Against pve-firmware.git this applies cleanly and ships no new files, only requests ones already present:

Code:
--- a/fwlist-iwlwifi-extra
+++ b/fwlist-iwlwifi-extra
@@ -93,3 +93,6 @@ intel/ibt-hw-37.8.10-fw-1.10.2.27.d.bseq kernel/drivers/bluetooth/btintel.ko
 intel/ibt-hw-37.8.10-fw-1.10.3.11.e.bseq kernel/drivers/bluetooth/btintel.ko
 intel/ibt-hw-37.8.10-fw-22.50.19.14.f.bseq kernel/drivers/bluetooth/btintel.ko
 intel/ibt-hw-37.8.bseq kernel/drivers/bluetooth/btintel.ko
+iwlwifi-gl-c0-fm-c0-100.ucode kernel/drivers/net/wireless/intel/iwlwifi/iwlwifi.ko
+iwlwifi-gl-c0-fm-c0-101.ucode kernel/drivers/net/wireless/intel/iwlwifi/iwlwifi.ko
+iwlwifi-gl-c0-fm-c0-c101.ucode kernel/drivers/net/wireless/intel/iwlwifi/iwlwifi.ko

Adding -c102 and -c103 as well would avoid needing another change when the driver window next moves.

I have this as a proper git format-patch with a Signed-off-by if it is useful, but I have not sent it to pve-devel as I have not signed the CLA. Happy for anyone to take it. The same treatment presumably applies to the other four families listed above, though I only have BE200 hardware to test.