#! /bin/sh
# Copyright (c) 2011-2015 Huawei Technologies Co., Ltd.
# All rights reserved.

### BEGIN INIT INFO
# Provides:          pangea-pcie-driver
# Required-Start:
# Required-Stop:
# Default-Start:     1 2 3 5
# Default-Stop:	     0 6
# Description:       start stop pcie service
### END INIT INFO

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

export PCIEINFDRIVER_DIR="/usr/lib/modules/pangea_pcieinf_driver/target"

cd ${PCIEINFDRIVER_DIR}
echo "cur dir:`pwd`, start pcieinf driver..."

#CPU
CPU_TYPE=$(uname -r | awk -F 'euleros' '{print $2}' | awk -F '.' '{print $2}' | tr -d '\r\n')

#ɱ
killall_proc() {
	procName=$1
	killall -9 -e ${procName} 2> /dev/null
	ret=`ps -aux | grep -w "${procName}" | grep -v "grep" -c`
	for ((t=0;(t<10)&&(ret>0);t++))
		do
			echo -e "Notice: have already kill ${procName} process ...                           ${STATUS_FAILED}"
			killall -9 -e ${procName} 2> /dev/null
			sleep 0.01
			ret=`ps -aux | grep -w "${procName}" | grep -v "grep" -c`
		done
	#ʹ10νδɱԲܷ1᲻жں̬KOںbugon
	return 0
}

#н
run_proc() {
	procName=$1

	if [ ! -f ${procName} ]
    then
		echo -e "Notice: no such ${procName} file in current dir: `pwd` ...                           ${STATUS_FAILED}"
		return 1
    fi

	./${procName} -v 0 &

	ret=`ps -aux | grep -w "${procName}" | grep -v "grep" -c`
	# ٴCheckǷ
	if [ ${ret} -le 0 ];then
        echo -e "Notice: start ${procName} process fail ...                           ${STATUS_FAILED}"
        return 1
    fi

	return 0
}

#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
}

# ֹͣн
stop_all_process() {
	echo "stop all pangea pcie proc ...                           ${STATUS_RUNNING}"

	killall_proc pitest_diag_server
	if [ $? -ne 0 ];then
		return 1
	fi

	killall_proc pitest
	if [ $? -ne 0 ];then
		return 1
	fi

	echo "stop all pangea pcie proc ...                           ${STATUS_DONE}"
	return 0
}

# pcieн
run_all_process() {
	echo "run all pangea pcie proc ...                           ${STATUS_RUNNING}"
	dos2unix pitest.sh 2> /dev/null
	#pitest/usr/local/bin/
	cp -rf pitest.sh /usr/local/bin/pitest || exit 1
	for i in $(seq 1 5)
	do
		# н
		export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${PCIEINFDRIVER_DIR}
		run_proc pitest_diag_server
		if [ $? -eq 0 ];then
			echo "run all pangea pcie proc ...                           ${STATUS_DONE}"
			return 0
		fi
	done
	return 1
}

# жں̬ko
remove_all_kernel() {
	echo "remove all pangea pcie kernel ...                           ${STATUS_RUNNING}"
	rmmod_ko pcie_agent
	rmmod_ko pcieinf
    if [ "$CPU_TYPE" = "aarch64" ]; then
        rmmod_ko pcie_base
        rmmod_ko serdescbb
    fi
    rmmod_ko uio

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

# װں̬ko
insmod_all_kernel() {
	echo "insmod all pangea pcie kernel ...                           ${STATUS_RUNNING}"
	modprobe uio
    # װpcie sdk
    if [ "$CPU_TYPE" = "aarch64" ]; then
        insmod_ko serdescbb.ko
        insmod_ko pcie_base.ko
    fi
    insmod_ko pcieinf.ko
    insmod_ko pcie_agent.ko

	echo "insmod all pangea pcie kernel ...                           ${STATUS_DONE}"
	return 0
}

pcieinf_service_start()
{
	echo -e "start pcieinfservice ...                           ${STATUS_RUNNING}"

	#н,ʱserverforkʧܵ⣬serverټں̬ko
	run_all_process
	if [ $? -ne 0 ];then
		echo -e "Notice: run_all_process ...                           ${STATUS_FAILED}"
		#ʱexit,5ζserverִУӰ
	fi
	#װں̬ko
	insmod_all_kernel
	if [ $? -ne 0 ];then
		echo -e "Notice: insmod_all_kernel ...                           ${STATUS_FAILED}"
		exit 1
	fi
}

pcieinf_service_stop()
{
    echo -e "stop pcieinfservice ...                           ${STATUS_DONE}"
	#ɱ
	stop_all_process
	if [ $? -ne 0 ];then
		echo -e "Notice: stop_all_process ...                           ${STATUS_FAILED}"
		exit 1
	fi

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

pcie_service_status()
{
    echo -e "pcieinfservice status ...                           ${STATUS_RUNNING}"
}

case "$1" in
    start)
        pcieinf_service_start
        ;;
    stop)
        pcieinf_service_stop
        ;;
    status)
        pcieinf_service_status
        ;;

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