diff options
Diffstat (limited to 'drivers/net/arm/ixp4xx_eth.c')
| -rw-r--r-- | drivers/net/arm/ixp4xx_eth.c | 14 | 
1 files changed, 13 insertions, 1 deletions
diff --git a/drivers/net/arm/ixp4xx_eth.c b/drivers/net/arm/ixp4xx_eth.c index 24df0325090..4f1cc7164ad 100644 --- a/drivers/net/arm/ixp4xx_eth.c +++ b/drivers/net/arm/ixp4xx_eth.c @@ -738,6 +738,17 @@ static void eth_set_mcast_list(struct net_device *dev)  	struct netdev_hw_addr *ha;  	u8 diffs[ETH_ALEN], *addr;  	int i; +	static const u8 allmulti[] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 }; + +	if (dev->flags & IFF_ALLMULTI) { +		for (i = 0; i < ETH_ALEN; i++) { +			__raw_writel(allmulti[i], &port->regs->mcast_addr[i]); +			__raw_writel(allmulti[i], &port->regs->mcast_mask[i]); +		} +		__raw_writel(DEFAULT_RX_CNTRL0 | RX_CNTRL0_ADDR_FLTR_EN, +			&port->regs->rx_control[0]); +		return; +	}  	if ((dev->flags & IFF_PROMISC) || netdev_mc_empty(dev)) {  		__raw_writel(DEFAULT_RX_CNTRL0 & ~RX_CNTRL0_ADDR_FLTR_EN, @@ -771,7 +782,8 @@ static int eth_ioctl(struct net_device *dev, struct ifreq *req, int cmd)  	if (!netif_running(dev))  		return -EINVAL; -	return phy_mii_ioctl(port->phydev, if_mii(req), cmd); + +	return phy_mii_ioctl(port->phydev, req, cmd);  }  /* ethtool support */  |