提交 48e2f183 编写于 作者: J Jiri Pirko 提交者: David S. Miller

net: convert multiple drivers to use netdev_for_each_mc_addr, part4

Signed-off-by: NJiri Pirko <jpirko@redhat.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 7a81e9f3
...@@ -965,10 +965,9 @@ static void emac_dev_mcast_set(struct net_device *ndev) ...@@ -965,10 +965,9 @@ static void emac_dev_mcast_set(struct net_device *ndev)
mbp_enable = (mbp_enable | EMAC_MBP_RXMCAST); mbp_enable = (mbp_enable | EMAC_MBP_RXMCAST);
emac_add_mcast(priv, EMAC_ALL_MULTI_CLR, NULL); emac_add_mcast(priv, EMAC_ALL_MULTI_CLR, NULL);
/* program multicast address list into EMAC hardware */ /* program multicast address list into EMAC hardware */
for (mc_ptr = ndev->mc_list; mc_ptr; netdev_for_each_mc_addr(mc_ptr, ndev) {
mc_ptr = mc_ptr->next) {
emac_add_mcast(priv, EMAC_MULTICAST_ADD, emac_add_mcast(priv, EMAC_MULTICAST_ADD,
(u8 *)mc_ptr->dmi_addr); (u8 *) mc_ptr->dmi_addr);
} }
} else { } else {
mbp_enable = (mbp_enable & ~EMAC_MBP_RXMCAST); mbp_enable = (mbp_enable & ~EMAC_MBP_RXMCAST);
......
...@@ -1537,14 +1537,18 @@ static int e100_hw_init(struct nic *nic) ...@@ -1537,14 +1537,18 @@ static int e100_hw_init(struct nic *nic)
static void e100_multi(struct nic *nic, struct cb *cb, struct sk_buff *skb) static void e100_multi(struct nic *nic, struct cb *cb, struct sk_buff *skb)
{ {
struct net_device *netdev = nic->netdev; struct net_device *netdev = nic->netdev;
struct dev_mc_list *list = netdev->mc_list; struct dev_mc_list *list;
u16 i, count = min(netdev_mc_count(netdev), E100_MAX_MULTICAST_ADDRS); u16 i, count = min(netdev_mc_count(netdev), E100_MAX_MULTICAST_ADDRS);
cb->command = cpu_to_le16(cb_multi); cb->command = cpu_to_le16(cb_multi);
cb->u.multi.count = cpu_to_le16(count * ETH_ALEN); cb->u.multi.count = cpu_to_le16(count * ETH_ALEN);
for (i = 0; list && i < count; i++, list = list->next) i = 0;
memcpy(&cb->u.multi.addr[i*ETH_ALEN], &list->dmi_addr, netdev_for_each_mc_addr(list, netdev) {
if (i == count)
break;
memcpy(&cb->u.multi.addr[i++ * ETH_ALEN], &list->dmi_addr,
ETH_ALEN); ETH_ALEN);
}
} }
static void e100_set_multicast_list(struct net_device *netdev) static void e100_set_multicast_list(struct net_device *netdev)
......
...@@ -1287,7 +1287,7 @@ set_multicast_list(struct net_device *dev) ...@@ -1287,7 +1287,7 @@ set_multicast_list(struct net_device *dev)
struct eepro_local *lp = netdev_priv(dev); struct eepro_local *lp = netdev_priv(dev);
short ioaddr = dev->base_addr; short ioaddr = dev->base_addr;
unsigned short mode; unsigned short mode;
struct dev_mc_list *dmi=dev->mc_list; struct dev_mc_list *dmi;
int mc_count = netdev_mc_count(dev); int mc_count = netdev_mc_count(dev);
if (dev->flags&(IFF_ALLMULTI|IFF_PROMISC) || mc_count > 63) if (dev->flags&(IFF_ALLMULTI|IFF_PROMISC) || mc_count > 63)
...@@ -1332,10 +1332,8 @@ set_multicast_list(struct net_device *dev) ...@@ -1332,10 +1332,8 @@ set_multicast_list(struct net_device *dev)
outw(0, ioaddr + IO_PORT); outw(0, ioaddr + IO_PORT);
outw(6 * (mc_count + 1), ioaddr + IO_PORT); outw(6 * (mc_count + 1), ioaddr + IO_PORT);
for (i = 0; i < mc_count; i++) netdev_for_each_mc_addr(dmi, dev) {
{ eaddrs = (unsigned short *) dmi->dmi_addr;
eaddrs=(unsigned short *)dmi->dmi_addr;
dmi=dmi->next;
outw(*eaddrs++, ioaddr + IO_PORT); outw(*eaddrs++, ioaddr + IO_PORT);
outw(*eaddrs++, ioaddr + IO_PORT); outw(*eaddrs++, ioaddr + IO_PORT);
outw(*eaddrs++, ioaddr + IO_PORT); outw(*eaddrs++, ioaddr + IO_PORT);
......
...@@ -1588,23 +1588,19 @@ static void eexp_setup_filter(struct net_device *dev) ...@@ -1588,23 +1588,19 @@ static void eexp_setup_filter(struct net_device *dev)
outw(CONF_NR_MULTICAST & ~31, ioaddr+SM_PTR); outw(CONF_NR_MULTICAST & ~31, ioaddr+SM_PTR);
outw(6*count, ioaddr+SHADOW(CONF_NR_MULTICAST)); outw(6*count, ioaddr+SHADOW(CONF_NR_MULTICAST));
for (i = 0, dmi = dev->mc_list; i < count; i++, dmi = dmi->next) { i = 0;
unsigned short *data; netdev_for_each_mc_addr(dmi, dev) {
if (!dmi) { unsigned short *data = (unsigned short *) dmi->dmi_addr;
printk(KERN_INFO "%s: too few multicast addresses\n", dev->name);
if (i == count)
break; break;
}
if (dmi->dmi_addrlen != ETH_ALEN) {
printk(KERN_INFO "%s: invalid multicast address length given.\n", dev->name);
continue;
}
data = (unsigned short *)dmi->dmi_addr;
outw((CONF_MULTICAST+(6*i)) & ~31, ioaddr+SM_PTR); outw((CONF_MULTICAST+(6*i)) & ~31, ioaddr+SM_PTR);
outw(data[0], ioaddr+SHADOW(CONF_MULTICAST+(6*i))); outw(data[0], ioaddr+SHADOW(CONF_MULTICAST+(6*i)));
outw((CONF_MULTICAST+(6*i)+2) & ~31, ioaddr+SM_PTR); outw((CONF_MULTICAST+(6*i)+2) & ~31, ioaddr+SM_PTR);
outw(data[1], ioaddr+SHADOW(CONF_MULTICAST+(6*i)+2)); outw(data[1], ioaddr+SHADOW(CONF_MULTICAST+(6*i)+2));
outw((CONF_MULTICAST+(6*i)+4) & ~31, ioaddr+SM_PTR); outw((CONF_MULTICAST+(6*i)+4) & ~31, ioaddr+SM_PTR);
outw(data[2], ioaddr+SHADOW(CONF_MULTICAST+(6*i)+4)); outw(data[2], ioaddr+SHADOW(CONF_MULTICAST+(6*i)+4));
i++;
} }
} }
......
...@@ -1967,7 +1967,7 @@ static void ehea_set_multicast_list(struct net_device *dev) ...@@ -1967,7 +1967,7 @@ static void ehea_set_multicast_list(struct net_device *dev)
{ {
struct ehea_port *port = netdev_priv(dev); struct ehea_port *port = netdev_priv(dev);
struct dev_mc_list *k_mcl_entry; struct dev_mc_list *k_mcl_entry;
int ret, i; int ret;
if (dev->flags & IFF_PROMISC) { if (dev->flags & IFF_PROMISC) {
ehea_promiscuous(dev, 1); ehea_promiscuous(dev, 1);
...@@ -1997,8 +1997,7 @@ static void ehea_set_multicast_list(struct net_device *dev) ...@@ -1997,8 +1997,7 @@ static void ehea_set_multicast_list(struct net_device *dev)
goto out; goto out;
} }
for (i = 0, k_mcl_entry = dev->mc_list; i < netdev_mc_count(dev); i++, netdev_for_each_mc_addr(k_mcl_entry, dev)
k_mcl_entry = k_mcl_entry->next)
ehea_add_multicast_entry(port, k_mcl_entry->dmi_addr); ehea_add_multicast_entry(port, k_mcl_entry->dmi_addr);
} }
......
...@@ -822,7 +822,7 @@ static int enic_set_mac_addr(struct net_device *netdev, char *addr) ...@@ -822,7 +822,7 @@ static int enic_set_mac_addr(struct net_device *netdev, char *addr)
static void enic_set_multicast_list(struct net_device *netdev) static void enic_set_multicast_list(struct net_device *netdev)
{ {
struct enic *enic = netdev_priv(netdev); struct enic *enic = netdev_priv(netdev);
struct dev_mc_list *list = netdev->mc_list; struct dev_mc_list *list;
int directed = 1; int directed = 1;
int multicast = (netdev->flags & IFF_MULTICAST) ? 1 : 0; int multicast = (netdev->flags & IFF_MULTICAST) ? 1 : 0;
int broadcast = (netdev->flags & IFF_BROADCAST) ? 1 : 0; int broadcast = (netdev->flags & IFF_BROADCAST) ? 1 : 0;
...@@ -851,9 +851,11 @@ static void enic_set_multicast_list(struct net_device *netdev) ...@@ -851,9 +851,11 @@ static void enic_set_multicast_list(struct net_device *netdev)
* look for changes to add/del. * look for changes to add/del.
*/ */
for (i = 0; list && i < mc_count; i++) { i = 0;
memcpy(mc_addr[i], list->dmi_addr, ETH_ALEN); netdev_for_each_mc_addr(list, netdev) {
list = list->next; if (i == mc_count)
break;
memcpy(mc_addr[i++], list->dmi_addr, ETH_ALEN);
} }
for (i = 0; i < enic->mc_count; i++) { for (i = 0; i < enic->mc_count; i++) {
......
...@@ -1403,8 +1403,7 @@ static void set_rx_mode(struct net_device *dev) ...@@ -1403,8 +1403,7 @@ static void set_rx_mode(struct net_device *dev)
struct dev_mc_list *mclist; struct dev_mc_list *mclist;
memset(mc_filter, 0, sizeof(mc_filter)); memset(mc_filter, 0, sizeof(mc_filter));
for (i = 0, mclist = dev->mc_list; mclist && i < netdev_mc_count(dev); netdev_for_each_mc_addr(mclist, dev) {
i++, mclist = mclist->next) {
unsigned int bit_nr = unsigned int bit_nr =
ether_crc_le(ETH_ALEN, mclist->dmi_addr) & 0x3f; ether_crc_le(ETH_ALEN, mclist->dmi_addr) & 0x3f;
mc_filter[bit_nr >> 3] |= (1 << bit_nr); mc_filter[bit_nr >> 3] |= (1 << bit_nr);
......
...@@ -755,7 +755,7 @@ static void ethoc_set_multicast_list(struct net_device *dev) ...@@ -755,7 +755,7 @@ static void ethoc_set_multicast_list(struct net_device *dev)
{ {
struct ethoc *priv = netdev_priv(dev); struct ethoc *priv = netdev_priv(dev);
u32 mode = ethoc_read(priv, MODER); u32 mode = ethoc_read(priv, MODER);
struct dev_mc_list *mc = NULL; struct dev_mc_list *mc;
u32 hash[2] = { 0, 0 }; u32 hash[2] = { 0, 0 };
/* set loopback mode if requested */ /* set loopback mode if requested */
...@@ -783,8 +783,8 @@ static void ethoc_set_multicast_list(struct net_device *dev) ...@@ -783,8 +783,8 @@ static void ethoc_set_multicast_list(struct net_device *dev)
hash[0] = 0xffffffff; hash[0] = 0xffffffff;
hash[1] = 0xffffffff; hash[1] = 0xffffffff;
} else { } else {
for (mc = dev->mc_list; mc; mc = mc->next) { netdev_for_each_mc_addr(mc, dev) {
u32 crc = ether_crc(mc->dmi_addrlen, mc->dmi_addr); u32 crc = ether_crc(ETH_ALEN, mc->dmi_addr);
int bit = (crc >> 26) & 0x3f; int bit = (crc >> 26) & 0x3f;
hash[bit >> 5] |= 1 << (bit & 0x1f); hash[bit >> 5] |= 1 << (bit & 0x1f);
} }
......
...@@ -1169,7 +1169,7 @@ static void set_multicast_list(struct net_device *dev) ...@@ -1169,7 +1169,7 @@ static void set_multicast_list(struct net_device *dev)
static void SetMulticastFilter(struct net_device *dev) static void SetMulticastFilter(struct net_device *dev)
{ {
struct ewrk3_private *lp = netdev_priv(dev); struct ewrk3_private *lp = netdev_priv(dev);
struct dev_mc_list *dmi = dev->mc_list; struct dev_mc_list *dmi;
u_long iobase = dev->base_addr; u_long iobase = dev->base_addr;
int i; int i;
char *addrs, bit, byte; char *addrs, bit, byte;
...@@ -1213,9 +1213,8 @@ static void SetMulticastFilter(struct net_device *dev) ...@@ -1213,9 +1213,8 @@ static void SetMulticastFilter(struct net_device *dev)
} }
/* Update table */ /* Update table */
for (i = 0; i < netdev_mc_count(dev); i++) { /* for each address in the list */ netdev_for_each_mc_addr(dmi, dev) {
addrs = dmi->dmi_addr; addrs = dmi->dmi_addr;
dmi = dmi->next;
if ((*addrs & 0x01) == 1) { /* multicast address? */ if ((*addrs & 0x01) == 1) { /* multicast address? */
crc = ether_crc_le(ETH_ALEN, addrs); crc = ether_crc_le(ETH_ALEN, addrs);
hashcode = crc & ((1 << 9) - 1); /* hashcode is 9 LSb of CRC */ hashcode = crc & ((1 << 9) - 1); /* hashcode is 9 LSb of CRC */
......
...@@ -1793,11 +1793,9 @@ static void __set_rx_mode(struct net_device *dev) ...@@ -1793,11 +1793,9 @@ static void __set_rx_mode(struct net_device *dev)
rx_mode = CR_W_AB | CR_W_AM; rx_mode = CR_W_AB | CR_W_AM;
} else { } else {
struct dev_mc_list *mclist; struct dev_mc_list *mclist;
int i;
memset(mc_filter, 0, sizeof(mc_filter)); memset(mc_filter, 0, sizeof(mc_filter));
for (i = 0, mclist = dev->mc_list; mclist && i < netdev_mc_count(dev); netdev_for_each_mc_addr(mclist, dev) {
i++, mclist = mclist->next) {
unsigned int bit; unsigned int bit;
bit = (ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26) ^ 0x3F; bit = (ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26) ^ 0x3F;
mc_filter[bit >> 5] |= (1 << bit); mc_filter[bit >> 5] |= (1 << bit);
......
...@@ -1575,7 +1575,7 @@ static void set_multicast_list(struct net_device *dev) ...@@ -1575,7 +1575,7 @@ static void set_multicast_list(struct net_device *dev)
{ {
struct fec_enet_private *fep = netdev_priv(dev); struct fec_enet_private *fep = netdev_priv(dev);
struct dev_mc_list *dmi; struct dev_mc_list *dmi;
unsigned int i, j, bit, data, crc, tmp; unsigned int i, bit, data, crc, tmp;
unsigned char hash; unsigned char hash;
if (dev->flags & IFF_PROMISC) { if (dev->flags & IFF_PROMISC) {
...@@ -1604,9 +1604,7 @@ static void set_multicast_list(struct net_device *dev) ...@@ -1604,9 +1604,7 @@ static void set_multicast_list(struct net_device *dev)
writel(0, fep->hwp + FEC_GRP_HASH_TABLE_HIGH); writel(0, fep->hwp + FEC_GRP_HASH_TABLE_HIGH);
writel(0, fep->hwp + FEC_GRP_HASH_TABLE_LOW); writel(0, fep->hwp + FEC_GRP_HASH_TABLE_LOW);
dmi = dev->mc_list; netdev_for_each_mc_addr(dmi, dev) {
for (j = 0; j < netdev_mc_count(dev); j++, dmi = dmi->next) {
/* Only support group multicast for now */ /* Only support group multicast for now */
if (!(dmi->dmi_addr[0] & 1)) if (!(dmi->dmi_addr[0] & 1))
continue; continue;
......
...@@ -575,19 +575,16 @@ static void mpc52xx_fec_set_multicast_list(struct net_device *dev) ...@@ -575,19 +575,16 @@ static void mpc52xx_fec_set_multicast_list(struct net_device *dev)
out_be32(&fec->gaddr2, 0xffffffff); out_be32(&fec->gaddr2, 0xffffffff);
} else { } else {
u32 crc; u32 crc;
int i;
struct dev_mc_list *dmi; struct dev_mc_list *dmi;
u32 gaddr1 = 0x00000000; u32 gaddr1 = 0x00000000;
u32 gaddr2 = 0x00000000; u32 gaddr2 = 0x00000000;
dmi = dev->mc_list; netdev_for_each_mc_addr(dmi, dev) {
for (i=0; i<netdev_mc_count(dev); i++) {
crc = ether_crc_le(6, dmi->dmi_addr) >> 26; crc = ether_crc_le(6, dmi->dmi_addr) >> 26;
if (crc >= 32) if (crc >= 32)
gaddr1 |= 1 << (crc-32); gaddr1 |= 1 << (crc-32);
else else
gaddr2 |= 1 << crc; gaddr2 |= 1 << crc;
dmi = dmi->next;
} }
out_be32(&fec->gaddr1, gaddr1); out_be32(&fec->gaddr1, gaddr1);
out_be32(&fec->gaddr2, gaddr2); out_be32(&fec->gaddr2, gaddr2);
......
...@@ -3095,7 +3095,7 @@ static void nv_set_multicast(struct net_device *dev) ...@@ -3095,7 +3095,7 @@ static void nv_set_multicast(struct net_device *dev)
} else { } else {
pff |= NVREG_PFF_MYADDR; pff |= NVREG_PFF_MYADDR;
if (dev->flags & IFF_ALLMULTI || dev->mc_list) { if (dev->flags & IFF_ALLMULTI || !netdev_mc_empty(dev)) {
u32 alwaysOff[2]; u32 alwaysOff[2];
u32 alwaysOn[2]; u32 alwaysOn[2];
...@@ -3105,8 +3105,7 @@ static void nv_set_multicast(struct net_device *dev) ...@@ -3105,8 +3105,7 @@ static void nv_set_multicast(struct net_device *dev)
} else { } else {
struct dev_mc_list *walk; struct dev_mc_list *walk;
walk = dev->mc_list; netdev_for_each_mc_addr(walk, dev) {
while (walk != NULL) {
u32 a, b; u32 a, b;
a = le32_to_cpu(*(__le32 *) walk->dmi_addr); a = le32_to_cpu(*(__le32 *) walk->dmi_addr);
b = le16_to_cpu(*(__le16 *) (&walk->dmi_addr[4])); b = le16_to_cpu(*(__le16 *) (&walk->dmi_addr[4]));
...@@ -3114,7 +3113,6 @@ static void nv_set_multicast(struct net_device *dev) ...@@ -3114,7 +3113,6 @@ static void nv_set_multicast(struct net_device *dev)
alwaysOff[0] &= ~a; alwaysOff[0] &= ~a;
alwaysOn[1] &= b; alwaysOn[1] &= b;
alwaysOff[1] &= ~b; alwaysOff[1] &= ~b;
walk = walk->next;
} }
} }
addr[0] = alwaysOn[0]; addr[0] = alwaysOn[0];
......
...@@ -235,7 +235,7 @@ static void set_multicast_list(struct net_device *dev) ...@@ -235,7 +235,7 @@ static void set_multicast_list(struct net_device *dev)
if ((dev->flags & IFF_PROMISC) == 0) { if ((dev->flags & IFF_PROMISC) == 0) {
set_multicast_start(dev); set_multicast_start(dev);
for (pmc = dev->mc_list; pmc != NULL; pmc = pmc->next) netdev_for_each_mc_addr(pmc, dev)
set_multicast_one(dev, pmc->dmi_addr); set_multicast_one(dev, pmc->dmi_addr);
set_multicast_finish(dev); set_multicast_finish(dev);
} else } else
......
...@@ -236,7 +236,7 @@ static void set_multicast_list(struct net_device *dev) ...@@ -236,7 +236,7 @@ static void set_multicast_list(struct net_device *dev)
if ((dev->flags & IFF_PROMISC) == 0) { if ((dev->flags & IFF_PROMISC) == 0) {
set_multicast_start(dev); set_multicast_start(dev);
for (pmc = dev->mc_list; pmc != NULL; pmc = pmc->next) netdev_for_each_mc_addr(pmc, dev)
set_multicast_one(dev, pmc->dmi_addr); set_multicast_one(dev, pmc->dmi_addr);
set_multicast_finish(dev); set_multicast_finish(dev);
} else } else
......
...@@ -228,7 +228,7 @@ static void set_multicast_list(struct net_device *dev) ...@@ -228,7 +228,7 @@ static void set_multicast_list(struct net_device *dev)
if ((dev->flags & IFF_PROMISC) == 0) { if ((dev->flags & IFF_PROMISC) == 0) {
set_multicast_start(dev); set_multicast_start(dev);
for (pmc = dev->mc_list; pmc != NULL; pmc = pmc->next) netdev_for_each_mc_addr(pmc, dev)
set_multicast_one(dev, pmc->dmi_addr); set_multicast_one(dev, pmc->dmi_addr);
set_multicast_finish(dev); set_multicast_finish(dev);
} else } else
......
...@@ -2867,7 +2867,7 @@ static void gfar_set_multi(struct net_device *dev) ...@@ -2867,7 +2867,7 @@ static void gfar_set_multi(struct net_device *dev)
return; return;
/* Parse the list, and set the appropriate bits */ /* Parse the list, and set the appropriate bits */
for(mc_ptr = dev->mc_list; mc_ptr; mc_ptr = mc_ptr->next) { netdev_for_each_mc_addr(mc_ptr, dev) {
if (idx < em_num) { if (idx < em_num) {
gfar_set_mac_for_addr(dev, idx, gfar_set_mac_for_addr(dev, idx,
mc_ptr->dmi_addr); mc_ptr->dmi_addr);
......
...@@ -1859,12 +1859,13 @@ static void set_rx_mode(struct net_device *dev) ...@@ -1859,12 +1859,13 @@ static void set_rx_mode(struct net_device *dev)
writew(0x000B, ioaddr + AddrMode); writew(0x000B, ioaddr + AddrMode);
} else if (!netdev_mc_empty(dev)) { /* Must use the CAM filter. */ } else if (!netdev_mc_empty(dev)) { /* Must use the CAM filter. */
struct dev_mc_list *mclist; struct dev_mc_list *mclist;
int i; int i = 0;
for (i = 0, mclist = dev->mc_list; mclist && i < netdev_mc_count(dev);
i++, mclist = mclist->next) { netdev_for_each_mc_addr(mclist, dev) {
writel(*(u32*)(mclist->dmi_addr), ioaddr + 0x100 + i*8); writel(*(u32*)(mclist->dmi_addr), ioaddr + 0x100 + i*8);
writel(0x20000 | (*(u16*)&mclist->dmi_addr[4]), writel(0x20000 | (*(u16*)&mclist->dmi_addr[4]),
ioaddr + 0x104 + i*8); ioaddr + 0x104 + i*8);
i++;
} }
/* Clear remaining entries. */ /* Clear remaining entries. */
for (; i < 64; i++) for (; i < 64; i++)
......
...@@ -2098,7 +2098,7 @@ static void hp100_set_multicast_list(struct net_device *dev) ...@@ -2098,7 +2098,7 @@ static void hp100_set_multicast_list(struct net_device *dev)
/* set hash filter to receive all multicast packets */ /* set hash filter to receive all multicast packets */
memset(&lp->hash_bytes, 0xff, 8); memset(&lp->hash_bytes, 0xff, 8);
} else { } else {
int i, j, idx; int i, idx;
u_char *addrs; u_char *addrs;
struct dev_mc_list *dmi; struct dev_mc_list *dmi;
...@@ -2107,14 +2107,14 @@ static void hp100_set_multicast_list(struct net_device *dev) ...@@ -2107,14 +2107,14 @@ static void hp100_set_multicast_list(struct net_device *dev)
printk("hp100: %s: computing hash filter - mc_count = %i\n", printk("hp100: %s: computing hash filter - mc_count = %i\n",
dev->name, netdev_mc_count(dev)); dev->name, netdev_mc_count(dev));
#endif #endif
for (i = 0, dmi = dev->mc_list; i < netdev_mc_count(dev); i++, dmi = dmi->next) { netdev_for_each_mc_addr(dmi, dev) {
addrs = dmi->dmi_addr; addrs = dmi->dmi_addr;
if ((*addrs & 0x01) == 0x01) { /* multicast address? */ if ((*addrs & 0x01) == 0x01) { /* multicast address? */
#ifdef HP100_DEBUG #ifdef HP100_DEBUG
printk("hp100: %s: multicast = %pM, ", printk("hp100: %s: multicast = %pM, ",
dev->name, addrs); dev->name, addrs);
#endif #endif
for (j = idx = 0; j < 6; j++) { for (i = idx = 0; i < 6; i++) {
idx ^= *addrs++ & 0x3f; idx ^= *addrs++ & 0x3f;
printk(":%02x:", idx); printk(":%02x:", idx);
} }
......
...@@ -395,7 +395,7 @@ static void emac_hash_mc(struct emac_instance *dev) ...@@ -395,7 +395,7 @@ static void emac_hash_mc(struct emac_instance *dev)
memset(gaht_temp, 0, sizeof (gaht_temp)); memset(gaht_temp, 0, sizeof (gaht_temp));
for (dmi = dev->ndev->mc_list; dmi; dmi = dmi->next) { netdev_for_each_mc_addr(dmi, dev->ndev) {
int slot, reg, mask; int slot, reg, mask;
DBG2(dev, "mc %pM" NL, dmi->dmi_addr); DBG2(dev, "mc %pM" NL, dmi->dmi_addr);
......
...@@ -420,7 +420,7 @@ static void InitBoard(struct net_device *dev) ...@@ -420,7 +420,7 @@ static void InitBoard(struct net_device *dev)
/* start putting the multicast addresses into the CAM list. Stop if /* start putting the multicast addresses into the CAM list. Stop if
it is full. */ it is full. */
for (mcptr = dev->mc_list; mcptr != NULL; mcptr = mcptr->next) { netdev_for_each_mc_addr(mcptr, dev) {
putcam(cams, &camcnt, mcptr->dmi_addr); putcam(cams, &camcnt, mcptr->dmi_addr);
if (camcnt == 16) if (camcnt == 16)
break; break;
......
...@@ -1072,8 +1072,7 @@ static void ibmveth_set_multicast_list(struct net_device *netdev) ...@@ -1072,8 +1072,7 @@ static void ibmveth_set_multicast_list(struct net_device *netdev)
ibmveth_error_printk("h_multicast_ctrl rc=%ld when entering promisc mode\n", lpar_rc); ibmveth_error_printk("h_multicast_ctrl rc=%ld when entering promisc mode\n", lpar_rc);
} }
} else { } else {
struct dev_mc_list *mclist = netdev->mc_list; struct dev_mc_list *mclist;
int i;
/* clear the filter table & disable filtering */ /* clear the filter table & disable filtering */
lpar_rc = h_multicast_ctrl(adapter->vdev->unit_address, lpar_rc = h_multicast_ctrl(adapter->vdev->unit_address,
IbmVethMcastEnableRecv | IbmVethMcastEnableRecv |
...@@ -1084,7 +1083,7 @@ static void ibmveth_set_multicast_list(struct net_device *netdev) ...@@ -1084,7 +1083,7 @@ static void ibmveth_set_multicast_list(struct net_device *netdev)
ibmveth_error_printk("h_multicast_ctrl rc=%ld when attempting to clear filter table\n", lpar_rc); ibmveth_error_printk("h_multicast_ctrl rc=%ld when attempting to clear filter table\n", lpar_rc);
} }
/* add the addresses to the filter table */ /* add the addresses to the filter table */
for(i = 0; i < netdev_mc_count(netdev); ++i, mclist = mclist->next) { netdev_for_each_mc_addr(mclist, netdev) {
// add the multicast address to the filter table // add the multicast address to the filter table
unsigned long mcast_addr = 0; unsigned long mcast_addr = 0;
memcpy(((char *)&mcast_addr)+2, mclist->dmi_addr, 6); memcpy(((char *)&mcast_addr)+2, mclist->dmi_addr, 6);
......
...@@ -2877,7 +2877,7 @@ static int igb_write_mc_addr_list(struct net_device *netdev) ...@@ -2877,7 +2877,7 @@ static int igb_write_mc_addr_list(struct net_device *netdev)
{ {
struct igb_adapter *adapter = netdev_priv(netdev); struct igb_adapter *adapter = netdev_priv(netdev);
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
struct dev_mc_list *mc_ptr = netdev->mc_list; struct dev_mc_list *mc_ptr;
u8 *mta_list; u8 *mta_list;
int i; int i;
...@@ -2893,14 +2893,10 @@ static int igb_write_mc_addr_list(struct net_device *netdev) ...@@ -2893,14 +2893,10 @@ static int igb_write_mc_addr_list(struct net_device *netdev)
return -ENOMEM; return -ENOMEM;
/* The shared function expects a packed array of only addresses. */ /* The shared function expects a packed array of only addresses. */
mc_ptr = netdev->mc_list; i = 0;
netdev_for_each_mc_addr(mc_ptr, netdev)
memcpy(mta_list + (i++ * ETH_ALEN), mc_ptr->dmi_addr, ETH_ALEN);
for (i = 0; i < netdev_mc_count(netdev); i++) {
if (!mc_ptr)
break;
memcpy(mta_list + (i*ETH_ALEN), mc_ptr->dmi_addr, ETH_ALEN);
mc_ptr = mc_ptr->next;
}
igb_update_mc_addr_list(hw, mta_list, i); igb_update_mc_addr_list(hw, mta_list, i);
kfree(mta_list); kfree(mta_list);
......
...@@ -1413,15 +1413,9 @@ static void igbvf_set_multi(struct net_device *netdev) ...@@ -1413,15 +1413,9 @@ static void igbvf_set_multi(struct net_device *netdev)
} }
/* prepare a packed array of only addresses. */ /* prepare a packed array of only addresses. */
mc_ptr = netdev->mc_list; i = 0;
netdev_for_each_mc_addr(mc_ptr, netdev)
for (i = 0; i < netdev_mc_count(netdev); i++) { memcpy(mta_list + (i++ * ETH_ALEN), mc_ptr->dmi_addr, ETH_ALEN);
if (!mc_ptr)
break;
memcpy(mta_list + (i*ETH_ALEN), mc_ptr->dmi_addr,
ETH_ALEN);
mc_ptr = mc_ptr->next;
}
hw->mac.ops.update_mc_addr_list(hw, mta_list, i, 0, 0); hw->mac.ops.update_mc_addr_list(hw, mta_list, i, 0, 0);
kfree(mta_list); kfree(mta_list);
......
...@@ -1664,11 +1664,10 @@ static int ioc3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) ...@@ -1664,11 +1664,10 @@ static int ioc3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
static void ioc3_set_multicast_list(struct net_device *dev) static void ioc3_set_multicast_list(struct net_device *dev)
{ {
struct dev_mc_list *dmi = dev->mc_list; struct dev_mc_list *dmi;
struct ioc3_private *ip = netdev_priv(dev); struct ioc3_private *ip = netdev_priv(dev);
struct ioc3 *ioc3 = ip->regs; struct ioc3 *ioc3 = ip->regs;
u64 ehar = 0; u64 ehar = 0;
int i;
netif_stop_queue(dev); /* Lock out others. */ netif_stop_queue(dev); /* Lock out others. */
...@@ -1689,9 +1688,8 @@ static void ioc3_set_multicast_list(struct net_device *dev) ...@@ -1689,9 +1688,8 @@ static void ioc3_set_multicast_list(struct net_device *dev)
ip->ehar_h = 0xffffffff; ip->ehar_h = 0xffffffff;
ip->ehar_l = 0xffffffff; ip->ehar_l = 0xffffffff;
} else { } else {
for (i = 0; i < netdev_mc_count(dev); i++) { netdev_for_each_mc_addr(dmi, dev) {
char *addr = dmi->dmi_addr; char *addr = dmi->dmi_addr;
dmi = dmi->next;
if (!(*addr & 1)) if (!(*addr & 1))
continue; continue;
......
...@@ -608,8 +608,7 @@ static void ipg_nic_set_multicast_list(struct net_device *dev) ...@@ -608,8 +608,7 @@ static void ipg_nic_set_multicast_list(struct net_device *dev)
hashtable[1] = 0x00000000; hashtable[1] = 0x00000000;
/* Cycle through all multicast addresses to filter. */ /* Cycle through all multicast addresses to filter. */
for (mc_list_ptr = dev->mc_list; netdev_for_each_mc_addr(mc_list_ptr, dev) {
mc_list_ptr != NULL; mc_list_ptr = mc_list_ptr->next) {
/* Calculate CRC result for each multicast address. */ /* Calculate CRC result for each multicast address. */
hashindex = crc32_le(0xffffffff, mc_list_ptr->dmi_addr, hashindex = crc32_le(0xffffffff, mc_list_ptr->dmi_addr,
ETH_ALEN); ETH_ALEN);
......
...@@ -666,7 +666,7 @@ set_multicast_list(struct net_device *dev) ...@@ -666,7 +666,7 @@ set_multicast_list(struct net_device *dev)
else if (!netdev_mc_empty(dev)) else if (!netdev_mc_empty(dev))
{ {
/* Walk the address list, and load the filter */ /* Walk the address list, and load the filter */
hardware_set_filter(dev->mc_list); hardware_set_filter(dev);
outw(MULTICAST, ioaddr); outw(MULTICAST, ioaddr);
} }
......
...@@ -961,15 +961,14 @@ static void veth_set_multicast_list(struct net_device *dev) ...@@ -961,15 +961,14 @@ static void veth_set_multicast_list(struct net_device *dev)
(netdev_mc_count(dev) > VETH_MAX_MCAST)) { (netdev_mc_count(dev) > VETH_MAX_MCAST)) {
port->promiscuous = 1; port->promiscuous = 1;
} else { } else {
struct dev_mc_list *dmi = dev->mc_list; struct dev_mc_list *dmi;
int i;
port->promiscuous = 0; port->promiscuous = 0;
/* Update table */ /* Update table */
port->num_mcast = 0; port->num_mcast = 0;
for (i = 0; i < netdev_mc_count(dev); i++) { netdev_for_each_mc_addr(dmi, dev) {
u8 *addr = dmi->dmi_addr; u8 *addr = dmi->dmi_addr;
u64 xaddr = 0; u64 xaddr = 0;
...@@ -978,7 +977,6 @@ static void veth_set_multicast_list(struct net_device *dev) ...@@ -978,7 +977,6 @@ static void veth_set_multicast_list(struct net_device *dev)
port->mcast_addr[port->num_mcast] = xaddr; port->mcast_addr[port->num_mcast] = xaddr;
port->num_mcast++; port->num_mcast++;
} }
dmi = dmi->next;
} }
} }
......
...@@ -1088,10 +1088,9 @@ ixgb_set_multi(struct net_device *netdev) ...@@ -1088,10 +1088,9 @@ ixgb_set_multi(struct net_device *netdev)
IXGB_WRITE_REG(hw, RCTL, rctl); IXGB_WRITE_REG(hw, RCTL, rctl);
for (i = 0, mc_ptr = netdev->mc_list; i = 0;
mc_ptr; netdev_for_each_mc_addr(mc_ptr, netdev)
i++, mc_ptr = mc_ptr->next) memcpy(&mta[i++ * IXGB_ETH_LENGTH_OF_ADDRESS],
memcpy(&mta[i * IXGB_ETH_LENGTH_OF_ADDRESS],
mc_ptr->dmi_addr, IXGB_ETH_LENGTH_OF_ADDRESS); mc_ptr->dmi_addr, IXGB_ETH_LENGTH_OF_ADDRESS);
ixgb_mc_addr_list_update(hw, mta, netdev_mc_count(netdev), 0); ixgb_mc_addr_list_update(hw, mta, netdev_mc_count(netdev), 0);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册