]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
usb: xhci: Fix root hub descriptor
authorMark Kettenis <kettenis@openbsd.org>
Sat, 21 Jan 2023 19:28:00 +0000 (20:28 +0100)
committerTom Rini <trini@konsulko.com>
Fri, 27 Jan 2023 19:47:58 +0000 (14:47 -0500)
When a system has multiple XHCI controllers, some of the
properties described in the descriptor of the root hub (such as
the number of ports) might differ between controllers.  Fix this
by switching from a single global hub descriptor to a hub
descriptor per controller.

Signed-off-by: Mark Kettenis <kettenis@openbsd.org>
Reviewed-by: Marek Vasut <marex@denx.de>
drivers/usb/host/xhci.c
include/usb/xhci.h

index 440b0224b1f0820211d5541d624b50762b35886d..9e33c5d85596ce358d80dbba3f752109589a7006 100644 (file)
@@ -944,7 +944,7 @@ static int xhci_submit_root(struct usb_device *udev, unsigned long pipe,
                case USB_DT_HUB:
                case USB_DT_SS_HUB:
                        debug("USB_DT_HUB config\n");
-                       srcptr = &descriptor.hub;
+                       srcptr = &ctrl->hub_desc;
                        srclen = 0x8;
                        break;
                default:
@@ -1203,21 +1203,22 @@ static int xhci_lowlevel_init(struct xhci_ctrl *ctrl)
        /* initializing xhci data structures */
        if (xhci_mem_init(ctrl, hccr, hcor) < 0)
                return -ENOMEM;
+       ctrl->hub_desc = descriptor.hub;
 
        reg = xhci_readl(&hccr->cr_hcsparams1);
-       descriptor.hub.bNbrPorts = HCS_MAX_PORTS(reg);
-       printf("Register %x NbrPorts %d\n", reg, descriptor.hub.bNbrPorts);
+       ctrl->hub_desc.bNbrPorts = HCS_MAX_PORTS(reg);
+       printf("Register %x NbrPorts %d\n", reg, ctrl->hub_desc.bNbrPorts);
 
        /* Port Indicators */
        reg = xhci_readl(&hccr->cr_hccparams);
        if (HCS_INDICATOR(reg))
-               put_unaligned(get_unaligned(&descriptor.hub.wHubCharacteristics)
-                               | 0x80, &descriptor.hub.wHubCharacteristics);
+               put_unaligned(get_unaligned(&ctrl->hub_desc.wHubCharacteristics)
+                               | 0x80, &ctrl->hub_desc.wHubCharacteristics);
 
        /* Port Power Control */
        if (HCC_PPC(reg))
-               put_unaligned(get_unaligned(&descriptor.hub.wHubCharacteristics)
-                               | 0x01, &descriptor.hub.wHubCharacteristics);
+               put_unaligned(get_unaligned(&ctrl->hub_desc.wHubCharacteristics)
+                               | 0x01, &ctrl->hub_desc.wHubCharacteristics);
 
        if (xhci_start(hcor)) {
                xhci_reset(hcor);
index 85c359fa1b9f92304340f8a9ced9c6ae50e7e8d4..4a4ac10229ac94083bbf1c581804142ff8bf810d 100644 (file)
@@ -1222,6 +1222,7 @@ struct xhci_ctrl {
        struct xhci_erst_entry entry[ERST_NUM_SEGS];
        struct xhci_scratchpad *scratchpad;
        struct xhci_virt_device *devs[MAX_HC_SLOTS];
+       struct usb_hub_descriptor hub_desc;
        int rootdev;
        u16 hci_version;
        int page_size;