aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/layerscape/patches-5.4/701-net-0245-net-mscc-ocelot-refactor-ethtool-callbacks.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/layerscape/patches-5.4/701-net-0245-net-mscc-ocelot-refactor-ethtool-callbacks.patch')
-rw-r--r--target/linux/layerscape/patches-5.4/701-net-0245-net-mscc-ocelot-refactor-ethtool-callbacks.patch133
1 files changed, 133 insertions, 0 deletions
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 0000000000..655f60b6d9
--- /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
+@@ -1191,10 +1191,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)
+@@ -1205,6 +1204,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;
+@@ -1245,12 +1254,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 */
+@@ -1261,25 +1266,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 |
+@@ -1295,13 +1312,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,