summaryrefslogtreecommitdiff
path: root/drivers/dahdi/dahdi_dynamic.c
diff options
context:
space:
mode:
authorShaun Ruffell <sruffell@digium.com>2011-01-03 18:25:45 +0000
committerShaun Ruffell <sruffell@digium.com>2011-01-03 18:25:45 +0000
commitaf01c80ff50f5fc10cce387afb008b867a8cfdb5 (patch)
treed129729adbd5bf215a632b7fc981833e0735f7ea /drivers/dahdi/dahdi_dynamic.c
parentbcb0aea62416662dea215e29bce5aba0302285c5 (diff)
dahdi_dynamic: Use dahdi_span_ops.sync_tick for driving dynamic spans.
Dynamic spans that are unable to provide their own timing, like dahdi local spans, typically derived their timing source from dahdi_dynamic_ioctl(0,0) call in process_masterspan. This change uses the sync_tick member of dahdi_span_ops instead so that dynamic operations do not happen on a span until it is fully registered. Also removes the check for dahdi_dynamic_ioctl in process masterspan for those users that never load a dynamic span. This was originally suggested in a comment on: (issue #13205) Signed-off-by: Shaun Ruffell <sruffell@digium.com> Acked-by: Kinsey Moore <kmoore@digium.com> git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@9576 a0bf4364-ded3-4de4-8d8a-66a801d63aff
Diffstat (limited to 'drivers/dahdi/dahdi_dynamic.c')
-rw-r--r--drivers/dahdi/dahdi_dynamic.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/drivers/dahdi/dahdi_dynamic.c b/drivers/dahdi/dahdi_dynamic.c
index 22b2a65..7ab765b 100644
--- a/drivers/dahdi/dahdi_dynamic.c
+++ b/drivers/dahdi/dahdi_dynamic.c
@@ -35,6 +35,10 @@
#include <dahdi/kernel.h>
+#ifndef DAHDI_SYNC_TICK
+#error "Dynamic support depends on DAHDI_SYNC_TICK being enabled."
+#endif
+
/*
* Tasklets provide better system interactive response at the cost of the
* possibility of losing a frame of data at very infrequent intervals. If
@@ -533,12 +537,30 @@ static int dahdi_dynamic_close(struct dahdi_chan *chan)
return 0;
}
+static int dahdi_dynamic_sync_tick(struct dahdi_span *span, int is_master)
+{
+ struct dahdi_dynamic *head;
+ struct dahdi_dynamic *d = dynamic_from_span(span);
+
+ if (hasmaster)
+ return 0;
+
+ rcu_read_lock();
+ head = list_entry(dspan_list.next, struct dahdi_dynamic, list);
+ rcu_read_unlock();
+
+ if (d == head)
+ dahdi_dynamic_run();
+ return 0;
+}
+
static const struct dahdi_span_ops dynamic_ops = {
.owner = THIS_MODULE,
.rbsbits = dahdi_dynamic_rbsbits,
.open = dahdi_dynamic_open,
.close = dahdi_dynamic_close,
.chanconfig = dahdi_dynamic_chanconfig,
+ .sync_tick = dahdi_dynamic_sync_tick,
};
static int create_dynamic(struct dahdi_dynamic_span *dds)
@@ -689,13 +711,6 @@ static int dahdi_dynamic_ioctl(unsigned int cmd, unsigned long data)
struct dahdi_dynamic_span dds;
int res;
switch(cmd) {
- case 0:
- /* This is called just before rotation. If none of our
- spans are pulling timing, then now is the time to process
- them */
- if (!hasmaster)
- dahdi_dynamic_run();
- return 0;
case DAHDI_DYNAMIC_CREATE:
if (copy_from_user(&dds, (__user const void *)data,
sizeof(dds)))