• David Brownell's avatar
    musb: support disconnect after HNP roleswitch · ab983f2a
    David Brownell authored
    Adjust HNP state machines in MUSB driver so that they handle the
    case where the cable is disconnected.  The A-side machine was
    very wrong (unrecoverable); the B-Side was much less so.
    
     - A_PERIPHERAL ... as usual, the non-observability of the ID
       pin through Mentor's registers makes trouble.  We can't go
       directly to A_WAIT_VFALL to end the session and start the
       disconnect processing.  We can however sense link suspending,
       go to A_WAIT_BCON, and from there use OTG timeouts to finally
       trigger that A_WAIT_VFALL transition.  (Hoping that nobody
       reconnects quickly to that port and notices the wrong state.)
    
     - B_HOST ... actually clear the Host Request (HR) bit as the
       messages say, disconnect the peripheral from the root hub,
       and don't detour through a suspend state.  (In some cases
       this would eventually have cleaned up.)
    
    Also adjust the A_SUSPEND transition to respect the A_AIDL_BDIS
    timeout, so if HNP doesn't trigger quickly enough the A_WAIT_VFALL
    transition happens as it should.
    Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    ab983f2a
musb_gadget.c 52.9 KB