diff options
Diffstat (limited to 'drivers/net/ethernet/allwinner/sun4i-emac.c')
| -rw-r--r-- | drivers/net/ethernet/allwinner/sun4i-emac.c | 42 | 
1 files changed, 29 insertions, 13 deletions
diff --git a/drivers/net/ethernet/allwinner/sun4i-emac.c b/drivers/net/ethernet/allwinner/sun4i-emac.c index 50b853a79d7..d81e7167a8b 100644 --- a/drivers/net/ethernet/allwinner/sun4i-emac.c +++ b/drivers/net/ethernet/allwinner/sun4i-emac.c @@ -16,7 +16,6 @@  #include <linux/etherdevice.h>  #include <linux/ethtool.h>  #include <linux/gpio.h> -#include <linux/init.h>  #include <linux/interrupt.h>  #include <linux/irq.h>  #include <linux/mii.h> @@ -269,15 +268,6 @@ static unsigned int emac_setup(struct net_device *ndev)  	writel(reg_val | EMAC_TX_MODE_ABORTED_FRAME_EN,  		db->membase + EMAC_TX_MODE_REG); -	/* set up RX */ -	reg_val = readl(db->membase + EMAC_RX_CTL_REG); - -	writel(reg_val | EMAC_RX_CTL_PASS_LEN_OOR_EN | -		EMAC_RX_CTL_ACCEPT_UNICAST_EN | EMAC_RX_CTL_DA_FILTER_EN | -		EMAC_RX_CTL_ACCEPT_MULTICAST_EN | -		EMAC_RX_CTL_ACCEPT_BROADCAST_EN, -		db->membase + EMAC_RX_CTL_REG); -  	/* set MAC */  	/* set MAC CTL0 */  	reg_val = readl(db->membase + EMAC_MAC_CTL0_REG); @@ -310,6 +300,26 @@ static unsigned int emac_setup(struct net_device *ndev)  	return 0;  } +static void emac_set_rx_mode(struct net_device *ndev) +{ +	struct emac_board_info *db = netdev_priv(ndev); +	unsigned int reg_val; + +	/* set up RX */ +	reg_val = readl(db->membase + EMAC_RX_CTL_REG); + +	if (ndev->flags & IFF_PROMISC) +		reg_val |= EMAC_RX_CTL_PASS_ALL_EN; +	else +		reg_val &= ~EMAC_RX_CTL_PASS_ALL_EN; + +	writel(reg_val | EMAC_RX_CTL_PASS_LEN_OOR_EN | +		EMAC_RX_CTL_ACCEPT_UNICAST_EN | EMAC_RX_CTL_DA_FILTER_EN | +		EMAC_RX_CTL_ACCEPT_MULTICAST_EN | +		EMAC_RX_CTL_ACCEPT_BROADCAST_EN, +		db->membase + EMAC_RX_CTL_REG); +} +  static unsigned int emac_powerup(struct net_device *ndev)  {  	struct emac_board_info *db = netdev_priv(ndev); @@ -477,7 +487,7 @@ static int emac_start_xmit(struct sk_buff *skb, struct net_device *dev)  	spin_unlock_irqrestore(&db->lock, flags);  	/* free this SKB */ -	dev_kfree_skb(skb); +	dev_consume_skb_any(skb);  	return NETDEV_TX_OK;  } @@ -717,8 +727,7 @@ static int emac_open(struct net_device *dev)  	if (netif_msg_ifup(db))  		dev_dbg(db->dev, "enabling %s\n", dev->name); -	if (devm_request_irq(db->dev, dev->irq, &emac_interrupt, -			     0, dev->name, dev)) +	if (request_irq(dev->irq, &emac_interrupt, 0, dev->name, dev))  		return -EAGAIN;  	/* Initialize EMAC board */ @@ -727,6 +736,7 @@ static int emac_open(struct net_device *dev)  	ret = emac_mdio_probe(dev);  	if (ret < 0) { +		free_irq(dev->irq, dev);  		netdev_err(dev, "cannot probe MDIO bus\n");  		return ret;  	} @@ -774,6 +784,8 @@ static int emac_stop(struct net_device *ndev)  	emac_shutdown(ndev); +	free_irq(ndev->irq, ndev); +  	return 0;  } @@ -782,6 +794,7 @@ static const struct net_device_ops emac_netdev_ops = {  	.ndo_stop		= emac_stop,  	.ndo_start_xmit		= emac_start_xmit,  	.ndo_tx_timeout		= emac_timeout, +	.ndo_set_rx_mode	= emac_set_rx_mode,  	.ndo_do_ioctl		= emac_ioctl,  	.ndo_change_mtu		= eth_change_mtu,  	.ndo_validate_addr	= eth_validate_addr, @@ -929,6 +942,9 @@ static int emac_resume(struct platform_device *dev)  }  static const struct of_device_id emac_of_match[] = { +	{.compatible = "allwinner,sun4i-a10-emac",}, + +	/* Deprecated */  	{.compatible = "allwinner,sun4i-emac",},  	{},  };  | 
