diff options
Diffstat (limited to 'drivers/net/davinci_emac.c')
| -rw-r--r-- | drivers/net/davinci_emac.c | 12 | 
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/net/davinci_emac.c b/drivers/net/davinci_emac.c index 2df8fb0af70..12fd446f989 100644 --- a/drivers/net/davinci_emac.c +++ b/drivers/net/davinci_emac.c @@ -1820,11 +1820,19 @@ static int emac_dev_setmac_addr(struct net_device *ndev, void *addr)  	struct device *emac_dev = &priv->ndev->dev;  	struct sockaddr *sa = addr; +	if (!is_valid_ether_addr(sa->sa_data)) +		return -EINVAL; +  	/* Store mac addr in priv and rx channel and set it in EMAC hw */  	memcpy(priv->mac_addr, sa->sa_data, ndev->addr_len); -	memcpy(rxch->mac_addr, sa->sa_data, ndev->addr_len);  	memcpy(ndev->dev_addr, sa->sa_data, ndev->addr_len); -	emac_setmac(priv, EMAC_DEF_RX_CH, rxch->mac_addr); + +	/* If the interface is down - rxch is NULL. */ +	/* MAC address is configured only after the interface is enabled. */ +	if (netif_running(ndev)) { +		memcpy(rxch->mac_addr, sa->sa_data, ndev->addr_len); +		emac_setmac(priv, EMAC_DEF_RX_CH, rxch->mac_addr); +	}  	if (netif_msg_drv(priv))  		dev_notice(emac_dev, "DaVinci EMAC: emac_dev_setmac_addr %pM\n",  |