• Wesley Cheng's avatar
    usb: dwc3: gadget: Avoid runtime resume if disabling pullup · cb10f68a
    Wesley Cheng authored
    If the device is already in the runtime suspended state, any call to
    the pullup routine will issue a runtime resume on the DWC3 core
    device.  If the USB gadget is disabling the pullup, then avoid having
    to issue a runtime resume, as DWC3 gadget has already been
    halted/stopped.
    
    This fixes an issue where the following condition occurs:
    
    usb_gadget_remove_driver()
    -->usb_gadget_disconnect()
     -->dwc3_gadget_pullup(0)
      -->pm_runtime_get_sync() -> ret = 0
      -->pm_runtime_put() [async]
    -->usb_gadget_udc_stop()
     -->dwc3_gadget_stop()
      -->dwc->gadget_driver = NULL
    ...
    
    dwc3_suspend_common()
    -->dwc3_gadget_suspend()
     -->DWC3 halt/stop routine skipped, driver_data == NULL
    
    This leads to a situation where the DWC3 gadget is not properly
    stopped, as the runtime resume would have re-enabled EP0 and event
    interrupts, and since we avoided the DWC3 gadget suspend, these
    resources were never disabled.
    
    Fixes: 77adb8bd ("usb: dwc3: gadget: Allow runtime suspend if UDC unbinded")
    Cc: stable <stable@vger.kernel.org>
    Acked-by: default avatarFelipe Balbi <balbi@kernel.org>
    Signed-off-by: default avatarWesley Cheng <wcheng@codeaurora.org>
    Link: https://lore.kernel.org/r/1628058245-30692-1-git-send-email-wcheng@codeaurora.orgSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    cb10f68a
gadget.c 107 KB