Re: [PATCH] watchdog cleanups/bugfixes

From: Philipp Rumpf (prumpf@parcelfarce.linux.theplanet.co.uk)
Date: Sat Sep 30 2000 - 09:27:07 EST


On Sat, Sep 30, 2000 at 03:26:53AM +0100, Philipp Rumpf wrote:
> This patch (against 2.4.0-test9-pre7) makes all watchdog drivers use
> module_init, rather than explicit init calls; as a side-effect, it fixes a
> presumed bug that would cause the softdog driver to be used if i810-tco and
> softdog were enabled.

The first patch actually broke softdog and mixcomwd when built as modules (no
return in the module_init functions. blush.) This should fix it:

diff -ur linux/drivers/char/Config.in linux-prumpf/drivers/char/Config.in
--- linux/drivers/char/Config.in Fri Sep 29 16:48:37 2000
+++ linux-prumpf/drivers/char/Config.in Fri Sep 29 17:00:34 2000
@@ -122,6 +122,7 @@
 bool 'Watchdog Timer Support' CONFIG_WATCHDOG
 if [ "$CONFIG_WATCHDOG" != "n" ]; then
    bool ' Disable watchdog shutdown on close' CONFIG_WATCHDOG_NOWAYOUT
+ tristate ' Software Watchdog' CONFIG_SOFT_WATCHDOG
    tristate ' WDT Watchdog timer' CONFIG_WDT
    tristate ' WDT PCI Watchdog timer' CONFIG_WDTPCI
    if [ "$CONFIG_WDT" != "n" ]; then
@@ -130,7 +131,6 @@
          bool ' Fan Tachometer' CONFIG_WDT_501_FAN
       fi
    fi
- tristate ' Software Watchdog' CONFIG_SOFT_WATCHDOG
    tristate ' Berkshire Products PC Watchdog' CONFIG_PCWATCHDOG
    tristate ' Acquire SBC Watchdog Timer' CONFIG_ACQUIRE_WDT
    tristate ' SBC-60XX Watchdog Timer' CONFIG_60XX_WDT
diff -ur linux/drivers/char/Makefile linux-prumpf/drivers/char/Makefile
--- linux/drivers/char/Makefile Fri Sep 29 16:48:37 2000
+++ linux-prumpf/drivers/char/Makefile Fri Sep 29 17:00:34 2000
@@ -160,27 +160,16 @@
 obj-$(CONFIG_APPLICOM) += applicom.o
 obj-$(CONFIG_MS_BUSMOUSE) += msbusmouse.o
 obj-$(CONFIG_82C710_MOUSE) += qpmouse.o
-obj-$(CONFIG_SOFT_WATCHDOG) += softdog.o
-obj-$(CONFIG_PCWATCHDOG) += pcwd.o
-obj-$(CONFIG_ACQUIRE_WDT) += acquirewdt.o
-obj-$(CONFIG_MIXCOMWD) += mixcomwd.o
-obj-$(CONFIG_60XX_WDT) += sbc60xxwdt.o
 obj-$(CONFIG_AMIGAMOUSE) += amigamouse.o
 obj-$(CONFIG_ATARIMOUSE) += atarimouse.o
 obj-$(CONFIG_ADBMOUSE) += adbmouse.o
 obj-$(CONFIG_PC110_PAD) += pc110pad.o
-obj-$(CONFIG_WDT) += wdt.o
-obj-$(CONFIG_WDTPCI) += wdt_pci.o
 obj-$(CONFIG_RTC) += rtc.o
 obj-$(CONFIG_EFI_RTC) += efirtc.o
 ifeq ($(CONFIG_PPC),)
   obj-$(CONFIG_NVRAM) += nvram.o
 endif
 obj-$(CONFIG_TOSHIBA) += toshiba.o
