loc_rule->id = 0;
                memset(&loc_rule->flow_spec, 0,
                       sizeof(struct ethtool_rx_flow_spec));
+               list_del(&loc_rule->list);
        }
        err = mlx4_flow_attach(priv->mdev->dev, &rule, ®_id);
        if (err) {
        loc_rule->id = reg_id;
        memcpy(&loc_rule->flow_spec, &cmd->fs,
               sizeof(struct ethtool_rx_flow_spec));
+       list_add_tail(&loc_rule->list, &priv->ethtool_list);
 
 out_free_list:
        list_for_each_entry_safe(spec, tmp_spec, &rule.list, list) {
        }
        rule->id = 0;
        memset(&rule->flow_spec, 0, sizeof(struct ethtool_rx_flow_spec));
+       list_del(&rule->list);
 out:
        return err;
 
 
 
        INIT_LIST_HEAD(&priv->mc_list);
        INIT_LIST_HEAD(&priv->curr_list);
+       INIT_LIST_HEAD(&priv->ethtool_list);
+       memset(&priv->ethtool_rules[0], 0,
+              sizeof(struct ethtool_flow_id) * MAX_NUM_OF_FS_RULES);
 
        /* Calculate Rx buf size */
        dev->mtu = min(dev->mtu, priv->max_mtu);
        struct mlx4_en_priv *priv = netdev_priv(dev);
        struct mlx4_en_dev *mdev = priv->mdev;
        struct mlx4_en_mc_list *mclist, *tmp;
+       struct ethtool_flow_id *flow, *tmp_flow;
        int i;
        u8 mc_list[16] = {0};
 
        mlx4_put_eth_qp(mdev->dev, priv->port, priv->mac, priv->base_qpn);
        mdev->mac_removed[priv->port] = 1;
 
+       /* Remove flow steering rules for the port*/
+       if (mdev->dev->caps.steering_mode ==
+           MLX4_STEERING_MODE_DEVICE_MANAGED) {
+               ASSERT_RTNL();
+               list_for_each_entry_safe(flow, tmp_flow,
+                                        &priv->ethtool_list, list) {
+                       mlx4_flow_detach(mdev->dev, flow->id);
+                       list_del(&flow->list);
+               }
+       }
+
        /* Free RX Rings */
        for (i = 0; i < priv->rx_ring_num; i++) {
                mlx4_en_deactivate_rx_ring(priv, &priv->rx_ring[i]);
 
 #endif
 
 struct ethtool_flow_id {
+       struct list_head list;
        struct ethtool_rx_flow_spec flow_spec;
        u64 id;
 };
        struct mlx4_en_port_state port_state;
        spinlock_t stats_lock;
        struct ethtool_flow_id ethtool_rules[MAX_NUM_OF_FS_RULES];
+       /* To allow rules removal while port is going down */
+       struct list_head ethtool_list;
 
        unsigned long last_moder_packets[MAX_RX_RINGS];
        unsigned long last_moder_tx_packets;