]> git.itanic.dy.fi Git - linux-stable/commitdiff
xhci: Preserve RsvdP bits in ERSTBA register correctly
authorLukas Wunner <lukas@wunner.de>
Fri, 15 Sep 2023 14:31:08 +0000 (17:31 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 2 Oct 2023 14:33:46 +0000 (16:33 +0200)
xhci_add_interrupter() erroneously preserves only the lowest 4 bits when
writing the ERSTBA register, not the lowest 6 bits.  Fix it.

Migrate the ERST_BASE_RSVDP macro to the modern GENMASK_ULL() syntax to
avoid a u64 cast.

This was previously fixed by commit 8c1cbec9db1a ("xhci: fix event ring
segment table related masks and variables in header"), but immediately
undone by commit b17a57f89f69 ("xhci: Refactor interrupter code for
initial multi interrupter support.").

Fixes: b17a57f89f69 ("xhci: Refactor interrupter code for initial multi interrupter support.")
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Cc: stable@vger.kernel.org # v6.3+
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Link: https://lore.kernel.org/r/20230915143108.1532163-5-mathias.nyman@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/xhci-mem.c
drivers/usb/host/xhci.h

index 8714ab5bf04d6b7ebf4c69d625786475d7fc27d3..0a37f0d511cf53c377ac52669573086e4d5fb577 100644 (file)
@@ -2285,8 +2285,8 @@ xhci_add_interrupter(struct xhci_hcd *xhci, struct xhci_interrupter *ir,
        writel(erst_size, &ir->ir_set->erst_size);
 
        erst_base = xhci_read_64(xhci, &ir->ir_set->erst_base);
-       erst_base &= ERST_PTR_MASK;
-       erst_base |= (ir->erst.erst_dma_addr & (u64) ~ERST_PTR_MASK);
+       erst_base &= ERST_BASE_RSVDP;
+       erst_base |= ir->erst.erst_dma_addr & ~ERST_BASE_RSVDP;
        xhci_write_64(xhci, erst_base, &ir->ir_set->erst_base);
 
        /* Set the event ring dequeue address of this interrupter */
index 7e282b4522c0aa16c15398afefb933ecec2db7e5..5df370482521f74fe8784c2b531ed3aca7371a1c 100644 (file)
@@ -514,7 +514,7 @@ struct xhci_intr_reg {
 #define        ERST_SIZE_MASK          (0xffff << 16)
 
 /* erst_base bitmasks */
-#define ERST_BASE_RSVDP                (0x3f)
+#define ERST_BASE_RSVDP                (GENMASK_ULL(5, 0))
 
 /* erst_dequeue bitmasks */
 /* Dequeue ERST Segment Index (DESI) - Segment number (or alias)