Hi Marek, On Thu, 27 Jan 2022 at 20:41, Marek Vasut <ma...@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 <ma...@denx.de> > Cc: Simon Glass <s...@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