]> git.dujemihanovic.xyz Git - linux.git/commitdiff
mlxsw: core: Prevent QSFP module initialization for old hardware
authorVadim Pasternak <vadimp@mellanox.com>
Sat, 18 May 2019 15:58:28 +0000 (18:58 +0300)
committerDavid S. Miller <davem@davemloft.net>
Sat, 18 May 2019 20:13:40 +0000 (13:13 -0700)
Old Mellanox silicons, like switchx-2, switch-ib do not support reading
QSFP modules temperature through MTMP register. Attempt to access this
register on systems equipped with the this kind of silicon will cause
initialization flow failure.
Test for hardware resource capability is added in order to distinct
between old and new silicon - old silicons do not have such capability.

Fixes: 6a79507cfe94 ("mlxsw: core: Extend thermal module with per QSFP module thermal zones")
Fixes: 5c42eaa07bd0 ("mlxsw: core: Extend hwmon interface with QSFP module temperature attributes")
Reported-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Vadim Pasternak <vadimp@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/core.c
drivers/net/ethernet/mellanox/mlxsw/core.h
drivers/net/ethernet/mellanox/mlxsw/core_hwmon.c
drivers/net/ethernet/mellanox/mlxsw/core_thermal.c

index bcbe07ec22be07e72c5d407f83483d7226fc338f..6ee6de7f01607473869b81d029cfdbe4c1451635 100644 (file)
@@ -122,6 +122,12 @@ void *mlxsw_core_driver_priv(struct mlxsw_core *mlxsw_core)
 }
 EXPORT_SYMBOL(mlxsw_core_driver_priv);
 
+bool mlxsw_core_res_query_enabled(const struct mlxsw_core *mlxsw_core)
+{
+       return mlxsw_core->driver->res_query_enabled;
+}
+EXPORT_SYMBOL(mlxsw_core_res_query_enabled);
+
 struct mlxsw_rx_listener_item {
        struct list_head list;
        struct mlxsw_rx_listener rxl;
index 917be621c9043d44f6e282b858b000b3996686b3..e3832cb5bdda72d1168307acfa6463dc2f5b5d6c 100644 (file)
@@ -28,6 +28,8 @@ unsigned int mlxsw_core_max_ports(const struct mlxsw_core *mlxsw_core);
 
 void *mlxsw_core_driver_priv(struct mlxsw_core *mlxsw_core);
 
+bool mlxsw_core_res_query_enabled(const struct mlxsw_core *mlxsw_core);
+
 int mlxsw_core_driver_register(struct mlxsw_driver *mlxsw_driver);
 void mlxsw_core_driver_unregister(struct mlxsw_driver *mlxsw_driver);
 
index 6956bbebe2f1e7ff304a0be08c56f9ab63f86741..496dc904c5ed897b03e95c02c06c5075d736d121 100644 (file)
@@ -518,6 +518,9 @@ static int mlxsw_hwmon_module_init(struct mlxsw_hwmon *mlxsw_hwmon)
        u8 width;
        int err;
 
+       if (!mlxsw_core_res_query_enabled(mlxsw_hwmon->core))
+               return 0;
+
        /* Add extra attributes for module temperature. Sensor index is
         * assigned to sensor_count value, while all indexed before
         * sensor_count are already utilized by the sensors connected through
index 472f63f9fac50992d9f96ccbfa4ad3cd1f174381..d3e851e7ca722feb15f9095d121bf3a087355ad0 100644 (file)
@@ -740,6 +740,9 @@ mlxsw_thermal_modules_init(struct device *dev, struct mlxsw_core *core,
        struct mlxsw_thermal_module *module_tz;
        int i, err;
 
+       if (!mlxsw_core_res_query_enabled(core))
+               return 0;
+
        thermal->tz_module_arr = kcalloc(module_count,
                                         sizeof(*thermal->tz_module_arr),
                                         GFP_KERNEL);
@@ -776,6 +779,9 @@ mlxsw_thermal_modules_fini(struct mlxsw_thermal *thermal)
        unsigned int module_count = mlxsw_core_max_ports(thermal->core);
        int i;
 
+       if (!mlxsw_core_res_query_enabled(thermal->core))
+               return;
+
        for (i = module_count - 1; i >= 0; i--)
                mlxsw_thermal_module_fini(&thermal->tz_module_arr[i]);
        kfree(thermal->tz_module_arr);