#!/bin/sh
# ============================================================================
# WANPIPE (tm) Initialization Script.
# ----------------------------------------------------------------------------
# Copyright (c) 1996, Sangoma Technologies Inc.  All rights reserved.
# ============================================================================
# Rev.#	Date		Who	Details
# -----	---------------	-------	----------------------------------------------
#  2.30	Oct.16,1996	GK	Uses meta-configuration file wanpipe.rc.
#  2.10	Jun.18,1996	GK	Performs complete startup/shutdown.
#  1.00	Apr.23,1996	GK	Initial version.
# ============================================================================

export PATH=/sbin:/bin:/usr/sbin:/usr/bin
export SDLACONF=/etc/sdla.conf
WANPIPE_RC=/etc/wanpipe.rc
SUBSYSTEM=wanpipe
DEVNAME=sdla
MODNAME=sdla

####### FUNCTION DEFINITIONS #################################################

# ----------------------------------------------------------------------------
# Check to see if a value belongs to the list.
# Return:	0 - yes
#		1 - no
# ----------------------------------------------------------------------------
check_list() {

	[ $# -lt 2 ] && return 1

	val=$1
	shift
	for i in $*
	do
		[ "$val" = "$i" ] && return 0
	done
	return 1
}

# ----------------------------------------------------------------------------
# Display error message.
# ----------------------------------------------------------------------------
error() {
	echo -e "\n$SUBSYSTEM: $*!"
	[ -f "$WANPIPE_LOG" ] && echo "$SUBSYSTEM: $*!" >> $WANPIPE_LOG
	return 0
}

# ----------------------------------------------------------------------------
# Configure SDLA hardware.
#	$1	device node
#	$2	card type
#	$3	I/O port
#	$4	memory address
#	$5	IRQ
#	$6	CPU clock
#	$7	Firmware to load
#	$8	Protocol module to bind
# ----------------------------------------------------------------------------
configure() {

  [ $# -lt 9 ] || return 1
  OPTIONS=
  echo -n "$1" >> $WANPIPE_LOG

  # Adapter type.
  if [ $2 != "-" ]
  then
    OPTIONS="$OPTIONS t=$2"
    echo -n -e "\t$2" >> $WANPIPE_LOG
  else echo -n -e "\tdefault" >> $WANPIPE_LOG
  fi

  # I/O port.
  if [ $3 != "-" ]
  then
    OPTIONS="$OPTIONS p=$3"
    echo -n -e "\t$3" >> $WANPIPE_LOG
  else echo -n -e "\tdefault" >> $WANPIPE_LOG
  fi

  # Memory address.
  if [ $4 != "-" ]
  then
    OPTIONS="$OPTIONS m=$4"
    echo -n -e "\t$4" >> $WANPIPE_LOG
  else echo -n -e "\tdefault" >> $WANPIPE_LOG
  fi

  # IRQ.
  if [ $5 != "-" ]
  then
    OPTIONS="$OPTIONS i=$5"
    echo -n -e "\t$5" >> $WANPIPE_LOG
  else echo -n -e "\tdefault" >> $WANPIPE_LOG
  fi

  # CPU clock.
  if [ $6 != "-" ]
  then
    OPTIONS="$OPTIONS z=$6"
    echo -n -e "\t$6" >> $WANPIPE_LOG
  else echo -n -e "\tdefault" >> $WANPIPE_LOG
  fi

  echo "" >> $WANPIPE_LOG
  sdlald -c $1 $OPTIONS 2>> $WANPIPE_LOG || return 1

  # Loading SDLA firmware.
  [ $7 = "-" ] && return 0

  [ -f "${SFMDIR}/$7" ] || {
    error "Firmware module ${SFMDIR}/$7 not found"
    return 1
  }
  sdlald $1 ${SFMDIR}/$7 2>> $WANPIPE_LOG || return 1

  # Binding to protocol-specific module.
  [ $8 = "-" ] && return 0

  lsmod | grep -wq $8 || {
    [ -f "${MODDIR}/$8.mod" ] || {
      error "Module ${MODDIR}/$8.mod not found"
      return 1
    }
    insmod ${MODDIR}/$8.mod || {
      error "Cannot load kernel module ${MODDIR}/$8.mod"
      return 1
    }
  }
  sdlald -b $1 $8 2>> $WANPIPE_LOG || return 1
  return 0
}

# ----------------------------------------------------------------------------
# Initialize SDLA cards.
# ----------------------------------------------------------------------------
sdla_up() {

  echo -e "\n`date`: initializing WANPIPE ..." >> $WANPIPE_LOG

  # See if module file is present.
  [ -f "$MODULE" ] || {
    error "$MODULE not found"
    return 1
  }

  # Load SDLA driver.
  lsmod | grep -wq $MODNAME || {
    insmod $MODULE >> $WANPIPE_LOG || {
      error "cannot load kernel module $MODULE"
      return 1
    }
  }

  # Process SDLA configuration file.
  MODULES=
  echo -e "Node name\tType\tPort\tMemory\tIRQ\tClock" >> $WANPIPE_LOG
  echo -e "---------\t----\t----\t------\t---\t-----" >> $WANPIPE_LOG
  while read NODE TYPE PORT MEM IRQ CLK SFM BIND rest
  do
    if [ -c /dev/$NODE ]
    then
      echo -n "/dev/$NODE "
      if configure /dev/$NODE $TYPE $PORT $MEM $IRQ $CLK $SFM $BIND
      then
        echo "O.k."
        [ "$BIND" != "-" ] && {
          check_list $BIND $MODULES || MODULES="$MODULES $BIND"
        }
      else echo "Failed!"
      fi
    fi
  done < $SDLACONF

  # Bring up protocol-specific subsytems.
  [ -d "$INITDIR" ] && {
    for i in $MODULES
    do [ -f "$INITDIR/$i" ] && $INITDIR/$i start
    done
  }

  # Bring up network interfaces.
  [ -f "$IFINIT" ] && $IFINIT start
}

# ----------------------------------------------------------------------------
# Shut down SDLA subsytem.
# ----------------------------------------------------------------------------
sdla_down() {

  echo -e "\n`date`: shutting down WANPIPE ..." >> $WANPIPE_LOG

  # Shut down network interfaces.
  [ -f "$IFINIT" ] && $IFINIT stop

  # Shut down protocol-specific subsytems.
  [ -d "$INITDIR" ] && {
    for i in $INITDIR/*; do $i stop; done
  }

  # Process SDLA configuration file.
  MODULES=
  while read NODE TYPE PORT MEM IRQ CLK SFM BIND rest
  do
    [ -c "/dev/$NODE" ] && {
      echo -e "Shutting down SDLA /dev/$NODE ..." >> $WANPIPE_LOG
      [ "$BIND" != "-" ] && {
        # Unbind SDLA from protocol module.
        sdlald -u /dev/$NODE 2>> $WANPIPE_LOG
        check_list $BIND $MODULES || MODULES="$MODULES $BIND"
      }
    }
  done < $SDLACONF

  # Unload protocol modules.
  for i in $MODULES
  do lsmod | grep -wq $i && {
    echo -e "Unloading module $i ..." >> $WANPIPE_LOG
    rmmod $i >> $WANPIPE_LOG
  }
  done

  # Unload SDLA driver.
  lsmod | grep -wq $MODNAME && {
    echo -e "Unloading SDLA driver ..." >> $WANPIPE_LOG
    rmmod $MODNAME >> $WANPIPE_LOG
  }
}

####### MAIN #################################################################
# set -x

# Ignore interrupt signals.
trap '' 2

# Read meta-configuration file.
[ -f $WANPIPE_RC ] || {
	error "Configuration file $WANPIPE_RC not found"
	exit 1
}
. $WANPIPE_RC

# Set default configuration.
export WANPIPE_VERSION=${WANPIPE_VERSION:=0.0.0}
export WANPIPE_HOME=${WANPIPE_HOME:=/usr/lib/wanpipe}
export WANPIPE_LOG=${WANPIPE_LOG:=/var/log/wanpipe}
export WANPIPE_LOCK=${WANPIPE_LOCK:=/var/lock/wanpipe}
export WANPIPE_BOOT=${WANPIPE_BOOT:=NO}
INITDIR="${WANPIPE_HOME}/init"
MODDIR="${WANPIPE_HOME}/mod"
SFMDIR="${WANPIPE_HOME}/sfm"
IFINIT="${WANPIPE_HOME}/ifinit"
MODULE="${WANPIPE_HOME}/mod/sdla.mod"

# Create log file.
[ -f $WANPIPE_LOG ] || {
	echo "Sangoma WANPIPE (tm) Log File created on `date`" > $WANPIPE_LOG
}

# See if SDLA configuration file is present.
[ -f $SDLACONF ] || {
	error "Configuration file $SDLACONF not found"
	exit 1
}

# See how we were called.
case "$1" in
	start)
		[ -f "$WANPIPE_LOCK" ] && {
			error "Lock file $WANPIPE_LOCK exists"
			exit 1
		}
		[ "$WANPIPE_BOOT" = "YES" ] && {
			echo "Initializing WANPIPE v$WANPIPE_VERSION ..."
			sdla_up && touch $WANPIPE_LOCK
		}
		;;
	stop)
		echo "Shutting down WANPIPE v$WANPIPE_VERSION ..."
	        sdla_down
		rm -f $WANPIPE_LOCK 2> /dev/null
		;;
	*)
		echo "WANPIPE v$WANPIPE_VERSION startup script"
		echo "Usage: $SUBSYSTEM {start|stop}"
		exit 1
esac
exit 0

