Received: by 2002:a05:6358:16cc:b0:ea:6187:17c9 with SMTP id r12csp1408545rwl; Thu, 5 Jan 2023 13:10:20 -0800 (PST) X-Google-Smtp-Source: AMrXdXtEbYyQsosfQGQ68XvXbGpDwC35N5YeiqxrvrqWhZDv/Tcwaxv6WsOVVKktGe8e8VxmA9j7 X-Received: by 2002:a17:90a:7106:b0:226:3f8:5b78 with SMTP id h6-20020a17090a710600b0022603f85b78mr34143619pjk.13.1672953020005; Thu, 05 Jan 2023 13:10:20 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672953019; cv=none; d=google.com; s=arc-20160816; b=K5GywNVUYxh5cbxihVZ+8zwLi+fTPXC+3GkYO9Xzql0Y+fnFRbNH0npGJtHft9Nbv5 kYtia7FN7r0DGust2xs22uYJxPEz+7Zia+wj2qETQDLKV+aDOj1wEoN1i7z8B3SeqTgK wOX8dTQ71EdxCz/91TQ8Ek1k316pAxumFyiEAORlS11i4VHqoMGgTwVU1eCM3wp9+we5 zBOS13669dChtTnOjrrsypnfF+wg/Bu44naQRkM2p/U+NGkhwwpw190RQzBWEsl1rBJn TYIXQfJ9mudfKus48WG3Mn/RRkTez4Qmt4espPnlPcCaV8L0gt734eld6xqhwLmjIle8 wSVQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date:dkim-signature; bh=BAvLXY6p3twtxyJimzUpT6xRmecbq2LwY4H4Ygwtajg=; b=vRWwS+loSPR60PsoGDDuqqqUSi47k8eBBL65E2TPTARHRyPlbrEtEcXbLuP+NJdqJr NOgmHWQbT04y4nMFKJpre8Xx/4zx2tq3/wr8VOOx8AQTdF64gKrk8js9saYVwHg2oo3P hT/6ED7tPyIZklnP5cGZe24/sEQz2YPxijkZDPj5K54epE4Y0Xf4ARIWtpkXt6vsgkm2 Xl43NbZJnd47IJKVIWzLFBsblvNYKas9q9CTx/v6FVSBloOzJAkx0XkvN/DAJNl6a2QT O/uo/ey1Y2Gd4VqxHvhhq+prn+vCPklxhiSPtFN0tCgNxLOvOvsZvzOl+LxawyDAFmIb PeFA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=HDRXXliI; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id hk17-20020a17090b225100b00226abc2bf62si3156056pjb.21.2023.01.05.13.10.12; Thu, 05 Jan 2023 13:10:19 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=HDRXXliI; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235321AbjAEUpp (ORCPT + 57 others); Thu, 5 Jan 2023 15:45:45 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36528 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232255AbjAEUpj (ORCPT ); Thu, 5 Jan 2023 15:45:39 -0500 Received: from mail-il1-x131.google.com (mail-il1-x131.google.com [IPv6:2607:f8b0:4864:20::131]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9E8C24C71F for ; Thu, 5 Jan 2023 12:45:38 -0800 (PST) Received: by mail-il1-x131.google.com with SMTP id o8so21645642ilo.1 for ; Thu, 05 Jan 2023 12:45:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=BAvLXY6p3twtxyJimzUpT6xRmecbq2LwY4H4Ygwtajg=; b=HDRXXliIfeT2qYcw8lOmiSUYv37fEYum+ARvE4aDgAD34qFU116uKMveGWjmlWNqBN rA+LkQe771Bjd35Uri9iXYsZ1SJQBAuw6tKRT4V3/rZwQ6v7w2OX41mOhcRi0DytIwQl 4Hpnn4bBvGdT8paIBgIm2b4w/q8n4A/JJ1NVY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=BAvLXY6p3twtxyJimzUpT6xRmecbq2LwY4H4Ygwtajg=; b=GQ0HFxJG1HXoboJ4LMDlK1aaGLsf9nO68hJX1ifh1xSAdn5+Jol1Ofm6RzakhuTMr+ w7B+ZsLEapXr+dH5Jk8hYuqT4/iwcCU9G3Qx6FMcdEmAVh2DWh1rjhm4yJ4FWtGAx7lv 5VR5wphFppmilH/Fc33jexap6JZppmcctfbfhu6ArxzThPJ6hfOA0ZmuKSxxSQRYjZKa H0b5IxWBxAbBNcEBZAvbWA8S6f/EAygeSScXeAVm7sg6AI+62WfoUUoGJRrMXAfXRY3s Ikz8sfN8kbsoO/VSFKVYfFEJu1IYaMIYsJEGIoPQUvyD3Lh7ZCK8BKUjvAAJbMJpNmVE cMlw== X-Gm-Message-State: AFqh2krJeoQQo5i8h3nx6uPKCC18Ra4lnqBhHxP3tgEPb9mibLmK1ser Yg5YfPQDEotwdtYkCXq2htZyDw== X-Received: by 2002:a05:6e02:108:b0:30c:5c54:c264 with SMTP id t8-20020a056e02010800b0030c5c54c264mr7703283ilm.13.1672951537864; Thu, 05 Jan 2023 12:45:37 -0800 (PST) Received: from localhost (30.23.70.34.bc.googleusercontent.com. [34.70.23.30]) by smtp.gmail.com with UTF8SMTPSA id h1-20020a92d841000000b002eb1137a774sm11781951ilq.59.2023.01.05.12.45.37 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 05 Jan 2023 12:45:37 -0800 (PST) Date: Thu, 5 Jan 2023 20:45:37 +0000 From: Matthias Kaehlcke To: Alexander Stein Cc: Doug Anderson , Greg Kroah-Hartman , linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, Stefan Wahren , stable@vger.kernel.org, Ravi Chandra Sadineni , Icenowy Zheng Subject: Re: [PATCH v2 1/2] usb: misc: onboard_usb_hub: Don't create platform devices for DT nodes without 'vdd-supply' Message-ID: References: <20221222022605.v2.1.If5e7ec83b1782e4dffa6ea759416a27326c8231d@changeid> <10807929.5MRjnR8RnV@steina-w> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Jan 04, 2023 at 07:37:37PM +0000, Matthias Kaehlcke wrote: > On Wed, Jan 04, 2023 at 10:00:43AM +0100, Alexander Stein wrote: > > Hi Matthias, > > > > Am Dienstag, 3. Januar 2023, 18:12:24 CET schrieb Matthias Kaehlcke: > > > On Thu, Dec 22, 2022 at 11:26:26AM -0800, Doug Anderson wrote: > > > > Hi, > > > > > > > > On Wed, Dec 21, 2022 at 6:26 PM Matthias Kaehlcke > > wrote: > > > > > The primary task of the onboard_usb_hub driver is to control the > > > > > power of an onboard USB hub. The driver gets the regulator from the > > > > > device tree property "vdd-supply" of the hub's DT node. Some boards > > > > > have device tree nodes for USB hubs supported by this driver, but > > > > > don't specify a "vdd-supply". This is not an error per se, it just > > > > > means that the onboard hub driver can't be used for these hubs, so > > > > > don't create platform devices for such nodes. > > > > > > > > > > This change doesn't completely fix the reported regression. It > > > > > should fix it for the RPi 3 B Plus and boards with similar hub > > > > > configurations (compatible DT nodes without "vdd-supply"), boards > > > > > that actually use the onboard hub driver could still be impacted > > > > > by the race conditions discussed in that thread. Not creating the > > > > > platform devices for nodes without "vdd-supply" is the right > > > > > thing to do, independently from the race condition, which will > > > > > be fixed in future patch. > > > > > > > > > > Fixes: 8bc063641ceb ("usb: misc: Add onboard_usb_hub driver") > > > > > Link: > > > > > https://lore.kernel.org/r/d04bcc45-3471-4417-b30b-5cf9880d785d@i2se.com > > > > > / Reported-by: Stefan Wahren > > > > > Signed-off-by: Matthias Kaehlcke > > > > > --- > > > > > > > > > > Changes in v2: > > > > > - don't create platform devices when "vdd-supply" is missing, > > > > > > > > > > rather than returning an error from _find_onboard_hub() > > > > > > > > > > - check for "vdd-supply" not "vdd" (Johan) > > > > > - updated subject and commit message > > > > > - added 'Link' tag (regzbot) > > > > > > > > > > drivers/usb/misc/onboard_usb_hub_pdevs.c | 13 +++++++++++++ > > > > > 1 file changed, 13 insertions(+) > > > > > > > > I'm a tad bit skeptical. > > > > > > > > It somehow feels a bit too much like "inside knowledge" to add this > > > > here. I guess the "onboard_usb_hub_pdevs.c" is already pretty > > > > entangled with "onboard_usb_hub.c", but I'd rather the "pdevs" file > > > > keep the absolute minimum amount of stuff in it and all of the details > > > > be in the other file. > > > > > > > > If this was the only issue though, I'd be tempted to let it slide. As > > > > it is, I'm kinda worried that your patch will break Alexander Stein, > > > > who should have been CCed (I've CCed him now) or Icenowy Zheng (also > > > > CCed now). I believe those folks are using the USB hub driver > > > > primarily to drive a reset GPIO. Looking at the example in the > > > > bindings for one of them (genesys,gl850g.yaml), I even see that the > > > > reset-gpio is specified but not a vdd-supply. I think you'll break > > > > that? > > > > > > Thanks for pointing that out. My assumption was that the regulator is > > > needed for the driver to do anything useful, but you are right, the > > > reset GPIO alone could be used in combination with an always-on regulator > > > to 'switch the hub on and off'. > > > > > > > In general, it feels like it should actually be fine to create the USB > > > > hub driver even if vdd isn't supplied. Sure, it won't do a lot, but it > > > > shouldn't actively hurt anything. You'll just be turning off and on > > > > bogus regulators and burning a few CPU cycles. I guess the problem is > > > > some race condition that you talk about in the commit message. I'd > > > > rather see that fixed... > > > > > > Yes, the race conditions needs to be fixed as well, I didn't have enough > > > time to write and test a patch before taking a longer break for the > > > holidays, so I only sent out this (supposed) partial mitigation. > > > > > > > That being said, if we want to be more efficient and not burn CPU cycles > > > > and memory in Stefan Wahren's case, maybe the USB hub driver itself could > > > > return a canonical error value from its probe when it detects that it has > > > > no useful job and then "onboard_usb_hub_pdevs" could just silently bail > > > > out? > > > > > > _probe() could return an error, however onboard_hub_create_pdevs() can't > > > rely on that, since the actual onboard_hub driver might not have been > > > loaded yet when the function is called. > > > > > > It would be nice not to instantiate the pdev and onboard_hub USB instances > > > if the DT node has neither a 'vdd-supply' nor 'reset-gpios'. If we aren't > > > ok with doing that in onboard_hub_create_pdevs() then at least the 'raw' > > > platform device would be created. onboard_hub_probe() could still > > > bail if both properties are absent, _find_onboard_hub() would have to > > > check it again to avoid the deferred probing 'loop' for the USB instances. > > > > I'm not really fond of checking for optional features like 'vdd-supply' and > > 'reset-gpios'. This issue will pop up again if some new optional feature is > > added again, e.g. power-domains. > > It's not just any optional feature, it needs to be involved in controlling > power. I'm not super-exited about it either, but if we prefer not to > instantiate the drivers for certain DT nodes (TBD if that's a preference), we > need some sort of sentinel since the compatible string alone doesn't provide > enough information. > > > > Alternatively we could 'just' fix the race condition involving the 'attach > > > work' and the onboard_hub driver is fully instantiated even on (certain) > > > boards where it does nothing. It's relatively rare that USB hub nodes are > > > specified in the DT (unless the intention is to use this driver) and > > > CONFIG_USB_ONBOARD_HUB needs to be set for the instances to be created, > > > so maybe creating the useless instances is not such a big deal. > > > > IMHO creating a pdev shouldn't harm in any case. It's similar to having a DT > > node without a corresponding driver enabled or even existing. > > If we only want a 'raw' pdev (no instantiation of the onboard hub platform and > USB drivers) then a similar logic will be needed in the onboard hub driver(s). > > So if we don't want any logic checking that at least one power related property > is defined then we have to accept that the onboard hub driver will be fully > instantiated even when it effectively does nothing. > > If we add logic to the driver it needs to be checked in both the platform and > the USB driver (in the latter to avoid a deferred probe loop). It would be > simpler to just skip the creation of the 'raw' platform device in the first > place. > > > Also adding USB devices to DT is something which is to be expected. > > usb-device.yaml exists since 2020 and the txt version since 2016. > > Yes it it perfectly legal, so we need to handle this case somehow, and we > are currently discussing how to best do that :) > > I still don't expect the combo of supported hub in the DT + > CONFIG_USB_ONBOARD_HUB=y/m to become super-popular, which could be an > argument for the option "just instantiate the drivers even if they do > nothing". Not my favorite option, but probably not that bad either. > > > Unfortunately I'm not able to reproduce this issue on a different platform > > where the same HUB but no reset-gpios is required. I also noticed that > > onboard-usb-hub raises the error > > > Failed to attach USB driver: -22 > > for each hub it is supposed to support. > > Interesting > > I also see the error with v6.2-rc1 but not a downstream v5.15 kernel which > runs most of the time on my boards. It turns out that with v6.2-rc1 the 'bus' > field of 'onboard_hub_usbdev_driver.drvwrap.driver' (passed to driver_attach()) > is NULL, which causes driver_attach() / bus_for_each_dev() to return -EINVAL. > > I did some testing (unbind/bind, unloading/reloading the driver) around the > 'attach work' independently from your report. I couldn't repro a situation > where the onboard_hub USB devices aren't probed by the driver, which is what > the 'attach work' is supposed to solve. At some point I observed issues with > that in the past, which is why driver_attach() is called. The driver_attach() > call was added to the onboard_hub series in early 2021, by that time I was > probably testing with a v5.4 kernel, it's not unconceivable that the issue I > saw back then is fixed in newer kernels. I found a configuration with which the driver_attach() call is needed: for a hub that isn't power cycled on un/rebind (e.g. because it as an 'always-on' regulator and no reset GPIO) the USB devices aren't probed by the onboard_hub driver on rebind. I saw this with a test config for nested hubs, where the secondary hub isn't actually an onboard hub, but an external hub (with DT nodes to fake an onboard hub). On an actual onboard config the hub would usually be power cycled, which should fix/mask the issue (the unbound USB devices 'disappear' on unbind and are freshly created on re-bind). The re-attach is probably not super-important for real world configs, but it would still be good to have this working for the odd/test cases.