}
 
 static void mlx5e_redirect_rqts(struct mlx5e_priv *priv,
-                               struct mlx5e_redirect_rqt_param rrp)
+                               struct mlx5e_redirect_rqt_param rrp,
+                               struct mlx5e_redirect_rqt_param *ptp_rrp)
 {
        u32 rqtn;
        int ix;
                rqtn = priv->direct_tir[ix].rqt.rqtn;
                mlx5e_redirect_rqt(priv, rqtn, 1, direct_rrp);
        }
+       if (ptp_rrp) {
+               rqtn = priv->ptp_tir.rqt.rqtn;
+               mlx5e_redirect_rqt(priv, rqtn, 1, *ptp_rrp);
+       }
 }
 
 static void mlx5e_redirect_rqts_to_channels(struct mlx5e_priv *priv,
                                            struct mlx5e_channels *chs)
 {
+       bool rx_ptp_support = priv->profile->rx_ptp_support;
+       struct mlx5e_redirect_rqt_param *ptp_rrp_p = NULL;
        struct mlx5e_redirect_rqt_param rrp = {
                .is_rss        = true,
                {
                        }
                },
        };
+       struct mlx5e_redirect_rqt_param ptp_rrp;
+
+       if (rx_ptp_support) {
+               u32 ptp_rqn;
 
-       mlx5e_redirect_rqts(priv, rrp);
+               ptp_rrp.is_rss = false;
+               ptp_rrp.rqn = mlx5e_ptp_get_rqn(priv->channels.ptp, &ptp_rqn) ?
+                             priv->drop_rq.rqn : ptp_rqn;
+               ptp_rrp_p = &ptp_rrp;
+       }
+       mlx5e_redirect_rqts(priv, rrp, ptp_rrp_p);
 }
 
 static void mlx5e_redirect_rqts_to_drop(struct mlx5e_priv *priv)
 {
+       bool rx_ptp_support = priv->profile->rx_ptp_support;
        struct mlx5e_redirect_rqt_param drop_rrp = {
                .is_rss = false,
                {
                },
        };
 
-       mlx5e_redirect_rqts(priv, drop_rrp);
+       mlx5e_redirect_rqts(priv, drop_rrp, rx_ptp_support ? &drop_rrp : NULL);
 }
 
 static const struct mlx5e_tirc_config tirc_default_config[MLX5E_NUM_INDIR_TIRS] = {
        if (unlikely(err))
                goto err_destroy_xsk_rqts;
 
+       err = mlx5e_create_direct_rqts(priv, &priv->ptp_tir, 1);
+       if (err)
+               goto err_destroy_xsk_tirs;
+
+       err = mlx5e_create_direct_tirs(priv, &priv->ptp_tir, 1);
+       if (err)
+               goto err_destroy_ptp_rqt;
+
        err = mlx5e_create_flow_steering(priv);
        if (err) {
                mlx5_core_warn(mdev, "create flow steering failed, %d\n", err);
-               goto err_destroy_xsk_tirs;
+               goto err_destroy_ptp_direct_tir;
        }
 
        err = mlx5e_tc_nic_init(priv);
        mlx5e_tc_nic_cleanup(priv);
 err_destroy_flow_steering:
        mlx5e_destroy_flow_steering(priv);
+err_destroy_ptp_direct_tir:
+       mlx5e_destroy_direct_tirs(priv, &priv->ptp_tir, 1);
+err_destroy_ptp_rqt:
+       mlx5e_destroy_direct_rqts(priv, &priv->ptp_tir, 1);
 err_destroy_xsk_tirs:
        mlx5e_destroy_direct_tirs(priv, priv->xsk_tir, max_nch);
 err_destroy_xsk_rqts:
        mlx5e_accel_cleanup_rx(priv);
        mlx5e_tc_nic_cleanup(priv);
        mlx5e_destroy_flow_steering(priv);
+       mlx5e_destroy_direct_tirs(priv, &priv->ptp_tir, 1);
+       mlx5e_destroy_direct_rqts(priv, &priv->ptp_tir, 1);
        mlx5e_destroy_direct_tirs(priv, priv->xsk_tir, max_nch);
        mlx5e_destroy_direct_rqts(priv, priv->xsk_tir, max_nch);
        mlx5e_destroy_direct_tirs(priv, priv->direct_tir, max_nch);
        .rq_groups         = MLX5E_NUM_RQ_GROUPS(XSK),
        .stats_grps        = mlx5e_nic_stats_grps,
        .stats_grps_num    = mlx5e_nic_stats_grps_num,
+       .rx_ptp_support    = true,
 };
 
 /* mlx5e generic netdev management API (move to en_common.c) */