diff -urN linux-2.4.5-rmk7-np2/drivers/char/sa1100_wdt.c linux-2.4.5-rmk7-np2-ssv1/drivers/char/sa1100_wdt.c --- linux-2.4.5-rmk7-np2/drivers/char/sa1100_wdt.c Sat Jul 13 19:40:18 2002 +++ linux-2.4.5-rmk7-np2-ssv1/drivers/char/sa1100_wdt.c Wed Oct 10 18:56:02 2001 @@ -1,5 +1,5 @@ /* - * Watchdog driver for the SA11x0 + * SA-1100 Watchdog 0.01: A Software Watchdog Device * * (c) Copyright 2000 Oleg Drokin * Based on SoftDog driver by Alan Cox @@ -31,7 +31,8 @@ #include #include #include -#include +// #include +#include #define TIMER_MARGIN 60 /* (secs) Default is 1 minute */ @@ -48,15 +49,22 @@ static int sa1100dog_open(struct inode *inode, struct file *file) { - if(test_and_set_bit(1,&sa1100wdt_users)) + int temp; + if(sa1100wdt_users) return -EBUSY; MOD_INC_USE_COUNT; +// printk("OSCR = %d, OSMR3 = %d OSSR = %d OIER = %d OWER = %d\n",OSCR, OSMR3, OSSR, OIER, OWER); /* Activate SA1100 Watchdog timer */ pre_margin=3686400 * sa1100_margin; OSMR3 = OSCR + pre_margin; - OSSR = OSSR_M3; - OWER = OWER_WME; - OIER |= OIER_E3; + OWER = 1; + temp = OIER; + temp |= 8; + OIER = temp; + +// printk("OSCR = %d, OSMR3 = %d OSSR = %d OIER = %d OWER = %d\n",OSCR, OSMR3, OSSR, OIER, OWER); + + sa1100wdt_users++; return 0; } @@ -67,10 +75,9 @@ * Lock it in if it's a module and we defined ...NOWAYOUT */ OSMR3 = OSCR + pre_margin; -#ifndef CONFIG_WATCHDOG_NOWAYOUT - OIER &= ~OIER_E3; -#endif - sa1100wdt_users = 0; + sa1100wdt_users--; + printk("Warning! Expect armageddon in %d seconds\n",sa1100_margin); +// printk("OSCR = %d, OSMR3 = %d OSSR = %d\n",OSCR, OSMR3, OSSR); MOD_DEC_USE_COUNT; return 0; } @@ -81,6 +88,7 @@ if (ppos != &file->f_pos) return -ESPIPE; +// printk("OSCR = %d, OSMR3 = %d OSSR = %d\n",OSCR, OSMR3, OSSR); /* Refresh OSMR3 timer. */ if(len) { OSMR3 = OSCR + pre_margin; @@ -92,22 +100,27 @@ static int sa1100dog_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { - static struct watchdog_info ident = { - identity: "SA1100 Watchdog", + static struct watchdog_info ident= + { + 0, + 0, + "SA1100 Watchdog" }; - - switch(cmd){ - default: - return -ENOIOCTLCMD; - case WDIOC_GETSUPPORT: - return copy_to_user((struct watchdog_info *)arg, &ident, sizeof(ident)); - case WDIOC_GETSTATUS: - return put_user(0,(int *)arg); - case WDIOC_GETBOOTSTATUS: - return put_user((RCSR & RCSR_WDR) ? WDIOF_CARDRESET : 0, (int *)arg); - case WDIOC_KEEPALIVE: - OSMR3 = OSCR + pre_margin; - return 0; + switch(cmd) + { + default: + return -ENOIOCTLCMD; + case WDIOC_GETSUPPORT: + if(copy_to_user((struct watchdog_info *)arg, &ident, sizeof(ident))) + return -EFAULT; + return 0; + case WDIOC_GETSTATUS: + case WDIOC_GETBOOTSTATUS: + return put_user(0,(int *)arg); + + case WDIOC_KEEPALIVE: + OSMR3 = OSCR + pre_margin; + return 0; } } @@ -136,7 +149,7 @@ if (ret) return ret; - printk("SA1100 Watchdog Timer: timer margin %d sec\n", sa1100_margin); + printk("SA1100 Watchdog Timer: 0.01, timer margin: %d sec\n", sa1100_margin); return 0; }