forked from Mellanox/rdma-utils
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrdma.mlx4-setup.sh
91 lines (83 loc) · 2.48 KB
/
rdma.mlx4-setup.sh
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 succesfully 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