#!/bin/bash
# SPDX-License-Identifier: GPL-2.0-only
# Intel MIC Platform Software Stack (MPSS)
#
# Copyright(c) 2013 Intel Corporation.
#
# Intel MIC User Space Tools.
#
# mpss	Start mpssd.
#
# chkconfig: 2345 95 05
# description: start MPSS stack processing.
#
### BEGIN INIT INFO
# Provides: mpss
# Required-Start:
# Required-Stop:
# Short-Description: MPSS stack control
# Description: MPSS stack control
### END INIT INFO

# Source function library.
. /etc/init.d/functions

exec=/usr/sbin/mpssd
sysfs="/sys/class/mic"
mic_modules="mic_host mic_x100_dma scif vop"

start()
{
	[ -x $exec ] || exit 5

	if [ "`ps -e | awk '{print $4}' | grep mpssd | head -1`" = "mpssd" ]; then
		echo -e $"MPSSD already running! "
		success
		echo
		return 0
	fi

	echo -e $"Starting MPSS Stack"
	echo -e $"Loading MIC drivers:" $mic_modules

	modprobe -a $mic_modules
	RETVAL=$?
	if [ $RETVAL -ne 0 ]; then
		failure
		echo
		return $RETVAL
	fi

	# Start the daemon
	echo -n $"Starting MPSSD "
	$exec
	RETVAL=$?
	if [ $RETVAL -ne 0 ]; then
		failure
		echo
		return $RETVAL
	fi
	success
	echo

	sleep 5

	# Boot the cards
	micctrl -b

	# Wait till ping works
	for f in $sysfs/*
	do
		count=100
		ipaddr=`cat $f/cmdline`
		ipaddr=${ipaddr#*address,}
		ipaddr=`echo $ipaddr | cut -d, -f1 | cut -d\; -f1`
		while [ $count -ge 0 ]
		do
			echo -e "Pinging "`basename $f`" "
			ping -c 1 $ipaddr &> /dev/null
			RETVAL=$?
			if [ $RETVAL -eq 0 ]; then
				success
				break
			fi
			sleep 1
			count=`expr $count - 1`
		done
		[ $RETVAL -ne 0 ] && failure || success
		echo
	done
	return $RETVAL
}

stop()
{
	echo -e $"Shutting down MPSS Stack: "

	# Bail out if module is unloaded
	if [ ! -d "$sysfs" ]; then
		echo -n $"Module unloaded "
		success
		echo
		return 0
	fi

	# Shut down the cards.
	micctrl -S

	# Wait for the cards to go offline
	for f in $sysfs/*
	do
		while [ "`cat $f/state`" != "ready" ]
		do
			sleep 1
			echo -e "Waiting for "`basename $f`" to become ready"
		done
	done

	# Display the status of the cards
	micctrl -s

	# Kill MPSSD now
	echo -n $"Killing MPSSD"
	killall -9 mpssd 2>/dev/null
	RETVAL=$?
	[ $RETVAL -ne 0 ] && failure || success
	echo
	return $RETVAL
}

restart()
{
	stop
	sleep 5
	start
}

status()
{
	micctrl -s
	if [ "`ps -e | awk '{print $4}' | grep mpssd | head -n 1`" = "mpssd" ]; then
		echo "mpssd is running"
	else
		echo "mpssd is stopped"
	fi
	return 0
}

unload()
{
	if [ ! -d "$sysfs" ]; then
		echo -n $"No MIC_HOST Module: "
		success
		echo
		return
	fi

	stop

	sleep 5
	echo -n $"Removing MIC drivers:" $mic_modules
	modprobe -r $mic_modules
	RETVAL=$?
	[ $RETVAL -ne 0 ] && failure || success
	echo
	return $RETVAL
}

case $1 in
	start)
		start
		;;
	stop)
		stop
		;;
	restart)
		restart
		;;
	status)
		status
		;;
	unload)
		unload
		;;
	*)
		echo $"Usage: $0 {start|stop|restart|status|unload}"
		exit 2
esac

exit $?
