mlxsw: core: Set different thermal polling time based on bus frequency capability
authorVadim Pasternak <vadimp@mellanox.com>
Wed, 13 Feb 2019 11:28:48 +0000 (11:28 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 14 Feb 2019 06:33:02 +0000 (22:33 -0800)
Add low frequency bus capability in order to allow core functionality
separation based on bus type. Driver could run over PCIe, which is
considered as high frequency bus or I2C, which is considered as low
frequency bus. In the last case time setting, for example, for thermal
polling interval, should be increased.

Use different thermal monitoring based on bus type. For I2C bus time is
set to 20 seconds, while for PCIe 1 second polling interval is used.

Signed-off-by: Vadim Pasternak <vadimp@mellanox.com>
Reviewed-by: Jiri Pirko <jiri@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.h
drivers/net/ethernet/mellanox/mlxsw/core_thermal.c
drivers/net/ethernet/mellanox/mlxsw/i2c.c

index c8e16a3059690d6803c4a62647d72e856a41ca42..cd0c6aa0dff9e053f5190e8ccb4c270a387326ae 100644 (file)
@@ -344,6 +344,7 @@ struct mlxsw_bus_info {
        struct mlxsw_fw_rev fw_rev;
        u8 vsd[MLXSW_CMD_BOARDINFO_VSD_LEN];
        u8 psid[MLXSW_CMD_BOARDINFO_PSID_LEN];
+       u8 low_frequency;
 };
 
 struct mlxsw_hwmon;
index 61f897b40f82340a8741b89f9ff424f6e9d0012b..b1f9b459766c14365e9ecf22d38f92268249b458 100644 (file)
@@ -13,6 +13,7 @@
 #include "core.h"
 
 #define MLXSW_THERMAL_POLL_INT 1000    /* ms */
+#define MLXSW_THERMAL_SLOW_POLL_INT    20000   /* ms */
 #define MLXSW_THERMAL_MAX_TEMP 110000  /* 110C */
 #define MLXSW_THERMAL_MAX_STATE        10
 #define MLXSW_THERMAL_MAX_DUTY 255
@@ -76,6 +77,7 @@ struct mlxsw_thermal {
        struct mlxsw_core *core;
        const struct mlxsw_bus_info *bus_info;
        struct thermal_zone_device *tzdev;
+       int polling_delay;
        struct thermal_cooling_device *cdevs[MLXSW_MFCR_PWMS_MAX];
        u8 cooling_levels[MLXSW_THERMAL_MAX_STATE + 1];
        struct mlxsw_thermal_trip trips[MLXSW_THERMAL_NUM_TRIPS];
@@ -172,7 +174,7 @@ static int mlxsw_thermal_set_mode(struct thermal_zone_device *tzdev,
        mutex_lock(&tzdev->lock);
 
        if (mode == THERMAL_DEVICE_ENABLED)
-               tzdev->polling_delay = MLXSW_THERMAL_POLL_INT;
+               tzdev->polling_delay = thermal->polling_delay;
        else
                tzdev->polling_delay = 0;
 
@@ -423,13 +425,17 @@ int mlxsw_thermal_init(struct mlxsw_core *core,
                thermal->cooling_levels[i] = max(MLXSW_THERMAL_SPEED_MIN_LEVEL,
                                                 i);
 
+       thermal->polling_delay = bus_info->low_frequency ?
+                                MLXSW_THERMAL_SLOW_POLL_INT :
+                                MLXSW_THERMAL_POLL_INT;
+
        thermal->tzdev = thermal_zone_device_register("mlxsw",
                                                      MLXSW_THERMAL_NUM_TRIPS,
                                                      MLXSW_THERMAL_TRIP_MASK,
                                                      thermal,
                                                      &mlxsw_thermal_ops,
                                                      NULL, 0,
-                                                     MLXSW_THERMAL_POLL_INT);
+                                                     thermal->polling_delay);
        if (IS_ERR(thermal->tzdev)) {
                err = PTR_ERR(thermal->tzdev);
                dev_err(dev, "Failed to register thermal zone\n");
index 798bd5aca38470073d7b47f70942fc047c861f2b..a87ca6b6580d69a6f0fee0ab4295d0e5f2ccea60 100644 (file)
@@ -503,6 +503,7 @@ static int mlxsw_i2c_probe(struct i2c_client *client,
        mlxsw_i2c->bus_info.device_kind = id->name;
        mlxsw_i2c->bus_info.device_name = client->name;
        mlxsw_i2c->bus_info.dev = &client->dev;
+       mlxsw_i2c->bus_info.low_frequency = true;
        mlxsw_i2c->dev = &client->dev;
 
        err = mlxsw_core_bus_device_register(&mlxsw_i2c->bus_info,