net: mscc: ocelot: convert to ocelot_port_txtstamp_request()
authorYangbo Lu <yangbo.lu@nxp.com>
Tue, 27 Apr 2021 04:22:02 +0000 (12:22 +0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 27 Apr 2021 21:10:15 +0000 (14:10 -0700)
Convert to a common ocelot_port_txtstamp_request() for TX timestamp
request handling.

Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Acked-by: Richard Cochran <richardcochran@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/ocelot/felix.c
drivers/net/ethernet/mscc/ocelot.c
drivers/net/ethernet/mscc/ocelot_net.c
include/soc/mscc/ocelot.h

index b28280b..ce607fb 100644 (file)
@@ -1399,17 +1399,16 @@ static void felix_txtstamp(struct dsa_switch *ds, int port,
                           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)
index 7da2dd1..3ff4cce 100644 (file)
@@ -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)
index 789a5fb..e99c8fb 100644 (file)
@@ -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 = 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;
                }
        }
index f075aaf..f763251 100644 (file)
@@ -828,8 +828,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);