• Sarah Sharp's avatar
    USB: ehci shutdown refactored · 21da84a8
    Sarah Sharp authored
    This patch refactors some shutdown code so it can be shared between
    ehci_stop() and ehci_shutdown().
    
    This also fixes a couple potential bugs:
     - ehci_shutdown() was not locking ehci->lock before halting the HC.
     - ehci_shutdown() didn't disable the watchdog and IAA timers.
     - ehci_stop() was resetting the host controller when it may have been
       running, which the EHCI spec says "may result in undefined behavior".
    
    ehci_stop() was calling port_power() to turn off the ports, which waited
    20ms after applying the port change.  The msleep was for the case where
    the HC might take 20ms to turn the ports on; since we're shutting them
    off, we can avoid the msleep and just use ehci_turn_off_ports().
    
    ehci_stop() doesn't need to clear the intr_enable register or revert
    ownership of the companion controllers to the BIOS, because the host
    controller reset should have done that.  There might be a buggy host
    controller that doesn't follow the reset rules, but for now we assume
    it's redundant code and remove it.
    
    [ A subsequent patch will cancel the timers later ... this version
    carries forward existing bugs where timers could get re-armed
    after they're canceled. ]
    Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@intel.com>
    Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    21da84a8
ehci-hcd.c 30.6 KB