diff --git a/README b/README index 51a8fb3..6985f2b 100644 --- a/README +++ b/README @@ -989,6 +989,12 @@ A very short type string. ===== /sys/bus/dahdi_spans/devices/span-N/syncsrc Current sync source. +==== sys/bus/dahdi_spans/drivers/generic_lowlevel/master_span +All spans in the bus are handled by a single driver. The driver has one +non-standard attribute: master_span. printing it shows the current DAHDI +master span writing a number to it forces setting this span as the master +span. + Channels Bus ^^^^^^^^^^^^ diff --git a/drivers/dahdi/dahdi-base.c b/drivers/dahdi/dahdi-base.c index 5a2ec49..74d46f3 100644 --- a/drivers/dahdi/dahdi-base.c +++ b/drivers/dahdi/dahdi-base.c @@ -3840,6 +3840,31 @@ void dahdi_alarm_channel(struct dahdi_chan *chan, int alarms) spin_unlock_irqrestore(&chan->lock, flags); } +struct dahdi_span *get_master_span(void) +{ + return master_span; +} + +void set_master_span(int spanno) +{ + struct dahdi_span *s; + unsigned long flags; + struct dahdi_span *old_master; + + spin_lock_irqsave(&chan_lock, flags); + old_master = master_span; + list_for_each_entry(s, &span_list, spans_node) { + if (spanno == s->spanno) { + master_span = s; + break; + } + } + spin_unlock_irqrestore(&chan_lock, flags); + if ((debug & DEBUG_MAIN) && (old_master != master_span)) + module_printk(KERN_NOTICE, "Master span is set to %d (%s)\n", + master_span->spanno, master_span->name); +} + static void __dahdi_find_master_span(void) { struct dahdi_span *s; diff --git a/drivers/dahdi/dahdi-sysfs.c b/drivers/dahdi/dahdi-sysfs.c index 3de37d5..6b1962c 100644 --- a/drivers/dahdi/dahdi-sysfs.c +++ b/drivers/dahdi/dahdi-sysfs.c @@ -231,7 +231,30 @@ static struct device_attribute span_dev_attrs[] = { __ATTR_NULL, }; +static ssize_t master_span_show(struct device_driver *driver, char *buf) +{ + struct dahdi_span *s = get_master_span(); + + return snprintf(buf, PAGE_SIZE, "%d\n", (s) ? s->spanno : 0); +} + +static ssize_t master_span_store(struct device_driver *driver, const char *buf, + size_t count) +{ + int spanno; + + if (sscanf(buf, "%d", &spanno) != 1) { + module_printk(KERN_ERR, "non-numeric input '%s'\n", buf); + return -EINVAL; + } + set_master_span(spanno); + return count; +} + + static struct driver_attribute dahdi_attrs[] = { + __ATTR(master_span, S_IRUGO | S_IWUSR, master_span_show, + master_span_store), __ATTR_NULL, }; diff --git a/include/dahdi/kernel.h b/include/dahdi/kernel.h index ac70e1a..c71e909 100644 --- a/include/dahdi/kernel.h +++ b/include/dahdi/kernel.h @@ -1003,6 +1003,8 @@ struct dahdi_transcoder_channel { }; int dahdi_is_sync_master(const struct dahdi_span *span); +struct dahdi_span *get_master_span(void); +void set_master_span(int spanno); static inline int dahdi_tc_is_built(struct dahdi_transcoder_channel *dtc) {