#!/bin/sh
# Copyright (c) 1996, 1997, 2000 SuSE Gmbh Nuernberg, Germany. All rights reserved.
#
# /etc/init.d/i4l_hardware
#
# (c) Klaus Franken, SuSE GmbH, Fuerth <kfr@suse.de>
#     Remo Behn, SuSE GmbH, Fuerth <sray@suse.de>
#     Karsten Keil, SuSE GmbH, Nuernberg <kkeil@suse.de>
#
# Version: 7.1 27.11.2000 (kkeil)
# Maintainer: kkeil@suse.de
#
#      04.12.98 include setup for Sedelbauer Speed Fax+
#               thanks  Marcus Niemann <niemann@www-bib.fh-bielefeld.de>
#      15.10.99 changes to support PCMCIA and direct driver
#               fix Dr. Neuhaus Niccy PnP
#               eaz mapping support
#      30.10.99 support AVM PCMCIA and fixes for AVM B1
#               workaround isdnlog and PCMCIA
#      12.02.00 new i4l rc.config layout activ cards now able to
#        be configured with yast
#      29.03.00 fixed debuglevel not set (BUG 2639)
#               fixed AVM B1 ISA load error (BUG 2640)
#      04.04.00 fixed I4L_HISAX_DOWNLOAD
#
#      27.11.00 new init script syntax
#
#      20010307 =OS= And again... the CAPI4Linux patch! :)
#
# For more informatione see:
#    /usr/share/doc/packages/i4l* (especially README.SuSE)
#    /usr/src/linux/Documentation/isdn/*
# 
### BEGIN INIT INFO
# Provides:       i4l_hardware
# Required-Start: 
# Required-Stop:
# Default-Start: 2 3 5
# Default-Stop:  0 1 6
# Description:    This script is loading the needed ISDN-modules
### END INIT INFO

. /etc/rc.status
. /etc/rc.config

# Determine the base and follow a runlevel link name.
base=${0##*/}
link=${base#*[SK][0-9][0-9]}

# Force execution if not called by a runlevel directory.
test $link = $base && I4L_START=yes
test "$I4L_START" = yes || exit 0

. /etc/rc.config.d/i4l_hardware.rc.config
test -e /etc/rc.config.d/i4l_unknown && . /etc/rc.config.d/i4l_unknown

SBIN=/usr/sbin
FIRMPATH=/usr/lib/isdn

rc_reset
case "$1" in
    start)
        echo "Loading ISDN drivers ..."
        test -z "$ISDNLOG_START" && ISDNLOG_START="yes" 
        USED_IDX=""
        HiSAX_IDX=""
        AVM_IDX=""
        EICON_IDX=""
        ICN_IDX=""
	LOAD_OK=""
        I=1
        if test -z $PCMCIA_I4L_TYPE ; then
            eval I4L_TYPE=\$I4L_TYPE_$I
        else
            I4L_TYPE=$PCMCIA_I4L_TYPE
        fi
        while test ! -z "$I4L_TYPE" ; do
            USED_IDX="$USED_IDX $I"
            eval I4L_IO=\$I4L_IO_$I
            eval I4L_IO0=\$I4L_IO0_$I
            eval I4L_IO1=\$I4L_IO1_$I
            eval I4L_IO2=\$I4L_IO2_$I
            eval I4L_IRQ=\$I4L_IRQ_$I
            eval I4L_MEMBASE=\$I4L_MEMBASE_$I
            eval I4L_PROTOCOL=\$I4L_PROTOCOL_$I
            eval I4L_ID=\$I4L_ID_$I
            if test $I4L_TYPE -lt 8000 ; then
                ########################################################
                # HiSax
                ########################################################
                if test -z "$HISAX_IDX" ; then 
                    HISAX_TYPE=""
                    HISAX_IO=""
                    HISAX_IO0=""
                    HISAX_IO1=""
                    HISAX_IRQ=""
                    HISAX_MEMBASE=""
                    HISAX_ID=""
                    HISAX_PROTOCOL=""
                    HISAX_DUMMY=""
                    HISAX_FIRM_IDX=""
                else
                    HISAX_TYPE="$HISAX_TYPE,"
                    HISAX_IO="$HISAX_IO,"
                    HISAX_IO0="$HISAX_IO0,"
                    HISAX_IO1="$HISAX_IO1,"
                    HISAX_IRQ="$HISAX_IRQ,"
                    HISAX_MEMBASE="$HISAX_MEMBASE,"
                    HISAX_PROTOCOL="$HISAX_PROTOCOL,"
                    if test ! -z "$I4L_ID" -a ! -z "$HISAX_ID" ; then
                        HISAX_ID="${HISAX_ID}%"
                    fi
                    HISAX_DUMMY="$HISAX_DUMMY,"
                fi
                HISAX_IDX="$HISAX_IDX $I"
                case "$I4L_TYPE" in
                    8)
                        # Teles 16.3 PCMCIA
                        I4L_IO=$PCMCIA_I4L_IO
                        I4L_IRQ=$PCMCIA_I4L_IRQ
                        ISDNLOG_START="no"
                        ;;
                    10)
                        # ELSA PCMCIA
                        I4L_TYPE="0"
                        ISDNLOG_START="no"
                        ;;
                    19)
                        # Compaq ISDN S0 ISA card
                        if test ! -z "$I4L_IO2" ; then
                            I4L_IO=$I4L_IO2
                        fi
                        ;;
                    22)
                        # Sedlbauer Speed Star (PCMCIA)
                        I4L_TYPE="0"
                        ISDNLOG_START="no"
                        ;;
                    26)
                        # AVM A1 PCMCIA
                        I4L_TYPE="0"
                        ISDNLOG_START="no"
                        ;;
                    28)
                        # Sedlbauer Speed Fax+
                        HISAX_FIRM_IDX="$HISAX_FIRM_IDX $I"
                        eval I4L_HISAX_DOWNLOAD_$I="$FIRMPATH/ISAR.BIN"
                        ;;
                    29)
                        # Siemens I-Surf
                        HISAX_FIRM_IDX="$HISAX_FIRM_IDX $I"
                        eval I4L_HISAX_DOWNLOAD_$I="$FIRMPATH/ISAR.BIN"
                        ;;
                    999)
                        # generic ISDN card used
                        # if HiSax is direct compiled into kernel
                        I4L_TYPE="0"
                        ;;
                    *)
                        ;;
                esac
                HISAX_TYPE=${HISAX_TYPE}$I4L_TYPE
                test -z "$I4L_IO" && I4L_IO="0"
                HISAX_IO=${HISAX_IO}$I4L_IO
                test -z "$I4L_IO0" && I4L_IO0="0"
                HISAX_IO0=${HISAX_IO0}$I4L_IO0
                test -z "$I4L_IO1" && I4L_IO1="0"
                HISAX_IO1=${HISAX_IO1}$I4L_IO1
                test -z "$I4L_IRQ" && I4L_IRQ="0"
                HISAX_IRQ=${HISAX_IRQ}$I4L_IRQ
                test -z "$I4L_MEMBASE" && I4L_MEMBASE="0"
                HISAX_MEMBASE=${HISAX_MEMBASE}$I4L_MEMBASE
                test -z "$I4L_PROTOCOL" && I4L_PROTOCOL="2"
                HISAX_PROTOCOL=${HISAX_PROTOCOL}$I4L_PROTOCOL
                HISAX_ID=${HISAX_ID}$I4L_ID
                HISAX_DUMMY=${HISAX_DUMMY}0
            fi
            if test $I4L_TYPE -eq 8001 ; then
                AVM_IDX="$AVM_IDX $I"
            fi
            if test $I4L_TYPE -eq 8010 ; then
                EICON_IDX="$EICON_IDX $I"
            fi
            if test $I4L_TYPE -eq 8030 ; then
                ICN_IDX="$ICN_IDX $I"
            fi
            I=`expr $I + 1`
            eval I4L_TYPE=\$I4L_TYPE_$I
        done
        if test ! -z "$HISAX_TYPE" -a "$HISAX_TYPE" != "$HISAX_DUMMY" ; then
            echo "Loading HiSax driver ..."
            # default values
            test -z "$I4L_HISAXDEBUG" && I4L_HISAXDEBUG="4"
            # Only one I4L_MODUL_OPTIONS is used, if set all other
            # variables are ignored 
            if test -z "$I4L_MODUL_OPTIONS_1"; then
                HISAX_PAR="type=$HISAX_TYPE"
                if test "$HISAX_IO" != "$HISAX_DUMMY" ; then
                    HISAX_PAR="$HISAX_PAR io=$HISAX_IO"
                fi
                if test "$HISAX_IO0" != "$HISAX_DUMMY" ; then
                    HISAX_PAR="$HISAX_PAR io0=$HISAX_IO0"
                fi
                if test "$HISAX_IO1" != "$HISAX_DUMMY" ; then
                    HISAX_PAR="$HISAX_PAR io1=$HISAX_IO1"
                fi
                if test "$HISAX_IRQ" != "$HISAX_DUMMY" ; then
                    HISAX_PAR="$HISAX_PAR irq=$HISAX_IRQ"
                fi
                if test "$HISAX_MEMBASE" != "$HISAX_DUMMY" ; then
                    HISAX_PAR="$HISAX_PAR mem=$HISAX_MEMBASE"
                fi
                if test "$HISAX_PROTOCOL" != "$HISAX_DUMMY" ; then
                    HISAX_PAR="$HISAX_PAR protocol=$HISAX_PROTOCOL"
                fi
                if test ! -z "$HISAX_ID" ; then
                    HISAX_PAR="$HISAX_PAR id=$HISAX_ID"
                fi
            else
                HISAX_PAR="$I4L_MODUL_OPTIONS_1"
            fi
            /sbin/modprobe -v hisax $HISAX_PAR
            if test $? -ne 0; then
                echo ""
                echo "Initialization of HiSax failed!"
                echo "Check /var/log/messages and /var/log/warn."
                echo "Check that the values in '/etc/rc.config.d/*' are correct:"
                echo "I4L_TYPE:          ${HISAX_TYPE}"
                echo "I4L_MEMBASE:       ${HISAX_MEMBASE}"
                echo "I4L_IRQ:           ${HISAX_IRQ}"
                echo "I4L_IO:            ${HISAX_IO}"
                echo "I4L_IO0:           ${HISAX_IO0}"
                echo "I4L_IO1:           ${HISAX_IO1}"
                echo "I4L_PROTOCOL:      ${HISAX_PROTOCOL}"
                echo "I4L_MODUL_OPTIONS: ${HISAX_MODUL_OPTIONS}"
                echo ""
                modprobe -r hisax
                exit 1
            else
                LOAD_OK="yes"
            fi
            # download firmware for Sedlbauer Speed Fax+
            if test ! -z "$HISAX_FIRM_IDX" ; then
                for I in $HISAX_FIRM_IDX; do
                    eval I4L_ID=\$I4L_ID_$I
                    eval I4L_HISAX_DOWNLOAD=\$I4L_HISAX_DOWNLOAD_$I
                done
                test -z "$I4L_HISAX_DOWNLOAD" || \
                    $SBIN/hisaxctrl ${I4L_ID} 9 ${I4L_HISAX_DOWNLOAD} 
            fi
        fi
        if test ! -z "$HISAX_IDX" ; then
            for I in $HISAX_IDX ; do
                eval I4L_ID=\$I4L_ID_$I
                eval I4L_HISAXDEBUG=\$I4L_HISAXDEBUG_$I
                test -z "$I4L_HISAXDEBUG" && I4L_HISAXDEBUG="0x4"
                test -z "$I4L_ID" || $SBIN/hisaxctrl ${I4L_ID} 1 $I4L_HISAXDEBUG
            done
        fi
        #########################################################
        # AVM-B1
        #########################################################
        if test ! -z "$AVM_IDX" ; then
		echo "Starting CAPI4Linux ..."
		capiinit start
		# To recover the original file "i4l_hardware", please take a look
		# into "i4l_hardware.old"!
        fi
        #########################################################
        # EICON
        #########################################################
        if test ! -z "$EICON_IDX"; then
            echo "Loading  EICON driver ..."
            for I in $EICON_IDX ; do
                eval I4L_SUBTYPE=\$I4L_SUBTYPE_$I
                eval I4L_IRQ=\$I4L_IRQ_$I
                eval I4L_MEMBASE=\$I4L_MEMBASE_$I
                eval I4L_ID=\$I4L_ID_$I
                eval I4L_PROTOCOL=\$I4L_PROTOCOL_$I
                # this version dont support isdnlog
                ISDNLOG_START="no" 
                if test $I4L_SUBTYPE -le 4 ; then
                    EICON_PAR="irq=$I4L_IRQ membase=$I4L_MEMBASE"
                fi
                /sbin/modprobe -v eicon $EICON_PAR id=$I4L_ID
                if test $? -ne 0; then
                    echo ""
                    echo "Initialization of the EICON-modul failed!"
                    echo "Check that the values in '/etc/rc.config.d/*' are correct:"
                    echo "  and see /usr/share/doc/packages/i4l/README.eicon"
                    echo "I4_ID:       ${I4L_ID}"
                    echo "I4L_IRQ:     ${I4L_IRQ}"
                    echo "I4L_MEMBASE: ${I4L_MEMBASE}"
                    echo ""
                    modprobe -r eicon
                    exit 1
                fi
                case "$I4L_PROTOCOL" in
                    1) EICON_FIRM="1tr6" ;;
                    2) EICON_FIRM="etsi" ;;
                    3) EICON_FIRM="etsi -p" ;;
                    4) EICON_FIRM="ni1" ;;
                    *) echo "ERROR: unknown ISDN-Protocoll: $I4L_PROTOCOLL" 
                    exit 1
                    ;;
                esac
                case "$I4L_SUBTYPE" in
                    0|1|2|3|5|6|7) EICON_OPT="" ;;
                    4|8) EICON_OPT="-s2 -n" ;;
                    *);;
                esac
                echo "Loading EICON firmware ..."
                $SBIN/eiconctrl load $EICON_FIRM $EICON_OPT 
                if test $? -ne 0; then
                    echo "" 
                    echo "Loading of Firmware $EICON_FIRM  $EICON_OPTfailed!" 
                    echo "Check that the values in '/etc/rc.config.d/*' are correct:"
                    echo "  and see /usr/share/doc/packages/i4l/README.eicon"
                    echo "I4L_ID:      ${I4L_ID}"
                    echo "I4L_IRQ:     ${I4L_IRQ}"
                    echo "I4L_MEMBASE: ${I4L_MEMBASE}"
                    echo ""
                    modprobe -r eicon
                    exit 1
                else
                    LOAD_OK="yes"
                fi
                if test "$ISDNLOG_START" = "yes"; then 
                    $SBIN/eiconctrl isdnlog on
                fi
            done
        fi
        #########################################################
        # ICN
        #########################################################
        if test ! -z "$ICN_IDX"; then
            echo "Loading ICN driver ..."
            for I in $ICN_IDX ; do
                eval I4L_SUBTYPE=\$I4L_SUBTYPE_$I
                eval I4L_IO=\$I4L_IO_$I
                eval I4L_MEMBASE=\$I4L_MEMBASE_$I
                eval I4L_ID=\$I4L_ID_$I
                eval I4L_PROTOCOL=\$I4L_PROTOCOL_$I
                ISDNLOG_START="no" 
                ICN_PAR="portbase=$I4L_IO membase=$I4L_MEMBASE icn_id=$I4L_ID"
                if test $I4L_SUBTYPE -eq 1 ; then
                    ICN_PAR="$ICN_PAR icn_id2=${I4L_ID}2"
                fi
                /sbin/modprobe -v icn $ICN_PAR
                if test $? -ne 0; then
                    echo ""
                    echo "Initialization of the ICN-modul failed!"
                    echo "Check that the values in '/etc/rc.config.d/*' are correct:"
                    echo "  and see /usr/share/doc/packages/i4l/README.icn"
                    echo "I4L_ICN_ID:      ${I4L_ID}"
                    echo "I4L_ICN_PORT:    ${I4L_IO}"
                    echo "I4L_ICN_MEMBASE: ${I4L_MEMBASE}"
                    echo ""
                    modprobe -r icn
                    exit 1
                fi
                case "$I4L_PROTOCOL" in
                    1) ICN_FIRM="$FIRMPATH/pc_1t_ca.bin" ;;
                    2) ICN_FIRM="$FIRMPATH/pc_eu_ca.bin" ;;
                    *) echo "ERROR: unknown ISDN-Protocoll: $I4L_PROTOCOLL" 
                    exit 1
                    ;;
                esac
                if test $I4L_SUBTYPE -eq 1 ; then
                    case "$I4L_PROTOCOL" in
                        1) ICN_FIRM2="$FIRMPATH/pc_1t_ca.bin" ;;
                        2) ICN_FIRM2="$FIRMPATH/pc_eu_ca.bin" ;;
                    esac
                fi
                echo "Loading ICN firmware ..."
                ICN_FIRM="$FIRMPATH/loadpg.bin $ICN_FIRM $ICN_FIRM2"
                $SBIN/icnctrl load $ICN_FIRM
                rc_status -v
                if test $? -ne 0; then
                    echo "" 
                    echo "Loading of Firmware $ICN_FIRM failed!" 
                    echo "Check that the values in '/etc/rc.config.d/*' are correct:"
                    echo "  and see /usr/share/doc/packages/i4l/README.icn"
                    echo "I4L_ICN_ID:      ${I4L_ID}"
                    echo "I4L_ICN_PORT:    ${I4L_IO}"
                    echo "I4L_ICN_MEMBASE: ${I4L_MEMBASE}"
                    echo ""
                    modprobe -r icn
                else
                    LOAD_OK="yes"
                fi
            done
        fi
        if test "$LOAD_OK" = "yes"; then
            # start iprofd not longer recomented
            #
            test "$I4L_IPROFD" = "yes" && ($SBIN/iprofd /etc/isdn/modemsettings &)
            # start isdnlog
            if test "$ISDNLOG_START" = "yes"; then 
                for optionfile in /etc/isdn/isdnlog.*.options; do
                    if test -f $optionfile; then
                        device=${optionfile#*.}
                        device=${device%.*}
                        echo "Starting isdnlog with $optionfile for $device..."
                        $SBIN/isdnlog -f $optionfile /dev/$device
                    else
                        echo "Starting isdnlog with defaults for /dev/isdnctrl0..."
                        $SBIN/isdnlog -D -l1015 -x4087 -M -n -W80 /dev/isdnctrl0 &
                    fi
                done
            fi
            for I in $USED_IDX ; do
                #
                # eaz mapping
                #
                eval I4L_EAZMAP=\$I4L_EAZMAP_$I
                eval I4L_ID=\$I4L_ID_$I
                test -z "$I4L_EAZMAP" || test -z "$I4L_ID" || \
                $SBIN/isdnctrl mapping "$I4L_ID" $I4L_EAZMAP
            done
        fi
        ;;
    stop)
        # kill iprofd
        test "$I4L_IPROFD" = "yes" && killall iprofd
        # kill isdnlog
        for pidfile in /var/run/isdnlog.*.pid; do
            test -r $pidfile || continue
            /bin/kill `cat $pidfile`
            rm -f $pidfile
        done
        echo "Unloading ISDN drivers ..."
        # unload modules
        I=1
        AC=1
        eval I4L_TYPE=\$I4L_TYPE_$I
        while test ! -z "$I4L_TYPE" ; do
            if test $I4L_TYPE -lt 8000 ; then
            ########################################################
            # HiSax
            ########################################################
                if test $I4L_TYPE -ne 999 ; then
                    HISAX_IDX="$HISAX_IDX $I"
                fi
            fi
            if test $I4L_TYPE -eq 8001 ; then
                AVM_IDX="$AVM_IDX $I"
                AVM_CONTR="$AVM_CONTR $AC"
                AC=`expr $AC + 1`
            fi
            if test $I4L_TYPE -eq 8010 ; then
                EICON_IDX="$EICON_IDX $I"
            fi
            if test $I4L_TYPE -eq 8030 ; then
                ICN_IDX="$ICN_IDX $I"
            fi
            I=`expr $I + 1`
            eval I4L_TYPE=\$I4L_TYPE_$I
        done
        if test ! -z "$HISAX_IDX"; then
            /sbin/modprobe -r hisax
        fi
        if test ! -z "$EICON_IDX"; then
            /sbin/modprobe -r eicon
        fi
        if test ! -z "$ICN_IDX"; then
            /sbin/modprobe -r icn 
        fi
        if test ! -z "$AVM_IDX" ; then
		echo "Stopping CAPI4Linux ..."
		capiinit stop
        fi
        /sbin/modprobe -r slhc
        ;;
    restart)
        ## If first returns OK call the second, if first or
        ## second command fails, set echo return value.
        $0 stop  &&  $0 start
        # Remember status and be quiet
        rc_status
        ;;
    reload)
        $0 stop  &&  $0 start
        # Remember status and be verbose
        #rc_status -v
        ;;
    status)
        echo -n "Checking for service i4l_hardware: "
        grep -q ttyI /proc/devices && echo OK || echo No isdn driver
        ;;
    probe)
        ## Optional: Probe for the necessity of a reload,
        ## give out the argument which is required for a reload.
        test /etc/rc.config.d/i4l_hardware.rc.config -nt \
            /var/run/isdnlog.isdnctrl0.pid && echo reload
        ;;
    *)
        echo "Usage: $0 {start|stop|status|restart|reload[|probe]}"
        exit 1
        ;;
esac
rc_exit
