From: Boris Brezillon <boris.brezillon@collabora.com>
To: Vitor Soares <Vitor.Soares@synopsys.com>
Cc: mark.rutland@arm.com, devicetree@vger.kernel.org,
Joao.Pinto@synopsys.com, bbrezillon@kernel.org,
linux-kernel@vger.kernel.org, Przemyslaw Gaj <pgaj@cadence.com>,
robh+dt@kernel.org, linux-i3c@lists.infradead.org
Subject: Re: [PATCH 1/4] i3c: master: detach and free device if pre_assign_dyn_addr() fails
Date: Thu, 29 Aug 2019 12:41:15 +0200 [thread overview]
Message-ID: <20190829124115.482cd8ec@collabora.com> (raw)
In-Reply-To: <e26948eaaf765f683d8fe0618a31a98e2ecc0e65.1567071213.git.vitor.soares@synopsys.com>
+Przemek
Please try to Cc active I3C contributors so they get a chance to
comment on your patches.
On Thu, 29 Aug 2019 12:19:32 +0200
Vitor Soares <Vitor.Soares@synopsys.com> wrote:
> On pre_assing_dyn_addr() the devices that fail:
> i3c_master_setdasa_locked()
> i3c_master_reattach_i3c_dev()
> i3c_master_retrieve_dev_info()
>
> are kept in memory and master->bus.devs list. This makes the i3c devices
> without a dynamic address are sent on DEFSLVS CCC command. Fix this by
> detaching and freeing the devices that fail on pre_assign_dyn_addr().
I don't think removing those entries is a good strategy, as one might
want to try to use a different dynamic address if the requested one
is not available. Why not simply skipping entries that have ->dyn_addr
set to 0 when preparing a DEFSLVS frame
>
> Signed-off-by: Vitor Soares <vitor.soares@synopsys.com>
> ---
> drivers/i3c/master.c | 11 ++++++++---
> 1 file changed, 8 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c
> index 5f4bd52..4d29e1f 100644
> --- a/drivers/i3c/master.c
> +++ b/drivers/i3c/master.c
> @@ -1438,7 +1438,7 @@ static void i3c_master_pre_assign_dyn_addr(struct i3c_dev_desc *dev)
> ret = i3c_master_setdasa_locked(master, dev->info.static_addr,
> dev->boardinfo->init_dyn_addr);
> if (ret)
> - return;
> + goto err_detach_dev;
>
> dev->info.dyn_addr = dev->boardinfo->init_dyn_addr;
> ret = i3c_master_reattach_i3c_dev(dev, 0);
> @@ -1453,6 +1453,10 @@ static void i3c_master_pre_assign_dyn_addr(struct i3c_dev_desc *dev)
>
> err_rstdaa:
> i3c_master_rstdaa_locked(master, dev->boardinfo->init_dyn_addr);
> +
> +err_detach_dev:
> + i3c_master_detach_i3c_dev(dev);
> + i3c_master_free_i3c_dev(dev);
We certainly shouldn't detach/free the i3c_dev_desc from here. If it
has to be done somewhere (which I'd like to avoid), it should be done
in i3c_master_bus_init() (i3c_master_pre_assign_dyn_addr() should be
converted to return an int in that case).
> }
>
> static void
> @@ -1647,7 +1651,7 @@ static int i3c_master_bus_init(struct i3c_master_controller *master)
> enum i3c_addr_slot_status status;
> struct i2c_dev_boardinfo *i2cboardinfo;
> struct i3c_dev_boardinfo *i3cboardinfo;
> - struct i3c_dev_desc *i3cdev;
> + struct i3c_dev_desc *i3cdev, *i3ctmp;
> struct i2c_dev_desc *i2cdev;
> int ret;
>
> @@ -1746,7 +1750,8 @@ static int i3c_master_bus_init(struct i3c_master_controller *master)
> * Pre-assign dynamic address and retrieve device information if
> * needed.
> */
> - i3c_bus_for_each_i3cdev(&master->bus, i3cdev)
> + list_for_each_entry_safe(i3cdev, i3ctmp, &master->bus.devs.i3c,
> + common.node)
> i3c_master_pre_assign_dyn_addr(i3cdev);
>
> ret = i3c_master_do_daa(master);
_______________________________________________
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c
WARNING: multiple messages have this Message-ID (diff)
From: Boris Brezillon <boris.brezillon@collabora.com>
To: Vitor Soares <Vitor.Soares@synopsys.com>
Cc: linux-kernel@vger.kernel.org, devicetree@vger.kernel.org,
linux-i3c@lists.infradead.org, bbrezillon@kernel.org,
robh+dt@kernel.org, mark.rutland@arm.com,
Joao.Pinto@synopsys.com, Przemyslaw Gaj <pgaj@cadence.com>
Subject: Re: [PATCH 1/4] i3c: master: detach and free device if pre_assign_dyn_addr() fails
Date: Thu, 29 Aug 2019 12:41:15 +0200 [thread overview]
Message-ID: <20190829124115.482cd8ec@collabora.com> (raw)
In-Reply-To: <e26948eaaf765f683d8fe0618a31a98e2ecc0e65.1567071213.git.vitor.soares@synopsys.com>
+Przemek
Please try to Cc active I3C contributors so they get a chance to
comment on your patches.
On Thu, 29 Aug 2019 12:19:32 +0200
Vitor Soares <Vitor.Soares@synopsys.com> wrote:
> On pre_assing_dyn_addr() the devices that fail:
> i3c_master_setdasa_locked()
> i3c_master_reattach_i3c_dev()
> i3c_master_retrieve_dev_info()
>
> are kept in memory and master->bus.devs list. This makes the i3c devices
> without a dynamic address are sent on DEFSLVS CCC command. Fix this by
> detaching and freeing the devices that fail on pre_assign_dyn_addr().
I don't think removing those entries is a good strategy, as one might
want to try to use a different dynamic address if the requested one
is not available. Why not simply skipping entries that have ->dyn_addr
set to 0 when preparing a DEFSLVS frame
>
> Signed-off-by: Vitor Soares <vitor.soares@synopsys.com>
> ---
> drivers/i3c/master.c | 11 ++++++++---
> 1 file changed, 8 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c
> index 5f4bd52..4d29e1f 100644
> --- a/drivers/i3c/master.c
> +++ b/drivers/i3c/master.c
> @@ -1438,7 +1438,7 @@ static void i3c_master_pre_assign_dyn_addr(struct i3c_dev_desc *dev)
> ret = i3c_master_setdasa_locked(master, dev->info.static_addr,
> dev->boardinfo->init_dyn_addr);
> if (ret)
> - return;
> + goto err_detach_dev;
>
> dev->info.dyn_addr = dev->boardinfo->init_dyn_addr;
> ret = i3c_master_reattach_i3c_dev(dev, 0);
> @@ -1453,6 +1453,10 @@ static void i3c_master_pre_assign_dyn_addr(struct i3c_dev_desc *dev)
>
> err_rstdaa:
> i3c_master_rstdaa_locked(master, dev->boardinfo->init_dyn_addr);
> +
> +err_detach_dev:
> + i3c_master_detach_i3c_dev(dev);
> + i3c_master_free_i3c_dev(dev);
We certainly shouldn't detach/free the i3c_dev_desc from here. If it
has to be done somewhere (which I'd like to avoid), it should be done
in i3c_master_bus_init() (i3c_master_pre_assign_dyn_addr() should be
converted to return an int in that case).
> }
>
> static void
> @@ -1647,7 +1651,7 @@ static int i3c_master_bus_init(struct i3c_master_controller *master)
> enum i3c_addr_slot_status status;
> struct i2c_dev_boardinfo *i2cboardinfo;
> struct i3c_dev_boardinfo *i3cboardinfo;
> - struct i3c_dev_desc *i3cdev;
> + struct i3c_dev_desc *i3cdev, *i3ctmp;
> struct i2c_dev_desc *i2cdev;
> int ret;
>
> @@ -1746,7 +1750,8 @@ static int i3c_master_bus_init(struct i3c_master_controller *master)
> * Pre-assign dynamic address and retrieve device information if
> * needed.
> */
> - i3c_bus_for_each_i3cdev(&master->bus, i3cdev)
> + list_for_each_entry_safe(i3cdev, i3ctmp, &master->bus.devs.i3c,
> + common.node)
> i3c_master_pre_assign_dyn_addr(i3cdev);
>
> ret = i3c_master_do_daa(master);
next prev parent reply other threads:[~2019-08-29 10:41 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-29 10:19 [PATCH 0/4] i3c: remove device if failed on pre_assign_dyn_addr() Vitor Soares
2019-08-29 10:19 ` Vitor Soares
2019-08-29 10:19 ` [PATCH 1/4] i3c: master: detach and free device if pre_assign_dyn_addr() fails Vitor Soares
2019-08-29 10:19 ` Vitor Soares
2019-08-29 10:41 ` Boris Brezillon [this message]
2019-08-29 10:41 ` Boris Brezillon
2019-08-29 13:53 ` Vitor Soares
2019-08-29 13:53 ` Vitor Soares
2019-08-29 14:35 ` Boris Brezillon
2019-08-29 14:35 ` Boris Brezillon
2019-08-29 15:23 ` Vitor Soares
2019-08-29 15:23 ` Vitor Soares
2019-08-29 15:37 ` Boris Brezillon
2019-08-29 15:37 ` Boris Brezillon
2019-08-29 16:23 ` Vitor Soares
2019-08-29 16:23 ` Vitor Soares
2019-08-29 10:19 ` [PATCH 2/4] i3c: master: Check if devices have i3c_dev_boardinfo on i3c_master_add_i3c_dev_locked() Vitor Soares
2019-08-29 10:19 ` Vitor Soares
2019-08-29 10:44 ` Boris Brezillon
2019-08-29 10:44 ` Boris Brezillon
2019-08-29 14:00 ` Vitor Soares
2019-08-29 14:00 ` Vitor Soares
2019-08-29 14:39 ` Boris Brezillon
2019-08-29 14:39 ` Boris Brezillon
2019-08-29 14:39 ` Boris Brezillon
2019-08-29 14:39 ` Boris Brezillon
2019-08-29 15:07 ` Vitor Soares
2019-08-29 15:07 ` Vitor Soares
2019-08-29 15:24 ` Boris Brezillon
2019-08-29 15:24 ` Boris Brezillon
2019-08-29 15:57 ` Vitor Soares
2019-08-29 15:57 ` Vitor Soares
2019-08-29 16:15 ` Boris Brezillon
2019-08-29 16:15 ` Boris Brezillon
2019-08-29 16:33 ` Vitor Soares
2019-08-29 16:33 ` Vitor Soares
2019-08-29 16:37 ` Boris Brezillon
2019-08-29 16:37 ` Boris Brezillon
2019-08-29 16:27 ` Boris Brezillon
2019-08-29 16:27 ` Boris Brezillon
2019-08-29 10:19 ` [PATCH 3/4] dt-bindings: i3c: Make 'assigned-address' valid if static address != 0 Vitor Soares
2019-08-29 10:19 ` Vitor Soares
2019-08-29 10:51 ` Boris Brezillon
2019-08-29 10:51 ` Boris Brezillon
2019-08-29 14:06 ` Vitor Soares
2019-08-29 14:06 ` Vitor Soares
2019-08-29 10:19 ` [PATCH 4/4] i3c: master: dw: reattach device on first available location of address table Vitor Soares
2019-08-29 10:19 ` Vitor Soares
2019-08-29 11:15 ` Boris Brezillon
2019-08-29 11:15 ` Boris Brezillon
2019-08-29 14:09 ` Vitor Soares
2019-08-29 14:09 ` Vitor Soares
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190829124115.482cd8ec@collabora.com \
--to=boris.brezillon@collabora.com \
--cc=Joao.Pinto@synopsys.com \
--cc=Vitor.Soares@synopsys.com \
--cc=bbrezillon@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=linux-i3c@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=pgaj@cadence.com \
--cc=robh+dt@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.