Skip to content
  • Alan Stern's avatar
    EHCI: Fix root-hub and port suspend/resume problems · 8c03356a
    Alan Stern authored
    
    
    This patch (as738b) fixes numerous problems in the controller/root-hub
    suspend/resume/remote-wakeup support in ehci-hcd:
    
    	The bus_resume() routine should wake up only the ports that
    	were suspended by bus_suspend().  Ports that were already
    	suspended should remain that way.
    
    	The interrupt mask is used to detect loss of power in the
    	bus_resume() routine (if the mask is 0 then power was lost).
    	However bus_suspend() always sets the mask to 0.  Instead the
    	mask should retain its normal value, with port-change-detect
    	interrupts disabled if remote wakeup is turned off.
    
    	The interrupt mask should be reset to its correct value at the
    	end of bus_resume() regardless of whether power was lost.
    
    	bus_resume() reinitializes the operational registers if power
    	was lost.  However those registers are not in the aux power
    	well, hence they can lose their values whenever the controller
    	is put into D3.  They should always be reinitialized.
    
    	When a port-change interrupt occurs and the root hub is
    	suspended, the interrupt handler should request a root-hub
    	resume instead of starting up the controller all by itself.
    
    	There's no need for the interrupt handler to request a
    	root-hub resume every time a suspended port sends a
    	remote-wakeup request.
    
    	The pci_resume() method doesn't need to check for connected
    	ports when deciding whether or not to reset the controller.
    	It can make that decision based on whether Vaux power was
    	maintained.
    
    	Even when the controller does not need to be reset,
    	pci_resume() must undo the effect of pci_suspend() by
    	re-enabling the interrupt mask.
    
    	If power was lost, pci_resume() must not call ehci_run().
    	At this point the root hub is still supposed to be suspended,
    	not running.  It's enough to rewrite the command register and
    	set the configured_flag.
    
    Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    8c03356a