xhci: Remove recursive call to xhci_handle_event
Subsystems (2)
PATCH v3 4/4 xhci: Remove recursive call to xhci_handle_event
Make the caller loop while there are events to handle, instead.
Signed-off-by Matt Evans <[email protected]>
---
Added a comment on the return value, defining <0 to be 'bad'.
drivers/usb/host/xhci-ring.c | 18 +++++++++++------- 1 files changed, 11 insertions(+), 7 deletions(-)
drivers/usb/host/xhci-ring.c +11 -7
@@ -2128,8 +2128,10 @@ cleanup:/* * This function handles all OS-owned events on the event ring. It may drop * xhci->lock between event processing (e.g. to pass up port status changes). +* Returns >0 for "possibly more events to process" (caller should call again), +* otherwise 0 if done. In future, <0 returns should indicate error code. */ -static void xhci_handle_event (struct xhci_hcd *xhci) +static int xhci_handle_event (struct xhci_hcd *xhci) {union xhci_trb *event;int update_ptrs =1 ;
@@ -2138,7 +2140,7 @@ static void xhci_handle_event(struct xhci_hcd *xhci)xhci_dbg (xhci,"In %s\n" , __func__);if (!xhci->event_ring || !xhci->event_ring->dequeue) { xhci->error_bitmask |=1 <<1 ; -return ; +return 0 ; } event = xhci->event_ring->dequeue;
@@ -2146,7 +2148,7 @@ static void xhci_handle_event(struct xhci_hcd *xhci)if ((le32_to_cpu (event->event_cmd.flags) &TRB_CYCLE ) != xhci->event_ring->cycle_state) { xhci->error_bitmask |=1 <<2 ; -return ; +return 0 ; }xhci_dbg (xhci,"%s - OS owns TRB\n" , __func__);
@@ -2190,15 +2192,17 @@ static void xhci_handle_event(struct xhci_hcd *xhci)if (xhci->xhc_state &XHCI_STATE_DYING ) {xhci_dbg (xhci,"xHCI host dying, returning from " "event handler.\n" ); -return ; +return 0 ; }if (update_ptrs)/* Update SW event ring dequeue pointer */ inc_deq (xhci, xhci->event_ring, true); -/* Are there more items on the event ring? */ -xhci_handle_event (xhci); +/* Are there more items on the event ring? Caller will call us again to +* check. +*/ +return 1 ; }/*
@@ -2280,7 +2284,7 @@ hw_died:/* FIXME this should be a delayed service routine * that clears the EHB. */ -xhci_handle_event (xhci); +while (xhci_handle_event (xhci) >0 ) {} temp_64 =xhci_read_64 (xhci, &xhci->ir_set->erst_dequeue);/* If necessary, update the HW's version of the event ring deq ptr. */
Signature · 1 line
1.7.0.4