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