From b300aa6c7fa62187e0147471c9086dce2d041d57 Mon Sep 17 00:00:00 2001 From: Shaun Ruffell Date: Mon, 3 Jan 2011 18:25:45 +0000 Subject: 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 Acked-by: Kinsey Moore git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@9576 a0bf4364-ded3-4de4-8d8a-66a801d63aff --- drivers/dahdi/dahdi-base.c | 4 ---- drivers/dahdi/dahdi_dynamic.c | 29 ++++++++++++++++++++++------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/drivers/dahdi/dahdi-base.c b/drivers/dahdi/dahdi-base.c index 8b690c8..9d60f1c 100644 --- a/drivers/dahdi/dahdi-base.c +++ b/drivers/dahdi/dahdi-base.c @@ -8458,10 +8458,6 @@ static void process_masterspan(void) /* Process any timers */ process_timers(); - /* If we have dynamic stuff, call the ioctl with 0,0 parameters to - make it run */ - if (dahdi_dynamic_ioctl) - dahdi_dynamic_ioctl(0, 0); for (y = 1; y < maxspans; ++y) { s = spans[y]; 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 +#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))) -- cgit v1.2.3