#!/bin/sh # B4b1: BAM-DMUX observation. The only state-changing QMI command allowed is the B4a one # (--dms-set-operating-mode=online), and only if the mode is not already online. # No WDA/WDS, no bind, no bearer, no IP address. One wwan0 up/down cycle (mux OPEN/CLOSE only). D=/dev/wwan0qmi0; Q="qmicli -p -d $D"; O=/tmp/b4b1 t() { cut -d' ' -f1 /proc/uptime; } g() { echo "### $(t) $*"; timeout 30 $Q "$@" 2>&1; echo "### rc=$?"; } 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 $(sha256sum /dev/$(basename $p) | cut -d' ' -f1)"; done; done; } B=$(ls -d /sys/bus/platform/devices/*bam-dmux* 2>/dev/null | head -1) pm() { echo "### $(t) PM dev=$B drv=$(basename $(readlink $B/driver) 2>/dev/null) status=$(cat $B/power/runtime_status) control=$(cat $B/power/control) autosuspend_ms=$(cat $B/power/autosuspend_delay_ms) active_ms=$(cat $B/power/runtime_active_time) suspended_ms=$(cat $B/power/runtime_suspended_time) usage=$(cat $B/power/runtime_usage 2>/dev/null)"; } nets() { echo "### $(t) NET"; for nd in /sys/class/net/*; do echo "$(basename $nd) flags=$(cat $nd/flags) oper=$(cat $nd/operstate) type=$(cat $nd/type) mtu=$(cat $nd/mtu)"; done; ip link 2>&1; } dm() { echo "### $(t) DMESG bam/wwan/resume/remoteproc"; dmesg | grep -iE "bam|wwan|resume|remoteproc|q6v5|dmux|Oops|panic|fatal" | tail -30; } mkdir -p $O nv > $O/nv-before.txt; cat /sys/block/mmcblk0/stat > $O/stat-before.txt { g --dms-get-operating-mode; } > $O/mode-initial.txt if ! grep -q "Mode: 'online'" $O/mode-initial.txt; then { echo "### $(t) SET --dms-set-operating-mode=online"; timeout 30 $Q --dms-set-operating-mode=online 2>&1; echo "### rc=$?"; } > $O/set.txt grep -q "^### rc=0" $O/set.txt || { echo B4B1-STOPPED-SET; exit 1; } else echo "already online, no SET" > $O/set.txt; fi # wait for automatic registration (GET only, <=90 s) : > $O/reg.txt; for i in $(seq 1 30); do g --nas-get-serving-system >> $O/reg.txt; tail -20 $O/reg.txt | grep -q "Registration state: 'registered'" && break; sleep 3; done # BAM-DMUX observation ~5 min (PM/net/dmesg every 30 s, QMI GET every 60 s) : > $O/obs.txt; t0=$(cut -d. -f1 /proc/uptime); n=0 while [ $(( $(cut -d. -f1 /proc/uptime) - t0 )) -lt 300 ]; do { pm; nets; } >> $O/obs.txt [ $((n % 2)) = 0 ] && { g --dms-get-operating-mode; g --nas-get-serving-system; g --nas-get-signal-info; cat /sys/class/remoteproc/remoteproc0/state; } >> $O/obs.txt n=$((n+1)); sleep 30 done dm > $O/dmesg-pre-updown.txt # single wwan0 up/down cycle (no IP, no bearer) { pm; echo "### $(t) ip link show wwan0"; ip link show wwan0 2>&1 echo "### $(t) ip link set wwan0 up"; ip link set wwan0 up 2>&1; echo "rc=$?"; sleep 2; pm; ip link show wwan0 2>&1 sleep 10; pm echo "### $(t) ip link set wwan0 down"; ip link set wwan0 down 2>&1; echo "rc=$?"; sleep 2; pm; ip link show wwan0 2>&1 sleep 30; pm; } > $O/updown.txt 2>&1 dm > $O/dmesg-post-updown.txt # QMI regression (GET only) { g --dms-get-operating-mode; g --uim-get-card-status; g --nas-get-serving-system; g --nas-get-signal-info; cat /sys/class/remoteproc/remoteproc0/state; } > $O/qmi-final.txt nv > $O/nv-after.txt; cat /sys/block/mmcblk0/stat > $O/stat-after.txt cp /tmp/rmtfs.log $O/rmtfs.log; dmesg > $O/dmesg-full.txt cmp -s $O/nv-before.txt $O/nv-after.txt && echo "NV BEFORE==AFTER" > $O/nv-result.txt || echo "NV DIFFERENT" > $O/nv-result.txt tar -C /tmp -cf /tmp/b4b1.tar b4b1; echo B4B1-DONE