#! /bin/sh
#
# Copyright (c) 2011-2015 Huawei Technologies Co., Ltd.
# All rights reserved.
#
### BEGIN INIT INFO
# Provides:          pangea-bsp-driver
# Required-Start:
# Required-Stop:
# chkconfig: 1235 45 30
# Default-Stop:	     0 6
# Description:       start stop bsp service
### END INIT INFO

#ɹ״̬
STATUS_DONE="[OK]"
#ʧ״̬
STATUS_FAILED="[FAILED]"
#״̬
STATUS_RUNNING="[RUNNING]"
#δ״̬
STAUS_UNUSED="[UNUSED]"

export LD_LIBRARY_PATH=$INSTALL_DIR:$LD_LIBRARY_PATH
export BSPDRIVER_DIR="/usr/lib/modules/pangea_bspdriver/target"

cd ${BSPDRIVER_DIR}
echo "cur dir:`pwd`, start bsp driver..."


#insmod ko
insmod_ko() {
	#ȼļǷ
	modeName=$1
	if [ ! -f ${modeName} ];then
		echo -e "Can not find ${modeName} ...                           ${STATUS_FAILED}"
		return 1
	fi

	#װko
	echo "insmod ${modeName}"
    insmod ${modeName}
	if [ $? -ne 0 ];then
		echo "insmod ${modeName} fail ...                           ${STATUS_FAILED}"
		return 1
	else
		echo "insmod ${modeName} succ ...                           ${STATUS_DONE}"
		return 0
	fi
}

#rmmod_ko 
rmmod_ko() {
	#жko
	modeName=$1

	ret=`lsmod | cut -f1 -d' ' | grep -w "${modeName}" -c`
	if [ ${ret} -le 0 ]; then
		echo "${modeName} isn't exist before rmmoding ${modeName}"
		return 0
	fi

	echo "rmmod ${modeName}"
    rmmod ${modeName}
	if [ $? -ne 0 ];then
		echo "rmmod ${modeName} fail ...                           ${STATUS_FAILED}"
		return 1
	else
		echo "rmmod ${modeName} succ ...                           ${STATUS_DONE}"
		return 0
	fi
}

# жں̬ko
remove_all_kernel() {
	echo "remove all pangea bsp kernel ...                           ${STATUS_RUNNING}"

	echo "remove all pangea bsp kernel ...                           ${STATUS_DONE}"
	return 0
}

insmod_dependency_ko() {
	cur_kernel_ver=$(uname -r)
	machine=$(uname -m)
	if [ ${machine} == "aarch64" ];
	then
		modprobe i2c-dev
		modprobe mtd
		# ֲʽֱʹrpmi2c_dw.kosfc.kolbc.ko
		insmod i2c_dw.ko
		insmod sfc.ko
		insmod lbc.ko
	fi
}

# װں̬ko
insmod_all_kernel() {
	echo "insmod all pangea bsp kernel ...                           ${STATUS_RUNNING}"
	insmod_dependency_ko
    # BSP i2c豸busƫ
    if [ -e /usr/lib/modules/pangea_bspdriver/target/pangea_bsp_geti2cbus.sh ]
    then
        dos2unix /usr/lib/modules/pangea_bspdriver/target/pangea_bsp_geti2cbus.sh
        # ҵһhisi iic controller/devµiicͨ
        sh /usr/lib/modules/pangea_bspdriver/target/pangea_bsp_geti2cbus.sh
    fi
	insmod_ko bsp.ko
	insmod_ko bsp_agent.ko
	echo "insmod all pangea bsp kernel ...                           ${STATUS_DONE}"

	chmod 550 bsptool
	cp -rf bsptool /usr/sbin/
	return 0
}

start_os_load_dog()
{
    # ipmitoolʱ,(̫ƽ󡢶˾ϡ)ȡдʧֶܻ߲֧ȡд붼Ϊrsp=0xffΪrsp=0xc1
    # ˾ϵأʹõһֽ1Чڶر󻷾ڵ0 1 2 3ĸֽڷֱжӦĬȫ
    local os_load_dog_flag="01010101"
    # ȶe2prom
    ret=$(ipmitool raw 0x32 0x16 0x00 0x00 0x80 0x00 0x60 2>&1)
    # ȡrspֵ,ͨ0xffжǷҪдe2prom
    rsp_value=$(echo $ret | awk -F'rsp=' '{print $2}' | awk '{print $1}' | tr -d '):')
    ret=$(echo $ret | tr -d ' ')
    # rspֵΪe2promд־
    if [ -z "$rsp_value" ] && [ "$ret" == "$os_load_dog_flag" ];then
        echo "Os load dog already set."
        return
    fi

    if [ "$rsp_value" == "0xff" ];then
        # Ϊдй־Ļ,ʧ,ǰδд,дe2prom
        ipmitool raw 0x32 0x17 0x00 0x00 0x80 0x00 0x60 0x01 0x01 0x01 0x01> /dev/null 2>&1
        ret=$(ipmitool raw 0x32 0x16 0x00 0x00 0x80 0x00 0x60 2>&1)
        rsp=$(echo $ret | awk -F'rsp=' '{print $2}' | awk '{print $1}' | tr -d '):')
        ret=$(echo $ret | tr -d ' ')
        if [ -z "$rsp" ] && [ "$ret" == "$os_load_dog_flag" ];then
            echo "Os load dog set success."
        elif [ "$rsp" == "0xff" ];then
            # дȥ߲֧д,e2prom
            echo "This device do not support set os load dog or set os load dog set failed."
        elif [ "$rsp" == "0xc7" ];then
            # ipmitool
            echo "ipmitool cmd param error."
        else
            echo "This device do not support set os load dog, rsp is ${rsp}."
        fi
        return
    elif [ -z "$rsp_value" ];then
        # rspֵΪret01010101ǷĽڵ㳡,Ҳнڵ㲢ȫ
        echo "This device is not 4 nodes environment or not all nodes have OS load enabled.."
        return
    else
        # Ϊ֧дй־Ļ,ʧ,֧
        echo "This device do not support set os load dog."
        return
    fi
}

bsp_service_start()
{
	echo -e "start bspservice ...                           ${STATUS_RUNNING}"

	#жں̬ko
	remove_all_kernel
	if [ $? -ne 0 ];then
		echo -e "Notice: remove all kernel ...                           ${STATUS_FAILED}"
		exit 1
	fi

	#װں̬ko
	insmod_all_kernel
	if [ $? -ne 0 ];then
		echo -e "Notice: insmod_all_kernel ...                           ${STATUS_FAILED}"
		exit 1
	fi

    #˾ϻдos_load
    start_os_load_dog
}

bsp_service_stop()
{
    echo -e "stop bspservice ...                           ${STATUS_DONE}"

	#жں̬ko
	remove_all_kernel
	if [ $? -ne 0 ];then
		echo -e "Notice: remove all kernel ...                           ${STATUS_FAILED}"
		exit 1
	fi
}

bsp_service_status()
{
    echo -e "bspservice status ...                           ${STATUS_RUNNING}"
}

case "$1" in
    start)
        bsp_service_start
        ;;
    stop)
        bsp_service_stop
        ;;
    status)
        bsp_service_status
        ;;

    *)
        echo "Usage: $0 {start|stop|status}"
        exit 1
        ;;
esac
