]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
watchdog: Revert "iTCO_wdt: all versions count down twice"
authorWim Van Sebroeck <wim@iguana.be>
Sat, 9 Sep 2017 15:41:24 +0000 (17:41 +0200)
committerSeth Forshee <seth.forshee@canonical.com>
Thu, 19 Oct 2017 14:49:24 +0000 (09:49 -0500)
BugLink: http://bugs.launchpad.net/bugs/1724668
commit fc61e83a29308601e6e8a0759e24fc8fe2122692 upstream.

This reverts commit 1fccb73011ea8a5fa0c6d357c33fa29c695139ea.
Reported as Bug 196509 - iTCO_wdt regression reboot before timeout expire

Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
Cc: Martin Wilck <mwilck@suse.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
Documentation/watchdog/watchdog-parameters.txt
drivers/watchdog/iTCO_wdt.c

index b3526365ea8e340143edd1670bc9d89e3944152d..6f9d7b4189170f25143d852d9cf2699af211f997 100644 (file)
@@ -117,7 +117,7 @@ nowayout: Watchdog cannot be stopped once started
 -------------------------------------------------
 iTCO_wdt:
 heartbeat: Watchdog heartbeat in seconds.
-       (5<=heartbeat<=74 (TCO v1) or 1226 (TCO v2), default=30)
+       (2<heartbeat<39 (TCO v1) or 613 (TCO v2), default=30)
 nowayout: Watchdog cannot be stopped once started
        (default=kernel config parameter)
 -------------------------------------------------
index c4f65873bfa453b1385d2a1371ba10c741df2be9..347f0389b0899d4183021254203e0a0938600267 100644 (file)
@@ -306,15 +306,16 @@ static int iTCO_wdt_ping(struct watchdog_device *wd_dev)
 
        iTCO_vendor_pre_keepalive(p->smi_res, wd_dev->timeout);
 
-       /* Reset the timeout status bit so that the timer
-        * needs to count down twice again before rebooting */
-       outw(0x0008, TCO1_STS(p));      /* write 1 to clear bit */
-
        /* Reload the timer by writing to the TCO Timer Counter register */
-       if (p->iTCO_version >= 2)
+       if (p->iTCO_version >= 2) {
                outw(0x01, TCO_RLD(p));
-       else if (p->iTCO_version == 1)
+       } else if (p->iTCO_version == 1) {
+               /* Reset the timeout status bit so that the timer
+                * needs to count down twice again before rebooting */
+               outw(0x0008, TCO1_STS(p));      /* write 1 to clear bit */
+
                outb(0x01, TCO_RLD(p));
+       }
 
        spin_unlock(&p->io_lock);
        return 0;
@@ -327,8 +328,11 @@ static int iTCO_wdt_set_timeout(struct watchdog_device *wd_dev, unsigned int t)
        unsigned char val8;
        unsigned int tmrval;
 
-       /* The timer counts down twice before rebooting */
-       tmrval = seconds_to_ticks(p, t) / 2;
+       tmrval = seconds_to_ticks(p, t);
+
+       /* For TCO v1 the timer counts down twice before rebooting */
+       if (p->iTCO_version == 1)
+               tmrval /= 2;
 
        /* from the specs: */
        /* "Values of 0h-3h are ignored and should not be attempted" */
@@ -381,8 +385,6 @@ static unsigned int iTCO_wdt_get_timeleft(struct watchdog_device *wd_dev)
                spin_lock(&p->io_lock);
                val16 = inw(TCO_RLD(p));
                val16 &= 0x3ff;
-               if (!(inw(TCO1_STS(p)) & 0x0008))
-                       val16 += (inw(TCOv2_TMR(p)) & 0x3ff);
                spin_unlock(&p->io_lock);
 
                time_left = ticks_to_seconds(p, val16);