diff options
-rw-r--r-- | drivers/net/dsa/sja1105/sja1105_main.c | 9 | ||||
-rw-r--r-- | net/dsa/tag_sja1105.c | 18 |
2 files changed, 18 insertions, 9 deletions
diff --git a/drivers/net/dsa/sja1105/sja1105_main.c b/drivers/net/dsa/sja1105/sja1105_main.c index ecb54b828593..ea854ea903d1 100644 --- a/drivers/net/dsa/sja1105/sja1105_main.c +++ b/drivers/net/dsa/sja1105/sja1105_main.c @@ -392,11 +392,11 @@ static int sja1105_init_general_params(struct sja1105_private *priv) .hostprio = 0, .mac_fltres1 = SJA1105_LINKLOCAL_FILTER_A, .mac_flt1 = SJA1105_LINKLOCAL_FILTER_A_MASK, - .incl_srcpt1 = true, + .incl_srcpt1 = false, .send_meta1 = false, .mac_fltres0 = SJA1105_LINKLOCAL_FILTER_B, .mac_flt0 = SJA1105_LINKLOCAL_FILTER_B_MASK, - .incl_srcpt0 = true, + .incl_srcpt0 = false, .send_meta0 = false, /* The destination for traffic matching mac_fltres1 and * mac_fltres0 on all ports except host_port. Such traffic @@ -1435,6 +1435,11 @@ static int sja1105_vlan_filtering(struct dsa_switch *ds, int port, bool enabled) general_params->tpid = tpid; /* EtherType used to identify inner tagged (C-tag) VLAN traffic */ general_params->tpid2 = tpid2; + /* When VLAN filtering is on, we need to at least be able to + * decode management traffic through the "backup plan". + */ + general_params->incl_srcpt1 = enabled; + general_params->incl_srcpt0 = enabled; rc = sja1105_static_config_reload(priv); if (rc) diff --git a/net/dsa/tag_sja1105.c b/net/dsa/tag_sja1105.c index 77eeea004e92..cd8e0bfb5e75 100644 --- a/net/dsa/tag_sja1105.c +++ b/net/dsa/tag_sja1105.c @@ -69,15 +69,24 @@ static struct sk_buff *sja1105_rcv(struct sk_buff *skb, int source_port, switch_id; struct vlan_ethhdr *hdr; u16 tpid, vid, tci; + bool is_link_local; bool is_tagged; hdr = vlan_eth_hdr(skb); tpid = ntohs(hdr->h_vlan_proto); is_tagged = (tpid == ETH_P_SJA1105); + is_link_local = sja1105_is_link_local(skb); skb->offload_fwd_mark = 1; - if (sja1105_is_link_local(skb)) { + if (is_tagged) { + /* Normal traffic path. */ + tci = ntohs(hdr->h_vlan_TCI); + vid = tci & VLAN_VID_MASK; + source_port = dsa_8021q_rx_source_port(vid); + switch_id = dsa_8021q_rx_switch_id(vid); + skb->priority = (tci & VLAN_PRIO_MASK) >> VLAN_PRIO_SHIFT; + } else if (is_link_local) { /* Management traffic path. Switch embeds the switch ID and * port ID into bytes of the destination MAC, courtesy of * the incl_srcpt options. @@ -88,12 +97,7 @@ static struct sk_buff *sja1105_rcv(struct sk_buff *skb, hdr->h_dest[3] = 0; hdr->h_dest[4] = 0; } else { - /* Normal traffic path. */ - tci = ntohs(hdr->h_vlan_TCI); - vid = tci & VLAN_VID_MASK; - source_port = dsa_8021q_rx_source_port(vid); - switch_id = dsa_8021q_rx_switch_id(vid); - skb->priority = (tci & VLAN_PRIO_MASK) >> VLAN_PRIO_SHIFT; + return NULL; } skb->dev = dsa_master_find_slave(netdev, switch_id, source_port); |