#!/bin/bash

do_init ()
{
	insmod /lib/modules/3.4.39/gpio-sunxi.ko

	# Switch off the buzzer
	echo 1 > /sys/class/gpio_sw/PE11/data

	# Provide the clock to thge Ethernet switch
	insmod /lib/modules/3.4.39/clkgen.ko

	# Get the Ethernet switch out of reset
	echo 1 > /sys/class/gpio_sw/PD14/data

	# Wait for the switch to go out of reset
	sleep 5

	# Switch the relays to pass data through the switch
	echo 1 > /sys/class/gpio_sw/PE7/data

	# Activate the CPU network adapter and configure the switch
	insmod /lib/modules/3.4.39/sunxi_gmac.ko phyaddr=5 multi_interface_mode=1

	return 0
}

do_led ()
{
#	modprobe gpio-sunxi

	case "$2" in
	setstate)
		case "$3" in
		off)
			echo 1 > /sys/class/gpio_sw/PE12/data
			echo 1 > /sys/class/gpio_sw/PE13/data
			;;
		green)
			echo 1 > /sys/class/gpio_sw/PE12/data
			echo 0 > /sys/class/gpio_sw/PE13/data
			;;
		red)
			echo 0 > /sys/class/gpio_sw/PE12/data
			echo 1 > /sys/class/gpio_sw/PE13/data
			;;
		yellow)
			echo 0 > /sys/class/gpio_sw/PE12/data
			echo 0 > /sys/class/gpio_sw/PE13/data
			;;
		*)
			echo "Requested state ('$3') is unknown. Use '$0 $1 $2 <off|green|red|yellow>."
		esac
		;;
	getstate)
		GR=$(cat /sys/class/gpio_sw/PE12/data)
		RD=$(cat /sys/class/gpio_sw/PE13/data)
		if [ "$GR" = "1" ] ; then
			if [ "$RD" = "1" ] ; then
				echo "off"
			else
				echo "green"
			fi
		else
			if [ $RD = "1" ] ; then
				echo "red"
			else
				echo "yellow"
			fi
		fi
		;;
	*)
		echo "Incorrect command '$2' specified. Use '$0 $1 setstate <state>' or '$0 $1 getstate'."
	esac

	return 0
}

do_netleds ()
{
	case "$2" in
	setmode)
		case "$3" in
		0|1|2|3|4)
			echo $3 > /proc/probe/network/led_mode
			;;
		*)
			echo "Requested mode ('$3') is unknown. Acceptable values are: 0-4."
		esac
		;;
	getmode)
		cat /proc/probe/network/led_mode
		;;
	*)
		echo "Incorrect command '$2' specified. Use '$0 $1 setmode <mode>' or '$0 $1 getmode'."
	esac

	return 0
}

do_mirroring ()
{
	case "$2" in
	setmode)
		case "$3" in
		0|1|2|3|4|5)
			echo $3 > /proc/probe/network/mirror_mode
			;;
		*)
			echo "Requested mode ('$3') is unknown. Acceptable values are: 0-5."
		esac
		;;
	getmode)
		cat /proc/probe/network/mirror_mode
		;;
	on)
		echo 1 > /proc/probe/network/mirroring
		;;
	off)
		echo 0 > /proc/probe/network/mirroring
		;;
	*)
		echo "Incorrect command '$2' specified. Use '$0 $1 setmode <mode>' or '$0 $1 getmode'."
	esac

	return 0
}

do_cpu_isolation ()
{
	case "$2" in
	on)
		echo 1 > /proc/probe/network/cpu_isolation
		;;
	off)
		echo 0 > /proc/probe/network/cpu_isolation
		;;
	*)
		echo "Incorrect command '$2' specified. Use '$0 $1 on' or '$0 $1 off'."
	esac

	return 0
}

do_port_isolation ()
{
	case "$2" in
	on)
		echo 1 > /proc/probe/network/port_isolation
		;;
	off)
		echo 0 > /proc/probe/network/port_isolation
		;;
	*)
		echo "Incorrect command '$2' specified. Use '$0 $1 on' or '$0 $1 off'."
	esac

	return 0
}

do_stop ()
{
	return
}

do_status ()
{
	echo "Sorry.. not yet implemented"
	exit 1
}

case "$1" in
	init)
		do_init
		;;
	led)
		do_led $1 $2 $3
		;;
	status)
		do_status
		;;
	netleds)
		do_netleds $1 $2 $3
		;;
	mirroring)
		do_mirroring $1 $2 $3
		;;
        cpu_isolation)
		do_cpu_isolation $1 $2 $3
		;;
        port_isolation)
		do_port_isolation $1 $2 $3
		;;
	*)
		# 'init' functionality is not advertized as it is for internal use on boot only
		echo "Usage: $0 {led|netleds|mirroring|cpu_isolation|port_isolation|status}"
		exit 1
esac

exit $?
