{
        struct gspca_dev *gspca_dev = usb_get_intfdata(intf);
 
+       gspca_input_destroy_urb(gspca_dev);
+
        if (!gspca_dev->streaming)
                return 0;
+
        mutex_lock(&gspca_dev->usb_lock);
        gspca_dev->frozen = 1;          /* avoid urb error messages */
        gspca_dev->usb_err = 0;
        if (gspca_dev->sd_desc->stopN)
                gspca_dev->sd_desc->stopN(gspca_dev);
        destroy_urbs(gspca_dev);
-       gspca_input_destroy_urb(gspca_dev);
        gspca_set_alt0(gspca_dev);
        if (gspca_dev->sd_desc->stop0)
                gspca_dev->sd_desc->stop0(gspca_dev);
        mutex_unlock(&gspca_dev->usb_lock);
+
        return 0;
 }
 EXPORT_SYMBOL(gspca_suspend);
        gspca_dev->frozen = 0;
        gspca_dev->usb_err = 0;
        gspca_dev->sd_desc->init(gspca_dev);
-       gspca_input_create_urb(gspca_dev);
        /*
         * Most subdrivers send all ctrl values on sd_start and thus
         * only write to the device registers on s_ctrl when streaming ->
        gspca_dev->streaming = 0;
        if (streaming)
                ret = gspca_init_transfer(gspca_dev);
+       else
+               gspca_input_create_urb(gspca_dev);
        mutex_unlock(&gspca_dev->usb_lock);
+
        return ret;
 }
 EXPORT_SYMBOL(gspca_resume);