From patchwork Thu Apr 7 20:00:52 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luke Nowakowski-Krijger X-Patchwork-Id: 1614632 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=canonical.com header.i=@canonical.com header.a=rsa-sha256 header.s=20210705 header.b=TVo96dM6; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=) Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4KZC1l0Gqwz9sGf for ; Fri, 8 Apr 2022 06:01:13 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1ncYJU-0008KT-64; Thu, 07 Apr 2022 20:01:04 +0000 Received: from smtp-relay-internal-0.internal ([10.131.114.225] helo=smtp-relay-internal-0.canonical.com) by huckleberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1ncYJR-0008JY-TA for kernel-team@lists.ubuntu.com; Thu, 07 Apr 2022 20:01:01 +0000 Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id DE1343F828 for ; Thu, 7 Apr 2022 20:01:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1649361660; bh=Px7qPC1+1UoA3oDCLYM6KjZxsuzAJcKk/tNhvX3CA6k=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=TVo96dM6Q7XnDmuJhmUKVAnkueiAwp626KVRYom+zxi4u8LWp0mS5iz2MVllAaglD sp0MLskGA5kw4t5oLockl2t5//yQHV3xH+r4ay8qX20lDesWZ7DRWMCMWh6DPXI5Lh PVQYt/fHdZPHZH6febANZ68XhzvgXDxOnSlhl6iPVL/eXVrW3QTY7uXma7C3Lqw9xL yKEZEKjKVl2cyS6CXuHhbh/cOoF4erchDeZdmflkd+7GdcpiJMCYrqGkw8ZRDw0ntj nULAJrAWsiPQvmUlwA2I6qEKtkrFt81z2m2s1oZWJJtUos+0dVVwvZGzWlnSoJ9Li/ muB6gpOBx9k+Q== Received: by mail-pl1-f197.google.com with SMTP id i16-20020a170902c95000b001570fc36d54so1167360pla.1 for ; Thu, 07 Apr 2022 13:01:00 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Px7qPC1+1UoA3oDCLYM6KjZxsuzAJcKk/tNhvX3CA6k=; b=G641XRT/zYSm09FdWK2VS//e379Ko+qxDbrm1NfNiLhiwB7xqVprmatRTIMhX7WT/u W+eZZ04jOt0LWjGLWBh0GhWjs1sqSNsW/nY/KkiZFNynBF/igGc3StFSeen9Y+jUJ2My nu0pMqd1mnwYvUW/z0AUAUumk7YKHlniqa8g9QeYPEyObhetbVHINfgGtLGdjXaJAE0I JPRXH6DpsnelF0qGBHvTmSp+EdQwIYKSrl7d1Tf1uYdKAC40GZ/BOwtmVjOQyzSNfo9S dPNW+CNk6KwhDRFGEj3u7On4ChAa27oq7NB6ogKY47rWv5Sozn8/1Pzud/SNqmNs4zmy Btxg== X-Gm-Message-State: AOAM530fNe7ZTWIflu6lxI+Rc7nh4PPDo92eifDoncSoarw8S/QceU4e wQ0OOIp0NqImd3Isi0SiLvZLd2+Ngw49P4sNckKkAzaaIMatZRhNopKVYmsCqz+U/feoK407aDL 27VtoIzZDOzeLtpJoffBVxNgWkJI7o6SRrg6o3y+2/A== X-Received: by 2002:a65:550c:0:b0:39c:c5a9:6ca4 with SMTP id f12-20020a65550c000000b0039cc5a96ca4mr4249413pgr.476.1649361659062; Thu, 07 Apr 2022 13:00:59 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzDJ8JhFUOwjrzvHb+woCp4lYMfhWUhY0P4ceSAsQxleWzjcGBwUARXxRfjQmCFd6Wm6X+MRg== X-Received: by 2002:a65:550c:0:b0:39c:c5a9:6ca4 with SMTP id f12-20020a65550c000000b0039cc5a96ca4mr4249389pgr.476.1649361658704; Thu, 07 Apr 2022 13:00:58 -0700 (PDT) Received: from luke-ubuntu.. (cpe-66-27-118-101.san.res.rr.com. [66.27.118.101]) by smtp.gmail.com with ESMTPSA id e13-20020a63370d000000b003810782e0cdsm19661273pga.56.2022.04.07.13.00.57 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 Apr 2022 13:00:58 -0700 (PDT) From: Luke Nowakowski-Krijger To: kernel-team@lists.ubuntu.com Subject: [SRU][F][PATCH 2/2] UBUNTU: SAUCE: Revert "Revert "usb: core: hcd: Add support for deferring roothub registration"" Date: Thu, 7 Apr 2022 13:00:52 -0700 Message-Id: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" BugLink: https://bugs.launchpad.net/bugs/1968210 This reverts commit 664c864fa18a64fa4adc12dec96f0cbb0680a239. Reintroduce this commit as it fixes an issue with certain intel xHCI controllers where device enumeration happens before xHC is running, causing USB devices not to be detected at boot time. This commit will be reintroduced upstream due to previous bugs being fixed, but lets reintroduce it now to fix the problem users are experiencing. Signed-off-by: Luke Nowakowski-Krijger --- drivers/usb/core/hcd.c | 29 +++++++++++++++++++++++------ include/linux/usb/hcd.h | 2 ++ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 3debbf0736bc..da6b1711c013 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c @@ -2677,6 +2677,7 @@ int usb_add_hcd(struct usb_hcd *hcd, { int retval; struct usb_device *rhdev; + struct usb_hcd *shared_hcd; if (!hcd->skip_phy_initialization && usb_hcd_is_primary_hcd(hcd)) { hcd->phy_roothub = usb_phy_roothub_alloc(hcd->self.sysdev); @@ -2833,13 +2834,26 @@ int usb_add_hcd(struct usb_hcd *hcd, goto err_hcd_driver_start; } + /* starting here, usbcore will pay attention to the shared HCD roothub */ + shared_hcd = hcd->shared_hcd; + if (!usb_hcd_is_primary_hcd(hcd) && shared_hcd && HCD_DEFER_RH_REGISTER(shared_hcd)) { + retval = register_root_hub(shared_hcd); + if (retval != 0) + goto err_register_root_hub; + + if (shared_hcd->uses_new_polling && HCD_POLL_RH(shared_hcd)) + usb_hcd_poll_rh_status(shared_hcd); + } + /* starting here, usbcore will pay attention to this root hub */ - retval = register_root_hub(hcd); - if (retval != 0) - goto err_register_root_hub; + if (!HCD_DEFER_RH_REGISTER(hcd)) { + retval = register_root_hub(hcd); + if (retval != 0) + goto err_register_root_hub; - if (hcd->uses_new_polling && HCD_POLL_RH(hcd)) - usb_hcd_poll_rh_status(hcd); + if (hcd->uses_new_polling && HCD_POLL_RH(hcd)) + usb_hcd_poll_rh_status(hcd); + } return retval; @@ -2876,6 +2890,7 @@ EXPORT_SYMBOL_GPL(usb_add_hcd); void usb_remove_hcd(struct usb_hcd *hcd) { struct usb_device *rhdev = hcd->self.root_hub; + bool rh_registered; dev_info(hcd->self.controller, "remove, state %x\n", hcd->state); @@ -2886,6 +2901,7 @@ void usb_remove_hcd(struct usb_hcd *hcd) dev_dbg(hcd->self.controller, "roothub graceful disconnect\n"); spin_lock_irq (&hcd_root_hub_lock); + rh_registered = hcd->rh_registered; hcd->rh_registered = 0; spin_unlock_irq (&hcd_root_hub_lock); @@ -2895,7 +2911,8 @@ void usb_remove_hcd(struct usb_hcd *hcd) cancel_work_sync(&hcd->died_work); mutex_lock(&usb_bus_idr_lock); - usb_disconnect(&rhdev); /* Sets rhdev to NULL */ + if (rh_registered) + usb_disconnect(&rhdev); /* Sets rhdev to NULL */ mutex_unlock(&usb_bus_idr_lock); /* diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h index 712b2a603645..c0eb85b2981e 100644 --- a/include/linux/usb/hcd.h +++ b/include/linux/usb/hcd.h @@ -124,6 +124,7 @@ struct usb_hcd { #define HCD_FLAG_RH_RUNNING 5 /* root hub is running? */ #define HCD_FLAG_DEAD 6 /* controller has died? */ #define HCD_FLAG_INTF_AUTHORIZED 7 /* authorize interfaces? */ +#define HCD_FLAG_DEFER_RH_REGISTER 8 /* Defer roothub registration */ /* The flags can be tested using these macros; they are likely to * be slightly faster than test_bit(). @@ -134,6 +135,7 @@ struct usb_hcd { #define HCD_WAKEUP_PENDING(hcd) ((hcd)->flags & (1U << HCD_FLAG_WAKEUP_PENDING)) #define HCD_RH_RUNNING(hcd) ((hcd)->flags & (1U << HCD_FLAG_RH_RUNNING)) #define HCD_DEAD(hcd) ((hcd)->flags & (1U << HCD_FLAG_DEAD)) +#define HCD_DEFER_RH_REGISTER(hcd) ((hcd)->flags & (1U << HCD_FLAG_DEFER_RH_REGISTER)) /* * Specifies if interfaces are authorized by default