summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/dahdi/xpp/card_global.c4
-rw-r--r--drivers/dahdi/xpp/xbus-core.c36
-rw-r--r--drivers/dahdi/xpp/xbus-core.h1
3 files changed, 41 insertions, 0 deletions
diff --git a/drivers/dahdi/xpp/card_global.c b/drivers/dahdi/xpp/card_global.c
index 4cf5ca5..e731560 100644
--- a/drivers/dahdi/xpp/card_global.c
+++ b/drivers/dahdi/xpp/card_global.c
@@ -431,6 +431,8 @@ static void global_packet_dump(const char *msg, xpacket_t *pack);
DBG(DEVICES, "NO XBUS\n");
return -EINVAL;
}
+ if (xbus_check_unique(xbus))
+ return -EBUSY;
XFRAME_NEW_CMD(xframe, pack, xbus, GLOBAL, AB_REQUEST, 0);
RPACKET_FIELD(pack, GLOBAL, AB_REQUEST, rev) = XPP_PROTOCOL_VERSION;
RPACKET_FIELD(pack, GLOBAL, AB_REQUEST, reserved) = 0;
@@ -614,6 +616,8 @@ HANDLER_DEF(GLOBAL, AB_DESCRIPTION) /* 0x08 */
goto proto_err;
}
XBUS_INFO(xbus, "DESCRIPTOR: %d cards, protocol revision %d\n", count_units, rev);
+ if (xbus_check_unique(xbus))
+ return -EBUSY;
xbus->revision = rev;
worker = &xbus->worker;
if (!worker->wq) {
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) {
diff --git a/drivers/dahdi/xpp/xbus-core.h b/drivers/dahdi/xpp/xbus-core.h
index 026c112..15312c6 100644
--- a/drivers/dahdi/xpp/xbus-core.h
+++ b/drivers/dahdi/xpp/xbus-core.h
@@ -308,6 +308,7 @@ xpacket_t *xframe_next_packet(xframe_t *xframe, int len);
xpd_t *xpd_of(const xbus_t *xbus, int xpd_num);
xpd_t *xpd_byaddr(const xbus_t *xbus, uint unit, uint subunit);
+int xbus_check_unique(xbus_t *xbus);
bool xbus_setstate(xbus_t *xbus, enum xbus_state newstate);
bool xbus_setflags(xbus_t *xbus, int flagbit, bool on);
xbus_t *xbus_new(struct xbus_ops *ops, ushort max_send_size, struct device *transport_device, void *priv);