On 08 July 2021 09:21, Primoz Fiser wrote: > Proper machine resets via da9062/da9063 PMICs are very tricky as they > require special i2c atomic transfers when interrupts are not available > anymore. This is also a reason why both PMIC's restart handlers do not > use regmap but instead opt for i2c_smbus_write_byte_data() which does > i2c transfer in atomic manner. Under the hood, this function tries to > obtain i2c bus lock with call to i2c_adapter_trylock_bus() which will > return -EAGAIN (-11) if lock is not available. > > Since commit 982bb70517aef ("watchdog: reset last_hw_keepalive time at > start") occasional restart handler failures with "Failed to shutdown > (err = -11)" error messages were observed, indicating that some > process is holding the i2c bus lock. Investigation into the matter > uncovered that sometimes during reboot sequence watchdog ping is issued > late into poweroff/reboot phase which did not happen before mentioned > commit (usually the watchdog ping happened immediately as commit message > suggests). As of now, when watchdog ping usually happens late into > poweroff/reboot stage when interrupts are not available anymore, i2c bus > lock cannot be released anymore and pending restart handler in turn > fails. > > Thus, to prevent such late watchdog pings from happening ahead of > pending machine restart and consequently locking up the i2c bus, check > for system_state in watchdog ping handler and consequently do not send > pings anymore in case system_state > SYSTEM_RUNNING. > > Signed-off-by: Primoz Fiser <primoz.fiser@xxxxxxxxx> Reviewed-by: Adam Thomson <Adam.Thomson.Opensource@xxxxxxxxxxx>