#
# set -x
# Globals
#
PATH=/bin:/usr/bin:/etc:/etc/conf/bin
tmp=/tmp/tcp$$
ROOT=
CONF=${ROOT}/usr/sys/conf
DEVDIR=${ROOT}/dev
ETC=${ROOT}/etc
TCP_CONF=${ROOT}/usr/lib/tcprt
TCP_IF=${TCP_CONF}/if.conf
TCPPERM=${ETC}/perms/tcprt                      # permlist of this product
INET=${ROOT}/usr/sys/inet

# function definitions
#
# usage: safemv file1 file2
# move file1 to file2 without chance of interruption
safemv() {
        trap "" 1 2 3 15
        mv $1 $2
        trap 1 2 3 15
}

# usage: safecopy file1 file2
# copies file1 to file2 without chance of interruption
safecopy() {
        trap "" 1 2 3 15
        cp $1 $2
        trap 1 2 3 15
}


# Prompt for yes or no answer with message passed as argument -
# returns non-zero for no
getyn() {
        while   echo "\n$* (y/n/q) \c">&2
        do      read yn rest
                case $yn in
                        [yY]) return 0                          ;;
                        [nN]|[qQ]) return 1                     ;;
                *)      echo "Please answer y,n or q" >&2       ;;
                esac
        done
}

# print a prompt
#
p() {
        set -f
        /bin/echo $*
        set +f
        return $?
}

# Remove temp files and exit with the status passed as argument
cleanup() {
        trap '' 1 2 3 15
        [ "$tmp" ] && rm -f $tmp*
        exit $1
}



# Re-link new kernel
relink() {
    cd /etc/conf/bin
    if [ -z "$_NOPROMPT" ] ; then
        echo "\nRe-linking the kernel ... \c" >&2
    fi
    ./idbuild -B
    return 0
}

addhex() {
echo "$1 $2" | nawk ' {
        printf("%x", atoh($1) + atoh($2));
    }
    function atoh(number) {
        i = 0
        j = length(number)
        result = 0
        while ( i < j ) {
            result = result + (hexval(substr(number,j - i,1)) * (16 ^ i))
            i = i + 1
        }
        return result
    }
    function hexval(letter) {
        if (letter == "a") return 10 + 0
        if (letter == "b") return 11 + 0
        if (letter == "c") return 12 + 0
        if (letter == "d") return 13 + 0
        if (letter == "e") return 14 + 0
        if (letter == "f") return 15 + 0
        return (letter + 0)
    }'
}


#
# system_d65e()
#
system_d65e() {

bd=$1

case $bd in
0) IRQ=5; BIO=300; EIO=31f; BRAM=d0000; ERAM=d3fff; SLOT=0; MEDIA=2;;
1) IRQ=3; BIO=320; EIO=33f; BRAM=d8000; ERAM=dbfff; SLOT=1; MEDIA=2;;
2) IRQ=4; BIO=340; EIO=35f; BRAM=c0000; ERAM=c3fff; SLOT=1; MEDIA=2;;
3) IRQ=10; BIO=360; EIO=37f; BRAM=c8000; ERAM=cbfff; SLOT=1; MEDIA=2;;
esac

while   p "Interrupt vector number [${IRQ}]: \c "
do      read vect
        case "$vect" in
        "")     vect=$IRQ; break;;
        2)      vect=9; break;;
        [0-9]*) break;;
        *)      p "Vector number must be decimal digits.";;
        esac
done

case "$bd" in
0)      vect0=$vect;;
1)      vect1=$vect;;
2)      vect2=$vect;;
3)      vect3=$vect;;
esac

while   p "IO base address (in hexadecimal) [${BIO}] : \c"
do      read ioaddr
        case    "$ioaddr" in
        "")     ioaddr=$BIO; ioend=$EIO; break;;
        300)    ioaddr=300; ioend=31f; break;;
        320)    ioaddr=320; ioend=33f; break;;
        340)    ioaddr=340; ioend=35f; break;;
        360)    ioaddr=360; ioend=37f; break;;
        *)      p "Address must be 300/320/340/360";;
        esac
done

case "$bd" in
0)      ioaddr0=$ioaddr; ioend0=$ioend;;
1)      ioaddr1=$ioaddr; ioend1=$ioend;;
2)      ioaddr2=$ioaddr; ioend2=$ioend;;
3)      ioaddr3=$ioaddr; ioend3=$ioend;;
esac

