ACK/cmnt: [SRU Zesty][PATCH 1/1] usb: xhci: Issue stop EP command only when the EP state is running
Kleber Souza
kleber.souza at canonical.com
Thu Aug 17 16:06:41 UTC 2017
On 08/16/17 14:03, Alberto Milone wrote:
> From: Shyam Sundar S K <Shyam-sundar.S-k at amd.com>
>
> on AMD platforms with SNPS 3.1 USB controller if stop endpoint command is
> issued the controller does not respond, when the EP is not in running
> state. HW completes the command execution and reports
> "Context State Error" completion code. This is as per the spec. However
> HW on receiving the second command additionally marks EP to Flow control
> state in HW which is RTL bug. This bug causes the HW not to respond
> to any further doorbells that are rung by the driver. This makes the EP
> to not functional anymore and causes gross functional failures.
>
> As a workaround, not to hit this problem, it's better to check the EP state
> and issue a stop EP command only when the EP is in running state.
>
> As a sidenote, even with this patch there is still a possibility of
> triggering the RTL bug if the context state races with the stop endpoint
> command as described in xHCI spec 4.6.9
>
> [code simplification and reworded sidenote in commit message -Mathias]
> Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k at amd.com>
> Signed-off-by: Nehal Shah <Nehal-bakulchandra.Shah at amd.com>
> Signed-off-by: Mathias Nyman <mathias.nyman at linux.intel.com>
> Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
>
> BugLink: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1711098
>
> (cherry-picked from commit 28a2369f7d72ece55089f33e7d7b9c1223673cc3)
> Signed-off-by: Alberto Milone <alberto.milone at canonical.com>
> ---
Clean cherry-pick, small change and good test results.
My only comment is the same as the other patch: the BugLink needs to be
in the format "http://bugs.launchpad.net/bugs/<bug-id>". But this can be
fixed when applying the patch.
Acked-by: Kleber Sacilotto de Souza <kleber.souza at canonical.com>
> drivers/usb/host/xhci-hub.c | 9 ++++++++-
> 1 file changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c
> index 1d41637..266e872 100644
> --- a/drivers/usb/host/xhci-hub.c
> +++ b/drivers/usb/host/xhci-hub.c
> @@ -398,14 +398,21 @@ static int xhci_stop_device(struct xhci_hcd *xhci, int slot_id, int suspend)
> spin_lock_irqsave(&xhci->lock, flags);
> for (i = LAST_EP_INDEX; i > 0; i--) {
> if (virt_dev->eps[i].ring && virt_dev->eps[i].ring->dequeue) {
> + struct xhci_ep_ctx *ep_ctx;
> struct xhci_command *command;
> +
> + ep_ctx = xhci_get_ep_ctx(xhci, virt_dev->out_ctx, i);
> +
> + /* Check ep is running, required by AMD SNPS 3.1 xHC */
> + if (GET_EP_CTX_STATE(ep_ctx) != EP_STATE_RUNNING)
> + continue;
> +
> command = xhci_alloc_command(xhci, false, false,
> GFP_NOWAIT);
> if (!command) {
> spin_unlock_irqrestore(&xhci->lock, flags);
> xhci_free_command(xhci, cmd);
> return -ENOMEM;
> -
> }
> xhci_queue_stop_endpoint(xhci, command, slot_id, i,
> suspend);
>
More information about the kernel-team
mailing list