]> pilppa.com Git - linux-2.6-omap-h63xx.git/commitdiff
ARM: OMAP 2: Camera: Don't return -EIO in VIDIOC_DQBUF
authorSakari Ailus <sakari.ailus@nokia.com>
Thu, 14 Feb 2008 19:47:22 +0000 (21:47 +0200)
committerTony Lindgren <tony@atomide.com>
Fri, 15 Feb 2008 23:23:47 +0000 (15:23 -0800)
vidioc_dqbuf returned -EIO in a number of cases which is probably a bit
confusing for many programs. This patch changes behaviour so that the
next intact frame is always returned (i.e. never -EIO anymore).

-EAGAIN is returned in non-blocking mode.

Signed-off-by: Sakari Ailus <sakari.ailus@nokia.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
drivers/media/video/omap24xxcam.c

index 96f488504ad7ca8f327c3da3bb707a19d15d68e0..e540a8dbb906fb3d3b08814fb7251e2c95fc51e3 100644 (file)
@@ -1121,6 +1121,7 @@ static int vidioc_dqbuf(struct file *file, void *fh, struct v4l2_buffer *b)
        struct videobuf_buffer *vb;
        int rval;
 
+videobuf_dqbuf_again:
        rval = videobuf_dqbuf(&ofh->vbq, b, file->f_flags & O_NONBLOCK);
        if (rval)
                goto out;
@@ -1138,12 +1139,20 @@ static int vidioc_dqbuf(struct file *file, void *fh, struct v4l2_buffer *b)
 
 out:
        /*
-        * This is a hack. User space won't get the index of this
-        * buffer and does not want to requeue it so we requeue it
-        * here.
+        * This is a hack. We don't want to show -EIO to the user
+        * space. Requeue the buffer and try again if we're not doing
+        * this in non-blocking mode.
         */
-       if (rval == -EIO)
+       if (rval == -EIO) {
                videobuf_qbuf(&ofh->vbq, b);
+               if (!(file->f_flags & O_NONBLOCK))
+                       goto videobuf_dqbuf_again;
+               /*
+                * We don't have a videobuf_buffer now --- maybe next
+                * time...
+                */
+               rval = -EAGAIN;
+       }
 
        return rval;
 }