]> git.ipfire.org Git - ipfire-2.x.git/blobdiff - src/rc.d/rc.eciadsl
git-svn-id: http://svn.ipfire.org/svn/ipfire/IPFire/source@16 ea5c0bd1-69bd-2848...
[ipfire-2.x.git] / src / rc.d / rc.eciadsl
diff --git a/src/rc.d/rc.eciadsl b/src/rc.d/rc.eciadsl
new file mode 100644 (file)
index 0000000..c6eca4c
--- /dev/null
@@ -0,0 +1,151 @@
+#!/bin/bash
+#
+# $Id: rc.eciadsl,v 1.4.2.14 2005/07/28 16:47:43 gespinasse Exp $
+#
+
+eval $(/usr/local/bin/readhash CONFIG_ROOT/ppp/settings)
+
+# Debugging. Comment it out to stop logging
+DEBUG="yes"
+msg() {
+       if [ "z$DEBUG" != "z" ] ; then
+               /usr/bin/logger -t red "ECI USB: $*"
+       fi
+       /bin/echo "$*"
+}
+
+# Function to wait for interface to become ready
+# Borrowed from eciadsl startmodem script
+function wait_for_iface()
+{
+       msg "Waiting for interface: $1"
+       COUNTER=10
+       FLREADY=0
+       TIMES=1
+       while [ $TIMES -le $COUNTER ]; do
+               /sbin/ifconfig $1> /dev/null 2>&1
+               if [ $? -eq 0 ]; then
+                       FLREADY=1
+                       break
+               fi
+               /bin/sleep 1
+               TIMES=$(expr $TIMES + 1)
+       done
+       if [ "$FLREADY" -eq 0 ]; then
+               msg "Interface not found: $1"
+               exit 1
+       fi
+}
+
+# See how we were called.
+case "$1" in
+  start)
+       if [ ! -f "CONFIG_ROOT/eciadsl/synch.bin" ]; then
+               msg "Synch.bin not uploaded"
+               exit 1
+       fi
+
+       if [ ! -f "/proc/bus/usb/devices" ]; then
+               msg "No USB enabled"
+               exit 1
+       fi
+
+       VID1="$(/bin/grep "$MODEM       " "/etc/eciadsl/modems.db" | /usr/bin/tr -s "\t" "|" | /usr/bin/cut -d '|' -f 2)"
+       PID1="$(/bin/grep "$MODEM       " "/etc/eciadsl/modems.db" | /usr/bin/tr -s "\t" "|" | /usr/bin/cut -d '|' -f 3)"
+       VID2="$(/bin/grep "$MODEM       " "/etc/eciadsl/modems.db" | /usr/bin/tr -s "\t" "|" | /usr/bin/cut -d '|' -f 4)"
+       PID2="$(/bin/grep "$MODEM       " "/etc/eciadsl/modems.db" | /usr/bin/tr -s "\t" "|" | /usr/bin/cut -d '|' -f 5)"
+       CHIP="$(/bin/grep "$MODEM       " "/etc/eciadsl/modems.db" | /usr/bin/tr -s "\t" "|" | /usr/bin/cut -d '|' -f 6)"
+       ALTS="$(/bin/grep "$MODEM       " "/etc/eciadsl/modems.db" | /usr/bin/tr -s "\t" "|" | /usr/bin/cut -d '|' -f 7)"
+       ALTP="$(/bin/grep "$MODEM       " "/etc/eciadsl/modems.db" | /usr/bin/tr -s "\t" "|" | /usr/bin/cut -d '|' -f 8)"
+
+       if [ "$CHIP" = '' ]; then
+               msg "error in modems.db reading for $MODEM no CHIP found"
+               exit 1
+       fi
+
+       # Firmware
+       if [ "$CHIP" = 'GS7070' ]; then
+               if ( /bin/grep -q "^P:  Vendor=$VID1 ProdID=$PID1" /proc/bus/usb/devices ); then
+                       /bin/rm -f /var/ipcop/red/eciadsl-synch-done
+                       /bin/sleep 2
+                       msg "Loading Firmware for $MODEM"
+                       /usr/sbin/eciadsl-firmware 0x$VID1 0x$PID1 0x$VID2 0x$PID2 /etc/eciadsl/firmware00.bin
+                       RET=$?
+                       if [ "$RET" -ne "0" ]; then
+                               msg "$MODEM failed to load firmware, reason: $RET"
+                               exit 1
+                       fi
+                       /bin/sleep 2
+               fi
+       fi
+
+       if ( ! /bin/grep -q "^P:  Vendor=$VID2 ProdID=$PID2" /proc/bus/usb/devices ); then
+               msg "$MODEM modem not found ready"
+               exit 1
+       fi
+
+       # Modem synch
+       if [ ! -e "CONFIG_ROOT/red/eciadsl-synch-done" ]; then
+               /usr/sbin/eciadsl-synch -alt $ALTS -mc $CHIP 0x$VID2 0x$PID2 CONFIG_ROOT/eciadsl/synch.bin
+               RET=$?
+               if [ "$RET" -ne "0" ]; then
+                       msg "$MODEM failed to get synchronization, reason:$RET"
+                       exit 1
+               else
+                       /bin/touch CONFIG_ROOT/red/eciadsl-synch-done
+               fi
+       fi
+
+       if [ "$PROTOCOL" = "RFC1483" ]; then
+               case "$ENCAP" in
+                   0) ECIMODE="LLC_SNAP_RFC1483_BRIDGED_ETH_NO_FCS"
+                       ;;
+                   1) ECIMODE="VCM_RFC_1483_BRIDGED_ETH"
+                       ;;
+                   2) ECIMODE="LLC_RFC1483_ROUTED_IP"
+                       ;;
+                   3) ECIMODE="VCM_RFC1483_ROUTED_IP"
+                       ;;
+                   *) msg "Unknown encapsulation: $ENCAP"
+                       exit 1
+                       ;;
+               esac
+
+               # Start pppoeci
+               if [ "$ENCAP" = "0" -o "$ENCAP" = "1" ]; then
+                       ECIIF="tap0"
+               else
+                       ECIIF="tun0"
+               fi
+               /sbin/modprobe tun
+               /usr/sbin/eciadsl-pppoeci -alt $ALTP -vpi $VPI -vci $VCI -vendor 0x$VID2 -product 0x$PID2 -mode $ECIMODE
+               wait_for_iface $ECIIF
+               /sbin/ifconfig $ECIIF up
+               exit $?
+       fi
+       exit 0
+       ;;
+  stop)
+       msg "stop"
+       # Avoid possibility of multiple 'rc.eciadsl start' as only one prog can claim interface at a time
+       # and time for the full eci-load2 loop may be too long for the user to wait until to try once again
+       RCECIADSLSTART=`/bin/ps ax | /bin/grep '[r]c.eciadsl start' | /usr/bin/cut -f1 -d ' '`
+       [ "$RCECIADSLSTART" != '' ] && /bin/kill "$RCECIADSLSTART"
+
+       # -KILL is necessary because pppoeci ignores sigint
+       /bin/killall -KILL eciadsl-pppoeci eciadsl-firmware eciadsl-synch 2> /dev/null
+       /bin/sleep 1
+       /sbin/modprobe -r tun
+       ;;
+  cleanup)
+       msg "driver cleanup and USB Bus reset"
+       /usr/local/bin/resetusb
+       /bin/rm -f CONFIG_ROOT/red/eciadsl-synch-done
+       ;;
+  *)
+       /bin/echo "Usage: $0 {start|stop|cleanup}"
+       exit 1
+       ;;
+esac
+
+exit 0