@@ -144,48 +144,6 @@ mlx5_ib_port_link_layer(struct ib_device *device, u8 port_num)
return mlx5_port_type_cap_to_rdma_ll(port_type_cap);
}
-static int get_port_state(struct ib_device *ibdev,
- u8 port_num,
- enum ib_port_state *state)
-{
- struct ib_port_attr attr;
- int ret;
-
- memset(&attr, 0, sizeof(attr));
- ret = ibdev->ops.query_port(ibdev, port_num, &attr);
- if (!ret)
- *state = attr.state;
- return ret;
-}
-
-static struct mlx5_roce *mlx5_get_rep_roce(struct mlx5_ib_dev *dev,
- struct net_device *ndev,
- u8 *port_num)
-{
- struct mlx5_eswitch *esw = dev->mdev->priv.eswitch;
- struct net_device *rep_ndev;
- struct mlx5_ib_port *port;
- int i;
-
- for (i = 0; i < dev->num_ports; i++) {
- port = &dev->port[i];
- if (!port->rep)
- continue;
-
- read_lock(&port->roce.netdev_lock);
- rep_ndev = mlx5_ib_get_rep_netdev(esw,
- port->rep->vport);
- if (rep_ndev == ndev) {
- read_unlock(&port->roce.netdev_lock);
- *port_num = i + 1;
- return &port->roce;
- }
- read_unlock(&port->roce.netdev_lock);
- }
-
- return NULL;
-}
-
static int mlx5_netdev_event(struct notifier_block *this,
unsigned long event, void *ptr)
{
@@ -219,52 +177,10 @@ static int mlx5_netdev_event(struct notifier_block *this,
write_unlock(&roce->netdev_lock);
break;
- case NETDEV_CHANGE:
- case NETDEV_UP:
- case NETDEV_DOWN: {
- struct net_device *lag_ndev = mlx5_lag_get_roce_netdev(mdev);
- struct net_device *upper = NULL;
-
- if (lag_ndev) {
- upper = netdev_master_upper_dev_get(lag_ndev);
- dev_put(lag_ndev);
- }
-
- if (ibdev->is_rep)
- roce = mlx5_get_rep_roce(ibdev, ndev, &port_num);
- if (!roce)
- return NOTIFY_DONE;
- if ((upper == ndev || (!upper && ndev == roce->netdev))
- && ibdev->ib_active) {
- struct ib_event ibev = { };
- enum ib_port_state port_state;
-
- if (get_port_state(&ibdev->ib_dev, port_num,
- &port_state))
- goto done;
-
- if (roce->last_port_state == port_state)
- goto done;
-
- roce->last_port_state = port_state;
- ibev.device = &ibdev->ib_dev;
- if (port_state == IB_PORT_DOWN)
- ibev.event = IB_EVENT_PORT_ERR;
- else if (port_state == IB_PORT_ACTIVE)
- ibev.event = IB_EVENT_PORT_ACTIVE;
- else
- goto done;
-
- ibev.element.port_num = port_num;
- ib_dispatch_event(&ibev);
- }
- break;
- }
-
default:
break;
}
-done:
+
mlx5_ib_put_native_port_mdev(ibdev, port_num);
return NOTIFY_DONE;
}
@@ -569,7 +485,14 @@ static int mlx5_query_port_roce(struct ib_device *device, u8 port_num,
dev_put(ndev);
- props->active_mtu = min(props->max_mtu, ndev_ib_mtu);
+ props->active_mtu = min(props->max_mtu, ndev_ib_mtu);
+
+ if ((dev->lag_active && ndev != mlx5_lag_get_roce_netdev(mdev)) ||
+ (!dev->lag_active && port_num != mdev_port_num))
+ props->port_event_flags = IB_PORT_BONDING_SLAVE;
+ else
+ props->port_event_flags &= ~IB_PORT_BONDING_SLAVE;
+
out:
if (put_mdev)
mlx5_ib_put_native_port_mdev(dev, port_num);