#!/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"
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 $?
