Skip to content

Commit

Permalink
usb: xhci: add help function xhci_dequeue_td()
Browse files Browse the repository at this point in the history
Add xhci_dequeue_td() helper function to reduce code duplication.

Function xhci_dequeue_td() advances the dequeue pointer past the specified
Transfer Descriptor (TD) and releases the TD.

Signed-off-by: Niklas Neronin <niklas.neronin@linux.intel.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Link: https://lore.kernel.org/r/20241106101459.775897-30-mathias.nyman@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Niklas Neronin authored and Greg Kroah-Hartman committed Nov 6, 2024
1 parent 7acfea2 commit ee8ebec
Showing 1 changed file with 13 additions and 16 deletions.
29 changes: 13 additions & 16 deletions drivers/usb/host/xhci-ring.c
Original file line number Diff line number Diff line change
Expand Up @@ -859,6 +859,16 @@ static void xhci_td_cleanup(struct xhci_hcd *xhci, struct xhci_td *td,
}
}

/* Give back previous TD and move on to the next TD. */
static void xhci_dequeue_td(struct xhci_hcd *xhci, struct xhci_td *td, struct xhci_ring *ring,
u32 status)
{
ring->dequeue = td->end_trb;
ring->deq_seg = td->end_seg;
inc_deq(xhci, ring);

xhci_td_cleanup(xhci, td, ring, status);
}

/* Complete the cancelled URBs we unlinked from td_list. */
static void xhci_giveback_invalidated_tds(struct xhci_virt_ep *ep)
Expand Down Expand Up @@ -2258,12 +2268,7 @@ static void finish_td(struct xhci_hcd *xhci, struct xhci_virt_ep *ep,
break;
}

/* Update ring dequeue pointer */
ep_ring->dequeue = td->end_trb;
ep_ring->deq_seg = td->end_seg;
inc_deq(xhci, ep_ring);

xhci_td_cleanup(xhci, td, ep_ring, td->status);
xhci_dequeue_td(xhci, td, ep_ring, td->status);
}

/* sum trb lengths from the first trb up to stop_trb, _excluding_ stop_trb */
Expand Down Expand Up @@ -2496,12 +2501,7 @@ static void skip_isoc_td(struct xhci_hcd *xhci, struct xhci_td *td,
/* calc actual length */
frame->actual_length = 0;

/* Update ring dequeue pointer */
ep->ring->dequeue = td->end_trb;
ep->ring->deq_seg = td->end_seg;
inc_deq(xhci, ep->ring);

xhci_td_cleanup(xhci, td, ep->ring, status);
xhci_dequeue_td(xhci, td, ep->ring, status);
}

/*
Expand Down Expand Up @@ -2791,10 +2791,7 @@ static int handle_tx_event(struct xhci_hcd *xhci,

if (td && td->error_mid_td && !trb_in_td(xhci, td, ep_trb_dma, false)) {
xhci_dbg(xhci, "Missing TD completion event after mid TD error\n");
ep_ring->dequeue = td->end_trb;
ep_ring->deq_seg = td->end_seg;
inc_deq(xhci, ep_ring);
xhci_td_cleanup(xhci, td, ep_ring, td->status);
xhci_dequeue_td(xhci, td, ep_ring, td->status);
}

if (list_empty(&ep_ring->td_list)) {
Expand Down

0 comments on commit ee8ebec

Please sign in to comment.