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>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=9535

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.4@9685 a0bf4364-ded3-4de4-8d8a-66a801d63aff
This commit is contained in:
Shaun Ruffell
2011-01-21 05:31:51 +00:00
parent 0fed8904ec
commit 3a599b52d5

View File

@@ -1486,12 +1486,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);
@@ -1506,6 +1513,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);