From: Rusty Russell <rusty@rustcorp.com.au>
Date: Fri, 9 Nov 2007 20:31:37 +1100
Subject: [PATCH] dma_map_sg_ring() helper

No arch changes needed; it's easy to use dma_map_sg on one part at a time.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
---
 drivers/base/dma-mapping.c  |   13 +++++++++++++
 include/linux/dma-mapping.h |    4 ++++
 2 files changed, 17 insertions(+), 0 deletions(-)

diff --git a/drivers/base/dma-mapping.c b/drivers/base/dma-mapping.c
index ca9186f..3d2f9eb 100644
--- a/drivers/base/dma-mapping.c
+++ b/drivers/base/dma-mapping.c
@@ -8,6 +8,7 @@
  */
 
 #include <linux/dma-mapping.h>
+#include <linux/sg_ring.h>
 
 /*
  * Managed DMA API
@@ -162,6 +163,18 @@ void dmam_free_noncoherent(struct device *dev, size_t size, void *vaddr,
 }
 EXPORT_SYMBOL(dmam_free_noncoherent);
 
+void dma_map_sg_ring(struct device *dev, struct sg_ring *sg,
+		     enum dma_data_direction direction)
+{
+	struct sg_ring *i = sg;
+
+	do {
+		BUG_ON(i->num > i->max);
+		i->num = dma_map_sg(dev, i->sg, i->num, direction);
+	} while ((i = sg_ring_next(i)) != sg);
+}
+EXPORT_SYMBOL(dma_map_sg_ring);
+
 #ifdef ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY
 
 static void dmam_coherent_decl_release(struct device *dev, void *res)
diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
index 101a2d4..06315b4 100644
--- a/include/linux/dma-mapping.h
+++ b/include/linux/dma-mapping.h
@@ -87,6 +87,10 @@ dma_mark_declared_memory_occupied(struct device *dev,
 }
 #endif
 
+struct sg_ring;
+extern void dma_map_sg_ring(struct device *dev, struct sg_ring *sg,
+			    enum dma_data_direction direction);
+
 /*
  * Managed DMA API
  */
-- 
1.5.2.5

