#!/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