Skip to content
  • Sarah Sharp's avatar
    usb: Don't fail port power resume on device disconnect. · ddcc49fb
    Sarah Sharp authored
    commit d49dad3e11638f66be4e16573ffaa8c46a09e3b3 upstream.
    
    Userspace can tell the kernel to power off any USB port, including ones
    that are visible and connectible to users.  When an attached USB device
    goes into suspend, the port will be powered off if the
    pm_qos_no_port_poweroff file for its port is set to 0, the device does
    not have remote wakeup enabled, and the device is marked as persistent.
    
    If the user disconnects the USB device while the port is powered off,
    the current code does not handle that properly.  If you disconnect a
    device, and then run `lsusb -v -s` for the device, the device disconnect
    does not get handled by the USB core.  The runtime resume of the port
    fails, because hub_port_debounce_be_connected() returns -ETIMEDOUT.
    
    This means the port resume fails and khubd doesn't handle the USB device
    disconnect.  This leaves the device listed in lsusb, and the port's
    runtime_status will be permanently marked as "error".
    
    Fix this by ignoring the return value of hub_port_debounce_be_connected.
    Users can disconnect USB devices while the ports are powered off, and we
    must be able to handle that.
    
    This patch should be backported to kernels as old as 3.9, that
    contain the commit ad493e5e
    
     "usb: add
    usb port auto power off mechanism"
    
    Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
    Cc: Lan Tianyu <tianyu.lan@intel.com>
    Cc: Alan Stern <stern@rowland.harvard.edu>
    Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    ddcc49fb