Skip to contentSkip to conversation

patch against linuxppc_2_4_devel: ppc405_wdt.c needs to be fixed

PATCH Matthias Fuchs 2 participants 3 messages Jun 4, 2003 Kbuild

lore
Share & tools
lore
#0 lore raw

Hi,

I noticed that the 405 watchdog driver's ioctl() for GETPERIOD and SETPERIOD are not working correctly. The ioctls pass the watchdog timer period in microseconds. The variable wdt_period stores the current period in seconds.

The attached patch fixes this behavior.

Matthias

usr/src/linuxppc_2_4_devel/drivers/char/ppc405_wdt.c renamed from char/ppc405_wdt.c +3 -3
@@ -190,8 +190,7 @@
 			}
 		case WDIOC_GETPERIOD:
 			/* return watchdog period (units = microseconds) */
-			period = wdt_period * MICROSECBASE;
-
+			period = (wdt_period / HZ) * MICROSECBASE;
 			if (copy_to_user((unsigned long *)arg, &period,
 			    sizeof(period))) {
 				return -EFAULT;
@@ -234,7 +233,8 @@
 			if (period == 0)
 				period = MAXONEHOUR * MICROSECBASE;
 
-			wdt_period = period / MICROSECBASE;
+			heartbeat_count(0) = (period / TENMSBASE) +
+				(period % TENMSBASE ? 1 : 0);
 			ppc405wd_update_timer();
 
 			break;
#1 lore raw

Dose the watchdog actually work ??

What happens when you get into a infinite loop when interrupts are turned off?

Quoted 25 lines · Matthias Fuchs

Hi,

I noticed that the 405 watchdog driver's ioctl() for GETPERIOD and SETPERIOD are not working correctly. The ioctls pass the watchdog timer period in microseconds. The variable wdt_period stores the current period in seconds.

The attached patch fixes this behavior.

Matthias
----

usr/src/linuxppc_2_4_devel/drivers/char/ppc405_wdt.c renamed from char/ppc405_wdt.c +1 -2
@@ -190,8 +190,7 @@
 			}
 		case WDIOC_GETPERIOD:
 			/* return watchdog period (units = microseconds) */
-			period = wdt_period * MICROSECBASE;
-
+			period = (wdt_period / HZ) * MICROSECBASE;
 			if (copy_to_user((unsigned long *)arg, &period,
 			    sizeof(period))) {
 				return -EFAULT;

usr/src/linuxppc_2_4_devel/drivers/char/ppc405_wdt.c line 240

Quoted 9 lines
usr/src/linuxppc_2_4_devel/drivers/char/ppc405_wdt.c renamed from char/ppc405_wdt.c +2 -1
@@ -234,7 +233,8 @@
 			if (period == 0)
 				period = MAXONEHOUR * MICROSECBASE;
 
-			wdt_period = period / MICROSECBASE;
+			heartbeat_count(0) = (period / TENMSBASE) +
+				(period % TENMSBASE ? 1 : 0);
 			ppc405wd_update_timer();
 
 			break;

--
Kenneth Johansson
Ericsson AB Tel: +46 8 719 70 20
Tellusborgsvägen 90 Fax: +46 8 719 29 45
126 25 Stockholm [email protected]

** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/

#2 lore raw

Hi Kenneth,

it seems that the 405 watchdog does not really work. It's something like a soft-watchdog actually. I did not test it in a loop with irqs off.

At least my patch corrected the ioctls and I get a working software watchdog. I wonder what happened to the 405 hardware watchdog support.

Matthias

Quoted 5 lines · Kenneth Johansson

Dose the watchdog actually work ??

What happens when you get into a infinite loop when interrupts are turned off?

** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/