[svn-commits] sruffell: branch 1.4 r4593 - in /branches/1.4/kernel: ./ wctc4xxp/

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Dec 4 17:09:28 CST 2008


Author: sruffell
Date: Thu Dec  4 17:09:28 2008
New Revision: 4593

URL: http://svn.digium.com/view/zaptel?view=rev&rev=4593
Log:
Service the transmit descriptor ring before the receive descriptor ring so
that commands that are still sitting on the transmit descriptor ring are not
completed twice.

Modified:
    branches/1.4/kernel/wctc4xxp/base.c
    branches/1.4/kernel/zttranscode.c

Modified: branches/1.4/kernel/wctc4xxp/base.c
URL: http://svn.digium.com/view/zaptel/branches/1.4/kernel/wctc4xxp/base.c?view=diff&rev=4593&r1=4592&r2=4593
==============================================================================
--- branches/1.4/kernel/wctc4xxp/base.c (original)
+++ branches/1.4/kernel/wctc4xxp/base.c Thu Dec  4 17:09:28 2008
@@ -1977,43 +1977,13 @@
 	}
 }
 
-static inline void service_dte(struct wcdte *wc) 
+static inline void service_tx_ring(struct wcdte *wc)
 {
 	struct tcb *cmd;
-
-	/* 
-	 * Process the received packets
-	 */
-	while((cmd = wctc4xxp_retrieve(wc->rxd))) {
-		struct tcb *newcmd;
-
-		wctc4xxp_net_capture_cmd(wc, cmd);
-
-		if(!(newcmd = __alloc_cmd(ALLOC_FLAGS, 0))) {
-			DTE_PRINTK(ERR, "Out of memory in %s.\n", __FUNCTION__);
-		} else {
-			if (newcmd->data_len < MAX_FRAME_SIZE) {
-				newcmd->data = kmalloc(MAX_FRAME_SIZE, ALLOC_FLAGS);
-				if (!newcmd->data) {
-					DTE_PRINTK(ERR, "out of memory in %s " \
-					    "again.\n", __FUNCTION__);
-				}
-				newcmd->data_len = MAX_FRAME_SIZE;
-			}
-			if (wctc4xxp_submit(wc->rxd, newcmd)) {
-				DTE_PRINTK(ERR, "Failed submit in %s\n", __FUNCTION__);
-				free_cmd(newcmd);
-			}
-			wctc4xxp_receive_demand_poll(wc);
-		}
-		wctc4xxp_receiveprep(wc, cmd);
-	}
-	wctc4xxp_receive_demand_poll(wc);
-	
 	/* 
 	 * Process the transmit packets
 	 */
-	while((cmd = wctc4xxp_retrieve(wc->txd))) {
+	while ((cmd = wctc4xxp_retrieve(wc->txd))) {
 		if (!(cmd->flags & (__WAIT_FOR_ACK | __WAIT_FOR_RESPONSE))) {
 			/* If we're not waiting for an ACK or Response from
 			 * the DTE, this message should not be sitting on any
@@ -2043,6 +2013,45 @@
 	}
 }
 
+static inline void service_rx_ring(struct wcdte *wc)
+{
+	struct tcb *cmd;
+	/* 
+	 * Process the received packets
+	 */
+	while ((cmd = wctc4xxp_retrieve(wc->rxd))) {
+		struct tcb *newcmd;
+
+		wctc4xxp_net_capture_cmd(wc, cmd);
+
+		if(!(newcmd = __alloc_cmd(ALLOC_FLAGS, 0))) {
+			DTE_PRINTK(ERR, "Out of memory in %s.\n", __FUNCTION__);
+		} else {
+			if (newcmd->data_len < MAX_FRAME_SIZE) {
+				newcmd->data = kmalloc(MAX_FRAME_SIZE, ALLOC_FLAGS);
+				if (!newcmd->data) {
+					DTE_PRINTK(ERR, "out of memory in %s " \
+					    "again.\n", __FUNCTION__);
+				}
+				newcmd->data_len = MAX_FRAME_SIZE;
+			}
+			if (wctc4xxp_submit(wc->rxd, newcmd)) {
+				DTE_PRINTK(ERR, "Failed submit in %s\n", __FUNCTION__);
+				free_cmd(newcmd);
+			}
+			wctc4xxp_receive_demand_poll(wc);
+		}
+		wctc4xxp_receiveprep(wc, cmd);
+	}
+	wctc4xxp_receive_demand_poll(wc);
+}
+
+static inline void service_dte(struct wcdte *wc) 
+{
+	service_tx_ring(wc);
+	service_rx_ring(wc);
+}
+
 
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
 static void deferred_work_func(void *param)
@@ -2833,6 +2842,9 @@
 	struct tcb *cmd, *temp;
 	LIST_HEAD(cmds_to_retry);
 	const int MAX_RETRIES = 5;
+
+	/* Check for any commands that have completed transmission. */
+	service_tx_ring(wc);
 
 	spin_lock(&wc->cmd_list_lock);
 	/* Go through the list of messages that are waiting for responses from

Modified: branches/1.4/kernel/zttranscode.c
URL: http://svn.digium.com/view/zaptel/branches/1.4/kernel/zttranscode.c?view=diff&rev=4593&r1=4592&r2=4593
==============================================================================
--- branches/1.4/kernel/zttranscode.c (original)
+++ branches/1.4/kernel/zttranscode.c Thu Dec  4 17:09:28 2008
@@ -179,8 +179,7 @@
 
 /* Find a free channel on the transcoder and mark it busy. */
 static inline struct zt_transcoder_channel *
-get_free_channel(struct zt_transcoder *tc)
-
+get_free_channel(struct zt_transcoder *tc, const struct zt_transcoder_formats *fmts)
 {
 	struct zt_transcoder_channel *chan;
 	int i;
@@ -225,7 +224,7 @@
 			/* We found a transcoder that can handle our formats.
 			 * Now look for an available channel. */
 			match = 1; 
-			if ((chan = get_free_channel(tc))) {
+			if ((chan = get_free_channel(tc, fmts))) {
 				/* transcoder tc has a free channel.  In order
 				 * to spread the load among available
 				 * transcoders (when there are more than one




More information about the svn-commits mailing list