-
-obj-$(CONFIG_21285_WATCHDOG) += wdt285.o
-obj-$(CONFIG_977_WATCHDOG) += wdt977.o
-obj-$(CONFIG_I810_TCO) += i810-tco.o
 obj-$(CONFIG_DS1620) += ds1620.o
 obj-$(CONFIG_INTEL_RNG) += i810_rng.o
 
@@ -230,6 +219,23 @@
     MOD_SUB_DIRS += agp
   endif
 endif
+
+# Only one watchdog can succeed. We probe the hardware watchdog
+# drivers first, then the softdog driver. This means if your hardware
+# watchdog dies or is 'borrowed' for some reason the software watchdog
+# still gives you some cover.
+
+obj-$(CONFIG_PCWATCHDOG) += pcwd.o
+obj-$(CONFIG_ACQUIRE_WDT) += acquirewdt.o
+obj-$(CONFIG_MIXCOMWD) += mixcomwd.o
+obj-$(CONFIG_60XX_WDT) += sbc60xxwdt.o
+obj-$(CONFIG_WDT) += wdt.o
+obj-$(CONFIG_WDTPCI) += wdt_pci.o
+obj-$(CONFIG_21285_WATCHDOG) += wdt285.o
+obj-$(CONFIG_977_WATCHDOG) += wdt977.o
+obj-$(CONFIG_I810_TCO) += i810-tco.o
+obj-$(CONFIG_SOFT_WATCHDOG) += softdog.o
+
 
 # Extract lists of the multi-part drivers.
 # The 'int-*' lists are the intermediate files used to build the multi's.
diff -ur linux/drivers/char/acquirewdt.c linux-prumpf/drivers/char/acquirewdt.c
--- linux/drivers/char/acquirewdt.c Sun Jul 23 16:44:36 2000
+++ linux-prumpf/drivers/char/acquirewdt.c Fri Sep 29 17:00:34 2000
@@ -204,21 +204,7 @@
         0
 };
 
-#ifdef MODULE
-
-#define acq_init init_module
-
-void cleanup_module(void)
-{
- misc_deregister(&acq_miscdev);
- unregister_reboot_notifier(&acq_notifier);
- release_region(WDT_STOP,1);
- release_region(WDT_START,1);
-}
-
-#endif
-
-int __init acq_init(void)
+static int __init acq_init(void)
 {
         printk("WDT driver for Acquire single board computer initialising.\n");
 
@@ -229,4 +215,14 @@
         register_reboot_notifier(&acq_notifier);
         return 0;
 }
+
+static void __exit acq_exit(void)
+{
+ misc_deregister(&acq_miscdev);
+ unregister_reboot_notifier(&acq_notifier);
+ release_region(WDT_STOP,1);
+ release_region(WDT_START,1);
+}
 
+module_init(acq_init);
+module_exit(acq_exit);
diff -ur linux/drivers/char/i810-tco.c linux-prumpf/drivers/char/i810-tco.c
--- linux/drivers/char/i810-tco.c Tue Sep 26 14:30:46 2000
+++ linux-prumpf/drivers/char/i810-tco.c Fri Sep 29 17:00:34 2000
@@ -301,10 +301,9 @@
         tco_timer_settimer ((unsigned char) i810_margin);
         tco_timer_reload ();
 
- /* FIXME: no floating point math */
         printk (KERN_INFO
                 "i810 TCO timer: V0.02, timer margin: %d sec (0x%04x)\n",
- (int) (i810_margin * 0.6), TCOBASE);
+ (int) (i810_margin * 6 / 10), TCOBASE);
         return 0;
 }
 
diff -ur linux/drivers/char/misc.c linux-prumpf/drivers/char/misc.c
--- linux/drivers/char/misc.c Fri Sep 29 16:48:38 2000
+++ linux-prumpf/drivers/char/misc.c Fri Sep 29 17:00:34 2000
@@ -70,8 +70,6 @@
 extern void gfx_register(void);
 #endif
 extern void streamable_init(void);
