layerscape: add patches-5.4
[openwrt/staging/wigyori.git] / target / linux / layerscape / patches-5.4 / 701-net-0267-net-mscc-ocelot-convert-to-use-ocelot_port_add_txtst.patch
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 (file)
index 0000000..988c90e
--- /dev/null
@@ -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