brintos

brintos / linux-shallow public Read only

0
0
Text · 4.0 KiB · fe905a7 Raw
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