[svn-commits] sruffell: branch linux/sruffell/dahdi-linux-chainedvb r7307 - /linux/team/sru...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Oct 1 15:43:08 CDT 2009


Author: sruffell
Date: Thu Oct  1 15:42:58 2009
New Revision: 7307

URL: http://svnview.digium.com/svn/dahdi?view=rev&rev=7307
Log:
wip: try moving the latency bump until later in the function and fix limit

Also add a temporary debug module parameter for the dahdi_voicebus module while
troubleshooting.  Interrupts aren't stopping anymore, but the 'softunderrun' is
now not properly detected.

Modified:
    linux/team/sruffell/dahdi-linux-chainedvb/drivers/dahdi/voicebus/voicebus.c

Modified: linux/team/sruffell/dahdi-linux-chainedvb/drivers/dahdi/voicebus/voicebus.c
URL: http://svnview.digium.com/svn/dahdi/linux/team/sruffell/dahdi-linux-chainedvb/drivers/dahdi/voicebus/voicebus.c?view=diff&rev=7307&r1=7306&r2=7307
==============================================================================
--- linux/team/sruffell/dahdi-linux-chainedvb/drivers/dahdi/voicebus/voicebus.c (original)
+++ linux/team/sruffell/dahdi-linux-chainedvb/drivers/dahdi/voicebus/voicebus.c Thu Oct  1 15:42:58 2009
@@ -29,6 +29,8 @@
 
 #define DEBUG
 #define HERE() printk(KERN_DEBUG "HERE: %s:%d\n", __FILE__, __LINE__)
+
+static int debug;
 
 #include <linux/version.h>
 #include <linux/slab.h>
@@ -136,6 +138,9 @@
 	dma_addr_t	dma_addr;
 	struct list_head node;
 	void 		*pending;
+#ifdef DEBUG
+	int		index;
+#endif
 };
 
 /**
@@ -415,6 +420,9 @@
 		d = kzalloc(sizeof(*d), GFP_KERNEL);
 		if (!d)
 			goto error_nomem;
+#ifdef DEBUG
+		d->index = i;
+#endif
 
 		d->desc = dma_alloc_coherent(&vb->pdev->dev, sizeof(*d->desc),
 					     &d->dma_addr, GFP_KERNEL);
@@ -462,10 +470,8 @@
 	}
 
 	list_for_each_entry(d, &vb->txd.list, node) {
-		/*
-		dev_dbg(&vb->pdev->dev, "desc: %p (next: %08x)\n",
-			(void*)d->desc, d->desc->buffer2);
-		*/
+		dev_dbg(&vb->pdev->dev, "desc: %p (next: %08x) idle: %08llx\n",
+			d->desc, d->desc->buffer2, (u64)vb->idle_vbb_dma_addr);
 		d->desc->buffer1 = vb->idle_vbb_dma_addr;
 		d->pending = vb->idle_vbb;
 		SET_OWNED(d->desc);
@@ -797,12 +803,10 @@
 
 	d = dl->tail;
 
-	/* 
-	if (printk_ratelimit())
-		dev_dbg(&vb->pdev->dev, "d->desc->buffer1 = %08x\n", d->desc->buffer1);
-	*/
 	/* Do not overwrite a buffer that is still in progress. */
 	if (unlikely(d->desc->buffer1 != vb->idle_vbb_dma_addr)) {
+		if (debug)
+			dev_dbg(&vb->pdev->dev, "overrun d->index = %d\n", d->index);
 		voicebus_free(vb, vbb);
 		return -EFAULT;
 	}
@@ -812,6 +816,9 @@
 	d->desc->buffer2 = dl->tail->dma_addr;
 	d->desc->buffer1 = dma_map_single(&vb->pdev->dev, vbb,
 					  vb->framesize, dl->direction);
+	if (debug)
+		dev_dbg(&vb->pdev->dev, "tail->index %d tail->buffer1 %08x (vbb:%p)\n", d->index, d->desc->buffer1, vbb);
+
 
 	/* That's it until the hardware is done with it. */
 	SET_OWNED(d->desc);
@@ -871,15 +878,16 @@
 	assert_in_vb_deferred(vb);
 	d = dl->head;
 
-	/*
-	if (printk_ratelimit()) {
-		dev_dbg(&vb->pdev->dev, "buffer1: %08x idle: %08x\n",
-			d->desc->buffer1, (u32)vb->idle_vbb_dma_addr);
-	}
-	*/
-
 	if (d->desc->buffer1 == vb->idle_vbb_dma_addr)
 		return NULL;
