mlxsw: core: Re-order initialization sequence
The driver core first registers with the hwmon and thermal subsystems and only then proceeds to initialize the switch driver (e.g., mlxsw_spectrum). It is only during the last stage that the current firmware version is validated and a newer one flashed, if necessary. The above means that if a new firmware feature is utilized by the hwmon/thermal code, the driver will not be able to load. Solve this by re-ordering initializing the switch driver before registering with the hwmon and thermal subsystems. Signed-off-by: Ido Schimmel <idosch@mellanox.com> Reported-by: Shalom Toledo <shalomt@mellanox.com> Acked-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
3029a693be
Коммит
961cf99a07
|
@ -1098,6 +1098,12 @@ __mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info,
|
||||||
goto err_register_params;
|
goto err_register_params;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mlxsw_driver->init) {
|
||||||
|
err = mlxsw_driver->init(mlxsw_core, mlxsw_bus_info);
|
||||||
|
if (err)
|
||||||
|
goto err_driver_init;
|
||||||
|
}
|
||||||
|
|
||||||
err = mlxsw_hwmon_init(mlxsw_core, mlxsw_bus_info, &mlxsw_core->hwmon);
|
err = mlxsw_hwmon_init(mlxsw_core, mlxsw_bus_info, &mlxsw_core->hwmon);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_hwmon_init;
|
goto err_hwmon_init;
|
||||||
|
@ -1107,22 +1113,17 @@ __mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info,
|
||||||
if (err)
|
if (err)
|
||||||
goto err_thermal_init;
|
goto err_thermal_init;
|
||||||
|
|
||||||
if (mlxsw_driver->init) {
|
|
||||||
err = mlxsw_driver->init(mlxsw_core, mlxsw_bus_info);
|
|
||||||
if (err)
|
|
||||||
goto err_driver_init;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mlxsw_driver->params_register && !reload)
|
if (mlxsw_driver->params_register && !reload)
|
||||||
devlink_params_publish(devlink);
|
devlink_params_publish(devlink);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_driver_init:
|
|
||||||
mlxsw_thermal_fini(mlxsw_core->thermal);
|
|
||||||
err_thermal_init:
|
err_thermal_init:
|
||||||
mlxsw_hwmon_fini(mlxsw_core->hwmon);
|
mlxsw_hwmon_fini(mlxsw_core->hwmon);
|
||||||
err_hwmon_init:
|
err_hwmon_init:
|
||||||
|
if (mlxsw_core->driver->fini)
|
||||||
|
mlxsw_core->driver->fini(mlxsw_core);
|
||||||
|
err_driver_init:
|
||||||
if (mlxsw_driver->params_unregister && !reload)
|
if (mlxsw_driver->params_unregister && !reload)
|
||||||
mlxsw_driver->params_unregister(mlxsw_core);
|
mlxsw_driver->params_unregister(mlxsw_core);
|
||||||
err_register_params:
|
err_register_params:
|
||||||
|
@ -1187,10 +1188,10 @@ void mlxsw_core_bus_device_unregister(struct mlxsw_core *mlxsw_core,
|
||||||
|
|
||||||
if (mlxsw_core->driver->params_unregister && !reload)
|
if (mlxsw_core->driver->params_unregister && !reload)
|
||||||
devlink_params_unpublish(devlink);
|
devlink_params_unpublish(devlink);
|
||||||
if (mlxsw_core->driver->fini)
|
|
||||||
mlxsw_core->driver->fini(mlxsw_core);
|
|
||||||
mlxsw_thermal_fini(mlxsw_core->thermal);
|
mlxsw_thermal_fini(mlxsw_core->thermal);
|
||||||
mlxsw_hwmon_fini(mlxsw_core->hwmon);
|
mlxsw_hwmon_fini(mlxsw_core->hwmon);
|
||||||
|
if (mlxsw_core->driver->fini)
|
||||||
|
mlxsw_core->driver->fini(mlxsw_core);
|
||||||
if (mlxsw_core->driver->params_unregister && !reload)
|
if (mlxsw_core->driver->params_unregister && !reload)
|
||||||
mlxsw_core->driver->params_unregister(mlxsw_core);
|
mlxsw_core->driver->params_unregister(mlxsw_core);
|
||||||
if (!reload)
|
if (!reload)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче