lkml.org 
[lkml]   [2016]   [Nov]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.16 188/346] xhci: always handle "Command Ring Stopped" events
    3.16.39-rc1 review patch.  If anyone has any objections, please let me know.

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

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

    commit 33be126510974e2eb9679f1ca9bca4f67ee4c4c7 upstream.

    Fix "Command completion event does not match command" errors by always
    handling the command ring stopped events.

    The command ring stopped event is generated as a result of aborting
    or stopping the command ring with a register write. It is not caused
    by a command in the command queue, and thus won't have a matching command
    in the comman list.

    Solve it by handling the command ring stopped event before checking for a
    matching command.

    In most command time out cases we abort the command ring, and get
    a command ring stopped event. The events command pointer will point at
    the current command ring dequeue, which in most cases matches the timed
    out command in the command list, and no error messages are seen.

    If we instead get a command aborted event before the command ring stopped
    event, the abort event will increse the command ring dequeue pointer, and
    the following command ring stopped events command pointer will point at the
    next, not yet queued command. This case triggered the error message

    Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    drivers/usb/host/xhci-ring.c | 13 +++++++------
    1 file changed, 7 insertions(+), 6 deletions(-)

    --- a/drivers/usb/host/xhci-ring.c
    +++ b/drivers/usb/host/xhci-ring.c
    @@ -1351,12 +1351,6 @@ static void handle_cmd_completion(struct

    cmd = list_entry(xhci->cmd_list.next, struct xhci_command, cmd_list);

    - if (cmd->command_trb != xhci->cmd_ring->dequeue) {
    - xhci_err(xhci,
    - "Command completion event does not match command\n");
    - return;
    - }
    -
    del_timer(&xhci->cmd_timer);

    trace_xhci_cmd_completion(cmd_trb, (struct xhci_generic_trb *) event);
    @@ -1368,6 +1362,13 @@ static void handle_cmd_completion(struct
    xhci_handle_stopped_cmd_ring(xhci, cmd);
    return;
    }
    +
    + if (cmd->command_trb != xhci->cmd_ring->dequeue) {
    + xhci_err(xhci,
    + "Command completion event does not match command\n");
    + return;
    + }
    +
    /*
    * Host aborted the command ring, check if the current command was
    * supposed to be aborted, otherwise continue normally.
    \
     
     \ /
      Last update: 2016-11-14 04:14    [W:3.447 / U:0.068 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site