mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-23 23:32:14 +00:00
dsa: Split ops up, and avoid assigning tag_protocol and receive separately
This change addresses several issues. First, it was possible to set tag_protocol without setting the ops pointer. To correct that I have reordered things so that rcv is now populated before we set tag_protocol. Second, it didn't make much sense to keep setting the device ops each time a new slave was registered. So by moving the receive portion out into root switch initialization that issue should be addressed. Third, I wanted to avoid sending tags if the rcv pointer was not registered so I changed the tag check to verify if the rcv function pointer is set on the root tree. If it is then we start sending DSA tagged frames. Finally I split the device ops pointer in the structures into two spots. I placed the rcv function pointer in the root switch since this makes it easiest to access from there, and I placed the xmit function pointer in the slave for the same reason. Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
6cca9adb78
commit
5075314e4e
9 changed files with 71 additions and 54 deletions
|
@ -10,7 +10,6 @@
|
|||
*/
|
||||
|
||||
#include <linux/list.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/module.h>
|
||||
|
@ -154,9 +153,34 @@ dsa_switch_setup(struct dsa_switch_tree *dst, int index,
|
|||
* tagging protocol to the preferred tagging format of this
|
||||
* switch.
|
||||
*/
|
||||
if (ds->dst->cpu_switch == index)
|
||||
ds->dst->tag_protocol = drv->tag_protocol;
|
||||
if (dst->cpu_switch == index) {
|
||||
switch (drv->tag_protocol) {
|
||||
#ifdef CONFIG_NET_DSA_TAG_DSA
|
||||
case DSA_TAG_PROTO_DSA:
|
||||
dst->rcv = dsa_netdev_ops.rcv;
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_NET_DSA_TAG_EDSA
|
||||
case DSA_TAG_PROTO_EDSA:
|
||||
dst->rcv = edsa_netdev_ops.rcv;
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_NET_DSA_TAG_TRAILER
|
||||
case DSA_TAG_PROTO_TRAILER:
|
||||
dst->rcv = trailer_netdev_ops.rcv;
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_NET_DSA_TAG_BRCM
|
||||
case DSA_TAG_PROTO_BRCM:
|
||||
dst->rcv = brcm_netdev_ops.rcv;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
dst->tag_protocol = drv->tag_protocol;
|
||||
}
|
||||
|
||||
/*
|
||||
* Do basic register setup.
|
||||
|
@ -626,7 +650,7 @@ static int dsa_switch_rcv(struct sk_buff *skb, struct net_device *dev,
|
|||
return 0;
|
||||
}
|
||||
|
||||
return dst->ops->rcv(skb, dev, pt, orig_dev);
|
||||
return dst->rcv(skb, dev, pt, orig_dev);
|
||||
}
|
||||
|
||||
static struct packet_type dsa_pack_type __read_mostly = {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue