Commit d0d01250 authored by Jack Morgenstein's avatar Jack Morgenstein Committed by David S. Miller

net/mlx4_core: Fix error flow in mlx4_init_hca()

We shouldn't call UNMAP_FA here, this is done in mlx4_load_one.

If mlx4_query_func fails, we need to invoke CLOSE_HCA for both
native and master.

Fixes: a0eacca9 ('net/mlx4_core: Refactor mlx4_load_one')
Signed-off-by: default avatarJack Morgenstein <jackm@dev.mellanox.co.il>
Signed-off-by: default avatarOr Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a51e0df4
...@@ -1829,7 +1829,7 @@ static int mlx4_init_hca(struct mlx4_dev *dev) ...@@ -1829,7 +1829,7 @@ static int mlx4_init_hca(struct mlx4_dev *dev)
err = mlx4_dev_cap(dev, &dev_cap); err = mlx4_dev_cap(dev, &dev_cap);
if (err) { if (err) {
mlx4_err(dev, "QUERY_DEV_CAP command failed, aborting\n"); mlx4_err(dev, "QUERY_DEV_CAP command failed, aborting\n");
goto err_stop_fw; return err;
} }
choose_steering_mode(dev, &dev_cap); choose_steering_mode(dev, &dev_cap);
...@@ -1860,7 +1860,7 @@ static int mlx4_init_hca(struct mlx4_dev *dev) ...@@ -1860,7 +1860,7 @@ static int mlx4_init_hca(struct mlx4_dev *dev)
&init_hca); &init_hca);
if ((long long) icm_size < 0) { if ((long long) icm_size < 0) {
err = icm_size; err = icm_size;
goto err_stop_fw; return err;
} }
dev->caps.max_fmr_maps = (1 << (32 - ilog2(dev->caps.num_mpts))) - 1; dev->caps.max_fmr_maps = (1 << (32 - ilog2(dev->caps.num_mpts))) - 1;
...@@ -1874,7 +1874,7 @@ static int mlx4_init_hca(struct mlx4_dev *dev) ...@@ -1874,7 +1874,7 @@ static int mlx4_init_hca(struct mlx4_dev *dev)
err = mlx4_init_icm(dev, &dev_cap, &init_hca, icm_size); err = mlx4_init_icm(dev, &dev_cap, &init_hca, icm_size);
if (err) if (err)
goto err_stop_fw; return err;
err = mlx4_INIT_HCA(dev, &init_hca); err = mlx4_INIT_HCA(dev, &init_hca);
if (err) { if (err) {
...@@ -1886,7 +1886,7 @@ static int mlx4_init_hca(struct mlx4_dev *dev) ...@@ -1886,7 +1886,7 @@ static int mlx4_init_hca(struct mlx4_dev *dev)
err = mlx4_query_func(dev, &dev_cap); err = mlx4_query_func(dev, &dev_cap);
if (err < 0) { if (err < 0) {
mlx4_err(dev, "QUERY_FUNC command failed, aborting.\n"); mlx4_err(dev, "QUERY_FUNC command failed, aborting.\n");
goto err_stop_fw; goto err_close;
} else if (err & MLX4_QUERY_FUNC_NUM_SYS_EQS) { } else if (err & MLX4_QUERY_FUNC_NUM_SYS_EQS) {
dev->caps.num_eqs = dev_cap.max_eqs; dev->caps.num_eqs = dev_cap.max_eqs;
dev->caps.reserved_eqs = dev_cap.reserved_eqs; dev->caps.reserved_eqs = dev_cap.reserved_eqs;
...@@ -2006,11 +2006,6 @@ static int mlx4_init_hca(struct mlx4_dev *dev) ...@@ -2006,11 +2006,6 @@ static int mlx4_init_hca(struct mlx4_dev *dev)
if (!mlx4_is_slave(dev)) if (!mlx4_is_slave(dev))
mlx4_free_icms(dev); mlx4_free_icms(dev);
err_stop_fw:
if (!mlx4_is_slave(dev)) {
mlx4_UNMAP_FA(dev);
mlx4_free_icm(dev, priv->fw.fw_icm, 0);
}
return err; return err;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment