diff options
author | tzafrir <tzafrir@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2007-03-02 21:36:22 +0000 |
---|---|---|
committer | tzafrir <tzafrir@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2007-03-02 21:36:22 +0000 |
commit | 1676ea7e0afa3d4eaf92a505a707ac82f46c2597 (patch) | |
tree | 651bbb733cadf7a346fe7983f74e3a51a860a0a5 | |
parent | a3f59e24692fa6f236670cff9d9160fcdc344118 (diff) |
Support loading an Astribank (xpp) device in the init script.
git-svn-id: http://svn.digium.com/svn/zaptel/trunk@2270 5390a7c7-147a-4af0-8ec9-7488f05a26cb
-rw-r--r-- | zaptel.init | 73 |
1 files changed, 72 insertions, 1 deletions
diff --git a/zaptel.init b/zaptel.init index 52aa030..4a35842 100644 --- a/zaptel.init +++ b/zaptel.init @@ -61,6 +61,72 @@ unload_module() { rmmod $module } +# Wait for Astribank to initialize registers: +wait_for_xpp() { + if [ -d /proc/xpp ] + then + # reading from waitfor_xpds only returns when the device + # has finished initilizing its regiters and is available. + cat /proc/xpp/XBUS-*/waitfor_xpds 2>/dev/null >/dev/null || true + fi +} + +# Register to zaptel Astribank spans that were not autoomatically registered +# (useful when you have more than one Astribank) +zap_reg_xpp() { + if [ ! -d /proc/xpp ]; then return; fi + + # Get a list of connected Astribank devices, sorted by the name of + # the USB connector. That order is rather arbitrary, but will not + # change without changes to the cabling. + xbusses=`sort -k 2 /proc/xpp/xbuses | awk -F: '/STATUS=connected/ {print $1}'` + + # get a list of XPDs that were not yet registered as zaptel spans. + # this will be the case if you set the parameter zap_autoreg=0 to + # the module xpp + # Append /dev/null to provide a valid file name in case of an empty pattern. + xbusses_pattern=`echo $xbusses| sed -e 's|XBUS-[0-9]*|/proc/xpp/&/XPD-*/zt_registration|g'`' /dev/null' + xpds_to_register=`grep -l 0 $xbusses_pattern 2>/dev/null` || true + for file in $xpds_to_register; do + echo 1 >$file + done +} + +# If the system has an Astribank, select the right one as the sync source. +# TODO: replace the sryptic awk code with 'xpp_sync auto' once it is in. +fix_asterisbank_sync() { + # do nothing if module not present + if [ ! -d /proc/xpp ]; then return; fi + + #if ! grep -q '^HOST' /proc/xpp/sync 2>/dev/null; then return; fi + + case "$XPP_SYNC" in + n*|N*) return;; + host|HOST) sync_value="HOST";; + [0-9]*)sync_value="$XPP_SYNC";; + *) + # find the number of the first bus, and sync from it: + fxo_pat=`awk -F: '/STATUS=connected/{print $1}' /proc/xpp/xbuses | sed -e 's|.*|/proc/xpp/&/*/fxo_info|'` + # find the first FXO unit, and set it as the sync master + bus=`ls -1 $fxo_pat 2> /dev/null | head -n1 | cut -d- -f2 | cut -d/ -f1` + + if [ "$bus" = '' ]; then + # no device with FXO found. Just get the first one + bus=`awk -F: '/STATUS=connected/{print $1}' /proc/xpp/xbuses | head -n 1 | cut -d- -f2` + fi + + # do nothing if there is no bus: + case "$bus" in [0-9]*):;; *) return;; esac + sync_value="SYNC=$bus" + ;; + esac + # the built-in echo of bash fails to print a proper error on failure + if ! /bin/echo "$sync_value" >/proc/xpp/sync + then + echo >&2 "Updating XPP sync source failed (tried \"$sync_value\", XPP_SYNC='$XPP_SYNC')" + fi +} + # Check that telephony is up. [ "${TELEPHONY}" = "yes" ] || exit 0 @@ -118,7 +184,12 @@ case "$1" in echo -n " $x" fi done - sleep 3 + sleep 3 # TODO: remove it + + wait_for_xpp + zap_reg_xpp + fix_asterisbank_sync # can actually be run after ztcfg + if [ ! -e /proc/zaptel/1 ]; then echo "No functioning zap hardware found in /proc/zaptel, loading ztdummy" modprobe ztdummy >& /dev/null |