OpenSolaris_b135/pkgdefs/SUNWnvsata/postinstall

#!/bin/sh
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#

#
# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.

ROOT=${PKG_INSTALL_ROOT:-/}
SYSTEM=${ROOT}/etc/system
BOOTENVRC=${ROOT}/boot/solaris/bootenv.rc
PATH_TO_INST=${ROOT}/etc/path_to_inst
POWER_CONF=${ROOT}/etc/power.conf
BAK=bak
TMP=/tmp
NV_SATA=nv_sata
NVSATA_TMP=$TMP/${NV_SATA}
SYSTEM_BAK=${NVSATA_TMP}/system.${BAK}
BOOTENVRC_BAK=${NVSATA_TMP}/bootenv.rc.${BAK}
POWER_CONF_BAK=${NVSATA_TMP}/power.conf.${BAK}
UPGRADE_LOG=${ROOT}/var/sadm/system/logs/upgrade_log
LIVEUPGRADE_TMP_LOG=$TMP/.luupgrade.pfinstall.log.*
DEVMAP_TABLE=${TMP}/devmap_table
DRIVER_ALIASES='"pci10de,37f" "pci10de,55" "pci10de,54" "pci10de,266" "pci10de,267"'
ETC_DEV_DIR=${ROOT}/etc/dev
ENUMERATE_RESERVED=${ETC_DEV_DIR}/reserved_devnames
DEVLINK_DB=${ETC_DEV_DIR}/.devlink_db

CP=/usr/bin/cp
MV=/usr/bin/mv
LN=/usr/bin/ln
LS=/usr/bin/ls
GREP=/usr/bin/grep
SED=/usr/bin/sed
CUT=/usr/bin/cut
CAT=/usr/bin/cat
NAWK=/usr/bin/nawk
RM=/usr/bin/rm
MKDIR=/usr/bin/mkdir
MOUNT=/usr/sbin/mount
MODINFO=/usr/sbin/modinfo
PRTCONF=/etc/prtconf
PRTCONF_OUT=${NVSATA_TMP}/prtconf_vp.out
DEV_PROPS=${NVSATA_TMP}/dev_props.out

#
# get_devinfo_prop(file, prop)
#
#   <prtconf.out> file that has output from 'prtconf -vp' command
#   <prop>  name of the property OR "ALL" for all properties
#
# parse the output of prtconf command and print the value of
# of the specified property or all if <prop> is "ALL" in
# the format "<name>=<value>".
#
get_devinfo_prop()
{
    /bin/cat $1 | ${NAWK} -v prop=$2 '
	BEGIN {
		if (match(prop,"ALL"))
			check_all=1;
		else
			check_all=0;
	}
	{
		if (!match($1, "name="))
			next;
		if (!check_all) {
			pname = sprintf("name=\047%s\047", prop);
			if (!match($1, pname))
				next;
		}
		gsub("\047", "", $1);
		name = substr($1, index($1,"=")+1);
		if (match($2, "type=boolean")) {
			value=1;
		} else if (match($2, "type=int") || match($2, "type=byte")) {
			getline;
			value = ""
			cnt = split(substr($0,index($0, "=")+1), words, ".");
			for (i = 1; i <= cnt; i++) {
				w = "0x" skipzeros(words[i]);
				if (i > 1)
					value = value " ";
				value = value w;
			}
		} else {
			getline;
			value = substr($0,index($0, "=")+1);
		} 
		if (!check_all) {
			print value;
			exit (0);
		}
		print name "=" value;
	}
	# skp the leading '0' characters in the string
	function skipzeros (str, out, n, i)
	{
		n = length(str);
		for (i = 1; i <= n; i++) {
			if (!match(substr(str, i, 1), "0")) {
				break;
			}
		}
		if (i > n)
			out=substr(str,n);
		else
			out=substr(str,i);
		return (out);
	}'
}

#
# Function get_properties() gets the following properties for the
# device (i.e /devices path without '/devices' prefix) passed as
# an argument:
#
#	vendor-id
#	device-id
#	subsystem-vendor-id
#	subsystem-id
#
# Note: it saves the pathname and the properties in ${DEV_PROPS} file 
# to optimize subsequent mapping calls for the same path name.
#
# e.g: get_properties "/pci@0,0/pci-ide@1f,2"
#
get_properties()
{
    if [ -f ${DEV_PROPS} ]
    then
	mapped_path=`${GREP} $1 ${DEV_PROPS}`
	if [ $? -eq 0 ]
	then
		vendor_id=`echo ${mapped_path} | ${CUT} -d ' ' -f2` 
		device_id=`echo ${mapped_path} | ${CUT} -d ' ' -f3` 
		subsystem_vendor_id=`echo ${mapped_path} | ${CUT} -d ' ' -f4` 
		subsystem_id=`echo ${mapped_path} | ${CUT} -d ' ' -f5` 
		return;
	fi
    fi

    path=`echo $1|${GREP} -v storage`
    ${PRTCONF} -v "/devices"$path >${PRTCONF_OUT}
    if [ $? -eq 0 ]
    then
	vendor_id=`get_devinfo_prop ${PRTCONF_OUT} "vendor-id" | ${SED} "s/^0x//"`
	device_id=`get_devinfo_prop ${PRTCONF_OUT} "device-id" | ${SED} "s/^0x//"`
	subsystem_vendor_id=`get_devinfo_prop ${PRTCONF_OUT} "subsystem-vendor-id" | ${SED} "s/^0x//"`
	subsystem_id=`get_devinfo_prop ${PRTCONF_OUT} "subsystem-id" | ${SED} "s/^0x//"`
	rm -f ${PRTCONF_OUT}
	echo $1 "$vendor_id" "$device_id" "$subsystem_vendor_id" "$subsystem_id" >>${DEV_PROPS}
    else
	vendor_id=""
	device_id=""
	subsystem_vendor_id=""
	subsystem_id=""
	echo $1 "$vendor_id" >>${DEV_PROPS}
    fi
}

#
# Function process_bootenvrc_for_install() converts bootpath in ata style
# to nv_sata style in the file /boot/solaris/bootenv.rc for normal upgrade.
#
process_bootenvrc_for_install() {

	# Check to see if bootenv.rc file has ata disk entries.
	${GREP} "cmdk@" ${BOOTENVRC} > /dev/null
	if [ $? -eq 1 ]
	then
		# There is no ata disk entry. No mapping is needed.
		return 0
	fi

	# Backup the bootenv.rc file.
	$CP ${BOOTENVRC} ${BOOTENVRC_BAK}
	if [ $? -ne 0 ]
	then
		# Can't backup bootenv.rc file.
		rem_drv -b ${ROOT} nv_sata
		${RM} -rf ${NVSATA_TMP}
		exit 1
	fi
 
	${GREP} "cmdk@" ${BOOTENVRC} | while read bootpath_line
	do
		old_path=`echo ${bootpath_line} | ${CUT} -d' ' -f3 \
			|$SED "s/\'//g"`
		devname=`echo ${old_path} | $CUT -d/ -f4- | $SED "{
			s/ide@/disk@/
			s/\/cmdk@.//
			}"`
		$LS -l /dev/dsk | $GREP ${devname} | while read line
		do
			new_path=`echo $line | $NAWK '{print $11}'`
			arg="/`echo ${new_path} | ${CUT} -d/ -f4,5`"
			get_properties ${arg}
	
			for pair in ${DRIVER_ALIASES}
			do
				VENDOR_ID=`echo ${pair} | $SED "s/\"//g" \
					| $CUT -d, -f1`
				DEVICE_ID=`echo ${pair} | $SED "s/\"//g" \
					| $CUT -d, -f2`
				# Check to see if it is a nv_sata device.
				if [ "pci${vendor_id}" = ${VENDOR_ID} -a \
					${device_id} = ${DEVICE_ID} ]
				then	
					if [ "X${subsystem_vendor_id}" = "X" ]
					then
                       				ids="pci${vendor_id},${device_id}"
					else
                       				ids="pci${subsystem_vendor_id},${subsystem_id}"
					fi
					mapped_path=`echo ${old_path} | ${SED} "{
						s/pci-ide/${ids}/
						s/ide/disk/
						s/\/cmdk@.//
						}"`
					new_path="/`echo ${new_path} | $CUT -d/ -f4-`"
					if [ ${new_path} = ${mapped_path} ]
					then
						if [ ! -f ${NVSATA_TMP}/bootenv.rc ]
						then
							$GREP -v "cmdk@" ${BOOTENVRC} > \
								${NVSATA_TMP}/bootenv.rc	
						fi
						echo "setprop bootpath ${new_path}" \
							>> ${NVSATA_TMP}/bootenv.rc
						break	
					fi	
				fi	
			done
		done
	done
	# Commit the changes
	if [ -f ${NVSATA_TMP}/bootenv.rc ]
	then
		${CP} ${NVSATA_TMP}/bootenv.rc ${BOOTENVRC}
		if [ $? -ne 0 ]
		then
			# Failed to modify bootenv.rc file.
			rem_drv -b ${ROOT} nv_sata
			${RM} -rf ${NVSATA_TMP}
			exit 1
		fi
	fi
}

#
# Function process_bootenvrc_for_lu() converts bootpath in ata style
# to nv_sata style in the file /boot/solaris/bootenv.rc for live upgrade.
#
process_bootenvrc_for_lu() {

        # Check to see if bootenv.rc has ata disk entries.

        ${GREP} "cmdk@" ${BOOTENVRC} > /dev/null
        if [ $? -eq 1 ]
        then
                # There is no ata disk. No mapping is needed.
                return 0
        fi

	# Backup the bootenv.rc file.
	$CP ${BOOTENVRC} ${BOOTENVRC_BAK}
	if [ $? -ne 0 ]
	then
		# Can't backup bootenv.rc file.
		rem_drv -b ${ROOT} nv_sata
		${RM} -rf ${NVSATA_TMP}
		exit 1
	fi

	${GREP} "cmdk@" ${BOOTENVRC} | while read bootpath_line
	do
	    bootpath=`echo ${bootpath_line} | ${CUT} -d' ' -f3`
	    if [ "X${no_nvsata_in_CBE}" != "X0" ]
	    then 
        	arg=`echo ${bootpath} | ${CUT} -d/ -f1-3`
        	get_properties ${arg}

        	# Check if boot device is a supported nv_sata device.
        	for pair in ${DRIVER_ALIASES}
        	do
                	dr_vendor_id=`echo $pair | $SED "s/\"//g" | $CUT -d, -f1`
                	dr_device_id=`echo $pair | $SED "s/\"//g" | $CUT -d, -f2`
                	if [ "pci${vendor_id}" = ${dr_vendor_id} -a ${device_id} = \
				${dr_device_id} ]
                	then
				if [ "X${subsystem_vendor_id}" = "X" ]
				then
                       			ids="pci${vendor_id},${device_id}"
				else
                       			ids="pci${subsystem_vendor_id},${subsystem_id}"
				fi
				if [ ! -f ${NVSATA_TMP}/bootenv.rc ]
				then
					$GREP -v "cmdk@" ${BOOTENVRC} > \
						${NVSATA_TMP}/bootenv.rc
				fi
				mapped_bootpath_line=`echo ${bootpath_line} | ${SED} "{
                                	s/pci-ide/${ids}/
                                	s/ide/disk/
                                	s/\/cmdk@.//
                                	}"`

				echo ${mapped_bootpath_line} >> ${NVSATA_TMP}/bootenv.rc
				break
                	fi
        	done
	    else
		is_mapped="no"
		devname=`echo ${bootpath} | $CUT -d/ -f4- | $SED "{
			s/ide@/disk@/
			s/\/cmdk@.//
			}"`
		for new_path in `$LS -l "/dev/dsk" | $GREP ${devname} |$NAWK '{print $11}'`
		do
			arg2="/`echo ${new_path} | ${CUT} -d/ -f4,5`"
			get_properties ${arg2}
			for pair in ${DRIVER_ALIASES}
			do
				VENDOR_ID=`echo ${pair} | $SED "s/\"//g" \
					| $CUT -d, -f1`
				DEVICE_ID=`echo ${pair} | $SED "s/\"//g" \
					| $CUT -d, -f2`

				# Check to see if it is a nv_sata device.
				if [ "pci${vendor_id}" = ${VENDOR_ID} -a \
					${device_id} = ${DEVICE_ID} ]
				then
					if [ "X${subsystem_vendor_id}" = "X" ]
					then
						ids3="pci${vendor_id},${device_id}"
					else
						ids3="pci${subsystem_vendor_id},${subsystem_id}"
					fi
					mapped_bootpath_line=`echo ${bootpath_line} | ${SED} "{
						s/pci-ide/${ids3}/
						s/ide/disk/
						s/\/cmdk@.//
						 }"`
					mapped_bootpath=`echo ${mapped_bootpath_line} \
						| ${CUT} -d' ' -f3`
					$LS -l "/dev/dsk" | $GREP ${mapped_bootpath} >/dev/null
					if [ $? -eq 0 ]
					then
						if [ ! -f ${NVSATA_TMP}/bootenv.rc ]
						then
							$GREP -v "cmdk@" ${BOOTENVRC} > \
								${NVSATA_TMP}/bootenv.rc
						fi
						echo ${mapped_bootpath_line} >> \
							${NVSATA_TMP}/bootenv.rc	
						is_mapped="yes"
						break
					fi
				fi
			done
			if [ "${is_mapped}" = "yes" ]
			then 
				break
			fi
		done
	    fi
	done
	# Commit the changes
	if [ -f ${NVSATA_TMP}/bootenv.rc ]
	then
		${CP} ${NVSATA_TMP}/bootenv.rc ${BOOTENVRC}
		if [ $? -ne 0 ]
		then
			# Failed to modify bootenv.rc file.
			rem_drv -b ${ROOT} nv_sata
			${RM} -rf ${NVSATA_TMP}
			exit 1
		fi
	fi
}

#
# Function process_system_for_lu() converts rootdev in /etc/system from
# old ata fromat to new nv_sata format during live upgrade.
#
process_system_for_lu() {

        # Check to see if system has ata disk as a root device.
        rootdev_line=`${GREP} -v "*" $SYSTEM | ${GREP} "rootdev:/"| ${GREP} "cmdk@"`
        if [ $? -eq 1 ]
        then
                # roodev entry does not exist, or root disk is not ata.
                return 0
        fi

	${CP} ${SYSTEM} ${SYSTEM_BAK}
	if [ $? -ne 0 ]
	then
		# Can't backup system file."
		$CP ${BOOTENVRC_BAK} ${BOOTENVRC}
		rem_drv -b ${ROOT} nv_sata
		${RM} -rf ${NVSATA_TMP}
		exit 1
	fi

        rootdev=`echo ${rootdev_line} | ${CUT} -d: -f2-`
	if [ "X${no_nvsata_in_CBE}" != "X0" ]
	then
        	ar=`echo ${rootdev} | ${CUT} -d/ -f1-3`
        	get_properties ${ar}

        	# Check if boot device is a supported nv_sata device.
        	for pair in ${DRIVER_ALIASES}
        	do
			dr_vendor_id=`echo $pair | $SED "s/\"//g" | $CUT -d, -f1`
                	dr_device_id=`echo $pair | $SED "s/\"//g" | $CUT -d, -f2`
                	if [ "pci${vendor_id}" = ${dr_vendor_id} -a \
				${device_id} = ${dr_device_id} ]
                	then

				if [ "X${subsystem_vendor_id}" = "X" ]
				then
                       			ids="pci${vendor_id},${device_id}"
				else
                       			ids="pci${subsystem_vendor_id},${subsystem_id}"
				fi
                        	$SED "{
                                	s/pci-ide/$ids/
                                	s/ide/disk/
                                	s/\/cmdk@.//
                                	}" ${SYSTEM} > "${NVSATA_TMP}/system"

                        	break
			fi
        	done
	else
		devname=`echo ${rootdev} | $CUT -d/ -f4- | $SED "{
			s/ide@/disk@/
			s/\/cmdk@.//
			}"`
		is_mapped="no"
		for dev_path in `$LS -l "/dev/dsk" | $GREP ${devname} |$NAWK '{print $11}'`
		do
			ar="/`echo ${dev_path} | ${CUT} -d/ -f4,5`"
			get_properties ${ar}
			for pair in ${DRIVER_ALIASES}
			do
				VENDOR_ID=`echo ${pair} | $SED "s/\"//g" \
					| $CUT -d, -f1`
				DEVICE_ID=`echo ${pair} | $SED "s/\"//g" \
					| $CUT -d, -f2`

				# Check to see if it is a nv_sata device.
				if [ "pci${vendor_id}" = ${VENDOR_ID} -a \
					${device_id} = ${DEVICE_ID} ]
				then
					if [ "X${subsystem_vendor_id}" = "X" ]
					then
						ids="pci${vendor_id},${device_id}"
					else
						ids="pci${subsystem_vendor_id},${subsystem_id}"
					fi
					
					mapped_rootdev=`echo ${rootdev} | ${SED} "{
						s/pci-ide/${ids}/
						s/ide/disk/
						s/\/cmdk@.//
						}"`		
					$LS -l "/dev/dsk" | $GREP ${mapped_rootdev} >/dev/null
					if [ $? -eq 0 ]
					then
						$SED "{
							s/pci-ide/$ids/
							s/ide/disk/
							s/\/cmdk@.//
							}" ${SYSTEM} > "${NVSATA_TMP}/system"
						is_mapped="yes"	
						break
					fi
				fi
			done
			if [ "${is_mapped}" = "yes" ]
			then
				break
			fi
		done
	fi
	
	if [ -f ${NVSATA_TMP}/system ]
	then
		${CP} ${NVSATA_TMP}/system ${SYSTEM}
		if [ $? -ne 0 ]
		then
			# Failed to modify system file.
			$CP ${BOOTENVRC_BAK} ${BOOTENVRC}
			rem_drv -b ${ROOT} nv_sata
			${RM} -rf ${NVSATA_TMP}
			exit 1
		fi
	fi
}

#
# Function process_system_for_install() converts rootdev in /etc/system from 
# old ata format to new nv_sata format during the upgrade installation.
#
process_system_for_install() {

        # Check to see if system has ata disk as a root device.
	rootdev_line=`${GREP} -v "*" $SYSTEM | ${GREP} "rootdev:/"| ${GREP} "cmdk@"`
        if [ $? -eq 1 ]
        then
		# roodev entry does not exist, or root disk is not ata.
                return 0
        fi

	${CP} ${SYSTEM} ${SYSTEM_BAK}
	if [ $? -ne 0 ]
	then
		# Can't backup system file."
		$CP ${BOOTENVRC_BAK} ${BOOTENVRC}
		rem_drv -b ${ROOT} nv_sata
		${RM} -rf ${NVSATA_TMP}
		exit 1
	fi

	rootdev=`echo ${rootdev_line} | ${CUT} -d: -f2- \
		| $SED "s/\'//g"`
	devname=`echo ${rootdev} | $CUT -d/ -f4- | $SED "{
		s/ide@/disk@/
		s/\/cmdk@.//
		}"`
	is_mapped="no"
	for dev_path in `$LS -l "/dev/dsk" | $GREP ${devname} |$NAWK '{print $11}'`
	do
		arg="/`echo ${dev_path} | ${CUT} -d/ -f4,5`"
		get_properties ${arg}
		for pair in ${DRIVER_ALIASES}
		do
			VENDOR_ID=`echo ${pair} | $SED "s/\"//g" \
				| $CUT -d, -f1`
			DEVICE_ID=`echo ${pair} | $SED "s/\"//g" \
				| $CUT -d, -f2`

			# Check to see if it is a nv_sata device.
			if [ "pci${vendor_id}" = ${VENDOR_ID} -a \
				${device_id} = ${DEVICE_ID} ]
			then
				if [ "X${subsystem_vendor_id}" = "X" ]
				then
					ids="pci${vendor_id},${device_id}"
				else
					ids="pci${subsystem_vendor_id},${subsystem_id}"
				fi

				mapped_rootdev=`echo ${rootdev} | ${SED} "{
					s/pci-ide/${ids}/
					s/ide/disk/
					s/\/cmdk@.//
					}"`
				$LS -l "/dev/dsk" | $GREP ${mapped_rootdev} >/dev/null
				if [ $? -eq 0 ]
				then
					$SED "{
						s/pci-ide/$ids/
						s/ide/disk/
						s/\/cmdk@.//
						}" ${SYSTEM} > "${NVSATA_TMP}/system"
						is_mapped="yes"
						break
				fi
			fi
		done
		if [ "${is_mapped}" = "yes" ]
		then
			break
		fi
	done

        if [ -f ${NVSATA_TMP}/system ]
        then
                ${CP} ${NVSATA_TMP}/system ${SYSTEM}
                if [ $? -ne 0 ]
                then
                        # Failed to modify system file.
                        $CP ${BOOTENVRC_BAK} ${BOOTENVRC}
                        rem_drv -b ${ROOT} nv_sata
                        ${RM} -rf ${NVSATA_TMP}
                        exit 1
                fi
        fi			
}

