#!/bin/sh
#
#    Copyright (c) 2003-2004 Brocade Communications Systems, Inc.
#    All rights reserved.
#
#    File name:	prominst_athena
#
#    The script will install prom package for Athena and Pulsar. 
#
PATH=/bin:/usr/bin:/sbin:/usr/sbin

OK=0
RETVAL=1
echo "Please avoid powering off the system during prom update."

PROC_MOUNTED=0
if [ -z "$(ls -A /proc)" ]; then
mount -t proc none /proc
PROC_MOUNTED=1
fi

sb_env=`bootenv secureboot  2> /dev/null`
if test -a /proc/sec_boot_info; then
sb_enabled=`cat /proc/sec_boot_info | grep "SB status" | cut -d ':' -f 2`
else
sb_enabled=0
fi

if [ $PROC_MOUNTED -eq 1 ]; then
umount /proc
fi

if [ -e /var/log/prom.log ];then
	log_size=$(wc -c < /var/log/prom.log)
	if [ $log_size -ge 4096 ]; then
		cp /var/log/prom.log /var/log/prom.log_prev
		rm -f /var/log/prom.log
	fi
fi
echo "`date '+%D %T'` sb_enabled ${sb_enabled} sb_env ${sb_env} " >> /var/log/prom.log

#
# During HCL, /dev between new and older kernel
# are not synced so create prom/mtd nodes
# for prom install
#
/bin/ls /dev/mtd0 >/dev/null 2>&1
if [ $? -ne 0 ]; then
	mknod --mode=644 /dev/mtd0 c 90 0
fi

/bin/ls /dev/mtd1 >/dev/null 2>&1
if [ $? -ne 0 ]; then
	mknod --mode=644 /dev/mtd1 c 90 2
fi

/bin/ls /dev/prom0 >/dev/null 2>&1
if [ $? -ne 0 ]; then
	/bin/ln -s /dev/mtd0 /dev/prom0
fi

/bin/ls /dev/prom1 >/dev/null 2>&1
if [ $? -ne 0 ]; then
	/bin/ln -s /dev/mtd1 /dev/prom1
fi

if [ $sb_enabled -eq 1 ] || [ "$sb_env" == "yes" ]; then
	/bin/ls /dev/mtd2 >/dev/null 2>&1
	if [ $? -ne 0 ]; then
		mknod --mode=644 /dev/mtd2 c 90 4
	fi

	/bin/ls /dev/mtd3 >/dev/null 2>&1
	if [ $? -ne 0 ]; then
		mknod --mode=644 /dev/mtd3 c 90 6
	fi

	/bin/ls /dev/esbchdr0 >/dev/null 2>&1
	if [ $? -ne 0 ]; then
		/bin/ln -s /dev/mtd2 /dev/esbchdr0
	fi

	/bin/ls /dev/esbchdr1 >/dev/null 2>&1
	if [ $? -ne 0 ]; then
		/bin/ln -s /dev/mtd3 /dev/esbchdr1
	fi
fi

echo "`date '+%D %T'` Writing prom0 start  " >> /var/log/prom.log
for i in `seq 3`; do
    nohup /sbin/flash_write -i /boot/bootrom.bin \
	-o /dev/prom0 >/dev/null 2>&1

    RETVAL=$?
    if [ $RETVAL -eq 0 ]; then
	if [ $sb_enabled -eq 1 ] || [ "$sb_env" == "yes" ]; then
	nohup /sbin/flash_write -i /boot/esbchdr.bin \
		-o /dev/esbchdr0 >/dev/null 2>&1

		RETVAL=$?
		if [ $RETVAL -eq 0 ]; then
    			OK=1	
			break;
		fi
		echo "`date '+%D %T'` Write esbchdr.bin attempt ${i} failed ${RETVAL}" >> /var/log/prom.log
	else
		OK=1
		break;
	fi
    fi
    echo "`date '+%D %T'` Write bootrom.bin attempt ${i} failed ${RETVAL}" >> /var/log/prom.log
done

echo "`date '+%D %T'` Writing prom0 done  " >> /var/log/prom.log

if [ $OK -eq 1 ]; then
OK=0
echo "`date '+%D %T'` Writing prom1 start  " >> /var/log/prom.log
for i in `seq 3`; do
    	nohup /sbin/flash_write -i /boot/bootrom.bin \
		-o /dev/prom1 >/dev/null 2>&1

	RETVAL=$?
	if [ $RETVAL -eq 0 ]; then
		if [ $sb_enabled -eq 1 ] || [ "$sb_env" == "yes" ]; then
       			nohup /sbin/flash_write -i /boot/esbchdr.bin \
				-o /dev/esbchdr1 >/dev/null 2>&1

			RETVAL=$?
			if [ $RETVAL -eq 0 ]; then
    				OK=1	
					break;
			fi
			echo "`date '+%D %T'` Write esbchdr.bin attempt ${i} failed ${RETVAL}" >> /var/log/prom.log
			echo "md5sum /boot/esbchdr.bin `md5sum /boot/esbchdr.bin` " >> /var/log/prom.log 
		else
			OK=1
			break;
		fi
	fi
	echo "`date '+%D %T'` Write bootrom.bin attempt ${i} failed ${RETVAL}" >> /var/log/prom.log
	echo "md5sum /boot/bootrom.bin `md5sum /boot/bootrom.bin` " >> /var/log/prom.log 
done
fi
echo "`date '+%D %T'` Writing prom1 done  " >> /var/log/prom.log

if [ $OK -ne 1 ]; then
        echo "Failed to write to prom partition!"
        exit 1
fi
