1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4lib_dir=$(dirname $0)/../../../net/forwarding
5
6ALL_TESTS="fw_flash_test params_test regions_test"
7NUM_NETIFS=0
8source $lib_dir/lib.sh
9
10BUS_ADDR=10
11PORT_COUNT=4
12DEV_NAME=netdevsim$BUS_ADDR
13SYSFS_NET_DIR=/sys/bus/netdevsim/devices/$DEV_NAME/net/
14DEBUGFS_DIR=/sys/kernel/debug/netdevsim/$DEV_NAME/
15DL_HANDLE=netdevsim/$DEV_NAME
16
17fw_flash_test()
18{
19	RET=0
20
21	devlink dev flash $DL_HANDLE file dummy
22	check_err $? "Failed to flash with status updates on"
23
24	echo "n"> $DEBUGFS_DIR/fw_update_status
25	check_err $? "Failed to disable status updates"
26
27	devlink dev flash $DL_HANDLE file dummy
28	check_err $? "Failed to flash with status updates off"
29
30	log_test "fw flash test"
31}
32
33param_get()
34{
35	local name=$1
36
37	cmd_jq "devlink dev param show $DL_HANDLE name $name -j" \
38	       '.[][][].values[] | select(.cmode == "driverinit").value'
39}
40
41param_set()
42{
43	local name=$1
44	local value=$2
45
46	devlink dev param set $DL_HANDLE name $name cmode driverinit value $value
47}
48
49check_value()
50{
51	local name=$1
52	local phase_name=$2
53	local expected_param_value=$3
54	local expected_debugfs_value=$4
55	local value
56
57	value=$(param_get $name)
58	check_err $? "Failed to get $name param value"
59	[ "$value" == "$expected_param_value" ]
60	check_err $? "Unexpected $phase_name $name param value"
61	value=$(<$DEBUGFS_DIR/$name)
62	check_err $? "Failed to get $name debugfs value"
63	[ "$value" == "$expected_debugfs_value" ]
64	check_err $? "Unexpected $phase_name $name debugfs value"
65}
66
67params_test()
68{
69	RET=0
70
71	local max_macs
72	local test1
73
74	check_value max_macs initial 32 32
75	check_value test1 initial true Y
76
77	param_set max_macs 16
78	check_err $? "Failed to set max_macs param value"
79	param_set test1 false
80	check_err $? "Failed to set test1 param value"
81
82	check_value max_macs post-set 16 32
83	check_value test1 post-set false Y
84
85	devlink dev reload $DL_HANDLE
86
87	check_value max_macs post-reload 16 16
88	check_value test1 post-reload false N
89
90	log_test "params test"
91}
92
93check_region_size()
94{
95	local name=$1
96	local size
97
98	size=$(devlink region show $DL_HANDLE/$name -j | jq -e -r '.[][].size')
99	check_err $? "Failed to get $name region size"
100	[ $size -eq 32768 ]
101	check_err $? "Invalid $name region size"
102}
103
104check_region_snapshot_count()
105{
106	local name=$1
107	local phase_name=$2
108	local expected_count=$3
109	local count
110
111	count=$(devlink region show $DL_HANDLE/$name -j | jq -e -r '.[][].snapshot | length')
112	[ $count -eq $expected_count ]
113	check_err $? "Unexpected $phase_name snapshot count"
114}
115
116regions_test()
117{
118	RET=0
119
120	local count
121
122	check_region_size dummy
123	check_region_snapshot_count dummy initial 0
124
125	echo ""> $DEBUGFS_DIR/take_snapshot
126	check_err $? "Failed to take first dummy region snapshot"
127	check_region_snapshot_count dummy post-first-snapshot 1
128
129	echo ""> $DEBUGFS_DIR/take_snapshot
130	check_err $? "Failed to take second dummy region snapshot"
131	check_region_snapshot_count dummy post-second-snapshot 2
132
133	echo ""> $DEBUGFS_DIR/take_snapshot
134	check_err $? "Failed to take third dummy region snapshot"
135	check_region_snapshot_count dummy post-third-snapshot 3
136
137	devlink region del $DL_HANDLE/dummy snapshot 1
138	check_err $? "Failed to delete first dummy region snapshot"
139
140	check_region_snapshot_count dummy post-first-delete 2
141
142	log_test "regions test"
143}
144
145setup_prepare()
146{
147	modprobe netdevsim
148	echo "$BUS_ADDR $PORT_COUNT" > /sys/bus/netdevsim/new_device
149	while [ ! -d $SYSFS_NET_DIR ] ; do :; done
150}
151
152cleanup()
153{
154	pre_cleanup
155	echo "$BUS_ADDR" > /sys/bus/netdevsim/del_device
156	modprobe -r netdevsim
157}
158
159trap cleanup EXIT
160
161setup_prepare
162
163tests_run
164
165exit $EXIT_STATUS
166