mlxsw: thermal: Provide optimization for QSFP modules number detection
Use new field "num_of_modules" of MGPIR register for "thermal" interface in order to get the number of modules supported by system directly from the system configuration, instead of getting it from port to module mapping info. Signed-off-by: Vadim Pasternak <vadimp@mellanox.com> Acked-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ea30a92a46
commit
c5cb92d59b
@ -112,6 +112,7 @@ struct mlxsw_thermal {
|
||||
struct mlxsw_thermal_trip trips[MLXSW_THERMAL_NUM_TRIPS];
|
||||
enum thermal_device_mode mode;
|
||||
struct mlxsw_thermal_module *tz_module_arr;
|
||||
u8 tz_module_num;
|
||||
struct mlxsw_thermal_module *tz_gearbox_arr;
|
||||
u8 tz_gearbox_num;
|
||||
unsigned int tz_highest_score;
|
||||
@ -775,23 +776,10 @@ static void mlxsw_thermal_module_tz_fini(struct thermal_zone_device *tzdev)
|
||||
|
||||
static int
|
||||
mlxsw_thermal_module_init(struct device *dev, struct mlxsw_core *core,
|
||||
struct mlxsw_thermal *thermal, u8 local_port)
|
||||
struct mlxsw_thermal *thermal, u8 module)
|
||||
{
|
||||
struct mlxsw_thermal_module *module_tz;
|
||||
char pmlp_pl[MLXSW_REG_PMLP_LEN];
|
||||
u8 width, module;
|
||||
int err;
|
||||
|
||||
mlxsw_reg_pmlp_pack(pmlp_pl, local_port);
|
||||
err = mlxsw_reg_query(core, MLXSW_REG(pmlp), pmlp_pl);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
width = mlxsw_reg_pmlp_width_get(pmlp_pl);
|
||||
if (!width)
|
||||
return 0;
|
||||
|
||||
module = mlxsw_reg_pmlp_module_get(pmlp_pl, 0);
|
||||
module_tz = &thermal->tz_module_arr[module];
|
||||
/* Skip if parent is already set (case of port split). */
|
||||
if (module_tz->parent)
|
||||
@ -819,26 +807,34 @@ static int
|
||||
mlxsw_thermal_modules_init(struct device *dev, struct mlxsw_core *core,
|
||||
struct mlxsw_thermal *thermal)
|
||||
{
|
||||
unsigned int module_count = mlxsw_core_max_ports(core);
|
||||
struct mlxsw_thermal_module *module_tz;
|
||||
char mgpir_pl[MLXSW_REG_MGPIR_LEN];
|
||||
int i, err;
|
||||
|
||||
if (!mlxsw_core_res_query_enabled(core))
|
||||
return 0;
|
||||
|
||||
thermal->tz_module_arr = kcalloc(module_count,
|
||||
mlxsw_reg_mgpir_pack(mgpir_pl);
|
||||
err = mlxsw_reg_query(core, MLXSW_REG(mgpir), mgpir_pl);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
mlxsw_reg_mgpir_unpack(mgpir_pl, NULL, NULL, NULL,
|
||||
&thermal->tz_module_num);
|
||||
|
||||
thermal->tz_module_arr = kcalloc(thermal->tz_module_num,
|
||||
sizeof(*thermal->tz_module_arr),
|
||||
GFP_KERNEL);
|
||||
if (!thermal->tz_module_arr)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 1; i < module_count; i++) {
|
||||
for (i = 0; i < thermal->tz_module_num; i++) {
|
||||
err = mlxsw_thermal_module_init(dev, core, thermal, i);
|
||||
if (err)
|
||||
goto err_unreg_tz_module_arr;
|
||||
}
|
||||
|
||||
for (i = 0; i < module_count - 1; i++) {
|
||||
for (i = 0; i < thermal->tz_module_num; i++) {
|
||||
module_tz = &thermal->tz_module_arr[i];
|
||||
if (!module_tz->parent)
|
||||
continue;
|
||||
@ -850,7 +846,7 @@ mlxsw_thermal_modules_init(struct device *dev, struct mlxsw_core *core,
|
||||
return 0;
|
||||
|
||||
err_unreg_tz_module_arr:
|
||||
for (i = module_count - 1; i >= 0; i--)
|
||||
for (i = thermal->tz_module_num - 1; i >= 0; i--)
|
||||
mlxsw_thermal_module_fini(&thermal->tz_module_arr[i]);
|
||||
kfree(thermal->tz_module_arr);
|
||||
return err;
|
||||
@ -859,13 +855,12 @@ err_unreg_tz_module_arr:
|
||||
static void
|
||||
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--)
|
||||
for (i = thermal->tz_module_num - 1; i >= 0; i--)
|
||||
mlxsw_thermal_module_fini(&thermal->tz_module_arr[i]);
|
||||
kfree(thermal->tz_module_arr);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user