diff options
author | Kamal Heib <kamalh@mellanox.com> | 2016-12-06 10:32:45 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-12-06 11:44:44 -0500 |
commit | f9c14e46748be9a2adafdb7d216f6cdeb435aadc (patch) | |
tree | 663db6816358ea5c2051e9594d287fea7997617e | |
parent | 9e5b2fc1d39b3122e2028849d0edc5df1d1a4761 (diff) |
net/mlx5: Fix query ISSI flow
In old FWs query ISSI command is not supported and for some of those FWs
it might fail with status other than "MLX5_CMD_STAT_BAD_OP_ERR".
In such case instead of failing the driver load, we will treat any FW
status other than 0 for Query ISSI FW command as ISSI not supported and
assume ISSI=0 (most basic driver/FW interface).
In case of driver syndrom (query ISSI failure by driver) we will fail
driver load.
Fixes: f62b8bb8f2d3 ('net/mlx5: Extend mlx5_core to support ConnectX-4
Ethernet functionality')
Signed-off-by: Kamal Heib <kamalh@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 5 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/main.c | 15 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h | 5 |
3 files changed, 14 insertions, 11 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c index 1e639f886021..bfe410e8a469 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c | |||
@@ -268,11 +268,6 @@ static void dump_buf(void *buf, int size, int data_only, int offset) | |||
268 | pr_debug("\n"); | 268 | pr_debug("\n"); |
269 | } | 269 | } |
270 | 270 | ||
271 | enum { | ||
272 | MLX5_DRIVER_STATUS_ABORTED = 0xfe, | ||
273 | MLX5_DRIVER_SYND = 0xbadd00de, | ||
274 | }; | ||
275 | |||
276 | static int mlx5_internal_err_ret_value(struct mlx5_core_dev *dev, u16 op, | 271 | static int mlx5_internal_err_ret_value(struct mlx5_core_dev *dev, u16 op, |
277 | u32 *synd, u8 *status) | 272 | u32 *synd, u8 *status) |
278 | { | 273 | { |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c index 22eb3be06651..ada24e103b02 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c | |||
@@ -732,13 +732,15 @@ static int mlx5_core_set_issi(struct mlx5_core_dev *dev) | |||
732 | u8 status; | 732 | u8 status; |
733 | 733 | ||
734 | mlx5_cmd_mbox_status(query_out, &status, &syndrome); | 734 | mlx5_cmd_mbox_status(query_out, &status, &syndrome); |
735 | if (status == MLX5_CMD_STAT_BAD_OP_ERR) { | 735 | if (!status || syndrome == MLX5_DRIVER_SYND) { |
736 | pr_debug("Only ISSI 0 is supported\n"); | 736 | mlx5_core_err(dev, "Failed to query ISSI err(%d) status(%d) synd(%d)\n", |
737 | return 0; | 737 | err, status, syndrome); |
738 | return err; | ||
738 | } | 739 | } |
739 | 740 | ||
740 | pr_err("failed to query ISSI err(%d)\n", err); | 741 | mlx5_core_warn(dev, "Query ISSI is not supported by FW, ISSI is 0\n"); |
741 | return err; | 742 | dev->issi = 0; |
743 | return 0; | ||
742 | } | 744 | } |
743 | 745 | ||
744 | sup_issi = MLX5_GET(query_issi_out, query_out, supported_issi_dw0); | 746 | sup_issi = MLX5_GET(query_issi_out, query_out, supported_issi_dw0); |
@@ -752,7 +754,8 @@ static int mlx5_core_set_issi(struct mlx5_core_dev *dev) | |||
752 | err = mlx5_cmd_exec(dev, set_in, sizeof(set_in), | 754 | err = mlx5_cmd_exec(dev, set_in, sizeof(set_in), |
753 | set_out, sizeof(set_out)); | 755 | set_out, sizeof(set_out)); |
754 | if (err) { | 756 | if (err) { |
755 | pr_err("failed to set ISSI=1 err(%d)\n", err); | 757 | mlx5_core_err(dev, "Failed to set ISSI to 1 err(%d)\n", |
758 | err); | ||
756 | return err; | 759 | return err; |
757 | } | 760 | } |
758 | 761 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h b/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h index 2ce03464e622..63b9a0dba885 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h | |||
@@ -75,6 +75,11 @@ enum { | |||
75 | MLX5_CMD_TIME, /* print command execution time */ | 75 | MLX5_CMD_TIME, /* print command execution time */ |
76 | }; | 76 | }; |
77 | 77 | ||
78 | enum { | ||
79 | MLX5_DRIVER_STATUS_ABORTED = 0xfe, | ||
80 | MLX5_DRIVER_SYND = 0xbadd00de, | ||
81 | }; | ||
82 | |||
78 | int mlx5_query_hca_caps(struct mlx5_core_dev *dev); | 83 | int mlx5_query_hca_caps(struct mlx5_core_dev *dev); |
79 | int mlx5_query_board_id(struct mlx5_core_dev *dev); | 84 | int mlx5_query_board_id(struct mlx5_core_dev *dev); |
80 | int mlx5_cmd_init_hca(struct mlx5_core_dev *dev); | 85 | int mlx5_cmd_init_hca(struct mlx5_core_dev *dev); |