#
# Function process_power_conf_for_lu converts ata device path to nv_sata 
# device path if any for live upgrade.
#
process_power_conf_for_lu() {

	$GREP -v "#" ${POWER_CONF} | $GREP "cmdk@">/dev/null
	if [ $? -ne 0 ]
	then
		# No ata device entry in power.conf. No conversion is needed.
		return 0
	fi

	$CP ${POWER_CONF} ${POWER_CONF_BAK}
	if [ $? -ne 0 ]
	then
		# Failed to back up the power.conf file
		$CP ${BOOTENVRC_BAK} ${BOOTENVRC}
		$CP ${SYSTEM_BAK} ${SYSTEM}
		rem_drv -b ${ROOT} nv_sata
		$RM -rf ${NVSATA_TMP}
		exit 1
	fi

	$GREP "#" ${POWER_CONF} > ${NVSATA_TMP}/power.conf
	$GREP -v "#" ${POWER_CONF} | $GREP -v "cmdk@" \
		>> ${NVSATA_TMP}/power.conf

	if [ "X${no_nvsata_in_CBE}" != "X0" ]
	then
		$GREP -v "#" ${POWER_CONF} | $GREP "cmdk@" \
			${POWER_CONF} | while read l
		do
			is_mapped="no"
			new_entry=""
			for i in $l
			do
				tp=$i
				echo $i | $GREP "cmdk@" >/dev/dull
				if [ $? -eq 0 ]
				then
			    		a="/`echo $i | ${CUT} -d/ -f2,3`"
			    		get_properties $a
			   
			    		for pair in ${DRIVER_ALIASES}
			    		do
						dr_vendor_id=`echo $pair | $SED "s/\"//g" \
				    			| $CUT -d, -f1`	
						dr_device_id=`echo $pair | $SED "s/\"//g" \
				    			| $CUT -d, -f2`
						if [ "pci${vendor_id}" = ${dr_vendor_id} -a \
				    			${device_id} = ${dr_device_id} ]
						then
				    			if [ "X${subsystem_vendor_id}" = "X" ]
				    			then
                       						is="pci${vendor_id},${device_id}"
				    			else
                       						is="pci${subsystem_vendor_id},${subsystem_id}"
				    			fi
				    			tp=`echo $i | $SED "{
								s/pci-ide/$is/
								s/ide/disk/
								s/\/cmdk@.//
								}"`
							if [ "${is_mapped}" = "no" ]
							then
								is_mapped="yes"
							fi
				    			break
						fi
			    		done
				fi
				new_entry="${new_entry}$tp "
			done		
			if [ "${is_mapped}" = "yes" ]
			then
				echo ${new_entry} >> ${NVSATA_TMP}/mapped_power.conf
			else
				echo ${new_entry} >> ${NVSATA_TMP}/power.conf
			fi
		done 
	else
        	$GREP -v "#" ${POWER_CONF} | $GREP "cmdk@" ${POWER_CONF} \
			| while read l
        	do
			is_mapped="no"
                	new_entry=""
                	for i in $l
                	do
                        	tp=$i
                        	echo $i | $GREP "cmdk@" >/dev/dull
                        	if [ $? -eq 0 ]
                        	then
                                	dn=`echo $i | $CUT -d/ -f4- | $SED "{
                                        	s/ide@/disk@/
                                        	s/\/cmdk@.//
                                        	}"`
                                	for x in `$LS -l /dev/dsk | $GREP $dn \
                                        	| $NAWK '{print $11}'`
                                	do
                                        	np=""
                                        	a="/`echo ${x} | ${CUT} -d/ -f4,5`"
                                        	get_properties $a
                                        	for pair in ${DRIVER_ALIASES}
                                        	do
                                            		VENDOR_ID=`echo ${pair} | $SED "s/\"//g" \
                                                		| $CUT -d, -f1`
                                            		DEVICE_ID=`echo ${pair} | $SED "s/\"//g" \
                                                		| $CUT -d, -f2`
                                            		if [ "pci${vendor_id}" = ${VENDOR_ID} -a \
                                                		${device_id} = ${DEVICE_ID} ]
                                            		then
                                                		if [ "X${subsystem_vendor_id}" = "X" ]
                                                		then
                                                    			is="pci${vendor_id},${device_id}"
                                                		else
                                                    			is="pci${subsystem_vendor_id},${subsystem_id}"
                                                		fi
                                                		mapped_path=`echo $i | ${SED} "{
                                                        		s/pci-ide/${is}/
                                                        		s/ide/disk/
                                                        		s/\/cmdk@.//
                                                        		}"`
                                                		np="/`echo ${x} | $CUT -d/ -f4- \
                                                        		| $CUT -d: -f1`"
                                                		if [ ${np} = ${mapped_path} ]
                                                		then
                                                        		tp=${mapped_path}
									if [ "${is_mapped}" = "no" ]
									then
										is_mapped="yes"
									fi	
                                                        		break
								fi
                                            		fi
                                        	done

                                        	if [ "${is_mapped}" = "yes" ]
                                        	then
                                                	break
                                        	fi
                                	done
                        	fi
                        	new_entry="${new_entry}$tp "
                	done
			if [ "${is_mapped}" = "yes" ]
			then
                		echo ${new_entry} >> ${NVSATA_TMP}/mapped_power.conf
			else
				echo ${new_entry} >> ${NVSATA_TMP}/power.conf
			fi	
        	done
	fi

	if [ -f ${NVSATA_TMP}/mapped_power.conf ]
	then
		$CAT ${NVSATA_TMP}/mapped_power.conf >> ${NVSATA_TMP}/power.conf
		$CP ${NVSATA_TMP}/power.conf ${POWER_CONF}
		if [ $? -ne 0 ]
		then
			$CP ${BOOTENVRC_BAK} ${BOOTENVRC}
			$CP ${SYSTEM_BAK} ${SYSTEM}
			rem_drv -b ${ROOT} nv_sata
			$RM -rf ${NVSATA_TMP}
			exit 1
		fi
	fi
}

#
# Function process_power_conf_for_install converts ata device path to nv_sata 
# device path if any for normal upgrade installation.
#
process_power_conf_for_install() {

	$GREP -v "#" ${POWER_CONF} | $GREP "cmdk@" >/dev/null
        if [ $? -ne 0 ]
        then
                # No ata device entry in power.conf. No conversion is needed.
                return 0
        fi

        $CP ${POWER_CONF} ${POWER_CONF_BAK}
        if [ $? -ne 0 ]
        then
		# Failed to back up the power.conf file.
		$CP ${BOOTENVRC_BAK} ${BOOTENVRC}
		$CP ${SYSTEM_BAK} ${SYSTEM}
		rem_drv -b ${ROOT} nv_sata
        	$RM -rf ${NVSATA_TMP}
                exit 1
        fi

	$GREP "#" ${POWER_CONF} > ${NVSATA_TMP}/power.conf
	$GREP -v "#" ${POWER_CONF} | $GREP -v "cmdk@" \
		>> ${NVSATA_TMP}/power.conf

	$GREP -v "#" ${POWER_CONF} | $GREP "cmdk@" ${POWER_CONF} | while read l
        do
		is_mapped="no"
		new_entry=""
		for i in $l
		do
			tp=$i
			echo $i | $GREP "cmdk@" >/dev/dull
			if [ $? -eq 0 ]
			then
				dn=`echo $i | $CUT -d/ -f4- | $SED "{
					s/ide@/disk@/
					s/\/cmdk@.//
					s/\'//g
					}"`
				for x in `$LS -l /dev/dsk | $GREP $dn \
					| $NAWK '{print $11}'`
				do
					np=""
					a="/`echo ${x} | ${CUT} -d/ -f4,5`"
					get_properties $a

					for pair in ${DRIVER_ALIASES}
					do
					    VENDOR_ID=`echo ${pair} | $SED "s/\"//g" \
						| $CUT -d, -f1`
					    DEVICE_ID=`echo ${pair} | $SED "s/\"//g" \
						| $CUT -d, -f2`
					    if [ "pci${vendor_id}" = ${VENDOR_ID} -a \
						${device_id} = ${DEVICE_ID} ]
					    then
				    		if [ "X${subsystem_vendor_id}" = "X" ]
				    		then
                       				    is="pci${vendor_id},${device_id}"
				    		else
                       				    is="pci${subsystem_vendor_id},${subsystem_id}"
				    		fi
						mapped_path=`echo $i | ${SED} "{
							s/pci-ide/${is}/
							s/ide/disk/
							s/\/cmdk@.//
							}"`
						np="/`echo ${x} | $CUT -d/ -f4- \
							| $CUT -d: -f1`"
						if [ ${np} = ${mapped_path} ]
						then
							tp=${mapped_path}	
							if [ "${is_mapped}" = "no" ]
							then
								is_mapped="yes"
							fi
							break
						fi
					    fi
					done
					
					if [ "${is_mapped}" = "yes" ]
					then
						break
					fi
				done
			fi
			new_entry="${new_entry}$tp "
                done
		if [ "${is_mapped}" = "yes" ]
		then
			echo ${new_entry} >> ${NVSATA_TMP}/mapped_power.conf
		else
			echo ${new_entry} >> ${NVSATA_TMP}/power.conf
		fi
        done

	if [ -f ${NVSATA_TMP}/mapped_power.conf ]
	then
		$CAT ${NVSATA_TMP}/mapped_power.conf >> ${NVSATA_TMP}/power.conf
        	$CP ${NVSATA_TMP}/power.conf ${POWER_CONF}
        	if [ $? -ne 0 ]
        	then
			$CP ${BOOTENVRC_BAK} ${BOOTENVRC}
			$CP ${SYSTEM_BAK} ${SYSTEM}
			rem_drv -b ${ROOT} nv_sata
                	$RM -rf ${NVSATA_TMP}
                	exit 1
        	fi
	fi
}

