After testing all day non-stop, I can confirm this works great without throwing oops. THank you very much. On Wed, Dec 16, 2009 at 3:00 PM, Pablo Baena <pbaena@xxxxxxxxx> wrote: > Yes! This patch worked. So far I got no kernel panic, and image is > correct. Will be testing today to see if something comes up, but so > far it's doing great. Thank you! > > On Wed, Dec 16, 2009 at 7:49 AM, Laurent Pinchart > <laurent.pinchart@xxxxxxxxxxxxxxxx> wrote: >> Hi Pablo, >> >> On Wednesday 16 December 2009 07:51:20 Pablo Baena wrote: >>> With that patch, libv4l throws an error at some point, no crashes so far >>> though: >>> >>> libv4l2: error dequeuing buf: Invalid argument >>> read error 22, Invalid argument >> >> Could you please try this updated patch ? >> >> diff -r c1f376eae978 linux/drivers/media/video/uvc/uvc_queue.c >> --- a/linux/drivers/media/video/uvc/uvc_queue.c Sat Dec 12 18:57:17 2009 +0100 >> +++ b/linux/drivers/media/video/uvc/uvc_queue.c Wed Dec 16 11:47:40 2009 +0100 >> @@ -59,7 +59,7 @@ >> * returns immediately. >> * >> * When the buffer is full, the completion handler removes it from the irq >> - * queue, marks it as ready (UVC_BUF_STATE_DONE) and wakes its wait queue. >> + * queue, marks it as ready (UVC_BUF_STATE_READY) and wakes its wait queue. >> * At that point, any process waiting on the buffer will be woken up. If a >> * process tries to dequeue a buffer after it has been marked ready, the >> * dequeing will succeed immediately. >> @@ -196,11 +196,12 @@ >> >> switch (buf->state) { >> case UVC_BUF_STATE_ERROR: >> - case UVC_BUF_STATE_DONE: >> + case UVC_BUF_STATE_READY: >> v4l2_buf->flags |= V4L2_BUF_FLAG_DONE; >> break; >> case UVC_BUF_STATE_QUEUED: >> case UVC_BUF_STATE_ACTIVE: >> + case UVC_BUF_STATE_DONE: >> v4l2_buf->flags |= V4L2_BUF_FLAG_QUEUED; >> break; >> case UVC_BUF_STATE_IDLE: >> @@ -295,13 +296,15 @@ >> { >> if (nonblocking) { >> return (buf->state != UVC_BUF_STATE_QUEUED && >> - buf->state != UVC_BUF_STATE_ACTIVE) >> + buf->state != UVC_BUF_STATE_ACTIVE && >> + buf->state != UVC_BUF_STATE_DONE) >> ? 0 : -EAGAIN; >> } >> >> return wait_event_interruptible(buf->wait, >> buf->state != UVC_BUF_STATE_QUEUED && >> - buf->state != UVC_BUF_STATE_ACTIVE); >> + buf->state != UVC_BUF_STATE_ACTIVE && >> + buf->state != UVC_BUF_STATE_DONE); >> } >> >> /* >> @@ -341,13 +344,14 @@ >> uvc_trace(UVC_TRACE_CAPTURE, "[W] Corrupted data " >> "(transmission error).\n"); >> ret = -EIO; >> - case UVC_BUF_STATE_DONE: >> + case UVC_BUF_STATE_READY: >> buf->state = UVC_BUF_STATE_IDLE; >> break; >> >> case UVC_BUF_STATE_IDLE: >> case UVC_BUF_STATE_QUEUED: >> case UVC_BUF_STATE_ACTIVE: >> + case UVC_BUF_STATE_DONE: >> default: >> uvc_trace(UVC_TRACE_CAPTURE, "[E] Invalid buffer state %u " >> "(driver bug?).\n", buf->state); >> @@ -383,7 +387,7 @@ >> buf = list_first_entry(&queue->mainqueue, struct uvc_buffer, stream); >> >> poll_wait(file, &buf->wait, wait); >> - if (buf->state == UVC_BUF_STATE_DONE || >> + if (buf->state == UVC_BUF_STATE_READY || >> buf->state == UVC_BUF_STATE_ERROR) >> mask |= POLLIN | POLLRDNORM; >> >> @@ -489,6 +493,7 @@ >> >> spin_lock_irqsave(&queue->irqlock, flags); >> list_del(&buf->queue); >> + buf->state = UVC_BUF_STATE_READY; >> if (!list_empty(&queue->irqqueue)) >> nextbuf = list_first_entry(&queue->irqqueue, struct uvc_buffer, >> queue); >> diff -r c1f376eae978 linux/drivers/media/video/uvc/uvc_video.c >> --- a/linux/drivers/media/video/uvc/uvc_video.c Sat Dec 12 18:57:17 2009 +0100 >> +++ b/linux/drivers/media/video/uvc/uvc_video.c Wed Dec 16 11:47:40 2009 +0100 >> @@ -578,8 +578,7 @@ >> uvc_video_decode_end(stream, buf, mem, >> urb->iso_frame_desc[i].actual_length); >> >> - if (buf->state == UVC_BUF_STATE_DONE || >> - buf->state == UVC_BUF_STATE_ERROR) >> + if (buf->state == UVC_BUF_STATE_DONE) >> buf = uvc_queue_next_buffer(&stream->queue, buf); >> } >> } >> @@ -637,8 +636,7 @@ >> if (!stream->bulk.skip_payload && buf != NULL) { >> uvc_video_decode_end(stream, buf, stream->bulk.header, >> stream->bulk.payload_size); >> - if (buf->state == UVC_BUF_STATE_DONE || >> - buf->state == UVC_BUF_STATE_ERROR) >> + if (buf->state == UVC_BUF_STATE_DONE) >> buf = uvc_queue_next_buffer(&stream->queue, >> buf); >> } >> diff -r c1f376eae978 linux/drivers/media/video/uvc/uvcvideo.h >> --- a/linux/drivers/media/video/uvc/uvcvideo.h Sat Dec 12 18:57:17 2009 +0100 >> +++ b/linux/drivers/media/video/uvc/uvcvideo.h Wed Dec 16 11:47:40 2009 +0100 >> @@ -370,7 +370,8 @@ >> UVC_BUF_STATE_QUEUED = 1, >> UVC_BUF_STATE_ACTIVE = 2, >> UVC_BUF_STATE_DONE = 3, >> - UVC_BUF_STATE_ERROR = 4, >> + UVC_BUF_STATE_READY = 4, >> + UVC_BUF_STATE_ERROR = 5, >> }; >> >> struct uvc_buffer { >> >> >> -- >> Regards, >> >> Laurent Pinchart >> > > > > -- > "Not possessing the gift of reflection, a dog does not know that he > does not know, and does not understand that he understands nothing; > we, on the other hand, are aware of both. If we behave otherwise, it > is from stupidity, or else from self-deception, to preserve our peace > of mind." > -- "Not possessing the gift of reflection, a dog does not know that he does not know, and does not understand that he understands nothing; we, on the other hand, are aware of both. If we behave otherwise, it is from stupidity, or else from self-deception, to preserve our peace of mind." -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html