mlxsw: Invoke driver's init/fini methods only if defined
authorVadim Pasternak <vadimp@mellanox.com>
Wed, 16 Nov 2016 14:20:45 +0000 (15:20 +0100)
committerDavid S. Miller <davem@davemloft.net>
Thu, 17 Nov 2016 04:29:04 +0000 (23:29 -0500)
We are going to add a minimal driver on top of the mlxsw core
infrastructure, which will be mainly used for hardware monitoring in
Baseboard management controller (BMC) installations.

Unlike the switch drivers (e.g., spectrum, switchx2), this driver does not
initialize the ASIC and therefore doesn't need to implement the init() and
fini() methods in its 'mlxsw_driver' struct.

Signed-off-by: Vadim Pasternak <vadimp@mellanox.com>
Reviewed-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/core.c

index 4f7c478a595b2373d958e15be10669a16a38d31d..763752f1745ddf1a6838014be35966d7ad5beffd 100644 (file)
@@ -1162,9 +1162,11 @@ int mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info,
        if (err)
                goto err_hwmon_init;
 
-       err = mlxsw_driver->init(mlxsw_core, mlxsw_bus_info);
-       if (err)
-               goto err_driver_init;
+       if (mlxsw_driver->init) {
+               err = mlxsw_driver->init(mlxsw_core, mlxsw_bus_info);
+               if (err)
+                       goto err_driver_init;
+       }
 
        err = mlxsw_core_debugfs_init(mlxsw_core);
        if (err)
@@ -1173,7 +1175,8 @@ int mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info,
        return 0;
 
 err_debugfs_init:
-       mlxsw_core->driver->fini(mlxsw_core);
+       if (mlxsw_core->driver->fini)
+               mlxsw_core->driver->fini(mlxsw_core);
 err_driver_init:
 err_hwmon_init:
        devlink_unregister(devlink);
@@ -1199,7 +1202,8 @@ void mlxsw_core_bus_device_unregister(struct mlxsw_core *mlxsw_core)
        struct devlink *devlink = priv_to_devlink(mlxsw_core);
 
        mlxsw_core_debugfs_fini(mlxsw_core);
-       mlxsw_core->driver->fini(mlxsw_core);
+       if (mlxsw_core->driver->fini)
+               mlxsw_core->driver->fini(mlxsw_core);
        devlink_unregister(devlink);
        mlxsw_emad_fini(mlxsw_core);
        mlxsw_core->bus->fini(mlxsw_core->bus_priv);