wctdm24xxp: 'oppending_ms' shouldn't assume being checked at 1ms intervals.

Part of preparations for being able to optionally slow the interrupt
rate down and opening the door for moving more module processing out of
the interrupt handler.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Acked-by: Russ Meyerriecks <rmeyerriecks@digium.com>

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@10166 a0bf4364-ded3-4de4-8d8a-66a801d63aff
This commit is contained in:
Shaun Ruffell 2011-08-30 16:38:23 +00:00
parent a2aba65e0c
commit b5bacb94a7
2 changed files with 16 additions and 6 deletions

View File

@ -1649,7 +1649,14 @@ wctdm_proslic_verify_indirect_regs(struct wctdm *wc, struct wctdm_module *mod)
return 0;
}
/* 1ms interrupt */
/**
* wctdm_proslic_check_oppending -
*
* Ensures that a write to the line feed register on the SLIC has been
* processed. If it hasn't after the timeout value, then it will resend the
* command and wait for another timeout period.
*
*/
static void
wctdm_proslic_check_oppending(struct wctdm *wc, struct wctdm_module *const mod)
{
@ -1670,7 +1677,6 @@ wctdm_proslic_check_oppending(struct wctdm *wc, struct wctdm_module *const mod)
if ((fxs->linefeed_control_shadow & SLIC_LF_SETMASK) ==
(fxs->lasttxhook & SLIC_LF_SETMASK)) {
fxs->lasttxhook &= SLIC_LF_SETMASK;
fxs->oppending_ms = 0;
if (debug & DEBUG_CARD) {
dev_info(&wc->vb.pdev->dev,
"SLIC_LF OK: card=%d shadow=%02x "
@ -1678,7 +1684,10 @@ wctdm_proslic_check_oppending(struct wctdm *wc, struct wctdm_module *const mod)
fxs->linefeed_control_shadow,
fxs->lasttxhook, wc->framecount);
}
} else if (fxs->oppending_ms && (--fxs->oppending_ms == 0)) {
} else if (time_after(wc->framecount, fxs->oppending_timeout)) {
/* Check again in 100 ms */
fxs->oppending_timeout = wc->framecount + 100;
wctdm_setreg_intr(wc, mod, LINE_STATE, fxs->lasttxhook);
if (debug & DEBUG_CARD) {
dev_info(&wc->vb.pdev->dev,
@ -1687,9 +1696,8 @@ wctdm_proslic_check_oppending(struct wctdm *wc, struct wctdm_module *const mod)
fxs->linefeed_control_shadow,
fxs->lasttxhook, wc->framecount);
}
} else { /* Start 100ms Timeout */
fxs->oppending_ms = 100;
}
spin_unlock(&wc->reglock);
}
@ -1736,6 +1744,7 @@ wctdm_proslic_recheck_sanity(struct wctdm *wc, struct wctdm_module *const mod)
}
fxs->lasttxhook |= SLIC_LF_OPPENDING;
mod->sethook = CMD_WR(LINE_STATE, fxs->lasttxhook);
fxs->oppending_timeout = wc->framecount + 100;
/* Update shadow register to avoid extra power alarms
* until next read */
@ -2174,6 +2183,7 @@ wctdm_fxs_hooksig(struct wctdm *wc, struct wctdm_module *const mod,
if (x != fxs->lasttxhook) {
fxs->lasttxhook = x | SLIC_LF_OPPENDING;
mod->sethook = CMD_WR(LINE_STATE, fxs->lasttxhook);
fxs->oppending_timeout = wc->framecount + 100;
spin_unlock_irqrestore(&wc->reglock, flags);
if (debug & DEBUG_CARD) {

View File

@ -182,7 +182,6 @@ struct fxs {
* voicebus ISR.
*/
int lasttxhook;
int oppending_ms;
u8 linefeed_control_shadow;
u8 hook_state_shadow;
int palarms;
@ -193,6 +192,7 @@ struct fxs {
struct calregs calregs;
unsigned long check_alarm;
unsigned long check_proslic;
unsigned long oppending_timeout;
};
struct qrv {