struct video_device *vdev;
        int ret;
 
+       /* Initialize the video buffers queue. */
+       ret = uvc_queue_init(&stream->queue, stream->type, !uvc_no_drop_param);
+       if (ret)
+               return ret;
+
        /* Initialize the streaming interface with default streaming
         * parameters.
         */
 {
        struct uvc_device *dev = usb_get_intfdata(intf);
        struct uvc_streaming *stream;
+       int ret = 0;
 
        uvc_trace(UVC_TRACE_SUSPEND, "Resuming interface %u\n",
                intf->cur_altsetting->desc.bInterfaceNumber);
 
        if (intf->cur_altsetting->desc.bInterfaceSubClass ==
            UVC_SC_VIDEOCONTROL) {
-               int ret = 0;
-
                if (reset) {
                        ret = uvc_ctrl_restore_values(dev);
                        if (ret < 0)
        }
 
        list_for_each_entry(stream, &dev->streams, list) {
-               if (stream->intf == intf)
-                       return uvc_video_resume(stream, reset);
+               if (stream->intf == intf) {
+                       ret = uvc_video_resume(stream, reset);
+                       if (ret < 0)
+                               uvc_queue_enable(&stream->queue, 0);
+                       return ret;
+               }
        }
 
        uvc_trace(UVC_TRACE_SUSPEND, "Resume: video streaming USB interface "
 
        /* Only free resources if this is a privileged handle. */
        if (uvc_has_privileges(handle)) {
                uvc_video_enable(stream, 0);
+               uvc_queue_enable(&stream->queue, 0);
                uvc_free_buffers(&stream->queue);
        }
 
                return -EBUSY;
 
        mutex_lock(&stream->mutex);
+       ret = uvc_queue_enable(&stream->queue, 1);
+       if (ret < 0)
+               goto done;
+
        ret = uvc_video_enable(stream, 1);
+       if (ret < 0)
+               uvc_queue_enable(&stream->queue, 0);
+
+done:
        mutex_unlock(&stream->mutex);
 
        return ret;
 {
        struct uvc_fh *handle = fh;
        struct uvc_streaming *stream = handle->stream;
-       int ret;
 
        if (type != stream->type)
                return -EINVAL;
                return -EBUSY;
 
        mutex_lock(&stream->mutex);
-       ret = uvc_video_enable(stream, 0);
+       uvc_video_enable(stream, 0);
+       uvc_queue_enable(&stream->queue, 0);
        mutex_unlock(&stream->mutex);
 
-       return ret;
+       return 0;
 }
 
 static int uvc_ioctl_enum_input(struct file *file, void *fh,
 
        uvc_video_clock_reset(stream);
 
        ret = uvc_commit_video(stream, &stream->ctrl);
-       if (ret < 0) {
-               uvc_queue_enable(&stream->queue, 0);
+       if (ret < 0)
                return ret;
-       }
 
        if (!uvc_queue_streaming(&stream->queue))
                return 0;
 
-       ret = uvc_init_video(stream, GFP_NOIO);
-       if (ret < 0)
-               uvc_queue_enable(&stream->queue, 0);
-
-       return ret;
+       return uvc_init_video(stream, GFP_NOIO);
 }
 
 /* ------------------------------------------------------------------------
 
        atomic_set(&stream->active, 0);
 
-       /* Initialize the video buffers queue. */
-       ret = uvc_queue_init(&stream->queue, stream->type, !uvc_no_drop_param);
-       if (ret)
-               return ret;
-
        /* Alternate setting 0 should be the default, yet the XBox Live Vision
         * Cam (and possibly other devices) crash or otherwise misbehave if
         * they don't receive a SET_INTERFACE request before any other video
                        usb_clear_halt(stream->dev->udev, pipe);
                }
 
-               uvc_queue_enable(&stream->queue, 0);
                uvc_video_clock_cleanup(stream);
                return 0;
        }
        if (ret < 0)
                return ret;
 
-       ret = uvc_queue_enable(&stream->queue, 1);
-       if (ret < 0)
-               goto error_queue;
-
        /* Commit the streaming parameters. */
        ret = uvc_commit_video(stream, &stream->ctrl);
        if (ret < 0)
 error_video:
        usb_set_interface(stream->dev->udev, stream->intfnum, 0);
 error_commit:
-       uvc_queue_enable(&stream->queue, 0);
-error_queue:
        uvc_video_clock_cleanup(stream);
 
        return ret;