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

SVN commits to the Digium repositories svn-commits at lists.digium.com
Mon Oct 5 17:58:46 CDT 2009


Author: sruffell
Date: Mon Oct  5 17:58:35 2009
New Revision: 7341

URL: http://svnview.digium.com/svn/dahdi?view=rev&rev=7341
Log:
wip: move the vbb_stash into 'struct voicebus' and cleanup the print messages.

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=7341&r1=7340&r2=7341
==============================================================================
--- linux/team/sruffell/dahdi-linux-chainedvb/drivers/dahdi/voicebus/voicebus.c (original)
+++ linux/team/sruffell/dahdi-linux-chainedvb/drivers/dahdi/voicebus/voicebus.c Mon Oct  5 17:58:35 2009
@@ -175,6 +175,11 @@
  *
  * @tx_idle_vbb: 		 
  * @tx_idle_vbb_dma_addr:
+ * @vbb_stash:	Temporary holding place for the vb_deferred routine.
+ *
+ * NOTE: vbb_stash is in this structure even though it is only used in the
+ * interrupt handler because I do not want to put that much data on the
+ * interrupts stack.
  *
  */
 struct voicebus {
@@ -236,6 +241,7 @@
 	u32 sdi;
 	/*! Number of tx buffers to queue up before enabling interrupts. */
 	unsigned int 	min_tx_buffer_count;
+	void *vbb_stash[DLIST_SIZE];
 };
 
 /*
@@ -1298,7 +1304,15 @@
 	voicebus_set_minlatency(vb, latency);
 }
 
-static void *vbb_stash[DLIST_SIZE];
+static void vb_set_all_owned(struct voicebus *vb)
+{
+	struct voicebus_chained_descriptor *d;
+	struct list_head *const list = &vb->txd.list;
+
+	list_for_each_entry(d, list, node)
+		SET_OWNED(d->desc);
+}
+
 /*!
  * \brief Actually process the completed transmit and receive buffers.
  *
@@ -1320,12 +1334,20 @@
 	start_vb_deferred(vb);
 
 	buffer_count = 0;
-	/* Always handle the transmit buffers first. */
+
+	/* First, grab any buffers that are completed. */
 	while ((vbb = vb_get_completed_txb(vb))) {
-		vbb_stash[buffer_count] = vbb;
+		vb->vbb_stash[buffer_count] = vbb;
 		++buffer_count;
 	}
 
+	/* Insurance in the case of an underrun condition.  We don't want the
+	 * card getting 'stuck' on a descriptor that isn't owened. */
+	if (unlikely(underrun))
+		vb_set_all_owned(vb);
+
+	/* Before adding any new buffers to the transmit descriptor ring, check
+	 * to see if we're in a softunderrun condition. */
 	/* NOTE: Do not print anything to the console from the time you've
 	 * detected a soft underrun until the transmit descriptors are fixed up
 	 * again. Otherwise the hardware could advance past where you set the
@@ -1338,19 +1360,20 @@
 		__vb_increase_latency(vb, idle_buffers + buffer_count);
 	}
 
-	for (i = 0; i < buffer_count; ++i) {
-		/* After the upper layer is done with the completed buffer, it
-		 * will call voicebus_transmit to add it back to the descriptor
-		 * ring itself. */
-		vb->handle_transmit(vbb_stash[i], vb->context);
-	}
+	/* Now that we've checked for and handled any soft underrun condition,
+	 * it's safe to give the buffers to the client for processing. */
+	for (i = 0; i < buffer_count; ++i)
+		vb->handle_transmit(vb->vbb_stash[i], vb->context);
 
 	/* This is a hard underrun.  I.e., the hardware was able to completely
 	 * drain the transmit descriptor ring which means that interrupts were
 	 * locked for DLIST_SIZE ms. */
 	if (unlikely(underrun)) {
-		if (printk_ratelimit())
-			HERE();
+		if (printk_ratelimit()) {
+			dev_info(&vb->pdev->dev, "Host failed to service "
+				 "card interrupt within %d. Recovery "
+				 "attempted.\n", DLIST_SIZE);
+		}
 		vb_rx_demand_poll(vb);
 		vb_tx_demand_poll(vb);
 		clear_bit(TX_UNDERRUN, &vb->flags);
@@ -1360,9 +1383,10 @@
 	 * transmit buffer...otherwise it's possible to take so much time
 	 * printing the dmesg output that we lost the lead that we got on the
 	 * hardware, resulting in a hard underrun condition. */
-	if (unlikely(softunderrun)) {
-		dev_info(&vb->pdev->dev, "Sent %d idle buffers. Latency set to %d ms in order to compensate.\n",
-			idle_buffers, vb->min_tx_buffer_count);
+	if (unlikely(softunderrun) && printk_ratelimit()) {
+		dev_info(&vb->pdev->dev, "Sent %d idle buffers. Latency set "
+			 "to %d ms in order to compensate.\n",
+			 idle_buffers, vb->min_tx_buffer_count);
 	}
 
 	while ((vbb = vb_get_completed_rxb(vb))) {




More information about the svn-commits mailing list