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

Paul Greenwalt <[email protected]>
Newsgroups org.osuosl.intel-wired-lan,org.kernel.vger.netdev
Message-ID <[email protected]>
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 <[email protected]>
Reviewed-by: Aleksandr Loktionov <[email protected]>
Link: https://github.com/linux-netdev/nipa/wiki/Netdev-CI-system#device-information
Signed-off-by: Paul Greenwalt <[email protected]>
---
 .../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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.