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