Convert to a common ocelot_port_txtstamp_request() for TX timestamp
request handling.

Signed-off-by: Yangbo Lu <yangbo...@nxp.com>
---
 drivers/net/dsa/ocelot/felix.c         | 14 +++++---------
 drivers/net/ethernet/mscc/ocelot.c     | 24 +++++++++++++++++++++---
 drivers/net/ethernet/mscc/ocelot_net.c | 18 +++++++-----------
 include/soc/mscc/ocelot.h              |  5 +++--
 4 files changed, 36 insertions(+), 25 deletions(-)

diff --git a/drivers/net/dsa/ocelot/felix.c b/drivers/net/dsa/ocelot/felix.c
index cdec2f5e271c..5f2cf0f31253 100644
--- a/drivers/net/dsa/ocelot/felix.c
+++ b/drivers/net/dsa/ocelot/felix.c
@@ -1399,18 +1399,14 @@ static bool felix_txtstamp(struct dsa_switch *ds, int 
port,
                           struct sk_buff *skb, struct sk_buff **clone)
 {
        struct ocelot *ocelot = ds->priv;
-       struct ocelot_port *ocelot_port = ocelot->ports[port];
 
-       if (ocelot->ptp && ocelot_port->ptp_cmd == IFH_REW_OP_TWO_STEP_PTP) {
-               *clone = skb_clone_sk(skb);
-               if (!(*clone))
-                       return false;
+       if (!ocelot->ptp)
+               return false;
 
-               ocelot_port_add_txtstamp_skb(ocelot, port, *clone);
-               return true;
-       }
+       if (ocelot_port_txtstamp_request(ocelot, port, skb, clone))
+               return false;
 
-       return false;
+       return true;
 }
 
 static int felix_change_mtu(struct dsa_switch *ds, int port, int new_mtu)
diff --git a/drivers/net/ethernet/mscc/ocelot.c 
b/drivers/net/ethernet/mscc/ocelot.c
index 8d06ffaf318a..541d3b4076be 100644
--- a/drivers/net/ethernet/mscc/ocelot.c
+++ b/drivers/net/ethernet/mscc/ocelot.c
@@ -530,8 +530,8 @@ void ocelot_port_disable(struct ocelot *ocelot, int port)
 }
 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];
 
@@ -545,7 +545,25 @@ void ocelot_port_add_txtstamp_skb(struct ocelot *ocelot, 
int 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)
diff --git a/drivers/net/ethernet/mscc/ocelot_net.c 
b/drivers/net/ethernet/mscc/ocelot_net.c
index 36f32a4d9b0f..8293152a6dc1 100644
--- a/drivers/net/ethernet/mscc/ocelot_net.c
+++ b/drivers/net/ethernet/mscc/ocelot_net.c
@@ -507,19 +507,15 @@ static netdev_tx_t ocelot_port_xmit(struct sk_buff *skb, 
struct net_device *dev)
 
        /* 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;
 
-               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 |= clone->cb[0] << 3;
                }
        }
diff --git a/include/soc/mscc/ocelot.h b/include/soc/mscc/ocelot.h
index 68cdc7ceaf4d..9cdaf1d9199f 100644
--- a/include/soc/mscc/ocelot.h
+++ b/include/soc/mscc/ocelot.h
@@ -820,8 +820,9 @@ int ocelot_vlan_add(struct ocelot *ocelot, int port, u16 
vid, bool pvid,
 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);
-- 
2.25.1

Reply via email to