| From 86866e7445ac9ead508402559f4a6c64fc4d6a94 Mon Sep 17 00:00:00 2001 |
| From: Mathias Nyman <mathias.nyman@linux.intel.com> |
| Date: Mon, 23 Jan 2017 14:20:15 +0200 |
| Subject: [PATCH 202/255] xhci: Introduce helper to turn one TRB into a no-op |
| |
| Useful for turning both transfer and command trbs |
| into no-ops. |
| |
| Based on earlier code by Felipe Balbi <felipe.balbi@linux.intel.com> |
| |
| Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| (cherry picked from commit ae1e3f07320884ff25354d8233dc18d5283b0bb8) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/usb/host/xhci-ring.c | 29 +++++++++++++++++------------ |
| 1 file changed, 17 insertions(+), 12 deletions(-) |
| |
| --- a/drivers/usb/host/xhci-ring.c |
| +++ b/drivers/usb/host/xhci-ring.c |
| @@ -129,6 +129,21 @@ static void inc_td_cnt(struct urb *urb) |
| urb_priv->td_cnt++; |
| } |
| |
| +static void trb_to_noop(union xhci_trb *trb, u32 noop_type) |
| +{ |
| + if (trb_is_link(trb)) { |
| + /* unchain chained link TRBs */ |
| + trb->link.control &= cpu_to_le32(~TRB_CHAIN); |
| + } else { |
| + trb->generic.field[0] = 0; |
| + trb->generic.field[1] = 0; |
| + trb->generic.field[2] = 0; |
| + /* Preserve only the cycle bit of this TRB */ |
| + trb->generic.field[3] &= cpu_to_le32(TRB_CYCLE); |
| + trb->generic.field[3] |= cpu_to_le32(TRB_TYPE(noop_type)); |
| + } |
| +} |
| + |
| /* Updates trb to point to the next TRB in the ring, and updates seg if the next |
| * TRB is in a new segment. This does not skip over link TRBs, and it does not |
| * effect the ring dequeue or enqueue pointers. |
| @@ -592,18 +607,8 @@ static void td_to_noop(struct xhci_hcd * |
| union xhci_trb *trb = td->first_trb; |
| |
| while (1) { |
| - if (trb_is_link(trb)) { |
| - /* unchain chained link TRBs */ |
| - trb->link.control &= cpu_to_le32(~TRB_CHAIN); |
| - } else { |
| - trb->generic.field[0] = 0; |
| - trb->generic.field[1] = 0; |
| - trb->generic.field[2] = 0; |
| - /* Preserve only the cycle bit of this TRB */ |
| - trb->generic.field[3] &= cpu_to_le32(TRB_CYCLE); |
| - trb->generic.field[3] |= cpu_to_le32( |
| - TRB_TYPE(TRB_TR_NOOP)); |
| - } |
| + trb_to_noop(trb, TRB_TR_NOOP); |
| + |
| /* flip cycle if asked to */ |
| if (flip_cycle && trb != td->first_trb && trb != td->last_trb) |
| trb->generic.field[3] ^= cpu_to_le32(TRB_CYCLE); |