]> git.itanic.dy.fi Git - linux-stable/commitdiff
xhci: Update last segment pointer after Event Ring expansion
authorLukas Wunner <lukas@wunner.de>
Thu, 19 Oct 2023 10:29:12 +0000 (13:29 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 21 Oct 2023 10:38:53 +0000 (12:38 +0200)
When expanding a ring at its "end", ring->last_seg needs to be updated
for Event Rings as well, not just for all the other ring types.

This is not a fix because ring expansion currently isn't done on the
Event Ring.  It's just in preparation for when it's added.

Signed-off-by: Lukas Wunner <lukas@wunner.de>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Link: https://lore.kernel.org/r/20231019102924.2797346-8-mathias.nyman@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/xhci-mem.c

index 1c0f5263cf81e66e1a1a1b3a272e22ef147babfc..d4123e6f2549c59deeee8038798b800db208162b 100644 (file)
@@ -146,11 +146,13 @@ static void xhci_link_rings(struct xhci_hcd *xhci, struct xhci_ring *ring,
        xhci_link_segments(last, next, ring->type, chain_links);
        ring->num_segs += num_segs;
 
-       if (ring->type != TYPE_EVENT && ring->enq_seg == ring->last_seg) {
-               ring->last_seg->trbs[TRBS_PER_SEGMENT-1].link.control
-                       &= ~cpu_to_le32(LINK_TOGGLE);
-               last->trbs[TRBS_PER_SEGMENT-1].link.control
-                       |= cpu_to_le32(LINK_TOGGLE);
+       if (ring->enq_seg == ring->last_seg) {
+               if (ring->type != TYPE_EVENT) {
+                       ring->last_seg->trbs[TRBS_PER_SEGMENT-1].link.control
+                               &= ~cpu_to_le32(LINK_TOGGLE);
+                       last->trbs[TRBS_PER_SEGMENT-1].link.control
+                               |= cpu_to_le32(LINK_TOGGLE);
+               }
                ring->last_seg = last;
        }