mlxsw: core: Initialize switch driver last
authorIdo Schimmel <idosch@nvidia.com>
Wed, 15 Sep 2021 10:13:05 +0000 (13:13 +0300)
committerDavid S. Miller <davem@davemloft.net>
Wed, 15 Sep 2021 15:17:15 +0000 (16:17 +0100)
Commit 961cf99a074f ("mlxsw: core: Re-order initialization sequence")
changed the initialization sequence so that the switch driver (e.g.,
mlxsw_spectrum) is initialized before registration with the hwmon and
thermal subsystems.

This was done in order to avoid situations where hwmon/thermal code uses
features not supported by current firmware version, which is only
validated as part of switch driver initialization.

Later, commit b79cb787ac70 ("mlxsw: Move fw flashing code into core.c")
moved firmware validation and flashing code from the switch driver to
mlxsw_core so that it is performed before driver initialization.

Therefore, change the initialization sequence back to its original form.

In addition to being more straightforward, it will allow us to simplify
parts of the code in subsequent patches and future patchsets.

Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/core.c

index 98420db..4480374 100644 (file)
@@ -1995,12 +1995,6 @@ __mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info,
        if (err)
                goto err_health_init;
 
-       if (mlxsw_driver->init) {
-               err = mlxsw_driver->init(mlxsw_core, mlxsw_bus_info, extack);
-               if (err)
-                       goto err_driver_init;
-       }
-
        err = mlxsw_hwmon_init(mlxsw_core, mlxsw_bus_info, &mlxsw_core->hwmon);
        if (err)
                goto err_hwmon_init;
@@ -2014,6 +2008,12 @@ __mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info,
        if (err)
                goto err_env_init;
 
+       if (mlxsw_driver->init) {
+               err = mlxsw_driver->init(mlxsw_core, mlxsw_bus_info, extack);
+               if (err)
+                       goto err_driver_init;
+       }
+
        mlxsw_core->is_initialized = true;
        devlink_params_publish(devlink);
 
@@ -2022,14 +2022,13 @@ __mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info,
 
        return 0;
 
+err_driver_init:
+       mlxsw_env_fini(mlxsw_core->env);
 err_env_init:
        mlxsw_thermal_fini(mlxsw_core->thermal);
 err_thermal_init:
        mlxsw_hwmon_fini(mlxsw_core->hwmon);
 err_hwmon_init:
-       if (mlxsw_core->driver->fini)
-               mlxsw_core->driver->fini(mlxsw_core);
-err_driver_init:
        mlxsw_core_health_fini(mlxsw_core);
 err_health_init:
 err_fw_rev_validate:
@@ -2101,11 +2100,11 @@ void mlxsw_core_bus_device_unregister(struct mlxsw_core *mlxsw_core,
 
        devlink_params_unpublish(devlink);
        mlxsw_core->is_initialized = false;
+       if (mlxsw_core->driver->fini)
+               mlxsw_core->driver->fini(mlxsw_core);
        mlxsw_env_fini(mlxsw_core->env);
        mlxsw_thermal_fini(mlxsw_core->thermal);
        mlxsw_hwmon_fini(mlxsw_core->hwmon);
-       if (mlxsw_core->driver->fini)
-               mlxsw_core->driver->fini(mlxsw_core);
        mlxsw_core_health_fini(mlxsw_core);
        if (!reload)
                mlxsw_core_params_unregister(mlxsw_core);