]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
usb: xhci: move link chain bit quirk checks into one helper function.
authorNiklas Neronin <niklas.neronin@linux.intel.com>
Wed, 26 Jun 2024 12:48:23 +0000 (15:48 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 27 Jun 2024 14:08:05 +0000 (16:08 +0200)
Older 0.95 xHCI hosts and some other specific newer hosts require the
chain bit to be set for Link TRBs even if the link TRB is not in the
middle of a transfer descriptor (TD).

move the checks for all those cases  into one xhci_link_chain_quirk()
function to clean up and avoid code duplication.

No functional changes.

[skip renaming chain_links flag, reword commit message -Mathias]

Signed-off-by: Niklas Neronin <niklas.neronin@linux.intel.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Link: https://lore.kernel.org/r/20240626124835.1023046-10-mathias.nyman@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/xhci-mem.c
drivers/usb/host/xhci-ring.c
drivers/usb/host/xhci.h

index ef768e63e4d396062ef7b37fb619218494268c51..49e14ad9b754d94d2c0560bb7af408e92dfe1c01 100644 (file)
@@ -136,10 +136,7 @@ static void xhci_link_rings(struct xhci_hcd *xhci, struct xhci_ring *ring,
        if (!ring || !first || !last)
                return;
 
-       /* Set chain bit for 0.95 hosts, and for isoc rings on AMD 0.96 host */
-       chain_links = !!(xhci_link_trb_quirk(xhci) ||
-                        (ring->type == TYPE_ISOC &&
-                         (xhci->quirks & XHCI_AMD_0x96_HOST)));
+       chain_links = xhci_link_chain_quirk(xhci, ring->type);
 
        next = ring->enq_seg->next;
        xhci_link_segments(ring->enq_seg, first, ring->type, chain_links);
@@ -335,10 +332,7 @@ static int xhci_alloc_segments_for_ring(struct xhci_hcd *xhci,
        struct xhci_segment *prev;
        bool chain_links;
 
-       /* Set chain bit for 0.95 hosts, and for isoc rings on AMD 0.96 host */
-       chain_links = !!(xhci_link_trb_quirk(xhci) ||
-                        (type == TYPE_ISOC &&
-                         (xhci->quirks & XHCI_AMD_0x96_HOST)));
+       chain_links = xhci_link_chain_quirk(xhci, type);
 
        prev = xhci_segment_alloc(xhci, cycle_state, max_packet, num, flags);
        if (!prev)
index e9130c7c2c538c39559133b2214b274cdbc7e67f..8502776d84d6e0077314ec93b3dc1c1ddd2ca753 100644 (file)
@@ -250,9 +250,7 @@ static void inc_enq(struct xhci_hcd *xhci, struct xhci_ring *ring,
                 * AMD 0.96 host, carry over the chain bit of the previous TRB
                 * (which may mean the chain bit is cleared).
                 */
-               if (!(ring->type == TYPE_ISOC &&
-                     (xhci->quirks & XHCI_AMD_0x96_HOST)) &&
-                   !xhci_link_trb_quirk(xhci)) {
+               if (!xhci_link_chain_quirk(xhci, ring->type)) {
                        next->link.control &= cpu_to_le32(~TRB_CHAIN);
                        next->link.control |= cpu_to_le32(chain);
                }
@@ -3250,9 +3248,7 @@ static int prepare_ring(struct xhci_hcd *xhci, struct xhci_ring *ep_ring,
                /* If we're not dealing with 0.95 hardware or isoc rings
                 * on AMD 0.96 host, clear the chain bit.
                 */
-               if (!xhci_link_trb_quirk(xhci) &&
-                   !(ep_ring->type == TYPE_ISOC &&
-                     (xhci->quirks & XHCI_AMD_0x96_HOST)))
+               if (!xhci_link_chain_quirk(xhci, ep_ring->type))
                        ep_ring->enqueue->link.control &=
                                cpu_to_le32(~TRB_CHAIN);
                else
index 762d6d9bad8e0a352b0a417a993d9de0c5d4d1a0..413ce0b3a213d937534da7ce74d5a2b4b150dca0 100644 (file)
@@ -1750,9 +1750,12 @@ static inline void xhci_write_64(struct xhci_hcd *xhci,
        lo_hi_writeq(val, regs);
 }
 
-static inline int xhci_link_trb_quirk(struct xhci_hcd *xhci)
+
+/* Link TRB chain should always be set on 0.95 hosts, and AMD 0.96 ISOC rings */
+static inline bool xhci_link_chain_quirk(struct xhci_hcd *xhci, enum xhci_ring_type type)
 {
-       return xhci->quirks & XHCI_LINK_TRB_QUIRK;
+       return (xhci->quirks & XHCI_LINK_TRB_QUIRK) ||
+              (type == TYPE_ISOC && (xhci->quirks & XHCI_AMD_0x96_HOST));
 }
 
 /* xHCI debugging */