while   p "RAM base address (in hexadecimal) [${BRAM}] : \c"
do      read maddr
        case    "$maddr" in
        "")             maddr=$BRAM; mend=$ERAM; break;;
        c0000|C0000)    maddr=c0000; mend=c3fff; break;;
        c2000|C2000)    maddr=c2000; mend=c5fff; break;;
        c4000|C4000)    maddr=c4000; mend=c7fff; break;;
        c6000|C6000)    maddr=c6000; mend=c9fff; break;;
        c8000|C8000)    maddr=c8000; mend=cbfff; break;;
        ca000|CA000)    maddr=ca000; mend=cdfff; break;;
        cc000|CC000)    maddr=cc000; mend=cffff; break;;
        ce000|CE000)    maddr=ce000; mend=d1fff; break;;
        d0000|D0000)    maddr=d0000; mend=d3fff; break;;
        d2000|D2000)    maddr=d2000; mend=d5fff; break;;
        d4000|D4000)    maddr=d4000; mend=d7fff; break;;
        d6000|D6000)    maddr=d6000; mend=d9fff; break;;
        d8000|D8000)    maddr=d8000; mend=dbfff; break;;
        da000|DA000)    maddr=db000; mend=ddfff; break;;
        dc000|DC000)    maddr=dc000; mend=dffff; break;;
        de000|DE000)    maddr=de000; mend=e1fff; break;;
        e0000|E0000)    maddr=e0000; mend=e3fff; break;;
        e2000|E2000)    maddr=e2000; mend=e5fff; break;;
        e4000|E4000)    maddr=e4000; mend=e7fff; break;;
        e6000|E6000)    maddr=e6000; mend=e9fff; break;;
        e8000|E8000)    maddr=e8000; mend=ebfff; break;;
        ea000|EA000)    maddr=ea000; mend=edfff; break;;
        ec000|EC000)    maddr=ec000; mend=effff; break;;
        *)              p "RAM address must be between C000..EC000 (step 2000)";;
        esac
done

case "$bd" in
0)      maddr0=$maddr; mend0=$mend;;
1)      maddr1=$maddr; mend1=$mend;;
2)      maddr2=$maddr; mend2=$mend;;
3)      maddr3=$maddr; mend3=$mend;;
esac


while   p "PCMCIA slot number [${SLOT}] : \c"
do      read slot
        case "$slot" in
        "")     slot=$SLOT; break;;
        0)      slot=0; break;;
        1)      slot=1; break;;
        *)      p "PCMCIA slot number must be decimal digits";;
        esac
done

case $bd in
0)      slot0=$slot;;
1)      slot1=$slot;;
2)      slot2=$slot;;
3)      slot3=$slot;;
esac

echo ""
echo "Please choose the media mode that you want ...................."
echo ""
echo "  0. Twisted pair connection."
echo "  1. BNC connection."
echo "  2. Automatic detection between TP BNC and AUI."
echo "  3. Use default setting."
echo ""
while   p " Enter number of media selection [${MEDIA}]: \c"
do      read media
        case $media in
        "")     media=$MEDIA; break;;
        0)      media=0; break;;
        1)      media=1; break;;
        2)      media=2; break;;
        3)      media=3; break;;
        *)      p " Please input 0..3 to select.";;
        esac
done

case "$media" in
0)      media="MEDIA_UTP";
        echo " Media mode : Twisted pair connection. ";
        ;;
1)      media="MEDIA_BNC";
        echo " Media mode : BNC.";
        ;;
2)      media="MEDIA_AUTO";
        echo " Media mode : Automatic detect between UTP and BNC. ";
        ;;
3)      media="MEDIA_DEFAULT";
        echo " Media mode : Use default setting. ";
        ;;
esac

case "$bd" in
0)      media0=$media;;
1)      media1=$media;;
2)      media2=$media;;
3)      media3=$media;;
esac

NMINORS="1"
}

# main()

cd /
tput clear

# Add drivers via configure
#

while   echo "Do you wish to install or delete the network driver (i/d/q) \c"
do      read ANSWER
        case $ANSWER in
        I|i)
                break
                ;;
        D|d)
                cd /etc/conf/bin
                idinstall -d -e d65e
                /etc/confnet.d/configure -r -p inet -d d65e_0 -d d65e_1 -d d65e_2 -d d65e_3
                cd /
                # Relink the kernel with the new driver information
                if [ -z "$_NOPROMPT" ] ; then
                    if getyn "\nDo you wish to relink the kernel now?"
                    then
                      relink
                    else
                      echo "\nChanges will not take effect until the kernel is relinked." >&2
                    fi
                else
                    relink
                fi
                cleanup 0
                ;;
        Q|q)
                cleanup 0
                ;;
        *)      echo "Please answer 'i', 'd' or 'q'."
                ;;
        esac
done
echo    " "

brd=0

cfg0=N
cfg1=N
cfg2=N
cfg3=N

vect0=0
vect1=0
vect2=0
vect3=0

ioaddr0=0
ioend0=0
ioaddr1=0
ioend1=0
ioaddr2=0
ioend2=0
ioaddr3=0
ioend3=0

maddr0=0
mend0=0
maddr1=0
mend1=0
maddr2=0
mend2=0
maddr3=0
mend3=0

slot0=0
slot1=0
slot2=0
slot3=0

media0=MEDIA_AUTO
media1=MEDIA_AUTO
media2=MEDIA_AUTO
media3=MEDIA_AUTO

