| From e4ec40ec4b260efcca15089de4285a0a3411259b Mon Sep 17 00:00:00 2001 |
| From: Mathias Nyman <mathias.nyman@linux.intel.com> |
| Date: Fri, 1 Dec 2017 13:41:19 +0200 |
| Subject: xhci: Don't show incorrect WARN message about events for empty rings |
| |
| From: Mathias Nyman <mathias.nyman@linux.intel.com> |
| |
| commit e4ec40ec4b260efcca15089de4285a0a3411259b upstream. |
| |
| xHC can generate two events for a short transfer if the short TRB and |
| last TRB in the TD are not the same TRB. |
| |
| The driver will handle the TD after the first short event, and remove |
| it from its internal list. Driver then incorrectly prints a warning |
| for the second event: |
| |
| "WARN Event TRB for slot x ep y with no TDs queued" |
| |
| Fix this by not printing a warning if we get a event on a empty list |
| if the previous event was a short event. |
| |
| Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/usb/host/xhci-ring.c | 12 ++++++++---- |
| 1 file changed, 8 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/usb/host/xhci-ring.c |
| +++ b/drivers/usb/host/xhci-ring.c |
| @@ -2486,12 +2486,16 @@ static int handle_tx_event(struct xhci_h |
| */ |
| if (list_empty(&ep_ring->td_list)) { |
| /* |
| - * A stopped endpoint may generate an extra completion |
| - * event if the device was suspended. Don't print |
| - * warnings. |
| + * Don't print wanings if it's due to a stopped endpoint |
| + * generating an extra completion event if the device |
| + * was suspended. Or, a event for the last TRB of a |
| + * short TD we already got a short event for. |
| + * The short TD is already removed from the TD list. |
| */ |
| + |
| if (!(trb_comp_code == COMP_STOPPED || |
| - trb_comp_code == COMP_STOPPED_LENGTH_INVALID)) { |
| + trb_comp_code == COMP_STOPPED_LENGTH_INVALID || |
| + ep_ring->last_td_was_short)) { |
| xhci_warn(xhci, "WARN Event TRB for slot %d ep %d with no TDs queued?\n", |
| TRB_TO_SLOT_ID(le32_to_cpu(event->flags)), |
| ep_index); |