Index: drivers/dahdi/wctdm24xxp/base.c =================================================================== --- drivers/dahdi/wctdm24xxp/base.c (revision 9065) +++ drivers/dahdi/wctdm24xxp/base.c (working copy) @@ -1805,12 +1805,69 @@ #undef MS_PER_CHECK_HOOK } +static void wctdm_fxs_hooksig(struct wctdm *wc, const int card, enum dahdi_txsig txsig) +{ + int x = 0; + unsigned long flags; + struct fxs *const fxs = &wc->mods[card].fxs; + spin_lock_irqsave(&fxs->lasttxhooklock, flags); + switch (txsig) { + case DAHDI_TXSIG_ONHOOK: + switch (wc->aspan->span.chans[card]->sig) { + case DAHDI_SIG_EM: + case DAHDI_SIG_FXOKS: + case DAHDI_SIG_FXOLS: + x = fxs->idletxhookstate; + break; + case DAHDI_SIG_FXOGS: + x = (POLARITY_XOR(card)) ? + SLIC_LF_RING_OPEN : + SLIC_LF_TIP_OPEN; + break; + } + break; + case DAHDI_TXSIG_OFFHOOK: + switch (wc->aspan->span.chans[card]->sig) { + case DAHDI_SIG_EM: + x = (POLARITY_XOR(card)) ? + SLIC_LF_ACTIVE_FWD : + SLIC_LF_ACTIVE_REV; + break; + default: + x = fxs->idletxhookstate; + break; + } + break; + case DAHDI_TXSIG_START: + x = SLIC_LF_RINGING; + break; + case DAHDI_TXSIG_KEWL: + x = SLIC_LF_OPEN; + break; + default: + spin_unlock_irqrestore(&fxs->lasttxhooklock, flags); + dev_notice(&wc->vb.pdev->dev, + "wctdm24xxp: Can't set tx state to %d\n", txsig); + return; + } + + fxs->lasttxhook = x | SLIC_LF_OPPENDING; + wc->sethook[card] = CMD_WR(LINE_STATE, fxs->lasttxhook); + spin_unlock_irqrestore(&fxs->lasttxhooklock, flags); + if (debug & DEBUG_CARD) { + dev_info(&wc->vb.pdev->dev, "Setting FXS hook state " + "to %d (%02x) intcount=%d\n", txsig, x, + wc->intcount); + } +} + static void wctdm_fxs_off_hook(struct wctdm *wc, const int card) { struct fxs *const fxs = &wc->mods[card].fxs; if (debug & DEBUG_CARD) - dev_info(&wc->vb.pdev->dev, "wctdm: Card %d Going off hook\n", card); + dev_info(&wc->vb.pdev->dev, + "fxs_off_hook: Card %d Going off hook\n", card); switch (fxs->lasttxhook) { case SLIC_LF_RINGING: /* Ringing */ case SLIC_LF_OHTRAN_FWD: /* Forward On Hook Transfer */ @@ -1821,7 +1878,9 @@ SLIC_LF_ACTIVE_FWD; break; } + wctdm_fxs_hooksig(wc, card, DAHDI_TXSIG_OFFHOOK); dahdi_hooksig(wc->aspan->span.chans[card], DAHDI_RXSIG_OFFHOOK); + #ifdef DEBUG if (robust) wctdm_init_proslic(wc, card, 1, 0, 1); @@ -1833,7 +1892,9 @@ { struct fxs *const fxs = &wc->mods[card].fxs; if (debug & DEBUG_CARD) - dev_info(&wc->vb.pdev->dev, "wctdm: Card %d Going on hook\n", card); + dev_info(&wc->vb.pdev->dev, + "fxs_on_hook: Card %d Going on hook\n", card); + wctdm_fxs_hooksig(wc, card, DAHDI_TXSIG_ONHOOK); dahdi_hooksig(wc->aspan->span.chans[card], DAHDI_RXSIG_ONHOOK); fxs->oldrxhook = 0; } @@ -3527,60 +3588,7 @@ dev_notice(&wc->vb.pdev->dev, "wctdm24xxp: Can't set tx state to %d\n", txsig); } } else if (wc->modtype[chan->chanpos - 1] == MOD_TYPE_FXS) { - int x = 0; - unsigned long flags; - struct fxs *const fxs = &wc->mods[chan->chanpos - 1].fxs; - spin_lock_irqsave(&fxs->lasttxhooklock, flags); - switch(txsig) { - case DAHDI_TXSIG_ONHOOK: - switch(chan->sig) { - case DAHDI_SIG_EM: - case DAHDI_SIG_FXOKS: - case DAHDI_SIG_FXOLS: - x = fxs->idletxhookstate; - break; - case DAHDI_SIG_FXOGS: - if (POLARITY_XOR(chan->chanpos -1)) { - x = SLIC_LF_RING_OPEN; - } else { - x = SLIC_LF_TIP_OPEN; - } - break; - } - break; - case DAHDI_TXSIG_OFFHOOK: - switch(chan->sig) { - case DAHDI_SIG_EM: - x = (POLARITY_XOR(chan->chanpos - 1)) ? - SLIC_LF_ACTIVE_FWD : - SLIC_LF_ACTIVE_REV; - break; - default: - x = fxs->idletxhookstate; - break; - } - break; - case DAHDI_TXSIG_START: - x = SLIC_LF_RINGING; - break; - case DAHDI_TXSIG_KEWL: - x = SLIC_LF_OPEN; - break; - default: - spin_unlock_irqrestore(&fxs->lasttxhooklock, flags); - dev_notice(&wc->vb.pdev->dev, "wctdm24xxp: Can't set tx state to %d\n", txsig); - return 0; - } - - fxs->lasttxhook = x | SLIC_LF_OPPENDING; - wc->sethook[chan->chanpos - 1] = CMD_WR(LINE_STATE, fxs->lasttxhook); - spin_unlock_irqrestore(&fxs->lasttxhooklock, flags); - if (debug & DEBUG_CARD) { - dev_info(&wc->vb.pdev->dev, "Setting FXS hook state " - "to %d (%02x) intcount=%d\n", txsig, x, - wc->intcount); - } - } else { + wctdm_fxs_hooksig(wc, chan->chanpos - 1, txsig); } return 0; }