From nobody Sun May 17 23:37:59 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4gJcn33d1Bz6dG1g for ; Sun, 17 May 2026 23:37:59 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R13" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gJcn31sPzz3wTB for ; Sun, 17 May 2026 23:37:59 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1779061079; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=9RiIfXZefOj+NkuM2AvWZlT0zmUKoCRK1XuW5wttoZ4=; b=jUaSRGHeRGcbxfk8am8bC+dsDniM3aiTKk7ThOCETVmEvazoeYT6/YmtzPLA64a7JloDNX 6sWliY9dt5vHiMRJEYKlDqqlPve1douY7LRUoRa+lCoOqNhI4ueWhVuIWkMWipFIwkTSp2 +mH1USivyscujLu5enIppqbfmElfQo5qt80DI2x0SJIusjfPyq/WXlLgXv5jBuEOaQYYku eaMu9dGN9Jv4qG3g/XVTuaL9Yj1pHQZaSI7NS7qtf3k7gvQ+JQCv8CiRhDNEXyRgsVjDoq gyZUCZa6ml6g11BtetJYcMpcQfIVQduzhtyfN3FC4L6xGu3mb0ksTkqYnfzw7g== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1779061079; a=rsa-sha256; cv=none; b=U8+YS9UIY1LLIH7YCinZ77tk1ZT+hD5ry/W6I5utlOvgne0kmEYWuBmmsOcvVsXB+5Yp08 gjiR5C1RjSC1+Od5V3WzmmKi6WdEtDVjPiYkyNcbKZOOSj06l5XhsThw2lXaE5R4lr0ABo 4tkMJS1+TOYTclQe07X8m8ZG5G9pmdRKVSc+mD3XXZeEmXyU6LX4tBY/GbXDq/SYP4axY7 p3PdnWnmcFHgCsqqkIipsQcVguRLLP0P+nUNBckbxTBKQfe+Gg7y/LHbkIjhs3t5fEw+SC pDSP1y5P9jlHgLLlCR5b96sTARxC4u8egAMH4ZAm48AtoEg6djP5JvWivKP4wA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1779061079; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=9RiIfXZefOj+NkuM2AvWZlT0zmUKoCRK1XuW5wttoZ4=; b=PYjjOslqpxUfllN6LWnVszW6i+gOtLvsu33ypmUCDrGKY/08Xw8Lv81061hZEquAX1LePz 4CMRAx2N8ZMz28wFHUMaxAHFn8AR6fh8WBYZOwsuREjbdy1871ox/3F0Ocys7GP9YaQ4aV 0dCQwAacvCmJa8gLTELsaXkJHBtawO/IBin2Pz8ltruJtXMRspVGgKVJ5LldWohrEdOhWj 26LsxQ26+0BJiU9RIMKZMhXmvedftrqa1Ri9ibIpqpkMUP7jfX4Oi9wbiD7yHr11MKyKJY ywLQGUQjcuMJp0KClPCYNqvuI6pW8v5X4h3jar6kOBXfUzqsL6STX+0mtdT0xQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gJcn31CsWz12qW for ; Sun, 17 May 2026 23:37:59 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 1cfc1 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sun, 17 May 2026 23:37:59 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Bjoern A. Zeeb Subject: git: 4f6c60c3d3c4 - main - iwlwifi: firmware: reduce script to extract fwget information List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: bz X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 4f6c60c3d3c44aa3df23f280f2fe247f7a930efa Auto-Submitted: auto-generated Date: Sun, 17 May 2026 23:37:59 +0000 Message-Id: <6a0a5157.1cfc1.29a6c8b5@gitrepo.freebsd.org> The branch main has been updated by bz: URL: https://cgit.FreeBSD.org/src/commit/?id=4f6c60c3d3c44aa3df23f280f2fe247f7a930efa commit 4f6c60c3d3c44aa3df23f280f2fe247f7a930efa Author: Bjoern A. Zeeb AuthorDate: 2026-05-17 23:25:21 +0000 Commit: Bjoern A. Zeeb CommitDate: 2026-05-17 23:37:12 +0000 iwlwifi: firmware: reduce script to extract fwget information Due to driver changes it is no longer feasible to extract the full PCI ID / firmware / card type information in one go as we used to be able to. We have already changed the way we extract firmware information for ports and marked the iwlwififw.4 man page as obsolete. Reduce the script to simply extarct the fwget(8) information and, compared to the old times, sort each section so diffs will be easier to see in the future. This was particular helpful this time to make sure we do not lose entries with the change of technique. We also keep the script in the best perl spirit to do the job but not to win a price, especially given it seems we have to change matters every (other) year. Given we can no longer extract firmware information for the PCI IDs, we need to "manually" check against the ports that names match. Ideally we will simplify things for everything "mld-only" one day to only have a single firmware package for these (even if size increases slightly). Sponsored by: The FreeBSD Foundation MFC after: 3 days --- sys/contrib/dev/iwlwifi/zzz_fw_ports_fwget.sh | 444 +++++--------------------- 1 file changed, 85 insertions(+), 359 deletions(-) diff --git a/sys/contrib/dev/iwlwifi/zzz_fw_ports_fwget.sh b/sys/contrib/dev/iwlwifi/zzz_fw_ports_fwget.sh index afbd52b9fa40..c817aff071bf 100644 --- a/sys/contrib/dev/iwlwifi/zzz_fw_ports_fwget.sh +++ b/sys/contrib/dev/iwlwifi/zzz_fw_ports_fwget.sh @@ -2,376 +2,102 @@ #- # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2024-2025 The FreeBSD Foundation +# Copyright (c) 2024-2026 The FreeBSD Foundation # # This software was developed by Björn Zeeb # under sponsorship from the FreeBSD Foundation. # # This is neither efficient nor elegant but we need it few times -# a year and it does the job. -# -# -# USAGE: please check out the correct tag/hash for ports in the -# linux-firmware.git repository you point this script to. -# -# USAGE: please make sure to pre-load if_iwlwifi.ko so that we -# have access to the sysctl. You do not need to have a supported -# card in the system. -# In case that is not possible you can save the results to a file -# and provide that locally. It will be renamed at the end of the -# run. +# a year and it does the job. And it turns out there is a lot of +# churn so keep the solutions quick and dirty. # set -e -# sysctl -n compat.linuxkpi.iwlwifi_pci_ids_name > iwlwifi_pci_ids_name.txt -PCI_IDS_FILE=iwlwifi_pci_ids_name.txt -D_PCI_IDS_FILE=`pwd`/${PCI_IDS_FILE} - -################################################################################ -# -# Check pre-reqs -# -if [ $# -ne 1 ]; then - printf "USAGE: %s /path/to/linux-firmware.git\n" $0 >&2 - exit 1 -fi - -if [ ! -d cfg/ -o ! -e cfg/bz.c ]; then - printf "ERROR: run from iwlwifi driver directory; no cfg/bz.c here\n" >&2 - exit 1 -fi - -LFWDIR=${1} -if test ! -d ${LFWDIR} -o ! -e ${LFWDIR}/WHENCE; then - printf "ERROR: cannot find linux-firmware.git at '%s'\n" ${LFWDIR} >&2 - exit 1 -fi - -if test -r ${D_PCI_IDS_FILE}; then - printf "NOTICE: using proovided ${D_PCI_IDS_FILE}\n" >&2 -else - - kldstat -n if_iwlwifi.ko > /dev/null 2>&1 - rc=$? - case ${rc} in - 0) ;; - *) printf "ERROR: please pre-load if_iwlwifi.ko (you do not need a device)\n" >&2 - exit 1 - ;; - esac - - sysctl -N compat.linuxkpi.iwlwifi_pci_ids_name > /dev/null 2>&1 - rc=$? - case ${rc} in - 0) sysctl -n compat.linuxkpi.iwlwifi_pci_ids_name > ${D_PCI_IDS_FILE} - ;; - *) printf "ERROR: cannot get compat.linuxkpi.iwlwifi_pci_ids_name\n" >&2 - exit 1 - ;; - esac -fi - -# We need to be in the config directory for simplicity. -cd cfg - -################################################################################ - -# Get a list of all device/firmware flavors as seen/supported by the driver. -flavors=$(awk -F\\t '{ - if (/^$/) { next; } - if ($5 == "undefined") { next; } - print tolower($5); -}' ${D_PCI_IDS_FILE} | sort -V | uniq) - -################################################################################ -# -# Helper functions. -# - -# -# This uses a hack (cpp) to expand some macros for us and parses out the result -# which is the firmware name with the maximum FW version supported for that -# firmware. -# We then go and check that said firmware actually exists in linux-firmware.git. -# We try to find a lower version number if the "MAX" version given from the cpp -# output does not (yet) publicly exist. -# .pnvm files are now properly listed as MODULE_FIRMWARE so no more magic needed -# for them. -# Given the filename matches a "flavor" at this point, we then group all the -# available firmware files from this flavor together and print it as a ports -# Makefile variable. -# -# We also print some other meta-data that callers will filter out depending on -# their needs to generate other lists and mappings. -# +unsortedf=$(mktemp -p /tmp iwlwifi-fwget-unsorted.XXXXXX) +sortedf=$(mktemp -p /tmp iwlwifi-fwget-sorted.XXXXXX) +:> ${unsortedf} +:> ${sortedf} -# For each get a list of firmware names we know. -list_fw() -{ - for f in ${flavors}; do - #echo "==> ${f}" - #awk -F \\t -v flav=${f} '{ - # if ($5 != flav) { next; } - # # No firmwre; skip. - # if ($3 ~ /^$/) { next; } - # if ($3 == "(null)") { next; }; - # print $3; - #}' ${D_PCI_IDS_FILE} | sort | uniq - - # For now the flavor names and the file names are 1:1 which makes this - # a lot easier (given some sysctl/file entries are not able to list - # their firmware but we know their "flavor". - l=$(cpp ${f}.c 2>&1 | awk ' - /^MODULE_FIRMWARE\(/ { - gsub(/"/, ""); - gsub("__stringify\\(", ""); - gsub("\\);$", ""); - gsub("\\)", ""); - gsub("^MODULE_FIRMWARE\\(", ""); - gsub(" ", ""); - printf "%s\n", $0; - }' | sort -V | uniq) - #echo "${l}" - - lx="" - for fx in ${l}; do - if test -e ${LFWDIR}/${fx}; then - lx="${lx} ${fx}" - - # Check for matching .pnvm file. - # They are now properly listed in MODULE_FIRMWARE() as well so no more magic. - #px=$(echo ${fx} | awk '{ gsub("-[[:digit:]]*.ucode", ".pnvm"); print; }') - #if test -e ${LFWDIR}/${px}; then - # lx="${lx} ${px}" - #fi - else - case "${fx}" in - *.pnvm) - printf "NOTICE: pnvm file not found for '%s'\n" ${fx} >&2 - ;; - *.ucode) - # Try lowering the version number. - bn=$(echo ${fx} | awk '{ gsub("-[[:digit:]]*.ucode", ""); print; }') - vn=$(echo ${fx} | awk '{ gsub(".ucode$", ""); gsub("^.*-", ""); print; }') - #echo "BN ${bn} VN ${vn}" - # Single digits are not zero-padded so just ${i} will be fine. - for i in `jot ${vn} ${vn} 1`; do - xn="${bn}-${i}.ucode" - if test -e ${LFWDIR}/${xn}; then - lx="${lx} ${xn}" - break - fi - done - ;; - *) - printf "NOTICE: file for unknown firmware type not found for '%s'\n" ${fx} >&2 - ;; - esac - fi - done - - # Get a count so we can automatically add \\ apart from the last line. - fn=$(echo "${lx}" | wc -w | awk '{ print $1 }') - - #echo "==> ${f} :: ${fn} :: ${lx}" - - if test ${fn} -gt 0; then - - # Ports FLAVOR names are [a-z0-9_]. If needed add more mangling magic here. - flav=`echo ${f} | awk '{ printf "%s", tolower($0); }'` - - echo "FWS ${flav}" - echo "DISTFILES_${flav}= \\" - for fz in ${lx}; do echo "${fz}"; done | \ - awk -v fn=$fn -v fwg=${flav} '{ - if (FNR == fn) { x="" } else { x=" \\" }; - printf "\t%s${DISTURL_SUFFIX}%s\n", $0, x; - fwn=$0; - gsub("-[[:digit:]]*\.ucode$", "", fwn); - printf "FWGET %s %s\n", fwg, fwn; - }' - fi - - done +cpp -DCONFIG_IWLMVM -DCONFIG_IWLMLD \ + -I../../../compat/linuxkpi/common/include pcie/drv.c 2> /dev/null | \ +grep __builtin_choose_expr | \ +awk 'BEGIN { + lt="" } - -################################################################################ -# -# Generate the PORTS file template. -# - -fwsl=$(list_fw | grep ^FWS | awk '{ print $2 }') -# Get a count so we can automatically add \\ apart from the last line. -fn=$(echo "${fwsl}" | wc -w | awk '{ print $1 }') - -if test ${fn} -gt 0; then - - portsfile=$(mktemp -p /tmp iwlwifi-fwport.XXXXXX) - - :> ${portsfile} - ( - echo "FWSUBS= \\" - for sz in ${fwsl}; do echo "${sz}"; done | \ - awk -v fn=$fn '{ if (FNR == fn) { x="" } else { x=" \\" }; printf "\t%s%s\n", $0, x; }' - - echo - echo "# Do not prefix with empty \${FWSUBDIR}/!" - list_fw | grep -v ^FWS | grep -v ^FWGET - - echo - echo "DISTFILES_\${FWDRV}= \\" - for sz in ${fwsl}; do echo "${sz}"; done | \ - awk -v fn=$fn '{ if (FNR == fn) { x="" } else { x=" \\" }; printf "\t${DISTFILES_%s}%s\n", $0, x; }' - echo "DISTFILES_\${FWDRV}_lic=" - ) >> ${portsfile} - - printf "INFO: wifi-firmware-iwlwifi-kmod template at %s\n" ${portsfile} >&2 -fi - -################################################################################ -# -# Generate a temporary firmware -> flavor mapping table for fwget generation. -# - -mapfile=$(mktemp -p /tmp iwlwifi-mapfile.XXXXXX) -:> ${mapfile} - -fwgl=$(list_fw | grep FWGET) -# Get a count so we can automatically add \\ apart from the last line. -fn=$(echo "${fwgl}" | wc -w | awk '{ print $1 }') -if test ${fn} -gt 0; then - - ( - list_fw | grep FWGET | grep -v '.pnvm' | \ - while read x flav fw; do - printf "%s\t%s\n" ${fw} ${flav} - done | \ - sort -n | uniq - ) >> ${mapfile} -fi - -################################################################################ -# -# Try to generate the PCI ID -> port flavor mapping -# -# We get PCI ID, description, firmware base from the sysctl and can work our -# way back from fw name base to flavor via the mapping table file. -# - -fwgetfile=$(mktemp -p /tmp iwlwifi-fwget.XXXXXX) -:> ${fwgetfile} - -awk 'BEGIN { FS="\t"; } { - # Skip empty lines. - if (/^$/) { next; } - # Skip "undefined" flavors as we have no idea what chipset. - if ($5 == "undefined") { next; } - - # No firmware name; do not skip! - # All we need is the flavor, which we now always have. - #if ($3 == "(null)") { next; }; - - FLAV=tolower($5); - - split($1, i, "/"); - gsub("\t.*$", "", i[4]); - - # Not an Intel Vednor ID; skip. - if (i[1] != "0x8086") { next; }; - - # No defined device ID; skip. - if (i[2] == "0xffff") { next; }; - - # Adjust wildcards or a ill-printed 0. - if (i[3] == "0xffffffff") { i[3] = "*"; }; - if (i[4] == "000000") { i[4] = "0x0000"; }; - if (i[4] == "0xffffffff") { i[4] = "*"; }; - if (i[4] == "0xffff") { i[4] = "*"; }; - - printf "%s\t%s/%s/%s\n", FLAV, i[2], i[3], i[4]; -}' ${D_PCI_IDS_FILE} | \ -sort -V | uniq | \ -while read flav match; do - - #flav=$(awk -v fw=$fw '{ if ($1 == fw) { print $2; } }' ${mapfile}) - #echo "${fw} :: ${match} :: ${flav}" - - if test "${flav}" != ""; then - printf "${flav}\t${match}\t${flav}\n" - else - #echo "NO FLAV ${fw} ${match}" >&2 - fi - -done | \ -awk 'BEGIN { FS="\t"; FWN=""; } -{ - FW=$1; - if (FWN != FW) { printf "\n\t# %s\n", FW; FWN=FW; }; - - printf "\t%s) addpkg \"wifi-firmware-iwlwifi-kmod-%s\"; return 1 ;;\n", $2, $3; -} END { - printf "\n"; -}' >> ${fwgetfile} - -printf "INFO: fwget pci_network_intel template at %s\n" ${fwgetfile} >&2 - -################################################################################ -# -# Try to build the iwlwififw.4 bits too. -# - -dl=$(grep -v ^$ ${D_PCI_IDS_FILE} | uniq | \ -awk ' -{ - # Sourt out duplicate lines. - if (dup[$0]++) { next; } - - split($0, a, "\t"); - ids=a[1]; - name=a[2]; - fw=a[3]; - flavor=a[5]; - - #my ($v, $d, $sv, $sd) = split("/", $ids); - split(ids, i, "/"); - gsub("^0xffff+", "any", i[1]); - gsub("^0xffff+", "any", i[2]); - gsub("^0xffff+", "any", i[3]); - gsub("^0xffff+", "any", i[4]); - - if (name == "") { name="(unknown)"; } - if (fw == "") { fw="(unknown)"; } - if (flavor == "") { flavor="iwlwifi"; } - if (flavor == "undefined") { flavor="iwlwifi"; } - - # iwlwififw.4 - printf ".It \"\"\n.It %s\n.It %s Ta %s Ta %s Ta %s Ta %s Ta %s\n", name, i[1], i[2], i[3], i[4], flavor, fw; - - # wiki - # XXX TODO possibly quote some in `` to avoid automatic linking? - # || PCI IDs || Chipset Name || Firmware prefix || Comment || - printf "WIKI || %s / %s / %s / %s || %s || %s || ||\n", i[1], i[2], i[3], i[4], name, fw; - if ((FNR % 25) == 0) { printf "WIKI \n"; } -}') - -manfwfile=$(mktemp -p /tmp iwlwifi-iwlwififw4.XXXXXX) -:> ${manfwfile} -echo "${dl}" | grep -v ^WIKI >> ${manfwfile} -printf "INFO: share/man/man4/iwlwififw.4 template at %s\n" ${manfwfile} >&2 - -wikifile=$(mktemp -p /tmp iwlwifi-wiki.XXXXXX) -:> ${wikifile} -echo "${dl}" | awk '/^WIKI / { gsub("^WIKI ", ""); print; }' >> ${wikifile} -printf "INFO: WIKI template at %s\n" ${wikifile} >&2 - - -################################################################################ -# -# Cleanup -# -rm ${mapfile} -mv -f ${D_PCI_IDS_FILE} ${D_PCI_IDS_FILE}.old + if (!/.vendor = 0x8086,/) { + printf "ERROR: %s\n", $0; + exit + } + + d=$6; + sv=$9; + sd=$12; + t=$15; + + + gsub("\\(", "", d); + gsub(")", "", d); + gsub(",", "", d); + + gsub("\\(", "", sv); + gsub(")", "", sv); + gsub(",", "", sv); + + gsub("\\(", "", sd); + gsub(")", "", sd); + gsub(",", "", sd); + + gsub("-1U", "*", d); + gsub("-1U", "*", sv); + gsub("-1U", "*", sd); + + gsub("^.*\\(", "", t); + gsub(")", "", t); + gsub(",", "", t); + gsub("^iwl_", "", t); + gsub("^iwl", "", t); + gsub("_mac_cfg$", "", t); + gsub("_.*$", "", t); + + t=tolower(t) + if (t != lt) { + printf "\n\t# %s\n", t; + lt = t; + } + if (t == "9560") { t = "9000"; } + if (t == "ax200") { t = "22000"; } + if (t == "qu") { t = "22000"; } + if (t == "cc") { t = "22000"; } + if (t == "ma") { t = "ax210"; } + if (t == "so") { t = "ax210"; } + if (t == "ty") { t = "ax210"; } + if (t == "gl") { t = "bz"; } + if (t != "7000" && t != "8000" && t != "9000" && t != "22000" && t != "ax210" && t != "bz" && t != "sc") { + printf "ERROR: invalid flavor '%s': %s\n", t, $0; + exit + } + + printf "\t%s/%s/%s) addpkg \"wifi-firmware-iwlwifi-kmod-%s\"; return 1 ;;\n", tolower(d), tolower(sv), tolower(sd), t; + +}' > ${unsortedf} + +( for f in \ + 7000 \ + 8000 \ + 9000 \ + 22000 \ + ax210 \ + bz \ + sc ; do + + printf "\n\t# %s\n" ${f} + grep "wifi-firmware-iwlwifi-kmod-${f}" ${unsortedf} | sort -n + +done; echo ) > ${sortedf} + +rm -f ${unsortedf} +printf "INFO: fwget(8) template at %s\n" ${sortedf} >&2 # end