]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/net/ethernet/mellanox/mlx5/core/en_flow_table.c
net/mlx5e: Take advantage of the light-weight netdev open/stop
[mirror_ubuntu-artful-kernel.git] / drivers / net / ethernet / mellanox / mlx5 / core / en_flow_table.c
index d99be7892ebc81fe6a0a2d8d63cdc5053b237b36..e71563ce05d1bc34123fd4aa63348d569adf4c57 100644 (file)
@@ -594,44 +594,28 @@ static void mlx5e_del_vlan_rule(struct mlx5e_priv *priv,
 
 void mlx5e_enable_vlan_filter(struct mlx5e_priv *priv)
 {
-       WARN_ON(!mutex_is_locked(&priv->state_lock));
+       if (!priv->vlan.filter_disabled)
+               return;
 
-       if (priv->vlan.filter_disabled) {
-               priv->vlan.filter_disabled = false;
-               if (test_bit(MLX5E_STATE_OPENED, &priv->state))
-                       mlx5e_del_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_ANY_VID,
-                                           0);
-       }
+       priv->vlan.filter_disabled = false;
+       mlx5e_del_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_ANY_VID, 0);
 }
 
 void mlx5e_disable_vlan_filter(struct mlx5e_priv *priv)
 {
-       WARN_ON(!mutex_is_locked(&priv->state_lock));
+       if (priv->vlan.filter_disabled)
+               return;
 
-       if (!priv->vlan.filter_disabled) {
-               priv->vlan.filter_disabled = true;
-               if (test_bit(MLX5E_STATE_OPENED, &priv->state))
-                       mlx5e_add_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_ANY_VID,
-                                           0);
-       }
+       priv->vlan.filter_disabled = true;
+       mlx5e_add_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_ANY_VID, 0);
 }
 
 int mlx5e_vlan_rx_add_vid(struct net_device *dev, __always_unused __be16 proto,
                          u16 vid)
 {
        struct mlx5e_priv *priv = netdev_priv(dev);
-       int err = 0;
-
-       mutex_lock(&priv->state_lock);
-
-       set_bit(vid, priv->vlan.active_vlans);
-       if (test_bit(MLX5E_STATE_OPENED, &priv->state))
-               err = mlx5e_add_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_MATCH_VID,
-                                         vid);
 
-       mutex_unlock(&priv->state_lock);
-
-       return err;
+       return mlx5e_add_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_MATCH_VID, vid);
 }
 
 int mlx5e_vlan_rx_kill_vid(struct net_device *dev, __always_unused __be16 proto,
@@ -639,56 +623,11 @@ int mlx5e_vlan_rx_kill_vid(struct net_device *dev, __always_unused __be16 proto,
 {
        struct mlx5e_priv *priv = netdev_priv(dev);
 
-       mutex_lock(&priv->state_lock);
-
-       clear_bit(vid, priv->vlan.active_vlans);
-       if (test_bit(MLX5E_STATE_OPENED, &priv->state))
-               mlx5e_del_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_MATCH_VID, vid);
-
-       mutex_unlock(&priv->state_lock);
-
-       return 0;
-}
-
-int mlx5e_add_all_vlan_rules(struct mlx5e_priv *priv)
-{
-       u16 vid;
-       int err;
-
-       for_each_set_bit(vid, priv->vlan.active_vlans, VLAN_N_VID) {
-               err = mlx5e_add_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_MATCH_VID,
-                                         vid);
-               if (err)
-                       return err;
-       }
-
-       err = mlx5e_add_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_UNTAGGED, 0);
-       if (err)
-               return err;
-
-       if (priv->vlan.filter_disabled) {
-               err = mlx5e_add_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_ANY_VID,
-                                         0);
-               if (err)
-                       return err;
-       }
+       mlx5e_del_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_MATCH_VID, vid);
 
        return 0;
 }
 
