kernel/os: Update device initialization condition
Function os_dev_init() is called in two places
First possibility is when device is created in
os_dev_create() AND g_os_started is not 0
This apply to devices that are created after main
function is called (including package defined syscfg
functions).
Other place that calls os_dev_init is os_dev_initialize_all()
This function calls all os_dev_init() functions for requested
stage. When os_dev_initalize_all() is called only devices
added by bsp (often delegated to mcu) are created.
Keep in mind that since g_os_started is not set yet condition is
not checked.
When mcuboot starts with sysinit() enabled it calls os_dev_initalize_all()
twice then executes sysinit(). Any device created in sysinit() will not
be initialized since g_os_started is not set.
This change stores device init stage number and uses it when devices are
initialized. For devices created by BSP initial stage is 0 so dev_init is
not called during device creation but postponed till os_dev_initialize_all()
is called (so despite condition change initialization sequence stays the same).
For devices created in sysinit() stage is already set to KERNEL and they are
initialized during creation even though g_os_started is not checked any more.
So there should not be any differences in behavior.
For MCUBoot, devices created in sysinit() will have dev_init called when created
just like it would happen when OS_SCHEDULING is enabled.
Only difference is that when device initialization fails at one stage but is not
marked as critical initialization will be attempted in next stage.
Signed-off-by: Jerzy Kasenberg <jerzy.kasenberg@codecoup.pl>
diff --git a/kernel/os/src/os_dev.c b/kernel/os/src/os_dev.c
index 2e1ea38..3260d63 100644
--- a/kernel/os/src/os_dev.c
+++ b/kernel/os/src/os_dev.c
@@ -22,6 +22,8 @@
static STAILQ_HEAD(, os_dev) g_os_dev_list;
+static uint8_t g_os_dev_init_stage;
+
static int
os_dev_init(struct os_dev *dev, const char *name, uint8_t stage,
uint8_t priority, os_dev_init_func_t od_init, void *arg)
@@ -126,7 +128,7 @@
goto err;
}
- if (g_os_started) {
+ if (g_os_dev_init_stage >= stage && (dev->od_flags & OS_DEV_F_STATUS_READY) == 0) {
rc = os_dev_initialize(dev);
}
err:
@@ -139,8 +141,9 @@
struct os_dev *dev;
int rc = 0;
+ g_os_dev_init_stage = stage;
STAILQ_FOREACH(dev, &g_os_dev_list, od_next) {
- if (dev->od_stage == stage) {
+ if ((dev->od_flags & OS_DEV_F_STATUS_READY) == 0 && dev->od_stage <= stage) {
rc = os_dev_initialize(dev);
if (rc) {
break;