diff options
Diffstat (limited to 'ztdynamic.c')
-rwxr-xr-x | ztdynamic.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/ztdynamic.c b/ztdynamic.c index 21677bc..aa81fea 100755 --- a/ztdynamic.c +++ b/ztdynamic.c @@ -30,6 +30,7 @@ #include <linux/spinlock.h> #include <linux/slab.h> #include <linux/kmod.h> +#include <linux/sched.h> #ifdef CONFIG_DEVFS_FS #include <linux/devfs_fs_kernel.h> #endif @@ -688,9 +689,48 @@ void zt_dynamic_unregister(struct zt_dynamic_driver *dri) spin_unlock_irqrestore(&dlock, flags); } +struct timer_list alarmcheck; + +static void check_for_red_alarm(unsigned long ignored) +{ + long flags; + int newalarm; + int alarmchanged = 0; + struct zt_dynamic *z; + spin_lock_irqsave(&dlock, flags); + z = dspans; + while(z) { + newalarm = z->span.alarms & ~ZT_ALARM_RED; + /* If nothing received for a minute, consider that RED ALARM */ + if ((jiffies - z->rxjif) > 1000 / HZ) { + newalarm |= ZT_ALARM_RED; + if (z->span.alarms != newalarm) { + z->span.alarms = newalarm; + zt_alarm_notify(&z->span); + alarmchanged++; + } + } + z = z->next; + } + spin_unlock_irqrestore(&dlock, flags); + if (alarmchanged) + checkmaster(); + + /* Do the next one */ + mod_timer(&alarmcheck, jiffies + 1 * HZ); + +} + int ztdynamic_init(void) { zt_set_dynamic_ioctl(ztdynamic_ioctl); + /* Start process to check for RED ALARM */ + init_timer(&alarmcheck); + alarmcheck.expires = 0; + alarmcheck.data = 0; + alarmcheck.function = check_for_red_alarm; + /* Check once per second */ + mod_timer(&alarmcheck, jiffies + 1 * HZ); printk("Zaptel Dynamic Span support LOADED\n"); return 0; } @@ -698,6 +738,7 @@ int ztdynamic_init(void) void ztdynamic_cleanup(void) { zt_set_dynamic_ioctl(NULL); + del_timer(&alarmcheck); printk("Zaptel Dynamic Span support unloaded\n"); } |