• Douglas Anderson's avatar
    usb: dwc2: host: Fix missing device insertions · 6a659531
    Douglas Anderson authored
    If you've got your interrupt signals bouncing a bit as you insert your
    USB device, you might end up in a state when the device is connected but
    the driver doesn't know it.
    
    Specifically, the observed order is:
     1. hardware sees connect
     2. hardware sees disconnect
     3. hardware sees connect
     4. dwc2_port_intr() - clears connect interrupt
     5. dwc2_handle_common_intr() - calls dwc2_hcd_disconnect()
    
    Now you'll be stuck with the cable plugged in and no further interrupts
    coming in but the driver will think we're disconnected.
    
    We'll fix this by checking for the missing connect interrupt and
    re-connecting after the disconnect is posted.  We don't skip the
    disconnect because if there is a transitory disconnect we really want to
    de-enumerate and re-enumerate.
    
    Notes:
    1. As part of this change we add a "force" parameter to
       dwc2_hcd_disconnect() so that when we're unloading the module we
       avoid the new behavior.  The need for this was pointed out by John
       Youn.
    2. The bit of code needed at the end of dwc2_hcd_disconnect() is
       exactly the same bit of code from dwc2_port_intr().  To avoid
       duplication, we refactor that code out into a new function
       dwc2_hcd_connect().
    Signed-off-by: default avatarDouglas Anderson <dianders@chromium.org>
    Acked-by: default avatarJohn Youn <johnyoun@synopsys.com>
    Tested-by: default avatarJohn Youn <johnyoun@synopsys.com>
    Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
    6a659531
core.h 45.8 KB