net/mlx5: Fix query ISSI flow
authorKamal Heib <kamalh@mellanox.com>
Tue, 6 Dec 2016 15:32:45 +0000 (17:32 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 6 Dec 2016 16:44:44 +0000 (11:44 -0500)
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>
drivers/net/ethernet/mellanox/mlx5/core/cmd.c
drivers/net/ethernet/mellanox/mlx5/core/main.c
drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h

index 1e639f88602165fcb4f4454cf6a54148372e3235..bfe410e8a469ee06152f36d63cbb68e8656a861d 100644 (file)
@@ -268,11 +268,6 @@ static void dump_buf(void *buf, int size, int data_only, int offset)
                pr_debug("\n");
 }
 
-enum {
-       MLX5_DRIVER_STATUS_ABORTED = 0xfe,
-       MLX5_DRIVER_SYND = 0xbadd00de,
-};
-
 static int mlx5_internal_err_ret_value(struct mlx5_core_dev *dev, u16 op,
                                       u32 *synd, u8 *status)
 {
index 22eb3be0665172ce7ad7520b7cb813e8bff17bd7..ada24e103b02ac927362b0aba5050c251a0e644b 100644 (file)
@@ -732,13 +732,15 @@ static int mlx5_core_set_issi(struct mlx5_core_dev *dev)
                u8 status;
 
                mlx5_cmd_mbox_status(query_out, &status, &syndrome);
-               if (status == MLX5_CMD_STAT_BAD_OP_ERR) {
-                       pr_debug("Only ISSI 0 is supported\n");
-                       return 0;
+               if (!status || syndrome == MLX5_DRIVER_SYND) {
+                       mlx5_core_err(dev, "Failed to query ISSI err(%d) status(%d) synd(%d)\n",
+                                     err, status, syndrome);
+                       return err;
                }
 
-               pr_err("failed to query ISSI err(%d)\n", err);
-               return err;
+               mlx5_core_warn(dev, "Query ISSI is not supported by FW, ISSI is 0\n");
+               dev->issi = 0;
+               return 0;
        }
 
        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)
                err = mlx5_cmd_exec(dev, set_in, sizeof(set_in),
                                    set_out, sizeof(set_out));
                if (err) {
-                       pr_err("failed to set ISSI=1 err(%d)\n", err);
+                       mlx5_core_err(dev, "Failed to set ISSI to 1 err(%d)\n",
+                                     err);
                        return err;
                }
 
index 2ce03464e62281fdb4624134adc967a45006531f..63b9a0dba88555510300d68e26918465cadbf8f6 100644 (file)
@@ -75,6 +75,11 @@ enum {
        MLX5_CMD_TIME, /* print command execution time */
 };
 
+enum {
+       MLX5_DRIVER_STATUS_ABORTED = 0xfe,
+       MLX5_DRIVER_SYND = 0xbadd00de,
+};
+
 int mlx5_query_hca_caps(struct mlx5_core_dev *dev);
 int mlx5_query_board_id(struct mlx5_core_dev *dev);
 int mlx5_cmd_init_hca(struct mlx5_core_dev *dev);