Hi,
Thanks for the beta firmware 4.7.0-0502 you shipped on 2026-07-24 as a proposed fix for the RCP reset / stale EID cache issue I described in my previous post. I installed it the same day and have been monitoring for ~70 hours.
Reporting back with results.
Summary: the disconnection bug still occurs, and reset frequency has increased significantly.
What the beta changed vs. what it did not
The beta updated only the OTBR host side (ot-br-posix/2024-06-03, newer than the previous build). The Silicon Labs EFR32 RCP firmware is unchanged:
# ot-ctl version
ot-br-posix/2024-06-03; POSIX; Feb 16 2022 20:29:10
# ot-ctl rcp version
SL-OPENTHREAD/2.5.1.0_GitHub-1fceb225b-v2024.242.09761-b994a40; EFR32; Aug 29 2024
RCP resets observed since installing the beta (~70 hours)
┌─────┬───────────────────┬─────────────────────┬────────────────────────┐
│ # │ Timestamp (local) │ RCP uptime at reset │ Delta from previous │
├─────┼───────────────────┼─────────────────────┼────────────────────────┤
│ 1 │ Jul 24 16:55:18 │ 00:01:25 │ (first boot, expected) │
├─────┼───────────────────┼─────────────────────┼────────────────────────┤
│ 2 │ Jul 24 17:24:57 │ 00:31:04 │ +29 min │
├─────┼───────────────────┼─────────────────────┼────────────────────────┤
│ 3 │ Jul 24 17:29:08 │ 00:35:15 │ +4 min │
├─────┼───────────────────┼─────────────────────┼────────────────────────┤
│ 4 │ Jul 24 17:30:54 │ 00:37:01 │ +2 min │
├─────┼───────────────────┼─────────────────────┼────────────────────────┤
│ 5 │ Jul 26 01:06:45 │ 1d.08:12:52 │ +32 h │
├─────┼───────────────────┼─────────────────────┼────────────────────────┤
│ 6 │ Jul 26 14:58:33 │ 1d.22:04:40 │ +14 h │
├─────┼───────────────────┼─────────────────────┼────────────────────────┤
│ 7 │ Jul 27 03:23:12 │ 2d.10:29:18 │ +12 h │
├─────┼───────────────────┼─────────────────────┼────────────────────────┤
│ 8 │ Jul 27 14:08:02 │ 2d.21:14:07 │ +11 h │
└─────┴───────────────────┴─────────────────────┴────────────────────────┘
Seven spontaneous resets in ~70 hours, averaging one every ~10 hours. Before the beta, the same unit had ~49 days between resets. The beta appears to have made the situation worse, not better.
All reset log entries show the same pattern:
[W] P-RadioSpinel-: RCP failure detected
[C] P-RadioSpinel-: RCP => [C] Platform------: Reset info: 0x3 (EXT)
[C] P-RadioSpinel-: RCP => [C] Platform------: Extended Reset info: 0x301 (PIN)
Each reset produces the exact issue I described previously: the EID cache in the OTBR remains stale, and Thread devices become unreachable via IPv6 until either they spontaneously re-attach or the affected router is power-cycled.
Which of the two known reset paths is firing
- Path 1 -
gl-otbr-mgmt periodic watchdog reset (keep_refresh_enabled): NOT this. I still have otbr.otbr.keep_refresh_enabled='0' set via UCI (workaround from my previous post). Confirmed still effective on the beta.
- Path 2 -
otbr-agent on radio tx timeout: this is what's firing. otbr-agent calls /usr/bin/gl-ot-rcp-reset directly on radio unresponsiveness, independent of keep_refresh_enabled. All 8 resets are consistent with this path (PIN reset with RCP failure detected warning immediately before).
Configuration verification (current state)
To rule out anything unusual on my side, here is the exact current configuration:
# uci show otbr (relevant keys)
otbr.otbr.channel='26'
otbr.otbr.keep_refresh_enabled='0' ← workaround from previous post, still active
otbr.otbr.txpower='10' ← reduced from 20 dBm as further mitigation
otbr.channel_monitor.disabled='1'
# crontab -l
(empty — no user scripts, no watchdog, nothing custom firing on the device)
# ot-ctl childsupervision interval
129
# ot-ctl childsupervision checktimeout
190
The 8 resets happened with this exact configuration in place. txpower='10' (about 25% of default power) does not prevent the failure, so this is clearly not RF congestion.
New diagnostic finding (may inform a lighter fix)
When the EID cache is stale post-reset, power-cycling only the affected Thread router is sufficient to restore forwarding, a full GL-S200 reboot is not required. After reset #8, one of the Thread routers in my mesh became unreachable via IPv6 from the host running my Matter controller. Power-cycling that single device restored its EID entry within ~30 s and the Matter controller re-established its CASE session without any GL-S200 intervention.
Diagnostic detail from ot-ctl eidcache before and after: the entry for that router was still present in the cache with canEvict=1, but IPv6 forwarding through it was not working. The re-attach cleared the problem.
This suggests a lighter fix on your side is possible: on RCP reset recovery, otbr-agent could proactively re-resolve address mappings for known routers instead of leaving cache entries in a marked-evictable state that continues to be selected for forwarding.
Proposed fixes for the GL-iNet development team
1. Update the EFR32 RCP firmware. This is the highest-impact item. The current RCP firmware on my unit is SL-OPENTHREAD/2.5.1.0_v2024.242.09761 from August 29 2024, 11 months old. Silicon Labs has published multiple releases since then that address radio state machine bugs. The failure mode (radio tx timeout on an otherwise idle RCP with TxErrCca=0) points squarely at the RCP layer, which the beta did not touch. Even bringing OpenThread to a current release would likely close many of these events.
2. Attempt a software reset before escalating to hardware PIN reset. When otbr-agent detects RCP failure detected, it goes straight to GPIO pin 2 (full hardware reset). A spinel CMD_RESET (software reset) is significantly less disruptive, the Thread network state on the RCP side is discarded but the SPI/UART interface stays up, allowing much faster re-sync. Try software reset first; escalate to PIN reset only if the RCP is unresponsive to spinel commands.
3. Proactively refresh EID cache entries after RCP reset recovery. After any RCP reset, the OTBR should not leave cache entries in canEvict=1 state for routers that are still present in the neighbor table. Iterate over known SRP-registered hosts and re-run address resolution, so that the first packet after recovery doesn't hit a stale cache entry that appears valid but forwards to a broken next hop.
4. Temporarily extend child supervision timeout during the recovery window. When gl-otbr-mgmt or otbr-agent initiates an RCP reset, it knows the mesh is rebuilding. It should raise childsupervision checktimeout from the current 190 s to 600–900 s for the duration of the reconnection window, then restore it. This gives sleepy end devices enough time to poll in and rejoin without being permanently declared offline. (Repeated from my previous post, still relevant.)
5. Log the trigger condition and emit a ubus event on RCP reset. Currently there is no log entry explaining why otbr-agent decided to reset, only that it happened. A message such as "spinel timeout after N retries on op X" would make each event interpretable. Additionally, a ubus event like otbr.rcp_reset { "reason": "...", "phase": "before" | "after" } would allow Matter controllers and other consumers to pause and resume cleanly, instead of silently losing session state.
6. Rate-limit or backpressure repeated resets. In my log, resets #2, #3, #4 fired within 6 minutes of each other. If the RCP is being reset three times in that window, something is fundamentally wrong and further resets are unlikely to help. otbr-agent should throttle the reset rate (e.g. exponential backoff) and produce a diagnostic dump instead of an endless reset loop.
Happy to run additional diagnostics or test another beta. Full logread excerpts, ot-ctl dumps, and any other data on request.
Thanks