|
@@ -1634,16 +1634,24 @@ static inline int cpsw_add_vlan_ale_entry(struct cpsw_priv *priv,
|
|
|
unsigned short vid)
|
|
|
{
|
|
|
int ret;
|
|
|
- int unreg_mcast_mask;
|
|
|
+ int unreg_mcast_mask = 0;
|
|
|
+ u32 port_mask;
|
|
|
|
|
|
- if (priv->ndev->flags & IFF_ALLMULTI)
|
|
|
- unreg_mcast_mask = ALE_ALL_PORTS;
|
|
|
- else
|
|
|
- unreg_mcast_mask = ALE_PORT_1 | ALE_PORT_2;
|
|
|
+ if (priv->data.dual_emac) {
|
|
|
+ port_mask = (1 << (priv->emac_port + 1)) | ALE_PORT_HOST;
|
|
|
+
|
|
|
+ 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,
|
|
|
- ALE_ALL_PORTS << priv->host_port,
|
|
|
- 0, ALE_ALL_PORTS << priv->host_port,
|
|
|
+ ret = cpsw_ale_add_vlan(priv->ale, vid, port_mask, 0, port_mask,
|
|
|
unreg_mcast_mask << priv->host_port);
|
|
|
if (ret != 0)
|
|
|
return ret;
|
|
@@ -1654,8 +1662,7 @@ static inline int cpsw_add_vlan_ale_entry(struct cpsw_priv *priv,
|
|
|
goto clean_vid;
|
|
|
|
|
|
ret = cpsw_ale_add_mcast(priv->ale, priv->ndev->broadcast,
|
|
|
- ALE_ALL_PORTS << priv->host_port,
|
|
|
- ALE_VLAN, vid, 0);
|
|
|
+ port_mask, ALE_VLAN, vid, 0);
|
|
|
if (ret != 0)
|
|
|
goto clean_vlan_ucast;
|
|
|
return 0;
|