-extern void watchdog_init(void);
-extern void pcwatchdog_init(void);
 extern int rtc_sun_init(void); /* Combines MK48T02 and MK48T08 */
 extern int rtc_DP8570A_init(void);
 extern int rtc_MK48T08_init(void);
@@ -254,18 +252,6 @@
 #endif
 #ifdef CONFIG_PC110_PAD
         pc110pad_init();
-#endif
-/*
- * Only one watchdog can succeed. We probe the pcwatchdog first,
- * then the wdt cards and finally the software watchdog which always
- * works. This means if your hardware watchdog dies or is 'borrowed'
- * for some reason the software watchdog still gives you some cover.
- */
-#ifdef CONFIG_PCWATCHDOG
- pcwatchdog_init();
-#endif
-#ifdef CONFIG_SOFT_WATCHDOG
- watchdog_init();
 #endif
 #ifdef CONFIG_MVME16x
         rtc_MK48T08_init();
diff -ur linux/drivers/char/mixcomwd.c linux-prumpf/drivers/char/mixcomwd.c
--- linux/drivers/char/mixcomwd.c Sun Jul 23 16:44:37 2000
+++ linux-prumpf/drivers/char/mixcomwd.c Sat Sep 30 06:57:35 2000
@@ -216,9 +216,10 @@
          return 1;
  }
  
-void __init mixcomwd_init(void)
+static int __init mixcomwd_init(void)
 {
         int i;
+ int ret;
         int found=0;
 
         for (i = 0; !found && mixcomwd_ioports[i] != 0; i++) {
@@ -238,23 +239,21 @@
         
         if (!found) {
                 printk("mixcomwd: No card detected, or port not available.\n");
- return;
+ return -ENODEV;
         }
 
         request_region(watchdog_port,1,"MixCOM watchdog");
                 
- misc_register(&mixcomwd_miscdev);
+ ret = misc_register(&mixcomwd_miscdev);
+ if (ret)
+ return ret;
+
         printk(KERN_INFO "MixCOM watchdog driver v%s, watchdog port at 0x%3x\n",VERSION,watchdog_port);
-}
 
-#ifdef MODULE
-int init_module(void)
-{
- mixcomwd_init();
         return 0;
-}
+}
 
-void cleanup_module(void)
+static void __exit mixcomwd_exit(void)
 {
 #ifndef CONFIG_WATCHDOG_NOWAYOUT
         if(mixcomwd_timer_alive) {
@@ -267,4 +266,6 @@
         release_region(watchdog_port,1);
         misc_deregister(&mixcomwd_miscdev);
 }
-#endif
+
+module_init(mixcomwd_init);
+module_exit(mixcomwd_exit);
diff -ur linux/drivers/char/pcwd.c linux-prumpf/drivers/char/pcwd.c
--- linux/drivers/char/pcwd.c Sun Jul 23 16:44:37 2000
+++ linux-prumpf/drivers/char/pcwd.c Fri Sep 29 19:10:23 2000
@@ -564,11 +564,7 @@
         &pcwd_fops
 };
  
-#ifdef MODULE
-int init_module(void)
-#else
-int __init pcwatchdog_init(void)
-#endif
+static int __init pcwatchdog_init(void)
 {
         int i, found = 0;
         spin_lock_init(&io_lock);
@@ -644,8 +640,7 @@
         return 0;
 }
 
-#ifdef MODULE
-void cleanup_module(void)
+static void __exit pcwatchdog_exit(void)
 {
         /* Disable the board */
         if (revision == PCWD_REVISION_C) {
@@ -658,4 +653,6 @@
 
         release_region(current_readport, (revision == PCWD_REVISION_A) ? 2 : 4);
 }
-#endif
+
+module_init(pcwatchdog_init);
+module_exit(pcwatchdog_exit);
diff -ur linux/drivers/char/sbc60xxwdt.c linux-prumpf/drivers/char/sbc60xxwdt.c
--- linux/drivers/char/sbc60xxwdt.c Sun Jul 23 16:44:37 2000
+++ linux-prumpf/drivers/char/sbc60xxwdt.c Fri Sep 29 19:10:03 2000
@@ -338,4 +338,4 @@
 }
 
 module_init(sbc60xxwdt_init);
