• Alan Stern's avatar
    USB: OHCI: fix endless polling behavior · 71b7497c
    Alan Stern authored
    This patch (as1149) fixes an obscure problem in OHCI polling.  In the
    current code, if the RHSC interrupt status flag turns on at a time
    when RHSC interrupts are disabled, it will remain on forever:
    
    	The interrupt handler is the only place where RHSC status
    	gets turned back off;
    
    	The interrupt handler won't turn RHSC status off because it
    	doesn't turn off status flags if the corresponding interrupt
    	isn't enabled;
    
    	RHSC interrupts will never get enabled because
    	ohci_root_hub_state_changes() doesn't reenable RHSC if RHSC
    	status is on!
    
    As a result we will continue polling indefinitely instead of reverting
    to interrupt-driven operation, and the root hub will not autosuspend.
    This particular sequence of events is not at all unusual; in fact
    plugging a USB device into an OHCI controller will usually cause it to
    occur.
    
    Of course, this is a bug.  The proper thing to do is to turn off RHSC
    status just before reading the actual port status values.  That way
    either a port status change will be detected (if it occurs before the
    status read) or it will turn RHSC back on.  Possibly both, but that
    won't hurt anything.
    
    We can still check for systems in which RHSC is totally broken, by
    re-reading RHSC after clearing it and before reading the port
    statuses.  (This re-read has to be done anyway, to post the earlier
    write.)  If RHSC is on but no port-change statuses are set, then we
    know that RHSC is broken and we can avoid re-enabling it.
    Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
    Cc: stable <stable@kernel.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    71b7497c
ohci-hub.c 21.3 KB