| #!/bin/bash | |
| dir="/sys/bus/pci/drivers/mlx4_core" | |
| [ ! -d $dir ] && exit 1 | |
| pushd $dir >/dev/null | |
| function set_dual_port() { | |
| device=$1 | |
| port1=$2 | |
| port2=$3 | |
| pushd $device >/dev/null | |
| cur_p1=`cat mlx4_port1` | |
| cur_p2=`cat mlx4_port2` | |
| # special case the "eth eth" mode as we need port2 to | |
| # actually switch to eth before the driver will let us | |
| # switch port1 to eth as well | |
| if [ "$port1" == "eth" ]; then | |
| if [ "$port2" != "eth" ]; then | |
| echo "In order for port1 to be eth, port2 to must also be eth" | |
| popd >/dev/null | |
| return | |
| fi | |
| if [ "$cur_p2" != "eth" -a "$cur_p2" != "auto (eth)" ]; then | |
| tries=0 | |
| echo "$port2" > mlx4_port2 2>/dev/null | |
| sleep .25 | |
| cur_p2=`cat mlx4_port2` | |
| while [ "$cur_p2" != "eth" -a "$cur_p2" != "auto (eth)" -a $tries -lt 10 ]; do | |
| sleep .25 | |
| let tries++ | |
| cur_p2=`cat mlx4_port2` | |
| done | |
| if [ "$cur_p2" != "eth" -a "$cur_p2" != "auto (eth)" ]; then | |
| echo "Failed to set port2 to eth mode" | |
| popd >/dev/null | |
| return | |
| fi | |
| fi | |
| if [ "$cur_p1" != "eth" -a "$cur_p1" != "auto (eth)" ]; then | |
| tries=0 | |
| echo "$port1" > mlx4_port1 2>/dev/null | |
| sleep .25 | |
| cur_p1=`cat mlx4_port1` | |
| while [ "$cur_p1" != "eth" -a "$cur_p1" != "auto (eth)" -a $tries -lt 10 ]; do | |
| sleep .25 | |
| let tries++ | |
| cur_p1=`cat mlx4_port1` | |
| done | |
| if [ "$cur_p1" != "eth" -a "$cur_p1" != "auto (eth)" ]; then | |
| echo "Failed to set port1 to eth mode" | |
| fi | |
| fi | |
| popd >/dev/null | |
| return | |
| fi | |
| # our mode is not eth <anything> as that is covered above | |
| # so we should be able to successfully set the ports in | |
| # port1 then port2 order | |
| if [ "$cur_p1" != "$port1" -o "$cur_p2" != "$port2" ]; then | |
| # Try setting the ports in order first | |
| echo "$port1" > mlx4_port1 2>/dev/null ; sleep .1 | |
| echo "$port2" > mlx4_port2 2>/dev/null ; sleep .1 | |
| cur_p1=`cat mlx4_port1` | |
| cur_p2=`cat mlx4_port2` | |
| fi | |
| if [ "$cur_p1" != "$port1" -o "$cur_p2" != "$port2" ]; then | |
| # Try reverse order this time | |
| echo "$port2" > mlx4_port2 2>/dev/null ; sleep .1 | |
| echo "$port1" > mlx4_port1 2>/dev/null ; sleep .1 | |
| cur_p1=`cat mlx4_port1` | |
| cur_p2=`cat mlx4_port2` | |
| fi | |
| if [ "$cur_p1" != "$port1" -o "$cur_p2" != "$port2" ]; then | |
| echo "Error setting port type on mlx4 device $device" | |
| fi | |
| popd >/dev/null | |
| return | |
| } | |
| while read device port1 port2 ; do | |
| [ -d "$device" ] || continue | |
| [ -z "$port1" ] && continue | |
| [ -f "$device/mlx4_port2" -a -z "$port2" ] && continue | |
| [ -f "$device/mlx4_port2" ] && set_dual_port $device $port1 $port2 || echo "$port1" > "$device/mlx4_port1" | |
| done | |
| popd 2&>/dev/null |