Skip to content

Commit

Permalink
davinci_emac: fix kernel oops when changing MAC address while interfa…
Browse files Browse the repository at this point in the history
…ce is down

Check that network interface is running before changing its MAC address.
Otherwise, rxch is accessed when it's NULL - causing a kernel oops.
Moreover, check that the new MAC address is valid.

Signed-off-by: Pablo Bitton <[email protected]>
Signed-off-by: Chaithrika U S <[email protected]>
Tested-by: Chaithrika U S <[email protected]>
[tested on DM6467 EVM]
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
Pablo Bitton authored and davem330 committed Jul 8, 2009
1 parent 19e588e commit 64c8165
Showing 1 changed file with 10 additions and 2 deletions.
12 changes: 10 additions & 2 deletions drivers/net/davinci_emac.c
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down

0 comments on commit 64c8165

Please sign in to comment.