Commit 9f6bd8fa authored by Mugunthan V N's avatar Mugunthan V N Committed by David S. Miller

drivers: net: cpsw: fix cpsw hung with add vlan using vconfig

while adding vlan in dual EMAC mode, only specific ports should be
subscribed for the vlan, else it will lead to switching mode and
if both ports connected to same switch cpsw will hung as it creates
a network loop. Fixing this by adding only specific ports in case
of dual EMAC.
Signed-off-by: default avatarMugunthan V N <mugunthanvnm@ti.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 16dde0d6
...@@ -1634,16 +1634,24 @@ static inline int cpsw_add_vlan_ale_entry(struct cpsw_priv *priv, ...@@ -1634,16 +1634,24 @@ static inline int cpsw_add_vlan_ale_entry(struct cpsw_priv *priv,
unsigned short vid) unsigned short vid)
{ {
int ret; int ret;
int unreg_mcast_mask; int unreg_mcast_mask = 0;
u32 port_mask;
if (priv->ndev->flags & IFF_ALLMULTI) if (priv->data.dual_emac) {
unreg_mcast_mask = ALE_ALL_PORTS; port_mask = (1 << (priv->emac_port + 1)) | ALE_PORT_HOST;
else
unreg_mcast_mask = ALE_PORT_1 | ALE_PORT_2; if (priv->ndev->flags & IFF_ALLMULTI)
unreg_mcast_mask = port_mask;
} else {
port_mask = ALE_ALL_PORTS;
if (priv->ndev->flags & IFF_ALLMULTI)
unreg_mcast_mask = ALE_ALL_PORTS;
else
unreg_mcast_mask = ALE_PORT_1 | ALE_PORT_2;
}
ret = cpsw_ale_add_vlan(priv->ale, vid, ret = cpsw_ale_add_vlan(priv->ale, vid, port_mask, 0, port_mask,
ALE_ALL_PORTS << priv->host_port,
0, ALE_ALL_PORTS << priv->host_port,
unreg_mcast_mask << priv->host_port); unreg_mcast_mask << priv->host_port);
if (ret != 0) if (ret != 0)
return ret; return ret;
...@@ -1654,8 +1662,7 @@ static inline int cpsw_add_vlan_ale_entry(struct cpsw_priv *priv, ...@@ -1654,8 +1662,7 @@ static inline int cpsw_add_vlan_ale_entry(struct cpsw_priv *priv,
goto clean_vid; goto clean_vid;
ret = cpsw_ale_add_mcast(priv->ale, priv->ndev->broadcast, ret = cpsw_ale_add_mcast(priv->ale, priv->ndev->broadcast,
ALE_ALL_PORTS << priv->host_port, port_mask, ALE_VLAN, vid, 0);
ALE_VLAN, vid, 0);
if (ret != 0) if (ret != 0)
goto clean_vlan_ucast; goto clean_vlan_ucast;
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment