#!/bin/bash
#
# chkconfig: 345 09 35
# description: imbload is used to start/stop IPMI driver and make /dev/imb
#

#environment variables 
#PATH=/usr/local/ism/bin:$PATH
#IMBDIR=/usr/local/ism/driver
KVER=`uname -r`
KBASE=`uname -r |cut -f1-2 -d'.'`
param=
# was MDIR=/sbin/ now use PATH
MDIR=
LSMOD=${MDIR}lsmod
# intfc=KCS
# slave=0x42
# base=0x0000000000000CA2

#remove driver function to remove imb driver
rem_drv()
{
	if [ "`$LSMOD | grep "^imb "`" != "" ]
        then
           ${MDIR}rmmod imb

           if [ -c /dev/imb ] 
           then
              rm -f /dev/imb
           fi
        fi
}

#add driver function to add imb driver
add_drv()
{
	if [ "`$LSMOD | grep "^imb "`" != "" ]
        then
           rem_drv
        fi

        which dmidecode >/dev/null 2>&1
	if [ $? -eq 0 ]
	then
           intfc=`dmidecode |grep "Interface Type:" |awk '{print $3}'`
	   slave=`dmidecode |grep "I2C Slave" |awk '{print $4}'`
	   base=`dmidecode |grep "Base Address:" |awk '{print $3}'`
           if [ "$intfc" = "KCS" ]
           then
               param="kcsbase=$base"
           else
               param="smbaddr=$slave"
           fi
	fi

	if [ "$KBASE" = "2.4" ] 
        then
           imbko=imb
        else 
           imbko=imb.ko
        fi
	moddir=/lib/modules/$KVER/kernel/drivers/char
	if [ -f $moddir/$imbko ]
	then
           IMBDIR=$moddir
	else
	   IMBDIR=/usr/local/ism/driver
	fi
        ${MDIR}insmod $IMBDIR/$imbko $param

        maj=`cat /proc/devices | awk '/ imb/{print $1}'`
        if [ -c /dev/imb ] 
        then
           rm -f /dev/imb
        fi
        /bin/mknod /dev/imb c $maj 0

	mvdev=/dev/ipmi0
	# If there is a /dev/ipmi0 node with the same major number,
	# it will  cause problems, and it is not used, so remove it.
	if [ -c $mvdev ]
	then
	    ipmimaj=`ls -l $mvdev |awk '{print $5}' |sed -e 's/,//'`
    	    if [ "$maj" = "$ipmimaj" ]
    	    then
    	       # echo "removing duplicate $mvdev device"
    	       rm -f $mvdev
   	    fi
	fi
}

case "$1" in 
"start")
        add_drv
	;;
"stop")
        rem_drv
	;;
*)
	echo imbload: Unknown Argument $arg
	echo Usage: imbload [start/stop]
	exit 1
	;;
esac
