Thread (4 messages) flat view 4 messages, 1 author, 10d ago

[PATCH iwl-next 3/3] selftests: net: hw: add devlink info test

From: Paul Greenwalt <hidden>
Date: 2026-08-15 01:26:54
Also in: intel-wired-lan
Subsystem: kernel selftest framework, networking drivers, the rest · Maintainers: Shuah Khan, Shuah Khan, Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds

Add a selftest that verifies drivers properly report device information
through the devlink info interface. This test validates:

  - devlink dev info command succeeds
  - driver name is reported and matches ethtool output
  - at least one version or serial_number is reported

The output format matches what NIPA CI uses for device regression
tracking, helping maintainers identify pass/fail status changes due
to FW updates.

Example usage:

  sudo NETIF=eth0 ./tools/testing/selftests/drivers/net/hw/devlink_info.sh

  INFO: driver: idpf
  INFO: serial_number: 00-a0-c9-ff-ff-23-45-67
  TEST: devlink info                                                  [ OK ]

Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Reviewed-by: Aleksandr Loktionov <redacted>
Link: https://github.com/linux-netdev/nipa/wiki/Netdev-CI-system#device-information
Signed-off-by: Paul Greenwalt <redacted>
---
 .../testing/selftests/drivers/net/hw/Makefile |   1 +
 .../selftests/drivers/net/hw/devlink_info.sh  | 119 ++++++++++++++++++
 2 files changed, 120 insertions(+)
 create mode 100755 tools/testing/selftests/drivers/net/hw/devlink_info.sh
diff --git a/tools/testing/selftests/drivers/net/hw/Makefile b/tools/testing/selftests/drivers/net/hw/Makefile
index 78bb0169350b..edd353f27a39 100644
--- a/tools/testing/selftests/drivers/net/hw/Makefile
+++ b/tools/testing/selftests/drivers/net/hw/Makefile
@@ -19,6 +19,7 @@ TEST_GEN_FILES := \
 
 TEST_PROGS = \
 	csum.py \
+	devlink_info.sh \
 	devlink_rate_cross_esw.py \
 	devlink_rate_tc_bw.py \
 	devmem.py \
diff --git a/tools/testing/selftests/drivers/net/hw/devlink_info.sh b/tools/testing/selftests/drivers/net/hw/devlink_info.sh
new file mode 100755
index 000000000000..b2ee880590c4
--- /dev/null
+++ b/tools/testing/selftests/drivers/net/hw/devlink_info.sh
@@ -0,0 +1,119 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+#
+# Test devlink info support
+#
+# This test verifies that the driver properly reports device information
+# through the devlink info interface. The output format matches what
+# NIPA CI uses for regression tracking (see Device information section
+# at https://github.com/linux-netdev/nipa/wiki/Netdev-CI-system).
+#
+# Validates:
+#   - devlink dev info command succeeds
+#   - driver name is reported and matches ethtool
+#   - at least one version or serial_number is reported
+#   - serial_number is logged if present
+#
+# Usage:
+#   NETIF=eth0 ./devlink_info.sh
+
+lib_dir=$(dirname "$0")/../../../net
+
+ALL_TESTS="devlink_info_test"
+source "$lib_dir"/lib.sh
+
+require_command devlink
+require_command jq
+require_command ethtool
+
+DL_HANDLE=""
+
+setup_prepare()
+{
+	# Try to get devlink handle from devlink port first
+	DL_HANDLE=$(devlink -j port show 2>/dev/null |
+		jq -r --arg netif "$NETIF" \
+			'.port | to_entries[] |
+			 select(.value.netdev == $netif) | .key' 2>/dev/null |
+		cut -d/ -f1-2)
+
+	# Fallback: get PCI address from ethtool and check if devlink device exists
+	if [ -z "$DL_HANDLE" ]; then
+		local bus_info
+		bus_info=$(ethtool -i "$NETIF" 2>/dev/null | awk '/^bus-info:/ {print $2}')
+		if [ -n "$bus_info" ]; then
+			DL_HANDLE="pci/$bus_info"
+			# Verify this devlink device exists
+			if ! devlink dev show "$DL_HANDLE" &>/dev/null; then
+				DL_HANDLE=""
+			fi
+		fi
+	fi
+
+	if [ -z "$DL_HANDLE" ]; then
+		echo "SKIP: Could not find devlink handle for $NETIF"
+		exit $ksft_skip
+	fi
+}
+
+info_get()
+{
+	local name
+
+	name=$1
+	cmd_jq "devlink dev info $DL_HANDLE -j" ".[][][\"$name\"]" "-e"
+}
+
+has_any_version()
+{
+	local info
+	info=$(devlink -j dev info $DL_HANDLE)
+
+	# Check if any version category exists and has at least one entry
+	echo "$info" | jq -e '.[][].versions | length > 0' > /dev/null 2>&1
+}
+
+devlink_info_test()
+{
+	RET=0
+
+	# Test devlink info command succeeds
+	devlink dev info $DL_HANDLE > /dev/null
+	check_err $? "devlink dev info failed for $DL_HANDLE"
+
+	# Test driver name is reported
+	local driver
+	driver=$(info_get "driver")
+	check_err $? "Failed to get driver name"
+
+	# Verify driver matches ethtool output
+	local expected_driver
+	expected_driver=$(ethtool -i "$NETIF" | awk '/^driver:/ {print $2}')
+	check_err $? "Failed to get driver from ethtool"
+	if [ -z "$expected_driver" ]; then
+		check_err 1 "Failed to get driver from ethtool"
+	fi
+	if [ "$driver" != "$expected_driver" ]; then
+		check_err 1 "Driver mismatch: devlink='$driver' ethtool='$expected_driver'"
+	else
+		log_info "driver: $driver"
+	fi
+
+	# Test at least one version OR serial_number is reported (needed for device tracking)
+	local serial
+	serial=$(info_get "serial_number" 2>/dev/null)
+	if [ -n "$serial" ]; then
+		log_info "serial_number: $serial"
+	fi
+
+	if ! has_any_version && [ -z "$serial" ]; then
+		check_err 1 "No versions or serial_number reported"
+	fi
+
+	log_test "devlink info"
+}
+
+setup_prepare
+tests_run
+
+exit $EXIT_STATUS
-- 
2.52.0
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help