mlxsw: minimal: Move ports allocation to separate routine
authorVadim Pasternak <vadimp@nvidia.com>
Sun, 21 Aug 2022 16:20:16 +0000 (18:20 +0200)
committerJakub Kicinski <kuba@kernel.org>
Wed, 24 Aug 2022 00:22:00 +0000 (17:22 -0700)
Perform ports allocation in a separate routine.
Motivation is to re-use this routine for ports found on line cards.

Signed-off-by: Vadim Pasternak <vadimp@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: Petr Machata <petrm@nvidia.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlxsw/minimal.c

index ecb9f7b..f8dee11 100644 (file)
@@ -335,12 +335,10 @@ mlxsw_m_port_module_unmap(struct mlxsw_m *mlxsw_m, u8 slot_index, u8 module)
        mlxsw_env_module_port_unmap(mlxsw_m->core, slot_index, module);
 }
 
-static int mlxsw_m_ports_create(struct mlxsw_m *mlxsw_m)
+static int mlxsw_m_linecards_init(struct mlxsw_m *mlxsw_m)
 {
        unsigned int max_ports = mlxsw_core_max_ports(mlxsw_m->core);
-       u8 last_module = max_ports;
-       int i;
-       int err;
+       int i, err;
 
        mlxsw_m->ports = kcalloc(max_ports, sizeof(*mlxsw_m->ports),
                                 GFP_KERNEL);
@@ -358,6 +356,26 @@ static int mlxsw_m_ports_create(struct mlxsw_m *mlxsw_m)
        for (i = 0; i < max_ports; i++)
                mlxsw_m->module_to_port[i] = -1;
 
+       return 0;
+
+err_module_to_port_alloc:
+       kfree(mlxsw_m->ports);
+       return err;
+}
+
+static void mlxsw_m_linecards_fini(struct mlxsw_m *mlxsw_m)
+{
+       kfree(mlxsw_m->module_to_port);
+       kfree(mlxsw_m->ports);
+}
+
+static int mlxsw_m_ports_create(struct mlxsw_m *mlxsw_m)
+{
+       unsigned int max_ports = mlxsw_core_max_ports(mlxsw_m->core);
+       u8 last_module = max_ports;
+       int i;
+       int err;
+
        /* Fill out module to local port mapping array */
        for (i = 1; i < max_ports; i++) {
                err = mlxsw_m_port_module_map(mlxsw_m, i, &last_module);
@@ -388,9 +406,6 @@ err_module_to_port_create:
 err_module_to_port_map:
        for (i--; i > 0; i--)
                mlxsw_m_port_module_unmap(mlxsw_m, 0, i);
-       kfree(mlxsw_m->module_to_port);
-err_module_to_port_alloc:
-       kfree(mlxsw_m->ports);
        return err;
 }
 
@@ -448,13 +463,23 @@ static int mlxsw_m_init(struct mlxsw_core *mlxsw_core,
                return err;
        }
 
+       err = mlxsw_m_linecards_init(mlxsw_m);
+       if (err) {
+               dev_err(mlxsw_m->bus_info->dev, "Failed to create line cards\n");
+               return err;
+       }
+
        err = mlxsw_m_ports_create(mlxsw_m);
        if (err) {
                dev_err(mlxsw_m->bus_info->dev, "Failed to create ports\n");
-               return err;
+               goto err_ports_create;
        }
 
        return 0;
+
+err_ports_create:
+       mlxsw_m_linecards_fini(mlxsw_m);
+       return err;
 }
 
 static void mlxsw_m_fini(struct mlxsw_core *mlxsw_core)
@@ -462,6 +487,7 @@ static void mlxsw_m_fini(struct mlxsw_core *mlxsw_core)
        struct mlxsw_m *mlxsw_m = mlxsw_core_driver_priv(mlxsw_core);
 
        mlxsw_m_ports_remove(mlxsw_m);
+       mlxsw_m_linecards_fini(mlxsw_m);
 }
 
 static const struct mlxsw_config_profile mlxsw_m_config_profile;