#
# Function process_devlink_for_lu() links all old ata logical device names
# to new physical device paths on upgraded BE.
#
process_devlink_for_lu() {

        $LS -l "${ROOT}/dev/dsk" | $GREP "cmdk@" | while read line1
        do
                logical_disk=`echo $line1 | $NAWK '{print $9}'`
                old_path=`echo $line1 | $NAWK '{print $11}'`
		mapped_new_path=""
		if [ "X${no_nvsata_in_CBE}" != "X0" ]
		then
                	arg2="/`echo ${old_path} | ${CUT} -d/ -f4,5`"
                	get_properties ${arg2}

                	for pair in ${DRIVER_ALIASES}
                	do
                        	VENDOR_ID=`echo ${pair} | $SED "s/\"//g" \
                                	| $CUT -d, -f1`
                        	DEVICE_ID=`echo ${pair} | $SED "s/\"//g" \
                                	| $CUT -d, -f2`
                        	# Check to see if it is a nv_sata device.
                        	if [ "pci${vendor_id}" = ${VENDOR_ID} -a \
					${device_id} = ${DEVICE_ID} ]
                        	then
					if [ "X${subsystem_vendor_id}" = "X" ]
					then
                        	    	    ids3="pci${vendor_id},${device_id}"
					else
                        	    	    ids3="pci${subsystem_vendor_id},${subsystem_id}"
					fi
					mapped_new_path=`echo ${old_path} | ${SED} "{
						s/pci-ide/${ids3}/
						s/ide/disk/
						s/\/cmdk@.//
						 }"`
					break
				fi
			done
		else
			devname=`echo ${old_path} | $CUT -d/ -f6- | $SED "{
				s/ide@/disk@/
				s/\/cmdk@.//
				}"`
			is_mapped="no"
			for new_path in `$LS -l "/dev/dsk" | $GREP ${devname} | $NAWK '{print $11}'`
			do
				arg2="/`echo ${new_path} | ${CUT} -d/ -f4,5`"
				get_properties ${arg2}
				for pair in ${DRIVER_ALIASES}
				do
					VENDOR_ID=`echo ${pair} | $SED "s/\"//g" \
						| $CUT -d, -f1`
					DEVICE_ID=`echo ${pair} | $SED "s/\"//g" \
						| $CUT -d, -f2`
					
					# Check to see if it is a nv_sata device.
					if [ "pci${vendor_id}" = ${VENDOR_ID} -a \
						${device_id} = ${DEVICE_ID} ]
					then
						if [ "X${subsystem_vendor_id}" = "X" ]
						then
						    ids3="pci${vendor_id},${device_id}"
						else
						    ids3="pci${subsystem_vendor_id},${subsystem_id}"
						fi
						mapped_new_path=`echo ${old_path} | ${SED} "{
							s/pci-ide/${ids3}/
							s/ide/disk/
							s/\/cmdk@.//
							}"`
						if [ ${new_path} = ${mapped_new_path} ]
						then
							is_mapped="yes"
							break
						fi
					fi
				done
				if [ "${is_mapped}" = "yes" ]
				then
					break
				fi
			done
		fi
						
		if [ "X${mapped_new_path}" != "X" ]
		then
			cd ${ROOT}/dev/dsk
			${MV} ${logical_disk} ${logical_disk}.${BAK}
			if [ $? -ne 0 ]
			then
				# Can't back up old link.
				$CP ${BOOTENVRC_BAK} ${BOOTENVRC}
				$CP ${SYSTEM_BAK} ${SYSTEM}
				$CP ${POWER_CONF_BAK} ${POWER_CONF}
				rem_drv -b ${ROOT} nv_sata
                       		${RM} -rf ${NVSATA_TMP}
                       		exit 1
                        fi

			${LN} -s ${mapped_new_path} ${logical_disk}
			if [ $? -ne 0 ]
			then
				# Can't create symbolic link
				${MV} ${logical_disk}.${BAK} ${logical_disk}
                               	$CP ${BOOTENVRC_BAK} ${BOOTENVRC}
				$CP ${SYSTEM_BAK} ${SYSTEM}
				$CP ${POWER_CONF_BAK} ${POWER_CONF}
				rem_drv -b ${ROOT} nv_sata
                                ${RM} -rf ${NVSATA_TMP}
                               	exit 1
			fi
				
			c_number="dsk/`echo ${logical_disk} | $CUT -d'd' -f1`"
			$GREP ${c_number} ${ENUMERATE_RESERVED} >/dev/null
			if [ $? -ne 0 ]
			then
				echo ${c_number} >> ${ENUMERATE_RESERVED}
			fi

			cd ../rdsk
			mapped_new_path="${mapped_new_path},raw"
			${MV} ${logical_disk} ${logical_disk}.${BAK}
			if [ $? -ne 0 ]
			then
                              	# Can't back up old link.
                               	${RM} ../dsk/${logical_disk}
                               	${MV} ../dsk/${logical_disk}.${BAK} \
					../dsk/${logical_disk}
                               	$CP ${BOOTENVRC_BAK} ${BOOTENVRC}
				$CP ${SYSTEM_BAK} ${SYSTEM}
				$CP ${POWER_CONF_BAK} ${POWER_CONF}
				rem_drv -b ${ROOT} nv_sata
                               	${RM} -rf ${NVSATA_TMP}
                               	exit 1
			fi

			${LN} -s ${mapped_new_path} ${logical_disk}
			if [ $? -ne 0 ]
			then
				# Can't create symbolic link.
                               	${MV} ${logical_disk}.${BAK} ${logical_disk}
                               	${RM} ../dsk/${logical_disk}
                               	${MV} ../dsk/${logical_disk}.${BAK} \
                                       	../dsk/${logical_disk}
                               	$CP ${BOOTENVRC_BAK} ${BOOTENVRC}
				$CP ${SYSTEM_BAK} ${SYSTEM}
				$CP ${POWER_CONF_BAK} ${POWER_CONF}
				rem_drv -b ${ROOT} nv_sata
                               	${RM} -rf ${NVSATA_TMP}
                               	exit 1
			fi
               	fi
        done

	$GREP "^dsk" ${ENUMERATE_RESERVED} >/dev/null
	if [ $? -eq 0 ]
        then
                $RM ${DEVLINK_DB}       
        fi
}

