diff options
author | Jiri Pirko <jpirko@redhat.com> | 2010-02-17 19:42:54 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-02-18 17:47:49 -0500 |
commit | 5508590c193661bc1484ad7b952af5fceacea40d (patch) | |
tree | 8b7d1655f63034725127b9456afa5bad4bb6e83a | |
parent | 2a0d18f97cc15d57ad0c93259a3df4cb72c5a28b (diff) |
net: convert multiple drivers to use netdev_for_each_mc_addr, part2
Signed-off-by: Jiri Pirko <jpirko@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/s2io.c | 5 | ||||
-rw-r--r-- | drivers/net/sb1250-mac.c | 6 | ||||
-rw-r--r-- | drivers/net/sc92031.c | 2 | ||||
-rw-r--r-- | drivers/net/sfc/efx.c | 6 | ||||
-rw-r--r-- | drivers/net/sis190.c | 4 | ||||
-rw-r--r-- | drivers/net/sis900.c | 5 | ||||
-rw-r--r-- | drivers/net/skfp/skfddi.c | 10 | ||||
-rw-r--r-- | drivers/net/skge.c | 10 | ||||
-rw-r--r-- | drivers/net/sky2.c | 5 | ||||
-rw-r--r-- | drivers/net/smsc9420.c | 5 | ||||
-rw-r--r-- | drivers/net/sonic.c | 7 | ||||
-rw-r--r-- | drivers/net/spider_net.c | 2 | ||||
-rw-r--r-- | drivers/net/starfire.c | 4 | ||||
-rw-r--r-- | drivers/net/stmmac/dwmac100.c | 4 | ||||
-rw-r--r-- | drivers/net/stmmac/dwmac1000_core.c | 4 | ||||
-rw-r--r-- | drivers/net/sun3_82586.c | 8 | ||||
-rw-r--r-- | drivers/net/sunbmac.c | 5 | ||||
-rw-r--r-- | drivers/net/sundance.c | 3 | ||||
-rw-r--r-- | drivers/net/sungem.c | 10 | ||||
-rw-r--r-- | drivers/net/sunhme.c | 20 | ||||
-rw-r--r-- | drivers/net/sunlance.c | 6 | ||||
-rw-r--r-- | drivers/net/sunqe.c | 9 | ||||
-rw-r--r-- | drivers/net/sunvnet.c | 2 |
23 files changed, 55 insertions, 87 deletions
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c index 102be16e9b52..43bc66aa8405 100644 --- a/drivers/net/s2io.c +++ b/drivers/net/s2io.c | |||
@@ -5092,8 +5092,8 @@ static void s2io_set_multicast(struct net_device *dev) | |||
5092 | } | 5092 | } |
5093 | 5093 | ||
5094 | /* Create the new Rx filter list and update the same in H/W. */ | 5094 | /* Create the new Rx filter list and update the same in H/W. */ |
5095 | for (i = 0, mclist = dev->mc_list; i < netdev_mc_count(dev); | 5095 | i = 0; |
5096 | i++, mclist = mclist->next) { | 5096 | netdev_for_each_mc_addr(mclist, dev) { |
5097 | memcpy(sp->usr_addrs[i].addr, mclist->dmi_addr, | 5097 | memcpy(sp->usr_addrs[i].addr, mclist->dmi_addr, |
5098 | ETH_ALEN); | 5098 | ETH_ALEN); |
5099 | mac_addr = 0; | 5099 | mac_addr = 0; |
@@ -5121,6 +5121,7 @@ static void s2io_set_multicast(struct net_device *dev) | |||
5121 | dev->name); | 5121 | dev->name); |
5122 | return; | 5122 | return; |
5123 | } | 5123 | } |
5124 | i++; | ||
5124 | } | 5125 | } |
5125 | } | 5126 | } |
5126 | } | 5127 | } |
diff --git a/drivers/net/sb1250-mac.c b/drivers/net/sb1250-mac.c index 564d4d7f855b..9944e5d662c0 100644 --- a/drivers/net/sb1250-mac.c +++ b/drivers/net/sb1250-mac.c | |||
@@ -2161,13 +2161,13 @@ static void sbmac_setmulti(struct sbmac_softc *sc) | |||
2161 | * XXX if the table overflows */ | 2161 | * XXX if the table overflows */ |
2162 | 2162 | ||
2163 | idx = 1; /* skip station address */ | 2163 | idx = 1; /* skip station address */ |
2164 | mclist = dev->mc_list; | 2164 | netdev_for_each_mc_addr(mclist, dev) { |
2165 | while (mclist && (idx < MAC_ADDR_COUNT)) { | 2165 | if (idx == MAC_ADDR_COUNT) |
2166 | break; | ||
2166 | reg = sbmac_addr2reg(mclist->dmi_addr); | 2167 | reg = sbmac_addr2reg(mclist->dmi_addr); |
2167 | port = sc->sbm_base + R_MAC_ADDR_BASE+(idx * sizeof(uint64_t)); | 2168 | port = sc->sbm_base + R_MAC_ADDR_BASE+(idx * sizeof(uint64_t)); |
2168 | __raw_writeq(reg, port); | 2169 | __raw_writeq(reg, port); |
2169 | idx++; | 2170 | idx++; |
2170 | mclist = mclist->next; | ||
2171 | } | 2171 | } |
2172 | 2172 | ||
2173 | /* | 2173 | /* |
diff --git a/drivers/net/sc92031.c b/drivers/net/sc92031.c index 00ff8995ad69..d87c4787fffa 100644 --- a/drivers/net/sc92031.c +++ b/drivers/net/sc92031.c | |||
@@ -435,7 +435,7 @@ static void _sc92031_set_mar(struct net_device *dev) | |||
435 | else if (dev->flags & IFF_MULTICAST) { | 435 | else if (dev->flags & IFF_MULTICAST) { |
436 | struct dev_mc_list *mc_list; | 436 | struct dev_mc_list *mc_list; |
437 | 437 | ||
438 | for (mc_list = dev->mc_list; mc_list; mc_list = mc_list->next) { | 438 | netdev_for_each_mc_addr(mc_list, dev) { |
439 | u32 crc; | 439 | u32 crc; |
440 | unsigned bit = 0; | 440 | unsigned bit = 0; |
441 | 441 | ||
diff --git a/drivers/net/sfc/efx.c b/drivers/net/sfc/efx.c index dc58d9fd0f32..88f2fb193abe 100644 --- a/drivers/net/sfc/efx.c +++ b/drivers/net/sfc/efx.c | |||
@@ -1602,11 +1602,10 @@ static int efx_set_mac_address(struct net_device *net_dev, void *data) | |||
1602 | static void efx_set_multicast_list(struct net_device *net_dev) | 1602 | static void efx_set_multicast_list(struct net_device *net_dev) |
1603 | { | 1603 | { |
1604 | struct efx_nic *efx = netdev_priv(net_dev); | 1604 | struct efx_nic *efx = netdev_priv(net_dev); |
1605 | struct dev_mc_list *mc_list = net_dev->mc_list; | 1605 | struct dev_mc_list *mc_list; |
1606 | union efx_multicast_hash *mc_hash = &efx->multicast_hash; | 1606 | union efx_multicast_hash *mc_hash = &efx->multicast_hash; |
1607 | u32 crc; | 1607 | u32 crc; |
1608 | int bit; | 1608 | int bit; |
1609 | int i; | ||
1610 | 1609 | ||
1611 | efx->promiscuous = !!(net_dev->flags & IFF_PROMISC); | 1610 | efx->promiscuous = !!(net_dev->flags & IFF_PROMISC); |
1612 | 1611 | ||
@@ -1615,11 +1614,10 @@ static void efx_set_multicast_list(struct net_device *net_dev) | |||
1615 | memset(mc_hash, 0xff, sizeof(*mc_hash)); | 1614 | memset(mc_hash, 0xff, sizeof(*mc_hash)); |
1616 | } else { | 1615 | } else { |
1617 | memset(mc_hash, 0x00, sizeof(*mc_hash)); | 1616 | memset(mc_hash, 0x00, sizeof(*mc_hash)); |
1618 | for (i = 0; i < netdev_mc_count(net_dev); i++) { | 1617 | netdev_for_each_mc_addr(mc_list, net_dev) { |
1619 | crc = ether_crc_le(ETH_ALEN, mc_list->dmi_addr); | 1618 | crc = ether_crc_le(ETH_ALEN, mc_list->dmi_addr); |
1620 | bit = crc & (EFX_MCAST_HASH_ENTRIES - 1); | 1619 | bit = crc & (EFX_MCAST_HASH_ENTRIES - 1); |
1621 | set_bit_le(bit, mc_hash->byte); | 1620 | set_bit_le(bit, mc_hash->byte); |
1622 | mc_list = mc_list->next; | ||
1623 | } | 1621 | } |
1624 | 1622 | ||
1625 | /* Broadcast packets go through the multicast hash filter. | 1623 | /* Broadcast packets go through the multicast hash filter. |
diff --git a/drivers/net/sis190.c b/drivers/net/sis190.c index bf2ffbb913ff..ead1d31308f8 100644 --- a/drivers/net/sis190.c +++ b/drivers/net/sis190.c | |||
@@ -849,12 +849,10 @@ static void sis190_set_rx_mode(struct net_device *dev) | |||
849 | mc_filter[1] = mc_filter[0] = 0xffffffff; | 849 | mc_filter[1] = mc_filter[0] = 0xffffffff; |
850 | } else { | 850 | } else { |
851 | struct dev_mc_list *mclist; | 851 | struct dev_mc_list *mclist; |
852 | unsigned int i; | ||
853 | 852 | ||
854 | rx_mode = AcceptBroadcast | AcceptMyPhys; | 853 | rx_mode = AcceptBroadcast | AcceptMyPhys; |
855 | mc_filter[1] = mc_filter[0] = 0; | 854 | mc_filter[1] = mc_filter[0] = 0; |
856 | for (i = 0, mclist = dev->mc_list; mclist && i < netdev_mc_count(dev); | 855 | netdev_for_each_mc_addr(mclist, dev) { |
857 | i++, mclist = mclist->next) { | ||
858 | int bit_nr = | 856 | int bit_nr = |
859 | ether_crc(ETH_ALEN, mclist->dmi_addr) & 0x3f; | 857 | ether_crc(ETH_ALEN, mclist->dmi_addr) & 0x3f; |
860 | mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31); | 858 | mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31); |
diff --git a/drivers/net/sis900.c b/drivers/net/sis900.c index 32ae87c09f5e..cc0c731c4f09 100644 --- a/drivers/net/sis900.c +++ b/drivers/net/sis900.c | |||
@@ -2300,9 +2300,8 @@ static void set_rx_mode(struct net_device *net_dev) | |||
2300 | * packets */ | 2300 | * packets */ |
2301 | struct dev_mc_list *mclist; | 2301 | struct dev_mc_list *mclist; |
2302 | rx_mode = RFAAB; | 2302 | rx_mode = RFAAB; |
2303 | for (i = 0, mclist = net_dev->mc_list; | 2303 | |
2304 | mclist && i < netdev_mc_count(net_dev); | 2304 | netdev_for_each_mc_addr(mclist, net_dev) { |
2305 | i++, mclist = mclist->next) { | ||
2306 | unsigned int bit_nr = | 2305 | unsigned int bit_nr = |
2307 | sis900_mcast_bitnr(mclist->dmi_addr, sis_priv->chipset_rev); | 2306 | sis900_mcast_bitnr(mclist->dmi_addr, sis_priv->chipset_rev); |
2308 | mc_filter[bit_nr >> 4] |= (1 << (bit_nr & 0xf)); | 2307 | mc_filter[bit_nr >> 4] |= (1 << (bit_nr & 0xf)); |
diff --git a/drivers/net/skfp/skfddi.c b/drivers/net/skfp/skfddi.c index 346adfae986f..1921a54ea995 100644 --- a/drivers/net/skfp/skfddi.c +++ b/drivers/net/skfp/skfddi.c | |||
@@ -852,8 +852,7 @@ static void skfp_ctl_set_multicast_list(struct net_device *dev) | |||
852 | static void skfp_ctl_set_multicast_list_wo_lock(struct net_device *dev) | 852 | static void skfp_ctl_set_multicast_list_wo_lock(struct net_device *dev) |
853 | { | 853 | { |
854 | struct s_smc *smc = netdev_priv(dev); | 854 | struct s_smc *smc = netdev_priv(dev); |
855 | struct dev_mc_list *dmi; /* ptr to multicast addr entry */ | 855 | struct dev_mc_list *dmi; |
856 | int i; | ||
857 | 856 | ||
858 | /* Enable promiscuous mode, if necessary */ | 857 | /* Enable promiscuous mode, if necessary */ |
859 | if (dev->flags & IFF_PROMISC) { | 858 | if (dev->flags & IFF_PROMISC) { |
@@ -877,17 +876,14 @@ static void skfp_ctl_set_multicast_list_wo_lock(struct net_device *dev) | |||
877 | /* use exact filtering */ | 876 | /* use exact filtering */ |
878 | 877 | ||
879 | // point to first multicast addr | 878 | // point to first multicast addr |
880 | dmi = dev->mc_list; | 879 | netdev_for_each_mc_addr(dmi, dev) { |
881 | |||
882 | for (i = 0; i < netdev_mc_count(dev); i++) { | ||
883 | mac_add_multicast(smc, | 880 | mac_add_multicast(smc, |
884 | (struct fddi_addr *)dmi->dmi_addr, | 881 | (struct fddi_addr *)dmi->dmi_addr, |
885 | 1); | 882 | 1); |
886 | 883 | ||
887 | pr_debug(KERN_INFO "ENABLE MC ADDRESS: %pMF\n", | 884 | pr_debug(KERN_INFO "ENABLE MC ADDRESS: %pMF\n", |
888 | dmi->dmi_addr); | 885 | dmi->dmi_addr); |
889 | dmi = dmi->next; | 886 | } |
890 | } // for | ||
891 | 887 | ||
892 | } else { // more MC addresses than HW supports | 888 | } else { // more MC addresses than HW supports |
893 | 889 | ||
diff --git a/drivers/net/skge.c b/drivers/net/skge.c index 720af1c7854b..d0058e5bb6ae 100644 --- a/drivers/net/skge.c +++ b/drivers/net/skge.c | |||
@@ -2917,8 +2917,7 @@ static void genesis_set_multicast(struct net_device *dev) | |||
2917 | struct skge_port *skge = netdev_priv(dev); | 2917 | struct skge_port *skge = netdev_priv(dev); |
2918 | struct skge_hw *hw = skge->hw; | 2918 | struct skge_hw *hw = skge->hw; |
2919 | int port = skge->port; | 2919 | int port = skge->port; |
2920 | int i, count = netdev_mc_count(dev); | 2920 | struct dev_mc_list *list; |
2921 | struct dev_mc_list *list = dev->mc_list; | ||
2922 | u32 mode; | 2921 | u32 mode; |
2923 | u8 filter[8]; | 2922 | u8 filter[8]; |
2924 | 2923 | ||
@@ -2938,7 +2937,7 @@ static void genesis_set_multicast(struct net_device *dev) | |||
2938 | skge->flow_status == FLOW_STAT_SYMMETRIC) | 2937 | skge->flow_status == FLOW_STAT_SYMMETRIC) |
2939 | genesis_add_filter(filter, pause_mc_addr); | 2938 | genesis_add_filter(filter, pause_mc_addr); |
2940 | 2939 | ||
2941 | for (i = 0; list && i < count; i++, list = list->next) | 2940 | netdev_for_each_mc_addr(list, dev) |
2942 | genesis_add_filter(filter, list->dmi_addr); | 2941 | genesis_add_filter(filter, list->dmi_addr); |
2943 | } | 2942 | } |
2944 | 2943 | ||
@@ -2957,7 +2956,7 @@ static void yukon_set_multicast(struct net_device *dev) | |||
2957 | struct skge_port *skge = netdev_priv(dev); | 2956 | struct skge_port *skge = netdev_priv(dev); |
2958 | struct skge_hw *hw = skge->hw; | 2957 | struct skge_hw *hw = skge->hw; |
2959 | int port = skge->port; | 2958 | int port = skge->port; |
2960 | struct dev_mc_list *list = dev->mc_list; | 2959 | struct dev_mc_list *list; |
2961 | int rx_pause = (skge->flow_status == FLOW_STAT_REM_SEND || | 2960 | int rx_pause = (skge->flow_status == FLOW_STAT_REM_SEND || |
2962 | skge->flow_status == FLOW_STAT_SYMMETRIC); | 2961 | skge->flow_status == FLOW_STAT_SYMMETRIC); |
2963 | u16 reg; | 2962 | u16 reg; |
@@ -2975,13 +2974,12 @@ static void yukon_set_multicast(struct net_device *dev) | |||
2975 | else if (netdev_mc_empty(dev) && !rx_pause)/* no multicast */ | 2974 | else if (netdev_mc_empty(dev) && !rx_pause)/* no multicast */ |
2976 | reg &= ~GM_RXCR_MCF_ENA; | 2975 | reg &= ~GM_RXCR_MCF_ENA; |
2977 | else { | 2976 | else { |
2978 | int i; | ||
2979 | reg |= GM_RXCR_MCF_ENA; | 2977 | reg |= GM_RXCR_MCF_ENA; |
2980 | 2978 | ||
2981 | if (rx_pause) | 2979 | if (rx_pause) |
2982 | yukon_add_filter(filter, pause_mc_addr); | 2980 | yukon_add_filter(filter, pause_mc_addr); |
2983 | 2981 | ||
2984 | for (i = 0; list && i < netdev_mc_count(dev); i++, list = list->next) | 2982 | netdev_for_each_mc_addr(list, dev) |
2985 | yukon_add_filter(filter, list->dmi_addr); | 2983 | yukon_add_filter(filter, list->dmi_addr); |
2986 | } | 2984 | } |
2987 | 2985 | ||
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index d1e98e2170ce..653bdd76ef46 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
@@ -3621,7 +3621,7 @@ static void sky2_set_multicast(struct net_device *dev) | |||
3621 | struct sky2_port *sky2 = netdev_priv(dev); | 3621 | struct sky2_port *sky2 = netdev_priv(dev); |
3622 | struct sky2_hw *hw = sky2->hw; | 3622 | struct sky2_hw *hw = sky2->hw; |
3623 | unsigned port = sky2->port; | 3623 | unsigned port = sky2->port; |
3624 | struct dev_mc_list *list = dev->mc_list; | 3624 | struct dev_mc_list *list; |
3625 | u16 reg; | 3625 | u16 reg; |
3626 | u8 filter[8]; | 3626 | u8 filter[8]; |
3627 | int rx_pause; | 3627 | int rx_pause; |
@@ -3640,13 +3640,12 @@ static void sky2_set_multicast(struct net_device *dev) | |||
3640 | else if (netdev_mc_empty(dev) && !rx_pause) | 3640 | else if (netdev_mc_empty(dev) && !rx_pause) |
3641 | reg &= ~GM_RXCR_MCF_ENA; | 3641 | reg &= ~GM_RXCR_MCF_ENA; |
3642 | else { | 3642 | else { |
3643 | int i; | ||
3644 | reg |= GM_RXCR_MCF_ENA; | 3643 | reg |= GM_RXCR_MCF_ENA; |
3645 | 3644 | ||
3646 | if (rx_pause) | 3645 | if (rx_pause) |
3647 | sky2_add_filter(filter, pause_mc_addr); | 3646 | sky2_add_filter(filter, pause_mc_addr); |
3648 | 3647 | ||
3649 | for (i = 0; list && i < netdev_mc_count(dev); i++, list = list->next) | 3648 | netdev_for_each_mc_addr(list, dev) |
3650 | sky2_add_filter(filter, list->dmi_addr); | 3649 | sky2_add_filter(filter, list->dmi_addr); |
3651 | } | 3650 | } |
3652 | 3651 | ||
diff --git a/drivers/net/smsc9420.c b/drivers/net/smsc9420.c index 2bd3c986559a..30110a11d737 100644 --- a/drivers/net/smsc9420.c +++ b/drivers/net/smsc9420.c | |||
@@ -1063,11 +1063,11 @@ static void smsc9420_set_multicast_list(struct net_device *dev) | |||
1063 | mac_cr |= MAC_CR_MCPAS_; | 1063 | mac_cr |= MAC_CR_MCPAS_; |
1064 | mac_cr &= (~MAC_CR_HPFILT_); | 1064 | mac_cr &= (~MAC_CR_HPFILT_); |
1065 | } else if (!netdev_mc_empty(dev)) { | 1065 | } else if (!netdev_mc_empty(dev)) { |
1066 | struct dev_mc_list *mc_list = dev->mc_list; | 1066 | struct dev_mc_list *mc_list; |
1067 | u32 hash_lo = 0, hash_hi = 0; | 1067 | u32 hash_lo = 0, hash_hi = 0; |
1068 | 1068 | ||
1069 | smsc_dbg(HW, "Multicast filter enabled"); | 1069 | smsc_dbg(HW, "Multicast filter enabled"); |
1070 | while (mc_list) { | 1070 | netdev_for_each_mc_addr(mc_list, dev) { |
1071 | u32 bit_num = smsc9420_hash(mc_list->dmi_addr); | 1071 | u32 bit_num = smsc9420_hash(mc_list->dmi_addr); |
1072 | u32 mask = 1 << (bit_num & 0x1F); | 1072 | u32 mask = 1 << (bit_num & 0x1F); |
1073 | 1073 | ||
@@ -1076,7 +1076,6 @@ static void smsc9420_set_multicast_list(struct net_device *dev) | |||
1076 | else | 1076 | else |
1077 | hash_lo |= mask; | 1077 | hash_lo |= mask; |
1078 | 1078 | ||
1079 | mc_list = mc_list->next; | ||
1080 | } | 1079 | } |
1081 | smsc9420_reg_write(pd, HASHH, hash_hi); | 1080 | smsc9420_reg_write(pd, HASHH, hash_hi); |
1082 | smsc9420_reg_write(pd, HASHL, hash_lo); | 1081 | smsc9420_reg_write(pd, HASHL, hash_lo); |
diff --git a/drivers/net/sonic.c b/drivers/net/sonic.c index bd8bc66f2e00..287c251075e5 100644 --- a/drivers/net/sonic.c +++ b/drivers/net/sonic.c | |||
@@ -531,7 +531,7 @@ static void sonic_multicast_list(struct net_device *dev) | |||
531 | { | 531 | { |
532 | struct sonic_local *lp = netdev_priv(dev); | 532 | struct sonic_local *lp = netdev_priv(dev); |
533 | unsigned int rcr; | 533 | unsigned int rcr; |
534 | struct dev_mc_list *dmi = dev->mc_list; | 534 | struct dev_mc_list *dmi; |
535 | unsigned char *addr; | 535 | unsigned char *addr; |
536 | int i; | 536 | int i; |
537 | 537 | ||
@@ -549,13 +549,14 @@ static void sonic_multicast_list(struct net_device *dev) | |||
549 | printk("sonic_multicast_list: mc_count %d\n", | 549 | printk("sonic_multicast_list: mc_count %d\n", |
550 | netdev_mc_count(dev)); | 550 | netdev_mc_count(dev)); |
551 | sonic_set_cam_enable(dev, 1); /* always enable our own address */ | 551 | sonic_set_cam_enable(dev, 1); /* always enable our own address */ |
552 | for (i = 1; i <= netdev_mc_count(dev); i++) { | 552 | i = 1; |
553 | netdev_for_each_mc_addr(dmi, dev) { | ||
553 | addr = dmi->dmi_addr; | 554 | addr = dmi->dmi_addr; |
554 | dmi = dmi->next; | ||
555 | sonic_cda_put(dev, i, SONIC_CD_CAP0, addr[1] << 8 | addr[0]); | 555 | sonic_cda_put(dev, i, SONIC_CD_CAP0, addr[1] << 8 | addr[0]); |
556 | sonic_cda_put(dev, i, SONIC_CD_CAP1, addr[3] << 8 | addr[2]); | 556 | sonic_cda_put(dev, i, SONIC_CD_CAP1, addr[3] << 8 | addr[2]); |
557 | sonic_cda_put(dev, i, SONIC_CD_CAP2, addr[5] << 8 | addr[4]); | 557 | sonic_cda_put(dev, i, SONIC_CD_CAP2, addr[5] << 8 | addr[4]); |
558 | sonic_set_cam_enable(dev, sonic_get_cam_enable(dev) | (1 << i)); | 558 | sonic_set_cam_enable(dev, sonic_get_cam_enable(dev) | (1 << i)); |
559 | i++; | ||
559 | } | 560 | } |
560 | SONIC_WRITE(SONIC_CDC, 16); | 561 | SONIC_WRITE(SONIC_CDC, 16); |
561 | /* issue Load CAM command */ | 562 | /* issue Load CAM command */ |
diff --git a/drivers/net/spider_net.c b/drivers/net/spider_net.c index 16191998ac67..2f8a8c32021e 100644 --- a/drivers/net/spider_net.c +++ b/drivers/net/spider_net.c | |||
@@ -646,7 +646,7 @@ spider_net_set_multi(struct net_device *netdev) | |||
646 | hash = spider_net_get_multicast_hash(netdev, netdev->broadcast); */ | 646 | hash = spider_net_get_multicast_hash(netdev, netdev->broadcast); */ |
647 | set_bit(0xfd, bitmask); | 647 | set_bit(0xfd, bitmask); |
648 | 648 | ||
649 | for (mc = netdev->mc_list; mc; mc = mc->next) { | 649 | netdev_for_each_mc_addr(mc, netdev) { |
650 | hash = spider_net_get_multicast_hash(netdev, mc->dmi_addr); | 650 | hash = spider_net_get_multicast_hash(netdev, mc->dmi_addr); |
651 | set_bit(hash, bitmask); | 651 | set_bit(hash, bitmask); |
652 | } | 652 | } |
diff --git a/drivers/net/starfire.c b/drivers/net/starfire.c index 58bc7ac086cf..0f405ef51858 100644 --- a/drivers/net/starfire.c +++ b/drivers/net/starfire.c | |||
@@ -1804,14 +1804,14 @@ static void set_rx_mode(struct net_device *dev) | |||
1804 | /* Use the 16 element perfect filter, skip first two entries. */ | 1804 | /* Use the 16 element perfect filter, skip first two entries. */ |
1805 | void __iomem *filter_addr = ioaddr + PerfFilterTable + 2 * 16; | 1805 | void __iomem *filter_addr = ioaddr + PerfFilterTable + 2 * 16; |
1806 | __be16 *eaddrs; | 1806 | __be16 *eaddrs; |
1807 | for (i = 2, mclist = dev->mc_list; mclist && i < netdev_mc_count(dev) + 2; | 1807 | netdev_for_each_mc_addr(mclist, dev) { |
1808 | i++, mclist = mclist->next) { | ||
1809 | eaddrs = (__be16 *)mclist->dmi_addr; | 1808 | eaddrs = (__be16 *)mclist->dmi_addr; |
1810 | writew(be16_to_cpu(eaddrs[2]), filter_addr); filter_addr += 4; | 1809 | writew(be16_to_cpu(eaddrs[2]), filter_addr); filter_addr += 4; |
1811 | writew(be16_to_cpu(eaddrs[1]), filter_addr); filter_addr += 4; | 1810 | writew(be16_to_cpu(eaddrs[1]), filter_addr); filter_addr += 4; |
1812 | writew(be16_to_cpu(eaddrs[0]), filter_addr); filter_addr += 8; | 1811 | writew(be16_to_cpu(eaddrs[0]), filter_addr); filter_addr += 8; |
1813 | } | 1812 | } |
1814 | eaddrs = (__be16 *)dev->dev_addr; | 1813 | eaddrs = (__be16 *)dev->dev_addr; |
1814 | i = netdev_mc_count(dev) + 2; | ||
1815 | while (i++ < 16) { | 1815 | while (i++ < 16) { |
1816 | writew(be16_to_cpu(eaddrs[0]), filter_addr); filter_addr += 4; | 1816 | writew(be16_to_cpu(eaddrs[0]), filter_addr); filter_addr += 4; |
1817 | writew(be16_to_cpu(eaddrs[1]), filter_addr); filter_addr += 4; | 1817 | writew(be16_to_cpu(eaddrs[1]), filter_addr); filter_addr += 4; |
diff --git a/drivers/net/stmmac/dwmac100.c b/drivers/net/stmmac/dwmac100.c index 576b256ee388..803b0373d843 100644 --- a/drivers/net/stmmac/dwmac100.c +++ b/drivers/net/stmmac/dwmac100.c | |||
@@ -315,7 +315,6 @@ static void dwmac100_set_filter(struct net_device *dev) | |||
315 | value &= ~(MAC_CONTROL_PM | MAC_CONTROL_PR | MAC_CONTROL_IF | | 315 | value &= ~(MAC_CONTROL_PM | MAC_CONTROL_PR | MAC_CONTROL_IF | |
316 | MAC_CONTROL_HO | MAC_CONTROL_HP); | 316 | MAC_CONTROL_HO | MAC_CONTROL_HP); |
317 | } else { | 317 | } else { |
318 | int i; | ||
319 | u32 mc_filter[2]; | 318 | u32 mc_filter[2]; |
320 | struct dev_mc_list *mclist; | 319 | struct dev_mc_list *mclist; |
321 | 320 | ||
@@ -326,8 +325,7 @@ static void dwmac100_set_filter(struct net_device *dev) | |||
326 | MAC_CONTROL_IF | MAC_CONTROL_HO); | 325 | MAC_CONTROL_IF | MAC_CONTROL_HO); |
327 | 326 | ||
328 | memset(mc_filter, 0, sizeof(mc_filter)); | 327 | memset(mc_filter, 0, sizeof(mc_filter)); |
329 | for (i = 0, mclist = dev->mc_list; | 328 | netdev_for_each_mc_addr(mclist, dev) { |
330 | mclist && i < netdev_mc_count(dev); i++, mclist = mclist->next) { | ||
331 | /* The upper 6 bits of the calculated CRC are used to | 329 | /* The upper 6 bits of the calculated CRC are used to |
332 | * index the contens of the hash table */ | 330 | * index the contens of the hash table */ |
333 | int bit_nr = | 331 | int bit_nr = |
diff --git a/drivers/net/stmmac/dwmac1000_core.c b/drivers/net/stmmac/dwmac1000_core.c index 90dbb4f41ef3..a6538ae4694c 100644 --- a/drivers/net/stmmac/dwmac1000_core.c +++ b/drivers/net/stmmac/dwmac1000_core.c | |||
@@ -93,7 +93,6 @@ static void dwmac1000_set_filter(struct net_device *dev) | |||
93 | writel(0xffffffff, ioaddr + GMAC_HASH_HIGH); | 93 | writel(0xffffffff, ioaddr + GMAC_HASH_HIGH); |
94 | writel(0xffffffff, ioaddr + GMAC_HASH_LOW); | 94 | writel(0xffffffff, ioaddr + GMAC_HASH_LOW); |
95 | } else if (!netdev_mc_empty(dev)) { | 95 | } else if (!netdev_mc_empty(dev)) { |
96 | int i; | ||
97 | u32 mc_filter[2]; | 96 | u32 mc_filter[2]; |
98 | struct dev_mc_list *mclist; | 97 | struct dev_mc_list *mclist; |
99 | 98 | ||
@@ -101,8 +100,7 @@ static void dwmac1000_set_filter(struct net_device *dev) | |||
101 | value = GMAC_FRAME_FILTER_HMC; | 100 | value = GMAC_FRAME_FILTER_HMC; |
102 | 101 | ||
103 | memset(mc_filter, 0, sizeof(mc_filter)); | 102 | memset(mc_filter, 0, sizeof(mc_filter)); |
104 | for (i = 0, mclist = dev->mc_list; | 103 | netdev_for_each_mc_addr(mclist, dev) { |
105 | mclist && i < netdev_mc_count(dev); i++, mclist = mclist->next) { | ||
106 | /* The upper 6 bits of the calculated CRC are used to | 104 | /* The upper 6 bits of the calculated CRC are used to |
107 | index the contens of the hash table */ | 105 | index the contens of the hash table */ |
108 | int bit_nr = | 106 | int bit_nr = |
diff --git a/drivers/net/sun3_82586.c b/drivers/net/sun3_82586.c index efedc252e4be..2f6a760e5f21 100644 --- a/drivers/net/sun3_82586.c +++ b/drivers/net/sun3_82586.c | |||
@@ -413,7 +413,7 @@ static int init586(struct net_device *dev) | |||
413 | volatile struct iasetup_cmd_struct *ias_cmd; | 413 | volatile struct iasetup_cmd_struct *ias_cmd; |
414 | volatile struct tdr_cmd_struct *tdr_cmd; | 414 | volatile struct tdr_cmd_struct *tdr_cmd; |
415 | volatile struct mcsetup_cmd_struct *mc_cmd; | 415 | volatile struct mcsetup_cmd_struct *mc_cmd; |
416 | struct dev_mc_list *dmi=dev->mc_list; | 416 | struct dev_mc_list *dmi; |
417 | int num_addrs=netdev_mc_count(dev); | 417 | int num_addrs=netdev_mc_count(dev); |
418 | 418 | ||
419 | ptr = (void *) ((char *)p->scb + sizeof(struct scb_struct)); | 419 | ptr = (void *) ((char *)p->scb + sizeof(struct scb_struct)); |
@@ -536,8 +536,10 @@ static int init586(struct net_device *dev) | |||
536 | mc_cmd->cmd_link = 0xffff; | 536 | mc_cmd->cmd_link = 0xffff; |
537 | mc_cmd->mc_cnt = swab16(num_addrs * 6); | 537 | mc_cmd->mc_cnt = swab16(num_addrs * 6); |
538 | 538 | ||
539 | for(i=0;i<num_addrs;i++,dmi=dmi->next) | 539 | i = 0; |
540 | memcpy((char *) mc_cmd->mc_list[i], dmi->dmi_addr,6); | 540 | netdev_for_each_mc_addr(dmi, dev) |
541 | memcpy((char *) mc_cmd->mc_list[i++], | ||
542 | dmi->dmi_addr, ETH_ALEN); | ||
541 | 543 | ||
542 | p->scb->cbl_offset = make16(mc_cmd); | 544 | p->scb->cbl_offset = make16(mc_cmd); |
543 | p->scb->cmd_cuc = CUC_START; | 545 | p->scb->cmd_cuc = CUC_START; |
diff --git a/drivers/net/sunbmac.c b/drivers/net/sunbmac.c index dfea56fa39e3..a0bd361d5eca 100644 --- a/drivers/net/sunbmac.c +++ b/drivers/net/sunbmac.c | |||
@@ -999,7 +999,7 @@ static void bigmac_set_multicast(struct net_device *dev) | |||
999 | { | 999 | { |
1000 | struct bigmac *bp = netdev_priv(dev); | 1000 | struct bigmac *bp = netdev_priv(dev); |
1001 | void __iomem *bregs = bp->bregs; | 1001 | void __iomem *bregs = bp->bregs; |
1002 | struct dev_mc_list *dmi = dev->mc_list; | 1002 | struct dev_mc_list *dmi; |
1003 | char *addrs; | 1003 | char *addrs; |
1004 | int i; | 1004 | int i; |
1005 | u32 tmp, crc; | 1005 | u32 tmp, crc; |
@@ -1028,9 +1028,8 @@ static void bigmac_set_multicast(struct net_device *dev) | |||
1028 | for (i = 0; i < 4; i++) | 1028 | for (i = 0; i < 4; i++) |
1029 | hash_table[i] = 0; | 1029 | hash_table[i] = 0; |
1030 | 1030 | ||
1031 | for (i = 0; i < netdev_mc_count(dev); i++) { | 1031 | netdev_for_each_mc_addr(dmi, dev) { |
1032 | addrs = dmi->dmi_addr; | 1032 | addrs = dmi->dmi_addr; |
1033 | dmi = dmi->next; | ||
1034 | 1033 | ||
1035 | if (!(*addrs & 1)) | 1034 | if (!(*addrs & 1)) |
1036 | continue; | 1035 | continue; |
diff --git a/drivers/net/sundance.c b/drivers/net/sundance.c index 4171259590b2..a855934dfc3b 100644 --- a/drivers/net/sundance.c +++ b/drivers/net/sundance.c | |||
@@ -1528,8 +1528,7 @@ static void set_rx_mode(struct net_device *dev) | |||
1528 | int index; | 1528 | int index; |
1529 | int crc; | 1529 | int crc; |
1530 | memset (mc_filter, 0, sizeof (mc_filter)); | 1530 | memset (mc_filter, 0, sizeof (mc_filter)); |
1531 | for (i = 0, mclist = dev->mc_list; mclist && i < netdev_mc_count(dev); | 1531 | netdev_for_each_mc_addr(mclist, dev) { |
1532 | i++, mclist = mclist->next) { | ||
1533 | crc = ether_crc_le (ETH_ALEN, mclist->dmi_addr); | 1532 | crc = ether_crc_le (ETH_ALEN, mclist->dmi_addr); |
1534 | for (index=0, bit=0; bit < 6; bit++, crc <<= 1) | 1533 | for (index=0, bit=0; bit < 6; bit++, crc <<= 1) |
1535 | if (crc & 0x80000000) index |= 1 << bit; | 1534 | if (crc & 0x80000000) index |= 1 << bit; |
diff --git a/drivers/net/sungem.c b/drivers/net/sungem.c index d497ec053953..4344017bfaef 100644 --- a/drivers/net/sungem.c +++ b/drivers/net/sungem.c | |||
@@ -1846,17 +1846,13 @@ static u32 gem_setup_multicast(struct gem *gp) | |||
1846 | } else { | 1846 | } else { |
1847 | u16 hash_table[16]; | 1847 | u16 hash_table[16]; |
1848 | u32 crc; | 1848 | u32 crc; |
1849 | struct dev_mc_list *dmi = gp->dev->mc_list; | 1849 | struct dev_mc_list *dmi; |
1850 | int i; | 1850 | int i; |
1851 | 1851 | ||
1852 | for (i = 0; i < 16; i++) | 1852 | memset(hash_table, 0, sizeof(hash_table)); |
1853 | hash_table[i] = 0; | 1853 | netdev_for_each_mc_addr(dmi, gp->dev) { |
1854 | |||
1855 | for (i = 0; i < netdev_mc_count(gp->dev); i++) { | ||
1856 | char *addrs = dmi->dmi_addr; | 1854 | char *addrs = dmi->dmi_addr; |
1857 | 1855 | ||
1858 | dmi = dmi->next; | ||
1859 | |||
1860 | if (!(*addrs & 1)) | 1856 | if (!(*addrs & 1)) |
1861 | continue; | 1857 | continue; |
1862 | 1858 | ||
diff --git a/drivers/net/sunhme.c b/drivers/net/sunhme.c index 905df35ff78a..b17dbb11bd67 100644 --- a/drivers/net/sunhme.c +++ b/drivers/net/sunhme.c | |||
@@ -1523,17 +1523,13 @@ static int happy_meal_init(struct happy_meal *hp) | |||
1523 | hme_write32(hp, bregs + BMAC_HTABLE3, 0xffff); | 1523 | hme_write32(hp, bregs + BMAC_HTABLE3, 0xffff); |
1524 | } else if ((hp->dev->flags & IFF_PROMISC) == 0) { | 1524 | } else if ((hp->dev->flags & IFF_PROMISC) == 0) { |
1525 | u16 hash_table[4]; | 1525 | u16 hash_table[4]; |
1526 | struct dev_mc_list *dmi = hp->dev->mc_list; | 1526 | struct dev_mc_list *dmi; |
1527 | char *addrs; | 1527 | char *addrs; |
1528 | int i; | ||
1529 | u32 crc; | 1528 | u32 crc; |
1530 | 1529 | ||
1531 | for (i = 0; i < 4; i++) | 1530 | memset(hash_table, 0, sizeof(hash_table)); |
1532 | hash_table[i] = 0; | 1531 | netdev_for_each_mc_addr(dmi, hp->dev) { |
1533 | |||
1534 | for (i = 0; i < netdev_mc_count(hp->dev); i++) { | ||
1535 | addrs = dmi->dmi_addr; | 1532 | addrs = dmi->dmi_addr; |
1536 | dmi = dmi->next; | ||
1537 | 1533 | ||
1538 | if (!(*addrs & 1)) | 1534 | if (!(*addrs & 1)) |
1539 | continue; | 1535 | continue; |
@@ -2366,9 +2362,8 @@ static void happy_meal_set_multicast(struct net_device *dev) | |||
2366 | { | 2362 | { |
2367 | struct happy_meal *hp = netdev_priv(dev); | 2363 | struct happy_meal *hp = netdev_priv(dev); |
2368 | void __iomem *bregs = hp->bigmacregs; | 2364 | void __iomem *bregs = hp->bigmacregs; |
2369 | struct dev_mc_list *dmi = dev->mc_list; | 2365 | struct dev_mc_list *dmi; |
2370 | char *addrs; | 2366 | char *addrs; |
2371 | int i; | ||
2372 | u32 crc; | 2367 | u32 crc; |
2373 | 2368 | ||
2374 | spin_lock_irq(&hp->happy_lock); | 2369 | spin_lock_irq(&hp->happy_lock); |
@@ -2384,12 +2379,9 @@ static void happy_meal_set_multicast(struct net_device *dev) | |||
2384 | } else { | 2379 | } else { |
2385 | u16 hash_table[4]; | 2380 | u16 hash_table[4]; |
2386 | 2381 | ||
2387 | for (i = 0; i < 4; i++) | 2382 | memset(hash_table, 0, sizeof(hash_table)); |
2388 | hash_table[i] = 0; | 2383 | netdev_for_each_mc_addr(dmi, dev) { |
2389 | |||
2390 | for (i = 0; i < netdev_mc_count(dev); i++) { | ||
2391 | addrs = dmi->dmi_addr; | 2384 | addrs = dmi->dmi_addr; |
2392 | dmi = dmi->next; | ||
2393 | 2385 | ||
2394 | if (!(*addrs & 1)) | 2386 | if (!(*addrs & 1)) |
2395 | continue; | 2387 | continue; |
diff --git a/drivers/net/sunlance.c b/drivers/net/sunlance.c index cf9d5bb9e1e9..d7c73f478ef5 100644 --- a/drivers/net/sunlance.c +++ b/drivers/net/sunlance.c | |||
@@ -1170,9 +1170,8 @@ static int lance_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1170 | static void lance_load_multicast(struct net_device *dev) | 1170 | static void lance_load_multicast(struct net_device *dev) |
1171 | { | 1171 | { |
1172 | struct lance_private *lp = netdev_priv(dev); | 1172 | struct lance_private *lp = netdev_priv(dev); |
1173 | struct dev_mc_list *dmi = dev->mc_list; | 1173 | struct dev_mc_list *dmi; |
1174 | char *addrs; | 1174 | char *addrs; |
1175 | int i; | ||
1176 | u32 crc; | 1175 | u32 crc; |
1177 | u32 val; | 1176 | u32 val; |
1178 | 1177 | ||
@@ -1196,9 +1195,8 @@ static void lance_load_multicast(struct net_device *dev) | |||
1196 | return; | 1195 | return; |
1197 | 1196 | ||
1198 | /* Add addresses */ | 1197 | /* Add addresses */ |
1199 | for (i = 0; i < netdev_mc_count(dev); i++) { | 1198 | netdev_for_each_mc_addr(dmi, dev) { |
1200 | addrs = dmi->dmi_addr; | 1199 | addrs = dmi->dmi_addr; |
1201 | dmi = dmi->next; | ||
1202 | 1200 | ||
1203 | /* multicast address? */ | 1201 | /* multicast address? */ |
1204 | if (!(*addrs & 1)) | 1202 | if (!(*addrs & 1)) |
diff --git a/drivers/net/sunqe.c b/drivers/net/sunqe.c index 3bc35d86ed66..be637dce944c 100644 --- a/drivers/net/sunqe.c +++ b/drivers/net/sunqe.c | |||
@@ -627,7 +627,7 @@ static int qe_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
627 | static void qe_set_multicast(struct net_device *dev) | 627 | static void qe_set_multicast(struct net_device *dev) |
628 | { | 628 | { |
629 | struct sunqe *qep = netdev_priv(dev); | 629 | struct sunqe *qep = netdev_priv(dev); |
630 | struct dev_mc_list *dmi = dev->mc_list; | 630 | struct dev_mc_list *dmi; |
631 | u8 new_mconfig = qep->mconfig; | 631 | u8 new_mconfig = qep->mconfig; |
632 | char *addrs; | 632 | char *addrs; |
633 | int i; | 633 | int i; |
@@ -650,12 +650,9 @@ static void qe_set_multicast(struct net_device *dev) | |||
650 | u16 hash_table[4]; | 650 | u16 hash_table[4]; |
651 | u8 *hbytes = (unsigned char *) &hash_table[0]; | 651 | u8 *hbytes = (unsigned char *) &hash_table[0]; |
652 | 652 | ||
653 | for (i = 0; i < 4; i++) | 653 | memset(hash_table, 0, sizeof(hash_table)); |
654 | hash_table[i] = 0; | 654 | netdev_for_each_mc_addr(dmi, dev) { |
655 | |||
656 | for (i = 0; i < netdev_mc_count(dev); i++) { | ||
657 | addrs = dmi->dmi_addr; | 655 | addrs = dmi->dmi_addr; |
658 | dmi = dmi->next; | ||
659 | 656 | ||
660 | if (!(*addrs & 1)) | 657 | if (!(*addrs & 1)) |
661 | continue; | 658 | continue; |
diff --git a/drivers/net/sunvnet.c b/drivers/net/sunvnet.c index d65764ea1d83..6b1b7cea7f6b 100644 --- a/drivers/net/sunvnet.c +++ b/drivers/net/sunvnet.c | |||
@@ -765,7 +765,7 @@ static void __update_mc_list(struct vnet *vp, struct net_device *dev) | |||
765 | { | 765 | { |
766 | struct dev_addr_list *p; | 766 | struct dev_addr_list *p; |
767 | 767 | ||
768 | for (p = dev->mc_list; p; p = p->next) { | 768 | netdev_for_each_mc_addr(p, dev) { |
769 | struct vnet_mcast_entry *m; | 769 | struct vnet_mcast_entry *m; |
770 | 770 | ||
771 | m = __vnet_mc_find(vp, p->dmi_addr); | 771 | m = __vnet_mc_find(vp, p->dmi_addr); |