net: dsa: Relocate master ethtool operations
authorFlorian Fainelli <f.fainelli@gmail.com>
Tue, 13 Jun 2017 20:27:20 +0000 (13:27 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 13 Jun 2017 20:35:02 +0000 (16:35 -0400)
Relocate master_ethtool_ops and master_orig_ethtool_ops into struct
dsa_port in order to be both consistent, and make things self contained
within the dsa_port structure.

This is a preliminary change to supporting multiple CPU port interfaces.

Reviewed-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/dsa.h
net/dsa/dsa.c
net/dsa/slave.c

index b2fb53f5e28e95eb34dd38f92b788db2bbf346d0..7e93869819f926f0723fa15cd4819c34910a915b 100644 (file)
@@ -122,24 +122,12 @@ struct dsa_switch_tree {
         */
        struct dsa_platform_data        *pd;
 
-       /*
-        * Reference to network device to use, and which tagging
-        * protocol to use.
-        */
-       struct net_device       *master_netdev;
-
        /* Copy of tag_ops->rcv for faster access in hot path */
        struct sk_buff *        (*rcv)(struct sk_buff *skb,
                                       struct net_device *dev,
                                       struct packet_type *pt,
                                       struct net_device *orig_dev);
 
-       /*
-        * Original copy of the master netdev ethtool_ops
-        */
-       struct ethtool_ops      master_ethtool_ops;
-       const struct ethtool_ops *master_orig_ethtool_ops;
-
        /*
         * The switch port to which the CPU is attached.
         */
@@ -189,6 +177,11 @@ struct dsa_port {
        u8                      stp_state;
        struct net_device       *bridge_dev;
        struct devlink_port     devlink_port;
+       /*
+        * Original copy of the master netdev ethtool_ops
+        */
+       struct ethtool_ops      ethtool_ops;
+       const struct ethtool_ops *orig_ethtool_ops;
 };
 
 struct dsa_switch {
index 6aacc2314a8f8914391df72669bb0a57abdcadd6..416ac4ef9ba9c5d77f36e6902cf031628f72cc05 100644 (file)
@@ -118,15 +118,16 @@ int dsa_cpu_port_ethtool_setup(struct dsa_port *cpu_dp)
        struct net_device *master;
        struct ethtool_ops *cpu_ops;
 
-       master = ds->dst->cpu_dp->netdev;
+       master = cpu_dp->netdev;
+
        cpu_ops = devm_kzalloc(ds->dev, sizeof(*cpu_ops), GFP_KERNEL);
        if (!cpu_ops)
                return -ENOMEM;
 
-       memcpy(&ds->dst->master_ethtool_ops, master->ethtool_ops,
+       memcpy(&cpu_dp->ethtool_ops, master->ethtool_ops,
               sizeof(struct ethtool_ops));
-       ds->dst->master_orig_ethtool_ops = master->ethtool_ops;
-       memcpy(cpu_ops, &ds->dst->master_ethtool_ops,
+       cpu_dp->orig_ethtool_ops = master->ethtool_ops;
+       memcpy(cpu_ops, &cpu_dp->ethtool_ops,
               sizeof(struct ethtool_ops));
        dsa_cpu_port_ethtool_init(cpu_ops);
        master->ethtool_ops = cpu_ops;
@@ -136,12 +137,7 @@ int dsa_cpu_port_ethtool_setup(struct dsa_port *cpu_dp)
 
 void dsa_cpu_port_ethtool_restore(struct dsa_port *cpu_dp)
 {
-       struct dsa_switch *ds = cpu_dp->ds;
-       struct net_device *master;
-
-       master = ds->dst->cpu_dp->netdev;
-
-       master->ethtool_ops = ds->dst->master_orig_ethtool_ops;
+       cpu_dp->netdev->ethtool_ops = cpu_dp->orig_ethtool_ops;
 }
 
 void dsa_cpu_dsa_destroy(struct dsa_port *port)
index 658bc67c532016b8341ebbf0b8229eb094e2a200..9bf4c27f33930e7284eee22ef1b32f43d8314f7b 100644 (file)
@@ -524,10 +524,10 @@ static void dsa_cpu_port_get_ethtool_stats(struct net_device *dev,
        s8 cpu_port = dst->cpu_dp->index;
        int count = 0;
 
-       if (dst->master_ethtool_ops.get_sset_count) {
-               count = dst->master_ethtool_ops.get_sset_count(dev,
+       if (dst->cpu_dp->ethtool_ops.get_sset_count) {
+               count = dst->cpu_dp->ethtool_ops.get_sset_count(dev,
                                                               ETH_SS_STATS);
-               dst->master_ethtool_ops.get_ethtool_stats(dev, stats, data);
+               dst->cpu_dp->ethtool_ops.get_ethtool_stats(dev, stats, data);
        }
 
        if (ds->ops->get_ethtool_stats)
@@ -540,8 +540,8 @@ static int dsa_cpu_port_get_sset_count(struct net_device *dev, int sset)
        struct dsa_switch *ds = dst->cpu_dp->ds;
        int count = 0;
 
-       if (dst->master_ethtool_ops.get_sset_count)
-               count += dst->master_ethtool_ops.get_sset_count(dev, sset);
+       if (dst->cpu_dp->ethtool_ops.get_sset_count)
+               count += dst->cpu_dp->ethtool_ops.get_sset_count(dev, sset);
 
        if (sset == ETH_SS_STATS && ds->ops->get_sset_count)
                count += ds->ops->get_sset_count(ds);
@@ -565,10 +565,10 @@ static void dsa_cpu_port_get_strings(struct net_device *dev,
        /* We do not want to be NULL-terminated, since this is a prefix */
        pfx[sizeof(pfx) - 1] = '_';
 
-       if (dst->master_ethtool_ops.get_sset_count) {
-               mcount = dst->master_ethtool_ops.get_sset_count(dev,
+       if (dst->cpu_dp->ethtool_ops.get_sset_count) {
+               mcount = dst->cpu_dp->ethtool_ops.get_sset_count(dev,
                                                                ETH_SS_STATS);
-               dst->master_ethtool_ops.get_strings(dev, stringset, data);
+               dst->cpu_dp->ethtool_ops.get_strings(dev, stringset, data);
        }
 
        if (stringset == ETH_SS_STATS && ds->ops->get_strings) {