[PATCH v2 2/5] deep-probe: treat any probe deferral as permanent
Ahmad Fatoum
a.fatoum at pengutronix.de
Mon Feb 19 09:29:22 PST 2024
As the comment notes, "-EPROBE_DEFER should never appear on a deep-probe
machine so inform the user immediately.". Yet, we still add the device
to the deferred probe list to try it again later, which should only make
a difference if there's a bug with the deep probe mechanism itself.
Therefore, never use the deferred probe list on deep probe system and
directly report any probe deferral as permanent.
Signed-off-by: Ahmad Fatoum <a.fatoum at pengutronix.de>
---
v1 -> v2:
- new patch
---
drivers/base/driver.c | 33 +++++++++++++++++++--------------
1 file changed, 19 insertions(+), 14 deletions(-)
diff --git a/drivers/base/driver.c b/drivers/base/driver.c
index 4884e8fda8ef..bb9699ee3795 100644
--- a/drivers/base/driver.c
+++ b/drivers/base/driver.c
@@ -106,6 +106,15 @@ int get_free_deviceid(const char *name_template)
};
}
+static void dev_report_permanent_probe_deferral(struct device *dev)
+{
+ if (dev->deferred_probe_reason)
+ dev_err(dev, "probe permanently deferred (%s)\n",
+ dev->deferred_probe_reason);
+ else
+ dev_err(dev, "probe permanently deferred\n");
+}
+
int device_probe(struct device *dev)
{
static int depth = 0;
@@ -136,17 +145,18 @@ int device_probe(struct device *dev)
case 0:
return 0;
case -EPROBE_DEFER:
- list_move(&dev->active, &deferred);
-
/*
* -EPROBE_DEFER should never appear on a deep-probe machine so
* inform the user immediately.
*/
- if (deep_probe_is_supported())
- dev_err(dev, "probe deferred\n");
- else
- dev_dbg(dev, "probe deferred\n");
+ if (deep_probe_is_supported()) {
+ dev_report_permanent_probe_deferral(dev);
+ break;
+ }
+ list_move(&dev->active, &deferred);
+
+ dev_dbg(dev, "probe deferred\n");
return -EPROBE_DEFER;
case -ENODEV:
case -ENXIO:
@@ -155,7 +165,6 @@ int device_probe(struct device *dev)
default:
dev_err(dev, "probe failed: %pe\n", ERR_PTR(ret));
break;
-
}
list_del_init(&dev->active);
@@ -382,13 +391,9 @@ static int device_probe_deferred(void)
}
} while (success);
- list_for_each_entry(dev, &deferred, active) {
- if (dev->deferred_probe_reason)
- dev_err(dev, "probe permanently deferred (%s)\n",
- dev->deferred_probe_reason);
- else
- dev_err(dev, "probe permanently deferred\n");
- }
+ list_for_each_entry(dev, &deferred, active)
+ dev_report_permanent_probe_deferral(dev);
+
return 0;
}
late_initcall(device_probe_deferred);
--
2.39.2
More information about the barebox
mailing list