1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3 4lib_dir=$(dirname $0)/../../../net/forwarding 5 6ALL_TESTS=" 7 autoneg 8 autoneg_force_mode 9" 10 11NUM_NETIFS=2 12: ${TIMEOUT:=30000} # ms 13source $lib_dir/lib.sh 14source $lib_dir/ethtool_lib.sh 15 16setup_prepare() 17{ 18 swp1=${NETIFS[p1]} 19 swp2=${NETIFS[p2]} 20 21 ip link set dev $swp1 up 22 ip link set dev $swp2 up 23 24 busywait "$TIMEOUT" wait_for_port_up ethtool $swp2 25 check_err $? "ports did not come up" 26 27 busywait $TIMEOUT sh -c "ethtool $swp1 | grep -q Lanes:" 28 if [[ $? -ne 0 ]]; then 29 log_test "SKIP: driver does not support lanes setting" 30 exit 1 31 fi 32 33 ip link set dev $swp2 down 34 ip link set dev $swp1 down 35} 36 37check_lanes() 38{ 39 local dev=$1; shift 40 local lanes=$1; shift 41 local max_speed=$1; shift 42 local chosen_lanes 43 44 chosen_lanes=$(ethtool $dev | grep 'Lanes:') 45 chosen_lanes=${chosen_lanes#*"Lanes: "} 46 47 ((chosen_lanes == lanes)) 48 check_err $? "swp1 advertise $max_speed and $lanes, devs sync to $chosen_lanes" 49} 50 51check_unsupported_lanes() 52{ 53 local dev=$1; shift 54 local max_speed=$1; shift 55 local max_lanes=$1; shift 56 local autoneg=$1; shift 57 local autoneg_str="" 58 59 local unsupported_lanes=$((max_lanes *= 2)) 60 61 if [[ $autoneg -eq 0 ]]; then 62 autoneg_str="autoneg off" 63 fi 64 65 ethtool -s $swp1 speed $max_speed lanes $unsupported_lanes $autoneg_str &> /dev/null 66 check_fail $? "Unsuccessful $unsupported_lanes lanes setting was expected" 67} 68 69max_speed_and_lanes_get() 70{ 71 local dev=$1; shift 72 local arr=("$@") 73 local max_lanes 74 local max_speed 75 local -a lanes_arr 76 local -a speeds_arr 77 local -a max_values 78 79 for ((i=0; i<${#arr[@]}; i+=2)); do 80 speeds_arr+=("${arr[$i]}") 81 lanes_arr+=("${arr[i+1]}") 82 done 83 84 max_values+=($(get_max "${speeds_arr[@]}")) 85 max_values+=($(get_max "${lanes_arr[@]}")) 86 87 echo ${max_values[@]} 88} 89 90search_linkmode() 91{ 92 local speed=$1; shift 93 local lanes=$1; shift 94 local arr=("$@") 95 96 for ((i=0; i<${#arr[@]}; i+=2)); do 97 if [[ $speed -eq ${arr[$i]} && $lanes -eq ${arr[i+1]} ]]; then 98 return 1 99 fi 100 done 101 return 0 102} 103 104autoneg() 105{ 106 RET=0 107 108 local lanes 109 local max_speed 110 local max_lanes 111 112 local -a linkmodes_params=($(dev_linkmodes_params_get $swp1 1)) 113 local -a max_values=($(max_speed_and_lanes_get $swp1 "${linkmodes_params[@]}")) 114 max_speed=${max_values[0]} 115 max_lanes=${max_values[1]} 116 117 lanes=$max_lanes 118 119 while [[ $lanes -ge 1 ]]; do 120 search_linkmode $max_speed $lanes "${linkmodes_params[@]}" 121 if [[ $? -eq 1 ]]; then 122 ethtool_set $swp1 speed $max_speed lanes $lanes 123 ip link set dev $swp1 up 124 ip link set dev $swp2 up 125 126 busywait $TIMEOUT sh -c "ethtool $swp1 | grep -q Lanes:" 127 check_err $? "Lanes parameter is not presented on time" 128 129 check_lanes $swp1 $lanes $max_speed 130 log_test "$lanes lanes is autonegotiated" 131 fi 132 let $((lanes /= 2)) 133 done 134 135 check_unsupported_lanes $swp1 $max_speed $max_lanes 1 136 log_test "Lanes number larger than max width is not set" 137 138 ip link set dev $swp2 down 139 ip link set dev $swp1 down 140} 141 142autoneg_force_mode() 143{ 144 RET=0 145 146 local lanes 147 local max_speed 148 local max_lanes 149 150 local -a linkmodes_params=($(dev_linkmodes_params_get $swp1 1)) 151 local -a max_values=($(max_speed_and_lanes_get $swp1 "${linkmodes_params[@]}")) 152 max_speed=${max_values[0]} 153 max_lanes=${max_values[1]} 154 155 lanes=$max_lanes 156 157 while [[ $lanes -ge 1 ]]; do 158 search_linkmode $max_speed $lanes "${linkmodes_params[@]}" 159 if [[ $? -eq 1 ]]; then 160 ethtool_set $swp1 speed $max_speed lanes $lanes autoneg off 161 ethtool_set $swp2 speed $max_speed lanes $lanes autoneg off 162 ip link set dev $swp1 up 163 ip link set dev $swp2 up 164 165 busywait $TIMEOUT sh -c "ethtool $swp1 | grep -q Lanes:" 166 check_err $? "Lanes parameter is not presented on time" 167 168 check_lanes $swp1 $lanes $max_speed 169 log_test "Autoneg off, $lanes lanes detected during force mode" 170 fi 171 let $((lanes /= 2)) 172 done 173 174 check_unsupported_lanes $swp1 $max_speed $max_lanes 0 175 log_test "Lanes number larger than max width is not set" 176 177 ip link set dev $swp2 down 178 ip link set dev $swp1 down 179 180 ethtool -s $swp2 autoneg on 181 ethtool -s $swp1 autoneg on 182} 183 184check_ethtool_lanes_support 185setup_prepare 186 187tests_run 188 189exit $EXIT_STATUS 190