git: 17cec33e750f - main - fwget: improve the pci base script

From: Bjoern A. Zeeb <bz_at_FreeBSD.org>
Date: Sat, 20 May 2023 11:17:40 UTC
The branch main has been updated by bz:

URL: https://cgit.FreeBSD.org/src/commit/?id=17cec33e750fe2543ab898ba88e19b8e57ef895d

commit 17cec33e750fe2543ab898ba88e19b8e57ef895d
Author:     Bjoern A. Zeeb <bz@FreeBSD.org>
AuthorDate: 2023-05-11 20:36:50 +0000
Commit:     Bjoern A. Zeeb <bz@FreeBSD.org>
CommitDate: 2023-05-20 11:16:42 +0000

    fwget: improve the pci base script
    
    When matching "class" only match the class byte and not subclass and
    programming interface.
    Extend the list of supported classes by network, old, and misc (for no
    better names on the latter two).
    Extend the list of known vendors for various WiFi NICs.
    Add a "pci_fixup_class" as some wireless cards have unexpected PCI
    classes set.  In case we cannot find a matching file for the original
    try to see if a "fixed up" version exists.  This allows us to avoid
    duplicate matching files for the same vendor/driver but different
    chipsets.
    
    Reviewed by:    manu
    Differential Revision: https://reviews.freebsd.org/D40072
---
 usr.sbin/fwget/pci/pci | 51 +++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 40 insertions(+), 11 deletions(-)

diff --git a/usr.sbin/fwget/pci/pci b/usr.sbin/fwget/pci/pci
index b30aae4fadb8..b3514c3ab43d 100644
--- a/usr.sbin/fwget/pci/pci
+++ b/usr.sbin/fwget/pci/pci
@@ -2,6 +2,7 @@
 # SPDX-License-Identifier: BSD-2-Clause
 #
 # Copyright 2023 Beckhoff Automation GmbH & Co. KG
+# Copyright 2023 Bjoern A. Zeeb
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted providing that the following conditions 
@@ -26,11 +27,12 @@
 
 pci_get_class()
 {
-	local hexclass=$(echo $1 | sed 's/.*class=\(0x[0-9a-z]*\).*/\1/')
+	local hexclass=$(echo $1 | sed 's/.*class=\(0x[0-9a-z]\{2\}\).*/\1/')
 	case "${hexclass}" in
-		0x030000)
-			echo "video"
-			;;
+		0x00)	echo "old" ;;		# built before class codes were finalized
+		0x02)	echo "network" ;;
+		0x03)	echo "video" ;;
+		0xff)	echo "misc" ;;		# does not fit in other defined classes
 	esac
 }
 
@@ -39,12 +41,12 @@ pci_get_vendor()
 	local hexvendor=$(echo $1 | sed 's/.*\ vendor=\(0x[0-9a-z]*\).*/\1/')
 
 	case "${hexvendor}" in
-		0x8086)
-			echo "intel"
-			;;
-		0x1002)
-			echo "amd"
-			;;
+		0x1002)	echo "amd" ;;
+		0x10ec)	echo "realtek" ;;
+		0x14c3) echo "mediatek" ;;
+		0x168c)	echo "qca" ;;	# Qualcomm Atheros
+		0x17cb)	echo "qca" ;;	# Qualcomm Technologies
+		0x8086)	echo "intel" ;;
 	esac
 }
 
@@ -55,6 +57,26 @@ pci_get_device()
 	echo ${hexdevice}
 }
 
+pci_fixup_class()
+{
+	local _c _v
+	_c=$1
+	_v=$2
+
+	case ${_c} in
+	"old")
+		case ${_v} in
+		"mediatek") echo "network" ;;
+		esac
+		;;
+	"misc")
+		case ${_v} in
+		"qca")	echo "network" ;;
+		esac
+		;;
+	esac
+}
+
 pci_search_packages()
 {
 	local IFS
@@ -74,7 +96,14 @@ pci_search_packages()
 
 		log_verbose "Trying to match device ${device} in class ${class} and vendor ${vendor} with pci_${class}_${vendor}" 1>&3
 		if [ ! -f ${LIBEXEC_PATH}/pci_${class}_${vendor} ]; then
-			continue
+			class=$(pci_fixup_class ${class} ${vendor})
+			if [ -z "${class}" ]; then
+				continue
+			fi
+			log_verbose "Trying to match device ${device} in fixed up class ${class} and vendor ${vendor} with pci_${class}_${vendor}" 1>&3
+			if [ ! -f ${LIBEXEC_PATH}/pci_${class}_${vendor} ]; then
+				continue
+			fi
 		fi
 		. ${LIBEXEC_PATH}/pci_${class}_${vendor}