V4L/DVB (8103): videodev: fix/improve ioctl debugging
[pandora-kernel.git] / drivers / media / video / se401.c
index 038448f..1cd6293 100644 (file)
@@ -35,7 +35,7 @@ static const char version[] = "0.24";
 #include <linux/usb.h>
 #include "se401.h"
 
-static int flickerless=0;
+static int flickerless;
 static int video_nr = -1;
 
 static struct usb_device_id device_table [] = {
@@ -300,10 +300,10 @@ static void se401_button_irq(struct urb *urb)
        case -ENOENT:
        case -ESHUTDOWN:
                /* this urb is terminated, clean up */
-               dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status);
+               dbg("%s - urb shutting down with status: %d", __func__, urb->status);
                return;
        default:
-               dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status);
+               dbg("%s - nonzero urb status received: %d", __func__, urb->status);
                goto exit;
        }
 
@@ -315,7 +315,7 @@ exit:
        status = usb_submit_urb (urb, GFP_ATOMIC);
        if (status)
                err ("%s - usb_submit_urb failed with result %d",
-                    __FUNCTION__, status);
+                    __func__, status);
 }
 
 static void se401_video_irq(struct urb *urb)
@@ -450,6 +450,13 @@ static int se401_start_stream(struct usb_se401 *se401)
        }
        for (i=0; i<SE401_NUMSBUF; i++) {
                se401->sbuf[i].data=kmalloc(SE401_PACKETSIZE, GFP_KERNEL);
+               if (!se401->sbuf[i].data) {
+                       for(i = i - 1; i >= 0; i--) {
+                               kfree(se401->sbuf[i].data);
+                               se401->sbuf[i].data = NULL;
+                       }
+                       return -ENOMEM;
+               }
        }
 
        se401->bayeroffset=0;
@@ -458,13 +465,26 @@ static int se401_start_stream(struct usb_se401 *se401)
        se401->scratch_overflow=0;
        for (i=0; i<SE401_NUMSCRATCH; i++) {
                se401->scratch[i].data=kmalloc(SE401_PACKETSIZE, GFP_KERNEL);
+               if (!se401->scratch[i].data) {
+                       for(i = i - 1; i >= 0; i--) {
+                               kfree(se401->scratch[i].data);
+                               se401->scratch[i].data = NULL;
+                       }
+                       goto nomem_sbuf;
+               }
                se401->scratch[i].state=BUFFER_UNUSED;
        }
 
        for (i=0; i<SE401_NUMSBUF; i++) {
                urb=usb_alloc_urb(0, GFP_KERNEL);
-               if(!urb)
-                       return -ENOMEM;
+               if(!urb) {
+                       for(i = i - 1; i >= 0; i--) {
+                               usb_kill_urb(se401->urb[i]);
+                               usb_free_urb(se401->urb[i]);
+                               se401->urb[i] = NULL;
+                       }
+                       goto nomem_scratch;
+               }
 
                usb_fill_bulk_urb(urb, se401->dev,
                        usb_rcvbulkpipe(se401->dev, SE401_VIDEO_ENDPOINT),
@@ -482,6 +502,18 @@ static int se401_start_stream(struct usb_se401 *se401)
        se401->framecount=0;
 
        return 0;
+
+ nomem_scratch:
+       for (i=0; i<SE401_NUMSCRATCH; i++) {
+               kfree(se401->scratch[i].data);
+               se401->scratch[i].data = NULL;
+       }
+ nomem_sbuf:
+       for (i=0; i<SE401_NUMSBUF; i++) {
+               kfree(se401->sbuf[i].data);
+               se401->sbuf[i].data = NULL;
+       }
+       return -ENOMEM;
 }
 
 static int se401_stop_stream(struct usb_se401 *se401)
@@ -1192,14 +1224,15 @@ static const struct file_operations se401_fops = {
        .read =         se401_read,
        .mmap =         se401_mmap,
        .ioctl =        se401_ioctl,
+#ifdef CONFIG_COMPAT
        .compat_ioctl = v4l_compat_ioctl32,
+#endif
        .llseek =       no_llseek,
 };
 static struct video_device se401_template = {
        .owner =        THIS_MODULE,
        .name =         "se401 USB camera",
        .type =         VID_TYPE_CAPTURE,
-       .hardware =     VID_HARDWARE_SE401,
        .fops =         &se401_fops,
 };
 
@@ -1248,7 +1281,7 @@ static int se401_init(struct usb_se401 *se401, int button)
        rc=se401_sndctrl(0, se401, SE401_REQ_GET_HEIGHT, 0, cp, sizeof(cp));
        se401->cheight=cp[0]+cp[1]*256;
 
-       if (!cp[2] && SE401_FORMAT_BAYER) {
+       if (!(cp[2] & SE401_FORMAT_BAYER)) {
                err("Bayer format not supported!");
                return 1;
        }