aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKamal Heib <kamalh@mellanox.com>2016-12-06 10:32:45 -0500
committerDavid S. Miller <davem@davemloft.net>2016-12-06 11:44:44 -0500
commitf9c14e46748be9a2adafdb7d216f6cdeb435aadc (patch)
tree663db6816358ea5c2051e9594d287fea7997617e
parent9e5b2fc1d39b3122e2028849d0edc5df1d1a4761 (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.c5
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/main.c15
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h5
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
271enum {
272 MLX5_DRIVER_STATUS_ABORTED = 0xfe,
273 MLX5_DRIVER_SYND = 0xbadd00de,
274};
275
276static int mlx5_internal_err_ret_value(struct mlx5_core_dev *dev, u16 op, 271static 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
78enum {
79 MLX5_DRIVER_STATUS_ABORTED = 0xfe,
80 MLX5_DRIVER_SYND = 0xbadd00de,
81};
82
78int mlx5_query_hca_caps(struct mlx5_core_dev *dev); 83int mlx5_query_hca_caps(struct mlx5_core_dev *dev);
79int mlx5_query_board_id(struct mlx5_core_dev *dev); 84int mlx5_query_board_id(struct mlx5_core_dev *dev);
80int mlx5_cmd_init_hca(struct mlx5_core_dev *dev); 85int mlx5_cmd_init_hca(struct mlx5_core_dev *dev);