xhci: Simplify event ring dequeue pointer update for port change events
authorMathias Nyman <mathias.nyman@linux.intel.com>
Thu, 19 Oct 2023 10:29:18 +0000 (13:29 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 21 Oct 2023 10:38:54 +0000 (12:38 +0200)
Increase the event ring dequeue pointer for port change events in the
same way as other event types. No need to handle it separately.

This only touches the driver side tracking of event ring dequeue.

Note: this does move forward the event ring dequeue increase for port
change events a bit.
Previously the dequeue was increased before temporarily dropping
the xhci lock while kicking roothub polling.
Now dequeue is increased after re-aquiring the lock.

This should not matter as event ring dequeue is not touched at all by
hub thread. It's only touched in xhci interrupt handler.

Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Link: https://lore.kernel.org/r/20231019102924.2797346-14-mathias.nyman@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/xhci-ring.c

index 7aa6f132835b2e04411ed668acd0d7f138bcac7a..73057f01e4aa5950fc3c9db54bb64fc1b30acd6e 100644 (file)
@@ -1879,7 +1879,6 @@ static void handle_port_status(struct xhci_hcd *xhci,
        if ((port_id <= 0) || (port_id > max_ports)) {
                xhci_warn(xhci, "Port change event with invalid port ID %d\n",
                          port_id);
-               inc_deq(xhci, ir->event_ring);
                return;
        }
 
@@ -2007,8 +2006,6 @@ static void handle_port_status(struct xhci_hcd *xhci,
        }
 
 cleanup:
-       /* Update event ring dequeue pointer before dropping the lock */
-       inc_deq(xhci, ir->event_ring);
 
        /* Don't make the USB core poll the roothub if we got a bad port status
         * change event.  Besides, at that point we can't tell which roothub
@@ -2915,7 +2912,6 @@ err_out:
 static int xhci_handle_event(struct xhci_hcd *xhci, struct xhci_interrupter *ir)
 {
        union xhci_trb *event;
-       int update_ptrs = 1;
        u32 trb_type;
 
        /* Event ring hasn't been allocated yet. */
@@ -2946,7 +2942,6 @@ static int xhci_handle_event(struct xhci_hcd *xhci, struct xhci_interrupter *ir)
                break;
        case TRB_PORT_STATUS:
                handle_port_status(xhci, ir, event);
-               update_ptrs = 0;
                break;
        case TRB_TRANSFER:
                handle_tx_event(xhci, ir, &event->trans_event);
@@ -2969,9 +2964,8 @@ static int xhci_handle_event(struct xhci_hcd *xhci, struct xhci_interrupter *ir)
                return 0;
        }
 
-       if (update_ptrs)
-               /* Update SW event ring dequeue pointer */
-               inc_deq(xhci, ir->event_ring);
+       /* Update SW event ring dequeue pointer */
+       inc_deq(xhci, ir->event_ring);
 
        /* Are there more items on the event ring?  Caller will call us again to
         * check.