diff options
author | Shaun Ruffell <sruffell@digium.com> | 2011-03-19 21:59:28 -0500 |
---|---|---|
committer | Shaun Ruffell <sruffell@digium.com> | 2011-04-15 14:19:02 -0500 |
commit | f8fec661eee5e7c843bd8e653063ba0eb56525ad (patch) | |
tree | a3fc2ecf87d017d5e2484c81548077165bec5ef6 | |
parent | 9ccf86f865cf0b046e7d3476ac84b08b7bf7efbd (diff) |
wctdm24xxp: Use interval for checking on hook transfer timer.
Part of moving more of the module specific processing out of the interrupt handler.
Signed-off-by: Shaun Ruffell <sruffell@digium.com>
-rw-r--r-- | drivers/dahdi/wctdm24xxp/base.c | 14 | ||||
-rw-r--r-- | drivers/dahdi/wctdm24xxp/wctdm24xxp.h | 3 |
2 files changed, 10 insertions, 7 deletions
diff --git a/drivers/dahdi/wctdm24xxp/base.c b/drivers/dahdi/wctdm24xxp/base.c index 637cda2..86a577f 100644 --- a/drivers/dahdi/wctdm24xxp/base.c +++ b/drivers/dahdi/wctdm24xxp/base.c @@ -2246,15 +2246,14 @@ static void wctdm_isr_misc_fxs(struct wctdm *wc, struct wctdm_module *const mod) if (SLIC_LF_RINGING == fxs->lasttxhook) { /* RINGing, prepare for OHT */ - fxs->ohttimer = OHT_TIMER << 3; + fxs->ohttimer = wc->framecount + OHT_TIMER; /* OHT mode when idle */ fxs->idletxhookstate = POLARITY_XOR(fxs) ? SLIC_LF_OHTRAN_REV : SLIC_LF_OHTRAN_FWD; - } else if (fxs->ohttimer) { + } else if (fxs->oht_active) { /* check if still OnHook */ if (!fxs->oldrxhook) { - fxs->ohttimer -= DAHDI_CHUNKSIZE; - if (fxs->ohttimer) + if (time_before(wc->framecount, fxs->ohttimer)) return; /* Switch to active */ @@ -2284,7 +2283,7 @@ static void wctdm_isr_misc_fxs(struct wctdm *wc, struct wctdm_module *const mod) } spin_unlock_irqrestore(&fxs->lasttxhooklock, flags); } else { - fxs->ohttimer = 0; + fxs->oht_active = 0; /* Switch to active */ fxs->idletxhookstate = POLARITY_XOR(fxs) ? SLIC_LF_ACTIVE_REV : SLIC_LF_ACTIVE_FWD; if (debug & DEBUG_CARD) { @@ -3490,7 +3489,6 @@ static int wctdm_ioctl(struct dahdi_chan *chan, unsigned int cmd, unsigned long return -EINVAL; if (get_user(x, (__user int *) data)) return -EFAULT; - fxs->ohttimer = x << 3; /* Active mode when idle */ fxs->idletxhookstate = POLARITY_XOR(fxs) ? @@ -3519,6 +3517,10 @@ static int wctdm_ioctl(struct dahdi_chan *chan, unsigned int cmd, unsigned long } } + + fxs->ohttimer = wc->framecount + x; + fxs->oht_active = 1; + break; case DAHDI_VMWI_CONFIG: if (mod->type != FXS) diff --git a/drivers/dahdi/wctdm24xxp/wctdm24xxp.h b/drivers/dahdi/wctdm24xxp/wctdm24xxp.h index 5049d5a..313931a 100644 --- a/drivers/dahdi/wctdm24xxp/wctdm24xxp.h +++ b/drivers/dahdi/wctdm24xxp/wctdm24xxp.h @@ -163,11 +163,11 @@ struct fxo { }; struct fxs { + u8 oht_active:1; int oldrxhook; int debouncehook; int lastrxhook; int debounce; - int ohttimer; int idletxhookstate; /* IDLE changing hook state */ /* lasttxhook reflects the last value written to the proslic's reg * 64 (LINEFEED_CONTROL) in bits 0-2. Bit 4 indicates if the last @@ -191,6 +191,7 @@ struct fxs { unsigned long check_alarm; unsigned long check_proslic; unsigned long oppending_timeout; + unsigned long ohttimer; }; struct qrv { |