-void mlx5e_del_all_vlan_rules(struct mlx5e_priv *priv)
-{
-       u16 vid;
-
-       if (priv->vlan.filter_disabled)
-               mlx5e_del_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_ANY_VID, 0);
-
-       mlx5e_del_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_UNTAGGED, 0);
-
-       for_each_set_bit(vid, priv->vlan.active_vlans, VLAN_N_VID)
-               mlx5e_del_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_MATCH_VID, vid);
-}
-
 #define mlx5e_for_each_hash_node(hn, tmp, hash, i) \
        for (i = 0; i < MLX5E_ETH_ADDR_HASH_SIZE; i++) \
                hlist_for_each_entry_safe(hn, tmp, &hash[i], hlist)
@@ -752,18 +691,21 @@ static void mlx5e_handle_netdev_addr(struct mlx5e_priv *priv)
        mlx5e_for_each_hash_node(hn, tmp, priv->eth_addr.netdev_mc, i)
                hn->action = MLX5E_ACTION_DEL;
 
-       if (test_bit(MLX5E_STATE_OPENED, &priv->state))
+       if (!test_bit(MLX5E_STATE_DESTROYING, &priv->state))
                mlx5e_sync_netdev_addr(priv);
 
        mlx5e_apply_netdev_addr(priv);
 }
 
-void mlx5e_set_rx_mode_core(struct mlx5e_priv *priv)
+void mlx5e_set_rx_mode_work(struct work_struct *work)
 {
+       struct mlx5e_priv *priv = container_of(work, struct mlx5e_priv,
+                                              set_rx_mode_work);
+
        struct mlx5e_eth_addr_db *ea = &priv->eth_addr;
        struct net_device *ndev = priv->netdev;
 
-       bool rx_mode_enable   = test_bit(MLX5E_STATE_OPENED, &priv->state);
+       bool rx_mode_enable   = !test_bit(MLX5E_STATE_DESTROYING, &priv->state);
        bool promisc_enabled   = rx_mode_enable && (ndev->flags & IFF_PROMISC);
        bool allmulti_enabled  = rx_mode_enable && (ndev->flags & IFF_ALLMULTI);
        bool broadcast_enabled = rx_mode_enable;
@@ -796,17 +738,6 @@ void mlx5e_set_rx_mode_core(struct mlx5e_priv *priv)
        ea->broadcast_enabled = broadcast_enabled;
 }
 
-void mlx5e_set_rx_mode_work(struct work_struct *work)
-{
-       struct mlx5e_priv *priv = container_of(work, struct mlx5e_priv,
-                                              set_rx_mode_work);
-
-       mutex_lock(&priv->state_lock);
-       if (test_bit(MLX5E_STATE_OPENED, &priv->state))
-               mlx5e_set_rx_mode_core(priv);
-       mutex_unlock(&priv->state_lock);
-}
-
 void mlx5e_init_eth_addr(struct mlx5e_priv *priv)
 {
        ether_addr_copy(priv->eth_addr.broadcast.addr, priv->netdev->broadcast);
@@ -941,8 +872,15 @@ int mlx5e_create_flow_tables(struct mlx5e_priv *priv)
        if (err)
                goto err_destroy_main_flow_table;
 
+       err = mlx5e_add_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_UNTAGGED, 0);
+       if (err)
+               goto err_destroy_vlan_flow_table;
+
        return 0;
 
+err_destroy_vlan_flow_table:
+       mlx5e_destroy_vlan_flow_table(priv);
+
 err_destroy_main_flow_table:
        mlx5e_destroy_main_flow_table(priv);
 
@@ -951,6 +889,7 @@ err_destroy_main_flow_table:
 
 void mlx5e_destroy_flow_tables(struct mlx5e_priv *priv)
 {
+       mlx5e_del_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_UNTAGGED, 0);
        mlx5e_destroy_vlan_flow_table(priv);
        mlx5e_destroy_main_flow_table(priv);
 }