diff options
Diffstat (limited to 'drivers/net/arm/ixp4xx_eth.c')
-rw-r--r-- | drivers/net/arm/ixp4xx_eth.c | 16 |
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) | |||
735 | static void eth_set_mcast_list(struct net_device *dev) | 736 | static 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]); |