xpp: Don't deactivate XPDs on unregistration
* A bug was introduced during migration to dahdi_device code:
http://svnview.digium.com/svn/dahdi?view=rev&rev=10273
* Marking XPDs as non-functional (card_present=0, XPD_STATE_NOHW)
was moved from xbus_request_removal() into xpd_dahdi_preunregister()
* As a result, unregistering an Astribank, made it non-functional
so trying to re-register it later caused errors (e.g: "Cannot open"
error message from xpp_open())
* This fix move XPD deactivation into the proper location (during
xbus_deactivate()
Signed-off-by: Oron Peled <oron.peled@xorcom.com>
Acked-By: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10409
git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10418 a0bf4364-ded3-4de4-8d8a-66a801d63aff
This commit is contained in:
committed by
Shaun Ruffell
parent
5ed0271397
commit
17a2ce9421
@@ -811,6 +811,29 @@ static int xbus_echocancel(xbus_t *xbus, int on)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void xbus_deactivate_xpds(xbus_t *xbus)
|
||||
{
|
||||
unsigned long flags;
|
||||
int unit;
|
||||
int subunit;
|
||||
xpd_t *xpd;
|
||||
|
||||
for (unit = 0; unit < MAX_UNIT; unit++) {
|
||||
xpd = xpd_byaddr(xbus, unit, 0);
|
||||
if (!xpd)
|
||||
continue;
|
||||
for (subunit = 0; subunit < MAX_SUBUNIT; subunit++) {
|
||||
xpd = xpd_byaddr(xbus, unit, subunit);
|
||||
if (!xpd)
|
||||
continue;
|
||||
spin_lock_irqsave(&xpd->lock, flags);
|
||||
xpd->card_present = 0;
|
||||
xpd_setstate(xpd, XPD_STATE_NOHW);
|
||||
spin_unlock_irqrestore(&xpd->lock, flags);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int xbus_initialize(xbus_t *xbus)
|
||||
{
|
||||
int unit;
|
||||
@@ -1303,6 +1326,7 @@ void xbus_deactivate(xbus_t *xbus)
|
||||
xbus_request_sync(xbus, SYNC_MODE_NONE); /* no more ticks */
|
||||
elect_syncer("deactivate");
|
||||
xbus_echocancel(xbus, 0);
|
||||
xbus_deactivate_xpds(xbus);
|
||||
XBUS_DBG(DEVICES, xbus, "[%s] Waiting for queues\n", xbus->label);
|
||||
xbus_command_queue_clean(xbus);
|
||||
xbus_command_queue_waitempty(xbus);
|
||||
|
||||
@@ -1082,14 +1082,9 @@ int xpd_dahdi_postregister(xpd_t *xpd)
|
||||
*/
|
||||
void xpd_dahdi_preunregister(xpd_t *xpd)
|
||||
{
|
||||
unsigned long flags;
|
||||
if (!xpd)
|
||||
return;
|
||||
XPD_DBG(DEVICES, xpd, "\n");
|
||||
spin_lock_irqsave(&xpd->lock, flags);
|
||||
xpd->card_present = 0;
|
||||
xpd_setstate(xpd, XPD_STATE_NOHW);
|
||||
spin_unlock_irqrestore(&xpd->lock, flags);
|
||||
update_xpd_status(xpd, DAHDI_ALARM_NOTOPEN);
|
||||
if(xpd->card_present)
|
||||
CALL_PHONE_METHOD(card_dahdi_preregistration, xpd, 0);
|
||||
|
||||
Reference in New Issue
Block a user