if (WARN_ON(in && dev->ep0_out_pending)) {
                ret = -ENODEV;
                dev->state = STATE_DEV_FAILED;
-               goto out_done;
+               goto out_unlock;
        }
        if (WARN_ON(!in && dev->ep0_in_pending)) {
                ret = -ENODEV;
                dev->state = STATE_DEV_FAILED;
-               goto out_done;
+               goto out_unlock;
        }
 
        dev->req->buf = data;
                                "fail, usb_ep_queue returned %d\n", ret);
                spin_lock_irqsave(&dev->lock, flags);
                dev->state = STATE_DEV_FAILED;
-               goto out_done;
+               goto out_queue_failed;
        }
 
        ret = wait_for_completion_interruptible(&dev->ep0_done);
                usb_ep_dequeue(dev->gadget->ep0, dev->req);
                wait_for_completion(&dev->ep0_done);
                spin_lock_irqsave(&dev->lock, flags);
-               goto out_done;
+               if (dev->ep0_status == -ECONNRESET)
+                       dev->ep0_status = -EINTR;
+               goto out_interrupted;
        }
 
        spin_lock_irqsave(&dev->lock, flags);
-       ret = dev->ep0_status;
 
-out_done:
+out_interrupted:
+       ret = dev->ep0_status;
+out_queue_failed:
        dev->ep0_urb_queued = false;
 out_unlock:
        spin_unlock_irqrestore(&dev->lock, flags);
                                "fail, usb_ep_queue returned %d\n", ret);
                spin_lock_irqsave(&dev->lock, flags);
                dev->state = STATE_DEV_FAILED;
-               goto out_done;
+               goto out_queue_failed;
        }
 
        ret = wait_for_completion_interruptible(&done);
                usb_ep_dequeue(ep->ep, ep->req);
                wait_for_completion(&done);
                spin_lock_irqsave(&dev->lock, flags);
-               goto out_done;
+               if (ep->status == -ECONNRESET)
+                       ep->status = -EINTR;
+               goto out_interrupted;
        }
 
        spin_lock_irqsave(&dev->lock, flags);
-       ret = ep->status;
 
-out_done:
+out_interrupted:
+       ret = ep->status;
+out_queue_failed:
        ep->urb_queued = false;
 out_unlock:
        spin_unlock_irqrestore(&dev->lock, flags);