Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fc61e83a authored by Wim Van Sebroeck's avatar Wim Van Sebroeck
Browse files

watchdog: Revert "iTCO_wdt: all versions count down twice"



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

Signed-off-by: default avatarWim Van Sebroeck <wim@iguana.be>
parent 0e271fd5
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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)
-------------------------------------------------
+12 −10
Original line number Diff line number Diff line
@@ -306,15 +306,16 @@ static int iTCO_wdt_ping(struct watchdog_device *wd_dev)

	iTCO_vendor_pre_keepalive(p->smi_res, wd_dev->timeout);

	/* Reload the timer by writing to the TCO Timer Counter register */
	if (p->iTCO_version >= 2) {
		outw(0x01, TCO_RLD(p));
	} 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 */

	/* Reload the timer by writing to the TCO Timer Counter register */
	if (p->iTCO_version >= 2)
		outw(0x01, TCO_RLD(p));
	else if (p->iTCO_version == 1)
		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);