nuttx/arch
Marco Casaroli 446a7d6934 arch/arm/rp23xx: Clear the DMA callback before invoking it.
The completion handler did:

    dmach->callback(...);
    dmach->callback = NULL;     /* after the call */

so a callback that registers itself again -- which is the only way for a
driver to keep a channel running continuously -- has that registration
wiped the moment it returns.  The channel transfers one more block and
then goes deaf, with no error raised anywhere and nothing in the
registers to say why.  A PWM audio driver hit this and worked around it
by restarting from a thread instead, which put a millisecond of silence
into every buffer boundary.

Lift the callback and its argument out first and clear them before the
call.  One-shot behaviour is unchanged for every existing user, since
none of them re-register from inside the call; the difference is only
that one which does now survives.

Tested on a Pimoroni Pico Plus 2 W (pimoroni-pico-plus-2-w:nsh) with a
local test: a memory-to-memory transfer whose callback starts the next
one, 100 times.  Master gives 1 completion of 100; this change gives 100.
The existing users (SPI, I2S, CYW43439, WS2812) do not start a transfer
from inside the callback, so they do not change.

Assisted-by: Claude Code:claude-opus-5-5
Signed-off-by: Marco Casaroli <marco.casaroli@gmail.com>
2026-10-08 15:53:54 -03:00
..
arm arch/arm/rp23xx: Clear the DMA callback before invoking it. 2026-10-08 15:53:54 -03:00
arm64 arch/arm64: Report a recovered user fault as a segmentation fault. 2026-10-08 15:51:14 -03:00
avr arch, boards, cmake: Build C++ ELF modules without __cxa_atexit. 2026-09-04 15:44:24 -03:00
ceva arch/atomic: remove up_testset in spinlock 2026-09-08 08:58:54 +08:00
dummy
hc
mips arch/mips/pic32mz: fix the GPIO_EDGE_RISING pin encoding. 2026-10-08 09:54:07 -03:00
misoc arch, boards, cmake: Build C++ ELF modules without __cxa_atexit. 2026-09-04 15:44:24 -03:00
or1k arch, boards, cmake: Build C++ ELF modules without __cxa_atexit. 2026-09-04 15:44:24 -03:00
renesas
risc-v arch/risc-v: Recover from a user fault without a kernel stack. 2026-10-08 15:50:39 -03:00
sim arch/sim/sim_cansock.c: drain all pending TX frames per txavail 2026-10-08 12:13:38 +08:00
sparc arch/atomic: remove up_testset in spinlock 2026-09-08 08:58:54 +08:00
tricore arch/atomic: remove up_testset in spinlock 2026-09-08 08:58:54 +08:00
x86 arch/x86: Add -P to CPP to suppress linemarkers. 2026-09-17 16:21:59 +08:00
x86_64 arch/x86_64: Kill only the offending task on a user-space fault. 2026-10-08 15:51:41 -03:00
xtensa espressif: stop leaking a Wi-Fi interrupt handle on every esp_wifi_start() 2026-09-30 13:25:42 -03:00
z16
z80
CMakeLists.txt
Kconfig arch/arm64: Implement up_addrenv_fork() and provide POSIX fork(). 2026-10-08 09:35:07 -03:00