-module_exit(sbc60xxwdt_unload)
+module_exit(sbc60xxwdt_unload);
diff -ur linux/drivers/char/softdog.c linux-prumpf/drivers/char/softdog.c
--- linux/drivers/char/softdog.c Sun Jul 23 16:44:37 2000
+++ linux-prumpf/drivers/char/softdog.c Sat Sep 30 06:51:32 2000
@@ -53,7 +53,11 @@
  * Our timer
  */
  
-struct timer_list watchdog_ticktock;
+static void watchdog_fire(unsigned long);
+
+static struct timer_list watchdog_ticktock = {
+ function: watchdog_fire,
+};
 static int timer_alive = 0;
 
 
@@ -164,23 +168,24 @@
         &softdog_fops
 };
 
-void __init watchdog_init(void)
+static int __init watchdog_init(void)
 {
- misc_register(&softdog_miscdev);
- init_timer(&watchdog_ticktock);
- watchdog_ticktock.function=watchdog_fire;
+ int ret;
+
+ ret = misc_register(&softdog_miscdev);
+
+ if (ret)
+ return ret;
+
         printk("Software Watchdog Timer: 0.05, timer margin: %d sec\n", soft_margin);
-}
 
-#ifdef MODULE
-int init_module(void)
-{
- watchdog_init();
         return 0;
-}
+}
 
-void cleanup_module(void)
+static void __exit watchdog_exit(void)
 {
         misc_deregister(&softdog_miscdev);
 }
-#endif
+
+module_init(watchdog_init);
+module_exit(watchdog_exit);
diff -ur linux/drivers/char/wdt.c linux-prumpf/drivers/char/wdt.c
--- linux/drivers/char/wdt.c Fri Sep 29 16:48:38 2000
+++ linux-prumpf/drivers/char/wdt.c Fri Sep 29 19:12:05 2000
@@ -459,10 +459,6 @@
         0
 };
 
-#ifdef MODULE
-
-#define wdt_init init_module
-
 /**
  * cleanup_module:
  *
@@ -473,7 +469,7 @@
  * module in 60 seconds or reboot.
  */
  
-void cleanup_module(void)
+static void __exit wdt_exit(void)
 {
         misc_deregister(&wdt_miscdev);
 #ifdef CONFIG_WDT_501
@@ -484,8 +480,6 @@
         free_irq(irq, NULL);
 }
 
-#endif
-
 /**
  * wdt_init:
  *
@@ -494,7 +488,7 @@
  * The open() function will actually kick the board off.
  */
  
-int __init wdt_init(void)
+static int __init wdt_init(void)
 {
         int ret;
 
@@ -545,4 +539,7 @@
         misc_deregister(&wdt_miscdev);
         goto out;
 }
+
+module_init(wdt_init);
+module_exit(wdt_exit);
 
diff -ur linux/drivers/char/wdt_pci.c linux-prumpf/drivers/char/wdt_pci.c
--- linux/drivers/char/wdt_pci.c Fri Sep 29 16:48:38 2000
+++ linux-prumpf/drivers/char/wdt_pci.c Fri Sep 29 17:00:35 2000
@@ -274,7 +274,7 @@
  * @ptr: offset (no seek allowed)
  *
  * Read reports the temperature in degrees Fahrenheit. The API is in
- * farenheit. It was designed by an imperial measurement luddite.
+ * fahrenheit. It was designed by an imperial measurement luddite.
  */
  
 static ssize_t wdtpci_read(struct file *file, char *buf, size_t count, loff_t *ptr)

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sat Sep 30 2000 - 21:00:27 EST