summaryrefslogtreecommitdiff
path: root/drivers/dahdi/wctdm24xxp/base.c
diff options
context:
space:
mode:
authorShaun Ruffell <sruffell@digium.com>2011-08-30 16:38:23 +0000
committerShaun Ruffell <sruffell@digium.com>2011-08-30 16:38:23 +0000
commit2d062afecb44777c9140263abc4d1a02330e4d39 (patch)
tree54bf2182935e9223ce4839d73ad1fab923d4d4d8 /drivers/dahdi/wctdm24xxp/base.c
parent692f7d7c488601ea87545095dbcb3250b84127e3 (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.c20
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) {