upgrade to fedora-2.6.12-1.1398.FC4 + vserver 2.0.rc7
[linux-2.6.git] / drivers / media / video / video-buf.c
index 7aa20cb..5afdc78 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: video-buf.c,v 1.15 2004/11/07 14:45:00 kraxel Exp $
+ * $Id: video-buf.c,v 1.18 2005/02/24 13:32:30 kraxel Exp $
  *
  * generic helper functions for video4linux capture buffers, to handle
  * memory management and PCI DMA.  Right now bttv + saa7134 use it.
@@ -20,6 +20,7 @@
 
 #include <linux/init.h>
 #include <linux/module.h>
+#include <linux/moduleparam.h>
 #include <linux/vmalloc.h>
 #include <linux/pagemap.h>
 #include <linux/slab.h>
@@ -216,9 +217,18 @@ int videobuf_dma_pci_map(struct pci_dev *dev, struct videobuf_dmabuf *dma)
                return -ENOMEM;
        }
 
-       if (!dma->bus_addr)
+       if (!dma->bus_addr) {
                dma->sglen = pci_map_sg(dev,dma->sglist,dma->nr_pages,
                                        dma->direction);
+               if (0 == dma->sglen) {
+                       printk(KERN_WARNING
+                              "%s: pci_map_sg failed\n",__FUNCTION__);
+                       kfree(dma->sglist);
+                       dma->sglist = NULL;
+                       dma->sglen = 0;
+                       return -EIO;
+               }
+       }
        return 0;
 }
 
@@ -892,6 +902,7 @@ void videobuf_read_stop(struct videobuf_queue *q)
        int i;
 
        videobuf_queue_cancel(q);
+       videobuf_mmap_free(q);
        INIT_LIST_HEAD(&q->stream);
        for (i = 0; i < VIDEO_MAX_FRAME; i++) {
                if (NULL == q->bufs[i])