net/ucc_geth: allow to set mac address on running device
Inspired by the patch for 8139too (bda6a15a
).
Currently we can't set mac address on a running ucc_geth device.
But this is needed when you use this device as a bonding slave in
bonding device in balance-alb mode. So add this feature for ucc_geth
device.
Signed-off-by: Kevin Hao <kexin.hao@windriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
9c5cd67080
Коммит
3d6593e9cc
|
@ -3325,6 +3325,37 @@ static void ucc_netpoll(struct net_device *dev)
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_NET_POLL_CONTROLLER */
|
#endif /* CONFIG_NET_POLL_CONTROLLER */
|
||||||
|
|
||||||
|
static int ucc_geth_set_mac_addr(struct net_device *dev, void *p)
|
||||||
|
{
|
||||||
|
struct ucc_geth_private *ugeth = netdev_priv(dev);
|
||||||
|
struct sockaddr *addr = p;
|
||||||
|
|
||||||
|
if (!is_valid_ether_addr(addr->sa_data))
|
||||||
|
return -EADDRNOTAVAIL;
|
||||||
|
|
||||||
|
memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If device is not running, we will set mac addr register
|
||||||
|
* when opening the device.
|
||||||
|
*/
|
||||||
|
if (!netif_running(dev))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
spin_lock_irq(&ugeth->lock);
|
||||||
|
init_mac_station_addr_regs(dev->dev_addr[0],
|
||||||
|
dev->dev_addr[1],
|
||||||
|
dev->dev_addr[2],
|
||||||
|
dev->dev_addr[3],
|
||||||
|
dev->dev_addr[4],
|
||||||
|
dev->dev_addr[5],
|
||||||
|
&ugeth->ug_regs->macstnaddr1,
|
||||||
|
&ugeth->ug_regs->macstnaddr2);
|
||||||
|
spin_unlock_irq(&ugeth->lock);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Called when something needs to use the ethernet device */
|
/* Called when something needs to use the ethernet device */
|
||||||
/* Returns 0 for success. */
|
/* Returns 0 for success. */
|
||||||
static int ucc_geth_open(struct net_device *dev)
|
static int ucc_geth_open(struct net_device *dev)
|
||||||
|
@ -3501,7 +3532,7 @@ static const struct net_device_ops ucc_geth_netdev_ops = {
|
||||||
.ndo_stop = ucc_geth_close,
|
.ndo_stop = ucc_geth_close,
|
||||||
.ndo_start_xmit = ucc_geth_start_xmit,
|
.ndo_start_xmit = ucc_geth_start_xmit,
|
||||||
.ndo_validate_addr = eth_validate_addr,
|
.ndo_validate_addr = eth_validate_addr,
|
||||||
.ndo_set_mac_address = eth_mac_addr,
|
.ndo_set_mac_address = ucc_geth_set_mac_addr,
|
||||||
.ndo_change_mtu = eth_change_mtu,
|
.ndo_change_mtu = eth_change_mtu,
|
||||||
.ndo_set_multicast_list = ucc_geth_set_multi,
|
.ndo_set_multicast_list = ucc_geth_set_multi,
|
||||||
.ndo_tx_timeout = ucc_geth_timeout,
|
.ndo_tx_timeout = ucc_geth_timeout,
|
||||||
|
|
Загрузка…
Ссылка в новой задаче