diff options
| author | Shay Drory <shayd@nvidia.com> | 2022-06-27 16:05:31 +0300 | 
|---|---|---|
| committer | Saeed Mahameed <saeedm@nvidia.com> | 2022-07-28 13:44:41 -0700 | 
| commit | 42b4f7f66a43cdb9216e76e595c8a9af154806da (patch) | |
| tree | d1d5f091a9864d6cc4b61240870cda454562c59f | |
| parent | 62d2664351ef37da34f6f3a3fd8ab34257d6fe30 (diff) | |
net/mlx5: Fix driver use of uninitialized timeout
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>
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/lib/tout.c | 11 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/lib/tout.h | 1 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/main.c | 2 | 
3 files changed, 4 insertions, 10 deletions
| diff --git a/drivers/net/ethernet/mellanox/mlx5/core/lib/tout.c b/drivers/net/ethernet/mellanox/mlx5/core/lib/tout.c index d758848d34d0..696e45e2bd06 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/lib/tout.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/lib/tout.c @@ -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;  } diff --git a/drivers/net/ethernet/mellanox/mlx5/core/lib/tout.h b/drivers/net/ethernet/mellanox/mlx5/core/lib/tout.h index 257c03eeab36..bc9e9aeda847 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/lib/tout.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/lib/tout.h @@ -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) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c index 95f26624b57c..ba2e5232b90b 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c @@ -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, | 
