1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
|
#!/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
|