diff mbox series

[v2] watchdog: iTCO_wdt: No need to stop the timer in probe

Message ID 20210921102900.61586-1-mika.westerberg@linux.intel.com (mailing list archive)
State Accepted
Headers show
Series [v2] watchdog: iTCO_wdt: No need to stop the timer in probe | expand

Commit Message

Mika Westerberg Sept. 21, 2021, 10:29 a.m. UTC
The watchdog core can handle pinging of the watchdog before userspace
opens the device. For this reason instead of stopping the timer, just
mark it as running and let the watchdog core take care of it.

Cc: Malin Jonsson <malin.jonsson@ericsson.com>
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
---
Changes from v1:

 - Only set the WDOG_HW_RUNNING flag.

 drivers/watchdog/iTCO_wdt.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

Comments

Guenter Roeck Sept. 21, 2021, 12:31 p.m. UTC | #1
On Tue, Sep 21, 2021 at 01:29:00PM +0300, Mika Westerberg wrote:
> The watchdog core can handle pinging of the watchdog before userspace
> opens the device. For this reason instead of stopping the timer, just
> mark it as running and let the watchdog core take care of it.
> 
> Cc: Malin Jonsson <malin.jonsson@ericsson.com>
> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>

Reviewed-by: Guenter Roeck <linux@roeck-us.net>

> ---
> Changes from v1:
> 
>  - Only set the WDOG_HW_RUNNING flag.
> 
>  drivers/watchdog/iTCO_wdt.c | 13 +++++++++++--
>  1 file changed, 11 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/watchdog/iTCO_wdt.c b/drivers/watchdog/iTCO_wdt.c
> index 643c6c2d0b72..a0e8ad3901a4 100644
> --- a/drivers/watchdog/iTCO_wdt.c
> +++ b/drivers/watchdog/iTCO_wdt.c
> @@ -430,6 +430,16 @@ static unsigned int iTCO_wdt_get_timeleft(struct watchdog_device *wd_dev)
>  	return time_left;
>  }
>  
> +static void iTCO_wdt_set_running(struct iTCO_wdt_private *p)
> +{
> +	u16 val;
> +
> +	/* Bit 11: TCO Timer Halt -> 0 = The TCO timer is * enabled */
> +	val = inw(TCO1_CNT(p));
> +	if (!(val & BIT(11)))
> +		set_bit(WDOG_HW_RUNNING, &p->wddev.status);
> +}
> +
>  /*
>   *	Kernel Interfaces
>   */
> @@ -572,8 +582,7 @@ static int iTCO_wdt_probe(struct platform_device *pdev)
>  	watchdog_set_drvdata(&p->wddev, p);
>  	platform_set_drvdata(pdev, p);
>  
> -	/* Make sure the watchdog is not running */
> -	iTCO_wdt_stop(&p->wddev);
> +	iTCO_wdt_set_running(p);
>  
>  	/* Check that the heartbeat value is within it's range;
>  	   if not reset to the default */
> -- 
> 2.33.0
>
Jan Kiszka July 5, 2023, 11:22 a.m. UTC | #2
On 21.09.21 12:29, Mika Westerberg wrote:
> The watchdog core can handle pinging of the watchdog before userspace
> opens the device. For this reason instead of stopping the timer, just
> mark it as running and let the watchdog core take care of it.
> 
> Cc: Malin Jonsson <malin.jonsson@ericsson.com>
> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
> ---
> Changes from v1:
> 
>  - Only set the WDOG_HW_RUNNING flag.
> 
>  drivers/watchdog/iTCO_wdt.c | 13 +++++++++++--
>  1 file changed, 11 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/watchdog/iTCO_wdt.c b/drivers/watchdog/iTCO_wdt.c
> index 643c6c2d0b72..a0e8ad3901a4 100644
> --- a/drivers/watchdog/iTCO_wdt.c
> +++ b/drivers/watchdog/iTCO_wdt.c
> @@ -430,6 +430,16 @@ static unsigned int iTCO_wdt_get_timeleft(struct watchdog_device *wd_dev)
>  	return time_left;
>  }
>  
> +static void iTCO_wdt_set_running(struct iTCO_wdt_private *p)
> +{
> +	u16 val;
> +
> +	/* Bit 11: TCO Timer Halt -> 0 = The TCO timer is * enabled */
> +	val = inw(TCO1_CNT(p));
> +	if (!(val & BIT(11)))
> +		set_bit(WDOG_HW_RUNNING, &p->wddev.status);
> +}
> +
>  /*
>   *	Kernel Interfaces
>   */
> @@ -572,8 +582,7 @@ static int iTCO_wdt_probe(struct platform_device *pdev)
>  	watchdog_set_drvdata(&p->wddev, p);
>  	platform_set_drvdata(pdev, p);
>  
> -	/* Make sure the watchdog is not running */
> -	iTCO_wdt_stop(&p->wddev);
> +	iTCO_wdt_set_running(p);
>  
>  	/* Check that the heartbeat value is within it's range;
>  	   if not reset to the default */

