#! /bin/sh # waitfor_xpds: wait until all Astribanks were initialized # $Id$ # Written by Oron Peled # Copyright (C) 2008-2009, Xorcom # # All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # set -e # For lab testing mydir=`dirname $0` PATH="${mydir}:${PATH}" XPP_WAIT_AB_TIMEOUT=100 [ -r /etc/dahdi/init.conf ] && . /etc/dahdi/init.conf ab_list() { find /sys/devices -name idVendor 2>/dev/null | \ xargs grep -H 'e4e4' 2>/dev/null | \ sed -e 's/idVendor.*/idProduct/' | xargs grep -H '11[3456]' | \ sed 's,/[^/]*$,,' || : } ab_serial_nums() { for i in `ab_list`; do s=`cat "$i/serial" 2>/dev/null` || : if [ "$s" = '' ]; then echo "NO-SERIAL" else echo "$s" fi done | sort -u || : } detected_serial_nums() { for i in `ls -1d /sys/bus/astribanks/devices/*/transport 2>/dev/null`; do s=`cat "$i/serial" 2>/dev/null` || : if [ "$s" = '' ]; then echo "NO-SERIAL" else echo "$s" fi done | sort -u || : } calc_union() { echo "$@" | tr -s ' ' '\n' | sort -u } detected_ab_list() { # Only check /sys info (don't use /proc anymore). find /sys/bus/astribanks/devices/*/ -name waitfor_xpds 2> /dev/null || : } waitfor_ab_initialization() { oldab='' while if ! ab=`detected_ab_list`; then exit 1 fi test "$oldab" != "$ab" do if [ "$ab" = '' ]; then echo >&2 "Astribanks disappeared" break fi oldab="$ab" cat $ab #echo -n 1>&2 "_" done } # Any hardware? if ! dahdi_hardware="`which dahdi_hardware 2>/dev/null`"; then echo >&2 "$0: Missing dahdi_hardware" exit 0 fi # Just make sure if [ "`$dahdi_hardware | grep xpp_usb`" != "" ]; then astribank_is_starting -v -a fi if ! astribank_is_starting; then # No Astribanks ever seen -- nothing to do exit 0 fi # Sanity check for i in `ab_list`; do s=`cat "$i/serial" 2>/dev/null` || : if [ "$s" = '' ]; then echo >&2 "WARNING! Astribank without serial number: $i" fi done serial_nums=`ab_serial_nums` # Loop until detected (hopefully) all astribanks and they are initialized echo -n 1>&2 "Astribanks detection " tries="$XPP_WAIT_AB_TIMEOUT" last_detected=0 while new_serial_nums=`ab_serial_nums` detected_serial_nums=`detected_serial_nums` curr_union=`calc_union $curr_union $serial_nums $new_serial_nums` num_detected=`detected_ab_list | wc -l` if [ "$num_detected" != "$last_detected" ]; then # Visual feedback (number of detected AB so far) echo -n 1>&2 "[$num_detected]" last_detected="$num_detected" waitfor_ab_initialization > /dev/null fi # Break only when we have something and it's stable test "$curr_union" != "$detected_serial_nums" -o "$detected_serial_nums" = '' do if [ "$tries" -le 0 ]; then echo 1>&2 "TIMEOUT" exit 1 fi echo -n 1>&2 "." sleep 1 : $((tries-=1)) serial_nums="$new_serial_nums" done # Finished: Show a nice output echo "" cat /sys/bus/astribanks/devices/*/waitfor_xpds 2> /dev/null || : # Wait for device to stabilize and XPD's to finish initalizations echo 1>&2 "Astribanks initializing spans" if [ "$XPP_HOTPLUG_DAHDI" = yes ]; then if [ "$CALLED_FROM_ATRIBANK_HOOK" = '' ]; then # Now we can wait until the hotplug run would remove the semaphore echo -n 1>&2 "Other DAHDI initializations... " astribank_is_starting -v -w 1>&2 fi fi # All Astribanks initialized -- remove semaphore astribank_is_starting -v -r 1>&2