summaryrefslogtreecommitdiff
path: root/drivers/dahdi
diff options
context:
space:
mode:
authorShaun Ruffell <sruffell@digium.com>2010-09-21 19:26:22 +0000
committerShaun Ruffell <sruffell@digium.com>2010-09-21 19:26:22 +0000
commit1dd703f49d97690e451d6db50832815828bfe56f (patch)
treeb2e0cca38fd171bd3c606002cd1a62863492c5be /drivers/dahdi
parent1e98c373fa8b80a51b234ba13070942c3d82c719 (diff)
wcte12xp, wctdm24xxp: Do not rely on polling main memory.
The voicebus library by default configures the PCI interface to poll the descriptor ring for available buffers. There are some platforms like the Intel SG3420P motherboard where this does not appear to be sufficient. Writing to the transmit demand poll register resolves this problem on these troublesome platforms. DAHDI-700 DAHDI-702. Signed-off-by: Shaun Ruffell <sruffell@digium.com> git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@9397 a0bf4364-ded3-4de4-8d8a-66a801d63aff
Diffstat (limited to 'drivers/dahdi')
-rw-r--r--drivers/dahdi/voicebus/voicebus.c29
1 files changed, 20 insertions, 9 deletions
diff --git a/drivers/dahdi/voicebus/voicebus.c b/drivers/dahdi/voicebus/voicebus.c
index f78347b..a074630 100644
--- a/drivers/dahdi/voicebus/voicebus.c
+++ b/drivers/dahdi/voicebus/voicebus.c
@@ -720,11 +720,7 @@ vb_submit_rxb(struct voicebus *vb, struct vbb *vbb)
return 0;
}
-/**
- * voicebus_transmit - Queue a buffer on the hardware descriptor ring.
- *
- */
-int voicebus_transmit(struct voicebus *vb, struct vbb *vbb)
+static int __voicebus_transmit(struct voicebus *vb, struct vbb *vbb)
{
struct voicebus_descriptor *d;
struct voicebus_descriptor_list *dl = &vb->txd;
@@ -749,6 +745,17 @@ int voicebus_transmit(struct voicebus *vb, struct vbb *vbb)
atomic_inc(&dl->count);
return 0;
}
+
+/**
+ * voicebus_transmit - Queue a buffer on the hardware descriptor ring.
+ *
+ */
+int voicebus_transmit(struct voicebus *vb, struct vbb *vbb)
+{
+ int res = __voicebus_transmit(vb, vbb);
+ __vb_setctl(vb, 0x0008, 0x00000000);
+ return res;
+}
EXPORT_SYMBOL(voicebus_transmit);
@@ -813,8 +820,9 @@ static void setup_descriptors(struct voicebus *vb)
while (!list_empty(&buffers)) {
vbb = list_entry(buffers.next, struct vbb, entry);
list_del_init(&vbb->entry);
- voicebus_transmit(vb, vbb);
+ __voicebus_transmit(vb, vbb);
}
+ __vb_setctl(vb, 0x0008, 0x00000000);
vb_enable_deferred(vb);
}
@@ -1284,8 +1292,9 @@ static void vb_tasklet_boot(unsigned long data)
while (!list_empty(&buffers)) {
vbb = list_entry(buffers.next, struct vbb, entry);
list_del(&vbb->entry);
- voicebus_transmit(vb, vbb);
+ __voicebus_transmit(vb, vbb);
}
+ __vb_setctl(vb, 0x0008, 0x00000000);
/* If there may still be buffers in the descriptor rings, reschedule
* ourself to run again. We essentially yield here to allow any other
@@ -1359,8 +1368,9 @@ static void vb_tasklet_hx8(unsigned long data)
while (!list_empty(&buffers)) {
vbb = list_entry(buffers.next, struct vbb, entry);
list_del(&vbb->entry);
- voicebus_transmit(vb, vbb);
+ __voicebus_transmit(vb, vbb);
}
+ __vb_setctl(vb, 0x0008, 0x00000000);
/* Print any messages about soft latency bumps after we fix the transmit
* descriptor ring. Otherwise it's possible to take so much time
@@ -1504,8 +1514,9 @@ static void vb_tasklet_normal(unsigned long data)
while (!list_empty(&buffers)) {
vbb = list_entry(buffers.next, struct vbb, entry);
list_del(&vbb->entry);
- voicebus_transmit(vb, vbb);
+ __voicebus_transmit(vb, vbb);
}
+ __vb_setctl(vb, 0x0008, 0x00000000);
/* Print any messages about soft latency bumps after we fix the transmit
* descriptor ring. Otherwise it's possible to take so much time