[PATCH] dm: core: Check flags before removing devices
Simon Glass
sjg at chromium.org
Fri Feb 11 16:05:44 CET 2022
Hi Marek,
On Thu, 27 Jan 2022 at 20:41, Marek Vasut <marex at denx.de> wrote:
>
> Calling device_chld_remove() before flags_remove() means all devices
> get removed no matter whether they should be removed late or not. This
> breaks teardown of eMMC when booting and other critical boot paths.
>
> Fixes: c51d2e704a1 ("dm: core: Avoid partially removing devices")
> Signed-off-by: Marek Vasut <marex at denx.de>
> Cc: Simon Glass <sjg at chromium.org>
> ---
> drivers/core/device-remove.c | 16 ++++++++--------
> 1 file changed, 8 insertions(+), 8 deletions(-)
This means that the children do not get the remove signal if
-EPROBE_DEFER or -EKEYREJECTED are returned by the 'dev' device.
Also it fails several tests ('make qcheck').
>
> diff --git a/drivers/core/device-remove.c b/drivers/core/device-remove.c
> index e6ec6ff4212..0454f55c330 100644
> --- a/drivers/core/device-remove.c
> +++ b/drivers/core/device-remove.c
> @@ -207,14 +207,6 @@ int device_remove(struct udevice *dev, uint flags)
> if (!(dev_get_flags(dev) & DM_FLAG_ACTIVATED))
> return 0;
>
> - /*
> - * If the child returns EKEYREJECTED, continue. It just means that it
> - * didn't match the flags.
> - */
> - ret = device_chld_remove(dev, NULL, flags);
> - if (ret && ret != -EKEYREJECTED)
> - return ret;
> -
> /*
> * Remove the device if called with the "normal" remove flag set,
> * or if the remove flag matches any of the drivers remove flags
> @@ -228,6 +220,14 @@ int device_remove(struct udevice *dev, uint flags)
> return ret;
> }
>
> + /*
> + * If the child returns EKEYREJECTED, continue. It just means that it
> + * didn't match the flags.
> + */
> + ret = device_chld_remove(dev, NULL, flags);
> + if (ret && ret != -EKEYREJECTED)
> + return ret;
> +
> ret = uclass_pre_remove_device(dev);
> if (ret)
> return ret;
> --
> 2.34.1
>
Regards,
Simon
More information about the U-Boot
mailing list