v4l2_buf->memory);
return -EINVAL;
}
+ /* ddl@rock-chips.com */
+ if (!(queue->flags & UVC_QUEUE_STREAMING)) {
+ printk("uvcvideo: Not streaming\n");
+ return -EINVAL;
+ }
mutex_lock(&queue->mutex);
/* ddl@rock-chips.com : This design copied from video-buf */
((!list_empty(&queue->mainqueue)) || (!(queue->flags & UVC_QUEUE_STREAMING))));
mutex_lock(&queue->mutex);
- if (ret || (!(queue->flags & UVC_QUEUE_STREAMING)))
- goto done;
+ if (ret || (!(queue->flags & UVC_QUEUE_STREAMING))) {
+ printk("uvcvideo: Stream off\n");
+ goto done;
+ }
goto checks;
}
queue->flags |= UVC_QUEUE_STREAMING;
queue->buf_used = 0;
} else {
+ queue->flags &= ~UVC_QUEUE_STREAMING;
uvc_queue_cancel(queue, 0);
INIT_LIST_HEAD(&queue->mainqueue);
queue->buffer[i].error = 0;
queue->buffer[i].state = UVC_BUF_STATE_IDLE;
}
-
- queue->flags &= ~UVC_QUEUE_STREAMING;
}
done:
{
struct urb *urb;
unsigned int i;
-
+
for (i = 0; i < UVC_URBS; ++i) {
urb = stream->urb[i];
if (urb == NULL)
int uvc_video_enable(struct uvc_streaming *stream, int enable)
{
int ret;
-
+
if (!enable) {
- uvc_uninit_video(stream, 1);
- usb_set_interface(stream->dev->udev, stream->intfnum, 0);
- uvc_queue_enable(&stream->queue, 0);
+ if (stream->flags & UVC_QUEUE_STREAMING) { /* ddl@rock-chips.com */
+ uvc_queue_enable(&stream->queue, 0);
+ uvc_uninit_video(stream, 1);
+ usb_set_interface(stream->dev->udev, stream->intfnum, 0);
+ stream->flags &= ~UVC_QUEUE_STREAMING;
+ }
return 0;
}
uvc_queue_enable(&stream->queue, 0);
return ret;
}
-
+ stream->flags |= UVC_QUEUE_STREAMING;
return uvc_init_video(stream, GFP_KERNEL);
}