]> err.no Git - linux-2.6/blobdiff - drivers/media/video/ivtv/ivtv-udma.c
Merge branch 'linus' into x86/paravirt-spinlocks
[linux-2.6] / drivers / media / video / ivtv / ivtv-udma.c
index 5592abbe14e61b608ec391045a218b5a092ea789..460db03b0ba061477ae321038378f99b08c6b61e 100644 (file)
@@ -21,7 +21,6 @@
  */
 
 #include "ivtv-driver.h"
-#include "ivtv-streams.h"
 #include "ivtv-udma.h"
 
 void ivtv_udma_get_page_info(struct ivtv_dma_page_info *dma_page, unsigned long first, unsigned long size)
@@ -40,6 +39,9 @@ int ivtv_udma_fill_sg_list (struct ivtv_user_dma *dma, struct ivtv_dma_page_info
        int i, offset;
        unsigned long flags;
 
+       if (map_offset < 0)
+               return map_offset;
+
        offset = dma_page->offset;
 
        /* Fill SG Array with new values */
@@ -47,29 +49,27 @@ int ivtv_udma_fill_sg_list (struct ivtv_user_dma *dma, struct ivtv_dma_page_info
                unsigned int len = (i == dma_page->page_count - 1) ?
                        dma_page->tail : PAGE_SIZE - offset;
 
-               dma->SGlist[map_offset].length = len;
-               dma->SGlist[map_offset].offset = offset;
                if (PageHighMem(dma->map[map_offset])) {
                        void *src;
 
                        if (dma->bouncemap[map_offset] == NULL)
                                dma->bouncemap[map_offset] = alloc_page(GFP_KERNEL);
                        if (dma->bouncemap[map_offset] == NULL)
-                               return -ENOMEM;
+                               return -1;
                        local_irq_save(flags);
                        src = kmap_atomic(dma->map[map_offset], KM_BOUNCE_READ) + offset;
                        memcpy(page_address(dma->bouncemap[map_offset]) + offset, src, len);
                        kunmap_atomic(src, KM_BOUNCE_READ);
                        local_irq_restore(flags);
-                       dma->SGlist[map_offset].page = dma->bouncemap[map_offset];
+                       sg_set_page(&dma->SGlist[map_offset], dma->bouncemap[map_offset], len, offset);
                }
                else {
-                       dma->SGlist[map_offset].page = dma->map[map_offset];
+                       sg_set_page(&dma->SGlist[map_offset], dma->map[map_offset], len, offset);
                }
                offset = 0;
                map_offset++;
        }
-       return 0;
+       return map_offset;
 }
 
 void ivtv_udma_fill_sg_array (struct ivtv_user_dma *dma, u32 buffer_offset, u32 buffer_offset_2, u32 split) {
@@ -138,13 +138,12 @@ int ivtv_udma_setup(struct ivtv *itv, unsigned long ivtv_dest_addr,
        dma->page_count = user_dma.page_count;
 
        /* Fill SG List with new values */
-       err = ivtv_udma_fill_sg_list(dma, &user_dma, 0);
-       if (err) {
+       if (ivtv_udma_fill_sg_list(dma, &user_dma, 0) < 0) {
                for (i = 0; i < dma->page_count; i++) {
                        put_page(dma->map[i]);
                }
                dma->page_count = 0;
-               return err;
+               return -ENOMEM;
        }
 
        /* Map SG List */