• Mathias Nyman's avatar
    xhci: Manually give back cancelled URB if we can't queue it for cancel · d3519b9d
    Mathias Nyman authored
    xhci needs to take care of four scenarios when asked to cancel a URB.
    
    1 URB is not queued or already given back.
      usb_hcd_check_unlink_urb() will return an error, we pass the error on
    
    2 We fail to find xhci internal structures from urb private data such as
      virtual device and endpoint ring.
      Give back URB immediately, can't do anything about internal structures.
    
    3 URB private data has valid pointers to xhci internal data, but host is
      not  responding.
      give back URB immedately and remove the URB from the endpoint lists.
    
    4 Everyting is working
      add URB to cancel list, queue a command to stop the endpoint, after
      which the URB can be turned to no-op or skipped, removed from lists,
      and given back.
    
    We failed to give back the urb in case 2 where the correct device and
    endpoint pointers could not be retrieved from URB private data.
    
    This caused a hang on Dell Inspiron 5558/0VNM2T at resume from suspend
    as urb was never returned.
    
    [  245.270505] INFO: task rtsx_usb_ms_1:254 blocked for more than 120 seconds.
    [  245.272244]       Tainted: G        W       4.11.0-rc3-ARCH #2
    [  245.273983] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
    [  245.275737] rtsx_usb_ms_1   D    0   254      2 0x00000000
    [  245.277524] Call Trace:
    [  245.279278]  __schedule+0x2d3/0x8a0
    [  245.281077]  schedule+0x3d/0x90
    [  245.281961]  usb_kill_urb.part.3+0x6c/0xa0 [usbcore]
    [  245.282861]  ? wake_atomic_t_function+0x60/0x60
    [  245.283760]  usb_kill_urb+0x21/0x30 [usbcore]
    [  245.284649]  usb_start_wait_urb+0xe5/0x170 [usbcore]
    [  245.285541]  ? try_to_del_timer_sync+0x53/0x80
    [  245.286434]  usb_bulk_msg+0xbd/0x160 [usbcore]
    [  245.287326]  rtsx_usb_send_cmd+0x63/0x90 [rtsx_usb]
    
    Reported-by: diego.viola@gmail.com
    Tested-by: diego.viola@gmail.com
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarMathias Nyman <mathias.nyman@linux.intel.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    d3519b9d
xhci.c 149 KB