{
        u32 reg;
        int i;
+       int ret;
 
        if (!pm_runtime_suspended(dwc->dev) && !PMSG_IS_AUTO(msg)) {
                dwc->susphy_state = (dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)) &
        case DWC3_GCTL_PRTCAP_DEVICE:
                if (pm_runtime_suspended(dwc->dev))
                        break;
-               dwc3_gadget_suspend(dwc);
+               ret = dwc3_gadget_suspend(dwc);
+               if (ret)
+                       return ret;
                synchronize_irq(dwc->irq_gadget);
                dwc3_core_exit(dwc);
                break;
                        break;
 
                if (dwc->current_otg_role == DWC3_OTG_ROLE_DEVICE) {
-                       dwc3_gadget_suspend(dwc);
+                       ret = dwc3_gadget_suspend(dwc);
+                       if (ret)
+                               return ret;
                        synchronize_irq(dwc->irq_gadget);
                }
 
 
        int ret;
 
        ret = dwc3_gadget_soft_disconnect(dwc);
-       if (ret)
-               goto err;
-
-       spin_lock_irqsave(&dwc->lock, flags);
-       if (dwc->gadget_driver)
-               dwc3_disconnect_gadget(dwc);
-       spin_unlock_irqrestore(&dwc->lock, flags);
-
-       return 0;
-
-err:
        /*
         * Attempt to reset the controller's state. Likely no
         * communication can be established until the host
         * performs a port reset.
         */
-       if (dwc->softconnect)
+       if (ret && dwc->softconnect) {
                dwc3_gadget_soft_connect(dwc);
+               return -EAGAIN;
+       }
 
-       return ret;
+       spin_lock_irqsave(&dwc->lock, flags);
+       if (dwc->gadget_driver)
+               dwc3_disconnect_gadget(dwc);
+       spin_unlock_irqrestore(&dwc->lock, flags);
+
+       return 0;
 }
 
 int dwc3_gadget_resume(struct dwc3 *dwc)