From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 09B0BC001DE for ; Mon, 31 Jul 2023 09:32:11 +0000 (UTC) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id A2B18869F3; Mon, 31 Jul 2023 11:32:09 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=bootlin.com header.i=@bootlin.com header.b="APT6sZ94"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 28EA8869F3; Mon, 31 Jul 2023 11:32:08 +0200 (CEST) Received: from relay5-d.mail.gandi.net (relay5-d.mail.gandi.net [217.70.183.197]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 951B986A47 for ; Mon, 31 Jul 2023 11:32:02 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=miquel.raynal@bootlin.com Received: by mail.gandi.net (Postfix) with ESMTPSA id 69B2D1C0004; Mon, 31 Jul 2023 09:32:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1690795922; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=F7fxcQZAiA0L5s+fg594OfU1u7FtuSuNwvk6Ccav7is=; b=APT6sZ94SBpt8DQ5Dd1sUGF24OA+TYlUh2UBi/F4M67nggLp/4nYBP7WdO3KpDj8HQMOiF WLLIbncd1vu1J3gDzrSJMhIUzPfWZvniiyaa80oauAiGFUprQtZCTBgWPJKCRE//52x6Gi Ickvu4iY/aknsrkMm/Z9Mfaj0uj9MTNusaMZALiGWeFLUWgzHKVPR4iejSTwILpThG0Wu4 JgfGSWWWUI/5Xf2OkQ8CIteluRHFHFi9PA0jRAeEbE34O2uEEmQC3NSyFYtRfctSnLrTII 8KwHxM/UUknwxJ25HifkdlgAYdk64lXNyNpF8Ln2J0hsSEjMkGoixOBM29ZNMA== Date: Mon, 31 Jul 2023 11:31:59 +0200 From: Miquel Raynal To: Marek Vasut Cc: u-boot@lists.denx.de, Kevin Hilman , Lukasz Majewski , Simon Glass Subject: Re: [PATCH v3 1/4] cmd: bind: Add unbind command with driver filter Message-ID: <20230731113159.26e710aa@xps-13> In-Reply-To: <20230729145712.213945-1-marex@denx.de> References: <20230729145712.213945-1-marex@denx.de> Organization: Bootlin X-Mailer: Claws Mail 4.0.0 (GTK+ 3.24.33; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-GND-Sasl: miquel.raynal@bootlin.com X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de X-Virus-Status: Clean Hi Marek, marex@denx.de wrote on Sat, 29 Jul 2023 16:57:09 +0200: > Extend the driver core to perform lookup by both OF node and driver > bound to the node. Use this to look up specific device instances to > unbind from nodes in the unbind command. One example where this is > needed is USB peripheral controller, which may have multiple gadget > drivers bound to it. The unbind command has to select that specific > gadget driver instance to unbind from the controller, not unbind the > controller driver itself from the controller. >=20 > USB ethernet gadget usage looks as follows with this change. Notice > the extra 'usb_ether' addition in the 'unbind' command at the end. > " > bind /soc/usb-otg@49000000 usb_ether > setenv ethact usb_ether > setenv loadaddr 0xc2000000 > setenv ipaddr 10.0.0.2 > setenv serverip 10.0.0.1 > setenv netmask 255.255.255.0 > tftpboot 0xc2000000 10.0.0.1:test.file > unbind /soc/usb-otg@49000000 usb_ether > " >=20 > Signed-off-by: Marek Vasut > --- I am no longer getting wrong pointer dereferences, the SPL is working in recovery mode, TFTP "File not found" errors are no longer a problem and I did not experience any reset while tftp'ing regular files. One last remaining request on my side is the need for using fastboot as well which does no longer work as-is: =3D> fastboot usb 0 couldn't find an available UDC g_dnl_register: failed!, error: -19 exit not allowed from main input shell. Can you advise what bind/unbind command would be necessary here? Thanks, Miqu=C3=A8l > Cc: Kevin Hilman > Cc: Lukasz Majewski > Cc: Miquel Raynal > Cc: Simon Glass > --- > V2: No change > V3: No change > --- > cmd/bind.c | 10 +++++----- > drivers/core/device.c | 20 +++++++++++++++----- > include/dm/device.h | 17 +++++++++++++++++ > 3 files changed, 37 insertions(+), 10 deletions(-) >=20 > diff --git a/cmd/bind.c b/cmd/bind.c > index 4d1b7885e60..3137cdf6cb5 100644 > --- a/cmd/bind.c > +++ b/cmd/bind.c > @@ -162,7 +162,7 @@ static int bind_by_node_path(const char *path, const = char *drv_name) > return 0; > } > =20 > -static int unbind_by_node_path(const char *path) > +static int unbind_by_node_path(const char *path, const char *drv_name) > { > struct udevice *dev; > int ret; > @@ -174,7 +174,7 @@ static int unbind_by_node_path(const char *path) > return -EINVAL; > } > =20 > - ret =3D device_find_global_by_ofnode(ofnode, &dev); > + ret =3D device_find_global_by_ofnode_driver(ofnode, drv_name, &dev); > =20 > if (!dev || ret) { > printf("Cannot find a device with path %s\n", path); > @@ -214,9 +214,9 @@ static int do_bind_unbind(struct cmd_tbl *cmdtp, int = flag, int argc, > return CMD_RET_USAGE; > ret =3D bind_by_node_path(argv[1], argv[2]); > } else if (by_node && !bind) { > - if (argc !=3D 2) > + if (argc !=3D 2 && argc !=3D 3) > return CMD_RET_USAGE; > - ret =3D unbind_by_node_path(argv[1]); > + ret =3D unbind_by_node_path(argv[1], argv[2]); > } else if (!by_node && bind) { > int index =3D (argc > 2) ? dectoul(argv[2], NULL) : 0; > =20 > @@ -251,7 +251,7 @@ U_BOOT_CMD( > U_BOOT_CMD( > unbind, 4, 0, do_bind_unbind, > "Unbind a device from a driver", > - "\n" > + " []\n" > "unbind \n" > "unbind \n" > ); > diff --git a/drivers/core/device.c b/drivers/core/device.c > index 6e26b64fb81..52fceb69341 100644 > --- a/drivers/core/device.c > +++ b/drivers/core/device.c > @@ -877,15 +877,17 @@ int device_get_child_by_of_offset(const struct udev= ice *parent, int node, > } > =20 > static struct udevice *_device_find_global_by_ofnode(struct udevice *par= ent, > - ofnode ofnode) > + ofnode ofnode, > + const char *drv) > { > struct udevice *dev, *found; > =20 > - if (ofnode_equal(dev_ofnode(parent), ofnode)) > + if (ofnode_equal(dev_ofnode(parent), ofnode) && > + (!drv || (drv && !strcmp(parent->driver->name, drv)))) > return parent; > =20 > device_foreach_child(dev, parent) { > - found =3D _device_find_global_by_ofnode(dev, ofnode); > + found =3D _device_find_global_by_ofnode(dev, ofnode, drv); > if (found) > return found; > } > @@ -895,7 +897,15 @@ static struct udevice *_device_find_global_by_ofnode= (struct udevice *parent, > =20 > int device_find_global_by_ofnode(ofnode ofnode, struct udevice **devp) > { > - *devp =3D _device_find_global_by_ofnode(gd->dm_root, ofnode); > + *devp =3D _device_find_global_by_ofnode(gd->dm_root, ofnode, NULL); > + > + return *devp ? 0 : -ENOENT; > +} > + > +int device_find_global_by_ofnode_driver(ofnode ofnode, const char *drv, > + struct udevice **devp) > +{ > + *devp =3D _device_find_global_by_ofnode(gd->dm_root, ofnode, drv); > =20 > return *devp ? 0 : -ENOENT; > } > @@ -904,7 +914,7 @@ int device_get_global_by_ofnode(ofnode ofnode, struct= udevice **devp) > { > struct udevice *dev; > =20 > - dev =3D _device_find_global_by_ofnode(gd->dm_root, ofnode); > + dev =3D _device_find_global_by_ofnode(gd->dm_root, ofnode, NULL); > return device_get_device_tail(dev, dev ? 0 : -ENOENT, devp); > } > =20 > diff --git a/include/dm/device.h b/include/dm/device.h > index b86bf90609b..5f05ae0924f 100644 > --- a/include/dm/device.h > +++ b/include/dm/device.h > @@ -748,6 +748,23 @@ int device_get_child_by_of_offset(const struct udevi= ce *parent, int of_offset, > =20 > int device_find_global_by_ofnode(ofnode node, struct udevice **devp); > =20 > +/** > + * device_find_global_by_ofnode_driver() - Get a device based on ofnode = and driver > + * > + * Locates a device by its device tree ofnode and driver currently bound= to > + * it, searching globally throughout the all driver model devices. > + * > + * The device is NOT probed > + * > + * @node: Device tree ofnode to find > + * @drv: Driver name bound to device > + * @devp: Returns pointer to device if found, otherwise this is set to N= ULL > + * Return: 0 if OK, -ve on error > + */ > + > +int device_find_global_by_ofnode_driver(ofnode node, const char *drv, > + struct udevice **devp); > + > /** > * device_get_global_by_ofnode() - Get a device based on ofnode > *