summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorShaun Ruffell <sruffell@digium.com>2010-12-15 17:53:12 +0000
committerShaun Ruffell <sruffell@digium.com>2010-12-15 17:53:12 +0000
commit14f016f492191aa9f7991195b3ed8569b046eb30 (patch)
treeb93b929ef991065aab52d0938d88dc793261a4e8 /drivers
parent9a8addb3455f69898967a1dd6ae8939cb0227eeb (diff)
wctdm24xxp, wcte12xp: Lock interrupts when recovering from an underrun.
This reduces the chance that another interrupt will interfere with the recovery process. Otherwise it is possible that the hardware advances past the position that we think it is currently at. Signed-off-by: Shaun Ruffell <sruffell@digium.com> Acked-by: Kinsey Moore <kmoore@digium.com> Acked-By: Russ Meyerriecks <rmeyerriecks@digium.com> git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@9535 a0bf4364-ded3-4de4-8d8a-66a801d63aff
Diffstat (limited to 'drivers')
-rw-r--r--drivers/dahdi/voicebus/voicebus.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/dahdi/voicebus/voicebus.c b/drivers/dahdi/voicebus/voicebus.c
index ddc60e1..c57c757 100644
--- a/drivers/dahdi/voicebus/voicebus.c
+++ b/drivers/dahdi/voicebus/voicebus.c
@@ -1482,12 +1482,19 @@ static void vb_tasklet_normal(unsigned long data)
if (unlikely(softunderrun)) {
int i;
- vb_increase_latency(vb, behind, &buffers);
+ unsigned long flags;
+ /* Disable interrupts on the local processor. We don't want
+ * the following process interrupted. We're 'racing' against
+ * the hardware here.... */
+ local_irq_save(flags);
+ vb_increase_latency(vb, behind, &buffers);
d = vb_descriptor(dl, dl->head);
while (!OWNED(d)) {
- if (d->buffer1 != vb->idle_vbb_dma_addr)
+ if (d->buffer1 != vb->idle_vbb_dma_addr) {
+ local_irq_restore(flags);
goto tx_error_exit;
+ }
SET_OWNED(d);
dl->head = (dl->head + 1) & DRING_MASK;
d = vb_descriptor(dl, dl->head);
@@ -1502,6 +1509,7 @@ static void vb_tasklet_normal(unsigned long data)
dl->head = (dl->head + 1) & DRING_MASK;
}
dl->tail = dl->head;
+ local_irq_restore(flags);
}
d = vb_descriptor(dl, dl->tail);