• Primoz Fiser's avatar
    watchdog: da9062: da9063: prevent pings ahead of machine reset · 2f61b3a7
    Primoz Fiser authored
    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 982bb705 ("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: default avatarPrimoz Fiser <primoz.fiser@norik.com>
    Reviewed-by: default avatarGuenter Roeck <linux@roeck-us.net>
    Reviewed-by: default avatarAdam Thomson <Adam.Thomson.Opensource@diasemi.com>
    Link: https://lore.kernel.org/r/20210708082128.2832904-1-primoz.fiser@norik.comSigned-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
    Signed-off-by: default avatarWim Van Sebroeck <wim@linux-watchdog.org>
    2f61b3a7
da9062_wdt.c 7.07 KB