+
+	if (debug) {
+		if ((d->desc->des1 & 0x3ff) != vb->framesize) {
+			dev_dbg(&vb->pdev->dev, "*************************");
+		}
+		dev_dbg(&vb->pdev->dev, "complete %d buffer1: %08x (des1: %08x) (framesize: %d)\n",
+			d->index, d->desc->buffer1, (d->desc->des1), vb->framesize);
+	}
 
 	dma_unmap_single(&vb->pdev->dev, d->desc->buffer1,
 			 vb->framesize, dl->direction);
@@ -905,7 +913,13 @@
 static bool vb_check_softunderrun(const struct voicebus *vb)
 {
 	const struct voicebus_chained_descriptor *const d = vb->txd.head;
-	return ((d->desc->buffer1 == vb->idle_vbb_dma_addr) && !OWNED(d->desc));
+	if ((d->desc->buffer1 == vb->idle_vbb_dma_addr) && !OWNED(d->desc)) {
+		dev_dbg(&vb->pdev->dev, "UNDERRUN desc: %p buffer1: %08x idle: %08x\n",
+			d->desc, d->desc->buffer1, (u32)vb->idle_vbb_dma_addr);
+		return true;
+	} else {
+		return false;
+	}
 }
 
 /**
@@ -923,7 +937,8 @@
 	struct voicebus_chained_descriptor *next;
 	int count = 1;
 
-	next = get_next_descriptor(dl, dl->head);
+	/* next = get_next_descriptor(dl, dl->head); */
+	next = dl->head;
 
 	while (!OWNED(next->desc)) {
 		next->desc->buffer1 = vb->idle_vbb_dma_addr;
@@ -933,13 +948,13 @@
 		++count;
 	}
 
-	if (printk_ratelimit())
+	if (debug)
 		dev_info(&vb->pdev->dev, "Behind by %d descriptors.\n", count);
 
 	count = 8;
 	while (--count) {
 		next = get_next_descriptor(dl, next);
-		SET_OWNED(next->desc); /* !!! this shouldn't be necessary */
+		/* SET_OWNED(next->desc); */ /* !!! this shouldn't be necessary */
 	}
 
 	vb->txd.tail = next;
@@ -1324,28 +1339,18 @@
 	int limit = DLIST_SIZE;
 
 	start_vb_deferred(vb);
-	if (unlikely(underrun)) {
-		/* When we've underrun our FIFO, for some reason we're not
-		 * able to keep enough transmit descriptors pending.  This can
-		 * happen if either interrupts or this deferred processing
-		 * function is not run soon enough (within 1ms when using the
-		 * default 3 transmit buffers to start).  In this case, we'll
-		 * insert an additional transmit buffer onto the descriptor
-		 * list which decreases the sensitivity to latency, but also
-		 * adds more delay to the TDM and SPI data.
-		 */
-		__vb_increase_latency(vb, 1);
-	}
-
 	/* Always handle the transmit buffers first. */
-	while ((vbb = vb_get_completed_txb(vb)) && --limit) {
+	while ((vbb = vb_get_completed_txb(vb))) {
 		vb->handle_transmit(vbb, vb->context);
+		if (!(--limit))
+			break;
 	}
 
 	if (unlikely(vb_check_softunderrun(vb)))
 		vb_recover_tx_descriptor_list(vb);
 
 	if (unlikely(underrun)) {
+		__vb_increase_latency(vb, 1);
 		vb_rx_demand_poll(vb);
 		vb_tx_demand_poll(vb);
 		clear_bit(TX_UNDERRUN, &vb->flags);
@@ -1359,7 +1364,6 @@
 	stop_vb_deferred(vb);
 	/* dev_dbg(&vb->pdev->dev, "Leaving %s\n", __func__); */
 }
-
 
 /*!
  * \brief Interrupt handler for VoiceBus interface.
@@ -1796,6 +1800,8 @@
 	WARN_ON(!list_empty(&binary_loader_list));
 }
 
+module_param(debug, int, 0600);
+
 MODULE_DESCRIPTION("Voicebus Interface w/VPMADT032 support");
 MODULE_AUTHOR("Digium Incorporated <support at digium.com>");
 MODULE_LICENSE("GPL");




More information about the svn-commits mailing list