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

SVN commits to the Digium repositories svn-commits at lists.digium.com
Wed Sep 9 01:13:19 CDT 2009


Author: sruffell
Date: Wed Sep  9 01:13:17 2009
New Revision: 7106

URL: http://svn.asterisk.org/svn-view/dahdi?view=rev&rev=7106
Log:
Revert "wip:  In the middle of restructuring in order to support the idle list."

I believe this was the wrong way to go about this.  I think it will be easier to
keep a single list....

This reverts commit 31afccba2c8f679030802171d1f94cce33425355.

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://svn.asterisk.org/svn-view/dahdi/linux/team/sruffell/dahdi-linux-chainedvb/drivers/dahdi/voicebus/voicebus.c?view=diff&rev=7106&r1=7105&r2=7106
==============================================================================
--- linux/team/sruffell/dahdi-linux-chainedvb/drivers/dahdi/voicebus/voicebus.c (original)
+++ linux/team/sruffell/dahdi-linux-chainedvb/drivers/dahdi/voicebus/voicebus.c Wed Sep  9 01:13:17 2009
@@ -138,37 +138,28 @@
  * @desc:	Kernel virtual address of the descriptor.
  * @desc_dma:	Bus address of the desc to give to the hardware.
  * @pending:	Kernel virtual address desc->buffer1.
- * @idle_desc:	Either NULL or the first entry on the idle list.	
- * @node:	Used to chain the descriptors in host memory.
  *
  */
 struct voicebus_chained_descriptor {
 	struct voicebus_descriptor *desc;
 	dma_addr_t	dma_addr;
+	struct list_head node;
 	void 		*pending;
-	struct voicebus_chained_descriptor *idle_desc;
-	struct list_head node;
 };
 
 /**
  * struct voicebus_descriptor_list -
- * @active_list:   Allocated buffer list.
- * @head:	   Next buffer to complete.
- * @tail:	   Next free buffer to use.
- * @direction:	   DMA_FROM_DEVICE or DMA_TO_DEVICE
- * @padding:	   Number of bytes to pad descriptors for cache alignment.
- * @idle_buffer:   Kernel virtual addres of common overflow buffer.
- * @idle_dma_addr: Bus address of the overflow buffer.
- * @count:	   The number of descriptors given to hardware.
+ * @desc_list:	Allocated buffer list.
+ * @head:	Next buffer to complete.
+ * @tail:	Next free buffer to use.
+ * @direction:	DMA_FROM_DEVICE or DMA_TO_DEVICE
+ * @padding:	Number of bytes to pad descriptors for cache alignment.
  *
  */
 struct voicebus_descriptor_list {
-	struct list_head	active_list;
+	struct list_head	desc_list;
 	struct voicebus_chained_descriptor *head;
 	struct voicebus_chained_descriptor *tail;
-	struct list_head 	idle_list;
-	void 			*idle_buffer;
-	dma_addr_t		idle_dma_addr;
 	enum dma_data_direction	direction;
 	unsigned int		padding;
 	atomic_t		count;
@@ -282,7 +273,7 @@
 
 /* Bit definitions for struct voicebus.flags */
 #define TX_UNDERRUN			1
-#define ON_IDLE_LIST			2
+#define RX_UNDERRUN			2
 #define IN_DEFERRED_PROCESSING		3
 #define STOP				4
 #define STOPPED				5
@@ -357,25 +348,16 @@
 		    struct voicebus_chained_descriptor *d)
 {
 	/* Skip the head of the list if necessary. */
-	return (d->node.next == &dl->active_list) ? 
-		list_entry(dl->active_list.next, typeof(*d), node) :
+	return (d->node.next == &dl->desc_list) ? 
+		list_entry(dl->desc_list.next, typeof(*d), node) :
 		list_entry(d->node.next, typeof(*d), node);
 }
 