while getyn "Do you want to configure Board_$brd?"
do
    echo "\nBoard_$brd configuring ..."

    case "$brd" in
    0)
        cfg0=Y
        ;;
    1)
        cfg1=Y
        ;;
    2)
        cfg2=Y
        ;;
    3)
        cfg3=Y
        ;;
    esac

###
### Let user change the setting of DE-650CT PCMCIA Card
### This call must be put after 'idinstall' because /etc/conf/pack.d/d65e/space.c
### is created after 'idinstall'
###
    system_d65e  $brd


    /usr/sbin/netinfo -a -d d65e_$brd
    /etc/confnet.d/configure -i -p inet -d d65e_$brd

    brd=`expr $brd + 1`

done


cd /tmp
if [ ! -d dlk ] ; then
        mkdir dlk
fi
cd dlk


#
# mdevice(4)
#
# d65e  -       Device name
# Ihp   -       Function list, init routine, halt routine, poll routine
# iScHM -       Characteristics of driver, installable, STREAMS, character,
#               control hardware, multiple major numbers
# d65e  -       Handler prefix, ex: d65einit()...
# 0     -       Block Major number
# 0-3   -       Character Major number
# 1     -       Minimum units
# 4     -       Maximum units
# -1    -       DMA channel, -1 means does not use DMA
#
echo "d65e  I    iScHM   d65e  0    0-3       1       4       -1" > ./Master


#
# sdevice(4)
#
# d65e   -      Device name
# Y/N    -      Configure
#   4    -      Unit
#   5    -      IPL (Interrupt Privilege Level)
#   1    -      Type, require an interrupt line
#   0    -      Vector, no vector
#   0    -      SIOA, Start I/O Address
#   0    -      EIOA, End I/O Address
#   0    -      SCMA, Start Controller Address
#   0    -      ECMA, End Controller Address
#
echo "d65e $cfg0 4 5 1 $vect0 $ioaddr0 $ioend0 $maddr0 $mend0" > ./System
echo "d65e $cfg1 4 5 1 $vect1 $ioaddr1 $ioend1 $maddr1 $mend1" >> ./System
echo "d65e $cfg2 4 5 1 $vect2 $ioaddr2 $ioend2 $maddr2 $mend2" >> ./System
echo "d65e $cfg3 4 5 1 $vect3 $ioaddr3 $ioend3 $maddr3 $mend3" >> ./System

#
# idmknod(1M)
#
# clone         -       DSP internal name
# d65e_0        -       name of node to be inserted
# c:0           -       character device and major number 0
# d65e          -       minor device number
#
echo "clone     d65e_0   c:0       d65e" > ./Node
echo "clone     d65e_1   c:1       d65e" >> ./Node
echo "clone     d65e_2   c:2       d65e" >> ./Node
echo "clone     d65e_3   c:3       d65e" >> ./Node


# Space.c
echo "#define MEDIA_UTP         0" > ./Space.c
echo "#define MEDIA_BNC         1" >> ./Space.c
echo "#define MEDIA_AUI         2" >> ./Space.c
echo "#define MEDIA_AUTO        3" >> ./Space.c
echo "#define MEDIA_DEFAULT     -1" >> ./Space.c
echo "unsigned long DE650_BOARDS = $brd;" >> ./Space.c
echo "unsigned long de650intl[] = { $vect0, $vect1, $vect2, $vect3 };" >> ./Space.c
echo "unsigned long de650ioaddr[] = { 0x$ioaddr0, 0x$ioaddr1, 0x$ioaddr2, 0x$ioaddr3 };" >> ./Space.c
echo "unsigned long de650mem[] = { 0x$maddr0, 0x$maddr1, 0x$maddr2, 0x$maddr3 };" >> ./Space.c
echo "unsigned long de650slot[] = { $slot0, $slot1, $slot2, $slot3 };" >> ./Space.c
echo "unsigned long de650media[] = { $media0, $media1, $media2, $media3 };" >> ./Space.c


# Driver.o
cp /usr/lib/tcprt/dlk/de650ct.o ./Driver.o

###        echo "Modifying Streams Data Configuration Parameters"
#/etc/conf/bin/idtune -m -c NBLK64 20
#/etc/conf/bin/idtune -m -c NBLK2048 100

if [ -d /etc/conf/pack.d/d65e ] ; then
        idinstall -u -m -s -n -o -p -e d65e
else
        idinstall -a d65e
fi


cd .. ; rm -rf dlk

echo ""

ed -s /etc/conf/mdevice.d/d65e << TOAST > /dev/null
/ddi 5/
d
w
q
TOAST


cd /

# Relink the kernel with the new driver information
if [ -z "$_NOPROMPT" ] ; then
    if getyn "\nDo you wish to relink the kernel now?"
    then
        relink
    else
        echo "\nUNIX will not work until the kernel is relinked." >&2
        cleanup 0
    fi
else
    relink
fi

echo "\n\treboot the system\n" >&2

