From 949ea4ca9f9c9050811af9e80d44530beb10fd8f Mon Sep 17 00:00:00 2001 From: Oron Peled Date: Wed, 22 Feb 2012 18:13:02 +0000 Subject: [PATCH] xpp: improved waitfor_xpds * Fix an issue due to long firmware load time: - When one Astribank has an echo canceler (long firmware loading) and and another one does not. - The EC-less Astribank finishes initialization before the Astribank with EC is detected. - Thus waitfor_xpds terminates too early. * We now iteratively build two sets of serial numbers: - One from wha we see in all Xorcom (e4e4:11[3456]x) USB devices. - The other is those that were detected in the driver. - Only when the two sets are equal (and > 0) we know we are done. - This is resilient to many problems (e.g: disconnect/reconnect of same device during initialization). * The progress output was also improved: Now each detected AB show the total number so far. * The timeout was also increased to 100sec * Woraround for an Astribank with no serial (but just a single one on the system). Signed-off-by: Oron Peled Acked-by: Tzafrir Cohen git-svn-id: http://svn.astersk.org/svn/dahdi/tools/trunk@10465 17933a7a-c749-41c5-a318-cba88f637d49 --- xpp/waitfor_xpds | 78 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 63 insertions(+), 15 deletions(-) diff --git a/xpp/waitfor_xpds b/xpp/waitfor_xpds index 067a128..f1fbd5e 100755 --- a/xpp/waitfor_xpds +++ b/xpp/waitfor_xpds @@ -29,14 +29,53 @@ set -e # For lab testing mydir=`dirname $0` PATH="${mydir}:${PATH}" -XPP_WAIT_AB_TIMEOUT=80 +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() { + ab_list | \ + sed 's,$,/serial,' | \ + xargs grep -H '' 2>/dev/null | \ + sed 's,.*/serial:,,' | \ + sed 's/^$/NO-SERIAL/' | \ + sort -u +} + +detected_serial_nums() { + cat /sys/bus/astribanks/devices/*/transport/serial 2> /dev/null | \ + sed 's/^$/NO-SERIAL/' | \ + sort -u || : +} + +calc_union() { + echo "$@" | tr -s ' ' '\n' | sort -u +} + +detected_ab_list() { # Only check /sys info (don't use /proc anymore). - ab=`find /sys/bus/astribanks/devices/xbus-*/ -name waitfor_xpds 2> /dev/null || :` - echo $ab + 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 + oldab="$ab" + cat $ab + #echo -n 1>&2 "_" + done } # Any hardware? @@ -55,10 +94,25 @@ if ! astribank_is_starting; then exit 0 fi -# Wait for driver and first device +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" -while [ ! -e "/sys/bus/astribanks/devices/xbus-00" ] +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" @@ -67,21 +121,15 @@ do 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" -while - if ! ab=`ab_list`; then - exit 1 - fi - test "$oldab" != "$ab" -do - oldab="$ab" - cat $ab -done - if [ "$XPP_HOTPLUG_DAHDI" = yes ]; then if [ "$CALLED_FROM_ATRIBANK_HOOK" = '' ]; then # Now we can wait until the hotplug run would remove the semaphore