usr/src/pkgdefs/SUNWnvsata/postinstall
author mlf
Thu, 16 Aug 2007 14:46:34 -0700
changeset 4876 ecd69ba0713a
child 5278 43e9b8e1ada5
permissions -rw-r--r--
PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver PSARC/2007/100 Device Id Extensions PSARC/2007/172 Reserved Devnames 6296435 native sata driver needed for nVIDIA mcp04 and mcp55 controllers 6418034 DMA resources need to be released for scsi commands emulated in sata framework 6487018 driver binding for sata storage devices should be more flexible 6487838 common definitions can be defined in sata_defs.h to be shared with other sata HBA's 6549855 PSARC/2007/100 Device Id Extensions 6549915 devfsadm enhancements for PSARC/2007/172 Reserved Devnames

#!/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 2007 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.

# ident	"%Z%%M%	%I%	%E% SMI"

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"'
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} -vp "/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`
		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-`
	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@.//
					}"`
				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}'`
		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"' -m '* 0644 root sys' 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}'`

if [ ${first_field} = "/" -a ${third_field} = "/ramdisk:a" ]
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