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:
parent
a2aba65e0c
commit
b5bacb94a7
@ -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) {
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user