mirror of
https://github.com/torvalds/linux.git
synced 2024-11-20 11:01:38 +00:00
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: Jiri Pirko <jiri@resnulli.us> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
646cbcdae5
commit
04e406dcc5
@ -319,18 +319,10 @@ out:
|
|||||||
* 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)
|
|||||||
(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)
|
|||||||
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 = {
|
|||||||
.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)
|
|||||||
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)
|
||||||
|
Loading…
Reference in New Issue
Block a user