#!/bin/sh # B6I harness: N x (aurora-modem start -> datatest -> aurora-modem stop) in one boot, checks after each cycle. RAM only. N=${1:-1}; C0=${2:-1}; O=/tmp/b6; mkdir -p $O; M="sh /tmp/aurora-modem" mask() { sed -E 's/([0-9]{6,})([0-9]{4})/******\2/g'; } mk() { echo "<5>[b6] $*" > /dev/kmsg; echo "[$(cut -d' ' -f1 /proc/uptime)] $*" | tee -a $O/run.log; } nv() { for want in modemst1 modemst2 fsg fsc persist; do for p in /sys/class/block/mmcblk0p*; do [ "$(sed -n 's/^PARTNAME=//p' $p/uevent)" = "$want" ] && echo "$want $(basename $p) $(sha256sum /dev/$(basename $p) | cut -d' ' -f1)"; done; done; } ERR='Failed to resume|-110|Resource temporarily|EAGAIN|crash detected|fatal error|[Ww]atchdog|Oops|Kernel panic|Unable to handle|BUG:' REF="modemst1:637a71d1 modemst2:9bb10190 fsg:b0a3b7e4 fsc:5f70bf18 persist:ee48a843" [ -f $O/nv-boot.txt ] || cp /tmp/nv-before.txt $O/nv-boot.txt for c in $(seq $C0 $((C0+N-1))); do X=$O/c$c; mkdir -p $X; dmesg | wc -l > $X/dmesg-off; wc -l < /tmp/aurora-modem.d/lifecycle.log > $X/log-off 2>/dev/null || echo 0 > $X/log-off mk "CYCLE $c begin: $(awk '{print "w="$5" s="$7}' /sys/block/mmcblk0/stat) mss=$(cat /sys/class/remoteproc/remoteproc0/state)" $M start > $X/start.out 2>&1; SR=$?; mk "CYCLE $c start rc=$SR" $M status 2>&1 | mask > $X/status-up.txt if [ $SR = 0 ]; then sh /tmp/aurora-modem-datatest $X/dt > $X/dt.out 2>&1; DR=$?; else DR=9; fi; mk "CYCLE $c $(cat $X/dt/verdict.txt 2>/dev/null || echo DATATEST not-run) rc=$DR" [ $SR = 0 ] && { $M stop > $X/stop.out 2>&1; PR=$?; } || PR=$(grep -q "STOP done rc=0" $X/start.out && echo 0 || echo 1) mk "CYCLE $c stop rc=$PR"; sleep 2 $M status 2>&1 | mask > $X/status-down.txt nv > $X/nv.txt; cat /sys/block/mmcblk0/stat > $X/stat.txt dmesg | tail -n +$(( $(cat $X/dmesg-off) + 1 )) > $X/dmesg-delta.txt grep -E "$ERR" $X/dmesg-delta.txt > $X/dmesg-errs.txt B=/sys/bus/platform/devices/4080000.remoteproc:bam-dmux F="" [ $SR = 0 ] || F="$F start"; [ $DR = 0 ] || F="$F data"; [ $PR = 0 ] || F="$F stop" [ "$(cat /sys/class/remoteproc/remoteproc0/state)" = offline ] || F="$F mss" [ -z "$(pidof rmtfs)" ] || F="$F rmtfs"; [ -z "$(pidof ModemManager)" ] || F="$F mm"; [ -z "$(pidof qmi-proxy)" ] || F="$F qmi-proxy" for d in /sys/class/net/wwan*; do [ -e $d ] || continue; w=${d##*/} [ $(( $(cat $d/flags) & 1 )) -ne 0 ] && F="$F $w-up"; ip -4 addr show $w | grep -q "inet " && F="$F $w-addr"; done ip route | grep -q " dev wwan" && F="$F routes"; ip route | grep -q "^default" && F="$F default-route" [ "$(cat $B/power/runtime_status)" = suspended ] || F="$F bam-$(cat $B/power/runtime_status)" [ -s $X/dmesg-errs.txt ] && F="$F dmesg-errs" for r in $REF; do grep -q "^${r%%:*} .* ${r#*:}" $X/nv.txt || F="$F nv-${r%%:*}"; done grep -v '^stat' $O/nv-boot.txt | awk '{print $1,$3}' > $X/nv-a; awk '{print $1,$3}' $X/nv.txt > $X/nv-b; cmp -s $X/nv-a $X/nv-b || F="$F nv-vs-boot" awk '{exit !($5==0 && $7==0)}' $X/stat.txt || F="$F emmc-writes" ping -c 2 -W 2 172.16.42.2 > $X/usb-ping.txt 2>&1 || F="$F usb-ncm" CHO=$(grep -c "Channel already open" $X/dmesg-delta.txt) tail -n +$(( $(cat $X/log-off) + 1 )) /tmp/aurora-modem.d/lifecycle.log | mask > $X/lifecycle.log [ -z "$F" ] && V=PASS || V="FAIL:$F" mk "CYCLE $c RESULT $V (bam=$(cat $B/power/runtime_status) emmc=$(awk '{print $5"/"$7}' $X/stat.txt) chan-already-open=$CHO dmesg-errs=$(wc -l < $X/dmesg-errs.txt))" [ -z "$F" ] || { mk "STOPPING after failed cycle $c"; break; } sleep 5 done for f in /tmp/aurora-modem.d/mm-*.log; do [ -f $f ] && mask < $f > $O/$(basename $f); done cp /tmp/aurora-modem.d/rmtfs.log /tmp/aurora-modem.d/lifecycle.log $O/ 2>/dev/null; mask < /tmp/aurora-modem.d/lifecycle.log > $O/lifecycle.log tar -C /tmp -cf /tmp/b6.tar b6; mk "B6-RUN-END"