ASR_BASE

Change-Id: Icf3719cc0afe3eeb3edc7fa80a2eb5199ca9dda1
diff --git a/target/linux/layerscape/patches-5.4/701-net-0245-net-mscc-ocelot-refactor-ethtool-callbacks.patch b/target/linux/layerscape/patches-5.4/701-net-0245-net-mscc-ocelot-refactor-ethtool-callbacks.patch
new file mode 100644
index 0000000..7b979d5
--- /dev/null
+++ b/target/linux/layerscape/patches-5.4/701-net-0245-net-mscc-ocelot-refactor-ethtool-callbacks.patch
@@ -0,0 +1,133 @@
+From a155893c9c272b2ed1dc3b236d55ca8f651a6ea1 Mon Sep 17 00:00:00 2001
+From: Vladimir Oltean <vladimir.oltean@nxp.com>
+Date: Sat, 9 Nov 2019 15:02:54 +0200
+Subject: [PATCH] net: mscc: ocelot: refactor ethtool callbacks
+
+Convert them into an implementation that can be called from DSA as well.
+
+Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mscc/ocelot.c | 64 ++++++++++++++++++++++++++++----------
+ 1 file changed, 47 insertions(+), 17 deletions(-)
+
+--- a/drivers/net/ethernet/mscc/ocelot.c
++++ b/drivers/net/ethernet/mscc/ocelot.c
+@@ -1185,10 +1185,9 @@ static const struct net_device_ops ocelo
+ 	.ndo_do_ioctl			= ocelot_ioctl,
+ };
+ 
+-static void ocelot_get_strings(struct net_device *netdev, u32 sset, u8 *data)
++static void ocelot_get_strings(struct ocelot *ocelot, int port, u32 sset,
++			       u8 *data)
+ {
+-	struct ocelot_port_private *priv = netdev_priv(netdev);
+-	struct ocelot *ocelot = priv->port.ocelot;
+ 	int i;
+ 
+ 	if (sset != ETH_SS_STATS)
+@@ -1199,6 +1198,16 @@ static void ocelot_get_strings(struct ne
+ 		       ETH_GSTRING_LEN);
+ }
+ 
++static void ocelot_port_get_strings(struct net_device *netdev, u32 sset,
++				    u8 *data)
++{
++	struct ocelot_port_private *priv = netdev_priv(netdev);
++	struct ocelot *ocelot = priv->port.ocelot;
++	int port = priv->chip_port;
++
++	ocelot_get_strings(ocelot, port, sset, data);
++}
++
+ static void ocelot_update_stats(struct ocelot *ocelot)
+ {
+ 	int i, j;
+@@ -1239,12 +1248,8 @@ static void ocelot_check_stats_work(stru
+ 			   OCELOT_STATS_CHECK_DELAY);
+ }
+ 
+-static void ocelot_get_ethtool_stats(struct net_device *dev,
+-				     struct ethtool_stats *stats, u64 *data)
++static void ocelot_get_ethtool_stats(struct ocelot *ocelot, int port, u64 *data)
+ {
+-	struct ocelot_port_private *priv = netdev_priv(dev);
+-	struct ocelot *ocelot = priv->port.ocelot;
+-	int port = priv->chip_port;
+ 	int i;
+ 
+ 	/* check and update now */
+@@ -1255,25 +1260,37 @@ static void ocelot_get_ethtool_stats(str
+ 		*data++ = ocelot->stats[port * ocelot->num_stats + i];
+ }
+ 
+-static int ocelot_get_sset_count(struct net_device *dev, int sset)
++static void ocelot_port_get_ethtool_stats(struct net_device *dev,
++					  struct ethtool_stats *stats,
++					  u64 *data)
+ {
+ 	struct ocelot_port_private *priv = netdev_priv(dev);
+ 	struct ocelot *ocelot = priv->port.ocelot;
++	int port = priv->chip_port;
+ 
++	ocelot_get_ethtool_stats(ocelot, port, data);
++}
++
++static int ocelot_get_sset_count(struct ocelot *ocelot, int port, int sset)
++{
+ 	if (sset != ETH_SS_STATS)
+ 		return -EOPNOTSUPP;
++
+ 	return ocelot->num_stats;
+ }
+ 
+-static int ocelot_get_ts_info(struct net_device *dev,
+-			      struct ethtool_ts_info *info)
++static int ocelot_port_get_sset_count(struct net_device *dev, int sset)
+ {
+ 	struct ocelot_port_private *priv = netdev_priv(dev);
+ 	struct ocelot *ocelot = priv->port.ocelot;
++	int port = priv->chip_port;
+ 
+-	if (!ocelot->ptp)
+-		return ethtool_op_get_ts_info(dev, info);
++	return ocelot_get_sset_count(ocelot, port, sset);
++}
+ 
++static int ocelot_get_ts_info(struct ocelot *ocelot, int port,
++			      struct ethtool_ts_info *info)
++{
+ 	info->phc_index = ocelot->ptp_clock ?
+ 			  ptp_clock_index(ocelot->ptp_clock) : -1;
+ 	info->so_timestamping |= SOF_TIMESTAMPING_TX_SOFTWARE |
+@@ -1292,13 +1309,26 @@ static int ocelot_get_ts_info(struct net
+ 	return 0;
+ }
+ 
++static int ocelot_port_get_ts_info(struct net_device *dev,
++				   struct ethtool_ts_info *info)
++{
++	struct ocelot_port_private *priv = netdev_priv(dev);
++	struct ocelot *ocelot = priv->port.ocelot;
++	int port = priv->chip_port;
++
++	if (!ocelot->ptp)
++		return ethtool_op_get_ts_info(dev, info);
++
++	return ocelot_get_ts_info(ocelot, port, info);
++}
++
+ static const struct ethtool_ops ocelot_ethtool_ops = {
+-	.get_strings		= ocelot_get_strings,
+-	.get_ethtool_stats	= ocelot_get_ethtool_stats,
+-	.get_sset_count		= ocelot_get_sset_count,
++	.get_strings		= ocelot_port_get_strings,
++	.get_ethtool_stats	= ocelot_port_get_ethtool_stats,
++	.get_sset_count		= ocelot_port_get_sset_count,
+ 	.get_link_ksettings	= phy_ethtool_get_link_ksettings,
+ 	.set_link_ksettings	= phy_ethtool_set_link_ksettings,
+-	.get_ts_info		= ocelot_get_ts_info,
++	.get_ts_info		= ocelot_port_get_ts_info,
+ };
+ 
+ static void ocelot_bridge_stp_state_set(struct ocelot *ocelot, int port,