net/mlx4_core: Use both physical ports to set the VF link state
authorOr Gerlitz <ogerlitz@mellanox.com>
Sun, 6 Dec 2015 16:07:38 +0000 (18:07 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 7 Dec 2015 03:40:44 +0000 (22:40 -0500)
In HA mode, the link state for VFs for which the policy is "auto"
(i.e. follow the physical link state) should be ORed from both ports.

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

index 90db94e83fdeef52023a542539a5a396c2a9a80c..2c2baab9d88044d77d910653f882e9815fa57561 100644 (file)
@@ -1104,6 +1104,7 @@ int mlx4_QUERY_PORT(struct mlx4_dev *dev, int port, struct mlx4_port_cap *port_c
                        goto out;
 
                MLX4_GET(field, outbox, QUERY_PORT_SUPPORTED_TYPE_OFFSET);
+               port_cap->link_state = (field & 0x80) >> 7;
                port_cap->supported_port_types = field & 3;
                port_cap->suggested_type = (field >> 3) & 1;
                port_cap->default_sense = (field >> 4) & 1;
@@ -1310,6 +1311,15 @@ int mlx4_QUERY_PORT_wrapper(struct mlx4_dev *dev, int slave,
                        port_type |= MLX4_PORT_LINK_UP_MASK;
                else if (IFLA_VF_LINK_STATE_DISABLE == admin_link_state)
                        port_type &= ~MLX4_PORT_LINK_UP_MASK;
+               else if (IFLA_VF_LINK_STATE_AUTO == admin_link_state && mlx4_is_bonded(dev)) {
+                       int other_port = (port == 1) ? 2 : 1;
+                       struct mlx4_port_cap port_cap;
+
+                       err = mlx4_QUERY_PORT(dev, other_port, &port_cap);
+                       if (err)
+                               goto out;
+                       port_type |= (port_cap.link_state << 7);
+               }
 
                MLX4_PUT(outbox->buf, port_type,
                         QUERY_PORT_SUPPORTED_TYPE_OFFSET);
@@ -1325,7 +1335,7 @@ int mlx4_QUERY_PORT_wrapper(struct mlx4_dev *dev, int slave,
                MLX4_PUT(outbox->buf, short_field,
                         QUERY_PORT_CUR_MAX_PKEY_OFFSET);
        }
-
+out:
        return err;
 }
 
index 08de5555c2f4d032bd61cf71689ef3cd0d8edd81..7ea258af636aec54394fd112a087b4bdbba36209 100644 (file)
@@ -44,6 +44,7 @@ struct mlx4_mod_stat_cfg {
 };
 
 struct mlx4_port_cap {
+       u8  link_state;
        u8  supported_port_types;
        u8  suggested_type;
        u8  default_sense;