Loading drivers/net/ethernet/ti/cpsw.c +26 −32 Original line number Diff line number Diff line Loading @@ -565,40 +565,28 @@ static const struct cpsw_stats cpsw_gstrings_ch_stats[] = { (func)(slave++, ##arg); \ } while (0) #define cpsw_dual_emac_src_port_detect(cpsw, status, ndev, skb) \ do { \ if (!cpsw->data.dual_emac) \ break; \ if (CPDMA_RX_SOURCE_PORT(status) == 1) { \ ndev = cpsw->slaves[0].ndev; \ skb->dev = ndev; \ } else if (CPDMA_RX_SOURCE_PORT(status) == 2) { \ ndev = cpsw->slaves[1].ndev; \ skb->dev = ndev; \ } \ } while (0) #define cpsw_add_mcast(cpsw, priv, addr) \ do { \ if (cpsw->data.dual_emac) { \ struct cpsw_slave *slave = cpsw->slaves + \ priv->emac_port; \ int slave_port = cpsw_get_slave_port( \ slave->slave_num); \ cpsw_ale_add_mcast(cpsw->ale, addr, \ 1 << slave_port | ALE_PORT_HOST, \ ALE_VLAN, slave->port_vlan, 0); \ } else { \ cpsw_ale_add_mcast(cpsw->ale, addr, \ ALE_ALL_PORTS, \ 0, 0, 0); \ } \ } while (0) static inline int cpsw_get_slave_port(u32 slave_num) { return slave_num + 1; } static void cpsw_add_mcast(struct cpsw_priv *priv, u8 *addr) { struct cpsw_common *cpsw = priv->cpsw; if (cpsw->data.dual_emac) { struct cpsw_slave *slave = cpsw->slaves + priv->emac_port; int slave_port = cpsw_get_slave_port(slave->slave_num); cpsw_ale_add_mcast(cpsw->ale, addr, 1 << slave_port | ALE_PORT_HOST, ALE_VLAN, slave->port_vlan, 0); return; } cpsw_ale_add_mcast(cpsw->ale, addr, ALE_ALL_PORTS, 0, 0, 0); } static void cpsw_set_promiscious(struct net_device *ndev, bool enable) { struct cpsw_common *cpsw = ndev_to_cpsw(ndev); Loading Loading @@ -706,7 +694,7 @@ static void cpsw_ndo_set_rx_mode(struct net_device *ndev) /* program multicast address list into ALE register */ netdev_for_each_mc_addr(ha, ndev) { cpsw_add_mcast(cpsw, priv, (u8 *)ha->addr); cpsw_add_mcast(priv, ha->addr); } } } Loading Loading @@ -798,10 +786,16 @@ static void cpsw_rx_handler(void *token, int len, int status) struct sk_buff *skb = token; struct sk_buff *new_skb; struct net_device *ndev = skb->dev; int ret = 0; int ret = 0, port; struct cpsw_common *cpsw = ndev_to_cpsw(ndev); cpsw_dual_emac_src_port_detect(cpsw, status, ndev, skb); if (cpsw->data.dual_emac) { port = CPDMA_RX_SOURCE_PORT(status); if (port) { ndev = cpsw->slaves[--port].ndev; skb->dev = ndev; } } if (unlikely(status < 0) || unlikely(!netif_running(ndev))) { /* In dual emac mode check for all interfaces */ Loading Loading
drivers/net/ethernet/ti/cpsw.c +26 −32 Original line number Diff line number Diff line Loading @@ -565,40 +565,28 @@ static const struct cpsw_stats cpsw_gstrings_ch_stats[] = { (func)(slave++, ##arg); \ } while (0) #define cpsw_dual_emac_src_port_detect(cpsw, status, ndev, skb) \ do { \ if (!cpsw->data.dual_emac) \ break; \ if (CPDMA_RX_SOURCE_PORT(status) == 1) { \ ndev = cpsw->slaves[0].ndev; \ skb->dev = ndev; \ } else if (CPDMA_RX_SOURCE_PORT(status) == 2) { \ ndev = cpsw->slaves[1].ndev; \ skb->dev = ndev; \ } \ } while (0) #define cpsw_add_mcast(cpsw, priv, addr) \ do { \ if (cpsw->data.dual_emac) { \ struct cpsw_slave *slave = cpsw->slaves + \ priv->emac_port; \ int slave_port = cpsw_get_slave_port( \ slave->slave_num); \ cpsw_ale_add_mcast(cpsw->ale, addr, \ 1 << slave_port | ALE_PORT_HOST, \ ALE_VLAN, slave->port_vlan, 0); \ } else { \ cpsw_ale_add_mcast(cpsw->ale, addr, \ ALE_ALL_PORTS, \ 0, 0, 0); \ } \ } while (0) static inline int cpsw_get_slave_port(u32 slave_num) { return slave_num + 1; } static void cpsw_add_mcast(struct cpsw_priv *priv, u8 *addr) { struct cpsw_common *cpsw = priv->cpsw; if (cpsw->data.dual_emac) { struct cpsw_slave *slave = cpsw->slaves + priv->emac_port; int slave_port = cpsw_get_slave_port(slave->slave_num); cpsw_ale_add_mcast(cpsw->ale, addr, 1 << slave_port | ALE_PORT_HOST, ALE_VLAN, slave->port_vlan, 0); return; } cpsw_ale_add_mcast(cpsw->ale, addr, ALE_ALL_PORTS, 0, 0, 0); } static void cpsw_set_promiscious(struct net_device *ndev, bool enable) { struct cpsw_common *cpsw = ndev_to_cpsw(ndev); Loading Loading @@ -706,7 +694,7 @@ static void cpsw_ndo_set_rx_mode(struct net_device *ndev) /* program multicast address list into ALE register */ netdev_for_each_mc_addr(ha, ndev) { cpsw_add_mcast(cpsw, priv, (u8 *)ha->addr); cpsw_add_mcast(priv, ha->addr); } } } Loading Loading @@ -798,10 +786,16 @@ static void cpsw_rx_handler(void *token, int len, int status) struct sk_buff *skb = token; struct sk_buff *new_skb; struct net_device *ndev = skb->dev; int ret = 0; int ret = 0, port; struct cpsw_common *cpsw = ndev_to_cpsw(ndev); cpsw_dual_emac_src_port_detect(cpsw, status, ndev, skb); if (cpsw->data.dual_emac) { port = CPDMA_RX_SOURCE_PORT(status); if (port) { ndev = cpsw->slaves[--port].ndev; skb->dev = ndev; } } if (unlikely(status < 0) || unlikely(!netif_running(ndev))) { /* In dual emac mode check for all interfaces */ Loading