OSDN Git Service

mlxsw: Ignore ports that are connected to eXtended mezanine
authorJiri Pirko <jiri@nvidia.com>
Mon, 14 Dec 2020 11:30:31 +0000 (13:30 +0200)
committerJakub Kicinski <kuba@kernel.org>
Tue, 15 Dec 2020 03:09:54 +0000 (19:09 -0800)
Use the info stored in the bus_info struct about the eXtended mezanine
connected ports and don't expose them.

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlxsw/core.c
drivers/net/ethernet/mellanox/mlxsw/core.h
drivers/net/ethernet/mellanox/mlxsw/minimal.c
drivers/net/ethernet/mellanox/mlxsw/spectrum.c

index c67825a..685037e 100644 (file)
@@ -2856,6 +2856,18 @@ mlxsw_core_port_devlink_port_get(struct mlxsw_core *mlxsw_core,
 }
 EXPORT_SYMBOL(mlxsw_core_port_devlink_port_get);
 
+bool mlxsw_core_port_is_xm(const struct mlxsw_core *mlxsw_core, u8 local_port)
+{
+       const struct mlxsw_bus_info *bus_info = mlxsw_core->bus_info;
+       int i;
+
+       for (i = 0; i < bus_info->xm_local_ports_count; i++)
+               if (bus_info->xm_local_ports[i] == local_port)
+                       return true;
+       return false;
+}
+EXPORT_SYMBOL(mlxsw_core_port_is_xm);
+
 struct mlxsw_env *mlxsw_core_env(const struct mlxsw_core *mlxsw_core)
 {
        return mlxsw_core->env;
index ec424d3..6558f9c 100644 (file)
@@ -223,6 +223,7 @@ enum devlink_port_type mlxsw_core_port_type_get(struct mlxsw_core *mlxsw_core,
 struct devlink_port *
 mlxsw_core_port_devlink_port_get(struct mlxsw_core *mlxsw_core,
                                 u8 local_port);
+bool mlxsw_core_port_is_xm(const struct mlxsw_core *mlxsw_core, u8 local_port);
 struct mlxsw_env *mlxsw_core_env(const struct mlxsw_core *mlxsw_core);
 bool mlxsw_core_is_initialized(const struct mlxsw_core *mlxsw_core);
 int mlxsw_core_module_max_width(struct mlxsw_core *mlxsw_core, u8 module);
index c010db2..b34c447 100644 (file)
@@ -291,7 +291,8 @@ static int mlxsw_m_ports_create(struct mlxsw_m *mlxsw_m)
 
        /* Create port objects for each valid entry */
        for (i = 0; i < mlxsw_m->max_ports; i++) {
-               if (mlxsw_m->module_to_port[i] > 0) {
+               if (mlxsw_m->module_to_port[i] > 0 &&
+                   !mlxsw_core_port_is_xm(mlxsw_m->core, i)) {
                        err = mlxsw_m_port_create(mlxsw_m,
                                                  mlxsw_m->module_to_port[i],
                                                  i);
index df8175c..516d6cb 100644 (file)
@@ -1840,6 +1840,9 @@ static int mlxsw_sp_port_module_info_init(struct mlxsw_sp *mlxsw_sp)
                return -ENOMEM;
 
        for (i = 1; i < max_ports; i++) {
+               if (mlxsw_core_port_is_xm(mlxsw_sp->core, i))
+                       continue;
+
                err = mlxsw_sp_port_module_info_get(mlxsw_sp, i, &port_mapping);
                if (err)
                        goto err_port_module_info_get;