lkml.org 
[lkml]   [2020]   [Jun]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.6 002/161] mlxsw: core: Use different get_trend() callbacks for different thermal zones
    Date
    From: Vadim Pasternak <vadimp@mellanox.com>

    [ Upstream commit 2dc2f760052da4925482ecdcdc5c94d4a599153c ]

    The driver registers three different types of thermal zones: For the
    ASIC itself, for port modules and for gearboxes.

    Currently, all three types use the same get_trend() callback which does
    not work correctly for the ASIC thermal zone. The callback assumes that
    the device data is of type 'struct mlxsw_thermal_module', whereas for
    the ASIC thermal zone 'struct mlxsw_thermal' is passed as device data.

    Fix this by using one get_trend() callback for the ASIC thermal zone and
    another for the other two types.

    Fixes: 6f73862fabd9 ("mlxsw: core: Add the hottest thermal zone detection")
    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>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/net/ethernet/mellanox/mlxsw/core_thermal.c | 23 +++++++++++++++++----
    1 file changed, 19 insertions(+), 4 deletions(-)

    --- a/drivers/net/ethernet/mellanox/mlxsw/core_thermal.c
    +++ b/drivers/net/ethernet/mellanox/mlxsw/core_thermal.c
    @@ -391,8 +391,7 @@ static int mlxsw_thermal_set_trip_hyst(s
    static int mlxsw_thermal_trend_get(struct thermal_zone_device *tzdev,
    int trip, enum thermal_trend *trend)
    {
    - struct mlxsw_thermal_module *tz = tzdev->devdata;
    - struct mlxsw_thermal *thermal = tz->parent;
    + struct mlxsw_thermal *thermal = tzdev->devdata;

    if (trip < 0 || trip >= MLXSW_THERMAL_NUM_TRIPS)
    return -EINVAL;
    @@ -593,6 +592,22 @@ mlxsw_thermal_module_trip_hyst_set(struc
    return 0;
    }

    +static int mlxsw_thermal_module_trend_get(struct thermal_zone_device *tzdev,
    + int trip, enum thermal_trend *trend)
    +{
    + struct mlxsw_thermal_module *tz = tzdev->devdata;
    + struct mlxsw_thermal *thermal = tz->parent;
    +
    + if (trip < 0 || trip >= MLXSW_THERMAL_NUM_TRIPS)
    + return -EINVAL;
    +
    + if (tzdev == thermal->tz_highest_dev)
    + return 1;
    +
    + *trend = THERMAL_TREND_STABLE;
    + return 0;
    +}
    +
    static struct thermal_zone_device_ops mlxsw_thermal_module_ops = {
    .bind = mlxsw_thermal_module_bind,
    .unbind = mlxsw_thermal_module_unbind,
    @@ -604,7 +619,7 @@ static struct thermal_zone_device_ops ml
    .set_trip_temp = mlxsw_thermal_module_trip_temp_set,
    .get_trip_hyst = mlxsw_thermal_module_trip_hyst_get,
    .set_trip_hyst = mlxsw_thermal_module_trip_hyst_set,
    - .get_trend = mlxsw_thermal_trend_get,
    + .get_trend = mlxsw_thermal_module_trend_get,
    };

    static int mlxsw_thermal_gearbox_temp_get(struct thermal_zone_device *tzdev,
    @@ -643,7 +658,7 @@ static struct thermal_zone_device_ops ml
    .set_trip_temp = mlxsw_thermal_module_trip_temp_set,
    .get_trip_hyst = mlxsw_thermal_module_trip_hyst_get,
    .set_trip_hyst = mlxsw_thermal_module_trip_hyst_set,
    - .get_trend = mlxsw_thermal_trend_get,
    + .get_trend = mlxsw_thermal_module_trend_get,
    };

    static int mlxsw_thermal_get_max_state(struct thermal_cooling_device *cdev,

    \
     
     \ /
      Last update: 2022-09-17 16:07    [W:4.473 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site