|
@@ -301,6 +301,16 @@ static void mlx4_en_do_set_multicast(struct work_struct *work)
|
|
|
|
|
|
/* Enable promiscouos mode */
|
|
|
switch (mdev->dev->caps.steering_mode) {
|
|
|
+ case MLX4_STEERING_MODE_DEVICE_MANAGED:
|
|
|
+ err = mlx4_flow_steer_promisc_add(mdev->dev,
|
|
|
+ priv->port,
|
|
|
+ priv->base_qpn,
|
|
|
+ MLX4_FS_PROMISC_UPLINK);
|
|
|
+ if (err)
|
|
|
+ en_err(priv, "Failed enabling promiscuous mode\n");
|
|
|
+ priv->flags |= MLX4_EN_FLAG_MC_PROMISC;
|
|
|
+ break;
|
|
|
+
|
|
|
case MLX4_STEERING_MODE_B0:
|
|
|
err = mlx4_unicast_promisc_add(mdev->dev,
|
|
|
priv->base_qpn,
|
|
@@ -357,6 +367,15 @@ static void mlx4_en_do_set_multicast(struct work_struct *work)
|
|
|
|
|
|
/* Disable promiscouos mode */
|
|
|
switch (mdev->dev->caps.steering_mode) {
|
|
|
+ case MLX4_STEERING_MODE_DEVICE_MANAGED:
|
|
|
+ err = mlx4_flow_steer_promisc_remove(mdev->dev,
|
|
|
+ priv->port,
|
|
|
+ MLX4_FS_PROMISC_UPLINK);
|
|
|
+ if (err)
|
|
|
+ en_err(priv, "Failed disabling promiscuous mode\n");
|
|
|
+ priv->flags &= ~MLX4_EN_FLAG_MC_PROMISC;
|
|
|
+ break;
|
|
|
+
|
|
|
case MLX4_STEERING_MODE_B0:
|
|
|
err = mlx4_unicast_promisc_remove(mdev->dev,
|
|
|
priv->base_qpn,
|
|
@@ -399,6 +418,13 @@ static void mlx4_en_do_set_multicast(struct work_struct *work)
|
|
|
/* Add the default qp number as multicast promisc */
|
|
|
if (!(priv->flags & MLX4_EN_FLAG_MC_PROMISC)) {
|
|
|
switch (mdev->dev->caps.steering_mode) {
|
|
|
+ case MLX4_STEERING_MODE_DEVICE_MANAGED:
|
|
|
+ err = mlx4_flow_steer_promisc_add(mdev->dev,
|
|
|
+ priv->port,
|
|
|
+ priv->base_qpn,
|
|
|
+ MLX4_FS_PROMISC_ALL_MULTI);
|
|
|
+ break;
|
|
|
+
|
|
|
case MLX4_STEERING_MODE_B0:
|
|
|
err = mlx4_multicast_promisc_add(mdev->dev,
|
|
|
priv->base_qpn,
|
|
@@ -416,6 +442,12 @@ static void mlx4_en_do_set_multicast(struct work_struct *work)
|
|
|
/* Disable Multicast promisc */
|
|
|
if (priv->flags & MLX4_EN_FLAG_MC_PROMISC) {
|
|
|
switch (mdev->dev->caps.steering_mode) {
|
|
|
+ case MLX4_STEERING_MODE_DEVICE_MANAGED:
|
|
|
+ err = mlx4_flow_steer_promisc_remove(mdev->dev,
|
|
|
+ priv->port,
|
|
|
+ MLX4_FS_PROMISC_ALL_MULTI);
|
|
|
+ break;
|
|
|
+
|
|
|
case MLX4_STEERING_MODE_B0:
|
|
|
err = mlx4_multicast_promisc_remove(mdev->dev,
|
|
|
priv->base_qpn,
|
|
@@ -839,6 +871,15 @@ int mlx4_en_start_port(struct net_device *dev)
|
|
|
|
|
|
/* Must redo promiscuous mode setup. */
|
|
|
priv->flags &= ~(MLX4_EN_FLAG_PROMISC | MLX4_EN_FLAG_MC_PROMISC);
|
|
|
+ if (mdev->dev->caps.steering_mode ==
|
|
|
+ MLX4_STEERING_MODE_DEVICE_MANAGED) {
|
|
|
+ mlx4_flow_steer_promisc_remove(mdev->dev,
|
|
|
+ priv->port,
|
|
|
+ MLX4_FS_PROMISC_UPLINK);
|
|
|
+ mlx4_flow_steer_promisc_remove(mdev->dev,
|
|
|
+ priv->port,
|
|
|
+ MLX4_FS_PROMISC_ALL_MULTI);
|
|
|
+ }
|
|
|
|
|
|
/* Schedule multicast task to populate multicast list */
|
|
|
queue_work(mdev->workqueue, &priv->mcast_task);
|