Commit 8d80d04a authored by Moni Shoua's avatar Moni Shoua Committed by David S. Miller

net/mlx4_core: Use both physical ports to dispatch link state events to VF

Under HA mode, the link down event should be sent to VFs only if both
ports are down.
Signed-off-by: default avatarMoni Shoua <monis@mellanox.com>
Reviewed-by: default avatarJack Morgenstein <jackm@dev.mellanox.co.il>
Signed-off-by: default avatarOr Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e34305c8
...@@ -151,6 +151,17 @@ void mlx4_gen_slave_eqe(struct work_struct *work) ...@@ -151,6 +151,17 @@ void mlx4_gen_slave_eqe(struct work_struct *work)
eqe = next_slave_event_eqe(slave_eq)) { eqe = next_slave_event_eqe(slave_eq)) {
slave = eqe->slave_id; slave = eqe->slave_id;
if (eqe->type == MLX4_EVENT_TYPE_PORT_CHANGE &&
eqe->subtype == MLX4_PORT_CHANGE_SUBTYPE_DOWN &&
mlx4_is_bonded(dev)) {
struct mlx4_port_cap port_cap;
if (!mlx4_QUERY_PORT(dev, 1, &port_cap) && port_cap.link_state)
goto consume;
if (!mlx4_QUERY_PORT(dev, 2, &port_cap) && port_cap.link_state)
goto consume;
}
/* All active slaves need to receive the event */ /* All active slaves need to receive the event */
if (slave == ALL_SLAVES) { if (slave == ALL_SLAVES) {
for (i = 0; i <= dev->persist->num_vfs; i++) { for (i = 0; i <= dev->persist->num_vfs; i++) {
...@@ -174,6 +185,7 @@ void mlx4_gen_slave_eqe(struct work_struct *work) ...@@ -174,6 +185,7 @@ void mlx4_gen_slave_eqe(struct work_struct *work)
mlx4_warn(dev, "Failed to generate event for slave %d\n", mlx4_warn(dev, "Failed to generate event for slave %d\n",
slave); slave);
} }
consume:
++slave_eq->cons; ++slave_eq->cons;
} }
} }
...@@ -594,7 +606,9 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq) ...@@ -594,7 +606,9 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq)
break; break;
for (i = 0; i < dev->persist->num_vfs + 1; for (i = 0; i < dev->persist->num_vfs + 1;
i++) { i++) {
if (!test_bit(i, slaves_port.slaves)) int reported_port = mlx4_is_bonded(dev) ? 1 : mlx4_phys_to_slave_port(dev, i, port);
if (!test_bit(i, slaves_port.slaves) && !mlx4_is_bonded(dev))
continue; continue;
if (dev->caps.port_type[port] == MLX4_PORT_TYPE_ETH) { if (dev->caps.port_type[port] == MLX4_PORT_TYPE_ETH) {
if (i == mlx4_master_func_num(dev)) if (i == mlx4_master_func_num(dev))
...@@ -606,7 +620,7 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq) ...@@ -606,7 +620,7 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq)
eqe->event.port_change.port = eqe->event.port_change.port =
cpu_to_be32( cpu_to_be32(
(be32_to_cpu(eqe->event.port_change.port) & 0xFFFFFFF) (be32_to_cpu(eqe->event.port_change.port) & 0xFFFFFFF)
| (mlx4_phys_to_slave_port(dev, i, port) << 28)); | (reported_port << 28));
mlx4_slave_event(dev, i, eqe); mlx4_slave_event(dev, i, eqe);
} }
} else { /* IB port */ } else { /* IB port */
...@@ -636,7 +650,9 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq) ...@@ -636,7 +650,9 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq)
for (i = 0; for (i = 0;
i < dev->persist->num_vfs + 1; i < dev->persist->num_vfs + 1;
i++) { i++) {
if (!test_bit(i, slaves_port.slaves)) int reported_port = mlx4_is_bonded(dev) ? 1 : mlx4_phys_to_slave_port(dev, i, port);
if (!test_bit(i, slaves_port.slaves) && !mlx4_is_bonded(dev))
continue; continue;
if (i == mlx4_master_func_num(dev)) if (i == mlx4_master_func_num(dev))
continue; continue;
...@@ -645,7 +661,7 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq) ...@@ -645,7 +661,7 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq)
eqe->event.port_change.port = eqe->event.port_change.port =
cpu_to_be32( cpu_to_be32(
(be32_to_cpu(eqe->event.port_change.port) & 0xFFFFFFF) (be32_to_cpu(eqe->event.port_change.port) & 0xFFFFFFF)
| (mlx4_phys_to_slave_port(dev, i, port) << 28)); | (reported_port << 28));
mlx4_slave_event(dev, i, eqe); mlx4_slave_event(dev, i, eqe);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment