Received: by 2002:a05:6a11:4021:0:0:0:0 with SMTP id ky33csp4150289pxb; Mon, 27 Sep 2021 10:24:42 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzkNv/fi/3NCpWCQhG6a7FZAQTcrXUp7U715VJrslJjFSePHfS36LNXIHRIeyVBnAF9k6dw X-Received: by 2002:a63:4f0f:: with SMTP id d15mr694684pgb.464.1632763482306; Mon, 27 Sep 2021 10:24:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1632763482; cv=none; d=google.com; s=arc-20160816; b=vUnjHyqHIY1FrBw59wGFVOAzPLn65hxbfaLn8FAEz/qa8+MluVxbbwsfOojhD9I9TU N2PWNmSY/ZyJ5GwkV5HWH8ijGdvrrx/pFTEaLolyTHDjDe8YJ9Msyq2E/C2JGTNSvqvt j7o4tmSKWIrurnk3HOluhxV2uddBYURY0pZWMvt7qzL/Y+GiLxl78wtB6rOiu+GxW2u1 BqUCypH7qIvR0DHhEgYqgEKpI3sCu98IokZBzmdoeY4C4+5Lp82bPc1EGZkR284wnewk Wn4Gn6B8F5v7zC7JEWTox6EBgQPnpSNOcH2mjQmlgDtHVyBSLbn9HX9EGAkxy0EW8dy3 Ohtg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=YOepsRBqHTqjbls9hCDyyjU/A82F6w0mYW3MIhCF/2k=; b=HXurDEHoUv3L29LMdB6TD0vlCsToWymCRD4zEqz7dBbtAdYKKIJ2H2h15V/mTC+QxH r2KqMpQ3bv+uu6ZH/DhidzFrTCtIwRSqbcIjPxBzjWFD0NJUGrFWA7cSat8fh/5ZVSue iZtlo3ec8/e2aGz8pM1kBH1AgYrpCqrIGoCkqS3OtsvN31eAGK+CBme3p5Le06bVbL85 UvLiUQeJRw+GKXbibD8ykKLvFTH5OUossNC+MYj+FVWLkRhXav9j5UJhJQ/TNeLgm45w WGXET3prULkQC8T9cjq+fxL/Ga00Jt15yX2BgmCZYjjVQkZ/z/CDGEWZqxMtfZNHaAoX kSNA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=pXl2kLkq; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id w8si2104689pgj.617.2021.09.27.10.24.29; Mon, 27 Sep 2021 10:24:42 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=pXl2kLkq; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237654AbhI0RXZ (ORCPT + 99 others); Mon, 27 Sep 2021 13:23:25 -0400 Received: from mail.kernel.org ([198.145.29.99]:35378 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237072AbhI0RUb (ORCPT ); Mon, 27 Sep 2021 13:20:31 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id CC84D6120D; Mon, 27 Sep 2021 17:13:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1632762806; bh=W5315l78c0L8L2i4ahAUSSZ1pcFZYf51XWvprPU/VAg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pXl2kLkqKYb6anKhKF2p/okiXdwsntwb+y6l7mcxPdeDRTbQfHmg1ilH4kdf10Y69 H+5ET6X8Xmx/BUvzPjXuEuVpFWSSzDf/br9VocAEe9Vamk0c1eoIjVPik1JYXP7Tot H2Tw1uj5SXkpkoZDf7DWfQcAGhyfUnEOD2OtoSLg= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Mathias Nyman , Chris Chiu , Alan Stern , Kishon Vijay Abraham I Subject: [PATCH 5.14 025/162] usb: core: hcd: Add support for deferring roothub registration Date: Mon, 27 Sep 2021 19:01:11 +0200 Message-Id: <20210927170234.332823354@linuxfoundation.org> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210927170233.453060397@linuxfoundation.org> References: <20210927170233.453060397@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Kishon Vijay Abraham I commit 58877b0824da15698bd85a0a9dbfa8c354e6ecb7 upstream. It has been observed with certain PCIe USB cards (like Inateck connected to AM64 EVM or J7200 EVM) that as soon as the primary roothub is registered, port status change is handled even before xHC is running leading to cold plug USB devices not detected. For such cases, registering both the root hubs along with the second HCD is required. Add support for deferring roothub registration in usb_add_hcd(), so that both primary and secondary roothubs are registered along with the second HCD. CC: stable@vger.kernel.org # 5.4+ Suggested-by: Mathias Nyman Tested-by: Chris Chiu Acked-by: Alan Stern Signed-off-by: Kishon Vijay Abraham I Link: https://lore.kernel.org/r/20210909064200.16216-2-kishon@ti.com Signed-off-by: Greg Kroah-Hartman --- drivers/usb/core/hcd.c | 29 +++++++++++++++++++++++------ include/linux/usb/hcd.h | 2 ++ 2 files changed, 25 insertions(+), 6 deletions(-) --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c @@ -2775,6 +2775,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); @@ -2935,13 +2936,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; @@ -2985,6 +2999,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); @@ -2995,6 +3010,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); @@ -3004,7 +3020,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); /* --- 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