lkml.org 
[lkml]   [2016]   [Feb]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.2 40/67] Revert "xhci: don't finish a TD if we get a short-transfer event mid TD"
    3.2.78-rc1 review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Mathias Nyman <mathias.nyman@linux.intel.com>

    commit a6835090716a85f2297668ba593bd00e1051e662 upstream.

    This reverts commit e210c422b6fd ("xhci: don't finish a TD if we get a
    short transfer event mid TD")

    Turns out that most host controllers do not follow the xHCI specs and never
    send the second event for the last TRB in the TD if there was a short event
    mid-TD.

    Returning the URB directly after the first short-transfer event is far
    better than never returning the URB. (class drivers usually timeout
    after 30sec). For the hosts that do send the second event we will go
    back to treating it as misplaced event and print an error message for it.

    The origial patch was sent to stable kernels and needs to be reverted from
    there as well

    Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    [bwh: Backported to 3.2: adjust context]
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    drivers/usb/host/xhci-ring.c | 10 ----------
    1 file changed, 10 deletions(-)

    diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
    index f1c21c40b4a6..3915657e6078 100644
    --- a/drivers/usb/host/xhci-ring.c
    +++ b/drivers/usb/host/xhci-ring.c
    @@ -2187,10 +2187,6 @@
    EVENT_TRB_LEN(le32_to_cpu(event->transfer_len)));
    /* Fast path - was this the last TRB in the TD for this URB? */
    if (event_trb == td->last_trb) {
    - if (td->urb_length_set && trb_comp_code == COMP_SHORT_TX)
    - return finish_td(xhci, td, event_trb, event, ep,
    - status, false);
    -
    if (EVENT_TRB_LEN(le32_to_cpu(event->transfer_len)) != 0) {
    td->urb->actual_length =
    td->urb->transfer_buffer_length -
    @@ -2242,12 +2238,6 @@
    td->urb->actual_length +=
    TRB_LEN(le32_to_cpu(cur_trb->generic.field[2])) -
    EVENT_TRB_LEN(le32_to_cpu(event->transfer_len));
    -
    - if (trb_comp_code == COMP_SHORT_TX) {
    - xhci_dbg(xhci, "mid bulk/intr SP, wait for last TRB event\n");
    - td->urb_length_set = true;
    - return 0;
    - }
    }

    return finish_td(xhci, td, event_trb, event, ep, status, false);
    \
     
     \ /
      Last update: 2016-02-23 23:21    [W:4.472 / U:0.160 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site