lkml.org 
[lkml]   [2020]   [Apr]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.6 155/167] xhci: Dont clear hub TT buffer on ep0 protocol stall
    Date
    From: Mathias Nyman <mathias.nyman@linux.intel.com>

    commit 8f97250c21f0cf36434bf5b7ddf4377406534cd1 upstream.

    The default control endpoint ep0 can return a STALL indicating the
    device does not support the control transfer requests. This is called
    a protocol stall and does not halt the endpoint.

    xHC behaves a bit different. Its internal endpoint state will always
    be halted on any stall, even if the device side of the endpiont is not
    halted. So we do need to issue the reset endpoint command to clear the
    xHC host intenal endpoint halt state, but should not request the HS hub
    to clear the TT buffer unless device side of endpoint is halted.

    Clearing the hub TT buffer at protocol stall caused ep0 to become
    unresponsive for some FS/LS devices behind HS hubs, and class drivers
    failed to set the interface due to timeout:

    usb 1-2.1: 1:1: usb_set_interface failed (-110)

    Fixes: ef513be0a905 ("usb: xhci: Add Clear_TT_Buffer")
    Cc: <stable@vger.kernel.org> # v5.3
    Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
    Link: https://lore.kernel.org/r/20200421140822.28233-4-mathias.nyman@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/usb/host/xhci-ring.c | 16 +++++++++++-----
    1 file changed, 11 insertions(+), 5 deletions(-)

    --- a/drivers/usb/host/xhci-ring.c
    +++ b/drivers/usb/host/xhci-ring.c
    @@ -1872,7 +1872,6 @@ static void xhci_cleanup_halted_endpoint
    ep->ep_state |= EP_HARD_CLEAR_TOGGLE;
    xhci_cleanup_stalled_ring(xhci, slot_id, ep_index, stream_id,
    td);
    - xhci_clear_hub_tt_buffer(xhci, td, ep);
    }
    xhci_ring_cmd_db(xhci);
    }
    @@ -1993,11 +1992,18 @@ static int finish_td(struct xhci_hcd *xh
    if (trb_comp_code == COMP_STALL_ERROR ||
    xhci_requires_manual_halt_cleanup(xhci, ep_ctx,
    trb_comp_code)) {
    - /* Issue a reset endpoint command to clear the host side
    - * halt, followed by a set dequeue command to move the
    - * dequeue pointer past the TD.
    - * The class driver clears the device side halt later.
    + /*
    + * xhci internal endpoint state will go to a "halt" state for
    + * any stall, including default control pipe protocol stall.
    + * To clear the host side halt we need to issue a reset endpoint
    + * command, followed by a set dequeue command to move past the
    + * TD.
    + * Class drivers clear the device side halt from a functional
    + * stall later. Hub TT buffer should only be cleared for FS/LS
    + * devices behind HS hubs for functional stalls.
    */
    + if ((ep_index != 0) || (trb_comp_code != COMP_STALL_ERROR))
    + xhci_clear_hub_tt_buffer(xhci, td, ep);
    xhci_cleanup_halted_endpoint(xhci, slot_id, ep_index,
    ep_ring->stream_id, td, EP_HARD_RESET);
    } else {

    \
     
     \ /
      Last update: 2020-04-28 20:39    [W:3.589 / U:0.652 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site