Skip to content

Commit e595307

Browse files
committed
docs: correct crash mechanism to the off-main-thread spiLock lockup
The previous edit, while right that the reconfigure is invoked on the main task (not the BLE callback thread), oversimplified the failure. The crash is cross-thread: the main-task setStandby()+SPI reprogram collides with the radio's off-main NotifiedWorkerThread over the shared non-recursive spiLock (FreeRTOS binary semaphore), locking it up and tripping the watchdog reboot (#11146; same spiLock hazard as #10705/#10728). Restore that in both the Axis 1 rationale and the hardware test-1 description. Does not change the serial-is-sufficient conclusion (the collision is transport-independent).
1 parent 4a76042 commit e595307

1 file changed

Lines changed: 13 additions & 7 deletions

File tree

docs/admin-config-save-gating.md

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,15 @@ does not opt out keeps the historical behavior. `AdminModule::saveChanges`
6666
| `set_fixed_position` / `remove_fixed_position` | **No** (was yes) | Rode `SEGMENT_CONFIG` only because `fixed_position` shares the Config file. |
6767
| `set_channel` | **Yes** | Real frequency-slot/PSK change ([`:1445`](../src/modules/AdminModule.cpp#L1445)). |
6868

69-
Why this matters beyond tidiness: the reconfigure is a live `setStandby()` + SPI reprogram run
70-
from the admin-message handler on the main task, while the radio is active - the exact
71-
sequence that crashed the WisMesh Tag on a favorite (#11146). Removing it for non-LoRa saves
72-
closes the rest of that crash class and
69+
Why this matters beyond tidiness: the reconfigure is a live `setStandby()` + SPI reprogram. It
70+
is _invoked_ from the admin-message handler on the main task (BLE `onWrite` only queues, so
71+
this is not the BLE callback thread), but the failure is cross-thread: the radio runs its own
72+
off-main worker (`RadioLibInterface`, a `NotifiedWorkerThread`) that also drives SPI under the
73+
shared, **non-recursive** `spiLock` (a FreeRTOS binary semaphore). The main-task reconfigure
74+
colliding with that worker over the lock / radio state locks the worker up, and the watchdog
75+
reboots the device - the crash seen on the WisMesh Tag favorite (#11146; same non-recursive
76+
`spiLock` hazard as #10705/#10728). Removing the reconfigure for non-LoRa saves closes the
77+
rest of that crash class and
7378
avoids a needless RX gap on the mesh radio.
7479

7580
---
@@ -211,9 +216,10 @@ use BLE only if you specifically want to reproduce the exact user-facing conditi
211216

212217
### 1. Radio-reload / crash validation (regression guard for `babeef08d`)
213218

214-
Confirms the non-LoRa config saves no longer run the live radio reconfigure - the
215-
`setStandby()` + SPI reprogram (on the main task, while the radio is active) that rebooted the
216-
WisMesh Tag on a favorite (#11146).
219+
Confirms the non-LoRa config saves no longer run the live radio reconfigure - the main-task
220+
`setStandby()` + SPI reprogram that collided with the radio's off-main worker thread over the
221+
non-recursive `spiLock` and locked it up, tripping the watchdog reboot on the WisMesh Tag
222+
favorite (#11146).
217223

218224
Perform each of: toggle Bluetooth `enabled`, change the WiFi PSK, rotate the security
219225
keypair, favorite/unfavorite a node.

0 commit comments

Comments
 (0)