diff options
Diffstat (limited to 'target/linux/bcm27xx/patches-6.1/950-0361-xhci-refactor-out-TRBS_PER_SEGMENT-define-in-runtime.patch')
-rw-r--r-- | target/linux/bcm27xx/patches-6.1/950-0361-xhci-refactor-out-TRBS_PER_SEGMENT-define-in-runtime.patch | 257 |
1 files changed, 0 insertions, 257 deletions
diff --git a/target/linux/bcm27xx/patches-6.1/950-0361-xhci-refactor-out-TRBS_PER_SEGMENT-define-in-runtime.patch b/target/linux/bcm27xx/patches-6.1/950-0361-xhci-refactor-out-TRBS_PER_SEGMENT-define-in-runtime.patch deleted file mode 100644 index 4147167600..0000000000 --- a/target/linux/bcm27xx/patches-6.1/950-0361-xhci-refactor-out-TRBS_PER_SEGMENT-define-in-runtime.patch +++ /dev/null @@ -1,257 +0,0 @@ -From 11527dad9862ba7e53654943fdacc3ffdad00ae2 Mon Sep 17 00:00:00 2001 -From: Jonathan Bell <jonathan@raspberrypi.com> -Date: Mon, 13 Dec 2021 15:05:56 +0000 -Subject: [PATCH] xhci: refactor out TRBS_PER_SEGMENT define in runtime - code - -In anticipation of adjusting the number of utilised TRBs in a ring -segment, add trbs_per_seg to struct xhci_ring and use this instead -of a compile-time define. - -Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com> ---- - drivers/usb/host/xhci-mem.c | 48 +++++++++++++++++++----------------- - drivers/usb/host/xhci-ring.c | 20 +++++++++------ - drivers/usb/host/xhci.c | 6 ++--- - drivers/usb/host/xhci.h | 1 + - 4 files changed, 42 insertions(+), 33 deletions(-) - ---- a/drivers/usb/host/xhci-mem.c -+++ b/drivers/usb/host/xhci-mem.c -@@ -98,6 +98,7 @@ static void xhci_free_segments_for_ring( - */ - static void xhci_link_segments(struct xhci_segment *prev, - struct xhci_segment *next, -+ unsigned int trbs_per_seg, - enum xhci_ring_type type, bool chain_links) - { - u32 val; -@@ -106,16 +107,16 @@ static void xhci_link_segments(struct xh - return; - prev->next = next; - if (type != TYPE_EVENT) { -- prev->trbs[TRBS_PER_SEGMENT-1].link.segment_ptr = -+ prev->trbs[trbs_per_seg - 1].link.segment_ptr = - cpu_to_le64(next->dma); - - /* Set the last TRB in the segment to have a TRB type ID of Link TRB */ -- val = le32_to_cpu(prev->trbs[TRBS_PER_SEGMENT-1].link.control); -+ val = le32_to_cpu(prev->trbs[trbs_per_seg - 1].link.control); - val &= ~TRB_TYPE_BITMASK; - val |= TRB_TYPE(TRB_LINK); - if (chain_links) - val |= TRB_CHAIN; -- prev->trbs[TRBS_PER_SEGMENT-1].link.control = cpu_to_le32(val); -+ prev->trbs[trbs_per_seg - 1].link.control = cpu_to_le32(val); - } - } - -@@ -139,15 +140,17 @@ static void xhci_link_rings(struct xhci_ - (xhci->quirks & XHCI_AMD_0x96_HOST))); - - next = ring->enq_seg->next; -- xhci_link_segments(ring->enq_seg, first, ring->type, chain_links); -- xhci_link_segments(last, next, ring->type, chain_links); -+ xhci_link_segments(ring->enq_seg, first, ring->trbs_per_seg, -+ ring->type, chain_links); -+ xhci_link_segments(last, next, ring->trbs_per_seg, -+ ring->type, chain_links); - ring->num_segs += num_segs; -- ring->num_trbs_free += (TRBS_PER_SEGMENT - 1) * num_segs; -+ ring->num_trbs_free += (ring->trbs_per_seg - 1) * num_segs; - - if (ring->type != TYPE_EVENT && ring->enq_seg == ring->last_seg) { -- ring->last_seg->trbs[TRBS_PER_SEGMENT-1].link.control -+ ring->last_seg->trbs[ring->trbs_per_seg - 1].link.control - &= ~cpu_to_le32(LINK_TOGGLE); -- last->trbs[TRBS_PER_SEGMENT-1].link.control -+ last->trbs[ring->trbs_per_seg - 1].link.control - |= cpu_to_le32(LINK_TOGGLE); - ring->last_seg = last; - } -@@ -314,14 +317,15 @@ void xhci_initialize_ring_info(struct xh - * Each segment has a link TRB, and leave an extra TRB for SW - * accounting purpose - */ -- ring->num_trbs_free = ring->num_segs * (TRBS_PER_SEGMENT - 1) - 1; -+ ring->num_trbs_free = ring->num_segs * (ring->trbs_per_seg - 1) - 1; - } - - /* Allocate segments and link them for a ring */ - static int xhci_alloc_segments_for_ring(struct xhci_hcd *xhci, - struct xhci_segment **first, struct xhci_segment **last, -- unsigned int num_segs, unsigned int cycle_state, -- enum xhci_ring_type type, unsigned int max_packet, gfp_t flags) -+ unsigned int num_segs, unsigned int trbs_per_seg, -+ unsigned int cycle_state, enum xhci_ring_type type, -+ unsigned int max_packet, gfp_t flags) - { - struct xhci_segment *prev; - bool chain_links; -@@ -350,12 +354,12 @@ static int xhci_alloc_segments_for_ring( - } - return -ENOMEM; - } -- xhci_link_segments(prev, next, type, chain_links); -+ xhci_link_segments(prev, next, trbs_per_seg, type, chain_links); - - prev = next; - num_segs--; - } -- xhci_link_segments(prev, *first, type, chain_links); -+ xhci_link_segments(prev, *first, trbs_per_seg, type, chain_links); - *last = prev; - - return 0; -@@ -387,16 +391,17 @@ struct xhci_ring *xhci_ring_alloc(struct - if (num_segs == 0) - return ring; - -+ ring->trbs_per_seg = TRBS_PER_SEGMENT; - ret = xhci_alloc_segments_for_ring(xhci, &ring->first_seg, -- &ring->last_seg, num_segs, cycle_state, type, -- max_packet, flags); -+ &ring->last_seg, num_segs, ring->trbs_per_seg, -+ cycle_state, type, max_packet, flags); - if (ret) - goto fail; - - /* Only event ring does not use link TRB */ - if (type != TYPE_EVENT) { - /* See section 4.9.2.1 and 6.4.4.1 */ -- ring->last_seg->trbs[TRBS_PER_SEGMENT - 1].link.control |= -+ ring->last_seg->trbs[ring->trbs_per_seg - 1].link.control |= - cpu_to_le32(LINK_TOGGLE); - } - xhci_initialize_ring_info(ring, cycle_state); -@@ -429,15 +434,14 @@ int xhci_ring_expansion(struct xhci_hcd - unsigned int num_segs_needed; - int ret; - -- num_segs_needed = (num_trbs + (TRBS_PER_SEGMENT - 1) - 1) / -- (TRBS_PER_SEGMENT - 1); -- -+ num_segs_needed = (num_trbs + (ring->trbs_per_seg - 1) - 1) / -+ (ring->trbs_per_seg - 1); - /* Allocate number of segments we needed, or double the ring size */ - num_segs = max(ring->num_segs, num_segs_needed); - - ret = xhci_alloc_segments_for_ring(xhci, &first, &last, -- num_segs, ring->cycle_state, ring->type, -- ring->bounce_buf_len, flags); -+ num_segs, ring->trbs_per_seg, ring->cycle_state, -+ ring->type, ring->bounce_buf_len, flags); - if (ret) - return -ENOMEM; - -@@ -1813,7 +1817,7 @@ int xhci_alloc_erst(struct xhci_hcd *xhc - for (val = 0; val < evt_ring->num_segs; val++) { - entry = &erst->entries[val]; - entry->seg_addr = cpu_to_le64(seg->dma); -- entry->seg_size = cpu_to_le32(TRBS_PER_SEGMENT); -+ entry->seg_size = cpu_to_le32(evt_ring->trbs_per_seg); - entry->rsvd = 0; - seg = seg->next; - } ---- a/drivers/usb/host/xhci-ring.c -+++ b/drivers/usb/host/xhci-ring.c -@@ -90,15 +90,16 @@ static bool trb_is_link(union xhci_trb * - return TRB_TYPE_LINK_LE32(trb->link.control); - } - --static bool last_trb_on_seg(struct xhci_segment *seg, union xhci_trb *trb) -+static bool last_trb_on_seg(struct xhci_segment *seg, -+ unsigned int trbs_per_seg, union xhci_trb *trb) - { -- return trb == &seg->trbs[TRBS_PER_SEGMENT - 1]; -+ return trb == &seg->trbs[trbs_per_seg - 1]; - } - - static bool last_trb_on_ring(struct xhci_ring *ring, - struct xhci_segment *seg, union xhci_trb *trb) - { -- return last_trb_on_seg(seg, trb) && (seg->next == ring->first_seg); -+ return last_trb_on_seg(seg, ring->trbs_per_seg, trb) && (seg->next == ring->first_seg); - } - - static bool link_trb_toggles_cycle(union xhci_trb *trb) -@@ -161,7 +162,8 @@ void inc_deq(struct xhci_hcd *xhci, stru - - /* event ring doesn't have link trbs, check for last trb */ - if (ring->type == TYPE_EVENT) { -- if (!last_trb_on_seg(ring->deq_seg, ring->dequeue)) { -+ if (!last_trb_on_seg(ring->deq_seg, ring->trbs_per_seg, -+ ring->dequeue)) { - ring->dequeue++; - goto out; - } -@@ -174,7 +176,8 @@ void inc_deq(struct xhci_hcd *xhci, stru - - /* All other rings have link trbs */ - if (!trb_is_link(ring->dequeue)) { -- if (last_trb_on_seg(ring->deq_seg, ring->dequeue)) { -+ if (last_trb_on_seg(ring->deq_seg, ring->trbs_per_seg, -+ ring->dequeue)) { - xhci_warn(xhci, "Missing link TRB at end of segment\n"); - } else { - ring->dequeue++; -@@ -225,7 +228,7 @@ static void inc_enq(struct xhci_hcd *xhc - if (!trb_is_link(ring->enqueue)) - ring->num_trbs_free--; - -- if (last_trb_on_seg(ring->enq_seg, ring->enqueue)) { -+ if (last_trb_on_seg(ring->enq_seg, ring->trbs_per_seg, ring->enqueue)) { - xhci_err(xhci, "Tried to move enqueue past ring segment\n"); - return; - } -@@ -3151,7 +3154,7 @@ irqreturn_t xhci_irq(struct usb_hcd *hcd - * that clears the EHB. - */ - while (xhci_handle_event(xhci) > 0) { -- if (event_loop++ < TRBS_PER_SEGMENT / 2) -+ if (event_loop++ < xhci->event_ring->trbs_per_seg / 2) - continue; - xhci_update_erst_dequeue(xhci, event_ring_deq); - event_ring_deq = xhci->event_ring->dequeue; -@@ -3293,7 +3296,8 @@ static int prepare_ring(struct xhci_hcd - } - } - -- if (last_trb_on_seg(ep_ring->enq_seg, ep_ring->enqueue)) { -+ if (last_trb_on_seg(ep_ring->enq_seg, ep_ring->trbs_per_seg, -+ ep_ring->enqueue)) { - xhci_warn(xhci, "Missing link TRB at end of ring segment\n"); - return -EINVAL; - } ---- a/drivers/usb/host/xhci.c -+++ b/drivers/usb/host/xhci.c -@@ -895,8 +895,8 @@ static void xhci_clear_command_ring(stru - seg = ring->deq_seg; - do { - memset(seg->trbs, 0, -- sizeof(union xhci_trb) * (TRBS_PER_SEGMENT - 1)); -- seg->trbs[TRBS_PER_SEGMENT - 1].link.control &= -+ sizeof(union xhci_trb) * (ring->trbs_per_seg - 1)); -+ seg->trbs[ring->trbs_per_seg - 1].link.control &= - cpu_to_le32(~TRB_CYCLE); - seg = seg->next; - } while (seg != ring->deq_seg); -@@ -907,7 +907,7 @@ static void xhci_clear_command_ring(stru - ring->enq_seg = ring->deq_seg; - ring->enqueue = ring->dequeue; - -- ring->num_trbs_free = ring->num_segs * (TRBS_PER_SEGMENT - 1) - 1; -+ ring->num_trbs_free = ring->num_segs * (ring->trbs_per_seg - 1) - 1; - /* - * Ring is now zeroed, so the HW should look for change of ownership - * when the cycle bit is set to 1. ---- a/drivers/usb/host/xhci.h -+++ b/drivers/usb/host/xhci.h -@@ -1639,6 +1639,7 @@ struct xhci_ring { - unsigned int num_trbs_free; - unsigned int num_trbs_free_temp; - unsigned int bounce_buf_len; -+ unsigned int trbs_per_seg; - enum xhci_ring_type type; - bool last_td_was_short; - struct radix_tree_root *trb_address_map; |