aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiri Pirko <jpirko@redhat.com>2010-02-19 03:48:47 -0500
committerDavid S. Miller <davem@davemloft.net>2010-02-19 16:15:50 -0500
commit91fea5858418127ad33e0060f726c62be0047eaf (patch)
tree3630384b91fe22565ac4eadc7dddd0d7720bf958
parent2f1eb65f366b81aa3c22c31e6e8db26168777ec5 (diff)
net/pcmcia: convert to use netdev_for_each_mc_addr
removed fill_multicast_tbl function in smc91c92_cs and do the work inline rewritten set_addresses function in xirc2ps_cs. This was kinda headache. Simulated the original and new functions and they bahave the same. Signed-off-by: Jiri Pirko <jpirko@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/pcmcia/axnet_cs.c7
-rw-r--r--drivers/net/pcmcia/fmvj18x_cs.c6
-rw-r--r--drivers/net/pcmcia/nmclan_cs.c6
-rw-r--r--drivers/net/pcmcia/smc91c92_cs.c33
-rw-r--r--drivers/net/pcmcia/xirc2ps_cs.c84
5 files changed, 67 insertions, 69 deletions
diff --git a/drivers/net/pcmcia/axnet_cs.c b/drivers/net/pcmcia/axnet_cs.c
index 2ee57bd52a01..d90e0fcdbce1 100644
--- a/drivers/net/pcmcia/axnet_cs.c
+++ b/drivers/net/pcmcia/axnet_cs.c
@@ -1625,8 +1625,7 @@ static inline void make_mc_bits(u8 *bits, struct net_device *dev)
1625 struct dev_mc_list *dmi; 1625 struct dev_mc_list *dmi;
1626 u32 crc; 1626 u32 crc;
1627 1627
1628 for (dmi=dev->mc_list; dmi; dmi=dmi->next) { 1628 netdev_for_each_mc_addr(dmi, dev) {
1629
1630 crc = ether_crc(ETH_ALEN, dmi->dmi_addr); 1629 crc = ether_crc(ETH_ALEN, dmi->dmi_addr);
1631 /* 1630 /*
1632 * The 8390 uses the 6 most significant bits of the 1631 * The 8390 uses the 6 most significant bits of the
@@ -1652,7 +1651,7 @@ static void do_set_multicast_list(struct net_device *dev)
1652 1651
1653 if (!(dev->flags&(IFF_PROMISC|IFF_ALLMULTI))) { 1652 if (!(dev->flags&(IFF_PROMISC|IFF_ALLMULTI))) {
1654 memset(ei_local->mcfilter, 0, 8); 1653 memset(ei_local->mcfilter, 0, 8);
1655 if (dev->mc_list) 1654 if (!netdev_mc_empty(dev))
1656 make_mc_bits(ei_local->mcfilter, dev); 1655 make_mc_bits(ei_local->mcfilter, dev);
1657 } else { 1656 } else {
1658 /* set to accept-all */ 1657 /* set to accept-all */
@@ -1668,7 +1667,7 @@ static void do_set_multicast_list(struct net_device *dev)
1668 1667
1669 if(dev->flags&IFF_PROMISC) 1668 if(dev->flags&IFF_PROMISC)
1670 outb_p(E8390_RXCONFIG | 0x58, e8390_base + EN0_RXCR); 1669 outb_p(E8390_RXCONFIG | 0x58, e8390_base + EN0_RXCR);
1671 else if(dev->flags&IFF_ALLMULTI || dev->mc_list) 1670 else if (dev->flags & IFF_ALLMULTI || !netdev_mc_empty(dev))
1672 outb_p(E8390_RXCONFIG | 0x48, e8390_base + EN0_RXCR); 1671 outb_p(E8390_RXCONFIG | 0x48, e8390_base + EN0_RXCR);
1673 else 1672 else
1674 outb_p(E8390_RXCONFIG | 0x40, e8390_base + EN0_RXCR); 1673 outb_p(E8390_RXCONFIG | 0x40, e8390_base + EN0_RXCR);
diff --git a/drivers/net/pcmcia/fmvj18x_cs.c b/drivers/net/pcmcia/fmvj18x_cs.c
index 3d573ed5f7c5..b9dc80b9d04a 100644
--- a/drivers/net/pcmcia/fmvj18x_cs.c
+++ b/drivers/net/pcmcia/fmvj18x_cs.c
@@ -1199,10 +1199,8 @@ static void set_rx_mode(struct net_device *dev)
1199 struct dev_mc_list *mclist; 1199 struct dev_mc_list *mclist;
1200 1200
1201 memset(mc_filter, 0, sizeof(mc_filter)); 1201 memset(mc_filter, 0, sizeof(mc_filter));
1202 for (i = 0, mclist = dev->mc_list; mclist && i < netdev_mc_count(dev); 1202 netdev_for_each_mc_addr(mclist, dev) {
1203 i++, mclist = mclist->next) { 1203 unsigned int bit = ether_crc_le(ETH_ALEN, mclist->dmi_addr) >> 26;
1204 unsigned int bit =
1205 ether_crc_le(ETH_ALEN, mclist->dmi_addr) >> 26;
1206 mc_filter[bit >> 3] |= (1 << (bit & 7)); 1204 mc_filter[bit >> 3] |= (1 << (bit & 7));
1207 } 1205 }
1208 outb(2, ioaddr + RX_MODE); /* Use normal mode. */ 1206 outb(2, ioaddr + RX_MODE); /* Use normal mode. */
diff --git a/drivers/net/pcmcia/nmclan_cs.c b/drivers/net/pcmcia/nmclan_cs.c
index c42a31a97fa3..c717b143f11a 100644
--- a/drivers/net/pcmcia/nmclan_cs.c
+++ b/drivers/net/pcmcia/nmclan_cs.c
@@ -1475,8 +1475,7 @@ static void set_multicast_list(struct net_device *dev)
1475{ 1475{
1476 mace_private *lp = netdev_priv(dev); 1476 mace_private *lp = netdev_priv(dev);
1477 int adr[ETHER_ADDR_LEN] = {0}; /* Ethernet address */ 1477 int adr[ETHER_ADDR_LEN] = {0}; /* Ethernet address */
1478 int i; 1478 struct dev_mc_list *dmi;
1479 struct dev_mc_list *dmi = dev->mc_list;
1480 1479
1481#ifdef PCMCIA_DEBUG 1480#ifdef PCMCIA_DEBUG
1482 { 1481 {
@@ -1496,9 +1495,8 @@ static void set_multicast_list(struct net_device *dev)
1496 if (num_addrs > 0) { 1495 if (num_addrs > 0) {
1497 /* Calculate multicast logical address filter */ 1496 /* Calculate multicast logical address filter */
1498 memset(lp->multicast_ladrf, 0, MACE_LADRF_LEN); 1497 memset(lp->multicast_ladrf, 0, MACE_LADRF_LEN);
1499 for (i = 0; i < netdev_mc_count(dev); i++) { 1498 netdev_for_each_mc_addr(dmi, dev) {
1500 memcpy(adr, dmi->dmi_addr, ETHER_ADDR_LEN); 1499 memcpy(adr, dmi->dmi_addr, ETHER_ADDR_LEN);
1501 dmi = dmi->next;
1502 BuildLAF(lp->multicast_ladrf, adr); 1500 BuildLAF(lp->multicast_ladrf, adr);
1503 } 1501 }
1504 } 1502 }
diff --git a/drivers/net/pcmcia/smc91c92_cs.c b/drivers/net/pcmcia/smc91c92_cs.c
index d2e86b8887c8..d29c22a80a06 100644
--- a/drivers/net/pcmcia/smc91c92_cs.c
+++ b/drivers/net/pcmcia/smc91c92_cs.c
@@ -1595,27 +1595,6 @@ static void smc_rx(struct net_device *dev)
1595 1595
1596/*====================================================================== 1596/*======================================================================
1597 1597
1598 Calculate values for the hardware multicast filter hash table.
1599
1600======================================================================*/
1601
1602static void fill_multicast_tbl(int count, struct dev_mc_list *addrs,
1603 u_char *multicast_table)
1604{
1605 struct dev_mc_list *mc_addr;
1606
1607 for (mc_addr = addrs; mc_addr && count-- > 0; mc_addr = mc_addr->next) {
1608 u_int position = ether_crc(6, mc_addr->dmi_addr);
1609#ifndef final_version /* Verify multicast address. */
1610 if ((mc_addr->dmi_addr[0] & 1) == 0)
1611 continue;
1612#endif
1613 multicast_table[position >> 29] |= 1 << ((position >> 26) & 7);
1614 }
1615}
1616
1617/*======================================================================
1618
1619 Set the receive mode. 1598 Set the receive mode.
1620 1599
1621 This routine is used by both the protocol level to notify us of 1600 This routine is used by both the protocol level to notify us of
@@ -1639,8 +1618,16 @@ static void set_rx_mode(struct net_device *dev)
1639 rx_cfg_setting = RxStripCRC | RxEnable | RxAllMulti; 1618 rx_cfg_setting = RxStripCRC | RxEnable | RxAllMulti;
1640 else { 1619 else {
1641 if (!netdev_mc_empty(dev)) { 1620 if (!netdev_mc_empty(dev)) {
1642 fill_multicast_tbl(netdev_mc_count(dev), dev->mc_list, 1621 struct dev_mc_list *mc_addr;
1643 (u_char *)multicast_table); 1622
1623 netdev_for_each_mc_addr(mc_addr, dev) {
1624 u_int position = ether_crc(6, mc_addr->dmi_addr);
1625#ifndef final_version /* Verify multicast address. */
1626 if ((mc_addr->dmi_addr[0] & 1) == 0)
1627 continue;
1628#endif
1629 multicast_table[position >> 29] |= 1 << ((position >> 26) & 7);
1630 }
1644 } 1631 }
1645 rx_cfg_setting = RxStripCRC | RxEnable; 1632 rx_cfg_setting = RxStripCRC | RxEnable;
1646 } 1633 }
diff --git a/drivers/net/pcmcia/xirc2ps_cs.c b/drivers/net/pcmcia/xirc2ps_cs.c
index 4ace18a71152..4d1802e457be 100644
--- a/drivers/net/pcmcia/xirc2ps_cs.c
+++ b/drivers/net/pcmcia/xirc2ps_cs.c
@@ -1364,47 +1364,63 @@ do_start_xmit(struct sk_buff *skb, struct net_device *dev)
1364 return NETDEV_TX_OK; 1364 return NETDEV_TX_OK;
1365} 1365}
1366 1366
1367struct set_address_info {
1368 int reg_nr;
1369 int page_nr;
1370 int mohawk;
1371 unsigned int ioaddr;
1372};
1373
1374static void set_address(struct set_address_info *sa_info, char *addr)
1375{
1376 unsigned int ioaddr = sa_info->ioaddr;
1377 int i;
1378
1379 for (i = 0; i < 6; i++) {
1380 if (sa_info->reg_nr > 15) {
1381 sa_info->reg_nr = 8;
1382 sa_info->page_nr++;
1383 SelectPage(sa_info->page_nr);
1384 }
1385 if (sa_info->mohawk)
1386 PutByte(sa_info->reg_nr++, addr[5 - i]);
1387 else
1388 PutByte(sa_info->reg_nr++, addr[i]);
1389 }
1390}
1391
1367/**************** 1392/****************
1368 * Set all addresses: This first one is the individual address, 1393 * Set all addresses: This first one is the individual address,
1369 * the next 9 addresses are taken from the multicast list and 1394 * the next 9 addresses are taken from the multicast list and
1370 * the rest is filled with the individual address. 1395 * the rest is filled with the individual address.
1371 */ 1396 */
1372static void 1397static void set_addresses(struct net_device *dev)
1373set_addresses(struct net_device *dev)
1374{ 1398{
1375 unsigned int ioaddr = dev->base_addr; 1399 unsigned int ioaddr = dev->base_addr;
1376 local_info_t *lp = netdev_priv(dev); 1400 local_info_t *lp = netdev_priv(dev);
1377 struct dev_mc_list *dmi = dev->mc_list; 1401 struct dev_mc_list *dmi;
1378 unsigned char *addr; 1402 struct set_address_info sa_info;
1379 int i,j,k,n; 1403 int i;
1380
1381 SelectPage(k=0x50);
1382 for (i=0,j=8,n=0; ; i++, j++) {
1383 if (i > 5) {
1384 if (++n > 9)
1385 break;
1386 i = 0;
1387 if (n > 1 && n <= netdev_mc_count(dev) && dmi) {
1388 dmi = dmi->next;
1389 }
1390 }
1391 if (j > 15) {
1392 j = 8;
1393 k++;
1394 SelectPage(k);
1395 }
1396
1397 if (n && n <= netdev_mc_count(dev) && dmi)
1398 addr = dmi->dmi_addr;
1399 else
1400 addr = dev->dev_addr;
1401 1404
1402 if (lp->mohawk) 1405 /*
1403 PutByte(j, addr[5-i]); 1406 * Setup the info structure so that by first set_address call it will do
1404 else 1407 * SelectPage with the right page number. Hence these ones here.
1405 PutByte(j, addr[i]); 1408 */
1406 } 1409 sa_info.reg_nr = 15 + 1;
1407 SelectPage(0); 1410 sa_info.page_nr = 0x50 - 1;
1411 sa_info.mohawk = lp->mohawk;
1412 sa_info.ioaddr = ioaddr;
1413
1414 set_address(&sa_info, dev->dev_addr);
1415 i = 0;
1416 netdev_for_each_mc_addr(dmi, dev) {
1417 if (i++ == 9)
1418 break;
1419 set_address(&sa_info, dmi->dmi_addr);
1420 }
1421 while (i++ < 9)
1422 set_address(&sa_info, dev->dev_addr);
1423 SelectPage(0);
1408} 1424}
1409 1425
1410/**************** 1426/****************