#
# Function process_devlink_for_install() links all old ata logical device names
# to new physical device paths for normal upgrade installation.
#
process_devlink_for_install() {

        $LS -l "${ROOT}/dev/dsk" | $GREP "cmdk@" | while read line1
        do
                logical_disk=`echo $line1 | $NAWK '{print $9}'`
		old_path=`echo $line1 | $NAWK '{print $11}' \
			| $SED "s/\'//g"`
		devname=`echo ${old_path} | $CUT -d/ -f6- | $SED "{
			s/ide@/disk@/
			s/\/cmdk@.//
			 }"`
                $LS -l "/dev/dsk" | $GREP ${devname} | while read line2
                do
                        new_path=`echo $line2 | $NAWK '{print $11}'`
                        arg2="/`echo ${new_path} | ${CUT} -d/ -f4,5`"
                        get_properties ${arg2}

			for pair in ${DRIVER_ALIASES}
                        do
                                VENDOR_ID=`echo ${pair} | $SED "s/\"//g"\
                                        | $CUT -d, -f1`
                                DEVICE_ID=`echo ${pair} | $SED "s/\"//g" \
                                        | $CUT -d, -f2`

                                # Check to see if it is a nv_sata device.
                                if [ "pci${vendor_id}" = ${VENDOR_ID} -a \
                                        ${device_id} = ${DEVICE_ID} ]
                                then
					if [ "X${subsystem_vendor_id}" = "X" ]
					then
                        		    ids3="pci${vendor_id},${device_id}"
					else
                        		    ids3="pci${subsystem_vendor_id},${subsystem_id}"
					fi
                                        mapped_new_path=`echo ${old_path} | ${SED} "{
                                                s/pci-ide/${ids3}/
                                                s/ide/disk/
                                                s/\/cmdk@.//
                                                }"`
                                        if [ ${new_path} = ${mapped_new_path} ]
                                        then
                                                # Found the match.
                                                cd ${ROOT}/dev/dsk
                                                ${MV} ${logical_disk} ${logical_disk}.${BAK}
                                                if [ $? -ne 0 ]
                                                then
                                                        # Can't back up old link.
                                                        $CP ${BOOTENVRC_BAK} ${BOOTENVRC}
							$CP ${SYSTEM_BAK} ${SYSTEM}
							$CP ${POWER_CONF_BAK} ${POWER_CONF}
							rem_drv -b ${ROOT} nv_sata
                                                        ${RM} -rf ${NVSATA_TMP}
                                                        exit 1
                                                fi

                                                ${LN} -s ${mapped_new_path} ${logical_disk}
                                                if [ $? -ne 0 ]
                                                then
                                                        # Can't create symbolic link
                                                        ${MV} ${logical_disk}.${BAK} ${logical_disk}
                                                        $CP ${BOOTENVRC_BAK} ${BOOTENVRC}
							$CP ${SYSTEM_BAK} ${SYSTEM}
							$CP ${POWER_CONF_BAK} ${POWER_CONF}
							rem_drv -b ${ROOT} nv_sata
                                                        ${RM} -rf ${NVSATA_TMP}
                                                        exit 1
                                                fi
						
						c_number="dsk/`echo ${logical_disk} \
							| $CUT -d'd' -f1`"
						$GREP ${c_number} ${ENUMERATE_RESERVED} >/dev/null
						if [ $? -ne 0 ]
						then
							echo ${c_number} >> ${ENUMERATE_RESERVED}
						fi

                                                cd ../rdsk
                                                mapped_new_path="${mapped_new_path},raw"
                                                ${MV} ${logical_disk} ${logical_disk}.${BAK}
                                                if [ $? -ne 0 ]
                                                then
                                                        # Can't back up old link.
                                                        ${RM} ../dsk/${logical_disk}
                                                        ${MV} ../dsk/${logical_disk}.${BAK} \
                                                                ../dsk/${logical_disk}
                                                        $CP ${BOOTENVRC_BAK} ${BOOTENVRC}
							$CP ${SYSTEM_BAK} ${SYSTEM}
							$CP ${POWER_CONF_BAK} ${POWER_CONF}
							rem_drv -b ${ROOT} nv_sata
                                                        ${RM} -rf ${NVSATA_TMP}
                                                        exit 1
                                                fi

                                                ${LN} -s ${mapped_new_path} ${logical_disk}
                                                if [ $? -ne 0 ]
                                                then
                                                        # Can't create symbolic link.
                                                        ${MV} ${logical_disk}.${BAK} ${logical_disk}
                                                        ${RM} ../dsk/${logical_disk}
                                                        ${MV} ../dsk/${logical_disk}.${BAK} \
                                                                ../dsk/${logical_disk}
                                                        $CP ${BOOTENVRC_BAK} ${BOOTENVRC}
							$CP ${SYSTEM_BAK} ${SYSTEM}
							$CP ${POWER_CONF_BAK} ${POWER_CONF}
							rem_drv -b ${ROOT} nv_sata
                                                        ${RM} -rf ${NVSATA_TMP}
                                                        exit 1
                                                fi
                                        fi
                                fi
                        done
                done
        done
	
	$GREP "^dsk" ${ENUMERATE_RESERVED} >/dev/null
	if [ $? -eq 0 ]
	then
		$RM ${DEVLINK_DB}	
	fi
}

