diff --git a/drivers/dahdi/xpp/xbus-core.c b/drivers/dahdi/xpp/xbus-core.c index b5c7c31..51efc47 100644 --- a/drivers/dahdi/xpp/xbus-core.c +++ b/drivers/dahdi/xpp/xbus-core.c @@ -61,6 +61,8 @@ extern int debug; static DEF_PARM(uint, command_queue_length, 1000, 0444, "Maximal command queue length"); static DEF_PARM(uint, poll_timeout, 1000, 0644, "Timeout (in jiffies) waiting for units to reply"); static DEF_PARM_BOOL(rx_tasklet, 0, 0644, "Use receive tasklets"); +static DEF_PARM_BOOL(dahdi_autoreg, 0, 0644, + "Register devices automatically (1) or not (0)"); #ifdef CONFIG_PROC_FS static int xbus_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data); @@ -870,12 +872,22 @@ err: goto out; } -static int xbus_register_dahdi_device(xbus_t *xbus) +int xbus_is_registered(xbus_t *xbus) +{ + return xbus->ddev && xbus->ddev->dev.parent; +} + +int xbus_register_dahdi_device(xbus_t *xbus) { int i; int offset = 0; XBUS_DBG(DEVICES, xbus, "Entering %s\n", __func__); + if (xbus_is_registered(xbus)) { + XBUS_ERR(xbus, "Already registered to DAHDI\n"); + WARN_ON(1); + return -EINVAL; + } xbus->ddev = dahdi_create_device(); /* * This actually describe the dahdi_spaninfo version 3 @@ -929,7 +941,7 @@ static int xbus_register_dahdi_device(xbus_t *xbus) return 0; } -static void xbus_unregister_dahdi_device(xbus_t *xbus) +void xbus_unregister_dahdi_device(xbus_t *xbus) { int i; @@ -1017,7 +1029,8 @@ void xbus_populate(void *data) */ xbus_request_sync(xbus, SYNC_MODE_PLL); elect_syncer("xbus_populate(end)"); /* FIXME: try to do it later */ - xbus_register_dahdi_device(xbus); + if (dahdi_autoreg) + xbus_register_dahdi_device(xbus); out: XBUS_DBG(DEVICES, xbus, "Leaving\n"); wake_up_interruptible_all(&worker->wait_for_xpd_initialization); diff --git a/drivers/dahdi/xpp/xbus-core.h b/drivers/dahdi/xpp/xbus-core.h index 67da031..270330e 100644 --- a/drivers/dahdi/xpp/xbus-core.h +++ b/drivers/dahdi/xpp/xbus-core.h @@ -343,6 +343,10 @@ int xpd_device_register(xbus_t *xbus, xpd_t *xpd); void xpd_device_unregister(xpd_t *xpd); int echocancel_xpd(xpd_t *xpd, int on); +int xbus_is_registered(xbus_t *xbus); +int xbus_register_dahdi_device(xbus_t *xbus); +void xbus_unregister_dahdi_device(xbus_t *xbus); + int xpp_driver_init(void); void xpp_driver_exit(void); int xbus_sysfs_transport_create(xbus_t *xbus); diff --git a/drivers/dahdi/xpp/xbus-sysfs.c b/drivers/dahdi/xpp/xbus-sysfs.c index ccc1a01..31835bb 100644 --- a/drivers/dahdi/xpp/xbus-sysfs.c +++ b/drivers/dahdi/xpp/xbus-sysfs.c @@ -613,6 +613,48 @@ static DEVICE_ATTR_READER(span_show, dev, buf) return len; } +/* + * For backward compatibility with old dahdi-tools + * Remove after dahdi_registration is upgraded + */ +static DEVICE_ATTR_WRITER(span_store, dev, buf, count) +{ + xpd_t *xpd; + int dahdi_reg; + int ret; + + BUG_ON(!dev); + xpd = dev_to_xpd(dev); + if (!xpd) + return -ENODEV; + ret = sscanf(buf, "%d", &dahdi_reg); + if (ret != 1) + return -EINVAL; + if (!XBUS_IS(xpd->xbus, READY)) + return -ENODEV; + XPD_DBG(DEVICES, xpd, + "%s -- deprecated (should use pinned-spans)\n", + (dahdi_reg) ? "register" : "unregister"); + if (xbus_is_registered(xpd->xbus)) { + if (dahdi_reg) { + XPD_DBG(DEVICES, xpd, + "already registered %s. Ignored.\n", + xpd->xbus->busname); + } else { + xbus_unregister_dahdi_device(xpd->xbus); + } + } else { + if (!dahdi_reg) { + XPD_DBG(DEVICES, xpd, + "already unregistered %s. Ignored.\n", + xpd->xbus->busname); + } else { + xbus_register_dahdi_device(xpd->xbus); + } + } + return count; +} + static DEVICE_ATTR_READER(type_show, dev, buf) { xpd_t *xpd; @@ -695,7 +737,7 @@ static int xpd_match(struct device *dev, struct device_driver *driver) static struct device_attribute xpd_dev_attrs[] = { __ATTR(chipregs, S_IRUGO | S_IWUSR, chipregs_show, chipregs_store), __ATTR(blink, S_IRUGO | S_IWUSR, blink_show, blink_store), - __ATTR_RO(span), + __ATTR(span, S_IRUGO | S_IWUSR, span_show, span_store), __ATTR_RO(type), __ATTR_RO(offhook), __ATTR_RO(timing_priority),