usb: xhci: move doorbell array pointer assignment
authorNiklas Neronin <niklas.neronin@linux.intel.com>
Thu, 15 May 2025 13:56:05 +0000 (16:56 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 21 May 2025 10:35:32 +0000 (12:35 +0200)
Move the assignment of the doorbell array pointer from xhci_mem_init()
to xhci_init(). The assignment now utilizes the newly introduced
xhci_set_doorbell_ptr() function.

Doorbell Array Offset mask (DBOFF_MASK) is updated to directly specify its
bit range as 31:2, rather than using inverted reserved bits 1:0.
This change simplifies the mask representation, making it more intuitive
and easier to understand.

Remove the "// " prefix from trace messages, as it is unnecessary and
distracting.

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/20250515135621.335595-9-mathias.nyman@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/xhci-caps.h
drivers/usb/host/xhci-mem.c
drivers/usb/host/xhci.c

index f6b9a00a0ab97423090e01835c74b55e8837eb3e..4b8ff481564429af5a4ce0f80ae6188c5886cd91 100644 (file)
@@ -62,8 +62,8 @@
 
 #define CTX_SIZE(_hcc)         (HCC_64BYTE_CONTEXT(_hcc) ? 64 : 32)
 
-/* db_off bitmask - bits 0:1 reserved */
-#define        DBOFF_MASK      (~0x3)
+/* db_off bitmask - bits 31:2 Doorbell Array Offset */
+#define        DBOFF_MASK      (0xfffffffc)
 
 /* run_regs_off bitmask - bits 0:4 reserved */
 #define        RTSOFF_MASK     (~0x1f)
index ac96f0155cab366c7336ca50b55e46cb6d602dce..2f4dbb67b1bf037c3a9bdad9f100d3ca9aa960f6 100644 (file)
@@ -2419,7 +2419,6 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
        struct xhci_interrupter *ir;
        struct device   *dev = xhci_to_hcd(xhci)->self.sysdev;
        dma_addr_t      dma;
-       unsigned int    val;
        u32             temp;
 
        /*
@@ -2496,13 +2495,6 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
         */
        xhci->cmd_ring_reserved_trbs++;
 
-       val = readl(&xhci->cap_regs->db_off);
-       val &= DBOFF_MASK;
-       xhci_dbg_trace(xhci, trace_xhci_dbg_init,
-                      "// Doorbell array is located at offset 0x%x from cap regs base addr",
-                      val);
-       xhci->dba = (void __iomem *) xhci->cap_regs + val;
-
        /* Allocate and set up primary interrupter 0 with an event ring. */
        xhci_dbg_trace(xhci, trace_xhci_dbg_init,
                       "Allocating primary event ring");
index e8c2628651884899f790b5cc5b68d08201fde576..0639d8b7372b2c3e80e5d699c288b88751f2725d 100644 (file)
@@ -514,6 +514,16 @@ static void xhci_set_cmd_ring_deq(struct xhci_hcd *xhci)
        xhci_write_64(xhci, crcr, &xhci->op_regs->cmd_ring);
 }
 
+static void xhci_set_doorbell_ptr(struct xhci_hcd *xhci)
+{
+       u32 offset;
+
+       offset = readl(&xhci->cap_regs->db_off) & DBOFF_MASK;
+       xhci->dba = (void __iomem *)xhci->cap_regs + offset;
+       xhci_dbg_trace(xhci, trace_xhci_dbg_init,
+                      "Doorbell array is located at offset 0x%x from cap regs base addr", offset);
+}
+
 /*
  * Initialize memory for HCD and xHC (one-time init).
  *
@@ -548,6 +558,9 @@ static int xhci_init(struct usb_hcd *hcd)
        /* Set Device Context Base Address Array pointer */
        xhci_write_64(xhci, xhci->dcbaa->dma, &xhci->op_regs->dcbaa_ptr);
 
+       /* Set Doorbell array pointer */
+       xhci_set_doorbell_ptr(xhci);
+
        /* Initializing Compliance Mode Recovery Data If Needed */
        if (xhci_compliance_mode_recovery_timer_quirk_check()) {
                xhci->quirks |= XHCI_COMP_MODE_QUIRK;