aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/layerscape/patches-5.4/701-net-0267-net-mscc-ocelot-convert-to-use-ocelot_port_add_txtst.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/layerscape/patches-5.4/701-net-0267-net-mscc-ocelot-convert-to-use-ocelot_port_add_txtst.patch')
-rw-r--r--target/linux/layerscape/patches-5.4/701-net-0267-net-mscc-ocelot-convert-to-use-ocelot_port_add_txtst.patch93
1 files changed, 93 insertions, 0 deletions
diff --git a/target/linux/layerscape/patches-5.4/701-net-0267-net-mscc-ocelot-convert-to-use-ocelot_port_add_txtst.patch b/target/linux/layerscape/patches-5.4/701-net-0267-net-mscc-ocelot-convert-to-use-ocelot_port_add_txtst.patch
new file mode 100644
index 0000000000..988c90e79d
--- /dev/null
+++ b/target/linux/layerscape/patches-5.4/701-net-0267-net-mscc-ocelot-convert-to-use-ocelot_port_add_txtst.patch
@@ -0,0 +1,93 @@
+From c0c92f8d9a093faf64397b1874f074e071a5b4e2 Mon Sep 17 00:00:00 2001
+From: Yangbo Lu <yangbo.lu@nxp.com>
+Date: Wed, 20 Nov 2019 16:23:16 +0800
+Subject: [PATCH] net: mscc: ocelot: convert to use
+ ocelot_port_add_txtstamp_skb()
+
+Convert to use ocelot_port_add_txtstamp_skb() for adding skbs which
+require TX timestamp into list. Export it so that DSA Felix driver
+could reuse it too.
+
+Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
+Reviewed-by: Andrew Lunn <andrew@lunn.ch>
+Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mscc/ocelot.c | 43 ++++++++++++++++++++++++--------------
+ include/soc/mscc/ocelot.h | 2 ++
+ 2 files changed, 29 insertions(+), 16 deletions(-)
+
+--- a/drivers/net/ethernet/mscc/ocelot.c
++++ b/drivers/net/ethernet/mscc/ocelot.c
+@@ -575,6 +575,32 @@ static int ocelot_gen_ifh(u32 *ifh, stru
+ return 0;
+ }
+
++int ocelot_port_add_txtstamp_skb(struct ocelot_port *ocelot_port,
++ struct sk_buff *skb)
++{
++ struct skb_shared_info *shinfo = skb_shinfo(skb);
++ struct ocelot *ocelot = ocelot_port->ocelot;
++
++ if (ocelot->ptp && shinfo->tx_flags & SKBTX_HW_TSTAMP &&
++ ocelot_port->ptp_cmd == IFH_REW_OP_TWO_STEP_PTP) {
++ struct ocelot_skb *oskb =
++ kzalloc(sizeof(struct ocelot_skb), GFP_ATOMIC);
++
++ if (unlikely(!oskb))
++ return -ENOMEM;
++
++ shinfo->tx_flags |= SKBTX_IN_PROGRESS;
++
++ oskb->skb = skb;
++ oskb->id = ocelot_port->ts_id % 4;
++
++ list_add_tail(&oskb->head, &ocelot_port->skbs);
++ return 0;
++ }
++ return -ENODATA;
++}
++EXPORT_SYMBOL(ocelot_port_add_txtstamp_skb);
++
+ static int ocelot_port_xmit(struct sk_buff *skb, struct net_device *dev)
+ {
+ struct ocelot_port_private *priv = netdev_priv(dev);
+@@ -637,26 +663,11 @@ static int ocelot_port_xmit(struct sk_bu
+ dev->stats.tx_packets++;
+ dev->stats.tx_bytes += skb->len;
+
+- if (ocelot->ptp && shinfo->tx_flags & SKBTX_HW_TSTAMP &&
+- ocelot_port->ptp_cmd == IFH_REW_OP_TWO_STEP_PTP) {
+- struct ocelot_skb *oskb =
+- kzalloc(sizeof(struct ocelot_skb), GFP_ATOMIC);
+-
+- if (unlikely(!oskb))
+- goto out;
+-
+- skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
+-
+- oskb->skb = skb;
+- oskb->id = ocelot_port->ts_id % 4;
++ if (!ocelot_port_add_txtstamp_skb(ocelot_port, skb)) {
+ ocelot_port->ts_id++;
+-
+- list_add_tail(&oskb->head, &ocelot_port->skbs);
+-
+ return NETDEV_TX_OK;
+ }
+
+-out:
+ dev_kfree_skb_any(skb);
+ return NETDEV_TX_OK;
+ }
+--- a/include/soc/mscc/ocelot.h
++++ b/include/soc/mscc/ocelot.h
+@@ -543,6 +543,8 @@ int ocelot_vlan_del(struct ocelot *ocelo
+ int ocelot_hwstamp_get(struct ocelot *ocelot, int port, struct ifreq *ifr);
+ int ocelot_hwstamp_set(struct ocelot *ocelot, int port, struct ifreq *ifr);
+ int ocelot_ptp_gettime64(struct ptp_clock_info *ptp, struct timespec64 *ts);
++int ocelot_port_add_txtstamp_skb(struct ocelot_port *ocelot_port,
++ struct sk_buff *skb);
+ void ocelot_get_txtstamp(struct ocelot *ocelot);
+
+ #endif