#!/bin/sh
# Copyright (c) 1996, 1997 SuSE Gmbh Fuerth, Germany.  All rights reserved.
#
# /sbin/init.d/i4l_hardware
#
# (c) Klaus Franken, SuSE GmbH, Fuerth <kfr@suse.de>
#     Remo Behn, SuSE GmbH, Fuerth <sray@suse.de>
#
# Version: 6.3 15.10.99 (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
#
# For more informatione see:
#    /usr/doc/packages/i4l* (especially README.SuSE)
#    /usr/src/linux/Documentation/isdn/*
# 
# This script is loading the needed ISDN-modules
# The net-confguration is done by /sbin/init.d/i4l


. /etc/rc.config.d/i4l_default.rc.config

test "$I4L_START" = yes || exit 0

. /etc/rc.config
. /etc/rc.config.d/i4l_b1.rc.config
. /etc/rc.config.d/i4l_hisax.rc.config
. /etc/rc.config.d/i4l_icn.rc.config
. /etc/rc.config.d/i4l_option.rc.config
. /etc/rc.config.d/i4l_sp_option.rc.config
. /etc/rc.config.d/i4l_unknown


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

case "$1" in
start)
    echo "Loading ISDN drivers ..."

    #########################################################
    # HiSax
    #########################################################
    if test ! -z "$I4L_TYPE"; then
        echo "Loading HiSax driver ..."

        # default values
	test -z "$I4L_HISAXDEBUG" && I4L_HISAXDEBUG="4"
	test -z "$I4L_ID" && I4L_ID="HiSax"
	test -z "$ISDNLOG_START" && ISDNLOG_START="yes" 
	HISAX_START="yes"

        if test -z "$I4L_MODUL_OPTIONS"; then
                HISAX_PAR1="id=$I4L_ID type=$I4L_TYPE protocol=$I4L_PROTOCOL"
           case "$I4L_TYPE" in
            1)
                # Teles 16.0
                HISAX_PAR2="irq=$I4L_IRQ mem=$I4L_MEMBASE io=$I4L_PORT"
                ;;
            2)
                # Teles 8.0
                HISAX_PAR2="irq=$I4L_IRQ mem=$I4L_MEMBASE"
                ;;
            3)
                # Teles 16.3
                HISAX_PAR2="irq=$I4L_IRQ io=$I4L_PORT"
                ;;
            4)
                # Creatix/Teles PnP
                HISAX_PAR2="irq=$I4L_IRQ io0=$I4L_IO0 io1=$I4L_IO1"
                ;;
            5)
                # AVM A1 (Fritz)
                HISAX_PAR2="irq=$I4L_IRQ io=$I4L_PORT"
                ;;
            6)
                # ELSA PCC/PCF
                if test -z "$I4L_PORT"; then
                    # Autoprobing
                    HISAX_PAR2=""
                else
                    HISAX_PAR2="io=$I4L_PORT"
                fi
                ;;
            7)
                # ELSA Quickstep 1000 (PnP)
                HISAX_PAR2="irq=$I4L_IRQ io=$I4L_PORT"
                ;;
            8)
                # Teles 16.3 PCMCIA
                HISAX_PAR2="irq=$I4L_IRQ io=$I4L_PORT"
		HISAX_START="no"
		ISDNLOG_START="no"
                ;;
            9)
                # ITK ix1-micro Rev.2
                HISAX_PAR2="irq=$I4L_IRQ io=$I4L_PORT"
                ;;
            10)
                # ELSA PCMCIA
                HISAX_PAR2="irq=$I4L_IRQ io=$I4L_PORT"
		HISAX_START="no"
  		ISDNLOG_START="no"
              ;;
            11)
                # Eicon.Diehl Diva ISA PnP / Eicon.Diehl Diva PCI
                if test -z "$I4L_PORT"; then
                    # PCI
                    HISAX_PAR2=""
                else
                    HISAX_PAR2="irq=$I4L_IRQ io=$I4L_PORT"
                fi
                ;;
            12)
                # ASUS COM ISDNLink PnP
                HISAX_PAR2="irq=$I4L_IRQ io=$I4L_PORT"
                ;;
            13)
                # HFC-2BS0 based cards
                HISAX_PAR2="irq=$I4L_IRQ io=$I4L_PORT"
                ;;
            14)
                # Teles 16.3c
                HISAX_PAR2="irq=$I4L_IRQ io=$I4L_PORT"
                ;;
            15)
                # Sedlbauer Speed Card and Sedlbauer PC/104
                HISAX_PAR2="irq=$I4L_IRQ io=$I4L_PORT"
                ;;
            16)
                # USR Sportster internal
                HISAX_PAR2="irq=$I4L_IRQ io=$I4L_PORT"
                ;;
            17)
                # MIC card
                HISAX_PAR2="irq=$I4L_IRQ io=$I4L_PORT"
                ;;
            18)
                # ELSA Quickstep 1000PCI
                HISAX_PAR2=""
                ;;
            19)
                # Compaq ISDN S0 ISA card
                HISAX_PAR2="irq=$I4L_IRQ io=$I4L_PORT io0=$I4L_IO0 io1=$I4L_IO1"
                ;;
            20)
                # NET jet PCI
                HISAX_PAR2=""
                ;;
            21)
                # Teles PCI
                HISAX_PAR2=""
		;;
            22)
                # Sedlbauer Speed Star (PCMCIA)
                HISAX_PAR2="irq=$I4L_IRQ io=$I4L_PORT"
		HISAX_START="no"
		ISDNLOG_START="no"
                ;;
            23) # reserved AMD
		HISAX_START="no"
                ;;
            24)
                # Dr. Neuhaus Niccy PnP/PCI
		if test -z "$I4L_PORT"; then
			# PCI
			HISAX_PAR2=""
		else
			# PnP
	                HISAX_PAR2="irq=$I4L_IRQ io0=$I4L_IO0 io1=$I4L_IO1"
		fi
		;;
            25)
                # Teles S0Box
                HISAX_PAR2="irq=$I4L_IRQ io=$I4L_PORT"
                ;;
            26)
                # AVM A1 PCMCIA
		HISAX_START="no"
		ISDNLOG_START="no"
                ;;
            27)
		# Fritz PCI/PnP
		if test -z "$I4L_PORT"; then
			# PCI
			HISAX_PAR2=""
		else
			# PnP
			HISAX_PAR2="irq=$I4L_IRQ io=$I4L_PORT"
		fi
		;;
            28)
    		# Sedlbauer Speed Fax+
    		HISAX_PAR2="irq=$I4L_IRQ io=$I4L_PORT"
		I4L_HISAX_DOWNLOAD="$FIRMPATH/ISAR.BIN"
    		;;
            29)
		# Siemens I-Surf
		HISAX_PAR2="irq=$I4L_IRQ io=$I4L_PORT mem=$I4L_MEMBASE"
		I4L_HISAX_DOWNLOAD="$FIRMPATH/ISAR.BIN"
		;;
            30)
		# ACER P10
		HISAX_PAR2="irq=$I4L_IRQ io=$I4L_PORT"
		;;
            31)
		# HST Saphir
		HISAX_PAR2="irq=$I4L_IRQ io=$I4L_PORT"
		;;
            32)
		# Telekom A4T
		HISAX_PAR2=""
		;;
            33)
		# Scitel Quadro
		HISAX_PAR2="io=$I4L_PORT"
		;;
            34)
		# Gazel ISDN cards
		if test -z "$I4L_PORT"; then
			# PCI
			HISAX_PAR2=""
		else
			# PnP
			HISAX_PAR2="irq=$I4L_IRQ io=$I4L_PORT"
		fi
		;;
            35)
		# HFC 2BDS0 PCI
		HISAX_PAR2=""
		;;
            36)
		# Winbond PCI
		HISAX_PAR2=""
		;;
            999)
		# generic ISDN card, used for PCMCIA or 
		# if HiSax is direct compiled into kernel
		HISAX_START="no"
		;;
            *)
                echo "$0: unknown I4L_TYPE: $I4L_TYPE"
                echo "$0: exiting!"
                exit 1
                ;;
            esac
	    HISAX_PAR="${HISAX_PAR1} ${HISAX_PAR2}"
        else
            HISAX_PAR="$I4L_MODUL_OPTIONS"
        fi
	if test "$HISAX_START" = "yes"; then
		/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:          ${I4L_TYPE}"
	            echo "I4L_MEMBASE:       ${I4L_MEMBASE}"
	            echo "I4L_IRQ:           ${I4L_IRQ}"
	            echo "I4L_PORT:          ${I4L_PORT}"
	            echo "I4L_IO0:           ${I4L_IO0}"
	            echo "I4L_IO1:           ${I4L_IO1}"
	            echo "I4L_PROTOCOL:      ${I4L_PROTOCOL}"
	            echo "I4L_MODUL_OPTIONS: ${I4L_MODUL_OPTIONS}"
	            echo ""
	            modprobe -r hisax
	            exit 1
	        fi

		test -z "$I4L_LEASED" || 
		    $SBIN/hisaxctrl ${I4L_ID} 5 0

		# download firmware for Sedlbauer Speed Fax+
		test -z "$I4L_HISAX_DOWNLOAD" || 
	               $SBIN/hisaxctrl ${I4L_ID} 9 ${I4L_HISAX_DOWNLOAD} 

	fi
	# enable debugging
	test -z "$I4L_ID" || 
	    $SBIN/hisaxctrl ${I4L_ID} 1 $I4L_HISAXDEBUG

	test -z "$I4L_VERBOSE" || 
	    $SBIN/isdnctrl verbose 3

	#
	# eaz mapping
	#
	if test -n "$I4L_MAP_ID"; then
		for ID in $I4L_MAP_ID; do
			eval I4L_EAZMAP=\$I4L_EAZMAP_$ID
			test -z "$I4L_EAZMAP" ||
			    $SBIN/isdnctrl mapping $ID $I4L_EAZMAP
			# set debuging to all ids
			$SBIN/hisaxctrl $ID 1 $I4L_HISAXDEBUG
	        done
	fi

    fi

    #########################################################
    # ICN
    #########################################################
    if test ! -z "$I4l_ICN_PORT"; then
        echo "Loading ICN driver ..."
	test -z "$ISDNLOG_START" && ISDNLOG_START="no" 
        ICN_PAR="portbase=$I4l_ICN_PORT membase=$I4l_ICN_MEMBASE \
        icn_id=$I4l_ICN_ID"
        test -z "$I4l_ICN_ID2" ||
            ICN_PAR="$ICN_PAR icn_id2=$I4l_ICN_ID2"
        /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/doc/packages/i4l/kernel/README.icn"
            echo "I4L_ICN_ID:      ${I4L_ICN_ID}"
            echo "I4L_ICN_ID2:     ${I4L_ICN_ID2}"
            echo "I4L_ICN_PORT:    ${I4L_ICN_PORT}"
            echo "I4L_ICN_MEMBASE: ${I4L_ICN_MEMBASE}"
            echo ""
            modprobe -r icn
            exit 1
        fi
	case "$I4L_ICN_PROTOCOLL" in
	1) ICN_FIRM="$FIRMPATH/pc_1t_ca.bin" ;;
	2) ICN_FIRM="$FIRMPATH/pc_eu_ca.bin" ;;
	*) echo "ERROR: unknown ISDN-Protocoll: $I4L_ICN_PROTOCOLL" 
	    exit 1
	    ;;
	esac
	case "$I4L_ICN_PROTOCOLL2" in
	1) ICN_FIRM2="$FIRMPATH/pc_1t_ca.bin" ;;
	2) ICN_FIRM2="$FIRMPATH/pc_eu_ca.bin" ;;
        "") ;;
	*) echo "ERROR: unknown ISDN-Protocoll: $I4L_ICN_PROTOCOLL" 
	    exit 1
	    ;;
	esac
        echo "Loading ICN firmware ..."
        ICN_FIRM="$FIRMPATH/loadpg.bin $ICN_FIRM $ICN_FIRM2"
        $SBIN/icnctrl load $ICN_FIRM 
        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/doc/packages/i4l/kernel/README.icn"
            echo "I4L_ICN_ID:         ${I4L_ICN_ID}"
            echo "I4L_ICN_ID2:        ${I4L_ICN_ID2}"
            echo "I4L_ICN_PORT:       ${I4L_ICN_PORT}"
            echo "I4L_ICN_MEMBASE:    ${I4L_ICN_MEMBASE}"
            echo "I4L_ICN_PROTOCOLL:  ${I4L_ICN_PROTOCOLL}"
            echo "I4L_ICN_PROTOCOLL2: ${I4L_ICN_PROTOCOLL}"
            echo ""
            modprobe -r icn
            exit 1
        fi
    fi

    #########################################################
    # AVM-B1
    #########################################################
    if test "$I4L_USE_B1" = "yes" ; then

	capiinit start

