196190b4fSBjoern A. Zeeb#!/bin/sh 296190b4fSBjoern A. Zeeb#- 396190b4fSBjoern A. Zeeb# SPDX-License-Identifier: BSD-2-Clause 496190b4fSBjoern A. Zeeb# 5*fc40f4caSBjoern A. Zeeb# Copyright (c) 2024-2025 The FreeBSD Foundation 696190b4fSBjoern A. Zeeb# 796190b4fSBjoern A. Zeeb# This software was developed by Björn Zeeb 896190b4fSBjoern A. Zeeb# under sponsorship from the FreeBSD Foundation. 996190b4fSBjoern A. Zeeb# 1096190b4fSBjoern A. Zeeb# This is neither efficient nor elegant but we need it few times 1196190b4fSBjoern A. Zeeb# a year and it does the job. 1296190b4fSBjoern A. Zeeb# 1396190b4fSBjoern A. Zeeb# 1496190b4fSBjoern A. Zeeb# USAGE: please check out the correct tag/hash for ports in the 1596190b4fSBjoern A. Zeeb# linux-firmware.git repository you point this script to. 1696190b4fSBjoern A. Zeeb# 1796190b4fSBjoern A. Zeeb# USAGE: please make sure to pre-load if_iwlwifi.ko so that we 1896190b4fSBjoern A. Zeeb# have access to the sysctl. You do not need to have a supported 1996190b4fSBjoern A. Zeeb# card in the system. 2096190b4fSBjoern A. Zeeb# In case that is not possible you can save the results to a file 2196190b4fSBjoern A. Zeeb# and provide that locally. It will be renamed at the end of the 2296190b4fSBjoern A. Zeeb# run. 2396190b4fSBjoern A. Zeeb# 2496190b4fSBjoern A. Zeeb 2596190b4fSBjoern A. Zeebset -e 2696190b4fSBjoern A. Zeeb 2796190b4fSBjoern A. Zeeb# sysctl -n compat.linuxkpi.iwlwifi_pci_ids_name > iwlwifi_pci_ids_name.txt 2896190b4fSBjoern A. ZeebPCI_IDS_FILE=iwlwifi_pci_ids_name.txt 2996190b4fSBjoern A. ZeebD_PCI_IDS_FILE=`pwd`/${PCI_IDS_FILE} 3096190b4fSBjoern A. Zeeb 3196190b4fSBjoern A. Zeeb################################################################################ 3296190b4fSBjoern A. Zeeb# 3396190b4fSBjoern A. Zeeb# Check pre-reqs 3496190b4fSBjoern A. Zeeb# 3596190b4fSBjoern A. Zeebif [ $# -ne 1 ]; then 3696190b4fSBjoern A. Zeeb printf "USAGE: %s /path/to/linux-firmware.git\n" $0 >&2 3796190b4fSBjoern A. Zeeb exit 1 3896190b4fSBjoern A. Zeebfi 3996190b4fSBjoern A. Zeeb 4096190b4fSBjoern A. Zeebif [ ! -d cfg/ -o ! -e cfg/bz.c ]; then 4196190b4fSBjoern A. Zeeb printf "ERROR: run from iwlwifi driver directory; no cfg/bz.c here\n" >&2 4296190b4fSBjoern A. Zeeb exit 1 4396190b4fSBjoern A. Zeebfi 4496190b4fSBjoern A. Zeeb 4596190b4fSBjoern A. ZeebLFWDIR=${1} 4696190b4fSBjoern A. Zeebif test ! -d ${LFWDIR} -o ! -e ${LFWDIR}/WHENCE; then 4796190b4fSBjoern A. Zeeb printf "ERROR: cannot find linux-firmware.git at '%s'\n" ${LFWDIR} >&2 4896190b4fSBjoern A. Zeeb exit 1 4996190b4fSBjoern A. Zeebfi 5096190b4fSBjoern A. Zeeb 51*fc40f4caSBjoern A. Zeebif test -r ${D_PCI_IDS_FILE}; then 52*fc40f4caSBjoern A. Zeeb printf "NOTICE: using proovided ${D_PCI_IDS_FILE}\n" >&2 53*fc40f4caSBjoern A. Zeebelse 54*fc40f4caSBjoern A. Zeeb 5596190b4fSBjoern A. Zeeb kldstat -n if_iwlwifi.ko > /dev/null 2>&1 5696190b4fSBjoern A. Zeeb rc=$? 5796190b4fSBjoern A. Zeeb case ${rc} in 5896190b4fSBjoern A. Zeeb 0) ;; 5996190b4fSBjoern A. Zeeb *) printf "ERROR: please pre-load if_iwlwifi.ko (you do not need a device)\n" >&2 6096190b4fSBjoern A. Zeeb exit 1 6196190b4fSBjoern A. Zeeb ;; 6296190b4fSBjoern A. Zeeb esac 6396190b4fSBjoern A. Zeeb 6496190b4fSBjoern A. Zeeb sysctl -N compat.linuxkpi.iwlwifi_pci_ids_name > /dev/null 2>&1 6596190b4fSBjoern A. Zeeb rc=$? 6696190b4fSBjoern A. Zeeb case ${rc} in 6796190b4fSBjoern A. Zeeb 0) sysctl -n compat.linuxkpi.iwlwifi_pci_ids_name > ${D_PCI_IDS_FILE} 6896190b4fSBjoern A. Zeeb ;; 6996190b4fSBjoern A. Zeeb *) printf "ERROR: cannot get compat.linuxkpi.iwlwifi_pci_ids_name\n" >&2 7096190b4fSBjoern A. Zeeb exit 1 7196190b4fSBjoern A. Zeeb ;; 7296190b4fSBjoern A. Zeeb esac 7396190b4fSBjoern A. Zeebfi 7496190b4fSBjoern A. Zeeb 7596190b4fSBjoern A. Zeeb# We need to be in the config directory for simplicity. 7696190b4fSBjoern A. Zeebcd cfg 7796190b4fSBjoern A. Zeeb 7896190b4fSBjoern A. Zeeb################################################################################ 7996190b4fSBjoern A. Zeeb 8096190b4fSBjoern A. Zeeb# Get a list of all device/firmware flavors as seen/supported by the driver. 8196190b4fSBjoern A. Zeebflavors=$(awk -F\\t '{ 8296190b4fSBjoern A. Zeeb if (/^$/) { next; } 8396190b4fSBjoern A. Zeeb if ($5 == "undefined") { next; } 8496190b4fSBjoern A. Zeeb print tolower($5); 8596190b4fSBjoern A. Zeeb}' ${D_PCI_IDS_FILE} | sort -V | uniq) 8696190b4fSBjoern A. Zeeb 8796190b4fSBjoern A. Zeeb################################################################################ 8896190b4fSBjoern A. Zeeb# 8996190b4fSBjoern A. Zeeb# Helper functions. 9096190b4fSBjoern A. Zeeb# 9196190b4fSBjoern A. Zeeb 9296190b4fSBjoern A. Zeeb# 9396190b4fSBjoern A. Zeeb# This uses a hack (cpp) to expand some macros for us and parses out the result 9496190b4fSBjoern A. Zeeb# which is the firmware name with the maximum FW version supported for that 9596190b4fSBjoern A. Zeeb# firmware. 9696190b4fSBjoern A. Zeeb# We then go and check that said firmware actually exists in linux-firmware.git. 9796190b4fSBjoern A. Zeeb# We try to find a lower version number if the "MAX" version given from the cpp 9896190b4fSBjoern A. Zeeb# output does not (yet) publicly exist. 9996190b4fSBjoern A. Zeeb# .pnvm files are now properly listed as MODULE_FIRMWARE so no more magic needed 10096190b4fSBjoern A. Zeeb# for them. 10196190b4fSBjoern A. Zeeb# Given the filename matches a "flavor" at this point, we then group all the 10296190b4fSBjoern A. Zeeb# available firmware files from this flavor together and print it as a ports 10396190b4fSBjoern A. Zeeb# Makefile variable. 10496190b4fSBjoern A. Zeeb# 10596190b4fSBjoern A. Zeeb# We also print some other meta-data that callers will filter out depending on 10696190b4fSBjoern A. Zeeb# their needs to generate other lists and mappings. 10796190b4fSBjoern A. Zeeb# 10896190b4fSBjoern A. Zeeb 10996190b4fSBjoern A. Zeeb# For each get a list of firmware names we know. 11096190b4fSBjoern A. Zeeblist_fw() 11196190b4fSBjoern A. Zeeb{ 11296190b4fSBjoern A. Zeeb for f in ${flavors}; do 11396190b4fSBjoern A. Zeeb #echo "==> ${f}" 11496190b4fSBjoern A. Zeeb #awk -F \\t -v flav=${f} '{ 11596190b4fSBjoern A. Zeeb # if ($5 != flav) { next; } 11696190b4fSBjoern A. Zeeb # # No firmwre; skip. 11796190b4fSBjoern A. Zeeb # if ($3 ~ /^$/) { next; } 11896190b4fSBjoern A. Zeeb # if ($3 == "(null)") { next; }; 11996190b4fSBjoern A. Zeeb # print $3; 12096190b4fSBjoern A. Zeeb #}' ${D_PCI_IDS_FILE} | sort | uniq 12196190b4fSBjoern A. Zeeb 12296190b4fSBjoern A. Zeeb # For now the flavor names and the file names are 1:1 which makes this 12396190b4fSBjoern A. Zeeb # a lot easier (given some sysctl/file entries are not able to list 12496190b4fSBjoern A. Zeeb # their firmware but we know their "flavor". 12596190b4fSBjoern A. Zeeb l=$(cpp ${f}.c 2>&1 | awk ' 12696190b4fSBjoern A. Zeeb /^MODULE_FIRMWARE\(/ { 12796190b4fSBjoern A. Zeeb gsub(/"/, ""); 12896190b4fSBjoern A. Zeeb gsub("__stringify\\(", ""); 12996190b4fSBjoern A. Zeeb gsub("\\);$", ""); 13096190b4fSBjoern A. Zeeb gsub("\\)", ""); 13196190b4fSBjoern A. Zeeb gsub("^MODULE_FIRMWARE\\(", ""); 13296190b4fSBjoern A. Zeeb gsub(" ", ""); 13396190b4fSBjoern A. Zeeb printf "%s\n", $0; 13496190b4fSBjoern A. Zeeb }' | sort -V | uniq) 13596190b4fSBjoern A. Zeeb #echo "${l}" 13696190b4fSBjoern A. Zeeb 13796190b4fSBjoern A. Zeeb lx="" 13896190b4fSBjoern A. Zeeb for fx in ${l}; do 13996190b4fSBjoern A. Zeeb if test -e ${LFWDIR}/${fx}; then 14096190b4fSBjoern A. Zeeb lx="${lx} ${fx}" 14196190b4fSBjoern A. Zeeb 14296190b4fSBjoern A. Zeeb # Check for matching .pnvm file. 14396190b4fSBjoern A. Zeeb # They are now properly listed in MODULE_FIRMWARE() as well so no more magic. 14496190b4fSBjoern A. Zeeb #px=$(echo ${fx} | awk '{ gsub("-[[:digit:]]*.ucode", ".pnvm"); print; }') 14596190b4fSBjoern A. Zeeb #if test -e ${LFWDIR}/${px}; then 14696190b4fSBjoern A. Zeeb # lx="${lx} ${px}" 14796190b4fSBjoern A. Zeeb #fi 14896190b4fSBjoern A. Zeeb else 14996190b4fSBjoern A. Zeeb case "${fx}" in 15096190b4fSBjoern A. Zeeb *.pnvm) 15196190b4fSBjoern A. Zeeb printf "NOTICE: pnvm file not found for '%s'\n" ${fx} >&2 15296190b4fSBjoern A. Zeeb ;; 15396190b4fSBjoern A. Zeeb *.ucode) 15496190b4fSBjoern A. Zeeb # Try lowering the version number. 15596190b4fSBjoern A. Zeeb bn=$(echo ${fx} | awk '{ gsub("-[[:digit:]]*.ucode", ""); print; }') 15696190b4fSBjoern A. Zeeb vn=$(echo ${fx} | awk '{ gsub(".ucode$", ""); gsub("^.*-", ""); print; }') 15796190b4fSBjoern A. Zeeb #echo "BN ${bn} VN ${vn}" 15896190b4fSBjoern A. Zeeb # Single digits are not zero-padded so just ${i} will be fine. 15952f8e99eSBjoern A. Zeeb for i in `jot ${vn} ${vn} 1`; do 16096190b4fSBjoern A. Zeeb xn="${bn}-${i}.ucode" 16196190b4fSBjoern A. Zeeb if test -e ${LFWDIR}/${xn}; then 16296190b4fSBjoern A. Zeeb lx="${lx} ${xn}" 16352f8e99eSBjoern A. Zeeb break 16496190b4fSBjoern A. Zeeb fi 16596190b4fSBjoern A. Zeeb done 16696190b4fSBjoern A. Zeeb ;; 16796190b4fSBjoern A. Zeeb *) 16896190b4fSBjoern A. Zeeb printf "NOTICE: file for unknown firmware type not found for '%s'\n" ${fx} >&2 16996190b4fSBjoern A. Zeeb ;; 17096190b4fSBjoern A. Zeeb esac 17196190b4fSBjoern A. Zeeb fi 17296190b4fSBjoern A. Zeeb done 17396190b4fSBjoern A. Zeeb 17496190b4fSBjoern A. Zeeb # Get a count so we can automatically add \\ apart from the last line. 17596190b4fSBjoern A. Zeeb fn=$(echo "${lx}" | wc -w | awk '{ print $1 }') 17696190b4fSBjoern A. Zeeb 17796190b4fSBjoern A. Zeeb #echo "==> ${f} :: ${fn} :: ${lx}" 17896190b4fSBjoern A. Zeeb 17996190b4fSBjoern A. Zeeb if test ${fn} -gt 0; then 18096190b4fSBjoern A. Zeeb 18196190b4fSBjoern A. Zeeb # Ports FLAVOR names are [a-z0-9_]. If needed add more mangling magic here. 18296190b4fSBjoern A. Zeeb flav=`echo ${f} | awk '{ printf "%s", tolower($0); }'` 18396190b4fSBjoern A. Zeeb 18496190b4fSBjoern A. Zeeb echo "FWS ${flav}" 18596190b4fSBjoern A. Zeeb echo "DISTFILES_${flav}= \\" 18696190b4fSBjoern A. Zeeb for fz in ${lx}; do echo "${fz}"; done | \ 18796190b4fSBjoern A. Zeeb awk -v fn=$fn -v fwg=${flav} '{ 18896190b4fSBjoern A. Zeeb if (FNR == fn) { x="" } else { x=" \\" }; 18996190b4fSBjoern A. Zeeb printf "\t%s${DISTURL_SUFFIX}%s\n", $0, x; 19096190b4fSBjoern A. Zeeb fwn=$0; 19196190b4fSBjoern A. Zeeb gsub("-[[:digit:]]*\.ucode$", "", fwn); 19296190b4fSBjoern A. Zeeb printf "FWGET %s %s\n", fwg, fwn; 19396190b4fSBjoern A. Zeeb }' 19496190b4fSBjoern A. Zeeb fi 19596190b4fSBjoern A. Zeeb 19696190b4fSBjoern A. Zeeb done 19796190b4fSBjoern A. Zeeb} 19896190b4fSBjoern A. Zeeb 19996190b4fSBjoern A. Zeeb################################################################################ 20096190b4fSBjoern A. Zeeb# 20196190b4fSBjoern A. Zeeb# Generate the PORTS file template. 20296190b4fSBjoern A. Zeeb# 20396190b4fSBjoern A. Zeeb 20496190b4fSBjoern A. Zeebfwsl=$(list_fw | grep ^FWS | awk '{ print $2 }') 20596190b4fSBjoern A. Zeeb# Get a count so we can automatically add \\ apart from the last line. 20696190b4fSBjoern A. Zeebfn=$(echo "${fwsl}" | wc -w | awk '{ print $1 }') 20796190b4fSBjoern A. Zeeb 20896190b4fSBjoern A. Zeebif test ${fn} -gt 0; then 20996190b4fSBjoern A. Zeeb 21096190b4fSBjoern A. Zeeb portsfile=$(mktemp -p /tmp iwlwifi-fwport.XXXXXX) 21196190b4fSBjoern A. Zeeb 21296190b4fSBjoern A. Zeeb :> ${portsfile} 21396190b4fSBjoern A. Zeeb ( 21496190b4fSBjoern A. Zeeb echo "FWSUBS= \\" 21596190b4fSBjoern A. Zeeb for sz in ${fwsl}; do echo "${sz}"; done | \ 21696190b4fSBjoern A. Zeeb awk -v fn=$fn '{ if (FNR == fn) { x="" } else { x=" \\" }; printf "\t%s%s\n", $0, x; }' 21796190b4fSBjoern A. Zeeb 21896190b4fSBjoern A. Zeeb echo 21996190b4fSBjoern A. Zeeb echo "# Do not prefix with empty \${FWSUBDIR}/!" 22096190b4fSBjoern A. Zeeb list_fw | grep -v ^FWS | grep -v ^FWGET 22196190b4fSBjoern A. Zeeb 22296190b4fSBjoern A. Zeeb echo 22396190b4fSBjoern A. Zeeb echo "DISTFILES_\${FWDRV}= \\" 22496190b4fSBjoern A. Zeeb for sz in ${fwsl}; do echo "${sz}"; done | \ 22596190b4fSBjoern A. Zeeb awk -v fn=$fn '{ if (FNR == fn) { x="" } else { x=" \\" }; printf "\t${DISTFILES_%s}%s\n", $0, x; }' 22696190b4fSBjoern A. Zeeb echo "DISTFILES_\${FWDRV}_lic=" 22796190b4fSBjoern A. Zeeb ) >> ${portsfile} 22896190b4fSBjoern A. Zeeb 22996190b4fSBjoern A. Zeeb printf "INFO: wifi-firmware-iwlwifi-kmod template at %s\n" ${portsfile} >&2 23096190b4fSBjoern A. Zeebfi 23196190b4fSBjoern A. Zeeb 23296190b4fSBjoern A. Zeeb################################################################################ 23396190b4fSBjoern A. Zeeb# 23496190b4fSBjoern A. Zeeb# Generate a temporary firmware -> flavor mapping table for fwget generation. 23596190b4fSBjoern A. Zeeb# 23696190b4fSBjoern A. Zeeb 23796190b4fSBjoern A. Zeebmapfile=$(mktemp -p /tmp iwlwifi-mapfile.XXXXXX) 23896190b4fSBjoern A. Zeeb:> ${mapfile} 23996190b4fSBjoern A. Zeeb 24096190b4fSBjoern A. Zeebfwgl=$(list_fw | grep FWGET) 24196190b4fSBjoern A. Zeeb# Get a count so we can automatically add \\ apart from the last line. 24296190b4fSBjoern A. Zeebfn=$(echo "${fwgl}" | wc -w | awk '{ print $1 }') 24396190b4fSBjoern A. Zeebif test ${fn} -gt 0; then 24496190b4fSBjoern A. Zeeb 24596190b4fSBjoern A. Zeeb ( 24696190b4fSBjoern A. Zeeb list_fw | grep FWGET | grep -v '.pnvm' | \ 24796190b4fSBjoern A. Zeeb while read x flav fw; do 24896190b4fSBjoern A. Zeeb printf "%s\t%s\n" ${fw} ${flav} 24996190b4fSBjoern A. Zeeb done | \ 25096190b4fSBjoern A. Zeeb sort -n | uniq 25196190b4fSBjoern A. Zeeb ) >> ${mapfile} 25296190b4fSBjoern A. Zeebfi 25396190b4fSBjoern A. Zeeb 25496190b4fSBjoern A. Zeeb################################################################################ 25596190b4fSBjoern A. Zeeb# 25696190b4fSBjoern A. Zeeb# Try to generate the PCI ID -> port flavor mapping 25796190b4fSBjoern A. Zeeb# 25896190b4fSBjoern A. Zeeb# We get PCI ID, description, firmware base from the sysctl and can work our 25996190b4fSBjoern A. Zeeb# way back from fw name base to flavor via the mapping table file. 26096190b4fSBjoern A. Zeeb# 26196190b4fSBjoern A. Zeeb 26296190b4fSBjoern A. Zeebfwgetfile=$(mktemp -p /tmp iwlwifi-fwget.XXXXXX) 26396190b4fSBjoern A. Zeeb:> ${fwgetfile} 26496190b4fSBjoern A. Zeeb 26596190b4fSBjoern A. Zeebawk 'BEGIN { FS="\t"; } 26696190b4fSBjoern A. Zeeb{ 26796190b4fSBjoern A. Zeeb # Skip empty lines. 26896190b4fSBjoern A. Zeeb if (/^$/) { next; } 26996190b4fSBjoern A. Zeeb # Skip "undefined" flavors as we have no idea what chipset. 27096190b4fSBjoern A. Zeeb if ($5 == "undefined") { next; } 27196190b4fSBjoern A. Zeeb 27296190b4fSBjoern A. Zeeb # No firmware name; do not skip! 27396190b4fSBjoern A. Zeeb # All we need is the flavor, which we now always have. 27496190b4fSBjoern A. Zeeb #if ($3 == "(null)") { next; }; 27596190b4fSBjoern A. Zeeb 27696190b4fSBjoern A. Zeeb FLAV=tolower($5); 27796190b4fSBjoern A. Zeeb 27896190b4fSBjoern A. Zeeb split($1, i, "/"); 27996190b4fSBjoern A. Zeeb gsub("\t.*$", "", i[4]); 28096190b4fSBjoern A. Zeeb 28196190b4fSBjoern A. Zeeb # Not an Intel Vednor ID; skip. 28296190b4fSBjoern A. Zeeb if (i[1] != "0x8086") { next; }; 28396190b4fSBjoern A. Zeeb 28496190b4fSBjoern A. Zeeb # No defined device ID; skip. 28596190b4fSBjoern A. Zeeb if (i[2] == "0xffff") { next; }; 28696190b4fSBjoern A. Zeeb 28796190b4fSBjoern A. Zeeb # Adjust wildcards or a ill-printed 0. 28896190b4fSBjoern A. Zeeb if (i[3] == "0xffffffff") { i[3] = "*"; }; 28996190b4fSBjoern A. Zeeb if (i[4] == "000000") { i[4] = "0x0000"; }; 29096190b4fSBjoern A. Zeeb if (i[4] == "0xffffffff") { i[4] = "*"; }; 29196190b4fSBjoern A. Zeeb if (i[4] == "0xffff") { i[4] = "*"; }; 29296190b4fSBjoern A. Zeeb 29396190b4fSBjoern A. Zeeb printf "%s\t%s/%s/%s\n", FLAV, i[2], i[3], i[4]; 29496190b4fSBjoern A. Zeeb}' ${D_PCI_IDS_FILE} | \ 29596190b4fSBjoern A. Zeebsort -V | uniq | \ 29696190b4fSBjoern A. Zeebwhile read flav match; do 29796190b4fSBjoern A. Zeeb 29896190b4fSBjoern A. Zeeb #flav=$(awk -v fw=$fw '{ if ($1 == fw) { print $2; } }' ${mapfile}) 29996190b4fSBjoern A. Zeeb #echo "${fw} :: ${match} :: ${flav}" 30096190b4fSBjoern A. Zeeb 30196190b4fSBjoern A. Zeeb if test "${flav}" != ""; then 30296190b4fSBjoern A. Zeeb printf "${flav}\t${match}\t${flav}\n" 30396190b4fSBjoern A. Zeeb else 30496190b4fSBjoern A. Zeeb #echo "NO FLAV ${fw} ${match}" >&2 30596190b4fSBjoern A. Zeeb fi 30696190b4fSBjoern A. Zeeb 30796190b4fSBjoern A. Zeebdone | \ 30896190b4fSBjoern A. Zeebawk 'BEGIN { FS="\t"; FWN=""; } 30996190b4fSBjoern A. Zeeb{ 31096190b4fSBjoern A. Zeeb FW=$1; 31196190b4fSBjoern A. Zeeb if (FWN != FW) { printf "\n\t# %s\n", FW; FWN=FW; }; 31296190b4fSBjoern A. Zeeb 31396190b4fSBjoern A. Zeeb printf "\t%s) addpkg \"wifi-firmware-iwlwifi-kmod-%s\"; return 1 ;;\n", $2, $3; 31496190b4fSBjoern A. Zeeb} END { 31596190b4fSBjoern A. Zeeb printf "\n"; 31696190b4fSBjoern A. Zeeb}' >> ${fwgetfile} 31796190b4fSBjoern A. Zeeb 31896190b4fSBjoern A. Zeebprintf "INFO: fwget pci_network_intel template at %s\n" ${fwgetfile} >&2 31996190b4fSBjoern A. Zeeb 32096190b4fSBjoern A. Zeeb################################################################################ 32196190b4fSBjoern A. Zeeb# 32296190b4fSBjoern A. Zeeb# Try to build the iwlwififw.4 bits too. 32396190b4fSBjoern A. Zeeb# 32496190b4fSBjoern A. Zeeb 32596190b4fSBjoern A. Zeebdl=$(grep -v ^$ ${D_PCI_IDS_FILE} | uniq | \ 32696190b4fSBjoern A. Zeebawk ' 32796190b4fSBjoern A. Zeeb{ 32896190b4fSBjoern A. Zeeb # Sourt out duplicate lines. 32996190b4fSBjoern A. Zeeb if (dup[$0]++) { next; } 33096190b4fSBjoern A. Zeeb 33196190b4fSBjoern A. Zeeb split($0, a, "\t"); 33296190b4fSBjoern A. Zeeb ids=a[1]; 33396190b4fSBjoern A. Zeeb name=a[2]; 33496190b4fSBjoern A. Zeeb fw=a[3]; 335*fc40f4caSBjoern A. Zeeb flavor=a[5]; 33696190b4fSBjoern A. Zeeb 33796190b4fSBjoern A. Zeeb #my ($v, $d, $sv, $sd) = split("/", $ids); 33896190b4fSBjoern A. Zeeb split(ids, i, "/"); 33996190b4fSBjoern A. Zeeb gsub("^0xffff+", "any", i[1]); 34096190b4fSBjoern A. Zeeb gsub("^0xffff+", "any", i[2]); 34196190b4fSBjoern A. Zeeb gsub("^0xffff+", "any", i[3]); 34296190b4fSBjoern A. Zeeb gsub("^0xffff+", "any", i[4]); 34396190b4fSBjoern A. Zeeb 34496190b4fSBjoern A. Zeeb if (name == "") { name="(unknown)"; } 34596190b4fSBjoern A. Zeeb if (fw == "") { fw="(unknown)"; } 346*fc40f4caSBjoern A. Zeeb if (flavor == "") { flavor="iwlwifi"; } 347*fc40f4caSBjoern A. Zeeb if (flavor == "undefined") { flavor="iwlwifi"; } 34896190b4fSBjoern A. Zeeb 34996190b4fSBjoern A. Zeeb # iwlwififw.4 350*fc40f4caSBjoern A. Zeeb 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; 35196190b4fSBjoern A. Zeeb 35296190b4fSBjoern A. Zeeb # wiki 35396190b4fSBjoern A. Zeeb # XXX TODO possibly quote some in `` to avoid automatic linking? 35496190b4fSBjoern A. Zeeb # || PCI IDs || Chipset Name || Firmware prefix || Comment || 35596190b4fSBjoern A. Zeeb printf "WIKI || %s / %s / %s / %s || %s || %s || ||\n", i[1], i[2], i[3], i[4], name, fw; 35696190b4fSBjoern A. Zeeb if ((FNR % 25) == 0) { printf "WIKI \n"; } 35796190b4fSBjoern A. Zeeb}') 35896190b4fSBjoern A. Zeeb 35996190b4fSBjoern A. Zeebmanfwfile=$(mktemp -p /tmp iwlwifi-iwlwififw4.XXXXXX) 36096190b4fSBjoern A. Zeeb:> ${manfwfile} 36196190b4fSBjoern A. Zeebecho "${dl}" | grep -v ^WIKI >> ${manfwfile} 36296190b4fSBjoern A. Zeebprintf "INFO: share/man/man4/iwlwififw.4 template at %s\n" ${manfwfile} >&2 36396190b4fSBjoern A. Zeeb 36496190b4fSBjoern A. Zeebwikifile=$(mktemp -p /tmp iwlwifi-wiki.XXXXXX) 36596190b4fSBjoern A. Zeeb:> ${wikifile} 36696190b4fSBjoern A. Zeebecho "${dl}" | awk '/^WIKI / { gsub("^WIKI ", ""); print; }' >> ${wikifile} 36796190b4fSBjoern A. Zeebprintf "INFO: WIKI template at %s\n" ${wikifile} >&2 36896190b4fSBjoern A. Zeeb 36996190b4fSBjoern A. Zeeb 37096190b4fSBjoern A. Zeeb################################################################################ 37196190b4fSBjoern A. Zeeb# 37296190b4fSBjoern A. Zeeb# Cleanup 37396190b4fSBjoern A. Zeeb# 37496190b4fSBjoern A. Zeebrm ${mapfile} 37596190b4fSBjoern A. Zeebmv -f ${D_PCI_IDS_FILE} ${D_PCI_IDS_FILE}.old 37696190b4fSBjoern A. Zeeb 37796190b4fSBjoern A. Zeeb# end 378