This turned out to be not just a cleanup, it's a fix for
watchdog.handle_boot_enabled=0 as well. The issue is subtle, but this
fix is critical when trying to establish monitoring for unattended early
boot (OTA update scenarios). Can we still get this into stable trees,
along with [1] then? I've tested these two over 5.10 so far, can look
into older ones as well.

Jan

[1]
https://patchwork.kernel.org/project/linux-watchdog/patch/20221028062750.45451-1-mika.westerberg@linux.intel.com/
Jan Kiszka July 11, 2023, 7:09 a.m. UTC | #3
On 05.07.23 13:22, Jan Kiszka wrote:
> On 21.09.21 12:29, Mika Westerberg wrote:
>> The watchdog core can handle pinging of the watchdog before userspace
>> opens the device. For this reason instead of stopping the timer, just
>> mark it as running and let the watchdog core take care of it.
>>
>> Cc: Malin Jonsson <malin.jonsson@ericsson.com>
>> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
>> ---
>> Changes from v1:
>>
>>  - Only set the WDOG_HW_RUNNING flag.
>>
>>  drivers/watchdog/iTCO_wdt.c | 13 +++++++++++--
>>  1 file changed, 11 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/watchdog/iTCO_wdt.c b/drivers/watchdog/iTCO_wdt.c
>> index 643c6c2d0b72..a0e8ad3901a4 100644
>> --- a/drivers/watchdog/iTCO_wdt.c
>> +++ b/drivers/watchdog/iTCO_wdt.c
>> @@ -430,6 +430,16 @@ static unsigned int iTCO_wdt_get_timeleft(struct watchdog_device *wd_dev)
>>  	return time_left;
>>  }
>>  
>> +static void iTCO_wdt_set_running(struct iTCO_wdt_private *p)
>> +{
>> +	u16 val;
>> +
>> +	/* Bit 11: TCO Timer Halt -> 0 = The TCO timer is * enabled */
>> +	val = inw(TCO1_CNT(p));
>> +	if (!(val & BIT(11)))
>> +		set_bit(WDOG_HW_RUNNING, &p->wddev.status);
>> +}
>> +
>>  /*
>>   *	Kernel Interfaces
>>   */
>> @@ -572,8 +582,7 @@ static int iTCO_wdt_probe(struct platform_device *pdev)
>>  	watchdog_set_drvdata(&p->wddev, p);
>>  	platform_set_drvdata(pdev, p);
>>  
>> -	/* Make sure the watchdog is not running */
>> -	iTCO_wdt_stop(&p->wddev);
>> +	iTCO_wdt_set_running(p);
>>  
>>  	/* Check that the heartbeat value is within it's range;
>>  	   if not reset to the default */
> 
> This turned out to be not just a cleanup, it's a fix for
> watchdog.handle_boot_enabled=0 as well. The issue is subtle, but this
> fix is critical when trying to establish monitoring for unattended early
> boot (OTA update scenarios). Can we still get this into stable trees,
> along with [1] then? I've tested these two over 5.10 so far, can look
> into older ones as well.
> 
> Jan
> 
> [1]
> https://patchwork.kernel.org/project/linux-watchdog/patch/20221028062750.45451-1-mika.westerberg@linux.intel.com/
> 

Any opinions about this?

Jan
diff mbox series

Patch

diff --git a/drivers/watchdog/iTCO_wdt.c b/drivers/watchdog/iTCO_wdt.c
index 643c6c2d0b72..a0e8ad3901a4 100644
--- a/drivers/watchdog/iTCO_wdt.c
+++ b/drivers/watchdog/iTCO_wdt.c
@@ -430,6 +430,16 @@  static unsigned int iTCO_wdt_get_timeleft(struct watchdog_device *wd_dev)
 	return time_left;
 }
 
+static void iTCO_wdt_set_running(struct iTCO_wdt_private *p)
+{
+	u16 val;
+
+	/* Bit 11: TCO Timer Halt -> 0 = The TCO timer is * enabled */
+	val = inw(TCO1_CNT(p));
+	if (!(val & BIT(11)))
+		set_bit(WDOG_HW_RUNNING, &p->wddev.status);
+}
+
 /*
  *	Kernel Interfaces
  */
@@ -572,8 +582,7 @@  static int iTCO_wdt_probe(struct platform_device *pdev)
 	watchdog_set_drvdata(&p->wddev, p);
 	platform_set_drvdata(pdev, p);
 
-	/* Make sure the watchdog is not running */
-	iTCO_wdt_stop(&p->wddev);
+	iTCO_wdt_set_running(p);
 
 	/* Check that the heartbeat value is within it's range;
 	   if not reset to the default */