diff options
author | Shaun Ruffell <sruffell@digium.com> | 2011-08-30 16:38:23 +0000 |
---|---|---|
committer | Shaun Ruffell <sruffell@digium.com> | 2011-08-30 16:38:23 +0000 |
commit | 2d062afecb44777c9140263abc4d1a02330e4d39 (patch) | |
tree | 54bf2182935e9223ce4839d73ad1fab923d4d4d8 /drivers/dahdi/wctdm24xxp/base.c | |
parent | 692f7d7c488601ea87545095dbcb3250b84127e3 (diff) |
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
Diffstat (limited to 'drivers/dahdi/wctdm24xxp/base.c')
-rw-r--r-- | drivers/dahdi/wctdm24xxp/base.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/drivers/dahdi/wctdm24xxp/base.c b/drivers/dahdi/wctdm24xxp/base.c index 547e6c5..7d70e5f 100644 --- a/drivers/dahdi/wctdm24xxp/base.c +++ b/drivers/dahdi/wctdm24xxp/base.c @@ -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) { |