#!/bin/bash
#
# chkconfig: 2345 09 55
# description: openimb is used to start/stop OpenIPMI modules required for /dev/imb
#
# ipmi_smb_intf debug parameter 'smb_dbg' bit flags:
# SMB_DEBUG_SMBUS	8
# SMB_DEBUG_TIMING	4
# SMB_DEBUG_STATE	2
# SMB_DEBUG_MSG		1

RETVAL=0
IMBMAJOR=244
tmplog=/tmp/openimb.log
moddir=/lib/modules/`uname -r`/kernel/drivers/char/ipmi

#the next 3 lines are modified with the OpenIMB update package is installed
IPMI_KERNEL_VERSION="__KERNEL_VERSION__"
IPMI_INTERFACE="__DMI_INTERFACE__"
IPMI_SLAVEADDRESS=__DMI_I2CADDRESS__

KCS_INTERFACE=KCS
LOADKCSMODULES="ipmi_msghandler ipmi_si ipmi_devintf ipmi_watchdog "
UNLOADKCSMODULES="ipmi_imb ipmi_watchdog ipmi_devintf ipmi_si ipmi_msghandler"
LOADSMBUSMODULES="i2c-core i2c-i801 ipmi_msghandler ipmi_smb_intf ipmi_devintf ipmi_watchdog "
UNLOADSMBUSMODULES="ipmi_imb ipmi_watchdog ipmi_devintf ipmi_smb_intf ipmi_msghandler i2c-i801 i2c-core"

start() {
	if [ "$IPMI_KERNEL_VERSION" != "`uname -r | awk -F- '{ print $1 }'`" ]
	then
		echo "Incompatible kernel versions"
		RETVAL=1
		return $RETVAL
	fi
	if [ "`lsmod | grep "^imb "`" != "" ]
        then
		echo "Conflict with existing Intel imb driver"
		RETVAL=1
		return $RETVAL
	fi
	# Check if openimb is already running
	if [ ! -f /var/lock/subsys/openimb ]; then
		echo "Starting OpenIPMI modules: "
		if [ $IPMI_INTERFACE = $KCS_INTERFACE ]
		then
			MODULES=$LOADKCSMODULES
		else
			MODULES=$LOADSMBUSMODULES
		fi
		for module in $MODULES
		do
			echo $module
			if [ $module = ipmi_smb_intf ]
			then
			  insmod -f $moddir/ipmi_smb_intf.ko smb_addr=0x0,$IPMI_SLAVEADDRESS smb_dbg_probe=1 >$tmplog 2>&1
			else
			  modprobe $module >$tmplog 2>&1
			fi
			RETVAL=$?
			if [ $RETVAL -ne 0 ]
			then
				echo
				return
			fi
		done

		RETVAL=$?
		if [ $RETVAL -ne 0 ]
		then
			echo
			return
		fi
		echo ipmi_imb
		insmod -f $moddir/ipmi_imb.ko ipmi_imb_major=$IMBMAJOR >$tmplog 2>&1
		RETVAL=$?
		if [ $RETVAL -ne 0 ]
		then
			echo
			return
		fi
		IMBMAJOR=`cat /proc/devices | awk '/imb/{print $1}'`
		if [ -c /dev/imb ]
		then
			rm -f /dev/imb
		fi
		/bin/mknod /dev/imb c $IMBMAJOR 0
		IPMIMAJOR=`cat /proc/devices | awk '/ipmidev/{print $1}'`
		if [ -c /dev/ipmi0 ]
		then
			rm -f /dev/ipmi0
		fi
		/bin/mknod /dev/ipmi0 c $IPMIMAJOR 0
		echo
		[ $RETVAL -eq 0 ] && touch /var/lock/subsys/openimb
	fi
	return $RETVAL
}

stop() {
#    echo -n $"Stopping OpenIPMI modules:  "
    if [ $IPMI_INTERFACE = $KCS_INTERFACE ]
    then
    	MODULES=$UNLOADKCSMODULES
    else
    	MODULES=$UNLOADSMBUSMODULES
    fi
    for module in $MODULES
    do
#      echo $module
        rmmod $module 2>/dev/null
        if [ $? -ne 0 ]
        then
	    lsmod | grep $module
	    if [ $? -eq 0 ]
	    then
	    	echo "$module is busy"
		RETVAL=1
            	break
	    fi
	else
            if [ $module=ipmi_imb ]
            then
	           rm -f /dev/imb
            fi
            if [ $module=ipmi_devintf ]
            then
	           rm -f /dev/ipmi0
            fi
        RETVAL=0
        fi
    done
    echo
    [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/openimb
    return $RETVAL
}

# See how we were called.
case "$1" in
    start)
	start
	;;
    stop)
	stop
	;;
    *)
	echo $"Usage: $0 {start|stop}"
	;;
esac
exit $RETVAL
