File: rdma.mlx4-setup.sh

package info (click to toggle)
rdma-core 33.2-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 13,844 kB
  • sloc: ansic: 145,804; python: 5,688; sh: 2,761; perl: 1,465; makefile: 73
file content (91 lines) | stat: -rw-r--r-- 2,536 bytes parent folder | download | duplicates (5)
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