git: fc618b5f7e58 - main - preliminary usb support for fwget

From: Jesper Schmitz Mouridsen <jsm_at_FreeBSD.org>
Date: Wed, 16 Jul 2025 17:50:11 UTC
The branch main has been updated by jsm:

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

commit fc618b5f7e5844b859030d8337b2b272dc20169e
Author:     Jesper Schmitz Mouridsen <jsm@FreeBSD.org>
AuthorDate: 2025-07-16 17:26:23 +0000
Commit:     Jesper Schmitz Mouridsen <jsm@FreeBSD.org>
CommitDate: 2025-07-16 17:49:14 +0000

    preliminary usb support for fwget
    
    Mostly a copy of pci subsystem support, by replacing
    pciconf with usbconfig and excluding hardware classes.
    
    Approved by:    wireless (bz) manpages (ziaee) USB (bz)
    Differential Revision:  https://reviews.freebsd.org/D48678
---
 usr.sbin/fwget/Makefile       |  2 +-
 usr.sbin/fwget/fwget.8        | 14 +++++++++++---
 usr.sbin/fwget/fwget.sh       |  6 +++---
 usr.sbin/fwget/usb/Makefile   | 10 ++++++++++
 usr.sbin/fwget/usb/usb        | 43 +++++++++++++++++++++++++++++++++++++++++++
 usr.sbin/fwget/usb/usb_ralink | 12 ++++++++++++
 6 files changed, 80 insertions(+), 7 deletions(-)

diff --git a/usr.sbin/fwget/Makefile b/usr.sbin/fwget/Makefile
index 1cdf0f18230d..4c934aee3413 100644
--- a/usr.sbin/fwget/Makefile
+++ b/usr.sbin/fwget/Makefile
@@ -2,6 +2,6 @@ PACKAGE=	fwget
 
 SCRIPTS=	fwget
 MAN=		fwget.8
-SUBDIR=		pci
+SUBDIR=		pci usb
 
 .include <bsd.prog.mk>
diff --git a/usr.sbin/fwget/fwget.8 b/usr.sbin/fwget/fwget.8
index 7b8b606cc591..86e304775e2d 100644
--- a/usr.sbin/fwget/fwget.8
+++ b/usr.sbin/fwget/fwget.8
@@ -23,7 +23,7 @@
 .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd June 27, 2024
+.Dd July 7, 2025
 .Dt FWGET 8
 .Os
 .Sh NAME
@@ -47,7 +47,11 @@ Dry run, only show needed packages
 .It Fl v
 Be more verbose
 .It Ar subsystem
-Hardware subsystem, default pci
+Hardware subsystem(s), default is all supported subsystems.
+Space separated hardware subsystems, accepts
+.Cm pci
+and
+.Cm usb
 .El
 .Sh SEE ALSO
 .Xr firmware 9
@@ -64,4 +68,8 @@ utility and this manual page were written by
 .An Emmanuel Vadot Aq Mt manu@FreeBSD.org
 for Beckhoff Automation GmbH & Co\. KG.
 .Sh CAVEATS
-This utility currently only supports the pci subsystem.
+This utility currently only supports the
+.Xr pci 4
+and
+.Xr usb 4
+subsystems.
diff --git a/usr.sbin/fwget/fwget.sh b/usr.sbin/fwget/fwget.sh
index 138a2a26bfb1..de1e6fa51f0f 100755
--- a/usr.sbin/fwget/fwget.sh
+++ b/usr.sbin/fwget/fwget.sh
@@ -35,7 +35,7 @@ usage()
 Usage: $(basename "$0") [options] [subsystem]
 
 Supported subsystems
-  pci
+  pci, usb
 
 Options:
   -n		-- Do not install packages, only print the results
@@ -100,9 +100,9 @@ done
 shift $(($OPTIND - 1))
 subsystems="$@"
 
-# Default searching PCI subsystem
+# Default searching PCI and USB subsystem
 if [ -z "${subsystems}" ]; then
-	subsystems="pci"
+	subsystems="pci usb"
 fi
 
 # Fail early on unsupported subsystem
diff --git a/usr.sbin/fwget/usb/Makefile b/usr.sbin/fwget/usb/Makefile
new file mode 100644
index 000000000000..315e9c743cc8
--- /dev/null
+++ b/usr.sbin/fwget/usb/Makefile
@@ -0,0 +1,10 @@
+PACKAGE=	fwget
+
+SCRIPTS=usb \
+	usb_ralink
+
+BINDIR= ${LIBEXECDIR}/fwget
+
+MAN=
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/fwget/usb/usb b/usr.sbin/fwget/usb/usb
new file mode 100755
index 000000000000..fef6bc76ba89
--- /dev/null
+++ b/usr.sbin/fwget/usb/usb
@@ -0,0 +1,43 @@
+#
+#  Copyright 2023 Beckhoff Automation GmbH & Co. KG
+#  Copyright 2023 Bjoern A. Zeeb
+#  Copyright 2025 Jesper Schmitz Mouridsen
+
+#  SPDX-License-Identifier: BSD-2-Clause
+
+
+usb_get_vendor()
+{
+	local hexvendor=$(echo $1 | sed 's/.*idVendor=\(0x[0-9a-z]*\).*/\1/')
+	case "${hexvendor}" in
+		0x148f)	echo "ralink" ;;
+	esac
+}
+
+usb_get_device()
+{
+	local hexdevice=$(echo $1 | sed 's/.*idProduct=\(0x[0-9a-z]*\).*/\1/')
+	echo "${hexdevice}"
+
+}
+
+usb_search_packages()
+{
+	local IFS
+
+	oldifs=$IFS
+	IFS=$'\n'
+	for fulldevice in $(usbconfig -l dump_device_desc); do
+		vendor=$(usb_get_vendor "${fulldevice}")
+		if [ -z "${vendor}" ]; then
+			continue
+		fi
+		device=$(usb_get_device "${fulldevice}")
+		log_verbose "Trying to match device ${device} and vendor ${vendor} with usb_${vendor}"
+		if [ -f  ${LIBEXEC_PATH}/usb_${vendor} ]; then
+			. ${LIBEXEC_PATH}/usb_${vendor}
+			usb_${vendor} ${device}
+		fi
+	done
+	IFS=${oldifs}
+}
diff --git a/usr.sbin/fwget/usb/usb_ralink b/usr.sbin/fwget/usb/usb_ralink
new file mode 100755
index 000000000000..8d3135063011
--- /dev/null
+++ b/usr.sbin/fwget/usb/usb_ralink
@@ -0,0 +1,12 @@
+#
+# Copyright (c) 2025 Jesper Schmitz Mouridsen
+#
+# SPDX-License-Identifier: BSD-2-Clause
+
+usb_ralink()
+{
+
+	case "$1" in
+	0x7601)	addpkg "wifi-firmware-mt7601u-kmod"; return 1 ;;
+	esac
+}