1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4ALL_TESTS="
5	autoneg
6	autoneg_force_mode
7	no_cable
8"
9
10NUM_NETIFS=2
11lib_dir=$(dirname "$0")
12source "$lib_dir"/../../../net/forwarding/lib.sh
13source ethtool_lib.sh
14
15TIMEOUT=$((WAIT_TIMEOUT * 1000)) # ms
16
17setup_prepare()
18{
19	swp1=${NETIFS[p1]}
20	swp2=${NETIFS[p2]}
21	swp3=$NETIF_NO_CABLE
22}
23
24ethtool_ext_state()
25{
26	local dev=$1; shift
27	local expected_ext_state=$1; shift
28	local expected_ext_substate=${1:-""}; shift
29
30	local ext_state=$(ethtool $dev | grep "Link detected" \
31		| cut -d "(" -f2 | cut -d ")" -f1)
32	local ext_substate=$(echo $ext_state | cut -sd "," -f2 \
33		| sed -e 's/^[[:space:]]*//')
34	ext_state=$(echo $ext_state | cut -d "," -f1)
35
36	if [[ $ext_state != $expected_ext_state ]]; then
37		echo "Expected \"$expected_ext_state\", got \"$ext_state\""
38		return 1
39	fi
40	if [[ $ext_substate != $expected_ext_substate ]]; then
41		echo "Expected \"$expected_ext_substate\", got \"$ext_substate\""
42		return 1
43	fi
44}
45
46autoneg()
47{
48	local msg
49
50	RET=0
51
52	ip link set dev $swp1 up
53
54	msg=$(busywait $TIMEOUT ethtool_ext_state $swp1 \
55			"Autoneg" "No partner detected")
56	check_err $? "$msg"
57
58	log_test "Autoneg, No partner detected"
59
60	ip link set dev $swp1 down
61}
62
63autoneg_force_mode()
64{
65	local msg
66
67	RET=0
68
69	ip link set dev $swp1 up
70	ip link set dev $swp2 up
71
72	local -a speeds_arr=($(different_speeds_get $swp1 $swp2 0 0))
73	local speed1=${speeds_arr[0]}
74	local speed2=${speeds_arr[1]}
75
76	ethtool_set $swp1 speed $speed1 autoneg off
77	ethtool_set $swp2 speed $speed2 autoneg off
78
79	msg=$(busywait $TIMEOUT ethtool_ext_state $swp1 \
80			"Autoneg" "No partner detected during force mode")
81	check_err $? "$msg"
82
83	msg=$(busywait $TIMEOUT ethtool_ext_state $swp2 \
84			"Autoneg" "No partner detected during force mode")
85	check_err $? "$msg"
86
87	log_test "Autoneg, No partner detected during force mode"
88
89	ethtool -s $swp2 autoneg on
90	ethtool -s $swp1 autoneg on
91
92	ip link set dev $swp2 down
93	ip link set dev $swp1 down
94}
95
96no_cable()
97{
98	local msg
99
100	RET=0
101
102	ip link set dev $swp3 up
103
104	msg=$(busywait $TIMEOUT ethtool_ext_state $swp3 "No cable")
105	check_err $? "$msg"
106
107	log_test "No cable"
108
109	ip link set dev $swp3 down
110}
111
112setup_prepare
113
114tests_run
115
116exit $EXIT_STATUS
117