clean_up() {

        ${RM} -rf ${NVSATA_TMP}
        $LS -l "${ROOT}/dev/dsk" | $GREP "disk@" | while read line
        do
                logical_disk=`echo $line | $NAWK '{print $9}'`
                cd ${ROOT}/dev/dsk
                ${RM} -f ${logical_disk}.${BAK}

                cd ../rdsk
                ${RM} -f ${logical_disk}.${BAK}
        done
}

# Function: check_add_drv()
#
# This function will check if the module has an entry in etc/name_to_major
# If not simply calls add_drv with the arguments given. If there is
# such an entry in name_to_major file, it adds entries in driver_aliases
# driver_classes and minor_perm if necessary.
# The syntax of this function is the same as add_drv. 

check_add_drv()
{
	if [ "$BASEDIR" = "" ]
	then
		BASEDIR=/  
	fi
	alias=""
	class=""
	ADD_ALIAS=0
	ADD_CLASS=0
	ADD_MINOR=0
	OPTIND=1
	IS_NET_DRIVER=0

	cmd="add_drv"

	NO_CMD=
	while getopts i:b:m:c:N  opt
	do
		case $opt in
			N )	NO_CMD=1;;
			i )	ADD_ALIAS=1	
				alias=$OPTARG
				cmd=$cmd" -i '$alias'"
				;;
			m )	ADD_MINOR=1
				minor=$OPTARG
				cmd=$cmd" -m '$minor'"
				;;
			c)	ADD_CLASS=1
				class=$OPTARG
				cmd=$cmd" -c $class"
				;;
			b)	BASEDIR=$OPTARG
				cmd=$cmd" -b $BASEDIR"
				;;
			\?) 	echo "check_add_drv can not handle this option"
				return
				;;
			esac
	done 
	shift `/usr/bin/expr $OPTIND - 1`
	
	drvname=$1

	cmd=$cmd" "$drvname

	drvname=`echo $drvname | /usr/bin/sed 's;.*/;;g'`

	/usr/bin/grep "^$drvname[ 	]" ${ROOT}/etc/name_to_major >  /dev/null 2>&1

	if [ "$NO_CMD" = "" -a $? -ne 0 ] 
	then
		eval $cmd
	else	
		# entry already in name_to_major, add alias, class, minorperm
		# if necessary
		if [ $ADD_ALIAS = 1 ]	
		then
			for i in $alias
			do
				/usr/bin/egrep "^$drvname[ 	]+$i" ${ROOT}/etc/driver_aliases>/dev/null 2>&1
				if [ $? -ne 0 ]
				then
					echo "$drvname $i" >> ${ROOT}/etc/driver_aliases	
				fi
			done
		fi

		if [ $ADD_CLASS = 1 ]
		then
			/usr/bin/egrep "^$drvname[ 	]+$class( |	|$)" ${ROOT}/etc/driver_classes > /dev/null 2>&1
			if [ $? -ne 0 ]
			then 
				echo "$drvname\t$class" >> ${ROOT}/etc/driver_classes
			fi
		fi

		if [ $ADD_MINOR = 1 ]
		then
			/usr/bin/grep "^$drvname:" ${ROOT}/etc/minor_perm > /dev/null 2>&1
			if [ $? -ne 0 ]
			then 
				minorentry="$drvname:$minor"
				echo $minorentry >> ${ROOT}/etc/minor_perm
			fi
		fi

	fi
}

#
# Main program starts here.
#
check_add_drv -b ${ROOT} -i '"pci10de,37f" "pci10de,55" "pci10de,54" "pci10de,266" "pci10de,267"' -m '* 0644 root sys' -c scsi-self-identifying nv_sata

#
# Create temporary directory for node migration 
#
if [ ! -d ${NVSATA_TMP} ]
then
        ${MKDIR} ${NVSATA_TMP}
        if [ $? -ne 0 ]
        then
                # Failed to create ${NVSATA_TMP} directory.
                exit 1
        fi
fi

#
# If it is an install, do nothing. If it is an upgrade, do the conversion.
#
line=`$MOUNT | $GREP "/ "`
first_field=`echo $line | $NAWK '{print $1}'`
third_field=`echo $line | $NAWK '{print $3}'`
echo ${third_field} |$GREP "ramdisk:a" > /dev/null

if [ ${first_field} = "/" -a $? -eq 0 ]
then
	# It is either an install/upgrade.
	if [ -f ${UPGRADE_LOG} ]
	then
		# It is an upgrade.
		$GREP ${NV_SATA} ${PATH_TO_INST} > /dev/null
		if [ $? -eq 0 ]
		then
			# The system was running nv_sata before the upgrade.
			$RM -rf ${NVSATA_TMP}
			exit 0
		fi

		process_bootenvrc_for_install
		process_system_for_install
		process_power_conf_for_install
		process_devlink_for_install
		clean_up
		exit 0
	fi
	$RM -rf ${NVSATA_TMP}
	exit 0
fi

#
# Liveupgrade. 
#
if [ -f ${LIVEUPGRADE_TMP_LOG} ]
then
	$GREP ${NV_SATA} /etc/driver_aliases >/dev/null
	no_nvsata_in_CBE=$?
	$GREP ${NV_SATA} ${PATH_TO_INST} > /dev/null
	if [ $? -eq 0 ]
	then
		# Target BE was running nv_sata driver before the upgrade.
		$RM -rf ${NVSATA_TMP}
		exit 0
	fi	
	process_bootenvrc_for_lu
	process_system_for_lu
	process_power_conf_for_lu
	process_devlink_for_lu
	clean_up
	touch ${ROOT}/reconfigure
	exit 0
fi

#
# Pkgadd.
#
$RM -rf ${NVSATA_TMP}
exit 0