| From c1f426a090f486a7a6940056e27373779aa1d504 Mon Sep 17 00:00:00 2001 |
| From: Rasmus Villemoes <linux@rasmusvillemoes.dk> |
| Date: Mon, 12 Aug 2019 15:13:56 +0200 |
| Subject: [PATCH] watchdog: imx2_wdt: fix min() calculation in |
| imx2_wdt_set_timeout |
| |
| commit 144783a80cd2cbc45c6ce17db649140b65f203dd upstream. |
| |
| Converting from ms to s requires dividing by 1000, not multiplying. So |
| this is currently taking the smaller of new_timeout and 1.28e8, |
| i.e. effectively new_timeout. |
| |
| The driver knows what it set max_hw_heartbeat_ms to, so use that |
| value instead of doing a division at run-time. |
| |
| FWIW, this can easily be tested by booting into a busybox shell and |
| doing "watchdog -t 5 -T 130 /dev/watchdog" - without this patch, the |
| watchdog fires after 130&127 == 2 seconds. |
| |
| Fixes: b07e228eee69 "watchdog: imx2_wdt: Fix set_timeout for big timeout values" |
| Cc: stable@vger.kernel.org # 5.2 plus anything the above got backported to |
| Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk> |
| Reviewed-by: Guenter Roeck <linux@roeck-us.net> |
| Link: https://lore.kernel.org/r/20190812131356.23039-1-linux@rasmusvillemoes.dk |
| Signed-off-by: Guenter Roeck <linux@roeck-us.net> |
| Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/watchdog/imx2_wdt.c b/drivers/watchdog/imx2_wdt.c |
| index a606005dd65f..ad8c61231f12 100644 |
| --- a/drivers/watchdog/imx2_wdt.c |
| +++ b/drivers/watchdog/imx2_wdt.c |
| @@ -55,7 +55,7 @@ |
| |
| #define IMX2_WDT_WMCR 0x08 /* Misc Register */ |
| |
| -#define IMX2_WDT_MAX_TIME 128 |
| +#define IMX2_WDT_MAX_TIME 128U |
| #define IMX2_WDT_DEFAULT_TIME 60 /* in seconds */ |
| |
| #define WDOG_SEC_TO_COUNT(s) ((s * 2 - 1) << 8) |
| @@ -180,7 +180,7 @@ static int imx2_wdt_set_timeout(struct watchdog_device *wdog, |
| { |
| unsigned int actual; |
| |
| - actual = min(new_timeout, wdog->max_hw_heartbeat_ms * 1000); |
| + actual = min(new_timeout, IMX2_WDT_MAX_TIME); |
| __imx2_wdt_set_timeout(wdog, actual); |
| wdog->timeout = new_timeout; |
| return 0; |
| -- |
| 2.7.4 |
| |