diff options
-rw-r--r-- | drivers/dahdi/xpp/card_global.c | 4 | ||||
-rw-r--r-- | drivers/dahdi/xpp/xbus-core.c | 36 | ||||
-rw-r--r-- | drivers/dahdi/xpp/xbus-core.h | 1 |
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); |