-static struct voicebus_chained_descriptor *
-get_prev_descriptor(struct voicebus_descriptor_list *dl,
-		    struct voicebus_chained_descriptor *d)
-{
-	/* Skip the head of the list if necessary. */
-	return (d->node.prev == &dl->active_list) ? 
-		list_entry(dl->active_list.prev, typeof(*d), node) :
-		list_entry(d->node.prev, typeof(*d), node);
-}
 static void vb_cleanup_descriptors(struct voicebus *vb,
 				   struct voicebus_descriptor_list *dl)
 {
 	struct voicebus_chained_descriptor *d;
-	struct list_head *const list = &dl->active_list;
+	struct list_head *const list = &dl->desc_list;
 
 	list_for_each_entry(d, list, node) {
 		if (d->desc->buffer1) {
@@ -420,7 +402,7 @@
 vb_free_descriptors(struct voicebus *vb, struct voicebus_descriptor_list *dl)
 {
 	struct voicebus_chained_descriptor *d;
-	struct list_head *const list = &dl->active_list;
+	struct list_head *const list = &dl->desc_list;
 
 	vb_cleanup_descriptors(vb, dl);
 	while (!list_empty(list)) {
@@ -430,10 +412,6 @@
 				  d->desc, d->dma_addr);
 		kfree(d);
 	}
-	dma_free_coherent(&vb->pdev->dev, vb->framesize,
-			  dl->idle_buffer, dl->idle_dma_addr);
-	dl->idle_buffer = NULL;
-	dl->idle_dma_addr = 0;
 }
 #else
 static void
@@ -451,29 +429,20 @@
 #endif
 
 #if defined(USE_CHAINED_DESCRIPTORS)
-#define vb_initialize_descriptors vb_initialize_chained_descriptors
 static int
-vb_initialize_chained_descriptors(struct voicebus *vb, struct voicebus_descriptor_list *dl,
-				  u32 des1, unsigned int direction)
+vb_initialize_descriptors(struct voicebus *vb, struct voicebus_descriptor_list *dl,
+	u32 des1, unsigned int direction)
 {
 	int i;
 	const u32 CHAINED = 0x01000000;
 	struct voicebus_chained_descriptor *d;
 	struct voicebus_chained_descriptor *prev;
-	struct list_head *const list = &dl->idle_list;
 
 	/* Since we're passing each descriptor address explicitly, we don't
 	 * need any padding for the chained descriptor. */
 	dl->padding = 0;
 
-	INIT_LIST_HEAD(&dl->active_list);
-	INIT_LIST_HEAD(&dl->idle_list);
-	dl->idle_buffer = dma_alloc_coherent(&vb->pdev->dev, vb->framesize,
-				       &dl->idle_dma_addr, GFP_KERNEL);
-
-	if (!dl->idle_buffer)
-		return -ENOMEM;
-
+	INIT_LIST_HEAD(&dl->desc_list);
 
 	for (i = 0; i < DLIST_SIZE; ++i) {
 		d = kzalloc(sizeof(*d), GFP_KERNEL);
@@ -487,18 +456,14 @@
 			goto error_nomem;
 		}
 		
-		list_add_tail(&d->node, list);
-	}
-
-	dl->head = list_entry(list->next, typeof(*d), node);
+		list_add_tail(&d->node, &dl->desc_list);
+	}
+
+	dl->head = list_entry(dl->desc_list.next, typeof(*d), node);
 	dl->tail = dl->head;
 
-	/* By default, chain all the descriptors together, and point them all
-	 * at the idle buffer. */
 	prev = dl->head;
-	list_for_each_entry_reverse(d, list, node) {
-		d->pending = dl->idle_buffer;
-		d->desc->buffer1 = dl->idle_dma_addr;
+	list_for_each_entry_reverse(d, &dl->desc_list, node) {
 		d->desc->buffer2 = prev->dma_addr;
 		d->desc->des1 |= cpu_to_le32(des1 | CHAINED);
 		prev = d;
@@ -512,9 +477,8 @@
 	return -ENOMEM;
 }
 #else
-#define vb_initialize_descriptors vb_initialize_ring_descriptors
 static int
-vb_initialize_ring_descriptors(struct voicebus *vb, struct voicebus_descriptor_list *dl,
+vb_initialize_descriptors(struct voicebus *vb, struct voicebus_descriptor_list *dl,
 	u32 des1, unsigned int direction)
 {
 	int i;
@@ -920,7 +884,6 @@
 		     struct voicebus_descriptor_list *dl, void *vbb)
 {
 	struct voicebus_chained_descriptor *d;
-	struct voicebus_chained_descriptor *p;
 
 	d = dl->tail;
 
@@ -928,23 +891,12 @@
 	if (unlikely(d->desc->buffer1)) {
 		WARN_ON(1);
 		voicebus_free(vb, vbb);
-		return -EBUSY;
 	}
 
 	dl->tail = get_next_descriptor(dl, d);
 	d->pending = vbb;
 	d->desc->buffer1 = dma_map_single(&vb->pdev->dev, vbb,
 					  vb->framesize, dl->direction);
-	
-	d->idle_desc = list_entry(dl->idle_list.next, typeof(*d), node);
-	d->desc->buffer2 = d->idle_desc->dma_addr;
-
-	p = get_prev_descriptor(dl, d);
-	p->desc->buffer2 = d->dma_addr;
-	p->idle_desc = NULL;
-
-	wmb();
-	WARN_ON(!OWNED(p->desc));
 
 	/* That's it until the hardware is done with it. */
 	SET_OWNED(d->desc);
@@ -952,7 +904,7 @@
 	return -EFAULT;
 }
 
-static void *vb_retrieve(struct voicebus *vb,
+static void* vb_retrieve(struct voicebus *vb,
 			 struct voicebus_descriptor_list *dl)
 {
 	struct voicebus_chained_descriptor *d;
@@ -967,10 +919,6 @@
 		dl->head = get_next_descriptor(dl, d);
 		d->desc->buffer1 = 0;
 		atomic_dec(&dl->count);
-
-		if (unlikely(d->idle_desc))
-			set_bit(ON_IDLE_LIST, &vb->flags);
-
 		return vbb;
 	} else {
 		return NULL;
@@ -1445,11 +1393,8 @@
 	}
 
 	/* Always handle the transmit buffers first. */
-	while ((vbb = vb_get_completed_txb(vb))) {
+	while ((vbb = vb_get_completed_txb(vb)))
 		vb->handle_transmit(vbb, vb->context);
-		if (unlikely(test_bit(ON_IDLE_LIST, &vb->flags))) {
-		}
-	}
 
 	if (unlikely(underrun)) {
 		vb_rx_demand_poll(vb);




More information about the svn-commits mailing list