jerpelea opened a new pull request, #20340: URL: https://github.com/apache/nuttx/pull/20340
## Summary up_idlepm() put the domain back in PM_NORMAL with pm_changestate() but left its local oldstate holding whatever it was before sleeping, usually PM_STANDBY. The pm_checkstate() below then returned PM_STANDBY again, the "newstate != oldstate" test compared PM_STANDBY against a stale PM_STANDBY, and the whole block was skipped -- including the esp_pmstandby() call that is the only thing in here that ever sleeps. So after the very first wakeup the board reported PM_NORMAL essentially forever, and light-slept only when something else happened to perturb oldstate, such as an application taking and releasing a PM_IDLE wakelock around a transmission window. Measured on the esp32s3-xiao collar before this fix: 4.1 s of actual light sleep in 2 h of near-total idleness, a 1780:1 awake-to-asleep ratio. After it: ~13.5% of wall time asleep, thousands of sleeps, no storms. The dead "newstate = PM_NORMAL" assignment that used to sit here was presumably meant to be this; it is overwritten by pm_checkstate() a few lines below and never had any effect. Note that fixing this is what exposed two further bugs that had been dormant behind a board that never slept: the systimer double-count in esp_pmstandby(), and I2C transfers being cut in half by sleep. Both are fixed in their own commits. ## Impact RELEASE ## Testing CI -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
