From f96ad0b72056f9bee53d19951211f0271795f1e2 Mon Sep 17 00:00:00 2001 From: Tzafrir Cohen Date: Tue, 13 Jul 2010 17:25:06 +0000 Subject: prevent handling of duplicate Astribanks Don't let AB which are unplugged/replugged create duplicate XBUS's (if asterisk don't close the original channels). git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@8905 a0bf4364-ded3-4de4-8d8a-66a801d63aff --- drivers/dahdi/xpp/xbus-core.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'drivers/dahdi/xpp/xbus-core.c') diff --git a/drivers/dahdi/xpp/xbus-core.c b/drivers/dahdi/xpp/xbus-core.c index 2d2ecb4..3acf2d9 100644 --- a/drivers/dahdi/xpp/xbus-core.c +++ b/drivers/dahdi/xpp/xbus-core.c @@ -87,6 +87,42 @@ static struct xbus_desc { xbus_t *xbus; } xbuses_array[MAX_BUSES]; +static xbus_t *xbus_byhwid(const char *hwid) +{ + int i; + xbus_t *xbus; + + for (i = 0; i < ARRAY_SIZE(xbuses_array); i++) { + xbus = xbuses_array[i].xbus; + if (xbus && strcmp(hwid, xbus->label) == 0) + return xbus; + } + return NULL; +} + +int xbus_check_unique(xbus_t *xbus) +{ + if (!xbus) + return -ENOENT; + if (xbus->label) { + xbus_t *xbus_old; + + XBUS_DBG(DEVICES, xbus, "Checking LABEL='%s'\n", xbus->label); + xbus_old = xbus_byhwid(xbus->label); + if (xbus_old && xbus_old != xbus) { + XBUS_NOTICE(xbus_old, + "Duplicate LABEL='%s'. Leave %s unused. refcount_xbus=%d\n", + xbus_old->label, + xbus->busname, + refcount_xbus(xbus_old)); + return -EBUSY; + } + } else { + XBUS_NOTICE(xbus, "MISSING BOARD LABEL!!!\n"); + } + return 0; +} + const char *xbus_statename(enum xbus_state st) { switch(st) { -- cgit v1.2.3