net/mlx4_core: Use both physical ports to set the VF link state
[cascardo/linux.git] / drivers / net / ethernet / mellanox / mlx4 / fw.c
index 90db94e..2c2baab 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;
 }