i, ep->desc.bEndpointAddress);
        gspca_dev->alt = i;             /* memorize the current alt setting */
        if (gspca_dev->nbalt > 1) {
-               gspca_input_destroy_urb(gspca_dev);
                ret = usb_set_interface(gspca_dev->dev, gspca_dev->iface, i);
                if (ret < 0) {
                        err("set alt %d err %d", i, ret);
                        ep = NULL;
                }
-               gspca_input_create_urb(gspca_dev);
        }
        return ep;
 }
 
        if (!gspca_dev->present) {
                ret = -ENODEV;
-               goto out;
+               goto unlock;
        }
 
        /* reset the streaming variables */
        if (gspca_dev->sd_desc->isoc_init) {
                ret = gspca_dev->sd_desc->isoc_init(gspca_dev);
                if (ret < 0)
-                       goto out;
+                       goto unlock;
        }
+
+       gspca_input_destroy_urb(gspca_dev);
        ep = get_ep(gspca_dev);
        if (ep == NULL) {
                ret = -EIO;
                }
        }
 out:
+       gspca_input_create_urb(gspca_dev);
+unlock:
        mutex_unlock(&gspca_dev->usb_lock);
        return ret;
 }