The DSA tagging protocol operations are specific to each CPU port,
thus the dsa_device_ops pointer belongs to the dsa_port structure.
>From now on assign a slave's xmit copy from its CPU port tagging
operations. This will ease the future support for multiple CPU ports.
Also keep the tag_ops at the beginning of the dsa_port structure so that
we ensure copies for hot path are in cacheline 1.
Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
 
 
 struct dsa_port {
+       /* CPU port tagging operations used by master or slave devices */
+       const struct dsa_device_ops *tag_ops;
+
        struct dsa_switch       *ds;
        unsigned int            index;
        const char              *name;
 
                return PTR_ERR(tag_ops);
        }
 
+       dst->cpu_dp->tag_ops = tag_ops;
        dst->tag_ops = tag_ops;
        dst->rcv = dst->tag_ops->rcv;
 
 
 };
 
 struct dsa_slave_priv {
-       /* Copy of dp->ds->dst->tag_ops->xmit for faster access in hot path */
+       /* Copy of CPU port xmit for faster access in slave transmit hot path */
        struct sk_buff *        (*xmit)(struct sk_buff *skb,
                                        struct net_device *dev);
 
 
                if (IS_ERR(tag_ops))
                        return PTR_ERR(tag_ops);
 
+               dst->cpu_dp->tag_ops = tag_ops;
                dst->tag_ops = tag_ops;
                dst->rcv = dst->tag_ops->rcv;
        }
 
 int dsa_slave_create(struct dsa_port *port, const char *name)
 {
        struct dsa_switch *ds = port->ds;
-       struct dsa_switch_tree *dst = ds->dst;
        struct net_device *master;
        struct net_device *slave_dev;
        struct dsa_slave_priv *p;
        }
        p->dp = port;
        INIT_LIST_HEAD(&p->mall_tc_list);
-       p->xmit = dst->tag_ops->xmit;
+       p->xmit = cpu_dp->tag_ops->xmit;
 
        p->old_pause = -1;
        p->old_link = -1;