Commit 04e406dc authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller

ll_temac: fix mac address setting

Previously, when invalid address was passed to ndo_set_mac_address,
random mac was generated and set. Fix this by returning -EADDRNOTAVAIL
in this situation.

Also polish the code around a bit.
Signed-off-by: default avatarJiri Pirko <jiri@resnulli.us>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 646cbcda
...@@ -319,18 +319,10 @@ static int temac_dma_bd_init(struct net_device *ndev) ...@@ -319,18 +319,10 @@ static int temac_dma_bd_init(struct net_device *ndev)
* net_device_ops * net_device_ops
*/ */
static int temac_set_mac_address(struct net_device *ndev, void *address) static void temac_do_set_mac_address(struct net_device *ndev)
{ {
struct temac_local *lp = netdev_priv(ndev); struct temac_local *lp = netdev_priv(ndev);
if (address)
memcpy(ndev->dev_addr, address, ETH_ALEN);
if (!is_valid_ether_addr(ndev->dev_addr))
eth_hw_addr_random(ndev);
else
ndev->addr_assign_type &= ~NET_ADDR_RANDOM;
/* set up unicast MAC address filter set its mac address */ /* set up unicast MAC address filter set its mac address */
mutex_lock(&lp->indirect_mutex); mutex_lock(&lp->indirect_mutex);
temac_indirect_out32(lp, XTE_UAW0_OFFSET, temac_indirect_out32(lp, XTE_UAW0_OFFSET,
...@@ -344,15 +336,26 @@ static int temac_set_mac_address(struct net_device *ndev, void *address) ...@@ -344,15 +336,26 @@ static int temac_set_mac_address(struct net_device *ndev, void *address)
(ndev->dev_addr[4] & 0x000000ff) | (ndev->dev_addr[4] & 0x000000ff) |
(ndev->dev_addr[5] << 8)); (ndev->dev_addr[5] << 8));
mutex_unlock(&lp->indirect_mutex); mutex_unlock(&lp->indirect_mutex);
}
static int temac_init_mac_address(struct net_device *ndev, void *address)
{
memcpy(ndev->dev_addr, address, ETH_ALEN);
if (!is_valid_ether_addr(ndev->dev_addr))
eth_hw_addr_random(ndev);
temac_do_set_mac_address(ndev);
return 0; return 0;
} }
static int netdev_set_mac_address(struct net_device *ndev, void *p) static int temac_set_mac_address(struct net_device *ndev, void *p)
{ {
struct sockaddr *addr = p; struct sockaddr *addr = p;
return temac_set_mac_address(ndev, addr->sa_data); if (!is_valid_ether_addr(addr->sa_data))
return -EADDRNOTAVAIL;
memcpy(ndev->dev_addr, addr->sa_data, ETH_ALEN);
temac_do_set_mac_address(ndev);
return 0;
} }
static void temac_set_multicast_list(struct net_device *ndev) static void temac_set_multicast_list(struct net_device *ndev)
...@@ -579,7 +582,7 @@ static void temac_device_reset(struct net_device *ndev) ...@@ -579,7 +582,7 @@ static void temac_device_reset(struct net_device *ndev)
temac_setoptions(ndev, temac_setoptions(ndev,
lp->options & ~(XTE_OPTION_TXEN | XTE_OPTION_RXEN)); lp->options & ~(XTE_OPTION_TXEN | XTE_OPTION_RXEN));
temac_set_mac_address(ndev, NULL); temac_do_set_mac_address(ndev);
/* Set address filter table */ /* Set address filter table */
temac_set_multicast_list(ndev); temac_set_multicast_list(ndev);
...@@ -938,7 +941,7 @@ static const struct net_device_ops temac_netdev_ops = { ...@@ -938,7 +941,7 @@ static const struct net_device_ops temac_netdev_ops = {
.ndo_open = temac_open, .ndo_open = temac_open,
.ndo_stop = temac_stop, .ndo_stop = temac_stop,
.ndo_start_xmit = temac_start_xmit, .ndo_start_xmit = temac_start_xmit,
.ndo_set_mac_address = netdev_set_mac_address, .ndo_set_mac_address = temac_set_mac_address,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_do_ioctl = temac_ioctl, .ndo_do_ioctl = temac_ioctl,
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
...@@ -1106,7 +1109,7 @@ static int temac_of_probe(struct platform_device *op) ...@@ -1106,7 +1109,7 @@ static int temac_of_probe(struct platform_device *op)
rc = -ENODEV; rc = -ENODEV;
goto err_iounmap_2; goto err_iounmap_2;
} }
temac_set_mac_address(ndev, (void *)addr); temac_init_mac_address(ndev, (void *)addr);
rc = temac_mdio_setup(lp, op->dev.of_node); rc = temac_mdio_setup(lp, op->dev.of_node);
if (rc) if (rc)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment