/* 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);
        /* 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 */