ch_stats->poll++;
 
-       for (i = 0; i < c->num_tc; i++) {
-               busy |= mlx5e_poll_tx_cq(&c->ptpsq[i].txqsq.cq, budget);
-               busy |= mlx5e_ptp_poll_ts_cq(&c->ptpsq[i].ts_cq, budget);
+       if (test_bit(MLX5E_PTP_STATE_TX, c->state)) {
+               for (i = 0; i < c->num_tc; i++) {
+                       busy |= mlx5e_poll_tx_cq(&c->ptpsq[i].txqsq.cq, budget);
+                       busy |= mlx5e_ptp_poll_ts_cq(&c->ptpsq[i].ts_cq, budget);
+               }
        }
 
        if (busy) {
 
        ch_stats->arm++;
 
-       for (i = 0; i < c->num_tc; i++) {
-               mlx5e_cq_arm(&c->ptpsq[i].txqsq.cq);
-               mlx5e_cq_arm(&c->ptpsq[i].ts_cq);
+       if (test_bit(MLX5E_PTP_STATE_TX, c->state)) {
+               for (i = 0; i < c->num_tc; i++) {
+                       mlx5e_cq_arm(&c->ptpsq[i].txqsq.cq);
+                       mlx5e_cq_arm(&c->ptpsq[i].ts_cq);
+               }
        }
 
 out:
        params->num_tc = orig->num_tc;
 
        /* SQ */
-       params->log_sq_size = orig->log_sq_size;
-
-       mlx5e_ptp_build_sq_param(c->mdev, params, &cparams->txq_sq_param);
+       if (test_bit(MLX5E_PTP_STATE_TX, c->state)) {
+               params->log_sq_size = orig->log_sq_size;
+               mlx5e_ptp_build_sq_param(c->mdev, params, &cparams->txq_sq_param);
+       }
 }
 
 static int mlx5e_ptp_open_queues(struct mlx5e_ptp *c,
 {
        int err;
 
-       err = mlx5e_ptp_open_cqs(c, cparams);
-       if (err)
-               return err;
-
-       err = mlx5e_ptp_open_txqsqs(c, cparams);
-       if (err)
-               goto close_cqs;
+       if (test_bit(MLX5E_PTP_STATE_TX, c->state)) {
+               err = mlx5e_ptp_open_cqs(c, cparams);
+               if (err)
+                       return err;
 
+               err = mlx5e_ptp_open_txqsqs(c, cparams);
+               if (err)
+                       goto close_cqs;
+       }
        return 0;
 
 close_cqs:
-       mlx5e_ptp_close_cqs(c);
+       if (test_bit(MLX5E_PTP_STATE_TX, c->state))
+               mlx5e_ptp_close_cqs(c);
 
        return err;
 }
 
 static void mlx5e_ptp_close_queues(struct mlx5e_ptp *c)
 {
-       mlx5e_ptp_close_txqsqs(c);
-       mlx5e_ptp_close_cqs(c);
+       if (test_bit(MLX5E_PTP_STATE_TX, c->state)) {
+               mlx5e_ptp_close_txqsqs(c);
+               mlx5e_ptp_close_cqs(c);
+       }
+}
+
+static int mlx5e_ptp_set_state(struct mlx5e_ptp *c, struct mlx5e_params *params)
+{
+       if (MLX5E_GET_PFLAG(params, MLX5E_PFLAG_TX_PORT_TS))
+               __set_bit(MLX5E_PTP_STATE_TX, c->state);
+
+       return bitmap_empty(c->state, MLX5E_PTP_STATE_NUM_STATES) ? -EINVAL : 0;
 }
 
 int mlx5e_ptp_open(struct mlx5e_priv *priv, struct mlx5e_params *params,
        c->stats    = &priv->ptp_stats.ch;
        c->lag_port = lag_port;
 
+       err = mlx5e_ptp_set_state(c, params);
+       if (err)
+               goto err_free;
+
        netif_napi_add(netdev, &c->napi, mlx5e_ptp_napi_poll, 64);
 
        mlx5e_ptp_build_params(c, cparams, params);
 
 err_napi_del:
        netif_napi_del(&c->napi);
-
+err_free:
        kvfree(cparams);
        kvfree(c);
        return err;
 
        napi_enable(&c->napi);
 
-       for (tc = 0; tc < c->num_tc; tc++)
-               mlx5e_activate_txqsq(&c->ptpsq[tc].txqsq);
+       if (test_bit(MLX5E_PTP_STATE_TX, c->state)) {
+               for (tc = 0; tc < c->num_tc; tc++)
+                       mlx5e_activate_txqsq(&c->ptpsq[tc].txqsq);
+       }
 }
 
 void mlx5e_ptp_deactivate_channel(struct mlx5e_ptp *c)
 {
        int tc;
 
-       for (tc = 0; tc < c->num_tc; tc++)
-               mlx5e_deactivate_txqsq(&c->ptpsq[tc].txqsq);
+       if (test_bit(MLX5E_PTP_STATE_TX, c->state)) {
+               for (tc = 0; tc < c->num_tc; tc++)
+                       mlx5e_deactivate_txqsq(&c->ptpsq[tc].txqsq);
+       }
 
        napi_disable(&c->napi);
 }
 
 {
        struct mlx5e_priv *priv = devlink_health_reporter_priv(reporter);
        struct mlx5e_txqsq *generic_sq = priv->txq2sq[0];
+       struct mlx5e_ptp *ptp_ch = priv->channels.ptp;
        struct mlx5e_ptpsq *generic_ptpsq;
        int err;
 
        if (err)
                return err;
 
-       generic_ptpsq = priv->channels.ptp ?
-                       &priv->channels.ptp->ptpsq[0] :
-                       NULL;
-       if (!generic_ptpsq)
+       if (!ptp_ch || !test_bit(MLX5E_PTP_STATE_TX, ptp_ch->state))
                goto out;
 
+       generic_ptpsq = &ptp_ch->ptpsq[0];
+
        err = mlx5e_health_fmsg_named_obj_nest_start(fmsg, "PTP");
        if (err)
                return err;
                }
        }
 
-       if (!ptp_ch)
+       if (!ptp_ch || !test_bit(MLX5E_PTP_STATE_TX, ptp_ch->state))
                goto close_sqs_nest;
 
        for (tc = 0; tc < priv->channels.params.num_tc; tc++) {
                }
        }
 
-       if (ptp_ch) {
+       if (ptp_ch && test_bit(MLX5E_PTP_STATE_TX, ptp_ch->state)) {
                for (tc = 0; tc < priv->channels.params.num_tc; tc++) {
                        struct mlx5e_txqsq *sq = &ptp_ch->ptpsq[tc].txqsq;
 
 
        /* Sync with mlx5e_update_num_tc_x_num_ch - avoid refetching. */
        num_tc_x_num_ch = READ_ONCE(priv->num_tc_x_num_ch);
        if (unlikely(dev->real_num_tx_queues > num_tc_x_num_ch)) {
+               struct mlx5e_ptp *ptp_channel;
+
                /* Order maj_id before defcls - pairs with mlx5e_htb_root_add. */
                u16 htb_maj_id = smp_load_acquire(&priv->htb.maj_id);
 
                                return txq_ix;
                }
 
-               if (unlikely(priv->channels.ptp))
-                       if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) &&
-                           mlx5e_use_ptpsq(skb))
-                               return mlx5e_select_ptpsq(dev, skb);
+               ptp_channel = READ_ONCE(priv->channels.ptp);
+               if (unlikely(ptp_channel) &&
+                   test_bit(MLX5E_PTP_STATE_TX, ptp_channel->state) &&
+                   mlx5e_use_ptpsq(skb))
+                       return mlx5e_select_ptpsq(dev, skb);
 
                txq_ix = netdev_pick_tx(dev, skb, NULL);
                /* Fix netdev_pick_tx() not to choose ptp_channel and HTB txqs.