191 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03 4lib_dir=$(dirname $0)/../../../net/forwarding5ethtool_lib_dir=$(dirname $0)/../hw6 7ALL_TESTS="8 autoneg9 autoneg_force_mode10"11 12NUM_NETIFS=213: ${TIMEOUT:=30000} # ms14source $lib_dir/lib.sh15source $ethtool_lib_dir/ethtool_lib.sh16 17setup_prepare()18{19 swp1=${NETIFS[p1]}20 swp2=${NETIFS[p2]}21 22 ip link set dev $swp1 up23 ip link set dev $swp2 up24 25 busywait "$TIMEOUT" wait_for_port_up ethtool $swp226 check_err $? "ports did not come up"27 28 busywait $TIMEOUT sh -c "ethtool $swp1 | grep -q Lanes:"29 if [[ $? -ne 0 ]]; then30 log_test "SKIP: driver does not support lanes setting"31 exit 132 fi33 34 ip link set dev $swp2 down35 ip link set dev $swp1 down36}37 38check_lanes()39{40 local dev=$1; shift41 local lanes=$1; shift42 local max_speed=$1; shift43 local chosen_lanes44 45 chosen_lanes=$(ethtool $dev | grep 'Lanes:')46 chosen_lanes=${chosen_lanes#*"Lanes: "}47 48 ((chosen_lanes == lanes))49 check_err $? "swp1 advertise $max_speed and $lanes, devs sync to $chosen_lanes"50}51 52check_unsupported_lanes()53{54 local dev=$1; shift55 local max_speed=$1; shift56 local max_lanes=$1; shift57 local autoneg=$1; shift58 local autoneg_str=""59 60 local unsupported_lanes=$((max_lanes *= 2))61 62 if [[ $autoneg -eq 0 ]]; then63 autoneg_str="autoneg off"64 fi65 66 ethtool -s $swp1 speed $max_speed lanes $unsupported_lanes $autoneg_str &> /dev/null67 check_fail $? "Unsuccessful $unsupported_lanes lanes setting was expected"68}69 70max_speed_and_lanes_get()71{72 local dev=$1; shift73 local arr=("$@")74 local max_lanes75 local max_speed76 local -a lanes_arr77 local -a speeds_arr78 local -a max_values79 80 for ((i=0; i<${#arr[@]}; i+=2)); do81 speeds_arr+=("${arr[$i]}")82 lanes_arr+=("${arr[i+1]}")83 done84 85 max_values+=($(get_max "${speeds_arr[@]}"))86 max_values+=($(get_max "${lanes_arr[@]}"))87 88 echo ${max_values[@]}89}90 91search_linkmode()92{93 local speed=$1; shift94 local lanes=$1; shift95 local arr=("$@")96 97 for ((i=0; i<${#arr[@]}; i+=2)); do98 if [[ $speed -eq ${arr[$i]} && $lanes -eq ${arr[i+1]} ]]; then99 return 1100 fi101 done102 return 0103}104 105autoneg()106{107 RET=0108 109 local lanes110 local max_speed111 local max_lanes112 113 local -a linkmodes_params=($(dev_linkmodes_params_get $swp1 1))114 local -a max_values=($(max_speed_and_lanes_get $swp1 "${linkmodes_params[@]}"))115 max_speed=${max_values[0]}116 max_lanes=${max_values[1]}117 118 lanes=$max_lanes119 120 while [[ $lanes -ge 1 ]]; do121 search_linkmode $max_speed $lanes "${linkmodes_params[@]}"122 if [[ $? -eq 1 ]]; then123 ethtool_set $swp1 speed $max_speed lanes $lanes124 ip link set dev $swp1 up125 ip link set dev $swp2 up126 127 busywait $TIMEOUT sh -c "ethtool $swp1 | grep -q Lanes:"128 check_err $? "Lanes parameter is not presented on time"129 130 check_lanes $swp1 $lanes $max_speed131 log_test "$lanes lanes is autonegotiated"132 fi133 let $((lanes /= 2))134 done135 136 check_unsupported_lanes $swp1 $max_speed $max_lanes 1137 log_test "Lanes number larger than max width is not set"138 139 ip link set dev $swp2 down140 ip link set dev $swp1 down141}142 143autoneg_force_mode()144{145 RET=0146 147 local lanes148 local max_speed149 local max_lanes150 151 local -a linkmodes_params=($(dev_linkmodes_params_get $swp1 1))152 local -a max_values=($(max_speed_and_lanes_get $swp1 "${linkmodes_params[@]}"))153 max_speed=${max_values[0]}154 max_lanes=${max_values[1]}155 156 lanes=$max_lanes157 158 while [[ $lanes -ge 1 ]]; do159 search_linkmode $max_speed $lanes "${linkmodes_params[@]}"160 if [[ $? -eq 1 ]]; then161 ethtool_set $swp1 speed $max_speed lanes $lanes autoneg off162 ethtool_set $swp2 speed $max_speed lanes $lanes autoneg off163 ip link set dev $swp1 up164 ip link set dev $swp2 up165 166 busywait $TIMEOUT sh -c "ethtool $swp1 | grep -q Lanes:"167 check_err $? "Lanes parameter is not presented on time"168 169 check_lanes $swp1 $lanes $max_speed170 log_test "Autoneg off, $lanes lanes detected during force mode"171 fi172 let $((lanes /= 2))173 done174 175 check_unsupported_lanes $swp1 $max_speed $max_lanes 0176 log_test "Lanes number larger than max width is not set"177 178 ip link set dev $swp2 down179 ip link set dev $swp1 down180 181 ethtool -s $swp2 autoneg on182 ethtool -s $swp1 autoneg on183}184 185check_ethtool_lanes_support186setup_prepare187 188tests_run189 190exit $EXIT_STATUS191