| From 77c768faf176fe66ffbd6d37f237eca6bc7ff4d2 Mon Sep 17 00:00:00 2001 |
| From: Mathias Nyman <mathias.nyman@linux.intel.com> |
| Date: Wed, 17 May 2017 18:32:05 +0300 |
| Subject: [PATCH 222/286] xhci: Fix command ring stop regression in 4.11 |
| |
| In 4.11 TRB completion codes were renamed to match spec. |
| |
| Completion codes for command ring stopped and endpoint stopped |
| were mixed, leading to failures while handling a stopped command ring. |
| |
| Use the correct completion code for command ring stopped events. |
| |
| Fixes: 0b7c105a04ca ("usb: host: xhci: rename completion codes to match spec") |
| Cc: <stable@vger.kernel.org> # 4.11 |
| Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| (cherry picked from commit 604d02a2a66ab7f93fd3b2bde3698c29ef057b65) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/usb/host/xhci-hub.c | 2 +- |
| drivers/usb/host/xhci-ring.c | 8 ++++---- |
| drivers/usb/host/xhci.c | 8 ++++---- |
| 3 files changed, 9 insertions(+), 9 deletions(-) |
| |
| --- a/drivers/usb/host/xhci-hub.c |
| +++ b/drivers/usb/host/xhci-hub.c |
| @@ -438,7 +438,7 @@ static int xhci_stop_device(struct xhci_ |
| wait_for_completion(cmd->completion); |
| |
| if (cmd->status == COMP_COMMAND_ABORTED || |
| - cmd->status == COMP_STOPPED) { |
| + cmd->status == COMP_COMMAND_RING_STOPPED) { |
| xhci_warn(xhci, "Timeout while waiting for stop endpoint command\n"); |
| ret = -ETIME; |
| } |
| --- a/drivers/usb/host/xhci-ring.c |
| +++ b/drivers/usb/host/xhci-ring.c |
| @@ -323,7 +323,7 @@ static void xhci_handle_stopped_cmd_ring |
| if (i_cmd->status != COMP_COMMAND_ABORTED) |
| continue; |
| |
| - i_cmd->status = COMP_STOPPED; |
| + i_cmd->status = COMP_COMMAND_RING_STOPPED; |
| |
| xhci_dbg(xhci, "Turn aborted command %p to no-op\n", |
| i_cmd->command_trb); |
| @@ -1383,7 +1383,7 @@ static void handle_cmd_completion(struct |
| cmd_comp_code = GET_COMP_CODE(le32_to_cpu(event->status)); |
| |
| /* If CMD ring stopped we own the trbs between enqueue and dequeue */ |
| - if (cmd_comp_code == COMP_STOPPED) { |
| + if (cmd_comp_code == COMP_COMMAND_RING_STOPPED) { |
| complete_all(&xhci->cmd_ring_stop_completion); |
| return; |
| } |
| @@ -1439,8 +1439,8 @@ static void handle_cmd_completion(struct |
| break; |
| case TRB_CMD_NOOP: |
| /* Is this an aborted command turned to NO-OP? */ |
| - if (cmd->status == COMP_STOPPED) |
| - cmd_comp_code = COMP_STOPPED; |
| + if (cmd->status == COMP_COMMAND_RING_STOPPED) |
| + cmd_comp_code = COMP_COMMAND_RING_STOPPED; |
| break; |
| case TRB_RESET_EP: |
| WARN_ON(slot_id != TRB_TO_SLOT_ID( |
| --- a/drivers/usb/host/xhci.c |
| +++ b/drivers/usb/host/xhci.c |
| @@ -1809,7 +1809,7 @@ static int xhci_configure_endpoint_resul |
| |
| switch (*cmd_status) { |
| case COMP_COMMAND_ABORTED: |
| - case COMP_STOPPED: |
| + case COMP_COMMAND_RING_STOPPED: |
| xhci_warn(xhci, "Timeout while waiting for configure endpoint command\n"); |
| ret = -ETIME; |
| break; |
| @@ -1859,7 +1859,7 @@ static int xhci_evaluate_context_result( |
| |
| switch (*cmd_status) { |
| case COMP_COMMAND_ABORTED: |
| - case COMP_STOPPED: |
| + case COMP_COMMAND_RING_STOPPED: |
| xhci_warn(xhci, "Timeout while waiting for evaluate context command\n"); |
| ret = -ETIME; |
| break; |
| @@ -3478,7 +3478,7 @@ static int xhci_discover_or_reset_device |
| ret = reset_device_cmd->status; |
| switch (ret) { |
| case COMP_COMMAND_ABORTED: |
| - case COMP_STOPPED: |
| + case COMP_COMMAND_RING_STOPPED: |
| xhci_warn(xhci, "Timeout waiting for reset device command\n"); |
| ret = -ETIME; |
| goto command_cleanup; |
| @@ -3863,7 +3863,7 @@ static int xhci_setup_device(struct usb_ |
| */ |
| switch (command->status) { |
| case COMP_COMMAND_ABORTED: |
| - case COMP_STOPPED: |
| + case COMP_COMMAND_RING_STOPPED: |
| xhci_warn(xhci, "Timeout while waiting for setup device command\n"); |
| ret = -ETIME; |
| break; |