#       if test "$I4L_USE_B1_AS_MODULE" = "yes" ; then
#	    if test "$I4L_USE_B1_PCMCIA" = "yes" ; then
#		if test "$PWD" != "/etc/pcmcia"; then
#		    echo "AVM-B1 PCMCIA driver not loaded now"
#		    exit 0
#		fi
#	    fi
#           echo "Loading AVM-B1 driver ..."
#	    test -z "$ISDNLOG_START" && ISDNLOG_START="yes"
#	    modprobe -v kernelcapi
#           if test $? -ne 0; then
#                echo "Initialization of the AVM-B1-CAPI2.0-modul failed!" 
#                exit 1
#           fi
#            modprobe -v capi
#            if test $? -ne 0; then
#                echo "Initialization of the AVM-B1-CAPI2.0-Interface failed!" 
#                modprobe -r kernelcapi
#                exit 1
#            fi
#            modprobe -v capidrv
#            if test $? -ne 0; then
#                echo "Initialization of the AVM-B1-I4L-Interface failed!" 
#                modprobe -r capi
#                exit 1
#            fi
#            if test "$I4L_USE_B1_PCI" = "yes" ; then
#                modprobe -v b1pci
#                if test $? -ne 0; then
#                    echo "Initialization of the AVM-B1-PCI-module failed!" 
#                    exit 1
#                fi
#	    else
#		if test "$I4L_USE_B1_PCMCIA" = "yes" ; then
#		    echo "AVM-B1 PCMCIA driver "
#                    modprobe -v isdn
#		    I4L_B1_IRQ_1=""
#		    I4L_B1_IO_1=""
#		    ISDNLOG_START="no"
#		    echo wd:$PWD
#		# If it isn't a AVM B1 PCI/PCMCIA-Card, then load the ISA-Card
#		# driver. 
#		# But, who the heck is nowadays useing ISA-Bus-Cards ??? ;-)
#		else
#		    modprobe -v b1isa
#		    if test $? -ne 0; then
#			echo "Initialization of the AVM-B1-ISA-module failed!"
#			exit 1
#        	    fi
#		fi
#            fi
#        fi
#        for CONTR in 1 2 3 4 ; do
#            eval IRQ=\$I4L_B1_IRQ_$CONTR
#            eval IO=\$I4L_B1_IO_$CONTR
#            eval PROTO=\$I4L_B1_PROTOCOLL_$CONTR
#            if test ! -z "$IRQ" -a ! -z "$IO" ; then
#                echo "Adding AVM-B1 Controller $CONTR (IO: $IO, IRQ: $IRQ)..." 
#                avmcapictrl add $IO $IRQ
# 	        if test $? -ne 0; then
#                    echo ""
#                    echo "Adding AVM-B1-Controller $CONTR failed!" 
#                    echo ""
#                    exit 1
#                fi
#            fi
#            if test -z $PROTO ; then
#                continue;
#            fi
#            case "$PROTO" in
#            1) B1_FIRM="$FIRMPATH/b1-1tr6.t4" ;;
#            2) B1_FIRM="$FIRMPATH/b1.t4" ;;
#            *) echo "ERROR: unknown ISDN-Protocoll: $PROTO" 
#                exit 1
#                ;;
#            esac
#            echo "Loading AVM-B1 firmware to Controller $CONTR ..."
#            $SBIN/avmcapictrl load $B1_FIRM $CONTR 
#            if test $? -ne 0; then
#                echo ""
#                echo "Loading of Firmware $B1_FIRM on Controller $CONTR failed!" 
#                echo ""
#                exit 1
#            fi
#        done

    fi
    # start iprofd
    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
    ;;

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
    if test -n "$I4L_TYPE"; then
        test "$I4L_TYPE" = "999" || /sbin/modprobe -r hisax
    fi
    if test ! -z "$I4l_ICN_PORT"; then
        /sbin/modprobe -r icn 
    fi
    if test "$I4L_USE_B1" = "yes" ; then

	capiinit stop

#        for CONTR in 1 2 3 4 ; do
#            eval PROTO=\$I4L_B1_PROTOCOLL_$CONTR
#            if test -z $PROTO ; then
#                continue;
#            fi
#	    /sbin/avmcapictrl reset $CONTR
#	    /sbin/avmcapictrl remove $CONTR
#	done
#        if test "$I4L_USE_B1_PCI" = "yes" ; then
#	    modprobe -r b1pci
#	else
#	    if test "$I4L_USE_B1_PCMCIA" = "yes" ; then
#		modprobe -r avm_cs b1pcmcia
#	    else
#		modprobe -r b1isa
#	    fi
#	fi
#        /sbin/modprobe -r capidrv capi kernelcapi capiutil
    fi
    /sbin/modprobe -r slhc
    ;;
*)
    echo "Usage: $0 {start|stop}"
    exit 1
    ;;
esac

exit 0

