mlxsw: core: Zero payload buffers for couple of registers
authorElad Raz <eladr@mellanox.com>
Fri, 28 Oct 2016 19:35:46 +0000 (21:35 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sun, 30 Oct 2016 20:50:17 +0000 (16:50 -0400)
We recently discovered a bug in the firmware in which a field's length in
one of the registers was incorrectly set. This caused the firmware to
access garbage data that wasn't initialized by the driver and therefore
emit error messages.

While the bug is already fixed and the driver usually zeros the buffers
passed to the firmware, there are a handful of cases where this isn't
done. Zero the buffer in these cases and prevent similar bugs from
recurring, as they tend to be hard to debug.

Fixes: 52581961d83d ("mlxsw: core: Implement fan control using hwmon")
Signed-off-by: Elad Raz <eladr@mellanox.com>
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
Reviewed-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/core_hwmon.c
drivers/net/ethernet/mellanox/mlxsw/spectrum.c
drivers/net/ethernet/mellanox/mlxsw/switchx2.c

index 1ac8bf187168be0ad2ce41f10a0793078481fda8..ab710e37af99dcbaf514fc0b0433b55e7353c597 100644 (file)
@@ -262,7 +262,7 @@ static void mlxsw_hwmon_attr_add(struct mlxsw_hwmon *mlxsw_hwmon,
 
 static int mlxsw_hwmon_temp_init(struct mlxsw_hwmon *mlxsw_hwmon)
 {
-       char mtcap_pl[MLXSW_REG_MTCAP_LEN];
+       char mtcap_pl[MLXSW_REG_MTCAP_LEN] = {0};
        char mtmp_pl[MLXSW_REG_MTMP_LEN];
        u8 sensor_count;
        int i;
@@ -295,7 +295,7 @@ static int mlxsw_hwmon_temp_init(struct mlxsw_hwmon *mlxsw_hwmon)
 
 static int mlxsw_hwmon_fans_init(struct mlxsw_hwmon *mlxsw_hwmon)
 {
-       char mfcr_pl[MLXSW_REG_MFCR_LEN];
+       char mfcr_pl[MLXSW_REG_MFCR_LEN] = {0};
        enum mlxsw_reg_mfcr_pwm_frequency freq;
        unsigned int type_index;
        unsigned int num;
index d652f7f030cbc56cd857bc72438a8de973f714e8..2573faaffea8d67a203a4ddec3837082ff837c52 100644 (file)
@@ -158,7 +158,7 @@ static void mlxsw_sp_txhdr_construct(struct sk_buff *skb,
 
 static int mlxsw_sp_base_mac_get(struct mlxsw_sp *mlxsw_sp)
 {
-       char spad_pl[MLXSW_REG_SPAD_LEN];
+       char spad_pl[MLXSW_REG_SPAD_LEN] = {0};
        int err;
 
        err = mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(spad), spad_pl);
index 8c8f5d8a211352c939b74682887c71777954ecd1..8d11e5447067887ad1119017efca1fd8f6c4d5d6 100644 (file)
@@ -890,7 +890,7 @@ static const struct switchdev_ops mlxsw_sx_port_switchdev_ops = {
 
 static int mlxsw_sx_hw_id_get(struct mlxsw_sx *mlxsw_sx)
 {
-       char spad_pl[MLXSW_REG_SPAD_LEN];
+       char spad_pl[MLXSW_REG_SPAD_LEN] = {0};
        int err;
 
        err = mlxsw_reg_query(mlxsw_sx->core, MLXSW_REG(spad), spad_pl);