]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
usb: xhci: move ring initialization
authorNiklas Neronin <niklas.neronin@linux.intel.com>
Thu, 2 Apr 2026 13:13:25 +0000 (16:13 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 2 Apr 2026 13:55:37 +0000 (15:55 +0200)
Move ring initialization from xhci_ring_alloc() to xhci_ring_init().
Call xhci_ring_init() after xhci_ring_alloc(); in the future,
it can also be used to re-initialize the ring during resume.

Additionally, remove xhci_dbg_trace() from xhci_mem_init(). The command
ring's first segment DMA address is now printed during the trace call in
xhci_ring_init().

This refactoring lays also the groundwork for eventually replacing:
* xhci_dbc_ring_init()
* xhci_clear_command_ring()

Signed-off-by: Niklas Neronin <niklas.neronin@linux.intel.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Link: https://patch.msgid.link/20260402131342.2628648-9-mathias.nyman@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/xhci-mem.c
drivers/usb/host/xhci.c
drivers/usb/host/xhci.h

index 45638ab13635192ce2c0dac43a0a65aa11e52b55..ca4463eebc4952575a1c10ec080e3179961ffbf3 100644 (file)
@@ -129,6 +129,13 @@ static void xhci_initialize_ring_segments(struct xhci_hcd *xhci, struct xhci_rin
        ring->last_seg->trbs[TRBS_PER_SEGMENT - 1].link.control |= cpu_to_le32(LINK_TOGGLE);
 }
 
+void xhci_ring_init(struct xhci_hcd *xhci, struct xhci_ring *ring)
+{
+       xhci_initialize_ring_segments(xhci, ring);
+       xhci_initialize_ring_info(ring);
+       trace_xhci_ring_alloc(ring);
+}
+
 /*
  * Link the src ring segments to the dst ring.
  * Set Toggle Cycle for the new ring if needed.
@@ -389,9 +396,6 @@ struct xhci_ring *xhci_ring_alloc(struct xhci_hcd *xhci, unsigned int num_segs,
        if (ret)
                goto fail;
 
-       xhci_initialize_ring_segments(xhci, ring);
-       xhci_initialize_ring_info(ring);
-       trace_xhci_ring_alloc(ring);
        return ring;
 
 fail:
@@ -668,6 +672,8 @@ struct xhci_stream_info *xhci_alloc_stream_info(struct xhci_hcd *xhci,
                cur_ring = stream_info->stream_rings[cur_stream];
                if (!cur_ring)
                        goto cleanup_rings;
+
+               xhci_ring_init(xhci, cur_ring);
                cur_ring->stream_id = cur_stream;
                cur_ring->trb_address_map = &stream_info->trb_address_map;
                /* Set deq ptr, cycle bit, and stream context type */
@@ -1011,6 +1017,8 @@ int xhci_alloc_virt_device(struct xhci_hcd *xhci, int slot_id,
        if (!dev->eps[0].ring)
                goto fail;
 
+       xhci_ring_init(xhci, dev->eps[0].ring);
+
        dev->udev = udev;
 
        /* Point to output device context in dcbaa. */
@@ -1492,6 +1500,7 @@ int xhci_endpoint_init(struct xhci_hcd *xhci,
 
        virt_dev->eps[ep_index].skip = false;
        ep_ring = virt_dev->eps[ep_index].new_ring;
+       xhci_ring_init(xhci, ep_ring);
 
        /* Fill the endpoint context */
        ep_ctx->ep_info = cpu_to_le32(EP_MAX_ESIT_PAYLOAD_HI(max_esit_payload) |
@@ -2370,6 +2379,8 @@ xhci_create_secondary_interrupter(struct usb_hcd *hcd, unsigned int segs,
        if (!ir)
                return NULL;
 
+       xhci_ring_init(xhci, ir->event_ring);
+
        spin_lock_irq(&xhci->lock);
        if (!intr_num) {
                /* Find available secondary interrupter, interrupter 0 is reserved for primary */
@@ -2482,8 +2493,6 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
                goto fail;
 
        xhci_dbg_trace(xhci, trace_xhci_dbg_init, "Allocated command ring at %p", xhci->cmd_ring);
-       xhci_dbg_trace(xhci, trace_xhci_dbg_init, "First segment DMA is 0x%pad",
-                      &xhci->cmd_ring->first_seg->dma);
 
        /* Allocate and set up primary interrupter 0 with an event ring. */
        xhci_dbg_trace(xhci, trace_xhci_dbg_init, "Allocating primary event ring");
index b9fa941425c588a0f6d089e67116aab8b9b6dc13..dd495dc740c371b7f369488cd7bbb67d50c99a25 100644 (file)
@@ -564,6 +564,8 @@ static int xhci_init(struct usb_hcd *hcd)
        /* Set the Number of Device Slots Enabled to the maximum supported value */
        xhci_enable_max_dev_slots(xhci);
 
+       /* Initialize the Command ring */
+       xhci_ring_init(xhci, xhci->cmd_ring);
        /*
         * Reserve one command ring TRB for disabling LPM.
         * Since the USB core grabs the shared usb_bus bandwidth mutex before
@@ -583,6 +585,7 @@ static int xhci_init(struct usb_hcd *hcd)
        xhci_set_dev_notifications(xhci);
 
        /* Initialize the Primary interrupter */
+       xhci_ring_init(xhci, xhci->interrupters[0]->event_ring);
        xhci_add_interrupter(xhci, 0);
        xhci->interrupters[0]->isoc_bei_interval = AVOID_BEI_INTERVAL_MAX;
 
index 1bef4301e2b4ec52460c0b9664f52756f9c5aff2..06f6da4d982fc7d29d6d418c30355b7101ad1b4c 100644 (file)
@@ -1824,6 +1824,7 @@ void xhci_ring_free(struct xhci_hcd *xhci, struct xhci_ring *ring);
 int xhci_ring_expansion(struct xhci_hcd *xhci, struct xhci_ring *ring,
                unsigned int num_trbs, gfp_t flags);
 void xhci_initialize_ring_info(struct xhci_ring *ring);
+void xhci_ring_init(struct xhci_hcd *xhci, struct xhci_ring *ring);
 void xhci_free_endpoint_ring(struct xhci_hcd *xhci,
                struct xhci_virt_device *virt_dev,
                unsigned int ep_index);