|
@@ -1167,15 +1167,6 @@ 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);
|
|
@@ -1227,6 +1218,32 @@ void mlx4_en_stop_port(struct net_device *dev)
|
|
|
/* Set port as not active */
|
|
|
priv->port_up = false;
|
|
|
|
|
|
+ /* Promsicuous mode */
|
|
|
+ if (mdev->dev->caps.steering_mode ==
|
|
|
+ MLX4_STEERING_MODE_DEVICE_MANAGED) {
|
|
|
+ priv->flags &= ~(MLX4_EN_FLAG_PROMISC |
|
|
|
+ MLX4_EN_FLAG_MC_PROMISC);
|
|
|
+ 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);
|
|
|
+ } else if (priv->flags & MLX4_EN_FLAG_PROMISC) {
|
|
|
+ priv->flags &= ~MLX4_EN_FLAG_PROMISC;
|
|
|
+
|
|
|
+ /* Disable promiscouos mode */
|
|
|
+ mlx4_unicast_promisc_remove(mdev->dev, priv->base_qpn,
|
|
|
+ priv->port);
|
|
|
+
|
|
|
+ /* Disable Multicast promisc */
|
|
|
+ if (priv->flags & MLX4_EN_FLAG_MC_PROMISC) {
|
|
|
+ mlx4_multicast_promisc_remove(mdev->dev, priv->base_qpn,
|
|
|
+ priv->port);
|
|
|
+ priv->flags &= ~MLX4_EN_FLAG_MC_PROMISC;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/* Detach All multicasts */
|
|
|
memset(&mc_list[10], 0xff, ETH_ALEN);
|
|
|
mc_list[5] = priv->port; /* needed for B0 steering support */
|