#!/bin/bash
# Intel MIC Platform Software Stack (MPSS)
#
# Copyright(c) 2013 Intel Corporation.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2, as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# The full GNU General Public License is included in this distribution in
# the file called "COPYING".
#
# 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"

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_HOST Module"

	# Ensure the driver is loaded
	if [ ! -d "$sysfs" ]; then
		modprobe mic_host
		RETVAL=$?
		if [ $RETVAL -ne 0 ]; then
			failure
			echo
			return $RETVAL
		fi
	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`" != "offline" ]
		do
			sleep 1
			echo -e "Waiting for "`basename $f`" to go offline"
		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_HOST Module: "
	modprobe -r mic_host
	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 $?
