]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
usb: xhci: allocate DCBAA based on host controller max slots
authorNiklas Neronin <niklas.neronin@linux.intel.com>
Wed, 3 Jun 2026 09:11:31 +0000 (12:11 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 3 Jun 2026 17:23:30 +0000 (19:23 +0200)
Allocate the Device Context Base Address Array (DCBAA) according to the
maximum number of device slots supported by the host controller, instead
of always allocating the absolute maximum of 255 entries.

The xHCI specification defines the DCBAA size as (MaxSlotsEnabled + 1)
entries. In the xhci driver there is currently no distinction between
MaxSlots and MaxSlotsEnabled, as all available slots are enabled during
initialization. As a result, 'max_slots' effectively represents both
values.

This change allows the xHCI driver to respect custom slot limits, reduces
unnecessary memory usage, and removes the obsolete "TODO" comment.

Signed-off-by: Niklas Neronin <niklas.neronin@linux.intel.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Link: https://patch.msgid.link/20260603091132.1110849-15-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 019dac47c5d6cf405d2362ed64b760d220bfd9ae..939151e5440efff735850f960d4ea0b2b6616107 100644 (file)
@@ -1975,7 +1975,7 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)
 
        dcbaa = &xhci->dcbaa;
        if (dcbaa->ctx_array) {
-               dma_free_coherent(dev, array_size(sizeof(*dcbaa->ctx_array), MAX_HC_SLOTS),
+               dma_free_coherent(dev, array_size(sizeof(*dcbaa->ctx_array), xhci->max_slots + 1),
                                  dcbaa->ctx_array, dcbaa->dma);
                dcbaa->ctx_array = NULL;
        }
@@ -2411,8 +2411,8 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
 
        xhci_dbg_trace(xhci, trace_xhci_dbg_init, "Starting %s", __func__);
 
-       dcbaa->ctx_array =
-               dma_alloc_coherent(dev, array_size(sizeof(*dcbaa->ctx_array), MAX_HC_SLOTS),
+       xhci->dcbaa.ctx_array =
+               dma_alloc_coherent(dev, array_size(sizeof(*dcbaa->ctx_array), xhci->max_slots + 1),
                                   &dcbaa->dma, flags);
        if (!dcbaa->ctx_array)
                goto fail;
index 3c304372bad325972fd9d4e0d51f9937ca7196cd..4f98d8269625b8f658abf2bf92e21ab78650e185 100644 (file)
@@ -609,7 +609,7 @@ static struct xhci_virt_ep *xhci_get_virt_ep(struct xhci_hcd *xhci,
                                             unsigned int slot_id,
                                             unsigned int ep_index)
 {
-       if (slot_id == 0 || slot_id >= MAX_HC_SLOTS) {
+       if (slot_id == 0 || slot_id > xhci->max_slots) {
                xhci_warn(xhci, "Invalid slot_id %u\n", slot_id);
                return NULL;
        }
@@ -1804,7 +1804,7 @@ static void handle_cmd_completion(struct xhci_hcd *xhci,
        struct xhci_command *cmd;
        u32 cmd_type;
 
-       if (slot_id >= MAX_HC_SLOTS) {
+       if (slot_id > xhci->max_slots) {
                xhci_warn(xhci, "Invalid slot_id %u\n", slot_id);
                return;
        }
index 9d57def08ea6bccf3236f383f37b4d25d6f26c20..cb80acac97d4f2abf17e7956dbb8c981f541c03b 100644 (file)
@@ -792,7 +792,8 @@ struct xhci_tt_bw_info {
 
 /**
  * struct xhci_device_context_array
- * @ctx_array: Pointer to an array of addresses
+ * @ctx_array: Pointer to an array of addresses. The array size depends on Max
+ *             Slots read from HCSPARAMS1.
  * @dma:       DMA address to @ctx_array
  *
  * Device Context Base Address Array (DCBAA) - Section 6.1.
@@ -803,10 +804,6 @@ struct xhci_device_context_array {
        __le64          *ctx_array;
        dma_addr_t      dma;
 };
-/*
- * TODO: change this to be dynamically sized at HC mem init time since the HC
- * might not be able to handle the maximum number of devices possible.
- */
 
 
 struct xhci_transfer_event {