net/mlx4_core: Enable single ported IB VFs
authorOr Gerlitz <ogerlitz@mellanox.com>
Thu, 21 May 2015 12:14:10 +0000 (15:14 +0300)
committerDavid S. Miller <davem@davemloft.net>
Mon, 25 May 2015 03:05:10 +0000 (23:05 -0400)
Remove the limitation that disallows configuring single ported VFs
in the presence of IB ports, after addressing the issues that
prevented that to work.

SMI (QP0) requests/responses are still not supported for single
ported IB VFs.

Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlx4/cmd.c
drivers/net/ethernet/mellanox/mlx4/main.c

index 153fb15769a8635d3fbfec1b15358689225ab574..77610452358b0cc0ee17b792037850ceacaffa98 100644 (file)
@@ -3194,6 +3194,12 @@ int mlx4_vf_set_enable_smi_admin(struct mlx4_dev *dev, int slave, int port,
                                 int enabled)
 {
        struct mlx4_priv *priv = mlx4_priv(dev);
+       struct mlx4_active_ports actv_ports = mlx4_get_active_ports(
+                       &priv->dev, slave);
+       int min_port = find_first_bit(actv_ports.ports,
+                                     priv->dev.caps.num_ports) + 1;
+       int max_port = min_port - 1 +
+               bitmap_weight(actv_ports.ports, priv->dev.caps.num_ports);
 
        if (slave == mlx4_master_func_num(dev))
                return 0;
@@ -3203,6 +3209,11 @@ int mlx4_vf_set_enable_smi_admin(struct mlx4_dev *dev, int slave, int port,
            enabled < 0 || enabled > 1)
                return -EINVAL;
 
+       if (min_port == max_port && dev->caps.num_ports > 1) {
+               mlx4_info(dev, "SMI access disallowed for single ported VFs\n");
+               return -EPROTONOSUPPORT;
+       }
+
        priv->mfunc.master.vf_admin[slave].enable_smi[port] = enabled;
        return 0;
 }
index ced5ecab5aa754ad44ae055464608bba66d6b137..70d33f6e2a41a39bbf513eb0b4155c2409074d10 100644 (file)
@@ -2988,18 +2988,6 @@ slave_start:
        /* In master functions, the communication channel must be initialized
         * after obtaining its address from fw */
        if (mlx4_is_master(dev)) {
-               int ib_ports = 0;
-
-               mlx4_foreach_port(i, dev, MLX4_PORT_TYPE_IB)
-                       ib_ports++;
-
-               if (ib_ports &&
-                   (num_vfs_argc > 1 || probe_vfs_argc > 1)) {
-                       mlx4_err(dev,
-                                "Invalid syntax of num_vfs/probe_vfs with IB port - single port VFs syntax is only supported when all ports are configured as ethernet\n");
-                       err = -EINVAL;
-                       goto err_close;
-               }
                if (dev->caps.num_ports < 2 &&
                    num_vfs_argc > 1) {
                        err = -EINVAL;