v3.8.3 — status-LED dimming fix + watchdog post-mortem v3 (#99, #120)
Kernel-only release: status-LED dimming fix and watchdog post-mortem v3 (issue #99 instrumentation). Bootloader, rootfs and userdata payloads are unchanged — existing installs can upgrade with a kernel-only reflash.
Status LED flickered at 31 Hz instead of dimming (issue #120)
Since the Linux 4.8 timer-wheel rework the kernel rounds every timer expiry up by one jiffy so a timer can never fire early: the leds-gpio-pwm per-jiffy re-arm at jiffies + 1 actually fired every 2 ticks, doubling the PWM step to 8 ms and halving the PWM frequency to the 31 Hz flicker scoped in #120. Re-arming at jiffies (expire ASAP — bucketed at the next tick by construction) restores the designed 62.5 Hz at all duty levels (bench: 31.5 → 62.5 Hz at brightness 60/128/192). The sysfs scale stays 0–255; the 4-level duty quantization is now documented in the driver header.
Watchdog v1.4 — panic-path arm race fixed, panic record v3 (issue #99)
- v1.3 regression fixed — candidate lists were silently lost. v3.8.1 armed the recovery reset before the best-effort wheel walks with a single
WDTCNR=0write, assuming a ~1.31 s grace window. With the userspace kicker active the up-counter sits far above the OVSEL=0 threshold and the chip resets instantly — every v3.8.1 capture came backtimers=[none](confirmed on the bench with DRAM breadcrumbs, then in the field by frtz13's capture). The arm is now two writes: clear the counter while the watchdog is halted, then enable. delayed_workcandidates resolved to their work function — e.g.neigh_managed_workinstead of four indistinguishabledelayed_work_timer_fnwrappers (the blind spot in the first #99 record-v2 field capture).- Wheel backlog captured. New record fields
overdue=(jiffies the earliest queued timer is past expiry) andpending=(total queued timers) discriminate the two storm shapes behind #99: a wheel that never catches up (death spiral — large overdue) vs a softirq re-raised over a caught-up wheel (overdue ≈ 0). Bench:overdue=0jon a healthy crash,overdue=6269j(25.1 s of wheel starvation) under an injected soft-lockup.
Upgrading
Full install (recommended for new users):
./flash_install_rtl8196e.sh <gateway-ip>
Existing v3.8.x installs (including the #99 soak boxes) only need the kernel partition — config, Thread dataset and SSH keys untouched:
./3-Main-SoC-Realtek-RTL8196E/flash_remote.sh -y kernel <gateway-ip>
After upgrading, re-arm the panic capture: rm -f /userdata/panic/history (note: after a kernel-only reflash the login banner still shows the previous version — cosmetic only).