struct sk_buff *skb)
 {
        struct ocelot *ocelot = ds->priv;
-       struct ocelot_port *ocelot_port = ocelot->ports[port];
-       struct sk_buff *clone;
+       struct sk_buff *clone = NULL;
 
-       if (ocelot->ptp && ocelot_port->ptp_cmd == IFH_REW_OP_TWO_STEP_PTP) {
-               clone = skb_clone_sk(skb);
-               if (!clone)
-                       return;
+       if (!ocelot->ptp)
+               return;
 
-               ocelot_port_add_txtstamp_skb(ocelot, port, clone);
+       if (ocelot_port_txtstamp_request(ocelot, port, skb, &clone))
+               return;
+
+       if (clone)
                OCELOT_SKB_CB(skb)->clone = clone;
-       }
 }
 
 static int felix_change_mtu(struct dsa_switch *ds, int port, int new_mtu)
 
 }
 EXPORT_SYMBOL(ocelot_port_disable);
 
-void ocelot_port_add_txtstamp_skb(struct ocelot *ocelot, int port,
-                                 struct sk_buff *clone)
+static void ocelot_port_add_txtstamp_skb(struct ocelot *ocelot, int port,
+                                        struct sk_buff *clone)
 {
        struct ocelot_port *ocelot_port = ocelot->ports[port];
 
 
        spin_unlock(&ocelot_port->ts_id_lock);
 }
-EXPORT_SYMBOL(ocelot_port_add_txtstamp_skb);
+
+int ocelot_port_txtstamp_request(struct ocelot *ocelot, int port,
+                                struct sk_buff *skb,
+                                struct sk_buff **clone)
+{
+       struct ocelot_port *ocelot_port = ocelot->ports[port];
+       u8 ptp_cmd = ocelot_port->ptp_cmd;
+
+       if (ptp_cmd == IFH_REW_OP_TWO_STEP_PTP) {
+               *clone = skb_clone_sk(skb);
+               if (!(*clone))
+                       return -ENOMEM;
+
+               ocelot_port_add_txtstamp_skb(ocelot, port, *clone);
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL(ocelot_port_txtstamp_request);
 
 static void ocelot_get_hwtimestamp(struct ocelot *ocelot,
                                   struct timespec64 *ts)
 
 
        /* Check if timestamping is needed */
        if (ocelot->ptp && (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) {
-               rew_op = ocelot_port->ptp_cmd;
+               struct sk_buff *clone = NULL;
 
-               if (ocelot_port->ptp_cmd == IFH_REW_OP_TWO_STEP_PTP) {
-                       struct sk_buff *clone;
-
-                       clone = skb_clone_sk(skb);
-                       if (!clone) {
-                               kfree_skb(skb);
-                               return NETDEV_TX_OK;
-                       }
-
-                       ocelot_port_add_txtstamp_skb(ocelot, port, clone);
+               if (ocelot_port_txtstamp_request(ocelot, port, skb, &clone)) {
+                       kfree_skb(skb);
+                       return NETDEV_TX_OK;
+               }
 
+               if (ocelot_port->ptp_cmd == IFH_REW_OP_TWO_STEP_PTP) {
+                       rew_op = ocelot_port->ptp_cmd;
                        rew_op |= OCELOT_SKB_CB(clone)->ts_id << 3;
                }
        }
 
 int ocelot_vlan_del(struct ocelot *ocelot, int port, u16 vid);
 int ocelot_hwstamp_get(struct ocelot *ocelot, int port, struct ifreq *ifr);
 int ocelot_hwstamp_set(struct ocelot *ocelot, int port, struct ifreq *ifr);
-void ocelot_port_add_txtstamp_skb(struct ocelot *ocelot, int port,
-                                 struct sk_buff *clone);
+int ocelot_port_txtstamp_request(struct ocelot *ocelot, int port,
+                                struct sk_buff *skb,
+                                struct sk_buff **clone);
 void ocelot_get_txtstamp(struct ocelot *ocelot);
 void ocelot_port_set_maxlen(struct ocelot *ocelot, int port, size_t sdu);
 int ocelot_get_max_mtu(struct ocelot *ocelot, int port);