#!/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.
#
# micctrl - Controls MIC boot/start/stop.
#
# chkconfig: 2345 95 05
# description: start MPSS stack processing.
#
### BEGIN INIT INFO
# Provides: micctrl
### END INIT INFO

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

sysfs="/sys/class/mic"

_status()
{
	f=$sysfs/$1
	echo -e $1 state: "`cat $f/state`" shutdown_status: "`cat $f/shutdown_status`"
}

status()
{
	if [ "`echo $1 | head -c3`" == "mic" ]; then
		_status $1
		return $?
	fi
	for f in $sysfs/*
	do
		_status `basename $f`
		RETVAL=$?
		[ $RETVAL -ne 0 ] && return $RETVAL
	done
	return 0
}

_reset()
{
	f=$sysfs/$1
	echo reset > $f/state
}

reset()
{
	if [ "`echo $1 | head -c3`" == "mic" ]; then
		_reset $1
		return $?
	fi
	for f in $sysfs/*
	do
		_reset `basename $f`
		RETVAL=$?
		[ $RETVAL -ne 0 ] && return $RETVAL
	done
	return 0
}

_boot()
{
	f=$sysfs/$1
	echo "linux" > $f/bootmode
	echo "mic/uos.img" > $f/firmware
	echo "mic/$1.image" > $f/ramdisk
	echo "boot" > $f/state
}

boot()
{
	if [ "`echo $1 | head -c3`" == "mic" ]; then
		_boot $1
		return $?
	fi
	for f in $sysfs/*
	do
		_boot `basename $f`
		RETVAL=$?
		[ $RETVAL -ne 0 ] && return $RETVAL
	done
	return 0
}

_shutdown()
{
	f=$sysfs/$1
	echo shutdown > $f/state
}

shutdown()
{
	if [ "`echo $1 | head -c3`" == "mic" ]; then
		_shutdown $1
		return $?
	fi
	for f in $sysfs/*
	do
		_shutdown `basename $f`
		RETVAL=$?
		[ $RETVAL -ne 0 ] && return $RETVAL
	done
	return 0
}

_wait()
{
	f=$sysfs/$1
	while [ "`cat $f/state`" != "offline" -a "`cat $f/state`" != "online" ]
	do
		sleep 1
		echo -e "Waiting for $1 to go offline"
	done
}

wait()
{
	if [ "`echo $1 | head -c3`" == "mic" ]; then
		_wait $1
		return $?
	fi
	# Wait for the cards to go offline
	for f in $sysfs/*
	do
		_wait `basename $f`
		RETVAL=$?
		[ $RETVAL -ne 0 ] && return $RETVAL
	done
	return 0
}

if [ ! -d "$sysfs" ]; then
	echo -e $"Module unloaded "
	exit 3
fi

case $1 in
	-s)
		status $2
		;;
	-r)
		reset $2
		;;
	-b)
		boot $2
		;;
	-S)
		shutdown $2
		;;
	-w)
		wait $2
		;;
	*)
		echo $"Usage: $0 {-s (status) |-r (reset) |-b (boot) |-S (shutdown) |-w (wait)}"
		exit 2
esac

exit $?
