167 lines
12 KiB
Diff
167 lines
12 KiB
Diff
--- b6j/aurora-modem 2026-09-30 22:02:25.214198989 +0600
|
|
+++ b6p/rootfs/usr/sbin/aurora-modem 2026-09-30 22:24:42.244902667 +0600
|
|
@@ -1,27 +1,17 @@
|
|
#!/bin/sh
|
|
-# B6 RAM-only modem lifecycle controller for Aurora (golden mm1). Lives in /tmp only.
|
|
-# aurora-modem start | stop | status | addroute <ipv4>
|
|
-# Reconstructs the proven flow (NOTES sessions 14-22 Aurora, JZ02 stopcycle/wwanfix/openrc):
|
|
-# start: RO gates -> rmtfs -r -P -s -v (rmtfs -s starts MSS) -> MSS running -> wwan0qmi0+wwan0 (+2 s, JZ02 port-race guard)
|
|
-# -> qmicli -p DMS online (one SET, only if not online) -> NAS registered + PS attached -> kill qmi-proxy
|
|
-# -> udevd/dbus/polkitd/ModemManager -> MM modem registered -> ONE simple-connect -> bearer IPv4 on wwanN
|
|
-# + /32 host routes only (no default route, usb0 untouched).
|
|
-# stop: simple-disconnect -> MM disable (radio low-power = detach) -> del our /32 routes, flush+down all wwan* -> stop MM (+qmi-proxy) -> BAM-DMUX suspended
|
|
-# -> SIGTERM rmtfs: rmtfs writes "stop" to remoteproc state (MSS stops while rmtfs still serves) -> rmtfs exits LAST.
|
|
-# Never writes eMMC/NV: rmtfs -r keeps EFS writes in RAM; the script refuses to run unless the NV partitions are getro=1.
|
|
-# B6J diagnostic knobs (all RAM-only, set in $CONF):
|
|
-# MODEM_STOP_DISABLE=0 stop skips mmcli --disable / qmicli low-power (J1/J3: back to the minimal proven stop)
|
|
-# MODEM_RMTFS_PERSIST=1 long-lived rmtfs: 'rmtfs -r -P -v' (no -s) started once, MSS via remoteproc sysfs start/stop,
|
|
-# stop leaves rmtfs alive; 'aurora-modem rmtfs-stop' ends it (only with MSS offline)
|
|
-# MODEM_HOOK_PRE_ONLINE / MODEM_HOOK_PRE_MM shell commands run right before DMS online SET / before udevd+MM start (B6K AT capture)
|
|
-# MODEM_REG_SM=1 registration state machine (B6M): wait up to T_REG for registered+PS attached; searching/limited/detached and
|
|
-# transient registration-denied are NOT failures; immediate FAIL only on local errors (MSS/QMI dev/SIM/rmtfs/BAM/SSR/USB);
|
|
-# transitions (state or cell change) logged to $D/reg-trans.tsv
|
|
-# MODEM_REG_SNAP=1 save read-only NAS system-info/cell-location/rf-band right after registration
|
|
+# Aurora (JZ08AU, MSM8916) modem lifecycle controller - B6P production build of the B6N-proven controller (b6j/aurora-modem).
|
|
+# aurora-modem start | disconnect | stop | status | addroute <ipv4>
|
|
+# start: [rmtfs -r -P -s -v -> MSS -> wwan0qmi0 (+2 s port-race guard) -> SIM ready -> DMS online (one SET, retried only on DeviceNotReady)
|
|
+# -> registration state machine (registered + PS attached, deadline REG_TIMEOUT, default 600 s)] (skipped when rmtfs+MSS already run)
|
|
+# -> udevd/dbus/polkitd/ModemManager (reused if running) -> ONE simple-connect -> bearer IPv4 on wwanN + /32 routes only (no default route).
|
|
+# disconnect: simple-disconnect, our routes, flush+down all wwan*, wait BAM-DMUX suspended. MSS, rmtfs, MM and radio stay up; 'start' reconnects.
|
|
+# stop: disconnect -> stop MM (+qmi-proxy) -> BAM-DMUX suspended -> SIGTERM rmtfs (rmtfs writes 'stop' -> MSS offline) -> rmtfs exits last.
|
|
+# Never writes eMMC/NV: rmtfs -r keeps EFS writes in RAM; refuses to start unless modemst1/2, fsc, fsg, persist, mmcblk0 are getro=1 and /firmware is ro.
|
|
+# Does not need a valid wall clock (all timing from /proc/uptime). No automatic MSS/rmtfs retry.
|
|
# Exit: 0 ok, 1 failure/timeout (start rolls back with a full stop unless MODEM_KEEP_ON_FAIL=1), 2 usage/config error.
|
|
|
|
-CONF=${MODEM_CONF:-/tmp/aurora-modem.conf}
|
|
-D=/tmp/aurora-modem.d; mkdir -p $D
|
|
+CONF=${MODEM_CONF:-/etc/aurora/modem.conf}
|
|
+D=/run/aurora-modem; mkdir -p $D
|
|
LOG=$D/lifecycle.log; STATE=$D/state; ROUTES=$D/routes; BEARER=$D/bearer
|
|
RPNAME=4080000.remoteproc
|
|
BAM=/sys/bus/platform/devices/4080000.remoteproc:bam-dmux
|
|
@@ -29,11 +19,10 @@
|
|
|
|
# --- timeouts (s); override in $CONF
|
|
T_RMTFS=5 T_MSS=60 T_QMI_DEV=30 T_QMI=45 T_SIM=60 T_ONLINE=30 T_REG=180 T_MM_DETECT=150 T_MM_REG=60 T_CONNECT=150
|
|
-MODEM_REATTACH_HOLDOFF=120 # s between radio stop and next MSS start (B6: re-attach <=61 s after stop was rejected 3/3 by Beeline)
|
|
-MODEM_STOP_DISABLE=1 MODEM_RMTFS_PERSIST=0 MODEM_REG_SNAP=0 MODEM_HOOK_PRE_ONLINE= MODEM_HOOK_PRE_MM= MODEM_REG_SM=0
|
|
T_DISCONNECT=60 T_DISABLE=30 T_MM_EXIT=30 T_BAM_IDLE=15 T_MSS_STOP=30 T_RMTFS_EXIT=15
|
|
-MODEM_APN= MODEM_USER= MODEM_PASSWORD= MODEM_AUTH= MODEM_IP_TYPE=ipv4 MODEM_TEST_ROUTES= KEEP=${MODEM_KEEP_ON_FAIL:-0}
|
|
+APN= USER= PASSWORD= AUTH= IP_TYPE=ipv4 REG_TIMEOUT=600 ROUTES= KEEP=${MODEM_KEEP_ON_FAIL:-0}
|
|
[ -f "$CONF" ] && . "$CONF"
|
|
+MODEM_APN=$APN MODEM_USER=$USER MODEM_PASSWORD=$PASSWORD MODEM_AUTH=$AUTH MODEM_IP_TYPE=${IP_TYPE:-ipv4} MODEM_TEST_ROUTES=$ROUTES T_REG=${REG_TIMEOUT:-600}
|
|
MODEM_KEEP_ON_FAIL=${MODEM_KEEP_ON_FAIL:-$KEEP}
|
|
|
|
mmc() { mmcli "$@" 2>/dev/null | tr -d '\033' | sed 's/\[[0-9;]*m//g'; } # mmcli colours values even without a tty
|
|
@@ -154,32 +143,14 @@
|
|
|
|
# OFF -> RMTFS_READY -> MPSS_BOOTING -> MPSS_RUNNING
|
|
if [ -n "$(rmtfs_pid)" ] && mss_is running; then log "rmtfs $(rmtfs_pid) + MSS running already - reuse"
|
|
- elif [ "$MODEM_RMTFS_PERSIST" = 1 ] && mss_is offline; then
|
|
- : > $ROUTES; rm -f $D/ipcfg
|
|
- if [ -z "$(rmtfs_pid)" ]; then
|
|
- n0=$(grep -c 'registering services' $D/rmtfs.log 2>/dev/null)
|
|
- LD_PRELOAD=/usr/lib/linebuf.so rmtfs -r -P -v >> $D/rmtfs.log 2>&1 &
|
|
- echo $! > $D/rmtfs.pid
|
|
- wait_for $T_RMTFS 0.2 sh -c "kill -0 $(cat $D/rmtfs.pid) 2>/dev/null && [ \$(grep -c 'registering services' $D/rmtfs.log) -gt ${n0:-0} ]" \
|
|
- || fail_start "rmtfs did not start (pid $(cat $D/rmtfs.pid))"
|
|
- log "long-lived rmtfs started: pid $(rmtfs_pid) (rmtfs -r -P -v, no -s)"
|
|
- else log "long-lived rmtfs reused: pid $(rmtfs_pid)"; fi
|
|
- setstate RMTFS_READY
|
|
- setstate MPSS_BOOTING
|
|
- t=$(now); (echo start > $(rp)/state) >> $LOG 2>&1 &
|
|
- wait_for $T_MSS 0.2 mss_is running || fail_start "MSS not running after ${T_MSS}s (state $(mss_state))"
|
|
- log "MSS running after $(since $t)s (sysfs start)"
|
|
elif [ -n "$(rmtfs_pid)" ] || ! mss_is offline; then
|
|
log "FAIL: inconsistent (rmtfs='$(rmtfs_pid)' MSS=$(mss_state)); run stop first"; exit 1
|
|
else
|
|
- if [ -f $D/last-radio-stop ]; then
|
|
- w=$(awk -v a="$(now)" -v b="$(cat $D/last-radio-stop)" -v h="$MODEM_REATTACH_HOLDOFF" 'BEGIN{d=h-(a-b); printf "%d", (d>0)?d+1:0}')
|
|
- [ "$w" -gt 0 ] && { log "re-attach holdoff: last radio stop $(since $(cat $D/last-radio-stop))s ago, waiting ${w}s (MODEM_REATTACH_HOLDOFF=$MODEM_REATTACH_HOLDOFF)"; sleep $w; }
|
|
- fi
|
|
: > $ROUTES; rm -f $D/ipcfg
|
|
+ n0=$(grep -c 'registering services' $D/rmtfs.log 2>/dev/null)
|
|
LD_PRELOAD=/usr/lib/linebuf.so rmtfs -r -P -s -v >> $D/rmtfs.log 2>&1 &
|
|
echo $! > $D/rmtfs.pid
|
|
- wait_for $T_RMTFS 0.2 sh -c "kill -0 $(cat $D/rmtfs.pid) 2>/dev/null && grep -q 'registering services' $D/rmtfs.log" \
|
|
+ wait_for $T_RMTFS 0.2 sh -c "kill -0 $(cat $D/rmtfs.pid) 2>/dev/null && [ \$(grep -c 'registering services' $D/rmtfs.log) -gt ${n0:-0} ]" \
|
|
|| fail_start "rmtfs did not start (pid $(cat $D/rmtfs.pid))"
|
|
setstate RMTFS_READY
|
|
setstate MPSS_BOOTING
|
|
@@ -203,7 +174,6 @@
|
|
setstate QMI_READY; log "DMS $(grep -o "Mode: '[^']*'" $D/qmi-mode.txt) after $(since $t)s"
|
|
t=$(now); wait_for $T_SIM 1 sim_ready || fail_start "SIM/USIM not ready after ${T_SIM}s ($(grep -E "Card state|Application state" $D/qmi-uim.txt | head -2 | tr -s ' \t\n' ' '))"
|
|
setstate SIM_READY; log "UIM card present, USIM app ready after $(since $t)s"
|
|
- [ -n "$MODEM_HOOK_PRE_ONLINE" ] && { sh -c "$MODEM_HOOK_PRE_ONLINE" >> $LOG 2>&1; log "pre-online hook rc=$?"; }
|
|
if ! grep -q "Mode: 'online'" $D/qmi-mode.txt; then
|
|
log "SET: $Q --dms-set-operating-mode=online (retried only on DeviceNotReady, <= ${T_ONLINE}s)"
|
|
rm -f $D/qmi-set.err; t=$(now); wait_for $T_ONLINE 1 set_online || fail_start "SET online: DeviceNotReady for ${T_ONLINE}s"
|
|
@@ -212,21 +182,15 @@
|
|
log "DMS online after $(since $t)s"
|
|
fi
|
|
setstate RADIO_ONLINE
|
|
- if [ "$MODEM_REG_SM" = 1 ]; then
|
|
- t=$(now); reg_sm $t; rr=$?
|
|
- [ $rr = 2 ] && fail_start "LOCAL FAILURE during registration: $(cat $D/reg-fail)"
|
|
- [ $rr = 1 ] && fail_start "$(cat $D/reg-fail)"
|
|
- else
|
|
- t=$(now); wait_for $T_REG 2 qmi_reg || fail_start "not registered+PS attached after ${T_REG}s ($(grep -E "Registration state" $D/qmi-ss.txt | tr -s ' \t'))"
|
|
- fi
|
|
+ t=$(now); reg_sm $t; rr=$?
|
|
+ [ $rr = 2 ] && fail_start "LOCAL FAILURE during registration: $(cat $D/reg-fail)"
|
|
+ [ $rr = 1 ] && fail_start "$(cat $D/reg-fail)"
|
|
+
|
|
log "registered: $(grep -oE "(MCC|MNC|Description): '[^']*'" $D/qmi-ss.txt | tr '\n' ' ')after $(since $t)s"
|
|
setstate REGISTERED
|
|
- [ "$MODEM_REG_SNAP" = 1 ] && for a in nas-get-system-info nas-get-cell-location-info nas-get-rf-band-info nas-get-signal-info; do
|
|
- timeout 20 $Q --$a > $D/reg-$a.txt 2>&1; done
|
|
killall qmi-proxy 2>/dev/null; wait_for 5 0.2 sh -c '! pidof qmi-proxy >/dev/null'
|
|
fi
|
|
|
|
- [ -n "$MODEM_HOOK_PRE_MM" ] && { sh -c "$MODEM_HOOK_PRE_MM" >> $LOG 2>&1; log "pre-MM hook rc=$?"; }
|
|
# -> MM_READY (mm-up order: udevd, trigger, settle, dbus, polkitd, ModemManager)
|
|
pidof udevd >/dev/null || { udevd --daemon; udevadm trigger --action=add; udevadm settle --timeout=15; log "udevd started"; }
|
|
if ! pidof dbus-daemon >/dev/null; then
|
|
@@ -282,15 +246,6 @@
|
|
if [ -n "$(mm_pid)" ] && mm_has_modem; then
|
|
timeout $T_DISCONNECT mmcli -m "$(mm_idx)" --simple-disconnect >> $LOG 2>&1; log "simple-disconnect rc=$? (bearers: $(bearers | tr '\n' ' '))"
|
|
wait_for 15 1 sh -c "! sh $0 _anyconn" && log "no bearer connected" || { log "WARNING: bearer still connected"; rc=1; }
|
|
- # 1b. radio off / network detach before MSS goes away (B6 addition: abrupt MSS stop while EPS-attached
|
|
- # was followed by attach rejection 'limited' on quick restart). MM disable = DMS low-power.
|
|
- if [ "$MODEM_STOP_DISABLE" = 1 ]; then
|
|
- timeout $T_DISABLE mmcli -m "$(mm_idx)" --disable >> $LOG 2>&1; r=$?
|
|
- wait_for 10 0.5 sh -c "[ \"\$(sh $0 _mmstate)\" = disabled ]" && log "MM disable rc=$r -> state disabled (radio low-power, detached)" \
|
|
- || { log "WARNING: MM disable rc=$r state '$(mm_state)'"; rc=1; }
|
|
- else log "MODEM_STOP_DISABLE=0: no MM disable"; fi
|
|
- elif [ "$MODEM_STOP_DISABLE" = 1 ] && [ -e /dev/wwan0qmi0 ] && mss_is running; then
|
|
- timeout 20 $Q --dms-set-operating-mode=low-power >> $LOG 2>&1; log "qmicli low-power rc=$? (MM not running)"
|
|
fi
|
|
# 2. our /32 routes, 3. flush + DOWN every wwan*
|
|
for h in $(cat $ROUTES 2>/dev/null); do ip route del $h/32 2>/dev/null; done; : > $ROUTES
|
|
@@ -316,14 +271,7 @@
|
|
fi
|
|
# 6. MSS stop via rmtfs -s (SIGTERM -> pwrite "stop" to remoteproc state -> exit), 7. rmtfs exits last
|
|
P=$(rmtfs_pid)
|
|
- mss_is running && now > $D/last-radio-stop
|
|
- if [ "$MODEM_RMTFS_PERSIST" = 1 ] && ! mss_is offline && [ -n "$(rp)" ]; then
|
|
- t=$(now); (echo stop > $(rp)/state) >> $LOG 2>&1; log "MSS stop via sysfs (long-lived rmtfs '${P}' stays)"
|
|
- wait_for $T_MSS_STOP 0.2 mss_is offline && log "MSS offline after $(since $t)s (rmtfs alive: $([ -n "$P" ] && kill -0 $P 2>/dev/null && echo yes || echo no))" \
|
|
- || { log "ERROR: MSS '$(mss_state)' after ${T_MSS_STOP}s"; rc=1; }
|
|
- setstate MPSS_STOPPED
|
|
- elif [ "$MODEM_RMTFS_PERSIST" = 1 ]; then log "MSS already $(mss_state); long-lived rmtfs '${P}' stays"
|
|
- elif [ -n "$P" ]; then
|
|
+ if [ -n "$P" ]; then
|
|
t=$(now); kill -TERM $P; log "SIGTERM rmtfs $P (rmtfs stops MSS, then exits)"
|
|
wait_for $T_MSS_STOP 0.2 mss_is offline && log "MSS offline after $(since $t)s (rmtfs alive: $(kill -0 $P 2>/dev/null && echo yes || echo no))" \
|
|
|| { log "ERROR: MSS '$(mss_state)' after ${T_MSS_STOP}s"; rc=1; }
|
|
@@ -385,10 +333,6 @@
|
|
disconnect) do_disconnect; exit $?;;
|
|
status) do_status;;
|
|
addroute) [ -n "$2" ] || exit 2; addroute "$2";;
|
|
- rmtfs-stop) mss_is offline || { log "rmtfs-stop refused: MSS $(mss_state)"; exit 1; }
|
|
- P=$(rmtfs_pid); [ -n "$P" ] || { log "rmtfs-stop: not running"; exit 0; }
|
|
- kill -TERM $P; wait_for $T_RMTFS_EXIT 0.2 sh -c "! kill -0 $P 2>/dev/null" && { log "long-lived rmtfs $P exited"; exit 0; }
|
|
- log "ERROR: rmtfs $P did not exit"; exit 1;;
|
|
_anyconn) any_bearer_connected;;
|
|
_mmstate) mm_state;;
|
|
*) echo "usage: $0 start|stop|status|addroute <ipv4>"; exit 2;;
|