mirror of
https://github.com/torvalds/linux.git
synced 2026-05-29 17:43:52 +02:00
usb: xhci: move ring initialization
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>
This commit is contained in:
parent
b1ebf19216
commit
e4573f4937
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user