1*96190b4fSBjoern A. Zeeb#!/bin/sh 2*96190b4fSBjoern A. Zeeb#- 3*96190b4fSBjoern A. Zeeb# SPDX-License-Identifier: BSD-2-Clause 4*96190b4fSBjoern A. Zeeb# 5*96190b4fSBjoern A. Zeeb# Copyright (c) 2024 The FreeBSD Foundation 6*96190b4fSBjoern A. Zeeb# 7*96190b4fSBjoern A. Zeeb# This software was developed by Björn Zeeb 8*96190b4fSBjoern A. Zeeb# under sponsorship from the FreeBSD Foundation. 9*96190b4fSBjoern A. Zeeb# 10*96190b4fSBjoern A. Zeeb# This is neither efficient nor elegant but we need it few times 11*96190b4fSBjoern A. Zeeb# a year and it does the job. 12*96190b4fSBjoern A. Zeeb# 13*96190b4fSBjoern A. Zeeb# 14*96190b4fSBjoern A. Zeeb# USAGE: please check out the correct tag/hash for ports in the 15*96190b4fSBjoern A. Zeeb# linux-firmware.git repository you point this script to. 16*96190b4fSBjoern A. Zeeb# 17*96190b4fSBjoern A. Zeeb 18*96190b4fSBjoern A. Zeebset -e 19*96190b4fSBjoern A. Zeeb 20*96190b4fSBjoern A. ZeebDRIVER=rtw88 21*96190b4fSBjoern A. ZeebCHECKFILE=rtw8822c.c 22*96190b4fSBjoern A. Zeeb 23*96190b4fSBjoern A. Zeeb################################################################################ 24*96190b4fSBjoern A. Zeeb# 25*96190b4fSBjoern A. Zeeb# Check pre-reqs 26*96190b4fSBjoern A. Zeeb# 27*96190b4fSBjoern A. Zeebif [ $# -ne 1 ]; then 28*96190b4fSBjoern A. Zeeb printf "USAGE: %s /path/to/linux-firmware.git\n" $0 >&2 29*96190b4fSBjoern A. Zeeb exit 1 30*96190b4fSBjoern A. Zeebfi 31*96190b4fSBjoern A. Zeeb 32*96190b4fSBjoern A. Zeebif [ ! -e ${CHECKFILE} ]; then 33*96190b4fSBjoern A. Zeeb printf "ERROR: run from %s driver directory; no %s.c here\n" ${DRIVER} ${CHECKFILE} >&2 34*96190b4fSBjoern A. Zeeb exit 1 35*96190b4fSBjoern A. Zeebfi 36*96190b4fSBjoern A. Zeeb 37*96190b4fSBjoern A. ZeebLFWDIR=${1} 38*96190b4fSBjoern A. Zeebif test ! -d ${LFWDIR} -o ! -e ${LFWDIR}/WHENCE; then 39*96190b4fSBjoern A. Zeeb printf "ERROR: cannot find linux-firmware.git at '%s'\n" ${LFWDIR} >&2 40*96190b4fSBjoern A. Zeeb exit 1 41*96190b4fSBjoern A. Zeebfi 42*96190b4fSBjoern A. Zeeb 43*96190b4fSBjoern A. Zeeb 44*96190b4fSBjoern A. Zeeb################################################################################ 45*96190b4fSBjoern A. Zeeb# 46*96190b4fSBjoern A. Zeeb# Helper functions. 47*96190b4fSBjoern A. Zeeb# 48*96190b4fSBjoern A. Zeeblist_fw() 49*96190b4fSBjoern A. Zeeb{ 50*96190b4fSBjoern A. Zeeb for f in `ls -1 rtw?????.c rtw?????e.c`; do 51*96190b4fSBjoern A. Zeeb 52*96190b4fSBjoern A. Zeeb l=$(awk '/^MODULE_FIRMWARE\(/ { gsub(/"/, ""); gsub("\\);$", ""); gsub("^MODULE_FIRMWARE\\(", ""); printf "%s\n", $0; }' ${f} | sort -n | uniq) 53*96190b4fSBjoern A. Zeeb lx="" 54*96190b4fSBjoern A. Zeeb for fx in ${l}; do 55*96190b4fSBjoern A. Zeeb if test -e ${LFWDIR}/${fx}; then 56*96190b4fSBjoern A. Zeeb lx="${lx} ${fx}" 57*96190b4fSBjoern A. Zeeb # else 58*96190b4fSBjoern A. Zeeb # printf "NOTICE: no firmware file found for '%s'\n" ${fx} >&2 59*96190b4fSBjoern A. Zeeb fi 60*96190b4fSBjoern A. Zeeb done 61*96190b4fSBjoern A. Zeeb 62*96190b4fSBjoern A. Zeeb # Get a count so we can automatically add \\ apart from the last line. 63*96190b4fSBjoern A. Zeeb fn=$(echo "${lx}" | wc -w | awk '{ print $1 }') 64*96190b4fSBjoern A. Zeeb 65*96190b4fSBjoern A. Zeeb # echo "==> ${f} :: ${fn} :: ${lx}" 66*96190b4fSBjoern A. Zeeb 67*96190b4fSBjoern A. Zeeb if test ${fn} -gt 0; then 68*96190b4fSBjoern A. Zeeb 69*96190b4fSBjoern A. Zeeb # Ports FLAVOR names are [a-z0-9_]. If needed add more mangling magic here. 70*96190b4fSBjoern A. Zeeb flav=`echo ${f%%.c} | awk '{ printf "%s", tolower($0); }'` 71*96190b4fSBjoern A. Zeeb 72*96190b4fSBjoern A. Zeeb echo "FWS ${flav}" 73*96190b4fSBjoern A. Zeeb echo "DISTFILES_${flav}= \\" 74*96190b4fSBjoern A. Zeeb for fz in ${lx}; do echo "${fz}"; done | \ 75*96190b4fSBjoern A. Zeeb awk -v fn=$fn -v fwg=${flav} -v drv=${DRIVER} '{ 76*96190b4fSBjoern A. Zeeb if (FNR == fn) { x="" } else { x=" \\" }; 77*96190b4fSBjoern A. Zeeb gsub("^" drv "/", "${FWSUBDIR}/"); 78*96190b4fSBjoern A. Zeeb printf "\t%s${DISTURL_SUFFIX}%s\n", $0, x; 79*96190b4fSBjoern A. Zeeb }' 80*96190b4fSBjoern A. Zeeb fi 81*96190b4fSBjoern A. Zeeb 82*96190b4fSBjoern A. Zeeb done 83*96190b4fSBjoern A. Zeeb} 84*96190b4fSBjoern A. Zeeb 85*96190b4fSBjoern A. Zeeb################################################################################ 86*96190b4fSBjoern A. Zeeb# 87*96190b4fSBjoern A. Zeeb# Generate the PORTS file template. 88*96190b4fSBjoern A. Zeeb# 89*96190b4fSBjoern A. Zeeb 90*96190b4fSBjoern A. Zeebfwsl=$(list_fw | grep ^FWS | awk '{ print $2 }') 91*96190b4fSBjoern A. Zeeb# Get a count so we can automatically add \\ apart from the last line. 92*96190b4fSBjoern A. Zeebfn=$(echo "${fwsl}" | wc -w | awk '{ print $1 }') 93*96190b4fSBjoern A. Zeeb 94*96190b4fSBjoern A. Zeebif test ${fn} -gt 0; then 95*96190b4fSBjoern A. Zeeb 96*96190b4fSBjoern A. Zeeb portsfile=$(mktemp -p /tmp ${DRIVER}-fwport.XXXXXX) 97*96190b4fSBjoern A. Zeeb 98*96190b4fSBjoern A. Zeeb :> ${portsfile} 99*96190b4fSBjoern A. Zeeb ( 100*96190b4fSBjoern A. Zeeb echo "FWSUBS= \\" 101*96190b4fSBjoern A. Zeeb for sz in ${fwsl}; do echo "${sz}"; done | \ 102*96190b4fSBjoern A. Zeeb awk -v fn=$fn '{ 103*96190b4fSBjoern A. Zeeb if (FNR == fn) { x="" } else { x=" \\" }; 104*96190b4fSBjoern A. Zeeb printf "\t%s%s\n", $0, x; 105*96190b4fSBjoern A. Zeeb }' 106*96190b4fSBjoern A. Zeeb 107*96190b4fSBjoern A. Zeeb echo 108*96190b4fSBjoern A. Zeeb list_fw | grep -v ^FWS 109*96190b4fSBjoern A. Zeeb 110*96190b4fSBjoern A. Zeeb echo 111*96190b4fSBjoern A. Zeeb echo "DISTFILES_\${FWDRV}= \\" 112*96190b4fSBjoern A. Zeeb for sz in ${fwsl}; do echo "${sz}"; done | \ 113*96190b4fSBjoern A. Zeeb awk -v fn=$fn '{ 114*96190b4fSBjoern A. Zeeb if (FNR == fn) { x="" } else { x=" \\" }; 115*96190b4fSBjoern A. Zeeb printf "\t${DISTFILES_%s}%s\n", $0, x; 116*96190b4fSBjoern A. Zeeb }' 117*96190b4fSBjoern A. Zeeb ) >> ${portsfile} 118*96190b4fSBjoern A. Zeeb 119*96190b4fSBjoern A. Zeeb printf "INFO: wifi-firmware-%s-kmod template at %s\n" ${DRIVER} ${portsfile} >&2 120*96190b4fSBjoern A. Zeebfi 121*96190b4fSBjoern A. Zeeb 122*96190b4fSBjoern A. Zeeb################################################################################ 123*96190b4fSBjoern A. Zeeb# 124*96190b4fSBjoern A. Zeeb# Generate the fwget(8) case pattern table (PCI device ID -> fw port flavor). 125*96190b4fSBjoern A. Zeeb# 126*96190b4fSBjoern A. Zeeb 127*96190b4fSBjoern A. Zeebfwgetfile=$(mktemp -p /tmp ${DRIVER}-fwget.XXXXXX) 128*96190b4fSBjoern A. Zeeb:> ${fwgetfile} 129*96190b4fSBjoern A. Zeeb 130*96190b4fSBjoern A. Zeebfor f in `ls -1 rtw?????.c rtw?????e.c`; do 131*96190b4fSBjoern A. Zeeb 132*96190b4fSBjoern A. Zeeb # Ports FLAVOR names are [a-z0-9_]. If needed add more mangling magic here. 133*96190b4fSBjoern A. Zeeb n=${f%.c}; 134*96190b4fSBjoern A. Zeeb n=${n%e}; 135*96190b4fSBjoern A. Zeeb 136*96190b4fSBjoern A. Zeeb awk -v n=${n} -v drv=${DRIVER} '/PCI_DEVICE\(PCI_VENDOR_ID_REALTEK,/ { 137*96190b4fSBjoern A. Zeeb gsub(").*", "", $2); 138*96190b4fSBjoern A. Zeeb printf "\t%s)\taddpkg \"wifi-firmware-%s-kmod-%s\"; return 1 ;;\n", 139*96190b4fSBjoern A. Zeeb tolower($2), drv, tolower(n); 140*96190b4fSBjoern A. Zeeb }' ${f} 141*96190b4fSBjoern A. Zeebdone >> ${fwgetfile} 142*96190b4fSBjoern A. Zeeb 143*96190b4fSBjoern A. Zeebprintf "INFO: fwget pci_network_realtek %s template at %s\n" ${DRIVER} ${fwgetfile} >&2 144*96190b4fSBjoern A. Zeeb 145*96190b4fSBjoern A. Zeeb# end 146