ethtool_lanes.sh 4.0 KB

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