diff options
Diffstat (limited to 'drivers/net/ethernet/ibm/ibmveth.c')
| -rw-r--r-- | drivers/net/ethernet/ibm/ibmveth.c | 24 | 
1 files changed, 23 insertions, 1 deletions
diff --git a/drivers/net/ethernet/ibm/ibmveth.c b/drivers/net/ethernet/ibm/ibmveth.c index 21978cc019e7..072426a72745 100644 --- a/drivers/net/ethernet/ibm/ibmveth.c +++ b/drivers/net/ethernet/ibm/ibmveth.c @@ -1327,6 +1327,28 @@ static unsigned long ibmveth_get_desired_dma(struct vio_dev *vdev)  	return ret;  } +static int ibmveth_set_mac_addr(struct net_device *dev, void *p) +{ +	struct ibmveth_adapter *adapter = netdev_priv(dev); +	struct sockaddr *addr = p; +	u64 mac_address; +	int rc; + +	if (!is_valid_ether_addr(addr->sa_data)) +		return -EADDRNOTAVAIL; + +	mac_address = ibmveth_encode_mac_addr(addr->sa_data); +	rc = h_change_logical_lan_mac(adapter->vdev->unit_address, mac_address); +	if (rc) { +		netdev_err(adapter->netdev, "h_change_logical_lan_mac failed with rc=%d\n", rc); +		return rc; +	} + +	ether_addr_copy(dev->dev_addr, addr->sa_data); + +	return 0; +} +  static const struct net_device_ops ibmveth_netdev_ops = {  	.ndo_open		= ibmveth_open,  	.ndo_stop		= ibmveth_close, @@ -1337,7 +1359,7 @@ static const struct net_device_ops ibmveth_netdev_ops = {  	.ndo_fix_features	= ibmveth_fix_features,  	.ndo_set_features	= ibmveth_set_features,  	.ndo_validate_addr	= eth_validate_addr, -	.ndo_set_mac_address	= eth_mac_addr, +	.ndo_set_mac_address    = ibmveth_set_mac_addr,  #ifdef CONFIG_NET_POLL_CONTROLLER  	.ndo_poll_controller	= ibmveth_poll_controller,  #endif  | 
