Commit 3321f84b authored by Mathias Nyman's avatar Mathias Nyman Committed by Greg Kroah-Hartman

xhci: simplify event ring dequeue tracking for transfer events

No matter what type of event we receive we want to increase the event
ring dequeue pointer one step for every event that is handled.

For unknown reasons the event ring dequeue increase is done inside the
transfer event handler and port event handler.

As the transfer event handler got more complex and can now loop through
several transfer TRBs on a transfer ring, there were additinal checks
added to avoid increasing event ring dequeue more than one step.

No need for elaborate checks to avoid increasing event ring dequeue
in case the transfer event handler goes through a loop.
Just increasing the event ring dequeue outside the transfer event
handler.

End goal is to increase event ring dequeue in just one place.
Signed-off-by: default avatarMathias Nyman <mathias.nyman@linux.intel.com>
Link: https://lore.kernel.org/r/20231019102924.2797346-13-mathias.nyman@linux.intel.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 3c45a21f
...@@ -2884,13 +2884,6 @@ static int handle_tx_event(struct xhci_hcd *xhci, ...@@ -2884,13 +2884,6 @@ static int handle_tx_event(struct xhci_hcd *xhci,
trb_comp_code != COMP_MISSED_SERVICE_ERROR && trb_comp_code != COMP_MISSED_SERVICE_ERROR &&
trb_comp_code != COMP_NO_PING_RESPONSE_ERROR; trb_comp_code != COMP_NO_PING_RESPONSE_ERROR;
/*
* Do not update event ring dequeue pointer if we're in a loop
* processing missed tds.
*/
if (!handling_skipped_tds)
inc_deq(xhci, ir->event_ring);
/* /*
* If ep->skip is set, it means there are missed tds on the * If ep->skip is set, it means there are missed tds on the
* endpoint ring need to take care of. * endpoint ring need to take care of.
...@@ -2924,7 +2917,6 @@ static int xhci_handle_event(struct xhci_hcd *xhci, struct xhci_interrupter *ir) ...@@ -2924,7 +2917,6 @@ static int xhci_handle_event(struct xhci_hcd *xhci, struct xhci_interrupter *ir)
union xhci_trb *event; union xhci_trb *event;
int update_ptrs = 1; int update_ptrs = 1;
u32 trb_type; u32 trb_type;
int ret;
/* Event ring hasn't been allocated yet. */ /* Event ring hasn't been allocated yet. */
if (!ir || !ir->event_ring || !ir->event_ring->dequeue) { if (!ir || !ir->event_ring || !ir->event_ring->dequeue) {
...@@ -2957,9 +2949,7 @@ static int xhci_handle_event(struct xhci_hcd *xhci, struct xhci_interrupter *ir) ...@@ -2957,9 +2949,7 @@ static int xhci_handle_event(struct xhci_hcd *xhci, struct xhci_interrupter *ir)
update_ptrs = 0; update_ptrs = 0;
break; break;
case TRB_TRANSFER: case TRB_TRANSFER:
ret = handle_tx_event(xhci, ir, &event->trans_event); handle_tx_event(xhci, ir, &event->trans_event);
if (ret >= 0)
update_ptrs = 0;
break; break;
case TRB_DEV_NOTE: case TRB_DEV_NOTE:
handle_device_notification(xhci, event); handle_device_notification(xhci, event);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment