1#!/sbin/sh
2#
3# CDDL HEADER START
4#
5# The contents of this file are subject to the terms of the
6# Common Development and Distribution License (the "License").
7# You may not use this file except in compliance with the License.
8#
9# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10# or http://www.opensolaris.org/os/licensing.
11# See the License for the specific language governing permissions
12# and limitations under the License.
13#
14# When distributing Covered Code, include this CDDL HEADER in each
15# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16# If applicable, add the following below this CDDL HEADER, with the
17# fields enclosed by brackets "[]" replaced with your own identifying
18# information: Portions Copyright [yyyy] [name of copyright owner]
19#
20# CDDL HEADER END
21#
22#
23# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
24#
25#
26
27PATH=/sbin:/bin
28ORIGIFS="${IFS}"
29USAGE="Usage: ibd_upgrade [-v]"
30DRVCONF=/kernel/drv/ibp.conf.old
31
32#
33# split device path into path components
34#
35split_path_components()
36{
37	hca_path=
38	node_name=
39	port=
40	pkey=
41	service=
42	partition_name=
43
44	hca_path="/dev/`dirname $device_path`"
45	bname=`basename $device_path`
46	IFS=":"
47	set -- $bname
48	node_at_addr=$1
49	partition_name=$2
50	IFS="@"
51	set -- $node_at_addr
52	node_name=$1
53	IFS=","
54	set -- $2
55	port=$1
56	pkey=0x$2
57	service=$3
58
59	IFS="${ORIGIFS}"
60}
61
62do_cmd()
63{
64	if [ $verbose -eq 1 ]; then
65		echo "$1"
66	fi
67	$1
68}
69
70process_rc_mode()
71{
72	device=$1
73
74	#
75	# Get the instance number of ibd
76	# Device name format would be ibd#,
77	#
78	IFS="d"
79	set -- ${device}
80	IFS="${ORIGIFS}"
81
82	if [ "$1" != "ib" ]; then
83		return
84	fi
85
86	inst=$2
87
88	IFS=","
89	set -- ${enable_rc}
90	IFS="${ORIGIFS}"
91
92	if [ ${inst} -lt $# ]; then
93		(( inst = $inst + 1 ))
94		eval "linkmode=\$${inst}"
95	else
96		linkmode=0
97	fi
98
99	if [ "$linkmode" = "0" ]; then
100		do_cmd "dladm set-linkprop -p linkmode=ud ${device}"
101	fi
102}
103
104verbose=0
105while getopts v c
106do
107	case $c in
108	v)	verbose=1;;
109	\?)	echo "$USAGE" 1>&2
110		exit 2;;
111	esac
112done
113
114enable_rc=
115if [ -f ${DRVCONF} ]; then
116	enable_rc=`egrep "^[ 	]*enable_rc[ 	]*=" ${DRVCONF} | sed -e "s/[ 	]*//g" -e "s/enable_rc=//" -e "s/;$//" 2>/dev/null`
117fi
118
119#
120# Loop through all ibd devices based on the old model (i.e., one ibd instance
121# per partition; consequently device names have non zero pkey)
122# and create data links with the same names as in the old model under the
123# new model.
124#
125ls -l /dev/ibd* 2> /dev/null \
126    | while read x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 device_path
127do
128	split_path_components
129
130	if [ "$node_name" != "ibport" -o "$service" != "ipib" \
131	    -o "$pkey" = "0x0" -o "$pkey" = "0x" ]; then
132		continue
133	fi
134
135	# verify that the hca path exists
136	cd $hca_path 2> /dev/null
137	if [ $? -ne 0 ]; then
138		continue
139	fi
140
141	fn=`echo ibport@${port},0,ipib:ibp*[0-9]`
142	if [ -c "$fn" ]; then
143		IFS=":"
144		set -- $fn
145		IFS="${ORIGIFS}"
146
147		do_cmd "dladm delete-phys $partition_name" 2>/dev/null
148		if [ $? -ne 0 ]; then
149			do_cmd "ibd_delete_link $partition_name"
150		fi
151		do_cmd "dladm create-part -f -l $2 -P $pkey $partition_name"
152
153		if [ "$enable_rc" != "" ]; then
154			process_rc_mode $partition_name
155		fi
156	fi
157done
158
159exit 0
160