]> git.itanic.dy.fi Git - linux-stable/commitdiff
net/mlx5: Fix driver use of uninitialized timeout
authorShay Drory <shayd@nvidia.com>
Mon, 27 Jun 2022 13:05:31 +0000 (16:05 +0300)
committerSaeed Mahameed <saeedm@nvidia.com>
Thu, 28 Jul 2022 20:44:41 +0000 (13:44 -0700)
Currently, driver is setting default values to all timeouts during
function setup. The offending commit is using a timeout before
function setup, meaning: the timeout is 0 (or garbage), since no
value have been set.
This may result in failure to probe the driver:
mlx5_function_setup:1034:(pid 69850): Firmware over 4294967296 MS in pre-initializing state, aborting
probe_one:1591:(pid 69850): mlx5_init_one failed with error code -16

Hence, set default values to timeouts during tout_init()

Fixes: 37ca95e62ee2 ("net/mlx5: Increase FW pre-init timeout for health recovery")
Signed-off-by: Shay Drory <shayd@nvidia.com>
Reviewed-by: Moshe Shemesh <moshe@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/lib/tout.c
drivers/net/ethernet/mellanox/mlx5/core/lib/tout.h
drivers/net/ethernet/mellanox/mlx5/core/main.c

index d758848d34d0c87d576acc5f6993496ed2681287..696e45e2bd06d476348962227ee5af627ebc0271 100644 (file)
@@ -32,20 +32,17 @@ static void tout_set(struct mlx5_core_dev *dev, u64 val, enum mlx5_timeouts_type
        dev->timeouts->to[type] = val;
 }
 
-void mlx5_tout_set_def_val(struct mlx5_core_dev *dev)
+int mlx5_tout_init(struct mlx5_core_dev *dev)
 {
        int i;
 
-       for (i = 0; i < MAX_TIMEOUT_TYPES; i++)
-               tout_set(dev, tout_def_sw_val[i], i);
-}
-
-int mlx5_tout_init(struct mlx5_core_dev *dev)
-{
        dev->timeouts = kmalloc(sizeof(*dev->timeouts), GFP_KERNEL);
        if (!dev->timeouts)
                return -ENOMEM;
 
+       for (i = 0; i < MAX_TIMEOUT_TYPES; i++)
+               tout_set(dev, tout_def_sw_val[i], i);
+
        return 0;
 }
 
index 257c03eeab365972c6a9a0bb229b1f6f30d240e0..bc9e9aeda8478149f29cd8da1c9b311e37574d29 100644 (file)
@@ -35,7 +35,6 @@ int mlx5_tout_init(struct mlx5_core_dev *dev);
 void mlx5_tout_cleanup(struct mlx5_core_dev *dev);
 void mlx5_tout_query_iseg(struct mlx5_core_dev *dev);
 int mlx5_tout_query_dtor(struct mlx5_core_dev *dev);
-void mlx5_tout_set_def_val(struct mlx5_core_dev *dev);
 u64 _mlx5_tout_ms(struct mlx5_core_dev *dev, enum mlx5_timeouts_types type);
 
 #define mlx5_tout_ms(dev, type) _mlx5_tout_ms(dev, MLX5_TO_##type##_MS)
index 95f26624b57c9b66a6df289d90431fecdffe1863..ba2e5232b90bee774917ed555357bbd1cc7acde6 100644 (file)
@@ -1023,8 +1023,6 @@ static int mlx5_function_setup(struct mlx5_core_dev *dev, u64 timeout)
        if (mlx5_core_is_pf(dev))
                pcie_print_link_status(dev->pdev);
 
-       mlx5_tout_set_def_val(dev);
-
        /* wait for firmware to accept initialization segments configurations
         */
        err = wait_fw_init(dev, timeout,