xpp: restore backward compat dahdi_registration

This restores a somewhat limited functionality of the "span"
write interface in the SysFS node of the span, broken by the
pinned-spans code.

* PROBLEM: dahdi-linux pinned-spans should work with existing dahdi-tools
  specifically the dahdi_registration tool.

* As a result, we should still be able to control dahdi registration
  order. However, registration is now in complete devices and not spans

* Restored dahdi_autoreg=[0/1] xpp module parameter:
  - It now refers to complete astribanks and not individual spans

* The xpp module sysfs "span" attribute:
  - Implemented write method (for dahdi_registration tool)
  - The first write of [1/0] to this attribute, registers/unregisters
    the complete astribank
  - Further writes are ignored (with DBG messages)

* Also, implemented new xbus_is_registered() function

* Once the new dahdi-tools are merged, we should turn deprecation
  messages from DBG() to NOTICE()

Signed-off-by: Oron Peled <oron.peled@xorcom.com>
Acked-by Tzafrir Cohen <tzafrir.cohen@xorcom.com>

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@10334 a0bf4364-ded3-4de4-8d8a-66a801d63aff
This commit is contained in:
Oron Peled 2011-11-10 16:56:29 +00:00 committed by Tzafrir Cohen
parent bc7c111d7e
commit 1a79cb4fdc
3 changed files with 63 additions and 4 deletions

View File

@ -61,6 +61,8 @@ extern int debug;
static DEF_PARM(uint, command_queue_length, 1000, 0444, "Maximal command queue length"); 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(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(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 #ifdef CONFIG_PROC_FS
static int xbus_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data); 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; 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 i;
int offset = 0; int offset = 0;
XBUS_DBG(DEVICES, xbus, "Entering %s\n", __func__); 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(); xbus->ddev = dahdi_create_device();
/* /*
* This actually describe the dahdi_spaninfo version 3 * This actually describe the dahdi_spaninfo version 3
@ -929,7 +941,7 @@ static int xbus_register_dahdi_device(xbus_t *xbus)
return 0; return 0;
} }
static void xbus_unregister_dahdi_device(xbus_t *xbus) void xbus_unregister_dahdi_device(xbus_t *xbus)
{ {
int i; int i;
@ -1017,7 +1029,8 @@ void xbus_populate(void *data)
*/ */
xbus_request_sync(xbus, SYNC_MODE_PLL); xbus_request_sync(xbus, SYNC_MODE_PLL);
elect_syncer("xbus_populate(end)"); /* FIXME: try to do it later */ 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: out:
XBUS_DBG(DEVICES, xbus, "Leaving\n"); XBUS_DBG(DEVICES, xbus, "Leaving\n");
wake_up_interruptible_all(&worker->wait_for_xpd_initialization); wake_up_interruptible_all(&worker->wait_for_xpd_initialization);

View File

@ -343,6 +343,10 @@ int xpd_device_register(xbus_t *xbus, xpd_t *xpd);
void xpd_device_unregister(xpd_t *xpd); void xpd_device_unregister(xpd_t *xpd);
int echocancel_xpd(xpd_t *xpd, int on); 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); int xpp_driver_init(void);
void xpp_driver_exit(void); void xpp_driver_exit(void);
int xbus_sysfs_transport_create(xbus_t *xbus); int xbus_sysfs_transport_create(xbus_t *xbus);

View File

@ -613,6 +613,48 @@ static DEVICE_ATTR_READER(span_show, dev, buf)
return len; 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) static DEVICE_ATTR_READER(type_show, dev, buf)
{ {
xpd_t *xpd; 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[] = { static struct device_attribute xpd_dev_attrs[] = {
__ATTR(chipregs, S_IRUGO | S_IWUSR, chipregs_show, chipregs_store), __ATTR(chipregs, S_IRUGO | S_IWUSR, chipregs_show, chipregs_store),
__ATTR(blink, S_IRUGO | S_IWUSR, blink_show, blink_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(type),
__ATTR_RO(offhook), __ATTR_RO(offhook),
__ATTR_RO(timing_priority), __ATTR_RO(timing_priority),