return count;
 }
 
+int mlx5_devlink_traps_get_action(struct mlx5_core_dev *dev, int trap_id,
+                                 enum devlink_trap_action *action)
+{
+       struct mlx5_devlink_trap *dl_trap;
+
+       dl_trap = mlx5_find_trap_by_id(dev, trap_id);
+       if (!dl_trap) {
+               mlx5_core_err(dev, "Devlink trap: Get action on invalid trap id 0x%x",
+                             trap_id);
+               return -EINVAL;
+       }
+
+       *action = dl_trap->trap.action;
+       return 0;
+}
+
 struct devlink *mlx5_devlink_alloc(void)
 {
        return devlink_alloc(&mlx5_devlink_ops, sizeof(struct mlx5_core_dev));
 
 void mlx5_devlink_trap_report(struct mlx5_core_dev *dev, int trap_id, struct sk_buff *skb,
                              struct devlink_port *dl_port);
 int mlx5_devlink_trap_get_num_active(struct mlx5_core_dev *dev);
+int mlx5_devlink_traps_get_action(struct mlx5_core_dev *dev, int trap_id,
+                                 enum devlink_trap_action *action);
 
 struct devlink *mlx5_devlink_alloc(void);
 void mlx5_devlink_free(struct devlink *devlink);
 
 {
        int err = 0;
 
+       /* Traps are unarmed when interface is down, no need to update
+        * them. The configuration is saved in the core driver,
+        * queried and applied upon interface up operation in
+        * mlx5e_open_locked().
+        */
+       if (!test_bit(MLX5E_STATE_OPENED, &priv->state))
+               return 0;
+
        switch (trap_ctx->action) {
        case DEVLINK_TRAP_ACTION_TRAP:
                err = mlx5e_handle_action_trap(priv, trap_ctx->id);
        }
        return err;
 }
+
+static int mlx5e_apply_trap(struct mlx5e_priv *priv, int trap_id, bool enable)
+{
+       enum devlink_trap_action action;
+       int err;
+
+       err = mlx5_devlink_traps_get_action(priv->mdev, trap_id, &action);
+       if (err)
+               return err;
+       if (action == DEVLINK_TRAP_ACTION_TRAP)
+               err = enable ? mlx5e_handle_action_trap(priv, trap_id) :
+                              mlx5e_handle_action_drop(priv, trap_id);
+       return err;
+}
+
+static const int mlx5e_traps_arr[] = {
+       DEVLINK_TRAP_GENERIC_ID_INGRESS_VLAN_FILTER,
+       DEVLINK_TRAP_GENERIC_ID_DMAC_FILTER,
+};
+
+int mlx5e_apply_traps(struct mlx5e_priv *priv, bool enable)
+{
+       int err;
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(mlx5e_traps_arr); i++) {
+               err = mlx5e_apply_trap(priv, mlx5e_traps_arr[i], enable);
+               if (err)
+                       return err;
+       }
+       return 0;
+}
 
 void mlx5e_close_trap(struct mlx5e_trap *trap);
 void mlx5e_deactivate_trap(struct mlx5e_priv *priv);
 int mlx5e_handle_trap_event(struct mlx5e_priv *priv, struct mlx5_trap_ctx *trap_ctx);
+int mlx5e_apply_traps(struct mlx5e_priv *priv, bool enable);
+
 #endif
 
 
        priv->profile->update_rx(priv);
        mlx5e_activate_priv_channels(priv);
+       mlx5e_apply_traps(priv, true);
        if (priv->profile->update_carrier)
                priv->profile->update_carrier(priv);
 
        if (!test_bit(MLX5E_STATE_OPENED, &priv->state))
                return 0;
 
+       mlx5e_apply_traps(priv, false);
        clear_bit(MLX5E_STATE_OPENED, &priv->state);
 
        netif_carrier_off(priv->netdev);