[U-Boot] [PATCH 1/5 v2] dm: device_remove: Don't return in device_chld_remove() upon error
Simon Glass
sjg at chromium.org
Sat Apr 29 00:26:58 UTC 2017
Hi Stefan,
On 24 April 2017 at 01:48, Stefan Roese <sr at denx.de> wrote:
> On my x86 platform I've noticed, that calling dm_uninit() or the new
> function dm_remove_devices_flags() does not remove the desired device at
> all. Debugging showed, that the serial uclass returns -EPERM in
> serial_pre_remove() and this leads to a complete stop of the device
> removal pretty early, as the serial device is one of the first ones in
> the DM. Here the dm tree output:
>
> => dm tree
> Class Probed Name
> ----------------------------------------
> root [ + ] root_driver
> rsa_mod_exp [ ] |-- mod_exp_sw
> serial [ + ] |-- serial
> rtc [ ] |-- rtc
> timer [ + ] |-- tsc-timer
> syscon [ + ] |-- pch_pinctrl
> ...
>
> In this example, device_remove(root) will stop directly after trying to
> remove the "serial" device.
>
> To solve this problem, this patch removes the return upon error check in
> the device_remove() call in device_chld_remove(). This leads to
> device_chld_remove() continuing with the device_remove() call to the
> following child devices.
>
> Signed-off-by: Stefan Roese <sr at denx.de>
> Cc: Simon Glass <sjg at chromium.org>
> Cc: Bin Meng <bmeng.cn at gmail.com>
> ---
> v2:
> - Add debug() output in error case
>
> drivers/core/device-remove.c | 10 ++++++++--
> 1 file changed, 8 insertions(+), 2 deletions(-)
I thought that your change to force removal of the stdio dev would
make this change unnecessary?
I really would rather fix the root cause if we can.
>
> diff --git a/drivers/core/device-remove.c b/drivers/core/device-remove.c
> index cc0043b990..a1c0103af0 100644
> --- a/drivers/core/device-remove.c
> +++ b/drivers/core/device-remove.c
> @@ -58,8 +58,14 @@ static int device_chld_remove(struct udevice *dev, uint flags)
>
> list_for_each_entry_safe(pos, n, &dev->child_head, sibling_node) {
> ret = device_remove(pos, flags);
> - if (ret)
> - return ret;
> + /*
> + * Don't stop on error here, the remaining child devices still
> + * need to get removed.
> + */
> + if (ret) {
> + debug("%s: device_remove(%s) returned %d\n",
> + __func__, pos->name, ret);
> + }
> }
>
> return 0;
> --
> 2.12.2
>
Regards,
Simon
More information about the U-Boot
mailing list