aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/arm/ixp4xx_eth.c
diff options
context:
space:
mode:
authorAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
committerAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
commitada47b5fe13d89735805b566185f4885f5a3f750 (patch)
tree644b88f8a71896307d71438e9b3af49126ffb22b /drivers/net/arm/ixp4xx_eth.c
parent43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff)
parent3280f21d43ee541f97f8cda5792150d2dbec20d5 (diff)
Merge branch 'wip-2.6.34' into old-private-masterarchived-private-master
Diffstat (limited to 'drivers/net/arm/ixp4xx_eth.c')
-rw-r--r--drivers/net/arm/ixp4xx_eth.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/drivers/net/arm/ixp4xx_eth.c b/drivers/net/arm/ixp4xx_eth.c
index 691b81eb0f46..6be8b098b8b4 100644
--- a/drivers/net/arm/ixp4xx_eth.c
+++ b/drivers/net/arm/ixp4xx_eth.c
@@ -32,6 +32,7 @@
32#include <linux/kernel.h> 32#include <linux/kernel.h>
33#include <linux/phy.h> 33#include <linux/phy.h>
34#include <linux/platform_device.h> 34#include <linux/platform_device.h>
35#include <linux/slab.h>
35#include <mach/npe.h> 36#include <mach/npe.h>
36#include <mach/qmgr.h> 37#include <mach/qmgr.h>
37 38
@@ -322,7 +323,7 @@ static int ixp4xx_mdio_write(struct mii_bus *bus, int phy_id, int location,
322 ret = ixp4xx_mdio_cmd(bus, phy_id, location, 1, val); 323 ret = ixp4xx_mdio_cmd(bus, phy_id, location, 1, val);
323 spin_unlock_irqrestore(&mdio_lock, flags); 324 spin_unlock_irqrestore(&mdio_lock, flags);
324#if DEBUG_MDIO 325#if DEBUG_MDIO
325 printk(KERN_DEBUG "%s #%i: MII read [%i] <- 0x%X, err = %i\n", 326 printk(KERN_DEBUG "%s #%i: MII write [%i] <- 0x%X, err = %i\n",
326 bus->name, phy_id, location, val, ret); 327 bus->name, phy_id, location, val, ret);
327#endif 328#endif
328 return ret; 329 return ret;
@@ -735,22 +736,25 @@ static int eth_xmit(struct sk_buff *skb, struct net_device *dev)
735static void eth_set_mcast_list(struct net_device *dev) 736static void eth_set_mcast_list(struct net_device *dev)
736{ 737{
737 struct port *port = netdev_priv(dev); 738 struct port *port = netdev_priv(dev);
738 struct dev_mc_list *mclist = dev->mc_list; 739 struct dev_mc_list *mclist;
739 u8 diffs[ETH_ALEN], *addr; 740 u8 diffs[ETH_ALEN], *addr;
740 int cnt = dev->mc_count, i; 741 int i;
741 742
742 if ((dev->flags & IFF_PROMISC) || !mclist || !cnt) { 743 if ((dev->flags & IFF_PROMISC) || netdev_mc_empty(dev)) {
743 __raw_writel(DEFAULT_RX_CNTRL0 & ~RX_CNTRL0_ADDR_FLTR_EN, 744 __raw_writel(DEFAULT_RX_CNTRL0 & ~RX_CNTRL0_ADDR_FLTR_EN,
744 &port->regs->rx_control[0]); 745 &port->regs->rx_control[0]);
745 return; 746 return;
746 } 747 }
747 748
748 memset(diffs, 0, ETH_ALEN); 749 memset(diffs, 0, ETH_ALEN);
749 addr = mclist->dmi_addr; /* first MAC address */
750 750
751 while (--cnt && (mclist = mclist->next)) 751 addr = NULL;
752 netdev_for_each_mc_addr(mclist, dev) {
753 if (!addr)
754 addr = mclist->dmi_addr; /* first MAC address */
752 for (i = 0; i < ETH_ALEN; i++) 755 for (i = 0; i < ETH_ALEN; i++)
753 diffs[i] |= addr[i] ^ mclist->dmi_addr[i]; 756 diffs[i] |= addr[i] ^ mclist->dmi_addr[i];
757 }
754 758
755 for (i = 0; i < ETH_ALEN; i++) { 759 for (i = 0; i < ETH_ALEN; i++) {
756 __raw_writel(addr[i], &port->regs->mcast_addr[i]); 760 __raw_writel(addr[i], &port->regs->mcast_addr[i]);