xref: /freebsd/sys/contrib/dev/iwlwifi/zzz_fw_ports_fwget.sh (revision fc40f4ca62ba91bef40f4a8712443617052b2cec)
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